From 76846ae1869c51aaeceaf1e22acac7f13e889198 Mon Sep 17 00:00:00 2001 From: cynix Date: Thu, 8 Dec 2022 00:09:43 +1100 Subject: [PATCH 001/924] Add estimated FW size saving for SKIP_ZX8211 Signed-off-by: cynix --- doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index ba53d3aaf..06040b59e 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -166,7 +166,7 @@ a series of `SKIP_*` allow to skip some of the functionalities and to get a smal |SKIP_NFCBARCODE=1 | 1.4kb |SKIP_HFSNIFF=1 | 0.5kb |SKIP_HFPLOT=1 | 0.3kb -|SKIP_ZX8211=1 | unknown yet +|SKIP_ZX8211=1 | 0.3kb So for example, at the time of writing, this is a valid `Makefile.platform` compiling an image for 256k: ``` From e364d7e03d3ee0236088387b82a8776233387da0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:36:02 +0100 Subject: [PATCH 002/924] add updated sim module firmware v4.13, this is breaking change for `smart` category commands --- client/resources/sim013.bin | Bin 0 -> 866 bytes client/resources/sim013.sha512.txt | 1 + client/src/cmdsmartcard.c | 2 +- doc/cheatsheet.md | 2 +- .../Troubleshooting.md | 6 +- .../2_Configuration-and-Verification.md | 18 +- doc/path_notes.md | 2 +- tools/pm3_online_check.py | 2 +- tools/pm3_tests.sh | 2 +- tools/simmodule/sim013.asm | 819 ++++++++++++++++++ 10 files changed, 837 insertions(+), 17 deletions(-) create mode 100644 client/resources/sim013.bin create mode 100644 client/resources/sim013.sha512.txt create mode 100644 tools/simmodule/sim013.asm diff --git a/client/resources/sim013.bin b/client/resources/sim013.bin new file mode 100644 index 0000000000000000000000000000000000000000..3fae92bd845dd48dfe87824f6e70f47bec585472 GIT binary patch literal 866 zcmbVK&rcIU6rP#x(iSM$kQhu%V0S5{KWMWo`~e#DE>SKX)PpxK^zfnwBWpM7k3>u< zkkD{3k{HrxP}xKdYg&gQcrlwvycyerdoWzMG@wFp7BL3&}CTp7Nr6wUZVorU5F_ z2<@OD8dgeWSfEb2; zgVPp?5h$+=Ya#Kj6XHsdAd6T74o4k9)?uYNIuPs6SuwNTaJX2%WyX9lx<;#vx-K8Y zs(y12v=$g7pbIb*VZ0S1{}SZ93<6DHd$um&epTjXI@Rb>IIQd@T( zq5490WYtT};6}H_hXXF}L6@j-e9?}q7+X>$f>oNoy-{m^-sMmD>ql8T%c~SUaSQW}q88kv!HH|N Srkck__R>V<%hp0|SN#c3S3NZV literal 0 HcmV?d00001 diff --git a/client/resources/sim013.sha512.txt b/client/resources/sim013.sha512.txt new file mode 100644 index 000000000..202eff3c4 --- /dev/null +++ b/client/resources/sim013.sha512.txt @@ -0,0 +1 @@ +3bb6cbd893ce07720d8514d00706b230b4026a54d6c4dc068ca294beea3f3735c75dae65bc153f573b7b891753c85860f6427fb0ad7edb804d58925c50d1fc76 *sim013.bin diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index 3d9888a50..5cceb8b48 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -522,7 +522,7 @@ static int CmdSmartUpgrade(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "smart upgrade", "Upgrade RDV4 sim module firmware", - "smart upgrade -f sim012.bin" + "smart upgrade -f sim013.bin" ); void *argtable[] = { diff --git a/doc/cheatsheet.md b/doc/cheatsheet.md index 1f0d66c1b..22e47b3f1 100644 --- a/doc/cheatsheet.md +++ b/doc/cheatsheet.md @@ -713,7 +713,7 @@ pm3 --> mem load -f iclass_default_keys --iclass Upgrade Sim Module firmware ``` -pm3 --> smart upgrade -f sim012.bin +pm3 --> smart upgrade -f sim013.bin ``` ## Smart Card diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index b946fd0d0..68d3d5570 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -161,9 +161,9 @@ proxmark3 --flash --image /usr/local/share/proxmark3/firmware/f proxmark3 --flash --image /usr/share/proxmark3/firmware/fullimage.elf using the script: -pm3 --> smart upgrade -f /usr/local/share/proxmark3/firmware/sim012.bin +pm3 --> smart upgrade -f /usr/local/share/proxmark3/firmware/sim013.bin <> -pm3 --> smart upgrade -f /usr/share/proxmark3/firmware/sim012.bin +pm3 --> smart upgrade -f /usr/share/proxmark3/firmware/sim013.bin ``` If you didn't install the PRoxmark but you're working from the sources directory and depending how you launch the client, your working directory might be the root of the repository: @@ -186,7 +186,7 @@ client/proxmark3 --flash --image armsrc/obj/fullimage.elf <> ./proxmark3 --flash --image ../armsrc/obj/fullimage.elf -pm3 --> smart upgrade -f sim012.bin +pm3 --> smart upgrade -f sim013.bin ``` etc. diff --git a/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md b/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md index 00841d118..791605f17 100644 --- a/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md +++ b/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md @@ -61,23 +61,23 @@ or These versions is obsolete. -If you didn't download sim012.bin from the RRG Repo be aware that it might be corrupted or faulty. +If you didn't download sim013.bin from the RRG Repo be aware that it might be corrupted or faulty. You find a hash text file in this folder. It was generated with the following linux command. ``` -sha512sum -b sim012.bin > sim012.sha512.txt +sha512sum -b sim013.bin > sim013.sha512.txt ``` -You should validate the sim012.bin file against this hash file in order to be sure the file is not corrupted or faulty. +You should validate the sim013.bin file against this hash file in order to be sure the file is not corrupted or faulty. The following command upgrades your device sim module firmware. Don't not turn off your device during the execution of this command!! Even its a quite fast command you should be warned. You may brick it if you interrupt it. ``` -[usb] pm3 --> smart upgrade -f /usr/local/share/proxmark3/firmware/sim012.bin +[usb] pm3 --> smart upgrade -f /usr/local/share/proxmark3/firmware/sim013.bin # or if from local repo -[usb] pm3 --> smart upgrade -f sim012.bin +[usb] pm3 --> smart upgrade -f sim013.bin ``` You get the following output if the execution was successful: @@ -88,10 +88,10 @@ You get the following output if the execution was successful: [!] ⚠️ A dangerous command, do wrong and you could brick the sim module [=] ------------------------------------------------------------------- -[=] firmware file sim012.bin -[=] Checking integrity sim012.sha512.txt -[+] loaded 864 bytes from binary file sim012.bin -[+] loaded 141 bytes from binary file sim012.sha512.txt +[=] firmware file sim013.bin +[=] Checking integrity sim013.sha512.txt +[+] loaded 866 bytes from binary file sim013.bin +[+] loaded 141 bytes from binary file sim013.sha512.txt [=] Don't turn off your PM3! [+] Sim module firmware uploading to PM3... 🕑 864 bytes sent diff --git a/doc/path_notes.md b/doc/path_notes.md index 72bde2aa6..a111e8cd1 100644 --- a/doc/path_notes.md +++ b/doc/path_notes.md @@ -64,7 +64,7 @@ The recovery / firmware files will be copied to ``` * Proxmark3 firmware: `bootrom.elf`, `fullimage.elf`, `proxmark3_recovery.bin` (used for JTAG) -* SIM firmware: `sim012.bin`, `sim012.sha512.txt` +* SIM firmware: `sim013.bin`, `sim013.sha512.txt` ## Traces diff --git a/tools/pm3_online_check.py b/tools/pm3_online_check.py index 2298a2ede..a7961d319 100755 --- a/tools/pm3_online_check.py +++ b/tools/pm3_online_check.py @@ -122,7 +122,7 @@ def pm3_lf_t55xx(child): def pm3_flash_sm(child): try: print("[+] Updating smart card fw") - child.sendline('smart upgrade -f sim012.bin') + child.sendline('smart upgrade -f sim013.bin') i = child.expect('pm3 --> ') msg = escape_ansi(str(child.before)) print("================") diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index f682d3491..a39615cb6 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -236,7 +236,7 @@ while true; do if $TESTALL || $TESTCOMMON; then echo -e "\n${C_BLUE}Testing common:${C_NC}" if ! CheckFileExist "hardnested tables exists" "$RESOURCEPATH/hardnested_tables/bitflip_0_001_states.bin.bz2"; then break; fi - if ! CheckFileExist "simmodule fw file exists" "$RESOURCEPATH/sim011.bin"; then break; fi + if ! CheckFileExist "simmodule fw file exists" "$RESOURCEPATH/sim013.bin"; then break; fi if ! CheckFileExist "iCLASS dictionary exists" "$DICPATH/iclass_default_keys.dic"; then break; fi if ! CheckFileExist "MFC dictionary exists" "$DICPATH/mfc_default_keys.dic"; then break; fi if ! CheckFileExist "MFDES dictionary exists" "$DICPATH/mfdes_default_keys.dic"; then break; fi diff --git a/tools/simmodule/sim013.asm b/tools/simmodule/sim013.asm new file mode 100644 index 000000000..b26aa1906 --- /dev/null +++ b/tools/simmodule/sim013.asm @@ -0,0 +1,819 @@ +; --------------------------------------------------------------------------- +; Proxmark3 RDV4 SIM module firmware +; +; Copyright (C) 2109, 2022 Sentinel +; +; This program is free software: you can redistribute it and/or modify it +; under the terms of the GNU Lesser General Public License as published by the +; Free Software Foundation, either version 3 of the License, or (at your +; option) any later version. +; +; This program is distributed in the hope that it will be useful, but WITHOUT +; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. +; +; You should have received a copy of the GNU Lesser General Public License +; along with this program. If not, see +; --------------------------------------------------------------------------- + VERS_HI equ 4 + VERS_LO equ 13 +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- + SCON_0 equ 098h + FE_0 equ 098h.7 + + SCON_1 equ 0F8h + RI_1 equ 0F8h.0 + TI_1 equ 0F8h.1 + FE_1 equ 0F8h.7 + SBUF_1 equ 09Ah + T3CON equ 0C4h + RL3 equ 0C5h + RH3 equ 0C6h + + P0M1 equ 0B1h + P0M2 equ 0B2h + P1M1 equ 0B3h + P1M2 equ 0B4h + P3M1 equ 0ACh; + P3M2 equ 0ADh; + + EIE equ 09Bh + EIE1 equ 09Ch + + TA equ 0C7h + + RCTRIM0 equ 084h +; --------------------------------------------------------------------------- + CKCON equ 08Eh + CKDIV equ 095h +; --------------------------------------------------------------------------- + P1S equ 0B3h ;Page1 + SFRS equ 091h ;TA Protection +; --------------------------------------------------------------------------- + ;AUXR1 equ 0A2h +; --------------------------------------------------------------------------- + I2DAT equ 0BCh; + I2STAT equ 0BDh; + I2CLK equ 0BEh; + I2TOC equ 0BFh; + I2CON equ 0C0h; + ; equ I2CON.7;8 + I2CEN equ I2CON.6;4 + STA equ I2CON.5;2 + STO equ I2CON.4;1 + SI equ I2CON.3;8 + AA equ I2CON.2;4 + ; equ I2CON.1;2 + I2CPX equ I2CON.0;1 + + + I2ADDR equ 0C1h; + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- + pin_TX1 equ P1.6 + + pin_TX0 equ P0.6 + pin_RX0 equ P0.7 + + pin_SCL equ P1.3 + pin_SDA equ P1.4 + + pin_RST equ P1.0 + pin_CLC equ P1.1 + pin_led equ P1.2 + +; --------------------------------------------------------------------------- +; =========================================================================== + + + CMD_GENERATE_ATR equ 01h + CMD_WRITE_DATA_SIM equ 02h + CMD_READ_DATA_SIM equ 03h + + CMD_SET_BAUD_RATE equ 04h + CMD_SET_SIM_CLC equ 05h + CMD_GET_VERS equ 06h + CMD_WRITE_CONFIRM equ 07h + + + +; --------------------------------------------------------------------------- +; =========================================================================== + + bit_RX0 equ 32.0 + bit_command_receive equ 32.1 + bit_generate_ATR equ 32.2 + i2c_write_mode equ 32.3 + i2c_write_done equ 32.4 + bit_data_sim_wr equ 32.5 + ; equ 32.6 + bit_TX0 equ 32.7 + + bit_command_buff equ 33.0 + i2c_write_command equ 33.1 + i2c_command_done equ 33.2 + bit_wait_confirm equ 33.3 + bit_first_ATR equ 33.4 ;11/03/2019 + bit_length_answerH equ 33.5 + bit_length_answerL equ 33.6 +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + bit_32 equ 32 + bit_33 equ 33 + + time_data_read equ 34 + time_confirm equ 35 + + pointer_RX1H equ 36 ;save SBUF(SIM) to XRAM + pointer_RX1L equ 37 ;save SBUF(SIM) to XRAM + + pointer_RX2H equ 38 ;read XRAM to I2C + pointer_RX2L equ 39 ;read XRAM to I2C + + pointer_TXH equ 40 + pointer_TXL equ 41 + + length_send_to_simH equ 42 + length_send_to_simL equ 43 + + length_answer_simH equ 44 + length_answer_simL equ 45 + + length_command equ 46 + + buff_command equ 47 + cmd_command equ 48 + data_command equ 49 + + STACKKKKK equ 200 +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + XRAM_TX_BUFF equ 0 + XRAM_RX_BUFF equ 384 +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +; Beginning of the main program + cseg at 00 + Ljmp main_start + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- + cseg at 11 ;1302Hz = 4MHZ(Fsys)/12/256 +; --------------------------------------------------------------------------- + jb time_confirm.7, $+3+2 ;3 + dec time_confirm ;2 +; --------------------------------------------------------------------------- + jb time_data_read.7,reti_timer0 + djnz time_data_read, reti_timer0 + setb pin_scl +reti_timer0: + reti + + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- + cseg at 35 ;UART0 + ajmp jmp_UART0_interrupt + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- + cseg at 51 ;I2C + ajmp jmp_i2c_interrupt + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- + cseg at 123 ;UART1 + clr RI_1 + clr TI_1 + reti + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +jmp_UART0_interrupt: + jbc RI,jmp_byte_RI + jbc TI,jmp_byte_TI + reti +; --------------------------------------------------------------------------- +jmp_byte_RI: + jnb bit_first_ATR, jmp_not_collect ;11/03/2019 + + setb bit_RX0 + jb i2c_write_done,jmp_not_collect + PUSH ACC + PUSH DPH + PUSH DPL + mov DPL,pointer_RX1L + mov DPH,pointer_RX1H + mov a,SBUF + movx @DPTR,a + inc DPTR + mov pointer_RX1L,DPL + mov pointer_RX1H,DPH + POP DPL + POP DPH + POP ACC + ;09/08/2018 + clr pin_scl + mov time_data_read,#52 ;52/1302Hz = 40mS + + inc length_answer_simL + mov a,length_answer_simL + jnz $+2+2 ;2 + inc length_answer_simH ;2 + +jmp_not_collect: + reti +; --------------------------------------------------------------------------- +jmp_byte_TI: + setb bit_TX0 + reti + + +; =========================================================================== +; --------------------------------------------------------------------------- +jmp_i2c_interrupt: + PUSH ACC + PUSH PSW + mov PSW,#24 + mov R7,I2STAT +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + cjne R7,#000h,nextttt00000 + setb STO + clr SI + jb STO,$ + ajmp pop_i2c_psw +nextttt00000: +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + cjne R7,#060h,nextttt00001 ;START+MY ADRESS + clr pin_led ;LED ON + + clr bit_command_receive + clr i2c_write_mode + clr bit_data_sim_wr + clr bit_length_answerH + clr bit_length_answerL + clr bit_command_buff + clr i2c_write_command + + ajmp end_i2c_interrupt +nextttt00001: +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + cjne R7,#080h,nextttt00002 ;RAM ADRESS + + jb bit_command_receive,jmp_data_receive + setb bit_command_receive + + mov a,I2DAT +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + cjne a,#CMD_WRITE_CONFIRM,next_comm001a + setb bit_wait_confirm + ajmp WRITEDATASIM +next_comm001a: +; --------------------------------------------------------------------------- + cjne a,#CMD_WRITE_DATA_SIM,next_comm001b + clr bit_wait_confirm + ajmp WRITEDATASIM +next_comm001b: +; --------------------------------------------------------------------------- + cjne a,#CMD_GENERATE_ATR,next_comm002 + ajmp ATR_GENERATE +next_comm002: +; --------------------------------------------------------------------------- + cjne a,#CMD_GET_VERS,next_comm003 + ajmp ANSWER_VERS +next_comm003: +; --------------------------------------------------------------------------- + cjne a,#CMD_SET_BAUD_RATE,next_comm004 + ajmp BAUD_RATE_SET +next_comm004: +; --------------------------------------------------------------------------- + cjne a,#CMD_SET_SIM_CLC,next_comm005 + ajmp SIM_CLC_SET +next_comm005: +; --------------------------------------------------------------------------- + ajmp end_i2c_interrupt +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +jmp_data_receive: + ;What receive ? Data to SIM/Command to bridge + jb bit_data_sim_wr, jmp_data_sim_receive + jb i2c_write_command,jmp_comm_bridge_receive + ajmp end_i2c_interrupt +; --------------------------------------------------------------------------- +jmp_comm_bridge_receive: + mov @R0,I2DAT + inc R0 + inc length_command + ajmp end_i2c_interrupt +; --------------------------------------------------------------------------- +jmp_data_sim_receive: + + setb i2c_write_mode + + PUSH DPH + PUSH DPL + mov DPL,pointer_TXL + mov DPH,pointer_TXH + mov a,I2DAT + movx @DPTR,a + inc DPTR + mov pointer_TXL,DPL + mov pointer_TXH,DPH + POP DPL + POP DPH + + inc length_send_to_simL + mov a,length_send_to_simL + jnz $+2+2 ;2 + inc length_send_to_simH ;2 + + ajmp end_i2c_interrupt +nextttt00002: +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + cjne R7,#0A0h,nextttt00003 ;STOP + setb pin_led ;LED OFF + + ;Command finish ? + jnb i2c_write_command,jmp_not_command + clr i2c_write_command + setb i2c_command_done +jmp_not_command: + + ;data to SIM finish ? + jnb i2c_write_mode,end_i2c_interrupt + clr i2c_write_mode + + setb i2c_write_done + ;Prepare to answer + mov length_answer_simH,#0 + mov length_answer_simL,#0 + mov pointer_RX1H,#HIGH(XRAM_RX_BUFF) + mov pointer_RX1L,#LOW (XRAM_RX_BUFF) + mov pointer_RX2H,#HIGH(XRAM_RX_BUFF) + mov pointer_RX2L,#LOW (XRAM_RX_BUFF) + + ajmp end_i2c_interrupt +nextttt00003: +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + cjne R7,#0A8h,nextttt00004 + sjmp read_byte_I2C +nextttt00004: +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + cjne R7,#0B8h,nextttt00005 +read_byte_I2C: + jnb bit_command_buff,jmp_not_comm_buff2 + mov I2DAT,@R0 + inc R0 + ajmp end_i2c_interrupt + +jmp_not_comm_buff2: + jb bit_length_answerH,jmp_not_comm_buff3 + setb bit_length_answerH + mov I2DAT,length_answer_simH + ajmp end_i2c_interrupt + +jmp_not_comm_buff3: + jb bit_length_answerL,read_byte_APROM + setb bit_length_answerL + mov I2DAT,length_answer_simL + ajmp end_i2c_interrupt + +read_byte_APROM: + PUSH DPH + PUSH DPL + mov DPL,pointer_RX2L + mov DPH,pointer_RX2H + movx a,@DPTR + mov I2DAT,a + inc DPTR + mov pointer_RX2L,DPL + mov pointer_RX2H,DPH + POP DPL + POP DPH + +nextttt00005: +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +end_i2c_interrupt: + clr STA + clr STO + setb AA +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +pop_i2c_psw: + POP PSW + POP ACC + clr SI + reti + + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +ANSWER_VERS: + mov R0,#data_command + mov cmd_command,#CMD_GET_VERS + mov (data_command+0),#2 + mov (data_command+1),#VERS_HI + mov (data_command+2),#VERS_LO + setb bit_command_buff + ajmp end_i2c_interrupt + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +ATR_GENERATE: + setb bit_generate_ATR + ;Prepare to answer + mov length_answer_simH,#0 + mov length_answer_simL,#0 + mov pointer_RX1H,#HIGH(XRAM_RX_BUFF) + mov pointer_RX1L,#LOW (XRAM_RX_BUFF) + mov pointer_RX2H,#HIGH(XRAM_RX_BUFF) + mov pointer_RX2L,#LOW (XRAM_RX_BUFF) + ajmp end_i2c_interrupt + + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +BAUD_RATE_SET: + mov R0,#data_command + mov length_command,#0 + mov cmd_command,#CMD_SET_BAUD_RATE + setb i2c_write_command + ajmp end_i2c_interrupt + + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +SIM_CLC_SET: + mov R0,#data_command + mov length_command,#0 + mov cmd_command,#CMD_SET_SIM_CLC + setb i2c_write_command + ajmp end_i2c_interrupt + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +WRITEDATASIM: + mov length_send_to_simH,#0 + mov length_send_to_simL,#0 + setb bit_data_sim_wr + mov pointer_TXH,#HIGH(XRAM_TX_BUFF) + mov pointer_TXL,#LOW (XRAM_TX_BUFF) + ajmp end_i2c_interrupt + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +main_start: + mov SP,#STACKKKKK +; --------------------------------------------------------------------------- + ;0-bidirect 1-push pull 0-input only 1-open drain + ;0 0 1 1 +; --------------------------------------------------------------------------- + mov P0M2,#01000000b ;?0 + mov P0M1,#11111111b ;P1.6-Tx0 SIM; + ; + mov P1M2,#01011111b ;1 + mov P1M1,#10111000b ;P1.6-Tx1 DEBUG; P1.4,P1.3 - I2C; + + mov P3M2,#00000000b ;P3 + mov P3M1,#11111111b ; +; --------------------------------------------------------------------------- + mov TMOD, #22h + mov TH0, #0 ;14400hz + mov TH1, #0E9h ;UART0 10800 Bit/sec + mov TCON, #55h +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + mov TA,#0AAh + mov TA,#055h + orl SFRS,#00000001b + + mov P1S, #00010000b ;P1.4 trigger schmiddt + + mov TA,#0AAh + mov TA,#055h + anl SFRS,#11111110b +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + ;------- CONFIG I2C --------- + mov I2CON, #44h ;set AA, set I2C enable + setb pin_sda + setb pin_scl + mov I2ADDR,#0C0h +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + ;mov SCON, #050h ;UART0 8bit + mov SCON, #0D0h ;UART0 9bit + ;mov PCON, #11000000b;FE_0 enable + mov PCON, #10000000b;FE_0 disable +; --------------------------------------------------------------------------- + mov SCON_1,#050h ;UART1 + ;mov T3CON, #01101000b;FE_1 enable TIMER3 UART0 BAUD + ;mov T3CON, #00101000b;FE_1 disable TIMER3 UART0 BAUD + mov T3CON, #00001000b;FE_1 disable TIMER1 UART0 BAUD + ;mov RL3,#0E9h ;10800/21600 + ;mov RH3,#0FFh +; --------------------------------------------------------------------------- + ;UART1 + mov RL3,#0F7h ;27777/55556 + mov RH3,#0FFh +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + mov CKDIV,#2 ;Fsys=4.00MHZ + ;mov CKDIV,#1 ;Fsys=8.00MHZ +; --------------------------------------------------------------------------- + mov bit_32,#0 + mov bit_33,#0 + setb time_data_read.7 +; --------------------------------------------------------------------------- + ;orl CKCON,#00000010b ;ENABLE CLC TIMER1 Fsys/12 + orl CKCON,#00010010b ;ENABLE CLC TIMER1 Fsys +; --------------------------------------------------------------------------- + ;mov a,RCTRIM0 + ;add a,#31 + ;mov TA,#0AAh + ;mov TA,#055h + ;mov RCTRIM0,a +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + acall clr_buffer +; --------------------------------------------------------------------------- + mov EIE, #00000001b ;I2C Interrupt + ;mov IE, #10010000b ;EA, SERIAL0 + mov IE, #10010010b ;EA, SERIAL0, TIMER0 +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +main_loop: + acall control_ATR + acall control_send_to_sim + acall control_command + sjmp main_loop + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +control_command: + jbc i2c_command_done,$+3+1 ;3 + ret ;1 +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + ;Control Length command=1 + mov a,length_command + cjne a,#1,next_commandEND ;error length_command != 1 +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + mov a,cmd_command + cjne a,#CMD_SET_BAUD_RATE,next_command001 + mov TH1,data_command ;Timer1 HIGH byte + ret +next_command001: +; --------------------------------------------------------------------------- + cjne a,#CMD_SET_SIM_CLC, next_command002 + mov CKDIV,data_command ;Fsys DIV + ret +next_command002: +; --------------------------------------------------------------------------- +next_commandEND: + ret + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +control_send_to_sim: + jb i2c_write_done,$+3+1 ;3 + ret ;1 +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + jbc bit_wait_confirm,jmp_wait_confirm +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + mov DPTR,#XRAM_TX_BUFF +looop_send: + movx a,@DPTR + inc DPTR + acall for_coooooom0 + + clr c + mov a,length_send_to_simL + subb a,#1 + mov length_send_to_simL,a + mov a,length_send_to_simH + subb a,#0 + mov length_send_to_simH,a + orl a,length_send_to_simL + jnz looop_send +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + jnb bit_RX0,$ + clr i2c_write_done + ret + + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +jmp_wait_confirm: + mov DPTR,#(XRAM_TX_BUFF+1) + movx a,@DPTR + mov R3,a + mov R4,#5 +; --------------------------------------------------------------------------- + mov DPTR,#XRAM_TX_BUFF +looop_seend: + movx a,@DPTR + inc DPTR + acall for_coooooom0 + djnz R4,jmp_not_5byte + + jnb bit_RX0,$ + clr bit_RX0 + ;18/12/2018 + mov time_confirm,#65 ;New timeout 50mS +looop_waitconf: + jb time_confirm.7,jmp_no_answer + jnb bit_RX0,looop_waitconf + + ;clr pin_scl ;TEST PULSE! + mov a,SBUF + xrl a,R3 + ;setb pin_scl ;TEST PULSE! + + jnz jmp_no_correct_answer ;18/12/2018 + + ;pause for next byte 17/12/2018 + mov R7,#0 + djnz R7,$ ;~260mkSec + djnz R7,$ ;~260mkSec + djnz R7,$ ;~260mkSec + +jmp_not_5byte: + + clr c + mov a,length_send_to_simL + subb a,#1 + mov length_send_to_simL,a + mov a,length_send_to_simH + subb a,#0 + mov length_send_to_simH,a + orl a,length_send_to_simL + jnz looop_seend +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + jnb bit_RX0,$ + clr bit_RX0 +jmp_no_answer: + clr i2c_write_done + ret + +; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- +;18/12/2018 +jmp_no_correct_answer: + clr EA + clr i2c_write_done + + mov DPL,pointer_RX1L + mov DPH,pointer_RX1H + mov a,SBUF + movx @DPTR,a + inc DPTR + mov pointer_RX1L,DPL + mov pointer_RX1H,DPH + + clr pin_scl + mov time_data_read,#52 ;52/1302Hz = 40mS + + inc length_answer_simL + mov a,length_answer_simL + jnz $+2+2 ;2 + inc length_answer_simH ;2 + + setb EA + ret + + + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +control_ATR: + jbc bit_generate_ATR,$+3+1 ;3 + ret ;1 +; --------------------------------------------------------------------------- + clr pin_RST + ;acall clr_buffer + ; Add rezet pause 17/12/2018 + + mov R6,#200 +looop_pause50mS: + djnz R7,$ ;~260mkSec + djnz R6,looop_pause50mS + + ;Prepare to answer 11/03/2019 + acall clr_buffer + + mov length_answer_simH,#0 + mov length_answer_simL,#0 + mov pointer_RX1H,#HIGH(XRAM_RX_BUFF) + mov pointer_RX1L,#LOW (XRAM_RX_BUFF) + mov pointer_RX2H,#HIGH(XRAM_RX_BUFF) + mov pointer_RX2L,#LOW (XRAM_RX_BUFF) + setb bit_first_ATR + setb pin_RST + ret + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +for_coooooom0: + clr bit_RX0 + mov c,P + mov TB8,c ;9bit parity + mov SBUF,a + jnb bit_TX0,$ + clr bit_TX0 + mov R7,#100 + djnz R7,$ + ret + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +clr_buffer: + mov DPTR,#XRAM_RX_BUFF ;Receive SIM buffer 192+192 = 384b + acall clr_192buffer ;06/12/2022 +; --------------------------------------------------------------------------- +clr_192buffer: + mov R7,#192 + clr a +looop_clr_bufff: + movx @DPTR,a + inc DPTR + djnz R7,looop_clr_bufff + ret + +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- +;for_coooooom1: +; mov SBUF_1,a +; jnb TI_1,$ +; clr TI_1 +; ret +; +; --------------------------------------------------------------------------- +; =========================================================================== +; --------------------------------------------------------------------------- + +end. From 4c9c0b5264e1df2376c6400b91fa59b42114ac4c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:37:37 +0100 Subject: [PATCH 003/924] minor adaptations to timings --- armsrc/i2c.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/armsrc/i2c.c b/armsrc/i2c.c index d8495e59c..d2c239fcc 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -167,7 +167,7 @@ static bool WaitSCL_H_delay(uint32_t delay) { // 5000 * 3.07us = 15350us. 15.35ms // 15000 * 3.07us = 46050us. 46.05ms static bool WaitSCL_H(void) { - return WaitSCL_H_delay(15000); + return WaitSCL_H_delay(5000); } static bool WaitSCL_L_delay(uint32_t delay) { @@ -179,19 +179,21 @@ static bool WaitSCL_L_delay(uint32_t delay) { } return false; } + // 5000 * 3.07us = 15350us. 15.35ms +// 15000 * 3.07us = 46050us. 46.05ms static bool WaitSCL_L(void) { - return WaitSCL_L_delay(15000); + return WaitSCL_L_delay(5000); } // Wait max 1800ms or until SCL goes LOW. // It timeout reading response from card // Which ever comes first static bool WaitSCL_L_timeout(void) { - volatile uint32_t delay = 1700; + volatile uint32_t delay = 200; while (delay--) { // exit on SCL LOW - if (!SCL_read) + if (SCL_read == false) return true; WaitMS(1); From c5582ab7c746224916edb5dfa82dfce2e5319daa Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:39:04 +0100 Subject: [PATCH 004/924] Changing timings, this now waits for max 276 bytes while 8051 speaks with card --- armsrc/i2c.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/armsrc/i2c.c b/armsrc/i2c.c index d2c239fcc..c3d10a765 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -208,12 +208,15 @@ static bool I2C_Start(void) { SDA_H; I2C_DELAY_1CLK; SCL_H; - if (!WaitSCL_H()) return false; + if (!WaitSCL_H()) + return false; I2C_DELAY_2CLK; - if (!SCL_read) return false; - if (!SDA_read) return false; + if (!SCL_read) + return false; + if (!SDA_read) + return false; SDA_L; I2C_DELAY_2CLK; @@ -228,8 +231,9 @@ static bool I2C_WaitForSim(void) { // 8051 speaks with smart card. // 1000*50*3.07 = 153.5ms - // 1byte transfer == 1ms with max frame being 256bytes - return WaitSCL_H_delay(1000 * 300); + // 1000*90*3.07 = 276.3ms + // 1byte transfer == 1ms with max frame being 256bytes + return WaitSCL_H_delay(1000 * 90); } // send i2c STOP From ac84e855a931a00ce802011718ef811efc999b02 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:39:36 +0100 Subject: [PATCH 005/924] Jumps len check fix --- armsrc/i2c.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/armsrc/i2c.c b/armsrc/i2c.c index c3d10a765..6ede36b13 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -714,11 +714,12 @@ bool GetATR(smart_card_atr_t *card_ptr, bool verbose) { // read bytes from module uint16_t len = sizeof(card_ptr->atr); + if (sc_rx_bytes(card_ptr->atr, &len) == false) + return false; + if (len > sizeof(card_ptr->atr)) { len = sizeof(card_ptr->atr); } - if (sc_rx_bytes(card_ptr->atr, &len) == false) - return false; uint8_t pos_td = 1; if ((card_ptr->atr[1] & 0x10) == 0x10) pos_td++; From 8eb6f60ba6d7aa54343ae76c35339704f37fb2f8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:40:41 +0100 Subject: [PATCH 006/924] added a wait when init I2C, seems to increase stability --- armsrc/appmain.c | 2 +- armsrc/i2c.c | 10 +++++++--- armsrc/i2c.h | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index f59cc13a3..756ca4f4f 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2608,7 +2608,7 @@ void __attribute__((noreturn)) AppMain(void) { #endif #ifdef WITH_SMARTCARD - I2C_init(); + I2C_init(false); #endif #ifdef WITH_FPC_USART diff --git a/armsrc/i2c.c b/armsrc/i2c.c index 6ede36b13..b9b536c24 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -91,7 +91,7 @@ void I2C_recovery(void) { DbpString("I2C bus recovery complete"); } -void I2C_init(void) { +void I2C_init(bool has_ticks) { // Configure reset pin, close up pull up, push-pull output, default high AT91C_BASE_PIOA->PIO_PPUDR = GPIO_RST; AT91C_BASE_PIOA->PIO_MDDR = GPIO_RST; @@ -106,6 +106,10 @@ void I2C_init(void) { AT91C_BASE_PIOA->PIO_OER |= (GPIO_SCL | GPIO_SDA | GPIO_RST); AT91C_BASE_PIOA->PIO_PER |= (GPIO_SCL | GPIO_SDA | GPIO_RST); + if (has_ticks) { + WaitMS(2); + } + bool isok = (SCL_read && SDA_read); if (isok == false) I2C_recovery(); @@ -133,7 +137,7 @@ void I2C_SetResetStatus(uint8_t LineRST, uint8_t LineSCK, uint8_t LineSDA) { // Note: the SIM_Adapter will not enter the main program after power up. Please run this function before use SIM_Adapter. void I2C_Reset_EnterMainProgram(void) { StartTicks(); - I2C_init(); + I2C_init(true); I2C_SetResetStatus(0, 0, 0); WaitMS(30); I2C_SetResetStatus(1, 0, 0); @@ -146,7 +150,7 @@ void I2C_Reset_EnterMainProgram(void) { // Reserve for firmware update. void I2C_Reset_EnterBootloader(void) { StartTicks(); - I2C_init(); + I2C_init(true); I2C_SetResetStatus(0, 1, 1); WaitMS(100); I2C_SetResetStatus(1, 1, 1); diff --git a/armsrc/i2c.h b/armsrc/i2c.h index 2ce051bd7..972704c1b 100644 --- a/armsrc/i2c.h +++ b/armsrc/i2c.h @@ -31,7 +31,7 @@ #define I2C_DEVICE_CMD_SEND_T0 0x07 void I2C_recovery(void); -void I2C_init(void); +void I2C_init(bool has_ticks); void I2C_Reset(void); void I2C_SetResetStatus(uint8_t LineRST, uint8_t LineSCK, uint8_t LineSDA); From 15a848f9bb58da92dcfebe04bf2c3170bac05327 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:46:41 +0100 Subject: [PATCH 007/924] remove old file --- client/resources/sim012.sha512.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 client/resources/sim012.sha512.txt diff --git a/client/resources/sim012.sha512.txt b/client/resources/sim012.sha512.txt deleted file mode 100644 index abb996fb2..000000000 --- a/client/resources/sim012.sha512.txt +++ /dev/null @@ -1 +0,0 @@ -ac65f93b15dea4e6a27a644056c18266113af57f4d29de9eead4871007816efa7d1ec9f73308377e5fe388fc81b3d408221bd4eff7e1d129e0a349bd2c0f3f2b *sim012.bin From deeb672b08ba14c8f25e5d95b318ee6118a6bbb9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:48:07 +0100 Subject: [PATCH 008/924] also include new firmware binary in the install --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b072d7379..7439c0dcf 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ all clean install uninstall check: %: client/% bootrom/% armsrc/% recovery/% mfk #all clean install uninstall check: %: hitag2crack/% INSTALLTOOLS=pm3_eml2lower.sh pm3_eml2upper.sh pm3_mfdread.py pm3_mfd2eml.py pm3_eml2mfd.py pm3_amii_bin2eml.pl pm3_reblay-emulating.py pm3_reblay-reading.py -INSTALLSIMFW=sim011.bin sim011.sha512.txt +INSTALLSIMFW=sim011.bin sim011.sha512.txt sim013.bin sim013.sha512.txt INSTALLSCRIPTS=pm3 pm3-flash pm3-flash-all pm3-flash-bootrom pm3-flash-fullimage INSTALLSHARES=tools/jtag_openocd traces INSTALLDOCS=doc/*.md doc/md From 7970fdf3ba1fe71449245998d8b04f6b25973cc8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:51:03 +0100 Subject: [PATCH 009/924] text --- CHANGELOG.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01094bf38..19c7f7113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,11 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Moved to non-deprecated API to initialize Python interpreter (jmichel@) - - Changed `sc upgrade` updated firmware v4.12 (RDV40) (@sentiprox) - - Fixed contact interface / smartcard APDU chaining logic and allow 256 bytes ADPU payload. Need SIM firmware 4.12 to work (@jmichel) + - Fixed length check in sim module communications (@jmichel) + - Changed timings in i2c.c when communicating with sim module (@iceman1001) + - Moved to non-deprecated API to initialize Python interpreter (@jmichel) + - Changed `sc upgrade` updated firmware v4.13 (RDV40) - frame buffer is now 384 bytes (@sentiprox) + - Fixed contact interface / smartcard APDU chaining logic and allow 256 bytes ADPU payload. Need SIM firmware 4.13 to work (@jmichel) - Fixed `lf hitag dump` - Should now work as described in the command help (@natmchugh) - Fixed SPI flash overflow when loading dictionnaries into flash. Breaking change: added 1 more sector for Mifare - dictionnaries should be loaded again (@jmichelp) - Added `hf mf gload, gsave, ggetblk, gsetblk` for Gen4 GTU in mifare classic mode (@DidierA) From 4c695c03b6f259bbf526c565850feec60ecb41c0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 9 Dec 2022 07:51:33 +0100 Subject: [PATCH 010/924] added pexpect requirement --- tools/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/requirements.txt b/tools/requirements.txt index 8bff1fb56..b6be80271 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1,2 +1,3 @@ ansicolors==1.1.8 sslcrypto==5.3 +pexpect==4.8.0 \ No newline at end of file From f32de52b4698b1bb40be97dd8a35c8ba7cfdbc96 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 9 Dec 2022 13:17:19 +0100 Subject: [PATCH 011/924] Wait a bit longer for the smartcard. For the max 256-byte frame, SIM wasn't ready early enough, corrupting the reception buffer with 5 spurious bytes. Empirically, 109 clock cycles is the minimum value that worked. Adding 1 clock cycle as a safety buffer. --- armsrc/i2c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/i2c.c b/armsrc/i2c.c index b9b536c24..491e12a04 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -235,9 +235,9 @@ static bool I2C_WaitForSim(void) { // 8051 speaks with smart card. // 1000*50*3.07 = 153.5ms - // 1000*90*3.07 = 276.3ms + // 1000*110*3.07 = 337.7ms // 1byte transfer == 1ms with max frame being 256bytes - return WaitSCL_H_delay(1000 * 90); + return WaitSCL_H_delay(1000 * 110); } // send i2c STOP From 0083e0ae1321555904c1a7c543c9c530b12ff293 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 9 Dec 2022 21:58:28 +0100 Subject: [PATCH 012/924] Fix embedded python not working with Proxspace. --- client/src/cmdscript.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 18a0586f8..b19c5b9df 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -399,34 +399,26 @@ static int CmdScriptRun(const char *Cmd) { PrintAndLogEx(SUCCESS, "executing python " _YELLOW_("%s"), script_path); PrintAndLogEx(SUCCESS, "args " _YELLOW_("'%s'"), arguments); - wchar_t *program = Py_DecodeLocale(filename, NULL); - if (program == NULL) { - PrintAndLogEx(ERR, "could not decode " _YELLOW_("%s"), filename); - free(script_path); - return PM3_ESOFT; - } - - // optional but recommended - //Py_SetProgramName(program); #ifdef HAVE_PYTHON_SWIG // hook Proxmark3 API PyImport_AppendInittab("_pm3", PyInit__pm3); #endif PyConfig py_conf; PyConfig_InitIsolatedConfig(&py_conf); + // Despite being isolated we probably want to allow users to use + // the Python packages they installed on their user directory as well + // as system ones. But it seems isolated mode still enforces them off. + py_conf.use_environment = 1; + py_conf.user_site_directory = 1; //int argc, char ** argv char *argv[128]; argv[0] = filename; int argc = split(arguments, &argv[1]); + // The following line will implicitly pre-initialize Python PyConfig_SetBytesArgv(&py_conf, argc + 1, argv); - // Despite being isolated we probably want to allow users to use - // the Python packages they installed on their user directory as well - // as obey env variables. - py_conf.use_environment = 1; - py_conf.user_site_directory = 1; - // Setting this pre-intializes Python implictly which will change the config - PyConfig_SetString(&py_conf, &py_conf.program_name, program); + // This is required by Proxspace to work with an isolated Python configuration + PyConfig_SetBytesString(&py_conf, &py_conf.home, getenv("PYTHONHOME")); Py_InitializeFromConfig(&py_conf); @@ -447,7 +439,6 @@ static int CmdScriptRun(const char *Cmd) { } int ret = Pm3PyRun_SimpleFileNoExit(f, filename); Py_Finalize(); - PyMem_RawFree(program); free(script_path); if (ret) { PrintAndLogEx(WARNING, "\nfinished " _YELLOW_("%s") " with exception", filename); From b14730d57c3ce13d990e55068cd12754993d6360 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 10 Dec 2022 03:32:18 +0100 Subject: [PATCH 013/924] fix codeql #155 - narrow type with wide type comparison in loop --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index e5ab53d66..51a9a13f0 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6212,7 +6212,7 @@ int CmdHFMFNDEFWrite(const char *Cmd) { uint8_t freemem[MIFARE_4K_MAXSECTOR] = {0}; uint16_t sum = 0; uint8_t block_no = 0; - for (uint8_t i = 1; i < madlen; i++) { + for (uint8_t i = 1; i < (madlen & 0xFF); i++) { freemem[i] = (mad[i] == NDEF_MFC_AID); From 6132646f10472c05289e950bd1ce81c922ecaa03 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 10 Dec 2022 03:33:36 +0100 Subject: [PATCH 014/924] text --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19c7f7113..c1dfcdd6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed failing compilation on Proxspace environment due to how python is initialized (@jmichel) - Fixed length check in sim module communications (@jmichel) - Changed timings in i2c.c when communicating with sim module (@iceman1001) - Moved to non-deprecated API to initialize Python interpreter (@jmichel) From 086d6b6f65096d9e46afaf034a304dc1bff1f28a Mon Sep 17 00:00:00 2001 From: Iceman Date: Sat, 10 Dec 2022 03:45:32 +0100 Subject: [PATCH 015/924] Create SECURITY.md Signed-off-by: Iceman --- SECURITY.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..93cabb3fb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +This is an open source project driven by volunteering devs contributing their time for free. + +This is a bleeding edge repository. +The maintainers actively is working out of this repository and will be periodically re-structuring the code to make it easier to comprehend, navigate, build, test, and contribute to, so DO expect significant changes to code layout on a regular basis. + + +## Reporting a Vulnerability + +if you find a vulnerability feel free to make a pull request with your fix and we will deal with it. + + +👉 Remember! +If you intend to contribute to the code, please read the coding style notes first. We usually merge your contributions fast since we do like the idea of getting a functionality in the Proxmark3 and weed out the bugs afterwards. From 2c1fe700e2b9f5ca12611516386c5fdd2fbe780a Mon Sep 17 00:00:00 2001 From: Edward Li Date: Fri, 9 Dec 2022 23:44:47 -0500 Subject: [PATCH 016/924] Fix `make accessrights` for Fedora --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 7439c0dcf..5452842cc 100644 --- a/Makefile +++ b/Makefile @@ -267,6 +267,10 @@ ifneq ($(wildcard /etc/arch-release),) #If user is running ArchLinux, use specific command and group $(Q)$(SUDO) $(USERMOD) uucp $(USER) $(Q)$(GETENT_BL) >/dev/null && $(SUDO) $(USERMOD) bluetooth $(USER) || true +else ifneq ($(wildcard /etc/fedora-release),) +# If the user is running Fedora, use `usermod` with the dialout group + $(Q)$(SUDO) $(USERMOD) dialout $(USER) + $(Q)$(GETENT_BL) >/dev/null && $(SUDO) $(USERMOD) bluetooth $(USER) || true else $(Q)$(SUDO) $(ADDUSER) $(USER) dialout $(Q)$(GETENT_BL) >/dev/null && $(SUDO) $(ADDUSER) $(USER) bluetooth || true From 3927ae59210b9f7b8cfc0b0a1b155b8bae8e092d Mon Sep 17 00:00:00 2001 From: Edward Li Date: Fri, 9 Dec 2022 23:50:29 -0500 Subject: [PATCH 017/924] Update changelog for #1795 fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1dfcdd6d..72fcfa94e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `pm3` shell script now automatically detects WSL2 with USBIPD serial ports (@iceman1001) - Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001) - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) + - Fixed `make accessrights` on Fedora (@mooey5775) ## [Radium.4.15864][2022-10-29] - Changed `lf indala sim` - now accepts fc / cn (@iceman1001) From a63257799a0092460f86cce8bb3ded3e13cd2de2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 13 Dec 2022 21:47:25 +0100 Subject: [PATCH 018/924] test of faster pack response for "hf mfu sim -t 7" --- armsrc/iso14443a.c | 23 +++++++++++++++++------ armsrc/iso14443a.h | 3 ++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 5f60942e4..23b46cf54 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1039,6 +1039,8 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // PPS response static uint8_t rPPS[3] = { 0xD0 }; + static uint8_t rPACK[4] = { 0x00, 0x00, 0x00, 0x00 }; + switch (tagType) { case 1: { // MIFARE Classic 1k rATQA[0] = 0x04; @@ -1227,6 +1229,8 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r AddCrc14A(rPPS, sizeof(rPPS) - 2); + AddCrc14A(rPACK, sizeof(rPACK) - 2); + static tag_response_info_t responses_init[] = { { .response = rATQA, .response_n = sizeof(rATQA) }, // Answer to request - respond with card type { .response = rUIDc1, .response_n = sizeof(rUIDc1) }, // Anticollision cascade1 - respond with uid @@ -1238,14 +1242,16 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r { .response = rRATS, .response_n = sizeof(rRATS) }, // dummy ATS (pseudo-ATR), answer to RATS { .response = rVERSION, .response_n = sizeof(rVERSION) }, // EV1/NTAG GET_VERSION response { .response = rSIGN, .response_n = sizeof(rSIGN) }, // EV1/NTAG READ_SIG response - { .response = rPPS, .response_n = sizeof(rPPS) } // PPS response + { .response = rPPS, .response_n = sizeof(rPPS) }, // PPS response + { .response = rPACK, .response_n = sizeof(rPACK) } // PACK response }; - // "precompile" responses. There are 11 predefined responses with a total of 80 bytes data to transmit. + // "precompile" responses. There are 12 predefined responses with a total of 84 bytes data to transmit. + // Coded responses need one byte per bit to transfer (data, parity, start, stop, correction) - // 81 * 8 data bits, 81 * 1 parity bits, 11 start bits, 11 stop bits, 11 correction bits - // 81 * 8 + 81 + 11 + 11 + 11 == 762 -#define ALLOCATED_TAG_MODULATION_BUFFER_SIZE 762 + // 85 * 8 data bits, 85 * 1 parity bits, 12 start bits, 12 stop bits, 12 correction bits + // 85 * 8 + 85 + 12 + 12 + 12 == 801 +#define ALLOCATED_TAG_MODULATION_BUFFER_SIZE 801 uint8_t *free_buffer = BigBuf_malloc(ALLOCATED_TAG_MODULATION_BUFFER_SIZE); // modulation buffer pointer and current buffer free space size @@ -1641,6 +1647,8 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ LogTrace(receivedCmd, Uart.len, Uart.startTime * 16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime * 16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, true); p_response = NULL; } else if (receivedCmd[0] == MIFARE_ULEV1_AUTH && len == 7 && tagType == 7) { // NTAG / EV-1 authentication + + /* // PWD stored in dump now uint8_t pwd[4]; emlGetMemBt(pwd, (pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(pwd)); @@ -1654,7 +1662,8 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ uint8_t pack[4]; emlGetMemBt(pack, pages * 4 + MFU_DUMP_PREFIX_LENGTH, 2); if (memcmp(pack, "\x00\x00\x00\x00", 4) == 0) { - memcpy(pack, "\x80\x80\x00\x00", 4); + pack[0] = 0x80; + pack[1] = 0x80; } AddCrc14A(pack, sizeof(pack) - 2); EmSendCmd(pack, sizeof(pack)); @@ -1663,6 +1672,8 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ if (g_dbglevel >= DBG_DEBUG) Dbprintf("Auth attempt: %08x", bytes_to_num(receivedCmd + 1, 4)); } p_response = NULL; + */ + p_response = &responses[RESP_INDEX_PACK]; } else if (receivedCmd[0] == MIFARE_ULEV1_VCSL && len == 23 && tagType == 7) { uint8_t cmd[3]; emlGetMemBt(cmd, (pages - 2) * 4 + 1 + MFU_DUMP_PREFIX_LENGTH, 1); diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index cf3ecf854..104d6b680 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -104,7 +104,8 @@ typedef enum { RESP_INDEX_RATS, RESP_INDEX_VERSION, RESP_INDEX_SIGNATURE, - RESP_INDEX_PPS + RESP_INDEX_PPS, + RESP_INDEX_PACK, } resp_index_t; #ifndef AddCrc14A From 1fe1f61400f8281ab4155652fc0e7c5967461413 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Fri, 16 Dec 2022 01:46:21 +0800 Subject: [PATCH 019/924] Fix typo in Troubleshooting.md Signed-off-by: Self Not Found --- doc/md/Installation_Instructions/Troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index 68d3d5570..710b2de26 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -166,7 +166,7 @@ pm3 --> smart upgrade -f /usr/local/share/proxmark3/firmware/sim013.bin pm3 --> smart upgrade -f /usr/share/proxmark3/firmware/sim013.bin ``` -If you didn't install the PRoxmark but you're working from the sources directory and depending how you launch the client, your working directory might be the root of the repository: +If you didn't install the Proxmark but you're working from the sources directory and depending how you launch the client, your working directory might be the root of the repository: ``` ./pm3 ... From 0d2e86f99c1d5598d2fd5ae7d9bdb627babf9bc4 Mon Sep 17 00:00:00 2001 From: Nitraiolo Date: Sat, 17 Dec 2022 15:26:36 +0100 Subject: [PATCH 020/924] Conditional build of cmdscript to allow compilation with old python versions (<3.10.x) --- client/src/cmdscript.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index b19c5b9df..d326af4d1 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -403,6 +403,7 @@ static int CmdScriptRun(const char *Cmd) { // hook Proxmark3 API PyImport_AppendInittab("_pm3", PyInit__pm3); #endif +#if PY_MINOR_VERSION >= 10 PyConfig py_conf; PyConfig_InitIsolatedConfig(&py_conf); // Despite being isolated we probably want to allow users to use @@ -410,11 +411,15 @@ static int CmdScriptRun(const char *Cmd) { // as system ones. But it seems isolated mode still enforces them off. py_conf.use_environment = 1; py_conf.user_site_directory = 1; +#else + Py_Initialize(); +#endif //int argc, char ** argv char *argv[128]; argv[0] = filename; int argc = split(arguments, &argv[1]); +#if PY_MINOR_VERSION >= 10 // The following line will implicitly pre-initialize Python PyConfig_SetBytesArgv(&py_conf, argc + 1, argv); // This is required by Proxspace to work with an isolated Python configuration @@ -424,6 +429,17 @@ static int CmdScriptRun(const char *Cmd) { // clean up PyConfig_Clear(&py_conf); +#else + wchar_t *py_args[argc + 1]; + py_args[0] = Py_DecodeLocale(filename, NULL); + for (int i = 0; i < argc; i++) { + py_args[i + 1] = Py_DecodeLocale(argv[i], NULL); + } + + PySys_SetArgv(argc + 1, py_args); + + // clean up +#endif for (int i = 0; i < argc; ++i) { free(argv[i + 1]); } From 912d9be2d14201e138cdf4963e0998a3f1bc53b1 Mon Sep 17 00:00:00 2001 From: Nitraiolo Date: Sat, 17 Dec 2022 20:12:12 +0100 Subject: [PATCH 021/924] Added major version into compile condition of cmdscript --- client/src/cmdscript.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index d326af4d1..16d933d76 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -403,7 +403,7 @@ static int CmdScriptRun(const char *Cmd) { // hook Proxmark3 API PyImport_AppendInittab("_pm3", PyInit__pm3); #endif -#if PY_MINOR_VERSION >= 10 +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 10 PyConfig py_conf; PyConfig_InitIsolatedConfig(&py_conf); // Despite being isolated we probably want to allow users to use @@ -419,7 +419,7 @@ static int CmdScriptRun(const char *Cmd) { char *argv[128]; argv[0] = filename; int argc = split(arguments, &argv[1]); -#if PY_MINOR_VERSION >= 10 +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 10 // The following line will implicitly pre-initialize Python PyConfig_SetBytesArgv(&py_conf, argc + 1, argv); // This is required by Proxspace to work with an isolated Python configuration From 997e5aac3eb40ad17784c10195ed9a951efc6ab5 Mon Sep 17 00:00:00 2001 From: Nitraiolo Date: Sat, 17 Dec 2022 21:49:04 +0100 Subject: [PATCH 022/924] Fix py_args[] population --- client/src/cmdscript.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 16d933d76..b8065950e 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -431,9 +431,8 @@ static int CmdScriptRun(const char *Cmd) { PyConfig_Clear(&py_conf); #else wchar_t *py_args[argc + 1]; - py_args[0] = Py_DecodeLocale(filename, NULL); - for (int i = 0; i < argc; i++) { - py_args[i + 1] = Py_DecodeLocale(argv[i], NULL); + for (int i = 0; i <= argc; i++) { + py_args[i] = Py_DecodeLocale(argv[i], NULL); } PySys_SetArgv(argc + 1, py_args); From 96d8528a0af94f21734124c39481307f3993334f Mon Sep 17 00:00:00 2001 From: Nitraiolo Date: Sun, 18 Dec 2022 09:45:46 +0100 Subject: [PATCH 023/924] Inverted condition in python check so it defaults to new code now. --- client/src/cmdscript.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index b8065950e..9e19c0959 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -403,7 +403,9 @@ static int CmdScriptRun(const char *Cmd) { // hook Proxmark3 API PyImport_AppendInittab("_pm3", PyInit__pm3); #endif -#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 10 +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 10 + Py_Initialize(); +#else PyConfig py_conf; PyConfig_InitIsolatedConfig(&py_conf); // Despite being isolated we probably want to allow users to use @@ -411,15 +413,22 @@ static int CmdScriptRun(const char *Cmd) { // as system ones. But it seems isolated mode still enforces them off. py_conf.use_environment = 1; py_conf.user_site_directory = 1; -#else - Py_Initialize(); #endif //int argc, char ** argv char *argv[128]; argv[0] = filename; int argc = split(arguments, &argv[1]); -#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 10 +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 10 + wchar_t *py_args[argc + 1]; + for (int i = 0; i <= argc; i++) { + py_args[i] = Py_DecodeLocale(argv[i], NULL); + } + + PySys_SetArgv(argc + 1, py_args); + + // clean up +#else // The following line will implicitly pre-initialize Python PyConfig_SetBytesArgv(&py_conf, argc + 1, argv); // This is required by Proxspace to work with an isolated Python configuration @@ -429,15 +438,6 @@ static int CmdScriptRun(const char *Cmd) { // clean up PyConfig_Clear(&py_conf); -#else - wchar_t *py_args[argc + 1]; - for (int i = 0; i <= argc; i++) { - py_args[i] = Py_DecodeLocale(argv[i], NULL); - } - - PySys_SetArgv(argc + 1, py_args); - - // clean up #endif for (int i = 0; i < argc; ++i) { free(argv[i + 1]); From 4375f5b91e440e53c1d311fed36f61ec0b54d71f Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Tue, 20 Dec 2022 15:32:38 +0100 Subject: [PATCH 024/924] Avoid memory leaks with Python <3.10 --- client/src/cmdscript.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 9e19c0959..7a5a59130 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -426,8 +426,6 @@ static int CmdScriptRun(const char *Cmd) { } PySys_SetArgv(argc + 1, py_args); - - // clean up #else // The following line will implicitly pre-initialize Python PyConfig_SetBytesArgv(&py_conf, argc + 1, argv); @@ -453,6 +451,12 @@ static int CmdScriptRun(const char *Cmd) { return PM3_ESOFT; } int ret = Pm3PyRun_SimpleFileNoExit(f, filename); +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 10 + // Py_DecodeLocale() allocates memory that needs to be free'd + for (int i = 0; i < argc + 1; i++) { + PyMem_RawFree(py_args[i]); + } +#endif Py_Finalize(); free(script_path); if (ret) { From 1f7d3d85a746949f47ca1549ea492d24a712a860 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Thu, 22 Dec 2022 12:24:20 +0800 Subject: [PATCH 025/924] Fix the steps when updating from old version When updating from a old version on Windows, the `pm3-flash-all` always fails even after updating the bootloader. This is because it detects the hardware by the serial number "ICEMAN", which only appears after flashing the fullimage. --- client/src/flash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/flash.c b/client/src/flash.c index 6275db0bf..20729b2da 100644 --- a/client/src/flash.c +++ b/client/src/flash.c @@ -489,7 +489,7 @@ static void flash_suggest_update_bootloader(void) { PrintAndLogEx(ERR, "------------- " _CYAN_("Follow these steps") " -------------------"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(ERR, " 1) ./pm3-flash-bootrom"); - PrintAndLogEx(ERR, " 2) ./pm3-flash-all"); + PrintAndLogEx(ERR, " 2) ./pm3-flash-fullimage"); PrintAndLogEx(ERR, " 3) ./pm3"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "---------------------------------------------------"); From d998fabe2f3574094e8f086666d6a97fd51c0551 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Dec 2022 20:01:04 +0100 Subject: [PATCH 026/924] add aid to resource file --- CHANGELOG.md | 1 + client/resources/aidlist.json | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72fcfa94e..47e2d30df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added PIV aid to resource file (@jmichel) - Fixed failing compilation on Proxspace environment due to how python is initialized (@jmichel) - Fixed length check in sim module communications (@jmichel) - Changed timings in i2c.c when communicating with sim module (@iceman1001) diff --git a/client/resources/aidlist.json b/client/resources/aidlist.json index bc939de14..81a153bba 100644 --- a/client/resources/aidlist.json +++ b/client/resources/aidlist.json @@ -1247,6 +1247,14 @@ "Description": "PIV End Point Applet. Last 2 bytes designate version", "Type": "" }, + { + "AID": "A000000308000010000100", + "Vendor": "National Institute of Standards and Technology", + "Country": "United States", + "Name": "Personal Identity Verification (PIV) / ID-ONE PIV BIO", + "Description": "PIV End Point Applet. Last 2 bytes designate version", + "Type": "" + }, { "AID": "A00000031510100528", "Vendor": "Currence Holding/PIN BV", From 08930766cb8a7e76b96eed44572bc7f46979f0c6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Dec 2022 20:05:45 +0100 Subject: [PATCH 027/924] fix potential NULL array printing --- CHANGELOG.md | 1 + client/src/util.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47e2d30df..679a27524 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed potential NULL array printing (@jmichel) - Added PIV aid to resource file (@jmichel) - Fixed failing compilation on Proxspace environment due to how python is initialized (@jmichel) - Fixed length check in sim module communications (@jmichel) diff --git a/client/src/util.c b/client/src/util.c index e849ebb62..d6d57414d 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -303,7 +303,8 @@ void print_hex_noascii_break(const uint8_t *data, const size_t len, uint8_t brea static void print_buffer_ex(const uint8_t *data, const size_t len, int level, uint8_t breaks) { - if (len < 1) + // sanity checks + if ((data == NULL) || (len < 1)) return; char buf[UTIL_BUFFER_SIZE_SPRINT + 3]; From b43bb92961c8b3adcd5ef0778fe3e29ecf9d9c7b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 28 Dec 2022 21:53:14 +0100 Subject: [PATCH 028/924] textual --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b98ad79b..d931e1ad5 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,13 @@ We define generic Proxmark3 platforms as following devices. - ⚠ VX - **Note**: unknown device hw - ⚠ Proxmark3 X - - **Note**: unknown device hw. + - **Note**: unknown device hw +- ⚠ Proxmark3 Ultimate + - **Note**: unknown device hw +- ⚠ Proxmark3 SE + - **Note**: unknown device hw + +When it comes to these new unknown models we are depending on the community to report in if this repo works and what they did to make it work. **256kb flash memory size of generic Proxmark3 platforms** From e44f84747419a1931fb6b57abf049a226b7e5514 Mon Sep 17 00:00:00 2001 From: nvx Date: Thu, 29 Dec 2022 22:37:50 +1000 Subject: [PATCH 029/924] Improved NXP SLI/SLIX series tag identification --- CHANGELOG.md | 1 + client/src/cmdhf15.c | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 679a27524..befb67d0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Improved NXP SLI/SLIX series tag identification (@nvx) - Fixed potential NULL array printing (@jmichel) - Added PIV aid to resource file (@jmichel) - Fixed failing compilation on Proxspace environment due to how python is initialized (@jmichel) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 45040d7f2..84629d56e 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -67,7 +67,7 @@ typedef struct { // structure and database for uid -> tagtype lookups typedef struct { uint64_t uid; - int mask; // how many MSB bits used + uint64_t mask; // how many MSB bits used, or mask itself if larger than 64 const char *desc; } productName_t; @@ -90,17 +90,22 @@ static const productName_t uidmapping[] = { // E0 04 xx // 04 = Manufacturer code (Philips/NXP) // XX = IC id (Chip ID Family) - //I-Code SLI SL2 ICS20 [IC id = 01] - //I-Code SLI-S [IC id = 02] - //I-Code SLI-L [IC id = 03] - //I-Code SLIX [IC id = 01 + bit36 set to 1 (starting from bit0 - different from normal SLI)] + //I-Code SLI SL2 ICS20 [IC id = 01 + bit35 set to 0 + bit36 set to 0] + //I-Code SLIX [IC id = 01 + bit35 set to 0 + bit36 set to 1] //I-Code SLIX2 [IC id = 01 + bit35 set to 1 + bit36 set to 0] + //I-Code SLI-S [IC id = 02 + bit36 set to 0] //I-Code SLIX-S [IC id = 02 + bit36 set to 1] + //I-Code SLI-L [IC id = 03 + bit36 set to 0] //I-Code SLIX-L [IC id = 03 + bit36 set to 1] { 0xE004000000000000LL, 16, "NXP Semiconductors Germany (Philips)" }, { 0xE004010000000000LL, 24, "NXP(Philips); IC SL2 ICS20/ICS21(SLI) ICS2002/ICS2102(SLIX) ICS2602(SLIX2)" }, - { 0xE004020000000000LL, 24, "NXP(Philips); IC SL2 ICS53/ICS54(SLI-S) ICS5302/ICS5402(SLIX-S)" }, - { 0xE004030000000000LL, 24, "NXP(Philips); IC SL2 ICS50/ICS51(SLI-L) ICS5002/ICS5102(SLIX-L)" }, + { 0xE004010000000000LL, 0xFFFFFF1800000000LL, "NXP(Philips); IC SL2 ICS20/ICS21(SLI)" }, + { 0xE004011000000000LL, 0xFFFFFF1800000000LL, "NXP(Philips); IC SL2 ICS2002/ICS2102(SLIX)" }, + { 0xE004010800000000LL, 0xFFFFFF1800000000LL, "NXP(Philips); IC SL2 ICS2602(SLIX2)" }, + { 0xE004020000000000LL, 0xFFFFFF1000000000LL, "NXP(Philips); IC SL2 ICS53/ICS54(SLI-S)" }, + { 0xE004021000000000LL, 0xFFFFFF1000000000LL, "NXP(Philips); ICS5302/ICS5402(SLIX-S)" }, + { 0xE004030000000000LL, 0xFFFFFF1000000000LL, "NXP(Philips); IC SL2 ICS50/ICS51(SLI-L)" }, + { 0xE004031000000000LL, 0xFFFFFF1000000000LL, "NXP(Philips); ICS5002/ICS5102(SLIX-L)" }, // E0 05 XX .. .. .. // 05 = Manufacturer code (Infineon) @@ -364,7 +369,11 @@ static const char *getTagInfo_15(uint8_t *uid) { int i = 0, best = -1; memcpy(&myuid, uid, sizeof(uint64_t)); while (uidmapping[i].mask > 0) { - mask = (~0ULL) << (64 - uidmapping[i].mask); + if (uidmapping[i].mask > 64) { + mask = uidmapping[i].mask; + } else { + mask = (~0ULL) << (64 - uidmapping[i].mask); + } if ((myuid & mask) == uidmapping[i].uid) { if (best == -1) { best = i; From 9e0fe3ca3697f65ec7d3a3538b6b32d7f2632a47 Mon Sep 17 00:00:00 2001 From: Hanno Heinrichs Date: Thu, 29 Dec 2022 12:52:19 +0100 Subject: [PATCH 030/924] Fix stack-based buffer overflow in "lf em 4x05 sniff" command --- CHANGELOG.md | 1 + client/src/cmdlfem4x05.c | 63 ++++++++++++++++++++++------------------ client/src/cmdlfem4x05.h | 2 ++ client/src/util.c | 9 ++++++ client/src/util.h | 7 +++++ 5 files changed, 54 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 679a27524..3aa8d4389 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed buffer overflow in "lf em 4x05 sniff" (@HeinrichsH) - Fixed potential NULL array printing (@jmichel) - Added PIV aid to resource file (@jmichel) - Fixed failing compilation on Proxspace environment due to how python is initialized (@jmichel) diff --git a/client/src/cmdlfem4x05.c b/client/src/cmdlfem4x05.c index 6eb2bb837..8e6110c62 100644 --- a/client/src/cmdlfem4x05.c +++ b/client/src/cmdlfem4x05.c @@ -41,6 +41,7 @@ #include "generator.h" #include "cliparser.h" #include "cmdhw.h" +#include "util.h" //////////////// 4205 / 4305 commands @@ -1996,8 +1997,7 @@ int CmdEM4x05Sniff(const char *Cmd) { const char *cmdText; char dataText[100]; char blkAddr[4]; - char bits[80]; - int i, bitidx; + int i; int ZeroWidth; // 32-42 "1" is 32 int CycleWidth; size_t pulseSamples; @@ -2018,6 +2018,10 @@ int CmdEM4x05Sniff(const char *Cmd) { PrintAndLogEx(SUCCESS, "offset | Command | Data | blk | raw"); PrintAndLogEx(SUCCESS, "-------+-------------+----------+-----+------------------------------------------------------------"); + smartbuf bits = { 0 }; + bits.ptr = malloc(EM4X05_BITS_BUFSIZE); + bits.size = EM4X05_BITS_BUFSIZE; + bits.idx = 0; size_t idx = 0; // loop though sample buffer while (idx < g_GraphTraceLen) { @@ -2037,8 +2041,8 @@ int CmdEM4x05Sniff(const char *Cmd) { if (ZeroWidth <= 50) { pktOffset -= ZeroWidth; - memset(bits, 0x00, sizeof(bits)); - bitidx = 0; + memset(bits.ptr, 0, bits.size); + bits.idx = 0; while ((idx < g_GraphTraceLen) && !eop) { CycleWidth = idx; @@ -2047,7 +2051,7 @@ int CmdEM4x05Sniff(const char *Cmd) { CycleWidth = idx - CycleWidth; if ((CycleWidth > 300) || (CycleWidth < (ZeroWidth - 5))) { // to long or too short eop = true; - bits[bitidx++] = '0'; // Append last zero from the last bit find + sb_append_char(&bits, '0'); // Append last zero from the last bit find cmdText = ""; // EM4305 command lengths @@ -2059,76 +2063,77 @@ int CmdEM4x05Sniff(const char *Cmd) { // -> disable 1010 11111111 0 11111111 0 11111111 0 11111111 0 00000000 0 // Check to see if we got the leading 0 - if (((strncmp(bits, "00011", 5) == 0) && (bitidx == 50)) || - ((strncmp(bits, "00101", 5) == 0) && (bitidx == 57)) || - ((strncmp(bits, "01001", 5) == 0) && (bitidx == 12)) || - ((strncmp(bits, "01100", 5) == 0) && (bitidx == 50)) || - ((strncmp(bits, "01010", 5) == 0) && (bitidx == 50))) { - memmove(bits, &bits[1], bitidx - 1); - bitidx--; + if (((strncmp(bits.ptr, "00011", 5) == 0) && (bits.idx == 50)) || + ((strncmp(bits.ptr, "00101", 5) == 0) && (bits.idx == 57)) || + ((strncmp(bits.ptr, "01001", 5) == 0) && (bits.idx == 12)) || + ((strncmp(bits.ptr, "01100", 5) == 0) && (bits.idx == 50)) || + ((strncmp(bits.ptr, "01010", 5) == 0) && (bits.idx == 50))) { + memmove(bits.ptr, &bits.ptr[1], bits.idx - 1); + bits.idx--; PrintAndLogEx(INFO, "Trim leading 0"); } - bits[bitidx] = 0; + sb_append_char(&bits, 0); + bits.idx--; // logon - if ((strncmp(bits, "0011", 4) == 0) && (bitidx == 49)) { + if ((strncmp(bits.ptr, "0011", 4) == 0) && (bits.idx == 49)) { haveData = true; pwd = true; cmdText = "Logon"; strncpy(blkAddr, " ", sizeof(blkAddr)); - tmpValue = em4x05_Sniff_GetBlock(&bits[4], fwd); + tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[4], fwd); snprintf(dataText, sizeof(dataText), "%08X", tmpValue); } // write - if ((strncmp(bits, "0101", 4) == 0) && (bitidx == 56)) { + if ((strncmp(bits.ptr, "0101", 4) == 0) && (bits.idx == 56)) { haveData = true; cmdText = "Write"; - tmpValue = (bits[4] - '0') + ((bits[5] - '0') << 1) + ((bits[6] - '0') << 2) + ((bits[7] - '0') << 3); + tmpValue = (bits.ptr[4] - '0') + ((bits.ptr[5] - '0') << 1) + ((bits.ptr[6] - '0') << 2) + ((bits.ptr[7] - '0') << 3); snprintf(blkAddr, sizeof(blkAddr), "%u", tmpValue); if (tmpValue == 2) { pwd = true; } - tmpValue = em4x05_Sniff_GetBlock(&bits[11], fwd); + tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[11], fwd); snprintf(dataText, sizeof(dataText), "%08X", tmpValue); } // read - if ((strncmp(bits, "1001", 4) == 0) && (bitidx == 11)) { + if ((strncmp(bits.ptr, "1001", 4) == 0) && (bits.idx == 11)) { haveData = true; pwd = false; cmdText = "Read"; - tmpValue = (bits[4] - '0') + ((bits[5] - '0') << 1) + ((bits[6] - '0') << 2) + ((bits[7] - '0') << 3); + tmpValue = (bits.ptr[4] - '0') + ((bits.ptr[5] - '0') << 1) + ((bits.ptr[6] - '0') << 2) + ((bits.ptr[7] - '0') << 3); snprintf(blkAddr, sizeof(blkAddr), "%u", tmpValue); strncpy(dataText, " ", sizeof(dataText)); } // protect - if ((strncmp(bits, "1100", 4) == 0) && (bitidx == 49)) { + if ((strncmp(bits.ptr, "1100", 4) == 0) && (bits.idx == 49)) { haveData = true; pwd = false; cmdText = "Protect"; strncpy(blkAddr, " ", sizeof(blkAddr)); - tmpValue = em4x05_Sniff_GetBlock(&bits[11], fwd); + tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[11], fwd); snprintf(dataText, sizeof(dataText), "%08X", tmpValue); } // disable - if ((strncmp(bits, "1010", 4) == 0) && (bitidx == 49)) { + if ((strncmp(bits.ptr, "1010", 4) == 0) && (bits.idx == 49)) { haveData = true; pwd = false; cmdText = "Disable"; strncpy(blkAddr, " ", sizeof(blkAddr)); - tmpValue = em4x05_Sniff_GetBlock(&bits[11], fwd); + tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[11], fwd); snprintf(dataText, sizeof(dataText), "%08X", tmpValue); } // bits[bitidx] = 0; } else { i = (CycleWidth - ZeroWidth) / 28; - bits[bitidx++] = '0'; + sb_append_char(&bits, '0'); for (int ii = 0; ii < i; ii++) { - bits[bitidx++] = '1'; + sb_append_char(&bits, '1'); } } } @@ -2139,11 +2144,13 @@ int CmdEM4x05Sniff(const char *Cmd) { // Print results if (haveData) { //&& (minWidth > 1) && (maxWidth > minWidth)){ if (pwd) - PrintAndLogEx(SUCCESS, "%6zu | %-10s | " _YELLOW_("%8s")" | " _YELLOW_("%3s")" | %s", pktOffset, cmdText, dataText, blkAddr, bits); + PrintAndLogEx(SUCCESS, "%6zu | %-10s | " _YELLOW_("%8s")" | " _YELLOW_("%3s")" | %s", pktOffset, cmdText, dataText, blkAddr, bits.ptr); else - PrintAndLogEx(SUCCESS, "%6zu | %-10s | " _GREEN_("%8s")" | " _GREEN_("%3s")" | %s", pktOffset, cmdText, dataText, blkAddr, bits); + PrintAndLogEx(SUCCESS, "%6zu | %-10s | " _GREEN_("%8s")" | " _GREEN_("%3s")" | %s", pktOffset, cmdText, dataText, blkAddr, bits.ptr); } } + free(bits.ptr); + bits.ptr = NULL; // footer PrintAndLogEx(SUCCESS, "---------------------------------------------------------------------------------------------------"); diff --git a/client/src/cmdlfem4x05.h b/client/src/cmdlfem4x05.h index 19c3dd4f2..ed472a803 100644 --- a/client/src/cmdlfem4x05.h +++ b/client/src/cmdlfem4x05.h @@ -27,6 +27,8 @@ #define EM4305_PROT2_BLOCK 15 #define EM4469_PROT_BLOCK 3 +#define EM4X05_BITS_BUFSIZE 128 + // config blocks #define EM4305_DEFAULT_CONFIG_BLOCK (EM4x05_SET_BITRATE(32) | EM4x05_MODULATION_MANCHESTER | EM4x05_SET_NUM_BLOCKS(4) ) // ASK/MAN , data rate 32, 4 data blocks //#define EM4305_DEFAULT_CONFIG_BLOCK (EM4x05_SET_BITRATE(32) | EM4x05_MODULATION_BIPHASE | EM4x05_SET_NUM_BLOCKS(4) ) // ASK/BIPHASE , data rate 32, 4 data blocks diff --git a/client/src/util.c b/client/src/util.c index d6d57414d..56eb3164a 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -1261,3 +1261,12 @@ int byte_strstr(uint8_t *src, size_t srclen, uint8_t *pattern, size_t plen) { } return -1; } + +void sb_append_char(smartbuf *sb, unsigned char c) { + if (sb->idx >= sb->size) { + sb->size *= 2; + sb->ptr = realloc(sb->ptr, sb->size); + } + sb->ptr[sb->idx] = c; + sb->idx++; +} diff --git a/client/src/util.h b/client/src/util.h index 939e0a55d..616272c84 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -146,4 +146,11 @@ uint32_t leadingzeros32(uint32_t a); uint64_t leadingzeros64(uint64_t a); int byte_strstr(uint8_t *src, size_t srclen, uint8_t *pattern, size_t plen); + +struct smartbuf { + char *ptr; + size_t size; + size_t idx; +} typedef smartbuf; +void sb_append_char(smartbuf *sb, unsigned char c); #endif From 6d208346f7cd6be7f84f17966b83ecc2345ff267 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 31 Dec 2022 10:03:17 +0100 Subject: [PATCH 031/924] remove file --- tools/simmodule/sim012.asm | 816 ------------------------------------- 1 file changed, 816 deletions(-) delete mode 100644 tools/simmodule/sim012.asm diff --git a/tools/simmodule/sim012.asm b/tools/simmodule/sim012.asm deleted file mode 100644 index 02466a288..000000000 --- a/tools/simmodule/sim012.asm +++ /dev/null @@ -1,816 +0,0 @@ -; --------------------------------------------------------------------------- -; Proxmark3 RDV4 SIM module firmware -; -; Copyright (C) 2109, 2022 Sentinel -; -; This program is free software: you can redistribute it and/or modify it -; under the terms of the GNU Lesser General Public License as published by the -; Free Software Foundation, either version 3 of the License, or (at your -; option) any later version. -; -; This program is distributed in the hope that it will be useful, but WITHOUT -; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -; more details. -; -; You should have received a copy of the GNU Lesser General Public License -; along with this program. If not, see -; --------------------------------------------------------------------------- - VERS_HI equ 4 - VERS_LO equ 12 -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- - SCON_0 equ 098h - FE_0 equ 098h.7 - - SCON_1 equ 0F8h - RI_1 equ 0F8h.0 - TI_1 equ 0F8h.1 - FE_1 equ 0F8h.7 - SBUF_1 equ 09Ah - T3CON equ 0C4h - RL3 equ 0C5h - RH3 equ 0C6h - - P0M1 equ 0B1h - P0M2 equ 0B2h - P1M1 equ 0B3h - P1M2 equ 0B4h - P3M1 equ 0ACh; - P3M2 equ 0ADh; - - EIE equ 09Bh - EIE1 equ 09Ch - - TA equ 0C7h - - RCTRIM0 equ 084h -; --------------------------------------------------------------------------- - CKCON equ 08Eh - CKDIV equ 095h -; --------------------------------------------------------------------------- - P1S equ 0B3h ;Page1 - SFRS equ 091h ;TA Protection -; --------------------------------------------------------------------------- - ;AUXR1 equ 0A2h -; --------------------------------------------------------------------------- - I2DAT equ 0BCh; - I2STAT equ 0BDh; - I2CLK equ 0BEh; - I2TOC equ 0BFh; - I2CON equ 0C0h; - ; equ I2CON.7;8 - I2CEN equ I2CON.6;4 - STA equ I2CON.5;2 - STO equ I2CON.4;1 - SI equ I2CON.3;8 - AA equ I2CON.2;4 - ; equ I2CON.1;2 - I2CPX equ I2CON.0;1 - - - I2ADDR equ 0C1h; - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- - pin_TX1 equ P1.6 - - pin_TX0 equ P0.6 - pin_RX0 equ P0.7 - - pin_SCL equ P1.3 - pin_SDA equ P1.4 - - pin_RST equ P1.0 - pin_CLC equ P1.1 - pin_led equ P1.2 - -; --------------------------------------------------------------------------- -; =========================================================================== - - - CMD_GENERATE_ATR equ 01h - CMD_WRITE_DATA_SIM equ 02h - CMD_READ_DATA_SIM equ 03h - - CMD_SET_BAUD_RATE equ 04h - CMD_SET_SIM_CLC equ 05h - CMD_GET_VERS equ 06h - CMD_WRITE_CONFIRM equ 07h - - - -; --------------------------------------------------------------------------- -; =========================================================================== - - bit_RX0 equ 32.0 - bit_command_receive equ 32.1 - bit_generate_ATR equ 32.2 - i2c_write_mode equ 32.3 - i2c_write_done equ 32.4 - bit_data_sim_wr equ 32.5 - ; equ 32.6 - bit_TX0 equ 32.7 - - bit_command_buff equ 33.0 - i2c_write_command equ 33.1 - i2c_command_done equ 33.2 - bit_wait_confirm equ 33.3 - bit_first_ATR equ 33.4 ;11/03/2019 - bit_length_answerH equ 33.5 - bit_length_answerL equ 33.6 -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - bit_32 equ 32 - bit_33 equ 33 - - time_data_read equ 34 - time_confirm equ 35 - - pointer_RX1H equ 36 ;save SBUF(SIM) to XRAM - pointer_RX1L equ 37 ;save SBUF(SIM) to XRAM - - pointer_RX2H equ 38 ;read XRAM to I2C - pointer_RX2L equ 39 ;read XRAM to I2C - - pointer_TXH equ 40 - pointer_TXL equ 41 - - length_send_to_simH equ 42 - length_send_to_simL equ 43 - - length_answer_simH equ 44 - length_answer_simL equ 45 - - length_command equ 46 - - buff_command equ 47 - cmd_command equ 48 - data_command equ 49 - - STACKKKKK equ 200 -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - XRAM_TX_BUFF equ 0 - XRAM_RX_BUFF equ 384 -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -; Beginning of the main program - cseg at 00 - Ljmp main_start - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- - cseg at 11 ;1302Hz = 4MHZ(Fsys)/12/256 -; --------------------------------------------------------------------------- - jb time_confirm.7, $+3+2 ;3 - dec time_confirm ;2 -; --------------------------------------------------------------------------- - jb time_data_read.7,reti_timer0 - djnz time_data_read, reti_timer0 - setb pin_scl -reti_timer0: - reti - - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- - cseg at 35 ;UART0 - ajmp jmp_UART0_interrupt - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- - cseg at 51 ;I2C - ajmp jmp_i2c_interrupt - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- - cseg at 123 ;UART1 - clr RI_1 - clr TI_1 - reti - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -jmp_UART0_interrupt: - jbc RI,jmp_byte_RI - jbc TI,jmp_byte_TI - reti -; --------------------------------------------------------------------------- -jmp_byte_RI: - jnb bit_first_ATR, jmp_not_collect ;11/03/2019 - - setb bit_RX0 - jb i2c_write_done,jmp_not_collect - PUSH ACC - PUSH DPH - PUSH DPL - mov DPL,pointer_RX1L - mov DPH,pointer_RX1H - mov a,SBUF - movx @DPTR,a - inc DPTR - mov pointer_RX1L,DPL - mov pointer_RX1H,DPH - POP DPL - POP DPH - POP ACC - ;09/08/2018 - clr pin_scl - mov time_data_read,#52 ;52/1302Hz = 40mS - - inc length_answer_simL - mov a,length_answer_simL - jnz $+2+2 ;2 - inc length_answer_simH ;2 - -jmp_not_collect: - reti -; --------------------------------------------------------------------------- -jmp_byte_TI: - setb bit_TX0 - reti - - -; =========================================================================== -; --------------------------------------------------------------------------- -jmp_i2c_interrupt: - PUSH ACC - PUSH PSW - mov PSW,#24 - mov R7,I2STAT -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - cjne R7,#000h,nextttt00000 - setb STO - clr SI - jb STO,$ - ajmp pop_i2c_psw -nextttt00000: -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - cjne R7,#060h,nextttt00001 ;START+MY ADRESS - clr pin_led ;LED ON - - clr bit_command_receive - clr i2c_write_mode - clr bit_data_sim_wr - clr bit_length_answerH - clr bit_length_answerL - clr bit_command_buff - clr i2c_write_command - - ajmp end_i2c_interrupt -nextttt00001: -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - cjne R7,#080h,nextttt00002 ;RAM ADRESS - - jb bit_command_receive,jmp_data_receive - setb bit_command_receive - - mov a,I2DAT -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - cjne a,#CMD_WRITE_CONFIRM,next_comm001a - setb bit_wait_confirm - ajmp WRITEDATASIM -next_comm001a: -; --------------------------------------------------------------------------- - cjne a,#CMD_WRITE_DATA_SIM,next_comm001b - clr bit_wait_confirm - ajmp WRITEDATASIM -next_comm001b: -; --------------------------------------------------------------------------- - cjne a,#CMD_GENERATE_ATR,next_comm002 - ajmp ATR_GENERATE -next_comm002: -; --------------------------------------------------------------------------- - cjne a,#CMD_GET_VERS,next_comm003 - ajmp ANSWER_VERS -next_comm003: -; --------------------------------------------------------------------------- - cjne a,#CMD_SET_BAUD_RATE,next_comm004 - ajmp BAUD_RATE_SET -next_comm004: -; --------------------------------------------------------------------------- - cjne a,#CMD_SET_SIM_CLC,next_comm005 - ajmp SIM_CLC_SET -next_comm005: -; --------------------------------------------------------------------------- - ajmp end_i2c_interrupt -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -jmp_data_receive: - ;What receive ? Data to SIM/Command to bridge - jb bit_data_sim_wr, jmp_data_sim_receive - jb i2c_write_command,jmp_comm_bridge_receive - ajmp end_i2c_interrupt -; --------------------------------------------------------------------------- -jmp_comm_bridge_receive: - mov @R0,I2DAT - inc R0 - inc length_command - ajmp end_i2c_interrupt -; --------------------------------------------------------------------------- -jmp_data_sim_receive: - - setb i2c_write_mode - - PUSH DPH - PUSH DPL - mov DPL,pointer_TXL - mov DPH,pointer_TXH - mov a,I2DAT - movx @DPTR,a - inc DPTR - mov pointer_TXL,DPL - mov pointer_TXH,DPH - POP DPL - POP DPH - - inc length_send_to_simL - mov a,length_send_to_simL - jnz $+2+2 ;2 - inc length_send_to_simH ;2 - - ajmp end_i2c_interrupt -nextttt00002: -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - cjne R7,#0A0h,nextttt00003 ;STOP - setb pin_led ;LED OFF - - ;Command finish ? - jnb i2c_write_command,jmp_not_command - clr i2c_write_command - setb i2c_command_done -jmp_not_command: - - ;data to SIM finish ? - jnb i2c_write_mode,end_i2c_interrupt - clr i2c_write_mode - - setb i2c_write_done - ;Prepare to answer - mov length_answer_simH,#0 - mov length_answer_simL,#0 - mov pointer_RX1H,#HIGH(XRAM_RX_BUFF) - mov pointer_RX1L,#LOW (XRAM_RX_BUFF) - mov pointer_RX2H,#HIGH(XRAM_RX_BUFF) - mov pointer_RX2L,#LOW (XRAM_RX_BUFF) - - ajmp end_i2c_interrupt -nextttt00003: -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - cjne R7,#0A8h,nextttt00004 - sjmp read_byte_I2C -nextttt00004: -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - cjne R7,#0B8h,nextttt00005 -read_byte_I2C: - jnb bit_command_buff,jmp_not_comm_buff2 - mov I2DAT,@R0 - inc R0 - ajmp end_i2c_interrupt - -jmp_not_comm_buff2: - jb bit_length_answerH,jmp_not_comm_buff3 - setb bit_length_answerH - mov I2DAT,length_answer_simH - ajmp end_i2c_interrupt - -jmp_not_comm_buff3: - jb bit_length_answerL,read_byte_APROM - setb bit_length_answerL - mov I2DAT,length_answer_simL - ajmp end_i2c_interrupt - -read_byte_APROM: - PUSH DPH - PUSH DPL - mov DPL,pointer_RX2L - mov DPH,pointer_RX2H - movx a,@DPTR - mov I2DAT,a - inc DPTR - mov pointer_RX2L,DPL - mov pointer_RX2H,DPH - POP DPL - POP DPH - -nextttt00005: -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -end_i2c_interrupt: - clr STA - clr STO - setb AA -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -pop_i2c_psw: - POP PSW - POP ACC - clr SI - reti - - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -ANSWER_VERS: - mov R0,#data_command - mov cmd_command,#CMD_GET_VERS - mov (data_command+0),#2 - mov (data_command+1),#VERS_HI - mov (data_command+2),#VERS_LO - setb bit_command_buff - ajmp end_i2c_interrupt - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -ATR_GENERATE: - setb bit_generate_ATR - ;Prepare to answer - mov length_answer_simH,#0 - mov length_answer_simL,#0 - mov pointer_RX1H,#HIGH(XRAM_RX_BUFF) - mov pointer_RX1L,#LOW (XRAM_RX_BUFF) - mov pointer_RX2H,#HIGH(XRAM_RX_BUFF) - mov pointer_RX2L,#LOW (XRAM_RX_BUFF) - ajmp end_i2c_interrupt - - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -BAUD_RATE_SET: - mov R0,#data_command - mov length_command,#0 - mov cmd_command,#CMD_SET_BAUD_RATE - setb i2c_write_command - ajmp end_i2c_interrupt - - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -SIM_CLC_SET: - mov R0,#data_command - mov length_command,#0 - mov cmd_command,#CMD_SET_SIM_CLC - setb i2c_write_command - ajmp end_i2c_interrupt - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -WRITEDATASIM: - mov length_send_to_simH,#0 - mov length_send_to_simL,#0 - setb bit_data_sim_wr - mov pointer_TXH,#HIGH(XRAM_TX_BUFF) - mov pointer_TXL,#LOW (XRAM_TX_BUFF) - ajmp end_i2c_interrupt - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -main_start: - mov SP,#STACKKKKK -; --------------------------------------------------------------------------- - ;0-bidirect 1-push pull 0-input only 1-open drain - ;0 0 1 1 -; --------------------------------------------------------------------------- - mov P0M2,#01000000b ;?0 - mov P0M1,#11111111b ;P1.6-Tx0 SIM; - ; - mov P1M2,#01011111b ;1 - mov P1M1,#10111000b ;P1.6-Tx1 DEBUG; P1.4,P1.3 - I2C; - - mov P3M2,#00000000b ;P3 - mov P3M1,#11111111b ; -; --------------------------------------------------------------------------- - mov TMOD, #22h - mov TH0, #0 ;14400hz - mov TH1, #0E9h ;UART0 10800 Bit/sec - mov TCON, #55h -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - mov TA,#0AAh - mov TA,#055h - orl SFRS,#00000001b - - mov P1S, #00010000b ;P1.4 trigger schmiddt - - mov TA,#0AAh - mov TA,#055h - anl SFRS,#11111110b -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - ;------- CONFIG I2C --------- - mov I2CON, #44h ;set AA, set I2C enable - setb pin_sda - setb pin_scl - mov I2ADDR,#0C0h -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - ;mov SCON, #050h ;UART0 8bit - mov SCON, #0D0h ;UART0 9bit - ;mov PCON, #11000000b;FE_0 enable - mov PCON, #10000000b;FE_0 disable -; --------------------------------------------------------------------------- - mov SCON_1,#050h ;UART1 - ;mov T3CON, #01101000b;FE_1 enable TIMER3 UART0 BAUD - ;mov T3CON, #00101000b;FE_1 disable TIMER3 UART0 BAUD - mov T3CON, #00001000b;FE_1 disable TIMER1 UART0 BAUD - ;mov RL3,#0E9h ;10800/21600 - ;mov RH3,#0FFh -; --------------------------------------------------------------------------- - ;UART1 - mov RL3,#0F7h ;27777/55556 - mov RH3,#0FFh -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - mov CKDIV,#2 ;Fsys=4.00MHZ - ;mov CKDIV,#1 ;Fsys=8.00MHZ -; --------------------------------------------------------------------------- - mov bit_32,#0 - mov bit_33,#0 - setb time_data_read.7 -; --------------------------------------------------------------------------- - ;orl CKCON,#00000010b ;ENABLE CLC TIMER1 Fsys/12 - orl CKCON,#00010010b ;ENABLE CLC TIMER1 Fsys -; --------------------------------------------------------------------------- - ;mov a,RCTRIM0 - ;add a,#31 - ;mov TA,#0AAh - ;mov TA,#055h - ;mov RCTRIM0,a -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - acall clr_buffer -; --------------------------------------------------------------------------- - mov EIE, #00000001b ;I2C Interrupt - ;mov IE, #10010000b ;EA, SERIAL0 - mov IE, #10010010b ;EA, SERIAL0, TIMER0 -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -main_loop: - acall control_ATR - acall control_send_to_sim - acall control_command - sjmp main_loop - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -control_command: - jbc i2c_command_done,$+3+1 ;3 - ret ;1 -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - ;Control Length command=1 - mov a,length_command - cjne a,#1,next_commandEND ;error length_command != 1 -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - mov a,cmd_command - cjne a,#CMD_SET_BAUD_RATE,next_command001 - mov TH1,data_command ;Timer1 HIGH byte - ret -next_command001: -; --------------------------------------------------------------------------- - cjne a,#CMD_SET_SIM_CLC, next_command002 - mov CKDIV,data_command ;Fsys DIV - ret -next_command002: -; --------------------------------------------------------------------------- -next_commandEND: - ret - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -control_send_to_sim: - jb i2c_write_done,$+3+1 ;3 - ret ;1 -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - jbc bit_wait_confirm,jmp_wait_confirm -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - mov DPTR,#XRAM_TX_BUFF -looop_send: - movx a,@DPTR - inc DPTR - acall for_coooooom0 - - clr c - mov a,length_send_to_simL - subb a,#1 - mov length_send_to_simL,a - mov a,length_send_to_simH - subb a,#0 - mov length_send_to_simH,a - orl a,length_send_to_simL - jnz looop_send -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - jnb bit_RX0,$ - clr i2c_write_done - ret - - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -jmp_wait_confirm: - mov DPTR,#(XRAM_TX_BUFF+1) - movx a,@DPTR - mov R3,a - mov R4,#5 -; --------------------------------------------------------------------------- - mov DPTR,#XRAM_TX_BUFF -looop_seend: - movx a,@DPTR - inc DPTR - acall for_coooooom0 - djnz R4,jmp_not_5byte - - jnb bit_RX0,$ - clr bit_RX0 - ;18/12/2018 - mov time_confirm,#65 ;New timeout 50mS -looop_waitconf: - jb time_confirm.7,jmp_no_answer - jnb bit_RX0,looop_waitconf - - ;clr pin_scl ;TEST PULSE! - mov a,SBUF - xrl a,R3 - ;setb pin_scl ;TEST PULSE! - - jnz jmp_no_correct_answer ;18/12/2018 - - ;pause for next byte 17/12/2018 - mov R7,#0 - djnz R7,$ ;~260mkSec - djnz R7,$ ;~260mkSec - djnz R7,$ ;~260mkSec - -jmp_not_5byte: - - clr c - mov a,length_send_to_simL - subb a,#1 - mov length_send_to_simL,a - mov a,length_send_to_simH - subb a,#0 - mov length_send_to_simH,a - orl a,length_send_to_simL - jnz looop_seend -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- - jnb bit_RX0,$ - clr bit_RX0 -jmp_no_answer: - clr i2c_write_done - ret - -; --------------------------------------------------------------------------- -; --------------------------------------------------------------------------- -;18/12/2018 -jmp_no_correct_answer: - clr EA - clr i2c_write_done - - mov DPL,pointer_RX1L - mov DPH,pointer_RX1H - mov a,SBUF - movx @DPTR,a - inc DPTR - mov pointer_RX1L,DPL - mov pointer_RX1H,DPH - - clr pin_scl - mov time_data_read,#52 ;52/1302Hz = 40mS - - inc length_answer_simL - mov a,length_answer_simL - jnz $+2+2 ;2 - inc length_answer_simH ;2 - - setb EA - ret - - - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -control_ATR: - jbc bit_generate_ATR,$+3+1 ;3 - ret ;1 -; --------------------------------------------------------------------------- - clr pin_RST - ;acall clr_buffer - ; Add rezet pause 17/12/2018 - - mov R6,#200 -looop_pause50mS: - djnz R7,$ ;~260mkSec - djnz R6,looop_pause50mS - - ;Prepare to answer 11/03/2019 - acall clr_buffer - - mov length_answer_simH,#0 - mov length_answer_simL,#0 - mov pointer_RX1H,#HIGH(XRAM_RX_BUFF) - mov pointer_RX1L,#LOW (XRAM_RX_BUFF) - mov pointer_RX2H,#HIGH(XRAM_RX_BUFF) - mov pointer_RX2L,#LOW (XRAM_RX_BUFF) - setb bit_first_ATR - setb pin_RST - ret - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -for_coooooom0: - clr bit_RX0 - mov c,P - mov TB8,c ;9bit parity - mov SBUF,a - jnb bit_TX0,$ - clr bit_TX0 - mov R7,#100 - djnz R7,$ - ret - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -clr_buffer: - mov DPTR,#0256 ;Receive SIM buffer - mov R7,#255 - clr a -looop_clr_bufff: - movx @DPTR,a - inc DPTR - djnz R7,looop_clr_bufff - ret - -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- -;for_coooooom1: -; mov SBUF_1,a -; jnb TI_1,$ -; clr TI_1 -; ret -; -; --------------------------------------------------------------------------- -; =========================================================================== -; --------------------------------------------------------------------------- - -end. From e77781e6211bfbed9b83cc3cf81aa40543e29844 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 31 Dec 2022 10:04:30 +0100 Subject: [PATCH 032/924] only mark CRC bytes if we have 3 or more bytes, and increase the line buffer since ansi colors eats chars --- client/src/cmdtrace.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index a714b7e32..5fbf90b0d 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -573,7 +573,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr //2 Not crc-command //--- Draw the data column - char line[18][140] = {{0}}; + char line[18][160] = {{0}}; if (data_len == 0) { if (protocol == ICLASS && duration == 2048) { @@ -633,8 +633,9 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } + uint8_t crc_format_string_offset = 0; - if (markCRCBytes) { + if (markCRCBytes && data_len > 2) { //CRC-command if (((protocol == PROTO_HITAG1) || (protocol == PROTO_HITAGS)) && (data_len > 1)) { // Note that UID REQUEST response has no CRC, but we don't know @@ -647,6 +648,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } else { if (crcStatus == 0 || crcStatus == 1) { + char *pos1 = line[(data_len - 2) / 18]; pos1 += (((data_len - 2) % 18) * 4) - 1; From 2b27ce02863bfaf33c3c449288a9c6fc8c722fe7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 31 Dec 2022 13:21:22 +0100 Subject: [PATCH 033/924] mac os actions seem to report a different return code and it exits the action. lets see if it works if it continues --- .github/workflows/macos.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 2245ef05f..a632a5e37 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -36,6 +36,7 @@ jobs: - name: Install dependencies run: brew install readline coreutils qt5 RfidResearchGroup/proxmark3/arm-none-eabi-gcc openssl + continue-on-error: true - name: Install Python dependencies run: | @@ -77,6 +78,7 @@ jobs: - name: Install dependencies run: brew install readline coreutils qt5 RfidResearchGroup/proxmark3/arm-none-eabi-gcc openssl + continue-on-error: true - name: Install Python dependencies run: | @@ -119,6 +121,7 @@ jobs: - name: Install dependencies run: brew install readline coreutils qt5 RfidResearchGroup/proxmark3/arm-none-eabi-gcc openssl + continue-on-error: true - name: Install Python dependencies run: | From d6af860136e6174e04d06045703a30d4daffaef8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 31 Dec 2022 22:30:07 +0100 Subject: [PATCH 034/924] adapt path separator to handle WIN32 backslash. --- client/src/ui.h | 4 +++- include/common.h | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/client/src/ui.h b/client/src/ui.h index 6b1ac4a83..7aff98eba 100644 --- a/client/src/ui.h +++ b/client/src/ui.h @@ -35,7 +35,9 @@ typedef enum logLevel {NORMAL, SUCCESS, INFO, FAILED, WARNING, ERR, DEBUG, INPLA typedef enum emojiMode {EMO_ALIAS, EMO_EMOJI, EMO_ALTTEXT, EMO_NONE} emojiMode_t; typedef enum clientdebugLevel {cdbOFF, cdbSIMPLE, cdbFULL} clientdebugLevel_t; // typedef enum devicedebugLevel {ddbOFF, ddbERROR, ddbINFO, ddbDEBUG, ddbEXTENDED} devicedebugLevel_t; -typedef enum savePaths {spDefault, spDump, spTrace, spItemCount} savePaths_t; // last item spItemCount used to auto map to number of files + + // last item spItemCount used to auto map to number of files +typedef enum savePaths {spDefault, spDump, spTrace, spItemCount} savePaths_t; typedef struct {int x; int y; int h; int w;} qtWindow_t; typedef struct { diff --git a/include/common.h b/include/common.h index 22c7a90e7..bb3781c4a 100644 --- a/include/common.h +++ b/include/common.h @@ -23,7 +23,14 @@ #include #include +#ifdef _WIN32 +#define ABOVE "..\\" +#define PATHSEP "\\" +#else +#define ABOVE "../" #define PATHSEP "/" +#endif + // PM3 share path relative to executable when installed #define PM3_SHARE_RELPATH ".." PATHSEP "share" PATHSEP "proxmark3" PATHSEP From 53808f2c7f134eb205819c432e3e42912c3a1f07 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 31 Dec 2022 23:07:54 +0100 Subject: [PATCH 035/924] sanity checks and style --- client/src/fileutils.c | 113 +++++++++++++++++++++++++++++++---------- client/src/fileutils.h | 4 +- 2 files changed, 88 insertions(+), 29 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index a2f8e4abe..22cf3ad5e 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -214,18 +214,23 @@ bool create_path(const char *dirname) { } */ -bool setDefaultPath(savePaths_t pathIndex, const char *Path) { +bool setDefaultPath(savePaths_t pathIndex, const char *path) { if (pathIndex < spItemCount) { - if ((Path == NULL) && (g_session.defaultPaths[pathIndex] != NULL)) { + + if ((path == NULL) && (g_session.defaultPaths[pathIndex] != NULL)) { free(g_session.defaultPaths[pathIndex]); g_session.defaultPaths[pathIndex] = NULL; } - if (Path != NULL) { - g_session.defaultPaths[pathIndex] = (char *)realloc(g_session.defaultPaths[pathIndex], strlen(Path) + 1); - strcpy(g_session.defaultPaths[pathIndex], Path); + if (path == NULL) { + return false; } + + size_t len = strlen(path); + + g_session.defaultPaths[pathIndex] = (char *)realloc(g_session.defaultPaths[pathIndex], len + 1); + strcpy(g_session.defaultPaths[pathIndex], path); return true; } return false; @@ -234,47 +239,70 @@ bool setDefaultPath(savePaths_t pathIndex, const char *Path) { static char *filenamemcopy(const char *preferredName, const char *suffix) { if (preferredName == NULL) return NULL; if (suffix == NULL) return NULL; + char *fileName = (char *) calloc(strlen(preferredName) + strlen(suffix) + 1, sizeof(uint8_t)); - if (fileName == NULL) + if (fileName == NULL) { return NULL; + } + strcpy(fileName, preferredName); - if (str_endswith(fileName, suffix)) + if (str_endswith(fileName, suffix)) { return fileName; + } + strcat(fileName, suffix); return fileName; } +static size_t path_size(savePaths_t a) { + if (a == spItemCount) { + return 0; + } + return strlen( g_session.defaultPaths[a] ); +} + char *newfilenamemcopy(const char *preferredName, const char *suffix) { - if (preferredName == NULL) return NULL; - if (suffix == NULL) return NULL; + if (preferredName == NULL || suffix == NULL) { + return NULL; + } uint16_t p_namelen = strlen(preferredName); if (str_endswith(preferredName, suffix)) p_namelen -= strlen(suffix); - const size_t fileNameLen = p_namelen + strlen(suffix) + 1 + 10; - const size_t fileNameSize = fileNameLen * sizeof(uint8_t); + // 10: room for filenum to ensure new filename + const size_t len = p_namelen + strlen(suffix) + 1 + 10; - char *fileName = (char *) calloc(fileNameLen, sizeof(uint8_t)); // 10: room for filenum to ensure new filename + int foobar = path_size(spDefault); + (void) foobar; + + char *fileName = (char *) calloc(len, sizeof(uint8_t)); if (fileName == NULL) { return NULL; } - int num = 1; - snprintf(fileName, fileNameSize, "%.*s%s", p_namelen, preferredName, suffix); + + snprintf(fileName, len, "%.*s%s", p_namelen, preferredName, suffix); while (fileExists(fileName)) { - snprintf(fileName, fileNameSize, "%.*s-%d%s", p_namelen, preferredName, num, suffix); + snprintf(fileName, len, "%.*s-%d%s", p_namelen, preferredName, num, suffix); num++; } + + PrintAndLogEx(INFO, "FILE PATH: %s", fileName); return fileName; } int saveFile(const char *preferredName, const char *suffix, const void *data, size_t datalen) { - if (data == NULL) return PM3_EINVARG; + if (data == NULL || datalen == 0) { + return PM3_EINVARG; + } + char *fileName = newfilenamemcopy(preferredName, suffix); - if (fileName == NULL) return PM3_EMALLOC; + if (fileName == NULL) { + return PM3_EMALLOC; + } /* We should have a valid filename now, e.g. dumpdata-3.bin */ @@ -295,9 +323,14 @@ int saveFile(const char *preferredName, const char *suffix, const void *data, si int saveFileEML(const char *preferredName, uint8_t *data, size_t datalen, size_t blocksize) { - if (data == NULL) return PM3_EINVARG; + if (data == NULL || datalen == 0) { + return PM3_EINVARG; + } + char *fileName = newfilenamemcopy(preferredName, ".eml"); - if (fileName == NULL) return PM3_EMALLOC; + if (fileName == NULL) { + return PM3_EMALLOC; + } int retval = PM3_SUCCESS; int blocks = datalen / blocksize; @@ -343,10 +376,14 @@ int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, s } int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *)) { - if (data == NULL) return PM3_EINVARG; + if (data == NULL || datalen == 0) { + return PM3_EINVARG; + } char *fileName = newfilenamemcopy(preferredName, ".json"); - if (fileName == NULL) return PM3_EMALLOC; + if (fileName == NULL) { + return PM3_EMALLOC; + } int retval = PM3_SUCCESS; @@ -704,9 +741,15 @@ int saveFileJSONrootEx(const char *preferredName, void *root, size_t flags, bool int saveFileWAVE(const char *preferredName, const int *data, size_t datalen) { - if (data == NULL) return PM3_EINVARG; + if (data == NULL || datalen == 0) { + return PM3_EINVARG; + } + char *fileName = newfilenamemcopy(preferredName, ".wav"); - if (fileName == NULL) return PM3_EMALLOC; + if (fileName == NULL) { + return PM3_EMALLOC; + } + int retval = PM3_SUCCESS; struct wave_info_t wave_info = { @@ -731,11 +774,14 @@ int saveFileWAVE(const char *preferredName, const int *data, size_t datalen) { retval = PM3_EFILE; goto out; } + fwrite(&wave_info, sizeof(wave_info), 1, wave_file); + for (int i = 0; i < datalen; i++) { uint8_t sample = data[i] + 128; fwrite(&sample, 1, 1, wave_file); } + fclose(wave_file); PrintAndLogEx(SUCCESS, "saved " _YELLOW_("%zu") " bytes to wave file " _YELLOW_("'%s'"), 2 * datalen, fileName); @@ -747,9 +793,14 @@ out: int saveFilePM3(const char *preferredName, int *data, size_t datalen) { - if (data == NULL) return PM3_EINVARG; + if (data == NULL || datalen == 0) { + return PM3_EINVARG; + } + char *fileName = newfilenamemcopy(preferredName, ".pm3"); - if (fileName == NULL) return PM3_EMALLOC; + if (fileName == NULL) { + return PM3_EMALLOC; + } int retval = PM3_SUCCESS; @@ -760,8 +811,9 @@ int saveFilePM3(const char *preferredName, int *data, size_t datalen) { goto out; } - for (uint32_t i = 0; i < datalen; i++) + for (uint32_t i = 0; i < datalen; i++) { fprintf(f, "%d\n", data[i]); + } fflush(f); fclose(f); @@ -1862,14 +1914,18 @@ static int searchFinalFile(char **foundpath, const char *pm3dir, const char *sea (strcmp(PYTHON_SCRIPTS_SUBDIR, pm3dir) == 0) || (strcmp(RESOURCES_SUBDIR, pm3dir) == 0))) { char *path = calloc(strlen(exec_path) + strlen(pm3dir) + strlen(filename) + 1, sizeof(char)); - if (path == NULL) + if (path == NULL) { goto out; + } + strcpy(path, exec_path); strcat(path, pm3dir); strcat(path, filename); + if ((g_debugMode == 2) && (!silent)) { PrintAndLogEx(INFO, "Searching %s", path); } + if (fileExists(path)) { free(filename); *foundpath = path; @@ -2007,7 +2063,8 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl } int pm3_save_dump(const char *fn, uint8_t *d, size_t n, JSONFileType jsft, size_t blocksize) { - if (n == 0) { + + if (d == NULL || n == 0) { PrintAndLogEx(INFO, "No data to save. Skipping..."); return PM3_EINVARG; } diff --git a/client/src/fileutils.h b/client/src/fileutils.h index d237b0fe7..fc5d274aa 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -60,7 +60,9 @@ typedef enum { int fileExists(const char *filename); //bool create_path(const char *dirname); -bool setDefaultPath(savePaths_t pathIndex, const char *Path); // set a path in the path list g_session.defaultPaths + +// set a path in the path list g_session.defaultPaths +bool setDefaultPath(savePaths_t pathIndex, const char *path); char *newfilenamemcopy(const char *preferredName, const char *suffix); From 810a89c4df8098b58d24ae29b94b866fc38ca8c3 Mon Sep 17 00:00:00 2001 From: Jin Jia Date: Wed, 4 Jan 2023 07:11:48 +0000 Subject: [PATCH 036/924] Added Compliance of MIFARE Classic EV1 1K Datasheet footnote of Table 8 --- armsrc/mifaresim.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index c2f81df21..ad975381b 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -46,6 +46,15 @@ #include "dbprint.h" #include "ticks.h" +static bool IsKeyBReadable(uint8_t blockNo) { + uint8_t sector_trailer[16]; + emlGetMem(sector_trailer, SectorTrailer(blockNo), 1); + uint8_t AC = ((sector_trailer[7] >> 5) & 0x04) + | ((sector_trailer[8] >> 2) & 0x02) + | ((sector_trailer[8] >> 7) & 0x01); + return (AC == 0x00 || AC == 0x01 || AC == 0x02); +} + static bool IsTrailerAccessAllowed(uint8_t blockNo, uint8_t keytype, uint8_t action) { uint8_t sector_trailer[16]; emlGetMem(sector_trailer, blockNo, 1); @@ -881,6 +890,17 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 Dbprintf("[MFEMUL_WORK] Reader tried to operate (0x%02x) on block (0x%02x) not authenticated for (0x%02x), nacking", receivedCmd_dec[0], receivedCmd_dec[1], cardAUTHSC); break; } + + // Compliance of MIFARE Classic EV1 1K Datasheet footnote of Table 8 + // If access bits show that key B is Readable, any subsequent memory access will be refused. + if (cardAUTHKEY == keyB && IsKeyBReadable(blockNo)) { + EmSend4bit(mf_crypto1_encrypt4bit(pcs, CARD_NACK_NA)); + FpgaDisableTracing(); + + if (g_dbglevel >= DBG_ERROR) + Dbprintf("[MFEMUL_WORK] Access denied: Reader tried to access memory on authentication with key B while key B is readable in sector (0x%02x)", cardAUTHSC); + break; + } } // case MFEMUL_WORK => CMD READ block From 949ef8435e9eba27e7766c917d5cbb7c23ef1782 Mon Sep 17 00:00:00 2001 From: Jin Jia Date: Wed, 4 Jan 2023 07:19:29 +0000 Subject: [PATCH 037/924] changed keyB in line 896 to the correct macro --- armsrc/mifaresim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index ad975381b..71195aa62 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -893,7 +893,7 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 // Compliance of MIFARE Classic EV1 1K Datasheet footnote of Table 8 // If access bits show that key B is Readable, any subsequent memory access will be refused. - if (cardAUTHKEY == keyB && IsKeyBReadable(blockNo)) { + if (cardAUTHKEY == AUTHKEYB && IsKeyBReadable(blockNo)) { EmSend4bit(mf_crypto1_encrypt4bit(pcs, CARD_NACK_NA)); FpgaDisableTracing(); From 41806352189a6d86b1d17f6e220eca11aa44394d Mon Sep 17 00:00:00 2001 From: nvx Date: Wed, 4 Jan 2023 23:27:00 +1000 Subject: [PATCH 038/924] Add `--shallow` option to `hf iclass` reader commands to do shallow (ASK) reader modulation instead of OOK. --- CHANGELOG.md | 1 + armsrc/Standalone/hf_iceclass.c | 18 +++++---- armsrc/iclass.c | 70 ++++++++++++++++++--------------- armsrc/iclass.h | 4 +- armsrc/iso15693.c | 10 ++--- armsrc/iso15693.h | 2 +- client/src/cmdhf.c | 2 +- client/src/cmdhficlass.c | 66 +++++++++++++++++++++++++------ client/src/cmdhficlass.h | 4 +- include/iclass_cmd.h | 3 ++ 10 files changed, 117 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e87e6bfae..e2875edde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Add `--shallow` option to `hf iclass` reader commands to do shallow (ASK) reader modulation instead of OOK (@nvx) - Improved NXP SLI/SLIX series tag identification (@nvx) - Fixed buffer overflow in "lf em 4x05 sniff" (@HeinrichsH) - Fixed potential NULL array printing (@jmichel) diff --git a/armsrc/Standalone/hf_iceclass.c b/armsrc/Standalone/hf_iceclass.c index 8f9bf4c63..7d69e867a 100644 --- a/armsrc/Standalone/hf_iceclass.c +++ b/armsrc/Standalone/hf_iceclass.c @@ -322,6 +322,7 @@ static int reader_dump_mode(void) { .use_credit_key = false, .do_auth = true, .send_reply = false, + .shallow_mod = false, }; memcpy(auth.key, legacy_aa1_key, sizeof(auth.key)); @@ -333,7 +334,7 @@ static int reader_dump_mode(void) { // select tag. uint32_t eof_time = 0; - bool res = select_iclass_tag(hdr, auth.use_credit_key, &eof_time); + bool res = select_iclass_tag(hdr, auth.use_credit_key, &eof_time, false); if (res == false) { switch_off(); continue; @@ -382,7 +383,7 @@ static int reader_dump_mode(void) { // main read loop for (uint16_t i = start_block; i <= app1_limit; i++) { - if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time)) { + if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time, false)) { dumped++; } } @@ -394,7 +395,7 @@ static int reader_dump_mode(void) { auth.use_credit_key = true; memcpy(auth.key, aa2_key, sizeof(auth.key)); - res = select_iclass_tag(hdr, auth.use_credit_key, &eof_time); + res = select_iclass_tag(hdr, auth.use_credit_key, &eof_time, false); if (res) { // sanity check of CSN. @@ -408,7 +409,7 @@ static int reader_dump_mode(void) { start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; for (uint16_t i = app1_limit + 1; i <= app2_limit; i++) { - if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time)) { + if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time, false)) { dumped++; } } @@ -458,6 +459,7 @@ static int dump_sim_mode(void) { .use_credit_key = false, .do_auth = true, .send_reply = false, + .shallow_mod = false, }; memcpy(auth.key, legacy_aa1_key, sizeof(auth.key)); @@ -469,7 +471,7 @@ static int dump_sim_mode(void) { // select tag. uint32_t eof_time = 0; - bool res = select_iclass_tag(hdr, auth.use_credit_key, &eof_time); + bool res = select_iclass_tag(hdr, auth.use_credit_key, &eof_time, false); if (res == false) { switch_off(); continue; @@ -518,7 +520,7 @@ static int dump_sim_mode(void) { // main read loop for (uint16_t i = start_block; i <= app1_limit; i++) { - if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time)) { + if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time, false)) { dumped++; } } @@ -530,7 +532,7 @@ static int dump_sim_mode(void) { auth.use_credit_key = true; memcpy(auth.key, aa2_key, sizeof(auth.key)); - res = select_iclass_tag(hdr, auth.use_credit_key, &eof_time); + res = select_iclass_tag(hdr, auth.use_credit_key, &eof_time, false); if (res) { // sanity check of CSN. @@ -544,7 +546,7 @@ static int dump_sim_mode(void) { start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; for (uint16_t i = app1_limit + 1; i <= app2_limit; i++) { - if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time)) { + if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time, false)) { dumped++; } } diff --git a/armsrc/iclass.c b/armsrc/iclass.c index 1ed774f16..a25fbd52c 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -1245,23 +1245,23 @@ send: } // THE READER CODE -static void iclass_send_as_reader(uint8_t *frame, int len, uint32_t *start_time, uint32_t *end_time) { +static void iclass_send_as_reader(uint8_t *frame, int len, uint32_t *start_time, uint32_t *end_time, bool shallow_mod) { CodeIso15693AsReader(frame, len); tosend_t *ts = get_tosend(); - TransmitTo15693Tag(ts->buf, ts->max, start_time); + TransmitTo15693Tag(ts->buf, ts->max, start_time, shallow_mod); *end_time = *start_time + (32 * ((8 * ts->max) - 4)); // subtract the 4 padding bits after EOF LogTrace_ISO15693(frame, len, (*start_time * 4), (*end_time * 4), NULL, true); } static bool iclass_send_cmd_with_retries(uint8_t *cmd, size_t cmdsize, uint8_t *resp, size_t max_resp_size, uint8_t expected_size, uint8_t tries, uint32_t *start_time, - uint16_t timeout, uint32_t *eof_time) { + uint16_t timeout, uint32_t *eof_time, bool shallow_mod) { uint16_t resp_len = 0; int res; while (tries-- > 0) { - iclass_send_as_reader(cmd, cmdsize, start_time, eof_time); + iclass_send_as_reader(cmd, cmdsize, start_time, eof_time, shallow_mod); if (resp == NULL) { return true; @@ -1282,7 +1282,7 @@ static bool iclass_send_cmd_with_retries(uint8_t *cmd, size_t cmdsize, uint8_t * * @return false = fail * true = Got all. */ -static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint32_t *eof_time, uint8_t *status) { +static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint32_t *eof_time, uint8_t *status, bool shallow_mod) { static uint8_t act_all[] = { ICLASS_CMD_ACTALL }; static uint8_t identify[] = { ICLASS_CMD_READ_OR_IDENTIFY, 0x00, 0x73, 0x33 }; @@ -1299,7 +1299,7 @@ static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint3 // wakeup uint32_t start_time = GetCountSspClk(); - iclass_send_as_reader(act_all, 1, &start_time, eof_time); + iclass_send_as_reader(act_all, 1, &start_time, eof_time, shallow_mod); int res; uint16_t resp_len = 0; res = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_ACTALL, eof_time, false, true, &resp_len); @@ -1308,7 +1308,7 @@ static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint3 // send Identify start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; - iclass_send_as_reader(identify, 1, &start_time, eof_time); + iclass_send_as_reader(identify, 1, &start_time, eof_time, shallow_mod); // expect a 10-byte response here, 8 byte anticollision-CSN and 2 byte CRC res = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time, false, true, &resp_len); @@ -1320,7 +1320,7 @@ static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint3 // select the card start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; - iclass_send_as_reader(select, sizeof(select), &start_time, eof_time); + iclass_send_as_reader(select, sizeof(select), &start_time, eof_time, shallow_mod); // expect a 10-byte response here, 8 byte CSN and 2 byte CRC res = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time, false, true, &resp_len); @@ -1332,7 +1332,7 @@ static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint3 // card selected, now read config (block1) (only 8 bytes no CRC) start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; - iclass_send_as_reader(read_conf, sizeof(read_conf), &start_time, eof_time); + iclass_send_as_reader(read_conf, sizeof(read_conf), &start_time, eof_time, shallow_mod); // expect a 8-byte response here res = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time, false, true, &resp_len); @@ -1350,7 +1350,7 @@ static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint3 // read App Issuer Area block 5 start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; - iclass_send_as_reader(read_aia, sizeof(read_aia), &start_time, eof_time); + iclass_send_as_reader(read_aia, sizeof(read_aia), &start_time, eof_time, shallow_mod); // expect a 10-byte response here res = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time, false, true, &resp_len); @@ -1364,7 +1364,7 @@ static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint3 // card selected, now read e-purse (cc) (block2) (only 8 bytes no CRC) start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; - iclass_send_as_reader(read_check_cc, sizeof(read_check_cc), &start_time, eof_time); + iclass_send_as_reader(read_check_cc, sizeof(read_check_cc), &start_time, eof_time, shallow_mod); // expect a 8-byte response here res = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time, false, true, &resp_len); @@ -1386,7 +1386,7 @@ static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint3 read_aia[3] = 0x10; start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; - iclass_send_as_reader(read_aia, sizeof(read_aia), &start_time, eof_time); + iclass_send_as_reader(read_aia, sizeof(read_aia), &start_time, eof_time, shallow_mod); // expect a 10-byte response here res = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time, false, true, &resp_len); @@ -1402,9 +1402,9 @@ static bool select_iclass_tag_ex(picopass_hdr_t *hdr, bool use_credit_key, uint3 return true; } -bool select_iclass_tag(picopass_hdr_t *hdr, bool use_credit_key, uint32_t *eof_time) { +bool select_iclass_tag(picopass_hdr_t *hdr, bool use_credit_key, uint32_t *eof_time, bool shallow_mod) { uint8_t result = 0; - return select_iclass_tag_ex(hdr, use_credit_key, eof_time, &result); + return select_iclass_tag_ex(hdr, use_credit_key, eof_time, &result, shallow_mod); } // Reader iClass Anticollission @@ -1413,6 +1413,7 @@ void ReaderIClass(uint8_t flags) { // flag to use credit key bool use_credit_key = ((flags & FLAG_ICLASS_READER_CREDITKEY) == FLAG_ICLASS_READER_CREDITKEY); + bool shallow_mod = (flags & FLAG_ICLASS_READER_SHALLOW_MOD); if ((flags & FLAG_ICLASS_READER_INIT) == FLAG_ICLASS_READER_INIT) { Iso15693InitReader(); @@ -1427,7 +1428,7 @@ void ReaderIClass(uint8_t flags) { uint32_t eof_time = 0; picopass_hdr_t hdr = {0}; - if (select_iclass_tag_ex(&hdr, use_credit_key, &eof_time, &res) == false) { + if (select_iclass_tag_ex(&hdr, use_credit_key, &eof_time, &res, shallow_mod) == false) { reply_ng(CMD_HF_ICLASS_READER, PM3_ERFTRANS, NULL, 0); goto out; } @@ -1498,7 +1499,7 @@ bool authenticate_iclass_tag(iclass_auth_req_t *payload, picopass_hdr_t *hdr, ui cmd_check[7] = pmac[2]; cmd_check[8] = pmac[3]; } - return iclass_send_cmd_with_retries(cmd_check, sizeof(cmd_check), resp_auth, sizeof(resp_auth), 4, 2, start_time, ICLASS_READER_TIMEOUT_OTHERS, eof_time); + return iclass_send_cmd_with_retries(cmd_check, sizeof(cmd_check), resp_auth, sizeof(resp_auth), 4, 2, start_time, ICLASS_READER_TIMEOUT_OTHERS, eof_time, payload->shallow_mod); } @@ -1516,6 +1517,8 @@ void iClass_Authentication_fast(iclass_chk_t *p) { return; } + bool shallow_mod = p->shallow_mod; + uint8_t check[9] = { ICLASS_CMD_CHECK }; uint8_t resp[ICLASS_BUFFER_SIZE] = {0}; uint8_t readcheck_cc[] = { 0x80 | ICLASS_CMD_READCHECK, 0x02 }; @@ -1537,7 +1540,7 @@ void iClass_Authentication_fast(iclass_chk_t *p) { bool isOK = false; uint32_t start_time = 0, eof_time = 0; - if (select_iclass_tag(&hdr, p->use_credit_key, &eof_time) == false) + if (select_iclass_tag(&hdr, p->use_credit_key, &eof_time, shallow_mod) == false) goto out; start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; @@ -1566,14 +1569,14 @@ void iClass_Authentication_fast(iclass_chk_t *p) { check[8] = keys[i].mac[3]; // expect 4bytes, 3 retries times.. - isOK = iclass_send_cmd_with_retries(check, sizeof(check), resp, sizeof(resp), 4, 2, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time); + isOK = iclass_send_cmd_with_retries(check, sizeof(check), resp, sizeof(resp), 4, 2, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time, shallow_mod); if (isOK) goto out; start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; // Auth Sequence MUST begin with reading e-purse. (block2) // Card selected, now read e-purse (cc) (block2) (only 8 bytes no CRC) - iclass_send_as_reader(readcheck_cc, sizeof(readcheck_cc), &start_time, &eof_time); + iclass_send_as_reader(readcheck_cc, sizeof(readcheck_cc), &start_time, &eof_time, shallow_mod); LED_B_OFF(); } @@ -1586,11 +1589,11 @@ out: // Tries to read block. // retries 3times. // reply 8 bytes block -bool iclass_read_block(uint16_t blockno, uint8_t *data, uint32_t *start_time, uint32_t *eof_time) { +bool iclass_read_block(uint16_t blockno, uint8_t *data, uint32_t *start_time, uint32_t *eof_time, bool shallow_mod) { uint8_t resp[10]; uint8_t c[] = {ICLASS_CMD_READ_OR_IDENTIFY, blockno, 0x00, 0x00}; AddCrc(c + 1, 1); - bool isOK = iclass_send_cmd_with_retries(c, sizeof(c), resp, sizeof(resp), 10, 2, start_time, ICLASS_READER_TIMEOUT_OTHERS, eof_time); + bool isOK = iclass_send_cmd_with_retries(c, sizeof(c), resp, sizeof(resp), 10, 2, start_time, ICLASS_READER_TIMEOUT_OTHERS, eof_time, shallow_mod); if (isOK) memcpy(data, resp, 8); return isOK; @@ -1602,6 +1605,7 @@ bool iclass_read_block(uint16_t blockno, uint8_t *data, uint32_t *start_time, ui void iClass_ReadBlock(uint8_t *msg) { iclass_auth_req_t *payload = (iclass_auth_req_t *)msg; + bool shallow_mod = payload->shallow_mod; iclass_readblock_resp_t response = { .isOK = true }; memset(response.data, 0, sizeof(response.data)); @@ -1614,7 +1618,7 @@ void iClass_ReadBlock(uint8_t *msg) { // select tag. uint32_t eof_time = 0; picopass_hdr_t hdr = {0}; - bool res = select_iclass_tag(&hdr, payload->use_credit_key, &eof_time); + bool res = select_iclass_tag(&hdr, payload->use_credit_key, &eof_time, shallow_mod); if (res == false) { if (payload->send_reply) { response.isOK = res; @@ -1642,7 +1646,7 @@ void iClass_ReadBlock(uint8_t *msg) { // read data uint8_t resp[10]; - res = iclass_send_cmd_with_retries(cmd_read, sizeof(cmd_read), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time); + res = iclass_send_cmd_with_retries(cmd_read, sizeof(cmd_read), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time, shallow_mod); if (res) { memcpy(response.data, resp, sizeof(response.data)); if (payload->send_reply) { @@ -1670,6 +1674,7 @@ void iClass_Dump(uint8_t *msg) { iclass_dump_req_t *cmd = (iclass_dump_req_t *)msg; iclass_auth_req_t *req = &cmd->req; + bool shallow_mod = req->shallow_mod; uint8_t *dataout = BigBuf_malloc(ICLASS_16KS_SIZE); if (dataout == NULL) { @@ -1689,7 +1694,7 @@ void iClass_Dump(uint8_t *msg) { picopass_hdr_t hdr = {0}; memset(&hdr, 0xff, sizeof(picopass_hdr_t)); - bool res = select_iclass_tag(&hdr, req->use_credit_key, &eof_time); + bool res = select_iclass_tag(&hdr, req->use_credit_key, &eof_time, shallow_mod); if (res == false) { if (req->send_reply) { reply_ng(CMD_HF_ICLASS_DUMP, PM3_ETIMEOUT, NULL, 0); @@ -1724,7 +1729,7 @@ void iClass_Dump(uint8_t *msg) { uint8_t c[] = {ICLASS_CMD_READ_OR_IDENTIFY, i, 0x00, 0x00}; AddCrc(c + 1, 1); - res = iclass_send_cmd_with_retries(c, sizeof(c), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time); + res = iclass_send_cmd_with_retries(c, sizeof(c), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time, shallow_mod); if (res) { memcpy(dataout + (8 * i), resp, 8); } else { @@ -1759,7 +1764,7 @@ void iClass_Dump(uint8_t *msg) { BigBuf_free(); } -static bool iclass_writeblock_ext(uint8_t blockno, uint8_t *data, uint8_t *mac, bool use_mac) { +static bool iclass_writeblock_ext(uint8_t blockno, uint8_t *data, uint8_t *mac, bool use_mac, bool shallow_mod) { // write command: cmd, 1 blockno, 8 data, 4 mac uint8_t write[14] = { 0x80 | ICLASS_CMD_UPDATE, blockno }; @@ -1775,7 +1780,7 @@ static bool iclass_writeblock_ext(uint8_t blockno, uint8_t *data, uint8_t *mac, uint8_t resp[10] = {0}; uint32_t eof_time = 0, start_time = 0; - bool isOK = iclass_send_cmd_with_retries(write, write_len, resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_UPDATE, &eof_time); + bool isOK = iclass_send_cmd_with_retries(write, write_len, resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_UPDATE, &eof_time, shallow_mod); if (isOK == false) { return false; } @@ -1807,6 +1812,7 @@ void iClass_WriteBlock(uint8_t *msg) { LED_A_ON(); iclass_writeblock_req_t *payload = (iclass_writeblock_req_t *)msg; + bool shallow_mod = payload->req.shallow_mod; uint8_t write[14] = { 0x80 | ICLASS_CMD_UPDATE, payload->req.blockno }; uint8_t write_len = 14; @@ -1816,7 +1822,7 @@ void iClass_WriteBlock(uint8_t *msg) { // select tag. uint32_t eof_time = 0; picopass_hdr_t hdr = {0}; - uint8_t res = select_iclass_tag(&hdr, payload->req.use_credit_key, &eof_time); + uint8_t res = select_iclass_tag(&hdr, payload->req.use_credit_key, &eof_time, shallow_mod); if (res == false) { goto out; } @@ -1871,7 +1877,7 @@ void iClass_WriteBlock(uint8_t *msg) { uint8_t tries = 3; while (tries-- > 0) { - iclass_send_as_reader(write, write_len, &start_time, &eof_time); + iclass_send_as_reader(write, write_len, &start_time, &eof_time, shallow_mod); if (tearoff_hook() == PM3_ETEAROFF) { // tearoff occurred res = false; @@ -1939,6 +1945,8 @@ void iClass_Restore(iclass_restore_req_t *msg) { return; } + bool shallow_mod = msg->req.shallow_mod; + LED_A_ON(); Iso15693InitReader(); @@ -1947,7 +1955,7 @@ void iClass_Restore(iclass_restore_req_t *msg) { picopass_hdr_t hdr = {0}; // select - bool res = select_iclass_tag(&hdr, msg->req.use_credit_key, &eof_time); + bool res = select_iclass_tag(&hdr, msg->req.use_credit_key, &eof_time, shallow_mod); if (res == false) { goto out; } @@ -1988,7 +1996,7 @@ void iClass_Restore(iclass_restore_req_t *msg) { } // data + mac - if (iclass_writeblock_ext(item.blockno, item.data, mac, use_mac)) { + if (iclass_writeblock_ext(item.blockno, item.data, mac, use_mac, shallow_mod)) { Dbprintf("Write block [%3d/0x%02X] " _GREEN_("successful"), item.blockno, item.blockno); written++; } else { diff --git a/armsrc/iclass.h b/armsrc/iclass.h index 6801777f9..ebbda2e9f 100644 --- a/armsrc/iclass.h +++ b/armsrc/iclass.h @@ -38,8 +38,8 @@ void iClass_Authentication_fast(iclass_chk_t *p); bool iclass_auth(iclass_auth_req_t *payload, uint8_t *out); void iClass_ReadBlock(uint8_t *msg); -bool iclass_read_block(uint16_t blockno, uint8_t *data, uint32_t *start_time, uint32_t *eof_time); +bool iclass_read_block(uint16_t blockno, uint8_t *data, uint32_t *start_time, uint32_t *eof_time, bool shallow_mod); -bool select_iclass_tag(picopass_hdr_t *hdr, bool use_credit_key, uint32_t *eof_time); +bool select_iclass_tag(picopass_hdr_t *hdr, bool use_credit_key, uint32_t *eof_time, bool shallow_mod); bool authenticate_iclass_tag(iclass_auth_req_t *payload, picopass_hdr_t *hdr, uint32_t *start_time, uint32_t *eof_time, uint8_t *mac_out); #endif diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index 388aaddce..ab650da8f 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -262,9 +262,9 @@ void CodeIso15693AsTag(const uint8_t *cmd, size_t len) { } // Transmit the command (to the tag) that was placed in cmd[]. -void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time) { +void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time, bool shallow_mod) { - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_FULL_MOD); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | (shallow_mod ? FPGA_HF_READER_MODE_SEND_SHALLOW_MOD : FPGA_HF_READER_MODE_SEND_FULL_MOD)); if (*start_time < DELAY_ARM_TO_TAG) { *start_time = DELAY_ARM_TO_TAG; @@ -1585,7 +1585,7 @@ void AcquireRawAdcSamplesIso15693(void) { tosend_t *ts = get_tosend(); uint32_t start_time = 0; - TransmitTo15693Tag(ts->buf, ts->max, &start_time); + TransmitTo15693Tag(ts->buf, ts->max, &start_time, false); // wait for last transfer to complete while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXEMPTY)) ; @@ -1899,7 +1899,7 @@ int SendDataTag(uint8_t *send, int sendlen, bool init, bool speed_fast, uint8_t } tosend_t *ts = get_tosend(); - TransmitTo15693Tag(ts->buf, ts->max, &start_time); + TransmitTo15693Tag(ts->buf, ts->max, &start_time, false); if (tearoff_hook() == PM3_ETEAROFF) { // tearoff occurred *resp_len = 0; @@ -1922,7 +1922,7 @@ int SendDataTagEOF(uint8_t *recv, uint16_t max_recv_len, uint32_t start_time, ui CodeIso15693AsReaderEOF(); tosend_t *ts = get_tosend(); - TransmitTo15693Tag(ts->buf, ts->max, &start_time); + TransmitTo15693Tag(ts->buf, ts->max, &start_time, false); uint32_t end_time = start_time + 32 * (8 * ts->max - 4); // subtract the 4 padding bits after EOF LogTrace_ISO15693(NULL, 0, (start_time * 4), (end_time * 4), NULL, true); diff --git a/armsrc/iso15693.h b/armsrc/iso15693.h index f9ba6e9da..2097b3769 100644 --- a/armsrc/iso15693.h +++ b/armsrc/iso15693.h @@ -40,7 +40,7 @@ void CodeIso15693AsTag(const uint8_t *cmd, size_t len); void TransmitTo15693Reader(const uint8_t *cmd, size_t len, uint32_t *start_time, uint32_t slot_time, bool slow); int GetIso15693CommandFromReader(uint8_t *received, size_t max_len, uint32_t *eof_time); -void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time); +void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time, bool shallow_mod); int GetIso15693AnswerFromTag(uint8_t *response, uint16_t max_len, uint16_t timeout, uint32_t *eof_time, bool fsk, bool recv_speed, uint16_t *resp_len); //void RecordRawAdcSamplesIso15693(void); diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index 81e64584a..7bba6d41a 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -123,7 +123,7 @@ int CmdHFSearch(const char *Cmd) { PROMPT_CLEARLINE; PrintAndLogEx(INPLACE, " Searching for iCLASS / PicoPass tag..."); if (IfPm3Iclass()) { - if (read_iclass_csn(false, false) == PM3_SUCCESS) { + if (read_iclass_csn(false, false, false) == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("iCLASS tag / PicoPass tag") " found\n"); res = PM3_SUCCESS; } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 95e5a7bef..4e555f909 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -285,7 +285,7 @@ static int generate_config_card(const iclass_config_card_item_t *o, uint8_t *ke // get header from card PrintAndLogEx(INFO, "trying to read a card.."); - int res = read_iclass_csn(false, false); + int res = read_iclass_csn(false, false, false); if (res == PM3_SUCCESS) { cc = &iclass_last_known_card; // calc diversified key for selected card @@ -905,19 +905,25 @@ static int CmdHFiClassInfo(const char *Cmd) { void *argtable[] = { arg_param_begin, + arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + bool shallow_mod = arg_get_lit(ctx, 1); CLIParserFree(ctx); - return info_iclass(); + return info_iclass(shallow_mod); } -int read_iclass_csn(bool loop, bool verbose) { +int read_iclass_csn(bool loop, bool verbose, bool shallow_mod) { iclass_card_select_t payload = { .flags = (FLAG_ICLASS_READER_INIT | FLAG_ICLASS_READER_CLEARTRACE) }; + if (shallow_mod) { + payload.flags |= FLAG_ICLASS_READER_SHALLOW_MOD; + } + int res = PM3_SUCCESS; do { @@ -973,17 +979,19 @@ static int CmdHFiClassReader(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_lit0("@", NULL, "optional - continuous reader mode"), + arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); bool cm = arg_get_lit(ctx, 1); + bool shallow_mod = arg_get_lit(ctx, 2); CLIParserFree(ctx); if (cm) { PrintAndLogEx(INFO, "Press " _GREEN_("") " to exit"); } - return read_iclass_csn(cm, true); + return read_iclass_csn(cm, true, shallow_mod); } static int CmdHFiClassELoad(const char *Cmd) { @@ -1547,12 +1555,16 @@ static int CmdHFiClassEncryptBlk(const char *Cmd) { return PM3_SUCCESS; } -static bool select_only(uint8_t *CSN, uint8_t *CCNR, bool verbose) { +static bool select_only(uint8_t *CSN, uint8_t *CCNR, bool verbose, bool shallow_mod) { iclass_card_select_t payload = { .flags = (FLAG_ICLASS_READER_INIT | FLAG_ICLASS_READER_CLEARTRACE) }; + if (shallow_mod) { + payload.flags |= FLAG_ICLASS_READER_SHALLOW_MOD; + } + clearCommandBuffer(); PacketResponseNG resp; SendCommandNG(CMD_HF_ICLASS_READER, (uint8_t *)&payload, sizeof(iclass_card_select_t)); @@ -1608,6 +1620,7 @@ static int CmdHFiClassDump(const char *Cmd) { arg_lit0(NULL, "nr", "replay of NR/MAC"), arg_lit0("z", "dense", "dense dump output style"), arg_lit0(NULL, "force", "force unsecure card read"), + arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1693,6 +1706,7 @@ static int CmdHFiClassDump(const char *Cmd) { bool use_replay = arg_get_lit(ctx, 8); bool dense_output = g_session.dense_output || arg_get_lit(ctx, 9); bool force = arg_get_lit(ctx, 10); + bool shallow_mod = arg_get_lit(ctx, 11); CLIParserFree(ctx); @@ -1711,6 +1725,11 @@ static int CmdHFiClassDump(const char *Cmd) { iclass_card_select_t payload_rdr = { .flags = (FLAG_ICLASS_READER_INIT | FLAG_ICLASS_READER_CLEARTRACE) }; + + if (shallow_mod) { + payload_rdr.flags |= FLAG_ICLASS_READER_SHALLOW_MOD; + } + clearCommandBuffer(); PacketResponseNG resp; SendCommandNG(CMD_HF_ICLASS_READER, (uint8_t *)&payload_rdr, sizeof(iclass_card_select_t)); @@ -1790,6 +1809,7 @@ static int CmdHFiClassDump(const char *Cmd) { .req.use_replay = use_replay, .req.send_reply = true, .req.do_auth = auth, + .req.shallow_mod = shallow_mod, .end_block = app_limit1, }; memcpy(payload.req.key, key, 8); @@ -1950,7 +1970,7 @@ write_dump: return PM3_SUCCESS; } -static int iclass_write_block(uint8_t blockno, uint8_t *bldata, uint8_t *macdata, uint8_t *KEY, bool use_credit_key, bool elite, bool rawkey, bool replay, bool verbose, bool use_secure_pagemode) { +static int iclass_write_block(uint8_t blockno, uint8_t *bldata, uint8_t *macdata, uint8_t *KEY, bool use_credit_key, bool elite, bool rawkey, bool replay, bool verbose, bool use_secure_pagemode, bool shallow_mod) { iclass_writeblock_req_t payload = { .req.use_raw = rawkey, @@ -1960,6 +1980,7 @@ static int iclass_write_block(uint8_t blockno, uint8_t *bldata, uint8_t *macdata .req.blockno = blockno, .req.send_reply = true, .req.do_auth = use_secure_pagemode, + .req.shallow_mod = shallow_mod, }; memcpy(payload.req.key, KEY, 8); memcpy(payload.data, bldata, sizeof(payload.data)); @@ -2004,6 +2025,7 @@ static int CmdHFiClass_WriteBlock(const char *Cmd) { arg_lit0(NULL, "raw", "no computations applied to key"), arg_lit0(NULL, "nr", "replay of NR/MAC"), arg_lit0("v", "verbose", "verbose output"), + arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -2072,6 +2094,7 @@ static int CmdHFiClass_WriteBlock(const char *Cmd) { bool rawkey = arg_get_lit(ctx, 8); bool use_replay = arg_get_lit(ctx, 9); bool verbose = arg_get_lit(ctx, 10); + bool shallow_mod = arg_get_lit(ctx, 11); CLIParserFree(ctx); @@ -2080,7 +2103,7 @@ static int CmdHFiClass_WriteBlock(const char *Cmd) { return PM3_EINVARG; } - int isok = iclass_write_block(blockno, data, mac, key, use_credit_key, elite, rawkey, use_replay, verbose, auth); + int isok = iclass_write_block(blockno, data, mac, key, use_credit_key, elite, rawkey, use_replay, verbose, auth, shallow_mod); switch (isok) { case PM3_SUCCESS: PrintAndLogEx(SUCCESS, "Wrote block %3d/0x%02X successful", blockno, blockno); @@ -2116,6 +2139,7 @@ static int CmdHFiClassRestore(const char *Cmd) { arg_lit0(NULL, "elite", "elite computations applied to key"), arg_lit0(NULL, "raw", "no computations applied to key"), arg_lit0("v", "verbose", "verbose output"), + arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -2165,6 +2189,7 @@ static int CmdHFiClassRestore(const char *Cmd) { bool elite = arg_get_lit(ctx, 7); bool rawkey = arg_get_lit(ctx, 8); bool verbose = arg_get_lit(ctx, 9); + bool shallow_mod = arg_get_lit(ctx, 10); CLIParserFree(ctx); @@ -2215,6 +2240,7 @@ static int CmdHFiClassRestore(const char *Cmd) { payload->req.blockno = startblock; payload->req.send_reply = true; payload->req.do_auth = true; + payload->req.shallow_mod = shallow_mod; memcpy(payload->req.key, key, 8); payload->item_cnt = (endblock - startblock + 1); @@ -2268,7 +2294,7 @@ static int CmdHFiClassRestore(const char *Cmd) { return resp.status; } -static int iclass_read_block(uint8_t *KEY, uint8_t blockno, uint8_t keyType, bool elite, bool rawkey, bool replay, bool verbose, bool auth, uint8_t *out) { +static int iclass_read_block(uint8_t *KEY, uint8_t blockno, uint8_t keyType, bool elite, bool rawkey, bool replay, bool verbose, bool auth, bool shallow_mod, uint8_t *out) { iclass_auth_req_t payload = { .use_raw = rawkey, @@ -2278,6 +2304,7 @@ static int iclass_read_block(uint8_t *KEY, uint8_t blockno, uint8_t keyType, boo .blockno = blockno, .send_reply = true, .do_auth = auth, + .shallow_mod = shallow_mod, }; memcpy(payload.key, KEY, 8); @@ -2331,6 +2358,7 @@ static int CmdHFiClass_ReadBlock(const char *Cmd) { arg_lit0(NULL, "raw", "no computations applied to key"), arg_lit0(NULL, "nr", "replay of NR/MAC"), arg_lit0("v", "verbose", "verbose output"), + arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -2381,6 +2409,7 @@ static int CmdHFiClass_ReadBlock(const char *Cmd) { bool rawkey = arg_get_lit(ctx, 6); bool use_replay = arg_get_lit(ctx, 7); bool verbose = arg_get_lit(ctx, 8); + bool shallow_mod = arg_get_lit(ctx, 9); CLIParserFree(ctx); @@ -2400,7 +2429,7 @@ static int CmdHFiClass_ReadBlock(const char *Cmd) { } uint8_t data[8] = {0}; - int res = iclass_read_block(key, blockno, keyType, elite, rawkey, use_replay, verbose, auth, data); + int res = iclass_read_block(key, blockno, keyType, elite, rawkey, use_replay, verbose, auth, shallow_mod, data); if (res != PM3_SUCCESS) return res; @@ -2975,7 +3004,7 @@ static int CmdHFiClassCalcNewKey(const char *Cmd) { if (givenCSN == false) { uint8_t CCNR[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - if (select_only(csn, CCNR, true) == false) { + if (select_only(csn, CCNR, true, false) == false) { DropField(); return PM3_ESOFT; } @@ -3173,6 +3202,7 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { arg_lit0(NULL, "credit", "key is assumed to be the credit key"), arg_lit0(NULL, "elite", "elite computations applied to key"), arg_lit0(NULL, "raw", "no computations applied to key (raw)"), + arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -3184,6 +3214,7 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { bool use_credit_key = arg_get_lit(ctx, 2); bool use_elite = arg_get_lit(ctx, 3); bool use_raw = arg_get_lit(ctx, 4); + bool shallow_mod = arg_get_lit(ctx, 5); CLIParserFree(ctx); @@ -3213,7 +3244,7 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { bool got_csn = false; for (uint8_t i = 0; i < ICLASS_AUTH_RETRY; i++) { - got_csn = select_only(CSN, CCNR, false); + got_csn = select_only(CSN, CCNR, false, shallow_mod); if (got_csn == false) PrintAndLogEx(WARNING, "one more try"); else @@ -3295,6 +3326,7 @@ static int CmdHFiClassCheckKeys(const char *Cmd) { } packet->use_credit_key = use_credit_key; packet->count = curr_chunk_cnt; + packet->shallow_mod = shallow_mod; // copy chunk of pre calculated macs to packet memcpy(packet->items, (pre + chunk_offset), (4 * curr_chunk_cnt)); @@ -3799,6 +3831,7 @@ static int CmdHFiClassEncode(const char *Cmd) { arg_u64_0(NULL, "fc", "", "facility code"), arg_u64_0(NULL, "cn", "", "card number"), arg_str0("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), + arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -3843,6 +3876,8 @@ static int CmdHFiClassEncode(const char *Cmd) { int format_len = 0; CLIParamStrToBuf(arg_get_str(ctx, 9), (uint8_t *)format, sizeof(format), &format_len); + bool shallow_mod = arg_get_lit(ctx, 10); + CLIParserFree(ctx); if ((rawkey + elite) > 1) { @@ -3964,7 +3999,7 @@ static int CmdHFiClassEncode(const char *Cmd) { int isok = PM3_SUCCESS; // write for (uint8_t i = 0; i < 4; i++) { - isok = iclass_write_block(6 + i, credential + (i * 8), NULL, key, use_credit_key, elite, rawkey, false, false, auth); + isok = iclass_write_block(6 + i, credential + (i * 8), NULL, key, use_credit_key, elite, rawkey, false, false, auth, shallow_mod); switch (isok) { case PM3_SUCCESS: PrintAndLogEx(SUCCESS, "Write block %d/0x0%x ( " _GREEN_("ok") " ) --> " _YELLOW_("%s"), 6 + i, 6 + i, sprint_hex_inrow(credential + (i * 8), 8)); @@ -4135,11 +4170,16 @@ int CmdHFiClass(const char *Cmd) { // DESFIRE| | | //} -int info_iclass(void) { +int info_iclass(bool shallow_mod) { iclass_card_select_t payload = { .flags = (FLAG_ICLASS_READER_INIT | FLAG_ICLASS_READER_CLEARTRACE) }; + + if (shallow_mod) { + payload.flags |= FLAG_ICLASS_READER_SHALLOW_MOD; + } + clearCommandBuffer(); PacketResponseNG resp; SendCommandNG(CMD_HF_ICLASS_READER, (uint8_t *)&payload, sizeof(iclass_card_select_t)); diff --git a/client/src/cmdhficlass.h b/client/src/cmdhficlass.h index a4d545a05..db242d496 100644 --- a/client/src/cmdhficlass.h +++ b/client/src/cmdhficlass.h @@ -24,8 +24,8 @@ int CmdHFiClass(const char *Cmd); -int info_iclass(void); -int read_iclass_csn(bool loop, bool verbose); +int info_iclass(bool shallow_mod); +int read_iclass_csn(bool loop, bool verbose, bool shallow_mod); void printIclassDumpContents(uint8_t *iclass_dump, uint8_t startblock, uint8_t endblock, size_t filesize, bool dense_output); void HFiClassCalcDivKey(uint8_t *CSN, uint8_t *KEY, uint8_t *div_key, bool elite); diff --git a/include/iclass_cmd.h b/include/iclass_cmd.h index 5a2f90226..bc7c1e6ca 100644 --- a/include/iclass_cmd.h +++ b/include/iclass_cmd.h @@ -32,6 +32,7 @@ //#define FLAG_ICLASS_READER_ONLY_ONCE 0x04 #define FLAG_ICLASS_READER_CREDITKEY 0x08 #define FLAG_ICLASS_READER_AIA 0x10 +#define FLAG_ICLASS_READER_SHALLOW_MOD 0x20 // iCLASS reader status flags #define FLAG_ICLASS_NULL 0x00 @@ -60,6 +61,7 @@ typedef struct { bool use_replay; bool send_reply; bool do_auth; + bool shallow_mod; uint8_t blockno; } PACKED iclass_auth_req_t; @@ -103,6 +105,7 @@ typedef struct iclass_premac { typedef struct { bool use_credit_key; + bool shallow_mod; uint8_t count; iclass_premac_t items[]; } PACKED iclass_chk_t; From 303dbae85bd9c88c8e34726c6fb0f818ec89c315 Mon Sep 17 00:00:00 2001 From: Jin Jia Date: Fri, 6 Jan 2023 06:26:21 +0000 Subject: [PATCH 039/924] Fixed a warning on uninitialized variable --- armsrc/mifaresim.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index 71195aa62..81f26c5cb 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -881,8 +881,8 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 break; } */ - - if (MifareBlockToSector(receivedCmd_dec[1]) != cardAUTHSC) { + blockNo = receivedCmd_dec[1]; + if (MifareBlockToSector(blockNo) != cardAUTHSC) { EmSend4bit(mf_crypto1_encrypt4bit(pcs, CARD_NACK_NA)); FpgaDisableTracing(); @@ -893,6 +893,7 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 // Compliance of MIFARE Classic EV1 1K Datasheet footnote of Table 8 // If access bits show that key B is Readable, any subsequent memory access will be refused. + if (cardAUTHKEY == AUTHKEYB && IsKeyBReadable(blockNo)) { EmSend4bit(mf_crypto1_encrypt4bit(pcs, CARD_NACK_NA)); FpgaDisableTracing(); From 80a4698a7fe544806401a5efa253de1abd256c94 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 13:03:10 +0100 Subject: [PATCH 040/924] Initial rework on TLV to avoid mem leaks --- client/src/emv/tlv.c | 73 ++++++++++++++++++++++++++++++++++++-------- client/src/emv/tlv.h | 19 +++++++++++- 2 files changed, 78 insertions(+), 14 deletions(-) diff --git a/client/src/emv/tlv.c b/client/src/emv/tlv.c index f22bfea4c..67fa51b58 100644 --- a/client/src/emv/tlv.c +++ b/client/src/emv/tlv.c @@ -44,19 +44,6 @@ // const typeof( ((type *)0)->member ) *__mptr = (ptr); // (type *)( (char *)__mptr - offsetof(type,member) );}) -struct tlvdb { - struct tlv tag; - struct tlvdb *next; - struct tlvdb *parent; - struct tlvdb *children; -}; - -struct tlvdb_root { - struct tlvdb db; - size_t len; - unsigned char buf[0]; -}; - static tlv_tag_t tlv_parse_tag(const unsigned char **buf, size_t *len) { tlv_tag_t tag; @@ -212,6 +199,7 @@ struct tlvdb *tlvdb_parse(const unsigned char *buf, size_t len) { err: tlvdb_free(&root->db); + free(root); return NULL; } @@ -248,9 +236,53 @@ struct tlvdb *tlvdb_parse_multi(const unsigned char *buf, size_t len) { err: tlvdb_free(&root->db); + free(root); return NULL; } +bool tlvdb_parse_root(struct tlvdb_root *root) { + if (root == NULL || root->len == 0) { + return false; + } + + const uint8_t *tmp; + size_t left; + + tmp = root->buf; + left = root->len; + if (tlvdb_parse_one(&root->db, NULL, &tmp, &left) == true) { + if (left == 0) { + return true; + } + } + return false; +} + +bool tlvdb_parse_root_multi(struct tlvdb_root *root) { + if (root == NULL || root->len == 0) { + return false; + } + + const uint8_t *tmp; + size_t left; + + tmp = root->buf; + left = root->len; + if (tlvdb_parse_one(&root->db, NULL, &tmp, &left) == true) { + while (left > 0) { + struct tlvdb *db = calloc(1, sizeof(*db)); + if (tlvdb_parse_one(db, NULL, &tmp, &left) == true) { + tlvdb_add(&root->db, db); + } else { + free(db); + return false; + } + } + return true; + } + return false; +} + struct tlvdb *tlvdb_fixed(tlv_tag_t tag, size_t len, const unsigned char *value) { struct tlvdb_root *root = calloc(1, sizeof(*root) + len); @@ -291,6 +323,21 @@ void tlvdb_free(struct tlvdb *tlvdb) { } } +void tlvdb_root_free(struct tlvdb_root *root) { + if (root == NULL) { + return; + } + if (root->db.children) { + tlvdb_free(root->db.children); + root->db.children = NULL; + } + if (root->db.next) { + tlvdb_free(root->db.next); + root->db.next = NULL; + } + free(root); +} + struct tlvdb *tlvdb_find_next(struct tlvdb *tlvdb, tlv_tag_t tag) { if (!tlvdb) return NULL; diff --git a/client/src/emv/tlv.h b/client/src/emv/tlv.h index 50d046659..39f1bcacd 100644 --- a/client/src/emv/tlv.h +++ b/client/src/emv/tlv.h @@ -31,14 +31,31 @@ struct tlv { const unsigned char *value; }; -struct tlvdb; +struct tlvdb { + struct tlv tag; + struct tlvdb *next; + struct tlvdb *parent; + struct tlvdb *children; +}; + +struct tlvdb_root { + struct tlvdb db; + size_t len; + unsigned char buf[0]; +}; + typedef void (*tlv_cb)(void *data, const struct tlv *tlv, int level, bool is_leaf); struct tlvdb *tlvdb_fixed(tlv_tag_t tag, size_t len, const unsigned char *value); struct tlvdb *tlvdb_external(tlv_tag_t tag, size_t len, const unsigned char *value); struct tlvdb *tlvdb_parse(const unsigned char *buf, size_t len); struct tlvdb *tlvdb_parse_multi(const unsigned char *buf, size_t len); + +bool tlvdb_parse_root(struct tlvdb_root *root); +bool tlvdb_parse_root_multi(struct tlvdb_root *root); + void tlvdb_free(struct tlvdb *tlvdb); +void tlvdb_root_free(struct tlvdb_root *root); struct tlvdb *tlvdb_elm_get_next(struct tlvdb *tlvdb); struct tlvdb *tlvdb_elm_get_children(struct tlvdb *tlvdb); From 309603f19b015db91fccb478ae301a47034139d0 Mon Sep 17 00:00:00 2001 From: Yann GASCUEL <34003959+lnv42@users.noreply.github.com> Date: Fri, 6 Jan 2023 15:57:39 +0100 Subject: [PATCH 041/924] Add new Standalone mode LF_PROX2BRUT: HID ProxII brueforce v2 Trivial card number brute forcer for when you know the facility code and want to find valid(s) card number(s). --- armsrc/Standalone/Makefile.hal | 5 +- armsrc/Standalone/Makefile.inc | 4 ++ armsrc/Standalone/lf_prox2brute.c | 108 ++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 armsrc/Standalone/lf_prox2brute.c diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index 6b4510da8..3c18e681b 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -56,6 +56,9 @@ define KNOWN_STANDALONE_DEFINITIONS | LF_PROXBRUTE | HID ProxII bruteforce | | | - Brad Antoniewicz | +----------------------------------------------------------+ +| LF_PROX2BRUTE | HID ProxII bruteforce v2 | +| | | ++----------------------------------------------------------+ | LF_SAMYRUN | HID26 read/clone/sim | | (default) | - Samy Kamkar | +----------------------------------------------------------+ @@ -118,7 +121,7 @@ define KNOWN_STANDALONE_DEFINITIONS +----------------------------------------------------------+ endef -STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID +STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID STANDALONE_MODES += HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI STANDALONE_MODES_REQ_BT := HF_REBLAY STANDALONE_MODES_REQ_SMARTCARD := diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index 05a63f1dd..15218912c 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -29,6 +29,10 @@ endif ifneq (,$(findstring WITH_STANDALONE_LF_PROXBRUTE,$(APP_CFLAGS))) SRC_STANDALONE = lf_proxbrute.c endif +# WITH_STANDALONE_LF_PROX2BRUTE +ifneq (,$(findstring WITH_STANDALONE_LF_PROX2BRUTE,$(APP_CFLAGS))) + SRC_STANDALONE = lf_prox2brute.c +endif # WITH_STANDALONE_LF_HIDBRUTE ifneq (,$(findstring WITH_STANDALONE_LF_HIDBRUTE,$(APP_CFLAGS))) SRC_STANDALONE = lf_hidbrute.c diff --git a/armsrc/Standalone/lf_prox2brute.c b/armsrc/Standalone/lf_prox2brute.c new file mode 100644 index 000000000..0117e91e6 --- /dev/null +++ b/armsrc/Standalone/lf_prox2brute.c @@ -0,0 +1,108 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Brad Antoniewicz 2011 +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// LF HID ProxII Brutforce v2 by lnv42 - based on Proxbrute by Brad antoniewicz +// +// Following code is a trivial brute forcer for when you know the facility +// code and want to find valid(s) card number(s). It will try all card +// fnumbers rom CARDNUM_START to CARDNUM_END one by one (max. ~65k tries). +// This brute force will be a lot faster than Proxbrute that will try all +// possibles values for LF low, even those with bad checksum (~4g tries). +// LEDs will help you know which card number(s) worked. +// +//----------------------------------------------------------------------------- +#include "standalone.h" // standalone definitions +#include "proxmark3_arm.h" +#include "appmain.h" +#include "fpgaloader.h" +#include "util.h" +#include "dbprint.h" +#include "lfops.h" +#include "parity.h" + +#define CARDNUM_START 0 +#define CARDNUM_END 0xFFFF +#define FACILITY_CODE 2 + +void ModInfo(void) { + DbpString(" LF HID ProxII bruteforce v2"); +} + +// samy's sniff and repeat routine for LF +void RunMod(void) { + StandAloneMode(); + Dbprintf(">> LF HID proxII bruteforce v2 a.k.a Prox2Brute Started <<"); + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); + + const uint32_t high = 0x20; // LF high value is always 0x20 here + uint32_t low = 0; + + uint32_t fac = FACILITY_CODE, cardnum = 0; + + LED_D_ON(); + while (BUTTON_HELD(200) != BUTTON_HOLD) { // Waiting for a 200ms button press + WDT_HIT(); + // exit from SamyRun, send a usbcommand. + if (data_available()) { // early exit + DbpString("[=] You can take the shell back :) ..."); + LEDsoff(); + return; + } + } + + LED_C_ON(); + WAIT_BUTTON_RELEASED(); // We are now ready to start brutforcing card numbers + LEDsoff(); + + Dbprintf("[=] Starting HID ProxII Bruteforce from card %08x to %08x", + CARDNUM_START, MIN(CARDNUM_END, 0xFFFF)); + + for (cardnum = CARDNUM_START ; cardnum <= MIN(CARDNUM_END, 0xFFFF) ; cardnum++) { + WDT_HIT(); + + // exit from SamyRun, send a usbcommand. + if (data_available()) break; + + // short button press may be used for fast-forward + if (BUTTON_HELD(1000) == BUTTON_HOLD) break; // long button press (>=1sec) exit + + // calculate the new LF low value including Card number, Facility code and checksum + low = (cardnum << 1) | (fac << 17); + low |= oddparity32((low >> 1) & 0xFFF); + low |= evenparity32((low >> 13) & 0xFFF) << 25; + + Dbprintf("[=] trying Facility = %08x, Card = %08x, raw = %08x%08x", + fac, cardnum, high, low); + + // Start simulating an HID TAG, with high/low values, no led control and 20000 cycles timeout + CmdHIDsimTAGEx(0, high, low, 0, false, 20000); + + // switch leds to be able to know (aproximatly) which card number worked (64 tries loop) + LED_A_INV(); // switch led A every try + if ((cardnum-CARDNUM_START) % 8 == 7) // switch led B every 8 tries + LED_B_INV(); + if ((cardnum-CARDNUM_START) % 16 == 15) // switch led C every 16 tries + LED_C_INV(); + if ((cardnum-CARDNUM_START) % 32 == 31) // switch led D every 32 tries + LED_D_INV(); + } + + SpinErr((LED_A | LED_B | LED_C | LED_D), 250, 5); // Xmax tree + Dbprintf("[=] Ending HID ProxII Bruteforce from card %08x to %08x", + CARDNUM_START, cardnum - 1); + DbpString("[=] You can take the shell back :) ..."); + LEDsoff(); // This is the end +} From 6e084d82d5c9bda9c1cd6a044dfb9e4bc3ed3800 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 18:19:31 +0100 Subject: [PATCH 042/924] First two PIV commands --- client/CMakeLists.txt | 1 + client/Makefile | 1 + client/src/cmdmain.c | 2 + client/src/cmdpiv.c | 813 ++++++++++++++++++++++++++++++++++++++++++ client/src/cmdpiv.h | 26 ++ 5 files changed, 843 insertions(+) create mode 100644 client/src/cmdpiv.c create mode 100644 client/src/cmdpiv.h diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a34348413..1622190f9 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -336,6 +336,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdmain.c ${PM3_ROOT}/client/src/cmdnfc.c ${PM3_ROOT}/client/src/cmdparser.c + ${PM3_ROOT}/client/src/cmdpiv.c ${PM3_ROOT}/client/src/cmdscript.c ${PM3_ROOT}/client/src/cmdsmartcard.c ${PM3_ROOT}/client/src/cmdtrace.c diff --git a/client/Makefile b/client/Makefile index 500e820f0..03f022297 100644 --- a/client/Makefile +++ b/client/Makefile @@ -626,6 +626,7 @@ SRCS = mifare/aiddesfire.c \ cmdmain.c \ cmdnfc.c \ cmdparser.c \ + cmdpiv.c \ cmdscript.c \ cmdsmartcard.c \ cmdtrace.c \ diff --git a/client/src/cmdmain.c b/client/src/cmdmain.c index 99fef33d4..14e198f5c 100644 --- a/client/src/cmdmain.c +++ b/client/src/cmdmain.c @@ -39,6 +39,7 @@ #include "cmdanalyse.h" #include "emv/cmdemv.h" // EMV #include "cmdflashmem.h" // rdv40 flashmem commands +#include "cmdpiv.h" #include "cmdsmartcard.h" // rdv40 smart card ISO7816 commands #include "cmdusart.h" // rdv40 FPC USART commands #include "cmdwiegand.h" // wiegand commands @@ -324,6 +325,7 @@ static command_t CommandTable[] = { {"lf", CmdLF, AlwaysAvailable, "{ Low frequency commands... }"}, {"mem", CmdFlashMem, IfPm3Flash, "{ Flash memory manipulation... }"}, {"nfc", CmdNFC, AlwaysAvailable, "{ NFC commands... }"}, + {"piv", CmdPIV, AlwaysAvailable, "{ PIV commands... }"}, {"reveng", CmdRev, AlwaysAvailable, "{ CRC calculations from RevEng software... }"}, {"smart", CmdSmartcard, AlwaysAvailable, "{ Smart card ISO-7816 commands... }"}, {"script", CmdScript, AlwaysAvailable, "{ Scripting commands... }"}, diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c new file mode 100644 index 000000000..9e800055a --- /dev/null +++ b/client/src/cmdpiv.c @@ -0,0 +1,813 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// PIV commands +//----------------------------------------------------------------------------- + +#include "cmdpiv.h" + +#include "comms.h" // DropField +#include "cmdsmartcard.h" // smart_select +#include "cmdtrace.h" +#include "cliparser.h" +#include "cmdparser.h" +#include "commonutil.h" // Mem[LB]eToUintXByte +#include "emv/tlv.h" +#include "proxmark3.h" +#include "cmdhf14a.h" +#include "fileutils.h" +#include "crypto/asn1utils.h" + +static int CmdHelp(const char *Cmd); + +static const uint16_t APDU_RES_SUCCESS = 0x9000; +static const uint16_t APDU_RES_NOT_FOUND = 0x6A82; +static const uint16_t APDU_RES_SECURITY = 0x6982; +static const uint16_t APDU_RES_PIN_BLOCKED = 0x6983; + +static uint8_t PIV_APPLET[9] = "\xA0\x00\x00\x03\x08\x00\x00\x10\x00"; + +enum piv_condition_t { + PIV_MANDATORY, + PIV_CONDITIONAL, + PIV_OPTIONAL, + PIV_INVALID = 0xff, +}; + +struct piv_container { + uint32_t id; + const uint8_t *tlv_tag; // tag is between 1 and 3 bytes. + size_t len; // length of the hex-form if the tag (i.e. twice the byte size) for pretty printing + enum piv_condition_t cond; + const char *name; +}; + +#define PIV_TAG_ID(x) ((const uint8_t *)(x)) +#define PIV_CONTAINER_FINISH { (~0), NULL, 0, PIV_INVALID, NULL } + +// Source: SP800-73-4, Annex A +// https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-73-4.pdf +static const struct piv_container PIV_CONTAINERS[] = { + {0xDB00, PIV_TAG_ID("\x5F\xC1\x07"), 3, PIV_MANDATORY, "Card Capability Container"}, + {0x3000, PIV_TAG_ID("\x5F\xC1\x02"), 3, PIV_MANDATORY, "Card Holder Unique Identifier"}, + {0x0101, PIV_TAG_ID("\x5F\xC1\x05"), 3, PIV_MANDATORY, "X.509 Certificate for PIV Authentication (key ref 9A)"}, + {0x6010, PIV_TAG_ID("\x5F\xC1\x03"), 3, PIV_MANDATORY, "Cardholder Fingerprints"}, + {0x9000, PIV_TAG_ID("\x5F\xC1\x06"), 3, PIV_MANDATORY, "Security Object"}, + {0x6030, PIV_TAG_ID("\x5F\xC1\x08"), 3, PIV_MANDATORY, "Cardholder Facial Image"}, + {0x0500, PIV_TAG_ID("\x5F\xC1\x01"), 3, PIV_MANDATORY, "X.509 Certificate for Card Authentication (key ref 9E)"}, + {0x0100, PIV_TAG_ID("\x5F\xC1\x0A"), 3, PIV_CONDITIONAL, "X.509 Certificate for Digital Signature (key ref 9C)"}, + {0x0102, PIV_TAG_ID("\x5F\xC1\x0B"), 3, PIV_CONDITIONAL, "X.509 Certificate for Key Management (key ref 9D)"}, + {0x3001, PIV_TAG_ID("\x5F\xC1\x09"), 3, PIV_OPTIONAL, "Printed Information"}, + {0x6050, PIV_TAG_ID( "\x7E"), 1, PIV_OPTIONAL, "Discovery Object"}, + {0x6060, PIV_TAG_ID("\x5F\xC1\x0C"), 3, PIV_OPTIONAL, "Key History Object"}, + {0x1001, PIV_TAG_ID("\x5F\xC1\x0D"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 1 (key ref 82)"}, + {0x1002, PIV_TAG_ID("\x5F\xC1\x0E"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 2 (key ref 83)"}, + {0x1003, PIV_TAG_ID("\x5F\xC1\x0F"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 3 (key ref 84)"}, + {0x1004, PIV_TAG_ID("\x5F\xC1\x10"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 4 (key ref 85)"}, + {0x1005, PIV_TAG_ID("\x5F\xC1\x11"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 5 (key ref 86)"}, + {0x1006, PIV_TAG_ID("\x5F\xC1\x12"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 6 (key ref 87)"}, + {0x1007, PIV_TAG_ID("\x5F\xC1\x13"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 7 (key ref 88)"}, + {0x1008, PIV_TAG_ID("\x5F\xC1\x14"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 8 (key ref 89)"}, + {0x1009, PIV_TAG_ID("\x5F\xC1\x15"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 9 (key ref 8A)"}, + {0x100A, PIV_TAG_ID("\x5F\xC1\x16"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 10 (key ref 8B)"}, + {0x100B, PIV_TAG_ID("\x5F\xC1\x17"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 11 (key ref 8C)"}, + {0x100C, PIV_TAG_ID("\x5F\xC1\x18"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 12 (key ref 8D)"}, + {0x100D, PIV_TAG_ID("\x5F\xC1\x19"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 13 (key ref 8E)"}, + {0x100E, PIV_TAG_ID("\x5F\xC1\x1A"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 14 (key ref 8F)"}, + {0x100F, PIV_TAG_ID("\x5F\xC1\x1B"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 15 (key ref 90)"}, + {0x1010, PIV_TAG_ID("\x5F\xC1\x1C"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 16 (key ref 91)"}, + {0x1011, PIV_TAG_ID("\x5F\xC1\x1D"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 17 (key ref 92)"}, + {0x1012, PIV_TAG_ID("\x5F\xC1\x1E"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 18 (key ref 93)"}, + {0x1013, PIV_TAG_ID("\x5F\xC1\x1F"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 19 (key ref 94)"}, + {0x1014, PIV_TAG_ID("\x5F\xC1\x20"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 20 (key ref 95)"}, + {0x1015, PIV_TAG_ID("\x5F\xC1\x21"), 3, PIV_OPTIONAL, "Cardholder Iris Images"}, + {0x1016, PIV_TAG_ID( "\x7F\x61"), 2, PIV_OPTIONAL, "Biometric Information Templates Group Template"}, + {0x1017, PIV_TAG_ID("\x5F\xC1\x22"), 3, PIV_OPTIONAL, "Secure Messaging Certificate Signer"}, + {0x1018, PIV_TAG_ID("\x5F\xC1\x23"), 3, PIV_OPTIONAL, "Pairing Code Reference Data Container"}, + PIV_CONTAINER_FINISH, +}; + +enum piv_tag_t { + PIV_TAG_GENERIC, + PIV_TAG_HEXDUMP, + PIV_TAG_STRING, + PIV_TAG_PRINTSTR, + PIV_TAG_NUMERIC, + PIV_TAG_YYYYMMDD, + PIV_TAG_ENUM, + PIV_TAG_TLV, + PIV_TAG_GUID, + PIV_TAG_CERT, + PIV_TAG_FASCN, +}; + +struct piv_tag { + tlv_tag_t tag; + const char *name; + enum piv_tag_t type; + const void *data; +}; + +struct piv_tag_enum { + unsigned long value; + const char *name; +}; + +#define PIV_ENUM_FINISH { (~0), NULL } + +// From table 6-2 in SP800-78 specification +static const struct piv_tag_enum PIV_CRYPTO_ALG[] = { + {0x00, "3 Key 3DES - ECB"}, + {0x03, "3 Key 3DES - ECB"}, // Not a typo, 2 identifiers for the same algorithm + {0x06, "RSA 1024 bit"}, + {0x07, "RSA 2048 bit"}, + {0x08, "AES-128 ECB"}, + {0x0A, "AES-192 ECB"}, + {0x0C, "AES-256 ECB"}, + {0x11, "ECC P-256"}, + {0x14, "ECC P-384"}, + {0x27, "Cipher Suite 2"}, + {0x2E, "Cipher Suite 7"}, + PIV_ENUM_FINISH, +}; + +static const struct piv_tag_enum PIV_CERT_INFO[] = { + {0x00, "Uncompressed"}, + {0x01, "GZIP Compressed"}, + PIV_ENUM_FINISH, +}; + +static const struct piv_tag piv_tags[] = { + { 0x00, "Unknown ???", PIV_TAG_HEXDUMP, NULL }, + { 0x01, "Name", PIV_TAG_PRINTSTR, NULL }, + { 0x02, "Employee Affiliation", PIV_TAG_PRINTSTR, NULL }, + { 0x04, "Expiry Date", PIV_TAG_PRINTSTR, NULL }, + { 0x05, "Agency Card Serial Number", PIV_TAG_PRINTSTR, NULL }, + { 0x06, "Issuer identification", PIV_TAG_PRINTSTR, NULL }, + { 0x07, "Organization Affiliation (Line 1)", PIV_TAG_PRINTSTR, NULL }, + { 0x08, "Organization Affiliation (Line 2)", PIV_TAG_PRINTSTR, NULL }, + + { 0x30, "FASC-N", PIV_TAG_FASCN, NULL }, + { 0x32, "Organizational Identifier [deprecated]", PIV_TAG_HEXDUMP, NULL }, + { 0x33, "DUNS [deprecated]", PIV_TAG_HEXDUMP, NULL }, + { 0x34, "GUID", PIV_TAG_GUID, NULL }, + { 0x35, "Expiry Date", PIV_TAG_YYYYMMDD, NULL }, + { 0x36, "Cardholder UUID", PIV_TAG_GUID, NULL }, + { 0x3d, "Authentication Key Map", PIV_TAG_HEXDUMP, NULL }, + { 0x3e, "Issuer Asymmetric Signature", PIV_TAG_CERT, NULL }, + + { 0x4f, "Application Identifier (AID)", PIV_TAG_STRING, NULL }, + + { 0x50, "Application Label", PIV_TAG_PRINTSTR, NULL }, + { 0x53, "Discretionary data (or template)", PIV_TAG_TLV, NULL }, + { 0x5f2f, "PIN Usage Policy", PIV_TAG_HEXDUMP, NULL }, + { 0x5f50, "Issuer URL", PIV_TAG_PRINTSTR, NULL }, + + { 0x61, "Application Property Template", PIV_TAG_GENERIC, NULL }, + + { 0x70, "Certificate", PIV_TAG_CERT, NULL }, + { 0x71, "CertInfo", PIV_TAG_ENUM, PIV_CERT_INFO }, + { 0x72, "MSCUID [deprecated]", PIV_TAG_HEXDUMP, NULL }, + { 0x79, "Coexistent tag allocation authority", PIV_TAG_HEXDUMP, NULL }, + { 0x7f21, "Intermediate CVC", PIV_TAG_HEXDUMP, NULL }, + { 0x7f60, "Biometric Information Template", PIV_TAG_GENERIC, NULL }, + + { 0x80, "Cryptographic algorithm identifier", PIV_TAG_ENUM, PIV_CRYPTO_ALG }, + + { 0x99, "Pairing Code", PIV_TAG_PRINTSTR, NULL }, + + { 0xac, "Cryptographic algorithms supported", PIV_TAG_GENERIC, NULL }, + + { 0xb4, "Security Object Buffer (deprecated)", PIV_TAG_GENERIC, NULL }, + { 0xba, "Mapping of DG to Container ID", PIV_TAG_HEXDUMP, NULL }, + { 0xbb, "Security Object", PIV_TAG_CERT, NULL }, + { 0xbc, "Fingerprint I & II or Image for Visual Verification", PIV_TAG_GENERIC, NULL }, + + { 0xc1, "keysWithOnCardCerts", PIV_TAG_NUMERIC, NULL }, + { 0xc2, "keysWithOffCardCerts", PIV_TAG_NUMERIC, NULL }, + + { 0xe3, "Extended Application CardURL [deprecated]", PIV_TAG_GENERIC, NULL }, + { 0xee, "Buffer Length [deprecated]", PIV_TAG_NUMERIC, NULL }, + + { 0xf0, "Card Identifier", PIV_TAG_STRING, NULL }, + { 0xf1, "Capability Container version number", PIV_TAG_NUMERIC, NULL }, + { 0xf2, "Capability Grammar version number", PIV_TAG_NUMERIC, NULL }, + { 0xf3, "Application Card URL", PIV_TAG_PRINTSTR, NULL }, + { 0xf4, "PKCS#15", PIV_TAG_NUMERIC, NULL }, + { 0xf5, "Registered Data Model Number", PIV_TAG_NUMERIC, NULL }, + { 0xf6, "Access Control Rule Table", PIV_TAG_HEXDUMP, NULL }, + { 0xf7, "Card APDUs", PIV_TAG_GENERIC, NULL }, + { 0xfa, "Redirection Tag", PIV_TAG_GENERIC, NULL }, + { 0xfb, "Capability Tuples (CT)", PIV_TAG_GENERIC, NULL }, + { 0xfc, "Status Tuples (ST)", PIV_TAG_GENERIC, NULL }, + { 0xfd, "Next CCC", PIV_TAG_GENERIC, NULL }, + { 0xfe, "Error Detection Code", PIV_TAG_GENERIC, NULL }, +}; + +struct guid { + uint32_t part1; + uint16_t part2; + uint16_t part3; + uint8_t data[8]; +}; + +static void parse_guid(const uint8_t *data, struct guid *guid) { + if (guid == NULL) { + return; + } + size_t ofs = 0; + guid->part1 = MemBeToUint4byte(&data[ofs]); + ofs += sizeof(uint32_t); + guid->part2 = MemBeToUint2byte(&data[ofs]); + ofs += sizeof(uint16_t); + guid->part3 = MemBeToUint2byte(&data[ofs]); + ofs += sizeof(uint16_t); + for (size_t i = 0; i < sizeof(guid->data); i++) { + guid->data[i] = data[ofs + i]; + } +} + +static void piv_print_cb(void *data, const struct tlv *tlv, int level, bool is_leaf); +static bool piv_tag_dump(const struct tlv *tlv, int level); + +static void PrintChannel(Iso7816CommandChannel channel) { + switch (channel) { + case CC_CONTACTLESS: + PrintAndLogEx(INFO, "Selected channel... " _GREEN_("CONTACTLESS (T=CL)")); + break; + case CC_CONTACT: + PrintAndLogEx(INFO, "Selected channel... " _GREEN_("CONTACT")); + break; + } +} + +static int piv_sort_tag(tlv_tag_t tag) { + return (int)(tag >= 0x100 ? tag : tag << 8); +} + +static int piv_tlv_compare(const void *a, const void *b) { + const struct tlv *tlv = a; + const struct piv_tag *tag = b; + + return piv_sort_tag(tlv->tag) - (piv_sort_tag(tag->tag)); +} + +static const struct piv_tag *piv_get_tag(const struct tlv *tlv) { + const struct piv_tag *tag = bsearch(tlv, piv_tags, ARRAYLEN(piv_tags), + sizeof(piv_tags[0]), piv_tlv_compare); + return tag != NULL ? tag : &piv_tags[0]; +} + +static unsigned long piv_value_numeric(const struct tlv *tlv, unsigned start, unsigned end) { + unsigned long ret = 0; + int i; + + if (end > tlv->len * 2) + return ret; + if (start >= end) + return ret; + + if (start & 1) { + ret += tlv->value[start / 2] & 0xf; + i = start + 1; + } else + i = start; + + for (; i < end - 1; i += 2) { + ret *= 10; + ret += tlv->value[i / 2] >> 4; + ret *= 10; + ret += tlv->value[i / 2] & 0xf; + } + + if (end & 1) { + ret *= 10; + ret += tlv->value[end / 2] >> 4; + } + + return ret; +} + +static void piv_tag_dump_yyyymmdd(const struct tlv *tlv, const struct piv_tag *tag, int level) { + bool is_printable = true; + for (size_t i = 0; i < tlv->len; i++) { + if ((tlv->value[i] < 0x30) || (tlv->value[i] > 0x39)) { + is_printable = false; + break; + } + } + if (is_printable) { + PrintAndLogEx(NORMAL, " " _YELLOW_("%c%c%c%c.%c%c.%c%c"), + tlv->value[0], tlv->value[1], tlv->value[2], tlv->value[3], + tlv->value[4], tlv->value[5], + tlv->value[6], tlv->value[7] + ); + } else { + PrintAndLogEx(NORMAL, " " _YELLOW_("%04lu.%02lu.%02lu"), + piv_value_numeric(tlv, 0, 4), + piv_value_numeric(tlv, 4, 6), + piv_value_numeric(tlv, 6, 8) + ); + } +} + +static void piv_tag_dump_enum(const struct tlv *tlv, const struct piv_tag *tag, int level) { + const struct piv_tag_enum *values = tag->data; + for (size_t i = 0; values[i].name != NULL; i++) { + if (values[i].value == tlv->value[0]) { + PrintAndLogEx(NORMAL, " %u - '" _YELLOW_("%s")"'", + tlv->value[0], values[i].name); + return; + } + } + PrintAndLogEx(NORMAL, " %u - " _RED_("Unknown??"), tlv->value[0]); +} + +static void piv_tag_dump_tlv(const struct tlv *tlv, const struct piv_tag *tag, int level) { + // We don't use parsing methods because we need to discard constructed tags + const unsigned char *buf = tlv->value; + size_t left = tlv->len; + + while (left) { + struct tlv sub_tlv; + //const struct piv_tag *sub_tag; + + if (!tlv_parse_tl(&buf, &left, &sub_tlv)) { + PrintAndLogEx(INFO, "%*sInvalid Tag-Len", (level * 4), " "); + continue; + } + sub_tlv.value = buf; + piv_tag_dump(&sub_tlv, level + 1); + buf += sub_tlv.len; + left -= sub_tlv.len; + } + +} + +static void piv_print_cert(const uint8_t *buf, const size_t len, int level) { + char prefix[256] = {0}; + PrintAndLogEx(NORMAL, ""); + snprintf(prefix, sizeof(prefix), "%*s", 4 * level, " "); + // TODO: when mbedTLS has a new release with the PCKS7 parser, we can replace the generic ASN.1 print + // The pull request has been merged end of Nov 2022. + asn1_print((uint8_t *) buf, len, prefix); +} + +static void piv_print_fascn(const uint8_t *buf, const size_t len, int level) { + const char *encoded[32] = { + _RED_("?"), // 0b00000 + "0", // 0b00001 + "8", // 0b00010 + _RED_("?"), // 0b00011 + "4", // 0b00100 + _RED_("?"), // 0b00101 + _RED_("?"), // 0b00110 + _RED_("?"), // 0b00111 + "2", // 0b01000 + _RED_("?"), // 0b01001 + _RED_("?"), // 0b01010 + _RED_("?"), // 0b01011 + _RED_("?"), // 0b01100 + "6", // 0b01101 + _RED_("?"), // 0b01110 + _RED_("?"), // 0b01111 + "1", // 0b10000 + _RED_("?"), // 0b10001 + _RED_("?"), // 0b10010 + "9", // 0b10011 + _RED_("?"), // 0b10100 + "5", // 0b10101 + _GREEN_(" FS "), // 0b10110 + _RED_("?"), // 0b10111 + _RED_("?"), // 0b11000 + "3", // 0b11001 + _YELLOW_("SS "), // 0b11010 + _RED_("?"), // 0b11011 + "7", // 0b11100 + _RED_("?"), // 0b11101 + _RED_("?"), // 0b11110 + _YELLOW_(" ES"), // 0b11111 + }; + const uint8_t cycle[8] = {5, 2, 7, 4, 1, 6, 3, 8}; + + PrintAndLogEx(INFO, "%*s" NOLF, 4 * level, " "); + // Buffer is 40 bytes but last byte is LRC that we process separately + for (int i = 0; i < 39; i++) { + uint8_t tmp = buf[(5 * i) >> 3]; + uint8_t rot = cycle[i & 7]; + // rotate left to get the bits in place + tmp = (tmp << rot) | (tmp >> (8 - rot)); + // append bits from next byte if needed + if (rot < 5) { + uint8_t tmp2 = buf[(5 * (i + 1)) >> 3]; + tmp2 = (tmp2 << rot) | (tmp2 >> (8 - rot)); + tmp &= 0x1f << rot; + tmp |= tmp2 & ((1 << rot) - 1); + } + PrintAndLogEx(NORMAL, "%s" NOLF, encoded[tmp & 0x1f]); + } + uint8_t lrc = buf[24] & 0x1f; + PrintAndLogEx(NORMAL, " LRC=[" _YELLOW_("%02x") "]", lrc); +} + +static bool piv_tag_dump(const struct tlv *tlv, int level) { + if (tlv == NULL) { + PrintAndLogEx(FAILED, "NULL"); + return false; + } + + const struct piv_tag *tag = piv_get_tag(tlv); + + PrintAndLogEx(INFO, "%*s--%2x[%02zx] '%s':" NOLF, (level * 4), " ", tlv->tag, tlv->len, tag->name); + + switch (tag->type) { + case PIV_TAG_GENERIC: + PrintAndLogEx(NORMAL, ""); + break; + case PIV_TAG_HEXDUMP: + PrintAndLogEx(NORMAL, ""); + print_buffer(tlv->value, tlv->len, level + 1); + break; + case PIV_TAG_STRING: + PrintAndLogEx(NORMAL, " '" _YELLOW_("%s")"'", sprint_hex_inrow(tlv->value, tlv->len)); + break; + case PIV_TAG_NUMERIC: + PrintAndLogEx(NORMAL, " " _YELLOW_("%lu"), piv_value_numeric(tlv, 0, tlv->len * 2)); + break; + case PIV_TAG_YYYYMMDD: + piv_tag_dump_yyyymmdd(tlv, tag, level); + break; + case PIV_TAG_ENUM: + piv_tag_dump_enum(tlv, tag, level + 1); + break; + case PIV_TAG_TLV: + PrintAndLogEx(NORMAL, ""); + piv_tag_dump_tlv(tlv, tag, level); + break; + case PIV_TAG_PRINTSTR: + PrintAndLogEx(NORMAL, " '" NOLF); + for (size_t i = 0; i < tlv->len; i++) { + PrintAndLogEx(NORMAL, _YELLOW_("%c") NOLF, tlv->value[i]); + } + PrintAndLogEx(NORMAL, "'"); + break; + case PIV_TAG_GUID: + if (tlv->len != 16) { + PrintAndLogEx(NORMAL, _RED_("")); + } else { + struct guid guid = {0}; + parse_guid(tlv->value, &guid); + PrintAndLogEx(NORMAL, " " _YELLOW_("{%08x-%04x-%04x-") NOLF, guid.part1, guid.part2, guid.part3); + for (size_t i = 0; i < 8; i++) { + PrintAndLogEx(NORMAL, _YELLOW_("%02x") NOLF, guid.data[i]); + } + PrintAndLogEx(NORMAL, _YELLOW_("}")); + } + break; + case PIV_TAG_CERT: + piv_print_cert(tlv->value, tlv->len, level + 2); + break; + case PIV_TAG_FASCN: + PrintAndLogEx(NORMAL, " '" _YELLOW_("%s")"'", sprint_hex_inrow(tlv->value, tlv->len)); + if (tlv->len == 25) { + piv_print_fascn(tlv->value, tlv->len, level + 2); + } + break; + }; + + return true; +} + +static void piv_print_cb(void *data, const struct tlv *tlv, int level, bool is_leaf) { + piv_tag_dump(tlv, level); + if (is_leaf) { + print_buffer(tlv->value, tlv->len, level); + } +} + +static void PrintTLV(const struct tlvdb* tlvdb) { + if (tlvdb) { + tlvdb_visit(tlvdb, piv_print_cb, NULL, 0); + } +} + +static void PrintTLVFromBuffer(const uint8_t* buf, size_t len) { + if (buf == NULL || len == 0) { + return; + } + struct tlvdb_root *root = calloc(1, sizeof(*root) + len); + if (root == NULL) { + return; + } + root->len = len; + memcpy(root->buf, buf, len); + if (tlvdb_parse_root_multi(root) == true) { + PrintTLV(&(root->db)); + } else { + PrintAndLogEx(WARNING, "TLV ERROR: Can't parse buffer as TLV tree."); + } + tlvdb_root_free(root); +} + +static int PivGetData(Iso7816CommandChannel channel, const uint8_t tag[], size_t tag_len, bool verbose, struct tlvdb_root **result, uint16_t *sw) { + uint8_t apdu_data[5] = {0x5c, 0x00}; + + *result = NULL; + *sw = 0; + + if (tag_len < 1 || tag_len > 3) { + return PM3_EINVARG; + } + + apdu_data[1] = tag_len; + memcpy(&apdu_data[2], tag, tag_len); + + sAPDU_t apdu = { + .CLA = 0x00, + .INS = 0xCB, + .P1 = 0x3F, + .P2 = 0xFF, + .Lc = tag_len + 2, + .data = apdu_data + }; + + // Answer can be chained. Let's use a dynamically allocated buffer. + size_t capacity = PM3_CMD_DATA_SIZE; + struct tlvdb_root *root = calloc(1, sizeof(*root) + capacity); + + if (root == NULL) { + return PM3_EMALLOC; + } + root->len = 0; + + size_t more_data = 0; + do { + size_t received = 0; + int res = Iso7816ExchangeEx(channel, false, true, apdu, (more_data != 0), more_data, &(root->buf[root->len]), capacity - root->len, &received, sw); + if (res != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Sending APDU failed with code %d", res); + free(root); + return res; + } + root->len += received; + if (((*sw) & 0xff00) == 0x6100) { + // More data + more_data = (*sw) & 0xff; + if (more_data == 0x00 || more_data > MAX_APDU_SIZE) { + more_data = MAX_APDU_SIZE; + } + apdu.CLA = 0x00; + apdu.INS = 0xC0; + apdu.P1 = 0x00; + apdu.P2 = 0x00; + apdu.Lc = 0; + apdu.data = NULL; + if ((capacity - root->len) < PM3_CMD_DATA_SIZE) { + PrintAndLogEx(DEBUG, "Adding more capacity to buffer..."); + capacity += PM3_CMD_DATA_SIZE; + struct tlvdb_root *new_root = realloc(root, sizeof(*root) + capacity); + if (new_root == NULL) { + PrintAndLogEx(FAILED, "Running out of memory while re-allocating buffer"); + free(root); + return PM3_EMALLOC; + } + root = new_root; + } + } + if ((*sw) == APDU_RES_SUCCESS) { + more_data = 0; + } + } while (more_data > 0); + + // Now we can try parse the TLV and return it + *result = root; + if (*sw == APDU_RES_SUCCESS && tlvdb_parse_root(root) == true) { + return PM3_SUCCESS; + } + if (verbose == true) { + PrintAndLogEx(WARNING, "Couldn't parse TLV answer."); + } + return PM3_SUCCESS; +} + +static int PivGetDataByCidAndPrint(Iso7816CommandChannel channel, const struct piv_container* cid, bool decodeTLV, bool verbose) { + struct tlvdb_root *root = NULL; + + if (cid == NULL) { + return PM3_SUCCESS; + } + + PrintAndLogEx(INFO, "Getting %s [" _GREEN_("%s") "]", cid->name, sprint_hex_inrow(cid->tlv_tag, cid->len)); + + uint16_t sw = 0; + + if (PivGetData(channel, cid->tlv_tag, cid->len, verbose, &root, &sw) == PM3_SUCCESS) { + switch (sw) { + case APDU_RES_SUCCESS: + if (decodeTLV == true) { + PrintTLV(&(root->db)); + } else { + print_buffer(root->buf, root->len, 0); + } + break; + case APDU_RES_NOT_FOUND: + PrintAndLogEx(FAILED, "Container not found."); + break; + case APDU_RES_SECURITY: + PrintAndLogEx(WARNING, "Security conditions not met."); + break; + default: + if (verbose == true) { + PrintAndLogEx(INFO, "APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); + } + break; + } + tlvdb_root_free(root); + } + return PM3_SUCCESS; +} + +static int PivGetDataByTagAndPrint(Iso7816CommandChannel channel, const uint8_t tag[], size_t tag_len, bool decodeTLV, bool verbose) { + int idx = 0; + + for (; PIV_CONTAINERS[idx].len != 0; idx++) { + if ((tag_len == PIV_CONTAINERS[idx].len) && (memcmp(tag, PIV_CONTAINERS[idx].tlv_tag, tag_len) == 0)) { + break; + } + } + if (PIV_CONTAINERS[idx].len == 0) { + struct piv_container cid = {0x00, tag, tag_len, PIV_OPTIONAL, "Getting unknown contained ID"}; + return PivGetDataByCidAndPrint(channel, &cid, decodeTLV, verbose); + } + return PivGetDataByCidAndPrint(channel, &(PIV_CONTAINERS[idx]), decodeTLV, verbose); +} + +static int PivSelect(Iso7816CommandChannel channel, bool activateField, bool leaveFieldOn, bool decodeTLV, bool silent, uint8_t applet[], size_t appletLen) { + uint8_t buf[APDU_RES_LEN] = {0}; + size_t len = 0; + uint16_t sw = 0; + + int res = Iso7816Select(channel, activateField, leaveFieldOn, applet, appletLen, buf, sizeof(buf), &len, &sw); + if ((sw != 0) && (silent == false)) { + PrintAndLogEx(INFO, "APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); + } + if (res != PM3_SUCCESS || sw != APDU_RES_SUCCESS) { + PrintAndLogEx(FAILED, "Applet selection failed. Card is not a PIV card."); + return res; + } + if (silent == false) { + if (decodeTLV == true) { + PrintTLVFromBuffer(buf, len); + } else { + print_buffer(buf, len, 0); + } + } + return PM3_SUCCESS; +} + +static int CmdPIVSelect(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "piv select", + "Executes select applet command", + "piv select -s -> select card, select applet\n" + "piv select -st --aid a00000030800001000 -> select card, select applet a00000030800001000, show result in TLV\n"); + + void *argtable[] = { + arg_param_begin, + arg_lit0("sS", "select", "Activate field and select applet"), + arg_lit0("kK", "keep", "Keep field for next command"), + arg_lit0("aA", "apdu", "Show APDU requests and responses"), + arg_lit0("tT", "tlv", "TLV decode results"), + arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_str0(NULL, "aid", "", "Applet ID to select. By default A0000003080000100 will be used"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + bool activateField = arg_get_lit(ctx, 1); + bool leaveSignalON = arg_get_lit(ctx, 2); + bool APDULogging = arg_get_lit(ctx, 3); + bool decodeTLV = arg_get_lit(ctx, 4); + Iso7816CommandChannel channel = CC_CONTACTLESS; + if (arg_get_lit(ctx, 5)) + channel = CC_CONTACT; + PrintChannel(channel); + + uint8_t applet_id[APDU_AID_LEN] = {0}; + int aid_len = 0; + CLIGetHexWithReturn(ctx, 6, applet_id, &aid_len); + if (aid_len == 0) { + memcpy(applet_id, PIV_APPLET, sizeof(PIV_APPLET)); + aid_len = sizeof(PIV_APPLET); + } + + CLIParserFree(ctx); + + SetAPDULogging(APDULogging); + + return PivSelect(channel, activateField, leaveSignalON, decodeTLV, false, applet_id, aid_len); +} + +static int CmdPIVGetData(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "piv getdata", + "Get a data container of a given tag", + "piv getdata -s 5fc102 -> select card, select applet, get card holder unique identifer\n" + "piv getdata -st 5fc102 -> select card, select applet, get card holder unique identifer, show result in TLV\n"); + + void *argtable[] = { + arg_param_begin, + arg_lit0("sS", "select", "Activate field and select applet"), + arg_lit0("kK", "keep", "Keep field for next command"), + arg_lit0("aA", "apdu", "Show APDU requests and responses"), + arg_lit0("tT", "tlv", "TLV decode results"), + arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_str0(NULL, "aid", "", "Applet ID to select. By default A0000003080000100 will be used"), + arg_str1(NULL, NULL, "", "Tag ID to read, between 1 and 3 bytes."), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + bool activateField = arg_get_lit(ctx, 1); + bool leaveSignalON = arg_get_lit(ctx, 2); + bool APDULogging = arg_get_lit(ctx, 3); + bool decodeTLV = arg_get_lit(ctx, 4); + Iso7816CommandChannel channel = CC_CONTACTLESS; + if (arg_get_lit(ctx, 5)) + channel = CC_CONTACT; + PrintChannel(channel); + + uint8_t applet_id[APDU_AID_LEN] = {0}; + int aid_len = 0; + CLIGetHexWithReturn(ctx, 6, applet_id, &aid_len); + if (aid_len == 0) { + memcpy(applet_id, PIV_APPLET, sizeof(PIV_APPLET)); + aid_len = sizeof(PIV_APPLET); + } + + uint8_t tag[4] = {0}; + int tag_len = 0; + CLIGetHexWithReturn(ctx, 7, tag, &tag_len); + + CLIParserFree(ctx); + + if ((tag_len < 1) || (tag_len > 3)) { + PrintAndLogEx(WARNING, "Tag should be between 1 and 3 bytes. Got %i", tag_len); + return PM3_EINVARG; + } + + SetAPDULogging(APDULogging); + + int res = 0; + if (activateField == true) { + res = PivSelect(channel, activateField, true, decodeTLV, true, applet_id, aid_len); + if (res != PM3_SUCCESS) { + if (leaveSignalON == false) { + DropFieldEx(channel); + } + return res; + } + } + res = PivGetDataByTagAndPrint(channel, tag, tag_len, decodeTLV, false); + if (leaveSignalON == false) { + DropFieldEx(channel); + } + return res; +} + +static int CmdPIVList(const char *Cmd) { + return CmdTraceListAlias(Cmd, "piv", "7816"); +} + +static command_t CommandTable[] = { + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"select", CmdPIVSelect, IfPm3Iso14443, "Select the PIV applet"}, + {"getdata", CmdPIVGetData, IfPm3Iso14443, "Gets a container on a PIV card"}, + + {"list", CmdPIVList, AlwaysAvailable, "List ISO7816 history"}, + {NULL, NULL, NULL, NULL} +}; + +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return PM3_SUCCESS; +} + +int CmdPIV(const char *Cmd) { + clearCommandBuffer(); + return CmdsParse(CommandTable, Cmd); +} + diff --git a/client/src/cmdpiv.h b/client/src/cmdpiv.h new file mode 100644 index 000000000..13b5fffe9 --- /dev/null +++ b/client/src/cmdpiv.h @@ -0,0 +1,26 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// PIV commands +//----------------------------------------------------------------------------- + +#ifndef CMDPIV_H__ +#define CMDPIV_H__ + +#include "common.h" + +int CmdPIV(const char *Cmd); + +#endif From 663fd4efc9696904b3ebe70d2b9dc7c5444a942b Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 18:28:53 +0100 Subject: [PATCH 043/924] Remove unused error code. Will be added back for the PIN check command --- client/src/cmdpiv.c | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index 9e800055a..cd0af5ba9 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -35,7 +35,6 @@ static int CmdHelp(const char *Cmd); static const uint16_t APDU_RES_SUCCESS = 0x9000; static const uint16_t APDU_RES_NOT_FOUND = 0x6A82; static const uint16_t APDU_RES_SECURITY = 0x6982; -static const uint16_t APDU_RES_PIN_BLOCKED = 0x6983; static uint8_t PIV_APPLET[9] = "\xA0\x00\x00\x03\x08\x00\x00\x10\x00"; From e9d461947e876ce7716d71e971dfe0f72c8fca9b Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 18:31:12 +0100 Subject: [PATCH 044/924] Add changelog and fix my github handle --- CHANGELOG.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2875edde..5192c890d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,17 +3,18 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Add support for PIV commands, over wired and contactless interfaces (@jmichelp) - Add `--shallow` option to `hf iclass` reader commands to do shallow (ASK) reader modulation instead of OOK (@nvx) - Improved NXP SLI/SLIX series tag identification (@nvx) - Fixed buffer overflow in "lf em 4x05 sniff" (@HeinrichsH) - - Fixed potential NULL array printing (@jmichel) - - Added PIV aid to resource file (@jmichel) - - Fixed failing compilation on Proxspace environment due to how python is initialized (@jmichel) - - Fixed length check in sim module communications (@jmichel) + - Fixed potential NULL array printing (@jmichelp) + - Added PIV aid to resource file (@jmichelp) + - Fixed failing compilation on Proxspace environment due to how python is initialized (@jmichelp) + - Fixed length check in sim module communications (@jmichelp) - Changed timings in i2c.c when communicating with sim module (@iceman1001) - - Moved to non-deprecated API to initialize Python interpreter (@jmichel) + - Moved to non-deprecated API to initialize Python interpreter (@jmichelp) - Changed `sc upgrade` updated firmware v4.13 (RDV40) - frame buffer is now 384 bytes (@sentiprox) - - Fixed contact interface / smartcard APDU chaining logic and allow 256 bytes ADPU payload. Need SIM firmware 4.13 to work (@jmichel) + - Fixed contact interface / smartcard APDU chaining logic and allow 256 bytes ADPU payload. Need SIM firmware 4.13 to work (@jmichelp) - Fixed `lf hitag dump` - Should now work as described in the command help (@natmchugh) - Fixed SPI flash overflow when loading dictionnaries into flash. Breaking change: added 1 more sector for Mifare - dictionnaries should be loaded again (@jmichelp) - Added `hf mf gload, gsave, ggetblk, gsetblk` for Gen4 GTU in mifare classic mode (@DidierA) From efc685864ad2bfe59dff21b122ba3ede6ccef53f Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 21:23:22 +0100 Subject: [PATCH 045/924] Add PIV command to scan all data containers on a PIV card. --- client/src/cmdpiv.c | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index cd0af5ba9..7295269d2 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -786,6 +786,70 @@ static int CmdPIVGetData(const char *Cmd) { return res; } +static int CmdPIVScan(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "piv scan", + "Scan a PIV card for known containers", + "piv scan -s -> select card, select applet and run scan\n" + "piv scan -st --aid a00000030800001000 -> select card, select applet a00000030800001000, show result of the scan in TLV\n"); + + void *argtable[] = { + arg_param_begin, + arg_lit0("sS", "select", "Activate field and select applet"), + arg_lit0("kK", "keep", "Keep field for next command"), + arg_lit0("aA", "apdu", "Show APDU requests and responses"), + arg_lit0("tT", "tlv", "TLV decode results"), + arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_str0(NULL, "aid", "", "Applet ID to select. By default A0000003080000100 will be used"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + bool activateField = arg_get_lit(ctx, 1); + bool leaveSignalON = arg_get_lit(ctx, 2); + bool APDULogging = arg_get_lit(ctx, 3); + bool decodeTLV = arg_get_lit(ctx, 4); + Iso7816CommandChannel channel = CC_CONTACTLESS; + if (arg_get_lit(ctx, 5)) + channel = CC_CONTACT; + PrintChannel(channel); + + uint8_t applet_id[APDU_AID_LEN] = {0}; + int aid_len = 0; + CLIGetHexWithReturn(ctx, 6, applet_id, &aid_len); + if (aid_len == 0) { + memcpy(applet_id, PIV_APPLET, sizeof(PIV_APPLET)); + aid_len = sizeof(PIV_APPLET); + } + + CLIParserFree(ctx); + + SetAPDULogging(APDULogging); + if (aid_len == 0) { + memcpy(applet_id, PIV_APPLET, sizeof(PIV_APPLET)); + aid_len = sizeof(PIV_APPLET); + } + int res = 0; + if (activateField == true) { + res = PivSelect(channel, activateField, true, decodeTLV, true, applet_id, aid_len); + if (res != PM3_SUCCESS) { + if (leaveSignalON == false) { + DropFieldEx(channel); + } + return res; + } + } + + for (int i = 0; PIV_CONTAINERS[i].len != 0; i++) { + PivGetDataByCidAndPrint(channel, &(PIV_CONTAINERS[i]), decodeTLV, false); + PrintAndLogEx(NORMAL, ""); + } + if (leaveSignalON == false) { + DropFieldEx(channel); + } + return PM3_SUCCESS; +} + static int CmdPIVList(const char *Cmd) { return CmdTraceListAlias(Cmd, "piv", "7816"); } @@ -794,6 +858,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"select", CmdPIVSelect, IfPm3Iso14443, "Select the PIV applet"}, {"getdata", CmdPIVGetData, IfPm3Iso14443, "Gets a container on a PIV card"}, + {"scan", CmdPIVScan, IfPm3Iso14443, "Scan PIV card for known containers"}, {"list", CmdPIVList, AlwaysAvailable, "List ISO7816 history"}, {NULL, NULL, NULL, NULL} From e5f6e34632cd70b90237e2bb2024592811f7fd29 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 21:25:48 +0100 Subject: [PATCH 046/924] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5192c890d..5cda9db5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Add command `piv scan` which tries to read all known containers on PIV (@jmichelp) - Add support for PIV commands, over wired and contactless interfaces (@jmichelp) - Add `--shallow` option to `hf iclass` reader commands to do shallow (ASK) reader modulation instead of OOK (@nvx) - Improved NXP SLI/SLIX series tag identification (@nvx) From 15b541c2ea19ce038d35a5268356fb9ed9e7c605 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 21:36:08 +0100 Subject: [PATCH 047/924] Add command `piv authsign` --- CHANGELOG.md | 1 + client/src/cmdpiv.c | 114 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cda9db5c..bc54763f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Add command `piv authsign` to get a buffer signed by the selected key (@jmichelp) - Add command `piv scan` which tries to read all known containers on PIV (@jmichelp) - Add support for PIV commands, over wired and contactless interfaces (@jmichelp) - Add `--shallow` option to `hf iclass` reader commands to do shallow (ASK) reader modulation instead of OOK (@nvx) diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index 7295269d2..937f6a369 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -653,6 +653,44 @@ static int PivGetDataByTagAndPrint(Iso7816CommandChannel channel, const uint8_t return PivGetDataByCidAndPrint(channel, &(PIV_CONTAINERS[idx]), decodeTLV, verbose); } +static int PivAuthenticateSign(Iso7816CommandChannel channel, uint8_t alg_id, uint8_t key_id, uint8_t nonce[], size_t nonce_len, void **result, bool decodeTLV, bool verbose) { + if (nonce_len > 0x7A) { + if (verbose == true) { + PrintAndLogEx(WARNING, "Nonce cannot exceed %d bytes. Got %d bytes.", 0x7a, nonce_len); + } + return PM3_EINVARG; + } + uint8_t apdu_buf[APDU_RES_LEN] = {0x7c, nonce_len + 4, 0x82, 0x00, 0x81, nonce_len}; + memcpy(&apdu_buf[6], nonce, nonce_len); + sAPDU_t apdu = { + 0x00, 0x87, alg_id, key_id, + 6 + nonce_len, apdu_buf + }; + + uint16_t sw = 0; + uint8_t buf[APDU_RES_LEN] = {0}; + size_t len = 0; + int res = Iso7816ExchangeEx(channel, false, true, apdu, false, 0, buf, APDU_RES_LEN, &len, &sw); + if (res != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Sending APDU failed with code %d", res); + return res; + } + if (sw != APDU_RES_SUCCESS) { + if (verbose == true) { + PrintAndLogEx(INFO, "Unexpected APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); + } + return PM3_EFAILED; + } + if (verbose == true) { + if (decodeTLV == true) { + PrintTLVFromBuffer(buf, len); + } else { + print_buffer(buf, len, 0); + } + } + return PM3_SUCCESS; +} + static int PivSelect(Iso7816CommandChannel channel, bool activateField, bool leaveFieldOn, bool decodeTLV, bool silent, uint8_t applet[], size_t appletLen) { uint8_t buf[APDU_RES_LEN] = {0}; size_t len = 0; @@ -786,6 +824,81 @@ static int CmdPIVGetData(const char *Cmd) { return res; } +static int CmdPIVAuthenticateSign(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "piv sign", + "Send a nonce and ask the PIV card to sign it", + "piv sign -sk -> select card, select applet, sign a NULL nonce\n"); + + void *argtable[] = { + arg_param_begin, + arg_lit0("sS", "select", "Activate field and select applet"), + arg_lit0("kK", "keep", "Keep field for next command"), + arg_lit0("aA", "apdu", "Show APDU requests and responses"), + arg_lit0("tT", "tlv", "TLV decode results"), + arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_str0(NULL, "aid", "", "Applet ID to select. By default A0000003080000100 will be used"), + arg_str1(NULL, "nonce", "", "Nonce to sign."), + arg_int0(NULL, "slot", "", "Slot number. Default will be 0x9E (card auth cert)."), + arg_int0(NULL, "alg", "", "Algorithm to use to sign. Example values: 06=RSA-1024, 07=RSA-2048, 11=ECC-P256 (default), 14=ECC-P384"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + bool activateField = arg_get_lit(ctx, 1); + bool leaveSignalON = arg_get_lit(ctx, 2); + bool APDULogging = arg_get_lit(ctx, 3); + bool decodeTLV = arg_get_lit(ctx, 4); + Iso7816CommandChannel channel = CC_CONTACTLESS; + if (arg_get_lit(ctx, 5)) + channel = CC_CONTACT; + PrintChannel(channel); + + uint8_t applet_id[APDU_AID_LEN] = {0}; + int aid_len = 0; + CLIGetHexWithReturn(ctx, 6, applet_id, &aid_len); + if (aid_len == 0) { + memcpy(applet_id, PIV_APPLET, sizeof(PIV_APPLET)); + aid_len = sizeof(PIV_APPLET); + } + + uint8_t nonce[APDU_RES_LEN] = {0}; + int nonce_len = 0; + CLIGetHexWithReturn(ctx, 7, nonce, &nonce_len); + + int key_slot = arg_get_int_def(ctx, 8, 0x9e); + int alg_id = arg_get_int_def(ctx, 9, 0x11); + + CLIParserFree(ctx); + + if (key_slot > 0xff) { + PrintAndLogEx(FAILED, "Key slot must fit on 1 byte."); + return PM3_EINVARG; + } + if (alg_id > 0xff) { + PrintAndLogEx(FAILED, "Algorithm ID must fit on 1 byte"); + return PM3_EINVARG; + } + + SetAPDULogging(APDULogging); + + int res = 0; + if (activateField == true) { + res = PivSelect(channel, activateField, true, decodeTLV, true, applet_id, aid_len); + if (res != PM3_SUCCESS) { + if (leaveSignalON == false) { + DropFieldEx(channel); + } + return res; + } + } + res = PivAuthenticateSign(channel, (uint8_t)(alg_id & 0xff), (uint8_t)(key_slot & 0xff), nonce, nonce_len, NULL, decodeTLV, true); + if (leaveSignalON == false) { + DropFieldEx(channel); + } + return res; +} + static int CmdPIVScan(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "piv scan", @@ -858,6 +971,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"select", CmdPIVSelect, IfPm3Iso14443, "Select the PIV applet"}, {"getdata", CmdPIVGetData, IfPm3Iso14443, "Gets a container on a PIV card"}, + {"authsign", CmdPIVAuthenticateSign, IfPm3Iso14443, "Authenticate with the card"}, {"scan", CmdPIVScan, IfPm3Iso14443, "Scan PIV card for known containers"}, {"list", CmdPIVList, AlwaysAvailable, "List ISO7816 history"}, From a7980d8e8a0693ca2424e8fe2a93470f8c7a852e Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 21:52:26 +0100 Subject: [PATCH 048/924] Use a typed constant and see if that makes CodeQL happy :) --- client/src/cmdpiv.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index 937f6a369..1c9dc701a 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -654,9 +654,10 @@ static int PivGetDataByTagAndPrint(Iso7816CommandChannel channel, const uint8_t } static int PivAuthenticateSign(Iso7816CommandChannel channel, uint8_t alg_id, uint8_t key_id, uint8_t nonce[], size_t nonce_len, void **result, bool decodeTLV, bool verbose) { - if (nonce_len > 0x7A) { + const size_t MAX_NONCE_LEN = 0x7a; + if (nonce_len > MAX_NONCE_LEN) { if (verbose == true) { - PrintAndLogEx(WARNING, "Nonce cannot exceed %d bytes. Got %d bytes.", 0x7a, nonce_len); + PrintAndLogEx(WARNING, "Nonce cannot exceed %d bytes. Got %d bytes.", MAX_NONCE_LEN, nonce_len); } return PM3_EINVARG; } From 16410b064d7ad97ced4ccce5203781fe02bb2680 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Fri, 6 Jan 2023 22:06:07 +0100 Subject: [PATCH 049/924] Fix format string to please CodeQL --- client/src/cmdpiv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index 1c9dc701a..d73c52fee 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -657,7 +657,7 @@ static int PivAuthenticateSign(Iso7816CommandChannel channel, uint8_t alg_id, ui const size_t MAX_NONCE_LEN = 0x7a; if (nonce_len > MAX_NONCE_LEN) { if (verbose == true) { - PrintAndLogEx(WARNING, "Nonce cannot exceed %d bytes. Got %d bytes.", MAX_NONCE_LEN, nonce_len); + PrintAndLogEx(WARNING, "Nonce cannot exceed %zu bytes. Got %zu bytes.", MAX_NONCE_LEN, nonce_len); } return PM3_EINVARG; } From 9888eef8dc86f87c5fa9ec6038f311ff2c191bd6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 6 Jan 2023 23:53:25 +0100 Subject: [PATCH 050/924] changed hf mf wrbl and view command to look for strict readonly ACL in the data. --- CHANGELOG.md | 2 + armsrc/i2c.c | 2 +- armsrc/mifarecmd.c | 2 +- client/luascripts/hf_i2c_plus_2k_utils.lua | 20 +- client/luascripts/hf_mf_ultimatecard.lua | 6 +- client/src/cmdhficlass.c | 2 +- client/src/cmdhfmf.c | 76 +++++++- client/src/cmdhfmfu.c | 2 +- client/src/cmdlfhitag.c | 4 +- client/src/cmdscript.c | 2 +- client/src/cmdtrace.c | 16 +- client/src/mifare/mifare4.c | 39 ++-- client/src/mifare/mifare4.h | 1 + client/src/pm3line_vocabulory.h | 6 + client/src/ui.h | 2 +- doc/commands.json | 217 ++++++++++++++++----- doc/commands.md | 16 +- 17 files changed, 313 insertions(+), 102 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc54763f8..4278b6c12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mf wrbl` - now checks for strict readonly ACL's in the data to write (@iceman1001) + - Changed `hf mf view` - verbose printing if strict readonly ACL's exists in dump file (@iceman1001) - Add command `piv authsign` to get a buffer signed by the selected key (@jmichelp) - Add command `piv scan` which tries to read all known containers on PIV (@jmichelp) - Add support for PIV commands, over wired and contactless interfaces (@jmichelp) diff --git a/armsrc/i2c.c b/armsrc/i2c.c index 491e12a04..ca3cb46fd 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -749,7 +749,7 @@ bool GetATR(smart_card_atr_t *card_ptr, bool verbose) { } } - card_ptr->atr_len = (uint8_t) (len & 0xff); + card_ptr->atr_len = (uint8_t)(len & 0xff); if (verbose) { LogTrace(card_ptr->atr, card_ptr->atr_len, 0, 0, NULL, false); } diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 3db9112af..74e75ddce 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2356,7 +2356,7 @@ void MifareCIdent(bool is_mfc) { uint8_t rats[4] = { ISO14443A_CMD_RATS, 0x80, 0x31, 0x73 }; uint8_t rdblf0[4] = { ISO14443A_CMD_READBLOCK, 0xF0, 0x8D, 0x5f}; uint8_t rdbl00[4] = { ISO14443A_CMD_READBLOCK, 0x00, 0x02, 0xa8}; - uint8_t gen4GetConf[8] = { GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; + uint8_t gen4GetConf[8] = { GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); uint8_t *buf = BigBuf_malloc(PM3_CMD_DATA_SIZE); uint8_t *uid = BigBuf_malloc(10); diff --git a/client/luascripts/hf_i2c_plus_2k_utils.lua b/client/luascripts/hf_i2c_plus_2k_utils.lua index 7e6b9b300..5e7652316 100644 --- a/client/luascripts/hf_i2c_plus_2k_utils.lua +++ b/client/luascripts/hf_i2c_plus_2k_utils.lua @@ -23,7 +23,7 @@ author = 'Shain Lakin' version = 'v1.0.0' desc =[[ -This script can be used to read blocks, write blocks, dump sectors, +This script can be used to read blocks, write blocks, dump sectors, or write a files hex bytes to sector 0 or 1 on the NTAG I2C PLUS 2K tag. ]] @@ -32,7 +32,7 @@ example =[[ Read block 04 from sector 1: script run hf_i2c_plus_2k_utils -m r -s 1 -b 04 - + Write FFFFFFFF to block A0 sector 1: script run hf_i2c_plus_2k_utils -m w -s 1 -b A0 -d FFFFFFFF @@ -45,15 +45,15 @@ example =[[ ]] usage = [[ - Read mode: + Read mode: script run hf_i2c_plus_2k_utils -m r -s -b - - Write mode: + + Write mode: script run hf_i2c_plus_2k_utils -m w -s -b -d - + Dump mode: script run hf_i2c_plus_2k_utils -m d -s - + File mode: script run hf_i2c_plus_2k_utils -m f -s -f @@ -124,7 +124,7 @@ end --- ---- Function to connect +--- Function to connect local function connect() core.clearCommandBuffer() @@ -189,7 +189,7 @@ local function filewriter(file,sector) end_char = 8 block_counter = 4 -- NTAG_I2C_PLUS_2K:SECTOR_0:225,SECTOR_1:255 - end_block = 225 + end_block = 225 connect() select_sector(sector) for count = 1, len do @@ -296,7 +296,7 @@ local function main(args) elseif mode == 'd' then dump(sector,uid) end - + else return print(usage) end diff --git a/client/luascripts/hf_mf_ultimatecard.lua b/client/luascripts/hf_mf_ultimatecard.lua index 4a70935bb..aec47e9d0 100644 --- a/client/luascripts/hf_mf_ultimatecard.lua +++ b/client/luascripts/hf_mf_ultimatecard.lua @@ -847,13 +847,13 @@ end -- returns true if b is the index of a sector trailer local function mfIsSectorTrailer(b) n=b+1 - if (n < 32*4 ) then - if (n % 4 == 0) then return true + if (n < 32*4 ) then + if (n % 4 == 0) then return true else return false end end - if (n % 16 == 0) then return true + if (n % 16 == 0) then return true end return false diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 4e555f909..94d710f98 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -3968,7 +3968,7 @@ static int CmdHFiClassEncode(const char *Cmd) { return PM3_ESOFT; } - // iceman: only for formats w length smaller than 37. + // iceman: only for formats w length smaller than 37. // Needs a check. // increase length to allow setting bit just above real data diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 51a9a13f0..eba190b5e 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -238,7 +238,7 @@ static bool mfc_value(const uint8_t *d, int32_t *val) { } static void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose) { - if (blockno == 0) { + if (blockno == 0) { PrintAndLogEx(INFO, "%3d | " _RED_("%s"), blockno, sprint_hex_ascii(d, MFBLOCK_SIZE)); } else if (mfIsSectorTrailer(blockno)) { PrintAndLogEx(INFO, "%3d | " _YELLOW_("%s"), blockno, sprint_hex_ascii(d, MFBLOCK_SIZE)); @@ -375,6 +375,31 @@ static bool mf_write_block(const uint8_t *key, uint8_t keytype, uint8_t blockno, return (resp.oldarg[0] & 0xff); } +static void mf_analyse_acl(uint16_t n, uint8_t *d) { + + for (uint16_t b = 3; b < n; b++) { + if (mfIsSectorTrailer(b) == false) { + continue; + } + + uint8_t block[MFBLOCK_SIZE] = {0x00}; + memcpy(block, d + (b * MFBLOCK_SIZE), MFBLOCK_SIZE); + + // ensure access right isn't messed up. + if (mfValidateAccessConditions(&block[6]) == false) { + PrintAndLogEx(WARNING, "Invalid Access Conditions on sector " _YELLOW_("%u"), mfSectorNum(b)); + } + + // Warn if ACL is strict read-only + uint8_t bar = mfNumBlocksPerSector(mfSectorNum(b)); + for (uint8_t foo = 0; foo < bar; foo++) { + if (mfReadOnlyAccessConditions(foo, &block[6])) { + PrintAndLogEx(WARNING, _YELLOW_("s%u / b%u") " - Strict ReadOnly Access Conditions detected", mfSectorNum(b), b - bar + 1 + foo); + } + } + } +} + static int CmdHF14AMfAcl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf acl", @@ -539,6 +564,32 @@ static int CmdHF14AMfWrBl(const char *Cmd) { uint8_t blockno = (uint8_t)b; + // Warn if ACL is strict read-only + if (mfIsSectorTrailer(blockno)) { + PrintAndLogEx(INFO, "Sector trailer (ST) write detected"); + + // ensure access right isn't messed up. + if (mfValidateAccessConditions(&block[6]) == false) { + PrintAndLogEx(WARNING, "Invalid Access Conditions detected, replacing by default values"); + memcpy(block + 6, "\xFF\x07\x80\x69", 4); + } + + bool ro_detected = false; + uint8_t bar = mfNumBlocksPerSector(mfSectorNum(blockno)); + for (uint8_t foo = 0; foo < bar; foo++) { + if (mfReadOnlyAccessConditions(foo, &block[6])) { + PrintAndLogEx(WARNING, "Strict ReadOnly Access Conditions on block " _YELLOW_("%u") " detected", blockno - bar + 1 + foo); + ro_detected = true; + } + } + if (ro_detected) { + PrintAndLogEx(INFO, "Exiting, please run `" _YELLOW_("hf mf acl -d %s") "` to understand", sprint_hex_inrow(&block[6], 3)); + return PM3_EINVARG; + } else { + PrintAndLogEx(SUCCESS, "ST passed checks, continuing..."); + } + } + PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); PrintAndLogEx(INFO, "data: %s", sprint_hex(block, sizeof(block))); @@ -1172,7 +1223,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { PrintAndLogEx(INFO, "Restoring " _YELLOW_("%s")" to card", datafilename); - // main loop for restoreing. + // main loop for restoring. // a bit more complicated than needed // this is because of two things. // 1. we are setting keys from a key file or using the existing ones in the dump @@ -1182,7 +1233,6 @@ static int CmdHF14AMfRestore(const char *Cmd) { for (uint8_t b = 0; b < mfNumBlocksPerSector(s); b++) { uint8_t bldata[MFBLOCK_SIZE] = {0x00}; - memcpy(bldata, dump, MFBLOCK_SIZE); // if sector trailer @@ -1209,6 +1259,13 @@ static int CmdHF14AMfRestore(const char *Cmd) { PrintAndLogEx(WARNING, "Invalid Access Conditions on sector %i, replacing by default values", s); memcpy(bldata + 6, "\xFF\x07\x80\x69", 4); } + + // Warn if ACL is strict read-only + for (uint8_t foo = 0; foo < mfNumBlocksPerSector(s); foo++) { + if (mfReadOnlyAccessConditions(foo, &bldata[6])) { + PrintAndLogEx(WARNING, "Strict ReadOnly Access Conditions on block " _YELLOW_("%u") " detected", foo); + } + } } if (bytes_read) { @@ -6818,6 +6875,7 @@ static int CmdHF14AMfView(const char *Cmd) { if (verbose) { mf_print_keys(block_cnt, dump); + mf_analyse_acl(block_cnt, dump); } int sector = DetectHID(dump, 0x4910); @@ -6836,7 +6894,7 @@ static int CmdHF14AMfView(const char *Cmd) { } // allocate memory - uint8_t* d = calloc(bytes_read, sizeof(uint8_t)); + uint8_t *d = calloc(bytes_read, sizeof(uint8_t)); if (d == NULL) { return PM3_EMALLOC; } @@ -7324,8 +7382,8 @@ static int CmdHF14AGen4Save(const char *Cmd) { int fnlen = 0; char filename[FILE_PATH_SIZE]; CLIParamStrToBuf(arg_get_str(ctx, 6), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); - - bool fill_emulator = arg_get_lit(ctx,7); + + bool fill_emulator = arg_get_lit(ctx, 7); CLIParserFree(ctx); // validations @@ -7420,12 +7478,12 @@ static int CmdHF14AGen4Save(const char *Cmd) { } PrintAndLogEx(NORMAL, ""); - + if (fill_emulator) { PrintAndLogEx(INFO, "uploading to emulator memory" NOLF); // fast push mode g_conn.block_after_ACK = true; - + size_t offset = 0; int cnt = 0; uint16_t bytes_left = bytes ; @@ -7454,7 +7512,7 @@ static int CmdHF14AGen4Save(const char *Cmd) { offset += MFBLOCK_SIZE; bytes_left -= MFBLOCK_SIZE; } - + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", bytes); } diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index c3701a76d..e948360e6 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -4154,7 +4154,7 @@ static int CmdHF14AMfuEView(const char *Cmd) { if (override_end) { ++end ; - } else { + } else { end = dump->pages ; } diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index ba7b72195..66fb3ea42 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -857,12 +857,12 @@ static int CmdLFHitag2Dump(const char *Cmd) { memcpy(htd.pwd.password, key, sizeof(htd.pwd.password)); PrintAndLogEx(INFO, "Authenticating in password mode"); } - + uint16_t cmd = CMD_LF_HITAG_READER; clearCommandBuffer(); SendCommandMIX(cmd, htf, 0, 0, &htd, sizeof(htd)); PacketResponseNG resp; - + if (WaitForResponseTimeout(CMD_ACK, &resp, 2000) == false) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); return PM3_ETIMEOUT; diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 7a5a59130..35640922e 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -404,7 +404,7 @@ static int CmdScriptRun(const char *Cmd) { PyImport_AppendInittab("_pm3", PyInit__pm3); #endif #if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 10 - Py_Initialize(); + Py_Initialize(); #else PyConfig py_conf; PyConfig_InitIsolatedConfig(&py_conf); diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 5fbf90b0d..af97e8466 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -900,16 +900,16 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (use_us) { PrintAndLogEx(NORMAL, " %10.1f | %10.1f | %s |fdt (Frame Delay Time): " _YELLOW_("%.1f"), - (float)time1 / 13.56, - (float)time2 / 13.56, - " ", - (float)(next_hdr->timestamp - end_of_transmission_timestamp) / 13.56); + (float)time1 / 13.56, + (float)time2 / 13.56, + " ", + (float)(next_hdr->timestamp - end_of_transmission_timestamp) / 13.56); } else { PrintAndLogEx(NORMAL, " %10u | %10u | %s |fdt (Frame Delay Time): " _YELLOW_("%d"), - time1, - time2, - " ", - (next_hdr->timestamp - end_of_transmission_timestamp)); + time1, + time2, + " ", + (next_hdr->timestamp - end_of_transmission_timestamp)); } } diff --git a/client/src/mifare/mifare4.c b/client/src/mifare/mifare4.c index a1427bc9f..1ac6b6fed 100644 --- a/client/src/mifare/mifare4.c +++ b/client/src/mifare/mifare4.c @@ -74,22 +74,37 @@ AccessConditions_t MFAccessConditionsTrailer[] = { }; bool mfValidateAccessConditions(const uint8_t *data) { - uint8_t ndata1 = (data[0]) & 0x0f; - uint8_t ndata2 = (data[0] >> 4) & 0x0f; - uint8_t ndata3 = (data[1]) & 0x0f; - uint8_t data1 = (data[1] >> 4) & 0x0f; - uint8_t data2 = (data[2]) & 0x0f; - uint8_t data3 = (data[2] >> 4) & 0x0f; + uint8_t nd1 = NIBBLE_LOW(data[0]); + uint8_t nd2 = NIBBLE_HIGH(data[0]); + uint8_t nd3 = NIBBLE_LOW(data[1]); + uint8_t d1 = NIBBLE_HIGH(data[1]); + uint8_t d2 = NIBBLE_LOW(data[2]); + uint8_t d3 = NIBBLE_HIGH(data[2]); - return ((ndata1 == (data1 ^ 0xF)) && (ndata2 == (data2 ^ 0xF)) && (ndata3 == (data3 ^ 0xF))); + return ((nd1 == (d1 ^ 0xF)) && (nd2 == (d2 ^ 0xF)) && (nd3 == (d3 ^ 0xF))); +} +bool mfReadOnlyAccessConditions(uint8_t blockn, const uint8_t *data) { + + uint8_t d1 = NIBBLE_HIGH(data[1]) >> blockn; + uint8_t d2 = NIBBLE_LOW(data[2]) >> blockn; + uint8_t d3 = NIBBLE_HIGH(data[2]) >> blockn; + uint8_t cond = (d1 & 0x01) << 2 | (d2 & 0x01) << 1 | (d3 & 0x01); + + if (blockn == 3) { + if ((cond == 0x02) || (cond == 0x06) || (cond == 0x07)) return true; + } else { + if ((cond == 0x02) || (cond == 0x05)) return true; + } + return false; } -const char *mfGetAccessConditionsDesc(uint8_t blockn, const uint8_t *data) { - uint8_t data1 = ((data[1] >> 4) & 0x0f) >> blockn; - uint8_t data2 = ((data[2]) & 0x0f) >> blockn; - uint8_t data3 = ((data[2] >> 4) & 0x0f) >> blockn; - uint8_t cond = (data1 & 0x01) << 2 | (data2 & 0x01) << 1 | (data3 & 0x01); +const char *mfGetAccessConditionsDesc(uint8_t blockn, const uint8_t *data) { + uint8_t d1 = NIBBLE_HIGH(data[1]) >> blockn; + uint8_t d2 = NIBBLE_LOW(data[2]) >> blockn; + uint8_t d3 = NIBBLE_HIGH(data[2]) >> blockn; + + uint8_t cond = (d1 & 0x01) << 2 | (d2 & 0x01) << 1 | (d3 & 0x01); if (blockn == 3) { for (int i = 0; i < ARRAYLEN(MFAccessConditionsTrailer); i++) diff --git a/client/src/mifare/mifare4.h b/client/src/mifare/mifare4.h index 7905f3ab6..489add9f3 100644 --- a/client/src/mifare/mifare4.h +++ b/client/src/mifare/mifare4.h @@ -71,6 +71,7 @@ int MFPGetSignature(bool activateField, bool leaveSignalON, uint8_t *dataout, in int MFPGetVersion(bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen); bool mfValidateAccessConditions(const uint8_t *data); +bool mfReadOnlyAccessConditions(uint8_t blockn, const uint8_t *data); const char *mfGetAccessConditionsDesc(uint8_t blockn, const uint8_t *data); uint8_t mfNumBlocksPerSector(uint8_t sectorNo); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 6b15007c3..de0cb6ace 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -349,6 +349,7 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mf gen3freeze" }, { 0, "hf mf ggetblk" }, { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, { 0, "hf mf gsetblk" }, { 0, "hf mf gview" }, { 0, "hf mf ndefformat" }, @@ -736,6 +737,11 @@ const static vocabulory_t vocabulory[] = { { 0, "nfc barcode read" }, { 0, "nfc barcode sim" }, { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv scan" }, + { 1, "piv list" }, { 1, "smart help" }, { 1, "smart list" }, { 0, "smart info" }, diff --git a/client/src/ui.h b/client/src/ui.h index 7aff98eba..4042550b3 100644 --- a/client/src/ui.h +++ b/client/src/ui.h @@ -36,7 +36,7 @@ typedef enum emojiMode {EMO_ALIAS, EMO_EMOJI, EMO_ALTTEXT, EMO_NONE} emojiMode_t typedef enum clientdebugLevel {cdbOFF, cdbSIMPLE, cdbFULL} clientdebugLevel_t; // typedef enum devicedebugLevel {ddbOFF, ddbERROR, ddbINFO, ddbDEBUG, ddbEXTENDED} devicedebugLevel_t; - // last item spItemCount used to auto map to number of files +// last item spItemCount used to auto map to number of files typedef enum savePaths {spDefault, spDump, spTrace, spItemCount} savePaths_t; typedef struct {int x; int y; int h; int w;} qtWindow_t; diff --git a/doc/commands.json b/doc/commands.json index a94e5bc6a..7546493bb 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -1030,7 +1030,7 @@ }, "help": { "command": "help", - "description": "help Use ` help` for details of a command prefs { Edit client/device preferences... } -------- ----------------------- Technology ----------------------- analyse { Analyse utils... } data { Plot window / data buffer manipulation... } emv { EMV ISO-14443 / ISO-7816... } hf { High frequency commands... } hw { Hardware commands... } lf { Low frequency commands... } nfc { NFC commands... } reveng { CRC calculations from RevEng software... } smart { Smart card ISO-7816 commands... } script { Scripting commands... } trace { Trace manipulation... } wiegand { Wiegand format manipulation... } -------- ----------------------- General ----------------------- clear Clear screen hints Turn hints on / off msleep Add a pause in milliseconds rem Add a text line in log file quit exit Exit program", + "description": "help Use ` help` for details of a command prefs { Edit client/device preferences... } -------- ----------------------- Technology ----------------------- analyse { Analyse utils... } data { Plot window / data buffer manipulation... } emv { EMV ISO-14443 / ISO-7816... } hf { High frequency commands... } hw { Hardware commands... } lf { Low frequency commands... } nfc { NFC commands... } piv { PIV commands... } reveng { CRC calculations from RevEng software... } smart { Smart card ISO-7816 commands... } script { Scripting commands... } trace { Trace manipulation... } wiegand { Wiegand format manipulation... } -------- ----------------------- General ----------------------- clear Clear screen hints Turn hints on / off msleep Add a pause in milliseconds rem Add a text line in log file quit exit Exit program", "notes": [], "offline": true, "options": [], @@ -2916,9 +2916,10 @@ "-f, --file Dictionary file with default iclass keys", "--credit key is assumed to be the credit key", "--elite elite computations applied to key", - "--raw no computations applied to key (raw)" + "--raw no computations applied to key (raw)", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass chk [-h] -f [--credit] [--elite] [--raw]" + "usage": "hf iclass chk [-h] -f [--credit] [--elite] [--raw] [--shallow]" }, "hf iclass configcard": { "command": "hf iclass configcard", @@ -2970,9 +2971,10 @@ "--raw raw, the key is interpreted as raw block 3/4", "--nr replay of NR/MAC", "-z, --dense dense dump output style", - "--force force unsecure card read" + "--force force unsecure card read", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass dump [-hz] [-f ] [-k ] [--ki ] [--credit ] [--ci ] [--elite] [--raw] [--nr] [--force]" + "usage": "hf iclass dump [-hz] [-f ] [-k ] [--ki ] [--credit ] [--ci ] [--elite] [--raw] [--nr] [--force] [--shallow]" }, "hf iclass eload": { "command": "hf iclass eload", @@ -3008,9 +3010,10 @@ "--enckey 3DES transport key, 16 hex bytes", "--fc facility code", "--cn card number", - "-w, --wiegand see `wiegand list` for available formats" + "-w, --wiegand see `wiegand list` for available formats", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ]" + "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" }, "hf iclass encrypt": { "command": "hf iclass encrypt", @@ -3077,9 +3080,10 @@ ], "offline": true, "options": [ - "-h, --help This help" + "-h, --help This help", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass info [-h]" + "usage": "hf iclass info [-h] [--shallow]" }, "hf iclass list": { "command": "hf iclass list", @@ -3191,9 +3195,10 @@ "--elite elite computations applied to key", "--raw no computations applied to key", "--nr replay of NR/MAC", - "-v, --verbose verbose output" + "-v, --verbose verbose output", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass rdbl [-hv] [-k ] [--ki ] -b [--credit] [--elite] [--raw] [--nr]" + "usage": "hf iclass rdbl [-hv] [-k ] [--ki ] -b [--credit] [--elite] [--raw] [--nr] [--shallow]" }, "hf iclass reader": { "command": "hf iclass reader", @@ -3204,9 +3209,10 @@ "offline": false, "options": [ "-h, --help This help", - "-@ optional - continuous reader mode" + "-@ optional - continuous reader mode", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass reader [-h@]" + "usage": "hf iclass reader [-h@] [--shallow]" }, "hf iclass restore": { "command": "hf iclass restore", @@ -3227,9 +3233,10 @@ "--credit key is assumed to be the credit key", "--elite elite computations applied to key", "--raw no computations applied to key", - "-v, --verbose verbose output" + "-v, --verbose verbose output", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass restore [-hv] -f [-k ] [--ki ] --first --last [--credit] [--elite] [--raw]" + "usage": "hf iclass restore [-hv] -f [-k ] [--ki ] --first --last [--credit] [--elite] [--raw] [--shallow]" }, "hf iclass sim": { "command": "hf iclass sim", @@ -3301,9 +3308,10 @@ "--elite elite computations applied to key", "--raw no computations applied to key", "--nr replay of NR/MAC", - "-v, --verbose verbose output" + "-v, --verbose verbose output", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass wrbl [-hv] [-k ] [--ki ] -b -d [-m ] [--credit] [--elite] [--raw] [--nr]" + "usage": "hf iclass wrbl [-hv] [-k ] [--ki ] -b -d [-m ] [--credit] [--elite] [--raw] [--nr] [--shallow]" }, "hf jooki clone": { "command": "hf jooki clone", @@ -3391,6 +3399,20 @@ ], "usage": "hf jooki sim [-h] [-b ]" }, + "hf ksx6924 balance": { + "command": "hf ksx6924 balance", + "description": "Gets the current purse balance", + "notes": [ + "hf ksx6924 balance" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-k, --keep keep field ON for next command", + "-a, --apdu Show APDU requests and responses" + ], + "usage": "hf ksx6924 balance [-hka]" + }, "hf ksx6924 help": { "command": "hf ksx6924 help", "description": "help This help", @@ -3399,19 +3421,6 @@ "options": [], "usage": "" }, - "hf ksx6924 select": { - "command": "hf ksx6924 select", - "description": "Selects KS X 6924 application, and leaves field up", - "notes": [ - "hf ksx6924 select" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-a, --apdu Show APDU requests and responses" - ], - "usage": "hf ksx6924 select [-ha]" - }, "hf ksx6924 info": { "command": "hf ksx6924 info", "description": "Get info about a KS X 6924 transit card. This application is used by T-Money (South Korea) and Snapper+ (Wellington, New Zealand).", @@ -3426,23 +3435,9 @@ ], "usage": "hf ksx6924 info [-hka]" }, - "hf ksx6924 balance": { - "command": "hf ksx6924 balance", - "description": "Gets the current purse balance", - "notes": [ - "hf ksx6924 balance" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-k, --keep keep field ON for next command", - "-a, --apdu Show APDU requests and responses" - ], - "usage": "hf ksx6924 balance [-hka]" - }, "hf ksx6924 init": { "command": "hf ksx6924 init", - "description": "Perform transaction initialization (mpda)", + "description": "Perform transaction initialization with Mpda (Money of Purchase Transaction)", "notes": [ "hf ksx6924 init 000003e8 -> Mpda" ], @@ -3468,7 +3463,19 @@ ], "usage": "hf ksx6924 prec [-hka] " }, - + "hf ksx6924 select": { + "command": "hf ksx6924 select", + "description": "Selects KS X 6924 application, and leaves field up", + "notes": [ + "hf ksx6924 select" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-a, --apdu Show APDU requests and responses" + ], + "usage": "hf ksx6924 select [-ha]" + }, "hf legic crc": { "command": "hf legic crc", "description": "Calculates the legic crc8/crc16 on the given data", @@ -3971,7 +3978,7 @@ "--1k MIFARE Classic 1k / S50 (def)", "--2k MIFARE Classic/Plus 2k", "--4k MIFARE Classic 4k / S70", - "--emu from emulator memory" + "--emu to emulator memory" ], "usage": "hf mf csave [-h] [-f ] [--mini] [--1k] [--2k] [--4k] [--emu]" }, @@ -4348,6 +4355,27 @@ ], "usage": "hf mf gload [-hv] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu] [--start ] [--end ]" }, + "hf mf gsave": { + "command": "hf mf gsave", + "description": "Save `magic gen4 gtu` card memory into three files (BIN/EML/JSON)or into emulator memory", + "notes": [ + "hf mf gsave", + "hf mf gsave --4k", + "hf mf gsave -p DEADBEEF -f hf-mf-01020304.json" + ], + "offline": false, + "options": [ + "-h, --help This help", + "--mini MIFARE Classic Mini / S20", + "--1k MIFARE Classic 1k / S50 (def)", + "--2k MIFARE Classic/Plus 2k", + "--4k MIFARE Classic 4k / S70", + "-p, --pwd password 4bytes", + "-f, --file filename of dump", + "--emu to emulator memory" + ], + "usage": "hf mf gsave [-h] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu]" + }, "hf mf gsetblk": { "command": "hf mf gsetblk", "description": "Set block data on a magic gen4 GTU card", @@ -6176,7 +6204,7 @@ }, "hf mfu esave": { "command": "hf mfu esave", - "description": "Saves emulator memory to a MIFARE Ultralight/NTAG dump file (bin/eml/json) By default number of pages saved depends on defined tag type. You can overrife this with option --end.", + "description": "Saves emulator memory to a MIFARE Ultralight/NTAG dump file (bin/eml/json) By default number of pages saved depends on defined tag type. You can override this with option --end.", "notes": [ "hf mfu esave", "hf mfu esave --end 255 -> saves whole memory", @@ -6192,7 +6220,7 @@ }, "hf mfu eview": { "command": "hf mfu eview", - "description": "Displays emulator memory By default number of pages shown depends on defined tag type. You can overrife this with option --end.", + "description": "Displays emulator memory By default number of pages shown depends on defined tag type. You can override this with option --end.", "notes": [ "hf mfu eview", "hf mfu eview --end 255 -> dumps whole memory" @@ -10924,6 +10952,93 @@ ], "usage": "hf 14b ndefread [-hv] [-f ]" }, + "piv getdata": { + "command": "piv getdata", + "description": "Get a data container of a given tag", + "notes": [ + "piv getdata -s 5fc102 -> select card, select applet, get card holder unique identifer", + "piv getdata -st 5fc102 -> select card, select applet, get card holder unique identifer, show result in TLV" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-s, -S, --select Activate field and select applet", + "-k, -K, --keep Keep field for next command", + "-a, -A, --apdu Show APDU requests and responses", + "-t, -T, --tlv TLV decode results", + "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "--aid Applet ID to select. By default A0000003080000100 will be used", + " Tag ID to read, between 1 and 3 bytes." + ], + "usage": "piv getdata [-hskatw] [--aid ] " + }, + "piv help": { + "command": "piv help", + "description": "help This help list List ISO7816 history", + "notes": [], + "offline": true, + "options": [], + "usage": "" + }, + "piv list": { + "command": "piv list", + "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "notes": [ + "piv list --frame -> show frame delay times", + "piv list -1 -> use trace buffer" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-1, --buffer use data from trace buffer", + "--frame show frame delay times", + "-c mark CRC bytes", + "-r show relative times (gap and duration)", + "-u display times in microseconds instead of clock cycles", + "-x show hexdump to convert to pcap(ng)", + "or to import into Wireshark using encapsulation type \"ISO 14443\"", + "-f, --file filename of dictionary" + ], + "usage": "piv list [-h1crux] [--frame] [-f ]" + }, + "piv scan": { + "command": "piv scan", + "description": "Scan a PIV card for known containers", + "notes": [ + "piv scan -s -> select card, select applet and run scan", + "piv scan -st --aid a00000030800001000 -> select card, select applet a00000030800001000, show result of the scan in TLV" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-s, -S, --select Activate field and select applet", + "-k, -K, --keep Keep field for next command", + "-a, -A, --apdu Show APDU requests and responses", + "-t, -T, --tlv TLV decode results", + "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "--aid Applet ID to select. By default A0000003080000100 will be used" + ], + "usage": "piv scan [-hskatw] [--aid ]" + }, + "piv select": { + "command": "piv select", + "description": "Executes select applet command", + "notes": [ + "piv select -s -> select card, select applet", + "piv select -st --aid a00000030800001000 -> select card, select applet a00000030800001000, show result in TLV" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-s, -S, --select Activate field and select applet", + "-k, -K, --keep Keep field for next command", + "-a, -A, --apdu Show APDU requests and responses", + "-t, -T, --tlv TLV decode results", + "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "--aid Applet ID to select. By default A0000003080000100 will be used" + ], + "usage": "piv select [-hskatw] [--aid ]" + }, "prefs get barmode": { "command": "prefs get barmode", "description": "Get preference of HF/LF tune command styled output in the client", @@ -11616,8 +11731,8 @@ } }, "metadata": { - "commands_extracted": 732, + "commands_extracted": 738, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2022-11-20T20:19:15" + "extracted_on": "2023-01-06T21:37:50" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 4b91901f4..bb4c68869 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -370,7 +370,7 @@ Check column "offline" for their availability. |`hf ksx6924 select `|N |`Select application, and leave field up` |`hf ksx6924 info `|N |`Get info about a KS X 6924 (T-Money, Snapper+) transit card` |`hf ksx6924 balance `|N |`Get current purse balance` -|`hf ksx6924 init `|N |`Perform transaction initialization with Mpda (Money of Purchase Transaction)` +|`hf ksx6924 init `|N |`Perform transaction initialization with Mpda` |`hf ksx6924 prec `|N |`Send proprietary get record command (CLA=90, INS=4C)` @@ -512,6 +512,7 @@ Check column "offline" for their availability. |`hf mf gen3freeze `|N |`Perma lock UID changes. irreversible` |`hf mf ggetblk `|N |`Read block from card` |`hf mf gload `|N |`Load dump to card` +|`hf mf gsave `|N |`Save dump from card into file or emulator` |`hf mf gsetblk `|N |`Write block to card` |`hf mf gview `|N |`View card` |`hf mf ndefformat `|N |`Format MIFARE Classic Tag as NFC Tag` @@ -1333,6 +1334,19 @@ Check column "offline" for their availability. |`nfc barcode help `|Y |`This help` +### piv + + { PIV commands... } + +|command |offline |description +|------- |------- |----------- +|`piv help `|Y |`This help` +|`piv select `|N |`Select the PIV applet` +|`piv getdata `|N |`Gets a container on a PIV card` +|`piv scan `|N |`Scan PIV card for known containers` +|`piv list `|Y |`List ISO7816 history` + + ### reveng { CRC calculations from RevEng software... } From fd39493cac591d0263db8a805c952e1f5ab60564 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 6 Jan 2023 23:57:02 +0100 Subject: [PATCH 051/924] cppcheck fixes --- client/src/cmdhflist.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 68a050158..5a82db29e 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -942,14 +942,14 @@ void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { break; case MFDES_READ_DATA: if (data_size >= 7) { - snprintf(exp, size, "READ DATA (fileId %02x, offset %d, len %d)", data[0], MemLeToUint3byte(data + 1), MemLeToUint3byte(data + 4)); + snprintf(exp, size, "READ DATA (fileId %02x, offset %u, len %u)", data[0], MemLeToUint3byte(data + 1), MemLeToUint3byte(data + 4)); } else { snprintf(exp, size, "READ DATA"); } break; case MFDES_WRITE_DATA: if (data_size >= 7) { - snprintf(exp, size, "WRITE DATA (fileId %02x, offset %d, len %d)", data[0], MemLeToUint3byte(data + 1), MemLeToUint3byte(data + 4)); + snprintf(exp, size, "WRITE DATA (fileId %02x, offset %u, len %u)", data[0], MemLeToUint3byte(data + 1), MemLeToUint3byte(data + 4)); } else { snprintf(exp, size, "WRITE DATA"); } @@ -984,14 +984,14 @@ void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { break; case MFDES_WRITE_RECORD: if (data_size >= 7) { - snprintf(exp, size, "WRITE RECORD (fileId %02x, offset %d, len %d)", data[0], MemLeToUint3byte(data + 1), MemLeToUint3byte(data + 4)); + snprintf(exp, size, "WRITE RECORD (fileId %02x, offset %u, len %u)", data[0], MemLeToUint3byte(data + 1), MemLeToUint3byte(data + 4)); } else { snprintf(exp, size, "WRITE RECORD"); } break; case MFDES_READ_RECORDS: if (data_size >= 7) { - snprintf(exp, size, "READ RECORDS (fileId %02x, offset %d, len %d)", data[0], MemLeToUint3byte(data + 1), MemLeToUint3byte(data + 4)); + snprintf(exp, size, "READ RECORDS (fileId %02x, offset %u, len %u)", data[0], MemLeToUint3byte(data + 1), MemLeToUint3byte(data + 4)); } else { snprintf(exp, size, "READ RECORDS"); } @@ -1086,21 +1086,21 @@ void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { break; case MFDES_AUTHENTICATE: if (data_size >= 1) { - snprintf(exp, size, "AUTH NATIVE (keyNo %d)", data[0]); + snprintf(exp, size, "AUTH NATIVE (keyNo %u)", data[0]); } else { snprintf(exp, size, "AUTH NATIVE"); } break; // AUTHENTICATE_NATIVE case MFDES_AUTHENTICATE_ISO: if (data_size >= 1) { - snprintf(exp, size, "AUTH ISO (keyNo %d)", data[0]); + snprintf(exp, size, "AUTH ISO (keyNo %u)", data[0]); } else { snprintf(exp, size, "AUTH ISO"); } break; // AUTHENTICATE_STANDARD case MFDES_AUTHENTICATE_AES: if (data_size >= 1) { - snprintf(exp, size, "AUTH AES (keyNo %d)", data[0]); + snprintf(exp, size, "AUTH AES (keyNo %u)", data[0]); } else { snprintf(exp, size, "AUTH AES"); } @@ -1119,14 +1119,14 @@ void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { break; case MFDES_CHANGE_KEY: if (data_size >= 1) { - snprintf(exp, size, "CHANGE KEY (keyNo %d)", data[0]); + snprintf(exp, size, "CHANGE KEY (keyNo %u)", data[0]); } else { snprintf(exp, size, "CHANGE KEY"); } break; case MFDES_GET_KEY_VERSION: if (data_size >= 1) { - snprintf(exp, size, "GET KEY VERSION (keyNo %d)", data[0]); + snprintf(exp, size, "GET KEY VERSION (keyNo %u)", data[0]); } else { snprintf(exp, size, "GET KEY VERSION"); } From e6ecc5320fa41ca07523d9b6086613090dcf9eb5 Mon Sep 17 00:00:00 2001 From: nvx Date: Mon, 9 Jan 2023 00:57:28 +1000 Subject: [PATCH 052/924] Update armsrc and bootrom Makefiles with a .FORCE PHONY target for version_pm3.c This fixes issues in ProxSpace where the firmware .elf files are sometimes not rebuilt --- armsrc/Makefile | 4 ++-- bootrom/Makefile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index c0703ccf4..5024aa1de 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -185,7 +185,7 @@ showinfo: .DELETE_ON_ERROR: # version_pm3.c should be remade on every time fullimage.stage1.elf should be remade -version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) +version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE $(info [-] GEN $@) $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ @@ -257,7 +257,7 @@ uninstall: $(info [@] Uninstalling fullimage from $(DESTDIR)$(PREFIX)...) $(Q)$(INSTALLSUDO) $(RM) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)$(PATHSEP)$(INSTALLFWTAG) -.PHONY: all clean help install uninstall +.PHONY: all clean help install uninstall .FORCE help: @echo Multi-OS Makefile, you are running on $(DETECTED_OS) @echo Possible targets: diff --git a/bootrom/Makefile b/bootrom/Makefile index ec531f1af..edb0cc990 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -48,7 +48,7 @@ INSTALLFW = $(OBJDIR)/bootrom.elf OBJS = $(OBJDIR)/bootrom.s19 # version_pm3.c should be remade on every compilation -version_pm3.c: default_version_pm3.c +version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ @@ -82,7 +82,7 @@ uninstall: $(info [@] Uninstalling bootrom from $(DESTDIR)$(PREFIX)...) $(Q)$(INSTALLSUDO) $(RM) $(foreach fw,$(INSTALLFW),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)$(PATHSEP)$(notdir $(fw))) -.PHONY: all clean help install showinfo +.PHONY: all clean help install showinfo .FORCE help: @echo Multi-OS Makefile, you are running on $(DETECTED_OS) @echo Possible targets: From ab3a8f4121097eed4831989d00f2b786b7c72fa1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 8 Jan 2023 19:27:41 +0100 Subject: [PATCH 053/924] fix helptext --- client/luascripts/lf_ident_json.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/luascripts/lf_ident_json.lua b/client/luascripts/lf_ident_json.lua index fb0d82554..73794547c 100644 --- a/client/luascripts/lf_ident_json.lua +++ b/client/luascripts/lf_ident_json.lua @@ -6,7 +6,7 @@ local ac = require('ansicolors') copyright = '' author = "Christian Herrmann" -version = 'v1.0.0' +version = 'v1.0.1' desc = [[ This script loads a json format file, with the field "data" and a hexbyte array of data. Ie t55x7 dump, it tries to identify which system based on block1, and detect block0 settings. @@ -16,7 +16,7 @@ example = [[ script run lf_ident_json -i lf_t55xx.json ]] usage = [[ -script run lf_en4100_bulk.lua [-h] [-c] [-p password] [-s ] [-v] +script run lf_ident_json.lua [-h] [-c] [-p password] [-s ] [-v] ]] arguments = [[ -h : this help From 2206271ba3c3d042be8040538a85866f54b21c25 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 8 Jan 2023 19:29:02 +0100 Subject: [PATCH 054/924] renamed script to follow name convention --- .../{hf_mf_dump-luxeo.lua => hf_mf_dump_luxeo.lua} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename client/luascripts/{hf_mf_dump-luxeo.lua => hf_mf_dump_luxeo.lua} (98%) diff --git a/client/luascripts/hf_mf_dump-luxeo.lua b/client/luascripts/hf_mf_dump_luxeo.lua similarity index 98% rename from client/luascripts/hf_mf_dump-luxeo.lua rename to client/luascripts/hf_mf_dump_luxeo.lua index 2b2c5d9c7..aaf7d572f 100644 --- a/client/luascripts/hf_mf_dump-luxeo.lua +++ b/client/luascripts/hf_mf_dump_luxeo.lua @@ -1,7 +1,7 @@ --- -- This Lua script is designed to run with Iceman/RRG Proxmark3 fork -- Just copy hf_mf_dump-luxeo.lua to client/luascripts/ --- and run "script run hf_mf_dump-luxeo" +-- and run "script run hf_mf_dump_luxeo" -- requirements local cmds = require('commands') @@ -12,16 +12,16 @@ local ansicolors = require('ansicolors') copyright = '' author = '0xdrrb' -version = 'v0.1.2' +version = 'v0.1.3' desc = [[ This is a script that tries to dump and decrypt the data of a specific type of Mifare laundromat token. OBS! Tag must be on the antenna. ]] example = [[ - script run hf_mf_dump-luxeo + script run hf_mf_dump_luxeo ]] usage = [[ -script run hf_mf_dump-luxeo +script run hf_mf_dump_luxeo ]] arguments = [[ -h This help From 82d4b3194243a3873a0100ffdd3cbef6ccd52598 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 8 Jan 2023 19:30:55 +0100 Subject: [PATCH 055/924] renamed to follow name convention --- .../{hf_mfu_uidkeycalc-italy.lua => hf_mfu_uidkeycalc_italy.lua} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/luascripts/{hf_mfu_uidkeycalc-italy.lua => hf_mfu_uidkeycalc_italy.lua} (100%) diff --git a/client/luascripts/hf_mfu_uidkeycalc-italy.lua b/client/luascripts/hf_mfu_uidkeycalc_italy.lua similarity index 100% rename from client/luascripts/hf_mfu_uidkeycalc-italy.lua rename to client/luascripts/hf_mfu_uidkeycalc_italy.lua From d1aa57ac5d0c20d38b1c3e9e60f1e055ea77894b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 8 Jan 2023 19:31:22 +0100 Subject: [PATCH 056/924] update text --- client/luascripts/hf_mfu_uidkeycalc_italy.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/luascripts/hf_mfu_uidkeycalc_italy.lua b/client/luascripts/hf_mfu_uidkeycalc_italy.lua index 4777a186d..d2fbdadde 100644 --- a/client/luascripts/hf_mfu_uidkeycalc_italy.lua +++ b/client/luascripts/hf_mfu_uidkeycalc_italy.lua @@ -6,20 +6,20 @@ local ansicolors = require('ansicolors') copyright = '' author = "Iceman" -version = 'v1.0.1' +version = 'v1.0.2' desc = [[ This script calculates mifare Ultralight-EV1 pwd based on uid diversification for an Italian ticketsystem Algo not found by me. ]] example =[[ -- if called without, it reads tag uid - script run hf_mfu_uidkeycalc-italy + script run hf_mfu_uidkeycalc_italy -- - script run hf_mfu_uidkeycalc-italy -u 11223344556677 + script run hf_mfu_uidkeycalc_italy -u 11223344556677 ]] usage = [[ -script run hf_mfu_uidkeycalc-italy -h -u " +script run hf_mfu_uidkeycalc_italy -h -u " ]] arguments = [[ -h : this help From 19dd580b3b6e54da3ccbbcbbf90096e39666a8cc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 8 Jan 2023 21:52:30 +0100 Subject: [PATCH 057/924] adapt file path checks --- client/src/ui.c | 99 +++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/client/src/ui.c b/client/src/ui.c index 0ffabc341..00eb8d022 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -84,6 +84,43 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam int result; #ifdef _WIN32 struct _stat st; + // Mingw _stat fails if path ends with /, so let's use a stripped path + if (str_endswith(path, PATHSEP)) + + memset(path + (strlen(path) - strlen(PATHSEP)), 0x00, strlen(PATHSEP)); + result = _stat(path, &st); + strncat(path, PATHSEP, strlen(PATHSEP)); +} else { + result = _stat(path, &st); +} +#else + struct stat st; + result = stat(path, &st); +#endif +if ((result != 0) && create_home) { + +#ifdef _WIN32 + if (_mkdir(path)) +#else + if (mkdir(path, 0700)) +#endif + { + fprintf(stderr, "Could not create user directory %s\n", path); + free(path); + return PM3_EFILE; + } +} +if (subdir != NULL) { + pathlen += strlen(subdir); + char *tmp = realloc(path, pathlen * sizeof(char)); + if (tmp == NULL) { + //free(path); + return PM3_EMALLOC; + } + path = tmp; + strcat(path, subdir); + +#ifdef _WIN32 // Mingw _stat fails if path ends with /, so let's use a stripped path if (path[strlen(path) - 1] == '/') { path[strlen(path) - 1] = '\0'; @@ -93,7 +130,6 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam result = _stat(path, &st); } #else - struct stat st; result = stat(path, &st); #endif if ((result != 0) && create_home) { @@ -109,58 +145,23 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam return PM3_EFILE; } } - if (subdir != NULL) { - pathlen += strlen(subdir); - char *tmp = realloc(path, pathlen * sizeof(char)); - if (tmp == NULL) { - //free(path); - return PM3_EMALLOC; - } - path = tmp; - strcat(path, subdir); +} -#ifdef _WIN32 - // Mingw _stat fails if path ends with /, so let's use a stripped path - if (path[strlen(path) - 1] == '/') { - path[strlen(path) - 1] = '\0'; - result = _stat(path, &st); - path[strlen(path)] = '/'; - } else { - result = _stat(path, &st); - } -#else - result = stat(path, &st); -#endif - if ((result != 0) && create_home) { - -#ifdef _WIN32 - if (_mkdir(path)) -#else - if (mkdir(path, 0700)) -#endif - { - fprintf(stderr, "Could not create user directory %s\n", path); - free(path); - return PM3_EFILE; - } - } - } - - if (filename == NULL) { - *foundpath = path; - return PM3_SUCCESS; - } - pathlen += strlen(filename); - char *tmp = realloc(path, pathlen * sizeof(char)); - if (tmp == NULL) { - //free(path); - return PM3_EMALLOC; - } - path = tmp; - strcat(path, filename); +if (filename == NULL) { *foundpath = path; return PM3_SUCCESS; } +pathlen += strlen(filename); +char *tmp = realloc(path, pathlen *sizeof(char)); +if (tmp == NULL) { + //free(path); + return PM3_EMALLOC; +} +path = tmp; +strcat(path, filename); +*foundpath = path; +return PM3_SUCCESS; +} void PrintAndLogOptions(const char *str[][2], size_t size, size_t space) { char buff[2000] = "Options:\n"; From df05e28923a2674275d7f96bd35cd97ef11e990b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 8 Jan 2023 21:54:46 +0100 Subject: [PATCH 058/924] added a fingerprint test for OTP algos --- client/src/cmdhfmfu.c | 74 ++++++++++++++++++++++++++++++++++++++++--- common/generator.c | 6 ++++ common/generator.h | 2 ++ 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index e948360e6..00df6e710 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -65,7 +65,7 @@ static uint8_t default_3des_keys[][16] = { static uint8_t default_pwd_pack[][4] = { {0xFF, 0xFF, 0xFF, 0xFF}, // PACK 0x00,0x00 -- factory default - {0x4E, 0x45, 0x78, 0x54}, + {0x4E, 0x45, 0x78, 0x54}, // NExT }; static uint32_t UL_TYPES_ARRAY[] = { @@ -1144,6 +1144,46 @@ Lego Dimensions, E1 10 12 00 01 03 A0 0C 34 03 13 D1 01 0F 54 02 65 6E */ +typedef struct { + const char *desc; + uint8_t mpos; + uint8_t mlen; + const char *match; + uint32_t (*otp)(const uint8_t *uid); + const char *hint; +} mfu_otp_identify_t; + +static mfu_otp_identify_t mfu_otp_ident_table[] = { + { "SALTO", 12, 4, "534C544F", ul_c_otpgenA, NULL }, +// { "SAFLOK", 12, 4, NULL, ul_c_otpgenB, NULL }, +// { "VINGCARD", 12, 4, NULL, ul_c_otpgenC, NULL }, +// { "DORMA KABA", 12, 4, NULL, ul_c_otpgenD, NULL }, + { NULL, 0, 0, NULL, NULL, NULL } +}; + +static mfu_otp_identify_t *mfu_match_otp_fingerprint(uint8_t *data) { + uint8_t i = 0; + do { + int ml = 0; + uint8_t mtmp[40] = {0}; + + // static or dynamic created OTP to fingerprint. + if (mfu_otp_ident_table[i].match) { + param_gethex_to_eol(mfu_otp_ident_table[i].match, 0, mtmp, sizeof(mtmp), &ml); + } else { + uint32_t otp = mfu_otp_ident_table[i].otp(data); + num_to_bytes(otp, 4, mtmp); + } + + bool m2 = (memcmp(mtmp, data + mfu_otp_ident_table[i].mpos, mfu_otp_ident_table[i].mlen) == 0); + if (m2) { + PrintAndLogEx(DEBUG, "(fingerprint) found %s", mfu_otp_ident_table[i].desc); + return &mfu_otp_ident_table[i]; + } + } while (mfu_otp_ident_table[++i].desc); + return NULL; +} + typedef struct { const char *desc; const char *version; @@ -1184,7 +1224,7 @@ static mfu_identify_t mfu_ident_table[] = { "Snackworld", "0004040101000B03", 9, 7, "483000E1100600", NULL, NULL, - "hf mfu dump -k %08x" + "hf mfu dump -k" }, { "Amiibo", "0004040201001103", @@ -1324,15 +1364,36 @@ static int mfu_fingerprint(TagTypeUL_t tagtype, bool hasAuthKey, uint8_t *authke if (item) { PrintAndLogEx(SUCCESS, "Found " _GREEN_("%s"), item->desc); - if (item->Pwd) { + if (item->hint) { + if (item->Pwd) { + char s[40] = {0}; + snprintf(s, sizeof(s), item->hint, item->Pwd(uid)); + PrintAndLogEx(HINT, "Use `" _YELLOW_("%s") "`", s); + } else { + PrintAndLogEx(HINT, "Use `" _YELLOW_("%s") "`", item->hint); + } + } + } + } + + // OTP checks + mfu_otp_identify_t *item = mfu_match_otp_fingerprint(data); + if (item) { + PrintAndLogEx(SUCCESS, "Found " _GREEN_("%s"), item->desc); + + if (item->hint) { + if (item->otp) { char s[40] = {0}; - snprintf(s, sizeof(s), item->hint, item->Pwd(uid)); + snprintf(s, sizeof(s), item->hint, item->otp(uid)); PrintAndLogEx(HINT, "Use `" _YELLOW_("%s") "`", s); } else { PrintAndLogEx(HINT, "Use `" _YELLOW_("%s") "`", item->hint); } } } + // + + out: free(data); @@ -3248,7 +3309,7 @@ static int CmdHF14AMfUPwdGen(const char *Cmd) { PrintAndLogEx(INFO, "----------------------------------"); PrintAndLogEx(INFO, " algo | pwd | pack"); PrintAndLogEx(INFO, "-----------------+----------+-----"); - PrintAndLogEx(INFO, " EV1 | %08X | %04X", ul_ev1_pwdgenA(uid), ul_ev1_packgenA(uid)); + PrintAndLogEx(INFO, " Transport EV1 | %08X | %04X", ul_ev1_pwdgenA(uid), ul_ev1_packgenA(uid)); PrintAndLogEx(INFO, " Amiibo | %08X | %04X", ul_ev1_pwdgenB(uid), ul_ev1_packgenB(uid)); PrintAndLogEx(INFO, " Lego Dimension | %08X | %04X", ul_ev1_pwdgenC(uid), ul_ev1_packgenC(uid)); PrintAndLogEx(INFO, " XYZ 3D printer | %08X | %04X", ul_ev1_pwdgenD(uid), ul_ev1_packgenD(uid)); @@ -3256,6 +3317,9 @@ static int CmdHF14AMfUPwdGen(const char *Cmd) { PrintAndLogEx(INFO, " NTAG tools | %08X | %04X", ul_ev1_pwdgenF(uid), ul_ev1_packgen_def(uid)); PrintAndLogEx(INFO, "-----------------+----------+-----"); PrintAndLogEx(INFO, " Vingcard algo"); + PrintAndLogEx(INFO, " Saflok algo"); + PrintAndLogEx(INFO, " SALTO algo"); + PrintAndLogEx(INFO, " Dorma Kaba algo"); PrintAndLogEx(INFO, "----------------------------------"); return PM3_SUCCESS; } diff --git a/common/generator.c b/common/generator.c index 41bd49d89..852ea2b61 100644 --- a/common/generator.c +++ b/common/generator.c @@ -240,6 +240,12 @@ uint16_t ul_ev1_packgen_def(const uint8_t *uid) { return 0x0000; } +// MIFARE ULTRALIGHT OTP generators +uint32_t ul_c_otpgenA(const uint8_t *uid) { + return 0x534C544F; +} + + //------------------------------------ // MFC key generation stuff // Each algo implementation should offer two key generation functions. diff --git a/common/generator.h b/common/generator.h index 5fc81ba25..1008d01fa 100644 --- a/common/generator.h +++ b/common/generator.h @@ -36,6 +36,8 @@ uint16_t ul_ev1_packgenC(const uint8_t *uid); uint16_t ul_ev1_packgenD(const uint8_t *uid); uint16_t ul_ev1_packgenE(const uint8_t *uid); +uint32_t ul_c_otpgenA(const uint8_t *uid); + int mfc_algo_ving_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t *key); int mfc_algo_ving_all(uint8_t *uid, uint8_t *keys); From 6ad73d25fd49b40c11c87c31af979ccbb609735f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 8 Jan 2023 21:55:38 +0100 Subject: [PATCH 059/924] text --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4278b6c12..0652edf2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mfu info` - now also does a simple OTP fingerprinting (@iceman1001) - Changed `hf mf wrbl` - now checks for strict readonly ACL's in the data to write (@iceman1001) - Changed `hf mf view` - verbose printing if strict readonly ACL's exists in dump file (@iceman1001) - Add command `piv authsign` to get a buffer signed by the selected key (@jmichelp) From 6cbebb29dc20f488a6e30d86b02c8ce78540538f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 8 Jan 2023 21:56:38 +0100 Subject: [PATCH 060/924] mingw seems to doesnt like backslashes --- include/common.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/common.h b/include/common.h index bb3781c4a..a97545996 100644 --- a/include/common.h +++ b/include/common.h @@ -24,8 +24,8 @@ #include #ifdef _WIN32 -#define ABOVE "..\\" -#define PATHSEP "\\" +#define ABOVE "../" +#define PATHSEP "/" #else #define ABOVE "../" #define PATHSEP "/" @@ -60,7 +60,7 @@ struct version_information_t { char clean; /* 1: Tree was clean, no local changes. 0: Tree was unclean. 2: Couldn't be determined */ char gitversion[50]; /* String with the git revision */ char buildtime[30]; /* string with the build time */ - char armsrc[10]; /* sha256sum of sha256sum of armsrc files */ + char armsrc[10]; /* sha256sum of sha256sum of armsrc && common_arm files */ } PACKED; // debug From 52893085451b91486c6ce36e5087a27bd0618c97 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 9 Jan 2023 00:03:46 +0100 Subject: [PATCH 061/924] missing a bracket --- client/src/ui.c | 128 +++++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 61 deletions(-) diff --git a/client/src/ui.c b/client/src/ui.c index 00eb8d022..ff885af37 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -23,7 +23,6 @@ #endif #include "ui.h" #include "commonutil.h" // ARRAYLEN - #include // for Mingw readline #include #include @@ -62,10 +61,18 @@ pthread_mutex_t g_print_lock = PTHREAD_MUTEX_INITIALIZER; static void fPrintAndLog(FILE *stream, const char *fmt, ...); +#ifdef _WIN32 + #define MKDIR_CHK _mkdir(path) +#else + #define MKDIR_CHK mkdir(path, 0700) +#endif + + // needed by flasher, so let's put it here instead of fileutils.c int searchHomeFilePath(char **foundpath, const char *subdir, const char *filename, bool create_home) { - if (foundpath == NULL) + if (foundpath == NULL) { return PM3_EINVARG; + } const char *user_path = get_my_user_directory(); if (user_path == NULL) { @@ -75,93 +82,92 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam size_t pathlen = strlen(user_path) + strlen(PM3_USER_DIRECTORY) + 1; char *path = calloc(pathlen, sizeof(char)); - if (path == NULL) + if (path == NULL) { return PM3_EMALLOC; + } strcpy(path, user_path); strcat(path, PM3_USER_DIRECTORY); int result; + #ifdef _WIN32 struct _stat st; // Mingw _stat fails if path ends with /, so let's use a stripped path - if (str_endswith(path, PATHSEP)) - - memset(path + (strlen(path) - strlen(PATHSEP)), 0x00, strlen(PATHSEP)); - result = _stat(path, &st); - strncat(path, PATHSEP, strlen(PATHSEP)); -} else { - result = _stat(path, &st); -} -#else - struct stat st; - result = stat(path, &st); -#endif -if ((result != 0) && create_home) { - -#ifdef _WIN32 - if (_mkdir(path)) -#else - if (mkdir(path, 0700)) -#endif - { - fprintf(stderr, "Could not create user directory %s\n", path); - free(path); - return PM3_EFILE; - } -} -if (subdir != NULL) { - pathlen += strlen(subdir); - char *tmp = realloc(path, pathlen * sizeof(char)); - if (tmp == NULL) { - //free(path); - return PM3_EMALLOC; - } - path = tmp; - strcat(path, subdir); - -#ifdef _WIN32 - // Mingw _stat fails if path ends with /, so let's use a stripped path - if (path[strlen(path) - 1] == '/') { - path[strlen(path) - 1] = '\0'; + if (str_endswith(path, PATHSEP)) { + memset(path + (strlen(path) - strlen(PATHSEP)), 0x00, strlen(PATHSEP)); result = _stat(path, &st); - path[strlen(path)] = '/'; + strncat(path, PATHSEP, strlen(PATHSEP)); } else { result = _stat(path, &st); } #else + struct stat st; result = stat(path, &st); #endif + if ((result != 0) && create_home) { -#ifdef _WIN32 - if (_mkdir(path)) -#else - if (mkdir(path, 0700)) -#endif + if (MKDIR_CHK) { fprintf(stderr, "Could not create user directory %s\n", path); free(path); return PM3_EFILE; } } -} -if (filename == NULL) { + if (subdir != NULL) { + pathlen += strlen(subdir); + char *tmp = realloc(path, pathlen * sizeof(char)); + if (tmp == NULL) { + //free(path); + return PM3_EMALLOC; + } + path = tmp; + strcat(path, subdir); + +#ifdef _WIN32 + // Mingw _stat fails if path ends with /, so let's use a stripped path + if (str_endswith(path, PATHSEP)) { + memset(path + (strlen(path) - strlen(PATHSEP)), 0x00, strlen(PATHSEP)); + result = _stat(path, &st); + strncat(path, PATHSEP, strlen(PATHSEP)); + } else { + result = _stat(path, &st); + } +#else + result = stat(path, &st); +#endif + + if ((result != 0) && create_home) { + + if (MKDIR_CHK) + { + fprintf(stderr, "Could not create user directory %s\n", path); + free(path); + return PM3_EFILE; + } + } + } + + if (filename == NULL) { + *foundpath = path; + return PM3_SUCCESS; + } + + pathlen += strlen(filename); + char *tmp = realloc(path, pathlen *sizeof(char)); + if (tmp == NULL) { + //free(path); + return PM3_EMALLOC; + } + + path = tmp; + strcat(path, filename); *foundpath = path; + return PM3_SUCCESS; } -pathlen += strlen(filename); -char *tmp = realloc(path, pathlen *sizeof(char)); -if (tmp == NULL) { - //free(path); - return PM3_EMALLOC; -} -path = tmp; -strcat(path, filename); -*foundpath = path; -return PM3_SUCCESS; -} void PrintAndLogOptions(const char *str[][2], size_t size, size_t space) { char buff[2000] = "Options:\n"; From f2185b393363a61baf4beaac32b6fe13793d5617 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 9 Jan 2023 00:48:42 +0100 Subject: [PATCH 062/924] use strcat instead of strncat, we are adding same as we removed --- client/src/ui.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/src/ui.c b/client/src/ui.c index ff885af37..839dd22b0 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -88,7 +88,6 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam strcpy(path, user_path); strcat(path, PM3_USER_DIRECTORY); - int result; #ifdef _WIN32 @@ -97,7 +96,7 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam if (str_endswith(path, PATHSEP)) { memset(path + (strlen(path) - strlen(PATHSEP)), 0x00, strlen(PATHSEP)); result = _stat(path, &st); - strncat(path, PATHSEP, strlen(PATHSEP)); + strcat(path, PATHSEP); } else { result = _stat(path, &st); } @@ -131,7 +130,7 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam if (str_endswith(path, PATHSEP)) { memset(path + (strlen(path) - strlen(PATHSEP)), 0x00, strlen(PATHSEP)); result = _stat(path, &st); - strncat(path, PATHSEP, strlen(PATHSEP)); + strcat(path, PATHSEP); } else { result = _stat(path, &st); } From 90b1cb795400d993e42480dd3149a8043ecb9f0b Mon Sep 17 00:00:00 2001 From: George Talusan Date: Mon, 9 Jan 2023 10:35:15 -0500 Subject: [PATCH 063/924] fix off-by-1 when removing header in hf_mfu_amiibo_restore --- client/luascripts/hf_mfu_amiibo_restore.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/luascripts/hf_mfu_amiibo_restore.lua b/client/luascripts/hf_mfu_amiibo_restore.lua index b83f3feb1..c31db7098 100644 --- a/client/luascripts/hf_mfu_amiibo_restore.lua +++ b/client/luascripts/hf_mfu_amiibo_restore.lua @@ -105,7 +105,7 @@ local function main(args) -- chomp emu header if #hex == 1192 then - hex = hex:sub(112) + hex = hex:sub(113) end local amiibo_offset = 0 From 73a80fb07db22f3cba56f8e3ef7c205f1a378441 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 10 Jan 2023 22:08:59 +0100 Subject: [PATCH 064/924] hf mf wrbl, restore - changed the logic of --force param. It is now used to override warnings about BLOCK0 and bad ACL block data and allow the user to write it regardless of its consequences.\n You can easily brick sectors on genuine or Gen2 cards.\n Be aware, here be dragons! --- client/src/cmdhfmf.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index eba190b5e..2ea197cf7 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -507,7 +507,10 @@ static int CmdHF14AMfWrBl(const char *Cmd) { "Sector 0 / Block 0 - Manufacturer block\n" "When writing to block 0 you must use a VALID block 0 data (UID, BCC, SAK, ATQA)\n" "Writing an invalid block 0 means rendering your Magic GEN2 card undetectable. \n" - "Look in the magic_cards_notes.md file for help to resolve it.", + "Look in the magic_cards_notes.md file for help to resolve it.\n" + " \n" + "`--force` param is used to override warnings like bad ACL and BLOCK 0 writes.\n" + " if not specified, it will exit if detected", "hf mf wrbl --blk 1 -k FFFFFFFFFFFF -d 000102030405060708090a0b0c0d0e0f" ); void *argtable[] = { @@ -515,7 +518,7 @@ static int CmdHF14AMfWrBl(const char *Cmd) { arg_int1(NULL, "blk", "", "block number"), arg_lit0("a", NULL, "input key type is key A (def)"), arg_lit0("b", NULL, "input key type is key B"), - arg_lit0(NULL, "force", "enforce block0 writes"), + arg_lit0(NULL, "force", "override warnings"), arg_str0("k", "key", "", "key, 6 hex bytes"), arg_str0("d", "data", "", "bytes to write, 16 hex bytes"), @@ -553,6 +556,8 @@ static int CmdHF14AMfWrBl(const char *Cmd) { if (b > 255) { return PM3_EINVARG; } + + // BLOCK 0 detection if (b == 0 && force == false) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "Targeting Sector 0 / Block 0 - Manufacturer block"); @@ -564,13 +569,14 @@ static int CmdHF14AMfWrBl(const char *Cmd) { uint8_t blockno = (uint8_t)b; - // Warn if ACL is strict read-only + // Sector trailer sanity checks. + // Warn if ACL is strict read-only, or invalid ACL. if (mfIsSectorTrailer(blockno)) { PrintAndLogEx(INFO, "Sector trailer (ST) write detected"); // ensure access right isn't messed up. if (mfValidateAccessConditions(&block[6]) == false) { - PrintAndLogEx(WARNING, "Invalid Access Conditions detected, replacing by default values"); + PrintAndLogEx(WARNING, "Invalid Access Conditions detected, replacing with default values"); memcpy(block + 6, "\xFF\x07\x80\x69", 4); } @@ -583,8 +589,13 @@ static int CmdHF14AMfWrBl(const char *Cmd) { } } if (ro_detected) { - PrintAndLogEx(INFO, "Exiting, please run `" _YELLOW_("hf mf acl -d %s") "` to understand", sprint_hex_inrow(&block[6], 3)); - return PM3_EINVARG; + if (force) { + PrintAndLogEx(WARNING, " --force override, continuing..."); + } else { + PrintAndLogEx(INFO, "Exiting, please run `" _YELLOW_("hf mf acl -d %s") "` to understand", sprint_hex_inrow(&block[6], 3)); + PrintAndLogEx(INFO, "Use `" _YELLOW_("--force") "` to override and write this data"); + return PM3_EINVARG; + } } else { PrintAndLogEx(SUCCESS, "ST passed checks, continuing..."); } @@ -1079,9 +1090,11 @@ static int CmdHF14AMfRestore(const char *Cmd) { "If access rights in dump file is all zeros, it will be replaced with default values\n" "\n" "`--uid` param is used for filename templates `hf-mf--dump.bin` and `hf-mf--key.bin.\n" - " If not specified, it will read the card uid instead.\n" + " if not specified, it will read the card uid instead.\n" " `--ka` param you can indicate that the key file should be used for authentication instead.\n" - " if so we also try both B/A keys", + " if so we also try both B/A keys\n" + "`--force` param is used to override warnings and allow bad ACL block writes.\n" + " if not specified, it will skip blocks with bad ACL.\n", "hf mf restore\n" "hf mf restore --1k --uid 04010203\n" "hf mf restore --1k --uid 04010203 -k hf-mf-AABBCCDD-key.bin\n" @@ -1098,6 +1111,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { arg_str0("f", "file", "", "specify dump filename (bin/eml/json)"), arg_str0("k", "kfn", "", "key filename"), arg_lit0(NULL, "ka", "use specified keyfile to authenticate"), + arg_lit0(NULL, "force", "override warnings"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1120,6 +1134,8 @@ static int CmdHF14AMfRestore(const char *Cmd) { CLIParamStrToBuf(arg_get_str(ctx, 7), (uint8_t *)keyfilename, FILE_PATH_SIZE, &keyfnlen); bool use_keyfile_for_auth = arg_get_lit(ctx, 8); + bool force = arg_get_lit(ctx, 9); + CLIParserFree(ctx); // validations @@ -1256,7 +1272,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { // ensure access right isn't messed up. if (mfValidateAccessConditions(&bldata[6]) == false) { - PrintAndLogEx(WARNING, "Invalid Access Conditions on sector %i, replacing by default values", s); + PrintAndLogEx(WARNING, "Invalid Access Conditions on sector %i, replacing with default values", s); memcpy(bldata + 6, "\xFF\x07\x80\x69", 4); } @@ -1264,6 +1280,12 @@ static int CmdHF14AMfRestore(const char *Cmd) { for (uint8_t foo = 0; foo < mfNumBlocksPerSector(s); foo++) { if (mfReadOnlyAccessConditions(foo, &bldata[6])) { PrintAndLogEx(WARNING, "Strict ReadOnly Access Conditions on block " _YELLOW_("%u") " detected", foo); + + // if --force isn't used, skip writing this block + if (force == false) { + PrintAndLogEx(INFO, "Skipping, use `" _YELLOW_("--force") "` to override and write this data"); + continue; + } } } } From 21de6e750cc2b89990145e0dbe58522e438c9d3f Mon Sep 17 00:00:00 2001 From: Benjamin DELPY Date: Wed, 11 Jan 2023 23:31:23 +0100 Subject: [PATCH 065/924] Added standalone mode for simulatin Nedap ID --- CHANGELOG.md | 1 + armsrc/Standalone/Makefile.hal | 5 +- armsrc/Standalone/Makefile.inc | 4 + armsrc/Standalone/lf_nedap_sim.c | 221 ++++++++++++++++++ .../4_Advanced-compilation-parameters.md | 1 + tools/build_all_firmwares.sh | 2 +- 6 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 armsrc/Standalone/lf_nedap_sim.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 0652edf2b..9867f7f70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001) - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) - Fixed `make accessrights` on Fedora (@mooey5775) + - Added standalone mode for simulatin Nedap ID ## [Radium.4.15864][2022-10-29] - Changed `lf indala sim` - now accepts fc / cn (@iceman1001) diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index 6b4510da8..afd144e5d 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -53,6 +53,9 @@ define KNOWN_STANDALONE_DEFINITIONS | LF_NEXID | LF Nexwatch collector to flashmem | | (RDV4 only) | | +----------------------------------------------------------+ +| LF_NEDAP_SIM | LF Nedap ID simple simulator | +| | | ++----------------------------------------------------------+ | LF_PROXBRUTE | HID ProxII bruteforce | | | - Brad Antoniewicz | +----------------------------------------------------------+ @@ -118,7 +121,7 @@ define KNOWN_STANDALONE_DEFINITIONS +----------------------------------------------------------+ endef -STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID +STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID LF_NEDAP_SIM STANDALONE_MODES += HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI STANDALONE_MODES_REQ_BT := HF_REBLAY STANDALONE_MODES_REQ_SMARTCARD := diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index 05a63f1dd..1df076414 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -133,6 +133,10 @@ endif ifneq (,$(findstring WITH_STANDALONE_HF_MFCSIM,$(APP_CFLAGS))) SRC_STANDALONE = hf_mfcsim.c endif +# WITH_STANDALONE_LF_NEDAP_SIM +ifneq (,$(findstring WITH_STANDALONE_LF_NEDAP_SIM,$(APP_CFLAGS))) + SRC_STANDALONE = lf_nedap_sim.c +endif ifneq (,$(findstring WITH_STANDALONE_DANKARMULTI,$(APP_CFLAGS))) SRC_STANDALONE = dankarmulti.c diff --git a/armsrc/Standalone/lf_nedap_sim.c b/armsrc/Standalone/lf_nedap_sim.c new file mode 100644 index 000000000..491199c27 --- /dev/null +++ b/armsrc/Standalone/lf_nedap_sim.c @@ -0,0 +1,221 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// This simple mode encode, then emulate a Nedap identificator until button pressed +// lots of code from client side, cmdlfnedap, util, etc. +//----------------------------------------------------------------------------- +#include "standalone.h" // standalone definitions +#include "proxmark3_arm.h" +#include "appmain.h" +#include "fpgaloader.h" +#include "lfops.h" +#include "util.h" +#include "dbprint.h" +#include "string.h" +#include "BigBuf.h" +#include "crc16.h" + +#define MODULE_LONG_NAME "LF Nedap simple simulator" + +typedef struct _NEDAP_TAG { + uint8_t subType; + uint16_t customerCode; + uint32_t id; + + uint8_t bIsLong; +} NEDAP_TAG, *PNEDAP_TAG; + +const NEDAP_TAG Tag = {.subType = 0x5, .customerCode = 0x123, .id = 42424, .bIsLong = 1}; + +static int NedapPrepareBigBuffer(const NEDAP_TAG *pTag); +static void biphaseSimBitInverted(uint8_t c, int *n, uint8_t *phase); +static void NedapGen(uint8_t subType, uint16_t customerCode, uint32_t id, bool isLong, uint8_t *data); +static uint8_t isEven_64_63(const uint8_t *data); +static inline uint32_t bitcount32(uint32_t a); +static void bytes_to_bytebits(const void *src, const size_t srclen, void *dest); + +void ModInfo(void) +{ + DbpString(" " MODULE_LONG_NAME); +} + +void RunMod(void) +{ + int n; + + StandAloneMode(); + + Dbprintf("[=] " MODULE_LONG_NAME " -- started"); + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); + Dbprintf("[=] NEDAP (%s) - ID: " _GREEN_("%05u") " subtype: " _GREEN_("%1u") " customer code: " _GREEN_("%u / 0x%03X"), Tag.bIsLong ? "128b" : "64b", Tag.id, Tag.subType, Tag.customerCode, Tag.customerCode); + + n = NedapPrepareBigBuffer(&Tag); + do + { + WDT_HIT(); + + if (data_available()) + break; + + SimulateTagLowFrequency(n, 0, true); + + } while (BUTTON_HELD(1000) == BUTTON_NO_CLICK); + + Dbprintf("[=] " MODULE_LONG_NAME " -- exiting"); + + LEDsoff(); +} + +static int NedapPrepareBigBuffer(const NEDAP_TAG *pTag) +{ + int ret = 0; + uint8_t data[16], bitStream[sizeof(data) * 8], phase = 0; + uint16_t i, size = pTag->bIsLong ? sizeof(data) : (sizeof(data) / 2); + + NedapGen(pTag->subType, pTag->customerCode, pTag->id, pTag->bIsLong, data); + bytes_to_bytebits(data, size, bitStream); + size <<= 3; + + for (i = 0; i < size; i++) + { + biphaseSimBitInverted(!bitStream[i], &ret, &phase); + } + if (phase == 1) //run a second set inverted to keep phase in check + { + for (i = 0; i < size; i++) + { + biphaseSimBitInverted(!bitStream[i], &ret, &phase); + } + } + + return ret; +} + +static void biphaseSimBitInverted(uint8_t c, int *n, uint8_t *phase) +{ + uint8_t *dest = BigBuf_get_addr(); + + if (c) + { + memset(dest + (*n), c ^ 1 ^ *phase, 32); + memset(dest + (*n) + 32, c ^ *phase, 32); + } + else + { + memset(dest + (*n), c ^ *phase, 64); + *phase ^= 1; + } + *n += 64; +} + +#define FIXED_71 0x71 +#define FIXED_40 0x40 +#define UNKNOWN_A 0x00 +#define UNKNOWN_B 0x00 +static const uint8_t translateTable[10] = {8, 2, 1, 12, 4, 5, 10, 13, 0, 9}; +static void NedapGen(uint8_t subType, uint16_t customerCode, uint32_t id, bool isLong, uint8_t *data) { // 8 or 16 + uint8_t buffer[7]; + + uint8_t r1 = (uint8_t)(id / 10000); + uint8_t r2 = (uint8_t)((id % 10000) / 1000); + uint8_t r3 = (uint8_t)((id % 1000) / 100); + uint8_t r4 = (uint8_t)((id % 100) / 10); + uint8_t r5 = (uint8_t)(id % 10); + + // first part + uint8_t idxC1 = r1; + uint8_t idxC2 = (idxC1 + 1 + r2) % 10; + uint8_t idxC3 = (idxC2 + 1 + r3) % 10; + uint8_t idxC4 = (idxC3 + 1 + r4) % 10; + uint8_t idxC5 = (idxC4 + 1 + r5) % 10; + + buffer[0] = 0xc0 | (subType & 0x0F); + buffer[1] = (customerCode & 0x0FF0) >> 4; + buffer[2] = ((customerCode & 0x000F) << 4) | translateTable[idxC1]; + buffer[3] = (translateTable[idxC2] << 4) | translateTable[idxC3]; + buffer[4] = (translateTable[idxC4] << 4) | translateTable[idxC5]; + + // checksum + init_table(CRC_XMODEM); + uint16_t checksum = crc16_xmodem(buffer, 5); + + buffer[6] = ((checksum & 0x000F) << 4) | (buffer[4] & 0x0F); + buffer[5] = (checksum & 0x00F0) | ((buffer[4] & 0xF0) >> 4); + buffer[4] = ((checksum & 0x0F00) >> 4) | (buffer[3] & 0x0F); + buffer[3] = ((checksum & 0xF000) >> 8) | ((buffer[3] & 0xF0) >> 4); + + // carry calc + uint8_t carry = 0; + for (uint8_t i = 0; i < sizeof(buffer); i++) { + uint8_t tmp = buffer[sizeof(buffer) - 1 - i]; + data[7 - i] = ((tmp & 0x7F) << 1) | carry; + carry = (tmp & 0x80) >> 7; + } + data[0] = 0xFE | carry; + data[7] |= isEven_64_63(data); + + // second part + if (isLong) { + uint8_t id0 = r1; + uint8_t id1 = (r2 << 4) | r3; + uint8_t id2 = (r4 << 4) | r5; + + data[8] = (id2 >> 1); + data[9] = ((id2 & 0x01) << 7) | (id1 >> 2); + data[10] = ((id1 & 0x03) << 6) | (id0 >> 3); + data[11] = ((id0 & 0x07) << 5) | (FIXED_71 >> 4); + data[12] = ((FIXED_71 & 0x0F) << 4) | (FIXED_40 >> 5); + data[13] = ((FIXED_40 & 0x1F) << 3) | (UNKNOWN_A >> 6); + data[14] = ((UNKNOWN_A & 0x3F) << 2) | (UNKNOWN_B >> 7); + data[15] = ((UNKNOWN_B & 0x7F) << 1); + data[15] |= isEven_64_63(data + 8); + } +} + +static uint8_t isEven_64_63(const uint8_t *data) { // 8 + uint32_t tmp[2]; + memcpy(tmp, data, 8); + return (bitcount32(tmp[0]) + (bitcount32(tmp[1] & 0xfeffffff))) & 1; +} + +static void bytes_to_bytebits(const void *src, const size_t srclen, void *dest) +{ + uint8_t *s = (uint8_t *)src, *d = (uint8_t *)dest; + size_t i = srclen * 8, j = srclen; + + while (j--) + { + uint8_t b = s[j]; + d[--i] = (b >> 0) & 1; + d[--i] = (b >> 1) & 1; + d[--i] = (b >> 2) & 1; + d[--i] = (b >> 3) & 1; + d[--i] = (b >> 4) & 1; + d[--i] = (b >> 5) & 1; + d[--i] = (b >> 6) & 1; + d[--i] = (b >> 7) & 1; + } +} + +static inline uint32_t bitcount32(uint32_t a) +{ +#if defined __GNUC__ + return __builtin_popcountl(a); +#else + a = a - ((a >> 1) & 0x55555555); + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); + return (((a + (a >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24; +#endif +} diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index 06040b59e..ee8c63465 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -108,6 +108,7 @@ Here are the supported values you can assign to `STANDALONE` in `Makefile.platfo | LF_HIDBRUTE | HID corporate 1000 bruteforce - Federico dotta & Maurizio Agazzini | LF_HIDFCBRUTE | LF HID facility code bruteforce - ss23 | LF_ICEHID | LF HID collector to flashmem - Iceman1001 +| LF_NEDAP_SIM | LF Nedap ID simulator | LF_NEXID | Nexwatch credentials detection mode - jrjgjk & Zolorah | LF_PROXBRUTE | HID ProxII bruteforce - Brad Antoniewicz | LF_SAMYRUN (def)| HID26 read/clone/sim - Samy Kamkar diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index 5e1076684..a0ef2e1dd 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -30,7 +30,7 @@ mkdir -p "$DEST" mv bootrom/obj/bootrom.elf "$DEST/PM3BOOTROM.elf" # cf armsrc/Standalone/Makefile.hal -STANDALONE_MODES=(LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID) +STANDALONE_MODES=(LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID LF_NEDAP_SIM) STANDALONE_MODES+=(HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI) STANDALONE_MODES_REQ_BT=(HF_REBLAY) STANDALONE_MODES_REQ_SMARTCARD=() From 224a83527f6122e758abfc6acec004eaf495b37c Mon Sep 17 00:00:00 2001 From: mwalker33 <51802811+mwalker33@users.noreply.github.com> Date: Sat, 14 Jan 2023 18:16:09 +1100 Subject: [PATCH 066/924] Update cmdlfparadox.c Add FC/CN to clone for paradox --- client/src/cmdlfparadox.c | 65 +++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index f64c51be8..e1a714c96 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -230,6 +230,7 @@ static int CmdParadoxClone(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf paradox clone", "clone a paradox tag to a T55x7, Q5/T5555 or EM4305/4469 tag.", + "lf paradox clone --fc 96 --cn 40426 -> encode for T55x7 tag with fc and cn\n" "lf paradox clone --raw 0f55555695596a6a9999a59a -> encode for T55x7 tag\n" "lf paradox clone --raw 0f55555695596a6a9999a59a --q5 -> encode for Q5/T5555 tag\n" "lf paradox clone --raw 0f55555695596a6a9999a59a --em -> encode for EM4305/4469" @@ -238,6 +239,8 @@ static int CmdParadoxClone(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_str0("r", "raw", "", "raw hex data. 12 bytes max"), + arg_u64_0(NULL, "fc", "", "facility code"), + arg_u64_0(NULL, "cn", "", "card number"), arg_lit0(NULL, "q5", "optional - specify writing to Q5/T5555 tag"), arg_lit0(NULL, "em", "optional - specify writing to EM4305/4469 tag"), arg_param_end @@ -249,8 +252,10 @@ static int CmdParadoxClone(const char *Cmd) { uint8_t raw[12] = {0}; CLIGetHexWithReturn(ctx, 1, raw, &raw_len); - bool q5 = arg_get_lit(ctx, 2); - bool em = arg_get_lit(ctx, 3); + uint32_t fc = arg_get_u32_def(ctx, 2, 0); + uint32_t cn = arg_get_u32_def(ctx, 3, 0); + bool q5 = arg_get_lit(ctx, 4); + bool em = arg_get_lit(ctx, 5); CLIParserFree(ctx); if (q5 && em) { @@ -258,14 +263,56 @@ static int CmdParadoxClone(const char *Cmd) { return PM3_EINVARG; } - if (raw_len != 12) { - PrintAndLogEx(ERR, "Data must be 12 bytes (24 HEX characters) %d", raw_len); - return PM3_EINVARG; - } - uint32_t blocks[4]; - for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { - blocks[i] = bytes_to_num(raw + ((i - 1) * 4), sizeof(uint32_t)); + + if (raw_len != 0) { + if (raw_len != 12) { + PrintAndLogEx(ERR, "Data must be 12 bytes (24 HEX characters) %d", raw_len); + return PM3_EINVARG; + } + + for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { + blocks[i] = bytes_to_num(raw + ((i - 1) * 4), sizeof(uint32_t)); + } + } else { + uint8_t manchester[13] = { 0x00 }; // check size needed + uint32_t t1; + + manchester[0] = 0x0F; // preamble + manchester[1] = 0x05; // Leading zeros - Note: from this byte on, is part of the CRC calculation + manchester[2] = 0x55; // Leading zeros its 4 bits out for the CRC, so we need too move + manchester[3] = 0x55; // Leading zeros back 4 bits once we have the crc (done below) + + // add FC + t1 = manchesterEncode2Bytes (fc); + manchester[4] = (t1 >> 8) & 0xFF; + manchester[5] = t1 & 0xFF; + + // add cn + t1 = manchesterEncode2Bytes (cn); + manchester[6] = (t1 >> 24) & 0xFF; + manchester[7] = (t1 >> 16) & 0xFF; + manchester[8] = (t1 >> 8) & 0xFF; + manchester[9] = t1 & 0xFF; + + uint8_t crc = (CRC8Maxim(manchester+1, 9) ^ 0x6) & 0xFF; + + // add crc + t1 = manchesterEncode2Bytes (crc); + manchester[10] = (t1 >> 8) & 0xFF; + manchester[11] = t1 & 0xFF; + + // move left 4 bits left 4 bits - Now that we have the CRC we need to re-align the data. + for (int i = 1; i < 12; i++) + manchester[i] = (manchester[i] << 4) + (manchester[i+1] >> 4); + + // Add trailing 1010 (11) + manchester[11] |= (1 << 3); + manchester[11] |= (1 << 1); + + // move into tag blocks + for (int i = 0; i < 12; i++) + blocks[1 + (i/4)] += (manchester[i] << (8 * (3 - i % 4))); } // Paradox - FSK2a, data rate 50, 3 data blocks From fe63c503fda08b7ca4742a6833b19de14ed6bff9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 12:04:09 +0100 Subject: [PATCH 067/924] added some ISO7816 error code defines --- include/protocols.h | 63 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/include/protocols.h b/include/protocols.h index 563938f52..ebbe78718 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -450,9 +450,68 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define ISO7816_MANAGE_CHANNEL 0x70 #define ISO7816_GET_RESPONSE 0xC0 + // ISO7816-4 For response APDU's -#define ISO7816_OK 0x9000 -// 6x xx = ERROR +#define ISO7816_OK 0x9000 + +// 6x xx = APDU ERROR CODES + +// 61 xx +#define ISO7816_BYTES_REMAINING_00 0x6100 // Response bytes remaining + +// 62 xx +#define ISO7816_WARNING_STATE_UNCHANGED 0x6200 // Warning, card state unchanged +#define ISO7816_DATA_CORRUPT 0x6281 // Returned data may be corrupted +#define ISO7816_FILE_EOF 0x6282 // The end of the file has been reached before the end of reading +#define ISO7816_INVALID_DF 0x6283 // Invalid DF +#define ISO7816_INVALID_FILE 0x6284 // Selected file is not valid +#define ISO7816_ 0x6285 + +// 63 xx +#define ISO7816_AUTH_FAILED 0x6300 // Authentification failed +#define ISO7816_FILE_FILLED 0x6381 // File filled up by the last write + +// 65 xx +#define ISO7816_MEMORY_FULL 0x6501 // Memory failure +#define ISO7816_WRITE_MEMORY_ERR 0x6581 // Write problem / Memory failure / Unknown mode + +// 67 xx +#define ISO7816_WRONG_LENGTH 0x6700 // Wrong length + +// 68 xx +#define ISO7816_LOGICAL_CHANNEL_NOT_SUPPORTED 0x6881 // Card does not support the operation on the specified logical channel +#define ISO7816_SECURE_MESSAGING_NOT_SUPPORTED 0x6882 // Card does not support secure messaging +#define ISO7816_LAST_COMMAND_EXPECTED 0x6883 // Last command in chain expected +#define ISO7816_COMMAND_CHAINING_NOT_SUPPORTED 0x6884 // Command chaining not supported + +// 69 xx +#define ISO7816_TRANSACTION_FAIL 0x6900 // No successful transaction executed during session +#define ISO7816_SELECT_FILE_ERR 0x6981 // Cannot select indicated file, command not compatible with file organization +#define ISO7816_SECURITY_STATUS_NOT_SATISFIED 0x6982 // Security condition not satisfied +#define ISO7816_FILE_INVALID 0x6983 // File invalid +#define ISO7816_DATA_INVALID 0x6984 // Data invalid +#define ISO7816_CONDITIONS_NOT_SATISFIED 0x6985 // Conditions of use not satisfied +#define ISO7816_COMMAND_NOT_ALLOWED 0x6986 // Command not allowed (no current EF) +#define ISO7816_SM_DATA_MISSING 0x6987 // Expected SM data objects missing +#define ISO7816_SM_DATA_INCORRECT 0x6988 // SM data objects incorrect +#define ISO7816_APPLET_SELECT_FAILED 0x6999 // Applet selection failed + +// 6A xx +#define ISO7816_INVALID_P1P2 0x6A00 // Bytes P1 and/or P2 are invalid +#define ISO7816_WRONG_DATA 0x6A80 // Wrong data +#define ISO7816_FUNC_NOT_SUPPORTED 0x6A81 // Function not supported +#define ISO7816_FILE_NOT_FOUND 0x6A82 // File not found +#define ISO7816_RECORD_NOT_FOUND 0x6A83 // Record not found +#define ISO7816_FILE_FULL 0x6A84 // Not enough memory space in the file +#define ISO7816_INCORRECT_P1P2 0x6A86 // Incorrect parameters (P1,P2) + +// 6x 00 +#define ISO7816_WRONG_P1P2 0x6B00 // Incorrect parameters (P1,P2) +#define ISO7816_CORRECT_LENGTH_00 0x6C00 // Correct Expected Length (Le) +#define ISO7816_INS_NOT_SUPPORTED 0x6D00 // INS value not supported +#define ISO7816_CLA_NOT_SUPPORTED 0x6E00 // CLA value not supported +#define ISO7816_UNKNOWN 0x6F00 // No precise diagnosis + // MIFARE DESFire command set: #define MFDES_AUTHENTICATE 0x0A // AUTHENTICATE_NATIVE From 8c315716d3f0e2f38eeb2abacbafde6cada39998 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 12:04:45 +0100 Subject: [PATCH 068/924] swapped to defines instead to see if older GCC supports it --- client/src/cmdpiv.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index d73c52fee..3d703e1ec 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -29,13 +29,10 @@ #include "cmdhf14a.h" #include "fileutils.h" #include "crypto/asn1utils.h" +#include "protocols.h" static int CmdHelp(const char *Cmd); -static const uint16_t APDU_RES_SUCCESS = 0x9000; -static const uint16_t APDU_RES_NOT_FOUND = 0x6A82; -static const uint16_t APDU_RES_SECURITY = 0x6982; - static uint8_t PIV_APPLET[9] = "\xA0\x00\x00\x03\x08\x00\x00\x10\x00"; enum piv_condition_t { @@ -585,14 +582,14 @@ static int PivGetData(Iso7816CommandChannel channel, const uint8_t tag[], size_t root = new_root; } } - if ((*sw) == APDU_RES_SUCCESS) { + if ((*sw) == ISO7816_OK) { more_data = 0; } } while (more_data > 0); // Now we can try parse the TLV and return it *result = root; - if (*sw == APDU_RES_SUCCESS && tlvdb_parse_root(root) == true) { + if (*sw == ISO7816_OK && tlvdb_parse_root(root) == true) { return PM3_SUCCESS; } if (verbose == true) { @@ -614,17 +611,17 @@ static int PivGetDataByCidAndPrint(Iso7816CommandChannel channel, const struct p if (PivGetData(channel, cid->tlv_tag, cid->len, verbose, &root, &sw) == PM3_SUCCESS) { switch (sw) { - case APDU_RES_SUCCESS: + case ISO7816_OK: if (decodeTLV == true) { PrintTLV(&(root->db)); } else { print_buffer(root->buf, root->len, 0); } break; - case APDU_RES_NOT_FOUND: + case ISO7816_FILE_NOT_FOUND: PrintAndLogEx(FAILED, "Container not found."); break; - case APDU_RES_SECURITY: + case ISO7816_SECURITY_STATUS_NOT_SATISFIED: PrintAndLogEx(WARNING, "Security conditions not met."); break; default: @@ -676,7 +673,7 @@ static int PivAuthenticateSign(Iso7816CommandChannel channel, uint8_t alg_id, ui PrintAndLogEx(FAILED, "Sending APDU failed with code %d", res); return res; } - if (sw != APDU_RES_SUCCESS) { + if (sw != ISO7816_OK) { if (verbose == true) { PrintAndLogEx(INFO, "Unexpected APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); } @@ -701,7 +698,7 @@ static int PivSelect(Iso7816CommandChannel channel, bool activateField, bool lea if ((sw != 0) && (silent == false)) { PrintAndLogEx(INFO, "APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); } - if (res != PM3_SUCCESS || sw != APDU_RES_SUCCESS) { + if (res != PM3_SUCCESS || sw != ISO7816_OK) { PrintAndLogEx(FAILED, "Applet selection failed. Card is not a PIV card."); return res; } From e74a025a27c7cb4b47474eea2e895c91597f7339 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 12:10:48 +0100 Subject: [PATCH 069/924] added some more ISO7816 error return codes, swapped to defines in 14a.c --- client/src/cmdhf14a.c | 26 +++++++++++++------------- include/protocols.h | 7 +++++-- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 4c2498a85..0858150d0 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -2242,8 +2242,8 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { } } - if (sw == 0x9000 || sw == 0x6283 || sw == 0x6285) { - if (sw == 0x9000) { + if (sw == ISO7816_OK || sw == ISO7816_INVALID_DF || sw == ISO7816_FILE_TERMINATED) { + if (sw == ISO7816_OK) { if (verbose) PrintAndLogEx(SUCCESS, "Application ( " _GREEN_("ok") " )"); } else { if (verbose) PrintAndLogEx(WARNING, "Application ( " _RED_("blocked") " )"); @@ -2380,14 +2380,14 @@ int infoHF14A4Applications(bool verbose) { if (res) break; - if (sw == 0x9000 || sw == 0x6283 || sw == 0x6285) { + if (sw == ISO7816_OK || sw == ISO7816_INVALID_DF || sw == ISO7816_FILE_TERMINATED) { if (!found) { if (verbose) PrintAndLogEx(INFO, "----------------- " _CYAN_("Short AID search") " -----------------"); } found++; - if (sw == 0x9000) { + if (sw == ISO7816_OK) { if (verbose) PrintAndLogEx(SUCCESS, "Application " _CYAN_("%s") " ( " _GREEN_("ok") " )", hintAIDList[i].desc); cardFound[i] = true; @@ -2574,7 +2574,7 @@ retry_ins: // Show response. if (sw_occurrences < error_limit) { logLevel_t log_level = INFO; - if (sw == 0x9000) { + if (sw == ISO7816_OK) { log_level = SUCCESS; } @@ -2674,7 +2674,7 @@ int CmdHF14ANdefRead(const char *Cmd) { } uint16_t sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { // Try NDEF Type 4 Tag v1.0 param_gethex_to_eol("00a4040007d2760000850100", 0, aSELECT_AID, sizeof(aSELECT_AID), &aSELECT_AID_n); res = ExchangeAPDU14a(aSELECT_AID, aSELECT_AID_n, activate_field, keep_field_on, response, sizeof(response), &resplen); @@ -2688,7 +2688,7 @@ int CmdHF14ANdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -2714,7 +2714,7 @@ int CmdHF14ANdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting CC file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -2729,7 +2729,7 @@ int CmdHF14ANdefRead(const char *Cmd) { return res; } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "reading CC file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -2763,7 +2763,7 @@ int CmdHF14ANdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -2780,7 +2780,7 @@ int CmdHF14ANdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "reading NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -2819,7 +2819,7 @@ int CmdHF14ANdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "reading NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); free(ndef_file); @@ -2887,7 +2887,7 @@ int CmdHF14ANdefFormat(const char *Cmd) { bool have_application = true; uint16_t sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { have_application = false; PrintAndLogEx(INFO, "no NDEF application found"); } else { diff --git a/include/protocols.h b/include/protocols.h index ebbe78718..8a00f064c 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -465,7 +465,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define ISO7816_FILE_EOF 0x6282 // The end of the file has been reached before the end of reading #define ISO7816_INVALID_DF 0x6283 // Invalid DF #define ISO7816_INVALID_FILE 0x6284 // Selected file is not valid -#define ISO7816_ 0x6285 +#define ISO7816_FILE_TERMINATED 0x6285 // File is terminated // 63 xx #define ISO7816_AUTH_FAILED 0x6300 // Authentification failed @@ -503,7 +503,10 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define ISO7816_FILE_NOT_FOUND 0x6A82 // File not found #define ISO7816_RECORD_NOT_FOUND 0x6A83 // Record not found #define ISO7816_FILE_FULL 0x6A84 // Not enough memory space in the file -#define ISO7816_INCORRECT_P1P2 0x6A86 // Incorrect parameters (P1,P2) +#define ISO7816_LC_TLV_CONFLICT 0x6A85 // LC / TLV conlict +#define ISO7816_INCORRECT_P1P2 0x6A86 // Incorrect parameters (P1,P2) +#define ISO7816_FILE_EXISTS 0x6A89 // File exists +#define ISO7816_NOT_IMPLEMENTED 0x6AFF // // 6x 00 #define ISO7816_WRONG_P1P2 0x6B00 // Incorrect parameters (P1,P2) From 6597d14e1061c15e10224adcc1620d678365f6c7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 12:17:10 +0100 Subject: [PATCH 070/924] swapped to defines --- client/src/cmdhf14b.c | 12 +++--- client/src/cmdhfcipurse.c | 91 ++++++++++++++++++++------------------- client/src/cmdhfemrtd.c | 2 +- client/src/cmdhffido.c | 21 ++++----- 4 files changed, 64 insertions(+), 62 deletions(-) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index cddf52365..12440c676 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -126,8 +126,8 @@ static void hf14b_aid_search(bool verbose) { } } - if (sw == 0x9000 || sw == 0x6283 || sw == 0x6285) { - if (sw == 0x9000) { + if (sw == ISO7816_OK || sw == ISO7816_INVALID_DF || sw == ISO7816_FILE_TERMINATED) { + if (sw == ISO7816_OK) { if (verbose) PrintAndLogEx(SUCCESS, "Application ( " _GREEN_("ok") " )"); } else { if (verbose) PrintAndLogEx(WARNING, "Application ( " _RED_("blocked") " )"); @@ -2035,7 +2035,7 @@ int CmdHF14BNdefRead(const char *Cmd) { } uint16_t sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); res = PM3_ESOFT; goto out; @@ -2055,7 +2055,7 @@ int CmdHF14BNdefRead(const char *Cmd) { goto out; sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); res = PM3_ESOFT; goto out; @@ -2071,7 +2071,7 @@ int CmdHF14BNdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "reading NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); res = PM3_ESOFT; goto out; @@ -2090,7 +2090,7 @@ int CmdHF14BNdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "reading NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); res = PM3_ESOFT; goto out; diff --git a/client/src/cmdhfcipurse.c b/client/src/cmdhfcipurse.c index 83dc300db..f6714c5a2 100644 --- a/client/src/cmdhfcipurse.c +++ b/client/src/cmdhfcipurse.c @@ -40,6 +40,7 @@ #include "util.h" #include "fileutils.h" // laodFileJSONroot #include "crypto/libpcrypto.h" +#include "protocols.h" // ISO7816 APDU return codes const uint8_t PxSE_AID[] = {0xA0, 0x00, 0x00, 0x05, 0x07, 0x01, 0x00}; #define PxSE_AID_LENGTH 7 @@ -104,11 +105,11 @@ static int SelectAndPrintInfoFile(void) { uint16_t sw = 0; int res = CIPURSESelectFile(0x2ff7, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) + if (res != 0 || sw != ISO7816_OK) return PM3_EAPDU_FAIL; res = CIPURSEReadBinary(0, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) + if (res != 0 || sw != ISO7816_OK) return PM3_EAPDU_FAIL; if (len > 0) { @@ -151,7 +152,7 @@ static int CmdHFCipurseInfo(const char *Cmd) { bool mfExist = false; bool infoPrinted = false; int res = CIPURSESelectMFEx(true, true, buf, sizeof(buf), &len, &sw); - if (res == PM3_SUCCESS && sw == 0x9000) { + if (res == PM3_SUCCESS && sw == ISO7816_OK) { mfExist = true; PrintAndLogEx(INFO, _YELLOW_("MasterFile") " exist and can be selected."); @@ -161,7 +162,7 @@ static int CmdHFCipurseInfo(const char *Cmd) { for (int i = 0; i < ARRAYLEN(PxSE_AID_LIST); i++) { res = CIPURSESelectAID(false, true, (uint8_t *)PxSE_AID_LIST[i].aid, PxSE_AID_LENGTH, buf, sizeof(buf), &len, &sw); - if (res == PM3_SUCCESS && sw == 0x9000) { + if (res == PM3_SUCCESS && sw == ISO7816_OK) { mfExist = true; PrintAndLogEx(INFO, _CYAN_("PxSE") " exist: %s", PxSE_AID_LIST[i].name); if (len > 0) { @@ -179,7 +180,7 @@ static int CmdHFCipurseInfo(const char *Cmd) { } PrintAndLogEx(INFO, "Application `" _YELLOW_("AF F1") "` selected " _GREEN_("successfully")); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { if (sw == 0x0000) { PrintAndLogEx(ERR, "APDU exchange error. Card returns 0x0000"); } else { @@ -362,7 +363,7 @@ static int SelectCommandEx(bool selectDefaultFile, bool useAID, uint8_t *aid, si if (useAID && aidLen > 0) { res = CIPURSESelectAID(true, true, aid, aidLen, buf, bufSize, len, sw); - if (res != 0 || *sw != 0x9000) { + if (res != 0 || *sw != ISO7816_OK) { if (verbose) { PrintAndLogEx(ERR, "Cipurse select application " _GREEN_("%s ") _RED_("error") ". Card returns 0x%04x", sprint_hex_inrow(aid, aidLen), *sw); } @@ -375,7 +376,7 @@ static int SelectCommandEx(bool selectDefaultFile, bool useAID, uint8_t *aid, si } else if (useFID) { res = CIPURSESelectFileEx(true, true, fileId, buf, bufSize, len, sw); - if (res != 0 || *sw != 0x9000) { + if (res != 0 || *sw != ISO7816_OK) { if (verbose) { PrintAndLogEx(ERR, "Cipurse select file 0x%04x ( %s )", fileId, _RED_("fail")); PrintAndLogEx(ERR, "Card returns 0x%04x", *sw); @@ -389,7 +390,7 @@ static int SelectCommandEx(bool selectDefaultFile, bool useAID, uint8_t *aid, si } else if (selectDefaultFile) { res = CIPURSESelectMFDefaultFileEx(true, true, buf, bufSize, len, sw); - if (res != 0 || *sw != 0x9000) { + if (res != 0 || *sw != ISO7816_OK) { if (verbose) { PrintAndLogEx(ERR, "Cipurse select default file " _RED_("error") ". Card returns 0x%04x", *sw); } @@ -402,7 +403,7 @@ static int SelectCommandEx(bool selectDefaultFile, bool useAID, uint8_t *aid, si } else { res = CIPURSESelect(true, true, buf, bufSize, len, sw); - if (res != 0 || *sw != 0x9000) { + if (res != 0 || *sw != ISO7816_OK) { if (verbose) { PrintAndLogEx(ERR, "Cipurse select default application " _RED_("error") ". Card returns 0x%04x", *sw); } @@ -419,7 +420,7 @@ static int SelectCommandEx(bool selectDefaultFile, bool useAID, uint8_t *aid, si } res = CIPURSESelectFileEx(false, true, childFileId, buf, bufSize, len, sw); - if (res != 0 || *sw != 0x9000) { + if (res != 0 || *sw != ISO7816_OK) { if (verbose) { PrintAndLogEx(ERR, "Select child file 0x%04x " _RED_("error") ". Card returns 0x%04x", childFileId, *sw); } @@ -487,7 +488,7 @@ static int CmdHFCipurseSelect(const char *Cmd) { size_t len = 0; uint16_t sw = 0; res = SelectCommandEx(selmfd, useAID, aid, aidLen, useFID, fileId, useChildFID, childFileId, true, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { DropField(); return PM3_ESOFT; } @@ -553,7 +554,7 @@ static int CmdHFCipurseAuth(const char *Cmd) { uint8_t buf[APDU_RES_LEN] = {0}; res = SelectCommand(selmfd, useAID, aid, aidLen, useFID, fileId, true, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { DropField(); return PM3_ESOFT; } @@ -635,7 +636,7 @@ static int CmdHFCipurseReadFile(const char *Cmd) { uint8_t buf[APDU_RES_LEN] = {0}; res = CIPURSESelectAID(true, true, aid, aidLen, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Cipurse select application " _CYAN_("%s") " ( " _RED_("error") " ). Card returns 0x%04x", sprint_hex_inrow(aid, aidLen), sw); DropField(); return PM3_ESOFT; @@ -660,7 +661,7 @@ static int CmdHFCipurseReadFile(const char *Cmd) { } res = CIPURSESelectFile(fileId, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { if (verbose == false) PrintAndLogEx(ERR, "File select ( " _RED_("error") " ). Card returns 0x%04x", sw); DropField(); @@ -671,7 +672,7 @@ static int CmdHFCipurseReadFile(const char *Cmd) { PrintAndLogEx(INFO, "Select file 0x%x ( %s )", fileId, _GREEN_("ok")); res = CIPURSEReadBinary(offset, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { if (verbose == false) PrintAndLogEx(ERR, "File read " _RED_("ERROR") ". Card returns 0x%04x", sw); DropField(); @@ -758,7 +759,7 @@ static int CmdHFCipurseWriteFile(const char *Cmd) { uint8_t buf[APDU_RES_LEN] = {0}; res = CIPURSESelectAID(true, true, aid, aidLen, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Cipurse select application " _CYAN_("%s") " ( " _RED_("error") " ). Card returns 0x%04x", sprint_hex_inrow(aid, aidLen), sw); DropField(); return PM3_ESOFT; @@ -789,7 +790,7 @@ static int CmdHFCipurseWriteFile(const char *Cmd) { } res = CIPURSESelectFile(fileId, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { if (verbose == false) PrintAndLogEx(ERR, "File select " _RED_("ERROR") ". Card returns 0x%04x", sw); DropField(); @@ -800,7 +801,7 @@ static int CmdHFCipurseWriteFile(const char *Cmd) { PrintAndLogEx(INFO, "Select file 0x%x ( %s )", fileId, _GREEN_("ok")); res = CIPURSEUpdateBinary(offset, hdata, hdatalen, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { if (verbose == false) PrintAndLogEx(ERR, "File write " _RED_("ERROR") ". Card returns 0x%04x", sw); DropField(); @@ -812,7 +813,7 @@ static int CmdHFCipurseWriteFile(const char *Cmd) { if (needCommit) { sw = 0; res = CIPURSECommitTransaction(&sw); - if (res != 0 || sw != 0x9000) + if (res != 0 || sw != ISO7816_OK) PrintAndLogEx(WARNING, "Commit ( " _YELLOW_("fail") " ) Card returns 0x%04x", sw); if (verbose) @@ -883,7 +884,7 @@ static int CmdHFCipurseReadFileAttr(const char *Cmd) { uint16_t sw = 0; res = SelectCommandEx(selmfd, useAID, aid, aidLen, useFID, fileId, useChildFID, childFileId, verbose, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Select command ( " _RED_("error") " )"); DropField(); return PM3_ESOFT; @@ -921,7 +922,7 @@ static int CmdHFCipurseReadFileAttr(const char *Cmd) { } res = CIPURSEReadFileAttributes(buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { if (verbose == false) PrintAndLogEx(ERR, "File read " _RED_("ERROR") ". Card returns 0x%04x", sw); DropField(); @@ -1020,7 +1021,7 @@ static int CmdHFCipurseWriteFileAttr(const char *Cmd) { uint16_t sw = 0; res = SelectCommandEx(selmfd, useAID, aid, aidLen, useFID, fileId, useChildFID, childFileId, verbose, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Select command ( " _RED_("error") " )"); DropField(); return PM3_ESOFT; @@ -1058,7 +1059,7 @@ static int CmdHFCipurseWriteFileAttr(const char *Cmd) { } res = CIPURSEUpdateFileAttributes(hdata, hdatalen, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { if (verbose == false) PrintAndLogEx(ERR, "File attributes update " _RED_("ERROR") ". Card returns 0x%04x", sw); DropField(); @@ -1070,7 +1071,7 @@ static int CmdHFCipurseWriteFileAttr(const char *Cmd) { if (needCommit) { sw = 0; res = CIPURSECommitTransaction(&sw); - if (res != 0 || sw != 0x9000) + if (res != 0 || sw != ISO7816_OK) PrintAndLogEx(WARNING, "Commit ( " _YELLOW_("fail") " ) Card returns 0x%04x", sw); if (verbose) @@ -1125,7 +1126,7 @@ static int CmdHFCipurseFormatAll(const char *Cmd) { uint16_t sw = 0; res = CIPURSESelectMFEx(true, true, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Cipurse masterfile select " _RED_("error") ". Card returns 0x%04x", sw); DropField(); return PM3_ESOFT; @@ -1154,7 +1155,7 @@ static int CmdHFCipurseFormatAll(const char *Cmd) { } res = CIPURSEFormatAll(&sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Format " _RED_("ERROR") ". Card returns 0x%04x", sw); DropField(); return PM3_ESOFT; @@ -1239,14 +1240,14 @@ static int CmdHFCipurseCreateDGI(const char *Cmd) { if (useAID || useFID || selmfd) { res = SelectCommand(selmfd, useAID, aid, aidLen, useFID, fileId, verbose, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Select command ( " _RED_("error") " )"); DropField(); return PM3_ESOFT; } } else { res = CIPURSESelectMFEx(true, true, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Cipurse masterfile select " _RED_("error") ". Card returns 0x%04x", sw); DropField(); return PM3_ESOFT; @@ -1277,7 +1278,7 @@ static int CmdHFCipurseCreateDGI(const char *Cmd) { } res = CIPURSECreateFile(hdata, hdatalen, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Create file command " _RED_("ERROR")); PrintAndLogEx(ERR, "0x%04x - %s", sw, GetSpecificAPDUCodeDesc(SelectAPDUCodeDescriptions, ARRAYLEN(SelectAPDUCodeDescriptions), sw)); @@ -1289,7 +1290,7 @@ static int CmdHFCipurseCreateDGI(const char *Cmd) { if (needCommit) { sw = 0; res = CIPURSECommitTransaction(&sw); - if (res != 0 || sw != 0x9000) + if (res != 0 || sw != ISO7816_OK) PrintAndLogEx(WARNING, "Commit ( " _YELLOW_("fail") " ) Card returns 0x%04x", sw); if (verbose) @@ -1376,14 +1377,14 @@ static int CmdHFCipurseDeleteFile(const char *Cmd) { if (useChildFID) { res = SelectCommand(false, useAID, aid, aidLen, useFID, fileId, verbose, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Top level select " _RED_("error") ". Card returns 0x%04x", sw); DropField(); return PM3_ESOFT; } } else { res = CIPURSESelectMFEx(true, true, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Cipurse masterfile select " _RED_("error") ". Card returns 0x%04x", sw); DropField(); return PM3_ESOFT; @@ -1405,7 +1406,7 @@ static int CmdHFCipurseDeleteFile(const char *Cmd) { if (useChildFID) { res = CIPURSEDeleteFile(childFileId, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Delete child file " _CYAN_("%04x ") " %s", childFileId, _RED_("ERROR")); PrintAndLogEx(ERR, "0x%04x - %s", sw, @@ -1417,7 +1418,7 @@ static int CmdHFCipurseDeleteFile(const char *Cmd) { PrintAndLogEx(INFO, "Child file id " _CYAN_("%04x") " deleted " _GREEN_("succesfully"), childFileId); } else if (useFID) { res = CIPURSEDeleteFile(fileId, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Delete file " _CYAN_("%04x ") " %s", fileId, _RED_("ERROR")); PrintAndLogEx(ERR, "0x%04x - %s", sw, @@ -1429,7 +1430,7 @@ static int CmdHFCipurseDeleteFile(const char *Cmd) { PrintAndLogEx(INFO, "File id " _CYAN_("%04x") " deleted " _GREEN_("succesfully"), fileId); } else { res = CIPURSEDeleteFileAID(aid, aidLen, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Delete application " _CYAN_("%s ") " %s", sprint_hex_inrow(aid, aidLen), _RED_("ERROR")); PrintAndLogEx(ERR, "0x%04x - %s", sw, @@ -1444,7 +1445,7 @@ static int CmdHFCipurseDeleteFile(const char *Cmd) { if (needCommit) { sw = 0; res = CIPURSECommitTransaction(&sw); - if (res != 0 || sw != 0x9000) + if (res != 0 || sw != ISO7816_OK) PrintAndLogEx(WARNING, "Commit ( " _YELLOW_("fail") " ) Card returns 0x%04x", sw); if (verbose) @@ -1588,14 +1589,14 @@ static int CmdHFCipurseUpdateKey(const char *Cmd) { if (useAID || useFID || selmfd) { res = SelectCommand(selmfd, useAID, aid, aidLen, useFID, fileId, verbose, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Select command ( " _RED_("error") " )"); DropField(); return PM3_ESOFT; } } else { res = CIPURSESelectMFEx(true, true, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Cipurse masterfile select " _RED_("error") ". Card returns 0x%04x", sw); DropField(); return PM3_ESOFT; @@ -1626,7 +1627,7 @@ static int CmdHFCipurseUpdateKey(const char *Cmd) { } res = CIPURSEUpdateKey(encKeyId, newKeyId, keydata, sizeof(keydata), buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Update key command " _RED_("ERROR")); PrintAndLogEx(ERR, "0x%04x - %s", sw, GetSpecificAPDUCodeDesc(UAPDpdateKeyCodeDescriptions, ARRAYLEN(UAPDpdateKeyCodeDescriptions), sw)); @@ -1638,7 +1639,7 @@ static int CmdHFCipurseUpdateKey(const char *Cmd) { if (needCommit) { sw = 0; res = CIPURSECommitTransaction(&sw); - if (res != 0 || sw != 0x9000) + if (res != 0 || sw != ISO7816_OK) PrintAndLogEx(WARNING, "Commit ( " _YELLOW_("fail") " ) Card returns 0x%04x", sw); if (verbose) @@ -1736,14 +1737,14 @@ static int CmdHFCipurseUpdateKeyAttr(const char *Cmd) { if (useAID || useFID || selmfd) { res = SelectCommand(selmfd, useAID, aid, aidLen, useFID, fileId, verbose, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Select command ( " _RED_("error") " )"); DropField(); return PM3_ESOFT; } } else { res = CIPURSESelectMFEx(true, true, buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Cipurse masterfile select " _RED_("error") ". Card returns 0x%04x", sw); DropField(); return PM3_ESOFT; @@ -1774,7 +1775,7 @@ static int CmdHFCipurseUpdateKeyAttr(const char *Cmd) { } res = CIPURSEUpdateKeyAttrib(trgKeyId, hdata[0], buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000) { + if (res != 0 || sw != ISO7816_OK) { PrintAndLogEx(ERR, "Update key attributes command " _RED_("ERROR")); PrintAndLogEx(ERR, "0x%04x - %s", sw, GetSpecificAPDUCodeDesc(UAPDpdateKeyAttrCodeDescriptions, ARRAYLEN(UAPDpdateKeyAttrCodeDescriptions), sw)); @@ -1786,7 +1787,7 @@ static int CmdHFCipurseUpdateKeyAttr(const char *Cmd) { if (needCommit) { sw = 0; res = CIPURSECommitTransaction(&sw); - if (res != 0 || sw != 0x9000) + if (res != 0 || sw != ISO7816_OK) PrintAndLogEx(WARNING, "Commit ( " _YELLOW_("fail") " ) Card returns 0x%04x", sw); if (verbose) @@ -1803,7 +1804,7 @@ bool CheckCardCipurse(void) { uint16_t sw = 0; int res = CIPURSESelect(true, false, buf, sizeof(buf), &len, &sw); - return (res == 0 && sw == 0x9000); + return (res == 0 && sw == ISO7816_OK); } static int CmdHFCipurseTest(const char *Cmd) { diff --git a/client/src/cmdhfemrtd.c b/client/src/cmdhfemrtd.c index d22df2459..8799dc12e 100644 --- a/client/src/cmdhfemrtd.c +++ b/client/src/cmdhfemrtd.c @@ -194,7 +194,7 @@ static bool emrtd_exchange_commands(sAPDU_t apdu, bool include_le, uint16_t le, return false; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(DEBUG, "Command failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); return false; } diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index a00206c01..64cc8a43f 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -44,6 +44,7 @@ #include "cmdtrace.h" #include "util.h" #include "fileutils.h" // laodFileJSONroot +#include "protocols.h" // ISO7816 APDU return codes #define DEF_FIDO_SIZE 2048 #define DEF_FIDO_PARAM_FILE "hf_fido2_defparams.json" @@ -84,7 +85,7 @@ static int CmdHFFidoInfo(const char *Cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { if (sw) PrintAndLogEx(INFO, "Not a FIDO card! APDU response: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); else @@ -111,7 +112,7 @@ static int CmdHFFidoInfo(const char *Cmd) { if (res) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "FIDO2 version doesn't exist (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); return PM3_SUCCESS; } @@ -262,7 +263,7 @@ static int CmdHFFidoRegister(const char *cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); json_decref(root); @@ -277,7 +278,7 @@ static int CmdHFFidoRegister(const char *cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "ERROR execute register command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); return PM3_ESOFT; } @@ -584,7 +585,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); json_decref(root); @@ -599,7 +600,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "ERROR execute authentication command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); json_decref(root); return PM3_ESOFT; @@ -724,7 +725,7 @@ static int CmdHFFido2MakeCredential(const char *cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); json_decref(root); @@ -752,7 +753,7 @@ static int CmdHFFido2MakeCredential(const char *cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "ERROR execute make credential command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); json_decref(root); return PM3_EFILE; @@ -843,7 +844,7 @@ static int CmdHFFido2GetAssertion(const char *cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); json_decref(root); @@ -871,7 +872,7 @@ static int CmdHFFido2GetAssertion(const char *cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "ERROR execute get assertion command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); json_decref(root); return PM3_ESOFT; From d3b78e0cf28c7a92796f86b4aa18b5247f3e721f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 12:21:48 +0100 Subject: [PATCH 071/924] swapped to defines --- client/src/cipurse/cipursecore.c | 16 +++++++-------- client/src/cmdhfksx6924.c | 3 ++- client/src/cmdhfseos.c | 5 +++-- client/src/cmdhfst25ta.c | 35 ++++++++++++++++---------------- client/src/emv/cmdemv.c | 9 ++++---- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/client/src/cipurse/cipursecore.c b/client/src/cipurse/cipursecore.c index abe8a6bc2..563fda14f 100644 --- a/client/src/cipurse/cipursecore.c +++ b/client/src/cipurse/cipursecore.c @@ -17,17 +17,17 @@ //----------------------------------------------------------------------------- #include "cipursecore.h" -#include // memcpy memset - -#include "commonutil.h" // ARRAYLEN -#include "comms.h" // DropField -#include "util_posix.h" // msleep +#include // memcpy memset +#include "commonutil.h" // ARRAYLEN +#include "comms.h" // DropField +#include "util_posix.h" // msleep #include "cmdhf14a.h" #include "../emv/emvcore.h" #include "../emv/emvjson.h" -#include "../iso7816/apduinfo.h" // sAPDU_t +#include "../iso7816/apduinfo.h" // sAPDU_t #include "ui.h" #include "util.h" +#include "protocols.h" // ISO7816 APDU return codes // context for secure channel CipurseContext_t cipurseContext; @@ -112,7 +112,7 @@ static int CIPURSEExchangeEx(bool activate_field, bool leave_field_on, sAPDU_t a *sw = isw; } - if (isw != 0x9000) { + if (isw != ISO7816_OK) { if (GetAPDULogging()) { if (*sw >> 8 == 0x61) { PrintAndLogEx(ERR, "APDU chaining len:%02x -->", *sw & 0xff); @@ -255,7 +255,7 @@ bool CIPURSEChannelAuthenticate(uint8_t keyindex, uint8_t *key, bool verbose) { // authenticate res = CIPURSEMutualAuthenticate(keyindex, authparams, sizeof(authparams), buf, sizeof(buf), &len, &sw); - if (res != 0 || sw != 0x9000 || len != 16) { + if (res != 0 || sw != ISO7816_OK || len != 16) { if (sw == 0x6988) { if (verbose) { PrintAndLogEx(WARNING, "Authentication ( " _RED_("fail") " ). Wrong key"); diff --git a/client/src/cmdhfksx6924.c b/client/src/cmdhfksx6924.c index 6064a7611..7616ca766 100644 --- a/client/src/cmdhfksx6924.c +++ b/client/src/cmdhfksx6924.c @@ -46,6 +46,7 @@ #include "emv/tlv.h" #include "iso7816/apduinfo.h" #include "cmdhf14a.h" +#include "protocols.h" // ISO7816 APDU return codes static int CmdHelp(const char *Cmd); @@ -126,7 +127,7 @@ static int CmdHFKSX6924Info(const char *Cmd) { return res; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { if (sw) { PrintAndLogEx(INFO, "Not a KS X 6924 card! APDU response: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); diff --git a/client/src/cmdhfseos.c b/client/src/cmdhfseos.c index 350df87f5..896157be4 100644 --- a/client/src/cmdhfseos.c +++ b/client/src/cmdhfseos.c @@ -30,6 +30,7 @@ #include "iso7816/apduinfo.h" // GetAPDUCodeDescription #include "crypto/asn1utils.h" // ASN1 decode / print #include "commonutil.h" // get_sw +#include "protocols.h" // ISO7816 APDU return codes static int CmdHelp(const char *Cmd); @@ -55,7 +56,7 @@ static int seos_select(void) { } uint16_t sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting SEOS applet aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -75,7 +76,7 @@ static int seos_select(void) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting ADF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; diff --git a/client/src/cmdhfst25ta.c b/client/src/cmdhfst25ta.c index 0ccccd5d6..86dfe0584 100644 --- a/client/src/cmdhfst25ta.c +++ b/client/src/cmdhfst25ta.c @@ -31,6 +31,7 @@ #include "nfc/ndef.h" // NDEFRecordsDecodeAndPrint #include "cmdnfc.h" // print_type4_cc_info #include "commonutil.h" // get_sw +#include "protocols.h" // ISO7816 APDU return codes #define TIMEOUT 2000 @@ -136,7 +137,7 @@ static int infoHFST25TA(void) { } uint16_t sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -156,7 +157,7 @@ static int infoHFST25TA(void) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting CC file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -172,7 +173,7 @@ static int infoHFST25TA(void) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "reading CC file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -192,7 +193,7 @@ static int infoHFST25TA(void) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting system file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -210,7 +211,7 @@ static int infoHFST25TA(void) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "reading system file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -329,7 +330,7 @@ int CmdHFST25TANdefRead(const char *Cmd) { } uint16_t sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -349,7 +350,7 @@ int CmdHFST25TANdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -378,7 +379,7 @@ int CmdHFST25TANdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Verify password failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -397,7 +398,7 @@ int CmdHFST25TANdefRead(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "reading NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -495,7 +496,7 @@ static int CmdHFST25TAProtect(const char *Cmd) { } uint16_t sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -515,7 +516,7 @@ static int CmdHFST25TAProtect(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -534,7 +535,7 @@ static int CmdHFST25TAProtect(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Verify password failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -553,7 +554,7 @@ static int CmdHFST25TAProtect(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "changing protection failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -639,7 +640,7 @@ static int CmdHFST25TAPwd(const char *Cmd) { } uint16_t sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -659,7 +660,7 @@ static int CmdHFST25TAPwd(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Selecting NDEF file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -678,7 +679,7 @@ static int CmdHFST25TAPwd(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "Verify password failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; @@ -699,7 +700,7 @@ static int CmdHFST25TAPwd(const char *Cmd) { } sw = get_sw(response, resplen); - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "password change failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index bf1cde60d..71277d87b 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -17,11 +17,9 @@ //----------------------------------------------------------------------------- #include "cmdemv.h" - #include - -#include "comms.h" // DropField -#include "cmdsmartcard.h" // smart_select +#include "comms.h" // DropField +#include "cmdsmartcard.h" // smart_select #include "cmdtrace.h" #include "emvjson.h" #include "test/cryptotest.h" @@ -35,6 +33,7 @@ #include "ui.h" #include "emv_tags.h" #include "fileutils.h" +#include "protocols.h" // ISO7816 APDU return codes static int CmdHelp(const char *Cmd); @@ -1564,7 +1563,7 @@ static int CmdEMVScan(const char *Cmd) { PrintAndLogEx(INFO, "PPSE"); res = EMVSelectPSE(channel, true, true, 2, buf, sizeof(buf), &len, &sw); - if (!res && sw == 0x9000) { + if (!res && sw == ISO7816_OK) { if (decodeTLV) TLVPrintFromBuffer(buf, len); From 67b340d838533bee75ff39657615b1ab5c2e0114 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 12:26:30 +0100 Subject: [PATCH 072/924] swapped to ISO7816 defines --- client/src/emv/emvcore.c | 13 ++++++------- client/src/iso7816/iso7816core.c | 5 ++--- client/src/ksx6924/ksx6924core.c | 9 +++++---- client/src/mifare/desfirecore.c | 24 ++++++++++++------------ 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 17aa2610e..34aa4d4be 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -17,13 +17,11 @@ //----------------------------------------------------------------------------- #include "emvcore.h" - #include - -#include "commonutil.h" // ARRAYLEN -#include "comms.h" // DropField +#include "commonutil.h" // ARRAYLEN +#include "comms.h" // DropField #include "cmdparser.h" -#include "cmdsmartcard.h" // ExchangeAPDUSC +#include "cmdsmartcard.h" // ExchangeAPDUSC #include "ui.h" #include "cmdhf14a.h" #include "cmdhf14b.h" @@ -31,6 +29,7 @@ #include "emv_tags.h" #include "emvjson.h" #include "util_posix.h" +#include "protocols.h" // ISO7816 APDU return codes // Got from here. Thanks! // https://eftlab.co.uk/index.php/site-map/knowledge-base/211-emv-aid-rid-pix @@ -392,7 +391,7 @@ int EMVSearchPSE(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFi res = EMVSelectPSE(channel, ActivateField, true, PSENum, data, sizeof(data), &datalen, &sw); if (!res) { - if (sw != 0x9000) { + if (sw != ISO7816_OK) { PrintAndLogEx(FAILED, "Select PSE error. APDU error: %04x.", sw); return 1; } @@ -419,7 +418,7 @@ int EMVSearchPSE(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFi } // error catch! - if (sw != 0x9000) { + if (sw != ISO7816_OK) { sfidatalen[ui] = 0; PrintAndLogEx(FAILED, "PPSE get Error. APDU error: %04x.", sw); break; diff --git a/client/src/iso7816/iso7816core.c b/client/src/iso7816/iso7816core.c index 5db7d32aa..7e0dd2c7f 100644 --- a/client/src/iso7816/iso7816core.c +++ b/client/src/iso7816/iso7816core.c @@ -17,9 +17,7 @@ //----------------------------------------------------------------------------- #include "iso7816core.h" - #include - #include "commonutil.h" // ARRAYLEN #include "comms.h" // DropField #include "cmdparser.h" @@ -29,6 +27,7 @@ #include "cmdhf14b.h" #include "iso14b.h" // iso14b_raw_cmd_t #include "util_posix.h" +#include "protocols.h" // ISO7816 APDU return codes //iceman: this logging setting, should be unified with client debug etc. static bool APDULogging = false; @@ -170,7 +169,7 @@ int Iso7816ExchangeEx(Iso7816CommandChannel channel, bool activate_field, bool l *sw = isw; } - if (isw != 0x9000) { + if (isw != ISO7816_OK) { if (APDULogging) { if (*sw >> 8 == 0x61) { PrintAndLogEx(ERR, "APDU chaining len %02x", *sw & 0xFF); diff --git a/client/src/ksx6924/ksx6924core.c b/client/src/ksx6924/ksx6924core.c index b04f87358..39b390039 100644 --- a/client/src/ksx6924/ksx6924core.c +++ b/client/src/ksx6924/ksx6924core.c @@ -38,6 +38,7 @@ #include "util.h" #include "comms.h" // clearCommandBuffer #include "commonutil.h" // ntohl (pm3 version) +#include "protocols.h" // ISO7816 APDU return codes // Date type. This is the actual on-card format. typedef struct { @@ -402,7 +403,7 @@ bool KSX6924TrySelect(void) { return false; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { if (sw) { PrintAndLogEx(FAILED, "Not a KS X 6924 card! APDU response: %04x - %s", @@ -444,7 +445,7 @@ bool KSX6924GetBalance(uint32_t *result) { return false; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { return false; } @@ -476,7 +477,7 @@ bool KSX6924InitializeCard(uint8_t mpda1, uint8_t mpda2, uint8_t mpda3, uint8_t return false; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { return false; } @@ -574,7 +575,7 @@ bool KSX6924ProprietaryGetRecord(uint8_t id, uint8_t *result, size_t result_len) return false; } - if (sw != 0x9000) { + if (sw != ISO7816_OK) { return false; } diff --git a/client/src/mifare/desfirecore.c b/client/src/mifare/desfirecore.c index ab572b4d0..3e002a7ef 100644 --- a/client/src/mifare/desfirecore.c +++ b/client/src/mifare/desfirecore.c @@ -32,9 +32,9 @@ #include "aes.h" #include "ui.h" #include "crc.h" -#include "crc16.h" // crc16 ccitt +#include "crc16.h" // crc16 ccitt #include "crc32.h" -#include "protocols.h" +#include "protocols.h" // ISO7816 APDU return codes #include "cmdhf14a.h" #include "iso7816/apduinfo.h" // APDU manipulation / errorcodes #include "iso7816/iso7816core.h" // APDU logging @@ -470,7 +470,7 @@ static int DESFIRESendApduEx(bool activate_field, sAPDU_t apdu, uint16_t le, uin if (sw) *sw = isw; - if (isw != 0x9000 && + if (isw != ISO7816_OK && isw != DESFIRE_GET_ISO_STATUS(MFDES_S_OPERATION_OK) && isw != DESFIRE_GET_ISO_STATUS(MFDES_S_SIGNATURE) && isw != DESFIRE_GET_ISO_STATUS(MFDES_S_ADDITIONAL_FRAME) && @@ -1655,7 +1655,7 @@ static bool DesfireCheckISOAuthCmd(DesfireISOSelectWay way, uint32_t appID, char uint8_t p2 = ((app_level) ? 0x80 : 0x00) | keyNum; res = DesfireExchangeISO(false, &dctx, (sAPDU_t) {0x00, ISO7816_EXTERNAL_AUTHENTICATION, p1, p2, rndlen * 2, piccrnd}, 0, resp, &resplen, &sw); DropField(); - return (sw == 0x9000 || sw == 0x6982); + return (sw == ISO7816_OK || sw == ISO7816_SECURITY_STATUS_NOT_SATISFIED); } void DesfireCheckAuthCommands(DesfireISOSelectWay way, uint32_t appID, char *dfname, uint8_t keyNum, AuthCommandsChk_t *authCmdCheck) { @@ -2859,7 +2859,7 @@ int DesfireISOSelectEx(DesfireContext_t *dctx, bool fieldon, DesfireISOSelectCon size_t xresplen = 0; uint16_t sw = 0; int res = DesfireExchangeISO(fieldon, dctx, (sAPDU_t) {0x00, ISO7816_SELECT_FILE, cntr, ((resp == NULL) ? 0x0C : 0x00), datalen, data}, APDU_INCLUDE_LE_00, xresp, &xresplen, &sw); - if (res == PM3_SUCCESS && sw != 0x9000) + if (res == PM3_SUCCESS && sw != ISO7816_OK) return PM3_ESOFT; if (resp != NULL && resplen != NULL) { @@ -2885,7 +2885,7 @@ int DesfireISOSelectDF(DesfireContext_t *dctx, char *dfname, uint8_t *resp, size int DesfireISOGetChallenge(DesfireContext_t *dctx, DesfireCryptoAlgorithm keytype, uint8_t *resp, size_t *resplen) { uint16_t sw = 0; int res = DesfireExchangeISO(false, dctx, (sAPDU_t) {0x00, ISO7816_GET_CHALLENGE, 0x00, 0x00, 0x00, NULL}, DesfireGetRndLenForKey(keytype), resp, resplen, &sw); - if (res == PM3_SUCCESS && sw != 0x9000) + if (res == PM3_SUCCESS && sw != ISO7816_OK) return PM3_ESOFT; return res; @@ -2900,7 +2900,7 @@ int DesfireISOExternalAuth(DesfireContext_t *dctx, bool app_level, uint8_t keynu uint16_t sw = 0; int res = DesfireExchangeISO(false, dctx, (sAPDU_t) {0x00, ISO7816_EXTERNAL_AUTHENTICATION, p1, p2, DesfireGetRndLenForKey(keytype) * 2, data}, 0, resp, &resplen, &sw); - if (res == PM3_SUCCESS && sw != 0x9000) + if (res == PM3_SUCCESS && sw != ISO7816_OK) return PM3_ESOFT; return res; @@ -2913,7 +2913,7 @@ int DesfireISOInternalAuth(DesfireContext_t *dctx, bool app_level, uint8_t keynu uint16_t sw = 0; int res = DesfireExchangeISO(false, dctx, (sAPDU_t) {0x00, ISO7816_INTERNAL_AUTHENTICATION, p1, p2, keylen, data}, keylen * 2, resp, resplen, &sw); - if (res == PM3_SUCCESS && sw != 0x9000) + if (res == PM3_SUCCESS && sw != ISO7816_OK) return PM3_ESOFT; return res; @@ -2929,7 +2929,7 @@ int DesfireISOReadBinary(DesfireContext_t *dctx, bool use_file_id, uint8_t filei uint16_t sw = 0; int res = DesfireExchangeISO(false, dctx, (sAPDU_t) {0x00, ISO7816_READ_BINARY, p1, p2, 0, NULL}, (length == 0) ? APDU_INCLUDE_LE_00 : length, resp, resplen, &sw); - if (res == PM3_SUCCESS && sw != 0x9000) + if (res == PM3_SUCCESS && sw != ISO7816_OK) return PM3_ESOFT; return res; @@ -2948,7 +2948,7 @@ int DesfireISOUpdateBinary(DesfireContext_t *dctx, bool use_file_id, uint8_t fil uint16_t sw = 0; int res = DesfireExchangeISO(false, dctx, (sAPDU_t) {0x00, ISO7816_UPDATE_BINARY, p1, p2, datalen, data}, 0, resp, &resplen, &sw); - if (res == PM3_SUCCESS && sw != 0x9000) + if (res == PM3_SUCCESS && sw != ISO7816_OK) return PM3_ESOFT; return res; @@ -2959,7 +2959,7 @@ int DesfireISOReadRecords(DesfireContext_t *dctx, uint8_t recordnum, bool read_a uint16_t sw = 0; int res = DesfireExchangeISO(false, dctx, (sAPDU_t) {0x00, ISO7816_READ_RECORDS, recordnum, p2, 0, NULL}, (length == 0) ? APDU_INCLUDE_LE_00 : length, resp, resplen, &sw); - if (res == PM3_SUCCESS && sw != 0x9000) + if (res == PM3_SUCCESS && sw != ISO7816_OK) return PM3_ESOFT; return res; @@ -2973,7 +2973,7 @@ int DesfireISOAppendRecord(DesfireContext_t *dctx, uint8_t fileid, uint8_t *data uint16_t sw = 0; int res = DesfireExchangeISO(false, dctx, (sAPDU_t) {0x00, ISO7816_APPEND_RECORD, 0x00, p2, datalen, data}, 0, resp, &resplen, &sw); - if (res == PM3_SUCCESS && sw != 0x9000) + if (res == PM3_SUCCESS && sw != ISO7816_OK) return PM3_ESOFT; return res; From 838a45cb84dec16cf001fd56ed9ce4965102c7fe Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 18:15:03 +0100 Subject: [PATCH 073/924] text --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9867f7f70..f221d51f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `lf paradox clone` - it now accepts FC/CN (@mwalker33) + - Added standalone mode for simulatin Nedap ID (@anon) - Changed `hf mfu info` - now also does a simple OTP fingerprinting (@iceman1001) - Changed `hf mf wrbl` - now checks for strict readonly ACL's in the data to write (@iceman1001) - Changed `hf mf view` - verbose printing if strict readonly ACL's exists in dump file (@iceman1001) @@ -36,7 +38,6 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001) - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) - Fixed `make accessrights` on Fedora (@mooey5775) - - Added standalone mode for simulatin Nedap ID ## [Radium.4.15864][2022-10-29] - Changed `lf indala sim` - now accepts fc / cn (@iceman1001) From 35d1bebf0863a9be1356c984f241d29001daa669 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 18:46:49 +0100 Subject: [PATCH 074/924] changed the "path" param to "dir" and added some more help text samples, for binary files, we now check for lower case ".bin" too --- client/src/cmdhfemrtd.c | 68 ++++++++++++++++++++++------------------- client/src/util.c | 8 +++++ client/src/util.h | 3 ++ 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/client/src/cmdhfemrtd.c b/client/src/cmdhfemrtd.c index 8799dc12e..c99c4b939 100644 --- a/client/src/cmdhfemrtd.c +++ b/client/src/cmdhfemrtd.c @@ -1957,16 +1957,18 @@ int infoHF_EMRTD_offline(const char *path) { uint8_t *data; size_t datalen = 0; char *filepath = calloc(strlen(path) + 100, sizeof(char)); - if (filepath == NULL) + if (filepath == NULL) { return PM3_EMALLOC; + } strcpy(filepath, path); strncat(filepath, PATHSEP, 2); strcat(filepath, dg_table[EF_COM].filename); - if (loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS) { - PrintAndLogEx(ERR, "Failed to read EF_COM."); - free(filepath); - return PM3_ESOFT; + if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS) && + (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS)) { + PrintAndLogEx(ERR, "Failed to read EF_COM"); + free(filepath); + return PM3_ESOFT; } int res = emrtd_print_ef_com_info(data, datalen); @@ -1996,21 +1998,23 @@ int infoHF_EMRTD_offline(const char *path) { strncat(filepath, PATHSEP, 2); strcat(filepath, dg_table[EF_CardAccess].filename); - if (loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS) { - emrtd_print_ef_cardaccess_info(data, datalen); - free(data); + if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS) || + (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS)) { + emrtd_print_ef_cardaccess_info(data, datalen); + free(data); } else { - PrintAndLogEx(HINT, "The error above this is normal. It just means that your eMRTD lacks PACE."); + PrintAndLogEx(HINT, "The error above this is normal. It just means that your eMRTD lacks PACE"); } strcpy(filepath, path); strncat(filepath, PATHSEP, 2); strcat(filepath, dg_table[EF_SOD].filename); - if (loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS) { - PrintAndLogEx(ERR, "Failed to read EF_SOD."); - free(filepath); - return PM3_ESOFT; + if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS) && + (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS)) { + PrintAndLogEx(ERR, "Failed to read EF_SOD"); + free(filepath); + return PM3_ESOFT; } // coverity scan CID 395630, @@ -2020,7 +2024,7 @@ int infoHF_EMRTD_offline(const char *path) { res = emrtd_parse_ef_sod_hashes(data, datalen, *dg_hashes_sod, &hash_algo); if (res != PM3_SUCCESS) { - PrintAndLogEx(ERR, "Failed to read hash list from EF_SOD. Hash checks will fail."); + PrintAndLogEx(ERR, "Failed to read hash list from EF_SOD. Hash checks will fail"); } free(data); @@ -2035,10 +2039,12 @@ int infoHF_EMRTD_offline(const char *path) { strcpy(filepath, path); strncat(filepath, PATHSEP, 2); strcat(filepath, dg->filename); - if (loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS) { + if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS) || + (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS)) { // we won't halt on parsing errors - if (dg->parser != NULL) + if (dg->parser != NULL) { dg->parser(data, datalen); + } PrintAndLogEx(DEBUG, "EF_DG%i hash algo: %i", dg->dgnum, hash_algo); // Check file hash @@ -2058,13 +2064,6 @@ int infoHF_EMRTD_offline(const char *path) { return PM3_SUCCESS; } -static void text_to_upper(uint8_t *data, int datalen) { - // Loop over text to make lowercase text uppercase - for (int i = 0; i < datalen; i++) { - data[i] = toupper(data[i]); - } -} - static bool validate_date(uint8_t *data, int datalen) { // Date has to be 6 chars if (datalen != 6) { @@ -2085,7 +2084,9 @@ static int CmdHFeMRTDDump(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf emrtd dump", "Dump all files on an eMRTD", - "hf emrtd dump" + "hf emrtd dump\n" + "hf emrtd dump --dir ../dump\n" + "hf emrtd dump -n 123456789 -d 19890101 -e 20250401" ); void *argtable[] = { @@ -2094,7 +2095,7 @@ static int CmdHFeMRTDDump(const char *Cmd) { arg_str0("d", "dateofbirth", "", "date of birth in YYMMDD format"), arg_str0("e", "expiry", "", "expiry in YYMMDD format"), arg_str0("m", "mrz", "<[0-9A-Z<]>", "2nd line of MRZ, 44 chars"), - arg_str0(NULL, "path", "", "save dump to the given dirpath"), + arg_str0(NULL, "dir", "", "save dump to the given dirpath"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -2110,7 +2111,7 @@ static int CmdHFeMRTDDump(const char *Cmd) { if (CLIParamStrToBuf(arg_get_str(ctx, 1), docnum, 9, &slen) != 0 || slen == 0) { BAC = false; } else { - text_to_upper(docnum, slen); + strn_upper((char*)docnum, slen); if (slen != 9) { // Pad to 9 with < memset(docnum + slen, '<', 9 - slen); @@ -2143,7 +2144,7 @@ static int CmdHFeMRTDDump(const char *Cmd) { error = true; } else { BAC = true; - text_to_upper(mrz, slen); + strn_upper((char*)mrz, slen); memcpy(docnum, &mrz[0], 9); memcpy(dob, &mrz[13], 6); memcpy(expiry, &mrz[21], 6); @@ -2183,7 +2184,10 @@ static int CmdHFeMRTDInfo(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf emrtd info", "Display info about an eMRTD", - "hf emrtd info" + "hf emrtd info\n" + "hf emrtd info --dir ../dumps\n" + "hf emrtd info -n 123456789 -d 19890101 -e 20250401\n" + "hf emrtd info -n 123456789 -d 19890101 -e 20250401 -i" ); void *argtable[] = { @@ -2192,7 +2196,7 @@ static int CmdHFeMRTDInfo(const char *Cmd) { arg_str0("d", "dateofbirth", "", "date of birth in YYMMDD format"), arg_str0("e", "expiry", "", "expiry in YYMMDD format"), arg_str0("m", "mrz", "<[0-9A-Z<]>", "2nd line of MRZ, 44 chars (passports only)"), - arg_str0(NULL, "path", "", "display info from offline dump stored in dirpath"), + arg_str0(NULL, "dir", "", "display info from offline dump stored in dirpath"), arg_lit0("i", "images", "show images"), arg_param_end }; @@ -2209,7 +2213,7 @@ static int CmdHFeMRTDInfo(const char *Cmd) { if (CLIParamStrToBuf(arg_get_str(ctx, 1), docnum, 9, &slen) != 0 || slen == 0) { BAC = false; } else { - text_to_upper(docnum, slen); + strn_upper((char*)docnum, slen); if (slen != 9) { memset(docnum + slen, '<', 9 - slen); } @@ -2241,7 +2245,7 @@ static int CmdHFeMRTDInfo(const char *Cmd) { error = true; } else { BAC = true; - text_to_upper(mrz, slen); + strn_upper((char*)mrz, slen); memcpy(docnum, &mrz[0], 9); memcpy(dob, &mrz[13], 6); memcpy(expiry, &mrz[21], 6); @@ -2262,7 +2266,7 @@ static int CmdHFeMRTDInfo(const char *Cmd) { bool is_offline = CLIParamStrToBuf(arg_get_str(ctx, 5), path, sizeof(path), &slen) == 0 && slen > 0; bool show_images = arg_get_lit(ctx, 6); CLIParserFree(ctx); - if ((! IfPm3Iso14443()) && (! is_offline)) { + if ((IfPm3Iso14443() == false) && (is_offline == false)) { PrintAndLogEx(WARNING, "Only offline mode is available"); error = true; } diff --git a/client/src/util.c b/client/src/util.c index 56eb3164a..dc58eef2c 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -1088,6 +1088,14 @@ void str_lower(char *s) { s[i] = tolower(s[i]); } +void str_upper(char *s) { + strn_upper(s, strlen(s)); +} + +void strn_upper(char *s, size_t n) { + for (size_t i = 0; i < n; i++) + s[i] = toupper(s[i]); +} // check for prefix in string bool str_startswith(const char *s, const char *pre) { return strncmp(pre, s, strlen(pre)) == 0; diff --git a/client/src/util.h b/client/src/util.h index 616272c84..d831a750b 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -129,6 +129,9 @@ uint64_t HornerScheme(uint64_t num, uint64_t divider, uint64_t factor); int num_CPUs(void); // number of logical CPUs void str_lower(char *s); // converts string to lower case +void str_upper(char *s); // converts string to UPPER case +void strn_upper(char *s, size_t n); + bool str_startswith(const char *s, const char *pre); // check for prefix in string bool str_endswith(const char *s, const char *suffix); // check for suffix in string void clean_ascii(unsigned char *buf, size_t len); From aa1f4681a25146b515313190e33980fb7981639f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 18:48:11 +0100 Subject: [PATCH 075/924] text --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f221d51f6..97fa48f5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf emrtd info` - looking for lower case .bin extensions (@iceman1001) + - Changed `hf emrtd dump` - looking for lower case .bin extensions (@iceman1001) - Changed `lf paradox clone` - it now accepts FC/CN (@mwalker33) - Added standalone mode for simulatin Nedap ID (@anon) - Changed `hf mfu info` - now also does a simple OTP fingerprinting (@iceman1001) From ad7b18fb2ffb7cc40450bdd210ab813f24b0b5c5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Jan 2023 18:52:59 +0100 Subject: [PATCH 076/924] use env instead --- tools/mkversion.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/mkversion.sh b/tools/mkversion.sh index c1819f34e..f741f2980 100755 --- a/tools/mkversion.sh +++ b/tools/mkversion.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env sh # Output a version_pm3.c file that includes information about the current build # From mkversion.pl From 5d5d9d9be0b86d5343378948d5c9c89df9320a7f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 14 Jan 2023 22:22:04 +0100 Subject: [PATCH 077/924] make style --- armsrc/Standalone/lf_nedap_sim.c | 114 ++++--- client/src/cmdhfemrtd.c | 36 +-- client/src/cmdhfmf.c | 2 +- client/src/cmdhfmfu.c | 8 +- client/src/cmdlfparadox.c | 22 +- client/src/cmdpiv.c | 10 +- client/src/fileutils.c | 6 +- client/src/mifare/mifarehost.c | 40 +-- client/src/pm3line_vocabulory.h | 17 +- client/src/ui.c | 12 +- doc/commands.json | 493 +++++++++---------------------- doc/commands.md | 27 +- include/protocol_vigik.h | 2 +- include/protocols.h | 2 +- 14 files changed, 262 insertions(+), 529 deletions(-) diff --git a/armsrc/Standalone/lf_nedap_sim.c b/armsrc/Standalone/lf_nedap_sim.c index 491199c27..dcd093fee 100644 --- a/armsrc/Standalone/lf_nedap_sim.c +++ b/armsrc/Standalone/lf_nedap_sim.c @@ -30,11 +30,11 @@ #define MODULE_LONG_NAME "LF Nedap simple simulator" typedef struct _NEDAP_TAG { - uint8_t subType; - uint16_t customerCode; - uint32_t id; - - uint8_t bIsLong; + uint8_t subType; + uint16_t customerCode; + uint32_t id; + + uint8_t bIsLong; } NEDAP_TAG, *PNEDAP_TAG; const NEDAP_TAG Tag = {.subType = 0x5, .customerCode = 0x123, .id = 42424, .bIsLong = 1}; @@ -46,78 +46,67 @@ static uint8_t isEven_64_63(const uint8_t *data); static inline uint32_t bitcount32(uint32_t a); static void bytes_to_bytebits(const void *src, const size_t srclen, void *dest); -void ModInfo(void) -{ +void ModInfo(void) { DbpString(" " MODULE_LONG_NAME); } -void RunMod(void) -{ - int n; +void RunMod(void) { + int n; - StandAloneMode(); + StandAloneMode(); Dbprintf("[=] " MODULE_LONG_NAME " -- started"); - FpgaDownloadAndGo(FPGA_BITSTREAM_LF); - Dbprintf("[=] NEDAP (%s) - ID: " _GREEN_("%05u") " subtype: " _GREEN_("%1u") " customer code: " _GREEN_("%u / 0x%03X"), Tag.bIsLong ? "128b" : "64b", Tag.id, Tag.subType, Tag.customerCode, Tag.customerCode); - - n = NedapPrepareBigBuffer(&Tag); - do - { + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); + Dbprintf("[=] NEDAP (%s) - ID: " _GREEN_("%05u") " subtype: " _GREEN_("%1u") " customer code: " _GREEN_("%u / 0x%03X"), Tag.bIsLong ? "128b" : "64b", Tag.id, Tag.subType, Tag.customerCode, Tag.customerCode); + + n = NedapPrepareBigBuffer(&Tag); + do { WDT_HIT(); if (data_available()) - break; + break; + + SimulateTagLowFrequency(n, 0, true); - SimulateTagLowFrequency(n, 0, true); - } while (BUTTON_HELD(1000) == BUTTON_NO_CLICK); Dbprintf("[=] " MODULE_LONG_NAME " -- exiting"); - + LEDsoff(); } -static int NedapPrepareBigBuffer(const NEDAP_TAG *pTag) -{ - int ret = 0; - uint8_t data[16], bitStream[sizeof(data) * 8], phase = 0; - uint16_t i, size = pTag->bIsLong ? sizeof(data) : (sizeof(data) / 2); - - NedapGen(pTag->subType, pTag->customerCode, pTag->id, pTag->bIsLong, data); - bytes_to_bytebits(data, size, bitStream); - size <<= 3; - - for (i = 0; i < size; i++) - { - biphaseSimBitInverted(!bitStream[i], &ret, &phase); - } - if (phase == 1) //run a second set inverted to keep phase in check - { - for (i = 0; i < size; i++) - { - biphaseSimBitInverted(!bitStream[i], &ret, &phase); - } - } - - return ret; +static int NedapPrepareBigBuffer(const NEDAP_TAG *pTag) { + int ret = 0; + uint8_t data[16], bitStream[sizeof(data) * 8], phase = 0; + uint16_t i, size = pTag->bIsLong ? sizeof(data) : (sizeof(data) / 2); + + NedapGen(pTag->subType, pTag->customerCode, pTag->id, pTag->bIsLong, data); + bytes_to_bytebits(data, size, bitStream); + size <<= 3; + + for (i = 0; i < size; i++) { + biphaseSimBitInverted(!bitStream[i], &ret, &phase); + } + if (phase == 1) { //run a second set inverted to keep phase in check + for (i = 0; i < size; i++) { + biphaseSimBitInverted(!bitStream[i], &ret, &phase); + } + } + + return ret; } -static void biphaseSimBitInverted(uint8_t c, int *n, uint8_t *phase) -{ - uint8_t *dest = BigBuf_get_addr(); +static void biphaseSimBitInverted(uint8_t c, int *n, uint8_t *phase) { + uint8_t *dest = BigBuf_get_addr(); - if (c) - { - memset(dest + (*n), c ^ 1 ^ *phase, 32); - memset(dest + (*n) + 32, c ^ *phase, 32); - } - else - { - memset(dest + (*n), c ^ *phase, 64); - *phase ^= 1; - } - *n += 64; + if (c) { + memset(dest + (*n), c ^ 1 ^ *phase, 32); + memset(dest + (*n) + 32, c ^ *phase, 32); + } else { + memset(dest + (*n), c ^ *phase, 64); + *phase ^= 1; + } + *n += 64; } #define FIXED_71 0x71 @@ -190,13 +179,11 @@ static uint8_t isEven_64_63(const uint8_t *data) { // 8 return (bitcount32(tmp[0]) + (bitcount32(tmp[1] & 0xfeffffff))) & 1; } -static void bytes_to_bytebits(const void *src, const size_t srclen, void *dest) -{ +static void bytes_to_bytebits(const void *src, const size_t srclen, void *dest) { uint8_t *s = (uint8_t *)src, *d = (uint8_t *)dest; size_t i = srclen * 8, j = srclen; - while (j--) - { + while (j--) { uint8_t b = s[j]; d[--i] = (b >> 0) & 1; d[--i] = (b >> 1) & 1; @@ -209,8 +196,7 @@ static void bytes_to_bytebits(const void *src, const size_t srclen, void *dest) } } -static inline uint32_t bitcount32(uint32_t a) -{ +static inline uint32_t bitcount32(uint32_t a) { #if defined __GNUC__ return __builtin_popcountl(a); #else diff --git a/client/src/cmdhfemrtd.c b/client/src/cmdhfemrtd.c index c99c4b939..bb0808a51 100644 --- a/client/src/cmdhfemrtd.c +++ b/client/src/cmdhfemrtd.c @@ -1964,11 +1964,11 @@ int infoHF_EMRTD_offline(const char *path) { strncat(filepath, PATHSEP, 2); strcat(filepath, dg_table[EF_COM].filename); - if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS) && - (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS)) { - PrintAndLogEx(ERR, "Failed to read EF_COM"); - free(filepath); - return PM3_ESOFT; + if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS) && + (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS)) { + PrintAndLogEx(ERR, "Failed to read EF_COM"); + free(filepath); + return PM3_ESOFT; } int res = emrtd_print_ef_com_info(data, datalen); @@ -1999,9 +1999,9 @@ int infoHF_EMRTD_offline(const char *path) { strcat(filepath, dg_table[EF_CardAccess].filename); if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS) || - (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS)) { - emrtd_print_ef_cardaccess_info(data, datalen); - free(data); + (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS)) { + emrtd_print_ef_cardaccess_info(data, datalen); + free(data); } else { PrintAndLogEx(HINT, "The error above this is normal. It just means that your eMRTD lacks PACE"); } @@ -2010,11 +2010,11 @@ int infoHF_EMRTD_offline(const char *path) { strncat(filepath, PATHSEP, 2); strcat(filepath, dg_table[EF_SOD].filename); - if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS) && - (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS)) { - PrintAndLogEx(ERR, "Failed to read EF_SOD"); - free(filepath); - return PM3_ESOFT; + if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS) && + (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) != PM3_SUCCESS)) { + PrintAndLogEx(ERR, "Failed to read EF_SOD"); + free(filepath); + return PM3_ESOFT; } // coverity scan CID 395630, @@ -2040,7 +2040,7 @@ int infoHF_EMRTD_offline(const char *path) { strncat(filepath, PATHSEP, 2); strcat(filepath, dg->filename); if ((loadFile_safeEx(filepath, ".BIN", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS) || - (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS)) { + (loadFile_safeEx(filepath, ".bin", (void **)&data, (size_t *)&datalen, false) == PM3_SUCCESS)) { // we won't halt on parsing errors if (dg->parser != NULL) { dg->parser(data, datalen); @@ -2111,7 +2111,7 @@ static int CmdHFeMRTDDump(const char *Cmd) { if (CLIParamStrToBuf(arg_get_str(ctx, 1), docnum, 9, &slen) != 0 || slen == 0) { BAC = false; } else { - strn_upper((char*)docnum, slen); + strn_upper((char *)docnum, slen); if (slen != 9) { // Pad to 9 with < memset(docnum + slen, '<', 9 - slen); @@ -2144,7 +2144,7 @@ static int CmdHFeMRTDDump(const char *Cmd) { error = true; } else { BAC = true; - strn_upper((char*)mrz, slen); + strn_upper((char *)mrz, slen); memcpy(docnum, &mrz[0], 9); memcpy(dob, &mrz[13], 6); memcpy(expiry, &mrz[21], 6); @@ -2213,7 +2213,7 @@ static int CmdHFeMRTDInfo(const char *Cmd) { if (CLIParamStrToBuf(arg_get_str(ctx, 1), docnum, 9, &slen) != 0 || slen == 0) { BAC = false; } else { - strn_upper((char*)docnum, slen); + strn_upper((char *)docnum, slen); if (slen != 9) { memset(docnum + slen, '<', 9 - slen); } @@ -2245,7 +2245,7 @@ static int CmdHFeMRTDInfo(const char *Cmd) { error = true; } else { BAC = true; - strn_upper((char*)mrz, slen); + strn_upper((char *)mrz, slen); memcpy(docnum, &mrz[0], 9); memcpy(dob, &mrz[13], 6); memcpy(expiry, &mrz[21], 6); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 2ea197cf7..98a587cf1 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -569,7 +569,7 @@ static int CmdHF14AMfWrBl(const char *Cmd) { uint8_t blockno = (uint8_t)b; - // Sector trailer sanity checks. + // Sector trailer sanity checks. // Warn if ACL is strict read-only, or invalid ACL. if (mfIsSectorTrailer(blockno)) { PrintAndLogEx(INFO, "Sector trailer (ST) write detected"); diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 00df6e710..bc8c10859 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1376,7 +1376,7 @@ static int mfu_fingerprint(TagTypeUL_t tagtype, bool hasAuthKey, uint8_t *authke } } - // OTP checks + // OTP checks mfu_otp_identify_t *item = mfu_match_otp_fingerprint(data); if (item) { PrintAndLogEx(SUCCESS, "Found " _GREEN_("%s"), item->desc); @@ -1391,9 +1391,9 @@ static int mfu_fingerprint(TagTypeUL_t tagtype, bool hasAuthKey, uint8_t *authke } } } - // - - + // + + out: free(data); diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index e1a714c96..bbd6cd205 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -264,7 +264,7 @@ static int CmdParadoxClone(const char *Cmd) { } uint32_t blocks[4]; - + if (raw_len != 0) { if (raw_len != 12) { PrintAndLogEx(ERR, "Data must be 12 bytes (24 HEX characters) %d", raw_len); @@ -280,39 +280,39 @@ static int CmdParadoxClone(const char *Cmd) { manchester[0] = 0x0F; // preamble manchester[1] = 0x05; // Leading zeros - Note: from this byte on, is part of the CRC calculation - manchester[2] = 0x55; // Leading zeros its 4 bits out for the CRC, so we need too move + manchester[2] = 0x55; // Leading zeros its 4 bits out for the CRC, so we need too move manchester[3] = 0x55; // Leading zeros back 4 bits once we have the crc (done below) // add FC - t1 = manchesterEncode2Bytes (fc); + t1 = manchesterEncode2Bytes(fc); manchester[4] = (t1 >> 8) & 0xFF; manchester[5] = t1 & 0xFF; - + // add cn - t1 = manchesterEncode2Bytes (cn); + t1 = manchesterEncode2Bytes(cn); manchester[6] = (t1 >> 24) & 0xFF; manchester[7] = (t1 >> 16) & 0xFF; manchester[8] = (t1 >> 8) & 0xFF; manchester[9] = t1 & 0xFF; - uint8_t crc = (CRC8Maxim(manchester+1, 9) ^ 0x6) & 0xFF; + uint8_t crc = (CRC8Maxim(manchester + 1, 9) ^ 0x6) & 0xFF; // add crc - t1 = manchesterEncode2Bytes (crc); + t1 = manchesterEncode2Bytes(crc); manchester[10] = (t1 >> 8) & 0xFF; manchester[11] = t1 & 0xFF; // move left 4 bits left 4 bits - Now that we have the CRC we need to re-align the data. for (int i = 1; i < 12; i++) - manchester[i] = (manchester[i] << 4) + (manchester[i+1] >> 4); - + manchester[i] = (manchester[i] << 4) + (manchester[i + 1] >> 4); + // Add trailing 1010 (11) manchester[11] |= (1 << 3); manchester[11] |= (1 << 1); - + // move into tag blocks for (int i = 0; i < 12; i++) - blocks[1 + (i/4)] += (manchester[i] << (8 * (3 - i % 4))); + blocks[1 + (i / 4)] += (manchester[i] << (8 * (3 - i % 4))); } // Paradox - FSK2a, data rate 50, 3 data blocks diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index 3d703e1ec..12b217ebc 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -66,7 +66,7 @@ static const struct piv_container PIV_CONTAINERS[] = { {0x0100, PIV_TAG_ID("\x5F\xC1\x0A"), 3, PIV_CONDITIONAL, "X.509 Certificate for Digital Signature (key ref 9C)"}, {0x0102, PIV_TAG_ID("\x5F\xC1\x0B"), 3, PIV_CONDITIONAL, "X.509 Certificate for Key Management (key ref 9D)"}, {0x3001, PIV_TAG_ID("\x5F\xC1\x09"), 3, PIV_OPTIONAL, "Printed Information"}, - {0x6050, PIV_TAG_ID( "\x7E"), 1, PIV_OPTIONAL, "Discovery Object"}, + {0x6050, PIV_TAG_ID("\x7E"), 1, PIV_OPTIONAL, "Discovery Object"}, {0x6060, PIV_TAG_ID("\x5F\xC1\x0C"), 3, PIV_OPTIONAL, "Key History Object"}, {0x1001, PIV_TAG_ID("\x5F\xC1\x0D"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 1 (key ref 82)"}, {0x1002, PIV_TAG_ID("\x5F\xC1\x0E"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 2 (key ref 83)"}, @@ -89,7 +89,7 @@ static const struct piv_container PIV_CONTAINERS[] = { {0x1013, PIV_TAG_ID("\x5F\xC1\x1F"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 19 (key ref 94)"}, {0x1014, PIV_TAG_ID("\x5F\xC1\x20"), 3, PIV_OPTIONAL, "Retired X.509 Certificate for Key Management 20 (key ref 95)"}, {0x1015, PIV_TAG_ID("\x5F\xC1\x21"), 3, PIV_OPTIONAL, "Cardholder Iris Images"}, - {0x1016, PIV_TAG_ID( "\x7F\x61"), 2, PIV_OPTIONAL, "Biometric Information Templates Group Template"}, + {0x1016, PIV_TAG_ID("\x7F\x61"), 2, PIV_OPTIONAL, "Biometric Information Templates Group Template"}, {0x1017, PIV_TAG_ID("\x5F\xC1\x22"), 3, PIV_OPTIONAL, "Secure Messaging Certificate Signer"}, {0x1018, PIV_TAG_ID("\x5F\xC1\x23"), 3, PIV_OPTIONAL, "Pairing Code Reference Data Container"}, PIV_CONTAINER_FINISH, @@ -493,13 +493,13 @@ static void piv_print_cb(void *data, const struct tlv *tlv, int level, bool is_l } } -static void PrintTLV(const struct tlvdb* tlvdb) { +static void PrintTLV(const struct tlvdb *tlvdb) { if (tlvdb) { tlvdb_visit(tlvdb, piv_print_cb, NULL, 0); } } -static void PrintTLVFromBuffer(const uint8_t* buf, size_t len) { +static void PrintTLVFromBuffer(const uint8_t *buf, size_t len) { if (buf == NULL || len == 0) { return; } @@ -598,7 +598,7 @@ static int PivGetData(Iso7816CommandChannel channel, const uint8_t tag[], size_t return PM3_SUCCESS; } -static int PivGetDataByCidAndPrint(Iso7816CommandChannel channel, const struct piv_container* cid, bool decodeTLV, bool verbose) { +static int PivGetDataByCidAndPrint(Iso7816CommandChannel channel, const struct piv_container *cid, bool decodeTLV, bool verbose) { struct tlvdb_root *root = NULL; if (cid == NULL) { diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 22cf3ad5e..e42ac5a16 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -258,13 +258,13 @@ static size_t path_size(savePaths_t a) { if (a == spItemCount) { return 0; } - return strlen( g_session.defaultPaths[a] ); + return strlen(g_session.defaultPaths[a]); } char *newfilenamemcopy(const char *preferredName, const char *suffix) { if (preferredName == NULL || suffix == NULL) { return NULL; - } + } uint16_t p_namelen = strlen(preferredName); if (str_endswith(preferredName, suffix)) @@ -328,7 +328,7 @@ int saveFileEML(const char *preferredName, uint8_t *data, size_t datalen, size_t } char *fileName = newfilenamemcopy(preferredName, ".eml"); - if (fileName == NULL) { + if (fileName == NULL) { return PM3_EMALLOC; } diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 5ce88123d..0c8c8b274 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1466,7 +1466,7 @@ int convert_mfc_2_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen) ilen -= MFBLOCK_SIZE; *olen += MFBLOCK_SIZE; } - return PM3_SUCCESS; + return PM3_SUCCESS; } static const vigik_pk_t vigik_rsa_pk[] = { @@ -1502,7 +1502,7 @@ static void reverse_array(const uint8_t *src, int src_len, uint8_t *dest) { int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature_len) { // iso9796 - // Exponent V = 2 + // Exponent V = 2 // n = The public modulus n is the product of the secret prime factors p and q. Its length is 1024 bits. if (g_debugMode == DEBUG) { @@ -1527,7 +1527,7 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature // signature = h( C || M1 || h(M2) ) // 1024 - 786 - 160 - 16 -1 - // salt C + // salt C // message M = 96 bytes, 768 bits // sha1 hash H = 20 bytes, 160 bits // padding = 20 bytes, 96 bits @@ -1563,18 +1563,18 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature mbedtls_mpi_init(&sqr); mbedtls_mpi_init(&res); - mbedtls_mpi_read_binary(&N, (const unsigned char*)n, PUBLIC_VIGIK_KEYLEN); + mbedtls_mpi_read_binary(&N, (const unsigned char *)n, PUBLIC_VIGIK_KEYLEN); //mbedtls_mpi_read_binary(&s, (const unsigned char*)signature, signature_len); - mbedtls_mpi_read_binary(&s, (const unsigned char*)rev_sig, signature_len); + mbedtls_mpi_read_binary(&s, (const unsigned char *)rev_sig, signature_len); // check is sign < (N/2) - + mbedtls_mpi n_2; mbedtls_mpi_init(&n_2); mbedtls_mpi_copy(&n_2, &N); mbedtls_mpi_shift_r(&n_2, 1); - bool is_less = (mbedtls_mpi_cmp_mpi(&s, &n_2) > 0) ? false : true; + bool is_less = (mbedtls_mpi_cmp_mpi(&s, &n_2) > 0) ? false : true; PrintAndLogEx(DEBUG, "z < (N/2) ..... %s", (is_less) ? _GREEN_("YES") : _RED_("NO")); mbedtls_mpi_free(&n_2); @@ -1644,10 +1644,10 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature PrintAndLogEx(DEBUG, "LSB............ " _GREEN_("%u"), lsb); if (g_debugMode == DEBUG) { - mbedtls_mpi_write_file( "[=] N.............. ", &N, 16, NULL ); - mbedtls_mpi_write_file( "[=] signature...... ", &s, 16, NULL ); - mbedtls_mpi_write_file( "[=] square mod n... ", &sqr, 16, NULL ); - mbedtls_mpi_write_file( "[=] n-fs........... ", &res, 16, NULL ); + mbedtls_mpi_write_file("[=] N.............. ", &N, 16, NULL); + mbedtls_mpi_write_file("[=] signature...... ", &s, 16, NULL); + mbedtls_mpi_write_file("[=] square mod n... ", &sqr, 16, NULL); + mbedtls_mpi_write_file("[=] n-fs........... ", &res, 16, NULL); } @@ -1656,9 +1656,9 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature // xor 0xDC01 int count_zero = 0; - for (int x = 0; x < sizeof(nfs); x +=2) { + for (int x = 0; x < sizeof(nfs); x += 2) { nfs[x] ^= 0xDC; - nfs[x+1] ^= 0x01; + nfs[x + 1] ^= 0x01; if (nfs[x] == 0x00) count_zero++; @@ -1689,10 +1689,10 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature PrintAndLogEx(INFO, "Hash byte... 0x%02X", ts.hash); switch(ts.rsa[126]) { case 0x11: - PrintAndLogEx(INFO, "Hash algo ( 0x%02X ) - SHA1"); + PrintAndLogEx(INFO, "Hash algo ( 0x%02X ) - SHA1"); break; case 0x22: - PrintAndLogEx(INFO, "Hash algo ( 0x%02X ) - RIPEMD"); + PrintAndLogEx(INFO, "Hash algo ( 0x%02X ) - RIPEMD"); break; case 0x33: PrintAndLogEx(INFO, "Hash algo ( 0x%02X ) - SHA1"); @@ -1711,7 +1711,7 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature print_hex_noascii_break(ts.rsa, sizeof(ts.rsa) - 20, 32); } */ - + mbedtls_mpi_free(&N); mbedtls_mpi_free(&s); mbedtls_mpi_free(&res); @@ -1722,7 +1722,7 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature PrintAndLogEx(INFO, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Signature")); PrintAndLogEx(INFO, "RSA: 1024bit"); - + if (is_valid == false || i == ARRAYLEN(vigik_rsa_pk)) { PrintAndLogEx(INFO, "Signature:"); print_hex_noascii_break(signature, signature_len, MFBLOCK_SIZE * 2); @@ -1736,7 +1736,7 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature PrintAndLogEx(INFO, "%.64s", vigik_rsa_pk[i].n + 64); PrintAndLogEx(INFO, "%.64s", vigik_rsa_pk[i].n + 128); PrintAndLogEx(INFO, "%.64s", vigik_rsa_pk[i].n + 192); - + PrintAndLogEx(INFO, "Signature:"); print_hex_noascii_break(signature, signature_len, MFBLOCK_SIZE * 2); @@ -1749,7 +1749,7 @@ int vigik_annotate(uint8_t *d) { if (d == NULL) return PM3_EINVARG; - mfc_vigik_t *foo = (mfc_vigik_t*)d; + mfc_vigik_t *foo = (mfc_vigik_t *)d; PrintAndLogEx(INFO, "Manufacture......... %s", sprint_hex(foo->b0, sizeof(foo->b0))); PrintAndLogEx(INFO, "MAD................. %s", sprint_hex(foo->mad, sizeof(foo->mad))); @@ -1773,4 +1773,4 @@ int vigik_annotate(uint8_t *d) { PrintAndLogEx(INFO, ""); return PM3_SUCCESS; -} \ No newline at end of file +} diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index de0cb6ace..4ea275639 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -244,11 +244,11 @@ const static vocabulory_t vocabulory[] = { { 1, "hf gallagher diversifykey" }, { 1, "hf gallagher decode" }, { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 initialize" }, { 0, "hf ksx6924 prec" }, + { 0, "hf ksx6924 select" }, { 1, "hf jooki help" }, { 0, "hf jooki clone" }, { 1, "hf jooki decode" }, @@ -347,10 +347,6 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mf gen3uid" }, { 0, "hf mf gen3blk" }, { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, { 0, "hf mf gview" }, { 0, "hf mf ndefformat" }, { 0, "hf mf ndefread" }, @@ -380,7 +376,6 @@ const static vocabulory_t vocabulory[] = { { 1, "hf mfu view" }, { 0, "hf mfu wrbl" }, { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, { 0, "hf mfu eview" }, { 0, "hf mfu sim" }, { 0, "hf mfu setpwd" }, @@ -589,7 +584,6 @@ const static vocabulory_t vocabulory[] = { { 0, "lf idteck clone" }, { 0, "lf idteck sim" }, { 1, "lf indala help" }, - { 0, "lf indala brute" }, { 1, "lf indala demod" }, { 1, "lf indala altdemod" }, { 0, "lf indala reader" }, @@ -737,11 +731,6 @@ const static vocabulory_t vocabulory[] = { { 0, "nfc barcode read" }, { 0, "nfc barcode sim" }, { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv scan" }, - { 1, "piv list" }, { 1, "smart help" }, { 1, "smart list" }, { 0, "smart info" }, diff --git a/client/src/ui.c b/client/src/ui.c index 839dd22b0..d9f4514cf 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -62,9 +62,9 @@ pthread_mutex_t g_print_lock = PTHREAD_MUTEX_INITIALIZER; static void fPrintAndLog(FILE *stream, const char *fmt, ...); #ifdef _WIN32 - #define MKDIR_CHK _mkdir(path) +#define MKDIR_CHK _mkdir(path) #else - #define MKDIR_CHK mkdir(path, 0700) +#define MKDIR_CHK mkdir(path, 0700) #endif @@ -107,8 +107,7 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam if ((result != 0) && create_home) { - if (MKDIR_CHK) - { + if (MKDIR_CHK) { fprintf(stderr, "Could not create user directory %s\n", path); free(path); return PM3_EFILE; @@ -140,8 +139,7 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam if ((result != 0) && create_home) { - if (MKDIR_CHK) - { + if (MKDIR_CHK) { fprintf(stderr, "Could not create user directory %s\n", path); free(path); return PM3_EFILE; @@ -155,7 +153,7 @@ int searchHomeFilePath(char **foundpath, const char *subdir, const char *filenam } pathlen += strlen(filename); - char *tmp = realloc(path, pathlen *sizeof(char)); + char *tmp = realloc(path, pathlen * sizeof(char)); if (tmp == NULL) { //free(path); return PM3_EMALLOC; diff --git a/doc/commands.json b/doc/commands.json index 7546493bb..47f77d21a 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -761,7 +761,7 @@ "options": [ "-h, --help This help", "-k, -K, --keep Keep field ON for next command", - "-a, -A, --apdu Show APDU requests and responses", + "-a, -A, --apdu Show APDU reqests and responses", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], "usage": "emv challenge [-hkaw]" @@ -777,7 +777,7 @@ "options": [ "-h, --help This help", "-s, -S, --select Activate field and select card", - "-a, -A, --apdu Show APDU requests and responses", + "-a, -A, --apdu Show APDU reqests and responses", "-t, -T, --tlv TLV decode results", "-j, -J, --jload Load transaction parameters from `emv_defparams.json` file", "-f, -F, --forceaid Force search AID. Search AID instead of execute PPSE", @@ -807,7 +807,7 @@ "-d, -D, --decision Terminal decision. aac - declined, tc - approved, arqc - online authorisation requested", "-p, -P, --params Load parameters from `emv_defparams.json` file for CDOLdata making from CDOL and parameters", "-m, -M, --make Make CDOLdata from CDOL (tag 8C and 8D) and parameters (def: use default parameters)", - "-a, -A, --apdu Show APDU requests and responses", + "-a, -A, --apdu Show APDU reqests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " CDOLdata/CDOL" @@ -828,7 +828,7 @@ "-k, -K, --keep Keep field ON for next command", "-p, -P, --params Load parameters from `emv_defparams.json` file for PDOLdata making from PDOL and parameters", "-m, -M, --make Make PDOLdata from PDOL (tag 9F38) and parameters (def: uses default parameters)", - "-a, -A, --apdu Show APDU requests and responses", + "-a, -A, --apdu Show APDU reqests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " PDOLdata/PDOL" @@ -857,7 +857,7 @@ "-k, -K, --keep Keep field ON for next command", "-p, -P, --params Load parameters from `emv_defparams.json` file for DDOLdata making from DDOL and parameters", "-m, -M, --make Make DDOLdata from DDOL (tag 9F49) and parameters (def: use default parameters)", - "-a, -A, --apdu Show APDU requests and responses", + "-a, -A, --apdu Show APDU reqests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " DDOLdata/DDOL" @@ -868,22 +868,22 @@ "command": "emv list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "emv list --frame -> show frame delay times", + "emv list -f -> show frame delay times", "emv list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "emv list [-h1crux] [--frame] [-f ]" + "usage": "emv list [-h1fcrux] [--dict ]" }, "emv pse": { "command": "emv pse", @@ -899,7 +899,7 @@ "-k, -K, --keep Keep field ON for next command", "-1, --pse PSE (1PAY.SYS.DDF01) mode", "-2, --ppse PPSE (2PAY.SYS.DDF01) mode (def)", - "-a, -A, --apdu Show APDU requests and responses", + "-a, -A, --apdu Show APDU reqests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], @@ -916,7 +916,7 @@ "options": [ "-h, --help This help", "-k, -K, --keep Keep field ON for next command", - "-a, -A, --apdu Show APDU requests and responses", + "-a, -A, --apdu Show APDU reqests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " help` for details of a command prefs { Edit client/device preferences... } -------- ----------------------- Technology ----------------------- analyse { Analyse utils... } data { Plot window / data buffer manipulation... } emv { EMV ISO-14443 / ISO-7816... } hf { High frequency commands... } hw { Hardware commands... } lf { Low frequency commands... } nfc { NFC commands... } piv { PIV commands... } reveng { CRC calculations from RevEng software... } smart { Smart card ISO-7816 commands... } script { Scripting commands... } trace { Trace manipulation... } wiegand { Wiegand format manipulation... } -------- ----------------------- General ----------------------- clear Clear screen hints Turn hints on / off msleep Add a pause in milliseconds rem Add a text line in log file quit exit Exit program", + "description": "help Use ` help` for details of a command prefs { Edit client/device preferences... } -------- ----------------------- Technology ----------------------- analyse { Analyse utils... } data { Plot window / data buffer manipulation... } emv { EMV ISO-14443 / ISO-7816... } hf { High frequency commands... } hw { Hardware commands... } lf { Low frequency commands... } nfc { NFC commands... } reveng { CRC calculations from RevEng software... } smart { Smart card ISO-7816 commands... } script { Scripting commands... } trace { Trace manipulation... } wiegand { Wiegand format manipulation... } -------- ----------------------- General ----------------------- clear Clear screen hints Turn hints on / off msleep Add a pause in milliseconds rem Add a text line in log file quit exit Exit program", "notes": [], "offline": true, "options": [], @@ -1145,22 +1145,22 @@ "command": "hf 14a list", "description": "Alias of `trace list -t 14a` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf 14a list --frame -> show frame delay times", + "hf 14a list -f -> show frame delay times", "hf 14a list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf 14a list [-h1crux] [--frame] [-f ]" + "usage": "hf 14a list [-h1fcrux] [--dict ]" }, "hf 14a ndefformat": { "command": "hf 14a ndefformat", @@ -1259,7 +1259,7 @@ }, "hf 14a sim": { "command": "hf 14a sim", - "description": "Simulate ISO/IEC 14443 type A tag with 4,7 or 10 byte UID Use type 7 for Mifare Ultralight EV1, Amiibo (NTAG215 pack 0x8080)", + "description": "Simulate ISO/IEC 14443 type A tag with 4,7 or 10 byte UID", "notes": [ "hf 14a sim -t 1 --uid 11223344 -> MIFARE Classic 1k", "hf 14a sim -t 2 -> MIFARE Ultralight", @@ -1267,7 +1267,7 @@ "hf 14a sim -t 4 -> ISO/IEC 14443-4", "hf 14a sim -t 5 -> MIFARE Tnp3xxx", "hf 14a sim -t 6 -> MIFARE Mini", - "hf 14a sim -t 7 -> MFU EV1 / NTAG 215 Amiibo", + "hf 14a sim -t 7 -> Amiibo (NTAG 215), pack 0x8080", "hf 14a sim -t 8 -> MIFARE Classic 4k", "hf 14a sim -t 9 -> FM11RF005SH Shanghai Metro", "hf 14a sim -t 10 -> ST25TA IKEA Rothult" @@ -1363,22 +1363,22 @@ "command": "hf 14b list", "description": "Alias of `trace list -t 14b` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf 14b list --frame -> show frame delay times", + "hf 14b list -f -> show frame delay times", "hf 14b list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf 14b list [-h1crux] [--frame] [-f ]" + "usage": "hf 14b list [-h1fcrux] [--dict ]" }, "hf 14b ndefread": { "command": "hf 14b ndefread", @@ -1637,22 +1637,22 @@ "command": "hf 15 list", "description": "Alias of `trace list -t 15` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf 15 list --frame -> show frame delay times", + "hf 15 list -f -> show frame delay times", "hf 15 list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf 15 list [-h1crux] [--frame] [-f ]" + "usage": "hf 15 list [-h1fcrux] [--dict ]" }, "hf 15 raw": { "command": "hf 15 raw", @@ -2232,22 +2232,22 @@ "command": "hf emrtd list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf emrtd list --frame -> show frame delay times", + "hf emrtd list -f -> show frame delay times", "hf emrtd list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf emrtd list [-h1crux] [--frame] [-f ]" + "usage": "hf emrtd list [-h1fcrux] [--dict ]" }, "hf epa cnonces": { "command": "hf epa cnonces", @@ -2367,22 +2367,22 @@ "command": "hf felica list", "description": "Alias of `trace list -t felica` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf felica list --frame -> show frame delay times", + "hf felica list -f -> show frame delay times", "hf felica list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf felica list [-h1crux] [--frame] [-f ]" + "usage": "hf felica list [-h1fcrux] [--dict ]" }, "hf felica litedump": { "command": "hf felica litedump", @@ -2575,7 +2575,7 @@ "offline": false, "options": [ "-h, --help This help", - "-a, --apdu Show APDU requests and responses", + "-a, --apdu Show APDU reqests and responses", "-v, --verbose Verbose mode. vv - show full certificates data", "-c, --cbor Show CBOR decoded data", "-l, --list Add CredentialId from json to allowList", @@ -2596,7 +2596,7 @@ "offline": false, "options": [ "-h, --help This help", - "-a, --apdu Show APDU requests and responses", + "-a, --apdu Show APDU reqests and responses", "-v, --verbose Verbose mode", "default mode: dont-enforce-user-presence-and-sign", "-u, --user mode: enforce-user-presence-and-sign", @@ -2635,22 +2635,22 @@ "command": "hf fido list", "description": "Alias of `trace list -t 14a` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf fido list --frame -> show frame delay times", + "hf fido list -f -> show frame delay times", "hf fido list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf fido list [-h1crux] [--frame] [-f ]" + "usage": "hf fido list [-h1fcrux] [--dict ]" }, "hf fido make": { "command": "hf fido make", @@ -2662,7 +2662,7 @@ "offline": false, "options": [ "-h, --help This help", - "-a, --apdu Show APDU requests and responses", + "-a, --apdu Show APDU reqests and responses", "-v, --verbose Verbose mode. vv - show full certificates data", "-t, --tlv Show DER certificate contents in TLV representation", "-c, --cbor Show CBOR decoded data", @@ -2916,10 +2916,9 @@ "-f, --file Dictionary file with default iclass keys", "--credit key is assumed to be the credit key", "--elite elite computations applied to key", - "--raw no computations applied to key (raw)", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "--raw no computations applied to key (raw)" ], - "usage": "hf iclass chk [-h] -f [--credit] [--elite] [--raw] [--shallow]" + "usage": "hf iclass chk [-h] -f [--credit] [--elite] [--raw]" }, "hf iclass configcard": { "command": "hf iclass configcard", @@ -2970,11 +2969,9 @@ "--elite elite computations applied to key", "--raw raw, the key is interpreted as raw block 3/4", "--nr replay of NR/MAC", - "-z, --dense dense dump output style", - "--force force unsecure card read", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "-z, --dense dense dump output style" ], - "usage": "hf iclass dump [-hz] [-f ] [-k ] [--ki ] [--credit ] [--ci ] [--elite] [--raw] [--nr] [--force] [--shallow]" + "usage": "hf iclass dump [-hz] [-f ] [-k ] [--ki ] [--credit ] [--ci ] [--elite] [--raw] [--nr]" }, "hf iclass eload": { "command": "hf iclass eload", @@ -2993,7 +2990,7 @@ }, "hf iclass encode": { "command": "hf iclass encode", - "description": "Encode binary wiegand to block 7,8,9 Use either --bin or --wiegand/--fc/--cn", + "description": "Encode binary wiegand to block 7 Use either --bin or --wiegand/--fc/--cn", "notes": [ "hf iclass encode --bin 10001111100000001010100011 --ki 0 -> FC 31 CN 337", "hf iclass encode --fc 31 --cn 337 --ki 0 -> FC 31 CN 337", @@ -3010,10 +3007,9 @@ "--enckey 3DES transport key, 16 hex bytes", "--fc facility code", "--cn card number", - "-w, --wiegand see `wiegand list` for available formats", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "-w, --wiegand see `wiegand list` for available formats" ], - "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" + "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ]" }, "hf iclass encrypt": { "command": "hf iclass encrypt", @@ -3080,31 +3076,30 @@ ], "offline": true, "options": [ - "-h, --help This help", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "-h, --help This help" ], - "usage": "hf iclass info [-h] [--shallow]" + "usage": "hf iclass info [-h]" }, "hf iclass list": { "command": "hf iclass list", "description": "Alias of `trace list -t iclass` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf iclass list --frame -> show frame delay times", + "hf iclass list -f -> show frame delay times", "hf iclass list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf iclass list [-h1crux] [--frame] [-f ]" + "usage": "hf iclass list [-h1fcrux] [--dict ]" }, "hf iclass loclass": { "command": "hf iclass loclass", @@ -3195,10 +3190,9 @@ "--elite elite computations applied to key", "--raw no computations applied to key", "--nr replay of NR/MAC", - "-v, --verbose verbose output", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "-v, --verbose verbose output" ], - "usage": "hf iclass rdbl [-hv] [-k ] [--ki ] -b [--credit] [--elite] [--raw] [--nr] [--shallow]" + "usage": "hf iclass rdbl [-hv] [-k ] [--ki ] -b [--credit] [--elite] [--raw] [--nr]" }, "hf iclass reader": { "command": "hf iclass reader", @@ -3209,10 +3203,9 @@ "offline": false, "options": [ "-h, --help This help", - "-@ optional - continuous reader mode", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "-@ optional - continuous reader mode" ], - "usage": "hf iclass reader [-h@] [--shallow]" + "usage": "hf iclass reader [-h@]" }, "hf iclass restore": { "command": "hf iclass restore", @@ -3233,10 +3226,9 @@ "--credit key is assumed to be the credit key", "--elite elite computations applied to key", "--raw no computations applied to key", - "-v, --verbose verbose output", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "-v, --verbose verbose output" ], - "usage": "hf iclass restore [-hv] -f [-k ] [--ki ] --first --last [--credit] [--elite] [--raw] [--shallow]" + "usage": "hf iclass restore [-hv] -f [-k ] [--ki ] --first --last [--credit] [--elite] [--raw]" }, "hf iclass sim": { "command": "hf iclass sim", @@ -3308,10 +3300,9 @@ "--elite elite computations applied to key", "--raw no computations applied to key", "--nr replay of NR/MAC", - "-v, --verbose verbose output", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "-v, --verbose verbose output" ], - "usage": "hf iclass wrbl [-hv] [-k ] [--ki ] -b -d [-m ] [--credit] [--elite] [--raw] [--nr] [--shallow]" + "usage": "hf iclass wrbl [-hv] [-k ] [--ki ] -b -d [-m ] [--credit] [--elite] [--raw] [--nr]" }, "hf jooki clone": { "command": "hf jooki clone", @@ -3409,7 +3400,7 @@ "options": [ "-h, --help This help", "-k, --keep keep field ON for next command", - "-a, --apdu Show APDU requests and responses" + "-a, --apdu show APDU reqests and responses" ], "usage": "hf ksx6924 balance [-hka]" }, @@ -3431,23 +3422,23 @@ "options": [ "-h, --help This help", "-k, --keep keep field ON for next command", - "-a, --apdu Show APDU requests and responses" + "-a, --apdu show APDU reqests and responses" ], "usage": "hf ksx6924 info [-hka]" }, - "hf ksx6924 init": { - "command": "hf ksx6924 init", - "description": "Perform transaction initialization with Mpda (Money of Purchase Transaction)", + "hf ksx6924 initialize": { + "command": "hf ksx6924 initialize", + "description": "Perform transaction initialization (mpda)", "notes": [ - "hf ksx6924 init 000003e8 -> Mpda" + "hf ksx6924 initialize 000003e8 -> mpda" ], "offline": false, "options": [ "-h, --help This help", "-k, --keep keep field ON for next command", - "-a, --apdu Show APDU requests and responses" + "-a, --apdu show APDU reqests and responses" ], - "usage": "hf ksx6924 init [-hka] " + "usage": "hf ksx6924 initialize [-hka] " }, "hf ksx6924 prec": { "command": "hf ksx6924 prec", @@ -3459,7 +3450,7 @@ "options": [ "-h, --help This help", "-k, --keep keep field ON for next command", - "-a, --apdu Show APDU requests and responses" + "-a, --apdu show APDU reqests and responses" ], "usage": "hf ksx6924 prec [-hka] " }, @@ -3472,7 +3463,7 @@ "offline": false, "options": [ "-h, --help This help", - "-a, --apdu Show APDU requests and responses" + "-a, --apdu show APDU reqests and responses" ], "usage": "hf ksx6924 select [-ha]" }, @@ -3582,22 +3573,22 @@ "command": "hf legic list", "description": "Alias of `trace list -t legic` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf legic list --frame -> show frame delay times", + "hf legic list -f -> show frame delay times", "hf legic list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf legic list [-h1crux] [--frame] [-f ]" + "usage": "hf legic list [-h1fcrux] [--dict ]" }, "hf legic rdbl": { "command": "hf legic rdbl", @@ -3704,22 +3695,22 @@ "command": "hf list", "description": "Alias of `trace list -t raw` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf list --frame -> show frame delay times", + "hf list -f -> show frame delay times", "hf list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf list [-h1crux] [--frame] [-f ]" + "usage": "hf list [-h1fcrux] [--dict ]" }, "hf lto dump": { "command": "hf lto dump", @@ -3758,22 +3749,22 @@ "command": "hf lto list", "description": "Alias of `trace list -t lto` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf lto list --frame -> show frame delay times", + "hf lto list -f -> show frame delay times", "hf lto list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf lto list [-h1crux] [--frame] [-f ]" + "usage": "hf lto list [-h1fcrux] [--dict ]" }, "hf lto rdbl": { "command": "hf lto rdbl", @@ -3978,7 +3969,7 @@ "--1k MIFARE Classic 1k / S50 (def)", "--2k MIFARE Classic/Plus 2k", "--4k MIFARE Classic 4k / S70", - "--emu to emulator memory" + "--emu from emulator memory" ], "usage": "hf mf csave [-h] [-f ] [--mini] [--1k] [--2k] [--4k] [--emu]" }, @@ -4312,85 +4303,6 @@ ], "usage": "hf mf gen3uid [-h] [-u ]" }, - "hf mf ggetblk": { - "command": "hf mf ggetblk", - "description": "Get block data from magic gen4 GTU card.", - "notes": [ - "hf mf ggetblk --blk 0 -> get block 0 (manufacturer)", - "hf mf ggetblk --blk 3 -v -> get block 3, decode sector trailer" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-b, --blk block number", - "-v, --verbose verbose output", - "-p, --pwd password 4bytes" - ], - "usage": "hf mf ggetblk [-hv] -b [-p ]" - }, - "hf mf gload": { - "command": "hf mf gload", - "description": "Load magic gen4 gtu card with data from (bin/eml/json) dump file or from emulator memory.", - "notes": [ - "hf mf gload --emu", - "hf mf gload -f hf-mf-01020304.eml", - "hf mf gload -p AABBCCDD --4k -v -f hf-mf-01020304-dump.bin", - "", - "Card must be configured beforehand with `script run hf_mf_ultimatecard`.", - "Blocks are 16 bytes long." - ], - "offline": false, - "options": [ - "-h, --help This help", - "--mini MIFARE Classic Mini / S20", - "--1k MIFARE Classic 1k / S50 (def)", - "--2k MIFARE Classic/Plus 2k", - "--4k MIFARE Classic 4k / S70", - "-p, --pwd password 4bytes", - "-v, --verbose verbose output", - "-f, --file filename of dump", - "--emu from emulator memory", - "--start index of block to start writing (default 0)", - "--end index of block to end writing (default last block)" - ], - "usage": "hf mf gload [-hv] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu] [--start ] [--end ]" - }, - "hf mf gsave": { - "command": "hf mf gsave", - "description": "Save `magic gen4 gtu` card memory into three files (BIN/EML/JSON)or into emulator memory", - "notes": [ - "hf mf gsave", - "hf mf gsave --4k", - "hf mf gsave -p DEADBEEF -f hf-mf-01020304.json" - ], - "offline": false, - "options": [ - "-h, --help This help", - "--mini MIFARE Classic Mini / S20", - "--1k MIFARE Classic 1k / S50 (def)", - "--2k MIFARE Classic/Plus 2k", - "--4k MIFARE Classic 4k / S70", - "-p, --pwd password 4bytes", - "-f, --file filename of dump", - "--emu to emulator memory" - ], - "usage": "hf mf gsave [-h] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu]" - }, - "hf mf gsetblk": { - "command": "hf mf gsetblk", - "description": "Set block data on a magic gen4 GTU card", - "notes": [ - "hf mf gsetblk --blk 1 -d 000102030405060708090a0b0c0d0e0f" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-b, --blk block number", - "-d, --data bytes to write, 16 hex bytes", - "-p, --pwd password 4bytes" - ], - "usage": "hf mf gsetblk [-h] -b [-d ] [-p ]" - }, "hf mf gview": { "command": "hf mf gview", "description": "View `magic gen4 gtu` card memory", @@ -4412,9 +4324,8 @@ }, "hf mf hardnested": { "command": "hf mf hardnested", - "description": "Nested attack for hardened MIFARE Classic cards. if card is EV1, command can detect and use known key see example below `--i` set type of SIMD instructions. Without this flag programs autodetect it. or hf mf hardnested -r --tk [known target key] Add the known target key to check if it is present in the remaining key space hf mf hardnested --blk 0 -a -k A0A1A2A3A4A5 --tblk 4 --ta --tk FFFFFFFFFFFF", + "description": "Nested attack for hardened MIFARE Classic cards. `--i` set type of SIMD instructions. Without this flag programs autodetect it. or hf mf hardnested -r --tk [known target key] Add the known target key to check if it is present in the remaining key space hf mf hardnested --blk 0 -a -k A0A1A2A3A4A5 --tblk 4 --ta --tk FFFFFFFFFFFF", "notes": [ - "hf mf hardnested --tblk 4 --ta -> works for MFC EV1", "hf mf hardnested --blk 0 -a -k FFFFFFFFFFFF --tblk 4 --ta", "hf mf hardnested --blk 0 -a -k FFFFFFFFFFFF --tblk 4 --ta -w", "hf mf hardnested --blk 0 -a -k FFFFFFFFFFFF --tblk 4 --ta -f nonces.bin -w -s", @@ -4461,22 +4372,22 @@ "command": "hf mf list", "description": "Alias of `trace list -t mf` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf mf list --frame -> show frame delay times", + "hf mf list -f -> show frame delay times", "hf mf list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf mf list [-h1crux] [--frame] [-f ]" + "usage": "hf mf list [-h1fcrux] [--dict ]" }, "hf mf mad": { "command": "hf mf mad", @@ -5640,22 +5551,22 @@ "command": "hf mfdes list", "description": "Alias of `trace list -t des` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf mfdes list --frame -> show frame delay times", + "hf mfdes list -f -> show frame delay times", "hf mfdes list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf mfdes list [-h1crux] [--frame] [-f ]" + "usage": "hf mfdes list [-h1fcrux] [--dict ]" }, "hf mfdes lsapp": { "command": "hf mfdes lsapp", @@ -6202,35 +6113,17 @@ ], "usage": "hf mfu eload [-h] -f [-q ]" }, - "hf mfu esave": { - "command": "hf mfu esave", - "description": "Saves emulator memory to a MIFARE Ultralight/NTAG dump file (bin/eml/json) By default number of pages saved depends on defined tag type. You can override this with option --end.", - "notes": [ - "hf mfu esave", - "hf mfu esave --end 255 -> saves whole memory", - "hf mfu esave -f hf-mfu-04010203040506-dump.json" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-e, --end index of last block", - "-f, --file filename of dump" - ], - "usage": "hf mfu esave [-h] [-e ] [-f ]" - }, "hf mfu eview": { "command": "hf mfu eview", - "description": "Displays emulator memory By default number of pages shown depends on defined tag type. You can override this with option --end.", + "description": "It displays emulator memory", "notes": [ - "hf mfu eview", - "hf mfu eview --end 255 -> dumps whole memory" + "hf mfu eview" ], "offline": false, "options": [ - "-h, --help This help", - "-e, --end index of last block" + "-h, --help This help" ], - "usage": "hf mfu eview [-h] [-e ]" + "usage": "hf mfu eview [-h]" }, "hf mfu help": { "command": "hf mfu help", @@ -6398,8 +6291,8 @@ "description": "Simulate MIFARE Ultralight family type based upon ISO/IEC 14443 type A tag with 4,7 or 10 byte UID from emulator memory. See `hf mfu eload` first. The UID from emulator memory will be used if not specified. See `hf 14a sim -h` to see available types. You want 2 or 7 usually.", "notes": [ "hf mfu sim -t 2 --uid 11223344556677 -> MIFARE Ultralight", - "hf mfu sim -t 7 --uid 11223344556677 -n 5 -> MFU EV1 / NTAG 215 Amiibo", - "hf mfu sim -t 7 -> MFU EV1 / NTAG 215 Amiibo" + "hf mfu sim -t 7 --uid 11223344556677 -n 5 -> Amiibo (NTAG 215), pack 0x8080", + "hf mfu sim -t 7 -> Amiibo (NTAG 215), pack 0x8080" ], "offline": false, "options": [ @@ -6540,22 +6433,22 @@ "command": "hf seos list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf seos list --frame -> show frame delay times", + "hf seos list -f -> show frame delay times", "hf seos list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf seos list [-h1crux] [--frame] [-f ]" + "usage": "hf seos list [-h1fcrux] [--dict ]" }, "hf sniff": { "command": "hf sniff", @@ -6598,22 +6491,22 @@ "command": "hf st25ta list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf st25ta list --frame -> show frame delay times", + "hf st25ta list -f -> show frame delay times", "hf st25ta list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf st25ta list [-h1crux] [--frame] [-f ]" + "usage": "hf st25ta list [-h1fcrux] [--dict ]" }, "hf st25ta ndefread": { "command": "hf st25ta ndefread", @@ -6748,22 +6641,22 @@ "command": "hf thinfilm list", "description": "Alias of `trace list -t thinfilm` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf thinfilm list --frame -> show frame delay times", + "hf thinfilm list -f -> show frame delay times", "hf thinfilm list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf thinfilm list [-h1crux] [--frame] [-f ]" + "usage": "hf thinfilm list [-h1fcrux] [--dict ]" }, "hf thinfilm sim": { "command": "hf thinfilm sim", @@ -6819,22 +6712,22 @@ "command": "hf topaz list", "description": "Alias of `trace list -t topaz` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf topaz list --frame -> show frame delay times", + "hf topaz list -f -> show frame delay times", "hf topaz list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "hf topaz list [-h1crux] [--frame] [-f ]" + "usage": "hf topaz list [-h1fcrux] [--dict ]" }, "hf topaz raw": { "command": "hf topaz raw", @@ -8562,22 +8455,22 @@ "command": "lf hitag list", "description": "Alias of `trace list -t hitag2` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "lf hitag list --frame -> show frame delay times", + "lf hitag list -f -> show frame delay times", "lf hitag list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "lf hitag list [-h1crux] [--frame] [-f ]" + "usage": "lf hitag list [-h1fcrux] [--dict ]" }, "lf hitag reader": { "command": "lf hitag reader", @@ -8734,28 +8627,6 @@ ], "usage": "lf indala altdemod [-hl]" }, - "lf indala brute": { - "command": "lf indala brute", - "description": "Enables bruteforce of INDALA readers with specified facility code. This is a attack against reader. if cardnumber is given, it starts with it and goes up / down one step if cardnumber is not given, it starts with 1 and goes up to 65535", - "notes": [ - "lf indala brute --fc 224", - "lf indala brute --fc 21 -d 2000", - "lf indala brute -v --fc 21 --cn 200 -d 2000", - "lf indala brute -v --fc 21 --cn 200 -d 2000 --up" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-v, --verbose verbose output", - "--fc facility code", - "--cn card number to start with", - "-d, --delay delay betweens attempts in ms. Default 1000ms", - "--up direction to increment card number. (default is both directions)", - "--down direction to decrement card number. (default is both directions)", - "--4041x specify Indala 4041X format" - ], - "usage": "lf indala brute [-hv] [--fc ] [--cn ] [-d ] [--up] [--down] [--4041x]" - }, "lf indala clone": { "command": "lf indala clone", "description": "clone Indala UID to T55x7 or Q5/T5555 tag using different known formats", @@ -8811,8 +8682,6 @@ "description": "Enables simulation of Indala card with specified facility code and card number. Simulation runs until the button is pressed or another USB command is issued.", "notes": [ "lf indala sim --heden 888", - "lf indala sim --fc 123 --cn 1337", - "lf indala sim --fc 123 --cn 1337 --4041x", "lf indala sim --raw a0000000a0002021", "lf indala sim --raw 80000001b23523a6c2e31eba3cbee4afb3c6ad1fcf649393928c14e5" ], @@ -8820,12 +8689,9 @@ "options": [ "-h, --help This help", "-r, --raw raw bytes", - "--heden Cardnumber for Heden 2L format", - "--fc Facility code (26 bit H10301 format)", - "--cn Card number (26 bit H10301 format)", - "--4041x Optional - specify Indala 4041X format, must use with fc and cn" + "--heden Cardnumber for Heden 2L format" ], - "usage": "lf indala sim [-h] [-r ] [--heden ] [--fc ] [--cn ] [--4041x]" + "usage": "lf indala sim [-h] [-r ] [--heden ]" }, "lf io clone": { "command": "lf io clone", @@ -10952,93 +10818,6 @@ ], "usage": "hf 14b ndefread [-hv] [-f ]" }, - "piv getdata": { - "command": "piv getdata", - "description": "Get a data container of a given tag", - "notes": [ - "piv getdata -s 5fc102 -> select card, select applet, get card holder unique identifer", - "piv getdata -st 5fc102 -> select card, select applet, get card holder unique identifer, show result in TLV" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-s, -S, --select Activate field and select applet", - "-k, -K, --keep Keep field for next command", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", - "--aid Applet ID to select. By default A0000003080000100 will be used", - " Tag ID to read, between 1 and 3 bytes." - ], - "usage": "piv getdata [-hskatw] [--aid ] " - }, - "piv help": { - "command": "piv help", - "description": "help This help list List ISO7816 history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, - "piv list": { - "command": "piv list", - "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", - "notes": [ - "piv list --frame -> show frame delay times", - "piv list -1 -> use trace buffer" - ], - "offline": true, - "options": [ - "-h, --help This help", - "-1, --buffer use data from trace buffer", - "--frame show frame delay times", - "-c mark CRC bytes", - "-r show relative times (gap and duration)", - "-u display times in microseconds instead of clock cycles", - "-x show hexdump to convert to pcap(ng)", - "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" - ], - "usage": "piv list [-h1crux] [--frame] [-f ]" - }, - "piv scan": { - "command": "piv scan", - "description": "Scan a PIV card for known containers", - "notes": [ - "piv scan -s -> select card, select applet and run scan", - "piv scan -st --aid a00000030800001000 -> select card, select applet a00000030800001000, show result of the scan in TLV" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-s, -S, --select Activate field and select applet", - "-k, -K, --keep Keep field for next command", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", - "--aid Applet ID to select. By default A0000003080000100 will be used" - ], - "usage": "piv scan [-hskatw] [--aid ]" - }, - "piv select": { - "command": "piv select", - "description": "Executes select applet command", - "notes": [ - "piv select -s -> select card, select applet", - "piv select -st --aid a00000030800001000 -> select card, select applet a00000030800001000, show result in TLV" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-s, -S, --select Activate field and select applet", - "-k, -K, --keep Keep field for next command", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", - "--aid Applet ID to select. By default A0000003080000100 will be used" - ], - "usage": "piv select [-hskatw] [--aid ]" - }, "prefs get barmode": { "command": "prefs get barmode", "description": "Get preference of HF/LF tune command styled output in the client", @@ -11394,22 +11173,22 @@ "command": "smart list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "smart list --frame -> show frame delay times", + "smart list -f -> show frame delay times", "smart list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "smart list [-h1crux] [--frame] [-f ]" + "usage": "smart list [-h1fcrux] [--dict ]" }, "smart raw": { "command": "smart raw", @@ -11516,24 +11295,24 @@ "trace list -t thinfilm -> interpret as Thinfilm", "trace list -t topaz -> interpret as Topaz", "", - "trace list -t mf -f mfc_default_keys.dic -> use default dictionary file", - "trace list -t 14a --frame -> show frame delay times", + "trace list -t mf --dict -> use dictionary keys file", + "trace list -t 14a -f -> show frame delay times", "trace list -t 14a -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "--frame show frame delay times", + "-f show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", "-t, --type protocol to annotate the trace", - "-f, --file filename of dictionary" + "--dict use dictionary keys file" ], - "usage": "trace list [-h1crux] [--frame] [-t ] [-f ]" + "usage": "trace list [-h1fcrux] [-t ] [--dict ]" }, "trace load": { "command": "trace load", @@ -11731,8 +11510,8 @@ } }, "metadata": { - "commands_extracted": 738, + "commands_extracted": 727, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-01-06T21:37:50" + "extracted_on": "2023-01-14T21:16:27" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index bb4c68869..2133d960b 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -367,11 +367,11 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`hf ksx6924 help `|Y |`This help` -|`hf ksx6924 select `|N |`Select application, and leave field up` -|`hf ksx6924 info `|N |`Get info about a KS X 6924 (T-Money, Snapper+) transit card` |`hf ksx6924 balance `|N |`Get current purse balance` -|`hf ksx6924 init `|N |`Perform transaction initialization with Mpda` +|`hf ksx6924 info `|N |`Get info about a KS X 6924 (T-Money, Snapper+) transit card` +|`hf ksx6924 initialize `|N |`Perform transaction initialization (Mpda)` |`hf ksx6924 prec `|N |`Send proprietary get record command (CLA=90, INS=4C)` +|`hf ksx6924 select `|N |`Select application, and leave field up` ### hf jooki @@ -510,10 +510,6 @@ Check column "offline" for their availability. |`hf mf gen3uid `|N |`Set UID without changing manufacturer block` |`hf mf gen3blk `|N |`Overwrite manufacturer block` |`hf mf gen3freeze `|N |`Perma lock UID changes. irreversible` -|`hf mf ggetblk `|N |`Read block from card` -|`hf mf gload `|N |`Load dump to card` -|`hf mf gsave `|N |`Save dump from card into file or emulator` -|`hf mf gsetblk `|N |`Write block to card` |`hf mf gview `|N |`View card` |`hf mf ndefformat `|N |`Format MIFARE Classic Tag as NFC Tag` |`hf mf ndefread `|N |`Read and print NDEF records from card` @@ -558,8 +554,7 @@ Check column "offline" for their availability. |`hf mfu restore `|N |`Restore a dump onto a MFU MAGIC tag` |`hf mfu view `|Y |`Display content from tag dump file` |`hf mfu wrbl `|N |`Write block` -|`hf mfu eload `|N |`Load Ultralight dump file into emulator memory` -|`hf mfu esave `|N |`Save Ultralight dump file from emulator memory` +|`hf mfu eload `|N |`Load Ultralight .eml dump file into emulator memory` |`hf mfu eview `|N |`View emulator memory` |`hf mfu sim `|N |`Simulate MIFARE Ultralight from emulator memory` |`hf mfu setpwd `|N |`Set 3DES key - Ultralight-C` @@ -976,7 +971,6 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`lf indala help `|Y |`This help` -|`lf indala brute `|N |`Demodulate an Indala tag (PSK1) from the GraphBuffer` |`lf indala demod `|Y |`Demodulate an Indala tag (PSK1) from the GraphBuffer` |`lf indala altdemod `|Y |`Alternative method to demodulate samples for Indala 64 bit UID (option '224' for 224 bit)` |`lf indala reader `|N |`Read an Indala tag from the antenna` @@ -1334,19 +1328,6 @@ Check column "offline" for their availability. |`nfc barcode help `|Y |`This help` -### piv - - { PIV commands... } - -|command |offline |description -|------- |------- |----------- -|`piv help `|Y |`This help` -|`piv select `|N |`Select the PIV applet` -|`piv getdata `|N |`Gets a container on a PIV card` -|`piv scan `|N |`Scan PIV card for known containers` -|`piv list `|Y |`List ISO7816 history` - - ### reveng { CRC calculations from RevEng software... } diff --git a/include/protocol_vigik.h b/include/protocol_vigik.h index a61c4ce03..7512c1c2d 100644 --- a/include/protocol_vigik.h +++ b/include/protocol_vigik.h @@ -42,4 +42,4 @@ typedef struct vigik_pk_s { const char *n; } vigik_pk_t; -#endif \ No newline at end of file +#endif diff --git a/include/protocols.h b/include/protocols.h index 8a00f064c..016584098 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -506,7 +506,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define ISO7816_LC_TLV_CONFLICT 0x6A85 // LC / TLV conlict #define ISO7816_INCORRECT_P1P2 0x6A86 // Incorrect parameters (P1,P2) #define ISO7816_FILE_EXISTS 0x6A89 // File exists -#define ISO7816_NOT_IMPLEMENTED 0x6AFF // +#define ISO7816_NOT_IMPLEMENTED 0x6AFF // // 6x 00 #define ISO7816_WRONG_P1P2 0x6B00 // Incorrect parameters (P1,P2) From c9984985fdebafcf2975437e18dfe8132f52f450 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 14 Jan 2023 22:23:40 +0100 Subject: [PATCH 078/924] make miscchecks --- armsrc/Standalone/lf_em4100rsww.c | 2 +- armsrc/Standalone/lf_nedap_sim.c | 2 +- armsrc/iso14443b.c | 18 +- client/luascripts/hf_14a_i2crevive.lua | 2 +- client/luascripts/hf_mf_em_util.lua | 4 +- client/luascripts/hf_mf_uidbruteforce.lua | 4 +- client/luascripts/hf_mf_ultimatecard.lua | 488 +++++++++++----------- client/src/cmdhfepa.c | 4 +- client/src/cmdhfxerox.c | 166 ++++---- doc/commands.json | 2 +- include/protocols.h | 2 +- 11 files changed, 347 insertions(+), 347 deletions(-) diff --git a/armsrc/Standalone/lf_em4100rsww.c b/armsrc/Standalone/lf_em4100rsww.c index 727d188a3..dc202d49a 100644 --- a/armsrc/Standalone/lf_em4100rsww.c +++ b/armsrc/Standalone/lf_em4100rsww.c @@ -11,7 +11,7 @@ // then from shell: // hexdump lf.bin -e '5/1 "%02X" /0 "\n"' // -// To recall only LAST stored ID from flash use lf-last instead of lf file. +// To recall only LAST stored ID from flash use lf-last instead of lf file. // //----------------------------------------------------------------------------- // Modes of operation: diff --git a/armsrc/Standalone/lf_nedap_sim.c b/armsrc/Standalone/lf_nedap_sim.c index dcd093fee..726f13ca8 100644 --- a/armsrc/Standalone/lf_nedap_sim.c +++ b/armsrc/Standalone/lf_nedap_sim.c @@ -27,7 +27,7 @@ #include "BigBuf.h" #include "crc16.h" -#define MODULE_LONG_NAME "LF Nedap simple simulator" +#define MODULE_LONG_NAME "LF Nedap simple simulator" typedef struct _NEDAP_TAG { uint8_t subType; diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 760736a5a..e4f1e4e93 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -1814,17 +1814,17 @@ int iso14443b_select_xrx_card(iso14b_card_select_t *card) { static const uint8_t x_wup2[] = { 0x5D, 0x37, 0x21, 0x71, 0x71 }; uint8_t slot_mark[1]; - uint8_t x_atqb[24] = {0x0}; // ATQB len = 18 + uint8_t x_atqb[24] = {0x0}; // ATQB len = 18 uint32_t start_time = 0; uint32_t eof_time = 0; - iso14b_set_timeout(24); // wait for carrier + iso14b_set_timeout(24); // wait for carrier // wup1 CodeAndTransmit14443bAsReader(x_wup1, sizeof(x_wup1), &start_time, &eof_time, true); - start_time = eof_time + US_TO_SSP(9000); // 9ms before next cmd + start_time = eof_time + US_TO_SSP(9000); // 9ms before next cmd // wup2 CodeAndTransmit14443bAsReader(x_wup2, sizeof(x_wup2), &start_time, &eof_time, true); @@ -1836,7 +1836,7 @@ int iso14443b_select_xrx_card(iso14b_card_select_t *card) { int slot; for (slot = 0; slot < 4; slot++) { - start_time = eof_time + ETU_TO_SSP(30); //(24); // next slot after 24 ETU + start_time = eof_time + ETU_TO_SSP(30); //(24); // next slot after 24 ETU retlen = Get14443bAnswerFromTag(x_atqb, sizeof(x_atqb), iso14b_timeout, &eof_time); @@ -1850,14 +1850,14 @@ int iso14443b_select_xrx_card(iso14b_card_select_t *card) { // tx unframed slot-marker - if (Demod.posCount) { // no rx, but subcarrier burst detected + if (Demod.posCount) { // no rx, but subcarrier burst detected uid |= (uint64_t)slot << uid_pos; - slot_mark[0] = 0xB1 + (slot << 1); // ack slot + slot_mark[0] = 0xB1 + (slot << 1); // ack slot CodeAndTransmit14443bAsReader(slot_mark, sizeof(slot_mark), &start_time, &eof_time, false); break; - } else { // no subcarrier burst - slot_mark[0] = 0xA1 + (slot << 1); // nak slot + } else { // no subcarrier burst + slot_mark[0] = 0xA1 + (slot << 1); // nak slot CodeAndTransmit14443bAsReader(slot_mark, sizeof(slot_mark), &start_time, &eof_time, false); } } @@ -1884,7 +1884,7 @@ int iso14443b_select_xrx_card(iso14b_card_select_t *card) { } // VALIDATE CRC - if (check_crc(CRC_14443_B, x_atqb, 18) == false) { // use fixed len because unstable EOF catch + if (check_crc(CRC_14443_B, x_atqb, 18) == false) { // use fixed len because unstable EOF catch return 3; } diff --git a/client/luascripts/hf_14a_i2crevive.lua b/client/luascripts/hf_14a_i2crevive.lua index 3610979b6..59659bb5c 100644 --- a/client/luascripts/hf_14a_i2crevive.lua +++ b/client/luascripts/hf_14a_i2crevive.lua @@ -62,7 +62,7 @@ function main(args) local i local cmds = {} - --check for params + --check for params for o, a in getopt.getopt(args, 'h') do if o == 'h' then return help() end end diff --git a/client/luascripts/hf_mf_em_util.lua b/client/luascripts/hf_mf_em_util.lua index 69537d7dd..e82bc9d1e 100644 --- a/client/luascripts/hf_mf_em_util.lua +++ b/client/luascripts/hf_mf_em_util.lua @@ -63,8 +63,8 @@ local function card_format(key_a,key_b,ab,user,s70) core.console(cmd) print(cmd) core.clearCommandBuffer() - if s70 == false and k > 15 then - return + if s70 == false and k > 15 then + return end end end diff --git a/client/luascripts/hf_mf_uidbruteforce.lua b/client/luascripts/hf_mf_uidbruteforce.lua index 62872e2a3..4835ba03b 100644 --- a/client/luascripts/hf_mf_uidbruteforce.lua +++ b/client/luascripts/hf_mf_uidbruteforce.lua @@ -109,8 +109,8 @@ local function main(args) command = 'hf 14a sim -t 1 -u ' .. uid_format msg('Bruteforcing Mifare Classic card numbers') elseif mftype == 'mfc4' then - command = 'hf 14a sim -t 8 -u ' .. uid_format - msg('Bruteforcing Mifare Classic 4K card numbers') + command = 'hf 14a sim -t 8 -u ' .. uid_format + msg('Bruteforcing Mifare Classic 4K card numbers') elseif mftype == 'mfu' then command = 'hf 14a sim -t 2 -u ' .. uid_format msg('Bruteforcing Mifare Ultralight card numbers') diff --git a/client/luascripts/hf_mf_ultimatecard.lua b/client/luascripts/hf_mf_ultimatecard.lua index aec47e9d0..42a5e1887 100644 --- a/client/luascripts/hf_mf_ultimatecard.lua +++ b/client/luascripts/hf_mf_ultimatecard.lua @@ -50,17 +50,17 @@ arguments = [[ -c read magic configuration -u UID (8-14 hexsymbols), set UID on tag -t tag type to impersonate - 1 = Mifare Mini S20 4-byte 12 = NTAG 210 - 2 = Mifare Mini S20 7-byte 13 = NTAG 212 - 3 = Mifare 1k S50 4-byte 14 = NTAG 213 - 4 = Mifare 1k S50 7-byte 15 = NTAG 215 - 5 = Mifare 4k S70 4-byte 16 = NTAG 216 - 6 = Mifare 4k S70 7-byte 17 = NTAG I2C 1K - *** 7 = UL - NOT WORKING FULLY 18 = NTAG I2C 2K - *** 8 = UL-C - NOT WORKING FULLY 19 = NTAG I2C 1K PLUS - 9 = UL EV1 48b 20 = NTAG I2C 2K PLUS - 10 = UL EV1 128b 21 = NTAG 213F - *** 11 = UL Plus - NOT WORKING YET 22 = NTAG 216F + 1 = Mifare Mini S20 4-byte 12 = NTAG 210 + 2 = Mifare Mini S20 7-byte 13 = NTAG 212 + 3 = Mifare 1k S50 4-byte 14 = NTAG 213 + 4 = Mifare 1k S50 7-byte 15 = NTAG 215 + 5 = Mifare 4k S70 4-byte 16 = NTAG 216 + 6 = Mifare 4k S70 7-byte 17 = NTAG I2C 1K + *** 7 = UL - NOT WORKING FULLY 18 = NTAG I2C 2K + *** 8 = UL-C - NOT WORKING FULLY 19 = NTAG I2C 1K PLUS + 9 = UL EV1 48b 20 = NTAG I2C 2K PLUS + 10 = UL EV1 128b 21 = NTAG 213F + *** 11 = UL Plus - NOT WORKING YET 22 = NTAG 216F -p NTAG password (8 hexsymbols), set NTAG password on tag. -a NTAG pack ( 4 hexsymbols), set NTAG pack on tag. @@ -178,7 +178,7 @@ local function read_config() if not info then return false, "Can't select card" end -- read Ultimate Magic Card CONFIG if magicconfig == nil then - magicconfig = send("CF".._key.."C6") + magicconfig = send("CF".._key.."C6") else print('No Config') end -- extract data from CONFIG - based on CONFIG in https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/magic_cards_notes.md#gen-4-gtu @@ -196,92 +196,92 @@ local function read_config() else atsstr = (string.sub(ats, 3)) end if ulprotocol == '00' then - cardprotocol = 'MIFARE Classic Protocol' - ultype = 'Disabled' - if uidlength == '00' then - uid = send("CF".._key.."CE00"):sub(1,8) - if atqaf == '00 04' and sak == '09' then cardtype = 'MIFARE Mini S20 4-byte UID' - elseif atqaf == '00 04' and sak == '08' then cardtype = 'MIFARE 1k S50 4-byte UID' - elseif atqaf == '00 02' and sak == '18' then cardtype = 'MIFARE 4k S70 4-byte UID' - end - elseif uidlength == '01' then - uid = send("CF".._key.."CE00"):sub(1,14) - if atqaf == '00 44' and sak == '09' then cardtype = 'MIFARE Mini S20 7-byte UID' - elseif atqaf == '00 44' and sak == '08' then cardtype = 'MIFARE 1k S50 7-byte UID' - elseif atqaf == '00 42' and sak == '18' then cardtype = 'MIFARE 4k S70 7-byte UID' - end - end + cardprotocol = 'MIFARE Classic Protocol' + ultype = 'Disabled' + if uidlength == '00' then + uid = send("CF".._key.."CE00"):sub(1,8) + if atqaf == '00 04' and sak == '09' then cardtype = 'MIFARE Mini S20 4-byte UID' + elseif atqaf == '00 04' and sak == '08' then cardtype = 'MIFARE 1k S50 4-byte UID' + elseif atqaf == '00 02' and sak == '18' then cardtype = 'MIFARE 4k S70 4-byte UID' + end + elseif uidlength == '01' then + uid = send("CF".._key.."CE00"):sub(1,14) + if atqaf == '00 44' and sak == '09' then cardtype = 'MIFARE Mini S20 7-byte UID' + elseif atqaf == '00 44' and sak == '08' then cardtype = 'MIFARE 1k S50 7-byte UID' + elseif atqaf == '00 42' and sak == '18' then cardtype = 'MIFARE 4k S70 7-byte UID' + end + end elseif ulprotocol == '01' then - -- Read Ultralight config only if UL protocol is enabled - cardprotocol = 'MIFARE Ultralight/NTAG' - block0 = send("3000") - uid0 = block0:sub(1,6) - uid = uid0..block0:sub(9,16) - if ulmode == '00' then ultype = 'Ultralight EV1' - elseif ulmode == '01' then ultype = 'NTAG21x' - elseif ulmode == '02' then ultype = 'Ultralight-C' - elseif ulmode == '03' then ultype = 'Ultralight' - end - -- read VERSION - cversion = send('30FA'):sub(1,16) - -- pwdblock must be set since the 30F1 and 30F2 special commands don't work on the ntag21x part of the UMC - if ulmode == '03' then versionstr = 'Ultralight' - elseif ulmode == '02' then versionstr = 'Ultralight-C' - elseif cversion == '0004030101000B03' then versionstr = 'UL EV1 48b' - elseif cversion == '0004030101000E03' then versionstr = 'UL EV1 128b' - elseif cversion == '0004040101000B03' then versionstr = 'NTAG 210' - elseif cversion == '0004040101000E03' then versionstr = 'NTAG 212' - elseif cversion == '0004040201000F03' then versionstr = 'NTAG 213' - elseif cversion == '0004040201001103' then versionstr = 'NTAG 215' - elseif cversion == '0004040201001303' then versionstr = 'NTAG 216' - elseif cversion == '0004040502011303' then versionstr = 'NTAG I2C 1K' - elseif cversion == '0004040502011503' then versionstr = 'NTAG I2C 2K' - elseif cversion == '0004040502021303' then versionstr = 'NTAG I2C 1K PLUS' - elseif cversion == '0004040502021503' then versionstr = 'NTAG I2C 2K PLUS' - elseif cversion == '0004040401000F03' then versionstr = 'NTAG 213F' - elseif cversion == '0004040401001303' then versionstr = 'NTAG 216F' - end - -- read PWD - cpwd = send("30F0"):sub(1,8) - pwd = send("30E5"):sub(1,8) - -- 04 response indicates that blocks has been locked down. - if pwd == '04' then lib14a.disconnect(); return nil, "can't read configuration, "..err_lock end - -- read PACK - cpack = send("30F1"):sub(1,4) - pack = send("30E6"):sub(1,4) - -- read SIGNATURE - signature1 = send('30F2'):sub(1,32) - signature2 = send('30F6'):sub(1,32) - lib14a.disconnect() + -- Read Ultralight config only if UL protocol is enabled + cardprotocol = 'MIFARE Ultralight/NTAG' + block0 = send("3000") + uid0 = block0:sub(1,6) + uid = uid0..block0:sub(9,16) + if ulmode == '00' then ultype = 'Ultralight EV1' + elseif ulmode == '01' then ultype = 'NTAG21x' + elseif ulmode == '02' then ultype = 'Ultralight-C' + elseif ulmode == '03' then ultype = 'Ultralight' + end + -- read VERSION + cversion = send('30FA'):sub(1,16) + -- pwdblock must be set since the 30F1 and 30F2 special commands don't work on the ntag21x part of the UMC + if ulmode == '03' then versionstr = 'Ultralight' + elseif ulmode == '02' then versionstr = 'Ultralight-C' + elseif cversion == '0004030101000B03' then versionstr = 'UL EV1 48b' + elseif cversion == '0004030101000E03' then versionstr = 'UL EV1 128b' + elseif cversion == '0004040101000B03' then versionstr = 'NTAG 210' + elseif cversion == '0004040101000E03' then versionstr = 'NTAG 212' + elseif cversion == '0004040201000F03' then versionstr = 'NTAG 213' + elseif cversion == '0004040201001103' then versionstr = 'NTAG 215' + elseif cversion == '0004040201001303' then versionstr = 'NTAG 216' + elseif cversion == '0004040502011303' then versionstr = 'NTAG I2C 1K' + elseif cversion == '0004040502011503' then versionstr = 'NTAG I2C 2K' + elseif cversion == '0004040502021303' then versionstr = 'NTAG I2C 1K PLUS' + elseif cversion == '0004040502021503' then versionstr = 'NTAG I2C 2K PLUS' + elseif cversion == '0004040401000F03' then versionstr = 'NTAG 213F' + elseif cversion == '0004040401001303' then versionstr = 'NTAG 216F' + end + -- read PWD + cpwd = send("30F0"):sub(1,8) + pwd = send("30E5"):sub(1,8) + -- 04 response indicates that blocks has been locked down. + if pwd == '04' then lib14a.disconnect(); return nil, "can't read configuration, "..err_lock end + -- read PACK + cpack = send("30F1"):sub(1,4) + pack = send("30E6"):sub(1,4) + -- read SIGNATURE + signature1 = send('30F2'):sub(1,32) + signature2 = send('30F6'):sub(1,32) + lib14a.disconnect() end if _print < 1 then - print(string.rep('=', 88)) - print('\t\t\tUltimate Magic Card Configuration') - print(string.rep('=', 88)) - print(' - Raw Config ', string.sub(magicconfig, 1, -9)) - print(' - Card Protocol ', cardprotocol) - print(' - Ultralight Mode ', ultype) - print(' - ULM Backdoor Key ', readpass) - print(' - GTU Mode ', gtustr) - if ulprotocol == '01' then - print(' - Card Type ', versionstr) - else - print(' - Card Type ', cardtype) - end - print(' - UID ', uid) - print(' - ATQA ', atqaf) - print(' - SAK ', sak) - if ulprotocol == '01' then - print('') - print(string.rep('=', 88)) - print('\t\t\tMagic UL/NTAG 21* Configuration') - print(string.rep('=', 88)) - print(' - ATS ', atsstr) - print(' - Password ', '[0xE5] '..pwd, '[0xF0] '..cpwd) - print(' - Pack ', '[0xE6] '..pack, '[0xF1] '..cpack) - print(' - Version ', cversion) - print(' - Signature ', signature1..signature2) - end + print(string.rep('=', 88)) + print('\t\t\tUltimate Magic Card Configuration') + print(string.rep('=', 88)) + print(' - Raw Config ', string.sub(magicconfig, 1, -9)) + print(' - Card Protocol ', cardprotocol) + print(' - Ultralight Mode ', ultype) + print(' - ULM Backdoor Key ', readpass) + print(' - GTU Mode ', gtustr) + if ulprotocol == '01' then + print(' - Card Type ', versionstr) + else + print(' - Card Type ', cardtype) + end + print(' - UID ', uid) + print(' - ATQA ', atqaf) + print(' - SAK ', sak) + if ulprotocol == '01' then + print('') + print(string.rep('=', 88)) + print('\t\t\tMagic UL/NTAG 21* Configuration') + print(string.rep('=', 88)) + print(' - ATS ', atsstr) + print(' - Password ', '[0xE5] '..pwd, '[0xF0] '..cpwd) + print(' - Pack ', '[0xE6] '..pack, '[0xF1] '..cpack) + print(' - Version ', cversion) + print(' - Signature ', signature1..signature2) + end end lib14a.disconnect() return true, 'Ok' @@ -291,41 +291,41 @@ end local function write_uid(useruid) -- read CONFIG if not magicconfig then - _print = 1 - read_config() + _print = 1 + read_config() end local info = connect() if not info then return false, "Can't select card" end -- Writes a MFC UID with GEN4 magic commands. if ulprotocol == '00' then - -- uid string checks - if useruid == nil then return nil, 'empty uid string' end - if #useruid == 0 then return nil, 'empty uid string' end - if (#useruid ~= 8) and (#useruid ~= 14) then return nil, 'UID wrong length. Should be 4 or 7 hex bytes' end - print('Writing new UID ', useruid) - local uidbytes = utils.ConvertHexToBytes(useruid) - local bcc1 = bxor(bxor(bxor(uidbytes[1], uidbytes[2]), uidbytes[3]), uidbytes[4]) - local block0 = string.format('%02X%02X%02X%02X%02X', uidbytes[1], uidbytes[2], uidbytes[3], uidbytes[4], bcc1) - local resp = send('CF'.._key..'CD00'..block0) + -- uid string checks + if useruid == nil then return nil, 'empty uid string' end + if #useruid == 0 then return nil, 'empty uid string' end + if (#useruid ~= 8) and (#useruid ~= 14) then return nil, 'UID wrong length. Should be 4 or 7 hex bytes' end + print('Writing new UID ', useruid) + local uidbytes = utils.ConvertHexToBytes(useruid) + local bcc1 = bxor(bxor(bxor(uidbytes[1], uidbytes[2]), uidbytes[3]), uidbytes[4]) + local block0 = string.format('%02X%02X%02X%02X%02X', uidbytes[1], uidbytes[2], uidbytes[3], uidbytes[4], bcc1) + local resp = send('CF'.._key..'CD00'..block0) -- Writes a MFUL UID with bcc1, bcc2 using NTAG21xx commands. elseif ulprotocol == '01' then - -- uid string checks - if useruid == nil then return nil, 'empty uid string' end - if #useruid == 0 then return nil, 'empty uid string' end - if #useruid ~= 14 then return nil, 'uid wrong length. Should be 7 hex bytes' end - print('Writing new UID ', useruid) - local uidbytes = utils.ConvertHexToBytes(useruid) - local bcc1 = bxor(bxor(bxor(uidbytes[1], uidbytes[2]), uidbytes[3]), 0x88) - local bcc2 = bxor(bxor(bxor(uidbytes[4], uidbytes[5]), uidbytes[6]), uidbytes[7]) - local block0 = string.format('%02X%02X%02X%02X', uidbytes[1], uidbytes[2], uidbytes[3], bcc1) - local block1 = string.format('%02X%02X%02X%02X', uidbytes[4], uidbytes[5], uidbytes[6], uidbytes[7]) - local block2 = string.format('%02X%02X%02X%02X', bcc2, 0x48, 0x00, 0x00) - local resp - resp = send('A200'..block0) - resp = send('A201'..block1) - resp = send('A202'..block2) + -- uid string checks + if useruid == nil then return nil, 'empty uid string' end + if #useruid == 0 then return nil, 'empty uid string' end + if #useruid ~= 14 then return nil, 'uid wrong length. Should be 7 hex bytes' end + print('Writing new UID ', useruid) + local uidbytes = utils.ConvertHexToBytes(useruid) + local bcc1 = bxor(bxor(bxor(uidbytes[1], uidbytes[2]), uidbytes[3]), 0x88) + local bcc2 = bxor(bxor(bxor(uidbytes[4], uidbytes[5]), uidbytes[6]), uidbytes[7]) + local block0 = string.format('%02X%02X%02X%02X', uidbytes[1], uidbytes[2], uidbytes[3], bcc1) + local block1 = string.format('%02X%02X%02X%02X', uidbytes[4], uidbytes[5], uidbytes[6], uidbytes[7]) + local block2 = string.format('%02X%02X%02X%02X', bcc2, 0x48, 0x00, 0x00) + local resp + resp = send('A200'..block0) + resp = send('A201'..block1) + resp = send('A202'..block2) else - print('Incorrect ul') + print('Incorrect ul') end lib14a.disconnect() if resp ~= nil then @@ -339,8 +339,8 @@ end local function write_atqasak(atqasak) -- read CONFIG if not magicconfig then - _print = 1 - read_config() + _print = 1 + read_config() end if atqasak == nil then return nil, 'Empty ATQA/SAK string' end if #atqasak == 0 then return nil, 'Empty ATQA/SAK string' end @@ -350,25 +350,25 @@ end local atqauserf = atqauser2..atqauser1 local sakuser = atqasak:sub(5,6) if sakuser == '04' then - print('Never set SAK bit 3 (e.g. SAK=04), it indicates an extra cascade level is required') - return nil + print('Never set SAK bit 3 (e.g. SAK=04), it indicates an extra cascade level is required') + return nil elseif (sakuser == '20' or sakuser == '28') and atslen == '00' then - print('When SAK equals 20 or 28, ATS must be turned on') - return nil + print('When SAK equals 20 or 28, ATS must be turned on') + return nil elseif atqauser2 == '40' then - print('ATQA of [00 40] will cause the card to not answer.') - return nil + print('ATQA of [00 40] will cause the card to not answer.') + return nil else - local info = connect() - if not info then return false, "Can't select card" end - print('New ATQA: '..atqauser1..' '..atqauser2..' New SAK: '..sakuser) - local resp = send("CF".._key.."35"..atqauserf..sakuser) - lib14a.disconnect() - if resp == nil then - return nil, oops('Failed to write ATQA/SAK') - else - return true, 'Ok' - end + local info = connect() + if not info then return false, "Can't select card" end + print('New ATQA: '..atqauser1..' '..atqauser2..' New SAK: '..sakuser) + local resp = send("CF".._key.."35"..atqauserf..sakuser) + lib14a.disconnect() + if resp == nil then + return nil, oops('Failed to write ATQA/SAK') + else + return true, 'Ok' + end end end --- @@ -376,8 +376,8 @@ end local function write_ntagpwd(ntagpwd) -- read CONFIG if not magicconfig then - _print = 1 - read_config() + _print = 1 + read_config() end if ulprotocol == '00' then return nil, 'Magic Card is not using the Ultralight Protocol' end -- PWD string checks @@ -401,8 +401,8 @@ end local function write_pack(userpack) -- read CONFIG if not magicconfig then - _print = 1 - read_config() + _print = 1 + read_config() end if ulprotocol == 0 then return nil, 'Magic Card is not using the Ultralight Protocol' end -- PACK string checks @@ -426,8 +426,8 @@ local function write_otp(block3) if #block3 ~= 8 then return nil, 'OTP wrong length. Should be 4 hex bytes' end -- read CONFIG if not magicconfig then - _print = 1 - read_config() + _print = 1 + read_config() end if ulprotocol == '00' then return nil, 'Magic Card is not using the Ultralight Protocol' end local info = connect() @@ -450,8 +450,8 @@ local function write_version(data) if #data ~= 16 then return nil, 'version wrong length. Should be 8 hex bytes' end -- read CONFIG if not magicconfig then - _print = 1 - read_config() + _print = 1 + read_config() end if ulprotocol == '00' then return nil, 'Magic Card is not using the Ultralight Protocol' end print('Writing new version', data) @@ -478,8 +478,8 @@ local function write_signature(data) if #data ~= 64 then return nil, 'data wrong length. Should be 32 hex bytes' end -- read CONFIG if not magicconfig then - _print = 1 - read_config() + _print = 1 + read_config() end local info = connect() if not info then return false, "Can't select card" end @@ -508,19 +508,19 @@ local function write_gtu(gtu) local info = connect() if not info then return false, "Can't select card" end if gtu == '00' then - print('Enabling GTU Pre-Write') - send('CF'.._key..'32'..gtu) + print('Enabling GTU Pre-Write') + send('CF'.._key..'32'..gtu) elseif gtu == '01' then - print('Enabling GTU Restore Mode') - send('CF'.._key..'32'..gtu) + print('Enabling GTU Restore Mode') + send('CF'.._key..'32'..gtu) elseif gtu == '02' then - print('Disabled GTU') - send('CF'.._key..'32'..gtu) + print('Disabled GTU') + send('CF'.._key..'32'..gtu) elseif gtu == '03' then - print('Disabled GTU, high speed R/W mode for Ultralight') - send('CF'.._key..'32'..gtu) + print('Disabled GTU, high speed R/W mode for Ultralight') + send('CF'.._key..'32'..gtu) else - print('Failed to set GTU mode') + print('Failed to set GTU mode') end lib14a.disconnect() return true, 'Ok' @@ -536,13 +536,13 @@ local function write_ats(atsuser) local atscardlendecimal = tonumber(atscardlen, 16) local atsf = string.sub(atsuser, 3) if (#atsf / 2) ~= atscardlendecimal then - oops('Given length of ATS ('..atscardlendecimal..') does not match the ATS_length ('..(#atsf / 2)..')') - return true, 'Ok' + oops('Given length of ATS ('..atscardlendecimal..') does not match the ATS_length ('..(#atsf / 2)..')') + return true, 'Ok' else - local info = connect() - if not info then return false, "Can't select card" end - print('Writing '..atscardlendecimal..' ATS bytes of '..atsf) - send("CF".._key.."34"..atsuser) + local info = connect() + if not info then return false, "Can't select card" end + print('Writing '..atscardlendecimal..' ATS bytes of '..atsf) + send("CF".._key.."34"..atsuser) end lib14a.disconnect() return true, 'Ok' @@ -556,11 +556,11 @@ local function write_ulp(ulp) local info = connect() if not info then return false, "Can't select card" end if ulp == '00' then - print('Changing card to Mifare Classic Protocol') - send("CF".._key.."69"..ulp) + print('Changing card to Mifare Classic Protocol') + send("CF".._key.."69"..ulp) elseif ulp == '01' then - print('Changing card to Ultralight Protocol') - send("CF".._key.."69"..ulp) + print('Changing card to Ultralight Protocol') + send("CF".._key.."69"..ulp) else oops('Protocol needs to be either 00 or 01') end @@ -576,17 +576,17 @@ local function write_ulm(ulm) local info = connect() if not info then return false, "Can't select card" end if ulm == '00' then - print('Changing card UL mode to Ultralight EV1') - send("CF".._key.."6A"..ulm) + print('Changing card UL mode to Ultralight EV1') + send("CF".._key.."6A"..ulm) elseif ulm == '01' then - print('Changing card UL mode to NTAG') - send("CF".._key.."6A"..ulm) + print('Changing card UL mode to NTAG') + send("CF".._key.."6A"..ulm) elseif ulm == '02' then - print('Changing card UL mode to Ultralight-C') - send("CF".._key.."6A"..ulm) + print('Changing card UL mode to Ultralight-C') + send("CF".._key.."6A"..ulm) elseif ulm == '03' then - print('Changing card UL mode to Ultralight') - send("CF".._key.."6A"..ulm) + print('Changing card UL mode to Ultralight') + send("CF".._key.."6A"..ulm) else oops('UL mode needs to be either 00, 01, 02, 03') end @@ -603,50 +603,50 @@ local function set_type(tagtype) if tagtype == 1 then print('Setting: Ultimate Magic card to Mifare mini S20 4-byte') connect() - send("CF".._key.."F000000000000002000978009102DABC19101011121314151604000900") - lib14a.disconnect() + send("CF".._key.."F000000000000002000978009102DABC19101011121314151604000900") + lib14a.disconnect() write_uid('04112233') -- Setting Mifare mini S20 7-byte elseif tagtype == 2 then print('Setting: Ultimate Magic card to Mifare mini S20 7-byte') connect() - send("CF".._key.."F000010000000002000978009102DABC19101011121314151644000900") - lib14a.disconnect() + send("CF".._key.."F000010000000002000978009102DABC19101011121314151644000900") + lib14a.disconnect() write_uid('04112233445566') -- Setting Mifare 1k S50 4--byte elseif tagtype == 3 then print('Setting: Ultimate Magic card to Mifare 1k S50 4-byte') connect() - send("CF".._key.."F000000000000002000978009102DABC19101011121314151604000800") - lib14a.disconnect() + send("CF".._key.."F000000000000002000978009102DABC19101011121314151604000800") + lib14a.disconnect() write_uid('04112233') -- Setting Mifare 1k S50 7-byte elseif tagtype == 4 then print('Setting: Ultimate Magic card to Mifare 1k S50 7-byte') connect() - send("CF".._key.."F000010000000002000978009102DABC19101011121314151644000800") - lib14a.disconnect() + send("CF".._key.."F000010000000002000978009102DABC19101011121314151644000800") + lib14a.disconnect() write_uid('04112233445566') -- Setting Mifare 4k S70 4-byte elseif tagtype == 5 then print('Setting: Ultimate Magic card to Mifare 4k S70 4-byte') connect() - send("CF".._key.."F000000000000002000978009102DABC19101011121314151602001800") - lib14a.disconnect() + send("CF".._key.."F000000000000002000978009102DABC19101011121314151602001800") + lib14a.disconnect() write_uid('04112233') -- Setting Mifare 4k S70 7-byte elseif tagtype == 6 then print('Setting: Ultimate Magic card to Mifare 4k S70 7-byte') connect() - send("CF".._key.."F000010000000002000978009102DABC19101011121314151642001800") - lib14a.disconnect() + send("CF".._key.."F000010000000002000978009102DABC19101011121314151642001800") + lib14a.disconnect() write_uid('04112233445566') -- Setting UL elseif tagtype == 7 then print('Setting: Ultimate Magic card to UL') connect() - send("CF".._key.."F0010100000000030A0A78008102DBA0C119402AB5BA4D321A44000003") - lib14a.disconnect() + send("CF".._key.."F0010100000000030A0A78008102DBA0C119402AB5BA4D321A44000003") + lib14a.disconnect() write_uid('04112233445566') write_otp('00000000') -- Setting OTP to default 00 00 00 00 write_version('0000000000000000') -- UL-C does not have a version @@ -654,48 +654,48 @@ local function set_type(tagtype) elseif tagtype == 8 then print('Setting: Ultimate Magic card to UL-C') connect() - send("CF".._key.."F0010100000000030A0A78008102DBA0C119402AB5BA4D321A44000002") - print('Setting default permissions and 3des key') - send('A22A30000000') -- Auth0 page 48/0x30 and above need authentication - send('A22B80000000') -- Auth1 read and write access restricted - send('A22C42524541') -- Default 3des key - send('A22D4B4D4549') - send('A22E46594F55') - send('A22F43414E21') - lib14a.disconnect() + send("CF".._key.."F0010100000000030A0A78008102DBA0C119402AB5BA4D321A44000002") + print('Setting default permissions and 3des key') + send('A22A30000000') -- Auth0 page 48/0x30 and above need authentication + send('A22B80000000') -- Auth1 read and write access restricted + send('A22C42524541') -- Default 3des key + send('A22D4B4D4549') + send('A22E46594F55') + send('A22F43414E21') + lib14a.disconnect() write_uid('04112233445566') write_otp('00000000') -- Setting OTP to default 00 00 00 00 write_version('0000000000000000') -- UL-C does not have a version elseif tagtype == 9 then print('Setting: Ultimate Magic card to UL-EV1 48') - connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000000") + connect() + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000000") -- Setting UL-Ev1 default config bl 16,17 - send('a2E5FFFFFFFF') -- A2F0 block does not align correctly to actual pwd block - send('a2E6FFFFFFFF') -- A2F1 block does not align correctly to actual pack block + send('a2E5FFFFFFFF') -- A2F0 block does not align correctly to actual pwd block + send('a2E6FFFFFFFF') -- A2F1 block does not align correctly to actual pack block send('a210000000FF') send('a21100050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_otp('00000000') -- Setting OTP to default 00 00 00 00 write_version('0004030101000b03') -- UL-EV1 (48) 00 04 03 01 01 00 0b 03 elseif tagtype == 10 then print('Setting: Ultimate Magic card to UL-EV1 128') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000000") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000000") -- Setting UL-Ev1 default config bl 37,38 - send('a2E5FFFFFFFF') -- A2F0 block does not align correctly to actual pwd block - send('a2E6FFFFFFFF') -- A2F1 block does not align correctly to actual pack block + send('a2E5FFFFFFFF') -- A2F0 block does not align correctly to actual pwd block + send('a2E6FFFFFFFF') -- A2F1 block does not align correctly to actual pack block send('a225000000FF') send('a22600050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_otp('00000000') -- Setting OTP to default 00 00 00 00 write_version('0004030101000e03') -- UL-EV1 (128) 00 04 03 01 01 00 0e 03 elseif tagtype == 12 then print('Setting: Ultimate Magic card to NTAG 210') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG210 default CC block456 send('a203e1100600') send('a2040300fe00') @@ -703,13 +703,13 @@ local function set_type(tagtype) -- Setting cfg1/cfg2 send('a210000000FF') send('a21100050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040101000b03') -- NTAG210 00 04 04 01 01 00 0b 03 elseif tagtype == 13 then print('Setting: Ultimate Magic card to NTAG 212') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG212 default CC block456 send('a203e1101000') send('a2040103900a') @@ -717,13 +717,13 @@ local function set_type(tagtype) -- Setting cfg1/cfg2 send('a225000000FF') send('a22600050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040101000E03') -- NTAG212 00 04 04 01 01 00 0E 03 elseif tagtype == 14 then print('Setting: Ultimate Magic card to NTAG 213') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG213 default CC block456 send('a203e1101200') send('a2040103a00c') @@ -731,13 +731,13 @@ local function set_type(tagtype) -- setting cfg1/cfg2 send('a229000000ff') send('a22a00050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040201000F03') -- NTAG213 00 04 04 02 01 00 0f 03 elseif tagtype == 15 then print('Setting: Ultimate Magic card to NTAG 215') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG215 default CC block456 send('a203e1103e00') send('a2040300fe00') @@ -745,13 +745,13 @@ local function set_type(tagtype) -- setting cfg1/cfg2 send('a283000000ff') send('a28400050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040201001103') -- NTAG215 00 04 04 02 01 00 11 03 elseif tagtype == 16 then print('Setting: Ultimate Magic card to NTAG 216') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG216 default CC block456 send('a203e1106d00') send('a2040300fe00') @@ -759,56 +759,56 @@ local function set_type(tagtype) -- setting cfg1/cfg2 send('a2e3000000ff') send('a2e400050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040201001303') -- NTAG216 00 04 04 02 01 00 13 03 elseif tagtype == 17 then print('Setting: Ultimate Magic card to NTAG I2C 1K') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG I2C 1K default CC block456 send('a203e1106D00') send('a2040300fe00') send('a20500000000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040502011303') -- NTAG_I2C_1K 00 04 04 05 02 01 13 03 elseif tagtype == 18 then print('Setting: Ultimate Magic card to NTAG I2C 2K') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG I2C 2K default CC block456 send('a203e110EA00') send('a2040300fe00') send('a20500000000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040502011503') -- NTAG_I2C_2K 00 04 04 05 02 01 15 03 elseif tagtype == 19 then print('Setting: Ultimate Magic card to NTAG I2C plus 1K') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG I2C 1K default CC block456 send('a203e1106D00') send('a2040300fe00') send('a20500000000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040502021303') -- NTAG_I2C_1K 00 04 04 05 02 02 13 03 elseif tagtype == 20 then print('Setting: Ultimate Magic card to NTAG I2C plus 2K') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG I2C 2K default CC block456 send('a203e1106D00') send('a2040300fe00') send('a20500000000') - write_uid('04112233445566') + write_uid('04112233445566') write_version('0004040502021503') -- NTAG_I2C_2K 00 04 04 05 02 02 15 03 elseif tagtype == 21 then print('Setting: Ultimate Magic card to NTAG 213F') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG213 default CC block456 send('a203e1101200') send('a2040103a00c') @@ -816,13 +816,13 @@ local function set_type(tagtype) -- setting cfg1/cfg2 send('a229000000ff') send('a22a00050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040401000F03') -- NTAG213F 00 04 04 04 01 00 0f 03 elseif tagtype == 22 then print('Setting: Ultimate Magic card to NTAG 216F') connect() - send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") + send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") -- Setting NTAG216 default CC block456 send('a203e1106d00') send('a2040300fe00') @@ -830,11 +830,11 @@ local function set_type(tagtype) -- setting cfg1/cfg2 send('a2e3000000ff') send('a2e400050000') - lib14a.disconnect() - write_uid('04112233445566') + lib14a.disconnect() + write_uid('04112233445566') write_version('0004040401001303') -- NTAG216F 00 04 04 04 01 00 13 03 else - oops('No matching tag types') + oops('No matching tag types') end lib14a.disconnect() if resp == '04' then diff --git a/client/src/cmdhfepa.c b/client/src/cmdhfepa.c index 7ce9a3e97..66ce37d6b 100644 --- a/client/src/cmdhfepa.c +++ b/client/src/cmdhfepa.c @@ -228,7 +228,7 @@ static int CmdHFEPAPACESimulate(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, false); // bool use_pc = arg_get_lit(ctx, 1); -// uint8_t pwd_type = 0; +// uint8_t pwd_type = 0; int plen = 0; uint8_t pwd[6] = {0}; @@ -273,7 +273,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"cnonces", CmdHFEPACollectPACENonces, IfPm3Iso14443, "Acquire encrypted PACE nonces of specific size"}, {"replay", CmdHFEPAPACEReplay, IfPm3Iso14443, "Perform PACE protocol by replaying given APDUs"}, - {"sim", CmdHFEPAPACESimulate, IfPm3Iso14443, "Simulate PACE protocol"}, + {"sim", CmdHFEPAPACESimulate, IfPm3Iso14443, "Simulate PACE protocol"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdhfxerox.c b/client/src/cmdhfxerox.c index 578f797e0..9ba1577da 100644 --- a/client/src/cmdhfxerox.c +++ b/client/src/cmdhfxerox.c @@ -15,77 +15,77 @@ #define TIMEOUT 2000 -#define c2l(c,l) (l = ((unsigned long)(*((c)++))), \ - l |= ((unsigned long)(*((c)++))) << 8L, \ - l |= ((unsigned long)(*((c)++))) << 16L, \ - l |= ((unsigned long)(*((c)++))) << 24L) +#define c2l(c,l) (l = ((unsigned long)(*((c)++))), \ + l |= ((unsigned long)(*((c)++))) << 8L, \ + l |= ((unsigned long)(*((c)++))) << 16L, \ + l |= ((unsigned long)(*((c)++))) << 24L) /* NOTE - c is not incremented as per c2l */ -#define c2ln(c,l1,l2,n) { \ - c += n; \ - l1 = l2 = 0; \ - switch (n) { \ - case 8: l2 = ((unsigned long)(*(--(c)))) << 24L; \ - case 7: l2 |= ((unsigned long)(*(--(c)))) << 16L; \ - case 6: l2 |= ((unsigned long)(*(--(c)))) << 8L; \ - case 5: l2 |= ((unsigned long)(*(--(c)))); \ - case 4: l1 = ((unsigned long)(*(--(c)))) << 24L; \ - case 3: l1 |= ((unsigned long)(*(--(c)))) << 16L; \ - case 2: l1 |= ((unsigned long)(*(--(c)))) << 8L; \ - case 1: l1 |= ((unsigned long)(*(--(c)))); \ - } \ - } +#define c2ln(c,l1,l2,n) { \ + c += n; \ + l1 = l2 = 0; \ + switch (n) { \ + case 8: l2 = ((unsigned long)(*(--(c)))) << 24L; \ + case 7: l2 |= ((unsigned long)(*(--(c)))) << 16L; \ + case 6: l2 |= ((unsigned long)(*(--(c)))) << 8L; \ + case 5: l2 |= ((unsigned long)(*(--(c)))); \ + case 4: l1 = ((unsigned long)(*(--(c)))) << 24L; \ + case 3: l1 |= ((unsigned long)(*(--(c)))) << 16L; \ + case 2: l1 |= ((unsigned long)(*(--(c)))) << 8L; \ + case 1: l1 |= ((unsigned long)(*(--(c)))); \ + } \ + } -#define l2c(l,c) (*((c)++) = (uint8_t)(((l)) & 0xff), \ - *((c)++) = (uint8_t)(((l) >> 8L) & 0xff), \ - *((c)++) = (uint8_t)(((l) >> 16L) & 0xff), \ - *((c)++) = (uint8_t)(((l) >> 24L) & 0xff)) +#define l2c(l,c) (*((c)++) = (uint8_t)(((l)) & 0xff), \ + *((c)++) = (uint8_t)(((l) >> 8L) & 0xff), \ + *((c)++) = (uint8_t)(((l) >> 16L) & 0xff), \ + *((c)++) = (uint8_t)(((l) >> 24L) & 0xff)) /* NOTE - c is not incremented as per l2c */ -#define l2cn(l1,l2,c,n) { \ - c += n; \ - switch (n) { \ - case 8: *(--(c)) = (uint8_t)(((l2) >> 24L) & 0xff); \ - case 7: *(--(c)) = (uint8_t)(((l2) >> 16L) & 0xff); \ - case 6: *(--(c)) = (uint8_t)(((l2) >> 8L) & 0xff); \ - case 5: *(--(c)) = (uint8_t)(((l2)) & 0xff); \ - case 4: *(--(c)) = (uint8_t)(((l1) >> 24L) & 0xff); \ - case 3: *(--(c)) = (uint8_t)(((l1) >> 16L) & 0xff); \ - case 2: *(--(c)) = (uint8_t)(((l1) >> 8L) & 0xff); \ - case 1: *(--(c)) = (uint8_t)(((l1)) & 0xff); \ - } \ - } +#define l2cn(l1,l2,c,n) { \ + c += n; \ + switch (n) { \ + case 8: *(--(c)) = (uint8_t)(((l2) >> 24L) & 0xff); \ + case 7: *(--(c)) = (uint8_t)(((l2) >> 16L) & 0xff); \ + case 6: *(--(c)) = (uint8_t)(((l2) >> 8L) & 0xff); \ + case 5: *(--(c)) = (uint8_t)(((l2)) & 0xff); \ + case 4: *(--(c)) = (uint8_t)(((l1) >> 24L) & 0xff); \ + case 3: *(--(c)) = (uint8_t)(((l1) >> 16L) & 0xff); \ + case 2: *(--(c)) = (uint8_t)(((l1) >> 8L) & 0xff); \ + case 1: *(--(c)) = (uint8_t)(((l1)) & 0xff); \ + } \ + } /* NOTE - c is not incremented as per n2l */ -#define n2ln(c,l1,l2,n) { \ - c += n; \ - l1 = l2 = 0; \ - switch (n) { \ - case 8: l2 = ((unsigned long)(*(--(c)))); \ - case 7: l2 |= ((unsigned long)(*(--(c)))) << 8; \ - case 6: l2 |= ((unsigned long)(*(--(c)))) << 16; \ - case 5: l2 |= ((unsigned long)(*(--(c)))) << 24; \ - case 4: l1 = ((unsigned long)(*(--(c)))); \ - case 3: l1 |= ((unsigned long)(*(--(c)))) << 8; \ - case 2: l1 |= ((unsigned long)(*(--(c)))) << 16; \ - case 1: l1 |= ((unsigned long)(*(--(c)))) << 24; \ - } \ - } +#define n2ln(c,l1,l2,n) { \ + c += n; \ + l1 = l2 = 0; \ + switch (n) { \ + case 8: l2 = ((unsigned long)(*(--(c)))); \ + case 7: l2 |= ((unsigned long)(*(--(c)))) << 8; \ + case 6: l2 |= ((unsigned long)(*(--(c)))) << 16; \ + case 5: l2 |= ((unsigned long)(*(--(c)))) << 24; \ + case 4: l1 = ((unsigned long)(*(--(c)))); \ + case 3: l1 |= ((unsigned long)(*(--(c)))) << 8; \ + case 2: l1 |= ((unsigned long)(*(--(c)))) << 16; \ + case 1: l1 |= ((unsigned long)(*(--(c)))) << 24; \ + } \ + } /* NOTE - c is not incremented as per l2n */ -#define l2nn(l1,l2,c,n) { \ - c+=n; \ - switch (n) { \ - case 8: *(--(c)) = (uint8_t)(((l2)) & 0xff); \ - case 7: *(--(c)) = (uint8_t)(((l2) >> 8) & 0xff); \ - case 6: *(--(c)) = (uint8_t)(((l2) >> 16) & 0xff); \ - case 5: *(--(c)) = (uint8_t)(((l2) >> 24) & 0xff); \ - case 4: *(--(c)) = (uint8_t)(((l1)) & 0xff); \ - case 3: *(--(c)) = (uint8_t)(((l1) >> 8) & 0xff); \ - case 2: *(--(c)) = (uint8_t)(((l1) >> 16) & 0xff); \ - case 1: *(--(c)) = (uint8_t)(((l1) >> 24) & 0xff); \ - } \ - } +#define l2nn(l1,l2,c,n) { \ + c+=n; \ + switch (n) { \ + case 8: *(--(c)) = (uint8_t)(((l2)) & 0xff); \ + case 7: *(--(c)) = (uint8_t)(((l2) >> 8) & 0xff); \ + case 6: *(--(c)) = (uint8_t)(((l2) >> 16) & 0xff); \ + case 5: *(--(c)) = (uint8_t)(((l2) >> 24) & 0xff); \ + case 4: *(--(c)) = (uint8_t)(((l1)) & 0xff); \ + case 3: *(--(c)) = (uint8_t)(((l1) >> 8) & 0xff); \ + case 2: *(--(c)) = (uint8_t)(((l1) >> 16) & 0xff); \ + case 1: *(--(c)) = (uint8_t)(((l1) >> 24) & 0xff); \ + } \ + } #define n2l(c,l) (l = ((unsigned long)(*((c)++))) << 24L, \ l |= ((unsigned long)(*((c)++))) << 16L, \ @@ -98,17 +98,17 @@ *((c)++) = (uint8_t)(((l)) & 0xff)) #define C_RC2(n) \ - t = (x0 + (x1 & ~x3) + (x2 & x3) + *(p0++)) & 0xffff; \ - x0 = (t << 1) | (t >> 15); \ - t = (x1 + (x2 & ~x0) + (x3 & x0) + *(p0++)) & 0xffff; \ - x1 = (t << 2) | (t >> 14); \ - t = (x2 + (x3 & ~x1) + (x0 & x1) + *(p0++)) & 0xffff; \ - x2 = (t << 3) | (t >> 13); \ - t = (x3 + (x0 & ~x2) + (x1 & x2) + *(p0++)) & 0xffff; \ - x3 = (t << 5) | (t >> 11); + t = (x0 + (x1 & ~x3) + (x2 & x3) + *(p0++)) & 0xffff; \ + x0 = (t << 1) | (t >> 15); \ + t = (x1 + (x2 & ~x0) + (x3 & x0) + *(p0++)) & 0xffff; \ + x1 = (t << 2) | (t >> 14); \ + t = (x2 + (x3 & ~x1) + (x0 & x1) + *(p0++)) & 0xffff; \ + x2 = (t << 3) | (t >> 13); \ + t = (x3 + (x0 & ~x2) + (x1 & x2) + *(p0++)) & 0xffff; \ + x3 = (t << 5) | (t >> 11); -#define RC2_ENCRYPT 1 -#define RC2_DECRYPT 0 +#define RC2_ENCRYPT 1 +#define RC2_DECRYPT 0 typedef unsigned int RC2_INT; @@ -533,8 +533,8 @@ static int CmdHFXeroxInfo(const char *Cmd) { packet->flags = (ISO14B_APPEND_CRC | ISO14B_RAW); packet->rawlen = 11; packet->raw[0] = 0x02; - packet->raw[1] = 0x20; // set command: read mem - memcpy(packet->raw + 2, card.uid, 8); // store uid + packet->raw[1] = 0x20; // set command: read mem + memcpy(packet->raw + 2, card.uid, 8); // store uid for (int retry = 0; (retry < 5 && blocknum < sizeof(info_blocks)); retry++) { @@ -623,7 +623,7 @@ static int CmdHFXeroxDump(const char *Cmd) { } iso14b_card_select_t card; - int status = findXerox(&card, false); // remain RF on + int status = findXerox(&card, false); // remain RF on if (status != PM3_SUCCESS) { free(packet); switch_off_field(); @@ -632,20 +632,20 @@ static int CmdHFXeroxDump(const char *Cmd) { PrintAndLogEx(INFO, "Reading memory from tag UID " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); - int blocknum = 1; // block 0 all zeros + int blocknum = 1; // block 0 all zeros uint8_t data[256 * 4] = {0}; // set up the read command packet->flags = (ISO14B_APPEND_CRC | ISO14B_RAW); packet->rawlen = 11; packet->raw[0] = 0x02; - memcpy(packet->raw + 2, card.uid, 8); // store uid + memcpy(packet->raw + 2, card.uid, 8); // store uid PrintAndLogEx(INFO, "." NOLF); for (int retry = 0; (retry < 5 && blocknum < 0x100); retry++) { - packet->raw[1] = (blocknum < 12) ? 0x30 : 0x20; // set command: read ext mem or read mem + packet->raw[1] = (blocknum < 12) ? 0x30 : 0x20; // set command: read ext mem or read mem packet->raw[10] = blocknum & 0xFF; PacketResponseNG resp; @@ -657,7 +657,7 @@ static int CmdHFXeroxDump(const char *Cmd) { resp.cmd, resp.length, resp.magic, resp.status, resp.crc, resp.oldarg[0], resp.oldarg[1], resp.oldarg[2], resp.data.asBytes[0], resp.data.asBytes[1], resp.data.asBytes[2], resp.ng ? 't' : 'f'); */ - if (/*resp.status != 0 ||*/ resp.length < 7) { // 14b raw command send data_len instead of status + if (/*resp.status != 0 ||*/ resp.length < 7) { // 14b raw command send data_len instead of status PrintAndLogEx(FAILED, "retrying one more time"); continue; } @@ -722,8 +722,8 @@ static int CmdHFXeroxDump(const char *Cmd) { memcpy(k1, k2, sizeof(k1)); k1[2] = k2[3] ^ data[0x22 * 4 + 0]; - k1[3] = k2[4] ^ data[0x22 * 4 + 1]; // first_key[7]; - k1[5] = k2[1] ^ 0x01; // 01 = crypto method? rfid[23][2] + k1[3] = k2[4] ^ data[0x22 * 4 + 1]; // first_key[7]; + k1[5] = k2[1] ^ 0x01; // 01 = crypto method? rfid[23][2] RC2_set_key(&exp_key, 8, k1, 64); @@ -747,7 +747,7 @@ static int CmdHFXeroxDump(const char *Cmd) { uint16_t cs, csd; // calc checksum - for (b = 0, cs = 0; b < sizeof(decr) - 2; b += 2) cs += decr[b] | (decr[b + 1] << 8); + for (b = 0, cs = 0; b < sizeof(decr) - 2; b += 2) cs += decr[b] | (decr[b + 1] << 8); cs = ~cs; csd = (decr[7] << 8) | decr[6]; @@ -772,7 +772,7 @@ static int CmdHFXeroxDump(const char *Cmd) { PrintAndLogEx(INFO, "---------+--------------+----------"); PrintAndLogEx(NORMAL, ""); - if (0 == filename[0]) { // generate filename from uid + if (0 == filename[0]) { // generate filename from uid /* PrintAndLogEx(INFO, "Using UID as filename"); diff --git a/doc/commands.json b/doc/commands.json index 47f77d21a..e055a70b4 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -11512,6 +11512,6 @@ "metadata": { "commands_extracted": 727, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-01-14T21:16:27" + "extracted_on": "2023-01-14T21:23:30" } } \ No newline at end of file diff --git a/include/protocols.h b/include/protocols.h index 016584098..9de07e4e7 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -473,7 +473,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. // 65 xx #define ISO7816_MEMORY_FULL 0x6501 // Memory failure -#define ISO7816_WRITE_MEMORY_ERR 0x6581 // Write problem / Memory failure / Unknown mode +#define ISO7816_WRITE_MEMORY_ERR 0x6581 // Write problem / Memory failure / Unknown mode // 67 xx #define ISO7816_WRONG_LENGTH 0x6700 // Wrong length From 6a576701c7d9f1357b21e10a4e917c0d2880960c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 14 Jan 2023 22:40:05 +0100 Subject: [PATCH 079/924] Topaz dump: remove unnecessary casts increasing required alignment and add dump size check --- client/src/cmdhftopaz.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/client/src/cmdhftopaz.c b/client/src/cmdhftopaz.c index 8ad9c23ee..a59cd02be 100644 --- a/client/src/cmdhftopaz.c +++ b/client/src/cmdhftopaz.c @@ -583,9 +583,7 @@ static void topaz_print_lifecycle_state(uint8_t *data) { // to be done } -static void printTopazDumpContents(uint8_t *dump, size_t size) { - - topaz_tag_t *t = (topaz_tag_t *)dump; +static void printTopazDumpContents(topaz_tag_t *dump) { // uses a global var for all PrintAndLogEx(NORMAL, ""); @@ -608,14 +606,14 @@ static void printTopazDumpContents(uint8_t *dump, size_t size) { PrintAndLogEx(SUCCESS, " %3u / 0x%02x | %s| %s | %s", i, i, - sprint_hex(&t->data_blocks[i][0], 8), + sprint_hex(&dump->data_blocks[i][0], 8), lockstr, block_info ); } - PrintAndLogEx(SUCCESS, " %3u / 0x%02x | %s| | %s", 0x0D, 0x0D, sprint_hex(&t->data_blocks[0x0D][0], 8), topaz_ks[2]); - PrintAndLogEx(SUCCESS, " %3u / 0x%02x | %s| | %s", 0x0E, 0x0E, sprint_hex(&t->data_blocks[0x0E][0], 8), topaz_ks[3]); + PrintAndLogEx(SUCCESS, " %3u / 0x%02x | %s| | %s", 0x0D, 0x0D, sprint_hex(&dump->data_blocks[0x0D][0], 8), topaz_ks[2]); + PrintAndLogEx(SUCCESS, " %3u / 0x%02x | %s| | %s", 0x0E, 0x0E, sprint_hex(&dump->data_blocks[0x0E][0], 8), topaz_ks[3]); PrintAndLogEx(SUCCESS, "------------+-------------------------+---+------------"); PrintAndLogEx(NORMAL, ""); } @@ -797,7 +795,7 @@ static int CmdHFTopazDump(const char *Cmd) { if (status != PM3_SUCCESS) { return status; } - printTopazDumpContents((uint8_t *)&topaz_tag, sizeof(topaz_tag_t)); + printTopazDumpContents(&topaz_tag); bool set_dynamic = false; if (topaz_set_cc_dynamic(&topaz_tag.data_blocks[1][0]) == PM3_SUCCESS) { @@ -853,14 +851,17 @@ static int CmdHFTopazView(const char *Cmd) { CLIParserFree(ctx); // read dump file - uint8_t *dump = NULL; + topaz_tag_t *dump = NULL; size_t bytes_read = TOPAZ_MAX_SIZE; int res = pm3_load_dump(filename, (void **)&dump, &bytes_read, sizeof(topaz_tag_t) + TOPAZ_MAX_SIZE); if (res != PM3_SUCCESS) { return res; } - - printTopazDumpContents(dump, bytes_read); + if (bytes_read < sizeof(topaz_tag_t)) { + free(dump); + return PM3_EFAILED; + } + printTopazDumpContents(dump); if (topaz_set_cc_dynamic(&topaz_tag.data_blocks[1][0]) == PM3_SUCCESS) { From 04bab85557ff9d243436e781c8e78becd4785d32 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 14 Jan 2023 23:02:06 +0100 Subject: [PATCH 080/924] fileutils: replace casts by union and remove warning about increase alignment requirement --- client/src/fileutils.c | 64 ++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index e42ac5a16..8c2f7a6f0 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -1162,12 +1162,19 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz goto out; } - uint8_t *udata = (uint8_t *)data; + typedef union UDATA + { + void* v; + uint8_t* bytes; + mfu_dump_t* mfu; + topaz_tag_t* topaz; + } UDATA; + UDATA udata = (UDATA)data; char ctype[100] = {0}; JsonLoadStr(root, "$.FileType", ctype); if (!strcmp(ctype, "raw")) { - JsonLoadBufAsHex(root, "$.raw", udata, maxdatalen, datalen); + JsonLoadBufAsHex(root, "$.raw", udata.bytes, maxdatalen, datalen); } if (!strcmp(ctype, "mfcard")) { @@ -1187,7 +1194,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz goto out; } - memcpy(&udata[sptr], block, 16); + memcpy(&udata.bytes[sptr], block, 16); sptr += len; } @@ -1206,7 +1213,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz snprintf(blocks, sizeof(blocks), "$.blocks.%d", i); size_t len = 0; - JsonLoadBufAsHex(root, blocks, &udata[sptr], 4, &len); + JsonLoadBufAsHex(root, blocks, &udata.bytes[sptr], 4, &len); if (!len) break; @@ -1218,18 +1225,16 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz if (!strcmp(ctype, "mfu")) { - mfu_dump_t *mem = (mfu_dump_t *)udata; - - JsonLoadBufAsHex(root, "$.Card.Version", mem->version, sizeof(mem->version), datalen); - JsonLoadBufAsHex(root, "$.Card.TBO_0", mem->tbo, sizeof(mem->tbo), datalen); - JsonLoadBufAsHex(root, "$.Card.TBO_1", mem->tbo1, sizeof(mem->tbo1), datalen); - JsonLoadBufAsHex(root, "$.Card.Signature", mem->signature, sizeof(mem->signature), datalen); - JsonLoadBufAsHex(root, "$.Card.Counter0", &mem->counter_tearing[0][0], 3, datalen); - JsonLoadBufAsHex(root, "$.Card.Tearing0", &mem->counter_tearing[0][3], 1, datalen); - JsonLoadBufAsHex(root, "$.Card.Counter1", &mem->counter_tearing[1][0], 3, datalen); - JsonLoadBufAsHex(root, "$.Card.Tearing1", &mem->counter_tearing[1][3], 1, datalen); - JsonLoadBufAsHex(root, "$.Card.Counter2", &mem->counter_tearing[2][0], 3, datalen); - JsonLoadBufAsHex(root, "$.Card.Tearing2", &mem->counter_tearing[2][3], 1, datalen); + JsonLoadBufAsHex(root, "$.Card.Version", udata.mfu->version, sizeof(udata.mfu->version), datalen); + JsonLoadBufAsHex(root, "$.Card.TBO_0", udata.mfu->tbo, sizeof(udata.mfu->tbo), datalen); + JsonLoadBufAsHex(root, "$.Card.TBO_1", udata.mfu->tbo1, sizeof(udata.mfu->tbo1), datalen); + JsonLoadBufAsHex(root, "$.Card.Signature", udata.mfu->signature, sizeof(udata.mfu->signature), datalen); + JsonLoadBufAsHex(root, "$.Card.Counter0", &udata.mfu->counter_tearing[0][0], 3, datalen); + JsonLoadBufAsHex(root, "$.Card.Tearing0", &udata.mfu->counter_tearing[0][3], 1, datalen); + JsonLoadBufAsHex(root, "$.Card.Counter1", &udata.mfu->counter_tearing[1][0], 3, datalen); + JsonLoadBufAsHex(root, "$.Card.Tearing1", &udata.mfu->counter_tearing[1][3], 1, datalen); + JsonLoadBufAsHex(root, "$.Card.Counter2", &udata.mfu->counter_tearing[2][0], 3, datalen); + JsonLoadBufAsHex(root, "$.Card.Tearing2", &udata.mfu->counter_tearing[2][3], 1, datalen); *datalen = MFU_DUMP_PREFIX_LENGTH; size_t sptr = 0; @@ -1243,15 +1248,15 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz snprintf(blocks, sizeof(blocks), "$.blocks.%d", i); size_t len = 0; - JsonLoadBufAsHex(root, blocks, &mem->data[sptr], MFU_BLOCK_SIZE, &len); + JsonLoadBufAsHex(root, blocks, &udata.mfu->data[sptr], MFU_BLOCK_SIZE, &len); if (!len) break; sptr += len; - mem->pages++; + udata.mfu->pages++; } // remove one, since pages indicates a index rather than number of available pages - --mem->pages; + --udata.mfu->pages; *datalen += sptr; } @@ -1268,7 +1273,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz snprintf(blocks, sizeof(blocks), "$.blocks.%zu", i); size_t len = 0; - JsonLoadBufAsHex(root, blocks, &udata[sptr], 4, &len); + JsonLoadBufAsHex(root, blocks, &udata.bytes[sptr], 4, &len); if (!len) break; @@ -1290,7 +1295,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz snprintf(blocks, sizeof(blocks), "$.blocks.%zu", i); size_t len = 0; - JsonLoadBufAsHex(root, blocks, &udata[sptr], 8, &len); + JsonLoadBufAsHex(root, blocks, &udata.bytes[sptr], 8, &len); if (!len) break; @@ -1311,7 +1316,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz snprintf(blocks, sizeof(blocks), "$.blocks.%zu", i); size_t len = 0; - JsonLoadBufAsHex(root, blocks, &udata[sptr], 4, &len); + JsonLoadBufAsHex(root, blocks, &udata.bytes[sptr], 4, &len); if (!len) break; @@ -1332,7 +1337,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz snprintf(blocks, sizeof(blocks), "$.blocks.%zu", i); size_t len = 0; - JsonLoadBufAsHex(root, blocks, &udata[sptr], 4, &len); + JsonLoadBufAsHex(root, blocks, &udata.bytes[sptr], 4, &len); if (!len) break; @@ -1342,19 +1347,18 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz } if (!strcmp(ctype, "15693")) { - JsonLoadBufAsHex(root, "$.raw", udata, maxdatalen, datalen); + JsonLoadBufAsHex(root, "$.raw", udata.bytes, maxdatalen, datalen); } if (!strcmp(ctype, "legic")) { - JsonLoadBufAsHex(root, "$.raw", udata, maxdatalen, datalen); + JsonLoadBufAsHex(root, "$.raw", udata.bytes, maxdatalen, datalen); } if (!strcmp(ctype, "topaz")) { - topaz_tag_t *mem = (topaz_tag_t *)udata; - JsonLoadBufAsHex(root, "$.Card.UID", mem->uid, sizeof(mem->uid), datalen); - JsonLoadBufAsHex(root, "$.Card.HR01", mem->HR01, sizeof(mem->HR01), datalen); - JsonLoadBufAsHex(root, "$.Card.Size", (uint8_t *) & (mem->size), 2, datalen); + JsonLoadBufAsHex(root, "$.Card.UID", udata.topaz->uid, sizeof(udata.topaz->uid), datalen); + JsonLoadBufAsHex(root, "$.Card.HR01", udata.topaz->HR01, sizeof(udata.topaz->HR01), datalen); + JsonLoadBufAsHex(root, "$.Card.Size", (uint8_t *) & (udata.topaz->size), 2, datalen); size_t sptr = 0; for (int i = 0; i < (TOPAZ_STATIC_MEMORY / 8); i++) { @@ -1368,7 +1372,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz snprintf(blocks, sizeof(blocks), "$.blocks.%d", i); size_t len = 0; - JsonLoadBufAsHex(root, blocks, &mem->data_blocks[sptr][0], TOPAZ_BLOCK_SIZE, &len); + JsonLoadBufAsHex(root, blocks, &udata.topaz->data_blocks[sptr][0], TOPAZ_BLOCK_SIZE, &len); if (!len) break; From 46f8b522ca1854de25e2af1e1675b6d81c1fcf26 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 14 Jan 2023 23:05:46 +0100 Subject: [PATCH 081/924] t55: remove cast and warning about increase alignment requirement --- client/src/cmdlft55xx.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index dccacc3b1..ba3df4088 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -2362,7 +2362,7 @@ static int CmdT55xxRestore(const char *Cmd) { } // read dump file - uint8_t *dump = NULL; + uint32_t *dump = NULL; size_t bytes_read = 0; res = pm3_load_dump(filename, (void **)&dump, &bytes_read, (T55x7_BLOCK_COUNT * 4)); if (res != PM3_SUCCESS) { @@ -2387,11 +2387,10 @@ static int CmdT55xxRestore(const char *Cmd) { snprintf(pwdopt, sizeof(pwdopt), "-p %08X", password); } - uint32_t *data = (uint32_t *) dump; uint8_t idx; // Restore endien for writing to card for (idx = 0; idx < 12; idx++) { - data[idx] = BSWAP_32(data[idx]); + dump[idx] = BSWAP_32(dump[idx]); } // Have data ready, lets write @@ -2400,12 +2399,12 @@ static int CmdT55xxRestore(const char *Cmd) { // write blocks 1..3 page 1 // update downlink mode (if needed) and write b 0 downlink_mode = 0; - if ((((data[11] >> 28) & 0xF) == 6) || (((data[11] >> 28) & 0xF) == 9)) - downlink_mode = (data[11] >> 10) & 3; + if ((((dump[11] >> 28) & 0xF) == 6) || (((dump[11] >> 28) & 0xF) == 9)) + downlink_mode = (dump[11] >> 10) & 3; // write out blocks 1-7 page 0 for (idx = 1; idx <= 7; idx++) { - snprintf(wcmd, sizeof(wcmd), "-b %d -d %08X %s", idx, data[idx], pwdopt); + snprintf(wcmd, sizeof(wcmd), "-b %d -d %08X %s", idx, dump[idx], pwdopt); if (CmdT55xxWriteBlock(wcmd) != PM3_SUCCESS) { PrintAndLogEx(WARNING, "Warning: error writing blk %d", idx); @@ -2414,12 +2413,12 @@ static int CmdT55xxRestore(const char *Cmd) { // if password was set on the "blank" update as we may have just changed it if (usepwd) { - snprintf(pwdopt, sizeof(pwdopt), "-p %08X", data[7]); + snprintf(pwdopt, sizeof(pwdopt), "-p %08X", dump[7]); } // write out blocks 1-3 page 1 for (idx = 9; idx <= 11; idx++) { - snprintf(wcmd, sizeof(wcmd), "-b %d --pg1 -d %08X %s", idx - 8, data[idx], pwdopt); + snprintf(wcmd, sizeof(wcmd), "-b %d --pg1 -d %08X %s", idx - 8, dump[idx], pwdopt); if (CmdT55xxWriteBlock(wcmd) != PM3_SUCCESS) { PrintAndLogEx(WARNING, "Warning: error writing blk %d", idx); @@ -2430,7 +2429,7 @@ static int CmdT55xxRestore(const char *Cmd) { config.downlink_mode = downlink_mode; // Write the page 0 config - snprintf(wcmd, sizeof(wcmd), "-b 0 -d %08X %s", data[0], pwdopt); + snprintf(wcmd, sizeof(wcmd), "-b 0 -d %08X %s", dump[0], pwdopt); if (CmdT55xxWriteBlock(wcmd) != PM3_SUCCESS) { PrintAndLogEx(WARNING, "Warning: error writing blk 0"); } From 0e1ea167a46d40e45c0e161b68bef4b7b6249e6e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 14 Jan 2023 23:29:38 +0100 Subject: [PATCH 082/924] vigik: use mfc_vigik_t in API and remove warning about increased alignment --- client/src/cmdhfmf.c | 18 ++++++++---- client/src/mifare/mifarehost.c | 52 ++++++++++++++++------------------ client/src/mifare/mifarehost.h | 5 ++-- 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 98a587cf1..89cb68023 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6915,9 +6915,15 @@ static int CmdHF14AMfView(const char *Cmd) { return res; } + typedef union UDATA + { + uint8_t *bytes; + mfc_vigik_t *vigik; + } UDATA; // allocate memory - uint8_t *d = calloc(bytes_read, sizeof(uint8_t)); - if (d == NULL) { + UDATA d; + d.bytes = calloc(bytes_read, sizeof(uint8_t)); + if (d.bytes == NULL) { return PM3_EMALLOC; } uint16_t dlen = 0; @@ -6925,14 +6931,14 @@ static int CmdHF14AMfView(const char *Cmd) { // vigik struture sector 0 uint8_t *pdump = dump; - memcpy(d + dlen, pdump, MFBLOCK_SIZE * 3); + memcpy(d.bytes + dlen, pdump, MFBLOCK_SIZE * 3); dlen += MFBLOCK_SIZE * 3; pdump += (MFBLOCK_SIZE * 4); // skip sectortrailer // extract memory from MAD sectors for (int i = 0; i <= madlen; i++) { if (0x4910 == mad[i] || 0x4916 == mad[i]) { - memcpy(d + dlen, pdump, MFBLOCK_SIZE * 3); + memcpy(d.bytes + dlen, pdump, MFBLOCK_SIZE * 3); dlen += MFBLOCK_SIZE * 3; } @@ -6940,8 +6946,8 @@ static int CmdHF14AMfView(const char *Cmd) { } // convert_mfc_2_arr(pdump, bytes_read, d, &dlen); - vigik_annotate(d); - free(d); + vigik_annotate(d.vigik); + free(d.bytes); } free(dump); diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 0c8c8b274..56d10c608 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1499,7 +1499,7 @@ static void reverse_array(const uint8_t *src, int src_len, uint8_t *dest) { } }; -int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature_len) { +int vigik_verify(mfc_vigik_t *d) { // iso9796 // Exponent V = 2 @@ -1507,16 +1507,16 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature if (g_debugMode == DEBUG) { PrintAndLogEx(INFO, "Raw"); - print_hex_noascii_break(uid, uidlen, MFBLOCK_SIZE * 2); + print_hex_noascii_break((uint8_t *)d, sizeof(*d) - sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); PrintAndLogEx(INFO, "Raw signature"); - print_hex_noascii_break(signature, signature_len, MFBLOCK_SIZE * 2); + print_hex_noascii_break(d->rsa_signature, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); } uint8_t rev_sig[128]; - reverse_array(signature, signature_len, rev_sig); + reverse_array(d->rsa_signature, sizeof(d->rsa_signature), rev_sig); PrintAndLogEx(INFO, "Raw signature reverse"); - print_hex_noascii_break(rev_sig, signature_len, MFBLOCK_SIZE * 2); + print_hex_noascii_break(rev_sig, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); // t = 0xBC = Implicitly known // t = 0xCC = look at byte before to determine hash function @@ -1566,7 +1566,7 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature mbedtls_mpi_read_binary(&N, (const unsigned char *)n, PUBLIC_VIGIK_KEYLEN); //mbedtls_mpi_read_binary(&s, (const unsigned char*)signature, signature_len); - mbedtls_mpi_read_binary(&s, (const unsigned char *)rev_sig, signature_len); + mbedtls_mpi_read_binary(&s, (const unsigned char *)rev_sig, sizeof(d->rsa_signature)); // check is sign < (N/2) @@ -1725,7 +1725,7 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature if (is_valid == false || i == ARRAYLEN(vigik_rsa_pk)) { PrintAndLogEx(INFO, "Signature:"); - print_hex_noascii_break(signature, signature_len, MFBLOCK_SIZE * 2); + print_hex_noascii_break(d->rsa_signature, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); PrintAndLogEx(SUCCESS, "Signature verification: " _RED_("failed")); return PM3_ESOFT; } @@ -1738,37 +1738,35 @@ int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature PrintAndLogEx(INFO, "%.64s", vigik_rsa_pk[i].n + 192); PrintAndLogEx(INFO, "Signature:"); - print_hex_noascii_break(signature, signature_len, MFBLOCK_SIZE * 2); + print_hex_noascii_break(d->rsa_signature, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); PrintAndLogEx(SUCCESS, "Signature verification: " _GREEN_("successful")); return PM3_SUCCESS; } -int vigik_annotate(uint8_t *d) { +int vigik_annotate(mfc_vigik_t *d) { if (d == NULL) return PM3_EINVARG; - mfc_vigik_t *foo = (mfc_vigik_t *)d; - - PrintAndLogEx(INFO, "Manufacture......... %s", sprint_hex(foo->b0, sizeof(foo->b0))); - PrintAndLogEx(INFO, "MAD................. %s", sprint_hex(foo->mad, sizeof(foo->mad))); - PrintAndLogEx(INFO, "Counters............ %u", foo->counters); - PrintAndLogEx(INFO, "rtf................. %s", sprint_hex(foo->rtf, sizeof(foo->rtf))); - PrintAndLogEx(INFO, "Service code........ 0x%08x / %u - " _YELLOW_("%s"), foo->service_code, foo->service_code, vigik_get_service(foo->service_code)); - PrintAndLogEx(INFO, "Info flag........... %u -", foo->info_flag); // , sprint_bin(foo->info_flag, 1)); - PrintAndLogEx(INFO, "Key version......... %u", foo->key_version); - PrintAndLogEx(INFO, "PTR Counter......... %u", foo->ptr_counter); - PrintAndLogEx(INFO, "Counter num......... %u", foo->counter_num); - PrintAndLogEx(INFO, "Slot access date.... %s", sprint_hex(foo->slot_access_date, sizeof(foo->slot_access_date))); - PrintAndLogEx(INFO, "Slot dst duration... %u", foo->slot_dst_duration); - PrintAndLogEx(INFO, "Other Slots......... %s", sprint_hex(foo->other_slots, sizeof(foo->other_slots))); - PrintAndLogEx(INFO, "Services counter.... %u", foo->services_counter); - PrintAndLogEx(INFO, "Loading date........ %s", sprint_hex(foo->loading_date, sizeof(foo->loading_date))); - PrintAndLogEx(INFO, "Reserved null....... %u", foo->reserved_null); + PrintAndLogEx(INFO, "Manufacture......... %s", sprint_hex(d->b0, sizeof(d->b0))); + PrintAndLogEx(INFO, "MAD................. %s", sprint_hex(d->mad, sizeof(d->mad))); + PrintAndLogEx(INFO, "Counters............ %u", d->counters); + PrintAndLogEx(INFO, "rtf................. %s", sprint_hex(d->rtf, sizeof(d->rtf))); + PrintAndLogEx(INFO, "Service code........ 0x%08x / %u - " _YELLOW_("%s"), d->service_code, d->service_code, vigik_get_service(d->service_code)); + PrintAndLogEx(INFO, "Info flag........... %u -", d->info_flag); // , sprint_bin(d->info_flag, 1)); + PrintAndLogEx(INFO, "Key version......... %u", d->key_version); + PrintAndLogEx(INFO, "PTR Counter......... %u", d->ptr_counter); + PrintAndLogEx(INFO, "Counter num......... %u", d->counter_num); + PrintAndLogEx(INFO, "Slot access date.... %s", sprint_hex(d->slot_access_date, sizeof(d->slot_access_date))); + PrintAndLogEx(INFO, "Slot dst duration... %u", d->slot_dst_duration); + PrintAndLogEx(INFO, "Other Slots......... %s", sprint_hex(d->other_slots, sizeof(d->other_slots))); + PrintAndLogEx(INFO, "Services counter.... %u", d->services_counter); + PrintAndLogEx(INFO, "Loading date........ %s", sprint_hex(d->loading_date, sizeof(d->loading_date))); + PrintAndLogEx(INFO, "Reserved null....... %u", d->reserved_null); PrintAndLogEx(INFO, "----------------------------------------------------------------"); PrintAndLogEx(INFO, ""); - vigik_verify(d, 96, foo->rsa_signature, sizeof(foo->rsa_signature)); + vigik_verify(d); PrintAndLogEx(INFO, "----------------------------------------------------------------"); PrintAndLogEx(INFO, ""); return PM3_SUCCESS; diff --git a/client/src/mifare/mifarehost.h b/client/src/mifare/mifarehost.h index 0212dd4f0..ccefbbd40 100644 --- a/client/src/mifare/mifarehost.h +++ b/client/src/mifare/mifarehost.h @@ -23,6 +23,7 @@ #include "common.h" #include "util.h" // FILE_PATH_SIZE +#include "protocol_vigik.h" #define MIFARE_SECTOR_RETRY 10 @@ -113,6 +114,6 @@ void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *data, int len, bool i // remove all sector trailers in a MFC dump int convert_mfc_2_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen); const char *vigik_get_service(uint16_t service_code); -int vigik_verify(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature_len); -int vigik_annotate(uint8_t *d); +int vigik_verify(mfc_vigik_t *d); +int vigik_annotate(mfc_vigik_t *d); #endif From 2d58c109ba3480411cf49ba9e24672d4ccfd8a1e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 14 Jan 2023 23:39:07 +0100 Subject: [PATCH 083/924] ksx6924: use ARRAYLEN --- client/src/ksx6924/ksx6924core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/ksx6924/ksx6924core.c b/client/src/ksx6924/ksx6924core.c index 39b390039..307573f74 100644 --- a/client/src/ksx6924/ksx6924core.c +++ b/client/src/ksx6924/ksx6924core.c @@ -99,7 +99,7 @@ typedef struct { KEY_TYPE key, const char* defaultValue) { \ struct _ksx6924_enum_ ## KEY_TYPE *r = bsearch( \ &key, KSX6924_ENUM_ ## NAME, \ - sizeof(KSX6924_ENUM_ ## NAME) / sizeof(KSX6924_ENUM_ ## NAME [0]), \ + ARRAYLEN(KSX6924_ENUM_ ## NAME), \ sizeof(KSX6924_ENUM_ ## NAME [0]), \ _ksx6924_ ## KEY_TYPE ## _enum_compare); \ if (r == NULL) { \ From 8ac8e3d7d0016eac9af4b0519213d457fd5e3d59 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 01:43:38 +0100 Subject: [PATCH 084/924] reduce variable scopes --- armsrc/frozen.c | 10 ++++--- armsrc/hitagS.c | 3 +-- armsrc/iclass.c | 3 +-- armsrc/mifareutil.c | 3 +-- client/src/cmdhf15.c | 4 +-- client/src/cmdhfmf.c | 9 +++---- client/src/cmdhfwaveshare.c | 22 ++++++++-------- client/src/cmdhfxerox.c | 8 +++--- client/src/cmdlfem410x.c | 5 ---- client/src/cmdlfem4x05.c | 13 +++++---- client/src/cmdlft55xx.c | 3 +-- client/src/cmdpiv.c | 3 +-- client/src/cmdtrace.c | 4 +-- client/src/emv/emvcore.c | 11 ++++---- client/src/mifare/desfirecore.c | 2 +- client/src/ui.c | 3 +-- common/cryptorf/cryptolib.c | 3 +-- tools/cryptorf/sma.cpp | 11 ++++---- tools/cryptorf/sma_multi.cpp | 42 ++++++++++++------------------ tools/mf_nonce_brute/iso14443crc.c | 3 +-- tools/mfd_aes_brute/randoms.c | 3 +-- 21 files changed, 71 insertions(+), 97 deletions(-) diff --git a/armsrc/frozen.c b/armsrc/frozen.c index 455d9a3f2..963b0a52b 100644 --- a/armsrc/frozen.c +++ b/armsrc/frozen.c @@ -235,9 +235,10 @@ static int json_get_utf8_char_len(unsigned char ch) { /* string = '"' { quoted_printable_chars } '"' */ static int json_parse_string(struct frozen *f) { - int n, ch = 0, len = 0; + int ch = 0; TRY(json_test_and_skip(f, '"')); { + int len = 0; SET_STATE(f, f->cur, "", 0); for (; f->cur < f->end; f->cur += len) { ch = *(unsigned char *) f->cur; @@ -245,6 +246,7 @@ static int json_parse_string(struct frozen *f) { EXPECT(ch >= 32 && len > 0, JSON_STRING_INVALID); /* No control chars */ EXPECT(len <= json_left(f), JSON_STRING_INCOMPLETE); if (ch == '\\') { + int n; EXPECT((n = json_get_escape_len(f->cur + 1, json_left(f))) > 0, n); len += n; } else if (ch == '"') { @@ -295,17 +297,17 @@ static int json_parse_number(struct frozen *f) { #if JSON_ENABLE_ARRAY /* array = '[' [ value { ',' value } ] ']' */ static int json_parse_array(struct frozen *f) { - int i = 0, current_path_len; - char buf[20]; CALL_BACK(f, JSON_TYPE_ARRAY_START, NULL, 0); TRY(json_test_and_skip(f, '[')); { { + int i = 0; SET_STATE(f, f->cur - 1, "", 0); while (json_cur(f) != ']') { + char buf[20]; snprintf(buf, sizeof(buf), "[%d]", i); i++; - current_path_len = json_append_to_path(f, buf, strlen(buf)); + int current_path_len = json_append_to_path(f, buf, strlen(buf)); f->cur_name = f->path + strlen(f->path) - strlen(buf) + 1 /*opening brace*/; f->cur_name_len = strlen(buf) - 2 /*braces*/; diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index a4a3630c7..db219bcf2 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -1268,7 +1268,6 @@ void ReadHitagS(hitag_function htf, hitag_data *htd, bool ledcontrol) { uint8_t rx[HITAG_FRAME_LEN]; size_t rxlen = 0; uint8_t tx[HITAG_FRAME_LEN]; - size_t txlen; int t_wait = HITAG_T_WAIT_MAX; @@ -1284,7 +1283,7 @@ void ReadHitagS(hitag_function htf, hitag_data *htd, bool ledcontrol) { WDT_HIT(); //send read request - txlen = 0; + size_t txlen = 0; uint8_t cmd = 0x0c; txlen = concatbits(tx, txlen, &cmd, 8 - 4, 4); uint8_t addr = pageNum; diff --git a/armsrc/iclass.c b/armsrc/iclass.c index a25fbd52c..5a68a8207 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -1258,7 +1258,6 @@ static bool iclass_send_cmd_with_retries(uint8_t *cmd, size_t cmdsize, uint8_t * uint16_t timeout, uint32_t *eof_time, bool shallow_mod) { uint16_t resp_len = 0; - int res; while (tries-- > 0) { iclass_send_as_reader(cmd, cmdsize, start_time, eof_time, shallow_mod); @@ -1267,7 +1266,7 @@ static bool iclass_send_cmd_with_retries(uint8_t *cmd, size_t cmdsize, uint8_t * return true; } - res = GetIso15693AnswerFromTag(resp, max_resp_size, timeout, eof_time, false, true, &resp_len); + int res = GetIso15693AnswerFromTag(resp, max_resp_size, timeout, eof_time, false, true, &resp_len); if (res == PM3_SUCCESS && expected_size == resp_len) { return true; } diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index fd9d86ccc..5c0905e68 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -461,7 +461,6 @@ int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo uint16_t len = 0; uint32_t pos = 0; uint8_t par[3] = {0x00, 0x00, 0x00}; // enough for 18 Bytes to send - uint8_t res = 0; uint8_t d_block[18], d_block_enc[18]; uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; @@ -495,7 +494,7 @@ int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo len = ReaderReceive(receivedAnswer, receivedAnswerPar); if (len != 0) { // Something not right, len == 0 (no response is ok as its waiting for transfer - res = 0; + uint8_t res = 0; res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 0)) << 0; res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 1)) << 1; res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 2)) << 2; diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 84629d56e..c35df7238 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -1384,11 +1384,11 @@ static int CmdHF15WriteAfi(const char *Cmd) { // arg0 (datalen, cmd len? .arg0 == crc?) // arg1 (speed == 0 == 1 of 256, == 1 == 1 of 4 ) // arg2 (recv == 1 == expect a response) - uint8_t read_respone = 1; + uint8_t read_response = 1; PacketResponseNG resp; clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, read_respone, req, reqlen); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, read_response, req, reqlen); if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { PrintAndLogEx(ERR, "iso15693 timeout"); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 89cb68023..b00dd5651 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3688,8 +3688,6 @@ static int CmdHF14AMfSim(const char *Cmd) { } CLIParserFree(ctx); - nonces_t data[1]; - sector_t *k_sector = NULL; //Validations @@ -3780,7 +3778,7 @@ static int CmdHF14AMfSim(const char *Cmd) { if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) continue; if (!(flags & FLAG_NR_AR_ATTACK)) break; if ((resp.oldarg[0] & 0xffff) != CMD_HF_MIFARE_SIMULATE) break; - + nonces_t data[1]; memcpy(data, resp.data.asBytes, sizeof(data)); readerAttack(k_sector, k_sectorsCount, data[0], setEmulatorMem, verbose); } @@ -7619,7 +7617,6 @@ static int CmdHF14AMfValue(const char *Cmd) { int64_t decval = (int64_t)arg_get_u64_def(ctx, 5, -1); // Inc by -1 is invalid, so not set. int64_t setval = (int64_t)arg_get_u64_def(ctx, 6, 0x7FFFFFFFFFFFFFFF); // out of bounds (for int32) so not set bool getval = arg_get_lit(ctx, 7); - uint8_t block[MFBLOCK_SIZE] = {0x00}; int dlen = 0; uint8_t data[16] = {0}; CLIGetHexWithReturn(ctx, 9, data, &dlen); @@ -7627,7 +7624,6 @@ static int CmdHF14AMfValue(const char *Cmd) { uint8_t action = 3; // 0 Increment, 1 - Decrement, 2 - Set, 3 - Get, 4 - Decode from data uint32_t value = 0; - uint8_t isok = true; // Need to check we only have 1 of inc/dec/set and get the value from the selected option int optionsprovided = 0; @@ -7683,11 +7679,12 @@ static int CmdHF14AMfValue(const char *Cmd) { } if (action < 3) { - + uint8_t isok = true; if (g_session.pm3_present == false) return PM3_ENOTTY; if (action <= 1) { // increment/decrement value + uint8_t block[MFBLOCK_SIZE] = {0x00}; memcpy(block, (uint8_t *)&value, 4); uint8_t cmddata[26]; memcpy(cmddata, key, sizeof(key)); // Key == 6 data went to 10, so lets offset 9 for inc/dec diff --git a/client/src/cmdhfwaveshare.c b/client/src/cmdhfwaveshare.c index ae2f74582..78c6ef825 100644 --- a/client/src/cmdhfwaveshare.c +++ b/client/src/cmdhfwaveshare.c @@ -660,7 +660,6 @@ static int start_drawing_1in54B(uint8_t model_nr, uint8_t *black, uint8_t *red) } static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { - uint8_t progress; uint8_t step0[2] = {0xcd, 0x0d}; uint8_t step1[3] = {0xcd, 0x00, 10}; // select e-paper type and reset e-paper // 4 :2.13inch e-Paper @@ -687,7 +686,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { // uint8_t step13[2]={0xcd,0x0b}; // Judge whether the power supply is turned off successfully // uint8_t step14[2]={0xcd,0x0c}; // The end of the transmission uint8_t rx[20]; - uint16_t actrxlen[20], i; + uint16_t actrxlen[20]; clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0, NULL, 0); @@ -812,6 +811,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { } // 1.54B Data transfer is complete and wait for refresh } else { + uint8_t progress; PrintAndLogEx(DEBUG, "Step5: e-paper config2"); ret = transceive_blocking(step5, 2, rx, 20, actrxlen, true); // cd 05 if (ret != PM3_SUCCESS) { @@ -831,7 +831,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { } PrintAndLogEx(DEBUG, "Step8: Start data transfer"); if (model_nr == M2in13) { // 2.13inch - for (i = 0; i < 250; i++) { + for (uint16_t i = 0; i < 250; i++) { read_black(i, step8, model_nr, black); ret = transceive_blocking(step8, 19, rx, 20, actrxlen, true); // cd 08 if (ret != PM3_SUCCESS) { @@ -841,7 +841,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { PrintAndLogEx(INPLACE, "Progress: %d %%", progress); } } else if (model_nr == M2in9) { - for (i = 0; i < 296; i++) { + for (uint16_t i = 0; i < 296; i++) { read_black(i, step8, model_nr, black); ret = transceive_blocking(step8, 19, rx, 20, actrxlen, true); // cd 08 if (ret != PM3_SUCCESS) { @@ -851,7 +851,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { PrintAndLogEx(INPLACE, "Progress: %d %%", progress); } } else if (model_nr == M4in2) { //4.2inch - for (i = 0; i < 150; i++) { + for (uint16_t i = 0; i < 150; i++) { read_black(i, step8, model_nr, black); ret = transceive_blocking(step8, 103, rx, 20, actrxlen, true); // cd 08 if (ret != PM3_SUCCESS) { @@ -861,7 +861,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { PrintAndLogEx(INPLACE, "Progress: %d %%", progress); } } else if (model_nr == M7in5) { //7.5inch - for (i = 0; i < 400; i++) { + for (uint16_t i = 0; i < 400; i++) { read_black(i, step8, model_nr, black); ret = transceive_blocking(step8, 123, rx, 20, actrxlen, true); // cd 08 if (ret != PM3_SUCCESS) { @@ -872,7 +872,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { msleep(6); } } else if (model_nr == M2in13B) { //2.13inch B - for (i = 0; i < 26; i++) { + for (uint16_t i = 0; i < 26; i++) { read_black(i, step8, model_nr, black); ret = transceive_blocking(step8, 109, rx, 20, actrxlen, false); // cd 08 if (ret != PM3_SUCCESS) { @@ -883,7 +883,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { } } else if (model_nr == M7in5HD) { //7.5HD - for (i = 0; i < 484; i++) { + for (uint16_t i = 0; i < 484; i++) { read_black(i, step8, model_nr, black); //memset(&step8[3], 0xf0, 120); ret = transceive_blocking(step8, 123, rx, 20, actrxlen, true); // cd 08 @@ -899,7 +899,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { return ret; } } else if (model_nr == M2in7) { //2.7inch - for (i = 0; i < 48; i++) { + for (uint16_t i = 0; i < 48; i++) { //read_black(i,step8, model_nr, black); memset(&step8[3], 0xFF, sizeof(step8) - 3); ret = transceive_blocking(step8, 124, rx, 20, actrxlen, true); // cd 08 @@ -925,7 +925,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { } PrintAndLogEx(DEBUG, "Step9b"); if (model_nr == M2in7) { - for (i = 0; i < 48; i++) { + for (uint16_t i = 0; i < 48; i++) { read_black(i, step13, model_nr, black); ret = transceive_blocking(step13, 124, rx, 20, actrxlen, true); //CD 19 if (ret != PM3_SUCCESS) { @@ -935,7 +935,7 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { PrintAndLogEx(INPLACE, "Progress: %d %%", progress); } } else if (model_nr == M2in13B) { - for (i = 0; i < 26; i++) { + for (uint16_t i = 0; i < 26; i++) { read_red(i, step13, model_nr, red); //memset(&step13[3], 0xfE, 106); ret = transceive_blocking(step13, 109, rx, 20, actrxlen, false); diff --git a/client/src/cmdhfxerox.c b/client/src/cmdhfxerox.c index 9ba1577da..fec69855e 100644 --- a/client/src/cmdhfxerox.c +++ b/client/src/cmdhfxerox.c @@ -202,7 +202,7 @@ void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits) { void RC2_encrypt(unsigned long *d, RC2_KEY *key) { int i, n; register RC2_INT *p0, *p1; - register RC2_INT x0, x1, x2, x3, t; + register RC2_INT x0, x1, x2, x3; unsigned long l; l = d[0]; @@ -217,7 +217,7 @@ void RC2_encrypt(unsigned long *d, RC2_KEY *key) { p0 = p1 = &(key->data[0]); for (;;) { - t = (x0 + (x1 & ~x3) + (x2 & x3) + * (p0++)) & 0xffff; + register RC2_INT t = (x0 + (x1 & ~x3) + (x2 & x3) + * (p0++)) & 0xffff; x0 = (t << 1) | (t >> 15); t = (x1 + (x2 & ~x0) + (x3 & x0) + * (p0++)) & 0xffff; x1 = (t << 2) | (t >> 14); @@ -244,7 +244,7 @@ void RC2_encrypt(unsigned long *d, RC2_KEY *key) { void RC2_decrypt(unsigned long *d, RC2_KEY *key) { int i, n; register RC2_INT *p0, *p1; - register RC2_INT x0, x1, x2, x3, t; + register RC2_INT x0, x1, x2, x3; unsigned long l; l = d[0]; @@ -260,7 +260,7 @@ void RC2_decrypt(unsigned long *d, RC2_KEY *key) { p0 = &(key->data[63]); p1 = &(key->data[0]); for (;;) { - t = ((x3 << 11) | (x3 >> 5)) & 0xffff; + register RC2_INT t = ((x3 << 11) | (x3 >> 5)) & 0xffff; x3 = (t - (x0 & ~x2) - (x1 & x2) - * (p0--)) & 0xffff; t = ((x2 << 13) | (x2 >> 3)) & 0xffff; x2 = (t - (x3 & ~x1) - (x0 & x1) - * (p0--)) & 0xffff; diff --git a/client/src/cmdlfem410x.c b/client/src/cmdlfem410x.c index ef9caf959..ea502fc07 100644 --- a/client/src/cmdlfem410x.c +++ b/client/src/cmdlfem410x.c @@ -672,11 +672,6 @@ static int CmdEM410xClone(const char *Cmd) { return PM3_EINVARG; } - char cardtype[16] = {"T55x7"}; - if (q5) { - snprintf(cardtype, sizeof(cardtype), "Q5/T5555"); - } - PrintAndLogEx(SUCCESS, "Preparing to clone EM4102 to " _YELLOW_("%s") " tag with EM Tag ID " _GREEN_("%010" PRIX64) " (RF/%d)", q5 ? "Q5/T5555" : (em ? "EM4305/4469" : "T55x7"), id, clk); struct { diff --git a/client/src/cmdlfem4x05.c b/client/src/cmdlfem4x05.c index 8e6110c62..cff7203d2 100644 --- a/client/src/cmdlfem4x05.c +++ b/client/src/cmdlfem4x05.c @@ -2025,10 +2025,8 @@ int CmdEM4x05Sniff(const char *Cmd) { size_t idx = 0; // loop though sample buffer while (idx < g_GraphTraceLen) { - bool eop = false; bool haveData = false; bool pwd = false; - uint32_t tmpValue; idx = em4x05_Sniff_GetNextBitStart(idx, g_GraphTraceLen, g_GraphBuffer, &pulseSamples); size_t pktOffset = idx; @@ -2044,6 +2042,7 @@ int CmdEM4x05Sniff(const char *Cmd) { memset(bits.ptr, 0, bits.size); bits.idx = 0; + bool eop = false; while ((idx < g_GraphTraceLen) && !eop) { CycleWidth = idx; idx = em4x05_Sniff_GetNextBitStart(idx, g_GraphTraceLen, g_GraphBuffer, &pulseSamples); @@ -2081,7 +2080,7 @@ int CmdEM4x05Sniff(const char *Cmd) { pwd = true; cmdText = "Logon"; strncpy(blkAddr, " ", sizeof(blkAddr)); - tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[4], fwd); + uint32_t tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[4], fwd); snprintf(dataText, sizeof(dataText), "%08X", tmpValue); } @@ -2089,7 +2088,7 @@ int CmdEM4x05Sniff(const char *Cmd) { if ((strncmp(bits.ptr, "0101", 4) == 0) && (bits.idx == 56)) { haveData = true; cmdText = "Write"; - tmpValue = (bits.ptr[4] - '0') + ((bits.ptr[5] - '0') << 1) + ((bits.ptr[6] - '0') << 2) + ((bits.ptr[7] - '0') << 3); + uint32_t tmpValue = (bits.ptr[4] - '0') + ((bits.ptr[5] - '0') << 1) + ((bits.ptr[6] - '0') << 2) + ((bits.ptr[7] - '0') << 3); snprintf(blkAddr, sizeof(blkAddr), "%u", tmpValue); if (tmpValue == 2) { pwd = true; @@ -2103,7 +2102,7 @@ int CmdEM4x05Sniff(const char *Cmd) { haveData = true; pwd = false; cmdText = "Read"; - tmpValue = (bits.ptr[4] - '0') + ((bits.ptr[5] - '0') << 1) + ((bits.ptr[6] - '0') << 2) + ((bits.ptr[7] - '0') << 3); + uint32_t tmpValue = (bits.ptr[4] - '0') + ((bits.ptr[5] - '0') << 1) + ((bits.ptr[6] - '0') << 2) + ((bits.ptr[7] - '0') << 3); snprintf(blkAddr, sizeof(blkAddr), "%u", tmpValue); strncpy(dataText, " ", sizeof(dataText)); } @@ -2114,7 +2113,7 @@ int CmdEM4x05Sniff(const char *Cmd) { pwd = false; cmdText = "Protect"; strncpy(blkAddr, " ", sizeof(blkAddr)); - tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[11], fwd); + uint32_t tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[11], fwd); snprintf(dataText, sizeof(dataText), "%08X", tmpValue); } @@ -2124,7 +2123,7 @@ int CmdEM4x05Sniff(const char *Cmd) { pwd = false; cmdText = "Disable"; strncpy(blkAddr, " ", sizeof(blkAddr)); - tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[11], fwd); + uint32_t tmpValue = em4x05_Sniff_GetBlock(&bits.ptr[11], fwd); snprintf(dataText, sizeof(dataText), "%08X", tmpValue); } diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index ba3df4088..f1cb773fb 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -4011,7 +4011,6 @@ static int CmdT55xxSniff(const char *Cmd) { size_t idx = 0; uint32_t usedPassword, blockData; int pulseSamples = 0, pulseIdx = 0; - const char *modeText; char pwdText[100]; char dataText[100]; int pulseBuffer[80] = { 0 }; // max should be 73 +/- - Holds Pulse widths @@ -4037,7 +4036,7 @@ static int CmdT55xxSniff(const char *Cmd) { int maxWidth = 0; data[0] = 0; bool have_data = false; - modeText = "Default"; + const char *modeText = "Default"; strncpy(pwdText, " ", sizeof(pwdText)); strncpy(dataText, " ", sizeof(dataText)); diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index 12b217ebc..dc6584f40 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -940,9 +940,8 @@ static int CmdPIVScan(const char *Cmd) { memcpy(applet_id, PIV_APPLET, sizeof(PIV_APPLET)); aid_len = sizeof(PIV_APPLET); } - int res = 0; if (activateField == true) { - res = PivSelect(channel, activateField, true, decodeTLV, true, applet_id, aid_len); + int res = PivSelect(channel, activateField, true, decodeTLV, true, applet_id, aid_len); if (res != PM3_SUCCESS) { if (leaveSignalON == false) { DropFieldEx(channel); diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index af97e8466..d3096307a 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -485,8 +485,6 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr uint32_t end_of_transmission_timestamp = 0; uint8_t topaz_reader_command[9]; char explanation[40] = {0}; - uint8_t mfData[32] = {0}; - size_t mfDataLen = 0; tracelog_hdr_t *first_hdr = (tracelog_hdr_t *)(trace); tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + tracepos); @@ -871,6 +869,8 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } if (protocol == PROTO_MIFARE) { + uint8_t mfData[32] = {0}; + size_t mfDataLen = 0; if (DecodeMifareData(frame, data_len, parityBytes, hdr->isResponse, mfData, &mfDataLen, mfDicKeys, mfDicKeysCount)) { memset(explanation, 0x00, sizeof(explanation)); annotateIso14443a(explanation, sizeof(explanation), mfData, mfDataLen, hdr->isResponse); diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 34aa4d4be..fbc59b1c0 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -381,8 +381,6 @@ static int EMVCheckAID(Iso7816CommandChannel channel, bool decodeTLV, struct tlv int EMVSearchPSE(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t PSENum, bool decodeTLV, struct tlvdb *tlv) { uint8_t data[APDU_RES_LEN] = {0}; size_t datalen = 0; - uint8_t sfidata[0x11][APDU_RES_LEN]; - size_t sfidatalen[0x11] = {0}; uint16_t sw = 0; int res; const char *PSE_or_PPSE = PSENum == 1 ? "PSE" : "PPSE"; @@ -402,6 +400,8 @@ int EMVSearchPSE(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFi // PSE/PPSE with SFI struct tlvdb *tsfi = tlvdb_find_path(t, (tlv_tag_t[]) {0x6f, 0xa5, 0x88, 0x00}); if (tsfi) { + uint8_t sfidata[0x11][APDU_RES_LEN]; + size_t sfidatalen[0x11] = {0}; uint8_t sfin = 0; tlv_get_uint8(tlvdb_get_tlv(tsfi), &sfin); PrintAndLogEx(INFO, "* PPSE get SFI: 0x%02x.", sfin); @@ -669,10 +669,6 @@ static const unsigned char default_ddol_value[] = {0x9f, 0x37, 0x04}; static struct tlv default_ddol_tlv = {.tag = 0x9f49, .len = 3, .value = default_ddol_value }; int trDDA(Iso7816CommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { - uint8_t buf[APDU_RES_LEN] = {0}; - size_t len = 0; - uint16_t sw = 0; - struct emv_pk *pk = get_ca_pk(tlv); if (!pk) { PrintAndLogEx(ERR, "Error: Key not found, exiting"); @@ -767,6 +763,9 @@ int trDDA(Iso7816CommandChannel channel, bool decodeTLV, struct tlvdb *tlv) { tlvdb_free(atc_db); } else { + uint8_t buf[APDU_RES_LEN] = {0}; + size_t len = 0; + uint16_t sw = 0; struct tlvdb *dac_db = emv_pki_recover_dac(issuer_pk, tlv, sda_tlv); if (dac_db) { const struct tlv *dac_tlv = tlvdb_get(dac_db, 0x9f45, NULL); diff --git a/client/src/mifare/desfirecore.c b/client/src/mifare/desfirecore.c index 3e002a7ef..9c3326f83 100644 --- a/client/src/mifare/desfirecore.c +++ b/client/src/mifare/desfirecore.c @@ -2301,9 +2301,9 @@ static const char *GetDesfireKeyType(uint8_t keytype) { } const char *GetDesfireAccessRightStr(uint8_t right) { - static char int_access_str[200]; if (right <= 0x0d) { + static char int_access_str[200]; snprintf(int_access_str, sizeof(int_access_str), "key 0x%02x", right); return int_access_str; } diff --git a/client/src/ui.c b/client/src/ui.c index d9f4514cf..2281497c1 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -531,12 +531,11 @@ void memcpy_filter_emoji(void *dest, const void *src, size_t n, emojiMode_t mode uint8_t emojified_token_length = 0; char *current_token = NULL; uint8_t current_token_length = 0; - char current_char; char *rdest = (char *)dest; char *rsrc = (char *)src; uint16_t si = 0; for (size_t i = 0; i < n; i++) { - current_char = rsrc[i]; + char current_char = rsrc[i]; if (current_token_length == 0) { // starting a new token. diff --git a/common/cryptorf/cryptolib.c b/common/cryptorf/cryptolib.c index eded5315c..b4abbdd54 100644 --- a/common/cryptorf/cryptolib.c +++ b/common/cryptorf/cryptolib.c @@ -280,7 +280,6 @@ void cm_auth(const uint8_t *Gc, const uint8_t *Ci, const uint8_t *Q, uint8_t *Ch static void cm_crypt(const CryptoAction ca, const uint8_t offset, const uint8_t len, const uint8_t *in, uint8_t *out, crypto_state s) { size_t pos; - uint8_t bt; next_n(true, 5, 0, s); next(true, offset, s); @@ -288,7 +287,7 @@ static void cm_crypt(const CryptoAction ca, const uint8_t offset, const uint8_t next(true, len, s); for (pos = 0; pos < len; pos++) { // Perform the crypto operation - bt = in[pos] ^ cm_byte(s); + uint8_t bt = in[pos] ^ cm_byte(s); // Generate output if (out) out[pos] = bt; diff --git a/tools/cryptorf/sma.cpp b/tools/cryptorf/sma.cpp index eb9cf3c9d..d15b0e6a2 100644 --- a/tools/cryptorf/sma.cpp +++ b/tools/cryptorf/sma.cpp @@ -331,11 +331,10 @@ static inline uint8_t next_right_fast(uint8_t in, uint64_t *right) { static inline void sm_left_mask(const uint8_t *ks, uint8_t *mask, uint64_t rstate) { size_t pos; - uint8_t bt; for (pos = 0; pos < 16; pos++) { next_right_fast(0, &rstate); - bt = next_right_fast(0, &rstate) << 4; + uint8_t bt = next_right_fast(0, &rstate) << 4; next_right_fast(0, &rstate); bt |= next_right_fast(0, &rstate); @@ -349,7 +348,7 @@ static inline void sm_left_mask(const uint8_t *ks, uint8_t *mask, uint64_t rstat static inline uint32_t sm_right(const uint8_t *ks, uint8_t *mask, vector *pcrstates) { uint8_t tmp_mask[16]; - size_t pos, bits, bit, topbits; + size_t pos, bit, topbits; uint64_t rstate, counter; map bincstates; map::iterator it; @@ -358,7 +357,7 @@ static inline uint32_t sm_right(const uint8_t *ks, uint8_t *mask, vector *pcstates) { map bincstates; map::iterator it; - uint64_t counter, lstate; + uint64_t counter; size_t pos, bits, bit; uint8_t correct_bits[16]; uint8_t bt; @@ -526,7 +525,7 @@ static inline void sm_left(const uint8_t *ks, const uint8_t *mask, vector state.invalid = false; for (counter = 0; counter < 0x800000000ull; counter++) { - lstate = counter; + uint64_t lstate = counter; for (pos = 0; pos < 16; pos++) { lstate = (((lstate) >> 5) | ((uint64_t)left_addition[((lstate) & 0xf801f)] << 30)); diff --git a/tools/cryptorf/sma_multi.cpp b/tools/cryptorf/sma_multi.cpp index 577811f64..f7047d977 100644 --- a/tools/cryptorf/sma_multi.cpp +++ b/tools/cryptorf/sma_multi.cpp @@ -199,18 +199,15 @@ static lookup_entry lookup_right[0x8000]; static uint8_t left_addition[0x100000]; static inline void init_lookup_left() { - uint8_t b3, b6, temp; - int i, index; - - for (i = 0; i < 0x400; i++) { - b6 = i & 0x1f; - b3 = (i >> 5) & 0x1f; - index = (b3 << 15) | b6; + for (int i = 0; i < 0x400; i++) { + uint8_t b6 = i & 0x1f; + uint8_t b3 = (i >> 5) & 0x1f; + int index = (b3 << 15) | b6; // b6 = bit_rotate_l(b6, 5); b6 = BIT_ROL(b6); - temp = mod(b3 + b6, 0x1f); + uint8_t temp = mod(b3 + b6, 0x1f); left_addition[index] = temp; lookup_left[index].addition = temp; lookup_left[index].out = ((temp ^ b3) & 0x0f); @@ -218,15 +215,12 @@ static inline void init_lookup_left() { } static inline void init_lookup_right() { - uint8_t b16, b18, temp; - int i, index; + for (int i = 0; i < 0x400; i++) { + uint8_t b18 = i & 0x1f; + uint8_t b16 = (i >> 5) & 0x1f; + int index = (b16 << 10) | b18; - for (i = 0; i < 0x400; i++) { - b18 = i & 0x1f; - b16 = (i >> 5) & 0x1f; - index = (b16 << 10) | b18; - - temp = mod(b18 + b16, 0x1f); + uint8_t temp = mod(b18 + b16, 0x1f); lookup_right[index].addition = temp; lookup_right[index].out = ((temp ^ b16) & 0x0f); } @@ -589,23 +583,21 @@ static void ice_sm_left(const uint8_t *ks, uint8_t *mask, vector *pcstates static inline uint32_t sm_right(const uint8_t *ks, uint8_t *mask, vector *pcrstates) { uint8_t tmp_mask[16]; - size_t pos, bits, bit, topbits; + size_t topbits = 0; map bincstates; map::iterator it; - uint8_t bt; - topbits = 0; for (uint64_t counter = 0; counter < 0x2000000; counter++) { // Reset the current bitcount of correct bits - bits = 0; + size_t bits = 0; // Copy the state we are going to test uint64_t rstate = counter; - for (pos = 0; pos < 16; pos++) { + for (size_t pos = 0; pos < 16; pos++) { next_right_fast(0, &rstate); - bt = next_right_fast(0, &rstate) << 4; + uint8_t bt = next_right_fast(0, &rstate) << 4; next_right_fast(0, &rstate); bt |= next_right_fast(0, &rstate); @@ -615,7 +607,7 @@ static inline uint32_t sm_right(const uint8_t *ks, uint8_t *mask, vector>= 1; @@ -744,7 +736,7 @@ static inline void search_gc_candidates_right(const uint64_t rstate_before_gc, c static inline void sm_left(const uint8_t *ks, const uint8_t *mask, vector *pcstates) { map bincstates; map::iterator it; - uint64_t counter, lstate; + uint64_t counter; size_t pos, bits; uint8_t correct_bits[16]; uint8_t bt; @@ -756,7 +748,7 @@ static inline void sm_left(const uint8_t *ks, const uint8_t *mask, vector state.invalid = false; for (counter = 0; counter < 0x800000000ull; counter++) { - lstate = counter; + uint64_t lstate = counter; for (pos = 0; pos < 16; pos++) { diff --git a/tools/mf_nonce_brute/iso14443crc.c b/tools/mf_nonce_brute/iso14443crc.c index 60631f4fb..c5acbb9be 100644 --- a/tools/mf_nonce_brute/iso14443crc.c +++ b/tools/mf_nonce_brute/iso14443crc.c @@ -20,11 +20,10 @@ void ComputeCrc14443(int CrcType, const unsigned char *Data, int Length, unsigned char *TransmitFirst, unsigned char *TransmitSecond) { - unsigned char chBlock; unsigned short wCrc = CrcType; do { - chBlock = *Data++; + unsigned char chBlock = *Data++; UpdateCrc14443(chBlock, &wCrc); } while (--Length); diff --git a/tools/mfd_aes_brute/randoms.c b/tools/mfd_aes_brute/randoms.c index c957350ec..523366d9d 100644 --- a/tools/mfd_aes_brute/randoms.c +++ b/tools/mfd_aes_brute/randoms.c @@ -68,13 +68,12 @@ void make_key_turbopascal_n(uint32_t seed, uint8_t key[], const size_t keylen) { void make_key_posix_rand_r_n(uint32_t seed, uint8_t key[], const size_t keylen) { uint32_t lseed = seed; - int result; for (int i = 0; i < keylen; i++) { lseed *= 1103515245; lseed += 12345; - result = (uint16_t)(lseed / 0x10000) % 2048; + int result = (uint16_t)(lseed / 0x10000) % 2048; lseed *= 1103515245; lseed += 12345; From 3936afcca99f716cc63928fbebd0271a51ed3046 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 01:48:45 +0100 Subject: [PATCH 085/924] cppcheck divide by zero --- tools/cryptorf/sma_multi.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/cryptorf/sma_multi.cpp b/tools/cryptorf/sma_multi.cpp index f7047d977..c4e61e37e 100644 --- a/tools/cryptorf/sma_multi.cpp +++ b/tools/cryptorf/sma_multi.cpp @@ -165,6 +165,9 @@ void print_cs(const char *text, pcs s) { } static inline uint8_t mod(uint8_t a, uint8_t m) { + if (m==0) { + return 0; // Actually, divide by zero error + } // Just return the input when this is less or equal than the modular value if (a < m) return a; From 857f0c0d9bce056acbca828155f93a3faa712dec Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 01:50:44 +0100 Subject: [PATCH 086/924] cppcheck fix returnNonBoolInBooleanFunction --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index b00dd5651..dfac4dbee 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -369,7 +369,7 @@ static bool mf_write_block(const uint8_t *key, uint8_t keytype, uint8_t blockno, PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { PrintAndLogEx(FAILED, "Command execute timeout"); - return PM3_ETIMEOUT; + return false; } return (resp.oldarg[0] & 0xff); From b8458322e15deb33f143ec170427a380434bbf75 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 01:52:30 +0100 Subject: [PATCH 087/924] cppcheck fix null pointer dereference --- client/src/cmdhw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index f10fa8330..0efa5eafe 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -592,12 +592,12 @@ static int CmdLCD(const char *Cmd) { arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); - CLIParserFree(ctx); int r_len = 0; uint8_t raw[1] = {0}; CLIGetHexWithReturn(ctx, 1, raw, &r_len); int j = arg_get_int_def(ctx, 2, 1); + CLIParserFree(ctx); if (j < 1) { PrintAndLogEx(WARNING, "Count must be larger than zero"); return PM3_EINVARG; From 127aebd8b0e540d0b136b6e858c9abdca52356a1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 01:54:10 +0100 Subject: [PATCH 088/924] cppcheck fix uninitialized variable --- client/src/cmdlfparadox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index bbd6cd205..a2fa50f11 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -263,7 +263,7 @@ static int CmdParadoxClone(const char *Cmd) { return PM3_EINVARG; } - uint32_t blocks[4]; + uint32_t blocks[4] = {0}; if (raw_len != 0) { if (raw_len != 12) { From c2eb6395e242986c10155e1917614e6c1dfce112 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 01:55:29 +0100 Subject: [PATCH 089/924] cppcheck clarify boolean result used in bitwise operation --- client/src/cmdhftexkom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 88add72d6..2b54480ca 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -311,7 +311,7 @@ static bool TexcomTK15Decode(uint32_t *implengths, uint32_t implengthslen, char bool prevbit = (implengths[implengthslen - 3] > implengths[implengthslen - 2]); bool thesamebit = (abs(lastimplen - (int)implengths[implengthslen - 3]) < abs(lastimplen - (int)implengths[implengthslen - 2])); - if (prevbit ^ !thesamebit) { + if (prevbit ^ (!thesamebit)) { strcat(bitstring, "10"); strcat(cbitstring, "1"); } else { From 17d7fb8abb600ae6e7a7675efe7892726f11fe38 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 01:58:57 +0100 Subject: [PATCH 090/924] cppcheck test unsigned less than zero --- armsrc/felica.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/felica.c b/armsrc/felica.c index 3cf75a0b4..0a74a30cc 100644 --- a/armsrc/felica.c +++ b/armsrc/felica.c @@ -298,7 +298,7 @@ static uint8_t felica_select_card(felica_card_select_t *card) { // 8-byte IDm, number of blocks, blocks numbers // number of blocks limited to 4 for FelicaLite(S) static void BuildFliteRdblk(const uint8_t *idm, uint8_t blocknum, const uint16_t *blocks) { - if (blocknum > 4 || blocknum <= 0) + if (blocknum > 4 || blocknum == 0) Dbprintf("Invalid number of blocks, %d != 4", blocknum); uint8_t c = 0, i = 0; From eb23028514e301d878358bf11ce31210517888fc Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:02:25 +0100 Subject: [PATCH 091/924] cppcheck: add test to avoid dereferncing null pointer --- client/src/iso7816/apduinfo.c | 3 ++- tools/hitag2crack/common/ht2crackutils.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/client/src/iso7816/apduinfo.c b/client/src/iso7816/apduinfo.c index b2d879b78..b7d77aca9 100644 --- a/client/src/iso7816/apduinfo.c +++ b/client/src/iso7816/apduinfo.c @@ -440,7 +440,8 @@ int APDUDecode(uint8_t *data, int len, APDU_t *apdu) { int APDUEncode(APDU_t *apdu, uint8_t *data, int *len) { if (len) *len = 0; - + if (apdu == NULL) + return 1; if (apdu->le > 0x10000) return 1; diff --git a/tools/hitag2crack/common/ht2crackutils.c b/tools/hitag2crack/common/ht2crackutils.c index cfac2bfd8..492676724 100644 --- a/tools/hitag2crack/common/ht2crackutils.c +++ b/tools/hitag2crack/common/ht2crackutils.c @@ -141,6 +141,8 @@ int fnf(uint64_t s) { // builds the lfsr for the prng (quick calcs for hitag2_nstep()) void buildlfsr(Hitag_State *hstate) { + if (hstate == NULL) + return; uint64_t state = hstate->shiftreg; uint64_t temp = state ^ (state >> 1); hstate->lfsr = state ^ (state >> 6) ^ (state >> 16) From 0a19c3e8917f9fa8d157b60afa7a27cf0e784af5 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:05:58 +0100 Subject: [PATCH 092/924] cppcheck remove redundant continue as last loop statement --- client/deps/hardnested/hardnested_bf_core.c | 1 - 1 file changed, 1 deletion(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 64b0696aa..63eba8eba 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -530,7 +530,6 @@ stop_tests: bucket_states_tested += bucket_size[block_idx]; // prepare to set new states state_p = &states[KEYSTREAM_SIZE]; - continue; } } out: From 048291dcb3ea6580699ff48b8d5614cbeb4ec3b0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:12:19 +0100 Subject: [PATCH 093/924] cppcheck: can add const on some params --- client/src/cmdhfmfdes.c | 4 ++-- client/src/cmdhftopaz.c | 2 +- client/src/util.c | 2 +- client/src/util.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index f3da73c2c..00c6306e7 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -306,7 +306,7 @@ static nxp_cardtype_t getCardType(uint8_t major, uint8_t minor) { } // ref: https://www.nxp.com/docs/en/application-note/AN12343.pdf p7 -static nxp_producttype_t getProductType(uint8_t *versionhw) { +static nxp_producttype_t getProductType(const uint8_t *versionhw) { uint8_t product = versionhw[2]; @@ -323,7 +323,7 @@ static nxp_producttype_t getProductType(uint8_t *versionhw) { return DESFIRE_UNKNOWN_PROD; } -static const char *getProductTypeStr(uint8_t *versionhw) { +static const char *getProductTypeStr(const uint8_t *versionhw) { uint8_t product = versionhw[2]; diff --git a/client/src/cmdhftopaz.c b/client/src/cmdhftopaz.c index a59cd02be..6311b50ed 100644 --- a/client/src/cmdhftopaz.c +++ b/client/src/cmdhftopaz.c @@ -292,7 +292,7 @@ static bool topaz_byte_is_locked(uint16_t byteno) { } } -static int topaz_set_cc_dynamic(uint8_t *data) { +static int topaz_set_cc_dynamic(const uint8_t *data) { if (data[0] != 0xE1) { topaz_tag.size = TOPAZ_STATIC_MEMORY; diff --git a/client/src/util.c b/client/src/util.c index dc58eef2c..63141d01c 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -1247,7 +1247,7 @@ inline uint64_t leadingzeros64(uint64_t a) { } -int byte_strstr(uint8_t *src, size_t srclen, uint8_t *pattern, size_t plen) { +int byte_strstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_t plen) { size_t max = srclen - plen + 1; diff --git a/client/src/util.h b/client/src/util.h index d831a750b..c29fbd50f 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -148,7 +148,7 @@ uint64_t bitcount64(uint64_t a); uint32_t leadingzeros32(uint32_t a); uint64_t leadingzeros64(uint64_t a); -int byte_strstr(uint8_t *src, size_t srclen, uint8_t *pattern, size_t plen); +int byte_strstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_t plen); struct smartbuf { char *ptr; From 0fbc101ac51f5d4e292a93a2d378a65f8c2c7002 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:12:47 +0100 Subject: [PATCH 094/924] cppcheck uninitialized vars (false positive) --- armsrc/frozen.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/armsrc/frozen.c b/armsrc/frozen.c index 963b0a52b..a77d7dd9d 100644 --- a/armsrc/frozen.c +++ b/armsrc/frozen.c @@ -1429,9 +1429,12 @@ static void json_next_cb(void *userdata, const char *name, size_t name_len, static void *json_next(const char *s, int len, void *handle, const char *path, struct json_token *key, struct json_token *val, int *i) { - struct json_token tmpval, *v = val == NULL ? &tmpval : val; - struct json_token tmpkey, *k = key == NULL ? &tmpkey : key; - int tmpidx, *pidx = i == NULL ? &tmpidx : i; + struct json_token tmpval; + struct json_token *v = val == NULL ? &tmpval : val; + struct json_token tmpkey; + struct json_token *k = key == NULL ? &tmpkey : key; + int tmpidx; + int *pidx = i == NULL ? &tmpidx : i; struct next_data data = {handle, path, (int) strlen(path), 0, k, v, pidx}; json_walk(s, len, json_next_cb, &data); return data.found ? data.handle : NULL; From 951d6cd218f26cf0c65ee9dfa2b19befd3724842 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:17:14 +0100 Subject: [PATCH 095/924] cppcheck uninitialized vars --- client/src/cmdlfindala.c | 2 +- tools/mf_nonce_brute/mf_nonce_brute.c | 2 ++ tools/mf_nonce_brute/mf_trace_brute.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/cmdlfindala.c b/client/src/cmdlfindala.c index 781db217b..fa59894e1 100644 --- a/client/src/cmdlfindala.c +++ b/client/src/cmdlfindala.c @@ -404,7 +404,7 @@ static int CmdIndalaDemodAlt(const char *Cmd) { uint8_t data[MAX_GRAPH_TRACE_LEN] = {0}; size_t datasize = getFromGraphBuf(data); - uint8_t rawbits[4096]; + uint8_t rawbits[4096] = {0}; int rawbit = 0; int worst = 0, worstPos = 0; diff --git a/tools/mf_nonce_brute/mf_nonce_brute.c b/tools/mf_nonce_brute/mf_nonce_brute.c index 8d98e04cf..161f1c749 100644 --- a/tools/mf_nonce_brute/mf_nonce_brute.c +++ b/tools/mf_nonce_brute/mf_nonce_brute.c @@ -331,6 +331,8 @@ static bool checkValidCmd(uint32_t decrypted) { static bool checkValidCmdByte(uint8_t *cmd, uint16_t n) { bool ok = false; + if (cmd == NULL) + return false; for (int i = 0; i < 8; ++i) { if (cmd[0] == cmds[i][0]) { diff --git a/tools/mf_nonce_brute/mf_trace_brute.c b/tools/mf_nonce_brute/mf_trace_brute.c index 8bc255517..1d8a7c6fb 100644 --- a/tools/mf_nonce_brute/mf_trace_brute.c +++ b/tools/mf_nonce_brute/mf_trace_brute.c @@ -174,6 +174,8 @@ static char *sprint_hex_inrow_ex(const uint8_t *data, const size_t len, const si static bool checkValidCmdByte(uint8_t *cmd, uint16_t n) { bool ok = false; + if (cmd == NULL) + return false; for (int i = 0; i < 8; ++i) { if (cmd[0] == cmds[i][0]) { From 30ae0bf521fb14d76d56b72682a926ea502d1a6c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:24:46 +0100 Subject: [PATCH 096/924] make style --- client/src/cmdhfmf.c | 3 +- client/src/fileutils.c | 11 +- client/src/pm3line_vocabulory.h | 20 +- doc/commands.json | 544 +++++++++++++++++++++++--------- doc/commands.md | 30 +- tools/cryptorf/sma_multi.cpp | 2 +- 6 files changed, 445 insertions(+), 165 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index dfac4dbee..11d101391 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6913,8 +6913,7 @@ static int CmdHF14AMfView(const char *Cmd) { return res; } - typedef union UDATA - { + typedef union UDATA { uint8_t *bytes; mfc_vigik_t *vigik; } UDATA; diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 8c2f7a6f0..3182f47c3 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -1162,12 +1162,11 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz goto out; } - typedef union UDATA - { - void* v; - uint8_t* bytes; - mfu_dump_t* mfu; - topaz_tag_t* topaz; + typedef union UDATA { + void *v; + uint8_t *bytes; + mfu_dump_t *mfu; + topaz_tag_t *topaz; } UDATA; UDATA udata = (UDATA)data; char ctype[100] = {0}; diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 4ea275639..5a517c645 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -244,11 +244,11 @@ const static vocabulory_t vocabulory[] = { { 1, "hf gallagher diversifykey" }, { 1, "hf gallagher decode" }, { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 initialize" }, - { 0, "hf ksx6924 prec" }, { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, { 1, "hf jooki help" }, { 0, "hf jooki clone" }, { 1, "hf jooki decode" }, @@ -347,6 +347,10 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mf gen3uid" }, { 0, "hf mf gen3blk" }, { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, { 0, "hf mf gview" }, { 0, "hf mf ndefformat" }, { 0, "hf mf ndefread" }, @@ -376,6 +380,7 @@ const static vocabulory_t vocabulory[] = { { 1, "hf mfu view" }, { 0, "hf mfu wrbl" }, { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, { 0, "hf mfu eview" }, { 0, "hf mfu sim" }, { 0, "hf mfu setpwd" }, @@ -584,6 +589,7 @@ const static vocabulory_t vocabulory[] = { { 0, "lf idteck clone" }, { 0, "lf idteck sim" }, { 1, "lf indala help" }, + { 0, "lf indala brute" }, { 1, "lf indala demod" }, { 1, "lf indala altdemod" }, { 0, "lf indala reader" }, @@ -731,6 +737,12 @@ const static vocabulory_t vocabulory[] = { { 0, "nfc barcode read" }, { 0, "nfc barcode sim" }, { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, { 1, "smart help" }, { 1, "smart list" }, { 0, "smart info" }, diff --git a/doc/commands.json b/doc/commands.json index e055a70b4..1c21f81ba 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -761,7 +761,7 @@ "options": [ "-h, --help This help", "-k, -K, --keep Keep field ON for next command", - "-a, -A, --apdu Show APDU reqests and responses", + "-a, -A, --apdu Show APDU requests and responses", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], "usage": "emv challenge [-hkaw]" @@ -777,7 +777,7 @@ "options": [ "-h, --help This help", "-s, -S, --select Activate field and select card", - "-a, -A, --apdu Show APDU reqests and responses", + "-a, -A, --apdu Show APDU requests and responses", "-t, -T, --tlv TLV decode results", "-j, -J, --jload Load transaction parameters from `emv_defparams.json` file", "-f, -F, --forceaid Force search AID. Search AID instead of execute PPSE", @@ -807,7 +807,7 @@ "-d, -D, --decision Terminal decision. aac - declined, tc - approved, arqc - online authorisation requested", "-p, -P, --params Load parameters from `emv_defparams.json` file for CDOLdata making from CDOL and parameters", "-m, -M, --make Make CDOLdata from CDOL (tag 8C and 8D) and parameters (def: use default parameters)", - "-a, -A, --apdu Show APDU reqests and responses", + "-a, -A, --apdu Show APDU requests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " CDOLdata/CDOL" @@ -828,7 +828,7 @@ "-k, -K, --keep Keep field ON for next command", "-p, -P, --params Load parameters from `emv_defparams.json` file for PDOLdata making from PDOL and parameters", "-m, -M, --make Make PDOLdata from PDOL (tag 9F38) and parameters (def: uses default parameters)", - "-a, -A, --apdu Show APDU reqests and responses", + "-a, -A, --apdu Show APDU requests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " PDOLdata/PDOL" @@ -857,7 +857,7 @@ "-k, -K, --keep Keep field ON for next command", "-p, -P, --params Load parameters from `emv_defparams.json` file for DDOLdata making from DDOL and parameters", "-m, -M, --make Make DDOLdata from DDOL (tag 9F49) and parameters (def: use default parameters)", - "-a, -A, --apdu Show APDU reqests and responses", + "-a, -A, --apdu Show APDU requests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " DDOLdata/DDOL" @@ -868,22 +868,22 @@ "command": "emv list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "emv list -f -> show frame delay times", + "emv list --frame -> show frame delay times", "emv list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "emv list [-h1fcrux] [--dict ]" + "usage": "emv list [-h1crux] [--frame] [-f ]" }, "emv pse": { "command": "emv pse", @@ -899,7 +899,7 @@ "-k, -K, --keep Keep field ON for next command", "-1, --pse PSE (1PAY.SYS.DDF01) mode", "-2, --ppse PPSE (2PAY.SYS.DDF01) mode (def)", - "-a, -A, --apdu Show APDU reqests and responses", + "-a, -A, --apdu Show APDU requests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], @@ -916,7 +916,7 @@ "options": [ "-h, --help This help", "-k, -K, --keep Keep field ON for next command", - "-a, -A, --apdu Show APDU reqests and responses", + "-a, -A, --apdu Show APDU requests and responses", "-t, -T, --tlv TLV decode results of selected applets", "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " help` for details of a command prefs { Edit client/device preferences... } -------- ----------------------- Technology ----------------------- analyse { Analyse utils... } data { Plot window / data buffer manipulation... } emv { EMV ISO-14443 / ISO-7816... } hf { High frequency commands... } hw { Hardware commands... } lf { Low frequency commands... } nfc { NFC commands... } reveng { CRC calculations from RevEng software... } smart { Smart card ISO-7816 commands... } script { Scripting commands... } trace { Trace manipulation... } wiegand { Wiegand format manipulation... } -------- ----------------------- General ----------------------- clear Clear screen hints Turn hints on / off msleep Add a pause in milliseconds rem Add a text line in log file quit exit Exit program", + "description": "help Use ` help` for details of a command prefs { Edit client/device preferences... } -------- ----------------------- Technology ----------------------- analyse { Analyse utils... } data { Plot window / data buffer manipulation... } emv { EMV ISO-14443 / ISO-7816... } hf { High frequency commands... } hw { Hardware commands... } lf { Low frequency commands... } nfc { NFC commands... } piv { PIV commands... } reveng { CRC calculations from RevEng software... } smart { Smart card ISO-7816 commands... } script { Scripting commands... } trace { Trace manipulation... } wiegand { Wiegand format manipulation... } -------- ----------------------- General ----------------------- clear Clear screen hints Turn hints on / off msleep Add a pause in milliseconds rem Add a text line in log file quit exit Exit program", "notes": [], "offline": true, "options": [], @@ -1145,22 +1145,22 @@ "command": "hf 14a list", "description": "Alias of `trace list -t 14a` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf 14a list -f -> show frame delay times", + "hf 14a list --frame -> show frame delay times", "hf 14a list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf 14a list [-h1fcrux] [--dict ]" + "usage": "hf 14a list [-h1crux] [--frame] [-f ]" }, "hf 14a ndefformat": { "command": "hf 14a ndefformat", @@ -1259,7 +1259,7 @@ }, "hf 14a sim": { "command": "hf 14a sim", - "description": "Simulate ISO/IEC 14443 type A tag with 4,7 or 10 byte UID", + "description": "Simulate ISO/IEC 14443 type A tag with 4,7 or 10 byte UID Use type 7 for Mifare Ultralight EV1, Amiibo (NTAG215 pack 0x8080)", "notes": [ "hf 14a sim -t 1 --uid 11223344 -> MIFARE Classic 1k", "hf 14a sim -t 2 -> MIFARE Ultralight", @@ -1267,7 +1267,7 @@ "hf 14a sim -t 4 -> ISO/IEC 14443-4", "hf 14a sim -t 5 -> MIFARE Tnp3xxx", "hf 14a sim -t 6 -> MIFARE Mini", - "hf 14a sim -t 7 -> Amiibo (NTAG 215), pack 0x8080", + "hf 14a sim -t 7 -> MFU EV1 / NTAG 215 Amiibo", "hf 14a sim -t 8 -> MIFARE Classic 4k", "hf 14a sim -t 9 -> FM11RF005SH Shanghai Metro", "hf 14a sim -t 10 -> ST25TA IKEA Rothult" @@ -1363,22 +1363,22 @@ "command": "hf 14b list", "description": "Alias of `trace list -t 14b` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf 14b list -f -> show frame delay times", + "hf 14b list --frame -> show frame delay times", "hf 14b list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf 14b list [-h1fcrux] [--dict ]" + "usage": "hf 14b list [-h1crux] [--frame] [-f ]" }, "hf 14b ndefread": { "command": "hf 14b ndefread", @@ -1637,22 +1637,22 @@ "command": "hf 15 list", "description": "Alias of `trace list -t 15` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf 15 list -f -> show frame delay times", + "hf 15 list --frame -> show frame delay times", "hf 15 list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf 15 list [-h1fcrux] [--dict ]" + "usage": "hf 15 list [-h1crux] [--frame] [-f ]" }, "hf 15 raw": { "command": "hf 15 raw", @@ -2189,7 +2189,9 @@ "command": "hf emrtd dump", "description": "Dump all files on an eMRTD", "notes": [ - "hf emrtd dump" + "hf emrtd dump", + "hf emrtd dump --dir ../dump", + "hf emrtd dump -n 123456789 -d 19890101 -e 20250401" ], "offline": false, "options": [ @@ -2198,9 +2200,9 @@ "-d, --dateofbirth date of birth in YYMMDD format", "-e, --expiry expiry in YYMMDD format", "-m, --mrz <[0-9A-Z<]> 2nd line of MRZ, 44 chars", - "--path save dump to the given dirpath" + "--dir save dump to the given dirpath" ], - "usage": "hf emrtd dump [-h] [-n ] [-d ] [-e ] [-m <[0-9A-Z<]>] [--path ]" + "usage": "hf emrtd dump [-h] [-n ] [-d ] [-e ] [-m <[0-9A-Z<]>] [--dir ]" }, "hf emrtd help": { "command": "hf emrtd help", @@ -2214,7 +2216,10 @@ "command": "hf emrtd info", "description": "Display info about an eMRTD", "notes": [ - "hf emrtd info" + "hf emrtd info", + "hf emrtd info --dir ../dumps", + "hf emrtd info -n 123456789 -d 19890101 -e 20250401", + "hf emrtd info -n 123456789 -d 19890101 -e 20250401 -i" ], "offline": true, "options": [ @@ -2223,31 +2228,31 @@ "-d, --dateofbirth date of birth in YYMMDD format", "-e, --expiry expiry in YYMMDD format", "-m, --mrz <[0-9A-Z<]> 2nd line of MRZ, 44 chars (passports only)", - "--path display info from offline dump stored in dirpath", + "--dir display info from offline dump stored in dirpath", "-i, --images show images" ], - "usage": "hf emrtd info [-hi] [-n ] [-d ] [-e ] [-m <[0-9A-Z<]>] [--path ]" + "usage": "hf emrtd info [-hi] [-n ] [-d ] [-e ] [-m <[0-9A-Z<]>] [--dir ]" }, "hf emrtd list": { "command": "hf emrtd list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf emrtd list -f -> show frame delay times", + "hf emrtd list --frame -> show frame delay times", "hf emrtd list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf emrtd list [-h1fcrux] [--dict ]" + "usage": "hf emrtd list [-h1crux] [--frame] [-f ]" }, "hf epa cnonces": { "command": "hf epa cnonces", @@ -2367,22 +2372,22 @@ "command": "hf felica list", "description": "Alias of `trace list -t felica` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf felica list -f -> show frame delay times", + "hf felica list --frame -> show frame delay times", "hf felica list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf felica list [-h1fcrux] [--dict ]" + "usage": "hf felica list [-h1crux] [--frame] [-f ]" }, "hf felica litedump": { "command": "hf felica litedump", @@ -2575,7 +2580,7 @@ "offline": false, "options": [ "-h, --help This help", - "-a, --apdu Show APDU reqests and responses", + "-a, --apdu Show APDU requests and responses", "-v, --verbose Verbose mode. vv - show full certificates data", "-c, --cbor Show CBOR decoded data", "-l, --list Add CredentialId from json to allowList", @@ -2596,7 +2601,7 @@ "offline": false, "options": [ "-h, --help This help", - "-a, --apdu Show APDU reqests and responses", + "-a, --apdu Show APDU requests and responses", "-v, --verbose Verbose mode", "default mode: dont-enforce-user-presence-and-sign", "-u, --user mode: enforce-user-presence-and-sign", @@ -2635,22 +2640,22 @@ "command": "hf fido list", "description": "Alias of `trace list -t 14a` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf fido list -f -> show frame delay times", + "hf fido list --frame -> show frame delay times", "hf fido list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf fido list [-h1fcrux] [--dict ]" + "usage": "hf fido list [-h1crux] [--frame] [-f ]" }, "hf fido make": { "command": "hf fido make", @@ -2662,7 +2667,7 @@ "offline": false, "options": [ "-h, --help This help", - "-a, --apdu Show APDU reqests and responses", + "-a, --apdu Show APDU requests and responses", "-v, --verbose Verbose mode. vv - show full certificates data", "-t, --tlv Show DER certificate contents in TLV representation", "-c, --cbor Show CBOR decoded data", @@ -2916,9 +2921,10 @@ "-f, --file Dictionary file with default iclass keys", "--credit key is assumed to be the credit key", "--elite elite computations applied to key", - "--raw no computations applied to key (raw)" + "--raw no computations applied to key (raw)", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass chk [-h] -f [--credit] [--elite] [--raw]" + "usage": "hf iclass chk [-h] -f [--credit] [--elite] [--raw] [--shallow]" }, "hf iclass configcard": { "command": "hf iclass configcard", @@ -2969,9 +2975,11 @@ "--elite elite computations applied to key", "--raw raw, the key is interpreted as raw block 3/4", "--nr replay of NR/MAC", - "-z, --dense dense dump output style" + "-z, --dense dense dump output style", + "--force force unsecure card read", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass dump [-hz] [-f ] [-k ] [--ki ] [--credit ] [--ci ] [--elite] [--raw] [--nr]" + "usage": "hf iclass dump [-hz] [-f ] [-k ] [--ki ] [--credit ] [--ci ] [--elite] [--raw] [--nr] [--force] [--shallow]" }, "hf iclass eload": { "command": "hf iclass eload", @@ -2990,7 +2998,7 @@ }, "hf iclass encode": { "command": "hf iclass encode", - "description": "Encode binary wiegand to block 7 Use either --bin or --wiegand/--fc/--cn", + "description": "Encode binary wiegand to block 7,8,9 Use either --bin or --wiegand/--fc/--cn", "notes": [ "hf iclass encode --bin 10001111100000001010100011 --ki 0 -> FC 31 CN 337", "hf iclass encode --fc 31 --cn 337 --ki 0 -> FC 31 CN 337", @@ -3007,9 +3015,10 @@ "--enckey 3DES transport key, 16 hex bytes", "--fc facility code", "--cn card number", - "-w, --wiegand see `wiegand list` for available formats" + "-w, --wiegand see `wiegand list` for available formats", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ]" + "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" }, "hf iclass encrypt": { "command": "hf iclass encrypt", @@ -3076,30 +3085,31 @@ ], "offline": true, "options": [ - "-h, --help This help" + "-h, --help This help", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass info [-h]" + "usage": "hf iclass info [-h] [--shallow]" }, "hf iclass list": { "command": "hf iclass list", "description": "Alias of `trace list -t iclass` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf iclass list -f -> show frame delay times", + "hf iclass list --frame -> show frame delay times", "hf iclass list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf iclass list [-h1fcrux] [--dict ]" + "usage": "hf iclass list [-h1crux] [--frame] [-f ]" }, "hf iclass loclass": { "command": "hf iclass loclass", @@ -3190,9 +3200,10 @@ "--elite elite computations applied to key", "--raw no computations applied to key", "--nr replay of NR/MAC", - "-v, --verbose verbose output" + "-v, --verbose verbose output", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass rdbl [-hv] [-k ] [--ki ] -b [--credit] [--elite] [--raw] [--nr]" + "usage": "hf iclass rdbl [-hv] [-k ] [--ki ] -b [--credit] [--elite] [--raw] [--nr] [--shallow]" }, "hf iclass reader": { "command": "hf iclass reader", @@ -3203,9 +3214,10 @@ "offline": false, "options": [ "-h, --help This help", - "-@ optional - continuous reader mode" + "-@ optional - continuous reader mode", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass reader [-h@]" + "usage": "hf iclass reader [-h@] [--shallow]" }, "hf iclass restore": { "command": "hf iclass restore", @@ -3226,9 +3238,10 @@ "--credit key is assumed to be the credit key", "--elite elite computations applied to key", "--raw no computations applied to key", - "-v, --verbose verbose output" + "-v, --verbose verbose output", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass restore [-hv] -f [-k ] [--ki ] --first --last [--credit] [--elite] [--raw]" + "usage": "hf iclass restore [-hv] -f [-k ] [--ki ] --first --last [--credit] [--elite] [--raw] [--shallow]" }, "hf iclass sim": { "command": "hf iclass sim", @@ -3300,9 +3313,10 @@ "--elite elite computations applied to key", "--raw no computations applied to key", "--nr replay of NR/MAC", - "-v, --verbose verbose output" + "-v, --verbose verbose output", + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass wrbl [-hv] [-k ] [--ki ] -b -d [-m ] [--credit] [--elite] [--raw] [--nr]" + "usage": "hf iclass wrbl [-hv] [-k ] [--ki ] -b -d [-m ] [--credit] [--elite] [--raw] [--nr] [--shallow]" }, "hf jooki clone": { "command": "hf jooki clone", @@ -3400,7 +3414,7 @@ "options": [ "-h, --help This help", "-k, --keep keep field ON for next command", - "-a, --apdu show APDU reqests and responses" + "-a, --apdu Show APDU requests and responses" ], "usage": "hf ksx6924 balance [-hka]" }, @@ -3422,23 +3436,23 @@ "options": [ "-h, --help This help", "-k, --keep keep field ON for next command", - "-a, --apdu show APDU reqests and responses" + "-a, --apdu Show APDU requests and responses" ], "usage": "hf ksx6924 info [-hka]" }, - "hf ksx6924 initialize": { - "command": "hf ksx6924 initialize", - "description": "Perform transaction initialization (mpda)", + "hf ksx6924 init": { + "command": "hf ksx6924 init", + "description": "Perform transaction initialization with Mpda (Money of Purchase Transaction)", "notes": [ - "hf ksx6924 initialize 000003e8 -> mpda" + "hf ksx6924 init 000003e8 -> Mpda" ], "offline": false, "options": [ "-h, --help This help", "-k, --keep keep field ON for next command", - "-a, --apdu show APDU reqests and responses" + "-a, --apdu Show APDU requests and responses" ], - "usage": "hf ksx6924 initialize [-hka] " + "usage": "hf ksx6924 init [-hka] " }, "hf ksx6924 prec": { "command": "hf ksx6924 prec", @@ -3450,7 +3464,7 @@ "options": [ "-h, --help This help", "-k, --keep keep field ON for next command", - "-a, --apdu show APDU reqests and responses" + "-a, --apdu Show APDU requests and responses" ], "usage": "hf ksx6924 prec [-hka] " }, @@ -3463,7 +3477,7 @@ "offline": false, "options": [ "-h, --help This help", - "-a, --apdu show APDU reqests and responses" + "-a, --apdu Show APDU requests and responses" ], "usage": "hf ksx6924 select [-ha]" }, @@ -3573,22 +3587,22 @@ "command": "hf legic list", "description": "Alias of `trace list -t legic` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf legic list -f -> show frame delay times", + "hf legic list --frame -> show frame delay times", "hf legic list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf legic list [-h1fcrux] [--dict ]" + "usage": "hf legic list [-h1crux] [--frame] [-f ]" }, "hf legic rdbl": { "command": "hf legic rdbl", @@ -3695,22 +3709,22 @@ "command": "hf list", "description": "Alias of `trace list -t raw` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf list -f -> show frame delay times", + "hf list --frame -> show frame delay times", "hf list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf list [-h1fcrux] [--dict ]" + "usage": "hf list [-h1crux] [--frame] [-f ]" }, "hf lto dump": { "command": "hf lto dump", @@ -3749,22 +3763,22 @@ "command": "hf lto list", "description": "Alias of `trace list -t lto` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf lto list -f -> show frame delay times", + "hf lto list --frame -> show frame delay times", "hf lto list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf lto list [-h1fcrux] [--dict ]" + "usage": "hf lto list [-h1crux] [--frame] [-f ]" }, "hf lto rdbl": { "command": "hf lto rdbl", @@ -3969,7 +3983,7 @@ "--1k MIFARE Classic 1k / S50 (def)", "--2k MIFARE Classic/Plus 2k", "--4k MIFARE Classic 4k / S70", - "--emu from emulator memory" + "--emu to emulator memory" ], "usage": "hf mf csave [-h] [-f ] [--mini] [--1k] [--2k] [--4k] [--emu]" }, @@ -4303,6 +4317,85 @@ ], "usage": "hf mf gen3uid [-h] [-u ]" }, + "hf mf ggetblk": { + "command": "hf mf ggetblk", + "description": "Get block data from magic gen4 GTU card.", + "notes": [ + "hf mf ggetblk --blk 0 -> get block 0 (manufacturer)", + "hf mf ggetblk --blk 3 -v -> get block 3, decode sector trailer" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-b, --blk block number", + "-v, --verbose verbose output", + "-p, --pwd password 4bytes" + ], + "usage": "hf mf ggetblk [-hv] -b [-p ]" + }, + "hf mf gload": { + "command": "hf mf gload", + "description": "Load magic gen4 gtu card with data from (bin/eml/json) dump file or from emulator memory.", + "notes": [ + "hf mf gload --emu", + "hf mf gload -f hf-mf-01020304.eml", + "hf mf gload -p AABBCCDD --4k -v -f hf-mf-01020304-dump.bin", + "", + "Card must be configured beforehand with `script run hf_mf_ultimatecard`.", + "Blocks are 16 bytes long." + ], + "offline": false, + "options": [ + "-h, --help This help", + "--mini MIFARE Classic Mini / S20", + "--1k MIFARE Classic 1k / S50 (def)", + "--2k MIFARE Classic/Plus 2k", + "--4k MIFARE Classic 4k / S70", + "-p, --pwd password 4bytes", + "-v, --verbose verbose output", + "-f, --file filename of dump", + "--emu from emulator memory", + "--start index of block to start writing (default 0)", + "--end index of block to end writing (default last block)" + ], + "usage": "hf mf gload [-hv] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu] [--start ] [--end ]" + }, + "hf mf gsave": { + "command": "hf mf gsave", + "description": "Save `magic gen4 gtu` card memory into three files (BIN/EML/JSON)or into emulator memory", + "notes": [ + "hf mf gsave", + "hf mf gsave --4k", + "hf mf gsave -p DEADBEEF -f hf-mf-01020304.json" + ], + "offline": false, + "options": [ + "-h, --help This help", + "--mini MIFARE Classic Mini / S20", + "--1k MIFARE Classic 1k / S50 (def)", + "--2k MIFARE Classic/Plus 2k", + "--4k MIFARE Classic 4k / S70", + "-p, --pwd password 4bytes", + "-f, --file filename of dump", + "--emu to emulator memory" + ], + "usage": "hf mf gsave [-h] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu]" + }, + "hf mf gsetblk": { + "command": "hf mf gsetblk", + "description": "Set block data on a magic gen4 GTU card", + "notes": [ + "hf mf gsetblk --blk 1 -d 000102030405060708090a0b0c0d0e0f" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-b, --blk block number", + "-d, --data bytes to write, 16 hex bytes", + "-p, --pwd password 4bytes" + ], + "usage": "hf mf gsetblk [-h] -b [-d ] [-p ]" + }, "hf mf gview": { "command": "hf mf gview", "description": "View `magic gen4 gtu` card memory", @@ -4324,8 +4417,9 @@ }, "hf mf hardnested": { "command": "hf mf hardnested", - "description": "Nested attack for hardened MIFARE Classic cards. `--i` set type of SIMD instructions. Without this flag programs autodetect it. or hf mf hardnested -r --tk [known target key] Add the known target key to check if it is present in the remaining key space hf mf hardnested --blk 0 -a -k A0A1A2A3A4A5 --tblk 4 --ta --tk FFFFFFFFFFFF", + "description": "Nested attack for hardened MIFARE Classic cards. if card is EV1, command can detect and use known key see example below `--i` set type of SIMD instructions. Without this flag programs autodetect it. or hf mf hardnested -r --tk [known target key] Add the known target key to check if it is present in the remaining key space hf mf hardnested --blk 0 -a -k A0A1A2A3A4A5 --tblk 4 --ta --tk FFFFFFFFFFFF", "notes": [ + "hf mf hardnested --tblk 4 --ta -> works for MFC EV1", "hf mf hardnested --blk 0 -a -k FFFFFFFFFFFF --tblk 4 --ta", "hf mf hardnested --blk 0 -a -k FFFFFFFFFFFF --tblk 4 --ta -w", "hf mf hardnested --blk 0 -a -k FFFFFFFFFFFF --tblk 4 --ta -f nonces.bin -w -s", @@ -4372,22 +4466,22 @@ "command": "hf mf list", "description": "Alias of `trace list -t mf` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf mf list -f -> show frame delay times", + "hf mf list --frame -> show frame delay times", "hf mf list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf mf list [-h1fcrux] [--dict ]" + "usage": "hf mf list [-h1crux] [--frame] [-f ]" }, "hf mf mad": { "command": "hf mf mad", @@ -4710,7 +4804,7 @@ }, "hf mf wrbl": { "command": "hf mf wrbl", - "description": "Write MIFARE Classic block with 16 hex bytes of data Sector 0 / Block 0 - Manufacturer block When writing to block 0 you must use a VALID block 0 data (UID, BCC, SAK, ATQA) Writing an invalid block 0 means rendering your Magic GEN2 card undetectable. Look in the magic_cards_notes.md file for help to resolve it.", + "description": "Write MIFARE Classic block with 16 hex bytes of data Sector 0 / Block 0 - Manufacturer block When writing to block 0 you must use a VALID block 0 data (UID, BCC, SAK, ATQA) Writing an invalid block 0 means rendering your Magic GEN2 card undetectable. Look in the magic_cards_notes.md file for help to resolve it. `--force` param is used to override warnings like bad ACL and BLOCK 0 writes. if not specified, it will exit if detected", "notes": [ "hf mf wrbl --blk 1 -k FFFFFFFFFFFF -d 000102030405060708090a0b0c0d0e0f" ], @@ -4720,7 +4814,7 @@ "--blk block number", "-a input key type is key A (def)", "-b input key type is key B", - "--force enforce block0 writes", + "--force override warnings", "-k, --key key, 6 hex bytes", "-d, --data bytes to write, 16 hex bytes" ], @@ -5551,22 +5645,22 @@ "command": "hf mfdes list", "description": "Alias of `trace list -t des` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf mfdes list -f -> show frame delay times", + "hf mfdes list --frame -> show frame delay times", "hf mfdes list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf mfdes list [-h1fcrux] [--dict ]" + "usage": "hf mfdes list [-h1crux] [--frame] [-f ]" }, "hf mfdes lsapp": { "command": "hf mfdes lsapp", @@ -6113,17 +6207,35 @@ ], "usage": "hf mfu eload [-h] -f [-q ]" }, - "hf mfu eview": { - "command": "hf mfu eview", - "description": "It displays emulator memory", + "hf mfu esave": { + "command": "hf mfu esave", + "description": "Saves emulator memory to a MIFARE Ultralight/NTAG dump file (bin/eml/json) By default number of pages saved depends on defined tag type. You can override this with option --end.", "notes": [ - "hf mfu eview" + "hf mfu esave", + "hf mfu esave --end 255 -> saves whole memory", + "hf mfu esave -f hf-mfu-04010203040506-dump.json" ], "offline": false, "options": [ - "-h, --help This help" + "-h, --help This help", + "-e, --end index of last block", + "-f, --file filename of dump" ], - "usage": "hf mfu eview [-h]" + "usage": "hf mfu esave [-h] [-e ] [-f ]" + }, + "hf mfu eview": { + "command": "hf mfu eview", + "description": "Displays emulator memory By default number of pages shown depends on defined tag type. You can override this with option --end.", + "notes": [ + "hf mfu eview", + "hf mfu eview --end 255 -> dumps whole memory" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-e, --end index of last block" + ], + "usage": "hf mfu eview [-h] [-e ]" }, "hf mfu help": { "command": "hf mfu help", @@ -6291,8 +6403,8 @@ "description": "Simulate MIFARE Ultralight family type based upon ISO/IEC 14443 type A tag with 4,7 or 10 byte UID from emulator memory. See `hf mfu eload` first. The UID from emulator memory will be used if not specified. See `hf 14a sim -h` to see available types. You want 2 or 7 usually.", "notes": [ "hf mfu sim -t 2 --uid 11223344556677 -> MIFARE Ultralight", - "hf mfu sim -t 7 --uid 11223344556677 -n 5 -> Amiibo (NTAG 215), pack 0x8080", - "hf mfu sim -t 7 -> Amiibo (NTAG 215), pack 0x8080" + "hf mfu sim -t 7 --uid 11223344556677 -n 5 -> MFU EV1 / NTAG 215 Amiibo", + "hf mfu sim -t 7 -> MFU EV1 / NTAG 215 Amiibo" ], "offline": false, "options": [ @@ -6433,22 +6545,22 @@ "command": "hf seos list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf seos list -f -> show frame delay times", + "hf seos list --frame -> show frame delay times", "hf seos list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf seos list [-h1fcrux] [--dict ]" + "usage": "hf seos list [-h1crux] [--frame] [-f ]" }, "hf sniff": { "command": "hf sniff", @@ -6491,22 +6603,22 @@ "command": "hf st25ta list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf st25ta list -f -> show frame delay times", + "hf st25ta list --frame -> show frame delay times", "hf st25ta list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf st25ta list [-h1fcrux] [--dict ]" + "usage": "hf st25ta list [-h1crux] [--frame] [-f ]" }, "hf st25ta ndefread": { "command": "hf st25ta ndefread", @@ -6641,22 +6753,22 @@ "command": "hf thinfilm list", "description": "Alias of `trace list -t thinfilm` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf thinfilm list -f -> show frame delay times", + "hf thinfilm list --frame -> show frame delay times", "hf thinfilm list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf thinfilm list [-h1fcrux] [--dict ]" + "usage": "hf thinfilm list [-h1crux] [--frame] [-f ]" }, "hf thinfilm sim": { "command": "hf thinfilm sim", @@ -6712,22 +6824,22 @@ "command": "hf topaz list", "description": "Alias of `trace list -t topaz` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf topaz list -f -> show frame delay times", + "hf topaz list --frame -> show frame delay times", "hf topaz list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "hf topaz list [-h1fcrux] [--dict ]" + "usage": "hf topaz list [-h1crux] [--frame] [-f ]" }, "hf topaz raw": { "command": "hf topaz raw", @@ -8455,22 +8567,22 @@ "command": "lf hitag list", "description": "Alias of `trace list -t hitag2` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "lf hitag list -f -> show frame delay times", + "lf hitag list --frame -> show frame delay times", "lf hitag list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "lf hitag list [-h1fcrux] [--dict ]" + "usage": "lf hitag list [-h1crux] [--frame] [-f ]" }, "lf hitag reader": { "command": "lf hitag reader", @@ -8627,6 +8739,28 @@ ], "usage": "lf indala altdemod [-hl]" }, + "lf indala brute": { + "command": "lf indala brute", + "description": "Enables bruteforce of INDALA readers with specified facility code. This is a attack against reader. if cardnumber is given, it starts with it and goes up / down one step if cardnumber is not given, it starts with 1 and goes up to 65535", + "notes": [ + "lf indala brute --fc 224", + "lf indala brute --fc 21 -d 2000", + "lf indala brute -v --fc 21 --cn 200 -d 2000", + "lf indala brute -v --fc 21 --cn 200 -d 2000 --up" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-v, --verbose verbose output", + "--fc facility code", + "--cn card number to start with", + "-d, --delay delay betweens attempts in ms. Default 1000ms", + "--up direction to increment card number. (default is both directions)", + "--down direction to decrement card number. (default is both directions)", + "--4041x specify Indala 4041X format" + ], + "usage": "lf indala brute [-hv] [--fc ] [--cn ] [-d ] [--up] [--down] [--4041x]" + }, "lf indala clone": { "command": "lf indala clone", "description": "clone Indala UID to T55x7 or Q5/T5555 tag using different known formats", @@ -8682,6 +8816,8 @@ "description": "Enables simulation of Indala card with specified facility code and card number. Simulation runs until the button is pressed or another USB command is issued.", "notes": [ "lf indala sim --heden 888", + "lf indala sim --fc 123 --cn 1337", + "lf indala sim --fc 123 --cn 1337 --4041x", "lf indala sim --raw a0000000a0002021", "lf indala sim --raw 80000001b23523a6c2e31eba3cbee4afb3c6ad1fcf649393928c14e5" ], @@ -8689,9 +8825,12 @@ "options": [ "-h, --help This help", "-r, --raw raw bytes", - "--heden Cardnumber for Heden 2L format" + "--heden Cardnumber for Heden 2L format", + "--fc Facility code (26 bit H10301 format)", + "--cn Card number (26 bit H10301 format)", + "--4041x Optional - specify Indala 4041X format, must use with fc and cn" ], - "usage": "lf indala sim [-h] [-r ] [--heden ]" + "usage": "lf indala sim [-h] [-r ] [--heden ] [--fc ] [--cn ] [--4041x]" }, "lf io clone": { "command": "lf io clone", @@ -9244,6 +9383,7 @@ "command": "lf paradox clone", "description": "clone a paradox tag to a T55x7, Q5/T5555 or EM4305/4469 tag.", "notes": [ + "lf paradox clone --fc 96 --cn 40426 -> encode for T55x7 tag with fc and cn", "lf paradox clone --raw 0f55555695596a6a9999a59a -> encode for T55x7 tag", "lf paradox clone --raw 0f55555695596a6a9999a59a --q5 -> encode for Q5/T5555 tag", "lf paradox clone --raw 0f55555695596a6a9999a59a --em -> encode for EM4305/4469" @@ -9252,10 +9392,12 @@ "options": [ "-h, --help This help", "-r, --raw raw hex data. 12 bytes max", + "--fc facility code", + "--cn card number", "--q5 optional - specify writing to Q5/T5555 tag", "--em optional - specify writing to EM4305/4469 tag" ], - "usage": "lf paradox clone [-h] [-r ] [--q5] [--em]" + "usage": "lf paradox clone [-h] [-r ] [--fc ] [--cn ] [--q5] [--em]" }, "lf paradox demod": { "command": "lf paradox demod", @@ -10818,6 +10960,114 @@ ], "usage": "hf 14b ndefread [-hv] [-f ]" }, + "piv authsign": { + "command": "piv authsign", + "description": "Send a nonce and ask the PIV card to sign it", + "notes": [ + "piv sign -sk -> select card, select applet, sign a NULL nonce" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-s, -S, --select Activate field and select applet", + "-k, -K, --keep Keep field for next command", + "-a, -A, --apdu Show APDU requests and responses", + "-t, -T, --tlv TLV decode results", + "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "--aid Applet ID to select. By default A0000003080000100 will be used", + "--nonce Nonce to sign.", + "--slot Slot number. Default will be 0x9E (card auth cert).", + "--alg Algorithm to use to sign. Example values: 06=RSA-1024, 07=RSA-2048, 11=ECC-P256 (default), 14=ECC-P384" + ], + "usage": "piv sign [-hskatw] [--aid ] --nonce [--slot ] [--alg ]" + }, + "piv getdata": { + "command": "piv getdata", + "description": "Get a data container of a given tag", + "notes": [ + "piv getdata -s 5fc102 -> select card, select applet, get card holder unique identifer", + "piv getdata -st 5fc102 -> select card, select applet, get card holder unique identifer, show result in TLV" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-s, -S, --select Activate field and select applet", + "-k, -K, --keep Keep field for next command", + "-a, -A, --apdu Show APDU requests and responses", + "-t, -T, --tlv TLV decode results", + "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "--aid Applet ID to select. By default A0000003080000100 will be used", + " Tag ID to read, between 1 and 3 bytes." + ], + "usage": "piv getdata [-hskatw] [--aid ] " + }, + "piv help": { + "command": "piv help", + "description": "help This help list List ISO7816 history", + "notes": [], + "offline": true, + "options": [], + "usage": "" + }, + "piv list": { + "command": "piv list", + "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "notes": [ + "piv list --frame -> show frame delay times", + "piv list -1 -> use trace buffer" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-1, --buffer use data from trace buffer", + "--frame show frame delay times", + "-c mark CRC bytes", + "-r show relative times (gap and duration)", + "-u display times in microseconds instead of clock cycles", + "-x show hexdump to convert to pcap(ng)", + "or to import into Wireshark using encapsulation type \"ISO 14443\"", + "-f, --file filename of dictionary" + ], + "usage": "piv list [-h1crux] [--frame] [-f ]" + }, + "piv scan": { + "command": "piv scan", + "description": "Scan a PIV card for known containers", + "notes": [ + "piv scan -s -> select card, select applet and run scan", + "piv scan -st --aid a00000030800001000 -> select card, select applet a00000030800001000, show result of the scan in TLV" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-s, -S, --select Activate field and select applet", + "-k, -K, --keep Keep field for next command", + "-a, -A, --apdu Show APDU requests and responses", + "-t, -T, --tlv TLV decode results", + "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "--aid Applet ID to select. By default A0000003080000100 will be used" + ], + "usage": "piv scan [-hskatw] [--aid ]" + }, + "piv select": { + "command": "piv select", + "description": "Executes select applet command", + "notes": [ + "piv select -s -> select card, select applet", + "piv select -st --aid a00000030800001000 -> select card, select applet a00000030800001000, show result in TLV" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-s, -S, --select Activate field and select applet", + "-k, -K, --keep Keep field for next command", + "-a, -A, --apdu Show APDU requests and responses", + "-t, -T, --tlv TLV decode results", + "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "--aid Applet ID to select. By default A0000003080000100 will be used" + ], + "usage": "piv select [-hskatw] [--aid ]" + }, "prefs get barmode": { "command": "prefs get barmode", "description": "Get preference of HF/LF tune command styled output in the client", @@ -11173,22 +11423,22 @@ "command": "smart list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "smart list -f -> show frame delay times", + "smart list --frame -> show frame delay times", "smart list -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "smart list [-h1fcrux] [--dict ]" + "usage": "smart list [-h1crux] [--frame] [-f ]" }, "smart raw": { "command": "smart raw", @@ -11295,24 +11545,24 @@ "trace list -t thinfilm -> interpret as Thinfilm", "trace list -t topaz -> interpret as Topaz", "", - "trace list -t mf --dict -> use dictionary keys file", - "trace list -t 14a -f -> show frame delay times", + "trace list -t mf -f mfc_default_keys.dic -> use default dictionary file", + "trace list -t 14a --frame -> show frame delay times", "trace list -t 14a -1 -> use trace buffer" ], "offline": true, "options": [ "-h, --help This help", "-1, --buffer use data from trace buffer", - "-f show frame delay times", + "--frame show frame delay times", "-c mark CRC bytes", "-r show relative times (gap and duration)", "-u display times in microseconds instead of clock cycles", "-x show hexdump to convert to pcap(ng)", "or to import into Wireshark using encapsulation type \"ISO 14443\"", "-t, --type protocol to annotate the trace", - "--dict use dictionary keys file" + "-f, --file filename of dictionary" ], - "usage": "trace list [-h1fcrux] [-t ] [--dict ]" + "usage": "trace list [-h1crux] [--frame] [-t ] [-f ]" }, "trace load": { "command": "trace load", @@ -11510,8 +11760,8 @@ } }, "metadata": { - "commands_extracted": 727, + "commands_extracted": 739, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-01-14T21:23:30" + "extracted_on": "2023-01-15T01:24:39" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 2133d960b..1c6110cea 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -367,11 +367,11 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`hf ksx6924 help `|Y |`This help` -|`hf ksx6924 balance `|N |`Get current purse balance` -|`hf ksx6924 info `|N |`Get info about a KS X 6924 (T-Money, Snapper+) transit card` -|`hf ksx6924 initialize `|N |`Perform transaction initialization (Mpda)` -|`hf ksx6924 prec `|N |`Send proprietary get record command (CLA=90, INS=4C)` |`hf ksx6924 select `|N |`Select application, and leave field up` +|`hf ksx6924 info `|N |`Get info about a KS X 6924 (T-Money, Snapper+) transit card` +|`hf ksx6924 balance `|N |`Get current purse balance` +|`hf ksx6924 init `|N |`Perform transaction initialization with Mpda` +|`hf ksx6924 prec `|N |`Send proprietary get record command (CLA=90, INS=4C)` ### hf jooki @@ -510,6 +510,10 @@ Check column "offline" for their availability. |`hf mf gen3uid `|N |`Set UID without changing manufacturer block` |`hf mf gen3blk `|N |`Overwrite manufacturer block` |`hf mf gen3freeze `|N |`Perma lock UID changes. irreversible` +|`hf mf ggetblk `|N |`Read block from card` +|`hf mf gload `|N |`Load dump to card` +|`hf mf gsave `|N |`Save dump from card into file or emulator` +|`hf mf gsetblk `|N |`Write block to card` |`hf mf gview `|N |`View card` |`hf mf ndefformat `|N |`Format MIFARE Classic Tag as NFC Tag` |`hf mf ndefread `|N |`Read and print NDEF records from card` @@ -554,7 +558,8 @@ Check column "offline" for their availability. |`hf mfu restore `|N |`Restore a dump onto a MFU MAGIC tag` |`hf mfu view `|Y |`Display content from tag dump file` |`hf mfu wrbl `|N |`Write block` -|`hf mfu eload `|N |`Load Ultralight .eml dump file into emulator memory` +|`hf mfu eload `|N |`Load Ultralight dump file into emulator memory` +|`hf mfu esave `|N |`Save Ultralight dump file from emulator memory` |`hf mfu eview `|N |`View emulator memory` |`hf mfu sim `|N |`Simulate MIFARE Ultralight from emulator memory` |`hf mfu setpwd `|N |`Set 3DES key - Ultralight-C` @@ -971,6 +976,7 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`lf indala help `|Y |`This help` +|`lf indala brute `|N |`Demodulate an Indala tag (PSK1) from the GraphBuffer` |`lf indala demod `|Y |`Demodulate an Indala tag (PSK1) from the GraphBuffer` |`lf indala altdemod `|Y |`Alternative method to demodulate samples for Indala 64 bit UID (option '224' for 224 bit)` |`lf indala reader `|N |`Read an Indala tag from the antenna` @@ -1328,6 +1334,20 @@ Check column "offline" for their availability. |`nfc barcode help `|Y |`This help` +### piv + + { PIV commands... } + +|command |offline |description +|------- |------- |----------- +|`piv help `|Y |`This help` +|`piv select `|N |`Select the PIV applet` +|`piv getdata `|N |`Gets a container on a PIV card` +|`piv authsign `|N |`Authenticate with the card` +|`piv scan `|N |`Scan PIV card for known containers` +|`piv list `|Y |`List ISO7816 history` + + ### reveng { CRC calculations from RevEng software... } diff --git a/tools/cryptorf/sma_multi.cpp b/tools/cryptorf/sma_multi.cpp index c4e61e37e..50b962248 100644 --- a/tools/cryptorf/sma_multi.cpp +++ b/tools/cryptorf/sma_multi.cpp @@ -165,7 +165,7 @@ void print_cs(const char *text, pcs s) { } static inline uint8_t mod(uint8_t a, uint8_t m) { - if (m==0) { + if (m == 0) { return 0; // Actually, divide by zero error } // Just return the input when this is less or equal than the modular value From ad87e2051dba66ff2df7d20bac86cb845dfb0e22 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:33:56 +0100 Subject: [PATCH 097/924] build_all_firmwares.sh able to build HF_14ASNIFF HF_15SNIFF without flash --- armsrc/Standalone/Makefile.hal | 2 +- tools/build_all_firmwares.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index afd144e5d..5d571fa74 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -125,7 +125,7 @@ STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4 STANDALONE_MODES += HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI STANDALONE_MODES_REQ_BT := HF_REBLAY STANDALONE_MODES_REQ_SMARTCARD := -STANDALONE_MODES_REQ_FLASH := LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG HF_COLIN HF_ICECLASS HF_MFCSIM HF_LEGICSIM +STANDALONE_MODES_REQ_FLASH := LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG HF_COLIN HF_ICECLASS HF_LEGICSIM HF_MFCSIM ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES)),) STANDALONE_PLATFORM_DEFS += -DWITH_STANDALONE_$(STANDALONE) ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES_REQ_SMARTCARD)),) diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index a0ef2e1dd..c6bb8969d 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -34,7 +34,7 @@ STANDALONE_MODES=(LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM410 STANDALONE_MODES+=(HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI) STANDALONE_MODES_REQ_BT=(HF_REBLAY) STANDALONE_MODES_REQ_SMARTCARD=() -STANDALONE_MODES_REQ_FLASH=(LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_14ASNIFF HF_15SNIFF HF_BOG HF_COLIN HF_ICECLASS HF_LEGICSIM HF_MFCSIM) +STANDALONE_MODES_REQ_FLASH=(LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG HF_COLIN HF_ICECLASS HF_LEGICSIM HF_MFCSIM) # PM3GENERIC 256kb, no flash, need to skip some parts to reduce size From c2546d35f81ad8096616fc2fc200cd5930397fa8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:40:58 +0100 Subject: [PATCH 098/924] experimental_lib/CMakeLists missing files --- client/CMakeLists.txt | 2 +- client/experimental_lib/CMakeLists.txt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 1622190f9..5519b2e77 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -293,9 +293,9 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdhfseos.c ${PM3_ROOT}/client/src/cmdhfst.c ${PM3_ROOT}/client/src/cmdhfst25ta.c + ${PM3_ROOT}/client/src/cmdhftexkom.c ${PM3_ROOT}/client/src/cmdhfthinfilm.c ${PM3_ROOT}/client/src/cmdhftopaz.c - ${PM3_ROOT}/client/src/cmdhftexkom.c ${PM3_ROOT}/client/src/cmdhfwaveshare.c ${PM3_ROOT}/client/src/cmdhfxerox.c ${PM3_ROOT}/client/src/cmdhw.c diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 5c64fd135..3855d6884 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -276,6 +276,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdhfepa.c ${PM3_ROOT}/client/src/cmdhffelica.c ${PM3_ROOT}/client/src/cmdhffido.c + ${PM3_ROOT}/client/src/cmdhffudan.c ${PM3_ROOT}/client/src/cmdhfgallagher.c ${PM3_ROOT}/client/src/cmdhfcipurse.c ${PM3_ROOT}/client/src/cmdhficlass.c @@ -293,9 +294,11 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdhfseos.c ${PM3_ROOT}/client/src/cmdhfst.c ${PM3_ROOT}/client/src/cmdhfst25ta.c + ${PM3_ROOT}/client/src/cmdhftexkom.c ${PM3_ROOT}/client/src/cmdhfthinfilm.c ${PM3_ROOT}/client/src/cmdhftopaz.c ${PM3_ROOT}/client/src/cmdhfwaveshare.c + ${PM3_ROOT}/client/src/cmdhfxerox.c ${PM3_ROOT}/client/src/cmdhw.c ${PM3_ROOT}/client/src/cmdlf.c ${PM3_ROOT}/client/src/cmdlfawid.c @@ -334,6 +337,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdmain.c ${PM3_ROOT}/client/src/cmdnfc.c ${PM3_ROOT}/client/src/cmdparser.c + ${PM3_ROOT}/client/src/cmdpiv.c ${PM3_ROOT}/client/src/cmdscript.c ${PM3_ROOT}/client/src/cmdsmartcard.c ${PM3_ROOT}/client/src/cmdtrace.c From fe286ed6d76e866baeaa3bddc15ec4b16a8a2014 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 02:50:16 +0100 Subject: [PATCH 099/924] remove Android from release checklist --- .github/ISSUE_TEMPLATE/checklist-for-release.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/checklist-for-release.md b/.github/ISSUE_TEMPLATE/checklist-for-release.md index 514b454d7..437a673b4 100644 --- a/.github/ISSUE_TEMPLATE/checklist-for-release.md +++ b/.github/ISSUE_TEMPLATE/checklist-for-release.md @@ -18,7 +18,6 @@ assignees: doegox, iceman1001 - [ ] `tools/build_all_firmwares.sh` check that the script contains all standalone modes then compile all standalone modes (linux only) - [ ] `experimental_lib` compilation & tests - [ ] `experimental_client_with_swig` compilation & tests -- [ ] Check Android `CMakeLists.txt` list of source file - [ ] GitHub Actions - green across the board ( MacOS, Ubuntu, Windows) # OS compilation and tests From e995a25ec5292aec6c3225e298364b6df5c1c973 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 15 Jan 2023 05:37:43 +0100 Subject: [PATCH 100/924] fix warning on termux --- common/mbedtls/bignum.c | 1 + 1 file changed, 1 insertion(+) diff --git a/common/mbedtls/bignum.c b/common/mbedtls/bignum.c index 9b7bcdd1c..200ad7ca0 100644 --- a/common/mbedtls/bignum.c +++ b/common/mbedtls/bignum.c @@ -1442,6 +1442,7 @@ __attribute__((noinline)) #endif void mpi_mul_hlp(size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b) { mbedtls_mpi_uint c = 0, t = 0; + (void)t; #if defined(MULADDC_HUIT) for (; i >= 8; i -= 8) { From 207d8ed7d7110855da7b5ad421d58c1060a90f6b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 12:11:31 +0100 Subject: [PATCH 101/924] Fix INSTALLSUDO usage and adapt release template --- .github/ISSUE_TEMPLATE/checklist-for-release.md | 5 +++-- Makefile | 8 ++++---- Makefile.defs | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/checklist-for-release.md b/.github/ISSUE_TEMPLATE/checklist-for-release.md index 437a673b4..cfc7c9abd 100644 --- a/.github/ISSUE_TEMPLATE/checklist-for-release.md +++ b/.github/ISSUE_TEMPLATE/checklist-for-release.md @@ -25,17 +25,18 @@ assignees: doegox, iceman1001 ```bash #!/usr/bin/env bash +set -x make clean && make -j PLATFORM=PM3GENERIC PLATFORM_EXTRAS= && tools/pm3_tests.sh --long || exit 1 make clean && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS= || exit 1 make clean && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON || exit 1 -make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON && sudo make install PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON && ( cd /tmp; proxmark3 -c 'data load -f lf_EM4x05.pm3;lf search -1'|grep 'Valid FDX-B ID found' ) && sudo make uninstall || exit 1 - +make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON && INSTALLSUDO=sudo make install PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON && ( cd /tmp; proxmark3 -c 'data load -f lf_EM4x05.pm3;lf search -1'|grep 'Valid FDX-B ID found' ) && INSTALLSUDO=sudo make uninstall || exit 1 ( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3GENERIC PLATFORM_EXTRAS= && cp -a ../*scripts ../*libs . && ../../tools/pm3_tests.sh --clientbin $(pwd)/proxmark3 client ) || exit 1 ( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS= ) || exit 1 ( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON ) || exit 1 # Hitag2crack, optionally with --long and --opencl ... make hitag2crack/clean && make hitag2crack && tools/pm3_tests.sh hitag2crack || exit 1 +echo PASS ``` - [ ] RPI Zero diff --git a/Makefile b/Makefile index 5452842cc..0cb778ec6 100644 --- a/Makefile +++ b/Makefile @@ -80,20 +80,20 @@ ifneq (,$(INSTALLSHARES)) endif ifneq (,$(INSTALLDOCS)) $(Q)$(INSTALLSUDO) $(RMDIR) $(foreach doc,$(INSTALLDOCS),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH)$(PATHSEP)$(notdir $(doc))) - $(Q)$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH) + $(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH) endif ifneq (,$(INSTALLTOOLS)) $(Q)$(INSTALLSUDO) $(RM) $(foreach tool,$(INSTALLTOOLS),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH)$(PATHSEP)$(notdir $(tool))) endif - $(Q)$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH) + $(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH) ifneq (,$(INSTALLSIMFW)) $(Q)$(INSTALLSUDO) $(RM) $(foreach fw,$(INSTALLSIMFW),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)$(PATHSEP)$(notdir $(fw))) endif - $(Q)$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH) + $(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH) ifeq ($(platform),Linux) $(Q)$(INSTALLSUDO) $(RM) $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules endif - $(Q)$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH) + $(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH) # tests mfkey/check: FORCE diff --git a/Makefile.defs b/Makefile.defs index 8f9d5f271..bcbbaa67e 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -29,8 +29,8 @@ GZIP = gzip MKDIR = mkdir -p RM = rm -f RMDIR = rm -rf -# rmdir only if dir is empty, tolerate failure -RMDIR_SOFT = -rmdir +# rmdir only if dir is empty, you must add "-" when using it to tolerate failure +RMDIR_SOFT = rmdir MV = mv TOUCH = touch FALSE = false From 875b1a0aed3304285cbbd7e517db201e07a76f51 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 15 Jan 2023 12:27:34 +0100 Subject: [PATCH 102/924] annotate new magic command (WIP) --- client/src/cmdhflist.c | 12 ++++++++++++ include/protocols.h | 3 +++ 2 files changed, 15 insertions(+) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 5a82db29e..a19ecdea9 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -318,6 +318,18 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "AUTH-B(%d)", cmd[1]); break; } + case MIFARE_MAGIC_GDM_AUTH_KEYA:{ + if (cmdsize > 3) { + snprintf(exp, size, "MAGIC AUTH-A(%d)", cmd[1]); + MifareAuthState = masNt; + } + break; + } + case MIFARE_MAGIC_GDM_AUTH_KEYB: { + MifareAuthState = masNt; + snprintf(exp, size, "MAGIC AUTH-B(%d)", cmd[1]); + break; + } case MIFARE_MAGICWUPC1: snprintf(exp, size, "MAGIC WUPC1"); break; diff --git a/include/protocols.h b/include/protocols.h index 9de07e4e7..1417fa71a 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -190,6 +190,9 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MIFARE_CMD_RESTORE 0xC2 #define MIFARE_CMD_TRANSFER 0xB0 +#define MIFARE_MAGIC_GDM_AUTH_KEYA 0x80 +#define MIFARE_MAGIC_GDM_AUTH_KEYB 0x81 + #define MIFARE_EV1_PERSONAL_UID 0x40 #define MIFARE_EV1_SETMODE 0x43 #define MIFARE_EV1_UIDF0 0x00 From 834c182d63cbb74061c9821585ae0b1c09c4f4ea Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 15 Jan 2023 14:07:17 +0100 Subject: [PATCH 103/924] more intuitive text --- armsrc/appmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 756ca4f4f..76d9ac3c0 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -345,7 +345,7 @@ static void print_debug_level(void) { char dbglvlstr[20] = {0}; switch (g_dbglevel) { case DBG_NONE: - sprintf(dbglvlstr, "none"); + sprintf(dbglvlstr, "off"); break; case DBG_ERROR: sprintf(dbglvlstr, "error"); From 8f2362e7b0cc8ba72f9084cdcb7f81580617c876 Mon Sep 17 00:00:00 2001 From: Krzysztof Zdulski Date: Sun, 15 Jan 2023 16:33:32 +0100 Subject: [PATCH 104/924] Fix mifare classic dump when block cannot be read --- client/src/cmdhfmf.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 11d101391..b98f21c01 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1044,11 +1044,9 @@ static int CmdHF14AMfDump(const char *Cmd) { PrintAndLogEx(SUCCESS, "successfully read block %2d of sector %2d.", blockNo, sectorNo); } else { PrintAndLogEx(FAILED, "could not read block %2d of sector %2d", blockNo, sectorNo); - break; } } else { PrintAndLogEx(WARNING, "command execute timeout when trying to read block %2d of sector %2d.", blockNo, sectorNo); - break; } } } From 8d53184c816b49676a844987e4793609f9e8a16b Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 18:45:40 +0100 Subject: [PATCH 105/924] shorter long test for mfd_aes_brute --- tools/pm3_tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index a39615cb6..d03e488e6 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -293,7 +293,7 @@ while true; do echo -e "\n${C_BLUE}Testing mfd_aes_brute:${C_NC} ${MFDASEBRUTEBIN:=./tools/mfd_aes_brute/mfd_aes_brute}" if ! CheckFileExist "mfd_aes_brute exists" "$MFDASEBRUTEBIN"; then break; fi if ! CheckExecute "mfd_aes_brute test 1/2" "$MFDASEBRUTEBIN 1605394800 bb6aea729414a5b1eff7b16328ce37fd 82f5f498dbc29f7570102397a2e5ef2b6dc14a864f665b3c54d11765af81e95c" "key.................... .*261C07A23F2BC8262F69F10A5BDF3764"; then break; fi - if ! CheckExecute slow "mfd_aes_brute test 2/2" "$MFDASEBRUTEBIN 1136073600 3fda933e2953ca5e6cfbbf95d1b51ddf 97fe4b5de24188458d102959b888938c988e96fb98469ce7426f50f108eaa583" "key.................... .*E757178E13516A4F3171BC6EA85E165A"; then break; fi + if ! CheckExecute slow "mfd_aes_brute test 2/2" "$MFDASEBRUTEBIN 1546300800 3fda933e2953ca5e6cfbbf95d1b51ddf 97fe4b5de24188458d102959b888938c988e96fb98469ce7426f50f108eaa583" "key.................... .*E757178E13516A4F3171BC6EA85E165A"; then break; fi fi # hitag2crack not yet part of "all" # if $TESTALL || $TESTHITAG2CRACK; then From f54dd925d164075159dbdaa6240a87c54ded2213 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 18:46:14 +0100 Subject: [PATCH 106/924] docker & tests --- .../ISSUE_TEMPLATE/checklist-for-release.md | 17 +---------- docker/archlinux/Dockerfile | 3 ++ docker/archlinux/README.md | 8 ++--- docker/archlinux/run_tests.sh | 17 +---------- docker/debian-bullseye/Dockerfile | 4 +++ docker/debian-bullseye/README.md | 11 ++++--- docker/debian-bullseye/run_tests.sh | 8 +++++ docker/kali/Dockerfile | 10 +++++-- docker/kali/README.md | 11 ++++--- docker/kali/run_tests.sh | 30 ++----------------- tools/release_tests.sh | 15 ++++++++++ 11 files changed, 55 insertions(+), 79 deletions(-) create mode 100755 docker/debian-bullseye/run_tests.sh create mode 100755 tools/release_tests.sh diff --git a/.github/ISSUE_TEMPLATE/checklist-for-release.md b/.github/ISSUE_TEMPLATE/checklist-for-release.md index cfc7c9abd..5deb64538 100644 --- a/.github/ISSUE_TEMPLATE/checklist-for-release.md +++ b/.github/ISSUE_TEMPLATE/checklist-for-release.md @@ -22,22 +22,7 @@ assignees: doegox, iceman1001 # OS compilation and tests -```bash -#!/usr/bin/env bash - -set -x -make clean && make -j PLATFORM=PM3GENERIC PLATFORM_EXTRAS= && tools/pm3_tests.sh --long || exit 1 -make clean && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS= || exit 1 -make clean && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON || exit 1 -make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON && INSTALLSUDO=sudo make install PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON && ( cd /tmp; proxmark3 -c 'data load -f lf_EM4x05.pm3;lf search -1'|grep 'Valid FDX-B ID found' ) && INSTALLSUDO=sudo make uninstall || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3GENERIC PLATFORM_EXTRAS= && cp -a ../*scripts ../*libs . && ../../tools/pm3_tests.sh --clientbin $(pwd)/proxmark3 client ) || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS= ) || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON ) || exit 1 - -# Hitag2crack, optionally with --long and --opencl ... -make hitag2crack/clean && make hitag2crack && tools/pm3_tests.sh hitag2crack || exit 1 -echo PASS -``` +Run `tools/release_tests.sh` on: - [ ] RPI Zero - [ ] Jetson Nano diff --git a/docker/archlinux/Dockerfile b/docker/archlinux/Dockerfile index 709b7b5d4..93584c098 100644 --- a/docker/archlinux/Dockerfile +++ b/docker/archlinux/Dockerfile @@ -10,6 +10,9 @@ RUN pacman -S --noconfirm sudo git base-devel cmake libusb readline bzip2 arm-no RUN pacman -S --noconfirm python-pip RUN python3 -m pip install ansicolors sslcrypto +# OpenCL for hitag2crack +RUN pacman -S --noconfirm ocl-icd + # Create rrg user RUN useradd -ms /bin/bash rrg RUN passwd -d rrg diff --git a/docker/archlinux/README.md b/docker/archlinux/README.md index 35fdf0c78..872d46cb4 100644 --- a/docker/archlinux/README.md +++ b/docker/archlinux/README.md @@ -32,18 +32,18 @@ This script does both setup the mirrors and pip install and then run a bunch of different builds with make and cmake together with the different combos of RDV4, GENERIC, BTADDON combos. -If all tests OK, the script will finish. +If all tests OK, the script will finish with PASS. # Notes to run tests -Add first the mirrors, see above, if needed. +Add first the mirrors, see above, if needed. The release test build script is to be run in proxmark root folder inside the docker env. ``` docker/archlinux/run_tests.sh; -``` +``` -Or if you want to run single test, +Or if you want to run single test, ``` make clean; make -j diff --git a/docker/archlinux/run_tests.sh b/docker/archlinux/run_tests.sh index 9c2b4daeb..53eeda9a3 100755 --- a/docker/archlinux/run_tests.sh +++ b/docker/archlinux/run_tests.sh @@ -2,7 +2,6 @@ # Iceman 2022 # # This script is to be run from proxmark root folder inside the docker env -# cd proxmark; # docker/archlinux/run_tests.sh; # # Script contains two phases. @@ -40,18 +39,4 @@ pacman -Ss '^gcc$' # sudo pacman -S testing/gcc # sudo pacman -S gcc -# replace egrep to silence warning -sed -i 's/egrep/grep -E/g' tools/pm3_tests.sh - -# Makefile build tests -make clean; make -j PLATFORM=PM3GENERIC; tools/pm3_tests.sh --long || exit 1 -make clean; make -j PLATFORM=PM3RDV4; tools/pm3_tests.sh --long || exit 1 -make clean; make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON; tools/pm3_tests.sh --long || exit 1 -# sudo make install; pushd /tmp; proxmark3 -c 'data load -f lf_EM4x05.pm3;lf search -1'; popd; sudo make uninstall - -# cmake client build test -#( cd client; rm -rf build; mkdir build;cd build;cmake ..;make -j ); PM3BIN=./client/build/proxmark3 tools/pm3_tests.sh client --long || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake ..;make -j PLATFORM=PM3GENERIC ); PM3BIN=./client/build/proxmark3 tools/pm3_tests.sh client --long || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake ..;make -j PLATFORM=PM3RDV4 ); PM3BIN=./client/build/proxmark3 tools/pm3_tests.sh client --long || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake ..;make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON ); PM3BIN=./client/build/proxmark3 tools/pm3_tests.sh client || exit 1 - +tools/release_tests.sh diff --git a/docker/debian-bullseye/Dockerfile b/docker/debian-bullseye/Dockerfile index 53114b795..ff456b558 100644 --- a/docker/debian-bullseye/Dockerfile +++ b/docker/debian-bullseye/Dockerfile @@ -11,8 +11,12 @@ RUN apt-get update && \ RUN apt-get install -y python3-minimal && \ apt-get install -y python3-pip && \ + apt-get clean && \ python3 -m pip install ansicolors sslcrypto +RUN apt-get install -y opencl-dev && \ + apt-get clean + # Create rrg user RUN useradd -ms /bin/bash rrg RUN passwd -d rrg diff --git a/docker/debian-bullseye/README.md b/docker/debian-bullseye/README.md index 1170c19fe..e86881019 100644 --- a/docker/debian-bullseye/README.md +++ b/docker/debian-bullseye/README.md @@ -1,9 +1,8 @@ # Notes on run_tests.sh script -This script does both setup the mirrors and pip install and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. -If all tests OK, the script will finish. +If all tests OK, the script will finish with PASS. # Notes to run tests @@ -11,9 +10,9 @@ The script is to be run in proxmark root folder inside the docker env. ``` docker/debian-bullseye/run_tests.sh; -``` +``` -Or if you want to run single test, +Or if you want to run single test, ``` sudo apt update diff --git a/docker/debian-bullseye/run_tests.sh b/docker/debian-bullseye/run_tests.sh new file mode 100755 index 000000000..25e6d2a21 --- /dev/null +++ b/docker/debian-bullseye/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/debian-bullseye/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +tools/release_tests.sh diff --git a/docker/kali/Dockerfile b/docker/kali/Dockerfile index e8a506dc5..79d4bb9a6 100644 --- a/docker/kali/Dockerfile +++ b/docker/kali/Dockerfile @@ -9,9 +9,13 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean -RUN apt install -y python3-minimal -RUN apt install -y python3-pip -RUN python3 -m pip install ansicolors sslcrypto +RUN apt-get install -y python3-minimal && \ + apt-get install -y python3-pip && \ + apt-get clean && \ + python3 -m pip install ansicolors sslcrypto + +RUN apt-get install -y opencl-dev && \ + apt-get clean # Create rrg user RUN useradd -ms /bin/bash rrg diff --git a/docker/kali/README.md b/docker/kali/README.md index e76d73ae2..dbf1f7f50 100644 --- a/docker/kali/README.md +++ b/docker/kali/README.md @@ -1,9 +1,8 @@ # Notes on run_tests.sh script -This script does both setup the mirrors and pip install and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. -If all tests OK, the script will finish. +If all tests OK, the script will finish with PASS. # Notes to run tests @@ -11,9 +10,9 @@ The script is to be run in proxmark root folder inside the docker env. ``` docker/kali/run_tests.sh; -``` +``` -Or if you want to run single test, +Or if you want to run single test, ``` sudo apt update make clean; make -j diff --git a/docker/kali/run_tests.sh b/docker/kali/run_tests.sh index 27b1c608f..dec20763b 100755 --- a/docker/kali/run_tests.sh +++ b/docker/kali/run_tests.sh @@ -2,33 +2,7 @@ # Iceman 2022 # # This script is to be run from proxmark root folder inside the docker env -# cd proxmark; -# docker/archlinux/run_tests.sh; -# -# Script contains two phases. -# -# -- Init / setup phase -# Script to be run inside docker env. First install some dependencies for docker image. -# -# -- Build phase begins -# make builds -# cmake client builds -# of the different possible PLATFORM (PM3RDV4 / PM3GENERIC) and BTADDON combos +# docker/kali/run_tests.sh; sudo apt update && sudo apt upgrade -y - -# replace egrep to silence warning -sed -i 's/egrep/grep -E/g' tools/pm3_tests.sh - -# Makefile build tests -make clean; make -j PLATFORM=PM3GENERIC; tools/pm3_tests.sh --long || exit 1 -make clean; make -j PLATFORM=PM3RDV4; tools/pm3_tests.sh --long || exit 1 -make clean; make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON; tools/pm3_tests.sh --long || exit 1 -# sudo make install; pushd /tmp; proxmark3 -c 'data load -f lf_EM4x05.pm3;lf search -1'; popd; sudo make uninstall - -# cmake client build test -#( cd client; rm -rf build; mkdir build;cd build;cmake ..;make -j ); PM3BIN=./client/build/proxmark3 tools/pm3_tests.sh client --long || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake ..;make -j PLATFORM=PM3GENERIC ); PM3BIN=./client/build/proxmark3 tools/pm3_tests.sh client --long || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake ..;make -j PLATFORM=PM3RDV4 ); PM3BIN=./client/build/proxmark3 tools/pm3_tests.sh client --long || exit 1 -( cd client; rm -rf build; mkdir build;cd build;cmake ..;make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON ); PM3BIN=./client/build/proxmark3 tools/pm3_tests.sh client || exit 1 - +tools/release_tests.sh diff --git a/tools/release_tests.sh b/tools/release_tests.sh new file mode 100755 index 000000000..728e546f3 --- /dev/null +++ b/tools/release_tests.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# To be run from proxmark3 root directory +set -x +make clean && make -j PLATFORM=PM3GENERIC PLATFORM_EXTRAS= && tools/pm3_tests.sh --long || exit 1 +make clean && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS= || exit 1 +make clean && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON || exit 1 +make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON && INSTALLSUDO=sudo make install PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON && ( cd /tmp; proxmark3 -c 'data load -f lf_EM4x05.pm3;lf search -1'|grep 'Valid FDX-B ID found' ) && INSTALLSUDO=sudo make uninstall || exit 1 +( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3GENERIC PLATFORM_EXTRAS= && cp -a ../*scripts ../*libs . && ../../tools/pm3_tests.sh --clientbin $(pwd)/proxmark3 client ) || exit 1 +( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS= ) || exit 1 +( cd client; rm -rf build; mkdir build;cd build;cmake .. && make -j PLATFORM=PM3RDV4 PLATFORM_EXTRAS=BTADDON ) || exit 1 + +# Hitag2crack, optionally with --long and --opencl... +make hitag2crack/clean && make hitag2crack && tools/pm3_tests.sh hitag2crack || exit 1 +echo PASS From 65d0e1ef0614d020f4951bcf36f3e7f9c93785ee Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 19:40:52 +0100 Subject: [PATCH 107/924] update docker ubuntu --- .../ISSUE_TEMPLATE/checklist-for-release.md | 2 +- docker/ubuntu-18.04/Dockerfile | 8 +++++-- docker/ubuntu-18.04/README.md | 7 +++---- docker/ubuntu-18.04/run_tests.sh | 8 +++++++ docker/ubuntu-20.04/Dockerfile | 8 +++++-- docker/ubuntu-20.04/README.md | 7 +++---- docker/ubuntu-20.04/run_tests.sh | 8 +++++++ docker/ubuntu-21.04/README.md | 21 ------------------- docker/ubuntu-21.04/docker_build.sh | 3 --- docker/ubuntu-21.04/docker_rm.sh | 4 ---- .../{ubuntu-21.04 => ubuntu-22.04}/Dockerfile | 10 ++++++--- docker/ubuntu-22.04/README.md | 20 ++++++++++++++++++ docker/ubuntu-22.04/docker_build.sh | 3 +++ docker/ubuntu-22.04/docker_rm.sh | 4 ++++ .../docker_run.sh | 2 +- docker/ubuntu-22.04/run_tests.sh | 8 +++++++ 16 files changed, 78 insertions(+), 45 deletions(-) create mode 100755 docker/ubuntu-18.04/run_tests.sh create mode 100755 docker/ubuntu-20.04/run_tests.sh delete mode 100644 docker/ubuntu-21.04/README.md delete mode 100755 docker/ubuntu-21.04/docker_build.sh delete mode 100644 docker/ubuntu-21.04/docker_rm.sh rename docker/{ubuntu-21.04 => ubuntu-22.04}/Dockerfile (76%) create mode 100644 docker/ubuntu-22.04/README.md create mode 100755 docker/ubuntu-22.04/docker_build.sh create mode 100644 docker/ubuntu-22.04/docker_rm.sh rename docker/{ubuntu-21.04 => ubuntu-22.04}/docker_run.sh (67%) create mode 100755 docker/ubuntu-22.04/run_tests.sh diff --git a/.github/ISSUE_TEMPLATE/checklist-for-release.md b/.github/ISSUE_TEMPLATE/checklist-for-release.md index 5deb64538..a30b2fb22 100644 --- a/.github/ISSUE_TEMPLATE/checklist-for-release.md +++ b/.github/ISSUE_TEMPLATE/checklist-for-release.md @@ -32,7 +32,7 @@ Run `tools/release_tests.sh` on: - [ ] Kali - [ ] Debian Stable - [ ] Debian Testing -- [ ] Ubuntu21 +- [ ] Ubuntu 22 - [ ] ParrotOS - [ ] Fedora - [ ] OpenSuse Leap diff --git a/docker/ubuntu-18.04/Dockerfile b/docker/ubuntu-18.04/Dockerfile index 11c5afcd8..29c958a4d 100644 --- a/docker/ubuntu-18.04/Dockerfile +++ b/docker/ubuntu-18.04/Dockerfile @@ -10,10 +10,14 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libssl-dev sudo && \ apt-get clean -RUN apt install -y python3-minimal && \ - apt install -y python3-pip && \ +RUN apt-get install -y python3-minimal && \ + apt-get install -y python3-pip && \ + apt-get clean && \ python3 -m pip install ansicolors sslcrypto +RUN apt-get install -y opencl-dev && \ + apt-get clean + # Create rrg user RUN useradd -ms /bin/bash rrg RUN passwd -d rrg diff --git a/docker/ubuntu-18.04/README.md b/docker/ubuntu-18.04/README.md index 0b7d2f748..6cc3b9ef2 100644 --- a/docker/ubuntu-18.04/README.md +++ b/docker/ubuntu-18.04/README.md @@ -1,9 +1,8 @@ # Notes on run_tests.sh script -This script does both setup the mirrors and pip install and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. -If all tests OK, the script will finish. +If all tests OK, the script will finish with PASS. # Notes to run tests diff --git a/docker/ubuntu-18.04/run_tests.sh b/docker/ubuntu-18.04/run_tests.sh new file mode 100755 index 000000000..25e6d2a21 --- /dev/null +++ b/docker/ubuntu-18.04/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/debian-bullseye/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +tools/release_tests.sh diff --git a/docker/ubuntu-20.04/Dockerfile b/docker/ubuntu-20.04/Dockerfile index d9138aa0d..72f6ec6cf 100644 --- a/docker/ubuntu-20.04/Dockerfile +++ b/docker/ubuntu-20.04/Dockerfile @@ -9,10 +9,14 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean -RUN apt install -y python3-minimal && \ - apt install -y python3-pip && \ +RUN apt-get install -y python3-minimal && \ + apt-get install -y python3-pip && \ + apt-get clean && \ python3 -m pip install ansicolors sslcrypto +RUN apt-get install -y opencl-dev && \ + apt-get clean + # Create rrg user RUN useradd -ms /bin/bash rrg RUN passwd -d rrg diff --git a/docker/ubuntu-20.04/README.md b/docker/ubuntu-20.04/README.md index d8c7b3f53..4c432eff1 100644 --- a/docker/ubuntu-20.04/README.md +++ b/docker/ubuntu-20.04/README.md @@ -1,9 +1,8 @@ # Notes on run_tests.sh script -This script does both setup the mirrors and pip install and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. -If all tests OK, the script will finish. +If all tests OK, the script will finish with PASS. # Notes to run tests diff --git a/docker/ubuntu-20.04/run_tests.sh b/docker/ubuntu-20.04/run_tests.sh new file mode 100755 index 000000000..25e6d2a21 --- /dev/null +++ b/docker/ubuntu-20.04/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/debian-bullseye/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +tools/release_tests.sh diff --git a/docker/ubuntu-21.04/README.md b/docker/ubuntu-21.04/README.md deleted file mode 100644 index bb90abab8..000000000 --- a/docker/ubuntu-21.04/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Notes on run_tests.sh script -This script does both setup the mirrors and pip install and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. - -If all tests OK, the script will finish. - - -# Notes to run tests -The script is to be run in proxmark root folder inside the docker env. - -``` -docker/ubuntu-21.04/run_tests.sh; -``` - -Or if you want to run single test, -``` -sudo apt update -make clean; make -j -tools/pm3_tests.sh --long -``` diff --git a/docker/ubuntu-21.04/docker_build.sh b/docker/ubuntu-21.04/docker_build.sh deleted file mode 100755 index 70e0349f8..000000000 --- a/docker/ubuntu-21.04/docker_build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -docker build -t "pm3-ubuntu-21.04:1.0" . diff --git a/docker/ubuntu-21.04/docker_rm.sh b/docker/ubuntu-21.04/docker_rm.sh deleted file mode 100644 index bb848bfe0..000000000 --- a/docker/ubuntu-21.04/docker_rm.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -docker image rm pm3-ubuntu-21.04:1.0 -docker image rm ubuntu:21.04 diff --git a/docker/ubuntu-21.04/Dockerfile b/docker/ubuntu-22.04/Dockerfile similarity index 76% rename from docker/ubuntu-21.04/Dockerfile rename to docker/ubuntu-22.04/Dockerfile index 4350e8aa3..9d867e785 100644 --- a/docker/ubuntu-21.04/Dockerfile +++ b/docker/ubuntu-22.04/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:21.04 +FROM ubuntu:22.04 ENV LANG C ENV DEBIAN_FRONTEND noninteractive @@ -9,10 +9,14 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean -RUN apt install -y python3-minimal && \ - apt install -y python3-pip && \ +RUN apt-get install -y python3-minimal && \ + apt-get install -y python3-pip && \ + apt-get clean && \ python3 -m pip install ansicolors sslcrypto +RUN apt-get install -y opencl-dev && \ + apt-get clean + # Create rrg user RUN useradd -ms /bin/bash rrg RUN passwd -d rrg diff --git a/docker/ubuntu-22.04/README.md b/docker/ubuntu-22.04/README.md new file mode 100644 index 000000000..93d4462ad --- /dev/null +++ b/docker/ubuntu-22.04/README.md @@ -0,0 +1,20 @@ +# Notes on run_tests.sh script +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. + +If all tests OK, the script will finish with PASS. + + +# Notes to run tests +The script is to be run in proxmark root folder inside the docker env. + +``` +docker/ubuntu-22.04/run_tests.sh; +``` + +Or if you want to run single test, +``` +sudo apt update +make clean; make -j +tools/pm3_tests.sh --long +``` diff --git a/docker/ubuntu-22.04/docker_build.sh b/docker/ubuntu-22.04/docker_build.sh new file mode 100755 index 000000000..1cfd6c10a --- /dev/null +++ b/docker/ubuntu-22.04/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-ubuntu-22.04:1.0" . diff --git a/docker/ubuntu-22.04/docker_rm.sh b/docker/ubuntu-22.04/docker_rm.sh new file mode 100644 index 000000000..e6a5f0302 --- /dev/null +++ b/docker/ubuntu-22.04/docker_rm.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker image rm pm3-ubuntu-22.04:1.0 +docker image rm ubuntu:22.04 diff --git a/docker/ubuntu-21.04/docker_run.sh b/docker/ubuntu-22.04/docker_run.sh similarity index 67% rename from docker/ubuntu-21.04/docker_run.sh rename to docker/ubuntu-22.04/docker_run.sh index d8fd6722f..04f8d99a0 100755 --- a/docker/ubuntu-21.04/docker_run.sh +++ b/docker/ubuntu-22.04/docker_run.sh @@ -1,3 +1,3 @@ #!/bin/bash -docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -w /home/rrg/proxmark3 -it pm3-ubuntu-21.04:1.0 +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -w /home/rrg/proxmark3 -it pm3-ubuntu-22.04:1.0 diff --git a/docker/ubuntu-22.04/run_tests.sh b/docker/ubuntu-22.04/run_tests.sh new file mode 100755 index 000000000..25e6d2a21 --- /dev/null +++ b/docker/ubuntu-22.04/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/debian-bullseye/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +tools/release_tests.sh From cb8f1a51adc21f18bf09291a24fbf2abc48ee6cb Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 19:54:56 +0100 Subject: [PATCH 108/924] update parrot docker tests --- docker/parrot-core-latest/Dockerfile | 8 ++++++-- docker/parrot-core-latest/README.md | 11 +++++------ docker/parrot-core-latest/run_tests.sh | 8 ++++++++ docker/ubuntu-18.04/run_tests.sh | 2 +- docker/ubuntu-20.04/run_tests.sh | 2 +- docker/ubuntu-22.04/run_tests.sh | 2 +- 6 files changed, 22 insertions(+), 11 deletions(-) create mode 100755 docker/parrot-core-latest/run_tests.sh diff --git a/docker/parrot-core-latest/Dockerfile b/docker/parrot-core-latest/Dockerfile index 8ca8f9856..a33af1d4c 100644 --- a/docker/parrot-core-latest/Dockerfile +++ b/docker/parrot-core-latest/Dockerfile @@ -9,10 +9,14 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean -RUN apt install -y python3-minimal && \ - apt install -y python3-pip && \ +RUN apt-get install -y python3-minimal && \ + apt-get install -y python3-pip && \ + apt-get clean && \ python3 -m pip install ansicolors sslcrypto +RUN apt-get install -y opencl-dev && \ + apt-get clean + # Create rrg user RUN useradd -ms /bin/bash rrg RUN passwd -d rrg diff --git a/docker/parrot-core-latest/README.md b/docker/parrot-core-latest/README.md index 45ad548df..679c3a1eb 100644 --- a/docker/parrot-core-latest/README.md +++ b/docker/parrot-core-latest/README.md @@ -1,9 +1,8 @@ # Notes on run_tests.sh script -This script does both setup the mirrors and pip install and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. -If all tests OK, the script will finish. +If all tests OK, the script will finish with PASS. # Notes to run tests @@ -11,9 +10,9 @@ The script is to be run in proxmark root folder inside the docker env. ``` docker/parrot-core-latest/run_tests.sh; -``` +``` -Or if you want to run single test, +Or if you want to run single test, ``` sudo apt update diff --git a/docker/parrot-core-latest/run_tests.sh b/docker/parrot-core-latest/run_tests.sh new file mode 100755 index 000000000..65b0737c4 --- /dev/null +++ b/docker/parrot-core-latest/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/parrot-core-latest/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +tools/release_tests.sh diff --git a/docker/ubuntu-18.04/run_tests.sh b/docker/ubuntu-18.04/run_tests.sh index 25e6d2a21..1efdbc060 100755 --- a/docker/ubuntu-18.04/run_tests.sh +++ b/docker/ubuntu-18.04/run_tests.sh @@ -2,7 +2,7 @@ # Iceman 2022 # # This script is to be run from proxmark root folder inside the docker env -# docker/debian-bullseye/run_tests.sh; +# docker/ubuntu-18.04/run_tests.sh; sudo apt update && sudo apt upgrade -y tools/release_tests.sh diff --git a/docker/ubuntu-20.04/run_tests.sh b/docker/ubuntu-20.04/run_tests.sh index 25e6d2a21..aa98bc327 100755 --- a/docker/ubuntu-20.04/run_tests.sh +++ b/docker/ubuntu-20.04/run_tests.sh @@ -2,7 +2,7 @@ # Iceman 2022 # # This script is to be run from proxmark root folder inside the docker env -# docker/debian-bullseye/run_tests.sh; +# docker/ubuntu-20.04/run_tests.sh; sudo apt update && sudo apt upgrade -y tools/release_tests.sh diff --git a/docker/ubuntu-22.04/run_tests.sh b/docker/ubuntu-22.04/run_tests.sh index 25e6d2a21..4f8ce55ea 100755 --- a/docker/ubuntu-22.04/run_tests.sh +++ b/docker/ubuntu-22.04/run_tests.sh @@ -2,7 +2,7 @@ # Iceman 2022 # # This script is to be run from proxmark root folder inside the docker env -# docker/debian-bullseye/run_tests.sh; +# docker/ubuntu-22.04/run_tests.sh; sudo apt update && sudo apt upgrade -y tools/release_tests.sh From 7e02a6457631981727c7bd8e64d929c4ac14e6a3 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 15 Jan 2023 21:53:39 +0100 Subject: [PATCH 109/924] update fedora docker tests --- .../ISSUE_TEMPLATE/checklist-for-release.md | 2 +- docker/fedora-34/README.md | 26 ------------------- docker/fedora-34/docker_build.sh | 3 --- docker/fedora-34/docker_rm.sh | 4 --- docker/fedora-35/README.md | 26 ------------------- docker/fedora-35/docker_build.sh | 3 --- docker/fedora-35/docker_rm.sh | 4 --- docker/{fedora-34 => fedora-36}/Dockerfile | 4 ++- docker/fedora-36/README.md | 21 +++++++++++++++ docker/fedora-36/docker_build.sh | 3 +++ docker/fedora-36/docker_rm.sh | 4 +++ docker/{fedora-34 => fedora-36}/docker_run.sh | 2 +- docker/fedora-36/run_tests.sh | 8 ++++++ docker/{fedora-35 => fedora-37}/Dockerfile | 4 ++- docker/fedora-37/README.md | 20 ++++++++++++++ docker/fedora-37/docker_build.sh | 3 +++ docker/fedora-37/docker_rm.sh | 4 +++ docker/{fedora-35 => fedora-37}/docker_run.sh | 2 +- docker/fedora-37/run_tests.sh | 8 ++++++ 19 files changed, 80 insertions(+), 71 deletions(-) delete mode 100644 docker/fedora-34/README.md delete mode 100755 docker/fedora-34/docker_build.sh delete mode 100644 docker/fedora-34/docker_rm.sh delete mode 100644 docker/fedora-35/README.md delete mode 100755 docker/fedora-35/docker_build.sh delete mode 100644 docker/fedora-35/docker_rm.sh rename docker/{fedora-34 => fedora-36}/Dockerfile (88%) create mode 100644 docker/fedora-36/README.md create mode 100755 docker/fedora-36/docker_build.sh create mode 100644 docker/fedora-36/docker_rm.sh rename docker/{fedora-34 => fedora-36}/docker_run.sh (69%) create mode 100755 docker/fedora-36/run_tests.sh rename docker/{fedora-35 => fedora-37}/Dockerfile (88%) create mode 100644 docker/fedora-37/README.md create mode 100755 docker/fedora-37/docker_build.sh create mode 100644 docker/fedora-37/docker_rm.sh rename docker/{fedora-35 => fedora-37}/docker_run.sh (69%) create mode 100755 docker/fedora-37/run_tests.sh diff --git a/.github/ISSUE_TEMPLATE/checklist-for-release.md b/.github/ISSUE_TEMPLATE/checklist-for-release.md index a30b2fb22..8b5872891 100644 --- a/.github/ISSUE_TEMPLATE/checklist-for-release.md +++ b/.github/ISSUE_TEMPLATE/checklist-for-release.md @@ -34,7 +34,7 @@ Run `tools/release_tests.sh` on: - [ ] Debian Testing - [ ] Ubuntu 22 - [ ] ParrotOS -- [ ] Fedora +- [ ] Fedora 37 - [ ] OpenSuse Leap - [ ] OpenSuse Tumbleweed - [ ] OSX (MacPorts) diff --git a/docker/fedora-34/README.md b/docker/fedora-34/README.md deleted file mode 100644 index 7930f99d0..000000000 --- a/docker/fedora-34/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Notes on run_tests.sh script -This script does both strip the "recover_pk test" in pm3_tests.sh and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. - -If all tests OK, the script will finish. - - -# Notes to run tests -The script is to be run in proxmark root folder inside the docker env. - -``` -docker/fedora-34/run_tests.sh; -``` - -Or if you want to run single test, - -``` -sudo yum -y update -make clean; make -j -tools/pm3_tests.sh --long -``` - -Warning, `recover_pk selftests` will fail on Fedora because they stripped down the available ECC curves in their OpenSSL. - -So just comment the "recover_pk test" \ No newline at end of file diff --git a/docker/fedora-34/docker_build.sh b/docker/fedora-34/docker_build.sh deleted file mode 100755 index 753d223a8..000000000 --- a/docker/fedora-34/docker_build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -docker build -t "pm3-fedora-34:1.0" . diff --git a/docker/fedora-34/docker_rm.sh b/docker/fedora-34/docker_rm.sh deleted file mode 100644 index eec1ba46c..000000000 --- a/docker/fedora-34/docker_rm.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -docker image rm pm3-fedora-34:1.0 -docker image rm fedora:34 diff --git a/docker/fedora-35/README.md b/docker/fedora-35/README.md deleted file mode 100644 index 966e86e7e..000000000 --- a/docker/fedora-35/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Notes on run_tests.sh script -This script does both strip the "recover_pk test" in pm3_tests.sh and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. - -If all tests OK, the script will finish. - - -# Notes to run tests -The script is to be run in proxmark root folder inside the docker env. - -``` -docker/fedora-35/run_tests.sh; -``` - -Or if you want to run single test, - -``` -sudo yum -y update -make clean; make -j -tools/pm3_tests.sh --long -``` - -Warning, `recover_pk selftests` will fail on Fedora because they stripped down the available ECC curves in their OpenSSL. - -So just comment the "recover_pk test" diff --git a/docker/fedora-35/docker_build.sh b/docker/fedora-35/docker_build.sh deleted file mode 100755 index 57eca95c0..000000000 --- a/docker/fedora-35/docker_build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -docker build -t "pm3-fedora-35:1.0" . diff --git a/docker/fedora-35/docker_rm.sh b/docker/fedora-35/docker_rm.sh deleted file mode 100644 index 100bd2690..000000000 --- a/docker/fedora-35/docker_rm.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -docker image rm pm3-fedora-35:1.0 -docker image rm fedora:35 diff --git a/docker/fedora-34/Dockerfile b/docker/fedora-36/Dockerfile similarity index 88% rename from docker/fedora-34/Dockerfile rename to docker/fedora-36/Dockerfile index 90765a515..007af68c3 100644 --- a/docker/fedora-34/Dockerfile +++ b/docker/fedora-36/Dockerfile @@ -1,4 +1,4 @@ -FROM fedora:34 +FROM fedora:36 ENV LANG C # qt5-qtbase-devel skipped @@ -8,6 +8,8 @@ RUN yum -y update RUN yum -y install cmake python-pip RUN python3 -m pip install ansicolors sslcrypto +RUN yum -y install mesa-libOpenCL ocl-icd-devel + # Create rrg user RUN useradd -ms /bin/bash rrg RUN passwd -d rrg diff --git a/docker/fedora-36/README.md b/docker/fedora-36/README.md new file mode 100644 index 000000000..6648fb28d --- /dev/null +++ b/docker/fedora-36/README.md @@ -0,0 +1,21 @@ +# Notes on run_tests.sh script +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. + +If all tests OK, the script will finish with PASS. + + +# Notes to run tests +The script is to be run in proxmark root folder inside the docker env. + +``` +docker/fedora-36/run_tests.sh; +``` + +Or if you want to run single test, + +``` +sudo yum -y update +make clean; make -j +tools/pm3_tests.sh --long +``` diff --git a/docker/fedora-36/docker_build.sh b/docker/fedora-36/docker_build.sh new file mode 100755 index 000000000..1a2e2d392 --- /dev/null +++ b/docker/fedora-36/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-fedora-36:1.0" . diff --git a/docker/fedora-36/docker_rm.sh b/docker/fedora-36/docker_rm.sh new file mode 100644 index 000000000..ea2b28809 --- /dev/null +++ b/docker/fedora-36/docker_rm.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker image rm pm3-fedora-36:1.0 +docker image rm fedora:36 diff --git a/docker/fedora-34/docker_run.sh b/docker/fedora-36/docker_run.sh similarity index 69% rename from docker/fedora-34/docker_run.sh rename to docker/fedora-36/docker_run.sh index 4be59d2c5..0e6e69925 100755 --- a/docker/fedora-34/docker_run.sh +++ b/docker/fedora-36/docker_run.sh @@ -1,3 +1,3 @@ #!/bin/bash -docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -w /home/rrg/proxmark3 -it pm3-fedora-34:1.0 +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -w /home/rrg/proxmark3 -it pm3-fedora-36:1.0 diff --git a/docker/fedora-36/run_tests.sh b/docker/fedora-36/run_tests.sh new file mode 100755 index 000000000..f4f632503 --- /dev/null +++ b/docker/fedora-36/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/fedora-36/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +tools/release_tests.sh diff --git a/docker/fedora-35/Dockerfile b/docker/fedora-37/Dockerfile similarity index 88% rename from docker/fedora-35/Dockerfile rename to docker/fedora-37/Dockerfile index 40788b62a..930767853 100644 --- a/docker/fedora-35/Dockerfile +++ b/docker/fedora-37/Dockerfile @@ -1,4 +1,4 @@ -FROM fedora:35 +FROM fedora:37 ENV LANG C # qt5-qtbase-devel skipped @@ -8,6 +8,8 @@ RUN yum -y update RUN yum -y install cmake python-pip RUN python3 -m pip install ansicolors sslcrypto +RUN yum -y install mesa-libOpenCL ocl-icd-devel + # Create rrg user RUN useradd -ms /bin/bash rrg RUN passwd -d rrg diff --git a/docker/fedora-37/README.md b/docker/fedora-37/README.md new file mode 100644 index 000000000..79c88e040 --- /dev/null +++ b/docker/fedora-37/README.md @@ -0,0 +1,20 @@ +# Notes on run_tests.sh script +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. + +If all tests OK, the script will finish with PASS. + +# Notes to run tests +The script is to be run in proxmark root folder inside the docker env. + +``` +docker/fedora-37/run_tests.sh; +``` + +Or if you want to run single test, + +``` +sudo yum -y update +make clean; make -j +tools/pm3_tests.sh --long +``` diff --git a/docker/fedora-37/docker_build.sh b/docker/fedora-37/docker_build.sh new file mode 100755 index 000000000..5e3049b68 --- /dev/null +++ b/docker/fedora-37/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-fedora-37:1.0" . diff --git a/docker/fedora-37/docker_rm.sh b/docker/fedora-37/docker_rm.sh new file mode 100644 index 000000000..a9359d0fd --- /dev/null +++ b/docker/fedora-37/docker_rm.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker image rm pm3-fedora-37:1.0 +docker image rm fedora:37 diff --git a/docker/fedora-35/docker_run.sh b/docker/fedora-37/docker_run.sh similarity index 69% rename from docker/fedora-35/docker_run.sh rename to docker/fedora-37/docker_run.sh index d2e027507..eb51525b7 100755 --- a/docker/fedora-35/docker_run.sh +++ b/docker/fedora-37/docker_run.sh @@ -1,3 +1,3 @@ #!/bin/bash -docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -w /home/rrg/proxmark3 -it pm3-fedora-35:1.0 +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -w /home/rrg/proxmark3 -it pm3-fedora-37:1.0 diff --git a/docker/fedora-37/run_tests.sh b/docker/fedora-37/run_tests.sh new file mode 100755 index 000000000..f4f632503 --- /dev/null +++ b/docker/fedora-37/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/fedora-36/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +tools/release_tests.sh From 2282d480adbf3e33c37c53c3293e3b3c63832e3d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 16 Jan 2023 00:34:02 +0100 Subject: [PATCH 110/924] update opensuse docker tests and other dockers --- docker/build-all.sh | 2 +- docker/fedora-36/run_tests.sh | 2 +- docker/fedora-37/run_tests.sh | 2 +- docker/opensuse-leap/Dockerfile | 10 ++++++++-- docker/opensuse-leap/README.md | 18 +++++++----------- docker/opensuse-leap/run_tests.sh | 8 ++++++++ docker/opensuse-tumbleweed/Dockerfile | 12 +++++++++--- docker/opensuse-tumbleweed/README.md | 18 +++++++----------- docker/opensuse-tumbleweed/run_tests.sh | 8 ++++++++ 9 files changed, 50 insertions(+), 30 deletions(-) create mode 100755 docker/opensuse-leap/run_tests.sh create mode 100755 docker/opensuse-tumbleweed/run_tests.sh diff --git a/docker/build-all.sh b/docker/build-all.sh index 3116d96dc..aba45382f 100755 --- a/docker/build-all.sh +++ b/docker/build-all.sh @@ -1,5 +1,5 @@ #!/bin/bash -for os in archlinux debian-buster fedora-34 fedora-35 homebrew kali opensuse-leap opensuse-tumbleweed parrot-core-latest ubuntu-18.04 ubuntu-20.04 ubuntu-21.04; do +for os in archlinux debian-buster fedora-36 fedora-37 homebrew kali opensuse-leap opensuse-tumbleweed parrot-core-latest ubuntu-18.04 ubuntu-20.04 ubuntu-22.04; do ( cd $os && ./docker_build.sh ) done diff --git a/docker/fedora-36/run_tests.sh b/docker/fedora-36/run_tests.sh index f4f632503..05cdb7da8 100755 --- a/docker/fedora-36/run_tests.sh +++ b/docker/fedora-36/run_tests.sh @@ -4,5 +4,5 @@ # This script is to be run from proxmark root folder inside the docker env # docker/fedora-36/run_tests.sh; -sudo apt update && sudo apt upgrade -y +sudo yum -y update tools/release_tests.sh diff --git a/docker/fedora-37/run_tests.sh b/docker/fedora-37/run_tests.sh index f4f632503..05cdb7da8 100755 --- a/docker/fedora-37/run_tests.sh +++ b/docker/fedora-37/run_tests.sh @@ -4,5 +4,5 @@ # This script is to be run from proxmark root folder inside the docker env # docker/fedora-36/run_tests.sh; -sudo apt update && sudo apt upgrade -y +sudo yum -y update tools/release_tests.sh diff --git a/docker/opensuse-leap/Dockerfile b/docker/opensuse-leap/Dockerfile index c8a5c7cf1..1af777d23 100644 --- a/docker/opensuse-leap/Dockerfile +++ b/docker/opensuse-leap/Dockerfile @@ -4,8 +4,14 @@ ENV LANG C # libqt5-qtbase-devel skipped RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel bluez-devel python3-devel libopenssl-devel -RUN zypper --non-interactive install cmake python3 python3-pip -RUN python3 -m pip install ansicolors sslcrypto +RUN zypper addrepo https://download.opensuse.org/repositories/home:wkazubski/15.4/home:wkazubski.repo && \ + zypper --gpg-auto-import-keys refresh && \ + zypper --non-interactive install cross-arm-none-eabi-gcc12 cross-arm-none-eabi-newlib + +RUN zypper --non-interactive install cmake python3 python3-pip && \ + python3 -m pip install ansicolors sslcrypto + +RUN zypper --non-interactive install ocl-icd-devel # Create rrg user RUN useradd -ms /bin/bash rrg diff --git a/docker/opensuse-leap/README.md b/docker/opensuse-leap/README.md index 47a3b5c32..ecda34706 100644 --- a/docker/opensuse-leap/README.md +++ b/docker/opensuse-leap/README.md @@ -1,24 +1,20 @@ # Notes on run_tests.sh script -This script does both setup and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. - -If all tests OK, the script will finish. +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. +If all tests OK, the script will finish with PASS. # Notes to run tests The script is to be run in proxmark root folder inside the docker env. ``` docker/opensuse-leap/run_tests.sh; -``` +``` -Or if you want to run single test, +Or if you want to run single test, ``` +sudo zypper refresh && sudo zypper --non-interactive update make clean; make -j -tools/pm3_tests.sh --long mfkey nonce2key mf_nonce_brute fpga_compress common client +tools/pm3_tests.sh --long ``` - - -No ARM compiler available ? diff --git a/docker/opensuse-leap/run_tests.sh b/docker/opensuse-leap/run_tests.sh new file mode 100755 index 000000000..d2d49211b --- /dev/null +++ b/docker/opensuse-leap/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/opensuse-leap/run_tests.sh; + +sudo zypper refresh && sudo zypper --non-interactive update +tools/release_tests.sh diff --git a/docker/opensuse-tumbleweed/Dockerfile b/docker/opensuse-tumbleweed/Dockerfile index 5d4adbb8b..169d087c3 100644 --- a/docker/opensuse-tumbleweed/Dockerfile +++ b/docker/opensuse-tumbleweed/Dockerfile @@ -2,10 +2,16 @@ FROM opensuse/tumbleweed ENV LANG C # libqt5-qtbase-devel skipped -RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel bluez-devel python3-devel libopenssl-devel cross-arm-none-gcc11 cross-arm-none-newlib-devel +RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel bluez-devel python3-devel libopenssl-devel cross-arm-none-gcc12 cross-arm-none-newlib-devel -RUN zypper --non-interactive install cmake python3 python3-pip -RUN python3 -m pip install ansicolors sslcrypto +#RUN zypper addrepo https://download.opensuse.org/repositories/home:wkazubski/openSUSE_Tumbleweed/home:wkazubski.repo && \ +# zypper --gpg-auto-import-keys refresh && \ +# zypper --non-interactive install cross-arm-none-eabi-gcc12 cross-arm-none-eabi-newlib + +RUN zypper --non-interactive install cmake python3 python3-pip && \ + python3 -m pip install ansicolors sslcrypto + +RUN zypper --non-interactive install ocl-icd-devel # Create rrg user RUN useradd -ms /bin/bash rrg diff --git a/docker/opensuse-tumbleweed/README.md b/docker/opensuse-tumbleweed/README.md index 126042512..bd55e0c9d 100644 --- a/docker/opensuse-tumbleweed/README.md +++ b/docker/opensuse-tumbleweed/README.md @@ -1,24 +1,20 @@ # Notes on run_tests.sh script -This script does both setup and then run a -bunch of different builds with make and cmake together with the different combos -of RDV4, GENERIC, BTADDON combos. - -If all tests OK, the script will finish. +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. +If all tests OK, the script will finish with PASS. # Notes to run tests The script is to be run in proxmark root folder inside the docker env. ``` docker/opensuse-tumbleweed/run_tests.sh; -``` +``` -Or if you want to run single test, +Or if you want to run single test, ``` +sudo zypper refresh && sudo zypper --non-interactive update make clean; make -j -tools/pm3_tests.sh --long mfkey nonce2key mf_nonce_brute fpga_compress common client +tools/pm3_tests.sh --long ``` - - -No ARM compiler available ? diff --git a/docker/opensuse-tumbleweed/run_tests.sh b/docker/opensuse-tumbleweed/run_tests.sh new file mode 100755 index 000000000..9002131e9 --- /dev/null +++ b/docker/opensuse-tumbleweed/run_tests.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Iceman 2022 +# +# This script is to be run from proxmark root folder inside the docker env +# docker/opensuse-tumbleweed/run_tests.sh; + +sudo zypper refresh && sudo zypper --non-interactive update +tools/release_tests.sh From ee8759bc8bc718cad86037535dcbed8969344435 Mon Sep 17 00:00:00 2001 From: zebbe94 <63231705+zebbe-94@users.noreply.github.com> Date: Mon, 16 Jan 2023 01:06:12 +0100 Subject: [PATCH 111/924] fix typo --- client/src/cmdsmartcard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdsmartcard.c b/client/src/cmdsmartcard.c index 5cceb8b48..9c273739d 100644 --- a/client/src/cmdsmartcard.c +++ b/client/src/cmdsmartcard.c @@ -719,7 +719,7 @@ static int CmdSmartInfo(const char *Cmd) { // print header PrintAndLogEx(INFO, "--- " _CYAN_("Smartcard Information") " ---------"); - PrintAndLogEx(INFO, "ISO7618-3 ATR... %s", sprint_hex(card.atr, card.atr_len)); + PrintAndLogEx(INFO, "ISO7816-3 ATR... %s", sprint_hex(card.atr, card.atr_len)); // convert bytes to str. char *hexstr = calloc((card.atr_len << 1) + 1, sizeof(uint8_t)); if (hexstr == NULL) { From 3a7af557244b46c8a991684761f72211ebcb6abf Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Mon, 16 Jan 2023 19:57:42 +0100 Subject: [PATCH 112/924] Fix python initialization to have SWIG work --- client/src/cmdscript.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 35640922e..57cf54084 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -147,7 +147,7 @@ static int split(char *str, char **arr) { return word_cnt; } -static void set_python_path(char *path) { +static void set_python_path(const char *path) { PyObject *syspath = PySys_GetObject("path"); if (syspath == 0) { PrintAndLogEx(WARNING, "Python failed to getobject"); @@ -172,7 +172,7 @@ static void set_python_paths(void) { char scripts_path[strlen(exec_path) + strlen(PYTHON_SCRIPTS_SUBDIR) + strlen(PYTHON_LIBRARIES_WILDCARD) + 1]; strcpy(scripts_path, exec_path); strcat(scripts_path, PYTHON_SCRIPTS_SUBDIR); -// strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); + // strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); set_python_path(scripts_path); } @@ -183,7 +183,7 @@ static void set_python_paths(void) { strcpy(scripts_path, user_path); strcat(scripts_path, PM3_USER_DIRECTORY); strcat(scripts_path, PYTHON_SCRIPTS_SUBDIR); -// strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); + // strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); set_python_path(scripts_path); } @@ -194,7 +194,7 @@ static void set_python_paths(void) { strcpy(scripts_path, exec_path); strcat(scripts_path, PM3_SHARE_RELPATH); strcat(scripts_path, PYTHON_SCRIPTS_SUBDIR); -// strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); + // strcat(scripts_path, PYTHON_LIBRARIES_WILDCARD); set_python_path(scripts_path); } } @@ -407,12 +407,16 @@ static int CmdScriptRun(const char *Cmd) { Py_Initialize(); #else PyConfig py_conf; - PyConfig_InitIsolatedConfig(&py_conf); - // Despite being isolated we probably want to allow users to use - // the Python packages they installed on their user directory as well - // as system ones. But it seems isolated mode still enforces them off. - py_conf.use_environment = 1; + // We need to use Python mode instead of isolated to avoid breaking stuff. + PyConfig_InitPythonConfig(&py_conf); + // Let's still make things bit safer by being as close as possible to isolated mode. + py_conf.configure_c_stdio = -1; + py_conf.faulthandler = 0; + py_conf.use_hash_seed = 0; + py_conf.install_signal_handlers = 0; + py_conf.parse_argv = 0; py_conf.user_site_directory = 1; + py_conf.use_environment = 0; #endif //int argc, char ** argv @@ -429,8 +433,13 @@ static int CmdScriptRun(const char *Cmd) { #else // The following line will implicitly pre-initialize Python PyConfig_SetBytesArgv(&py_conf, argc + 1, argv); + + // We disallowed in py_conf environment variables interfering with python interpreter's behavior. + // Let's manually enable the ones we truly need. // This is required by Proxspace to work with an isolated Python configuration PyConfig_SetBytesString(&py_conf, &py_conf.home, getenv("PYTHONHOME")); + // This is required for allowing `import pm3` in python scripts + PyConfig_SetBytesString(&py_conf, &py_conf.pythonpath_env, getenv("PYTHONPATH")); Py_InitializeFromConfig(&py_conf); From e1902ffa9668e0dc51d3c32a0648efdf0308cc87 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 18 Jan 2023 03:47:14 +0100 Subject: [PATCH 113/924] The Hack ID by Unicorn Team EM4100 emulator uses a VD/ID format in decimal --- client/src/cmdlfem410x.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/cmdlfem410x.c b/client/src/cmdlfem410x.c index ea502fc07..29ad61bc9 100644 --- a/client/src/cmdlfem410x.c +++ b/client/src/cmdlfem410x.c @@ -229,6 +229,8 @@ void printEM410x(uint32_t hi, uint64_t id, bool verbose, int type) { uint8_t sebury2 = (id >> 16) & 0x7F; uint32_t sebury3 = id & 0x7FFFFF; PrintAndLogEx(SUCCESS, "Pattern Sebury : %d %d %d [0x%X 0x%X 0x%X]", sebury1, sebury2, sebury3, sebury1, sebury2, sebury3); + PrintAndLogEx(SUCCESS, "VD / ID : %03" PRIu64 " / %010" PRIu64, (id >> 32LL) & 0xFFFF, (id & 0xFFFFFFFF)); + PrintAndLogEx(INFO, "------------------------------------------------"); } } From e1c8c977c2d86f615bf41777bc37fc2284f98162 Mon Sep 17 00:00:00 2001 From: Krzysztof Zdulski Date: Wed, 18 Jan 2023 14:41:57 +0100 Subject: [PATCH 114/924] Check is sector is readable before attempting to read --- client/src/cmdhfmf.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index b98f21c01..57de6ee70 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -971,6 +971,11 @@ static int CmdHF14AMfDump(const char *Cmd) { for (blockNo = 0; blockNo < mfNumBlocksPerSector(sectorNo); blockNo++) { bool received = false; current_key = MF_KEY_A; + uint8_t data_area = (sectorNo < 32) ? blockNo : blockNo / 5; + if (rights[sectorNo][data_area] == 0x07) { // no key would work + PrintAndLogEx(WARNING, "access rights do not allow reading of sector %2d block %3d, skipping", sectorNo, blockNo); + continue; + } for (tries = 0; tries < MIFARE_SECTOR_RETRY; tries++) { if (blockNo == mfNumBlocksPerSector(sectorNo) - 1) { // sector trailer. At least the Access Conditions can always be read with key A. @@ -982,7 +987,6 @@ static int CmdHF14AMfDump(const char *Cmd) { SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); } else { // data block. Check if it can be read with key A or key B - uint8_t data_area = (sectorNo < 32) ? blockNo : blockNo / 5; if ((rights[sectorNo][data_area] == 0x03) || (rights[sectorNo][data_area] == 0x05)) { // only key B would work payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; @@ -992,10 +996,6 @@ static int CmdHF14AMfDump(const char *Cmd) { clearCommandBuffer(); SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); - } else if (rights[sectorNo][data_area] == 0x07) { // no key would work - PrintAndLogEx(WARNING, "access rights do not allow reading of sector %2d block %3d", sectorNo, blockNo); - // where do you want to go?? Next sector or block? - break; } else { // key A would work payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; From d96cef2b504155337b0696265dab642377208069 Mon Sep 17 00:00:00 2001 From: colonelborkmundus Date: Wed, 18 Jan 2023 11:36:07 -0500 Subject: [PATCH 115/924] modified: client/dictionaries/mfc_default_keys.dic --- client/dictionaries/mfc_default_keys.dic | 17 + client/src/cmdhflist.c | 2 +- client/src/pm3line_vocabulory.h | 1484 +++++++++++----------- 3 files changed, 760 insertions(+), 743 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index a336a32b5..433a91ce5 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1909,3 +1909,20 @@ D144BD193063 # Keys Swim 8627C10A7014 453857395635 +# +########################################## +# +# added by colonelborkmundus +# "the more, the marriott" mifare project +# +# mifare classic 1k - graduate hotel +0D258FE90296 +17193709ADF4 +# +# mifare classic 1K - marriott + + + + + + diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index a19ecdea9..232d4af19 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -318,7 +318,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "AUTH-B(%d)", cmd[1]); break; } - case MIFARE_MAGIC_GDM_AUTH_KEYA:{ + case MIFARE_MAGIC_GDM_AUTH_KEYA: { if (cmdsize > 3) { snprintf(exp, size, "MAGIC AUTH-A(%d)", cmd[1]); MifareAuthState = masNt; diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 5a517c645..91a88a1c0 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,747 +31,747 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 0, "emv exec" }, - { 0, "emv pse" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 0, "emv gpo" }, - { 0, "emv readrec" }, - { 0, "emv genac" }, - { 0, "emv challenge" }, - { 0, "emv intauth" }, - { 0, "emv scan" }, - { 1, "emv test" }, - { 1, "emv list" }, - { 0, "emv roca" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixdisable" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 0, "hf mfp info" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp ndefread" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 0, "hf topaz dump" }, - { 1, "hf topaz list" }, - { 0, "hf topaz info" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag cc" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 0, "emv exec" }, + { 0, "emv pse" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 0, "emv gpo" }, + { 0, "emv readrec" }, + { 0, "emv genac" }, + { 0, "emv challenge" }, + { 0, "emv intauth" }, + { 0, "emv scan" }, + { 1, "emv test" }, + { 1, "emv list" }, + { 0, "emv roca" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixdisable" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 0, "hf mfp info" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp ndefread" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 0, "hf topaz dump" }, + { 1, "hf topaz list" }, + { 0, "hf topaz info" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 0, "lf hitag eload" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag reader" }, + { 0, "lf hitag sim" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag writer" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag cc" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -779,4 +779,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif \ No newline at end of file +#endif From dbe53506b579665f82b773c97f010e8d5f7b592f Mon Sep 17 00:00:00 2001 From: colonelborkmundus Date: Wed, 18 Jan 2023 12:52:10 -0500 Subject: [PATCH 116/924] added additional keys to graduate hotel card --- client/dictionaries/mfc_default_keys.dic | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 433a91ce5..9255031de 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1919,9 +1919,10 @@ D144BD193063 0D258FE90296 17193709ADF4 # -# mifare classic 1K - marriott - - +# mifare classic 1k - westin +B578F38A5C61 +# +# mifare classic 1k From 88d242d10ab80c5643e78201aa60cd03af144d33 Mon Sep 17 00:00:00 2001 From: colonelborkmundus Date: Wed, 18 Jan 2023 13:36:50 -0500 Subject: [PATCH 117/924] yo dawg i heard you like keys so i added more keys --- client/dictionaries/mfc_default_keys.dic | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 9255031de..c4032b081 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1918,12 +1918,17 @@ D144BD193063 # mifare classic 1k - graduate hotel 0D258FE90296 17193709ADF4 +C49DAE1C6049 +209A2B910545 +752FBB5B7B45 # # mifare classic 1k - westin B578F38A5C61 # -# mifare classic 1k - - - - +# mifare classic 1k EV1 - marriott +D01AFEEB890A +7B4DFC6D6525 +23C9FDD9A366 +3119A70628EB +30AAD6A711EF +1330824CD356 \ No newline at end of file From de3514dc840a823a04b4faec9f76ceb77162ed22 Mon Sep 17 00:00:00 2001 From: colonelborkmundus Date: Wed, 18 Jan 2023 13:53:08 -0500 Subject: [PATCH 118/924] added more keys --- client/dictionaries/mfc_default_keys.dic | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index c4032b081..3ba6ccc10 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1924,6 +1924,8 @@ C49DAE1C6049 # # mifare classic 1k - westin B578F38A5C61 +8C29F8320617 +5697519A8F02 # # mifare classic 1k EV1 - marriott D01AFEEB890A From cc0e5477dd8936c3eb9b9d22ab9117f449aff141 Mon Sep 17 00:00:00 2001 From: colonelborkmundus Date: Wed, 18 Jan 2023 15:25:25 -0500 Subject: [PATCH 119/924] added more keys, removed accidental dupes --- client/dictionaries/mfc_default_keys.dic | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 3ba6ccc10..235cabe20 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1916,21 +1916,29 @@ D144BD193063 # "the more, the marriott" mifare project # # mifare classic 1k - graduate hotel -0D258FE90296 -17193709ADF4 C49DAE1C6049 209A2B910545 -752FBB5B7B45 # # mifare classic 1k - westin -B578F38A5C61 8C29F8320617 5697519A8F02 +7D0A1C277C05 +2058580A941F +C40964215509 +D44CFC178460 # # mifare classic 1k EV1 - marriott -D01AFEEB890A 7B4DFC6D6525 23C9FDD9A366 3119A70628EB 30AAD6A711EF -1330824CD356 \ No newline at end of file +1330824CD356 +# +# mifare classic 1k - AC hotels marriott +8EA8EC3F2320 +# +# mifare classic 1k - the ritz-carlton +30FB20D0EFEF +# +# mifare classic 1k - unknown +722538817225 \ No newline at end of file From f9a65505de7da07248d3e4f6eb1c74728c25dfea Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 21 Jan 2023 20:04:27 +0100 Subject: [PATCH 120/924] added tesla info command, with some of the data that is available. Needed to fix the apdu chaining and a sneaky bug in get_sw since the apdu response was larger then 256 --- client/CMakeLists.txt | 1 + client/Makefile | 1 + client/src/cmdhf.c | 4 +- client/src/cmdhf14a.c | 35 ++++--- client/src/cmdhf14a.h | 3 + client/src/cmdhftesla.c | 221 ++++++++++++++++++++++++++++++++++++++++ client/src/cmdhftesla.h | 26 +++++ common/commonutil.c | 4 +- common/commonutil.h | 2 +- 9 files changed, 281 insertions(+), 16 deletions(-) create mode 100644 client/src/cmdhftesla.c create mode 100644 client/src/cmdhftesla.h diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 5519b2e77..5bd3ebddd 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -293,6 +293,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdhfseos.c ${PM3_ROOT}/client/src/cmdhfst.c ${PM3_ROOT}/client/src/cmdhfst25ta.c + ${PM3_ROOT}/client/src/cmdhftesla.c ${PM3_ROOT}/client/src/cmdhftexkom.c ${PM3_ROOT}/client/src/cmdhfthinfilm.c ${PM3_ROOT}/client/src/cmdhftopaz.c diff --git a/client/Makefile b/client/Makefile index 03f022297..b08eb0acb 100644 --- a/client/Makefile +++ b/client/Makefile @@ -583,6 +583,7 @@ SRCS = mifare/aiddesfire.c \ cmdhfseos.c \ cmdhfst.c \ cmdhfst25ta.c \ + cmdhftesla.c \ cmdhfthinfilm.c \ cmdhftopaz.c \ cmdhftexkom.c \ diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index 7bba6d41a..97f7df3c7 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -50,6 +50,7 @@ #include "cmdhftexkom.h" // Texkom #include "cmdhfxerox.h" // Xerox #include "cmdhffudan.h" // Fudan cards +#include "cmdhftesla.h" // Tesla #include "cmdtrace.h" // trace list #include "ui.h" #include "proxgui.h" @@ -493,9 +494,10 @@ static command_t CommandTable[] = { {"ntag424", CmdHF_ntag424, AlwaysAvailable, "{ NXP NTAG 4242 DNA RFIDs... }"}, {"seos", CmdHFSeos, AlwaysAvailable, "{ SEOS RFIDs... }"}, {"st25ta", CmdHFST25TA, AlwaysAvailable, "{ ST25TA RFIDs... }"}, + {"tesla", CmdHFTESLA, AlwaysAvailable, "{ TESLA Cards... }"}, + {"texkom", CmdHFTexkom, AlwaysAvailable, "{ Texkom RFIDs... }"}, {"thinfilm", CmdHFThinfilm, AlwaysAvailable, "{ Thinfilm RFIDs... }"}, {"topaz", CmdHFTopaz, AlwaysAvailable, "{ TOPAZ (NFC Type 1) RFIDs... }"}, - {"texkom", CmdHFTexkom, AlwaysAvailable, "{ Texkom RFIDs... }"}, {"xerox", CmdHFXerox, AlwaysAvailable, "{ Fuji/Xerox cartridge RFIDs... }"}, {"waveshare", CmdHFWaveshare, AlwaysAvailable, "{ Waveshare NFC ePaper... }"}, {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("General") " ---------------------"}, diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 0858150d0..d0ba31cd0 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -42,7 +42,13 @@ #include "desfire.h" // desfire enums #include "mifare/desfirecore.h" // desfire context -static bool APDUInFramingEnable = true; +static bool g_apdu_in_framing_enable = true; +bool Get_apdu_in_framing(void) { + return g_apdu_in_framing_enable; +} +void Set_apdu_in_framing(bool v) { + g_apdu_in_framing_enable = v; +} static int CmdHelp(const char *Cmd); static int waitCmd(bool i_select, uint32_t timeout, bool verbose); @@ -1050,7 +1056,7 @@ int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool lea int res; // 3 byte here - 1b framing header, 2b crc16 - if (APDUInFramingEnable && + if (g_apdu_in_framing_enable && ((gs_frame_len && (datainlen > gs_frame_len - 3)) || (datainlen > PM3_CMD_DATA_SIZE - 3))) { int clen = 0; @@ -1454,29 +1460,34 @@ static int CmdHF14AChaining(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf 14a chaining", "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", - "hf 14a chaining disable -> disable chaining\n" + "hf 14a chaining --off -> disable chaining\n" "hf 14a chaining -> show chaining enable/disable state\n"); void *argtable[] = { arg_param_begin, - arg_str0(NULL, NULL, "", NULL), + arg_lit0("1", "on", "enabled chaining"), + arg_lit0("0", "off", "disable chaining"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); - struct arg_str *str = arg_get_str(ctx, 1); - int len = arg_get_str_len(ctx, 1); + bool on = arg_get_lit(ctx, 1); + bool off = arg_get_lit(ctx, 2); - if (len && (!strcmp(str->sval[0], "enable") || !strcmp(str->sval[0], "1"))) - APDUInFramingEnable = true; + if ((on + off) > 1) { + PrintAndLogEx(INFO, "Select only one option"); + return PM3_EINVARG; + } - if (len && (!strcmp(str->sval[0], "disable") || !strcmp(str->sval[0], "0"))) - APDUInFramingEnable = false; + if (on) + Set_apdu_in_framing(true); + + if (off) + Set_apdu_in_framing(false); CLIParserFree(ctx); - PrintAndLogEx(INFO, "\nISO 14443-4 input chaining %s.\n", APDUInFramingEnable ? "enabled" : "disabled"); - + PrintAndLogEx(INFO, "\nISO 14443-4 input chaining %s.\n", g_apdu_in_framing_enable ? "enabled" : "disabled"); return PM3_SUCCESS; } diff --git a/client/src/cmdhf14a.h b/client/src/cmdhf14a.h index 2ac2672a1..a811db66b 100644 --- a/client/src/cmdhf14a.h +++ b/client/src/cmdhf14a.h @@ -53,4 +53,7 @@ int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool lea int ExchangeRAW14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, bool silentMode); int SelectCard14443A_4(bool disconnect, bool verbose, iso14a_card_select_t *card); + +bool Get_apdu_in_framing(void); +void Set_apdu_in_framing(bool v); #endif diff --git a/client/src/cmdhftesla.c b/client/src/cmdhftesla.c new file mode 100644 index 000000000..62e3bab18 --- /dev/null +++ b/client/src/cmdhftesla.c @@ -0,0 +1,221 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// High frequency ISO14443A / TESLA commands +//----------------------------------------------------------------------------- + +#include "cmdhftesla.h" +#include +#include +#include "cmdparser.h" // command_t +#include "comms.h" // clearCommandBuffer +#include "cmdtrace.h" +#include "cliparser.h" +#include "cmdhf14a.h" +#include "protocols.h" // definitions of ISO14A/7816 protocol +#include "iso7816/apduinfo.h" // GetAPDUCodeDescription +#include "commonutil.h" // get_sw +#include "protocols.h" // ISO7816 APDU return co-des +#include "ui.h" +#include "cmdhf14a.h" // apdu chaining + +#define TIMEOUT 2000 + +static int CmdHelp(const char *Cmd); + +/** + * 0x80 0x00 0x00 0x00 - get interface object + 0x80 0x01 0x00 0x00 - load data from storage + 0x80 0x02 KEY_INDEX 0x00 - initialize key pair + 0x80 0x03 KEY_INDEX 0x00 - generate key pair + 0x80 0x04 KEY_INDEX 0x00 - get public key + 0x80 0x05 CRT_INDEX 0x00 - load certificate + 0x80 0x06 CRT_INDEX 0x00 - get certificate + 0x80 0x07 0x00 0x00 - get version + 0x80 0x08 0x00 0x00 - confirm prepersonalization + 0x80 0x10 KEY_INDEX 0x00 - sign challenge + 0x80 0x11 KEY_INDEX 0x00 - dh key exchange + +*/ + +// TESLA +static int info_hf_tesla(void) { + + bool activate_field = true; + bool keep_field_on = true; + uint8_t response[PM3_CMD_DATA_SIZE]; + int resplen = 0; + + // --------------- Select TESLA application ---------------- + uint8_t aSELECT_AID[80]; + int aSELECT_AID_n = 0; + param_gethex_to_eol("00a404000a7465736c614c6f676963", 0, aSELECT_AID, sizeof(aSELECT_AID), &aSELECT_AID_n); + int res = ExchangeAPDU14a(aSELECT_AID, aSELECT_AID_n, activate_field, keep_field_on, response, sizeof(response), &resplen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } + + if (resplen < 2) { + DropField(); + return PM3_ESOFT; + } + + uint16_t sw = get_sw(response, resplen); + if (sw != ISO7816_OK) { + PrintAndLogEx(ERR, "Selecting TESLA aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); + DropField(); + return PM3_ESOFT; + } + + activate_field = false; + keep_field_on = true; + + // --------------- ECDH public key file reading ---------------- + for (uint8_t i = 0; i < 3; i++) { + + uint8_t aSELECT_PK[5] = {0x80, 0x04, i, 0x00, 0x00}; + res = ExchangeAPDU14a(aSELECT_PK, sizeof(aSELECT_PK), activate_field, keep_field_on, response, sizeof(response), &resplen); + if (res != PM3_SUCCESS) { + continue; + } + + sw = get_sw(response, resplen); + if (sw == ISO7816_OK) { + // save PK for later + uint8_t pk[65] = {0}; + memcpy(pk, response, resplen - 2); + + PrintAndLogEx(INFO, "PUBLIC KEY # %i", i); + PrintAndLogEx(INFO, "%s", sprint_hex_inrow(pk, sizeof(pk))); + } + } + + uint8_t aREAD_FORM_FACTOR[30]; + int aREAD_FORM_FACTOR_n = 0; + param_gethex_to_eol("80140000", 0, aREAD_FORM_FACTOR, sizeof(aREAD_FORM_FACTOR), &aREAD_FORM_FACTOR_n); + res = ExchangeAPDU14a(aREAD_FORM_FACTOR, aREAD_FORM_FACTOR_n, activate_field, keep_field_on, response, sizeof(response), &resplen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } + + sw = get_sw(response, resplen); + if (sw != ISO7816_OK) { + PrintAndLogEx(ERR, "reading FORM FACTOR file failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); + DropField(); + return PM3_ESOFT; + } + + // store form factor for later + uint8_t form_factor[resplen - 2]; + memcpy(form_factor, response, sizeof(form_factor)); + + uint8_t aREAD_VERSION[30]; + int aREAD_VERSION_n = 0; + param_gethex_to_eol("80170000", 0, aREAD_VERSION, sizeof(aREAD_VERSION), &aREAD_VERSION_n); + res = ExchangeAPDU14a(aREAD_VERSION, aREAD_VERSION_n, activate_field, keep_field_on, response, sizeof(response), &resplen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } + + uint8_t version[resplen - 2]; + + sw = get_sw(response, resplen); + if (sw == ISO7816_OK) { + // store version for later + memcpy(version, response, sizeof(version)); + } + + // --------------- CERT reading ---------------- + Set_apdu_in_framing(true); + for (uint8_t i = 0; i < 4; i++) { + + uint8_t aSELECT_CERT[PM3_CMD_DATA_SIZE] = {0x80, 0x06, i, 0x00, 0x00, 0x00, 0xFF}; + int aSELECT_CERT_n = 7; + + res = ExchangeAPDU14a(aSELECT_CERT, aSELECT_CERT_n, activate_field, keep_field_on, response, PM3_CMD_DATA_SIZE, &resplen); + if (res != PM3_SUCCESS) { + continue; + } + + sw = get_sw(response, resplen); + + if (sw == ISO7816_OK) { + // save CETT for later + uint8_t cert[515] = {0}; + memcpy(cert, response, resplen - 2); + + PrintAndLogEx(INFO, "CERT # %i", i); + PrintAndLogEx(INFO, "%s", sprint_hex_inrow(cert, resplen - 2)); + } + } + Set_apdu_in_framing(false); + keep_field_on = false; + DropField(); + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); + PrintAndLogEx(NORMAL, ""); +// PrintAndLogEx(INFO, "PUBLIC KEY"); +// PrintAndLogEx(INFO, "%zu - %s", sizeof(pk), sprint_hex_inrow(pk, sizeof(pk))); + PrintAndLogEx(INFO, "Form factor"); + PrintAndLogEx(INFO, "%zu - %s", sizeof(form_factor), sprint_hex_inrow(form_factor, sizeof(form_factor))); + PrintAndLogEx(INFO, "VERSION"); + PrintAndLogEx(INFO, "%zu - %s", sizeof(version), sprint_hex_inrow(version, sizeof(version))); + + return PM3_SUCCESS; +} + +// menu command to get and print all info known about any known ST25TA tag +static int CmdHFTeslaInfo(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf telsa info", + "Get info about TESLA Key tag", + "hf tesla info" + ); + + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); + return info_hf_tesla(); +} + + +static int CmdHFTeslaList(const char *Cmd) { + return CmdTraceListAlias(Cmd, "hf tesla", "7816"); +} + +static command_t CommandTable[] = { + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"info", CmdHFTeslaInfo, IfPm3Iso14443a, "Tag information"}, + {"list", CmdHFTeslaList, AlwaysAvailable, "List ISO 14443A/7816 history"}, + {NULL, NULL, NULL, NULL} +}; + +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return PM3_SUCCESS; +} + +int CmdHFTESLA(const char *Cmd) { + clearCommandBuffer(); + return CmdsParse(CommandTable, Cmd); +} diff --git a/client/src/cmdhftesla.h b/client/src/cmdhftesla.h new file mode 100644 index 000000000..923ac5fb1 --- /dev/null +++ b/client/src/cmdhftesla.h @@ -0,0 +1,26 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// High frequency ISO14443A / TESLA commands +//----------------------------------------------------------------------------- + +#ifndef CMDHFTESLA_H__ +#define CMDHFTESLA_H__ + +#include "common.h" + +int CmdHFTESLA(const char *Cmd); + +#endif diff --git a/common/commonutil.c b/common/commonutil.c index 2101414ab..601dc20e4 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -262,10 +262,10 @@ uint32_t rotr(uint32_t a, uint8_t n) { return (a >> n) | (a << (32 - n)); } -uint16_t get_sw(const uint8_t *d, uint8_t n) { +uint16_t get_sw(const uint8_t *d, uint16_t n) { if (n < 2) return 0; n -= 2; - return d[n] * 0x0100 + d[n + 1]; + return (d[n] << 8 | d[n + 1]); } diff --git a/common/commonutil.h b/common/commonutil.h index 0d8932a51..8e800f25f 100644 --- a/common/commonutil.h +++ b/common/commonutil.h @@ -85,5 +85,5 @@ void htole24(uint32_t val, uint8_t data[3]); uint32_t rotl(uint32_t a, uint8_t n); uint32_t rotr(uint32_t a, uint8_t n); -uint16_t get_sw(const uint8_t *d, uint8_t n); +uint16_t get_sw(const uint8_t *d, uint16_t n); #endif From 6850cacc699c3a3db3215fee4de3b0e4d244fbdf Mon Sep 17 00:00:00 2001 From: Alejandro <45500329+Alejandro12120@users.noreply.github.com> Date: Sat, 21 Jan 2023 20:28:30 +0100 Subject: [PATCH 121/924] fix typo Signed-off-by: Alejandro <45500329+Alejandro12120@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d931e1ad5..3edd4e786 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ We define generic Proxmark3 platforms as following devices. - **Note**: unknown pin assignments. - ⚠ Ryscorp Proxmark3 Pro - **Note**: device has different fpga and unknown pin assignments. - - **Note**: Company have dissappared, leaving their customers in the dark. + - **Note**: Company have disappeared, leaving their customers in the dark. - ⚠ iCopy-X - **Note**: experimental support, currently incompatible with iCopy-X GUI as Proxmark client commands are now using cliparser. - **Note**: see also [icopyx-community repos](https://github.com/iCopy-X-Community/) for upstream sources, reversed hw etc. From 7c6aa66aa26327c7f4868c51ee7f6429106fd30f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 21 Jan 2023 21:20:22 +0100 Subject: [PATCH 122/924] tesla auth challenge exchange --- client/src/cmdhftesla.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/client/src/cmdhftesla.c b/client/src/cmdhftesla.c index 62e3bab18..b3b5c8939 100644 --- a/client/src/cmdhftesla.c +++ b/client/src/cmdhftesla.c @@ -164,6 +164,30 @@ static int info_hf_tesla(void) { } } Set_apdu_in_framing(false); + + uint8_t aAUTH[90]; + int aAUTH_n = 0; + // vehicle public key , 16 byte CHALLENGE + // 00112233445566778899AABBCCDDEEFF + // 0x51 = 81 dec +// param_gethex_to_eol("8011000051 046F08AE62526ABB5690643458152AC963CF5D7C113949F3C2453D1DDC6E4385B430523524045A22F5747BF236F1B5F60F0EA32DC2B8276D75ACDE9813EF77C330 00112233445566778899AABBCCDDEEFF", 0, aAUTH, sizeof(aAUTH), &aAUTH_n); + param_gethex_to_eol("8011000051046F08AE62526ABB5690643458152AC963CF5D7C113949F3C2453D1DDC6E4385B430523524045A22F5747BF236F1B5F60F0EA32DC2B8276D75ACDE9813EF77C33000112233445566778899AABBCCDDEEFF", 0, aAUTH, sizeof(aAUTH), &aAUTH_n); + res = ExchangeAPDU14a(aAUTH, aAUTH_n, activate_field, keep_field_on, response, sizeof(response), &resplen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } + + uint8_t auth[resplen - 2]; + + sw = get_sw(response, resplen); + if (sw == ISO7816_OK) { + // store CHALLENGE for later + memcpy(auth, response, sizeof(auth)); + } + + PrintAndLogEx(INFO, "CHALL... %s", sprint_hex_inrow(auth, sizeof(auth))); + keep_field_on = false; DropField(); From f05c6a1f72da7765f1cd9d37b25963e33671bb6c Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Sun, 22 Jan 2023 15:12:33 +0800 Subject: [PATCH 123/924] Fix the types of parameters in BitstreamOut_t BitstreamOut_t in client/src/loclass/cipherutils.h is also used in client/src/cmddata.c for decimatioin, but uint8_t is too small for such application --- armsrc/optimized_cipherutils.h | 8 ++++---- client/src/loclass/cipherutils.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/armsrc/optimized_cipherutils.h b/armsrc/optimized_cipherutils.h index 73fbfc730..1bef017a2 100644 --- a/armsrc/optimized_cipherutils.h +++ b/armsrc/optimized_cipherutils.h @@ -39,14 +39,14 @@ typedef struct { uint8_t *buffer; - uint8_t numbits; - uint8_t position; + uint32_t numbits; + uint32_t position; } BitstreamIn_t; typedef struct { uint8_t *buffer; - uint8_t numbits; - uint8_t position; + uint32_t numbits; + uint32_t position; } BitstreamOut_t; bool headBit(BitstreamIn_t *stream); diff --git a/client/src/loclass/cipherutils.h b/client/src/loclass/cipherutils.h index aeba9f33d..160945f0d 100644 --- a/client/src/loclass/cipherutils.h +++ b/client/src/loclass/cipherutils.h @@ -42,14 +42,14 @@ typedef struct { uint8_t *buffer; - uint8_t numbits; - uint8_t position; + uint32_t numbits; + uint32_t position; } BitstreamIn_t; typedef struct { uint8_t *buffer; - uint8_t numbits; - uint8_t position; + uint32_t numbits; + uint32_t position; } BitstreamOut_t; bool headBit(BitstreamIn_t *stream); From af00fde250c0458de619b6f2d89c475d15b5c18d Mon Sep 17 00:00:00 2001 From: colonelborkmundus Date: Sun, 22 Jan 2023 02:36:19 -0500 Subject: [PATCH 124/924] additional 1k keys, fresh from the oven --- client/dictionaries/mfc_default_keys.dic | 45 +++++++++++++++++++----- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 235cabe20..651a4d547 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1911,15 +1911,14 @@ D144BD193063 453857395635 # ########################################## -# # added by colonelborkmundus # "the more, the marriott" mifare project # -# mifare classic 1k - graduate hotel +# 1k - graduate hotel C49DAE1C6049 209A2B910545 # -# mifare classic 1k - westin +# 1k - westin 8C29F8320617 5697519A8F02 7D0A1C277C05 @@ -1927,18 +1926,48 @@ C49DAE1C6049 C40964215509 D44CFC178460 # -# mifare classic 1k EV1 - marriott +# 1k - marriott 7B4DFC6D6525 23C9FDD9A366 3119A70628EB 30AAD6A711EF 1330824CD356 +43012BD9EB87 +035C70558D7B # -# mifare classic 1k - AC hotels marriott +# 1k - AC hotels marriott 8EA8EC3F2320 # -# mifare classic 1k - the ritz-carlton +# 1k - the ritz-carlton 30FB20D0EFEF +D20289CD9E6E # -# mifare classic 1k - unknown -722538817225 \ No newline at end of file +# 1k - unknown +722538817225 +# +# 1k - aria resort & casino +316B8FAA12EF +A18D9F4E75AF +# +# 1k - fairfield inn & suites marriott +7AEB989A5525 +7B3B589A5525 +215E9DED9DDF +334E91BE3377 +310308EC52EF +# +# 1k - residence inn marriott +F72CD208FDF9 +# +# 1k - sheraton +42FC522DE987 +# +# 1k - millenium hotels +132F641C948B +# +# 1k - moxy hotels +20C166C00ADB +9EE3896C4530 +# +# 1k - residence inn marriott +3122AE5341EB \ No newline at end of file From 239a8646b221b33c262fa32c9929f4627414cfaf Mon Sep 17 00:00:00 2001 From: wh201906 Date: Sun, 22 Jan 2023 15:38:09 +0000 Subject: [PATCH 125/924] Fix the wrong sample count when bps!=8 --- armsrc/lfsampling.c | 4 +++- client/src/cmddata.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index a1ff37356..3844976e1 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -296,7 +296,9 @@ void LFSetupFPGAForADC(int divisor, bool reader_field) { uint32_t DoAcquisition(uint8_t decimation, uint8_t bits_per_sample, bool avg, int16_t trigger_threshold, bool verbose, uint32_t sample_size, uint32_t cancel_after, int32_t samples_to_skip, bool ledcontrol) { - initSampleBuffer(&sample_size); + initSampleBuffer(&sample_size); // sample size in bytes + sample_size <<= 3; // sample size in bits + sample_size /= bits_per_sample; // sample count if (g_dbglevel >= DBG_DEBUG) { printSamples(); diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 647c062a4..1ebd4b432 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1779,7 +1779,7 @@ int getSamplesEx(uint32_t start, uint32_t end, bool verbose, bool ignore_lf_conf BitstreamOut_t bout = { got, bits_per_sample * n, 0}; uint32_t j = 0; - for (j = 0; j * bits_per_sample < n * 8 && j < n; j++) { + for (j = 0; j * bits_per_sample < n * 8 && j * bits_per_sample < MAX_GRAPH_TRACE_LEN * 8; j++) { uint8_t sample = getByte(bits_per_sample, &bout); g_GraphBuffer[j] = ((int) sample) - 127; } From f4879fdc172f43bf965a29f2420f7c42030e895c Mon Sep 17 00:00:00 2001 From: wh201906 Date: Sun, 22 Jan 2023 15:41:07 +0000 Subject: [PATCH 126/924] Bypass some functions if bps is not 8 --- armsrc/lfsampling.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index 3844976e1..e716fa248 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -370,8 +370,12 @@ uint32_t DoAcquisition(uint8_t decimation, uint8_t bits_per_sample, bool avg, in } // Ensure that DC offset removal and noise check is performed for any device-side processing - removeSignalOffset(data.buffer, samples.total_saved); - computeSignalProperties(data.buffer, samples.total_saved); + if (bits_per_sample == 8) + { + // these functions only consider bps==8 + removeSignalOffset(data.buffer, samples.total_saved); + computeSignalProperties(data.buffer, samples.total_saved); + } return data.numbits; } /** From 8218762e86fa9774bd6d4190f350d0f8bea5c5c3 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Mon, 23 Jan 2023 00:16:29 +0800 Subject: [PATCH 127/924] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97fa48f5d..978caa8e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001) - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) - Fixed `make accessrights` on Fedora (@mooey5775) + - Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906) ## [Radium.4.15864][2022-10-29] - Changed `lf indala sim` - now accepts fc / cn (@iceman1001) From ec8a603aca072cce920ac92301819d9cabb1eef6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 22 Jan 2023 17:47:39 +0100 Subject: [PATCH 128/924] text --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97fa48f5d..b4cde2d93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `hf tesla info` - intital information command to read TESLA cards (@iceman1001) - Changed `hf emrtd info` - looking for lower case .bin extensions (@iceman1001) - Changed `hf emrtd dump` - looking for lower case .bin extensions (@iceman1001) - Changed `lf paradox clone` - it now accepts FC/CN (@mwalker33) From ad9771b4c0fd7097267d352902d5a4339e0ec8d4 Mon Sep 17 00:00:00 2001 From: colonelborkmundus Date: Sun, 22 Jan 2023 11:57:32 -0500 Subject: [PATCH 129/924] removed modified files from pull request --- client/dictionaries/mfc_default_keys.dic | 16 +- client/src/cmdhflist.c | 2 +- client/src/pm3line_vocabulory.h | 1484 +++++++++++----------- 3 files changed, 758 insertions(+), 744 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 651a4d547..881c72df0 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1934,13 +1934,18 @@ D44CFC178460 1330824CD356 43012BD9EB87 035C70558D7B +9966588CB9A0 +12AB4C37BB8B # # 1k - AC hotels marriott 8EA8EC3F2320 +7B56B2B38725 # # 1k - the ritz-carlton 30FB20D0EFEF D20289CD9E6E +66A3B064CC4B +D18296CD9E6E # # 1k - unknown 722538817225 @@ -1970,4 +1975,13 @@ F72CD208FDF9 9EE3896C4530 # # 1k - residence inn marriott -3122AE5341EB \ No newline at end of file +3122AE5341EB +# +# 1k - americinn +8AC04C1A4A25 +# +# 1k - the industrialist +2158E314C3DF +# +# 1k - waldorf astoria +011C6CF459E8 \ No newline at end of file diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 232d4af19..a19ecdea9 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -318,7 +318,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "AUTH-B(%d)", cmd[1]); break; } - case MIFARE_MAGIC_GDM_AUTH_KEYA: { + case MIFARE_MAGIC_GDM_AUTH_KEYA:{ if (cmdsize > 3) { snprintf(exp, size, "MAGIC AUTH-A(%d)", cmd[1]); MifareAuthState = masNt; diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 91a88a1c0..5a517c645 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,747 +31,747 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 0, "emv exec" }, - { 0, "emv pse" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 0, "emv gpo" }, - { 0, "emv readrec" }, - { 0, "emv genac" }, - { 0, "emv challenge" }, - { 0, "emv intauth" }, - { 0, "emv scan" }, - { 1, "emv test" }, - { 1, "emv list" }, - { 0, "emv roca" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixdisable" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 0, "hf mfp info" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp ndefread" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 0, "hf topaz dump" }, - { 1, "hf topaz list" }, - { 0, "hf topaz info" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag cc" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 0, "emv exec" }, + { 0, "emv pse" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 0, "emv gpo" }, + { 0, "emv readrec" }, + { 0, "emv genac" }, + { 0, "emv challenge" }, + { 0, "emv intauth" }, + { 0, "emv scan" }, + { 1, "emv test" }, + { 1, "emv list" }, + { 0, "emv roca" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixdisable" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 0, "hf mfp info" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp ndefread" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 0, "hf topaz dump" }, + { 1, "hf topaz list" }, + { 0, "hf topaz info" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 0, "lf hitag eload" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag reader" }, + { 0, "lf hitag sim" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag writer" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag cc" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -779,4 +779,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif +#endif \ No newline at end of file From 6d12f0281a0d7a837879439c9d0e09cdce88544b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 23 Jan 2023 03:26:51 +0100 Subject: [PATCH 130/924] hf telsa info - better text, also added detection of the gauss key applet --- client/src/cmdhftesla.c | 56 +++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/client/src/cmdhftesla.c b/client/src/cmdhftesla.c index b3b5c8939..296323319 100644 --- a/client/src/cmdhftesla.c +++ b/client/src/cmdhftesla.c @@ -64,26 +64,36 @@ static int info_hf_tesla(void) { param_gethex_to_eol("00a404000a7465736c614c6f676963", 0, aSELECT_AID, sizeof(aSELECT_AID), &aSELECT_AID_n); int res = ExchangeAPDU14a(aSELECT_AID, aSELECT_AID_n, activate_field, keep_field_on, response, sizeof(response), &resplen); if (res != PM3_SUCCESS) { - DropField(); - return res; - } - - if (resplen < 2) { - DropField(); - return PM3_ESOFT; - } - - uint16_t sw = get_sw(response, resplen); - if (sw != ISO7816_OK) { - PrintAndLogEx(ERR, "Selecting TESLA aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); return PM3_ESOFT; } activate_field = false; + uint16_t sw = get_sw(response, resplen); + + if ((resplen < 2) || (sw != ISO7816_OK)) { + + param_gethex_to_eol("00a404000af465736c614c6f676963", 0, aSELECT_AID, sizeof(aSELECT_AID), &aSELECT_AID_n); + res = ExchangeAPDU14a(aSELECT_AID, aSELECT_AID_n, activate_field, keep_field_on, response, sizeof(response), &resplen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } + } + + if ((resplen < 2) || (sw != ISO7816_OK)) { + PrintAndLogEx(ERR, "Selecting TESLA aid failed (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); + // DropField(); + // return PM3_ESOFT; + } + + keep_field_on = true; + // --------------- ECDH public key file reading ---------------- + uint8_t pk[3][65] = {{0}}; + for (uint8_t i = 0; i < 3; i++) { uint8_t aSELECT_PK[5] = {0x80, 0x04, i, 0x00, 0x00}; @@ -94,12 +104,7 @@ static int info_hf_tesla(void) { sw = get_sw(response, resplen); if (sw == ISO7816_OK) { - // save PK for later - uint8_t pk[65] = {0}; - memcpy(pk, response, resplen - 2); - - PrintAndLogEx(INFO, "PUBLIC KEY # %i", i); - PrintAndLogEx(INFO, "%s", sprint_hex_inrow(pk, sizeof(pk))); + memcpy(pk[i], response, resplen - 2); } } @@ -194,13 +199,16 @@ static int info_hf_tesla(void) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); PrintAndLogEx(NORMAL, ""); -// PrintAndLogEx(INFO, "PUBLIC KEY"); -// PrintAndLogEx(INFO, "%zu - %s", sizeof(pk), sprint_hex_inrow(pk, sizeof(pk))); - PrintAndLogEx(INFO, "Form factor"); - PrintAndLogEx(INFO, "%zu - %s", sizeof(form_factor), sprint_hex_inrow(form_factor, sizeof(form_factor))); - PrintAndLogEx(INFO, "VERSION"); - PrintAndLogEx(INFO, "%zu - %s", sizeof(version), sprint_hex_inrow(version, sizeof(version))); + PrintAndLogEx(INFO, "PUBLIC KEY"); + for (int i=0; i < 3; i++) { + PrintAndLogEx(INFO, "%d - %s", i, sprint_hex_inrow(pk[i], 65)); + } + PrintAndLogEx(INFO, "Form factor... %s", sprint_hex_inrow(form_factor, sizeof(form_factor))); + PrintAndLogEx(INFO, "Version....... %s", sprint_hex_inrow(version, sizeof(version))); + if ((memcmp(pk[0], pk[1], 65) == 0)) { + PrintAndLogEx(INFO, "GaussKey detected"); + } return PM3_SUCCESS; } From c364a6821c4f7505fbb0d45c884addad473458ae Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 23 Jan 2023 03:32:38 +0100 Subject: [PATCH 131/924] hf tesla info - better textual output --- client/src/cmdhftesla.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhftesla.c b/client/src/cmdhftesla.c index 296323319..2680daa90 100644 --- a/client/src/cmdhftesla.c +++ b/client/src/cmdhftesla.c @@ -191,8 +191,6 @@ static int info_hf_tesla(void) { memcpy(auth, response, sizeof(auth)); } - PrintAndLogEx(INFO, "CHALL... %s", sprint_hex_inrow(auth, sizeof(auth))); - keep_field_on = false; DropField(); @@ -203,12 +201,23 @@ static int info_hf_tesla(void) { for (int i=0; i < 3; i++) { PrintAndLogEx(INFO, "%d - %s", i, sprint_hex_inrow(pk[i], 65)); } - PrintAndLogEx(INFO, "Form factor... %s", sprint_hex_inrow(form_factor, sizeof(form_factor))); - PrintAndLogEx(INFO, "Version....... %s", sprint_hex_inrow(version, sizeof(version))); - - if ((memcmp(pk[0], pk[1], 65) == 0)) { - PrintAndLogEx(INFO, "GaussKey detected"); + if (form_factor[1] == 1) { + PrintAndLogEx(INFO, "Form factor... %s (card)", sprint_hex_inrow(form_factor, sizeof(form_factor))); + } else if (form_factor[1] == 2){ + PrintAndLogEx(INFO, "Form factor... %s (phone app)", sprint_hex_inrow(form_factor, sizeof(form_factor))); } + + if (sizeof(version) > 0) { + PrintAndLogEx(INFO, "Version....... %s", sprint_hex_inrow(version, sizeof(version))); + } + + PrintAndLogEx(INFO, "CHALL......... %s", sprint_hex_inrow(auth, sizeof(auth))); + + PrintAndLogEx(INFO, "Fingerprint"); + if ((memcmp(pk[0], pk[1], 65) == 0)) { + PrintAndLogEx(INFO, " GaussKey detected"); + } + // return PM3_SUCCESS; } From 37ec19fdbf63e197af5214825537d460a540c8e4 Mon Sep 17 00:00:00 2001 From: mjacksn Date: Sun, 22 Jan 2023 23:27:09 -0600 Subject: [PATCH 132/924] Correct some parsing of the "get nxp system information" data. I believe that these changes bring it in line with the SLIX "GET NXP SYSTEM INFOMATION" data format (as retrieved from SLIX2 datasheet page 33) --- client/src/cmdhf15.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index c35df7238..d6d933b4b 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -700,14 +700,14 @@ static int NxpSysInfo(uint8_t *uid) { } bool support_signature = (recv[5] & 0x01); - bool support_easmode = (recv[4] & 0x03); + bool support_easmode = (recv[4] & 0x04); PrintAndLogEx(INFO, "--------- " _CYAN_("NXP Sysinfo") " ---------"); PrintAndLogEx(INFO, " raw : %s", sprint_hex(recv, 8)); PrintAndLogEx(INFO, " Password protection configuration:"); PrintAndLogEx(INFO, " * Page L read%s password protected", ((recv[2] & 0x01) ? "" : " not")); PrintAndLogEx(INFO, " * Page L write%s password protected", ((recv[2] & 0x02) ? "" : " not")); - PrintAndLogEx(INFO, " * Page H read%s password protected", ((recv[2] & 0x08) ? "" : " not")); + PrintAndLogEx(INFO, " * Page H read%s password protected", ((recv[2] & 0x10) ? "" : " not")); PrintAndLogEx(INFO, " * Page H write%s password protected", ((recv[2] & 0x20) ? "" : " not")); PrintAndLogEx(INFO, " Lock bits:"); @@ -720,16 +720,16 @@ static int NxpSysInfo(uint8_t *uid) { PrintAndLogEx(INFO, " * User memory password protection%s supported", ((recv[4] & 0x01) ? "" : " not")); PrintAndLogEx(INFO, " * Counter feature%s supported", ((recv[4] & 0x02) ? "" : " not")); PrintAndLogEx(INFO, " * EAS ID%s supported by EAS ALARM command", support_easmode ? "" : " not"); - PrintAndLogEx(INFO, " * EAS password protection%s supported", ((recv[4] & 0x04) ? "" : " not")); + PrintAndLogEx(INFO, " * EAS password protection%s supported", ((recv[4] & 0x08) ? "" : " not")); PrintAndLogEx(INFO, " * AFI password protection%s supported", ((recv[4] & 0x10) ? "" : " not")); PrintAndLogEx(INFO, " * Extended mode%s supported by INVENTORY READ command", ((recv[4] & 0x20) ? "" : " not")); PrintAndLogEx(INFO, " * EAS selection%s supported by extended mode in INVENTORY READ command", ((recv[4] & 0x40) ? "" : " not")); PrintAndLogEx(INFO, " * READ SIGNATURE command%s supported", support_signature ? "" : " not"); PrintAndLogEx(INFO, " * Password protection for READ SIGNATURE command%s supported", ((recv[5] & 0x02) ? "" : " not")); - PrintAndLogEx(INFO, " * STAY QUIET PERSISTENT command%s supported", ((recv[5] & 0x03) ? "" : " not")); + PrintAndLogEx(INFO, " * STAY QUIET PERSISTENT command%s supported", ((recv[5] & 0x04) ? "" : " not")); PrintAndLogEx(INFO, " * ENABLE PRIVACY command%s supported", ((recv[5] & 0x10) ? "" : " not")); PrintAndLogEx(INFO, " * DESTROY command%s supported", ((recv[5] & 0x20) ? "" : " not")); - PrintAndLogEx(INFO, " * Additional 32 bits feature flags are%s transmitted", ((recv[5] & 0x80) ? "" : " not")); + PrintAndLogEx(INFO, " * Additional 32 bits feature flags are%s transmitted", ((recv[7] & 0x80) ? "" : " not")); if (support_easmode) { reqlen = 0; From 8bbc5934b5719ff34773c35bc07bd86dd207cbe9 Mon Sep 17 00:00:00 2001 From: mhjack Date: Sun, 1 Jan 2023 00:59:49 -0600 Subject: [PATCH 133/924] Add detection and info command behavior for NTAG 5 devices, enable EAS status check in info command for SLI, SLIX, SLIX-L, and SLIX-S tags which all support EAS mode (cherry picked from commit a430439f05654fe62c365f4c8f5ee13cb4103dfa) --- client/src/cmdhf15.c | 170 ++++++++++++++++++++++++++----------------- 1 file changed, 102 insertions(+), 68 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index c35df7238..76fc4869a 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -99,6 +99,7 @@ static const productName_t uidmapping[] = { //I-Code SLIX-L [IC id = 03 + bit36 set to 1] { 0xE004000000000000LL, 16, "NXP Semiconductors Germany (Philips)" }, { 0xE004010000000000LL, 24, "NXP(Philips); IC SL2 ICS20/ICS21(SLI) ICS2002/ICS2102(SLIX) ICS2602(SLIX2)" }, + { 0xE004011800000000LL, 0xFFFFFF1800000000LL, "NXP(Philips); IC NTP53x2/NTP5210/NTA5332(NTAG 5)" }, { 0xE004010000000000LL, 0xFFFFFF1800000000LL, "NXP(Philips); IC SL2 ICS20/ICS21(SLI)" }, { 0xE004011000000000LL, 0xFFFFFF1800000000LL, "NXP(Philips); IC SL2 ICS2002/ICS2102(SLIX)" }, { 0xE004010800000000LL, 0xFFFFFF1800000000LL, "NXP(Philips); IC SL2 ICS2602(SLIX2)" }, @@ -651,6 +652,95 @@ static int CmdHF15Samples(const char *Cmd) { return PM3_SUCCESS; } +static int NxpTestEAS(uint8_t *uid) +{ + uint8_t fast = 1; + uint8_t reply = 1; + PacketResponseNG resp; + uint16_t reqlen = 0; + uint8_t req[PM3_CMD_DATA_SIZE] = {0}; + + req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; + req[reqlen++] = ISO15693_EAS_ALARM; + req[reqlen++] = 0x04; // IC manufacturer code + memcpy(req + 3, uid, 8); // add UID + reqlen += 8; + + AddCrc15(req, reqlen); + reqlen += 2; + + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); + + if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "iso15693 timeout"); + } else { + PrintAndLogEx(NORMAL, ""); + + + if (resp.length < 2) { + PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is not active"); + } else { + uint8_t * recv = resp.data.asBytes; + + if (!(recv[0] & ISO15_RES_ERROR)) { + PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is active."); + PrintAndLogEx(INFO, " EAS sequence: %s", sprint_hex(recv + 1, 32)); + } + } + } + + return PM3_SUCCESS; +} + +static int NxpCheckSig(uint8_t *uid) { + uint8_t fast = 1; + uint8_t reply = 1; + PacketResponseNG resp; + uint16_t reqlen = 0; + uint8_t req[PM3_CMD_DATA_SIZE] = {0}; + + // Check if we can also read the signature + req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; + req[reqlen++] = ISO15693_READ_SIGNATURE; + req[reqlen++] = 0x04; // IC manufacturer code + memcpy(req + 3, uid, 8); // add UID + reqlen += 8; + + AddCrc15(req, reqlen); + reqlen += 2; + + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); + + if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "iso15693 timeout"); + DropField(); + return PM3_ETIMEOUT; + } + + DropField(); + + if (resp.length < 2) { + PrintAndLogEx(WARNING, "iso15693 card doesn't answer to READ SIGNATURE command"); + return PM3_EWRONGANSWER; + } + + uint8_t *recv = resp.data.asBytes; + + if ((recv[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); + return PM3_EWRONGANSWER; + } + + uint8_t signature[32] = {0x00}; + memcpy(signature, recv + 1, 32); + + nxp_15693_print_signature(uid, signature); + + return PM3_SUCCESS; +} + // Get NXP system information from SLIX2 tag/VICC static int NxpSysInfo(uint8_t *uid) { @@ -732,77 +822,11 @@ static int NxpSysInfo(uint8_t *uid) { PrintAndLogEx(INFO, " * Additional 32 bits feature flags are%s transmitted", ((recv[5] & 0x80) ? "" : " not")); if (support_easmode) { - reqlen = 0; - req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; - req[reqlen++] = ISO15693_EAS_ALARM; - req[reqlen++] = 0x04; // IC manufacturer code - memcpy(req + 3, uid, 8); // add UID - reqlen += 8; - - AddCrc15(req, reqlen); - reqlen += 2; - - clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); - - if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { - PrintAndLogEx(WARNING, "iso15693 timeout"); - } else { - PrintAndLogEx(NORMAL, ""); - - - if (resp.length < 2) { - PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is not active"); - } else { - recv = resp.data.asBytes; - - if (!(recv[0] & ISO15_RES_ERROR)) { - PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is active."); - PrintAndLogEx(INFO, " EAS sequence: %s", sprint_hex(recv + 1, 32)); - } - } - } + NxpTestEAS(uid); } if (support_signature) { - // Check if we can also read the signature - reqlen = 0; - req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; - req[reqlen++] = ISO15693_READ_SIGNATURE; - req[reqlen++] = 0x04; // IC manufacturer code - memcpy(req + 3, uid, 8); // add UID - reqlen += 8; - - AddCrc15(req, reqlen); - reqlen += 2; - - clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); - - if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { - PrintAndLogEx(WARNING, "iso15693 timeout"); - DropField(); - return PM3_ETIMEOUT; - } - - DropField(); - - if (resp.length < 2) { - PrintAndLogEx(WARNING, "iso15693 card doesn't answer to READ SIGNATURE command"); - return PM3_EWRONGANSWER; - } - - recv = resp.data.asBytes; - - if ((recv[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSWER; - } - - uint8_t signature[32] = {0x00}; - memcpy(signature, recv + 1, 32); - - nxp_15693_print_signature(uid, signature); + NxpCheckSig(uid); } return PM3_SUCCESS; @@ -945,6 +969,16 @@ static int CmdHF15Info(const char *Cmd) { PrintAndLogEx(DEBUG, "SLIX2 Detected, getting NXP System Info"); return NxpSysInfo(uid); } + else if(data[8] == 0x04 && data[7] == 0x01 && nxp_version == 0x18) //If it is an NTAG 5 + { + PrintAndLogEx(DEBUG, "NTAG 5 Detected, getting NXP System Info"); + return NxpSysInfo(uid); + } + else if(data[8] == 0x04 && (data[7] == 0x01 || data[7] == 0x02 || data[7] == 0x03)) //If SLI, SLIX, SLIX-l, or SLIX-S check EAS status + { + PrintAndLogEx(DEBUG, "SLI, SLIX, SLIX-L, or SLIX-S Detected checking EAS status"); + return NxpTestEAS(uid); + } PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; From c33ce8f3936dd5f00a960e772ecb474a0b8c1698 Mon Sep 17 00:00:00 2001 From: mjacksn Date: Mon, 23 Jan 2023 10:52:47 -0600 Subject: [PATCH 134/924] changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4cde2d93..c046f0094 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1363,6 +1363,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Mifare simulation, `hf mf sim` (was broken a long time) (@pwpiwi) - Major improvements in LF area and data operations. (@marshmellow42, @iceman1001) - Issues regarding LF simulation (@pwpiwi) + - Issue interpreting NXP "get sys info" command return value for icode tags. (@mjacksn) ### Added - iClass functionality: full simulation of iclass tags, so tags can be simulated with data (not only CSN). Not yet support for write/update, but readers do not seem to enforce update. (@holiman). From 002d0ac24f245012bfe0835bd1cb44a0a176e353 Mon Sep 17 00:00:00 2001 From: mjacksn Date: Mon, 23 Jan 2023 10:57:32 -0600 Subject: [PATCH 135/924] changelog addition --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4cde2d93..c456ac64d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1367,3 +1367,5 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ### Added - iClass functionality: full simulation of iclass tags, so tags can be simulated with data (not only CSN). Not yet support for write/update, but readers do not seem to enforce update. (@holiman). - iClass decryption. Proxmark can now decrypt data on an iclass tag, but requires you to have the HID decryption key locally on your computer, as this is not bundled with the sourcecode. + - `hf 15 info` can detect NTAG 5 tags + - `hf 15 info` include an EAS status check on more of the icode tags which support EAS (SLI, SLIX, SLIX-L, and SLIX-S) \ No newline at end of file From da84eb62064db6387d7424f4974d2d8e46934ed5 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Mon, 23 Jan 2023 20:41:00 +0100 Subject: [PATCH 136/924] proper way --- Makefile.platform.sample | 2 +- client/src/cmdhw.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.platform.sample b/Makefile.platform.sample index 5dc19e8f0..bfcb5b749 100644 --- a/Makefile.platform.sample +++ b/Makefile.platform.sample @@ -5,7 +5,7 @@ PLATFORM=PM3RDV4 #PLATFORM=PM3GENERIC # If you want more than one PLATFORM_EXTRAS option, separate them by spaces: #PLATFORM_EXTRAS=BTADDON -#STANDALONE=LF_SAMYRUN +STANDALONE=HF_BOG # To accelerate repetitive compilations: # Install package "ccache" -> Debian/Ubuntu: /usr/lib/ccache, Fedora/CentOS/RHEL: /usr/lib64/ccache diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index 0efa5eafe..b3f80e218 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -1202,7 +1202,7 @@ void pm3_version_short(void) { } } - PrintAndLogEx(NORMAL, " Target.... %s", (is_genuine_rdv4) ? _YELLOW_("RDV4") : _RED_("device / fw mismatch")); + PrintAndLogEx(NORMAL, " Target.... %s", (is_genuine_rdv4) ? _YELLOW_("RDV4") : _YELLOW_("PM3 GENERIC")); } else { PrintAndLogEx(NORMAL, " Target.... %s", _YELLOW_("PM3 GENERIC")); } @@ -1291,8 +1291,8 @@ void pm3_version(bool verbose, bool oneliner) { } } - PrintAndLogEx(NORMAL, " device.................... %s", (is_genuine_rdv4) ? _GREEN_("RDV4") : _RED_("device / fw mismatch")); - PrintAndLogEx(NORMAL, " firmware.................. %s", (is_genuine_rdv4) ? _GREEN_("RDV4") : _YELLOW_("RDV4")); + PrintAndLogEx(NORMAL, " device.................... %s", (is_genuine_rdv4) ? _GREEN_("RDV4") : _GREEN_("PM3 GENERIC")); + PrintAndLogEx(NORMAL, " firmware.................. %s", (is_genuine_rdv4) ? _GREEN_("RDV4") : _GREEN_("PM3 GENERIC")); PrintAndLogEx(NORMAL, " external flash............ %s", IfPm3Flash() ? _GREEN_("present") : _YELLOW_("absent")); PrintAndLogEx(NORMAL, " smartcard reader.......... %s", IfPm3Smartcard() ? _GREEN_("present") : _YELLOW_("absent")); PrintAndLogEx(NORMAL, " FPC USART for BT add-on... %s", IfPm3FpcUsartHost() ? _GREEN_("present") : _YELLOW_("absent")); From 9a123d943d9a6784092794702404af269bff50d6 Mon Sep 17 00:00:00 2001 From: colonelborkmundus Date: Tue, 24 Jan 2023 00:46:04 -0500 Subject: [PATCH 137/924] add extra keys from flipper unleashed dictionary --- client/dictionaries/mfc_default_keys.dic | 64 ++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 881c72df0..381eabaf5 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1910,6 +1910,70 @@ D144BD193063 8627C10A7014 453857395635 # +# flipper unleashed additions +# +# Transport cards +E954024EE754 +0CD464CDC100 +BC305FE2DA65 +CF0EC6ACF2F9 +F7A545095C49 +6862FD600F78 +72A0C485D3F7 +6A530C91F85B +# RENFE MADRID (TRAIN) Extracted with detect reader +701AA491A4A5 +12BA20088ED3 +# MISC KEYS FROM MY OLD ACCESS CARDS +F18D91EE3033 +0E726E11CFCC +1D14130D1A0B +4ADLE273EAFL +3DFL4C8000A1 +E64Q986Q5D94 +201106141030 +# D144BD193063 (dupe) +01E2C14F1B18 +0380293A9E6D +08A55BC96DC1 +08ED3F92AA53 +0D61BA88789C +190E6242CE7B +1A8CFF2F1BC7 +25FE2B4E4FA9 +321803E38664 +381F84DB8134 +38540EEE8B1C +42F82DB5C4AF +507A6181E4BF +549BB4FD70C4 +57059FFD3EE6 +5E696FA0EAD1 +6036F9D72D68 +6611DFFAAE32 +6AC79644E0CD +735DD20237A9 +79E8B59A51E0 +7B6C00CBAC92 +7C3AF198425F +81C0BBCE32E9 +8D2B780A148D +9001D0E23F8C +A8700E07A58F +AE683AC2A232 +B6728D9B95BA +C290A397F84A +CA22AF33A19B +CBC83E1548B4 +CC5F59A0CE0A +D410EFF9113E +DE5865F29C44 +E108EA397A9A +E10F0E7A8DD5 +F833E24C3F1C +FA8CA10C7D59 +FE98F38F3EE2 +# ########################################## # added by colonelborkmundus # "the more, the marriott" mifare project From 4d2caaebc2a19d048c5fc53d76f1f7d6535aedeb Mon Sep 17 00:00:00 2001 From: Mikhail Elov Date: Tue, 24 Jan 2023 11:15:24 +0300 Subject: [PATCH 138/924] add gen4 GTU magic card command 'Set Ultralight and M1 maximum read/write sectors' --- doc/magic_cards_notes.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index c8decbfe2..07e6cb5d6 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -1086,6 +1086,7 @@ CF 35 <2b ATQA><1b SAK> // Configure ATQA/SAK (swap ATQ CF 68 <00-02> // Configure UID length CF 69 <00-01> // (De)Activate Ultralight mode CF 6A <00-03> // Select Ultralight mode +CF 6B <1b> // Set Ultralight and M1 maximum read/write sectors CF C6 // Dump configuration CF CC // Factory test, returns 6666 CF CD <1b block number><16b block data> // Backdoor write 16b block @@ -1304,6 +1305,19 @@ script run hf_mf_ultimatecard -m 02 ``` Now the card supports the 3DES UL-C authentication. +### Set Ultralight and M1 maximum read/write sectors +^[Top](#top) ^^[Gen4](#g4top) + +``` +hf 14a raw -s -c -t 1000 CF6B<1b blocks> +``` +Hexadecimal, maximum sector data, default 0xFF, range 0x00-0xFF + +Example: set maximum 63 blocks read/write for Mifare Classic 1K + +``` +hf 14a raw -s -c -t 1000 CF000000006B3F +``` ### Set shadow mode (GTU) ^[Top](#top) ^^[Gen4](#g4top) From e6b7efa9dfd6be76de49f96a0961fd934ce48979 Mon Sep 17 00:00:00 2001 From: Mikhail Elov Date: Tue, 24 Jan 2023 12:00:21 +0300 Subject: [PATCH 139/924] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c456ac64d..942100d85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added new magic gen4 cards command in docs (@McEloff) - Added `hf tesla info` - intital information command to read TESLA cards (@iceman1001) - Changed `hf emrtd info` - looking for lower case .bin extensions (@iceman1001) - Changed `hf emrtd dump` - looking for lower case .bin extensions (@iceman1001) From 689e9c2179f9565f32acb836ee9504b3b32385bf Mon Sep 17 00:00:00 2001 From: Mikhail Elov Date: Tue, 24 Jan 2023 15:44:28 +0300 Subject: [PATCH 140/924] Add new info about configuration dump gen4 GTU and description of unknown command --- doc/magic_cards_notes.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 07e6cb5d6..db8057e5e 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -1091,6 +1091,7 @@ CF C6 // Dump configuration CF CC // Factory test, returns 6666 CF CD <1b block number><16b block data> // Backdoor write 16b block CF CE <1b block number> // Backdoor read 16b block +CF CF <1b param> // Unknown CF F0 <30b configuration data> // Configure all params in one cmd CF F1 <30b configuration data> // Configure all params in one cmd and fuse the configuration permanently CF FE <4b new_password> // change password @@ -1379,6 +1380,20 @@ Example: write block0 with factory data, default pwd hf 14a raw -s -c -t 1000 CF00000000CD00112233441C000011778185BA18000000 ``` +### Unknown command +^[Top](#top) ^^[Gen4](#g4top) + +This command modifies one byte in configuration dump, but purpose one is unknown. + +``` +hf 14a raw -s -c -t 1000 CFCF<1b param> +``` + * `` + * `??`: ??? + +Example: +hf 14a raw -s -c -t 1000 CF00000000CF02 + ### Change backdoor password ^[Top](#top) ^^[Gen4](#g4top) @@ -1405,8 +1420,10 @@ hf 14a raw -s -c -t 1000 CFC6 ``` Default configuration: ``` -00000000000002000978009102DABC191010111213141516040008004F6B - ^^^^ ?? +00000000000002000978009102DABC191010111213141516040008006B024F6B + ^^^^ ?? + ^^ cf cmd cf: ?? this byte set by cmd cfcf, factory value 0x02 + ^^ cf cmd 6b: maximum read/write sectors, factory value 0x6b ^^ cf cmd 6a: UL mode ^^^^^^ cf cmd 35: ATQA/SAK ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cf cmd 34: ATS length & content From 844e6109b80141fa35d626b25b489ecb003ef8b2 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 24 Jan 2023 15:09:23 +0100 Subject: [PATCH 141/924] Add LF_PROX2BRUTE to build_all_firmwares.sh --- tools/build_all_firmwares.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index c6bb8969d..73e340d70 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -30,7 +30,7 @@ mkdir -p "$DEST" mv bootrom/obj/bootrom.elf "$DEST/PM3BOOTROM.elf" # cf armsrc/Standalone/Makefile.hal -STANDALONE_MODES=(LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID LF_NEDAP_SIM) +STANDALONE_MODES=(LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID LF_NEDAP_SIM) STANDALONE_MODES+=(HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI) STANDALONE_MODES_REQ_BT=(HF_REBLAY) STANDALONE_MODES_REQ_SMARTCARD=() From 248cec793c76824fd55be4383e26a107ca27d9ab Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 24 Jan 2023 15:21:59 +0100 Subject: [PATCH 142/924] standalone: respect alphabetical order, else it's a mess to cross-check --- armsrc/Standalone/Makefile.hal | 12 +- armsrc/Standalone/Makefile.inc | 136 +++++++++--------- armsrc/Standalone/readme.md | 10 +- .../4_Advanced-compilation-parameters.md | 2 +- tools/build_all_firmwares.sh | 6 +- 5 files changed, 88 insertions(+), 78 deletions(-) diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index 6b9343683..cb41bc148 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -50,12 +50,12 @@ define KNOWN_STANDALONE_DEFINITIONS | LF_ICEHID | LF HID collector to flashmem | | (RDV4 only) | | +----------------------------------------------------------+ -| LF_NEXID | LF Nexwatch collector to flashmem | -| (RDV4 only) | | -+----------------------------------------------------------+ | LF_NEDAP_SIM | LF Nedap ID simple simulator | | | | +----------------------------------------------------------+ +| LF_NEXID | LF Nexwatch collector to flashmem | +| (RDV4 only) | | ++----------------------------------------------------------+ | LF_PROXBRUTE | HID ProxII bruteforce | | | - Brad Antoniewicz | +----------------------------------------------------------+ @@ -125,8 +125,10 @@ define KNOWN_STANDALONE_DEFINITIONS endef -STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID LF_NEDAP_SIM -STANDALONE_MODES += HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI +STANDALONE_MODES := LF_SKELETON +STANDALONE_MODES += LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_NEDAP_SIM LF_NEXID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE +STANDALONE_MODES += HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY HF_TCPRST HF_TMUDFORD HF_YOUNG +STANDALONE_MODES += DANKARMULTI STANDALONE_MODES_REQ_BT := HF_REBLAY STANDALONE_MODES_REQ_SMARTCARD := STANDALONE_MODES_REQ_FLASH := LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG HF_COLIN HF_ICECLASS HF_LEGICSIM HF_MFCSIM diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index d3f88823e..48ac2217f 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -21,6 +21,42 @@ SRC_STANDALONE = placeholder.c ifneq (,$(findstring WITH_STANDALONE_LF_SKELETON,$(APP_CFLAGS))) SRC_STANDALONE = lf_skeleton.c endif +# WITH_STANDALONE_LF_EM4100EMUL +ifneq (,$(findstring WITH_STANDALONE_LF_EM4100EMUL,$(APP_CFLAGS))) + SRC_STANDALONE = lf_em4100emul.c +endif +# WITH_STANDALONE_LF_EM4100RSWB +ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RSWB,$(APP_CFLAGS))) + SRC_STANDALONE = lf_em4100rswb.c +endif +# WITH_STANDALONE_LF_EM4100RSWW +ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RSWW,$(APP_CFLAGS))) + SRC_STANDALONE = lf_em4100rsww.c +endif +# WITH_STANDALONE_LF_EM4100RWC +ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RWC,$(APP_CFLAGS))) + SRC_STANDALONE = lf_em4100rwc.c +endif +# WITH_STANDALONE_LF_HIDBRUTE +ifneq (,$(findstring WITH_STANDALONE_LF_HIDBRUTE,$(APP_CFLAGS))) + SRC_STANDALONE = lf_hidbrute.c +endif +# WITH_STANDALONE_LF_HIDFCBRUTE +ifneq (,$(findstring WITH_STANDALONE_LF_HIDFCBRUTE,$(APP_CFLAGS))) + SRC_STANDALONE = lf_hidfcbrute.c +endif +# WITH_STANDALONE_LF_ICEHID +ifneq (,$(findstring WITH_STANDALONE_LF_ICEHID,$(APP_CFLAGS))) + SRC_STANDALONE = lf_icehid.c +endif +# WITH_STANDALONE_LF_NEDAP_SIM +ifneq (,$(findstring WITH_STANDALONE_LF_NEDAP_SIM,$(APP_CFLAGS))) + SRC_STANDALONE = lf_nedap_sim.c +endif +# WITH_STANDALONE_LF_NEXID +ifneq (,$(findstring WITH_STANDALONE_LF_NEXID,$(APP_CFLAGS))) + SRC_STANDALONE = lf_nexid.c +endif # WITH_STANDALONE_LF_SAMYRUN ifneq (,$(findstring WITH_STANDALONE_LF_SAMYRUN,$(APP_CFLAGS))) SRC_STANDALONE = lf_samyrun.c @@ -33,29 +69,9 @@ endif ifneq (,$(findstring WITH_STANDALONE_LF_PROX2BRUTE,$(APP_CFLAGS))) SRC_STANDALONE = lf_prox2brute.c endif -# WITH_STANDALONE_LF_HIDBRUTE -ifneq (,$(findstring WITH_STANDALONE_LF_HIDBRUTE,$(APP_CFLAGS))) - SRC_STANDALONE = lf_hidbrute.c -endif -# WITH_STANDALONE_LF_HIDFCBRUTE -ifneq (,$(findstring WITH_STANDALONE_LF_HIDFCBRUTE,$(APP_CFLAGS))) - SRC_STANDALONE = lf_hidfcbrute.c -endif -# WITH_STANDALONE_HF_YOUNG -ifneq (,$(findstring WITH_STANDALONE_HF_YOUNG,$(APP_CFLAGS))) - SRC_STANDALONE = hf_young.c -endif -# WITH_STANDALONE_HF_MATTYRUN -ifneq (,$(findstring WITH_STANDALONE_HF_MATTYRUN,$(APP_CFLAGS))) - SRC_STANDALONE = hf_mattyrun.c -endif -# WITH_STANDALONE_HF_COLIN -ifneq (,$(findstring WITH_STANDALONE_HF_COLIN,$(APP_CFLAGS))) - SRC_STANDALONE = vtsend.c hf_colin.c frozen.c nprintf.c -endif -# WITH_STANDALONE_HF_BOG -ifneq (,$(findstring WITH_STANDALONE_HF_BOG,$(APP_CFLAGS))) - SRC_STANDALONE = hf_bog.c +# WITH_STANDALONE_LF_THAREXDE +ifneq (,$(findstring WITH_STANDALONE_LF_THAREXDE,$(APP_CFLAGS))) + SRC_STANDALONE = lf_tharexde.c endif # WITH_STANDALONE_HF_14ASNIFF ifneq (,$(findstring WITH_STANDALONE_HF_14ASNIFF,$(APP_CFLAGS))) @@ -73,33 +89,21 @@ endif ifneq (,$(findstring WITH_STANDALONE_HF_AVEFUL,$(APP_CFLAGS))) SRC_STANDALONE = hf_aveful.c endif -# WITH_STANDALONE_HF_TCPRST -ifneq (,$(findstring WITH_STANDALONE_HF_TCPRST,$(APP_CFLAGS))) - SRC_STANDALONE = hf_tcprst.c +# WITH_STANDALONE_HF_BOG +ifneq (,$(findstring WITH_STANDALONE_HF_BOG,$(APP_CFLAGS))) + SRC_STANDALONE = hf_bog.c endif -# WITH_STANDALONE_LF_ICEHID -ifneq (,$(findstring WITH_STANDALONE_LF_ICEHID,$(APP_CFLAGS))) - SRC_STANDALONE = lf_icehid.c +# WITH_STANDALONE_HF_COLIN +ifneq (,$(findstring WITH_STANDALONE_HF_COLIN,$(APP_CFLAGS))) + SRC_STANDALONE = vtsend.c hf_colin.c frozen.c nprintf.c endif -# WITH_STANDALONE_LF_NEXID -ifneq (,$(findstring WITH_STANDALONE_LF_NEXID,$(APP_CFLAGS))) - SRC_STANDALONE = lf_nexid.c +# WITH_STANDALONE_HF_CRAFTBYTE +ifneq (,$(findstring WITH_STANDALONE_HF_CRAFTBYTE,$(APP_CFLAGS))) + SRC_STANDALONE = hf_craftbyte.c endif -# WITH_STANDALONE_LF_EM4100EMUL -ifneq (,$(findstring WITH_STANDALONE_LF_EM4100EMUL,$(APP_CFLAGS))) - SRC_STANDALONE = lf_em4100emul.c -endif -# WITH_STANDALONE_LF_EM4100RSWB -ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RSWB,$(APP_CFLAGS))) - SRC_STANDALONE = lf_em4100rswb.c -endif -# WITH_STANDALONE_LF_EM4100RSWW -ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RSWW,$(APP_CFLAGS))) - SRC_STANDALONE = lf_em4100rsww.c -endif -# WITH_STANDALONE_LF_EM4100RWC -ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RWC,$(APP_CFLAGS))) - SRC_STANDALONE = lf_em4100rwc.c +# WITH_STANDALONE_HF_ICECLASS +ifneq (,$(findstring WITH_STANDALONE_HF_ICECLASS,$(APP_CFLAGS))) + SRC_STANDALONE = hf_iceclass.c endif # WITH_STANDALONE_HF_LEGIC ifneq (,$(findstring WITH_STANDALONE_HF_LEGIC,$(APP_CFLAGS))) @@ -109,37 +113,33 @@ endif ifneq (,$(findstring WITH_STANDALONE_HF_LEGICSIM,$(APP_CFLAGS))) SRC_STANDALONE = hf_legicsim.c endif +# WITH_STANDALONE_HF_MATTYRUN +ifneq (,$(findstring WITH_STANDALONE_HF_MATTYRUN,$(APP_CFLAGS))) + SRC_STANDALONE = hf_mattyrun.c +endif +# WITH_STANDALONE_HF_MFCSIM +ifneq (,$(findstring WITH_STANDALONE_HF_MFCSIM,$(APP_CFLAGS))) + SRC_STANDALONE = hf_mfcsim.c +endif # WITH_STANDALONE_HF_MSDSAL ifneq (,$(findstring WITH_STANDALONE_HF_MSDSAL,$(APP_CFLAGS))) SRC_STANDALONE = hf_msdsal.c endif -# WITH_STANDALONE_HF_ICECLASS -ifneq (,$(findstring WITH_STANDALONE_HF_ICECLASS,$(APP_CFLAGS))) - SRC_STANDALONE = hf_iceclass.c +# WITH_STANDALONE_HF_REBLAY +ifneq (,$(findstring WITH_STANDALONE_HF_REBLAY,$(APP_CFLAGS))) + SRC_STANDALONE = hf_reblay.c endif -# WITH_STANDALONE_LF_THAREXDE -ifneq (,$(findstring WITH_STANDALONE_LF_THAREXDE,$(APP_CFLAGS))) - SRC_STANDALONE = lf_tharexde.c -endif -# WITH_STANDALONE_HF_CRAFTBYTE -ifneq (,$(findstring WITH_STANDALONE_HF_CRAFTBYTE,$(APP_CFLAGS))) - SRC_STANDALONE = hf_craftbyte.c +# WITH_STANDALONE_HF_TCPRST +ifneq (,$(findstring WITH_STANDALONE_HF_TCPRST,$(APP_CFLAGS))) + SRC_STANDALONE = hf_tcprst.c endif # WITH_STANDALONE_HF_TMUDFORD ifneq (,$(findstring WITH_STANDALONE_HF_TMUDFORD,$(APP_CFLAGS))) SRC_STANDALONE = hf_tmudford.c endif - # WITH_STANDALONE_HF_REBLAY -ifneq (,$(findstring WITH_STANDALONE_HF_REBLAY,$(APP_CFLAGS))) - SRC_STANDALONE = hf_reblay.c -endif - # WITH_STANDALONE_HF_MFCSIM -ifneq (,$(findstring WITH_STANDALONE_HF_MFCSIM,$(APP_CFLAGS))) - SRC_STANDALONE = hf_mfcsim.c -endif -# WITH_STANDALONE_LF_NEDAP_SIM -ifneq (,$(findstring WITH_STANDALONE_LF_NEDAP_SIM,$(APP_CFLAGS))) - SRC_STANDALONE = lf_nedap_sim.c +# WITH_STANDALONE_HF_YOUNG +ifneq (,$(findstring WITH_STANDALONE_HF_YOUNG,$(APP_CFLAGS))) + SRC_STANDALONE = hf_young.c endif ifneq (,$(findstring WITH_STANDALONE_DANKARMULTI,$(APP_CFLAGS))) diff --git a/armsrc/Standalone/readme.md b/armsrc/Standalone/readme.md index 8cca3ce03..fe4bdfe1e 100644 --- a/armsrc/Standalone/readme.md +++ b/armsrc/Standalone/readme.md @@ -100,6 +100,8 @@ STANDALONE_MODES_REQ_FLASH := STANDALONE_MODES_REQ_BT := ``` +Please respect alphabetic order! + ## Update MAKEFILE.INC ^[Top](#top) @@ -117,6 +119,8 @@ ifneq (,$(findstring WITH_STANDALONE_LF_FOO,$(APP_CFLAGS))) endif ``` +Please respect alphabetic order! + ## Adding identification string of your mode ^[Top](#top) @@ -174,9 +178,11 @@ Once you're ready to share your mode, please * add a line in CHANGELOG.md * add your mode in the modes table in `doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md` -* add your mode in `tools/build_all_firmwares.sh` +* add your mode in `tools/build_all_firmwares.sh` such that it reflects `armsrc/Standalone/Makefile.hal` list of firmwares to build. -and submit your PR. +Please respect alphabetic order of standalone modes everywhere! + +Then submit your PR. Once approved, add also your mode in https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index ee8c63465..90af8fd8f 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -119,8 +119,8 @@ Here are the supported values you can assign to `STANDALONE` in `Makefile.platfo | HF_15SNIFF | 15693 sniff storing to flashmem - Glaser | HF_AVEFUL | MIFARE Ultralight read/simulation - Ave Ozkal | HF_BOG | 14a sniff with ULC/ULEV1/NTAG auth storing in flashmem - Bogito -| HF_CRAFTBYTE | UID stealer - Emulates scanned 14a UID - Anze Jensterle | HF_COLIN | Mifare ultra fast sniff/sim/clone - Colin Brigato +| HF_CRAFTBYTE | UID stealer - Emulates scanned 14a UID - Anze Jensterle | HF_ICECLASS | iCLASS 4-1 mode sim/read & dump/loclass/glitch & config to flashmem - Iceman1001 | HF_LEGIC | HF Legic Prime Read/Store/Sim standalone - uhei | HF_LEGICSIM | HF Legic Prime Simulate standalone - uhei diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index 73e340d70..b76f7a45a 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -30,8 +30,10 @@ mkdir -p "$DEST" mv bootrom/obj/bootrom.elf "$DEST/PM3BOOTROM.elf" # cf armsrc/Standalone/Makefile.hal -STANDALONE_MODES=(LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID LF_NEDAP_SIM) -STANDALONE_MODES+=(HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI) +STANDALONE_MODES=(LF_SKELETON) +STANDALONE_MODES+=(LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_NEDAP_SIM LF_NEXID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE) +STANDALONE_MODES+=(HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY HF_TCPRST HF_TMUDFORD HF_YOUNG) +STANDALONE_MODES+=(DANKARMULTI) STANDALONE_MODES_REQ_BT=(HF_REBLAY) STANDALONE_MODES_REQ_SMARTCARD=() STANDALONE_MODES_REQ_FLASH=(LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG HF_COLIN HF_ICECLASS HF_LEGICSIM HF_MFCSIM) From 1a6bb585502eb16c080f7a87f483219068cd8c6c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 24 Jan 2023 15:37:36 +0100 Subject: [PATCH 143/924] Add LF_PROX2BRUTE to 4_Advanced-compilation-parameters.md --- armsrc/Standalone/lf_prox2brute.c | 2 +- doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/armsrc/Standalone/lf_prox2brute.c b/armsrc/Standalone/lf_prox2brute.c index 0117e91e6..4f092007f 100644 --- a/armsrc/Standalone/lf_prox2brute.c +++ b/armsrc/Standalone/lf_prox2brute.c @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// Copyright (C) Brad Antoniewicz 2011 +// Copyright (C) Yann Gascuel 2023 // Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. // // This program is free software: you can redistribute it and/or modify diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index 90af8fd8f..fa1021d0c 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -111,6 +111,7 @@ Here are the supported values you can assign to `STANDALONE` in `Makefile.platfo | LF_NEDAP_SIM | LF Nedap ID simulator | LF_NEXID | Nexwatch credentials detection mode - jrjgjk & Zolorah | LF_PROXBRUTE | HID ProxII bruteforce - Brad Antoniewicz +| LF_PROX2BRUTE | HID ProxII bruteforce v2 - Yann Gascuel | LF_SAMYRUN (def)| HID26 read/clone/sim - Samy Kamkar | LF_SKELETON | standalone mode skeleton - Iceman1001 | LF_THAREXDE | LF EM4x50 simulator/read standalone mode - tharexde From 40f37c2c4236b4586e82e87fab777309f3fa5697 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Tue, 24 Jan 2023 15:41:40 +0100 Subject: [PATCH 144/924] Missing cmdhftesla.c in client/experimental_lib/CMakeLists.txt --- client/experimental_lib/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 3855d6884..675dda225 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -294,6 +294,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdhfseos.c ${PM3_ROOT}/client/src/cmdhfst.c ${PM3_ROOT}/client/src/cmdhfst25ta.c + ${PM3_ROOT}/client/src/cmdhftesla.c ${PM3_ROOT}/client/src/cmdhftexkom.c ${PM3_ROOT}/client/src/cmdhfthinfilm.c ${PM3_ROOT}/client/src/cmdhftopaz.c From 474aaed4b7a527f61a28012b271aa577e3e92b21 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 24 Jan 2023 23:01:28 +0100 Subject: [PATCH 145/924] Added a proper way to check if it is rdv4 fw --- armsrc/appmain.c | 6 ++++++ client/src/cmdhw.c | 10 +++++++--- client/src/cmdparser.c | 2 +- common_arm/Makefile.hal | 1 + include/pm3_cmd.h | 1 + 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 76d9ac3c0..80b85e93b 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -453,6 +453,12 @@ static void SendCapabilities(void) { capabilities.baudrate = g_usart_baudrate; #endif +#ifdef RDV4 + capabilities.is_rdv4 = true; +#else + capabilities.is_rdv4 = false; +#endif + #ifdef WITH_FLASH capabilities.compiled_with_flash = true; capabilities.hw_available_flash = FlashInit(); diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index b3f80e218..67f404bc9 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -1202,7 +1202,7 @@ void pm3_version_short(void) { } } - PrintAndLogEx(NORMAL, " Target.... %s", (is_genuine_rdv4) ? _YELLOW_("RDV4") : _YELLOW_("PM3 GENERIC")); + PrintAndLogEx(NORMAL, " Target.... %s", (is_genuine_rdv4) ? _YELLOW_("RDV4") : _RED_("device / fw mismatch")); } else { PrintAndLogEx(NORMAL, " Target.... %s", _YELLOW_("PM3 GENERIC")); } @@ -1291,13 +1291,17 @@ void pm3_version(bool verbose, bool oneliner) { } } - PrintAndLogEx(NORMAL, " device.................... %s", (is_genuine_rdv4) ? _GREEN_("RDV4") : _GREEN_("PM3 GENERIC")); - PrintAndLogEx(NORMAL, " firmware.................. %s", (is_genuine_rdv4) ? _GREEN_("RDV4") : _GREEN_("PM3 GENERIC")); + PrintAndLogEx(NORMAL, " device.................... %s", (is_genuine_rdv4) ? _GREEN_("RDV4") : _RED_("device / fw mismatch")); + PrintAndLogEx(NORMAL, " firmware.................. %s", (is_genuine_rdv4) ? _GREEN_("RDV4") : _YELLOW_("RDV4")); PrintAndLogEx(NORMAL, " external flash............ %s", IfPm3Flash() ? _GREEN_("present") : _YELLOW_("absent")); PrintAndLogEx(NORMAL, " smartcard reader.......... %s", IfPm3Smartcard() ? _GREEN_("present") : _YELLOW_("absent")); PrintAndLogEx(NORMAL, " FPC USART for BT add-on... %s", IfPm3FpcUsartHost() ? _GREEN_("present") : _YELLOW_("absent")); } else { PrintAndLogEx(NORMAL, " firmware.................. %s", _YELLOW_("PM3 GENERIC")); + if (IfPm3Flash()) { + PrintAndLogEx(NORMAL, " external flash............ %s", _GREEN_("present")); + } + if (IfPm3FpcUsartHost()) { PrintAndLogEx(NORMAL, " FPC USART for BT add-on... %s", _GREEN_("present")); } diff --git a/client/src/cmdparser.c b/client/src/cmdparser.c index 96c5f0fb3..1c360e832 100644 --- a/client/src/cmdparser.c +++ b/client/src/cmdparser.c @@ -38,7 +38,7 @@ bool IfPm3Present(void) { bool IfPm3Rdv4Fw(void) { if (!IfPm3Present()) return false; - return (g_pm3_capabilities.compiled_with_flash) || (g_pm3_capabilities.compiled_with_smartcard); + return (g_pm3_capabilities.is_rdv4); } bool IfPm3Flash(void) { diff --git a/common_arm/Makefile.hal b/common_arm/Makefile.hal index 68417eb60..0e9dd455b 100644 --- a/common_arm/Makefile.hal +++ b/common_arm/Makefile.hal @@ -95,6 +95,7 @@ ifeq ($(PLATFORM),PM3RDV4) PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH -DRDV4 PLTNAME = Proxmark3 RDV4 PLATFORM_FPGA = xc2s30 + RDV4 = yes else ifeq ($(PLATFORM),PM3OTHER) $(warning PLATFORM=PM3OTHER is deprecated, please use PLATFORM=PM3GENERIC) PLTNAME = Proxmark3 generic target diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 95750b9b7..83db2f05d 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -205,6 +205,7 @@ typedef struct { // rdv4 bool hw_available_flash : 1; bool hw_available_smartcard : 1; + bool is_rdv4 : 1; } PACKED capabilities_t; #define CAPABILITIES_VERSION 6 extern capabilities_t g_pm3_capabilities; From 1c3a1a0660974657da46b5f1d075279a52939e39 Mon Sep 17 00:00:00 2001 From: George Talusan Date: Wed, 25 Jan 2023 10:50:20 -0500 Subject: [PATCH 146/924] unconditionally recalculate pwd/pack for amiibo simulation --- client/luascripts/hf_mfu_amiibo_sim.lua | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/client/luascripts/hf_mfu_amiibo_sim.lua b/client/luascripts/hf_mfu_amiibo_sim.lua index 289e0b465..e00248c90 100644 --- a/client/luascripts/hf_mfu_amiibo_sim.lua +++ b/client/luascripts/hf_mfu_amiibo_sim.lua @@ -139,14 +139,10 @@ local function main(args) -- force lock bytes, otherwise the Amiibo won't be recognized blocks[16] = blocks[16]:sub(1, 4)..'0FE0' - -- add PWD and PACK if necessary + -- add PWD and PACK local uid = blocks[14]:sub(1, 6)..blocks[15]:sub(1, 8) - if blocks[147] == nil or blocks[147] == '00000000' then - blocks[147] = ("%08x"):format(bxor(bxor(tonumber(sub(uid, 2, 10), 16), tonumber(sub(uid, 6, 14), 16)), 0xaa55aa55)) - end - if blocks[148] == nil or blocks[148] == '00000000' then - blocks[148] = "80800000" - end + blocks[147] = ("%08x"):format(bxor(bxor(tonumber(sub(uid, 2, 10), 16), tonumber(sub(uid, 6, 14), 16)), 0xaa55aa55)) + blocks[148] = "80800000" err = LoadEmulator(uid, blocks) if err then return oops(err) end From 86d26f9464b9c3301a52f9b297509429aa4866e8 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Thu, 26 Jan 2023 01:13:27 +0100 Subject: [PATCH 147/924] Fix uninitialised stack-based buffers --- client/src/util.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/util.c b/client/src/util.c index 63141d01c..b13c5e3a9 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -266,7 +266,7 @@ void print_hex_break(const uint8_t *data, const size_t len, uint8_t breaks) { uint8_t mod = len % breaks; if (mod) { - char buf[UTIL_BUFFER_SIZE_SPRINT + 3]; + char buf[UTIL_BUFFER_SIZE_SPRINT + 3] = {0}; hex_to_buffer((uint8_t *)buf, data + i, mod, (sizeof(buf) - 1), 0, 1, true); // add the spaces... @@ -291,7 +291,7 @@ void print_hex_noascii_break(const uint8_t *data, const size_t len, uint8_t brea uint8_t mod = len % breaks; if (mod) { - char buf[UTIL_BUFFER_SIZE_SPRINT + 3]; + char buf[UTIL_BUFFER_SIZE_SPRINT + 3] = {0}; hex_to_buffer((uint8_t *)buf, data + i, mod, (sizeof(buf) - 1), 0, 0, true); // add the spaces... @@ -307,7 +307,7 @@ static void print_buffer_ex(const uint8_t *data, const size_t len, int level, ui if ((data == NULL) || (len < 1)) return; - char buf[UTIL_BUFFER_SIZE_SPRINT + 3]; + char buf[UTIL_BUFFER_SIZE_SPRINT + 3] = {0}; int i; for (i = 0; i < len; i += breaks) { @@ -614,7 +614,7 @@ void bytes_to_bytebits(const void *src, const size_t srclen, void *dest) { // hh,gg,ff,ee,dd,cc,bb,aa, pp,oo,nn,mm,ll,kk,jj,ii // up to 64 bytes or 512 bits uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize) { - static uint8_t buf[64]; + static uint8_t buf[64] = {0}; memset(buf, 0x00, 64); uint8_t *tmp = buf; for (uint8_t block = 0; block < (uint8_t)(len / blockSize); block++) { From da470c928c07b65c9737fe27a6af89357bedd2f1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 27 Jan 2023 02:53:54 +0100 Subject: [PATCH 148/924] data raw --fs -i, fix the accidental reverse of the invert param --- client/src/cmddata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 647c062a4..f9a0036d8 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1230,7 +1230,7 @@ int FSKrawDemod(uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow, bo PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, _YELLOW_("%s") " decoded bitstream", GetFSKType(fchigh, fclow, invert)); PrintAndLogEx(INFO, "-----------------------"); - printDemodBuff(0, false, invert, false); + printDemodBuff(0, false, false, false); } goto out; } else { From 67ef18f4ed00d5aa0b3cddb88c17eac0d46cde96 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 27 Jan 2023 02:54:30 +0100 Subject: [PATCH 149/924] prepping for more colors in the cli --- include/ansi.h | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/include/ansi.h b/include/ansi.h index c06c06e6b..59f546e39 100644 --- a/include/ansi.h +++ b/include/ansi.h @@ -21,18 +21,45 @@ #define AEND "\x1b[0m" -#define _BLUE_(s) "\x1b[34m" s AEND -#define _RED_(s) "\x1b[31m" s AEND -#define _GREEN_(s) "\x1b[32m" s AEND -#define _YELLOW_(s) "\x1b[33m" s AEND -#define _MAGENTA_(s) "\x1b[35m" s AEND -#define _CYAN_(s) "\x1b[36m" s AEND -#define _WHITE_(s) "\x1b[37m" s AEND +#define _BLACK_(s) "\x1b[30m" s AEND +#define _RED_(s) "\x1b[31m" s AEND +#define _GREEN_(s) "\x1b[32m" s AEND +#define _YELLOW_(s) "\x1b[33m" s AEND +#define _BLUE_(s) "\x1b[34m" s AEND +#define _MAGENTA_(s) "\x1b[35m" s AEND +#define _CYAN_(s) "\x1b[36m" s AEND +#define _WHITE_(s) "\x1b[37m" s AEND + +#define _BRIGHT_BLACK_(s) "\x1b[30;1m" s AEND +#define _BRIGHT_RED_(s) "\x1b[31;1m" s AEND +#define _BRIGHT_GREEN_(s) "\x1b[32;1m" s AEND +#define _BRIGHT_YELLOW_(s) "\x1b[33;1m" s AEND +#define _BRIGHT_BLUE_(s) "\x1b[34;1m" s AEND +#define _BRIGHT_MAGENTA_(s) "\x1b[35;1m" s AEND +#define _BRIGHT_CYAN_(s) "\x1b[36;1m" s AEND +#define _BRIGHT_WHITE_(s) "\x1b[37;1m" s AEND + +#define _BACK_BLACK_(s) "\x1b[40m" s AEND +#define _BACK_RED_(s) "\x1b[41m" s AEND +#define _BACK_GREEN_(s) "\x1b[42m" s AEND +#define _BACK_YELLOW_(s) "\x1b[43m" s AEND +#define _BACK_BLUE_(s) "\x1b[44m" s AEND +#define _BACK_MAGENTA_(s) "\x1b[45m" s AEND +#define _BACK_CYAN_(s) "\x1b[46m" s AEND +#define _BACK_WHITE_(s) "\x1b[47m" s AEND + +#define _BACK_BRIGHT_BLACK_(s) "\x1b[40;1m" s AEND +#define _BACK_BRIGHT_RED_(s) "\x1b[41;1m" s AEND +#define _BACK_BRIGHT_GREEN_(s) "\x1b[42;1m" s AEND +#define _BACK_BRIGHT_YELLOW_(s) "\x1b[43;1m" s AEND +#define _BACK_BRIGHT_BLUE_(s) "\x1b[44;1m" s AEND +#define _BACK_BRIGHT_MAGENTA_(s) "\x1b[45;1m" s AEND +#define _BACK_BRIGHT_CYAN_(s) "\x1b[46;1m" s AEND +#define _BACK_BRIGHT_WHITE_(s) "\x1b[47;1m" s AEND #define _CLEAR_ "\x1b[2J" #define _TOP_ "\x1b[1;1f" - #if defined(HAVE_READLINE) // https://wiki.hackzine.org/development/misc/readline-color-prompt.html // Applications may indicate that the prompt contains From 37d059d56fb0415a8a6daecddea69eb40857306f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 27 Jan 2023 03:00:26 +0100 Subject: [PATCH 150/924] style --- armsrc/Standalone/lf_prox2brute.c | 14 ++--- client/src/cmdhf15.c | 95 +++++++++++++++---------------- client/src/cmdhflist.c | 2 +- client/src/cmdhftesla.c | 12 ++-- client/src/cmdscript.c | 2 +- client/src/pm3line_vocabulory.h | 9 ++- doc/commands.json | 55 ++++++++++++++++-- doc/commands.md | 33 +++++++---- 8 files changed, 137 insertions(+), 85 deletions(-) diff --git a/armsrc/Standalone/lf_prox2brute.c b/armsrc/Standalone/lf_prox2brute.c index 4f092007f..ecfaac9e3 100644 --- a/armsrc/Standalone/lf_prox2brute.c +++ b/armsrc/Standalone/lf_prox2brute.c @@ -57,19 +57,19 @@ void RunMod(void) { WDT_HIT(); // exit from SamyRun, send a usbcommand. if (data_available()) { // early exit - DbpString("[=] You can take the shell back :) ..."); + DbpString("[=] You can take the shell back :) ..."); LEDsoff(); return; } } - + LED_C_ON(); WAIT_BUTTON_RELEASED(); // We are now ready to start brutforcing card numbers LEDsoff(); Dbprintf("[=] Starting HID ProxII Bruteforce from card %08x to %08x", CARDNUM_START, MIN(CARDNUM_END, 0xFFFF)); - + for (cardnum = CARDNUM_START ; cardnum <= MIN(CARDNUM_END, 0xFFFF) ; cardnum++) { WDT_HIT(); @@ -92,14 +92,14 @@ void RunMod(void) { // switch leds to be able to know (aproximatly) which card number worked (64 tries loop) LED_A_INV(); // switch led A every try - if ((cardnum-CARDNUM_START) % 8 == 7) // switch led B every 8 tries + if ((cardnum - CARDNUM_START) % 8 == 7) // switch led B every 8 tries LED_B_INV(); - if ((cardnum-CARDNUM_START) % 16 == 15) // switch led C every 16 tries + if ((cardnum - CARDNUM_START) % 16 == 15) // switch led C every 16 tries LED_C_INV(); - if ((cardnum-CARDNUM_START) % 32 == 31) // switch led D every 32 tries + if ((cardnum - CARDNUM_START) % 32 == 31) // switch led D every 32 tries LED_D_INV(); } - + SpinErr((LED_A | LED_B | LED_C | LED_D), 250, 5); // Xmax tree Dbprintf("[=] Ending HID ProxII Bruteforce from card %08x to %08x", CARDNUM_START, cardnum - 1); diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 76fc4869a..035a2218e 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -652,14 +652,13 @@ static int CmdHF15Samples(const char *Cmd) { return PM3_SUCCESS; } -static int NxpTestEAS(uint8_t *uid) -{ - uint8_t fast = 1; +static int NxpTestEAS(uint8_t *uid) { + uint8_t fast = 1; uint8_t reply = 1; PacketResponseNG resp; uint16_t reqlen = 0; uint8_t req[PM3_CMD_DATA_SIZE] = {0}; - + req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; req[reqlen++] = ISO15693_EAS_ALARM; req[reqlen++] = 0x04; // IC manufacturer code @@ -681,7 +680,7 @@ static int NxpTestEAS(uint8_t *uid) if (resp.length < 2) { PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is not active"); } else { - uint8_t * recv = resp.data.asBytes; + uint8_t *recv = resp.data.asBytes; if (!(recv[0] & ISO15_RES_ERROR)) { PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is active."); @@ -689,56 +688,56 @@ static int NxpTestEAS(uint8_t *uid) } } } - + return PM3_SUCCESS; -} +} static int NxpCheckSig(uint8_t *uid) { - uint8_t fast = 1; + uint8_t fast = 1; uint8_t reply = 1; PacketResponseNG resp; uint16_t reqlen = 0; uint8_t req[PM3_CMD_DATA_SIZE] = {0}; - - // Check if we can also read the signature - req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; - req[reqlen++] = ISO15693_READ_SIGNATURE; - req[reqlen++] = 0x04; // IC manufacturer code - memcpy(req + 3, uid, 8); // add UID - reqlen += 8; - AddCrc15(req, reqlen); - reqlen += 2; + // Check if we can also read the signature + req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; + req[reqlen++] = ISO15693_READ_SIGNATURE; + req[reqlen++] = 0x04; // IC manufacturer code + memcpy(req + 3, uid, 8); // add UID + reqlen += 8; - clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); + AddCrc15(req, reqlen); + reqlen += 2; - if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { - PrintAndLogEx(WARNING, "iso15693 timeout"); - DropField(); - return PM3_ETIMEOUT; - } + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); - DropField(); + if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "iso15693 timeout"); + DropField(); + return PM3_ETIMEOUT; + } - if (resp.length < 2) { - PrintAndLogEx(WARNING, "iso15693 card doesn't answer to READ SIGNATURE command"); - return PM3_EWRONGANSWER; - } + DropField(); - uint8_t *recv = resp.data.asBytes; + if (resp.length < 2) { + PrintAndLogEx(WARNING, "iso15693 card doesn't answer to READ SIGNATURE command"); + return PM3_EWRONGANSWER; + } - if ((recv[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSWER; - } + uint8_t *recv = resp.data.asBytes; - uint8_t signature[32] = {0x00}; - memcpy(signature, recv + 1, 32); + if ((recv[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); + return PM3_EWRONGANSWER; + } - nxp_15693_print_signature(uid, signature); - - return PM3_SUCCESS; + uint8_t signature[32] = {0x00}; + memcpy(signature, recv + 1, 32); + + nxp_15693_print_signature(uid, signature); + + return PM3_SUCCESS; } // Get NXP system information from SLIX2 tag/VICC @@ -822,11 +821,11 @@ static int NxpSysInfo(uint8_t *uid) { PrintAndLogEx(INFO, " * Additional 32 bits feature flags are%s transmitted", ((recv[5] & 0x80) ? "" : " not")); if (support_easmode) { - NxpTestEAS(uid); + NxpTestEAS(uid); } if (support_signature) { - NxpCheckSig(uid); + NxpCheckSig(uid); } return PM3_SUCCESS; @@ -968,16 +967,12 @@ static int CmdHF15Info(const char *Cmd) { if (data[8] == 0x04 && data[7] == 0x01 && nxp_version == 0x08) { PrintAndLogEx(DEBUG, "SLIX2 Detected, getting NXP System Info"); return NxpSysInfo(uid); - } - else if(data[8] == 0x04 && data[7] == 0x01 && nxp_version == 0x18) //If it is an NTAG 5 - { - PrintAndLogEx(DEBUG, "NTAG 5 Detected, getting NXP System Info"); + } else if (data[8] == 0x04 && data[7] == 0x01 && nxp_version == 0x18) { //If it is an NTAG 5 + PrintAndLogEx(DEBUG, "NTAG 5 Detected, getting NXP System Info"); return NxpSysInfo(uid); - } - else if(data[8] == 0x04 && (data[7] == 0x01 || data[7] == 0x02 || data[7] == 0x03)) //If SLI, SLIX, SLIX-l, or SLIX-S check EAS status - { - PrintAndLogEx(DEBUG, "SLI, SLIX, SLIX-L, or SLIX-S Detected checking EAS status"); - return NxpTestEAS(uid); + } else if (data[8] == 0x04 && (data[7] == 0x01 || data[7] == 0x02 || data[7] == 0x03)) { //If SLI, SLIX, SLIX-l, or SLIX-S check EAS status + PrintAndLogEx(DEBUG, "SLI, SLIX, SLIX-L, or SLIX-S Detected checking EAS status"); + return NxpTestEAS(uid); } PrintAndLogEx(NORMAL, ""); diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index a19ecdea9..232d4af19 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -318,7 +318,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "AUTH-B(%d)", cmd[1]); break; } - case MIFARE_MAGIC_GDM_AUTH_KEYA:{ + case MIFARE_MAGIC_GDM_AUTH_KEYA: { if (cmdsize > 3) { snprintf(exp, size, "MAGIC AUTH-A(%d)", cmd[1]); MifareAuthState = masNt; diff --git a/client/src/cmdhftesla.c b/client/src/cmdhftesla.c index 2680daa90..58f51f4c5 100644 --- a/client/src/cmdhftesla.c +++ b/client/src/cmdhftesla.c @@ -29,7 +29,7 @@ #include "commonutil.h" // get_sw #include "protocols.h" // ISO7816 APDU return co-des #include "ui.h" -#include "cmdhf14a.h" // apdu chaining +#include "cmdhf14a.h" // apdu chaining #define TIMEOUT 2000 @@ -160,10 +160,10 @@ static int info_hf_tesla(void) { sw = get_sw(response, resplen); if (sw == ISO7816_OK) { - // save CETT for later + // save CETT for later uint8_t cert[515] = {0}; memcpy(cert, response, resplen - 2); - + PrintAndLogEx(INFO, "CERT # %i", i); PrintAndLogEx(INFO, "%s", sprint_hex_inrow(cert, resplen - 2)); } @@ -198,12 +198,12 @@ static int info_hf_tesla(void) { PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "PUBLIC KEY"); - for (int i=0; i < 3; i++) { + for (int i = 0; i < 3; i++) { PrintAndLogEx(INFO, "%d - %s", i, sprint_hex_inrow(pk[i], 65)); } if (form_factor[1] == 1) { PrintAndLogEx(INFO, "Form factor... %s (card)", sprint_hex_inrow(form_factor, sizeof(form_factor))); - } else if (form_factor[1] == 2){ + } else if (form_factor[1] == 2) { PrintAndLogEx(INFO, "Form factor... %s (phone app)", sprint_hex_inrow(form_factor, sizeof(form_factor))); } @@ -217,7 +217,7 @@ static int info_hf_tesla(void) { if ((memcmp(pk[0], pk[1], 65) == 0)) { PrintAndLogEx(INFO, " GaussKey detected"); } - // + // return PM3_SUCCESS; } diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 57cf54084..114205708 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -433,7 +433,7 @@ static int CmdScriptRun(const char *Cmd) { #else // The following line will implicitly pre-initialize Python PyConfig_SetBytesArgv(&py_conf, argc + 1, argv); - + // We disallowed in py_conf environment variables interfering with python interpreter's behavior. // Let's manually enable the ones we truly need. // This is required by Proxspace to work with an isolated Python configuration diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 5a517c645..4cd9457b5 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -438,6 +438,12 @@ const static vocabulory_t vocabulory[] = { { 0, "hf st25ta protect" }, { 0, "hf st25ta pwd" }, { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, { 1, "hf thinfilm help" }, { 0, "hf thinfilm info" }, { 1, "hf thinfilm list" }, @@ -453,9 +459,6 @@ const static vocabulory_t vocabulory[] = { { 0, "hf topaz rdbl" }, { 1, "hf topaz view" }, { 0, "hf topaz wrbl" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, { 1, "hf xerox help" }, { 0, "hf xerox info" }, { 0, "hf xerox reader" }, diff --git a/doc/commands.json b/doc/commands.json index 1c21f81ba..bb781adb7 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -1101,14 +1101,16 @@ "command": "hf 14a chaining", "description": "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", "notes": [ - "hf 14a chaining disable -> disable chaining", + "hf 14a chaining --off -> disable chaining", "hf 14a chaining -> show chaining enable/disable state" ], "offline": false, "options": [ - "-h, --help This help" + "-h, --help This help", + "-1, --on enabled chaining", + "-0, --off disable chaining" ], - "usage": "hf 14a chaining [-h] []" + "usage": "hf 14a chaining [-h10]" }, "hf 14a config": { "command": "hf 14a config", @@ -2881,7 +2883,7 @@ }, "hf help": { "command": "hf help", - "description": "-------- ----------------------- High Frequency ----------------------- 14a { ISO14443A RFIDs... } 14b { ISO14443B RFIDs... } 15 { ISO15693 RFIDs... } cipurse { Cipurse transport Cards... } epa { German Identification Card... } emrtd { Machine Readable Travel Document... } felica { ISO18092 / FeliCa RFIDs... } fido { FIDO and FIDO2 authenticators... } fudan { Fudan RFIDs... } gallagher { Gallagher DESFire RFIDs... } ksx6924 { KS X 6924 (T-Money, Snapper+) RFIDs } jooki { Jooki RFIDs... } iclass { ICLASS RFIDs... } legic { LEGIC RFIDs... } lto { LTO Cartridge Memory RFIDs... } mf { MIFARE RFIDs... } mfp { MIFARE Plus RFIDs... } mfu { MIFARE Ultralight RFIDs... } mfdes { MIFARE Desfire RFIDs... } ntag424 { NXP NTAG 4242 DNA RFIDs... } seos { SEOS RFIDs... } st25ta { ST25TA RFIDs... } thinfilm { Thinfilm RFIDs... } topaz { TOPAZ (NFC Type 1) RFIDs... } texkom { Texkom RFIDs... } xerox { Fuji/Xerox cartridge RFIDs... } waveshare { Waveshare NFC ePaper... } ----------- --------------------- General --------------------- help This help list List protocol data in trace buffer search Search for known HF tags", + "description": "-------- ----------------------- High Frequency ----------------------- 14a { ISO14443A RFIDs... } 14b { ISO14443B RFIDs... } 15 { ISO15693 RFIDs... } cipurse { Cipurse transport Cards... } epa { German Identification Card... } emrtd { Machine Readable Travel Document... } felica { ISO18092 / FeliCa RFIDs... } fido { FIDO and FIDO2 authenticators... } fudan { Fudan RFIDs... } gallagher { Gallagher DESFire RFIDs... } ksx6924 { KS X 6924 (T-Money, Snapper+) RFIDs } jooki { Jooki RFIDs... } iclass { ICLASS RFIDs... } legic { LEGIC RFIDs... } lto { LTO Cartridge Memory RFIDs... } mf { MIFARE RFIDs... } mfp { MIFARE Plus RFIDs... } mfu { MIFARE Ultralight RFIDs... } mfdes { MIFARE Desfire RFIDs... } ntag424 { NXP NTAG 4242 DNA RFIDs... } seos { SEOS RFIDs... } st25ta { ST25TA RFIDs... } tesla { TESLA Cards... } texkom { Texkom RFIDs... } thinfilm { Thinfilm RFIDs... } topaz { TOPAZ (NFC Type 1) RFIDs... } xerox { Fuji/Xerox cartridge RFIDs... } waveshare { Waveshare NFC ePaper... } ----------- --------------------- General --------------------- help This help list List protocol data in trace buffer search Search for known HF tags", "notes": [], "offline": true, "options": [], @@ -6684,6 +6686,47 @@ ], "usage": "hf st25ta sim [-h] -u " }, + "hf tesla help": { + "command": "hf tesla help", + "description": "help This help list List ISO 14443A/7816 history", + "notes": [], + "offline": true, + "options": [], + "usage": "" + }, + "hf tesla info": { + "command": "hf tesla info", + "description": "Get info about TESLA Key tag", + "notes": [ + "hf tesla info" + ], + "offline": false, + "options": [ + "-h, --help This help" + ], + "usage": "hf telsa info [-h]" + }, + "hf tesla list": { + "command": "hf tesla list", + "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "notes": [ + "hf tesla list --frame -> show frame delay times", + "hf tesla list -1 -> use trace buffer" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-1, --buffer use data from trace buffer", + "--frame show frame delay times", + "-c mark CRC bytes", + "-r show relative times (gap and duration)", + "-u display times in microseconds instead of clock cycles", + "-x show hexdump to convert to pcap(ng)", + "or to import into Wireshark using encapsulation type \"ISO 14443\"", + "-f, --file filename of dictionary" + ], + "usage": "hf tesla list [-h1crux] [--frame] [-f ]" + }, "hf texkom help": { "command": "hf texkom help", "description": "help This help", @@ -11760,8 +11803,8 @@ } }, "metadata": { - "commands_extracted": 739, + "commands_extracted": 742, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-01-15T01:24:39" + "extracted_on": "2023-01-27T01:57:37" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 1c6110cea..79499915b 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -651,6 +651,28 @@ Check column "offline" for their availability. |`hf st25ta sim `|N |`Fake ISO 14443A/ST tag` +### hf tesla + + { TESLA Cards... } + +|command |offline |description +|------- |------- |----------- +|`hf tesla help `|Y |`This help` +|`hf tesla info `|N |`Tag information` +|`hf tesla list `|Y |`List ISO 14443A/7816 history` + + +### hf texkom + + { Texkom RFIDs... } + +|command |offline |description +|------- |------- |----------- +|`hf texkom help `|Y |`This help` +|`hf texkom reader `|N |`Act like a Texkom reader` +|`hf texkom sim `|N |`Simulate a Texkom tag` + + ### hf thinfilm { Thinfilm RFIDs... } @@ -682,17 +704,6 @@ Check column "offline" for their availability. |`hf topaz wrbl `|N |`Write block` -### hf texkom - - { Texkom RFIDs... } - -|command |offline |description -|------- |------- |----------- -|`hf texkom help `|Y |`This help` -|`hf texkom reader `|N |`Act like a Texkom reader` -|`hf texkom sim `|N |`Simulate a Texkom tag` - - ### hf xerox { Fuji/Xerox cartridge RFIDs... } From 002823dd9b2009203148cc0b9a826611dceb2242 Mon Sep 17 00:00:00 2001 From: George Talusan Date: Wed, 25 Jan 2023 10:24:38 -0500 Subject: [PATCH 151/924] use Amiibo PACK if simulator PWD matches generated Amiibo PWD --- armsrc/iso14443a.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 23b46cf54..f5960626e 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1229,6 +1229,17 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r AddCrc14A(rPPS, sizeof(rPPS) - 2); + if (tagType == 7) { + uint8_t pwd[4]; + uint8_t gen_pwd[4]; + uint16_t start = (*pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH; + emlGetMemBt(pwd, start, sizeof(pwd)); + Uint4byteToMemBe(gen_pwd, ul_ev1_pwdgenB(data)); + if (memcmp(pwd, gen_pwd, sizeof(pwd)) == 0) { + rPACK[0] = 0x80; + rPACK[1] = 0x80; + } + } AddCrc14A(rPACK, sizeof(rPACK) - 2); static tag_response_info_t responses_init[] = { From 571b763f5c290892264a8207aef39e6c3b1c2a7d Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Jan 2023 15:04:08 +0100 Subject: [PATCH 152/924] Makefile.platform.sample reverted --- Makefile.platform.sample | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.platform.sample b/Makefile.platform.sample index bfcb5b749..4f8f86cd4 100644 --- a/Makefile.platform.sample +++ b/Makefile.platform.sample @@ -5,7 +5,7 @@ PLATFORM=PM3RDV4 #PLATFORM=PM3GENERIC # If you want more than one PLATFORM_EXTRAS option, separate them by spaces: #PLATFORM_EXTRAS=BTADDON -STANDALONE=HF_BOG +#STANDALONE=LF_SAMYRUN # To accelerate repetitive compilations: # Install package "ccache" -> Debian/Ubuntu: /usr/lib/ccache, Fedora/CentOS/RHEL: /usr/lib64/ccache @@ -13,4 +13,4 @@ STANDALONE=HF_BOG #export PATH := /usr/lib64/ccache:/usr/lib/ccache:${PATH} # To install with sudo: -INSTALLSUDO=sudo +INSTALLSUDO=sudo \ No newline at end of file From db01a3b360ab3eb371a33a5a93e6603b2aef64e4 Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Fri, 27 Jan 2023 11:23:00 -0600 Subject: [PATCH 153/924] Detect 50 pF version of NTAG 210u (micro) --- client/src/cmdhfmfu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index bc8c10859..a59859394 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1472,6 +1472,7 @@ uint32_t GetHF14AMfU_Type(void) { else if (memcmp(version, "\x00\x34\x21\x01\x01\x00\x0E", 7) == 0) { tagtype = UL_EV1_128; break; } // Mikron JSC Russia EV1 41 pages tag else if (memcmp(version, "\x00\x04\x04\x01\x01\x00\x0B", 7) == 0) { tagtype = NTAG_210; break; } else if (memcmp(version, "\x00\x04\x04\x01\x02\x00\x0B", 7) == 0) { tagtype = NTAG_210u; break; } + else if (memcmp(version, "\x00\x04\x04\x02\x02\x00\x0B", 7) == 0) { tagtype = NTAG_210u; break; } else if (memcmp(version, "\x00\x04\x04\x01\x01\x00\x0E", 7) == 0) { tagtype = NTAG_212; break; } else if (memcmp(version, "\x00\x04\x04\x02\x01\x00\x0F", 7) == 0) { tagtype = NTAG_213; break; } else if (memcmp(version, "\x00\x53\x04\x02\x01\x00\x0F", 7) == 0) { tagtype = NTAG_213; break; } //Shanghai Feiju Microelectronics Co. Ltd. China (Xiaomi Air Purifier filter) From 71389e0b17df92a9afb455e50fd3b630271b4563 Mon Sep 17 00:00:00 2001 From: Adrian Teuscher Date: Fri, 27 Jan 2023 19:37:40 +0100 Subject: [PATCH 154/924] Add function to brute force partial key --- armsrc/appmain.c | 4 ++ armsrc/em4x70.c | 106 +++++++++++++++++++++++++++++++++++++-- armsrc/em4x70.h | 1 + client/src/cmdlfem4x70.c | 101 ++++++++++++++++++++++++++++++++++++- client/src/cmdlfem4x70.h | 1 + include/em4x70.h | 3 ++ include/pm3_cmd.h | 1 + 7 files changed, 211 insertions(+), 6 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 756ca4f4f..e4d3354f8 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1221,6 +1221,10 @@ static void PacketReceived(PacketCommandNG *packet) { em4x70_write_key((em4x70_data_t *)packet->data.asBytes, true); break; } + case CMD_LF_EM4X70_BRUTE: { + em4x70_brute((em4x70_data_t *)packet->data.asBytes, true); + break; + } #endif #ifdef WITH_ZX8211 diff --git a/armsrc/em4x70.c b/armsrc/em4x70.c index 4dad5f236..545491447 100644 --- a/armsrc/em4x70.c +++ b/armsrc/em4x70.c @@ -21,6 +21,7 @@ #include "dbprint.h" #include "lfadc.h" #include "commonutil.h" +#include "optimized_cipherutils.h" #include "em4x70.h" #include "appmain.h" // tear @@ -85,7 +86,7 @@ static int em4x70_receive(uint8_t *bits, size_t length); static bool find_listen_window(bool command); static void init_tag(void) { - memset(tag.data, 0x00, ARRAYLEN(tag.data)); + memset(tag.data, 0x00, sizeof(tag.data)); } static void em4x70_setup_read(void) { @@ -298,14 +299,14 @@ static bool check_ack(void) { // returns true if signal structue corresponds to ACK, anything else is // counted as NAK (-> false) // ACK 64 + 64 - // NACK 64 + 48 + // NAK 64 + 48 if (check_pulse_length(get_pulse_length(FALLING_EDGE), 2 * EM4X70_T_TAG_FULL_PERIOD) && check_pulse_length(get_pulse_length(FALLING_EDGE), 2 * EM4X70_T_TAG_FULL_PERIOD)) { // ACK return true; } - // Othewise it was a NACK or Listen Window + // Otherwise it was a NAK or Listen Window return false; } @@ -339,7 +340,7 @@ static int authenticate(const uint8_t *rnd, const uint8_t *frnd, uint8_t *respon uint8_t grnd[EM4X70_MAX_RECEIVE_LENGTH] = {0}; int num = em4x70_receive(grnd, 20); if (num < 20) { - Dbprintf("Auth failed"); + if (g_dbglevel >= DBG_EXTENDED) Dbprintf("Auth failed"); return PM3_ESOFT; } bits2bytes(grnd, 24, response); @@ -349,6 +350,80 @@ static int authenticate(const uint8_t *rnd, const uint8_t *frnd, uint8_t *respon return PM3_ESOFT; } +static int set_byte(uint8_t *target, int value) { + int c = value > 0xFF; + *target = reflect8(value); + return c; +} + +static int bruteforce(const uint8_t address, const uint8_t *rnd, const uint8_t *frnd, uint16_t start_key, uint8_t *response) { + + uint8_t auth_resp[3] = {0}; + uint8_t rev_rnd[7]; + uint8_t temp_rnd[7]; + + reverse_arraycopy((uint8_t *)rnd, rev_rnd, sizeof(rnd)); + memcpy(temp_rnd, rnd, sizeof(temp_rnd)); + + for (int k = start_key; k <= 0xFFFF; ++k) { + int c = 0; + + WDT_HIT(); + + uint16_t rev_k = reflect16(k); + switch (address) { + case 9: + c = set_byte(&temp_rnd[0], rev_rnd[0] + (rev_k & 0xFF)); + c = set_byte(&temp_rnd[1], rev_rnd[1] + c + ((rev_k >> 8) & 0xFF)); + c = set_byte(&temp_rnd[2], rev_rnd[2] + c); + c = set_byte(&temp_rnd[3], rev_rnd[3] + c); + c = set_byte(&temp_rnd[4], rev_rnd[4] + c); + c = set_byte(&temp_rnd[5], rev_rnd[5] + c); + set_byte(&temp_rnd[6], rev_rnd[6] + c); + break; + + case 8: + c = set_byte(&temp_rnd[2], rev_rnd[2] + (rev_k & 0xFF)); + c = set_byte(&temp_rnd[3], rev_rnd[3] + c + ((rev_k >> 8) & 0xFF)); + c = set_byte(&temp_rnd[4], rev_rnd[4] + c); + c = set_byte(&temp_rnd[5], rev_rnd[5] + c); + set_byte(&temp_rnd[6], rev_rnd[6] + c); + break; + + case 7: + c = set_byte(&temp_rnd[4], rev_rnd[4] + (rev_k & 0xFF)); + c = set_byte(&temp_rnd[5], rev_rnd[5] + c + ((rev_k >> 8) & 0xFF)); + set_byte(&temp_rnd[6], rev_rnd[6] + c); + break; + + default: + Dbprintf("Bad block number given: %d", address); + return PM3_ESOFT; + } + + // Report progress every 256 attempts + if ((k % 0x100) == 0) { + Dbprintf("Trying: %04X", k); + } + + // Due to performance reason, we only try it once. Therefore you need a very stable RFID communcation. + if (authenticate(temp_rnd, frnd, auth_resp) == PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) + Dbprintf("Authentication success with rnd: %02X%02X%02X%02X%02X%02X%02X", temp_rnd[0], temp_rnd[1], temp_rnd[2], temp_rnd[3], temp_rnd[4], temp_rnd[5], temp_rnd[6]); + response[0] = (k >> 8) & 0xFF; + response[1] = k & 0xFF; + return PM3_SUCCESS; + } + + if (BUTTON_PRESS() || data_available()) { + Dbprintf("EM4x70 Bruteforce Interrupted"); + return PM3_EOPABORTED; + } + } + + return PM3_ESOFT; +} + static int send_pin(const uint32_t pin) { // sends pin code for unlocking @@ -576,7 +651,7 @@ static int em4x70_receive(uint8_t *bits, size_t length) { } if (!foundheader) { - Dbprintf("Failed to find read header"); + if (g_dbglevel >= DBG_EXTENDED) Dbprintf("Failed to find read header"); return 0; } @@ -738,6 +813,27 @@ void em4x70_auth(em4x70_data_t *etd, bool ledcontrol) { reply_ng(CMD_LF_EM4X70_AUTH, status, response, sizeof(response)); } +void em4x70_brute(em4x70_data_t *etd, bool ledcontrol) { + uint8_t status = 0; + uint8_t response[2] = {0}; + + command_parity = etd->parity; + + init_tag(); + em4x70_setup_read(); + + // Find the Tag + if (get_signalproperties() && find_em4x70_tag()) { + + // Bruteforce partial key + status = bruteforce(etd->address, etd->rnd, etd->frnd, etd->start_key, response) == PM3_SUCCESS; + } + + StopTicks(); + lf_finalize(ledcontrol); + reply_ng(CMD_LF_EM4X70_BRUTE, status, response, sizeof(response)); +} + void em4x70_write_pin(em4x70_data_t *etd, bool ledcontrol) { uint8_t status = 0; diff --git a/armsrc/em4x70.h b/armsrc/em4x70.h index 363f119e3..0fd640f86 100644 --- a/armsrc/em4x70.h +++ b/armsrc/em4x70.h @@ -32,6 +32,7 @@ typedef enum { void em4x70_info(em4x70_data_t *etd, bool ledcontrol); void em4x70_write(em4x70_data_t *etd, bool ledcontrol); +void em4x70_brute(em4x70_data_t *etd, bool ledcontrol); void em4x70_unlock(em4x70_data_t *etd, bool ledcontrol); void em4x70_auth(em4x70_data_t *etd, bool ledcontrol); void em4x70_write_pin(em4x70_data_t *etd, bool ledcontrol); diff --git a/client/src/cmdlfem4x70.c b/client/src/cmdlfem4x70.c index 7021b2b95..f008d9947 100644 --- a/client/src/cmdlfem4x70.c +++ b/client/src/cmdlfem4x70.c @@ -200,7 +200,7 @@ int CmdEM4x70Write(const char *Cmd) { } etd.address = (uint8_t) addr; - etd.word = BYTES2UINT16(word);; + etd.word = BYTES2UINT16(word); clearCommandBuffer(); SendCommandNG(CMD_LF_EM4X70_WRITE, (uint8_t *)&etd, sizeof(etd)); @@ -220,6 +220,104 @@ int CmdEM4x70Write(const char *Cmd) { return PM3_ESOFT; } +int CmdEM4x70Brute(const char *Cmd) { + + // From paper "Dismantling Megamos Crypto", Roel Verdult, Flavio D. Garcia and Barıs¸ Ege. + // Partial Key-Update Attack (optimized version) + em4x70_data_t etd = {0}; + + CLIParserContext *ctx; + + CLIParserInit(&ctx, "lf em 4x70 brute", + "Optimized partial key-update attack of 16-bit key block 7, 8 or 9 of an EM4x70\n" + "This attack does NOT write anything to the tag.\n" + "Before starting this attack, 0000 must be written to the 16-bit key block: 'lf em 4x70 write -b 9 -d 0000'.\n" + "After success, the 16-bit key block have to be restored with the key found: 'lf em 4x70 write -b 9 -d c0de'\n", + "lf em 4x70 brute -b 9 --rnd 45F54ADA252AAC --frn 4866BB70 --> bruteforcing key bits k95...k80\n" + ); + + void *argtable[] = { + arg_param_begin, + arg_lit0(NULL, "par", "Add parity bit when sending commands"), + arg_int1("b", "block", "", "block/word address, dec"), + arg_str1(NULL, "rnd", "", "Random 56-bit"), + arg_str1(NULL, "frn", "", "F(RN) 28-bit as 4 hex bytes"), + arg_str0("s", "start", "", "Start bruteforce enumeration from this key value"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + etd.parity = arg_get_lit(ctx, 1); + + int addr = arg_get_int_def(ctx, 2, 0); + if (addr < 7 || addr > 9) { + PrintAndLogEx(FAILED, "block has to be within range [7, 9] got: %d", addr); + return PM3_EINVARG; + } + etd.address = (uint8_t) addr; + + int rnd_len = 7; + CLIGetHexWithReturn(ctx, 3, etd.rnd, &rnd_len); + + int frnd_len = 4; + CLIGetHexWithReturn(ctx, 4, etd.frnd, &frnd_len); + + uint32_t start_key = 0; + int res = arg_get_u32_hexstr_def_nlen(ctx, 5, 0, &start_key, 2, true); + if (res == 2) { + CLIParserFree(ctx); + PrintAndLogEx(WARNING, "start key parameter must be in range [0, FFFF]"); + return PM3_EINVARG; + } + etd.start_key = start_key; + + CLIParserFree(ctx); + + if (rnd_len != 7) { + PrintAndLogEx(FAILED, "Random number length must be 7 bytes instead of %d", rnd_len); + return PM3_EINVARG; + } + + if (frnd_len != 4) { + PrintAndLogEx(FAILED, "F(RN) length must be 4 bytes instead of %d", frnd_len); + return PM3_EINVARG; + } + + PrintAndLogEx(INFO, "click " _GREEN_("pm3 button") " or press " _GREEN_("Enter") " to exit"); + clearCommandBuffer(); + PacketResponseNG resp; + SendCommandNG(CMD_LF_EM4X70_BRUTE, (uint8_t *)&etd, sizeof(etd)); + + uint32_t timeout = 0; + for (;;) { + + if (kbd_enter_pressed()) { + SendCommandNG(CMD_BREAK_LOOP, NULL, 0); + PrintAndLogEx(DEBUG, "User aborted"); + break; + } + + if (WaitForResponseTimeout(CMD_LF_EM4X70_BRUTE, &resp, TIMEOUT)) { + if (resp.status) { + // Response is 16-bit partial key + PrintAndLogEx(INFO, "Partial Key Response: %02X %02X", resp.data.asBytes[0], resp.data.asBytes[1]); + return PM3_SUCCESS; + } + break; + } + + // should be done in about 30 minutes + if (timeout > ((30 * 60000) / TIMEOUT)) { + PrintAndLogEx(WARNING, "\nNo response from Proxmark3. Aborting..."); + break; + } + timeout++; + } + + PrintAndLogEx(FAILED, "Bruteforce of partial key " _RED_("failed")); + return PM3_ESOFT; +} + int CmdEM4x70Unlock(const char *Cmd) { // send pin code to device, unlocking it for writing @@ -452,6 +550,7 @@ int CmdEM4x70WriteKey(const char *Cmd) { static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"brute", CmdEM4x70Brute, IfPm3EM4x70, "Bruteforce EM4X70 to find partial Crypt Key"}, {"info", CmdEM4x70Info, IfPm3EM4x70, "Tag information EM4x70"}, {"write", CmdEM4x70Write, IfPm3EM4x70, "Write EM4x70"}, {"unlock", CmdEM4x70Unlock, IfPm3EM4x70, "Unlock EM4x70 for writing"}, diff --git a/client/src/cmdlfem4x70.h b/client/src/cmdlfem4x70.h index 5d46af3ca..12599713b 100644 --- a/client/src/cmdlfem4x70.h +++ b/client/src/cmdlfem4x70.h @@ -26,6 +26,7 @@ int CmdLFEM4X70(const char *Cmd); int CmdEM4x70Info(const char *Cmd); int CmdEM4x70Write(const char *Cmd); +int CmdEM4x70Brute(const char *Cmd); int CmdEM4x70Unlock(const char *Cmd); int CmdEM4x70Auth(const char *Cmd); int CmdEM4x70WritePIN(const char *Cmd); diff --git a/include/em4x70.h b/include/em4x70.h index bce860bb1..734e83f48 100644 --- a/include/em4x70.h +++ b/include/em4x70.h @@ -42,6 +42,9 @@ typedef struct { // Used to write new key uint8_t crypt_key[12]; + // used for bruteforce the partial key + uint16_t start_key; + } em4x70_data_t; #endif /* EM4X70_H__ */ diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 95750b9b7..4f9917cfd 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -484,6 +484,7 @@ typedef struct { #define CMD_LF_EM4X70_AUTH 0x0263 #define CMD_LF_EM4X70_WRITEPIN 0x0264 #define CMD_LF_EM4X70_WRITEKEY 0x0265 +#define CMD_LF_EM4X70_BRUTE 0x0266 // Sampling configuration for LF reader/sniffer #define CMD_LF_SAMPLING_SET_CONFIG 0x021D #define CMD_LF_FSK_SIMULATE 0x021E From 3c655aeb19df1bd7e904c47dd97f16c0873abe91 Mon Sep 17 00:00:00 2001 From: Adrian Teuscher Date: Fri, 27 Jan 2023 20:24:53 +0100 Subject: [PATCH 155/924] Add entry to CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 942100d85..66ea8299e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `lf em 4x70 brute` command (@adite) - Added new magic gen4 cards command in docs (@McEloff) - Added `hf tesla info` - intital information command to read TESLA cards (@iceman1001) - Changed `hf emrtd info` - looking for lower case .bin extensions (@iceman1001) From 5a49beb83a6fdaf294630170c5de10f15e106580 Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Fri, 27 Jan 2023 19:22:48 -0600 Subject: [PATCH 156/924] added CHANGELOG.md entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 942100d85..f31361d9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001) - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) - Fixed `make accessrights` on Fedora (@mooey5775) + - Fixed `hf mfu info` - can now identify the 50 pF version of NTAG 210u(micro) (@mjacksn) ## [Radium.4.15864][2022-10-29] - Changed `lf indala sim` - now accepts fc / cn (@iceman1001) From 9041627ae55676003e5023507a2da3122d816012 Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Fri, 27 Jan 2023 22:46:40 -0600 Subject: [PATCH 157/924] Add `hf 15` sub-commands for EAS, AFI, privacy mode, and passwords on SLIX tags --- CHANGELOG.md | 2 + armsrc/appmain.c | 68 +++- armsrc/iso15693.c | 391 +++++++++++++++++-- armsrc/iso15693.h | 10 +- client/src/cmdhf15.c | 639 +++++++++++++++++++++++++++----- client/src/pm3line_vocabulory.h | 8 +- include/pm3_cmd.h | 10 +- 7 files changed, 993 insertions(+), 135 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f31361d9d..3a6e2f72c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) - Fixed `make accessrights` on Fedora (@mooey5775) - Fixed `hf mfu info` - can now identify the 50 pF version of NTAG 210u(micro) (@mjacksn) + - Added `hf 15` sub-commands for controlling EAS, AFI, privacy mode, and the setting of passwords on SLIX tags (@mjacksn) + ## [Radium.4.15864][2022-10-29] - Changed `lf indala sim` - now accepts fc / cn (@iceman1001) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 76d9ac3c0..b26225ccf 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1287,23 +1287,79 @@ static void PacketReceived(PacketCommandNG *packet) { SetTag15693Uid(payload->uid); break; } - case CMD_HF_ISO15693_SLIX_L_DISABLE_PRIVACY: { + case CMD_HF_ISO15693_SLIX_DISABLE_EAS: { + struct p { + uint8_t pwd[4]; + bool usepwd; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + DisableEAS_AFISlixIso15693(payload->pwd, payload->usepwd); + break; + } + case CMD_HF_ISO15693_SLIX_ENABLE_EAS: { + struct p { + uint8_t pwd[4]; + bool usepwd; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + EnableEAS_AFISlixIso15693(payload->pwd, payload->usepwd); + break; + } + case CMD_HF_ISO15693_SLIX_WRITE_PWD: { + struct p { + uint8_t old_pwd[4]; + uint8_t new_pwd[4]; + uint8_t pwd_id; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + WritePasswordSlixIso15693(payload->old_pwd, payload->new_pwd, payload->pwd_id); + break; + } + case CMD_HF_ISO15693_SLIX_DISABLE_PRIVACY: { struct p { uint8_t pwd[4]; } PACKED; struct p *payload = (struct p *) packet->data.asBytes; - DisablePrivacySlixLIso15693(payload->pwd); + DisablePrivacySlixIso15693(payload->pwd); break; } - case CMD_HF_ISO15693_SLIX_L_DISABLE_AESAFI: { + case CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY: { struct p { uint8_t pwd[4]; } PACKED; - struct p *payload = (struct p *) packet->data.asBytes; - DisableEAS_AFISlixLIso15693(payload->pwd); + struct p* payload = (struct p*)packet->data.asBytes; + EnablePrivacySlixIso15693(payload->pwd); break; } - + case CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI: { + struct p { + uint8_t pwd[4]; + } PACKED; + struct p* payload = (struct p*)packet->data.asBytes; + PassProtectAFISlixIso15693(payload->pwd); + break; + } + case CMD_HF_ISO15693_WRITE_AFI: { + struct p { + uint8_t pwd[4]; + bool use_pwd; + uint8_t uid[8]; + bool use_uid; + uint8_t afi; + } PACKED; + struct p* payload = (struct p*)packet->data.asBytes; + WriteAFIIso15693(payload->pwd, payload->use_pwd, payload->uid, payload->use_uid, payload->afi); + break; + } + case CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS: { + struct p { + uint8_t pwd[4]; + } PACKED; + struct p* payload = (struct p*)packet->data.asBytes; + PassProtextEASSlixIso15693(payload->pwd); + break; + } + #endif #ifdef WITH_LEGICRF diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index ab650da8f..3ca186305 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -177,6 +177,37 @@ static void CodeIso15693AsReaderEOF(void) { } +static int get_uid_slix(uint32_t start_time, uint32_t* eof_time, uint8_t* uid) { + + uint8_t *answer = BigBuf_malloc(ISO15693_MAX_RESPONSE_LENGTH); + memset(answer, 0x00, ISO15693_MAX_RESPONSE_LENGTH); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + + uint8_t cmd[5] = {0}; + BuildIdentifyRequest(cmd); + uint16_t recvlen = 0; + SendDataTag(cmd, sizeof(cmd), false, true, answer, ISO15693_MAX_RESPONSE_LENGTH, start_time, ISO15693_READER_TIMEOUT, eof_time, &recvlen); + + if(recvlen != 12) + { + return PM3_ETIMEOUT; + } + + uid[0] = answer[2]; + uid[1] = answer[3]; + uid[2] = answer[4]; + uid[3] = answer[5]; + uid[4] = answer[6]; + uid[5] = answer[7]; + uid[6] = answer[8]; + uid[7] = answer[9]; + + BigBuf_free(); + return PM3_SUCCESS; +} + + // encode data using "1 out of 256" scheme // data rate is 1,66 kbit/s (fc/8192) // is designed for more robust communication over longer distances @@ -2431,6 +2462,8 @@ void DirectTag15693Command(uint32_t datalen, uint32_t speed, uint32_t recv, uint case ISO15693_WRITE_AFI: case ISO15693_LOCK_AFI: case ISO15693_WRITE_DSFID: + case ISO15693_WRITE_PASSWORD: + case ISO15693_PASSWORD_PROTECT_EAS: case ISO15693_LOCK_DSFID: timeout = ISO15693_READER_TIMEOUT_WRITE; request_answer = data[0] & ISO15_REQ_OPTION; @@ -2640,7 +2673,7 @@ void SetTag15693Uid(const uint8_t *uid) { switch_off(); } -static void init_password_15693_slixl(uint8_t *buffer, uint8_t *pwd, const uint8_t *rnd) { +static void init_password_15693_Slix(uint8_t *buffer, uint8_t *pwd, const uint8_t *rnd) { memcpy(buffer, pwd, 4); if (rnd) { buffer[0] ^= rnd[0]; @@ -2650,14 +2683,14 @@ static void init_password_15693_slixl(uint8_t *buffer, uint8_t *pwd, const uint8 } } -static bool get_rnd_15693_slixl(uint32_t start_time, uint32_t *eof_time, uint8_t *rnd) { +static bool get_rnd_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *rnd) { // 0x04, == NXP from manufacture id list. uint8_t c[] = {ISO15_REQ_DATARATE_HIGH, ISO15693_GET_RANDOM_NUMBER, 0x04, 0x00, 0x00 }; AddCrc15(c, 3); uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; uint16_t recvlen = 0; - int res = SendDataTag(c, sizeof(c), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + int res = SendDataTag(c, sizeof(c), true, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); if (res != PM3_SUCCESS && recvlen != 5) { return false; } @@ -2668,15 +2701,16 @@ static bool get_rnd_15693_slixl(uint32_t start_time, uint32_t *eof_time, uint8_t return true; } -static uint32_t set_pass_15693_slixl(uint32_t start_time, uint32_t *eof_time, uint8_t pass_id, uint8_t *password) { +static uint32_t disable_privacy_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t pass_id, uint8_t* password) { + uint8_t rnd[2]; - if (get_rnd_15693_slixl(start_time, eof_time, rnd) == false) { + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; } // 0x04, == NXP from manufacture id list. - uint8_t c[] = {ISO15_REQ_DATARATE_HIGH, ISO15693_SET_PASSWORD, 0x04, pass_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - init_password_15693_slixl(&c[4], password, rnd); + uint8_t c[] = { ISO15_REQ_DATARATE_HIGH, ISO15693_SET_PASSWORD, 0x04, pass_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + init_password_15693_Slix(&c[4], password, rnd); AddCrc15(c, 8); start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; @@ -2689,16 +2723,236 @@ static uint32_t set_pass_15693_slixl(uint32_t start_time, uint32_t *eof_time, ui return PM3_SUCCESS; } -/* -static uint32_t enable_privacy_15693_slixl(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t pass_id, uint8_t *password) { +static uint32_t set_pass_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t pass_id, uint8_t* password, uint8_t* uid) { + + uint8_t rnd[2]; - if (get_rnd_15693_slixl(start_time, eof_time, rnd) == false) { + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { + return PM3_ETIMEOUT; + } + + // 0x04, == NXP from manufacture id list. + uint8_t c[] = { (ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS), ISO15693_SET_PASSWORD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, pass_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + init_password_15693_Slix(&c[12], password, rnd); + + memcpy(&c[3], uid, 8); + AddCrc15(c, 16); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + + int res = SendDataTag(c, sizeof(c), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res != PM3_SUCCESS && recvlen != 3) { + return PM3_EWRONGANSWER; + } + return PM3_SUCCESS; +} + +static uint32_t set_privacy_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t* password) { + uint8_t rnd[2]; + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { + return PM3_ETIMEOUT; + } + + // 0x04, == NXP from manufacture id list. + uint8_t c[] = { ISO15_REQ_DATARATE_HIGH, 0xBA, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + init_password_15693_Slix(&c[3], password, rnd); + AddCrc15(c, 7); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + int res = SendDataTag(c, sizeof(c), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res != PM3_SUCCESS && recvlen != 3) { + return PM3_EWRONGANSWER; + } + return PM3_SUCCESS; +} + +static uint32_t disable_eas_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t* password, bool usepwd) { + + uint8_t uid[8]; + get_uid_slix(start_time, eof_time, uid); + + uint8_t rnd[2]; + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { + return PM3_ETIMEOUT; + } + + if(usepwd) + { + + int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); + + if(res_setpass != PM3_SUCCESS) + { + return PM3_EWRONGANSWER; + } + } + + // 0x04, == NXP from manufacture id list. + uint8_t c[] = { ISO15_REQ_DATARATE_HIGH, 0xA3, 0x04, 0x00, 0x00}; + AddCrc15(c, 3); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + int res = SendDataTag(c, sizeof(c), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res != PM3_SUCCESS && recvlen != 3) { + return PM3_EWRONGANSWER; + } + return PM3_SUCCESS; +} + + +static uint32_t enable_eas_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t* password, bool usepwd) { + + uint8_t uid[8]; + get_uid_slix(start_time, eof_time, uid); + + uint8_t rnd[2]; + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { + return PM3_ETIMEOUT; + } + + if(usepwd) + { + int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); + + if(res_setpass != PM3_SUCCESS) + { + return PM3_EWRONGANSWER; + } + } + // 0x04, == NXP from manufacture id list. + uint8_t c[] = { ISO15_REQ_DATARATE_HIGH, 0xA2, 0x04, 0x00, 0x00}; + //init_password_15693_Slix(&c[3], password, rnd); + AddCrc15(c, 3); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + int res = SendDataTag(c, sizeof(c), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res != PM3_SUCCESS && recvlen != 3) { + return PM3_EWRONGANSWER; + } + return PM3_SUCCESS; +} + +static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pwd_id, uint8_t *password, uint8_t* uid) { + + uint8_t new_pwd_cmd[] = { (ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS), ISO15693_WRITE_PASSWORD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, pwd_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + memcpy(&new_pwd_cmd[3], uid, 8); + memcpy(&new_pwd_cmd[12], password, 4); + + AddCrc15(new_pwd_cmd, 16); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + + int res_wrp = SendDataTag(new_pwd_cmd, sizeof(new_pwd_cmd), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res_wrp != PM3_SUCCESS && recvlen != 3) { + return PM3_EWRONGANSWER; + } + + return PM3_SUCCESS; +} + +static uint32_t pass_protect_EASAFI_15693_Slix(uint32_t start_time, uint32_t *eof_time, bool set_option_flag, uint8_t* password) { + + uint8_t flags; + + if(set_option_flag) + flags = ISO15_REQ_DATARATE_HIGH | ISO15_REQ_OPTION; + else + flags = ISO15_REQ_DATARATE_HIGH; + + + uint8_t uid[8]; + get_uid_slix(start_time, eof_time, uid); + + uint8_t rnd[2]; + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { + return PM3_ETIMEOUT; + } + + int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); + + if(res_setpass != PM3_SUCCESS) + { + return PM3_EWRONGANSWER; + } + + uint8_t new_pass_protect_cmd[] = { flags, ISO15693_PASSWORD_PROTECT_EAS, 0x04, 0x00, 0x00}; + AddCrc15(new_pass_protect_cmd, 3); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + + int res = SendDataTag(new_pass_protect_cmd, sizeof(new_pass_protect_cmd), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res != PM3_SUCCESS && recvlen != 3) { + return PM3_EWRONGANSWER; + } + + return PM3_SUCCESS; +} + +static uint32_t write_afi_15693(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi) +{ + + if(!use_uid) + { + int res_getuid = get_uid_slix(start_time, eof_time, uid); + + if(res_getuid != PM3_SUCCESS) + { + return res_getuid; + } + } + + if(usepwd) + { + int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); + + if(res_setpass != PM3_SUCCESS) + { + return PM3_EWRONGANSWER; + } + } + + uint8_t cmd[] = { ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS, ISO15693_WRITE_AFI, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + memcpy(&cmd[2], uid, 8); + cmd[10] = afi; + AddCrc15(cmd, 11); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + + int res = SendDataTag(cmd, sizeof(cmd), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res != PM3_SUCCESS || recvlen != 3) { + return PM3_EWRONGANSWER; + } + + return PM3_SUCCESS; +} + +/* +static uint32_t enable_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t pass_id, uint8_t *password) { + uint8_t rnd[2]; + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; } uint8_t c[] = {ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS, ISO15693_ENABLE_PRIVACY, pass_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; memcpy(&c[3], uid, 8); - init_password_15693_slixl(&c[11], password, rnd); + init_password_15693_Slix(&c[11], password, rnd); AddCrc15(c, 15); start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; @@ -2711,16 +2965,16 @@ static uint32_t enable_privacy_15693_slixl(uint32_t start_time, uint32_t *eof_ti return PM3_SUCCESS; } -static uint32_t write_password_15693_slixl(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t pass_id, uint8_t *password) { +static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t pass_id, uint8_t *password) { uint8_t rnd[2]; - if (get_rnd_15693_slixl(start_time, eof_time, rnd) == false) { + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; } uint8_t c[] = {ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS, ISO15693_WRITE_PASSWORD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; memcpy(&c[3], uid, 8); c[11] = pass_id; - init_password_15693_slixl(&c[12], password, NULL); + init_password_15693_Slix(&c[12], password, NULL); AddCrc15(c, 16); start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; @@ -2734,16 +2988,16 @@ static uint32_t write_password_15693_slixl(uint32_t start_time, uint32_t *eof_ti return PM3_SUCCESS; } -static uint32_t destroy_15693_slixl(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t *password) { +static uint32_t destroy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t *password) { uint8_t rnd[2]; - if (get_rnd_15693_slixl(start_time, eof_time, rnd) == false) { + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; } uint8_t c[] = {ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS, ISO15693_DESTROY, ISO15693_ENABLE_PRIVACY, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; memcpy(&c[3], uid, 8); - init_password_15693_slixl(&c[11], password, rnd); + init_password_15693_Slix(&c[11], password, rnd); AddCrc15(c, 15); start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; @@ -2758,8 +3012,33 @@ static uint32_t destroy_15693_slixl(uint32_t start_time, uint32_t *eof_time, uin */ -// Sets a PRIVACY password to all ZEROS -void DisablePrivacySlixLIso15693(uint8_t *password) { +void WritePasswordSlixIso15693(uint8_t *old_password, uint8_t *new_password, uint8_t pwd_id) { + LED_D_ON(); + Iso15693InitReader(); + StartCountSspClk(); + uint32_t start_time = 0, eof_time = 0; + int res = PM3_EFAILED; + + uint8_t uid[8]; + get_uid_slix(start_time, &eof_time, uid); + + res = set_pass_15693_Slix(start_time, &eof_time, pwd_id, old_password, uid); + if(res != PM3_SUCCESS) + { + reply_ng(CMD_HF_ISO15693_SLIX_WRITE_PWD, res, NULL, 0); + switch_off(); + return; + } + + res = write_password_15693_Slix(start_time, &eof_time, pwd_id, new_password, uid); + + reply_ng(CMD_HF_ISO15693_SLIX_WRITE_PWD, res, NULL, 0); + + switch_off(); + +} + +void DisablePrivacySlixIso15693(uint8_t *password) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -2769,13 +3048,12 @@ void DisablePrivacySlixLIso15693(uint8_t *password) { // 0x04 Privacy // 0x08 Destroy SLIX-L // 0x10 EAS/AFI - int res = set_pass_15693_slixl(start_time, &eof_time, 0x04, password); - reply_ng(CMD_HF_ISO15693_SLIX_L_DISABLE_PRIVACY, res, NULL, 0); + int res = disable_privacy_15693_Slix(start_time, &eof_time, 0x04, password); + reply_ng(CMD_HF_ISO15693_SLIX_DISABLE_PRIVACY, res, NULL, 0); switch_off(); } -// Sets a EAS/AFI password to all ZEROS -void DisableEAS_AFISlixLIso15693(uint8_t *password) { +void EnablePrivacySlixIso15693(uint8_t* password) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -2785,8 +3063,71 @@ void DisableEAS_AFISlixLIso15693(uint8_t *password) { // 0x04 Privacy // 0x08 Destroy SLIX-L // 0x10 EAS/AFI - int res = set_pass_15693_slixl(start_time, &eof_time, 0x10, password); - reply_ng(CMD_HF_ISO15693_SLIX_L_DISABLE_AESAFI, res, NULL, 0); + int res = set_privacy_15693_Slix(start_time, &eof_time, password); + reply_ng(CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY, res, NULL, 0); switch_off(); } + +void DisableEAS_AFISlixIso15693(uint8_t *password, bool usepwd) { + LED_D_ON(); + Iso15693InitReader(); + StartCountSspClk(); + uint32_t start_time = 0, eof_time = 0; + + // Password identifier Password byte + // 0x04 Privacy + // 0x08 Destroy SLIX-L + // 0x10 EAS/AFI + int res = disable_eas_15693_Slix(start_time, &eof_time, password, usepwd); + + + + reply_ng(CMD_HF_ISO15693_SLIX_DISABLE_EAS, res, NULL, 0); + switch_off(); +} + +void EnableEAS_AFISlixIso15693(uint8_t *password, bool usepwd) { + LED_D_ON(); + Iso15693InitReader(); + StartCountSspClk(); + uint32_t start_time = 0, eof_time = 0; + + // Password identifier Password byte + // 0x04 Privacy + // 0x08 Destroy SLIX-L + // 0x10 EAS/AFI + int res = enable_eas_15693_Slix(start_time, &eof_time, password, usepwd); + reply_ng(CMD_HF_ISO15693_SLIX_ENABLE_EAS, res, NULL, 0); + switch_off(); +} + +void PassProtextEASSlixIso15693(uint8_t *password) { + LED_D_ON(); + Iso15693InitReader(); + StartCountSspClk(); + uint32_t start_time = 0, eof_time = 0; + int res = pass_protect_EASAFI_15693_Slix(start_time, &eof_time, false, password); + reply_ng(CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS, res, NULL, 0); + switch_off(); +} +void PassProtectAFISlixIso15693(uint8_t *password) { + LED_D_ON(); + Iso15693InitReader(); + StartCountSspClk(); + uint32_t start_time = 0, eof_time = 0; + int res = pass_protect_EASAFI_15693_Slix(start_time, &eof_time, true, password); + reply_ng(CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI, res, NULL, 0); + switch_off(); +} + +void WriteAFIIso15693(uint8_t *password, bool use_pwd, uint8_t *uid, bool use_uid, uint8_t afi) { + LED_D_ON(); + Iso15693InitReader(); + StartCountSspClk(); + uint32_t start_time = 0, eof_time = 0; + int res = write_afi_15693(start_time, &eof_time, password, use_pwd, uid, use_uid, afi); + //int res = PM3_SUCCESS; + reply_ng(CMD_HF_ISO15693_WRITE_AFI, res, NULL, 0); + switch_off(); +} \ No newline at end of file diff --git a/armsrc/iso15693.h b/armsrc/iso15693.h index 2097b3769..c0ff44929 100644 --- a/armsrc/iso15693.h +++ b/armsrc/iso15693.h @@ -62,6 +62,12 @@ int SendDataTagEOF(uint8_t *recv, uint16_t max_recv_len, uint32_t start_time, ui void SetTag15693Uid(const uint8_t *uid); -void DisablePrivacySlixLIso15693(uint8_t *password); -void DisableEAS_AFISlixLIso15693(uint8_t *password); +void WritePasswordSlixIso15693(uint8_t *old_password, uint8_t *new_password, uint8_t pwd_id); +void DisablePrivacySlixIso15693(uint8_t *password); +void EnablePrivacySlixIso15693(uint8_t* password); +void DisableEAS_AFISlixIso15693(uint8_t *password, bool usepwd); +void EnableEAS_AFISlixIso15693(uint8_t *password, bool usepwd); +void PassProtextEASSlixIso15693(uint8_t *password); +void PassProtectAFISlixIso15693(uint8_t *password); +void WriteAFIIso15693(uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi); #endif diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 035a2218e..46a89a0c9 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -698,7 +698,7 @@ static int NxpCheckSig(uint8_t *uid) { PacketResponseNG resp; uint16_t reqlen = 0; uint8_t req[PM3_CMD_DATA_SIZE] = {0}; - + // Check if we can also read the signature req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; req[reqlen++] = ISO15693_READ_SIGNATURE; @@ -736,7 +736,7 @@ static int NxpCheckSig(uint8_t *uid) { memcpy(signature, recv + 1, 32); nxp_15693_print_signature(uid, signature); - + return PM3_SUCCESS; } @@ -1352,94 +1352,83 @@ static int CmdHF15WriteAfi(const char *Cmd) { CLIParserInit(&ctx, "hf 15 writeafi", "Write AFI on card", "hf 15 writeafi -* --afi 12\n" - "hf 15 writeafi -u E011223344556677 --afi 12" + "hf 15 writeafi -u E011223344556677 --afi 12 -p 0F0F0F0F" ); - void *argtable[6 + 2] = {}; - uint8_t arglen = arg_add_default(argtable); - argtable[arglen++] = arg_int1(NULL, "afi", "", "AFI number (0-255)"); - argtable[arglen++] = arg_param_end; + void *argtable[5] = {}; + argtable[0] = arg_param_begin; + argtable[1] = arg_str0("u", "uid", "", "full UID, 8 bytes"); + argtable[2] = arg_int1(NULL, "afi", "", "AFI number (0-255)"); + argtable[3] = arg_str0("p", "pwd", "", "optional AFI/EAS password"); + argtable[4] = arg_param_end; - CLIExecWithReturn(ctx, Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, true); + + struct { + uint8_t pwd[4]; + bool use_pwd; + uint8_t uid[8]; + bool use_uid; + uint8_t afi; + } PACKED payload; - uint8_t uid[8]; int uidlen = 0; - CLIGetHexWithReturn(ctx, 1, uid, &uidlen); - bool unaddressed = arg_get_lit(ctx, 2); - bool scan = arg_get_lit(ctx, 3); - int fast = (arg_get_lit(ctx, 4) == false); - bool add_option = arg_get_lit(ctx, 5); + CLIGetHexWithReturn(ctx, 1, payload.uid, &uidlen); - int afi = arg_get_int_def(ctx, 6, 0); + payload.afi = arg_get_int_def(ctx, 2, 0); + + int pwdlen; + + CLIGetHexWithReturn(ctx, 3, payload.pwd, &pwdlen); + CLIParserFree(ctx); + + if(pwdlen == 4) + { + payload.use_pwd = true; + } + + if(uidlen == 8) + { + payload.use_uid = true; + } // sanity checks - if ((scan + unaddressed + uidlen) > 1) { - PrintAndLogEx(WARNING, "Select only one option /scan/unaddress/uid"); + if (uidlen != 0 && uidlen != 8) { + PrintAndLogEx(WARNING, "uid must be 8 hex bytes if provided"); return PM3_EINVARG; } - - // request to be sent to device/card - uint16_t flags = arg_get_raw_flag(uidlen, unaddressed, scan, add_option); - uint8_t req[16] = {flags, ISO15693_WRITE_AFI}; - uint16_t reqlen = 2; - - if (unaddressed == false) { - if (scan) { - if (getUID(false, uid) != PM3_SUCCESS) { - PrintAndLogEx(WARNING, "no tag found"); - return PM3_EINVARG; - } - uidlen = 8; - } - - if (uidlen == 8) { - // add UID (scan, uid) - memcpy(req + reqlen, uid, sizeof(uid)); - reqlen += sizeof(uid); - } - PrintAndLogEx(SUCCESS, "Using UID... " _GREEN_("%s"), iso15693_sprintUID(NULL, uid)); + + if(pwdlen > 0 && pwdlen != 4) + { + PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); + return PM3_ESOFT; } - // enforce, since we are writing - req[0] |= ISO15_REQ_OPTION; - - req[reqlen++] = (uint8_t)afi; - - AddCrc15(req, reqlen); - reqlen += 2; - - // arg: len, speed, recv? - // arg0 (datalen, cmd len? .arg0 == crc?) - // arg1 (speed == 0 == 1 of 256, == 1 == 1 of 4 ) - // arg2 (recv == 1 == expect a response) - uint8_t read_response = 1; - PacketResponseNG resp; clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, read_response, req, reqlen); - - if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { - PrintAndLogEx(ERR, "iso15693 timeout"); + SendCommandNG(CMD_HF_ISO15693_WRITE_AFI, (uint8_t *)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_WRITE_AFI, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); DropField(); - return PM3_ETIMEOUT; - } - DropField(); - - if (resp.status == PM3_ETEAROFF) { - return resp.status; + return PM3_ESOFT; } - uint8_t *data = resp.data.asBytes; - - if ((data[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", data[0], TagErrorStr(data[0])); - return PM3_EWRONGANSWER; + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + PrintAndLogEx(WARNING, "error writing AFI"); + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "Wrote AFI 0x%02X", payload.afi); + break; + } } - - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(SUCCESS, "Wrote AFI 0x%02X", afi); - return PM3_SUCCESS; + return resp.status; } // Writes the DSFID (Data Storage Format Identifier) of a card @@ -2378,10 +2367,164 @@ static int CmdHF15CSetUID(const char *Cmd) { } } +static int CmdHF15SlixEASEnable(const char *Cmd) { + + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 15 slixeasenable", + "Enable EAS mode on SLIX ISO-15693 tag", + "hf 15 slixeasenable -p 0F0F0F0F"); + + void *argtable[] = { + arg_param_begin, + arg_str0("p", "pwd", "", "optional password, 8 hex bytes"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + struct { + uint8_t pwd[4]; + bool usepwd; + } PACKED payload; + int pwdlen = 0; + + int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen); + if((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) + { + PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); + return PM3_ESOFT; + } + + //CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); + CLIParserFree(ctx); + + + if(pwdlen > 0 ) + { + PrintAndLogEx(INFO, "Trying to enable EAS mode using password " _GREEN_("%s") + , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) + ); + payload.usepwd = true; + } + else + { + PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password"); + payload.usepwd = false; + } + + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_SLIX_ENABLE_EAS, (uint8_t *)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_ENABLE_EAS, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); + DropField(); + return PM3_ESOFT; + } + + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + if(pwdlen > 0 ) + { + PrintAndLogEx(WARNING, "the password provided was not accepted"); + } + else + { + PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked"); + } + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "EAS mode is now enabled ( " _GREEN_("ok") " ) "); + break; + } + } + return resp.status; +} + +static int CmdHF15SlixEASDisable(const char *Cmd) { + + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 15 slixeasdisable", + "Disable EAS mode on SLIX ISO-15693 tag", + "hf 15 slixeasdisable -p 0F0F0F0F"); + + void *argtable[] = { + arg_param_begin, + arg_str0("p", "pwd", "", "optional password, 8 hex bytes"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + struct { + uint8_t pwd[4]; + bool usepwd; + + } PACKED payload; + int pwdlen = 0; + + int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen); + if((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) + { + PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); + return PM3_ESOFT; + } + + //CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); + CLIParserFree(ctx); + + + if(pwdlen > 0 ) + { + PrintAndLogEx(INFO, "Trying to disable EAS mode using password " _GREEN_("%s") + , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) + ); + payload.usepwd = true; + } + else + { + PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password"); + payload.usepwd = false; + } + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_SLIX_DISABLE_EAS, (uint8_t *)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_DISABLE_EAS, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); + DropField(); + return PM3_ESOFT; + } + + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + if(pwdlen > 0 ) + { + PrintAndLogEx(WARNING, "the password provided was not accepted"); + } + else + { + PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked"); + } + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "EAS mode is now disabled ( " _GREEN_("ok") " ) "); + break; + } + } + return resp.status; +} + static int CmdHF15SlixDisable(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "hf 15 slixdisable", + CLIParserInit(&ctx, "hf 15 slixprivacydisable", "Disable privacy mode on SLIX ISO-15693 tag", "hf 15 slixdisable -p 0F0F0F0F"); @@ -2404,8 +2547,8 @@ static int CmdHF15SlixDisable(const char *Cmd) { PacketResponseNG resp; clearCommandBuffer(); - SendCommandNG(CMD_HF_ISO15693_SLIX_L_DISABLE_PRIVACY, (uint8_t *)&payload, sizeof(payload)); - if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_L_DISABLE_PRIVACY, &resp, 2000) == false) { + SendCommandNG(CMD_HF_ISO15693_SLIX_DISABLE_PRIVACY, (uint8_t *)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_DISABLE_PRIVACY, &resp, 2000) == false) { PrintAndLogEx(WARNING, "timeout while waiting for reply"); DropField(); return PM3_ESOFT; @@ -2428,32 +2571,330 @@ static int CmdHF15SlixDisable(const char *Cmd) { return resp.status; } +static int CmdHF15SlixEnable(const char* Cmd) { + + CLIParserContext* ctx; + CLIParserInit(&ctx, "hf 15 slixprivacyenable", + "Enable privacy mode on SLIX ISO-15693 tag", + "hf 15 slixenable -p 0F0F0F0F"); + + void* argtable[] = { + arg_param_begin, + arg_str1("p", "pwd", "", "password, 8 hex bytes"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + struct { + uint8_t pwd[4]; + } PACKED payload; + int pwdlen = 0; + CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); + CLIParserFree(ctx); + + PrintAndLogEx(INFO, "Trying to enable privacy mode using password " _GREEN_("%s") + , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) + ); + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY, (uint8_t*)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); + DropField(); + return PM3_ESOFT; + } + + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + PrintAndLogEx(WARNING, "password was not accepted"); + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "privacy mode is now enabled ( " _GREEN_("ok") " ) "); + break; + } + } + return resp.status; +} + +static int CmdHF15SlixWritePassword(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 15 slixwritepwd", + "Write a password on a SLIX family ISO-15693 tag", + "hf 15 slixwritepwd -t READ -o 00000000 -n 12131415"); + + void *argtable[] = { + arg_param_begin, + arg_str1("t", "type", "", "which password field to write to (some tags do not support all password types)"), + arg_str0("o", "old", "", "old password (if present), 8 hex bytes"), + arg_str1("n", "new", "", "new password, 8 hex bytes"), + arg_param_end + }; + + CLIExecWithReturn(ctx, Cmd, argtable, false); + + struct { + uint8_t old_pwd[4]; + uint8_t new_pwd[4]; + uint8_t pwd_id; + } PACKED payload; + int pwdlen = 0; + + + + CLIGetHexWithReturn(ctx, 2, payload.old_pwd, &pwdlen); + + if(pwdlen > 0 && pwdlen != 4) + { + PrintAndLogEx(WARNING, "old password must be 4 hex bytes if provided"); + return PM3_ESOFT; + } + + CLIGetHexWithReturn(ctx, 3, payload.new_pwd, &pwdlen); + + if(pwdlen != 4) + { + PrintAndLogEx(WARNING, "new password must be 4 hex bytes"); + return PM3_ESOFT; + } + + int vlen = 0; + char value[10]; + CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)value, sizeof(value), &vlen); + + if (vlen > 0) { + if (strcmp(value, "read") == 0) + { + PrintAndLogEx(SUCCESS, "Selected read pass"); + payload.pwd_id = 0x01; + } + else if (strcmp(value, "write") == 0) + { + PrintAndLogEx(SUCCESS, "Selected write pass"); + payload.pwd_id = 0x02; + } + else if (strcmp(value, "privacy") == 0) + { + PrintAndLogEx(SUCCESS, "Selected privacy pass"); + payload.pwd_id = 0x04; + } + else if (strcmp(value, "destroy") == 0) + { + PrintAndLogEx(SUCCESS, "Selected destroy pass"); + payload.pwd_id = 0x08; + } + else if (strcmp(value, "easafi") == 0) + { + PrintAndLogEx(SUCCESS, "Selected easafi pass"); + payload.pwd_id = 0x10; + } + else + { + PrintAndLogEx(ERR, "t argument must be 'read', 'write', 'privacy', 'destroy', or 'easafi'"); + return PM3_EINVARG; + } + } + + CLIParserFree(ctx); + + + PrintAndLogEx(INFO, "Trying to write " _YELLOW_("%s") " as " _YELLOW_("%s") " password" + , sprint_hex_inrow(payload.new_pwd, sizeof(payload.new_pwd)), value); + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_SLIX_WRITE_PWD, (uint8_t *)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_WRITE_PWD, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); + DropField(); + return PM3_ESOFT; + } + + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + PrintAndLogEx(WARNING, "password was not accepted"); + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "password written ( " _GREEN_("ok") " ) "); + break; + } + } + return resp.status; +} + +static int CmdHF15AFIPassProtect(const char *Cmd) { + + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 15 passprotectafi", + "Password protect AFI. Cannot be undone.", + "hf 15 passprotectafi -p 00000000 -c"); + + void *argtable[] = { + arg_param_begin, + arg_str1("p", "password", "", "EAS/AFI password, 8 hex bytes"), + arg_lit0("c", "confirm", "confirm the execution of this irreversible command"), + arg_param_end + }; + + CLIExecWithReturn(ctx, Cmd, argtable, true); + + struct { + uint8_t pwd[4]; + } PACKED payload; + int pwdlen = 0; + + CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); + + bool confirmation = arg_get_lit(ctx, 2); + + if(pwdlen != 4) + { + PrintAndLogEx(WARNING, "password must be 4 hex bytes"); + return PM3_ESOFT; + } + + if(confirmation == 0) + { + PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag"); + return PM3_ESOFT; + } + + + PrintAndLogEx(INFO, "Trying to enable AFI password protection"); + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI, (uint8_t*)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); + DropField(); + return PM3_ESOFT; + } + + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + PrintAndLogEx(WARNING, "error enabling AFI password protection"); + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "AFI password protected ( " _GREEN_("ok") " ) "); + break; + } + } + return resp.status; + +} + +static int CmdHF15EASPassProtect(const char *Cmd) { + + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 15 passprotecteas", + "Password protect EAS. Cannot be undone.", + "hf 15 passprotecteas -p 00000000 -c"); + + void *argtable[] = { + arg_param_begin, + arg_str1("p", "password", "", "EAS/AFI password, 8 hex bytes"), + arg_lit0("c", "confirm", "confirm the execution of this irreversible command"), + arg_param_end + }; + + CLIExecWithReturn(ctx, Cmd, argtable, true); + + struct { + uint8_t pwd[4]; + } PACKED payload; + int pwdlen = 0; + + CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); + + bool confirmation = arg_get_lit(ctx, 2); + + if(pwdlen != 4) + { + PrintAndLogEx(WARNING, "password must be 4 hex bytes"); + return PM3_ESOFT; + } + + if(confirmation == 0) + { + PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag"); + return PM3_ESOFT; + } + + PrintAndLogEx(INFO, "Trying to enable EAS password protection"); + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS, (uint8_t*)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); + DropField(); + return PM3_ESOFT; + } + + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + PrintAndLogEx(WARNING, "error enabling EAS password protection"); + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "EAS password protected ( " _GREEN_("ok") " ) "); + break; + } + } + return resp.status; +} + static command_t CommandTable[] = { - {"-----------", CmdHF15Help, AlwaysAvailable, "--------------------- " _CYAN_("General") " ---------------------"}, - {"help", CmdHF15Help, AlwaysAvailable, "This help"}, - {"list", CmdHF15List, AlwaysAvailable, "List ISO-15693 history"}, - {"demod", CmdHF15Demod, AlwaysAvailable, "Demodulate ISO-15693 from tag"}, - {"dump", CmdHF15Dump, IfPm3Iso15693, "Read all memory pages of an ISO-15693 tag, save to file"}, - {"info", CmdHF15Info, IfPm3Iso15693, "Tag information"}, - {"sniff", CmdHF15Sniff, IfPm3Iso15693, "Sniff ISO-15693 traffic"}, - {"raw", CmdHF15Raw, IfPm3Iso15693, "Send raw hex data to tag"}, - {"rdbl", CmdHF15Readblock, IfPm3Iso15693, "Read a block"}, - {"rdmulti", CmdHF15Readmulti, IfPm3Iso15693, "Reads multiple blocks"}, - {"reader", CmdHF15Reader, IfPm3Iso15693, "Act like an ISO-15693 reader"}, - {"restore", CmdHF15Restore, IfPm3Iso15693, "Restore from file to all memory pages of an ISO-15693 tag"}, - {"samples", CmdHF15Samples, IfPm3Iso15693, "Acquire samples as reader (enables carrier, sends inquiry)"}, - {"eload", CmdHF15ELoad, IfPm3Iso15693, "Load image file into emulator to be used by 'sim' command"}, - {"esave", CmdHF15ESave, IfPm3Iso15693, "Save emulator memory into image file"}, - {"eview", CmdHF15EView, IfPm3Iso15693, "View emulator memory"}, - {"sim", CmdHF15Sim, IfPm3Iso15693, "Fake an ISO-15693 tag"}, - {"slixdisable", CmdHF15SlixDisable, IfPm3Iso15693, "Disable privacy mode on SLIX ISO-15693 tag"}, - {"wrbl", CmdHF15Write, IfPm3Iso15693, "Write a block"}, - {"-----------", CmdHF15Help, IfPm3Iso15693, "----------------------- " _CYAN_("afi") " -----------------------"}, - {"findafi", CmdHF15FindAfi, IfPm3Iso15693, "Brute force AFI of an ISO-15693 tag"}, - {"writeafi", CmdHF15WriteAfi, IfPm3Iso15693, "Writes the AFI on an ISO-15693 tag"}, - {"writedsfid", CmdHF15WriteDsfid, IfPm3Iso15693, "Writes the DSFID on an ISO-15693 tag"}, - {"-----------", CmdHF15Help, IfPm3Iso15693, "----------------------- " _CYAN_("magic") " -----------------------"}, - {"csetuid", CmdHF15CSetUID, IfPm3Iso15693, "Set UID for magic card"}, + {"-----------", CmdHF15Help, AlwaysAvailable, "--------------------- " _CYAN_("General") " ---------------------"}, + {"help", CmdHF15Help, AlwaysAvailable, "This help"}, + {"list", CmdHF15List, AlwaysAvailable, "List ISO-15693 history"}, + {"demod", CmdHF15Demod, AlwaysAvailable, "Demodulate ISO-15693 from tag"}, + {"dump", CmdHF15Dump, IfPm3Iso15693, "Read all memory pages of an ISO-15693 tag, save to file"}, + {"info", CmdHF15Info, IfPm3Iso15693, "Tag information"}, + {"sniff", CmdHF15Sniff, IfPm3Iso15693, "Sniff ISO-15693 traffic"}, + {"raw", CmdHF15Raw, IfPm3Iso15693, "Send raw hex data to tag"}, + {"rdbl", CmdHF15Readblock, IfPm3Iso15693, "Read a block"}, + {"rdmulti", CmdHF15Readmulti, IfPm3Iso15693, "Reads multiple blocks"}, + {"reader", CmdHF15Reader, IfPm3Iso15693, "Act like an ISO-15693 reader"}, + {"restore", CmdHF15Restore, IfPm3Iso15693, "Restore from file to all memory pages of an ISO-15693 tag"}, + {"samples", CmdHF15Samples, IfPm3Iso15693, "Acquire samples as reader (enables carrier, sends inquiry)"}, + {"eload", CmdHF15ELoad, IfPm3Iso15693, "Load image file into emulator to be used by 'sim' command"}, + {"esave", CmdHF15ESave, IfPm3Iso15693, "Save emulator memory into image file"}, + {"eview", CmdHF15EView, IfPm3Iso15693, "View emulator memory"}, + {"sim", CmdHF15Sim, IfPm3Iso15693, "Fake an ISO-15693 tag"}, + {"slixwritepwd", CmdHF15SlixWritePassword, IfPm3Iso15693, "Writes a password on a SLIX ISO-15693 tag"}, + {"slixeasdisable", CmdHF15SlixEASDisable, IfPm3Iso15693, "Disable EAS mode on SLIX ISO-15693 tag"}, + {"slixeasenable", CmdHF15SlixEASEnable, IfPm3Iso15693, "Enable EAS mode on SLIX ISO-15693 tag"}, + {"slixprivacydisable", CmdHF15SlixDisable, IfPm3Iso15693, "Disable privacy mode on SLIX ISO-15693 tag"}, + {"slixprivacyenable", CmdHF15SlixEnable, IfPm3Iso15693, "Enable privacy mode on SLIX ISO-15693 tag"}, + {"passprotectafi", CmdHF15AFIPassProtect, IfPm3Iso15693, "Password protect AFI - Cannot be undone"}, + {"passprotecteas", CmdHF15EASPassProtect, IfPm3Iso15693, "Password protect EAS - Cannot be undone"}, + {"wrbl", CmdHF15Write, IfPm3Iso15693, "Write a block"}, + {"-----------", CmdHF15Help, IfPm3Iso15693, "----------------------- " _CYAN_("afi") " -----------------------"}, + {"findafi", CmdHF15FindAfi, IfPm3Iso15693, "Brute force AFI of an ISO-15693 tag"}, + {"writeafi", CmdHF15WriteAfi, IfPm3Iso15693, "Writes the AFI on an ISO-15693 tag"}, + {"writedsfid", CmdHF15WriteDsfid, IfPm3Iso15693, "Writes the DSFID on an ISO-15693 tag"}, + {"-----------", CmdHF15Help, IfPm3Iso15693, "----------------------- " _CYAN_("magic") " -----------------------"}, + {"csetuid", CmdHF15CSetUID, IfPm3Iso15693, "Set UID for magic card"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 4cd9457b5..ee94f7ec0 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -177,7 +177,13 @@ const static vocabulory_t vocabulory[] = { { 0, "hf 15 esave" }, { 0, "hf 15 eview" }, { 0, "hf 15 sim" }, - { 0, "hf 15 slixdisable" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, { 0, "hf 15 wrbl" }, { 0, "hf 15 findafi" }, { 0, "hf 15 writeafi" }, diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 95750b9b7..43fd44ac0 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -519,8 +519,14 @@ typedef struct { #define CMD_HF_ISO15693_COMMAND 0x0313 #define CMD_HF_ISO15693_FINDAFI 0x0315 #define CMD_HF_ISO15693_CSETUID 0x0316 -#define CMD_HF_ISO15693_SLIX_L_DISABLE_PRIVACY 0x0317 -#define CMD_HF_ISO15693_SLIX_L_DISABLE_AESAFI 0x0318 +#define CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY 0xA317 +#define CMD_HF_ISO15693_SLIX_DISABLE_PRIVACY 0x0317 +#define CMD_HF_ISO15693_SLIX_DISABLE_EAS 0x0318 +#define CMD_HF_ISO15693_SLIX_ENABLE_EAS 0x0862 +#define CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI 0x0863 +#define CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS 0x0864 +#define CMD_HF_ISO15693_SLIX_WRITE_PWD 0x0865 +#define CMD_HF_ISO15693_WRITE_AFI 0x0866 #define CMD_HF_TEXKOM_SIMULATE 0x0320 #define CMD_HF_ISO15693_EML_CLEAR 0x0330 #define CMD_HF_ISO15693_EML_SETMEM 0x0331 From 126beb976c81f40b2613a4163ef91efe9f5d512c Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Sat, 28 Jan 2023 13:11:51 -0600 Subject: [PATCH 158/924] fix tabs --- include/pm3_cmd.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 43fd44ac0..4c4eff049 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -519,12 +519,12 @@ typedef struct { #define CMD_HF_ISO15693_COMMAND 0x0313 #define CMD_HF_ISO15693_FINDAFI 0x0315 #define CMD_HF_ISO15693_CSETUID 0x0316 -#define CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY 0xA317 -#define CMD_HF_ISO15693_SLIX_DISABLE_PRIVACY 0x0317 -#define CMD_HF_ISO15693_SLIX_DISABLE_EAS 0x0318 -#define CMD_HF_ISO15693_SLIX_ENABLE_EAS 0x0862 -#define CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI 0x0863 -#define CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS 0x0864 +#define CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY 0xA317 +#define CMD_HF_ISO15693_SLIX_DISABLE_PRIVACY 0x0317 +#define CMD_HF_ISO15693_SLIX_DISABLE_EAS 0x0318 +#define CMD_HF_ISO15693_SLIX_ENABLE_EAS 0x0862 +#define CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI 0x0863 +#define CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS 0x0864 #define CMD_HF_ISO15693_SLIX_WRITE_PWD 0x0865 #define CMD_HF_ISO15693_WRITE_AFI 0x0866 #define CMD_HF_TEXKOM_SIMULATE 0x0320 From 60f49175e827793c1faed90d8dd2c2a6136ddc9b Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Sat, 28 Jan 2023 13:46:11 -0600 Subject: [PATCH 159/924] change constant value so it follows others --- include/pm3_cmd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 4c4eff049..464aaf0c8 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -519,7 +519,7 @@ typedef struct { #define CMD_HF_ISO15693_COMMAND 0x0313 #define CMD_HF_ISO15693_FINDAFI 0x0315 #define CMD_HF_ISO15693_CSETUID 0x0316 -#define CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY 0xA317 +#define CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY 0x0867 #define CMD_HF_ISO15693_SLIX_DISABLE_PRIVACY 0x0317 #define CMD_HF_ISO15693_SLIX_DISABLE_EAS 0x0318 #define CMD_HF_ISO15693_SLIX_ENABLE_EAS 0x0862 From 104028bd1e2d6600fba0cf7f76111823eb2a9b87 Mon Sep 17 00:00:00 2001 From: mwalker33 <51802811+mwalker33@users.noreply.github.com> Date: Sun, 29 Jan 2023 11:35:49 +1100 Subject: [PATCH 160/924] Update T5577_Guide.md --- doc/T5577_Guide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/T5577_Guide.md b/doc/T5577_Guide.md index deab49d53..6c4eceaf5 100644 --- a/doc/T5577_Guide.md +++ b/doc/T5577_Guide.md @@ -393,8 +393,8 @@ required, please do not proceed. | Hex Data | Binary Data | |:--------:|:---------------------------------------| - | 00088040 | 000000000000100010000000111***0***0000 | - | 00088050 | 000000000000100010000000111***1***0000 | + | 000880E0 | 000000000000100010000000111***0***0000 | + | 000880F0 | 000000000000100010000000111***1***0000 | See how in the above we changed the bit in location 28 from a 0 to 1 0 = No Password, 1 = Use Password @@ -533,7 +533,7 @@ required, please do not proceed. [=] Downlink mode..... default/fixed bit length [=] Password set...... No ``` - Yes we can! We can see Block 0 is the correct config 00088040 + Yes we can! We can see Block 0 is the correct config 000880E0 # Part 2 – Configuration Blocks ^[Top](#top) From 9bd7e41d39c0961cc2e624e7bb3c54730ea1098d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 04:58:29 +0100 Subject: [PATCH 161/924] add dummy length to pass savejson sanity check. Thanks @mwalker33 --- client/src/preferences.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/preferences.c b/client/src/preferences.c index 28ae4d44f..99fb20d30 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -152,7 +152,7 @@ int preferences_save(void) { } uint8_t dummyData = 0x00; - size_t dummyDL = 0x00; + size_t dummyDL = 0x01; if (saveFileJSON(fn, jsfCustom, &dummyData, dummyDL, &preferences_save_callback) != PM3_SUCCESS) PrintAndLogEx(ERR, "Error saving preferences to \"%s\"", fn); From 09f2bf9f02910d4c075221784b0b0b0e4af8a1bb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 04:59:50 +0100 Subject: [PATCH 162/924] style --- armsrc/appmain.c | 16 +- armsrc/iso15693.c | 290 ++++++++++----------- armsrc/iso15693.h | 2 +- client/src/cmdhf15.c | 442 +++++++++++++++----------------- client/src/cmdhw.c | 2 +- client/src/pm3line_vocabulory.h | 6 +- doc/commands.json | 105 +++++++- doc/commands.md | 8 +- 8 files changed, 455 insertions(+), 416 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 734ee85ee..1687767cc 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -455,7 +455,7 @@ static void SendCapabilities(void) { #ifdef RDV4 capabilities.is_rdv4 = true; -#else +#else capabilities.is_rdv4 = false; #endif @@ -1296,7 +1296,7 @@ static void PacketReceived(PacketCommandNG *packet) { case CMD_HF_ISO15693_SLIX_DISABLE_EAS: { struct p { uint8_t pwd[4]; - bool usepwd; + bool usepwd; } PACKED; struct p *payload = (struct p *) packet->data.asBytes; DisableEAS_AFISlixIso15693(payload->pwd, payload->usepwd); @@ -1305,7 +1305,7 @@ static void PacketReceived(PacketCommandNG *packet) { case CMD_HF_ISO15693_SLIX_ENABLE_EAS: { struct p { uint8_t pwd[4]; - bool usepwd; + bool usepwd; } PACKED; struct p *payload = (struct p *) packet->data.asBytes; EnableEAS_AFISlixIso15693(payload->pwd, payload->usepwd); @@ -1333,7 +1333,7 @@ static void PacketReceived(PacketCommandNG *packet) { struct p { uint8_t pwd[4]; } PACKED; - struct p* payload = (struct p*)packet->data.asBytes; + struct p *payload = (struct p *)packet->data.asBytes; EnablePrivacySlixIso15693(payload->pwd); break; } @@ -1341,7 +1341,7 @@ static void PacketReceived(PacketCommandNG *packet) { struct p { uint8_t pwd[4]; } PACKED; - struct p* payload = (struct p*)packet->data.asBytes; + struct p *payload = (struct p *)packet->data.asBytes; PassProtectAFISlixIso15693(payload->pwd); break; } @@ -1353,7 +1353,7 @@ static void PacketReceived(PacketCommandNG *packet) { bool use_uid; uint8_t afi; } PACKED; - struct p* payload = (struct p*)packet->data.asBytes; + struct p *payload = (struct p *)packet->data.asBytes; WriteAFIIso15693(payload->pwd, payload->use_pwd, payload->uid, payload->use_uid, payload->afi); break; } @@ -1361,11 +1361,11 @@ static void PacketReceived(PacketCommandNG *packet) { struct p { uint8_t pwd[4]; } PACKED; - struct p* payload = (struct p*)packet->data.asBytes; + struct p *payload = (struct p *)packet->data.asBytes; PassProtextEASSlixIso15693(payload->pwd); break; } - + #endif #ifdef WITH_LEGICRF diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index 3ca186305..daa84f886 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -177,31 +177,30 @@ static void CodeIso15693AsReaderEOF(void) { } -static int get_uid_slix(uint32_t start_time, uint32_t* eof_time, uint8_t* uid) { +static int get_uid_slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid) { uint8_t *answer = BigBuf_malloc(ISO15693_MAX_RESPONSE_LENGTH); memset(answer, 0x00, ISO15693_MAX_RESPONSE_LENGTH); start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; - + uint8_t cmd[5] = {0}; BuildIdentifyRequest(cmd); uint16_t recvlen = 0; SendDataTag(cmd, sizeof(cmd), false, true, answer, ISO15693_MAX_RESPONSE_LENGTH, start_time, ISO15693_READER_TIMEOUT, eof_time, &recvlen); - - if(recvlen != 12) - { - return PM3_ETIMEOUT; + + if (recvlen != 12) { + return PM3_ETIMEOUT; } - - uid[0] = answer[2]; - uid[1] = answer[3]; + + uid[0] = answer[2]; + uid[1] = answer[3]; uid[2] = answer[4]; uid[3] = answer[5]; uid[4] = answer[6]; uid[5] = answer[7]; uid[6] = answer[8]; - uid[7] = answer[9]; + uid[7] = answer[9]; BigBuf_free(); return PM3_SUCCESS; @@ -2701,7 +2700,7 @@ static bool get_rnd_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t return true; } -static uint32_t disable_privacy_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t pass_id, uint8_t* password) { +static uint32_t disable_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pass_id, uint8_t *password) { uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { @@ -2723,26 +2722,26 @@ static uint32_t disable_privacy_15693_Slix(uint32_t start_time, uint32_t* eof_ti return PM3_SUCCESS; } -static uint32_t set_pass_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t pass_id, uint8_t* password, uint8_t* uid) { +static uint32_t set_pass_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pass_id, uint8_t *password, uint8_t *uid) { + - uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; } - + // 0x04, == NXP from manufacture id list. - uint8_t c[] = { (ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS), ISO15693_SET_PASSWORD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, pass_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - + uint8_t c[] = { (ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS), ISO15693_SET_PASSWORD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, pass_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + init_password_15693_Slix(&c[12], password, rnd); - + memcpy(&c[3], uid, 8); AddCrc15(c, 16); start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; uint16_t recvlen = 0; - + int res = SendDataTag(c, sizeof(c), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); if (res != PM3_SUCCESS && recvlen != 3) { return PM3_EWRONGANSWER; @@ -2750,7 +2749,7 @@ static uint32_t set_pass_15693_Slix(uint32_t start_time, uint32_t* eof_time, uin return PM3_SUCCESS; } -static uint32_t set_privacy_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t* password) { +static uint32_t set_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *password) { uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; @@ -2771,28 +2770,26 @@ static uint32_t set_privacy_15693_Slix(uint32_t start_time, uint32_t* eof_time, return PM3_SUCCESS; } -static uint32_t disable_eas_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t* password, bool usepwd) { - +static uint32_t disable_eas_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd) { + uint8_t uid[8]; get_uid_slix(start_time, eof_time, uid); - + uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; } - - if(usepwd) - { - - int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); - - if(res_setpass != PM3_SUCCESS) - { - return PM3_EWRONGANSWER; - } - } - - // 0x04, == NXP from manufacture id list. + + if (usepwd) { + + int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); + + if (res_setpass != PM3_SUCCESS) { + return PM3_EWRONGANSWER; + } + } + + // 0x04, == NXP from manufacture id list. uint8_t c[] = { ISO15_REQ_DATARATE_HIGH, 0xA3, 0x04, 0x00, 0x00}; AddCrc15(c, 3); @@ -2807,24 +2804,22 @@ static uint32_t disable_eas_15693_Slix(uint32_t start_time, uint32_t* eof_time, } -static uint32_t enable_eas_15693_Slix(uint32_t start_time, uint32_t* eof_time, uint8_t* password, bool usepwd) { - +static uint32_t enable_eas_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd) { + uint8_t uid[8]; get_uid_slix(start_time, eof_time, uid); - + uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; } - - if(usepwd) - { - int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); - - if(res_setpass != PM3_SUCCESS) - { - return PM3_EWRONGANSWER; - } + + if (usepwd) { + int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); + + if (res_setpass != PM3_SUCCESS) { + return PM3_EWRONGANSWER; + } } // 0x04, == NXP from manufacture id list. uint8_t c[] = { ISO15_REQ_DATARATE_HIGH, 0xA2, 0x04, 0x00, 0x00}; @@ -2841,106 +2836,100 @@ static uint32_t enable_eas_15693_Slix(uint32_t start_time, uint32_t* eof_time, u return PM3_SUCCESS; } -static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pwd_id, uint8_t *password, uint8_t* uid) { - +static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pwd_id, uint8_t *password, uint8_t *uid) { + uint8_t new_pwd_cmd[] = { (ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS), ISO15693_WRITE_PASSWORD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, pwd_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - + memcpy(&new_pwd_cmd[3], uid, 8); memcpy(&new_pwd_cmd[12], password, 4); - + AddCrc15(new_pwd_cmd, 16); start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; uint16_t recvlen = 0; - + int res_wrp = SendDataTag(new_pwd_cmd, sizeof(new_pwd_cmd), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); if (res_wrp != PM3_SUCCESS && recvlen != 3) { return PM3_EWRONGANSWER; } - + return PM3_SUCCESS; } - -static uint32_t pass_protect_EASAFI_15693_Slix(uint32_t start_time, uint32_t *eof_time, bool set_option_flag, uint8_t* password) { - - uint8_t flags; - - if(set_option_flag) - flags = ISO15_REQ_DATARATE_HIGH | ISO15_REQ_OPTION; - else - flags = ISO15_REQ_DATARATE_HIGH; - - - uint8_t uid[8]; - get_uid_slix(start_time, eof_time, uid); - uint8_t rnd[2]; - if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { - return PM3_ETIMEOUT; - } - - int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); - - if(res_setpass != PM3_SUCCESS) - { - return PM3_EWRONGANSWER; - } +static uint32_t pass_protect_EASAFI_15693_Slix(uint32_t start_time, uint32_t *eof_time, bool set_option_flag, uint8_t *password) { - uint8_t new_pass_protect_cmd[] = { flags, ISO15693_PASSWORD_PROTECT_EAS, 0x04, 0x00, 0x00}; - AddCrc15(new_pass_protect_cmd, 3); - - start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; - uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; - uint16_t recvlen = 0; + uint8_t flags; - int res = SendDataTag(new_pass_protect_cmd, sizeof(new_pass_protect_cmd), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); - if (res != PM3_SUCCESS && recvlen != 3) { - return PM3_EWRONGANSWER; - } - - return PM3_SUCCESS; + if (set_option_flag) + flags = ISO15_REQ_DATARATE_HIGH | ISO15_REQ_OPTION; + else + flags = ISO15_REQ_DATARATE_HIGH; + + + uint8_t uid[8]; + get_uid_slix(start_time, eof_time, uid); + + uint8_t rnd[2]; + if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { + return PM3_ETIMEOUT; + } + + int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); + + if (res_setpass != PM3_SUCCESS) { + return PM3_EWRONGANSWER; + } + + uint8_t new_pass_protect_cmd[] = { flags, ISO15693_PASSWORD_PROTECT_EAS, 0x04, 0x00, 0x00}; + AddCrc15(new_pass_protect_cmd, 3); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + + int res = SendDataTag(new_pass_protect_cmd, sizeof(new_pass_protect_cmd), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res != PM3_SUCCESS && recvlen != 3) { + return PM3_EWRONGANSWER; + } + + return PM3_SUCCESS; } -static uint32_t write_afi_15693(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi) -{ - - if(!use_uid) - { - int res_getuid = get_uid_slix(start_time, eof_time, uid); - - if(res_getuid != PM3_SUCCESS) - { - return res_getuid; - } - } - - if(usepwd) - { - int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); - - if(res_setpass != PM3_SUCCESS) - { - return PM3_EWRONGANSWER; - } - } - - uint8_t cmd[] = { ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS, ISO15693_WRITE_AFI, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - memcpy(&cmd[2], uid, 8); - cmd[10] = afi; - AddCrc15(cmd, 11); - - start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; - uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; - uint16_t recvlen = 0; +static uint32_t write_afi_15693(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi) { - int res = SendDataTag(cmd, sizeof(cmd), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); - if (res != PM3_SUCCESS || recvlen != 3) { - return PM3_EWRONGANSWER; - } + if (!use_uid) { + int res_getuid = get_uid_slix(start_time, eof_time, uid); - return PM3_SUCCESS; + if (res_getuid != PM3_SUCCESS) { + return res_getuid; + } + } + + if (usepwd) { + int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); + + if (res_setpass != PM3_SUCCESS) { + return PM3_EWRONGANSWER; + } + } + + uint8_t cmd[] = { ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS, ISO15693_WRITE_AFI, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + memcpy(&cmd[2], uid, 8); + cmd[10] = afi; + AddCrc15(cmd, 11); + + start_time = *eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint16_t recvlen = 0; + + int res = SendDataTag(cmd, sizeof(cmd), false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, eof_time, &recvlen); + if (res != PM3_SUCCESS || recvlen != 3) { + return PM3_EWRONGANSWER; + } + + return PM3_SUCCESS; } /* @@ -3013,29 +3002,28 @@ static uint32_t destroy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint */ void WritePasswordSlixIso15693(uint8_t *old_password, uint8_t *new_password, uint8_t pwd_id) { - LED_D_ON(); - Iso15693InitReader(); - StartCountSspClk(); - uint32_t start_time = 0, eof_time = 0; - int res = PM3_EFAILED; - - uint8_t uid[8]; - get_uid_slix(start_time, &eof_time, uid); + LED_D_ON(); + Iso15693InitReader(); + StartCountSspClk(); + uint32_t start_time = 0, eof_time = 0; + int res = PM3_EFAILED; + + uint8_t uid[8]; + get_uid_slix(start_time, &eof_time, uid); + + res = set_pass_15693_Slix(start_time, &eof_time, pwd_id, old_password, uid); + if (res != PM3_SUCCESS) { + reply_ng(CMD_HF_ISO15693_SLIX_WRITE_PWD, res, NULL, 0); + switch_off(); + return; + } + + res = write_password_15693_Slix(start_time, &eof_time, pwd_id, new_password, uid); - res = set_pass_15693_Slix(start_time, &eof_time, pwd_id, old_password, uid); - if(res != PM3_SUCCESS) - { reply_ng(CMD_HF_ISO15693_SLIX_WRITE_PWD, res, NULL, 0); - switch_off(); - return; - } - res = write_password_15693_Slix(start_time, &eof_time, pwd_id, new_password, uid); - - reply_ng(CMD_HF_ISO15693_SLIX_WRITE_PWD, res, NULL, 0); - - switch_off(); - + switch_off(); + } void DisablePrivacySlixIso15693(uint8_t *password) { @@ -3053,7 +3041,7 @@ void DisablePrivacySlixIso15693(uint8_t *password) { switch_off(); } -void EnablePrivacySlixIso15693(uint8_t* password) { +void EnablePrivacySlixIso15693(uint8_t *password) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -3080,9 +3068,9 @@ void DisableEAS_AFISlixIso15693(uint8_t *password, bool usepwd) { // 0x08 Destroy SLIX-L // 0x10 EAS/AFI int res = disable_eas_15693_Slix(start_time, &eof_time, password, usepwd); - - - + + + reply_ng(CMD_HF_ISO15693_SLIX_DISABLE_EAS, res, NULL, 0); switch_off(); } @@ -3130,4 +3118,4 @@ void WriteAFIIso15693(uint8_t *password, bool use_pwd, uint8_t *uid, bool use_ui //int res = PM3_SUCCESS; reply_ng(CMD_HF_ISO15693_WRITE_AFI, res, NULL, 0); switch_off(); -} \ No newline at end of file +} diff --git a/armsrc/iso15693.h b/armsrc/iso15693.h index c0ff44929..b087edd2e 100644 --- a/armsrc/iso15693.h +++ b/armsrc/iso15693.h @@ -64,7 +64,7 @@ void SetTag15693Uid(const uint8_t *uid); void WritePasswordSlixIso15693(uint8_t *old_password, uint8_t *new_password, uint8_t pwd_id); void DisablePrivacySlixIso15693(uint8_t *password); -void EnablePrivacySlixIso15693(uint8_t* password); +void EnablePrivacySlixIso15693(uint8_t *password); void DisableEAS_AFISlixIso15693(uint8_t *password, bool usepwd); void EnableEAS_AFISlixIso15693(uint8_t *password, bool usepwd); void PassProtextEASSlixIso15693(uint8_t *password); diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 590393c61..9c7f1528d 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -698,7 +698,7 @@ static int NxpCheckSig(uint8_t *uid) { PacketResponseNG resp; uint16_t reqlen = 0; uint8_t req[PM3_CMD_DATA_SIZE] = {0}; - + // Check if we can also read the signature req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; req[reqlen++] = ISO15693_READ_SIGNATURE; @@ -736,7 +736,7 @@ static int NxpCheckSig(uint8_t *uid) { memcpy(signature, recv + 1, 32); nxp_15693_print_signature(uid, signature); - + return PM3_SUCCESS; } @@ -1363,7 +1363,7 @@ static int CmdHF15WriteAfi(const char *Cmd) { argtable[4] = arg_param_end; CLIExecWithReturn(ctx, Cmd, argtable, true); - + struct { uint8_t pwd[4]; bool use_pwd; @@ -1376,21 +1376,19 @@ static int CmdHF15WriteAfi(const char *Cmd) { CLIGetHexWithReturn(ctx, 1, payload.uid, &uidlen); payload.afi = arg_get_int_def(ctx, 2, 0); - + int pwdlen; - + CLIGetHexWithReturn(ctx, 3, payload.pwd, &pwdlen); - + CLIParserFree(ctx); - - if(pwdlen == 4) - { + + if (pwdlen == 4) { payload.use_pwd = true; } - - if(uidlen == 8) - { - payload.use_uid = true; + + if (uidlen == 8) { + payload.use_uid = true; } // sanity checks @@ -1398,11 +1396,10 @@ static int CmdHF15WriteAfi(const char *Cmd) { PrintAndLogEx(WARNING, "uid must be 8 hex bytes if provided"); return PM3_EINVARG; } - - if(pwdlen > 0 && pwdlen != 4) - { + + if (pwdlen > 0 && pwdlen != 4) { PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); - return PM3_ESOFT; + return PM3_ESOFT; } PacketResponseNG resp; @@ -1420,11 +1417,11 @@ static int CmdHF15WriteAfi(const char *Cmd) { break; } case PM3_EWRONGANSWER: { - PrintAndLogEx(WARNING, "error writing AFI"); + PrintAndLogEx(WARNING, "error writing AFI"); break; } case PM3_SUCCESS: { - PrintAndLogEx(SUCCESS, "Wrote AFI 0x%02X", payload.afi); + PrintAndLogEx(SUCCESS, "Wrote AFI 0x%02X", payload.afi); break; } } @@ -2385,29 +2382,25 @@ static int CmdHF15SlixEASEnable(const char *Cmd) { bool usepwd; } PACKED payload; int pwdlen = 0; - + int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen); - if((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) - { + if ((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) { PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); - return PM3_ESOFT; + return PM3_ESOFT; } - + //CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); CLIParserFree(ctx); - - - if(pwdlen > 0 ) - { - PrintAndLogEx(INFO, "Trying to enable EAS mode using password " _GREEN_("%s") - , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) - ); - payload.usepwd = true; - } - else - { - PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password"); - payload.usepwd = false; + + + if (pwdlen > 0) { + PrintAndLogEx(INFO, "Trying to enable EAS mode using password " _GREEN_("%s") + , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) + ); + payload.usepwd = true; + } else { + PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password"); + payload.usepwd = false; } @@ -2426,13 +2419,10 @@ static int CmdHF15SlixEASEnable(const char *Cmd) { break; } case PM3_EWRONGANSWER: { - if(pwdlen > 0 ) - { - PrintAndLogEx(WARNING, "the password provided was not accepted"); - } - else - { - PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked"); + if (pwdlen > 0) { + PrintAndLogEx(WARNING, "the password provided was not accepted"); + } else { + PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked"); } break; } @@ -2451,7 +2441,7 @@ static int CmdHF15SlixEASDisable(const char *Cmd) { "Disable EAS mode on SLIX ISO-15693 tag", "hf 15 slixeasdisable -p 0F0F0F0F"); - void *argtable[] = { + void *argtable[] = { arg_param_begin, arg_str0("p", "pwd", "", "optional password, 8 hex bytes"), arg_param_end @@ -2460,32 +2450,28 @@ static int CmdHF15SlixEASDisable(const char *Cmd) { struct { uint8_t pwd[4]; bool usepwd; - + } PACKED payload; int pwdlen = 0; - + int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen); - if((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) - { + if ((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) { PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); - return PM3_ESOFT; + return PM3_ESOFT; } - + //CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); CLIParserFree(ctx); - - - if(pwdlen > 0 ) - { - PrintAndLogEx(INFO, "Trying to disable EAS mode using password " _GREEN_("%s") - , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) - ); - payload.usepwd = true; - } - else - { - PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password"); - payload.usepwd = false; + + + if (pwdlen > 0) { + PrintAndLogEx(INFO, "Trying to disable EAS mode using password " _GREEN_("%s") + , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) + ); + payload.usepwd = true; + } else { + PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password"); + payload.usepwd = false; } PacketResponseNG resp; @@ -2503,13 +2489,10 @@ static int CmdHF15SlixEASDisable(const char *Cmd) { break; } case PM3_EWRONGANSWER: { - if(pwdlen > 0 ) - { - PrintAndLogEx(WARNING, "the password provided was not accepted"); - } - else - { - PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked"); + if (pwdlen > 0) { + PrintAndLogEx(WARNING, "the password provided was not accepted"); + } else { + PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked"); } break; } @@ -2571,14 +2554,14 @@ static int CmdHF15SlixDisable(const char *Cmd) { return resp.status; } -static int CmdHF15SlixEnable(const char* Cmd) { +static int CmdHF15SlixEnable(const char *Cmd) { - CLIParserContext* ctx; + CLIParserContext *ctx; CLIParserInit(&ctx, "hf 15 slixprivacyenable", - "Enable privacy mode on SLIX ISO-15693 tag", - "hf 15 slixenable -p 0F0F0F0F"); + "Enable privacy mode on SLIX ISO-15693 tag", + "hf 15 slixenable -p 0F0F0F0F"); - void* argtable[] = { + void *argtable[] = { arg_param_begin, arg_str1("p", "pwd", "", "password, 8 hex bytes"), arg_param_end @@ -2592,12 +2575,12 @@ static int CmdHF15SlixEnable(const char* Cmd) { CLIParserFree(ctx); PrintAndLogEx(INFO, "Trying to enable privacy mode using password " _GREEN_("%s") - , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) - ); + , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) + ); PacketResponseNG resp; clearCommandBuffer(); - SendCommandNG(CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY, (uint8_t*)&payload, sizeof(payload)); + SendCommandNG(CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY, (uint8_t *)&payload, sizeof(payload)); if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_ENABLE_PRIVACY, &resp, 2000) == false) { PrintAndLogEx(WARNING, "timeout while waiting for reply"); DropField(); @@ -2605,18 +2588,18 @@ static int CmdHF15SlixEnable(const char* Cmd) { } switch (resp.status) { - case PM3_ETIMEOUT: { - PrintAndLogEx(WARNING, "no tag found"); - break; - } - case PM3_EWRONGANSWER: { - PrintAndLogEx(WARNING, "password was not accepted"); - break; - } - case PM3_SUCCESS: { - PrintAndLogEx(SUCCESS, "privacy mode is now enabled ( " _GREEN_("ok") " ) "); - break; - } + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + PrintAndLogEx(WARNING, "password was not accepted"); + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "privacy mode is now enabled ( " _GREEN_("ok") " ) "); + break; + } } return resp.status; } @@ -2634,73 +2617,60 @@ static int CmdHF15SlixWritePassword(const char *Cmd) { arg_str1("n", "new", "", "new password, 8 hex bytes"), arg_param_end }; - + CLIExecWithReturn(ctx, Cmd, argtable, false); - + struct { uint8_t old_pwd[4]; uint8_t new_pwd[4]; uint8_t pwd_id; } PACKED payload; int pwdlen = 0; - - - + + + CLIGetHexWithReturn(ctx, 2, payload.old_pwd, &pwdlen); - - if(pwdlen > 0 && pwdlen != 4) - { + + if (pwdlen > 0 && pwdlen != 4) { PrintAndLogEx(WARNING, "old password must be 4 hex bytes if provided"); - return PM3_ESOFT; + return PM3_ESOFT; } - + CLIGetHexWithReturn(ctx, 3, payload.new_pwd, &pwdlen); - - if(pwdlen != 4) - { + + if (pwdlen != 4) { PrintAndLogEx(WARNING, "new password must be 4 hex bytes"); - return PM3_ESOFT; + return PM3_ESOFT; } - + int vlen = 0; char value[10]; CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)value, sizeof(value), &vlen); - + if (vlen > 0) { - if (strcmp(value, "read") == 0) - { + if (strcmp(value, "read") == 0) { PrintAndLogEx(SUCCESS, "Selected read pass"); payload.pwd_id = 0x01; - } - else if (strcmp(value, "write") == 0) - { + } else if (strcmp(value, "write") == 0) { PrintAndLogEx(SUCCESS, "Selected write pass"); payload.pwd_id = 0x02; - } - else if (strcmp(value, "privacy") == 0) - { + } else if (strcmp(value, "privacy") == 0) { PrintAndLogEx(SUCCESS, "Selected privacy pass"); payload.pwd_id = 0x04; - } - else if (strcmp(value, "destroy") == 0) - { + } else if (strcmp(value, "destroy") == 0) { PrintAndLogEx(SUCCESS, "Selected destroy pass"); payload.pwd_id = 0x08; - } - else if (strcmp(value, "easafi") == 0) - { + } else if (strcmp(value, "easafi") == 0) { PrintAndLogEx(SUCCESS, "Selected easafi pass"); payload.pwd_id = 0x10; - } - else - { + } else { PrintAndLogEx(ERR, "t argument must be 'read', 'write', 'privacy', 'destroy', or 'easafi'"); return PM3_EINVARG; } } - + CLIParserFree(ctx); - + PrintAndLogEx(INFO, "Trying to write " _YELLOW_("%s") " as " _YELLOW_("%s") " password" , sprint_hex_inrow(payload.new_pwd, sizeof(payload.new_pwd)), value); @@ -2732,135 +2702,131 @@ static int CmdHF15SlixWritePassword(const char *Cmd) { } static int CmdHF15AFIPassProtect(const char *Cmd) { - - CLIParserContext *ctx; - CLIParserInit(&ctx, "hf 15 passprotectafi", - "Password protect AFI. Cannot be undone.", - "hf 15 passprotectafi -p 00000000 -c"); - void *argtable[] = { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 15 passprotectafi", + "Password protect AFI. Cannot be undone.", + "hf 15 passprotectafi -p 00000000 -c"); + + void *argtable[] = { arg_param_begin, arg_str1("p", "password", "", "EAS/AFI password, 8 hex bytes"), arg_lit0("c", "confirm", "confirm the execution of this irreversible command"), arg_param_end }; - - CLIExecWithReturn(ctx, Cmd, argtable, true); - - struct { - uint8_t pwd[4]; - } PACKED payload; - int pwdlen = 0; - - CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); - - bool confirmation = arg_get_lit(ctx, 2); - - if(pwdlen != 4) - { - PrintAndLogEx(WARNING, "password must be 4 hex bytes"); - return PM3_ESOFT; - } - - if(confirmation == 0) - { - PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag"); - return PM3_ESOFT; - } - - - PrintAndLogEx(INFO, "Trying to enable AFI password protection"); - - PacketResponseNG resp; - clearCommandBuffer(); - SendCommandNG(CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI, (uint8_t*)&payload, sizeof(payload)); - if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI, &resp, 2000) == false) { - PrintAndLogEx(WARNING, "timeout while waiting for reply"); - DropField(); - return PM3_ESOFT; - } - switch (resp.status) { - case PM3_ETIMEOUT: { - PrintAndLogEx(WARNING, "no tag found"); - break; - } - case PM3_EWRONGANSWER: { - PrintAndLogEx(WARNING, "error enabling AFI password protection"); - break; - } - case PM3_SUCCESS: { - PrintAndLogEx(SUCCESS, "AFI password protected ( " _GREEN_("ok") " ) "); - break; - } - } - return resp.status; - + CLIExecWithReturn(ctx, Cmd, argtable, true); + + struct { + uint8_t pwd[4]; + } PACKED payload; + int pwdlen = 0; + + CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); + + bool confirmation = arg_get_lit(ctx, 2); + + if (pwdlen != 4) { + PrintAndLogEx(WARNING, "password must be 4 hex bytes"); + return PM3_ESOFT; + } + + if (confirmation == 0) { + PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag"); + return PM3_ESOFT; + } + + + PrintAndLogEx(INFO, "Trying to enable AFI password protection"); + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI, (uint8_t *)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_PASS_PROTECT_AFI, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); + DropField(); + return PM3_ESOFT; + } + + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + PrintAndLogEx(WARNING, "error enabling AFI password protection"); + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "AFI password protected ( " _GREEN_("ok") " ) "); + break; + } + } + return resp.status; + } static int CmdHF15EASPassProtect(const char *Cmd) { - - CLIParserContext *ctx; - CLIParserInit(&ctx, "hf 15 passprotecteas", - "Password protect EAS. Cannot be undone.", - "hf 15 passprotecteas -p 00000000 -c"); - - void *argtable[] = { + + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 15 passprotecteas", + "Password protect EAS. Cannot be undone.", + "hf 15 passprotecteas -p 00000000 -c"); + + void *argtable[] = { arg_param_begin, arg_str1("p", "password", "", "EAS/AFI password, 8 hex bytes"), arg_lit0("c", "confirm", "confirm the execution of this irreversible command"), arg_param_end }; - CLIExecWithReturn(ctx, Cmd, argtable, true); - - struct { - uint8_t pwd[4]; - } PACKED payload; - int pwdlen = 0; - - CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); - - bool confirmation = arg_get_lit(ctx, 2); - - if(pwdlen != 4) - { - PrintAndLogEx(WARNING, "password must be 4 hex bytes"); - return PM3_ESOFT; - } - - if(confirmation == 0) - { - PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag"); - return PM3_ESOFT; - } - - PrintAndLogEx(INFO, "Trying to enable EAS password protection"); - - PacketResponseNG resp; - clearCommandBuffer(); - SendCommandNG(CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS, (uint8_t*)&payload, sizeof(payload)); - if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS, &resp, 2000) == false) { - PrintAndLogEx(WARNING, "timeout while waiting for reply"); - DropField(); - return PM3_ESOFT; - } + CLIExecWithReturn(ctx, Cmd, argtable, true); - switch (resp.status) { - case PM3_ETIMEOUT: { - PrintAndLogEx(WARNING, "no tag found"); - break; - } - case PM3_EWRONGANSWER: { - PrintAndLogEx(WARNING, "error enabling EAS password protection"); - break; - } - case PM3_SUCCESS: { - PrintAndLogEx(SUCCESS, "EAS password protected ( " _GREEN_("ok") " ) "); - break; - } - } - return resp.status; + struct { + uint8_t pwd[4]; + } PACKED payload; + int pwdlen = 0; + + CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); + + bool confirmation = arg_get_lit(ctx, 2); + + if (pwdlen != 4) { + PrintAndLogEx(WARNING, "password must be 4 hex bytes"); + return PM3_ESOFT; + } + + if (confirmation == 0) { + PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag"); + return PM3_ESOFT; + } + + PrintAndLogEx(INFO, "Trying to enable EAS password protection"); + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS, (uint8_t *)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); + DropField(); + return PM3_ESOFT; + } + + switch (resp.status) { + case PM3_ETIMEOUT: { + PrintAndLogEx(WARNING, "no tag found"); + break; + } + case PM3_EWRONGANSWER: { + PrintAndLogEx(WARNING, "error enabling EAS password protection"); + break; + } + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "EAS password protected ( " _GREEN_("ok") " ) "); + break; + } + } + return resp.status; } static command_t CommandTable[] = { diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index 67f404bc9..ed208b5f5 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -1301,7 +1301,7 @@ void pm3_version(bool verbose, bool oneliner) { if (IfPm3Flash()) { PrintAndLogEx(NORMAL, " external flash............ %s", _GREEN_("present")); } - + if (IfPm3FpcUsartHost()) { PrintAndLogEx(NORMAL, " FPC USART for BT add-on... %s", _GREEN_("present")); } diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index ee94f7ec0..bcf196fe9 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -181,9 +181,9 @@ const static vocabulory_t vocabulory[] = { { 0, "hf 15 slixeasdisable" }, { 0, "hf 15 slixeasenable" }, { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, { 0, "hf 15 wrbl" }, { 0, "hf 15 findafi" }, { 0, "hf 15 writeafi" }, diff --git a/doc/commands.json b/doc/commands.json index bb781adb7..8d028d9e9 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -1656,6 +1656,34 @@ ], "usage": "hf 15 list [-h1crux] [--frame] [-f ]" }, + "hf 15 passprotectafi": { + "command": "hf 15 passprotectafi", + "description": "Password protect AFI. Cannot be undone.", + "notes": [ + "hf 15 passprotectafi -p 00000000 -c" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-p, --password EAS/AFI password, 8 hex bytes", + "-c, --confirm confirm the execution of this irreversible command" + ], + "usage": "hf 15 passprotectafi [-hc] -p " + }, + "hf 15 passprotecteas": { + "command": "hf 15 passprotecteas", + "description": "Password protect EAS. Cannot be undone.", + "notes": [ + "hf 15 passprotecteas -p 00000000 -c" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-p, --password EAS/AFI password, 8 hex bytes", + "-c, --confirm confirm the execution of this irreversible command" + ], + "usage": "hf 15 passprotecteas [-hc] -p " + }, "hf 15 raw": { "command": "hf 15 raw", "description": "Sends raw bytes over ISO-15693 to card", @@ -1776,8 +1804,34 @@ ], "usage": "hf 15 sim [-h] -u <8b hex> [-b ]" }, - "hf 15 slixdisable": { - "command": "hf 15 slixdisable", + "hf 15 slixeasdisable": { + "command": "hf 15 slixeasdisable", + "description": "Disable EAS mode on SLIX ISO-15693 tag", + "notes": [ + "hf 15 slixeasdisable -p 0F0F0F0F" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-p, --pwd optional password, 8 hex bytes" + ], + "usage": "hf 15 slixeasdisable [-h] [-p ]" + }, + "hf 15 slixeasenable": { + "command": "hf 15 slixeasenable", + "description": "Enable EAS mode on SLIX ISO-15693 tag", + "notes": [ + "hf 15 slixeasenable -p 0F0F0F0F" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-p, --pwd optional password, 8 hex bytes" + ], + "usage": "hf 15 slixeasenable [-h] [-p ]" + }, + "hf 15 slixprivacydisable": { + "command": "hf 15 slixprivacydisable", "description": "Disable privacy mode on SLIX ISO-15693 tag", "notes": [ "hf 15 slixdisable -p 0F0F0F0F" @@ -1787,7 +1841,35 @@ "-h, --help This help", "-p, --pwd password, 8 hex bytes" ], - "usage": "hf 15 slixdisable [-h] -p " + "usage": "hf 15 slixprivacydisable [-h] -p " + }, + "hf 15 slixprivacyenable": { + "command": "hf 15 slixprivacyenable", + "description": "Enable privacy mode on SLIX ISO-15693 tag", + "notes": [ + "hf 15 slixenable -p 0F0F0F0F" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-p, --pwd password, 8 hex bytes" + ], + "usage": "hf 15 slixprivacyenable [-h] -p " + }, + "hf 15 slixwritepwd": { + "command": "hf 15 slixwritepwd", + "description": "Write a password on a SLIX family ISO-15693 tag", + "notes": [ + "hf 15 slixwritepwd -t READ -o 00000000 -n 12131415" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-t, --type which password field to write to (some tags do not support all password types)", + "-o, --old old password (if present), 8 hex bytes", + "-n, --new new password, 8 hex bytes" + ], + "usage": "hf 15 slixwritepwd [-h] -t [-o ] -n " }, "hf 15 sniff": { "command": "hf 15 sniff", @@ -1827,19 +1909,16 @@ "description": "Write AFI on card", "notes": [ "hf 15 writeafi -* --afi 12", - "hf 15 writeafi -u E011223344556677 --afi 12" + "hf 15 writeafi -u E011223344556677 --afi 12 -p 0F0F0F0F" ], "offline": false, "options": [ "-h, --help This help", "-u, --uid full UID, 8 bytes", - "--ua unaddressed mode", - "-* scan for tag", - "-2 use slower '1 out of 256' mode", - "-o, --opt set OPTION Flag (needed for TI)", - "--afi AFI number (0-255)" + "--afi AFI number (0-255)", + "-p, --pwd optional AFI/EAS password" ], - "usage": "hf 15 writeafi [-h*2o] [-u ] [--ua] --afi " + "usage": "hf 15 writeafi [-h] [-u ] --afi [-p ]" }, "hf 15 writedsfid": { "command": "hf 15 writedsfid", @@ -11408,7 +11487,7 @@ }, "script help": { "command": "script help", - "description": "This is a feature to run Lua/Cmd/Python scripts. You can place scripts within the luascripts/cmdscripts/pyscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", + "description": "This is a feature to run Lua/Cmd scripts. You can place scripts within the luascripts/cmdscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", "notes": [], "offline": true, "options": [], @@ -11803,8 +11882,8 @@ } }, "metadata": { - "commands_extracted": 742, + "commands_extracted": 748, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-01-27T01:57:37" + "extracted_on": "2023-01-29T03:58:53" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 79499915b..382c98b58 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -236,7 +236,13 @@ Check column "offline" for their availability. |`hf 15 esave `|N |`Save emulator memory into image file` |`hf 15 eview `|N |`View emulator memory` |`hf 15 sim `|N |`Fake an ISO-15693 tag` -|`hf 15 slixdisable `|N |`Disable privacy mode on SLIX ISO-15693 tag` +|`hf 15 slixwritepwd `|N |`Writes a password on a SLIX ISO-15693 tag` +|`hf 15 slixeasdisable `|N |`Disable EAS mode on SLIX ISO-15693 tag` +|`hf 15 slixeasenable `|N |`Enable EAS mode on SLIX ISO-15693 tag` +|`hf 15 slixprivacydisable`|N |`Disable privacy mode on SLIX ISO-15693 tag` +|`hf 15 slixprivacyenable`|N |`Enable privacy mode on SLIX ISO-15693 tag` +|`hf 15 passprotectafi `|N |`Password protect AFI - Cannot be undone` +|`hf 15 passprotecteas `|N |`Password protect EAS - Cannot be undone` |`hf 15 wrbl `|N |`Write a block` |`hf 15 findafi `|N |`Brute force AFI of an ISO-15693 tag` |`hf 15 writeafi `|N |`Writes the AFI on an ISO-15693 tag` From cd96fbfcc9daaeb4d154e962c348ef456f7a90ce Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 06:35:31 +0100 Subject: [PATCH 163/924] text --- client/src/proxmark3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 9ca38a2a1..378b9f0dc 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -41,7 +41,7 @@ static int mainret = PM3_ESOFT; #ifndef LIBPM3 #define BANNERMSG1 "" -#define BANNERMSG2 " [ :snowflake: ]" +#define BANNERMSG2 " [ :coffee: ]" #define BANNERMSG3 "" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; From 2633a54e11670a0144bcf11ce308b3eba644773c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 29 Jan 2023 15:16:38 +0100 Subject: [PATCH 164/924] build_all_firmwares.sh: skip NFCBARCODE support for 256kb builds --- tools/build_all_firmwares.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index b76f7a45a..a0253e789 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -22,7 +22,7 @@ echo "Destination: ${DEST:=firmware}" echo "Produce stats?: ${STATS:=false}" # Which parts to skip for the 256kb version? -SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_ISO14443b=1" +SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_ISO14443b=1 SKIP_NFCBARCODE=1" make $MKFLAGS bootrom || exit 1 chmod 644 bootrom/obj/bootrom.elf From db6a0ab5efb90f76c7933b29901e03247331932c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 18:02:45 +0100 Subject: [PATCH 165/924] coverity fix #40581, #404580, #40579... --- client/src/cmdhf15.c | 46 +++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 9c7f1528d..5a58162bc 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -1378,15 +1378,16 @@ static int CmdHF15WriteAfi(const char *Cmd) { payload.afi = arg_get_int_def(ctx, 2, 0); int pwdlen; - CLIGetHexWithReturn(ctx, 3, payload.pwd, &pwdlen); CLIParserFree(ctx); + payload.use_pwd = false; if (pwdlen == 4) { payload.use_pwd = true; } + payload.use_uid = false; if (uidlen == 8) { payload.use_uid = true; } @@ -2386,13 +2387,12 @@ static int CmdHF15SlixEASEnable(const char *Cmd) { int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen); if ((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) { PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); + CLIParserFree(ctx); return PM3_ESOFT; } - //CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); CLIParserFree(ctx); - if (pwdlen > 0) { PrintAndLogEx(INFO, "Trying to enable EAS mode using password " _GREEN_("%s") , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) @@ -2627,12 +2627,11 @@ static int CmdHF15SlixWritePassword(const char *Cmd) { } PACKED payload; int pwdlen = 0; - - CLIGetHexWithReturn(ctx, 2, payload.old_pwd, &pwdlen); if (pwdlen > 0 && pwdlen != 4) { PrintAndLogEx(WARNING, "old password must be 4 hex bytes if provided"); + CLIParserFree(ctx); return PM3_ESOFT; } @@ -2640,6 +2639,7 @@ static int CmdHF15SlixWritePassword(const char *Cmd) { if (pwdlen != 4) { PrintAndLogEx(WARNING, "new password must be 4 hex bytes"); + CLIParserFree(ctx); return PM3_ESOFT; } @@ -2671,7 +2671,6 @@ static int CmdHF15SlixWritePassword(const char *Cmd) { CLIParserFree(ctx); - PrintAndLogEx(INFO, "Trying to write " _YELLOW_("%s") " as " _YELLOW_("%s") " password" , sprint_hex_inrow(payload.new_pwd, sizeof(payload.new_pwd)), value); @@ -2705,13 +2704,14 @@ static int CmdHF15AFIPassProtect(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf 15 passprotectafi", - "Password protect AFI. Cannot be undone.", - "hf 15 passprotectafi -p 00000000 -c"); + "This command enables the password protect of AFI.\n" + "*** OBS! This action can not be undone! ***", + "hf 15 passprotectafi -p 00000000 --force"); void *argtable[] = { arg_param_begin, - arg_str1("p", "password", "", "EAS/AFI password, 8 hex bytes"), - arg_lit0("c", "confirm", "confirm the execution of this irreversible command"), + arg_str1("p", "pwd", "", "EAS/AFI password, 8 hex bytes"), + arg_lit0(NULL, "force", "Force execution of command (irreversible) "), arg_param_end }; @@ -2724,20 +2724,20 @@ static int CmdHF15AFIPassProtect(const char *Cmd) { CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); - bool confirmation = arg_get_lit(ctx, 2); + bool force = arg_get_lit(ctx, 2); + CLIParserFree(ctx); if (pwdlen != 4) { PrintAndLogEx(WARNING, "password must be 4 hex bytes"); return PM3_ESOFT; } - if (confirmation == 0) { - PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag"); + if (force == false) { + PrintAndLogEx(WARNING, "Use `--force` flag to override. OBS! Irreversable command"); return PM3_ESOFT; } - - PrintAndLogEx(INFO, "Trying to enable AFI password protection"); + PrintAndLogEx(INFO, "Trying to enable AFI password protection..."); PacketResponseNG resp; clearCommandBuffer(); @@ -2770,13 +2770,14 @@ static int CmdHF15EASPassProtect(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf 15 passprotecteas", - "Password protect EAS. Cannot be undone.", - "hf 15 passprotecteas -p 00000000 -c"); + "This command enables the password protect of EAS.\n" + "*** OBS! This action can not be undone! ***", + "hf 15 passprotecteas -p 00000000 --force"); void *argtable[] = { arg_param_begin, arg_str1("p", "password", "", "EAS/AFI password, 8 hex bytes"), - arg_lit0("c", "confirm", "confirm the execution of this irreversible command"), + arg_lit0(NULL, "force", "Force execution of command (irreversible) "), arg_param_end }; @@ -2789,19 +2790,20 @@ static int CmdHF15EASPassProtect(const char *Cmd) { CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); - bool confirmation = arg_get_lit(ctx, 2); + bool force = arg_get_lit(ctx, 2); + CLIParserFree(ctx); if (pwdlen != 4) { PrintAndLogEx(WARNING, "password must be 4 hex bytes"); return PM3_ESOFT; } - if (confirmation == 0) { - PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag"); + if (force == false) { + PrintAndLogEx(WARNING, "Use `--force` flag to override. OBS! Irreversable command"); return PM3_ESOFT; } - PrintAndLogEx(INFO, "Trying to enable EAS password protection"); + PrintAndLogEx(INFO, "Trying to enable EAS password protection..."); PacketResponseNG resp; clearCommandBuffer(); From 30538c20ae5a839a0869e161ee60cd0e1e9b94b6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 18:05:47 +0100 Subject: [PATCH 166/924] coverity fix #404575 --- client/src/cmdhf15.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 5a58162bc..92e42d717 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -2447,6 +2447,7 @@ static int CmdHF15SlixEASDisable(const char *Cmd) { arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + struct { uint8_t pwd[4]; bool usepwd; @@ -2455,15 +2456,13 @@ static int CmdHF15SlixEASDisable(const char *Cmd) { int pwdlen = 0; int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen); + CLIParserFree(ctx); + if ((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) { PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); return PM3_ESOFT; } - //CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); - CLIParserFree(ctx); - - if (pwdlen > 0) { PrintAndLogEx(INFO, "Trying to disable EAS mode using password " _GREEN_("%s") , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) @@ -2776,7 +2775,7 @@ static int CmdHF15EASPassProtect(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_str1("p", "password", "", "EAS/AFI password, 8 hex bytes"), + arg_str1("p", "pwd", "", "EAS/AFI password, 8 hex bytes"), arg_lit0(NULL, "force", "Force execution of command (irreversible) "), arg_param_end }; From b217b4e39d0bed09f3600c59f3db48d514a1674c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 18:07:59 +0100 Subject: [PATCH 167/924] fix coverity #404576 --- client/src/cmdhf14a.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index d0ba31cd0..2c6bc740a 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -1460,8 +1460,9 @@ static int CmdHF14AChaining(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf 14a chaining", "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", + "hf 14a chaining -> show chaining enable/disable state\n" "hf 14a chaining --off -> disable chaining\n" - "hf 14a chaining -> show chaining enable/disable state\n"); + ); void *argtable[] = { arg_param_begin, @@ -1473,6 +1474,7 @@ static int CmdHF14AChaining(const char *Cmd) { bool on = arg_get_lit(ctx, 1); bool off = arg_get_lit(ctx, 2); + CLIParserFree(ctx); if ((on + off) > 1) { PrintAndLogEx(INFO, "Select only one option"); @@ -1485,8 +1487,6 @@ static int CmdHF14AChaining(const char *Cmd) { if (off) Set_apdu_in_framing(false); - CLIParserFree(ctx); - PrintAndLogEx(INFO, "\nISO 14443-4 input chaining %s.\n", g_apdu_in_framing_enable ? "enabled" : "disabled"); return PM3_SUCCESS; } From b24d7736c59157640edb036e0dcf132b49acba53 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 18:14:49 +0100 Subject: [PATCH 168/924] fix coverity #322661 --- client/src/cmdflashmem.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/cmdflashmem.c b/client/src/cmdflashmem.c index f01531d55..7bbdf74c9 100644 --- a/client/src/cmdflashmem.c +++ b/client/src/cmdflashmem.c @@ -641,6 +641,10 @@ static int CmdFlashMemInfo(const char *Cmd) { // Verify (public key) bool is_verified = (mbedtls_rsa_pkcs1_verify(rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 20, sha_hash, from_device) == 0); + if (got_private == false) { + mbedtls_rsa_free(rsa); + } + mbedtls_pk_free(&pkctx); PrintAndLogEx(NORMAL, ""); From 568e35ca84f54a831a66eba1bd42b61cfe6d314d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 18:32:15 +0100 Subject: [PATCH 169/924] style --- CHANGELOG.md | 12 ++++++++---- client/src/cmdhf14a.c | 2 +- client/src/cmdhf15.c | 6 +++--- doc/commands.json | 26 +++++++++++++------------- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 936e087f5..285cd6bf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + +## [Nitride][2023-01-29] + - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) + - Fixed some coverity fixes (@iceman1001) + - Fixed `make accessrights` on Fedora (@mooey5775) + - Fixed `hf mfu info` - can now identify the 50 pF version of NTAG 210u(micro) (@mjacksn) + - Added `hf 15` sub-commands for controlling EAS, AFI, privacy mode, and the setting of passwords on SLIX tags (@mjacksn) - Added new magic gen4 cards command in docs (@McEloff) - Added `hf tesla info` - intital information command to read TESLA cards (@iceman1001) - Changed `hf emrtd info` - looking for lower case .bin extensions (@iceman1001) @@ -41,9 +48,6 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `pm3` shell script now automatically detects WSL2 with USBIPD serial ports (@iceman1001) - Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001) - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) - - Fixed `make accessrights` on Fedora (@mooey5775) - - Fixed `hf mfu info` - can now identify the 50 pF version of NTAG 210u(micro) (@mjacksn) - - Added `hf 15` sub-commands for controlling EAS, AFI, privacy mode, and the setting of passwords on SLIX tags (@mjacksn) ## [Radium.4.15864][2022-10-29] @@ -1373,4 +1377,4 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - iClass functionality: full simulation of iclass tags, so tags can be simulated with data (not only CSN). Not yet support for write/update, but readers do not seem to enforce update. (@holiman). - iClass decryption. Proxmark can now decrypt data on an iclass tag, but requires you to have the HID decryption key locally on your computer, as this is not bundled with the sourcecode. - `hf 15 info` can detect NTAG 5 tags - - `hf 15 info` include an EAS status check on more of the icode tags which support EAS (SLI, SLIX, SLIX-L, and SLIX-S) \ No newline at end of file + - `hf 15 info` include an EAS status check on more of the icode tags which support EAS (SLI, SLIX, SLIX-L, and SLIX-S) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 2c6bc740a..e1453be3b 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -1462,7 +1462,7 @@ static int CmdHF14AChaining(const char *Cmd) { "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", "hf 14a chaining -> show chaining enable/disable state\n" "hf 14a chaining --off -> disable chaining\n" - ); + ); void *argtable[] = { arg_param_begin, diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 92e42d717..3b92e309b 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -2769,9 +2769,9 @@ static int CmdHF15EASPassProtect(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf 15 passprotecteas", - "This command enables the password protect of EAS.\n" - "*** OBS! This action can not be undone! ***", - "hf 15 passprotecteas -p 00000000 --force"); + "This command enables the password protect of EAS.\n" + "*** OBS! This action can not be undone! ***", + "hf 15 passprotecteas -p 00000000 --force"); void *argtable[] = { arg_param_begin, diff --git a/doc/commands.json b/doc/commands.json index 8d028d9e9..6f18da380 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -1101,8 +1101,8 @@ "command": "hf 14a chaining", "description": "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", "notes": [ - "hf 14a chaining --off -> disable chaining", - "hf 14a chaining -> show chaining enable/disable state" + "hf 14a chaining -> show chaining enable/disable state", + "hf 14a chaining --off -> disable chaining" ], "offline": false, "options": [ @@ -1658,31 +1658,31 @@ }, "hf 15 passprotectafi": { "command": "hf 15 passprotectafi", - "description": "Password protect AFI. Cannot be undone.", + "description": "This command enables the password protect of AFI. *** OBS! This action can not be undone! ***", "notes": [ - "hf 15 passprotectafi -p 00000000 -c" + "hf 15 passprotectafi -p 00000000 --force" ], "offline": false, "options": [ "-h, --help This help", - "-p, --password EAS/AFI password, 8 hex bytes", - "-c, --confirm confirm the execution of this irreversible command" + "-p, --pwd EAS/AFI password, 8 hex bytes", + "--force Force execution of command (irreversible)" ], - "usage": "hf 15 passprotectafi [-hc] -p " + "usage": "hf 15 passprotectafi [-h] -p [--force]" }, "hf 15 passprotecteas": { "command": "hf 15 passprotecteas", - "description": "Password protect EAS. Cannot be undone.", + "description": "This command enables the password protect of EAS. *** OBS! This action can not be undone! ***", "notes": [ - "hf 15 passprotecteas -p 00000000 -c" + "hf 15 passprotecteas -p 00000000 --force" ], "offline": false, "options": [ "-h, --help This help", - "-p, --password EAS/AFI password, 8 hex bytes", - "-c, --confirm confirm the execution of this irreversible command" + "-p, --pwd EAS/AFI password, 8 hex bytes", + "--force Force execution of command (irreversible)" ], - "usage": "hf 15 passprotecteas [-hc] -p " + "usage": "hf 15 passprotecteas [-h] -p [--force]" }, "hf 15 raw": { "command": "hf 15 raw", @@ -11884,6 +11884,6 @@ "metadata": { "commands_extracted": 748, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-01-29T03:58:53" + "extracted_on": "2023-01-29T17:29:14" } } \ No newline at end of file From d8b286e5f50219642f6f97a1ec373861b542758b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 18:31:39 +0100 Subject: [PATCH 170/924] adapt to fit GENRIC 256kb firmware images --- tools/build_all_firmwares.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index a0253e789..644438032 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -22,7 +22,8 @@ echo "Destination: ${DEST:=firmware}" echo "Produce stats?: ${STATS:=false}" # Which parts to skip for the 256kb version? -SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_ISO14443b=1 SKIP_NFCBARCODE=1" +SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_ISO14443b=1 SKIP_NFCBARCODE=1 SKIP_ZX8211=1" + make $MKFLAGS bootrom || exit 1 chmod 644 bootrom/obj/bootrom.elf From 715ae09e7e536e859212ebfe178042be4afe6467 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 18:37:28 +0100 Subject: [PATCH 171/924] fix coverity #404579 --- client/src/cmdhf15.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 3b92e309b..10d239b94 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -2606,12 +2606,13 @@ static int CmdHF15SlixEnable(const char *Cmd) { static int CmdHF15SlixWritePassword(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf 15 slixwritepwd", - "Write a password on a SLIX family ISO-15693 tag", + "Write a password on a SLIX family ISO-15693 tag.n" + "Some tags do not support all different password types.", "hf 15 slixwritepwd -t READ -o 00000000 -n 12131415"); void *argtable[] = { arg_param_begin, - arg_str1("t", "type", "", "which password field to write to (some tags do not support all password types)"), + arg_str1("t", "type", "", "which password field to write to"), arg_str0("o", "old", "", "old password (if present), 8 hex bytes"), arg_str1("n", "new", "", "new password, 8 hex bytes"), arg_param_end @@ -2645,6 +2646,7 @@ static int CmdHF15SlixWritePassword(const char *Cmd) { int vlen = 0; char value[10]; CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)value, sizeof(value), &vlen); + CLIParserFree(ctx); if (vlen > 0) { if (strcmp(value, "read") == 0) { @@ -2668,8 +2670,6 @@ static int CmdHF15SlixWritePassword(const char *Cmd) { } } - CLIParserFree(ctx); - PrintAndLogEx(INFO, "Trying to write " _YELLOW_("%s") " as " _YELLOW_("%s") " password" , sprint_hex_inrow(payload.new_pwd, sizeof(payload.new_pwd)), value); From 5ac42add1a7a590e028d1bfa30de1f0dad290cc8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 18:39:42 +0100 Subject: [PATCH 172/924] make style --- doc/commands.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/commands.json b/doc/commands.json index 6f18da380..3545a9b78 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -11884,6 +11884,6 @@ "metadata": { "commands_extracted": 748, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-01-29T17:29:14" + "extracted_on": "2023-01-29T17:39:28" } } \ No newline at end of file From bec61e9185778afdb08cd4334cc4272f1425a74f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 20:35:17 +0100 Subject: [PATCH 173/924] Release v4.16191 - Nitride --- Makefile.defs | 4 ++-- armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- client/CMakeLists.txt | 4 ++-- client/Makefile | 4 ++-- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 18 +++++++++--------- client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/src/proxmark3.c | 2 +- common/default_version_pm3.c | 27 +++++++-------------------- common_arm/Makefile.common | 2 +- 17 files changed, 34 insertions(+), 47 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index bcbbaa67e..b203ebeae 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -104,8 +104,8 @@ ifeq ($(DEBUG),1) DEFCFLAGS = -g -O0 -fstrict-aliasing -pipe DEFLDFLAGS = else - DEFCXXFLAGS = -Wall -Werror -O3 -pipe - DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe + DEFCXXFLAGS = -Wall -O3 -pipe + DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe DEFLDFLAGS = endif diff --git a/armsrc/Makefile b/armsrc/Makefile index 5024aa1de..5c3bb03dc 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -187,7 +187,7 @@ showinfo: # version_pm3.c should be remade on every time fullimage.stage1.elf should be remade version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE $(info [-] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index edb0cc990..8a8a6d360 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -50,7 +50,7 @@ OBJS = $(OBJDIR)/bootrom.s19 # version_pm3.c should be remade on every compilation version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ all: showinfo $(OBJS) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 5bd3ebddd..6836e9114 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -364,7 +364,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) @@ -565,7 +565,7 @@ add_executable(proxmark3 ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +target_compile_options(proxmark3 PUBLIC -Wall -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1) add_dependencies(proxmark3 ncurses readline) diff --git a/client/Makefile b/client/Makefile index b08eb0acb..218d19d08 100644 --- a/client/Makefile +++ b/client/Makefile @@ -408,7 +408,7 @@ endif PM3CFLAGS += -DHAVE_SNPRINTF -CXXFLAGS ?= -Wall -Werror -O3 +CXXFLAGS ?= -Wall -O3 CXXFLAGS += $(MYDEFS) $(MYCXXFLAGS) $(MYINCLUDES) PM3CXXFLAGS = $(CXXFLAGS) @@ -902,7 +902,7 @@ src/pm3_pywrap.c: pm3.i # version_pm3.c should be remade on every compilation src/version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index c946c0682..8c524c170 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -19,7 +19,7 @@ target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE m pm3rrg_rdv4_mbedtls) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE amiitool diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index fccae33b7..a85cc2374 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -9,5 +9,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 524d4c939..290415173 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -32,7 +32,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -47,7 +47,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -62,7 +62,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -77,7 +77,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -92,7 +92,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -116,7 +116,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM64_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_neon PRIVATE @@ -134,7 +134,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM32_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_neon BEFORE PRIVATE -mfpu=neon) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -155,7 +155,7 @@ add_library(pm3rrg_rdv4_hardnested STATIC hardnested/hardnested_bruteforce.c $ ${SIMD_TARGETS}) -target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested PRIVATE ../../common diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index c91a47047..42c701d5e 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -14,5 +14,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 12870342e..5cf33d724 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -52,5 +52,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 40929e1ea..c726ddeba 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -44,5 +44,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) target_include_directories(pm3rrg_rdv4_mbedtls INTERFACE ../../common/mbedtls) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index d7e3cfd8a..1040730f1 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 5a6abda25..c74618149 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index d2d6a5b2a..721873066 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 378b9f0dc..6c77bfad3 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -42,7 +42,7 @@ static int mainret = PM3_ESOFT; #ifndef LIBPM3 #define BANNERMSG1 "" #define BANNERMSG2 " [ :coffee: ]" -#define BANNERMSG3 "" +#define BANNERMSG3 "Release v4.16191 - Nitride" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version_pm3.c b/common/default_version_pm3.c index 46eac57c9..26ba654b1 100644 --- a/common/default_version_pm3.c +++ b/common/default_version_pm3.c @@ -1,20 +1,5 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- #include "common.h" -/* This is the default version_pm3.c file that Makefile.common falls back to if sh is not available */ +/* Generated file, do not edit */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -23,8 +8,10 @@ const struct version_information_t SECTVERSINFO g_version_information = { VERSION_INFORMATION_MAGIC, - 1, /* version 1 */ - 0, /* version information not present */ - 2, /* cleanliness couldn't be determined */ - /* Remaining fields: zero */ + 1, + 1, + 1, + "Iceman/master/v4.16191", + "2023-01-29 20:35:17", + "3545f4f98" }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 99f4d9ecd..e40d998a6 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -49,7 +49,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits From 2bd404b496109857d8bb40668924974f807ce62b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 20:35:17 +0100 Subject: [PATCH 174/924] Revert "Release v4.16191 - Nitride" This reverts commit bec61e9185778afdb08cd4334cc4272f1425a74f. --- Makefile.defs | 4 ++-- armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- client/CMakeLists.txt | 4 ++-- client/Makefile | 4 ++-- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 18 +++++++++--------- client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/src/proxmark3.c | 2 +- common/default_version_pm3.c | 27 ++++++++++++++++++++------- common_arm/Makefile.common | 2 +- 17 files changed, 47 insertions(+), 34 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index b203ebeae..bcbbaa67e 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -104,8 +104,8 @@ ifeq ($(DEBUG),1) DEFCFLAGS = -g -O0 -fstrict-aliasing -pipe DEFLDFLAGS = else - DEFCXXFLAGS = -Wall -O3 -pipe - DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe + DEFCXXFLAGS = -Wall -Werror -O3 -pipe + DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe DEFLDFLAGS = endif diff --git a/armsrc/Makefile b/armsrc/Makefile index 5c3bb03dc..5024aa1de 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -187,7 +187,7 @@ showinfo: # version_pm3.c should be remade on every time fullimage.stage1.elf should be remade version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE $(info [-] GEN $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index 8a8a6d360..edb0cc990 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -50,7 +50,7 @@ OBJS = $(OBJDIR)/bootrom.s19 # version_pm3.c should be remade on every compilation version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ all: showinfo $(OBJS) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 6836e9114..5bd3ebddd 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -364,7 +364,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) @@ -565,7 +565,7 @@ add_executable(proxmark3 ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -O3) +target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1) add_dependencies(proxmark3 ncurses readline) diff --git a/client/Makefile b/client/Makefile index 218d19d08..b08eb0acb 100644 --- a/client/Makefile +++ b/client/Makefile @@ -408,7 +408,7 @@ endif PM3CFLAGS += -DHAVE_SNPRINTF -CXXFLAGS ?= -Wall -O3 +CXXFLAGS ?= -Wall -Werror -O3 CXXFLAGS += $(MYDEFS) $(MYCXXFLAGS) $(MYINCLUDES) PM3CXXFLAGS = $(CXXFLAGS) @@ -902,7 +902,7 @@ src/pm3_pywrap.c: pm3.i # version_pm3.c should be remade on every compilation src/version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 8c524c170..c946c0682 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -19,7 +19,7 @@ target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE m pm3rrg_rdv4_mbedtls) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE amiitool diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index a85cc2374..fccae33b7 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -9,5 +9,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 290415173..524d4c939 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -32,7 +32,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -47,7 +47,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -62,7 +62,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -77,7 +77,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -92,7 +92,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -116,7 +116,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM64_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_neon PRIVATE @@ -134,7 +134,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM32_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_neon BEFORE PRIVATE -mfpu=neon) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -155,7 +155,7 @@ add_library(pm3rrg_rdv4_hardnested STATIC hardnested/hardnested_bruteforce.c $ ${SIMD_TARGETS}) -target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested PRIVATE ../../common diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 42c701d5e..c91a47047 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -14,5 +14,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 5cf33d724..12870342e 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -52,5 +52,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index c726ddeba..40929e1ea 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -44,5 +44,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) target_include_directories(pm3rrg_rdv4_mbedtls INTERFACE ../../common/mbedtls) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 1040730f1..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index c74618149..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index 721873066..d2d6a5b2a 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 6c77bfad3..378b9f0dc 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -42,7 +42,7 @@ static int mainret = PM3_ESOFT; #ifndef LIBPM3 #define BANNERMSG1 "" #define BANNERMSG2 " [ :coffee: ]" -#define BANNERMSG3 "Release v4.16191 - Nitride" +#define BANNERMSG3 "" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version_pm3.c b/common/default_version_pm3.c index 26ba654b1..46eac57c9 100644 --- a/common/default_version_pm3.c +++ b/common/default_version_pm3.c @@ -1,5 +1,20 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- #include "common.h" -/* Generated file, do not edit */ +/* This is the default version_pm3.c file that Makefile.common falls back to if sh is not available */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -8,10 +23,8 @@ const struct version_information_t SECTVERSINFO g_version_information = { VERSION_INFORMATION_MAGIC, - 1, - 1, - 1, - "Iceman/master/v4.16191", - "2023-01-29 20:35:17", - "3545f4f98" + 1, /* version 1 */ + 0, /* version information not present */ + 2, /* cleanliness couldn't be determined */ + /* Remaining fields: zero */ }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index e40d998a6..99f4d9ecd 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -49,7 +49,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits From 0a5b0d0746b393ef6a888ff76cd3311e157b7a8b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 29 Jan 2023 20:38:33 +0100 Subject: [PATCH 175/924] text --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 285cd6bf7..880ca0998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] -## [Nitride][2023-01-29] +## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) - Fixed some coverity fixes (@iceman1001) - Fixed `make accessrights` on Fedora (@mooey5775) From 8be70ea5607820a2022b3e0153fac3ea77186990 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Mon, 30 Jan 2023 23:27:17 +0100 Subject: [PATCH 176/924] Fix minor bugs in `hf tesla info` --- client/src/cmdhftesla.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/client/src/cmdhftesla.c b/client/src/cmdhftesla.c index 58f51f4c5..940687cb4 100644 --- a/client/src/cmdhftesla.c +++ b/client/src/cmdhftesla.c @@ -147,7 +147,7 @@ static int info_hf_tesla(void) { // --------------- CERT reading ---------------- Set_apdu_in_framing(true); - for (uint8_t i = 0; i < 4; i++) { + for (uint8_t i = 0; i < 5; i++) { uint8_t aSELECT_CERT[PM3_CMD_DATA_SIZE] = {0x80, 0x06, i, 0x00, 0x00, 0x00, 0xFF}; int aSELECT_CERT_n = 7; @@ -160,7 +160,7 @@ static int info_hf_tesla(void) { sw = get_sw(response, resplen); if (sw == ISO7816_OK) { - // save CETT for later + // save CERT for later uint8_t cert[515] = {0}; memcpy(cert, response, resplen - 2); @@ -201,10 +201,21 @@ static int info_hf_tesla(void) { for (int i = 0; i < 3; i++) { PrintAndLogEx(INFO, "%d - %s", i, sprint_hex_inrow(pk[i], 65)); } - if (form_factor[1] == 1) { - PrintAndLogEx(INFO, "Form factor... %s (card)", sprint_hex_inrow(form_factor, sizeof(form_factor))); - } else if (form_factor[1] == 2) { - PrintAndLogEx(INFO, "Form factor... %s (phone app)", sprint_hex_inrow(form_factor, sizeof(form_factor))); + PrintAndLogEx(INFO, "Form factor... %s " NOLF, sprint_hex_inrow(form_factor, sizeof(form_factor))); + uint16_t form_factor_value = form_factor[0] << 8 | form_factor[1]; + switch (form_factor_value) { + case 0x0001: + PrintAndLogEx(NORMAL, "(card)"); + break; + case 0x0022: + PrintAndLogEx(NORMAL, "(fob)"); + break; + case 0x0031: + PrintAndLogEx(NORMAL, "(phone app)"); + break; + default: + PrintAndLogEx(NORMAL, "(unknown)"); + break; } if (sizeof(version) > 0) { From 032f304bf9b08d4bdff77e6940bd23ea60755aed Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 31 Jan 2023 01:03:56 -0800 Subject: [PATCH 177/924] Enable use under WSL2 w/Kali Linux distribution * Assign group ownership and permissions in udev rules * Add documentation on WSL2 installation and use --- .../Windows-WSL2-Installation-Instructions.md | 224 ++++++++++++++++++ driver/77-pm3-usb-device-blacklist.rules | 6 +- 2 files changed, 227 insertions(+), 3 deletions(-) create mode 100644 doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md diff --git a/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md b/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md new file mode 100644 index 000000000..9519b4849 --- /dev/null +++ b/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md @@ -0,0 +1,224 @@ + + +# WSL2 Installation instructions + +## Table of Contents +- [WSL2 Installation instructions](#wsl2-installation-instructions) + - [Table of Contents](#table-of-contents) + - [Requirements](#requirements) + - [Install Kali Linux distribution](#install-kali-linux-distribution) + - [Driver installation (Windows 11)](#driver-installation-windows-11) + - [USBIPD hints](#usbipd-hints) + - [WSL2 / Kali Linux Installation](#wsl2--kali-linux-installation) + - [X Server Installation](#x-server-installation) + - [Clone the Iceman repository](#clone-the-iceman-repository) + - [Compile the project](#compile-the-project) + - [Install the udev rules](#install-the-udev-rules) + - [Inform udev that it really, really should work](#inform-udev-that-it-really-really-should-work) + - [Verify Device Exists](#verify-device-exists) + - [Using the client...](#using-the-client) + - [Done!](#done) + +This provides instructions on how to install, build, and use Proxmark3 +on Windows 11, using WSL2 (and Kali Linux). + +## Requirements +^[Top](#top) + +This WSL 2 method requires Windows 11 (Build 22000 or later), +WSL installed and [set to WSL2](https://learn.microsoft.com/en-us/windows/wsl/basic-commands#set-wsl-version-to-1-or-2), + +While WSL 2 does not itself support passing through USB or +serial devices, it can work by using the USB/IP open-source +project, [`usbipd-win`](https://github.com/dorssel/usbipd-win). + + +## Install Kali Linux distribution +^[Top](#top) + +Open the Windows App Store, and install Kali Linux. + +For WSL configuration, see [Manage and configure Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/wsl-config). + +Start the Kali Linux distribution at least once, to ensure it's fully installed. + +## Driver installation (Windows 11) +^[Top](#top) + +On the Windows (host) machine, install the +[latest release](https://github.com/dorssel/usbipd-win/releases) +of `usbpid-win` (typically an `.MSI` file). + +## USBIPD hints +^[Top](#top) + +This is *NOT* intended to be a full description of how to use USBIPD. +Rather, this is intended only to give a starting point, as ***the values +shown here are extremely likely to differ per machine***. + +It's presumed that you've already installed USBIPD. Plug the Proxmark +device into a USB port. Then, from a `cmd.exe` or `wt.exe` ***launched +with administrative permissions***: + +Get a list of attached devices. Example (NOTE: VID/PID for non-proxmark devices redacted) + +```cmd +C:\qwert> usbipd list + +Connected: +BUSID VID:PID DEVICE STATE +1-2 xxxx:xxxx USB Input Device Not shared +2-3 xxxx:xxxx USB Mass Storage Device Not shared +5-3 9ac4:4b8f USB Serial Device (COM31) Not shared + +Persisted: +GUID DEVICE +``` + +Take note of the `BUSID` for the proxmark device, which should show as a USB Serial Device. + +Setup that bus ID to always be redirected to the WSL distribution named `kali-linux`: + +```cmd +C:\qwert> usbipd wsl attach --busid 5-3 --distribution kali-linux --auto-attach +usbipd: info: Starting endless attach loop; press Ctrl+C to quit. +Attached +``` + +NOTE: You must leave that running in the background, to allow the device to automatically +re-attach to the WSL2 instance. + + + +## WSL2 / Kali Linux Installation +^[Top](#top) + +Start the Kali Linux distribution you installed. First, make sure +the distribution is up-to-date: + +```sh +sudo apt-get update +sudo apt-get upgrade -y +sudo apt-get auto-remove -y +``` + +then, install proxmark dependencies: + +```sh +sudo apt-get install --no-install-recommends \ + git ca-certificates build-essential pkg-config \ + libreadline-dev gcc-arm-none-eabi libnewlib-dev \ + libbz2-dev libpython3-dev qtbase5-dev libssl-dev +``` + +_note_ +If you don't need the graphical components of the Proxmark3 client, you can skip the installation of `qtbase5-dev`. +If you don't need support for Python3 scripts in the Proxmark3 client, you can skip the installation of `libpython3-dev`. + +## X Server Installation +^[Top](#top) + +TBD -- Installing [`Win-KeX`](https://www.kali.org/docs/wsl/win-kex/) has worked +to provide a fully integrated experience, with three distinct modes..... +However, WSL2 may have some functionality already built-in? + +## Clone the Iceman repository +^[Top](#top) + +```sh +cd ~/ +git clone https://github.com/RfidResearchGroup/proxmark3.git +``` + +## Compile the project +^[Top](#top) + +```sh +cd ~/proxmark3 +make clean && make -j +``` + +## Install the udev rules + +```sh +sudo make accessrights +sudo make udev +``` + +On Kali, the above does two things: +1. Ensures the user is a member of the `dialout` group +2. Copies the `./driver/77-pm3-usb-device-blacklist.rules` file to the `/etc/udev/rules.d/` directory + +This presumes that the file includes `MODE="660" GROUP="dialout"` at the end of the three match lines. +The goal is that Kali Linux will automatically apply the proper permissions when the device is attached. + +However, it may be necessary to give the `udev` service a kind reminder: + +## Inform udev that it really, really should work + +The following workaround appears to work to get udev to apply the permissions +appropriately. Note that this may need to be run again, such as when the WSL2 +distributions have been restarted. I don't know why ... but it's a small hiccup. + +```sh +sudo udevadm trigger --action=change +``` + +General instructions suggested to use `sudo udevadm control --reload-rules`. However, +this may simply result in the following cryptic error message: + +```sh +$ sudo udevadm control --reload-rules +[sudo] password for root: +Failed to send reload request: No such file or directory +``` + +_Note that the following should **NOT** be required:_ + +```sh +sudo service udev restart +``` + +## Verify Device Exists + +Verify the device exists, and has a symbolic link created: + +```sh +ls -lFA /dev/ttyACM* +ls -lFA /dev/pm3* +``` + + +The first should show the `rw` permissions for both owner +and group, and show the group as `dialout`: + +```sh +┌──(qwert㉿host)-[~] +└─$ ls -lFA /dev/ttyACM* +crw-rw---- 1 root dialout 166, 0 Jan 22 11:28 /dev/ttyACM0 +``` + +The second command should show that a symbolic link exists +from the friendly name `/dev/pm3-0` to the TTY device: + +```sh +┌──(qwert㉿host)-[~] +└─$ ls -lFA /dev/pm3* +lrwxrwxrwx 1 root root 7 Jan 17 19:46 /dev/pm3-0 -> ttyACM0 +``` + +## Using the client... + +```sh +┌──(qwert㉿host)-[~] +└─$ pushd ~/proxmark3 + +┌──(qwert㉿host)-[~] +└─$ ./pm3 +``` + +## Done! +^[Top](#top) + +Full [compilation instructions](/doc/md/Use_of_Proxmark/0_Compilation-Instructions.md) may be helpful. + diff --git a/driver/77-pm3-usb-device-blacklist.rules b/driver/77-pm3-usb-device-blacklist.rules index d939468f2..8d699faca 100644 --- a/driver/77-pm3-usb-device-blacklist.rules +++ b/driver/77-pm3-usb-device-blacklist.rules @@ -10,9 +10,9 @@ ACTION!="add|change", GOTO="pm3_usb_device_blacklist_end" SUBSYSTEM!="tty", GOTO="pm3_ignore" -ATTRS{idVendor}=="2d2d" ATTRS{idProduct}=="504d", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" -ATTRS{idVendor}=="9ac4" ATTRS{idProduct}=="4b8f", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" -ATTRS{idVendor}=="502d" ATTRS{idProduct}=="502d", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" +ATTRS{idVendor}=="2d2d" ATTRS{idProduct}=="504d", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" MODE="660" GROUP="dialout" +ATTRS{idVendor}=="9ac4" ATTRS{idProduct}=="4b8f", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" MODE="660" GROUP="dialout" +ATTRS{idVendor}=="502d" ATTRS{idProduct}=="502d", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" MODE="660" GROUP="dialout" LABEL="pm3_ignore" ATTRS{idVendor}=="2d2d" ATTRS{idProduct}=="504d", ENV{ID_MM_DEVICE_IGNORE}="1" From bfc3a53ea262f755295a3b1fb1afa359b614ad13 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 31 Jan 2023 09:45:44 -0800 Subject: [PATCH 178/924] Modify Makefile to copy group-specific udev rules --- Makefile | 9 +++++++- ...77-pm3-usb-device-blacklist-dialout.rules} | 0 driver/77-pm3-usb-device-blacklist-uucp.rules | 22 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) rename driver/{77-pm3-usb-device-blacklist.rules => 77-pm3-usb-device-blacklist-dialout.rules} (100%) create mode 100644 driver/77-pm3-usb-device-blacklist-uucp.rules diff --git a/Makefile b/Makefile index 0cb778ec6..9d3e509f8 100644 --- a/Makefile +++ b/Makefile @@ -256,8 +256,15 @@ endif # configure system to ignore PM3 device as a modem (ModemManager blacklist, effective *only* if ModemManager is not using _strict_ policy) # Read doc/md/ModemManager-Must-Be-Discarded.md for more info udev: - $(SUDO) cp -rf driver/77-pm3-usb-device-blacklist.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules +ifneq ($(wildcard /etc/arch-release),) +# If user is running ArchLinux, use group 'uucp' + $(SUDO) cp -rf driver/77-pm3-usb-device-blacklist-uucp.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules +else ifneq ($(wildcard /etc/fedora-release),) +# Else, use group 'dialout' + $(SUDO) cp -rf driver/77-pm3-usb-device-blacklist-dialout.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules +endif $(SUDO) udevadm control --reload-rules + $(SUDO) udevadm trigger --action=change # configure system to add user to the dialout group and if bluetooth group exists, add user to it # you need to logout, relogin to get this access right correct. diff --git a/driver/77-pm3-usb-device-blacklist.rules b/driver/77-pm3-usb-device-blacklist-dialout.rules similarity index 100% rename from driver/77-pm3-usb-device-blacklist.rules rename to driver/77-pm3-usb-device-blacklist-dialout.rules diff --git a/driver/77-pm3-usb-device-blacklist-uucp.rules b/driver/77-pm3-usb-device-blacklist-uucp.rules new file mode 100644 index 000000000..101381d95 --- /dev/null +++ b/driver/77-pm3-usb-device-blacklist-uucp.rules @@ -0,0 +1,22 @@ +# Proxmark3 linux modem-manager de-confliction file +# +# copy this file to /etc/udev/rules.d (or add the entry to the end of an existing file) +# and restart udev hotplug: +# +# 'sudo udevadm control --reload-rules' +# + +# proxmark3 +ACTION!="add|change", GOTO="pm3_usb_device_blacklist_end" +SUBSYSTEM!="tty", GOTO="pm3_ignore" + +ATTRS{idVendor}=="2d2d" ATTRS{idProduct}=="504d", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" MODE="660" GROUP="uucp" +ATTRS{idVendor}=="9ac4" ATTRS{idProduct}=="4b8f", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" MODE="660" GROUP="uucp" +ATTRS{idVendor}=="502d" ATTRS{idProduct}=="502d", ENV{ID_MM_DEVICE_IGNORE}="1" SYMLINK+="pm3-%n" MODE="660" GROUP="uucp" + +LABEL="pm3_ignore" +ATTRS{idVendor}=="2d2d" ATTRS{idProduct}=="504d", ENV{ID_MM_DEVICE_IGNORE}="1" +ATTRS{idVendor}=="9ac4" ATTRS{idProduct}=="4b8f", ENV{ID_MM_DEVICE_IGNORE}="1" +ATTRS{idVendor}=="502d" ATTRS{idProduct}=="502d", ENV{ID_MM_DEVICE_IGNORE}="1" + +LABEL="pm3_usb_device_blacklist_end" From 1a214b389c1485f90684608fa40352c0ecb72b5d Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 31 Jan 2023 09:49:59 -0800 Subject: [PATCH 179/924] changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba2f8f322..82954446e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] - Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906) - Added `lf em 4x70 brute` command (@adite) - + - Added documentation for usage of Proxmark3 under WSL2 (@henrygab) + - Fixed device permissions via updated `udev` rules (@henrygab) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) @@ -52,7 +53,6 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001) - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) - ## [Radium.4.15864][2022-10-29] - Changed `lf indala sim` - now accepts fc / cn (@iceman1001) - Added `lf indala brute`- brute forcing of 64b Indala ID (@iceman1001) From 99f24b23b8b9b82e6f0b96b0cf605604dedbed88 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 31 Jan 2023 09:55:46 -0800 Subject: [PATCH 180/924] fix copy/paste error --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9d3e509f8..6c31157e2 100644 --- a/Makefile +++ b/Makefile @@ -259,7 +259,7 @@ udev: ifneq ($(wildcard /etc/arch-release),) # If user is running ArchLinux, use group 'uucp' $(SUDO) cp -rf driver/77-pm3-usb-device-blacklist-uucp.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules -else ifneq ($(wildcard /etc/fedora-release),) +else # Else, use group 'dialout' $(SUDO) cp -rf driver/77-pm3-usb-device-blacklist-dialout.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules endif From c7825a2adf5aa1a4c9021046662e241d8dc1ab4d Mon Sep 17 00:00:00 2001 From: adite Date: Wed, 1 Feb 2023 19:28:31 +0100 Subject: [PATCH 181/924] Fix bug in 'lf em 4x70 brute' command --- armsrc/em4x70.c | 2 +- client/src/cmdlfem4x70.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/armsrc/em4x70.c b/armsrc/em4x70.c index 545491447..066aad58f 100644 --- a/armsrc/em4x70.c +++ b/armsrc/em4x70.c @@ -362,7 +362,7 @@ static int bruteforce(const uint8_t address, const uint8_t *rnd, const uint8_t * uint8_t rev_rnd[7]; uint8_t temp_rnd[7]; - reverse_arraycopy((uint8_t *)rnd, rev_rnd, sizeof(rnd)); + reverse_arraycopy((uint8_t *)rnd, rev_rnd, sizeof(rev_rnd)); memcpy(temp_rnd, rnd, sizeof(temp_rnd)); for (int k = start_key; k <= 0xFFFF; ++k) { diff --git a/client/src/cmdlfem4x70.c b/client/src/cmdlfem4x70.c index f008d9947..e90c688c1 100644 --- a/client/src/cmdlfem4x70.c +++ b/client/src/cmdlfem4x70.c @@ -306,8 +306,8 @@ int CmdEM4x70Brute(const char *Cmd) { break; } - // should be done in about 30 minutes - if (timeout > ((30 * 60000) / TIMEOUT)) { + // should be done in about 60 minutes. + if (timeout > ((60 * 60000) / TIMEOUT)) { PrintAndLogEx(WARNING, "\nNo response from Proxmark3. Aborting..."); break; } From 5bd8bd13dcfd7d2be4ed040fde29bc69570dc199 Mon Sep 17 00:00:00 2001 From: adite Date: Wed, 1 Feb 2023 19:33:52 +0100 Subject: [PATCH 182/924] Add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba2f8f322..1d8a9226b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed broken `lf em 4x70 brute` command (@adite) - Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906) - Added `lf em 4x70 brute` command (@adite) From 23a3590bba65f61e7390e4254e0abb105e47cd08 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 2 Feb 2023 21:24:34 +0100 Subject: [PATCH 183/924] unify the text comments --- client/dictionaries/mfc_default_keys.dic | 173 ++++++++++++++--------- 1 file changed, 108 insertions(+), 65 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 881c72df0..a522b001b 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -3,36 +3,46 @@ # -- iceman fork version -- # -- contribute to this list, sharing is caring -- # -# Defaultkey(firstkeyusedbyprogramifnouserdefinedkey) +# Default key FFFFFFFFFFFF -# Blankkey +# +# Blank key 000000000000 +# # NFC Forum MADkey A0A1A2A3A4A5 +# # MAD access key A (reversed) A5A4A3A2A1A0 +# # MAD access key B 89ECA97F8C2A # +# B0B1B2B3B4B5 C0C1C2C3C4C5 D0D1D2D3D4D5 AABBCCDDEEFF 4D3A99C351DD 1A982C7E459A +# # key A Wien D3F7D3F7D3F7 +# # key B Wien 5A1B85FCE20A # +# 714C5C886E97 587EE5F9350F A0478CC39091 533CB6C723F6 8FD0A4F256E9 +# # iCopy-X E00000000000 # +# E7D6064C5860 B27CCAB30DBD # @@ -40,6 +50,9 @@ B27CCAB30DBD D2ECE8B9395E # NSCP default key 1494E81663D7 +# +# NFC tools +7c9fb8474242 # # Kiev keys 569369C5A0E5 @@ -54,31 +67,41 @@ F14EE7CAE863 # RKF # Västtrafiken KeyA, RKF ÖstgötaTrafiken KeyA FC00018778F7 +# # Västtrafiken KeyA 0297927C0F77 54726176656C +# # Västtrafiken KeyB 00000FFE2488 776974687573 EE0042F88840 +# # RKF SLKeyA 26940B21FF5D A64598A77478 +# # RKF SLKeyB 5C598C9C58B5 E4D2770A89BE -# RKF RejskortDanmark KeyA +# +# RKF Rejskort Danmark KeyA 722BFCC5375F -# RKF RejskortDanmark KeyB +# +# RKF Rejskort Danmark KeyB F1D83F964314 -# RKF JOJOPRIVAKeyA +# +# RKF JOJOPRIVA KeyA 505249564141 -# RKF JOJOPRIVAKeyB +# +# RKF JOJOPRIVA KeyB 505249564142 -# RKF JOJOGROUPKeyA +# +# RKF JOJOGROUP KeyA 47524F555041 434F4D4D4F41 -# RKF JOJOGROUPKeyB +# +# RKF JOJOGROUP KeyB 47524F555042 434F4D4D4F42 # @@ -108,11 +131,14 @@ F1D83F964314 200000000000 222222222222 27DD91F1FCF1 -# DirectoryandeventlogKeyB +# +# Directory and eventlog KeyB 2BA9621E0A36 -# DirectoryandeventlogKeyA +# +# Directory and eventlog KeyA 4AF9D7ADEBE4 # +# 333333333333 33F974B42769 34D1DF9934C5 @@ -131,9 +157,11 @@ A00000000000 A053A292A4AF A94133013401 AAAAAAAAAAAA -# Keyfromladyada.net +# +# Key from ladyada.net ABCDEF123456 # +# B00000000000 B127C6F41436 BBBBBBBBBBBB @@ -147,7 +175,9 @@ EEEEEEEEEEEE # data from forum FFFFFF545846 # +# F1A97341A9FC +# # hotel system 44AB09010845 85FED980EA5A @@ -157,7 +187,9 @@ F1A97341A9FC # ARD (fr) key B 4A2B29111213 # +# 4143414F5250 +# # Tehran Railway A9B43414F585 1FB235AC1388 @@ -169,13 +201,17 @@ F4A9EF2AFC6D # # S0 B 89EAC97F8C2A +# # S4 A 43C7600DEE6B +# # S6 A 0120BF672A64 +# # S6 B FB0B20DF1F34 # +# A9F953DEF0A3 # # Data from forum @@ -233,14 +269,17 @@ AAFB06045877 # gym # Fysiken A 3E65E4FB65B3 +# # Fysiken B 25094DF6F148 +# # CleverFit A05DBD98E0FC # # Hotel KeyCard D3B595E9DD63 AFBECD121004 +# # SimonsVoss 6471A5EF2D1A # @@ -396,9 +435,11 @@ C52876869800 # Data from mall # playland balikesir ABBA1234FCB0 +# # A trio bowling bahcelievler 314F495254FF 4152414B4E41 +# # karinca park nigde 4E474434FFFF # @@ -477,18 +518,21 @@ D9A37831DCE5 C5CFE06D9EA3 C0DECE673829 # +# A56C2DF9A26D # # Data from https://pastebin.com/vbwast74 -# 68D3F7307C89 +# # Smart Rider. Western Australian Public Transport Cards 568C9083F71C # # Bangkok metro key 97F5DA640B18 +# # Metro Valencia key A8844B0BCA06 +# # HTC Eindhoven key 857464D3AAD1 # @@ -501,6 +545,7 @@ A8844B0BCA06 # French VIGIK # VIGIK1 A 314B49474956 +# # VIGIK1 B 564C505F4D41 BA5B895DA162 @@ -508,16 +553,20 @@ BA5B895DA162 # Vigik mystery Keys Mifare 1k EV1 (S50) # 16 A 5C8FF9990DA2 +# # 17 A 75CCB59C9BED +# # 16 B D01AFEEB890A +# # 17 B 4B791BEA7BCC # # BTCINO UNDETERMINED SPREAKD 0x01->0x13 key 021209197591 # +# 2EF720F2AF76 414C41524F4E 424C41524F4E @@ -676,6 +725,7 @@ F7A39753D018 410B9B40B872 2CB1A90071C8 # +# 8697389ACA26 1AB23CD45EF6 013889343891 @@ -691,6 +741,7 @@ EC0A9B1A9E06 0F230695923F 0000014B5C31 # +# BEDB604CC9D1 B8A1F613CF3D B578F38A5C61 @@ -699,12 +750,15 @@ B66AC040203A 2E641D99AD5B AD4FB33388BF 69FB7B7CD8EE +# # Hotel 2A6D9205E7CA 13B91C226E56 +# # KABA Hotel Locks 2A2C13CC242A # +# 27FBC86A00D0 01FA3FC68349 # @@ -761,8 +815,10 @@ D58023BA2BDC 2ED3B15E7C0F F66224EE1E89 # +# 60012E9BA3FA # +# DE1FCBEC764B 81BFBE8CACBA BFF123126C9B @@ -775,11 +831,13 @@ D80511FC2AB4 BB467463ACD6 E67C8010502D FF58BA1B4478 +# # Data from https://pastebin.com/Kz8xp4ev FBF225DC5D58 # # Data https://pastebin.com/BEm6bdAE # vingcard.txt +# Note: most likely diversified 4708111C8604 3D50D902EA48 96A301BCE267 @@ -801,10 +859,12 @@ D58660D1ACDE 50A11381502C C01FC822C6E5 0854BF31111E -# More keys: +# +# More keys 8A19D40CF2B5 AE8587108640 -# SafLock standalone door locks. +# +# SafLock standalone door locks 135B88A94B8B # # Russian Troika card @@ -863,7 +923,7 @@ F8493407799D 6B8BD9860763 D3A297DC2698 # -# Keys from MifareClassicTool project +# Keys from Mifare Classic Tool project 044CE1872BC3 045CECA15535 0BE5FAC8B06A @@ -918,7 +978,6 @@ FD8705E721B0 00ADA2CD516D # # -## 237A4D0D9119 0ED7846C2BC9 FFFFD06F83E3 @@ -965,12 +1024,13 @@ A2B2C9D187FB # Hotel Adina 9EBC3EB37130 # -# most likely diversed individual keys. +# most likely diversifed individual keys. # data from https://github.com/korsehindi/proxmark3/commit/24fdbfa9a1d5c996aaa5c192bc07e4ab28db4c5c 491CDC863104 A2F63A485632 98631ED2B229 19F1FFE02563 +# # Argentina 563A22C01FC8 43CA22C13091 @@ -983,7 +1043,6 @@ AFBECD120454 842146108088 # # TAPCARD PUBLIC TRANSPORT LA -# EA1B88DF0A76 D1991E71E2C5 05F89678CFCF @@ -1018,7 +1077,6 @@ E3AD9E9BA5D4 6C9EC046C1A4 # # ROC HIGHSCHOOL ACCESSCARD -# B021669B44BB B18CDCDE52B7 A22647F422AE @@ -1050,8 +1108,7 @@ BE7C4F6C7A9A 5EC7938F140A 82D58AA49CCB # -# MELONCARD -# +# MELON CARD 323334353637 # # @@ -1071,7 +1128,6 @@ A7FB4824ACBF 10F3BEBC01DF # # Transportes Insular La Palma -# 0172066B2F03 0000085F0000 1A80B93F7107 @@ -1106,7 +1162,6 @@ B1A862985913 F3F0172066B2 # # Tehran ezpay -# 38A88AEC1C43 CBD2568BC7C6 7BCB4774EC8F @@ -1124,7 +1179,6 @@ D3B1C7EA5C53 BB3D7B11D224 # # Chaco -# B210CFA436D2 B8B1CFA646A8 A9F95891F0A4 @@ -1147,11 +1201,11 @@ A0004A000036 4243414F5250 DFE73BE48AC6 # +# B069D0D03D17 000131B93F28 # # From the DFW Area, TX, USA -# A506370E7C0F 26396F2042E7 70758FDD31E0 @@ -1169,7 +1223,6 @@ B47058139187 67CC03B7D577 # # From the HTL Mödling, NÖ, AT -# A5524645CD91 D964406E67B4 99858A49C119 @@ -1179,7 +1232,6 @@ C27D999912EA 4C60F4B15BA8 # # CAFE + CO, AT -# 35D850D10A24 4B511F4D28DD E45230E7A9E8 @@ -1187,27 +1239,25 @@ E45230E7A9E8 FB6C88B7E279 # # Metro Card, AT -# 223C3427108A # # Unknown, AT -# 23D4CDFF8DA3 E6849FCC324B 12FD3A94DF0E # # Unknown, AT -# 0B83797A9C64 39AD2963D3D1 +# # Hotel Berlin Classic room A KEY 34B16CD59FF8 +# # Hotel Berlin Classic room B KEY BB2C0007D022 # # Coinmatic laundry Smart card # data from: https://pastebin.com/XZQiLtUf -# 0734BFB93DAB 85A438F72A8A # @@ -1215,6 +1265,7 @@ BB2C0007D022 58AC17BF3629 B62307B62307 # +# A2A3CCA2A3CC # # Granada, ES Transport Card @@ -1260,6 +1311,7 @@ B8937130B6BA D7744A1A0C44 82908B57EF4F FE04ECFE5577 +# # comfort inn hotel 4D57414C5648 4D48414C5648 @@ -1306,13 +1358,11 @@ A82045A10949 # # funnivarium # forum ankara -# 2602FFFFFFFF # # macera adasi # ankara kentpark # INACTIVE -# 0A4600FF00FF DFF293979FA7 4D6F62692E45 @@ -1321,21 +1371,17 @@ DFF293979FA7 # petrol ofisi # positive card # ode-gec -# 0406080A0C0E # # konya elkart -# 988ACDECDFB0 120D00FFFFFF # # bowlingo # serdivan avym -# 4AE23A562A80 # -# kart54 -# +# kart 54 2AFFD6F88B97 A9F3F289B70C DB6819558A25 @@ -1346,20 +1392,16 @@ B16B2E573235 # # crazy park # kizilay avm -# 00DD300F4F10 # # kartsistem B -# FEE2A3FBC5B6 # # toru ent # taurus avm -# 005078565703 # # Ving? -# 0602721E8F06 FC0B50AF8700 F7BA51A9434E @@ -1407,7 +1449,6 @@ D0DDDF2933EC # # bursakart # bursa transport card -# 755D49191A78 DAC7E0CBA8FD 68D3263A8CD6 @@ -1418,30 +1459,29 @@ B2FE3B2875A6 # # playland # maltepe park -# ABCC1276FCB0 AABAFFCC7612 # # lunasan # kocaeli fair -# 26107E7006A0 # # gamefactory # ozdilek -# 17D071403C20 # +# 534F4C415249 534F4C303232 # # Nespresso, smart card -# key-gen algo, these keys are for one card +# key-gen algo, these keys are for one card (keys diversified) FF9A84635BD2 6F30126EE7E4 6039ABB101BB F1A1239A4487 # +# B882FD4A9F78 CD7FFFF81C4A AA0857C641A3 @@ -1524,9 +1564,10 @@ ABFEDC124578 5E594208EF02 AF9E38D36582 # -#Norwegian building site identication card. (HMS KORT) +# Norwegian building site identication card. (HMS KORT) # Key a 10DF4D1859C8 +# # Key B B5244E79B0C8 # @@ -1594,7 +1635,6 @@ F53E9F4114A9 AD38C17DE7D2 # # SUBE cards keys (new) -# 2DEB57A3EA8F 32C1BB023F87 70E3AD3F2D29 @@ -1623,7 +1663,6 @@ F5C1B3F62FDA 7E6545076619 # # SUBE cards keys (old) -# 4C5A766DFE3A 32C6768847F5 F68930789631 @@ -1651,7 +1690,9 @@ BFE25035B0C8 D5C172325DD3 992B152E834A CE75D7EADEAF -# Russian Podorozhnik card (Saint-Petersburg transport, may be combined with Troika) +# +# Russian Podorozhnik card (Saint-Petersburg transport) +# may be combined with Troika 038B5F9B5A2A 04DC35277635 0C420A20E056 @@ -1681,11 +1722,12 @@ D27058C6E2C7 E19504C39461 FA1FBB3F0F1F FF16014FEFC7 -################################## -# Keys from Flipper Zero Community # +# Keys from Flipper Zero Community # Last update: Aug 13, 2022 # +# unknown if keys are diversified or static default +# # Strelka Extension 5C83859F2224 66B504430416 @@ -1771,7 +1813,7 @@ CB9D507CE56D # Armenian Underground Ticket A0A1A2A8A4A5 # -# BadgeMaker Leaked from https://github.com/UberGuidoZ +# Badge Maker Leaked from https://github.com/UberGuidoZ 1A1B1C1D1E1F 1665FE2AE945 158B51947A8E @@ -1813,7 +1855,7 @@ D10008074A6F 6F6674776172 6520446F7665 # -# Apartment keyfobs (USA) from Corvette830 +# Apartment keyfobs (USA) (Corvette830) E60F8387F0B9 FFD46FF6C5EE 4F9661ED2E70 @@ -1822,8 +1864,8 @@ FFD46FF6C5EE 16CA203B811B 11AC8C8F3AF2 # -# The Westin Jakarta Indonesia from D4DB0D -# Peppers Hotel Unknown location from D4DB0D +# The Westin Jakarta Indonesia (D4DB0D) +# Peppers Hotel Unknown location (D4D0D) 6E0DD4136B0A 141940E9B71B 3B1D3AAC866E @@ -1836,12 +1878,12 @@ F09BB8DD142D B4B3FFEDBE0A 540E0D2D1D08 # -# Schlage 9691T Keyfob from seasnaill +# Schlage 9691T Keyfob (seasnaill) 7579B671051A 4F4553746B41 # # Vigik ScanBadge App (fr.badgevigik.scanbadge) -# Website https://badge-vigik.fr/ - By Alex` +# Website https://badge-vigik.fr/ (Alex) 0000A2B3C86F 021200C20307 021209197507 @@ -1868,6 +1910,7 @@ B4B3FFEDBE0A 9EB7C8A6D4E3 A22AE12C9013 AFC984A3576E +# # Vigik verified by quantum-x # https://github.com/RfidResearchGroup/proxmark3/pull/1742#issuecomment-1206113976 A00027000099 @@ -1892,8 +1935,8 @@ A00003000057 # iGuard Simple (and reverse) keys AAAAAAFFFFFF FFFFFFAAAAAA -# Added by VideoMan. -# Random Hotel A Key Sec 0 Blk 3 - KABA Lock +# +# Random Hotel A Key Sec 0 Blk 3 - KABA Lock (VideoMan) 3111A3A303EB # Transport system Uruguay - STM # Shared key - sec 0 blk 3 @@ -1910,9 +1953,9 @@ D144BD193063 8627C10A7014 453857395635 # -########################################## -# added by colonelborkmundus -# "the more, the marriott" mifare project +# Data from "the more, the marriott" mifare project (colonel borkmundus) +# +# Isn't theirs Saflok ? # # 1k - graduate hotel C49DAE1C6049 @@ -1984,4 +2027,4 @@ F72CD208FDF9 2158E314C3DF # # 1k - waldorf astoria -011C6CF459E8 \ No newline at end of file +011C6CF459E8 From 3ec3730183865fa89413032c168e358026884b11 Mon Sep 17 00:00:00 2001 From: "U-CHRIS-PC\\Chris" Date: Thu, 2 Feb 2023 15:53:52 -0700 Subject: [PATCH 184/924] Added XOR extraction and flag to Guardall G-Prox II --- client/src/cmdlfguard.c | 64 +++++++++++++++++++++++++---------------- client/src/cmdlfguard.h | 2 +- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/client/src/cmdlfguard.c b/client/src/cmdlfguard.c index 02bd52eb8..0225b2fef 100644 --- a/client/src/cmdlfguard.c +++ b/client/src/cmdlfguard.c @@ -86,9 +86,9 @@ static int demod_guard_raw(uint8_t *raw, uint8_t rlen) { } if (unknown) - PrintAndLogEx(SUCCESS, "G-Prox-II - Unknown len: " _GREEN_("%u") ", Raw: %s", fmtlen, sprint_hex_inrow(raw, rlen)); + PrintAndLogEx(SUCCESS, "G-Prox-II - xorKey: " _GREEN_("%u")" Unknown len: " _GREEN_("%u") ", Raw: %s", xorKey, fmtlen, sprint_hex_inrow(raw, rlen)); else - PrintAndLogEx(SUCCESS, "G-Prox-II - len: " _GREEN_("%u")" FC: " _GREEN_("%u") " Card: " _GREEN_("%u") ", Raw: %s", fmtlen, FC, Card, sprint_hex_inrow(raw, rlen)); + PrintAndLogEx(SUCCESS, "G-Prox-II - xorKey: " _GREEN_("%u")" Len: " _GREEN_("%u")" FC: " _GREEN_("%u") " Card: " _GREEN_("%u") ", Raw: %s", xorKey, fmtlen, FC, Card, sprint_hex_inrow(raw, rlen)); return PM3_SUCCESS; } @@ -142,9 +142,11 @@ int demodGuard(bool verbose) { // get key and then get all 8 bytes of payload decoded xorKey = (uint8_t)bytebits_to_byteLSBF(bits_no_spacer, 8); + PrintAndLogEx(DEBUG, "DEBUG: gProxII xorKey: %u", xorKey); + for (size_t idx = 0; idx < 8; idx++) { plain[idx] = ((uint8_t)bytebits_to_byteLSBF(bits_no_spacer + 8 + (idx * 8), 8)) ^ xorKey; - PrintAndLogEx(DEBUG, "DEBUG: gProxII byte %zu after xor: %02x", idx, plain[idx]); + PrintAndLogEx(DEBUG, "DEBUG: gProxII byte %zu after xor: %02x (%02x before xor)", idx, plain[idx], bytebits_to_byteLSBF(bits_no_spacer + 8 + (idx * 8), 8)); } setDemodBuff(g_DemodBuffer, 96, preambleIndex); @@ -161,6 +163,12 @@ int demodGuard(bool verbose) { bool unknown = false; switch (fmtLen) { case 36: + PrintAndLogEx(DEBUG, "DEBUG: FC 1: %x", (plain[3] & 0x7F) << 7); + PrintAndLogEx(DEBUG, "DEBUG: FC 2: %x", plain[4] >> 1); + PrintAndLogEx(DEBUG, "DEBUG: Card 1: %x", (plain[4] & 1) << 19); + PrintAndLogEx(DEBUG, "DEBUG: Card 2: %x", plain[5] << 11); + PrintAndLogEx(DEBUG, "DEBUG: Card 3: %x", plain[6] << 3); + PrintAndLogEx(DEBUG, "DEBUG: Card 4: %x", (plain[7] & 0xE0) >> 5); FC = ((plain[3] & 0x7F) << 7) | (plain[4] >> 1); Card = ((plain[4] & 1) << 19) | (plain[5] << 11) | (plain[6] << 3) | ((plain[7] & 0xE0) >> 5); break; @@ -173,9 +181,9 @@ int demodGuard(bool verbose) { break; } if (!unknown) - PrintAndLogEx(SUCCESS, "G-Prox-II - len: " _GREEN_("%u")" FC: " _GREEN_("%u") " Card: " _GREEN_("%u") ", Raw: %08x%08x%08x", fmtLen, FC, Card, raw1, raw2, raw3); + PrintAndLogEx(SUCCESS, "G-Prox-II - xorKey: " _GREEN_("%u") " Len: " _GREEN_("%u")" FC: " _GREEN_("%u") " Card: " _GREEN_("%u") ", Raw: %08x%08x%08x", xorKey, fmtLen, FC, Card, raw1, raw2, raw3); else - PrintAndLogEx(SUCCESS, "G-Prox-II - Unknown len: " _GREEN_("%u") ", Raw: %08x%08x%08x", fmtLen, raw1, raw2, raw3); + PrintAndLogEx(SUCCESS, "G-Prox-II - xorKey: " _GREEN_("%u") " Unknown len: " _GREEN_("%u") ", Raw: %08x%08x%08x", xorKey, fmtLen, raw1, raw2, raw3); return PM3_SUCCESS; } @@ -243,16 +251,17 @@ static int CmdGuardReader(const char *Cmd) { static int CmdGuardClone(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf gproxii clone", - "clone a Guardall tag to a T55x7, Q5/T5555 or EM4305/4469 tag.\n" + "Clone a Guardall tag to a T55x7, Q5/T5555 or EM4305/4469 tag.\n" "The facility-code is 8-bit and the card number is 20-bit. Larger values are truncated.\n" "Currently work only on 26 | 36 bit format", - "lf gproxii clone --fmt 26 --fc 123 --cn 1337 -> encode for T55x7 tag\n" - "lf gproxii clone --fmt 26 --fc 123 --cn 1337 --q5 -> encode for Q5/T5555 tag\n" - "lf gproxii clone --fmt 26 --fc 123 --cn 1337 --em -> encode for EM4305/4469" + "lf gproxii clone --xor 141 --fmt 26 --fc 123 --cn 1337 -> encode for T55x7 tag\n" + "lf gproxii clone --xor 141 --fmt 26 --fc 123 --cn 1337 --q5 -> encode for Q5/T5555 tag\n" + "lf gproxii clone --xor 141 --fmt 26 --fc 123 --cn 1337 --em -> encode for EM4305/4469" ); void *argtable[] = { arg_param_begin, + arg_u64_1(NULL, "xor", "", "8-bit xor value (installation dependant)"), arg_u64_1(NULL, "fmt", "", "format length 26|32|36|40"), arg_u64_1(NULL, "fc", "", "8-bit value facility code"), arg_u64_1(NULL, "cn", "", "16-bit value card number"), @@ -262,11 +271,13 @@ static int CmdGuardClone(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - uint32_t fmtlen = arg_get_u32_def(ctx, 1, 0); - uint32_t fc = arg_get_u32_def(ctx, 2, 0); - uint32_t cn = arg_get_u32_def(ctx, 3, 0); - bool q5 = arg_get_lit(ctx, 4); - bool em = arg_get_lit(ctx, 5); + uint32_t xorval = arg_get_u32_def(ctx, 1, 0); + uint32_t fmtlen = arg_get_u32_def(ctx, 2, 0); + uint32_t fc = arg_get_u32_def(ctx, 3, 0); + uint32_t cn = arg_get_u32_def(ctx, 4, 0); + + bool q5 = arg_get_lit(ctx, 5); + bool em = arg_get_lit(ctx, 6); CLIParserFree(ctx); if (q5 && em) { @@ -280,7 +291,7 @@ static int CmdGuardClone(const char *Cmd) { //GuardProxII - compat mode, ASK/Biphase, data rate 64, 3 data blocks uint8_t *bs = calloc(96, sizeof(uint8_t)); - if (getGuardBits(fmtlen, facilitycode, cardnumber, bs) != PM3_SUCCESS) { + if (getGuardBits(xorval, fmtlen, facilitycode, cardnumber, bs) != PM3_SUCCESS) { PrintAndLogEx(ERR, "Error with tag bitstream generation."); free(bs); return PM3_ESOFT; @@ -306,10 +317,11 @@ static int CmdGuardClone(const char *Cmd) { free(bs); - PrintAndLogEx(INFO, "Preparing to clone Guardall to " _YELLOW_("%s") " with Facility Code: " _GREEN_("%u") " Card Number: " _GREEN_("%u") + PrintAndLogEx(INFO, "Preparing to clone Guardall to " _YELLOW_("%s") " with Facility Code: " _GREEN_("%u") " Card Number: " _GREEN_("%u") " xorKey: " _GREEN_("%u") , cardtype , facilitycode , cardnumber + , xorval ); print_blocks(blocks, ARRAYLEN(blocks)); @@ -332,11 +344,12 @@ static int CmdGuardSim(const char *Cmd) { "Simulation runs until the button is pressed or another USB command is issued.\n" "The facility-code is 8-bit and the card number is 16-bit. Larger values are truncated.\n" "Currently work only on 26 | 36 bit format", - "lf gproxii sim --fmt 26 --fc 123 --cn 1337\n" + "lf gproxii sim --xor 141 --fmt 26 --fc 123 --cn 1337\n" ); void *argtable[] = { arg_param_begin, + arg_u64_1(NULL, "xor", "", "8-bit xor value (installation dependant)"), arg_u64_1(NULL, "fmt", "", "format length 26|32|36|40"), arg_u64_1(NULL, "fc", "", "8-bit value facility code"), arg_u64_1(NULL, "cn", "", "16-bit value card number"), @@ -344,9 +357,10 @@ static int CmdGuardSim(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - uint32_t fmtlen = arg_get_u32_def(ctx, 1, 0); - uint32_t fc = arg_get_u32_def(ctx, 2, 0); - uint32_t cn = arg_get_u32_def(ctx, 3, 0); + uint32_t xorval = arg_get_u32_def(ctx, 1, 0); + uint32_t fmtlen = arg_get_u32_def(ctx, 2, 0); + uint32_t fc = arg_get_u32_def(ctx, 3, 0); + uint32_t cn = arg_get_u32_def(ctx, 4, 0); CLIParserFree(ctx); fmtlen &= 0x7F; @@ -356,12 +370,13 @@ static int CmdGuardSim(const char *Cmd) { uint8_t bs[96]; memset(bs, 0x00, sizeof(bs)); - if (getGuardBits(fmtlen, facilitycode, cardnumber, bs) != PM3_SUCCESS) { + if (getGuardBits(xorval, fmtlen, facilitycode, cardnumber, bs) != PM3_SUCCESS) { PrintAndLogEx(ERR, "Error with tag bitstream generation."); return PM3_ESOFT; } - PrintAndLogEx(SUCCESS, "Simulating Guardall Prox - Facility Code: " _YELLOW_("%u") " CardNumber: " _YELLOW_("%u") + PrintAndLogEx(SUCCESS, "Simulating Guardall Prox - xorKey: " _YELLOW_("%u%") " Facility Code: " _YELLOW_("%u") " CardNumber: " _YELLOW_("%u") + , xorval , facilitycode , cardnumber ); @@ -435,9 +450,8 @@ int detectGProxII(uint8_t *bits, size_t *size) { } // Works for 26bits. -int getGuardBits(uint8_t fmtlen, uint32_t fc, uint32_t cn, uint8_t *guardBits) { +int getGuardBits(uint8_t xorKey, uint8_t fmtlen, uint32_t fc, uint32_t cn, uint8_t *guardBits) { - uint8_t xorKey = 0x66; uint8_t i; uint8_t pre[96]; uint8_t rawbytes[12]; @@ -448,7 +462,6 @@ int getGuardBits(uint8_t fmtlen, uint32_t fc, uint32_t cn, uint8_t *guardBits) { switch (fmtlen) { case 32: { rawbytes[1] = (32 << 2); - break; } case 36: { @@ -456,6 +469,7 @@ int getGuardBits(uint8_t fmtlen, uint32_t fc, uint32_t cn, uint8_t *guardBits) { // Get wiegand from FacilityCode 14bits, CardNumber 20bits uint8_t wiegand[36]; memset(wiegand, 0x00, sizeof(wiegand)); + num_to_bytebits(fc, 14, wiegand); num_to_bytebits(cn, 20, wiegand + 14); diff --git a/client/src/cmdlfguard.h b/client/src/cmdlfguard.h index c68c0d477..cfdf739a4 100644 --- a/client/src/cmdlfguard.h +++ b/client/src/cmdlfguard.h @@ -23,5 +23,5 @@ int CmdLFGuard(const char *Cmd); int detectGProxII(uint8_t *bits, size_t *size); int demodGuard(bool verbose); -int getGuardBits(uint8_t fmtlen, uint32_t fc, uint32_t cn, uint8_t *guardBits); +int getGuardBits(uint8_t xorKey, uint8_t fmtlen, uint32_t fc, uint32_t cn, uint8_t *guardBits); #endif From ab9dab32947f10c009e30a0a446e8bd021d41988 Mon Sep 17 00:00:00 2001 From: Marcos Del Sol Vives Date: Fri, 3 Feb 2023 14:41:23 +0100 Subject: [PATCH 185/924] Fix pm3-flash-all -p XXX --- pm3 | 1 + 1 file changed, 1 insertion(+) diff --git a/pm3 b/pm3 index c0b0869b0..52a8ffcc1 100755 --- a/pm3 +++ b/pm3 @@ -441,6 +441,7 @@ done # if a port is already provided, let's just run the command as such for ARG; do + shift if [ "$ARG" == "-p" ]; then CMD "$@" exit $? From a7bc082d2d7daabcaaa2083138a3c041667e1b2f Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Sun, 5 Feb 2023 17:37:13 +0800 Subject: [PATCH 186/924] Add a option to clear the scrollback buffer --- client/src/cmdmain.c | 12 ++++++++++-- include/ansi.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/client/src/cmdmain.c b/client/src/cmdmain.c index 14e198f5c..11f9bfd7b 100644 --- a/client/src/cmdmain.c +++ b/client/src/cmdmain.c @@ -300,15 +300,23 @@ static int CmdClear(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "clear", "Clear the Proxmark3 client terminal screen", - "clear" + "clear -> clear the terminal screen\n" + "clear -b -> clear the terminal screen and the scrollback buffer" ); void *argtable[] = { arg_param_begin, + arg_lit0("b", "back", "also clear the scrollback buffer"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + bool scrollback = arg_get_lit(ctx, 1); CLIParserFree(ctx); - PrintAndLogEx(NORMAL, _CLEAR_ _TOP_ ""); + + if (!scrollback) + PrintAndLogEx(NORMAL, _CLEAR_ _TOP_ ""); + else + PrintAndLogEx(NORMAL, _CLEAR_ _TOP_ _CLEAR_SCROLLBACK_ ""); + return PM3_SUCCESS; } diff --git a/include/ansi.h b/include/ansi.h index 59f546e39..20815bc03 100644 --- a/include/ansi.h +++ b/include/ansi.h @@ -58,6 +58,7 @@ #define _BACK_BRIGHT_WHITE_(s) "\x1b[47;1m" s AEND #define _CLEAR_ "\x1b[2J" +#define _CLEAR_SCROLLBACK_ "\x1b[3J" #define _TOP_ "\x1b[1;1f" #if defined(HAVE_READLINE) From e139c137f9b8abcab5ba53f7c181810b55ba78be Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Sun, 5 Feb 2023 17:47:55 +0800 Subject: [PATCH 187/924] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d8a9226b..44a16b154 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed broken `lf em 4x70 brute` command (@adite) - Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906) - Added `lf em 4x70 brute` command (@adite) + - Added `--back` option to `clear` command to clear the scrollback buffer (@wh201906) ## [Nitride.4.16191][2023-01-29] From f9dbf1e34d06de5bf2958bb946edb9dac5f38ecf Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 6 Feb 2023 21:44:31 +0100 Subject: [PATCH 188/924] added suggestion how to generate 256kb image in sample file --- Makefile.platform.sample | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Makefile.platform.sample b/Makefile.platform.sample index 4f8f86cd4..21fb2137e 100644 --- a/Makefile.platform.sample +++ b/Makefile.platform.sample @@ -7,10 +7,23 @@ PLATFORM=PM3RDV4 #PLATFORM_EXTRAS=BTADDON #STANDALONE=LF_SAMYRUN +# Uncomment the lines below in order to make a 256KB image +# and comment out the lines above + +#PLATFORM=PM3GENERIC +#PLATFORM_SIZE=256 +#STANDALONE= +#SKIP_HITAG=1 +#SKIP_FELICA=1 +#SKIP_HFPLOT=1 +#SKIP_NFCBARCODE=1 +#SKIP_ZX8211=1 +#SKIP_LF=1 + # To accelerate repetitive compilations: # Install package "ccache" -> Debian/Ubuntu: /usr/lib/ccache, Fedora/CentOS/RHEL: /usr/lib64/ccache # And uncomment the following line #export PATH := /usr/lib64/ccache:/usr/lib/ccache:${PATH} # To install with sudo: -INSTALLSUDO=sudo \ No newline at end of file +INSTALLSUDO=sudo From c6b6f2b6a7aaebf96ef8d2944ac4b84e2e13495e Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 7 Feb 2023 19:20:42 -0800 Subject: [PATCH 189/924] Option for PR 1902 --- Makefile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6c31157e2..c482af694 100644 --- a/Makefile +++ b/Makefile @@ -65,7 +65,13 @@ ifneq (,$(INSTALLSIMFW)) endif ifeq ($(platform),Linux) $(Q)$(INSTALLSUDO) $(MKDIR) $(DESTDIR)$(UDEV_PREFIX) - $(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules +# If user is running ArchLinux, use group 'uucp' +# Else, use group 'dialout' + ifneq ($(wildcard /etc/arch-release),) + $(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist-uucp.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules + else + $(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist-dialout.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules + endif endif uninstall: common/uninstall From cb6f3f381dfea446f8c44a48f6e1cef30273a475 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 8 Feb 2023 23:17:19 +0100 Subject: [PATCH 190/924] text --- doc/md/Use_of_Proxmark/1_Validation.md | 47 +++++--------------------- 1 file changed, 9 insertions(+), 38 deletions(-) diff --git a/doc/md/Use_of_Proxmark/1_Validation.md b/doc/md/Use_of_Proxmark/1_Validation.md index 51a701388..a283b0d47 100644 --- a/doc/md/Use_of_Proxmark/1_Validation.md +++ b/doc/md/Use_of_Proxmark/1_Validation.md @@ -15,7 +15,7 @@ If all went well you should get some information about the firmware and memory usage as well as the prompt, something like this. ``` -[=] Session log /home/iceman/.proxmark3/logs/log_20220213.txt +[=] Session log /home/iceman/.proxmark3/logs/log_20230208.txt [+] loaded from JSON file /home/iceman/.proxmark3/preferences.json [=] Using UART port /dev/ttyS3 [=] Communicating with PM3 over USB-CDC @@ -28,48 +28,19 @@ If all went well you should get some information about the firmware and memory u 8888888P" 888 Y888P 888 "Y8b. 888 888 Y8P 888 888 888 888 888 " 888 Y88b d88P - 888 888 888 "Y8888P" [ Iceman ❄️ ] - + 888 888 888 "Y8888P" [ ☕ ] [ Proxmark3 RFID instrument ] - [ CLIENT ] - RRG/Iceman/master/v4.14831-269 2022-02-13 05:03:08 - compiled with............. GCC 10.3.0 - platform.................. Linux / x86_64 - Readline support.......... present - QT GUI support............ present - native BT support......... absent - Python script support..... present - Lua SWIG support.......... present - Python SWIG support....... present - - [ PROXMARK3 ] - device.................... RDV4 - firmware.................. RDV4 - external flash............ present - smartcard reader.......... present - FPC USART for BT add-on... absent - - [ ARM ] - bootrom: RRG/Iceman/master/v4.14831-269 2022-02-13 05:03:55 - os: RRG/Iceman/master/v4.14831-269 2022-02-13 05:03:49 - compiled with GCC 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] - - [ FPGA ] - LF image 2s30vq100 2022-03-20 09:28:32 - HF image 2s30vq100 2022-03-20 09:02:07 - HF FeliCa image 2s30vq100 2022-03-20 09:28:28 - HF 15 image 2s30vq100 2022-03-20 09:01:59 - - [ Hardware ] - --= uC: AT91SAM7S512 Rev A - --= Embedded Processor: ARM7TDMI - --= Internal SRAM size: 64K bytes - --= Architecture identifier: AT91SAM7Sxx Series - --= Embedded flash memory 512K bytes ( 59% used ) + MCU....... AT91SAM7S512 Rev A + Memory.... 512 Kb ( 66% used ) + Client.... Iceman/master/v4.16191 2023-02-08 22:54:30 + Bootrom... Iceman/master/v4.16191 2023-02-08 22:54:26 + OS........ Iceman/master/v4.16191 2023-02-08 22:54:27 + Target.... RDV4 + [usb] pm3 --> ``` From b0dcfdf2c5f9a56f8f0e4585cc6f2a40c5d7b38b Mon Sep 17 00:00:00 2001 From: ah01 Date: Thu, 9 Feb 2023 01:22:04 +0100 Subject: [PATCH 191/924] Add new UID of Waveshare 1.54" NFC ePaper (probably new HW revision) --- client/src/cmdhfwaveshare.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfwaveshare.c b/client/src/cmdhfwaveshare.c index 78c6ef825..8df62bcc1 100644 --- a/client/src/cmdhfwaveshare.c +++ b/client/src/cmdhfwaveshare.c @@ -712,17 +712,17 @@ static int start_drawing(uint8_t model_nr, uint8_t *black, uint8_t *red) { return PM3_ESOFT; } - if ((card.uidlen != 7) || ((memcmp(card.uid, "FSTN10m", 7) != 0) && (memcmp(card.uid, "WSDZ10m", 7) != 0))) { + if ((card.uidlen != 7) || ((memcmp(card.uid, "FSTN10m", 7) != 0) && (memcmp(card.uid, "FSTN11m", 7) != 0) && (memcmp(card.uid, "WSDZ10m", 7) != 0))) { PrintAndLogEx(WARNING, "Card doesn't look like Waveshare tag"); DropField(); return PM3_ESOFT; } - if (((model_nr != M1in54B) && (memcmp(card.uid, "FSTN10m", 7) == 0))) { + if (((model_nr != M1in54B) && ((memcmp(card.uid, "FSTN10m", 7) == 0) || (memcmp(card.uid, "FSTN11m", 7) == 0)))) { PrintAndLogEx(WARNING, "Card is a Waveshare tag 1.54\", not %s", models[model_nr].desc); DropField(); return PM3_ESOFT; } - if (((model_nr == M1in54B) && (memcmp(card.uid, "FSTN10m", 7) != 0))) { + if (((model_nr == M1in54B) && (memcmp(card.uid, "FSTN10m", 7) != 0) && (memcmp(card.uid, "FSTN11m", 7) != 0))) { PrintAndLogEx(WARNING, "Card is not a Waveshare tag 1.54\", check your model number"); DropField(); return PM3_ESOFT; From b1fb181f7171caf0605939d1180c331acff55c12 Mon Sep 17 00:00:00 2001 From: Nate Sales Date: Wed, 8 Feb 2023 20:31:40 -0500 Subject: [PATCH 192/924] feat: add standalone ICECLASS read/sim mode --- CHANGELOG.md | 1 + armsrc/Standalone/hf_iceclass.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81df05142..a86fac6e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Add ICECLASS standalone read/sim mode (@natesales) - Fixed `lf em 4x70 brute` - now works as expected (@adite) - Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906) - Added `lf em 4x70 brute` command (@adite) diff --git a/armsrc/Standalone/hf_iceclass.c b/armsrc/Standalone/hf_iceclass.c index 7d69e867a..9b9a03ed5 100644 --- a/armsrc/Standalone/hf_iceclass.c +++ b/armsrc/Standalone/hf_iceclass.c @@ -43,9 +43,10 @@ #define ICE_STATE_ATTACK 2 #define ICE_STATE_READER 3 #define ICE_STATE_CONFIGCARD 4 -#define ICE_STATE_DUMP_SIM 5 +#define ICE_STATE_DUMP_SIM 5 +#define ICE_STATE_READ_SIM 6 -#define HF_ICLASS_NUM_MODES 6 +#define HF_ICLASS_NUM_MODES 7 // ==================================================== // Select which standalone function to be active. @@ -56,6 +57,7 @@ //#define ICE_USE ICE_STATE_READER //#define ICE_USE ICE_STATE_CONFIGCARD //#define ICE_USE ICE_STATE_DUMP_SIM +//#define ICE_USE ICE_STATE_READ_SIM // ==================================================== @@ -720,6 +722,15 @@ void RunMod(void) { mode = ICE_STATE_NONE; break; } + case ICE_STATE_READ_SIM: { + DbpString("Entering reader dump mode"); + reader_dump_mode(); + SpinDelay(1200); // debounce button press + DbpString("Entering fullsim mode"); + fullsim_mode(); + DbpString("Exiting fullsim mode"); + LEDsoff(); + } } } From 5133d4a512be5cffb579e0e55e6aee2ad6362bf4 Mon Sep 17 00:00:00 2001 From: Nate Sales Date: Wed, 8 Feb 2023 19:58:07 -0500 Subject: [PATCH 193/924] feat: add -v verbose flag to "hf iclass encode" --- CHANGELOG.md | 1 + client/src/cmdhficlass.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81df05142..e1ef467cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added verbose flag to `hf iclass encode` (@natesales) - Fixed `lf em 4x70 brute` - now works as expected (@adite) - Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906) - Added `lf em 4x70 brute` command (@adite) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 94d710f98..36bd3b3d2 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -3832,6 +3832,7 @@ static int CmdHFiClassEncode(const char *Cmd) { arg_u64_0(NULL, "cn", "", "card number"), arg_str0("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"), + arg_lit0("v", NULL, "verbose (print encoded blocks)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -3877,6 +3878,7 @@ static int CmdHFiClassEncode(const char *Cmd) { CLIParamStrToBuf(arg_get_str(ctx, 9), (uint8_t *)format, sizeof(format), &format_len); bool shallow_mod = arg_get_lit(ctx, 10); + bool verbose = arg_get_lit(ctx, 11); CLIParserFree(ctx); @@ -3996,6 +3998,17 @@ static int CmdHFiClassEncode(const char *Cmd) { iclass_encrypt_block_data(credential + 24, enc_key); } + if (verbose) { + for (uint8_t i = 0; i < 4; i++) { + PrintAndLogEx(INFO, "Block %d/0x0%x -> " _YELLOW_("%s"), 6 + i, 6 + i, sprint_hex_inrow(credential + (i * 8), 8)); + } + } + + if (!g_session.pm3_present) { + PrintAndLogEx(ERR, "Device offline\n"); + return PM3_EFAILED; + } + int isok = PM3_SUCCESS; // write for (uint8_t i = 0; i < 4; i++) { From 55f85a82c979fe77427d3d4a61099222c2a8ce11 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Wed, 8 Feb 2023 23:01:50 -0800 Subject: [PATCH 194/924] Add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81df05142..b5cc2ea57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `Makefile` regression that broke `make install` (@henrygab) - Fixed `lf em 4x70 brute` - now works as expected (@adite) - Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906) - Added `lf em 4x70 brute` command (@adite) From a7b699b27e07460a852bc4202311bd278053dffb Mon Sep 17 00:00:00 2001 From: Yann GASCUEL <34003959+lnv42@users.noreply.github.com> Date: Fri, 10 Feb 2023 13:24:58 +0100 Subject: [PATCH 195/924] fix infinity loop in SpinDelayUs() and SpinDelayUsPrecision() I don't know why : but AT91C_BASE_PWMC_CH0->PWMC_CCNTR value is never equal to 0, so if start+ticks was equal to 0, it was inifity looping. This fix may produce bit longer wait than expected in some case, depending on if AT91C_BASE_PWMC_CH0->PWMC_CCNTR delay between 0xFFFF and 0x0001 is just 1 step or 2... /!\ Figure out why AT91C_BASE_PWMC_CH0->PWMC_CCNTR is never 0 and fix it there is probably a better way to fix this infinity loop issue /!\ --- armsrc/ticks.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/armsrc/ticks.c b/armsrc/ticks.c index 61089595c..3cf2c54dc 100644 --- a/armsrc/ticks.c +++ b/armsrc/ticks.c @@ -35,11 +35,14 @@ void SpinDelayUsPrecision(int us) { AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0; // Channel Duty Cycle Register AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xFFFF; // Channel Period Register - uint16_t start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR; + uint16_t end = AT91C_BASE_PWMC_CH0->PWMC_CCNTR + ticks; + if (end == 0) // AT91C_BASE_PWMC_CH0->PWMC_CCNTR is never == 0 + end++; // so we have to end++ to avoid inivity loop for (;;) { uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR; - if (now == (uint16_t)(start + ticks)) + + if (now == end) return; WDT_HIT(); @@ -59,13 +62,15 @@ void SpinDelayUs(int us) { AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0; // Channel Duty Cycle Register AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff; // Channel Period Register - uint16_t start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR; + uint16_t end = AT91C_BASE_PWMC_CH0->PWMC_CCNTR + ticks; + if (end == 0) // AT91C_BASE_PWMC_CH0->PWMC_CCNTR is never == 0 + end++; // so we have to end++ to avoid inivity loop for (;;) { uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR; - if (now == (uint16_t)(start + ticks)) - return; + if (now == end) + return; WDT_HIT(); } } From c42aa99d050deff733259a98c030a86443815f47 Mon Sep 17 00:00:00 2001 From: Nate Sales Date: Fri, 10 Feb 2023 21:55:23 -0500 Subject: [PATCH 196/924] refactor: add iceclass read sim info --- armsrc/Standalone/hf_iceclass.c | 1 + 1 file changed, 1 insertion(+) diff --git a/armsrc/Standalone/hf_iceclass.c b/armsrc/Standalone/hf_iceclass.c index 9b9a03ed5..481475bbc 100644 --- a/armsrc/Standalone/hf_iceclass.c +++ b/armsrc/Standalone/hf_iceclass.c @@ -723,6 +723,7 @@ void RunMod(void) { break; } case ICE_STATE_READ_SIM: { + DbpString("-=[ enter " _CYAN_("`read & sim`") " mode, read cards, then sim after button press ]=-"); DbpString("Entering reader dump mode"); reader_dump_mode(); SpinDelay(1200); // debounce button press From 08d2c2f1a59a805417f9f2dabe18f9ac369448b9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 11 Feb 2023 11:42:58 +0100 Subject: [PATCH 197/924] style --- armsrc/em4x70.c | 4 +- armsrc/lfsampling.c | 3 +- client/src/pm3line_vocabulory.h | 1502 +++++++++++++++---------------- 3 files changed, 754 insertions(+), 755 deletions(-) diff --git a/armsrc/em4x70.c b/armsrc/em4x70.c index 066aad58f..806442f7f 100644 --- a/armsrc/em4x70.c +++ b/armsrc/em4x70.c @@ -367,7 +367,7 @@ static int bruteforce(const uint8_t address, const uint8_t *rnd, const uint8_t * for (int k = start_key; k <= 0xFFFF; ++k) { int c = 0; - + WDT_HIT(); uint16_t rev_k = reflect16(k); @@ -405,7 +405,7 @@ static int bruteforce(const uint8_t address, const uint8_t *rnd, const uint8_t * if ((k % 0x100) == 0) { Dbprintf("Trying: %04X", k); } - + // Due to performance reason, we only try it once. Therefore you need a very stable RFID communcation. if (authenticate(temp_rnd, frnd, auth_resp) == PM3_SUCCESS) { if (g_dbglevel >= DBG_INFO) diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index e716fa248..a56e013ee 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -370,8 +370,7 @@ uint32_t DoAcquisition(uint8_t decimation, uint8_t bits_per_sample, bool avg, in } // Ensure that DC offset removal and noise check is performed for any device-side processing - if (bits_per_sample == 8) - { + if (bits_per_sample == 8) { // these functions only consider bps==8 removeSignalOffset(data.buffer, samples.total_saved); computeSignalProperties(data.buffer, samples.total_saved); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index bcf196fe9..b6d08d325 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,756 +31,756 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 0, "emv exec" }, - { 0, "emv pse" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 0, "emv gpo" }, - { 0, "emv readrec" }, - { 0, "emv genac" }, - { 0, "emv challenge" }, - { 0, "emv intauth" }, - { 0, "emv scan" }, - { 1, "emv test" }, - { 1, "emv list" }, - { 0, "emv roca" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 0, "hf mfp info" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp ndefread" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 0, "hf topaz dump" }, - { 1, "hf topaz list" }, - { 0, "hf topaz info" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag cc" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 0, "emv exec" }, + { 0, "emv pse" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 0, "emv gpo" }, + { 0, "emv readrec" }, + { 0, "emv genac" }, + { 0, "emv challenge" }, + { 0, "emv intauth" }, + { 0, "emv scan" }, + { 1, "emv test" }, + { 1, "emv list" }, + { 0, "emv roca" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 0, "hf mfp info" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp ndefread" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 0, "hf topaz dump" }, + { 1, "hf topaz list" }, + { 0, "hf topaz info" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 0, "lf hitag eload" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag reader" }, + { 0, "lf hitag sim" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag writer" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag cc" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -788,4 +788,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif \ No newline at end of file +#endif From 8f977ef989237c213be3ffbcb1e88d659968ae8b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 11 Feb 2023 11:43:29 +0100 Subject: [PATCH 198/924] fix #1909 intendation breaks the makefile --- Makefile | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index c482af694..be4af6682 100644 --- a/Makefile +++ b/Makefile @@ -67,11 +67,11 @@ ifeq ($(platform),Linux) $(Q)$(INSTALLSUDO) $(MKDIR) $(DESTDIR)$(UDEV_PREFIX) # If user is running ArchLinux, use group 'uucp' # Else, use group 'dialout' - ifneq ($(wildcard /etc/arch-release),) - $(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist-uucp.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules - else - $(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist-dialout.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules - endif +ifneq ($(wildcard /etc/arch-release),) + $(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist-uucp.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules +else + $(Q)$(INSTALLSUDO) $(CP) driver/77-pm3-usb-device-blacklist-dialout.rules $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules +endif endif uninstall: common/uninstall @@ -81,21 +81,28 @@ common/uninstall: ifneq (,$(INSTALLSCRIPTS)) $(Q)$(INSTALLSUDO) $(RM) $(foreach script,$(INSTALLSCRIPTS),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLBINRELPATH)$(PATHSEP)$(notdir $(script))) endif + ifneq (,$(INSTALLSHARES)) $(Q)$(INSTALLSUDO) $(RMDIR) $(foreach share,$(INSTALLSHARES),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH)$(PATHSEP)$(notdir $(share))) endif + ifneq (,$(INSTALLDOCS)) $(Q)$(INSTALLSUDO) $(RMDIR) $(foreach doc,$(INSTALLDOCS),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH)$(PATHSEP)$(notdir $(doc))) $(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLDOCSRELPATH) endif + ifneq (,$(INSTALLTOOLS)) $(Q)$(INSTALLSUDO) $(RM) $(foreach tool,$(INSTALLTOOLS),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH)$(PATHSEP)$(notdir $(tool))) endif + $(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLTOOLSRELPATH) + ifneq (,$(INSTALLSIMFW)) $(Q)$(INSTALLSUDO) $(RM) $(foreach fw,$(INSTALLSIMFW),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)$(PATHSEP)$(notdir $(fw))) endif + $(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH) + ifeq ($(platform),Linux) $(Q)$(INSTALLSUDO) $(RM) $(DESTDIR)$(UDEV_PREFIX)/77-pm3-usb-device-blacklist.rules endif From 3ee7ac32547d2aa1fcaf2ade0b9681d7801d0039 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 11 Feb 2023 11:53:20 +0100 Subject: [PATCH 199/924] style --- client/src/pm3line_vocabulory.h | 1503 ++++++++++++++++--------------- doc/commands.json | 38 +- doc/commands.md | 1 + 3 files changed, 782 insertions(+), 760 deletions(-) diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index b6d08d325..a0e386270 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,756 +31,757 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 0, "emv exec" }, - { 0, "emv pse" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 0, "emv gpo" }, - { 0, "emv readrec" }, - { 0, "emv genac" }, - { 0, "emv challenge" }, - { 0, "emv intauth" }, - { 0, "emv scan" }, - { 1, "emv test" }, - { 1, "emv list" }, - { 0, "emv roca" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 0, "hf mfp info" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp ndefread" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 0, "hf topaz dump" }, - { 1, "hf topaz list" }, - { 0, "hf topaz info" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag cc" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 0, "emv exec" }, + { 0, "emv pse" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 0, "emv gpo" }, + { 0, "emv readrec" }, + { 0, "emv genac" }, + { 0, "emv challenge" }, + { 0, "emv intauth" }, + { 0, "emv scan" }, + { 1, "emv test" }, + { 1, "emv list" }, + { 0, "emv roca" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 0, "hf mfp info" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp ndefread" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 0, "hf topaz dump" }, + { 1, "hf topaz list" }, + { 0, "hf topaz info" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 0, "lf hitag eload" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag reader" }, + { 0, "lf hitag sim" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag writer" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag cc" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -788,4 +789,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif +#endif \ No newline at end of file diff --git a/doc/commands.json b/doc/commands.json index 3545a9b78..cb68d6069 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -175,13 +175,15 @@ "command": "clear", "description": "Clear the Proxmark3 client terminal screen", "notes": [ - "clear" + "clear -> clear the terminal screen", + "clear -b -> clear the terminal screen and the scrollback buffer" ], "offline": true, "options": [ - "-h, --help This help" + "-h, --help This help", + "-b, --back also clear the scrollback buffer" ], - "usage": "clear [-h]" + "usage": "clear [-hb]" }, "data askedgedetect": { "command": "data askedgedetect", @@ -1858,14 +1860,14 @@ }, "hf 15 slixwritepwd": { "command": "hf 15 slixwritepwd", - "description": "Write a password on a SLIX family ISO-15693 tag", + "description": "Write a password on a SLIX family ISO-15693 tag.nSome tags do not support all different password types.", "notes": [ "hf 15 slixwritepwd -t READ -o 00000000 -n 12131415" ], "offline": false, "options": [ "-h, --help This help", - "-t, --type which password field to write to (some tags do not support all password types)", + "-t, --type which password field to write to", "-o, --old old password (if present), 8 hex bytes", "-n, --new new password, 8 hex bytes" ], @@ -3097,9 +3099,10 @@ "--fc facility code", "--cn card number", "-w, --wiegand see `wiegand list` for available formats", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "--shallow use shallow (ASK) reader modulation instead of OOK", + "-v verbose (print encoded blocks)" ], - "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" + "usage": "hf iclass encode [-hv] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" }, "hf iclass encrypt": { "command": "hf iclass encrypt", @@ -8190,6 +8193,23 @@ ], "usage": "lf em 4x70 auth [-h] [--par] --rnd --frn " }, + "lf em 4x70 brute": { + "command": "lf em 4x70 brute", + "description": "Optimized partial key-update attack of 16-bit key block 7, 8 or 9 of an EM4x70 This attack does NOT write anything to the tag. Before starting this attack, 0000 must be written to the 16-bit key block: 'lf em 4x70 write -b 9 -d 0000'. After success, the 16-bit key block have to be restored with the key found: 'lf em 4x70 write -b 9 -d c0de'", + "notes": [ + "lf em 4x70 brute -b 9 --rnd 45F54ADA252AAC --frn 4866BB70 -> bruteforcing key bits k95...k80" + ], + "offline": false, + "options": [ + "-h, --help This help", + "--par Add parity bit when sending commands", + "-b, --block block/word address, dec", + "--rnd Random 56-bit", + "--frn F(RN) 28-bit as 4 hex bytes", + "-s, --start Start bruteforce enumeration from this key value" + ], + "usage": "lf em 4x70 brute [-h] [--par] -b --rnd --frn [-s ]" + }, "lf em 4x70 help": { "command": "lf em 4x70 help", "description": "help This help", @@ -11882,8 +11902,8 @@ } }, "metadata": { - "commands_extracted": 748, + "commands_extracted": 749, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-01-29T17:39:28" + "extracted_on": "2023-02-11T10:42:29" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 382c98b58..0dbad2544 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -893,6 +893,7 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`lf em 4x70 help `|Y |`This help` +|`lf em 4x70 brute `|N |`Bruteforce EM4X70 to find partial Crypt Key` |`lf em 4x70 info `|N |`Tag information EM4x70` |`lf em 4x70 write `|N |`Write EM4x70` |`lf em 4x70 unlock `|N |`Unlock EM4x70 for writing` From 5a2c6406d88dd04fdc359731f8af48369639e47d Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Mon, 13 Feb 2023 21:58:34 +0100 Subject: [PATCH 200/924] Allow current directory to import python libraries also fixed a bunch of wrong comments. --- client/src/cmdscript.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 114205708..0abab9b01 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -164,11 +164,18 @@ static void set_python_path(const char *path) { } static void set_python_paths(void) { - //--add to the LUA_PATH (package.path in lua) - // so we can load scripts from various places: + // Prepending to sys.path so we can load scripts from various places. + // This means the following directories are in reverse order of + // priority for search python modules. + + // Allow current working directory because it seems that's what users want. + // But put it with lower search priority than the typical pm3 scripts directories + // but still with a higher priority than the pip installed libraries to mimic + // Python interpreter behavior. That should be confusing the users the least. + set_python_path("."); const char *exec_path = get_my_executable_directory(); if (exec_path != NULL) { - // from the ./luascripts/ directory + // from the ./pyscripts/ directory char scripts_path[strlen(exec_path) + strlen(PYTHON_SCRIPTS_SUBDIR) + strlen(PYTHON_LIBRARIES_WILDCARD) + 1]; strcpy(scripts_path, exec_path); strcat(scripts_path, PYTHON_SCRIPTS_SUBDIR); @@ -178,7 +185,7 @@ static void set_python_paths(void) { const char *user_path = get_my_user_directory(); if (user_path != NULL) { - // from the $HOME/.proxmark3/luascripts/ directory + // from the $HOME/.proxmark3/pyscripts/ directory char scripts_path[strlen(user_path) + strlen(PM3_USER_DIRECTORY) + strlen(PYTHON_SCRIPTS_SUBDIR) + strlen(PYTHON_LIBRARIES_WILDCARD) + 1]; strcpy(scripts_path, user_path); strcat(scripts_path, PM3_USER_DIRECTORY); @@ -189,7 +196,7 @@ static void set_python_paths(void) { } if (exec_path != NULL) { - // from the $PREFIX/share/proxmark3/luascripts/ directory + // from the $PREFIX/share/proxmark3/pyscripts/ directory char scripts_path[strlen(exec_path) + strlen(PM3_SHARE_RELPATH) + strlen(PYTHON_SCRIPTS_SUBDIR) + strlen(PYTHON_LIBRARIES_WILDCARD) + 1]; strcpy(scripts_path, exec_path); strcat(scripts_path, PM3_SHARE_RELPATH); From 736d24cdabe18001c8dd1c49d700f52a8a199816 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 14 Feb 2023 21:16:38 +0100 Subject: [PATCH 201/924] increased the readline package to 8.2 --- client/CMakeLists.txt | 2 +- client/experimental_lib/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 5bd3ebddd..0bd8bd5cc 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -121,7 +121,7 @@ if (NOT SKIPREADLINE EQUAL 1) ExternalProject_Add_StepTargets(ncurses configure build install) ExternalProject_Add(readline - URL ftp://ftp.gnu.org/gnu/readline/readline-8.1.tar.gz + URL ftp://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz PREFIX deps/readline DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/readline CONFIGURE_COMMAND ./configure CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} --host=arm --enable-static diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 675dda225..bdc122e58 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -122,7 +122,7 @@ if (NOT SKIPREADLINE EQUAL 1) ExternalProject_Add_StepTargets(ncurses configure build install) ExternalProject_Add(readline - URL ftp://ftp.gnu.org/gnu/readline/readline-8.1.tar.gz + URL ftp://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz PREFIX deps/readline DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/readline CONFIGURE_COMMAND ./configure CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} --host=arm --enable-static From e8d448e6d0c44dcbf266e48e74e94b18062ac711 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 14 Feb 2023 21:17:19 +0100 Subject: [PATCH 202/924] text --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b56f26a9..81b881e6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed the readline package to v8.2 in the CMAKE files for the client (@iceman1001) - Add ICECLASS standalone read/sim mode (@natesales) - Added verbose flag to `hf iclass encode` (@natesales) - Fixed `Makefile` regression that broke `make install` (@henrygab) From 5d4fe5b8df6b8ae20c1b6f3e73c0387534d1c2cd Mon Sep 17 00:00:00 2001 From: Boris Fersing Date: Thu, 16 Feb 2023 13:24:44 -0500 Subject: [PATCH 203/924] - Mark the credentials as decrypted when decrypting a dump - In the view command, show the credentials if the input dump is decrypted --- CHANGELOG.md | 2 + client/src/cmdhficlass.c | 89 +++++++++++++++++++++++++--------------- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b881e6e..668e2c32c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added documentation for usage of Proxmark3 under WSL2 (@henrygab) - Fixed device permissions via updated `udev` rules (@henrygab) - Added `--back` option to `clear` command to clear the scrollback buffer (@wh201906) + - Mark credentials as decrypted in the dump generated by `hf iclass decrypt` + - Show credentials when using `hf iclass view` on a decrypted dump ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 36bd3b3d2..08a3c1a0f 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1202,6 +1202,35 @@ static int CmdHFiClassEView(const char *Cmd) { return PM3_SUCCESS; } +static void iclass_decode_credentials(uint8_t *data) { + BLOCK79ENCRYPTION encryption = (data[(6 * 8) + 7] & 0x03); + bool has_values = (memcmp(data + (8 * 7), empty, 8) != 0) && (memcmp(data + (8 * 7), zeros, 8) != 0); + if (has_values && encryption == None) { + + //todo: remove preamble/sentinel + uint32_t top = 0, mid = 0, bot = 0; + + PrintAndLogEx(INFO, "Block 7 decoder"); + + char hexstr[16 + 1] = {0}; + hex_to_buffer((uint8_t *)hexstr, data + (8 * 7), 8, sizeof(hexstr) - 1, 0, 0, true); + hexstring_to_u96(&top, &mid, &bot, hexstr); + + char binstr[64 + 1]; + hextobinstring(binstr, hexstr); + char *pbin = binstr; + while (strlen(pbin) && *(++pbin) == '0'); + + PrintAndLogEx(SUCCESS, "Binary..................... " _GREEN_("%s"), pbin); + + PrintAndLogEx(INFO, "Wiegand decode"); + wiegand_message_t packed = initialize_message_object(top, mid, bot, 0); + HIDTryUnpack(&packed); + } else { + PrintAndLogEx(INFO, "No credential found"); + } +} + static int CmdHFiClassDecrypt(const char *Cmd) { CLIParserContext *clictx; CLIParserInit(&clictx, "hf iclass decrypt", @@ -1356,21 +1385,36 @@ static int CmdHFiClassDecrypt(const char *Cmd) { //uint8_t numblocks4userid = GetNumberBlocksForUserId(decrypted + (6 * 8)); + bool decrypted_block789 = false; for (uint8_t blocknum = 0; blocknum < limit; ++blocknum) { uint16_t idx = blocknum * 8; memcpy(enc_data, decrypted + idx, 8); - if (aa1_encryption == RFU || aa1_encryption == None) - continue; + switch (aa1_encryption) { + // Right now, only 3DES is supported + case TRIPLEDES: + // Decrypt block 7,8,9 if configured. + if (blocknum > 6 && blocknum <= 9 && memcmp(enc_data, empty, 8) != 0) { + if (use_sc) { + Decrypt(enc_data, decrypted + idx); + } else { + mbedtls_des3_crypt_ecb(&ctx, enc_data, decrypted + idx); + } + decrypted_block789 = true; + } + break; + case DES: + case RFU: + case None: + // Nothing to do for None anyway... + default: + continue; + } - // Decrypted block 7,8,9 if configured. - if (blocknum > 6 && blocknum <= 9 && memcmp(enc_data, empty, 8) != 0) { - if (use_sc) { - Decrypt(enc_data, decrypted + idx); - } else { - mbedtls_des3_crypt_ecb(&ctx, enc_data, decrypted + idx); - } + if (decrypted_block789) { + // Set the 2 last bits of block6 to 0 to mark the data as decrypted + decrypted[(6 * 8) + 7] = decrypted[(6 * 8) + 7] & 0xfc; } } @@ -1404,31 +1448,7 @@ static int CmdHFiClassDecrypt(const char *Cmd) { } // decode block 7-8-9 - has_values = (memcmp(decrypted + (8 * 7), empty, 8) != 0) && (memcmp(decrypted + (8 * 7), zeros, 8) != 0); - if (has_values) { - - //todo: remove preamble/sentinel - uint32_t top = 0, mid = 0, bot = 0; - - PrintAndLogEx(INFO, "Block 7 decoder"); - - char hexstr[16 + 1] = {0}; - hex_to_buffer((uint8_t *)hexstr, decrypted + (8 * 7), 8, sizeof(hexstr) - 1, 0, 0, true); - hexstring_to_u96(&top, &mid, &bot, hexstr); - - char binstr[64 + 1]; - hextobinstring(binstr, hexstr); - char *pbin = binstr; - while (strlen(pbin) && *(++pbin) == '0'); - - PrintAndLogEx(SUCCESS, "Binary..................... " _GREEN_("%s"), pbin); - - PrintAndLogEx(INFO, "Wiegand decode"); - wiegand_message_t packed = initialize_message_object(top, mid, bot, 0); - HIDTryUnpack(&packed); - } else { - PrintAndLogEx(INFO, "No credential found"); - } + iclass_decode_credentials(decrypted); // decode block 9 has_values = (memcmp(decrypted + (8 * 9), empty, 8) != 0) && (memcmp(decrypted + (8 * 9), zeros, 8) != 0); @@ -2840,6 +2860,7 @@ static int CmdHFiClassView(const char *Cmd) { print_picopass_header((picopass_hdr_t *) dump); print_picopass_info((picopass_hdr_t *) dump); printIclassDumpContents(dump, startblock, endblock, bytes_read, dense_output); + iclass_decode_credentials(dump); if (verbose) { printIclassSIO(dump); From 2a150b8c6b9b6e9efc600e0821e176ba7ed2682a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 17 Feb 2023 16:37:03 +0100 Subject: [PATCH 204/924] Fix bug preventing args to be passed to the client Bug introduced by ab9dab32947f10c009e30a0a446e8bd021d41988 It was not possible to pass args anymore, e.g. `pm3 -l myscript.lua` --- pm3 | 1 + 1 file changed, 1 insertion(+) diff --git a/pm3 b/pm3 index 52a8ffcc1..e418a3103 100755 --- a/pm3 +++ b/pm3 @@ -446,6 +446,7 @@ for ARG; do CMD "$@" exit $? fi + set -- "$@" "$ARG" done if [ "$1" == "--list" ]; then From 944d6ee5962ed74fdb5ac16fff4002c7c3725d21 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 17 Feb 2023 17:51:59 +0100 Subject: [PATCH 205/924] simpler --- client/src/cmdhficlass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 08a3c1a0f..84a6e563d 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1414,7 +1414,7 @@ static int CmdHFiClassDecrypt(const char *Cmd) { if (decrypted_block789) { // Set the 2 last bits of block6 to 0 to mark the data as decrypted - decrypted[(6 * 8) + 7] = decrypted[(6 * 8) + 7] & 0xfc; + decrypted[(6 * 8) + 7] &= 0xFC; } } From 5784c8de77f6cabf4d27c76f412dd3a9b441ff63 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Fri, 17 Feb 2023 15:42:46 -0800 Subject: [PATCH 206/924] Update USB Serial Number from SPI flash's uniqueID Also allow flash to be separately enabled via PLATFORM_EXTRAS. NOTE: this does *NOT* enable the serial number in the bootrom. Still investigating options there. --- Makefile.platform.sample | 2 ++ armsrc/appmain.c | 16 +++++++++++++- armsrc/flashmem.c | 8 +++---- common_arm/Makefile.hal | 4 ++++ common_arm/usb_cdc.c | 45 ++++++++++++++++++++++++++++++++++++++++ common_arm/usb_cdc.h | 1 + 6 files changed, 71 insertions(+), 5 deletions(-) diff --git a/Makefile.platform.sample b/Makefile.platform.sample index 21fb2137e..aeb541cee 100644 --- a/Makefile.platform.sample +++ b/Makefile.platform.sample @@ -5,6 +5,8 @@ PLATFORM=PM3RDV4 #PLATFORM=PM3GENERIC # If you want more than one PLATFORM_EXTRAS option, separate them by spaces: #PLATFORM_EXTRAS=BTADDON +#PLATFORM_EXTRAS=FLASH +#PLATFORM_EXTRAS=BTADDON FLASH #STANDALONE=LF_SAMYRUN # Uncomment the lines below in order to make a 256KB image diff --git a/armsrc/appmain.c b/armsrc/appmain.c index bc22f1834..f3a42ed09 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2471,8 +2471,11 @@ static void PacketReceived(PacketCommandNG *packet) { LED_B_OFF(); break; } - if (page < 3) + if (page < 3) { isok = Flash_WipeMemoryPage(page); + // let spiffs check and update its info post flash erase + rdv40_spiffs_check(); + } reply_mix(CMD_ACK, isok, 0, 0, 0, 0); LED_B_OFF(); @@ -2677,6 +2680,17 @@ void __attribute__((noreturn)) AppMain(void) { I2C_init(false); #endif +#ifdef WITH_FLASH + if (FlashInit()) { + uint64_t flash_uniqueID = 0; + if (!Flash_CheckBusy(BUSY_TIMEOUT)) { // OK because firmware was built for devices with flash + Flash_UniqueID((uint8_t*)&(flash_uniqueID)); + } + FlashStop(); + usb_update_serial(flash_uniqueID); + } +#endif + #ifdef WITH_FPC_USART usart_init(USART_BAUD_RATE, USART_PARITY); #endif diff --git a/armsrc/flashmem.c b/armsrc/flashmem.c index ba882eaa7..4b6d39b91 100644 --- a/armsrc/flashmem.c +++ b/armsrc/flashmem.c @@ -22,7 +22,7 @@ #include "ticks.h" #include "dbprint.h" #include "string.h" -#include "spiffs.h" +#include "usb_cdc.h" /* here: use NCPS2 @ PA10: */ #define SPI_CSR_NUM 2 @@ -436,7 +436,9 @@ out: return len; } - +// WARNING -- if callers are using a file system (such as SPIFFS), +// they should inform the file system of this change +// e.g., rdv40_spiffs_check() bool Flash_WipeMemoryPage(uint8_t page) { if (!FlashInit()) { if (g_dbglevel > 3) Dbprintf("Flash_WriteData init fail"); @@ -451,8 +453,6 @@ bool Flash_WipeMemoryPage(uint8_t page) { FlashStop(); - // let spiffs check and update its info post flash erase - rdv40_spiffs_check(); return true; } // Wipes flash memory completely, fills with 0xFF diff --git a/common_arm/Makefile.hal b/common_arm/Makefile.hal index 0e9dd455b..a65514784 100644 --- a/common_arm/Makefile.hal +++ b/common_arm/Makefile.hal @@ -114,6 +114,10 @@ endif # parsing additional PLATFORM_EXTRAS tokens PLATFORM_EXTRAS_TMP:=$(PLATFORM_EXTRAS) +ifneq (,$(findstring FLASH,$(PLATFORM_EXTRAS_TMP))) + PLATFORM_DEFS += -DWITH_FLASH + PLATFORM_EXTRAS_TMP := $(strip $(filter-out FLASH,$(PLATFORM_EXTRAS_TMP))) +endif ifneq (,$(findstring BTADDON,$(PLATFORM_EXTRAS_TMP))) PLATFORM_DEFS += -DWITH_FPC_USART_HOST PLATFORM_EXTRAS_TMP := $(strip $(filter-out BTADDON,$(PLATFORM_EXTRAS_TMP))) diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index 0ccf25aef..f805d1797 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -366,11 +366,56 @@ static const char StrProduct[] = { 'p', 0, 'r', 0, 'o', 0, 'x', 0, 'm', 0, 'a', 0, 'r', 0, 'k', 0, '3', 0 }; +#ifndef WITH_FLASH static const char StrSerialNumber[] = { 14, // Length 0x03, // Type is string 'i', 0, 'c', 0, 'e', 0, 'm', 0, 'a', 0, 'n', 0 }; +#else // WITH_FLASH is defined + +// Manually calculated size of descriptor with unique ID: +// offset 0, lengt h 1: total length field +// offset 1, length 1: descriptor type field +// offset 2, length 12: 6x unicode chars (original string) +// offset 14, length 4: 2x unicode chars (underscores) [[ to avoid descriptor being (size % 8) == 0, OS bug workaround ]] +// offset 18, length 32: 16x unicode chars (8-byte serial as hex characters) +// ============================ +// total: 50 bytes + +#define USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH 50 +char StrSerialNumber[] = { + 14, // Length is initially identical to non-unique version ... The length updated at boot, if unique serial is available + 0x03, // Type is string + 'i', 0, 'c', 0, 'e', 0, 'm', 0, 'a', 0, 'n', 0, + '_', 0, '_', 0, + 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, + 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, +}; +void usb_update_serial(uint64_t newSerialNumber) { + static bool configured = false; // TODO: enable by setting to false here... + if (configured) { + return; + } + // run this only once per boot... even if it fails to find serial number + configured = true; + if ((newSerialNumber == 0x0000000000000000) || (newSerialNumber == 0xFFFFFFFFFFFFFFFF)) { + return; + } + // Descriptor is, effectively, initially identical to non-unique serial + // number because it reports the shorter length in the first byte. + // Convert uniqueID's eight bytes to 16 unicode characters in the + // descriptor and, finally, update the descriptor's length, which + // causes the serial number to become visible. + for (uint8_t i = 0; i < 16; i++) { + uint8_t nibble = (uint8_t)((newSerialNumber >> (60 - (4*i))) & 0xFu); + char c = nibble < 10 ? '0' + nibble : 'A' + (nibble-10); + StrSerialNumber[18+(2*i)] = c; // [ 18, 20, 22, .., 46, 48 ] + } + StrSerialNumber[0] = USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH; +} +#endif + // size includes their own field. static const char StrMS_OSDescriptor[] = { diff --git a/common_arm/usb_cdc.h b/common_arm/usb_cdc.h index a09d3fc33..e7f6f3d09 100644 --- a/common_arm/usb_cdc.h +++ b/common_arm/usb_cdc.h @@ -31,6 +31,7 @@ bool usb_poll_validate_length(void); uint32_t usb_read(uint8_t *data, size_t len); int usb_write(const uint8_t *data, const size_t len); uint32_t usb_read_ng(uint8_t *data, size_t len); +void usb_update_serial(uint64_t newSerialNumber); void SetUSBreconnect(int value); int GetUSBreconnect(void); From 44676bde724fb8718a6ddf6eaa7af3bdbbc259b6 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Fri, 17 Feb 2023 16:59:00 -0800 Subject: [PATCH 207/924] Bootrom: Enable serial number from flash * Add `.ramfunc` section to bootrom loader script * exclude spiffs functionality from flashmem.h/flashmem.c (allows bootrom to use flashmem) * hide unused tick.h / flashmem.h functions from bootrom (not technically necessary; see comments) * bootrom: add source files, include path, and defines when `PLATFORM_DEFS` defines `WITH_FLASH` * Define `AS_BOOTROM` to indicate code is building for bootrom --- armsrc/appmain.c | 2 +- bootrom/Makefile | 8 +- bootrom/bootrom.c | 16 +- bootrom/ldscript-flash | 1 + {armsrc => common_arm}/flashmem.c | 431 +++++++++++++++--------------- {armsrc => common_arm}/flashmem.h | 65 ++++- {armsrc => common_arm}/ticks.c | 85 +++--- {armsrc => common_arm}/ticks.h | 23 +- common_arm/usb_cdc.c | 14 +- 9 files changed, 373 insertions(+), 272 deletions(-) rename {armsrc => common_arm}/flashmem.c (98%) rename {armsrc => common_arm}/flashmem.h (76%) rename {armsrc => common_arm}/ticks.c (99%) rename {armsrc => common_arm}/ticks.h (89%) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index f3a42ed09..90681c324 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2684,7 +2684,7 @@ void __attribute__((noreturn)) AppMain(void) { if (FlashInit()) { uint64_t flash_uniqueID = 0; if (!Flash_CheckBusy(BUSY_TIMEOUT)) { // OK because firmware was built for devices with flash - Flash_UniqueID((uint8_t*)&(flash_uniqueID)); + Flash_UniqueID((uint8_t*)(&flash_uniqueID)); } FlashStop(); usb_update_serial(flash_uniqueID); diff --git a/bootrom/Makefile b/bootrom/Makefile index edb0cc990..cad3e17d1 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -34,11 +34,17 @@ VERSIONSRC = version_pm3.c # THUMBSRC := # stdint.h provided locally until GCC 4.5 becomes C99 compliant -APP_CFLAGS = -I. -ffunction-sections -fdata-sections +APP_CFLAGS = -I. -ffunction-sections -fdata-sections -DAS_BOOTROM # stack-protect , no-pie reduces size on Gentoo Hardened 8.2 gcc, no-common makes sure uninitialized vars don't end up in COMMON area APP_CFLAGS += -fno-stack-protector -fno-pie -fno-common +ifneq (,$(findstring WITH_FLASH,$(PLATFORM_DEFS))) + APP_CFLAGS += -DWITH_FLASH + APP_CFLAGS += -I../common_arm + THUMBSRC += flashmem.c ticks.c +endif + # Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC include ../common_arm/Makefile.common diff --git a/bootrom/bootrom.c b/bootrom/bootrom.c index 93c4d605e..c94c23481 100644 --- a/bootrom/bootrom.c +++ b/bootrom/bootrom.c @@ -20,6 +20,10 @@ #include "clocks.h" #include "usb_cdc.h" +#ifdef WITH_FLASH +#include "flashmem.h" +#endif + #include "proxmark3_arm.h" #define DEBUG 0 @@ -214,8 +218,18 @@ static void flash_mode(void) { bootrom_unlocked = false; uint8_t rx[sizeof(PacketCommandOLD)]; g_common_area.command = COMMON_AREA_COMMAND_NONE; - if (!g_common_area.flags.button_pressed && BUTTON_PRESS()) + if (!g_common_area.flags.button_pressed && BUTTON_PRESS()) { g_common_area.flags.button_pressed = 1; + } + +#ifdef WITH_FLASH + if (FlashInit()) { // checks for existence of flash also ... OK because bootrom was built for devices with flash + uint64_t flash_uniqueID = 0; + Flash_UniqueID((uint8_t*)&flash_uniqueID); + FlashStop(); + usb_update_serial(flash_uniqueID); + } +#endif usb_enable(); diff --git a/bootrom/ldscript-flash b/bootrom/ldscript-flash index 5d63f9689..374c2d6c7 100644 --- a/bootrom/ldscript-flash +++ b/bootrom/ldscript-flash @@ -53,6 +53,7 @@ SECTIONS *(.rodata.*) *(.data) *(.data.*) + *(.ramfunc) . = ALIGN(4); } >ram AT>bootphase2 :phase2 diff --git a/armsrc/flashmem.c b/common_arm/flashmem.c similarity index 98% rename from armsrc/flashmem.c rename to common_arm/flashmem.c index 4b6d39b91..0a60d43c0 100644 --- a/armsrc/flashmem.c +++ b/common_arm/flashmem.c @@ -20,7 +20,11 @@ #include "proxmark3_arm.h" #include "ticks.h" + +#ifndef AS_BOOTROM #include "dbprint.h" +#endif // AS_BOOTROM + #include "string.h" #include "usb_cdc.h" @@ -37,197 +41,13 @@ static uint32_t FLASHMEM_SPIBAUDRATE = FLASH_BAUD; #define FASTFLASH (FLASHMEM_SPIBAUDRATE > FLASH_MINFAST) +#ifndef AS_BOOTROM + void FlashmemSetSpiBaudrate(uint32_t baudrate) { FLASHMEM_SPIBAUDRATE = baudrate; Dbprintf("Spi Baudrate : %dMHz", FLASHMEM_SPIBAUDRATE / 1000000); } -// initialize -bool FlashInit(void) { - FlashSetup(FLASHMEM_SPIBAUDRATE); - - StartTicks(); - - if (Flash_CheckBusy(BUSY_TIMEOUT)) { - StopTicks(); - return false; - } - - return true; -} - -void FlashSetup(uint32_t baudrate) { - //WDT_DISABLE - AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; - - // PA10 -> SPI_NCS2 chip select (FLASHMEM) - // PA11 -> SPI_NCS0 chip select (FPGA) - // PA12 -> SPI_MISO Master-In Slave-Out - // PA13 -> SPI_MOSI Master-Out Slave-In - // PA14 -> SPI_SPCK Serial Clock - - // Disable PIO control of the following pins, allows use by the SPI peripheral - AT91C_BASE_PIOA->PIO_PDR |= (GPIO_NCS0 | GPIO_MISO | GPIO_MOSI | GPIO_SPCK | GPIO_NCS2); - - // Pull-up Enable - AT91C_BASE_PIOA->PIO_PPUER |= (GPIO_NCS0 | GPIO_MISO | GPIO_MOSI | GPIO_SPCK | GPIO_NCS2); - - // Peripheral A - AT91C_BASE_PIOA->PIO_ASR |= (GPIO_NCS0 | GPIO_MISO | GPIO_MOSI | GPIO_SPCK); - - // Peripheral B - AT91C_BASE_PIOA->PIO_BSR |= GPIO_NCS2; - - //enable the SPI Peripheral clock - AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SPI); - - - //reset spi needs double SWRST, see atmel's errata on this case - AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SWRST; - AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SWRST; - - // Enable SPI - AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIEN; - - // NPCS2 Mode 0 - AT91C_BASE_SPI->SPI_MR = - (0 << 24) | // Delay between chip selects = DYLBCS/MCK BUT: - // If DLYBCS is less than or equal to six, six MCK periods - // will be inserted by default. - SPI_PCS(SPI_CSR_NUM) | // Peripheral Chip Select (selects SPI_NCS2 or PA10) - (0 << 7) | // Disable LLB (1=MOSI2MISO test mode) - (1 << 4) | // Disable ModeFault Protection - (0 << 3) | // makes spi operate at MCK (1 is MCK/2) - (0 << 2) | // Chip selects connected directly to peripheral - AT91C_SPI_PS_FIXED | // Fixed Peripheral Select - AT91C_SPI_MSTR; // Master Mode - - uint8_t csaat = 1; - uint32_t dlybct = 0; - uint8_t ncpha = 1; - uint8_t cpol = 0; - if (baudrate > FLASH_MINFAST) { - baudrate = FLASH_FASTBAUD; - //csaat = 0; - dlybct = 1500; - ncpha = 0; - cpol = 0; - } - - AT91C_BASE_SPI->SPI_CSR[2] = - SPI_DLYBCT(dlybct, MCK) | // Delay between Consecutive Transfers (32 MCK periods) - SPI_DLYBS(0, MCK) | // Delay Beforce SPCK CLock - SPI_SCBR(baudrate, MCK) | // SPI Baudrate Selection - AT91C_SPI_BITS_8 | // Bits per Transfer (8 bits) - //AT91C_SPI_CSAAT | // Chip Select inactive after transfer - // 40.4.6.2 SPI: Bad tx_ready Behavior when CSAAT = 1 and SCBR = 1 - // If the SPI is programmed with CSAAT = 1, SCBR(baudrate) = 1 and two transfers are performed consecutively on - // the same slave with an IDLE state between them, the tx_ready signal does not rise after the second data has been - // transferred in the shifter. This can imply for example, that the second data is sent twice. - // COLIN :: For now we STILL use CSAAT=1 to avoid having to (de)assert NPCS manually via PIO lines and we deal with delay - (csaat << 3) | - /* Spi modes: - Mode CPOL CPHA NCPHA - 0 0 0 1 clock normally low read on rising edge - 1 0 1 0 clock normally low read on falling edge - 2 1 0 1 clock normally high read on falling edge - 3 1 1 0 clock normally high read on rising edge - However, page 512 of the AT91SAM7Sx datasheet say "Note that in SPI - master mode the ATSAM7S512/256/128/64/321/32 does not sample the data - (MISO) on the opposite edge where data clocks out (MOSI) but the same - edge is used as shown in Figure 36-3 and Figure 36-4." Figure 36-3 - shows that CPOL=NCPHA=0 or CPOL=NCPHA=1 samples on the rising edge and - that the data changes sometime after the rising edge (about 2 ns). To - be consistent with normal SPI operation, it is probably safe to say - that the data changes on the falling edge and should be sampled on the - rising edge. Therefore, it appears that NCPHA should be treated the - same as CPHA. Thus: - Mode CPOL CPHA NCPHA - 0 0 0 0 clock normally low read on rising edge - 1 0 1 1 clock normally low read on falling edge - 2 1 0 0 clock normally high read on falling edge - 3 1 1 1 clock normally high read on rising edge - Update: for 24MHz, writing is more stable with ncpha=1, else bitflips occur. - */ - (ncpha << 1) | // Clock Phase data captured on leading edge, changes on following edge - (cpol << 0); // Clock Polarity inactive state is logic 0 - - // read first, empty buffer - if (AT91C_BASE_SPI->SPI_RDR == 0) {}; -} - -void FlashStop(void) { - //Bof - //* Reset all the Chip Select register - AT91C_BASE_SPI->SPI_CSR[0] = 0; - AT91C_BASE_SPI->SPI_CSR[1] = 0; - AT91C_BASE_SPI->SPI_CSR[2] = 0; - AT91C_BASE_SPI->SPI_CSR[3] = 0; - - // Reset the SPI mode - AT91C_BASE_SPI->SPI_MR = 0; - - // Disable all interrupts - AT91C_BASE_SPI->SPI_IDR = 0xFFFFFFFF; - - // SPI disable - AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIDIS; - - if (g_dbglevel > 3) Dbprintf("FlashStop"); - - StopTicks(); -} - -// send one byte over SPI -uint16_t FlashSendByte(uint32_t data) { - - // wait until SPI is ready for transfer - //if you are checking for incoming data returned then the TXEMPTY flag is redundant - //while ((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0) {}; - - // send the data - AT91C_BASE_SPI->SPI_TDR = data; - - //while ((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE) == 0){}; - - // wait receive transfer is complete - while ((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF) == 0) {}; - - // reading incoming data - return ((AT91C_BASE_SPI->SPI_RDR) & 0xFFFF); -} - -// send last byte over SPI -uint16_t FlashSendLastByte(uint32_t data) { - return FlashSendByte(data | AT91C_SPI_LASTXFER); -} - -// read state register 1 -uint8_t Flash_ReadStat1(void) { - FlashSendByte(READSTAT1); - return FlashSendLastByte(0xFF); -} - -bool Flash_CheckBusy(uint32_t timeout) { - WaitUS(WINBOND_WRITE_DELAY); - StartCountUS(); - uint32_t _time = GetCountUS(); - - if (g_dbglevel > 3) Dbprintf("Checkbusy in..."); - - do { - if (!(Flash_ReadStat1() & BUSY)) { - return false; - } - } while ((GetCountUS() - _time) < timeout); - - if (timeout <= (GetCountUS() - _time)) { - return true; - } - - return false; -} - // read ID out uint8_t Flash_ReadID(void) { @@ -250,28 +70,6 @@ uint8_t Flash_ReadID(void) { return 0; } -// read unique id for chip. -void Flash_UniqueID(uint8_t *uid) { - - if (Flash_CheckBusy(BUSY_TIMEOUT)) return; - - // reading unique serial number - FlashSendByte(UNIQUE_ID); - FlashSendByte(0xFF); - FlashSendByte(0xFF); - FlashSendByte(0xFF); - FlashSendByte(0xFF); - - uid[7] = FlashSendByte(0xFF); - uid[6] = FlashSendByte(0xFF); - uid[5] = FlashSendByte(0xFF); - uid[4] = FlashSendByte(0xFF); - uid[3] = FlashSendByte(0xFF); - uid[2] = FlashSendByte(0xFF); - uid[1] = FlashSendByte(0xFF); - uid[0] = FlashSendLastByte(0xFF); -} - uint16_t Flash_ReadData(uint32_t address, uint8_t *out, uint16_t len) { if (!FlashInit()) return 0; @@ -326,7 +124,6 @@ uint16_t Flash_ReadDataCont(uint32_t address, uint8_t *out, uint16_t len) { return len; } - //////////////////////////////////////// // Write data can only program one page. A page has 256 bytes. // if len > 256, it might wrap around and overwrite pos 0. @@ -372,7 +169,6 @@ uint16_t Flash_WriteData(uint32_t address, uint8_t *in, uint16_t len) { return len; } - // length should never be zero // Max 256 bytes write // out-of-range @@ -571,7 +367,7 @@ void Flashmem_print_status(void) { uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0}; Flash_UniqueID(uid); - Dbprintf(" Unique ID............... 0x%02X%02X%02X%02X%02X%02X%02X%02X", + Dbprintf( " Unique ID............... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X"), uid[7], uid[6], uid[5], uid[4], uid[3], uid[2], uid[1], uid[0] ); @@ -616,4 +412,217 @@ void Flashmem_print_info(void) { FlashStop(); } +#endif // #ifndef AS_BOOTROM + +// initialize +bool FlashInit(void) { + FlashSetup(FLASHMEM_SPIBAUDRATE); + + StartTicks(); + + if (Flash_CheckBusy(BUSY_TIMEOUT)) { + StopTicks(); + return false; + } + + return true; +} + +// read unique id for chip. +void Flash_UniqueID(uint8_t *uid) { + + if (Flash_CheckBusy(BUSY_TIMEOUT)) return; + + // reading unique serial number + FlashSendByte(UNIQUE_ID); + FlashSendByte(0xFF); + FlashSendByte(0xFF); + FlashSendByte(0xFF); + FlashSendByte(0xFF); + + uid[7] = FlashSendByte(0xFF); + uid[6] = FlashSendByte(0xFF); + uid[5] = FlashSendByte(0xFF); + uid[4] = FlashSendByte(0xFF); + uid[3] = FlashSendByte(0xFF); + uid[2] = FlashSendByte(0xFF); + uid[1] = FlashSendByte(0xFF); + uid[0] = FlashSendLastByte(0xFF); +} + +void FlashStop(void) { + //Bof + //* Reset all the Chip Select register + AT91C_BASE_SPI->SPI_CSR[0] = 0; + AT91C_BASE_SPI->SPI_CSR[1] = 0; + AT91C_BASE_SPI->SPI_CSR[2] = 0; + AT91C_BASE_SPI->SPI_CSR[3] = 0; + + // Reset the SPI mode + AT91C_BASE_SPI->SPI_MR = 0; + + // Disable all interrupts + AT91C_BASE_SPI->SPI_IDR = 0xFFFFFFFF; + + // SPI disable + AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIDIS; + +#ifndef AS_BOOTROM + if (g_dbglevel > 3) Dbprintf("FlashStop"); +#endif // AS_BOOTROM + + StopTicks(); +} + +void FlashSetup(uint32_t baudrate) { + //WDT_DISABLE + AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; + + // PA10 -> SPI_NCS2 chip select (FLASHMEM) + // PA11 -> SPI_NCS0 chip select (FPGA) + // PA12 -> SPI_MISO Master-In Slave-Out + // PA13 -> SPI_MOSI Master-Out Slave-In + // PA14 -> SPI_SPCK Serial Clock + + // Disable PIO control of the following pins, allows use by the SPI peripheral + AT91C_BASE_PIOA->PIO_PDR |= (GPIO_NCS0 | GPIO_MISO | GPIO_MOSI | GPIO_SPCK | GPIO_NCS2); + + // Pull-up Enable + AT91C_BASE_PIOA->PIO_PPUER |= (GPIO_NCS0 | GPIO_MISO | GPIO_MOSI | GPIO_SPCK | GPIO_NCS2); + + // Peripheral A + AT91C_BASE_PIOA->PIO_ASR |= (GPIO_NCS0 | GPIO_MISO | GPIO_MOSI | GPIO_SPCK); + + // Peripheral B + AT91C_BASE_PIOA->PIO_BSR |= GPIO_NCS2; + + //enable the SPI Peripheral clock + AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SPI); + + + //reset spi needs double SWRST, see atmel's errata on this case + AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SWRST; + AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SWRST; + + // Enable SPI + AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIEN; + + // NPCS2 Mode 0 + AT91C_BASE_SPI->SPI_MR = + (0 << 24) | // Delay between chip selects = DYLBCS/MCK BUT: + // If DLYBCS is less than or equal to six, six MCK periods + // will be inserted by default. + SPI_PCS(SPI_CSR_NUM) | // Peripheral Chip Select (selects SPI_NCS2 or PA10) + (0 << 7) | // Disable LLB (1=MOSI2MISO test mode) + (1 << 4) | // Disable ModeFault Protection + (0 << 3) | // makes spi operate at MCK (1 is MCK/2) + (0 << 2) | // Chip selects connected directly to peripheral + AT91C_SPI_PS_FIXED | // Fixed Peripheral Select + AT91C_SPI_MSTR; // Master Mode + + uint8_t csaat = 1; + uint32_t dlybct = 0; + uint8_t ncpha = 1; + uint8_t cpol = 0; + if (baudrate > FLASH_MINFAST) { + baudrate = FLASH_FASTBAUD; + //csaat = 0; + dlybct = 1500; + ncpha = 0; + cpol = 0; + } + + AT91C_BASE_SPI->SPI_CSR[2] = + SPI_DLYBCT(dlybct, MCK) | // Delay between Consecutive Transfers (32 MCK periods) + SPI_DLYBS(0, MCK) | // Delay Beforce SPCK CLock + SPI_SCBR(baudrate, MCK) | // SPI Baudrate Selection + AT91C_SPI_BITS_8 | // Bits per Transfer (8 bits) + //AT91C_SPI_CSAAT | // Chip Select inactive after transfer + // 40.4.6.2 SPI: Bad tx_ready Behavior when CSAAT = 1 and SCBR = 1 + // If the SPI is programmed with CSAAT = 1, SCBR(baudrate) = 1 and two transfers are performed consecutively on + // the same slave with an IDLE state between them, the tx_ready signal does not rise after the second data has been + // transferred in the shifter. This can imply for example, that the second data is sent twice. + // COLIN :: For now we STILL use CSAAT=1 to avoid having to (de)assert NPCS manually via PIO lines and we deal with delay + (csaat << 3) | + /* Spi modes: + Mode CPOL CPHA NCPHA + 0 0 0 1 clock normally low read on rising edge + 1 0 1 0 clock normally low read on falling edge + 2 1 0 1 clock normally high read on falling edge + 3 1 1 0 clock normally high read on rising edge + However, page 512 of the AT91SAM7Sx datasheet say "Note that in SPI + master mode the ATSAM7S512/256/128/64/321/32 does not sample the data + (MISO) on the opposite edge where data clocks out (MOSI) but the same + edge is used as shown in Figure 36-3 and Figure 36-4." Figure 36-3 + shows that CPOL=NCPHA=0 or CPOL=NCPHA=1 samples on the rising edge and + that the data changes sometime after the rising edge (about 2 ns). To + be consistent with normal SPI operation, it is probably safe to say + that the data changes on the falling edge and should be sampled on the + rising edge. Therefore, it appears that NCPHA should be treated the + same as CPHA. Thus: + Mode CPOL CPHA NCPHA + 0 0 0 0 clock normally low read on rising edge + 1 0 1 1 clock normally low read on falling edge + 2 1 0 0 clock normally high read on falling edge + 3 1 1 1 clock normally high read on rising edge + Update: for 24MHz, writing is more stable with ncpha=1, else bitflips occur. + */ + (ncpha << 1) | // Clock Phase data captured on leading edge, changes on following edge + (cpol << 0); // Clock Polarity inactive state is logic 0 + + // read first, empty buffer + if (AT91C_BASE_SPI->SPI_RDR == 0) {}; +} + +bool Flash_CheckBusy(uint32_t timeout) { + WaitUS(WINBOND_WRITE_DELAY); + StartCountUS(); + uint32_t _time = GetCountUS(); + +#ifndef AS_BOOTROM + if (g_dbglevel > 3) Dbprintf("Checkbusy in..."); +#endif // AS_BOOTROM + + do { + if (!(Flash_ReadStat1() & BUSY)) { + return false; + } + } while ((GetCountUS() - _time) < timeout); + + if (timeout <= (GetCountUS() - _time)) { + return true; + } + + return false; +} + +// read state register 1 +uint8_t Flash_ReadStat1(void) { + FlashSendByte(READSTAT1); + return FlashSendLastByte(0xFF); +} + +// send one byte over SPI +uint16_t FlashSendByte(uint32_t data) { + + // wait until SPI is ready for transfer + //if you are checking for incoming data returned then the TXEMPTY flag is redundant + //while ((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0) {}; + + // send the data + AT91C_BASE_SPI->SPI_TDR = data; + + //while ((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE) == 0){}; + + // wait receive transfer is complete + while ((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF) == 0) {}; + + // reading incoming data + return ((AT91C_BASE_SPI->SPI_RDR) & 0xFFFF); +} + +// send last byte over SPI +uint16_t FlashSendLastByte(uint32_t data) { + return FlashSendByte(data | AT91C_SPI_LASTXFER); +} diff --git a/armsrc/flashmem.h b/common_arm/flashmem.h similarity index 76% rename from armsrc/flashmem.h rename to common_arm/flashmem.h index 2b829c378..3578fa933 100644 --- a/armsrc/flashmem.h +++ b/common_arm/flashmem.h @@ -100,17 +100,67 @@ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// -void FlashmemSetSpiBaudrate(uint32_t baudrate); bool FlashInit(void); -void FlashSetup(uint32_t baudrate); +void Flash_UniqueID(uint8_t *uid); void FlashStop(void); -bool Flash_WaitIdle(void); + +void FlashSetup(uint32_t baudrate); +bool Flash_CheckBusy(uint32_t timeout); uint8_t Flash_ReadStat1(void); -uint8_t Flash_ReadStat2(void); uint16_t FlashSendByte(uint32_t data); +uint16_t FlashSendLastByte(uint32_t data); + + +#ifndef AS_BOOTROM + // Bootrom does not require these functions. + // Wrap in #ifndef to avoid accidental bloat of bootrom + // Bootrom needs only enough to get uniqueID from flash. + // It calls three functions. Full call trees listed: + // + // FlashInit() + // | + // \____ FlashSetup() + // | \____ leaf + // | + // \____ StartTicks() + // | \____ leaf + // | + // \____ Flash_CheckBusy() [*] + // | \____ WaitUS() + // | | \____ WaitTicks() + // | | \____ leaf + // | | + // | \____ StartCountUS() + // | | \____ leaf + // | | + // | \____ GetCountUS() + // | | \____ leaf + // | | + // | \____ Flash_ReadStat1() + // | \____ FlashSendByte() + // | | \____ leaf + // | | + // | \____ FlashSendLastByte() + // | \____ FlashSendByte() + // | \____ leaf + // | + // \____ StopTicks() + // \____ leaf + // + // Flash_UniqueID() + // \____ FlashCheckBusy() (see FlashInit) + // \____ FlashSendByteByte() (see FlashInit) + // \____ FlashSendByteLastByte() (see FlashInit) + // + // + // FlashStop() [*] + + + +void FlashmemSetSpiBaudrate(uint32_t baudrate); +bool Flash_WaitIdle(void); void Flash_TransferAdresse(uint32_t address); -bool Flash_CheckBusy(uint32_t timeout); void Flash_WriteEnable(void); bool Flash_WipeMemoryPage(uint8_t page); @@ -119,7 +169,6 @@ bool Flash_Erase4k(uint8_t block, uint8_t sector); //bool Flash_Erase32k(uint32_t address); bool Flash_Erase64k(uint8_t block); -void Flash_UniqueID(uint8_t *uid); uint8_t Flash_ReadID(void); uint16_t Flash_ReadData(uint32_t address, uint8_t *out, uint16_t len); uint16_t Flash_ReadDataCont(uint32_t address, uint8_t *out, uint16_t len); @@ -128,6 +177,8 @@ uint16_t Flash_WriteData(uint32_t address, uint8_t *in, uint16_t len); uint16_t Flash_WriteDataCont(uint32_t address, uint8_t *in, uint16_t len); void Flashmem_print_status(void); void Flashmem_print_info(void); -uint16_t FlashSendLastByte(uint32_t data); + +#endif // #ifndef AS_BOOTROM + #endif diff --git a/armsrc/ticks.c b/common_arm/ticks.c similarity index 99% rename from armsrc/ticks.c rename to common_arm/ticks.c index 3cf2c54dc..34c480061 100644 --- a/armsrc/ticks.c +++ b/common_arm/ticks.c @@ -19,9 +19,13 @@ #include "ticks.h" #include "proxmark3_arm.h" -#include "dbprint.h" +#ifndef AS_BOOTROM + #include "dbprint.h" +#endif +#ifndef AS_BOOTROM + // timer counts in 666ns increments (32/48MHz), rounding applies // WARNING: timer can't measure more than 43ms (666ns * 0xFFFF) void SpinDelayUsPrecision(int us) { @@ -117,40 +121,6 @@ uint32_t RAMFUNC GetTickCountDelta(uint32_t start_ticks) { return (UINT32_MAX - start_ticks) + stop_ticks; } -// ------------------------------------------------------------------------- -// microseconds timer -// ------------------------------------------------------------------------- -void StartCountUS(void) { - AT91C_BASE_PMC->PMC_PCER |= (1 << AT91C_ID_TC0) | (1 << AT91C_ID_TC1); - AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC0XC0S_NONE | AT91C_TCB_TC1XC1S_TIOA0 | AT91C_TCB_TC2XC2S_NONE; - - // fast clock - // tick=1.5mks - AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; // timer disable - AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV3_CLOCK | // MCK(48MHz) / 32 - AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_ACPA_CLEAR | - AT91C_TC_ACPC_SET | AT91C_TC_ASWTRG_SET; - AT91C_BASE_TC0->TC_RA = 1; - AT91C_BASE_TC0->TC_RC = 0xBFFF + 1; // 0xC000 - - AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; // timer disable - AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_XC1; // from timer 0 - - AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; - AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; - - // Assert a sync signal. This sets all timers to 0 on next active clock edge - AT91C_BASE_TCB->TCB_BCR = 1; - - while (AT91C_BASE_TC1->TC_CV > 0); -} - -uint32_t RAMFUNC GetCountUS(void) { - //return (AT91C_BASE_TC1->TC_CV * 0x8000) + ((AT91C_BASE_TC0->TC_CV / 15) * 10); - // By suggestion from PwPiwi, http://www.proxmark.org/forum/viewtopic.php?pid=17548#p17548 - return ((uint32_t)AT91C_BASE_TC1->TC_CV) * 0x8000 + (((uint32_t)AT91C_BASE_TC0->TC_CV) * 2) / 3; -} - // ------------------------------------------------------------------------- // Timer for iso14443 commands. Uses ssp_clk from FPGA // ------------------------------------------------------------------------- @@ -246,6 +216,47 @@ uint32_t RAMFUNC GetCountSspClkDelta(uint32_t start) { return (UINT32_MAX - start) + stop; } +void WaitMS(uint32_t ms) { + WaitTicks((ms & 0x1FFFFF) * 1500); +} + +#endif // #ifndef AS_BOOTROM + +// ------------------------------------------------------------------------- +// microseconds timer +// ------------------------------------------------------------------------- +void StartCountUS(void) { + AT91C_BASE_PMC->PMC_PCER |= (1 << AT91C_ID_TC0) | (1 << AT91C_ID_TC1); + AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC0XC0S_NONE | AT91C_TCB_TC1XC1S_TIOA0 | AT91C_TCB_TC2XC2S_NONE; + + // fast clock + // tick=1.5mks + AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; // timer disable + AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV3_CLOCK | // MCK(48MHz) / 32 + AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_ACPA_CLEAR | + AT91C_TC_ACPC_SET | AT91C_TC_ASWTRG_SET; + AT91C_BASE_TC0->TC_RA = 1; + AT91C_BASE_TC0->TC_RC = 0xBFFF + 1; // 0xC000 + + AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; // timer disable + AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_XC1; // from timer 0 + + AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; + AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; + + // Assert a sync signal. This sets all timers to 0 on next active clock edge + AT91C_BASE_TCB->TCB_BCR = 1; + + while (AT91C_BASE_TC1->TC_CV > 0); +} + +uint32_t RAMFUNC GetCountUS(void) { + //return (AT91C_BASE_TC1->TC_CV * 0x8000) + ((AT91C_BASE_TC0->TC_CV / 15) * 10); + // By suggestion from PwPiwi, http://www.proxmark.org/forum/viewtopic.php?pid=17548#p17548 + return ((uint32_t)AT91C_BASE_TC1->TC_CV) * 0x8000 + (((uint32_t)AT91C_BASE_TC0->TC_CV) * 2) / 3; +} + + // ------------------------------------------------------------------------- // Timer for bitbanging, or LF stuff when you need a very precis timer // 1us = 1.5ticks @@ -282,7 +293,6 @@ void StartTicks(void) { AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; while (AT91C_BASE_TC0->TC_CV > 0); } - uint32_t GetTicks(void) { uint32_t hi, lo; @@ -307,9 +317,6 @@ void WaitTicks(uint32_t ticks) { void WaitUS(uint32_t us) { WaitTicks((us & 0x3FFFFFFF) * 3 / 2); } -void WaitMS(uint32_t ms) { - WaitTicks((ms & 0x1FFFFF) * 1500); -} // stop clock void StopTicks(void) { diff --git a/armsrc/ticks.h b/common_arm/ticks.h similarity index 89% rename from armsrc/ticks.h rename to common_arm/ticks.h index 7ad4486fa..4a2276268 100644 --- a/armsrc/ticks.h +++ b/common_arm/ticks.h @@ -26,6 +26,19 @@ #define GET_TICKS GetTicks() #endif +void StartTicks(void); +uint32_t GetTicks(void); +void WaitUS(uint32_t us); +void WaitTicks(uint32_t ticks); +void StartCountUS(void); +uint32_t RAMFUNC GetCountUS(void); +void StopTicks(void); + + +#ifndef AS_BOOTROM ////////////////////////////////////////////////////////////// +// Bootrom does not require these functions. +// Wrap in #ifndef to avoid accidental bloat of bootrom + void SpinDelay(int ms); void SpinDelayUs(int us); void SpinDelayUsPrecision(int us); // precision 0.6us , running for 43ms before @@ -34,8 +47,6 @@ void StartTickCount(void); uint32_t RAMFUNC GetTickCount(void); uint32_t RAMFUNC GetTickCountDelta(uint32_t start_ticks); -void StartCountUS(void); -uint32_t RAMFUNC GetCountUS(void); void ResetUSClock(void); void SpinDelayCountUs(uint32_t us); @@ -44,12 +55,10 @@ void ResetSspClk(void); uint32_t RAMFUNC GetCountSspClk(void); uint32_t RAMFUNC GetCountSspClkDelta(uint32_t start); -void StartTicks(void); -uint32_t GetTicks(void); -void WaitTicks(uint32_t ticks); -void WaitUS(uint32_t us); void WaitMS(uint32_t ms); -void StopTicks(void); +#endif // #ifndef AS_BOOTROM + + #endif diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index f805d1797..82fc6d0e1 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -382,7 +382,6 @@ static const char StrSerialNumber[] = { // offset 18, length 32: 16x unicode chars (8-byte serial as hex characters) // ============================ // total: 50 bytes - #define USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH 50 char StrSerialNumber[] = { 14, // Length is initially identical to non-unique version ... The length updated at boot, if unique serial is available @@ -399,6 +398,7 @@ void usb_update_serial(uint64_t newSerialNumber) { } // run this only once per boot... even if it fails to find serial number configured = true; + // reject serial number if all-zero or all-ones if ((newSerialNumber == 0x0000000000000000) || (newSerialNumber == 0xFFFFFFFFFFFFFFFF)) { return; } @@ -407,10 +407,14 @@ void usb_update_serial(uint64_t newSerialNumber) { // Convert uniqueID's eight bytes to 16 unicode characters in the // descriptor and, finally, update the descriptor's length, which // causes the serial number to become visible. - for (uint8_t i = 0; i < 16; i++) { - uint8_t nibble = (uint8_t)((newSerialNumber >> (60 - (4*i))) & 0xFu); - char c = nibble < 10 ? '0' + nibble : 'A' + (nibble-10); - StrSerialNumber[18+(2*i)] = c; // [ 18, 20, 22, .., 46, 48 ] + for (uint8_t i = 0; i < 8; i++) { + // order of nibbles chosen to match display order from `hw status` + uint8_t nibble1 = (newSerialNumber >> ((8*i) + 4)) & 0xFu; // bitmasks [0xF0, 0xF000, 0xF00000, ... 0xF000000000000000] + uint8_t nibble2 = (newSerialNumber >> ((8*i) + 0)) & 0xFu; // bitmasks [0x0F, 0x0F00, 0x0F0000, ... 0x0F00000000000000] + char c1 = nibble1 < 10 ? '0' + nibble1 : 'A' + (nibble1-10); + char c2 = nibble2 < 10 ? '0' + nibble2 : 'A' + (nibble2-10); + StrSerialNumber[46-(4*i)] = c1; // [ 46, 42, .., 22, 18 ] + StrSerialNumber[48-(4*i)] = c2; // [ 48, 44, .., 24, 20 ] } StrSerialNumber[0] = USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH; } From 6eea476076ff0aad0eb2c2cb2a2058e9e35c92ee Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Fri, 17 Feb 2023 17:19:01 -0800 Subject: [PATCH 208/924] Add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 668e2c32c..e865190c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Enable unique USB serial numbers when built with `FLASH` -- **_UPDATES BOOTROM ALSO_** - Changed the readline package to v8.2 in the CMAKE files for the client (@iceman1001) - Add ICECLASS standalone read/sim mode (@natesales) - Added verbose flag to `hf iclass encode` (@natesales) From 48ca513a964d3d76b22f1207b37132f2e0863827 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Fri, 17 Feb 2023 17:27:07 -0800 Subject: [PATCH 209/924] updates from `make style` --- armsrc/appmain.c | 2 +- bootrom/bootrom.c | 2 +- client/src/cmdhficlass.c | 2 +- common_arm/flashmem.c | 2 +- common_arm/flashmem.h | 46 ---------------------------------------- common_arm/ticks.c | 2 +- common_arm/usb_cdc.c | 14 ++++++------ doc/commands.json | 9 ++++---- 8 files changed, 16 insertions(+), 63 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 90681c324..66d1380b5 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2684,7 +2684,7 @@ void __attribute__((noreturn)) AppMain(void) { if (FlashInit()) { uint64_t flash_uniqueID = 0; if (!Flash_CheckBusy(BUSY_TIMEOUT)) { // OK because firmware was built for devices with flash - Flash_UniqueID((uint8_t*)(&flash_uniqueID)); + Flash_UniqueID((uint8_t *)(&flash_uniqueID)); } FlashStop(); usb_update_serial(flash_uniqueID); diff --git a/bootrom/bootrom.c b/bootrom/bootrom.c index c94c23481..9ca0dc430 100644 --- a/bootrom/bootrom.c +++ b/bootrom/bootrom.c @@ -225,7 +225,7 @@ static void flash_mode(void) { #ifdef WITH_FLASH if (FlashInit()) { // checks for existence of flash also ... OK because bootrom was built for devices with flash uint64_t flash_uniqueID = 0; - Flash_UniqueID((uint8_t*)&flash_uniqueID); + Flash_UniqueID((uint8_t *)&flash_uniqueID); FlashStop(); usb_update_serial(flash_uniqueID); } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 84a6e563d..53bb483ec 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1407,7 +1407,7 @@ static int CmdHFiClassDecrypt(const char *Cmd) { case DES: case RFU: case None: - // Nothing to do for None anyway... + // Nothing to do for None anyway... default: continue; } diff --git a/common_arm/flashmem.c b/common_arm/flashmem.c index 0a60d43c0..a81576c5f 100644 --- a/common_arm/flashmem.c +++ b/common_arm/flashmem.c @@ -367,7 +367,7 @@ void Flashmem_print_status(void) { uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0}; Flash_UniqueID(uid); - Dbprintf( " Unique ID............... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X"), + Dbprintf(" Unique ID............... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X"), uid[7], uid[6], uid[5], uid[4], uid[3], uid[2], uid[1], uid[0] ); diff --git a/common_arm/flashmem.h b/common_arm/flashmem.h index 3578fa933..b2456ac76 100644 --- a/common_arm/flashmem.h +++ b/common_arm/flashmem.h @@ -112,56 +112,10 @@ uint16_t FlashSendLastByte(uint32_t data); #ifndef AS_BOOTROM - // Bootrom does not require these functions. - // Wrap in #ifndef to avoid accidental bloat of bootrom - // Bootrom needs only enough to get uniqueID from flash. - // It calls three functions. Full call trees listed: - // - // FlashInit() - // | - // \____ FlashSetup() - // | \____ leaf - // | - // \____ StartTicks() - // | \____ leaf - // | - // \____ Flash_CheckBusy() [*] - // | \____ WaitUS() - // | | \____ WaitTicks() - // | | \____ leaf - // | | - // | \____ StartCountUS() - // | | \____ leaf - // | | - // | \____ GetCountUS() - // | | \____ leaf - // | | - // | \____ Flash_ReadStat1() - // | \____ FlashSendByte() - // | | \____ leaf - // | | - // | \____ FlashSendLastByte() - // | \____ FlashSendByte() - // | \____ leaf - // | - // \____ StopTicks() - // \____ leaf - // - // Flash_UniqueID() - // \____ FlashCheckBusy() (see FlashInit) - // \____ FlashSendByteByte() (see FlashInit) - // \____ FlashSendByteLastByte() (see FlashInit) - // - // - // FlashStop() [*] - - - void FlashmemSetSpiBaudrate(uint32_t baudrate); bool Flash_WaitIdle(void); void Flash_TransferAdresse(uint32_t address); - void Flash_WriteEnable(void); bool Flash_WipeMemoryPage(uint8_t page); bool Flash_WipeMemory(void); diff --git a/common_arm/ticks.c b/common_arm/ticks.c index 34c480061..342aa3cab 100644 --- a/common_arm/ticks.c +++ b/common_arm/ticks.c @@ -20,7 +20,7 @@ #include "proxmark3_arm.h" #ifndef AS_BOOTROM - #include "dbprint.h" +#include "dbprint.h" #endif diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index 82fc6d0e1..8a17c4f89 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -405,16 +405,16 @@ void usb_update_serial(uint64_t newSerialNumber) { // Descriptor is, effectively, initially identical to non-unique serial // number because it reports the shorter length in the first byte. // Convert uniqueID's eight bytes to 16 unicode characters in the - // descriptor and, finally, update the descriptor's length, which + // descriptor and, finally, update the descriptor's length, which // causes the serial number to become visible. for (uint8_t i = 0; i < 8; i++) { // order of nibbles chosen to match display order from `hw status` - uint8_t nibble1 = (newSerialNumber >> ((8*i) + 4)) & 0xFu; // bitmasks [0xF0, 0xF000, 0xF00000, ... 0xF000000000000000] - uint8_t nibble2 = (newSerialNumber >> ((8*i) + 0)) & 0xFu; // bitmasks [0x0F, 0x0F00, 0x0F0000, ... 0x0F00000000000000] - char c1 = nibble1 < 10 ? '0' + nibble1 : 'A' + (nibble1-10); - char c2 = nibble2 < 10 ? '0' + nibble2 : 'A' + (nibble2-10); - StrSerialNumber[46-(4*i)] = c1; // [ 46, 42, .., 22, 18 ] - StrSerialNumber[48-(4*i)] = c2; // [ 48, 44, .., 24, 20 ] + uint8_t nibble1 = (newSerialNumber >> ((8 * i) + 4)) & 0xFu; // bitmasks [0xF0, 0xF000, 0xF00000, ... 0xF000000000000000] + uint8_t nibble2 = (newSerialNumber >> ((8 * i) + 0)) & 0xFu; // bitmasks [0x0F, 0x0F00, 0x0F0000, ... 0x0F00000000000000] + char c1 = nibble1 < 10 ? '0' + nibble1 : 'A' + (nibble1 - 10); + char c2 = nibble2 < 10 ? '0' + nibble2 : 'A' + (nibble2 - 10); + StrSerialNumber[46 - (4 * i)] = c1; // [ 46, 42, .., 22, 18 ] + StrSerialNumber[48 - (4 * i)] = c2; // [ 48, 44, .., 24, 20 ] } StrSerialNumber[0] = USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH; } diff --git a/doc/commands.json b/doc/commands.json index cb68d6069..b8e7be6be 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3099,10 +3099,9 @@ "--fc facility code", "--cn card number", "-w, --wiegand see `wiegand list` for available formats", - "--shallow use shallow (ASK) reader modulation instead of OOK", - "-v verbose (print encoded blocks)" + "--shallow use shallow (ASK) reader modulation instead of OOK" ], - "usage": "hf iclass encode [-hv] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" + "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" }, "hf iclass encrypt": { "command": "hf iclass encrypt", @@ -11507,7 +11506,7 @@ }, "script help": { "command": "script help", - "description": "This is a feature to run Lua/Cmd scripts. You can place scripts within the luascripts/cmdscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", + "description": "This is a feature to run Lua/Cmd/Python scripts. You can place scripts within the luascripts/cmdscripts/pyscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", "notes": [], "offline": true, "options": [], @@ -11904,6 +11903,6 @@ "metadata": { "commands_extracted": 749, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-02-11T10:42:29" + "extracted_on": "2023-02-18T01:26:44" } } \ No newline at end of file From cd554d67ab28aa79ccb439b6f7fd7a41c1677690 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 18 Feb 2023 15:01:39 +0100 Subject: [PATCH 210/924] if more than one device is connected the tr command does not split the line resulting in `pm3 --list` to fail. --- pm3 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pm3 b/pm3 index e418a3103..516bdbbfb 100755 --- a/pm3 +++ b/pm3 @@ -182,7 +182,8 @@ function get_pm3_list_WSL { PM3LIST=() # Normal SERIAL PORTS (COM) - for DEV in $($PSHEXE -command "Get-CimInstance -ClassName Win32_serialport | Where-Object {\$_.PNPDeviceID -like '*VID_9AC4&PID_4B8F*' -or \$_.PNPDeviceID -like '*VID_2D2D&PID_504D*'} | Select -expandproperty DeviceID" 2>/dev/null | tr -dc '[:print:]'); do + for DEV in $($PSHEXE -command "Get-CimInstance -ClassName Win32_serialport | Where-Object {\$_.PNPDeviceID -like '*VID_9AC4&PID_4B8F*' -or \$_.PNPDeviceID -like '*VID_2D2D&PID_504D*'} | Select -expandproperty DeviceID" 2>/dev/null); do + DEV=$(echo $DEV | tr -dc '[:print:]') _comport=$DEV DEV=$(echo $DEV | sed -nr 's#^COM([0-9]+)\b#/dev/ttyS\1#p') # ttyS counterpart takes some more time to appear From 08ff2698030f5194dfd4b976da1e1461e05fa26c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 18 Feb 2023 15:13:15 +0100 Subject: [PATCH 211/924] text --- pm3 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pm3 b/pm3 index 516bdbbfb..f92ce9bd7 100755 --- a/pm3 +++ b/pm3 @@ -255,7 +255,7 @@ Quick helper script for proxmark3 client when working with a Proxmark3 device Description: The usage is the same as for the proxmark3 client, with the following differences: * the correct port name will be automatically guessed; - * the script will wait for a Proxmark to be connected (same as option -w of the client). + * the script will wait for a Proxmark3 to be connected (same as option -w of the client). You can also specify a first option -n N to access the Nth Proxmark3 connected. To see a list of available ports, use --list. @@ -302,7 +302,7 @@ elif [ "$SCRIPT" = "pm3-flash" ]; then } HELP() { cat << EOF -Quick helper script for flashing a Proxmark device via USB +Quick helper script for flashing a Proxmark3 device via USB Description: The usage is similar to the old proxmark3-flasher binary, except that the correct port name will be automatically guessed. @@ -340,7 +340,7 @@ elif [ "$SCRIPT" = "pm3-flash-all" ]; then } HELP() { cat << EOF -Quick helper script for flashing a Proxmark device via USB +Quick helper script for flashing a Proxmark3 device via USB Description: The correct port name will be automatically guessed and the stock bootloader and firmware image will be flashed. @@ -370,7 +370,7 @@ elif [ "$SCRIPT" = "pm3-flash-fullimage" ]; then } HELP() { cat << EOF -Quick helper script for flashing a Proxmark device via USB +Quick helper script for flashing a Proxmark3 device via USB Description: The correct port name will be automatically guessed and the stock firmware image will be flashed. @@ -400,7 +400,7 @@ elif [ "$SCRIPT" = "pm3-flash-bootrom" ]; then } HELP() { cat << EOF -Quick helper script for flashing a Proxmark device via USB +Quick helper script for flashing a Proxmark3 device via USB Description: The correct port name will be automatically guessed and the stock bootloader will be flashed. @@ -459,7 +459,7 @@ if [ "$1" == "--list" ]; then SHOWLIST=true fi -# Number of the proxmark3 we're interested in +# Number of the Proxmark3 we're interested in N=1 if [ "$1" == "-n" ]; then shift @@ -518,7 +518,7 @@ if $SHOWLIST; then exit 0 fi -# Wait till we get at least N proxmark3 devices +# Wait till we get at least N Proxmark3 devices $GETPM3LIST "$N" if [ ${#PM3LIST} -lt "$N" ]; then echo >&2 "[=] Waiting for Proxmark3 to appear..." From b520f1ff5d67a1a792a97314f5d38ed8b8707141 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Sat, 18 Feb 2023 11:17:06 -0800 Subject: [PATCH 212/924] check daughterboard connection for SIM issues Signed-off-by: Henry Gabryjelski --- doc/md/Installation_Instructions/Troubleshooting.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index 710b2de26..59735da34 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -135,6 +135,8 @@ See [details here](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md) (RDV4 only) Make sure you've the latest SIM firmware according to the [configuration documentation](/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md#verify-sim-module-firmware-version). +Check that the SIM daughterboard is properly seated onto the mainboard. Pressure on the edges of the daughterboard could cause the connector to partially disconnect (especially good to check if problems began after installation of the bluetooth module, for example). + ## Troubles with t5577 commands or MFC/iClass/T55x7 dictionaries ^[Top](#top) From 229454963b1bd46d97ba5c927800fd0657782577 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Sat, 18 Feb 2023 12:16:50 -0800 Subject: [PATCH 213/924] standardize flash uniqueID to big-endian --- common_arm/flashmem.c | 54 +++++++++++++++++++++---------------------- common_arm/flashmem.h | 7 +++++- common_arm/usb_cdc.c | 4 ++-- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/common_arm/flashmem.c b/common_arm/flashmem.c index a81576c5f..eae8f3bef 100644 --- a/common_arm/flashmem.c +++ b/common_arm/flashmem.c @@ -49,9 +49,9 @@ void FlashmemSetSpiBaudrate(uint32_t baudrate) { } // read ID out -uint8_t Flash_ReadID(void) { +bool Flash_ReadID_90(flash_device_type_90_t* result) { - if (Flash_CheckBusy(BUSY_TIMEOUT)) return 0; + if (Flash_CheckBusy(BUSY_TIMEOUT)) return false; // Manufacture ID / device ID FlashSendByte(ID); @@ -59,15 +59,10 @@ uint8_t Flash_ReadID(void) { FlashSendByte(0x00); FlashSendByte(0x00); - uint8_t man_id = FlashSendByte(0xFF); - uint8_t dev_id = FlashSendLastByte(0xFF); + result->manufacturer_id = FlashSendByte(0xFF); + result->device_id = FlashSendLastByte(0xFF); - if (g_dbglevel > 3) Dbprintf("Flash ReadID | Man ID %02x | Device ID %02x", man_id, dev_id); - - if ((man_id == WINBOND_MANID) && (dev_id == WINBOND_DEVID)) - return dev_id; - - return 0; + return true; } uint16_t Flash_ReadData(uint32_t address, uint8_t *out, uint16_t len) { @@ -349,29 +344,32 @@ void Flashmem_print_status(void) { } DbpString(" Init.................... " _GREEN_("OK")); - uint8_t dev_id = Flash_ReadID(); - switch (dev_id) { - case 0x11 : - DbpString(" Memory size............. " _YELLOW_("2 mbits / 256 kb")); - break; - case 0x10 : - DbpString(" Memory size..... ....... " _YELLOW_("1 mbits / 128 kb")); - break; - case 0x05 : - DbpString(" Memory size............. " _YELLOW_("512 kbits / 64 kb")); - break; - default : - DbpString(" Device ID............... " _YELLOW_(" --> Unknown <--")); - break; + // NOTE: It would likely be more useful to use JDEC ID command 9F, + // as it provides a third byte indicative of capacity. + flash_device_type_90_t device_type = {0}; + if (!Flash_ReadID_90(&device_type)) { + DbpString(" Device ID............... " _RED_(" --> Not Found <--")); + } else { + if ((device_type.manufacturer_id == WINBOND_MANID) && (device_type.device_id == WINBOND_DEVID)) { + DbpString(" Memory size............. " _GREEN_("2 mbits / 256 kb")); + } else { + Dbprintf(" Device ID............... " _YELLOW_("%02X / %02X (unknown)"), + device_type.manufacturer_id, device_type.device_id ); + } } uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0}; Flash_UniqueID(uid); - Dbprintf(" Unique ID............... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X"), - uid[7], uid[6], uid[5], uid[4], - uid[3], uid[2], uid[1], uid[0] + Dbprintf(" Unique ID (be).......... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X" ), + uid[0], uid[1], uid[2], uid[3], + uid[4], uid[5], uid[6], uid[7] ); - + if (g_dbglevel > 3) { + Dbprintf(" Unique ID (le).......... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X" ), + uid[7], uid[6], uid[5], uid[4], + uid[3], uid[2], uid[1], uid[0] + ); + } FlashStop(); } diff --git a/common_arm/flashmem.h b/common_arm/flashmem.h index b2456ac76..72cc3e8b7 100644 --- a/common_arm/flashmem.h +++ b/common_arm/flashmem.h @@ -123,7 +123,12 @@ bool Flash_Erase4k(uint8_t block, uint8_t sector); //bool Flash_Erase32k(uint32_t address); bool Flash_Erase64k(uint8_t block); -uint8_t Flash_ReadID(void); +typedef struct { + uint8_t manufacturer_id; + uint8_t device_id; +} flash_device_type_90_t; // to differentiate from JDEC ID via cmd 9F +bool Flash_ReadID_90(flash_device_type_90_t* result); + uint16_t Flash_ReadData(uint32_t address, uint8_t *out, uint16_t len); uint16_t Flash_ReadDataCont(uint32_t address, uint8_t *out, uint16_t len); uint16_t Flash_Write(uint32_t address, uint8_t *in, uint16_t len); diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index 8a17c4f89..6e758c8aa 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -413,8 +413,8 @@ void usb_update_serial(uint64_t newSerialNumber) { uint8_t nibble2 = (newSerialNumber >> ((8 * i) + 0)) & 0xFu; // bitmasks [0x0F, 0x0F00, 0x0F0000, ... 0x0F00000000000000] char c1 = nibble1 < 10 ? '0' + nibble1 : 'A' + (nibble1 - 10); char c2 = nibble2 < 10 ? '0' + nibble2 : 'A' + (nibble2 - 10); - StrSerialNumber[46 - (4 * i)] = c1; // [ 46, 42, .., 22, 18 ] - StrSerialNumber[48 - (4 * i)] = c2; // [ 48, 44, .., 24, 20 ] + StrSerialNumber[18 + (4*i) + 0] = c1; // [ 18, 22, .., 42, 46 ] + StrSerialNumber[18 + (4*i) + 2] = c2; // [ 20, 24, .., 44, 48 ] } StrSerialNumber[0] = USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH; } From c531bd0f65576d560738d808ef08acf9402d6483 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Sat, 18 Feb 2023 12:20:43 -0800 Subject: [PATCH 214/924] make style updates --- common_arm/flashmem.c | 16 ++++++++-------- common_arm/flashmem.h | 2 +- common_arm/usb_cdc.c | 4 ++-- doc/commands.json | 7 ++++--- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/common_arm/flashmem.c b/common_arm/flashmem.c index eae8f3bef..5a115da1a 100644 --- a/common_arm/flashmem.c +++ b/common_arm/flashmem.c @@ -49,7 +49,7 @@ void FlashmemSetSpiBaudrate(uint32_t baudrate) { } // read ID out -bool Flash_ReadID_90(flash_device_type_90_t* result) { +bool Flash_ReadID_90(flash_device_type_90_t *result) { if (Flash_CheckBusy(BUSY_TIMEOUT)) return false; @@ -354,20 +354,20 @@ void Flashmem_print_status(void) { DbpString(" Memory size............. " _GREEN_("2 mbits / 256 kb")); } else { Dbprintf(" Device ID............... " _YELLOW_("%02X / %02X (unknown)"), - device_type.manufacturer_id, device_type.device_id ); + device_type.manufacturer_id, device_type.device_id); } } uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0}; Flash_UniqueID(uid); - Dbprintf(" Unique ID (be).......... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X" ), - uid[0], uid[1], uid[2], uid[3], - uid[4], uid[5], uid[6], uid[7] + Dbprintf(" Unique ID (be).......... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X"), + uid[0], uid[1], uid[2], uid[3], + uid[4], uid[5], uid[6], uid[7] ); if (g_dbglevel > 3) { - Dbprintf(" Unique ID (le).......... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X" ), - uid[7], uid[6], uid[5], uid[4], - uid[3], uid[2], uid[1], uid[0] + Dbprintf(" Unique ID (le).......... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X"), + uid[7], uid[6], uid[5], uid[4], + uid[3], uid[2], uid[1], uid[0] ); } FlashStop(); diff --git a/common_arm/flashmem.h b/common_arm/flashmem.h index 72cc3e8b7..f60b73c58 100644 --- a/common_arm/flashmem.h +++ b/common_arm/flashmem.h @@ -127,7 +127,7 @@ typedef struct { uint8_t manufacturer_id; uint8_t device_id; } flash_device_type_90_t; // to differentiate from JDEC ID via cmd 9F -bool Flash_ReadID_90(flash_device_type_90_t* result); +bool Flash_ReadID_90(flash_device_type_90_t *result); uint16_t Flash_ReadData(uint32_t address, uint8_t *out, uint16_t len); uint16_t Flash_ReadDataCont(uint32_t address, uint8_t *out, uint16_t len); diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index 6e758c8aa..cb2d0c64a 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -413,8 +413,8 @@ void usb_update_serial(uint64_t newSerialNumber) { uint8_t nibble2 = (newSerialNumber >> ((8 * i) + 0)) & 0xFu; // bitmasks [0x0F, 0x0F00, 0x0F0000, ... 0x0F00000000000000] char c1 = nibble1 < 10 ? '0' + nibble1 : 'A' + (nibble1 - 10); char c2 = nibble2 < 10 ? '0' + nibble2 : 'A' + (nibble2 - 10); - StrSerialNumber[18 + (4*i) + 0] = c1; // [ 18, 22, .., 42, 46 ] - StrSerialNumber[18 + (4*i) + 2] = c2; // [ 20, 24, .., 44, 48 ] + StrSerialNumber[18 + (4 * i) + 0] = c1; // [ 18, 22, .., 42, 46 ] + StrSerialNumber[18 + (4 * i) + 2] = c2; // [ 20, 24, .., 44, 48 ] } StrSerialNumber[0] = USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH; } diff --git a/doc/commands.json b/doc/commands.json index b8e7be6be..3b1ac6aca 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3099,9 +3099,10 @@ "--fc facility code", "--cn card number", "-w, --wiegand see `wiegand list` for available formats", - "--shallow use shallow (ASK) reader modulation instead of OOK" + "--shallow use shallow (ASK) reader modulation instead of OOK", + "-v verbose (print encoded blocks)" ], - "usage": "hf iclass encode [-h] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" + "usage": "hf iclass encode [-hv] [--bin ] --ki [--credit] [--elite] [--raw] [--enckey ] [--fc ] [--cn ] [-w ] [--shallow]" }, "hf iclass encrypt": { "command": "hf iclass encrypt", @@ -11903,6 +11904,6 @@ "metadata": { "commands_extracted": 749, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-02-18T01:26:44" + "extracted_on": "2023-02-18T20:20:19" } } \ No newline at end of file From 89ce0acf31b5765d48b4f9ee6712cb66fc115d02 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Sat, 18 Feb 2023 12:34:16 -0800 Subject: [PATCH 215/924] improve const correctness --- armsrc/cmd.c | 2 +- armsrc/cmd.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/cmd.c b/armsrc/cmd.c index 8857fc66f..c179ed2a9 100644 --- a/armsrc/cmd.c +++ b/armsrc/cmd.c @@ -131,7 +131,7 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, const uint8_t *data, return PM3_SUCCESS; } -int reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len) { +int reply_ng(uint16_t cmd, int16_t status, const uint8_t *data, size_t len) { return reply_ng_internal(cmd, status, data, len, true); } diff --git a/armsrc/cmd.h b/armsrc/cmd.h index 4a42d9898..b578db8e8 100644 --- a/armsrc/cmd.h +++ b/armsrc/cmd.h @@ -28,7 +28,7 @@ extern bool g_reply_via_fpc; extern bool g_reply_via_usb; int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len); -int reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len); +int reply_ng(uint16_t cmd, int16_t status, const uint8_t *data, size_t len); int reply_mix(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len); int receive_ng(PacketCommandNG *rx); From 28af1a870d36ab83e1d8904610bca46024f3a507 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Sat, 18 Feb 2023 12:50:05 -0800 Subject: [PATCH 216/924] Prevent buffer overflow in `AppendGraph()` --- client/src/graph.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/client/src/graph.c b/client/src/graph.c index 5914c8585..851e49d5a 100644 --- a/client/src/graph.c +++ b/client/src/graph.c @@ -29,21 +29,39 @@ int g_GraphBuffer[MAX_GRAPH_TRACE_LEN]; size_t g_GraphTraceLen; /* write a manchester bit to the graph -TODO, verfy that this doesn't overflow buffer (iceman) */ void AppendGraph(bool redraw, uint16_t clock, int bit) { - uint8_t half = clock / 2; + uint16_t half = clock / 2; + uint16_t end = clock; uint16_t i; + + // overflow/underflow safe checks ... Assumptions: + // _Assert(g_GraphTraceLen >= 0); + // _Assert(g_GraphTraceLen <= MAX_GRAPH_TRACE_LEN); + // If this occurs, allow partial rendering, up to the last sample... + if ((MAX_GRAPH_TRACE_LEN - g_GraphTraceLen) < half) { + PrintAndLogEx(DEBUG, "WARNING: AppendGraph() - Request exceeds max graph length"); + end = MAX_GRAPH_TRACE_LEN - g_GraphTraceLen; + half = end; + } + if ((MAX_GRAPH_TRACE_LEN - g_GraphTraceLen) < end) { + PrintAndLogEx(DEBUG, "WARNING: AppendGraph() - Request exceeds max graph length"); + end = MAX_GRAPH_TRACE_LEN - g_GraphTraceLen; + } + //set first half the clock bit (all 1's or 0's for a 0 or 1 bit) - for (i = 0; i < half; ++i) + for (i = 0; i < half; ++i) { g_GraphBuffer[g_GraphTraceLen++] = bit; + } //set second half of the clock bit (all 0's or 1's for a 0 or 1 bit) - for (; i < clock; ++i) + for (; i < end; ++i) { g_GraphBuffer[g_GraphTraceLen++] = bit ^ 1; + } - if (redraw) + if (redraw) { RepaintGraphWindow(); + } } // clear out our graph window From 475bbe183d3f7c694813ceed320cd3ebda4bdaf5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 18 Feb 2023 22:02:20 +0100 Subject: [PATCH 217/924] some generic devices has other sizes of flash --- common_arm/flashmem.c | 24 +++++++++++++++++------- common_arm/flashmem.h | 7 +++++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/common_arm/flashmem.c b/common_arm/flashmem.c index 5a115da1a..435f51a57 100644 --- a/common_arm/flashmem.c +++ b/common_arm/flashmem.c @@ -350,11 +350,25 @@ void Flashmem_print_status(void) { if (!Flash_ReadID_90(&device_type)) { DbpString(" Device ID............... " _RED_(" --> Not Found <--")); } else { - if ((device_type.manufacturer_id == WINBOND_MANID) && (device_type.device_id == WINBOND_DEVID)) { - DbpString(" Memory size............. " _GREEN_("2 mbits / 256 kb")); + if (device_type.manufacturer_id == WINBOND_MANID) { + switch (device_type.device_id) { + case WINBOND_2MB_DEVID: + DbpString(" Memory size............. " _YELLOW_("2 mbits / 256 kb")); + break; + case WINBOND_1MB_DEVID: + DbpString(" Memory size..... ....... " _YELLOW_("1 mbits / 128 kb")); + break; + case WINBOND_512KB_DEVID: + DbpString(" Memory size............. " _YELLOW_("512 kbits / 64 kb")); + break; + default: + break; + } } else { Dbprintf(" Device ID............... " _YELLOW_("%02X / %02X (unknown)"), - device_type.manufacturer_id, device_type.device_id); + device_type.manufacturer_id, + device_type.device_id + ); } } @@ -578,10 +592,6 @@ bool Flash_CheckBusy(uint32_t timeout) { StartCountUS(); uint32_t _time = GetCountUS(); -#ifndef AS_BOOTROM - if (g_dbglevel > 3) Dbprintf("Checkbusy in..."); -#endif // AS_BOOTROM - do { if (!(Flash_ReadStat1() & BUSY)) { return false; diff --git a/common_arm/flashmem.h b/common_arm/flashmem.h index f60b73c58..f23a2786d 100644 --- a/common_arm/flashmem.h +++ b/common_arm/flashmem.h @@ -54,8 +54,11 @@ // Flash busy timeout: 20ms is the strict minimum when writing 256kb #define BUSY_TIMEOUT 200000L -#define WINBOND_MANID 0xEF -#define WINBOND_DEVID 0x11 +#define WINBOND_MANID 0xEF +#define WINBOND_2MB_DEVID 0x11 +#define WINBOND_1MB_DEVID 0x10 +#define WINBOND_512KB_DEVID 0x05 + #define PAGESIZE 0x100 #define WINBOND_WRITE_DELAY 0x02 From 029d5aa3584c49fd767a5df70e6d88a5c9a710ae Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 18 Feb 2023 22:51:44 +0100 Subject: [PATCH 218/924] fix cid #404827 - resource leak --- client/src/cmdlfem4x70.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdlfem4x70.c b/client/src/cmdlfem4x70.c index e90c688c1..d7bc3811a 100644 --- a/client/src/cmdlfem4x70.c +++ b/client/src/cmdlfem4x70.c @@ -252,6 +252,7 @@ int CmdEM4x70Brute(const char *Cmd) { int addr = arg_get_int_def(ctx, 2, 0); if (addr < 7 || addr > 9) { PrintAndLogEx(FAILED, "block has to be within range [7, 9] got: %d", addr); + CLIParserFree(ctx); return PM3_EINVARG; } etd.address = (uint8_t) addr; @@ -265,8 +266,8 @@ int CmdEM4x70Brute(const char *Cmd) { uint32_t start_key = 0; int res = arg_get_u32_hexstr_def_nlen(ctx, 5, 0, &start_key, 2, true); if (res == 2) { - CLIParserFree(ctx); PrintAndLogEx(WARNING, "start key parameter must be in range [0, FFFF]"); + CLIParserFree(ctx); return PM3_EINVARG; } etd.start_key = start_key; From 3399cbd4f01d392ab1d5ae86ccd1779c1b9e27e0 Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Sat, 18 Feb 2023 23:48:32 -0600 Subject: [PATCH 219/924] support for NTAG213TT tamper feature --- client/src/cmdhfmfu.c | 298 +++++++++++++++++++++++++++++++- client/src/cmdhfmfu.h | 1 + client/src/pm3line_vocabulory.h | 1 + include/protocols.h | 3 + 4 files changed, 299 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index a59859394..f28c76369 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -392,6 +392,12 @@ static int ul_auth_select(iso14a_card_select_t *card, TagTypeUL_t tagtype, bool return PM3_SUCCESS; } +static int ntagtt_getTamperStatus(uint8_t *response, uint16_t responseLength) { + uint8_t cmd[] = {NTAGTT_CMD_READ_TT, 0x00}; + int len = ul_send_cmd_raw(cmd, sizeof(cmd), response, responseLength); + return len; +} + static int ulev1_getVersion(uint8_t *response, uint16_t responseLength) { uint8_t cmd[] = {MIFARE_ULEV1_VERSION}; int len = ul_send_cmd_raw(cmd, sizeof(cmd), response, responseLength); @@ -748,8 +754,80 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st PrintAndLogEx(INFO, " cfg0 [%u/0x%02X]: %s", startPage, startPage, sprint_hex(data, 4)); - if ((tagtype & (NTAG_213_F | NTAG_213_TT | NTAG_216_F))) { - uint8_t mirror_conf = (data[0] & 0xC0); + //NTAG213TT has different ASCII mirroring options and config bytes interpretation from other ulev1 class tags + if (tagtype & NTAG_213_TT) { + uint8_t mirror_conf = ((data[0] & 0xE0) >> 5); + uint8_t mirror_byte = ((data[0] & 0x18) >> 3); + uint8_t tt_msg_lock = (data[1] & 0x04); + uint8_t mirror_page = data[2]; + + switch (mirror_conf) { + case 0: + PrintAndLogEx(INFO, " - no ASCII mirror"); + break; + case 1: + PrintAndLogEx(INFO, " - UID ASCII mirror"); + break; + case 2: + PrintAndLogEx(INFO, " - NFC counter ASCII mirror"); + break; + case 3: + PrintAndLogEx(INFO, " - UID and NFC counter ASCII mirror"); + break; + case 4: + PrintAndLogEx(INFO, " - tag tamper ASCII mirror"); + break; + case 5: + PrintAndLogEx(INFO, " - UID and tag tamper ASCII mirror"); + break; + case 6: + PrintAndLogEx(INFO, " - NFC counter and tag tamper ASCII mirror"); + break; + case 7: + PrintAndLogEx(INFO, " - UID, NFC counter, and tag tamper ASCII mirror"); + break; + default: + break; + } + + if(mirror_conf) { + uint8_t mirror_user_mem_start_byte = (4*(mirror_page-4)) + mirror_byte; + uint8_t bytes_required_for_mirror_data = 0; + + switch (mirror_conf) { + case 1: + bytes_required_for_mirror_data = 14; + break; + case 2: + bytes_required_for_mirror_data = 6; + break; + case 3: + bytes_required_for_mirror_data = 8; + break; + case 4: + bytes_required_for_mirror_data = 21; + break; + case 5: + bytes_required_for_mirror_data = 23; + break; + case 6: + bytes_required_for_mirror_data = 15; + break; + case 7: + bytes_required_for_mirror_data = 30; + break; + default: + break; + } + PrintAndLogEx(INFO, " mirror start page %02X | byte pos %02X - %s", mirror_page, mirror_byte, (mirror_page >= 0x4 && ((mirror_user_mem_start_byte + bytes_required_for_mirror_data) <= 144)) ? _GREEN_("OK") : _YELLOW_("Invalid value")); + } + + if(tt_msg_lock) { + PrintAndLogEx(INFO, " - tag tamper message is permanently locked"); + } + + } else if (tagtype & (NTAG_213_F | NTAG_216_F)) { + uint8_t mirror_conf = ((data[0] & 0xC0) >> 6); uint8_t mirror_byte = (data[0] & 0x30); bool sleep_en = (data[0] & 0x08); strg_mod_en = (data[0] & 0x04); @@ -791,7 +869,7 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st break; } // valid mirror start page and byte position within start page. - if ((tagtype & NTAG_213_F) || (tagtype & NTAG_213_TT)) { + if (tagtype & NTAG_213_F) { switch (mirror_conf) { case 1: { PrintAndLogEx(INFO, " mirror start block %02X | byte pos %02X - %s", data[2], mirror_byte, (data[2] >= 0x4 && data[2] <= 0x24) ? "OK" : "Invalid value"); break;} @@ -822,6 +900,35 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st else PrintAndLogEx(INFO, " - pages don't need authentication"); + uint8_t tt_enabled = 0; + uint8_t tt_message[4] = {0x00}; + uint8_t tt_msg_resp_len; + uint8_t tt_status_resp[5] = {0x00}; + + if(tagtype & NTAG_213_TT) { + tt_enabled = (data[1] & 0x02); + tt_msg_resp_len = ul_read(45, tt_message, 4); + + PrintAndLogEx(INFO, " - tamper detection is %s" + , (tt_enabled) ? _GREEN_("ENABLED") : "disabled" + ); + + switch (data[1] & 0x06) { + case 0x00: + PrintAndLogEx(INFO, " - tamper message is unlocked and read/write enabled"); + break; + case 0x02: + PrintAndLogEx(INFO, " - tamper message is reversibly read/write protected in memory while the tamper feature is enabled"); + break; + case 0x04: + case 0x06: + PrintAndLogEx(INFO, " - tamper message is permanently read/write protected in memory"); + break; + default: + break; + } + } + PrintAndLogEx(INFO, " cfg1 [%u/0x%02X]: %s", startPage + 1, startPage + 1, sprint_hex(data + 4, 4)); if (authlim == 0) PrintAndLogEx(INFO, " - " _GREEN_("Unlimited password attempts")); @@ -837,6 +944,54 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st PrintAndLogEx(INFO, " PWD [%u/0x%02X]: %s- (cannot be read)", startPage + 2, startPage + 2, sprint_hex(data + 8, 4)); PrintAndLogEx(INFO, " PACK [%u/0x%02X]: %s - (cannot be read)", startPage + 3, startPage + 3, sprint_hex(data + 12, 2)); PrintAndLogEx(INFO, " RFU [%u/0x%02X]: %s- (cannot be read)", startPage + 3, startPage + 3, sprint_hex(data + 14, 2)); + + if(tagtype & NTAG_213_TT) { + if(data[1] & 0x06) { + PrintAndLogEx(INFO, "TT_MSG [45/0x2D]: %s- (cannot be read)", sprint_hex(tt_message, tt_msg_resp_len)); + PrintAndLogEx(INFO, " - tamper message is masked in memory"); + } else { + PrintAndLogEx(INFO, "TT_MSG [45/0x2D]: %s", sprint_hex(tt_message, tt_msg_resp_len)); + PrintAndLogEx(INFO, " - tamper message is %s", sprint_hex(tt_message, tt_msg_resp_len)); + } + } + + if ((tagtype & NTAG_213_TT) && tt_enabled) { //The tag only returns meaningful information for the fields below if the tamper feature is enabled + + uint8_t tt_status_len = ntagtt_getTamperStatus(tt_status_resp, 5); + + if(tt_status_len != 5) { + PrintAndLogEx(WARNING, "Error requesting tamper status from tag\n"); + return PM3_ESOFT; + } + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "--- " _CYAN_("Tamper Status")); + PrintAndLogEx(INFO, " READ_TT_STATUS: %s", sprint_hex(tt_status_resp, 5)); + + PrintAndLogEx(INFO, " Tamper detection result from this power-up:"); + switch(tt_status_resp[4]) { + case 0x43: + PrintAndLogEx(INFO, " - Tamper wire was detcted as closed during this power-up"); + break; + case 0x4F: + PrintAndLogEx(INFO, " - Tamper wire was detected as open during this power-up"); + break; + case 0x49: + PrintAndLogEx(INFO, " - No tamper wire measurement from this power-up is available"); + break; + default: + break; + } + + PrintAndLogEx(INFO, " Tamper detection permanent memory:"); + if((tt_status_resp[0] | tt_status_resp [1] | tt_status_resp[2] | tt_status_resp[3]) == 0x00) + + PrintAndLogEx(INFO, " - Tamper wire has never been detected as open during power-up"); + else { + PrintAndLogEx(INFO, " - Tamper wire has previously been detected as open during power-up"); + PrintAndLogEx(INFO, " - Tamper message: %s", sprint_hex(tt_status_resp, 4)); + } + } return PM3_SUCCESS; } @@ -1757,7 +1912,6 @@ static int CmdHF14AMfUInfo(const char *Cmd) { uint8_t startconfigblock = 0; uint8_t ulev1_conf[16] = {0x00}; - // config blocks always are last 4 pages for (uint8_t i = 0; i < ARRAYLEN(UL_TYPES_ARRAY); i++) { if (tagtype & UL_TYPES_ARRAY[i]) { startconfigblock = UL_MEMORY_ARRAY[i] - 3; @@ -2529,6 +2683,141 @@ static void wait4response(uint8_t b) { } } +// +//Configure tamper feature of NTAG 213TT +// +int CmdHF14MfUTamper(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfu tamper", + "Set the congiguration of the NTAG 213TT tamper feature\n" + "Supports:\n" + "NTAG 213TT\n", + "hf mfu tamper -e -> enable tamper feature\n" + "hf mfu tamper -d -> disable tamper feature\n" + "hf mfu tamper -m 0A0A0A0A -> set the tamper message to 0A0A0A0A\n" + "hf mfu tamper --lockmessage -> permanently lock the tamper message and mask it from memory\n" + ); + + void *argtable[] = { + arg_param_begin, + arg_lit0("e", "enable", "Enable the tamper feature"), + arg_lit0("d", "disable", "Disable the tamper feature"), + arg_str0("m", "message", "", "Set the tamper message (4 bytes)"), + arg_lit0(NULL, "lockmessage", "Permanently lock the tamper message and mask it from memory (does not lock tamper feature itself)"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + int tt_cfg_page = 41; + int tt_msg_page = 45; + int msg_len = 0; + uint8_t msg_data[4] = {0x00}; + CLIGetHexWithReturn(ctx, 3, msg_data, &msg_len); + bool use_msg = (msg_len > 0); + + if(use_msg && msg_len != 4) { + PrintAndLogEx(WARNING, "The tamper message must be 4 hex bytes if provided"); + DropField(); + return PM3_ESOFT; + } + + bool lock_msg = arg_get_lit(ctx, 4); + bool enable = arg_get_lit(ctx, 1); + bool disable = arg_get_lit(ctx, 2); + + TagTypeUL_t tagtype = GetHF14AMfU_Type(); + if (tagtype == UL_ERROR) { + PrintAndLogEx(WARNING, "Tag type not detected"); + DropField(); + return PM3_ESOFT; + } + if(tagtype != NTAG_213_TT) { + PrintAndLogEx(WARNING, "Tag type not NTAG 213TT"); + DropField(); + return PM3_ESOFT; + } + + DropField(); + iso14a_card_select_t card; + + if(enable && disable) { + PrintAndLogEx(WARNING, "You can only select one of the options enable/disable tamper feature"); + DropField(); + return PM3_ESOFT; + } + + if(use_msg) + { + if (ul_select(&card) == false) { + DropField(); + return UL_ERROR; + } + PrintAndLogEx(INFO, "Trying to write tamper message\n"); + SendCommandMIX(CMD_HF_MIFAREU_WRITEBL, tt_msg_page, 0, 0, msg_data, 4); + + PacketResponseNG resp; + + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { + uint8_t isOK = resp.oldarg[0] & 0xff; + if (!isOK) + PrintAndLogEx(WARNING, "Failed to write tamper message"); + else + PrintAndLogEx(SUCCESS, "Tamper message written successfully"); + } else { + PrintAndLogEx(WARNING, "Command execute timeout"); + } + } + + if(enable | disable | lock_msg) { + + if (ul_select(&card) == false) { + PrintAndLogEx(ERR, "Unable to select tag"); + DropField(); + return UL_ERROR; + } + + uint8_t cfg_page[4] = {0x00}; + uint8_t cmd[] = {ISO14443A_CMD_READBLOCK, tt_cfg_page}; + int status = ul_send_cmd_raw(cmd, sizeof(cmd), cfg_page, 4); + DropField(); + + if(status <= 0) { + PrintAndLogEx(WARNING, "Problem reading current config from tag"); + DropField(); + return PM3_ESOFT; + } + + if(enable) { + cfg_page[1] = cfg_page[1] | 0x02; + PrintAndLogEx(INFO, "Enabling tamper feature"); + } + if(disable) { + cfg_page[1] = cfg_page[1] & 0xFD; + PrintAndLogEx(INFO, "Disabling tamper feature"); + } + if(lock_msg) { + cfg_page[1] = cfg_page[1] | 0x04; + PrintAndLogEx(INFO, "Locking tamper message"); + } + + SendCommandMIX(CMD_HF_MIFAREU_WRITEBL, tt_cfg_page, 0, 0, cfg_page, 4); + PacketResponseNG resp; + + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { + uint8_t isOK = resp.oldarg[0] & 0xff; + if (!isOK) + PrintAndLogEx(WARNING, "Failed to write tamper configuration"); + else + PrintAndLogEx(SUCCESS, "Tamper configuration written successfully"); + } else { + PrintAndLogEx(WARNING, "Command execute timeout"); + } + } + + DropField(); + return PM3_SUCCESS; +} + // // Restore dump file onto tag // @@ -4406,6 +4695,7 @@ static command_t CommandTable[] = { {"restore", CmdHF14AMfURestore, IfPm3Iso14443a, "Restore a dump onto a MFU MAGIC tag"}, {"view", CmdHF14AMfuView, AlwaysAvailable, "Display content from tag dump file"}, {"wrbl", CmdHF14AMfUWrBl, IfPm3Iso14443a, "Write block"}, + {"tamper", CmdHF14MfUTamper, IfPm3Iso14443a, "Cofigure the tamper feature on an NTAG 213TT"}, {"---------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("simulation") " -----------------------"}, {"eload", CmdHF14AMfUeLoad, IfPm3Iso14443a, "Load Ultralight dump file into emulator memory"}, {"esave", CmdHF14AMfuESave, IfPm3Iso14443a, "Save Ultralight dump file from emulator memory"}, diff --git a/client/src/cmdhfmfu.h b/client/src/cmdhfmfu.h index 568e3c4a9..1ed652e79 100644 --- a/client/src/cmdhfmfu.h +++ b/client/src/cmdhfmfu.h @@ -50,6 +50,7 @@ int trace_mfuc_try_default_3des_keys(uint8_t **correct_key, int state, uint8_t ( int CmdHFMFUltra(const char *Cmd); int CmdHF14MfuNDEFRead(const char *Cmd); +int CmdHF14MfUTamper(const char *Cmd); uint16_t ul_ev1_packgen_VCNEW(uint8_t *uid, uint32_t pwd); uint32_t ul_ev1_otpgenA(uint8_t *uid); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index a0e386270..8e775bd3e 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -384,6 +384,7 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mfu rdbl" }, { 0, "hf mfu restore" }, { 1, "hf mfu view" }, + { 0, "hf mfu tamper" }, { 0, "hf mfu wrbl" }, { 0, "hf mfu eload" }, { 0, "hf mfu esave" }, diff --git a/include/protocols.h b/include/protocols.h index 1417fa71a..e4437d90a 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -223,6 +223,9 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define NTAG_I2C_SELECT_SECTOR 0xC2 #define NTAG_I2C_FASTWRITE 0xA6 +//NTAG 213TT (tamper) command +#define NTAGTT_CMD_READ_TT 0xA4 + // mifare 4bit card answers #define CARD_ACK 0x0A // 1010 - ACK #define CARD_NACK_IV 0x00 // 0000 - NACK, invalid argument (invalid page address) From cf6b2d95971de1894c6d116000c0441fdfc8a618 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 19 Feb 2023 08:07:32 +0100 Subject: [PATCH 220/924] fix WSL2 detection route. some linux distro spells with small letters --- pm3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm3 b/pm3 index f92ce9bd7..79ea38768 100755 --- a/pm3 +++ b/pm3 @@ -474,7 +474,7 @@ fi HOSTOS=$(uname | awk '{print toupper($0)}') if [ "$HOSTOS" = "LINUX" ]; then - if uname -a|grep -q Microsoft; then + if uname -a|grep -qi Microsoft; then # First try finding it using the PATH environment variable PSHEXE=$(command -v powershell.exe 2>/dev/null) From e5adfb0b29d9149bb3173441f81346c196480464 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 19 Feb 2023 08:17:05 +0100 Subject: [PATCH 221/924] text --- CHANGELOG.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e865190c1..d2f5c1dc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,15 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Enable unique USB serial numbers when built with `FLASH` -- **_UPDATES BOOTROM ALSO_** + - Fixed `pm3` script to correctly identify WSL enabled distros (@henrygab) + - Changed device enumeration with "unique USB serial numbers when built with `FLASH` -- **_UPDATES BOOTROM ALSO_**" (@henrygab) - Changed the readline package to v8.2 in the CMAKE files for the client (@iceman1001) + - Fixed `pm3` script for passing arguments (@doegox) + - Fixed python paths to include current directory (@jmichelp) + - Fixed infinite loops in spindelayus (@lnv42) - Add ICECLASS standalone read/sim mode (@natesales) - - Added verbose flag to `hf iclass encode` (@natesales) + - Changed `hf iclass encode` - added verbose flag (@natesales) + - Changed `hf waveshare` - now identify 1.54 nfc epaper correct (@ah01) - Fixed `Makefile` regression that broke `make install` (@henrygab) - Fixed `lf em 4x70 brute` - now works as expected (@adite) - Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906) @@ -14,8 +19,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added documentation for usage of Proxmark3 under WSL2 (@henrygab) - Fixed device permissions via updated `udev` rules (@henrygab) - Added `--back` option to `clear` command to clear the scrollback buffer (@wh201906) - - Mark credentials as decrypted in the dump generated by `hf iclass decrypt` - - Show credentials when using `hf iclass view` on a decrypted dump + - Changed `hf iclass decrypt` - mark credentials as decrypted in the dump (@natesales) + - Changed `hf iclass view` - show credentials on a decrypted dump (@natesales) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) From fe98b3821fe2df28ae0081df05041cb59e9cd14c Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Sat, 18 Feb 2023 23:48:08 -0800 Subject: [PATCH 222/924] Prevent double-enumeration under WSL2 --- pm3 | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pm3 b/pm3 index 79ea38768..a3df5717b 100755 --- a/pm3 +++ b/pm3 @@ -68,11 +68,12 @@ function get_pm3_list_Linux { fi fi # WSL2 with usbipd detection - doesn't report same things as WSL1 - if grep -q "proxmark.org" "/sys/class/tty/${DEV#/dev/}/../../../manufacturer" 2>/dev/null; then - PM3LIST+=("$DEV") - if [ ${#PM3LIST[*]} -ge "$N" ]; then - return + if !( echo "${PM3LIST[*]}" | grep -q "${DEV}" ); then + PM3LIST+=("$DEV") + if [ ${#PM3LIST[*]} -ge "$N" ]; then + return + fi fi fi done @@ -474,7 +475,7 @@ fi HOSTOS=$(uname | awk '{print toupper($0)}') if [ "$HOSTOS" = "LINUX" ]; then - if uname -a|grep -qi Microsoft; then + if uname -a|grep -q Microsoft; then # First try finding it using the PATH environment variable PSHEXE=$(command -v powershell.exe 2>/dev/null) From ce85fe0099ef2e1b72e236de8761a44b3d813b60 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Sun, 19 Feb 2023 01:44:15 -0800 Subject: [PATCH 223/924] allow case-insensitive match of WSL strings --- pm3 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pm3 b/pm3 index a3df5717b..7c1d0e289 100755 --- a/pm3 +++ b/pm3 @@ -69,7 +69,7 @@ function get_pm3_list_Linux { fi # WSL2 with usbipd detection - doesn't report same things as WSL1 if grep -q "proxmark.org" "/sys/class/tty/${DEV#/dev/}/../../../manufacturer" 2>/dev/null; then - if !( echo "${PM3LIST[*]}" | grep -q "${DEV}" ); then + if echo "${PM3LIST[*]}" | grep -qv "${DEV}"; then PM3LIST+=("$DEV") if [ ${#PM3LIST[*]} -ge "$N" ]; then return @@ -475,7 +475,8 @@ fi HOSTOS=$(uname | awk '{print toupper($0)}') if [ "$HOSTOS" = "LINUX" ]; then - if uname -a|grep -q Microsoft; then + # Detect when running under WSL1 (but exclude WSL2) + if uname -a | grep -qi Microsoft && uname -a | grep -qvi WSL2; then # First try finding it using the PATH environment variable PSHEXE=$(command -v powershell.exe 2>/dev/null) From 147475ab4056c249b800a782c3bc9f0ed47cb8f8 Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Mon, 20 Feb 2023 00:34:06 -0600 Subject: [PATCH 224/924] CHANGELOG.md and text changes --- CHANGELOG.md | 1 + client/src/cmdhfmfu.c | 136 +++++++++++++++++++++--------------------- include/protocols.h | 2 +- 3 files changed, 70 insertions(+), 69 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e865190c1..7c5527897 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added `--back` option to `clear` command to clear the scrollback buffer (@wh201906) - Mark credentials as decrypted in the dump generated by `hf iclass decrypt` - Show credentials when using `hf iclass view` on a decrypted dump + - Show NTAG213TT tamper info in `hf mfu info` and add commands for configuring it's tamper feature (@mjaksn) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index f28c76369..31823adeb 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -758,7 +758,7 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st if (tagtype & NTAG_213_TT) { uint8_t mirror_conf = ((data[0] & 0xE0) >> 5); uint8_t mirror_byte = ((data[0] & 0x18) >> 3); - uint8_t tt_msg_lock = (data[1] & 0x04); + uint8_t tt_msg_lock = (data[1] & 0x04); uint8_t mirror_page = data[2]; switch (mirror_conf) { @@ -790,41 +790,41 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st break; } - if(mirror_conf) { - uint8_t mirror_user_mem_start_byte = (4*(mirror_page-4)) + mirror_byte; + if (mirror_conf) { + uint8_t mirror_user_mem_start_byte = (4 * (mirror_page - 4)) + mirror_byte; uint8_t bytes_required_for_mirror_data = 0; switch (mirror_conf) { - case 1: - bytes_required_for_mirror_data = 14; - break; - case 2: - bytes_required_for_mirror_data = 6; - break; - case 3: - bytes_required_for_mirror_data = 8; - break; - case 4: - bytes_required_for_mirror_data = 21; - break; - case 5: - bytes_required_for_mirror_data = 23; - break; - case 6: - bytes_required_for_mirror_data = 15; - break; - case 7: - bytes_required_for_mirror_data = 30; - break; - default: - break; + case 1: + bytes_required_for_mirror_data = 14; + break; + case 2: + bytes_required_for_mirror_data = 6; + break; + case 3: + bytes_required_for_mirror_data = 8; + break; + case 4: + bytes_required_for_mirror_data = 21; + break; + case 5: + bytes_required_for_mirror_data = 23; + break; + case 6: + bytes_required_for_mirror_data = 15; + break; + case 7: + bytes_required_for_mirror_data = 30; + break; + default: + break; } PrintAndLogEx(INFO, " mirror start page %02X | byte pos %02X - %s", mirror_page, mirror_byte, (mirror_page >= 0x4 && ((mirror_user_mem_start_byte + bytes_required_for_mirror_data) <= 144)) ? _GREEN_("OK") : _YELLOW_("Invalid value")); } - if(tt_msg_lock) { - PrintAndLogEx(INFO, " - tag tamper message is permanently locked"); - } + if (tt_msg_lock) { + PrintAndLogEx(INFO, " - tamper message is permanently locked and cannot be written or read from memory"); + } } else if (tagtype & (NTAG_213_F | NTAG_216_F)) { uint8_t mirror_conf = ((data[0] & 0xC0) >> 6); @@ -905,24 +905,24 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st uint8_t tt_msg_resp_len; uint8_t tt_status_resp[5] = {0x00}; - if(tagtype & NTAG_213_TT) { - tt_enabled = (data[1] & 0x02); + if (tagtype & NTAG_213_TT) { + tt_enabled = (data[1] & 0x02); tt_msg_resp_len = ul_read(45, tt_message, 4); - PrintAndLogEx(INFO, " - tamper detection is %s" - , (tt_enabled) ? _GREEN_("ENABLED") : "disabled" - ); + PrintAndLogEx(INFO, " - tamper detection feature is %s" + , (tt_enabled) ? _GREEN_("ENABLED") : "disabled" + ); switch (data[1] & 0x06) { case 0x00: - PrintAndLogEx(INFO, " - tamper message is unlocked and read/write enabled"); + PrintAndLogEx(INFO, " - tamper message is unlocked and read/write enabled"); break; case 0x02: - PrintAndLogEx(INFO, " - tamper message is reversibly read/write protected in memory while the tamper feature is enabled"); + PrintAndLogEx(INFO, " - tamper message is reversibly read/write locked in memory while the tamper feature is enabled"); break; case 0x04: case 0x06: - PrintAndLogEx(INFO, " - tamper message is permanently read/write protected in memory"); + PrintAndLogEx(INFO, " - tamper message is permanently read/write locked in memory"); break; default: break; @@ -944,52 +944,53 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st PrintAndLogEx(INFO, " PWD [%u/0x%02X]: %s- (cannot be read)", startPage + 2, startPage + 2, sprint_hex(data + 8, 4)); PrintAndLogEx(INFO, " PACK [%u/0x%02X]: %s - (cannot be read)", startPage + 3, startPage + 3, sprint_hex(data + 12, 2)); PrintAndLogEx(INFO, " RFU [%u/0x%02X]: %s- (cannot be read)", startPage + 3, startPage + 3, sprint_hex(data + 14, 2)); - - if(tagtype & NTAG_213_TT) { - if(data[1] & 0x06) { + + if (tagtype & NTAG_213_TT) { + if (data[1] & 0x06) { PrintAndLogEx(INFO, "TT_MSG [45/0x2D]: %s- (cannot be read)", sprint_hex(tt_message, tt_msg_resp_len)); - PrintAndLogEx(INFO, " - tamper message is masked in memory"); + PrintAndLogEx(INFO, " - tamper message is masked in memory, but can be revealed in the READ_TT_STATUS command response if tampering was detected"); } else { PrintAndLogEx(INFO, "TT_MSG [45/0x2D]: %s", sprint_hex(tt_message, tt_msg_resp_len)); - PrintAndLogEx(INFO, " - tamper message is %s", sprint_hex(tt_message, tt_msg_resp_len)); + PrintAndLogEx(INFO, " - tamper message (read from memory) is %s", sprint_hex(tt_message, tt_msg_resp_len)); } } - if ((tagtype & NTAG_213_TT) && tt_enabled) { //The tag only returns meaningful information for the fields below if the tamper feature is enabled - + //The NTAG213TT only returns meaningful information for the fields below if the tamper feature is enabled + if ((tagtype & NTAG_213_TT) && tt_enabled) { + uint8_t tt_status_len = ntagtt_getTamperStatus(tt_status_resp, 5); - if(tt_status_len != 5) { - PrintAndLogEx(WARNING, "Error requesting tamper status from tag\n"); + if (tt_status_len != 5) { + PrintAndLogEx(WARNING, "Error sending the read TT status command to tag\n"); return PM3_ESOFT; } - + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tamper Status")); PrintAndLogEx(INFO, " READ_TT_STATUS: %s", sprint_hex(tt_status_resp, 5)); - PrintAndLogEx(INFO, " Tamper detection result from this power-up:"); - switch(tt_status_resp[4]) { + PrintAndLogEx(INFO, " Tamper status result from this power-up:"); + switch (tt_status_resp[4]) { case 0x43: - PrintAndLogEx(INFO, " - Tamper wire was detcted as closed during this power-up"); + PrintAndLogEx(INFO, " - Tamper loop was detcted as closed during this power-up"); break; case 0x4F: - PrintAndLogEx(INFO, " - Tamper wire was detected as open during this power-up"); + PrintAndLogEx(INFO, " - Tamper loop was detected as open during this power-up"); break; case 0x49: - PrintAndLogEx(INFO, " - No tamper wire measurement from this power-up is available"); + PrintAndLogEx(INFO, " - Tamper loop measurement from this power-up was not enabled or not valid"); break; default: break; } PrintAndLogEx(INFO, " Tamper detection permanent memory:"); - if((tt_status_resp[0] | tt_status_resp [1] | tt_status_resp[2] | tt_status_resp[3]) == 0x00) + if ((tt_status_resp[0] | tt_status_resp [1] | tt_status_resp[2] | tt_status_resp[3]) == 0x00) - PrintAndLogEx(INFO, " - Tamper wire has never been detected as open during power-up"); + PrintAndLogEx(INFO, " - Tamper loop has never been detected as open during power-up"); else { - PrintAndLogEx(INFO, " - Tamper wire has previously been detected as open during power-up"); - PrintAndLogEx(INFO, " - Tamper message: %s", sprint_hex(tt_status_resp, 4)); + PrintAndLogEx(INFO, " - Tamper loop was detected as open during power-up at least once"); + PrintAndLogEx(INFO, " - Tamper message returned by READ_TT_STATUS command: %s", sprint_hex(tt_status_resp, 4)); } } return PM3_SUCCESS; @@ -2715,7 +2716,7 @@ int CmdHF14MfUTamper(const char *Cmd) { CLIGetHexWithReturn(ctx, 3, msg_data, &msg_len); bool use_msg = (msg_len > 0); - if(use_msg && msg_len != 4) { + if (use_msg && msg_len != 4) { PrintAndLogEx(WARNING, "The tamper message must be 4 hex bytes if provided"); DropField(); return PM3_ESOFT; @@ -2731,7 +2732,7 @@ int CmdHF14MfUTamper(const char *Cmd) { DropField(); return PM3_ESOFT; } - if(tagtype != NTAG_213_TT) { + if (tagtype != NTAG_213_TT) { PrintAndLogEx(WARNING, "Tag type not NTAG 213TT"); DropField(); return PM3_ESOFT; @@ -2740,18 +2741,17 @@ int CmdHF14MfUTamper(const char *Cmd) { DropField(); iso14a_card_select_t card; - if(enable && disable) { + if (enable && disable) { PrintAndLogEx(WARNING, "You can only select one of the options enable/disable tamper feature"); DropField(); return PM3_ESOFT; } - if(use_msg) - { + if (use_msg) { if (ul_select(&card) == false) { DropField(); return UL_ERROR; - } + } PrintAndLogEx(INFO, "Trying to write tamper message\n"); SendCommandMIX(CMD_HF_MIFAREU_WRITEBL, tt_msg_page, 0, 0, msg_data, 4); @@ -2768,34 +2768,34 @@ int CmdHF14MfUTamper(const char *Cmd) { } } - if(enable | disable | lock_msg) { + if (enable | disable | lock_msg) { if (ul_select(&card) == false) { PrintAndLogEx(ERR, "Unable to select tag"); DropField(); return UL_ERROR; - } + } uint8_t cfg_page[4] = {0x00}; uint8_t cmd[] = {ISO14443A_CMD_READBLOCK, tt_cfg_page}; int status = ul_send_cmd_raw(cmd, sizeof(cmd), cfg_page, 4); DropField(); - if(status <= 0) { + if (status <= 0) { PrintAndLogEx(WARNING, "Problem reading current config from tag"); DropField(); return PM3_ESOFT; } - if(enable) { + if (enable) { cfg_page[1] = cfg_page[1] | 0x02; PrintAndLogEx(INFO, "Enabling tamper feature"); } - if(disable) { + if (disable) { cfg_page[1] = cfg_page[1] & 0xFD; PrintAndLogEx(INFO, "Disabling tamper feature"); } - if(lock_msg) { + if (lock_msg) { cfg_page[1] = cfg_page[1] | 0x04; PrintAndLogEx(INFO, "Locking tamper message"); } diff --git a/include/protocols.h b/include/protocols.h index e4437d90a..0cc89abb7 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -223,7 +223,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define NTAG_I2C_SELECT_SECTOR 0xC2 #define NTAG_I2C_FASTWRITE 0xA6 -//NTAG 213TT (tamper) command +//NTAG 213TT (tamper) command #define NTAGTT_CMD_READ_TT 0xA4 // mifare 4bit card answers From dc1f302fa2adcd8765f9c2f36a151f3829b79376 Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Mon, 20 Feb 2023 02:20:08 -0600 Subject: [PATCH 225/924] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2f5c1dc4..7321da285 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added `--back` option to `clear` command to clear the scrollback buffer (@wh201906) - Changed `hf iclass decrypt` - mark credentials as decrypted in the dump (@natesales) - Changed `hf iclass view` - show credentials on a decrypted dump (@natesales) + - Show NTAG213TT tamper info in `hf mfu info` and add commands for configuring it's tamper feature (@mjaksn) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) From 3e952b80369483406f42974d5f8b5184226012ce Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Tue, 21 Feb 2023 01:50:33 +0100 Subject: [PATCH 226/924] bugfix: wrong text in hf mfdes list when no data exists in trace --- client/src/cmdhflist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 232d4af19..fc3f94d7a 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -898,7 +898,7 @@ void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { snprintf(exp, size, "R-block NACK(%d)", (cmd[0] & 0x01)); } // I-block 000xCN1x - else if ((cmd[0] & 0xC0) == 0x00) { + else if (((cmd[0] & 0xC0) == 0x00) && (cmdsize > 2)) { // PCB [CID] [NAD] [INF] CRC CRC int pos = 1; From 49a475899acd1fdba06f04eb3f8c1fe99053615f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Feb 2023 04:40:48 +0100 Subject: [PATCH 227/924] time is 64b better to accept the same size input timestamps --- tools/mfd_aes_brute/brute_key.c | 5 ++++- tools/mfd_aes_brute/mfd_aes_brute.c | 3 ++- tools/mfd_aes_brute/mfd_multi_brute.c | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tools/mfd_aes_brute/brute_key.c b/tools/mfd_aes_brute/brute_key.c index 41c91f3c7..654fed6c6 100644 --- a/tools/mfd_aes_brute/brute_key.c +++ b/tools/mfd_aes_brute/brute_key.c @@ -111,7 +111,8 @@ int main(int argc, char *argv[]) { uint8_t tag_challenge[16] = {0x00}; uint8_t lock_challenge[32] = {0x00}; - uint64_t timestamp = atoi(argv[1]); + uint64_t timestamp = 0; + sscanf(argv[1], "%lu", ×tamp); if (argc != 4) { printf("\nusage: %s <16 byte tag challenge> <32 byte lock challenge>\n\n", argv[0]); @@ -124,8 +125,10 @@ int main(int argc, char *argv[]) { if (hexstr_to_byte_array(argv[3], lock_challenge, sizeof(lock_challenge))) return 3; + // current time uint64_t start_time = time(NULL); + // from a time before up until current time. for (; timestamp < start_time; timestamp++) { make_key(timestamp, key); diff --git a/tools/mfd_aes_brute/mfd_aes_brute.c b/tools/mfd_aes_brute/mfd_aes_brute.c index d4bca2bb8..4eba06051 100644 --- a/tools/mfd_aes_brute/mfd_aes_brute.c +++ b/tools/mfd_aes_brute/mfd_aes_brute.c @@ -233,7 +233,8 @@ int main(int argc, char *argv[]) { if (argc != 4) return usage(argv[0]); - uint64_t start_time = atoi(argv[1]); + uint64_t start_time = 0; + sscanf(argv[1], "%lu", &start_time); uint8_t tag_challenge[16] = {0x00}; if (hexstr_to_byte_array(argv[2], tag_challenge, sizeof(tag_challenge))) diff --git a/tools/mfd_aes_brute/mfd_multi_brute.c b/tools/mfd_aes_brute/mfd_multi_brute.c index 704796255..bbd213a35 100644 --- a/tools/mfd_aes_brute/mfd_multi_brute.c +++ b/tools/mfd_aes_brute/mfd_multi_brute.c @@ -172,7 +172,7 @@ static void print_time(uint64_t at) { char res[32]; strftime(res, sizeof(res), "%Y-%m-%d %H:%M:%S", <); - printf("%u ( '%s' )\n", (unsigned)t, res); + printf("%"PRIu64" ( '%s' )\n", t, res); } static void *brute_thread(void *arguments) { @@ -378,7 +378,8 @@ int main(int argc, char *argv[]) { return 1; } - uint64_t start_time = atoi(argv[3]); + uint64_t start_time = 0; + sscanf(argv[3], "%lu", &start_time); printf("Crypto algo............ " _GREEN_("%s") "\n", algostr); printf("LCR Random generator... " _GREEN_("%s") "\n", generators[g_idx].Name); From 6ee817aa72779474fc60c7feb8f3936c1d93b300 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Feb 2023 04:41:11 +0100 Subject: [PATCH 228/924] init array w zero --- armsrc/desfire_crypto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/desfire_crypto.c b/armsrc/desfire_crypto.c index 84361e2c3..2358fa8b1 100644 --- a/armsrc/desfire_crypto.c +++ b/armsrc/desfire_crypto.c @@ -755,7 +755,7 @@ void mifare_cypher_single_block(desfirekey_t key, uint8_t *data, uint8_t *ivect, memcpy(ovect, data, block_size); } - uint8_t edata[DESFIRE_MAX_CRYPTO_BLOCK_SIZE]; + uint8_t edata[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0}; switch (key->type) { case T_DES: From 64cc21b890ef12bf6c03bc94c0b5b315f1a5ee57 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Feb 2023 04:41:42 +0100 Subject: [PATCH 229/924] init structure with zeros --- armsrc/mifaredesfire.c | 1 + 1 file changed, 1 insertion(+) diff --git a/armsrc/mifaredesfire.c b/armsrc/mifaredesfire.c index 08d7a9379..3530dfd9b 100644 --- a/armsrc/mifaredesfire.c +++ b/armsrc/mifaredesfire.c @@ -139,6 +139,7 @@ void MifareDesfireGetInformation(void) { uint8_t details[14]; } PACKED payload; + memset(&payload, 0x00, sizeof(payload)); /* 1 = PCB 1 2 = cid 2 From 4807fae885f9800749b94771c4b13f700394edd3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Feb 2023 04:42:24 +0100 Subject: [PATCH 230/924] in private case we calloc, need to free that memory --- client/src/cmdflashmem.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdflashmem.c b/client/src/cmdflashmem.c index 7bbdf74c9..e8db64885 100644 --- a/client/src/cmdflashmem.c +++ b/client/src/cmdflashmem.c @@ -643,6 +643,7 @@ static int CmdFlashMemInfo(const char *Cmd) { if (got_private == false) { mbedtls_rsa_free(rsa); + free(rsa); } mbedtls_pk_free(&pkctx); From b86e29fca1fef059d66445cc2de7ce515e544e0c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Feb 2023 04:42:51 +0100 Subject: [PATCH 231/924] init structure with zeros --- client/src/cmdlfhid.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index 1ce02f4ed..4cfa41ef8 100644 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -80,12 +80,14 @@ static int sendTry(uint8_t format_idx, wiegand_card_t *card, uint32_t delay, boo ); } - lf_hidsim_t payload; - payload.Q5 = false; - payload.hi2 = packed.Top; - payload.hi = packed.Mid; - payload.lo = packed.Bot; - payload.longFMT = (packed.Mid > 0xFFF); + lf_hidsim_t payload = { + .EM = false, + .Q5 = false, + .hi2 = packed.Top, + .hi = packed.Mid, + .lo = packed.Bot, + .longFMT = (packed.Mid > 0xFFF) + }; clearCommandBuffer(); From 628140fd88f48c04e2bc8ab12e6980c172814e66 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Feb 2023 16:20:34 +0100 Subject: [PATCH 232/924] correct string formatter in sscanf --- tools/mfd_aes_brute/brute_key.c | 2 +- tools/mfd_aes_brute/mfd_aes_brute.c | 2 +- tools/mfd_aes_brute/mfd_multi_brute.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/mfd_aes_brute/brute_key.c b/tools/mfd_aes_brute/brute_key.c index 654fed6c6..e02a597e2 100644 --- a/tools/mfd_aes_brute/brute_key.c +++ b/tools/mfd_aes_brute/brute_key.c @@ -112,7 +112,7 @@ int main(int argc, char *argv[]) { uint8_t lock_challenge[32] = {0x00}; uint64_t timestamp = 0; - sscanf(argv[1], "%lu", ×tamp); + sscanf(argv[1], "%"PRIu64, ×tamp); if (argc != 4) { printf("\nusage: %s <16 byte tag challenge> <32 byte lock challenge>\n\n", argv[0]); diff --git a/tools/mfd_aes_brute/mfd_aes_brute.c b/tools/mfd_aes_brute/mfd_aes_brute.c index 4eba06051..b92eee31c 100644 --- a/tools/mfd_aes_brute/mfd_aes_brute.c +++ b/tools/mfd_aes_brute/mfd_aes_brute.c @@ -234,7 +234,7 @@ int main(int argc, char *argv[]) { if (argc != 4) return usage(argv[0]); uint64_t start_time = 0; - sscanf(argv[1], "%lu", &start_time); + sscanf(argv[1], "%"PRIu64, &start_time); uint8_t tag_challenge[16] = {0x00}; if (hexstr_to_byte_array(argv[2], tag_challenge, sizeof(tag_challenge))) diff --git a/tools/mfd_aes_brute/mfd_multi_brute.c b/tools/mfd_aes_brute/mfd_multi_brute.c index bbd213a35..4279fba62 100644 --- a/tools/mfd_aes_brute/mfd_multi_brute.c +++ b/tools/mfd_aes_brute/mfd_multi_brute.c @@ -379,7 +379,7 @@ int main(int argc, char *argv[]) { } uint64_t start_time = 0; - sscanf(argv[3], "%lu", &start_time); + sscanf(argv[3], "%"PRIu64, &start_time); printf("Crypto algo............ " _GREEN_("%s") "\n", algostr); printf("LCR Random generator... " _GREEN_("%s") "\n", generators[g_idx].Name); From a39b474884b9b38c4e6c436e4936645aec0c6bb8 Mon Sep 17 00:00:00 2001 From: ch3lt Date: Wed, 22 Feb 2023 10:12:18 +0100 Subject: [PATCH 233/924] Fixed CmdHF15Write/Readblock/Readmulti bug on sanity check when '-u ' argument is passed in command. Formating. --- client/src/cmdhf15.c | 80 ++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 10d239b94..d1b7289e8 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -48,6 +48,7 @@ #define Logic1 Iso15693Logic1 #define FrameEOF Iso15693FrameEOF #define CARD_MEMORY_SIZE 4096 +#define HF15_UID_LENGTH 8 #ifndef Crc15 # define Crc15(data, len) Crc16ex(CRC_15693, (data), (len)) @@ -222,6 +223,16 @@ static const productName_t uidmapping[] = { { 0, 0, "no tag-info available" } // must be the last entry }; +static inline void reverse(uint8_t *buff, uint8_t length) { + uint8_t upper_bound = (length % 2 == 0) ? length / 2 : (length / 2) + 1; + uint8_t tmp = 0; + for (int start = 0, end = length - 1; end >= upper_bound; ++start, --end) { + tmp = buff[end]; + buff[end] = buff[start]; + buff[start] = tmp; + } +} + static int CmdHF15Help(const char *Cmd); static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { @@ -1774,11 +1785,13 @@ static int CmdHF15Readmulti(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, false); - uint8_t uid[8]; + uint8_t uid[HF15_UID_LENGTH]; int uidlen = 0; CLIGetHexWithReturn(ctx, 1, uid, &uidlen); + bool uid_set = (uidlen == HF15_UID_LENGTH) ? true : false; + bool unaddressed = arg_get_lit(ctx, 2); - bool scan = arg_get_lit(ctx, 3); + bool scan = (arg_get_lit(ctx, 3) || (!uid_set && !unaddressed)) ? true : false; //Default fallback to scan for tag. Overriding unaddressed parameter. int fast = (arg_get_lit(ctx, 4) == false); bool add_option = arg_get_lit(ctx, 5); @@ -1793,7 +1806,7 @@ static int CmdHF15Readmulti(const char *Cmd) { return PM3_EINVARG; } - if ((scan + unaddressed + uidlen) > 1) { + if ((scan + unaddressed + uid_set) > 1) { PrintAndLogEx(WARNING, "Select only one option /scan/unaddress/uid"); return PM3_EINVARG; } @@ -1809,14 +1822,13 @@ static int CmdHF15Readmulti(const char *Cmd) { PrintAndLogEx(WARNING, "no tag found"); return PM3_EINVARG; } - uidlen = 8; + } else { + reverse(uid, HF15_UID_LENGTH); } + // add UID (scan, uid) + memcpy(req + reqlen, uid, HF15_UID_LENGTH); + reqlen += HF15_UID_LENGTH; - if (uidlen == 8) { - // add UID (scan, uid) - memcpy(req + reqlen, uid, sizeof(uid)); - reqlen += sizeof(uid); - } PrintAndLogEx(SUCCESS, "Using UID... " _GREEN_("%s"), iso15693_sprintUID(NULL, uid)); } // add OPTION flag, in order to get lock-info @@ -1908,11 +1920,13 @@ static int CmdHF15Readblock(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, false); - uint8_t uid[8]; + uint8_t uid[HF15_UID_LENGTH]; int uidlen = 0; CLIGetHexWithReturn(ctx, 1, uid, &uidlen); + bool uid_set = (uidlen == HF15_UID_LENGTH) ? true : false; + bool unaddressed = arg_get_lit(ctx, 2); - bool scan = arg_get_lit(ctx, 3); + bool scan = (arg_get_lit(ctx, 3) || (!uid_set && !unaddressed)) ? true : false; //Default fallback to scan for tag. Overriding unaddressed parameter. int fast = (arg_get_lit(ctx, 4) == false); bool add_option = arg_get_lit(ctx, 5); @@ -1920,36 +1934,31 @@ static int CmdHF15Readblock(const char *Cmd) { CLIParserFree(ctx); // sanity checks - if ((scan + unaddressed + uidlen) > 1) { + if ((scan + unaddressed + uid_set) > 1) { PrintAndLogEx(WARNING, "Select only one option /scan/unaddress/uid"); return PM3_EINVARG; } - // default fallback to scan for tag. - // overriding unaddress parameter :) - if (uidlen != 8) { - scan = true; - } - // request to be sent to device/card uint16_t flags = arg_get_raw_flag(uidlen, unaddressed, scan, add_option); uint8_t req[PM3_CMD_DATA_SIZE] = {flags, ISO15693_READBLOCK}; uint16_t reqlen = 2; if (unaddressed == false) { + // default fallback to scan for tag. + // overriding unaddress parameter :) if (scan) { if (getUID(false, uid) != PM3_SUCCESS) { PrintAndLogEx(WARNING, "no tag found"); return PM3_EINVARG; } - uidlen = 8; + } else { + reverse(uid, HF15_UID_LENGTH); } + // add UID (scan, uid) + memcpy(req + reqlen, uid, HF15_UID_LENGTH); + reqlen += HF15_UID_LENGTH; - if (uidlen == 8) { - // add UID (scan, uid) - memcpy(req + reqlen, uid, sizeof(uid)); - reqlen += sizeof(uid); - } PrintAndLogEx(SUCCESS, "Using UID... " _GREEN_("%s"), iso15693_sprintUID(NULL, uid)); } // add OPTION flag, in order to get lock-info @@ -2073,11 +2082,13 @@ static int CmdHF15Write(const char *Cmd) { argtable[arglen++] = arg_param_end; CLIExecWithReturn(ctx, Cmd, argtable, false); - uint8_t uid[8]; + uint8_t uid[HF15_UID_LENGTH]; int uidlen = 0; CLIGetHexWithReturn(ctx, 1, uid, &uidlen); + bool uid_set = (uidlen == HF15_UID_LENGTH) ? true : false; + bool unaddressed = arg_get_lit(ctx, 2); - bool scan = arg_get_lit(ctx, 3); + bool scan = (arg_get_lit(ctx, 3) || (!uid_set && !unaddressed)) ? true : false; //Default fallback to scan for tag. Overriding unaddressed parameter. int fast = (arg_get_lit(ctx, 4) == false); bool add_option = arg_get_lit(ctx, 5); @@ -2090,7 +2101,7 @@ static int CmdHF15Write(const char *Cmd) { CLIParserFree(ctx); // sanity checks - if ((scan + unaddressed + uidlen) > 1) { + if ((scan + unaddressed + uid_set) > 1) { PrintAndLogEx(WARNING, "Select only one option /scan/unaddress/uid"); return PM3_EINVARG; } @@ -2102,9 +2113,6 @@ static int CmdHF15Write(const char *Cmd) { // default fallback to scan for tag. // overriding unaddress parameter :) - if (uidlen != 8) { - scan = true; - } // request to be sent to device/card uint16_t flags = arg_get_raw_flag(uidlen, unaddressed, scan, add_option); @@ -2120,18 +2128,16 @@ static int CmdHF15Write(const char *Cmd) { PrintAndLogEx(WARNING, "no tag found"); return PM3_EINVARG; } - uidlen = 8; + } else { + reverse(uid, HF15_UID_LENGTH); } + // add UID (scan, uid) + memcpy(req + reqlen, uid, HF15_UID_LENGTH); + reqlen += HF15_UID_LENGTH; - if (uidlen == 8) { - // add UID (scan, uid) - memcpy(req + reqlen, uid, sizeof(uid)); - reqlen += sizeof(uid); - } PrintAndLogEx(SUCCESS, "Using UID... " _GREEN_("%s"), iso15693_sprintUID(NULL, uid)); } - req[reqlen++] = (uint8_t)block; memcpy(req + reqlen, d, sizeof(d)); reqlen += sizeof(d); From 690eb0fc8a4c66f1fd27f66c09900e1c0ca087ed Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Wed, 22 Feb 2023 07:40:04 -0600 Subject: [PATCH 234/924] add missing CLIParserFree(ctx) , init variable to zero, and small text change --- client/src/cmdhfmfu.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 31823adeb..9c8514241 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -758,7 +758,6 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st if (tagtype & NTAG_213_TT) { uint8_t mirror_conf = ((data[0] & 0xE0) >> 5); uint8_t mirror_byte = ((data[0] & 0x18) >> 3); - uint8_t tt_msg_lock = (data[1] & 0x04); uint8_t mirror_page = data[2]; switch (mirror_conf) { @@ -822,10 +821,6 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st PrintAndLogEx(INFO, " mirror start page %02X | byte pos %02X - %s", mirror_page, mirror_byte, (mirror_page >= 0x4 && ((mirror_user_mem_start_byte + bytes_required_for_mirror_data) <= 144)) ? _GREEN_("OK") : _YELLOW_("Invalid value")); } - if (tt_msg_lock) { - PrintAndLogEx(INFO, " - tamper message is permanently locked and cannot be written or read from memory"); - } - } else if (tagtype & (NTAG_213_F | NTAG_216_F)) { uint8_t mirror_conf = ((data[0] & 0xC0) >> 6); uint8_t mirror_byte = (data[0] & 0x30); @@ -902,7 +897,7 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st uint8_t tt_enabled = 0; uint8_t tt_message[4] = {0x00}; - uint8_t tt_msg_resp_len; + uint8_t tt_msg_resp_len = 0; uint8_t tt_status_resp[5] = {0x00}; if (tagtype & NTAG_213_TT) { @@ -948,10 +943,10 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st if (tagtype & NTAG_213_TT) { if (data[1] & 0x06) { PrintAndLogEx(INFO, "TT_MSG [45/0x2D]: %s- (cannot be read)", sprint_hex(tt_message, tt_msg_resp_len)); - PrintAndLogEx(INFO, " - tamper message is masked in memory, but can be revealed in the READ_TT_STATUS command response if tampering was detected"); + PrintAndLogEx(INFO, " - tamper message is masked in memory"); } else { PrintAndLogEx(INFO, "TT_MSG [45/0x2D]: %s", sprint_hex(tt_message, tt_msg_resp_len)); - PrintAndLogEx(INFO, " - tamper message (read from memory) is %s", sprint_hex(tt_message, tt_msg_resp_len)); + PrintAndLogEx(INFO, " - tamper message is %s and is readable/writablbe in memory", sprint_hex(tt_message, tt_msg_resp_len)); } } @@ -961,7 +956,7 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st uint8_t tt_status_len = ntagtt_getTamperStatus(tt_status_resp, 5); if (tt_status_len != 5) { - PrintAndLogEx(WARNING, "Error sending the read TT status command to tag\n"); + PrintAndLogEx(WARNING, "Error sending the READ_TT_STATUS command to tag\n"); return PM3_ESOFT; } @@ -978,7 +973,7 @@ static int ulev1_print_configuration(uint32_t tagtype, uint8_t *data, uint8_t st PrintAndLogEx(INFO, " - Tamper loop was detected as open during this power-up"); break; case 0x49: - PrintAndLogEx(INFO, " - Tamper loop measurement from this power-up was not enabled or not valid"); + PrintAndLogEx(INFO, " - Tamper loop measurement was not enabled or not valid during this power-up"); break; default: break; @@ -2725,6 +2720,7 @@ int CmdHF14MfUTamper(const char *Cmd) { bool lock_msg = arg_get_lit(ctx, 4); bool enable = arg_get_lit(ctx, 1); bool disable = arg_get_lit(ctx, 2); + CLIParserFree(ctx); TagTypeUL_t tagtype = GetHF14AMfU_Type(); if (tagtype == UL_ERROR) { From 75fd0c2034492ad73baedc474a787da430191831 Mon Sep 17 00:00:00 2001 From: Matthew Jackson <123390480+mjaksn@users.noreply.github.com> Date: Thu, 23 Feb 2023 01:52:07 -0600 Subject: [PATCH 235/924] fixed another missing CLIParserFree(ctx); Signed-off-by: Matthew Jackson <123390480+mjaksn@users.noreply.github.com> --- client/src/cmdhfmfu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 9c8514241..d5ac6537b 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2714,6 +2714,7 @@ int CmdHF14MfUTamper(const char *Cmd) { if (use_msg && msg_len != 4) { PrintAndLogEx(WARNING, "The tamper message must be 4 hex bytes if provided"); DropField(); + CLIParserFree(ctx); return PM3_ESOFT; } From 9a2e07e1a8d783773169b97d45276261bff7b687 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 23 Feb 2023 12:33:24 +0100 Subject: [PATCH 236/924] should fix time_t printing issues --- tools/mfd_aes_brute/mfd_multi_brute.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/mfd_aes_brute/mfd_multi_brute.c b/tools/mfd_aes_brute/mfd_multi_brute.c index 4279fba62..3474d81d9 100644 --- a/tools/mfd_aes_brute/mfd_multi_brute.c +++ b/tools/mfd_aes_brute/mfd_multi_brute.c @@ -169,10 +169,10 @@ static void print_time(uint64_t at) { (void)localtime_r(&t, <); #endif - char res[32]; - strftime(res, sizeof(res), "%Y-%m-%d %H:%M:%S", <); + char res[70]; + strftime(res, sizeof(res), "%s ('%Y-%m-%d %H:%M:%S')", <); - printf("%"PRIu64" ( '%s' )\n", t, res); + printf("%s\n", res); } static void *brute_thread(void *arguments) { From 601b442b6c49ab3df80b17d73fd31c5f130548bf Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 23 Feb 2023 20:35:07 +0100 Subject: [PATCH 237/924] fix warning in GH actions --- .github/workflows/windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index d639eebc4..4d971faa6 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -98,7 +98,7 @@ jobs: steps: - name: WSL setup - uses: Vampire/setup-wsl@v1 + uses: Vampire/setup-wsl@v2 with: distribution: Ubuntu-20.04 update: "true" From a4bf1c5710c87a44a9d6a22705ae7c802fe37ef7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 23 Feb 2023 20:36:27 +0100 Subject: [PATCH 238/924] update to 22.04 --- .github/workflows/windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 4d971faa6..77c3dc70c 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -100,7 +100,7 @@ jobs: - name: WSL setup uses: Vampire/setup-wsl@v2 with: - distribution: Ubuntu-20.04 + distribution: Ubuntu-22.04 update: "true" additional-packages: git ca-certificates From dd7c9daa8d0ee60f1399acbe21cd9489de385cb1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 23 Feb 2023 20:53:53 +0100 Subject: [PATCH 239/924] fix CID #405002 - invalid string formatter --- client/src/cmdlfguard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfguard.c b/client/src/cmdlfguard.c index 0225b2fef..c31629c5a 100644 --- a/client/src/cmdlfguard.c +++ b/client/src/cmdlfguard.c @@ -375,7 +375,7 @@ static int CmdGuardSim(const char *Cmd) { return PM3_ESOFT; } - PrintAndLogEx(SUCCESS, "Simulating Guardall Prox - xorKey: " _YELLOW_("%u%") " Facility Code: " _YELLOW_("%u") " CardNumber: " _YELLOW_("%u") + PrintAndLogEx(SUCCESS, "Simulating Guardall Prox - xorKey: " _YELLOW_("%u") " Facility Code: " _YELLOW_("%u") " CardNumber: " _YELLOW_("%u") , xorval , facilitycode , cardnumber From 02a801f6655ac82d7a7e168bc7120577e276e668 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 23 Feb 2023 20:58:45 +0100 Subject: [PATCH 240/924] fix CID #404863 printing --- tools/mfd_aes_brute/mfd_aes_brute.c | 7 +++---- tools/mfd_aes_brute/mfd_multi_brute.c | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/mfd_aes_brute/mfd_aes_brute.c b/tools/mfd_aes_brute/mfd_aes_brute.c index b92eee31c..0cf1028b3 100644 --- a/tools/mfd_aes_brute/mfd_aes_brute.c +++ b/tools/mfd_aes_brute/mfd_aes_brute.c @@ -139,10 +139,9 @@ static void print_time(uint64_t at) { (void)localtime_r(&t, <); #endif - char res[32]; - strftime(res, sizeof(res), "%Y-%m-%d %H:%M:%S", <); - - printf("%u ( '%s' )\n", (unsigned)t, res); + char res[70]; + strftime(res, sizeof(res), "%s ('%Y-%m-%d %H:%M:%S')", <); + printf("%s\n", res); } static void *brute_thread(void *arguments) { diff --git a/tools/mfd_aes_brute/mfd_multi_brute.c b/tools/mfd_aes_brute/mfd_multi_brute.c index 3474d81d9..4e7579e8f 100644 --- a/tools/mfd_aes_brute/mfd_multi_brute.c +++ b/tools/mfd_aes_brute/mfd_multi_brute.c @@ -171,7 +171,6 @@ static void print_time(uint64_t at) { char res[70]; strftime(res, sizeof(res), "%s ('%Y-%m-%d %H:%M:%S')", <); - printf("%s\n", res); } From 93d7d46776fc1ca849ba6ccbdafc9b9dadb1a45e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 24 Feb 2023 20:57:42 +0100 Subject: [PATCH 241/924] fix proxspace build --- tools/mfd_aes_brute/mfd_aes_brute.c | 4 ++++ tools/mfd_aes_brute/mfd_multi_brute.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/tools/mfd_aes_brute/mfd_aes_brute.c b/tools/mfd_aes_brute/mfd_aes_brute.c index 0cf1028b3..b19885f34 100644 --- a/tools/mfd_aes_brute/mfd_aes_brute.c +++ b/tools/mfd_aes_brute/mfd_aes_brute.c @@ -140,7 +140,11 @@ static void print_time(uint64_t at) { #endif char res[70]; +#if defined(__MINGW32__) || defined(__MINGW64__) + strftime(res, sizeof(res), "('%Y-%m-%d %H:%M:%S')", <); +#else strftime(res, sizeof(res), "%s ('%Y-%m-%d %H:%M:%S')", <); +#endif printf("%s\n", res); } diff --git a/tools/mfd_aes_brute/mfd_multi_brute.c b/tools/mfd_aes_brute/mfd_multi_brute.c index 4e7579e8f..bb2456aa1 100644 --- a/tools/mfd_aes_brute/mfd_multi_brute.c +++ b/tools/mfd_aes_brute/mfd_multi_brute.c @@ -170,7 +170,11 @@ static void print_time(uint64_t at) { #endif char res[70]; +#if defined(__MINGW32__) || defined(__MINGW64__) + strftime(res, sizeof(res), "('%Y-%m-%d %H:%M:%S')", <); +#else strftime(res, sizeof(res), "%s ('%Y-%m-%d %H:%M:%S')", <); +#endif printf("%s\n", res); } From b05a2d4525bbf54f8b3506c934945e7ea9ae251a Mon Sep 17 00:00:00 2001 From: Augusto Zanellato Date: Fri, 24 Feb 2023 00:55:49 +0100 Subject: [PATCH 242/924] Add mfc signature support to gen4 lua script --- client/luascripts/hf_mf_ultimatecard.lua | 34 ++++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/client/luascripts/hf_mf_ultimatecard.lua b/client/luascripts/hf_mf_ultimatecard.lua index 42a5e1887..aca2cccb7 100644 --- a/client/luascripts/hf_mf_ultimatecard.lua +++ b/client/luascripts/hf_mf_ultimatecard.lua @@ -483,17 +483,29 @@ local function write_signature(data) end local info = connect() if not info then return false, "Can't select card" end - if ulprotocol == '00' then return nil, 'Magic Card is not using the Ultralight Protocol' end - print('Writing new signature',data) - local b,c - local cmd = 'A2F%d%s' - local j = 2 - for i = 1, #data, 8 do - b = data:sub(i,i+7) - c = cmd:format(j,b) - local resp = send(c) - if resp ~= '0A' then lib14a.disconnect(); return nil, oops('Failed to write signature') end - j = j + 1 + if ulprotocol == '00' then + print('Writing new MFC signature',data) + send('CF'.._key..'6B48') + lib14a.disconnect() + connect() -- not 100% sure why it's needed, but without this blocks aren't actually written + local sig1 = data:sub(1, 32) + local sig2 = data:sub(33, 64) + + send('CF'.._key..'CD45'..sig1) + send('CF'.._key..'CD46'..sig2) + send('CF'.._key..'CD475C8FF9990DA270F0F8694B791BEA7BCC') + else + print('Writing new MFUL signature',data) + local b,c + local cmd = 'A2F%d%s' + local j = 2 + for i = 1, #data, 8 do + b = data:sub(i,i+7) + c = cmd:format(j,b) + local resp = send(c) + if resp ~= '0A' then lib14a.disconnect(); return nil, oops('Failed to write signature') end + j = j + 1 + end end lib14a.disconnect() return true, 'Ok' From 7834db8be756bbbb944f45bc5e5632a3ecdd6cd5 Mon Sep 17 00:00:00 2001 From: Augusto Zanellato Date: Fri, 24 Feb 2023 00:59:35 +0100 Subject: [PATCH 243/924] Add CHANGELOG.md entry, bump script version --- CHANGELOG.md | 1 + client/luascripts/hf_mf_ultimatecard.lua | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7321da285..c49a7c08e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf iclass decrypt` - mark credentials as decrypted in the dump (@natesales) - Changed `hf iclass view` - show credentials on a decrypted dump (@natesales) - Show NTAG213TT tamper info in `hf mfu info` and add commands for configuring it's tamper feature (@mjaksn) + - Add Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) diff --git a/client/luascripts/hf_mf_ultimatecard.lua b/client/luascripts/hf_mf_ultimatecard.lua index aca2cccb7..93e64e333 100644 --- a/client/luascripts/hf_mf_ultimatecard.lua +++ b/client/luascripts/hf_mf_ultimatecard.lua @@ -13,7 +13,7 @@ local err_lock = 'use -k or change cfg0 block' local _print = 0 copyright = '' author = 'Nathan Glaser' -version = 'v1.0.4' +version = 'v1.0.5' date = 'Created - Jan 2022' desc = 'This script enables easy programming of an Ultimate Mifare Magic card' example = [[ From 85ca342567213617ea4cd3b9f930638b017d515d Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Mon, 27 Feb 2023 13:02:16 -0700 Subject: [PATCH 244/924] Add bruteforce functionality to HID facility code --- client/src/cmdlfhid.c | 124 +++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 49 deletions(-) mode change 100644 => 100755 client/src/cmdlfhid.c diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c old mode 100644 new mode 100755 index 4cfa41ef8..fa6399b9e --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -475,26 +475,27 @@ static int CmdHIDClone(const char *Cmd) { static int CmdHIDBrute(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf hid brute", - "Enables bruteforce of HID readers with specified facility code.\n" - "This is a attack against reader. if cardnumber is given, it starts with it and goes up / down one step\n" - "if cardnumber is not given, it starts with 1 and goes up to 65535", - "lf hid brute -w H10301 --fc 224\n" - "lf hid brute -w H10301 --fc 21 -d 2000\n" - "lf hid brute -v -w H10301 --fc 21 --cn 200 -d 2000\n" - "lf hid brute -v -w H10301 --fc 21 --cn 200 -d 2000 --up\n" + "Enables bruteforce of HID readers while maintaining specific parameter values.\n" + "If the field being bruteforced is provided, it starts with it and goes up / down one step while maintaining other supplied values.\n" + "If the field being bruteforced is not provided, it will iterate through the full range while maintaining other supplied values.", + "lf hid brute -w H10301 -f fc --fc 224 --cn 6278\n" + "lf hid brute -w H10301 -f cn --fc 21 -d 2000\n" + "lf hid brute -v -w H10301 -f cn --fc 21 --cn 200 -d 2000\n" + "lf hid brute -v -w H10301 -f fc --fc 21 --cn 200 -d 2000 --up\n" ); void *argtable[] = { arg_param_begin, arg_lit0("v", "verbose", "verbose output"), arg_str1("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), + arg_str1("f", "field", "", "field to bruteforce"), arg_u64_0(NULL, "fc", "", "facility code"), - arg_u64_0(NULL, "cn", "", "card number to start with"), + arg_u64_0(NULL, "cn", "", "card number"), arg_u64_0("i", "issue", "", "issue level"), arg_u64_0("o", "oem", "", "OEM code"), - arg_u64_0("d", "delay", "", "delay betweens attempts in ms. Default 1000ms"), - arg_lit0(NULL, "up", "direction to increment card number. (default is both directions)"), - arg_lit0(NULL, "down", "direction to decrement card number. (default is both directions)"), + arg_u64_0("d", "delay", "", "delay betweens attempts in ms. (default is 1000)"), + arg_lit0(NULL, "up", "direction to increment field value. (default is both directions)"), + arg_lit0(NULL, "down", "direction to decrement field value. (default is both directions)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -512,22 +513,26 @@ static int CmdHIDBrute(const char *Cmd) { return PM3_EINVARG; } - wiegand_card_t cn_hi, cn_low; - memset(&cn_hi, 0, sizeof(wiegand_card_t)); + wiegand_card_t card_hi, card_low; + memset(&card_hi, 0, sizeof(wiegand_card_t)); + + char field[3] = {0}; + int field_len = 0; + CLIParamStrToBuf(arg_get_str(ctx, 3), (uint8_t *)field, sizeof(field), &field_len); - cn_hi.FacilityCode = arg_get_u32_def(ctx, 3, 0); - cn_hi.CardNumber = arg_get_u32_def(ctx, 4, 0); - cn_hi.IssueLevel = arg_get_u32_def(ctx, 5, 0); - cn_hi.OEM = arg_get_u32_def(ctx, 6, 0); + card_hi.FacilityCode = arg_get_u32_def(ctx, 4, 0); + card_hi.CardNumber = arg_get_u32_def(ctx, 5, 0); + card_hi.IssueLevel = arg_get_u32_def(ctx, 6, 0); + card_hi.OEM = arg_get_u32_def(ctx, 7, 0); - uint32_t delay = arg_get_u32_def(ctx, 7, 1000); + uint32_t delay = arg_get_u32_def(ctx, 8, 1000); int direction = 0; - if (arg_get_lit(ctx, 8) && arg_get_lit(ctx, 9)) { + if (arg_get_lit(ctx, 9) && arg_get_lit(ctx, 10)) { direction = 0; - } else if (arg_get_lit(ctx, 8)) { - direction = 1; } else if (arg_get_lit(ctx, 9)) { + direction = 1; + } else if (arg_get_lit(ctx, 10)) { direction = 2; } @@ -535,34 +540,38 @@ static int CmdHIDBrute(const char *Cmd) { if (verbose) { PrintAndLogEx(INFO, "Wiegand format... %i", format_idx); - PrintAndLogEx(INFO, "OEM.............. %u", cn_hi.OEM); - PrintAndLogEx(INFO, "ISSUE............ %u", cn_hi.IssueLevel); - PrintAndLogEx(INFO, "Facility code.... %u", cn_hi.FacilityCode); - PrintAndLogEx(INFO, "Card number...... %" PRIu64, cn_hi.CardNumber); + PrintAndLogEx(INFO, "OEM.............. %u", card_hi.OEM); + PrintAndLogEx(INFO, "ISSUE............ %u", card_hi.IssueLevel); + PrintAndLogEx(INFO, "Facility code.... %u", card_hi.FacilityCode); + PrintAndLogEx(INFO, "Card number...... %" PRIu64, card_hi.CardNumber); PrintAndLogEx(INFO, "Delay............ " _YELLOW_("%d"), delay); + if (strcmp(field, "fc") == 0) { + PrintAndLogEx(INFO, "Field............ " _YELLOW_("fc")); + } else if (strcmp(field, "cn") == 0) { + PrintAndLogEx(INFO, "Field............ " _YELLOW_("cn")); + } switch (direction) { case 0: - PrintAndLogEx(INFO, "Direction........ " _YELLOW_("BOTH")); + PrintAndLogEx(INFO, "Direction........ " _YELLOW_("both")); break; case 1: - PrintAndLogEx(INFO, "Direction........ " _YELLOW_("UP")); + PrintAndLogEx(INFO, "Direction........ " _YELLOW_("up")); break; case 2: - PrintAndLogEx(INFO, "Direction........ " _YELLOW_("DOWN")); + PrintAndLogEx(INFO, "Direction........ " _YELLOW_("down")); break; default: break; } } PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "Started brute-forcing HID Prox reader"); + PrintAndLogEx(INFO, "Started bruteforcing HID Prox reader"); PrintAndLogEx(INFO, "Press " _GREEN_("") " or pm3-button to abort simulation"); PrintAndLogEx(NORMAL, ""); // copy values to low. - cn_low = cn_hi; + card_low = card_hi; // main loop - // iceman: could add options for bruteforcing OEM, ISSUE or FC as well.. bool exitloop = false; bool fin_hi, fin_low; fin_hi = fin_low = false; @@ -578,27 +587,43 @@ static int CmdHIDBrute(const char *Cmd) { return sendPing(); } - // do one up - if (direction != 2) { - if (cn_hi.CardNumber < 0xFFFF) { - if (sendTry(format_idx, &cn_hi, delay, verbose) != PM3_SUCCESS) { - return PM3_ESOFT; + // do one up + if (direction != 2 && fin_hi != true) { + if (sendTry(format_idx, &card_hi, delay, verbose) != PM3_SUCCESS) { + return PM3_ESOFT; + } + if (strcmp(field, "fc") == 0) { + if (card_hi.FacilityCode < 0xFF) { + card_hi.FacilityCode++; + } else { + fin_hi = true; + } + } else if (strcmp(field, "cn") == 0) { + if (card_hi.CardNumber < 0xFFFF) { + card_hi.CardNumber++; + } else { + fin_hi = true; } - cn_hi.CardNumber++; - } else { - fin_hi = true; } } // do one down - if (direction != 1) { - if (cn_low.CardNumber > 0) { - cn_low.CardNumber--; - if (sendTry(format_idx, &cn_low, delay, verbose) != PM3_SUCCESS) { - return PM3_ESOFT; + if (direction != 1 && fin_low != true) { + if (sendTry(format_idx, &card_low, delay, verbose) != PM3_SUCCESS) { + return PM3_ESOFT; + } + if (strcmp(field, "fc") == 0) { + if (card_low.FacilityCode > 0) { + card_low.FacilityCode--; + } else { + fin_low = true; + } + } else if (strcmp(field, "cn") == 0) { + if (card_low.CardNumber > 0) { + card_low.CardNumber--; + } else { + fin_low = true; } - } else { - fin_low = true; } } @@ -620,7 +645,8 @@ static int CmdHIDBrute(const char *Cmd) { } while (exitloop == false); - PrintAndLogEx(INFO, "Brute forcing finished"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "Bruteforcing finished"); return PM3_SUCCESS; } @@ -630,8 +656,8 @@ static command_t CommandTable[] = { {"reader", CmdHIDReader, IfPm3Lf, "attempt to read and extract tag data"}, {"clone", CmdHIDClone, IfPm3Lf, "clone HID tag to T55x7"}, {"sim", CmdHIDSim, IfPm3Lf, "simulate HID tag"}, - {"brute", CmdHIDBrute, IfPm3Lf, "bruteforce card number against reader"}, - {"watch", CmdHIDWatch, IfPm3Lf, "continuously watch for cards. Reader mode"}, + {"brute", CmdHIDBrute, IfPm3Lf, "bruteforce HID tag while maintaining specific parameter values"}, + {"watch", CmdHIDWatch, IfPm3Lf, "continuously watch for cards"}, {NULL, NULL, NULL, NULL} }; From 702716b59750b26e00d08780e6b3256d98e759ef Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Mon, 27 Feb 2023 13:05:16 -0700 Subject: [PATCH 245/924] Fix formatting --- client/src/cmdlfhid.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index fa6399b9e..de2e9dc29 100755 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -476,7 +476,7 @@ static int CmdHIDBrute(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf hid brute", "Enables bruteforce of HID readers while maintaining specific parameter values.\n" - "If the field being bruteforced is provided, it starts with it and goes up / down one step while maintaining other supplied values.\n" + "If the field being bruteforced is provided, it starts with it and goes up / down one step while maintaining other supplied values.\n" "If the field being bruteforced is not provided, it will iterate through the full range while maintaining other supplied values.", "lf hid brute -w H10301 -f fc --fc 224 --cn 6278\n" "lf hid brute -w H10301 -f cn --fc 21 -d 2000\n" @@ -488,12 +488,12 @@ static int CmdHIDBrute(const char *Cmd) { arg_param_begin, arg_lit0("v", "verbose", "verbose output"), arg_str1("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), - arg_str1("f", "field", "", "field to bruteforce"), - arg_u64_0(NULL, "fc", "", "facility code"), - arg_u64_0(NULL, "cn", "", "card number"), - arg_u64_0("i", "issue", "", "issue level"), - arg_u64_0("o", "oem", "", "OEM code"), - arg_u64_0("d", "delay", "", "delay betweens attempts in ms. (default is 1000)"), + arg_str1("f", "field", "", "field to bruteforce"), + arg_u64_0(NULL, "fc", "", "facility code"), + arg_u64_0(NULL, "cn", "", "card number"), + arg_u64_0("i", "issue", "", "issue level"), + arg_u64_0("o", "oem", "", "OEM code"), + arg_u64_0("d", "delay", "", "delay betweens attempts in ms. (default is 1000)"), arg_lit0(NULL, "up", "direction to increment field value. (default is both directions)"), arg_lit0(NULL, "down", "direction to decrement field value. (default is both directions)"), arg_param_end From 21a1defa88840596614012ee5aa99c2f41c62043 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Mon, 27 Feb 2023 13:06:38 -0700 Subject: [PATCH 246/924] Fix formatting --- client/src/cmdlfhid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index de2e9dc29..d6349e9ad 100755 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -488,7 +488,7 @@ static int CmdHIDBrute(const char *Cmd) { arg_param_begin, arg_lit0("v", "verbose", "verbose output"), arg_str1("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), - arg_str1("f", "field", "", "field to bruteforce"), + arg_str1("f", "field", "", "field to bruteforce"), arg_u64_0(NULL, "fc", "", "facility code"), arg_u64_0(NULL, "cn", "", "card number"), arg_u64_0("i", "issue", "", "issue level"), From 3bcac0cc64e8b7e918f70ccb2d4826e43c3b2cf7 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Tue, 28 Feb 2023 07:24:24 -0700 Subject: [PATCH 247/924] Updated arguments and help text --- client/src/cmdlfhid.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index d6349e9ad..424c043c4 100755 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -488,7 +488,7 @@ static int CmdHIDBrute(const char *Cmd) { arg_param_begin, arg_lit0("v", "verbose", "verbose output"), arg_str1("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), - arg_str1("f", "field", "", "field to bruteforce"), + arg_str1(NULL, "field", "", "field to bruteforce. can be _YELLOW("`fc`") for facility code, or _YELLOW("`cn`") for card number"), arg_u64_0(NULL, "fc", "", "facility code"), arg_u64_0(NULL, "cn", "", "card number"), arg_u64_0("i", "issue", "", "issue level"), @@ -656,8 +656,8 @@ static command_t CommandTable[] = { {"reader", CmdHIDReader, IfPm3Lf, "attempt to read and extract tag data"}, {"clone", CmdHIDClone, IfPm3Lf, "clone HID tag to T55x7"}, {"sim", CmdHIDSim, IfPm3Lf, "simulate HID tag"}, - {"brute", CmdHIDBrute, IfPm3Lf, "bruteforce HID tag while maintaining specific parameter values"}, - {"watch", CmdHIDWatch, IfPm3Lf, "continuously watch for cards"}, + {"brute", CmdHIDBrute, IfPm3Lf, "bruteforce facility code or card number against reader"}, + {"watch", CmdHIDWatch, IfPm3Lf, "continuously watch for cards. Reader mode"}, {NULL, NULL, NULL, NULL} }; From cd5fa61683f742ea835c84d982fa6c0d2c00918a Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Tue, 28 Feb 2023 07:28:06 -0700 Subject: [PATCH 248/924] Update help text --- client/src/cmdlfhid.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index 424c043c4..19c7a3ea0 100755 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -475,13 +475,13 @@ static int CmdHIDClone(const char *Cmd) { static int CmdHIDBrute(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf hid brute", - "Enables bruteforce of HID readers while maintaining specific parameter values.\n" + "Enables bruteforce of HID readers with specified facility code or card number. This is an attack against the reader.\n" "If the field being bruteforced is provided, it starts with it and goes up / down one step while maintaining other supplied values.\n" "If the field being bruteforced is not provided, it will iterate through the full range while maintaining other supplied values.", - "lf hid brute -w H10301 -f fc --fc 224 --cn 6278\n" - "lf hid brute -w H10301 -f cn --fc 21 -d 2000\n" - "lf hid brute -v -w H10301 -f cn --fc 21 --cn 200 -d 2000\n" - "lf hid brute -v -w H10301 -f fc --fc 21 --cn 200 -d 2000 --up\n" + "lf hid brute -w H10301 --field fc --fc 224 --cn 6278\n" + "lf hid brute -w H10301 --field cn --fc 21 -d 2000\n" + "lf hid brute -v -w H10301 --field cn --fc 21 --cn 200 -d 2000\n" + "lf hid brute -v -w H10301 --field fc --fc 21 --cn 200 -d 2000 --up\n" ); void *argtable[] = { From b486f3bba4855bf31daee88a126215ddbed7b62c Mon Sep 17 00:00:00 2001 From: weejhsteve <92703857+weejhsteve@users.noreply.github.com> Date: Wed, 1 Mar 2023 11:23:14 +0800 Subject: [PATCH 249/924] Update mfc_default_keys.dic # Food GEM 6686FADE5566 Signed-off-by: weejhsteve <92703857+weejhsteve@users.noreply.github.com> --- client/dictionaries/mfc_default_keys.dic | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index a522b001b..f3118f946 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2028,3 +2028,5 @@ F72CD208FDF9 # # 1k - waldorf astoria 011C6CF459E8 +# Food GEM +6686FADE5566 From 194895e9af9df0e817fd70f5c2d2dce4f07f29bc Mon Sep 17 00:00:00 2001 From: weejhsteve <92703857+weejhsteve@users.noreply.github.com> Date: Wed, 1 Mar 2023 15:48:22 +0800 Subject: [PATCH 250/924] Update mfc_default_keys.dic Tidying up. forgot leave a blank comment line. Signed-off-by: weejhsteve <92703857+weejhsteve@users.noreply.github.com> --- client/dictionaries/mfc_default_keys.dic | 1 + 1 file changed, 1 insertion(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index f3118f946..098cd3019 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2028,5 +2028,6 @@ F72CD208FDF9 # # 1k - waldorf astoria 011C6CF459E8 +# # Food GEM 6686FADE5566 From 13e43b1eb5ac53b5c63d2dd52de56d3d7711a2e8 Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:57:35 +0100 Subject: [PATCH 251/924] hf mfdes: Examples where using -s instead of --schann --- client/src/cmdhfmfdes.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 00c6306e7..cf6699180 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -2196,9 +2196,9 @@ static int CmdHF14ADesSetConfiguration(const char *Cmd) { "\n" "hf mfdes setconfig --param 03 --data 0428 -> set SAK\n" "hf mfdes setconfig --param 02 --data 0875778102637264 -> set ATS (first byte - length)\n" - "hf mfdes setconfig --isoid df01 -t aes -s ev2 --param 05 --data 00000000020000000000 -> set LRP mode enable for Desfire Light\n" - "hf mfdes setconfig --isoid df01 -t aes -s ev2 --param 0a --data 00ffffffff -> Disable failed auth counters for Desfire Light\n" - "hf mfdes setconfig --isoid df01 -t aes -s lrp --param 0a --data 00ffffffff -> Disable failed auth counters for Desfire Light via lrp"); + "hf mfdes setconfig --isoid df01 -t aes --schann ev2 --param 05 --data 00000000020000000000 -> set LRP mode enable for Desfire Light\n" + "hf mfdes setconfig --isoid df01 -t aes --schann ev2 --param 0a --data 00ffffffff -> Disable failed auth counters for Desfire Light\n" + "hf mfdes setconfig --isoid df01 -t aes --schann lrp --param 0a --data 00ffffffff -> Disable failed auth counters for Desfire Light via lrp"); void *argtable[] = { arg_param_begin, @@ -2305,7 +2305,7 @@ static int CmdHF14ADesChangeKey(const char *Cmd) { "but for APP keys crypto algorithm is set by createapp command and can't be changed wo application delete\n" "\n" "hf mfdes changekey --aid 123456 -> execute with default factory setup. change des key 0 in the app 123456 from 00..00 to 00..00\n" - "hf mfdes changekey --isoid df01 -t aes -s lrp --newkeyno 01 -> change key 01 via lrp channel" + "hf mfdes changekey --isoid df01 -t aes --schann lrp --newkeyno 01 -> change key 01 via lrp channel" "hf mfdes changekey -t des --newalgo aes --newkey 11223344556677889900112233445566 --newver a5 -> change card master key to AES one\n" "hf mfdes changekey --aid 123456 -t aes --key 00000000000000000000000000000000 --newkey 11223344556677889900112233445566 -> change app master key\n" "hf mfdes changekey --aid 123456 -t des -n 0 --newkeyno 1 --oldkey 5555555555555555 --newkey 1122334455667788 -> change key 1 with auth from key 0\n" @@ -2706,7 +2706,7 @@ static int CmdHF14ADesGetUID(const char *Cmd) { CLIParserInit(&ctx, "hf mfdes getuid", "Get UID from card. Get the real UID if the random UID bit is on and get the same UID as in anticollision if not. Any card's key needs to be provided. ", "hf mfdes getuid -> execute with default factory setup\n" - "hf mfdes getuid --isoid df01 -t aes -s lrp -> for desfire lights default settings"); + "hf mfdes getuid --isoid df01 -t aes --schan lrp -> for desfire lights default settings"); void *argtable[] = { arg_param_begin, @@ -3375,7 +3375,7 @@ static int CmdHF14ADesGetFileISOIDs(const char *Cmd) { "hf mfdes getfileisoids --aid 123456 -> execute with defaults from `default` command\n" "hf mfdes getfileisoids -n 0 -t des -k 0000000000000000 --kdf none --aid 123456 -> execute with default factory setup\n" "hf mfdes getfileisoids --isoid df01 -> get iso file ids from Desfire Light with factory card settings\n" - "hf mfdes getfileisoids --isoid df01 -s lrp -t aes -> get iso file ids from Desfire Light via lrp channel with default key authentication"); + "hf mfdes getfileisoids --isoid df01 --schann lrp -t aes -> get iso file ids from Desfire Light via lrp channel with default key authentication"); void *argtable[] = { arg_param_begin, @@ -3618,7 +3618,7 @@ static int CmdHF14ADesChFileSettings(const char *Cmd) { "hf mfdes chfilesettings --aid 123456 --fid 01 --amode plain --rrights free --wrights free --rwrights free --chrights key0 -> change file settings app=123456, file=01 with defaults from `default` command\n" "hf mfdes chfilesettings -n 0 -t des -k 0000000000000000 --kdf none --aid 123456 --fid 01 --rawdata 00EEEE -> execute with default factory setup\n" "hf mfdes chfilesettings --aid 123456 --fid 01 --rawdata 810000021f112f22 -> change file settings with additional rights for keys 1 and 2\n" - "hf mfdes chfilesettings --isoid df01 --fid 00 --amode plain --rawrights eee0 -s lrp -t aes -> change file settings via lrp channel"); + "hf mfdes chfilesettings --isoid df01 --fid 00 --amode plain --rawrights eee0 --schann lrp -t aes -> change file settings via lrp channel"); void *argtable[] = { arg_param_begin, @@ -4143,8 +4143,8 @@ static int CmdHF14ADesCreateTrMACFile(const char *Cmd) { "hf mfdes createmacfile --aid 123456 --fid 01 --rawrights 0FF0 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file with parameters. Rights from default. Authentication with defaults from `default` command\n" "hf mfdes createmacfile --aid 123456 --fid 01 --amode plain --rrights free --wrights deny --rwrights free --chrights key0 --mackey 00112233445566778899aabbccddeeff -> create file app=123456, file=01, with key, and mentioned rights with defaults from `default` command\n" "hf mfdes createmacfile -n 0 -t des -k 0000000000000000 --kdf none --aid 123456 --fid 01 -> execute with default factory setup. key and keyver == 0x00..00\n" - "hf mfdes createmacfile --isoid df01 --fid 0f -s lrp -t aes --rawrights 0FF0 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file via lrp channel\n" - "hf mfdes createmacfile --isoid df01 --fid 0f -s lrp -t aes --rawrights 0F10 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file via lrp channel with CommitReaderID command enable"); + "hf mfdes createmacfile --isoid df01 --fid 0f --schann lrp -t aes --rawrights 0FF0 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file via lrp channel\n" + "hf mfdes createmacfile --isoid df01 --fid 0f --schann lrp -t aes --rawrights 0F10 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file via lrp channel with CommitReaderID command enable"); void *argtable[] = { arg_param_begin, @@ -4261,7 +4261,7 @@ static int CmdHF14ADesDeleteFile(const char *Cmd) { CLIParserInit(&ctx, "hf mfdes deletefile", "Delete file from application. Master key needs to be provided or flag --no-auth set (depend on cards settings).", "hf mfdes deletefile --aid 123456 --fid 01 -> delete file for: app=123456, file=01 with defaults from `default` command\n" - "hf mfdes deletefile --isoid df01 --fid 0f -s lrp -t aes -> delete file for lrp channel"); + "hf mfdes deletefile --isoid df01 --fid 0f --schann lrp -t aes -> delete file for lrp channel"); void *argtable[] = { arg_param_begin, @@ -4338,8 +4338,8 @@ static int CmdHF14ADesValueOperations(const char *Cmd) { "hf mfdes value --aid 123456 --fid 01 -> get value app=123456, file=01 with defaults from `default` command\n" "hf mfdes value --aid 123456 --fid 01 --op credit -d 00000001 -> credit value app=123456, file=01 with defaults from `default` command\n" "hf mfdes value -n 0 -t des -k 0000000000000000 --kdf none --aid 123456 --fid 01 -> get value with default factory setup\n" - "hf mfdes val --isoid df01 --fid 03 -s lrp -t aes -n 1 --op credit --d 00000001 -m encrypt -> credit value in the lrp encrypted mode\n" - "hf mfdes val --isoid df01 --fid 03 -s lrp -t aes -n 1 --op get -m plain -> get value in plain (nevertheless of mode) works for desfire light (look SetConfiguration option 0x09)"); + "hf mfdes val --isoid df01 --fid 03 --schann lrp -t aes -n 1 --op credit --d 00000001 -m encrypt -> credit value in the lrp encrypted mode\n" + "hf mfdes val --isoid df01 --fid 03 --schann lrp -t aes -n 1 --op get -m plain -> get value in plain (nevertheless of mode) works for desfire light (look SetConfiguration option 0x09)"); void *argtable[] = { arg_param_begin, @@ -4511,7 +4511,7 @@ static int CmdHF14ADesClearRecordFile(const char *Cmd) { CLIParserInit(&ctx, "hf mfdes clearrecfile", "Clear record file. Master key needs to be provided or flag --no-auth set (depend on cards settings).", "hf mfdes clearrecfile --aid 123456 --fid 01 -> clear record file for: app=123456, file=01 with defaults from `default` command\n" - "hf mfdes clearrecfile --isoid df01 --fid 01 -s lrp -t aes -n 3 -> clear record file for lrp channel with key number 3"); + "hf mfdes clearrecfile --isoid df01 --fid 01 --schann lrp -t aes -n 3 -> clear record file for lrp channel with key number 3"); void *argtable[] = { arg_param_begin, @@ -4910,8 +4910,8 @@ static int CmdHF14ADesReadData(const char *Cmd) { "hf mfdes read --isoid 0102 --fileisoid 1000 --type data -c iso -> read file via ISO channel: app iso id=0102, iso id=1000, offset=0. Select via ISO commands\n" "hf mfdes read --isoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000001 -> get one record (number 5) from file 1100 via iso commands\n" "hf mfdes read --isoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000000 -> get all record (from 5 to 1) from file 1100 via iso commands\n" - "hf mfdes read --isoid df01 --fid 00 -s lrp -t aes --length 000010 -> read via lrp channel\n" - "hf mfdes read --isoid df01 --fid 00 -s ev2 -t aes --length 000010 --isochain -> read Desfire Light via ev2 channel"); + "hf mfdes read --isoid df01 --fid 00 --schann lrp -t aes --length 000010 -> read via lrp channel\n" + "hf mfdes read --isoid df01 --fid 00 --schann ev2 -t aes --length 000010 --isochain -> read Desfire Light via ev2 channel"); void *argtable[] = { arg_param_begin, @@ -5082,7 +5082,7 @@ static int CmdHF14ADesWriteData(const char *Cmd) { "hf mfdes write --isoid 1234 --fileisoid 1000 --type data -c iso -d 01020304 -> write data to std/backup file via iso commandset\n" "hf mfdes write --isoid 1234 --fileisoid 2000 --type record -c iso -d 01020304 -> send record to record file via iso commandset\n" "hf mfdes write --aid 123456 --fid 01 -d 01020304 --readerid 010203 -> write data to file with CommitReaderID command before write and CommitTransaction after write\n" - "hf mfdes write --isoid df01 --fid 04 -d 01020304 --trkey 00112233445566778899aabbccddeeff --readerid 5532 -t aes -s lrp -> advanced CommitReaderID via lrp channel sample"); + "hf mfdes write --isoid df01 --fid 04 -d 01020304 --trkey 00112233445566778899aabbccddeeff --readerid 5532 -t aes --schann lrp -> advanced CommitReaderID via lrp channel sample"); void *argtable[] = { arg_param_begin, @@ -5560,7 +5560,7 @@ static int CmdHF14ADesDump(const char *Cmd) { CLIParserInit(&ctx, "hf mfdes dump", "For each application show fil list and then file content. Key needs to be provided for authentication or flag --no-auth set (depend on cards settings).", "hf mfdes dump --aid 123456 -> show file dump for: app=123456 with channel defaults from `default` command/n" - "hf mfdes dump --isoid df01 -s lrp -t aes --length 000090 -> lrp default settings with length limit"); + "hf mfdes dump --isoid df01 --schann lrp -t aes --length 000090 -> lrp default settings with length limit"); void *argtable[] = { arg_param_begin, From d319b0dee34a1fa8b902176fde04379b791032f0 Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:03:30 +0100 Subject: [PATCH 252/924] hf mfdes: Use hex in error message, consistent with cmdline --- client/src/cmdhfmfdes.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index cf6699180..2f45b5165 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -4307,7 +4307,7 @@ static int CmdHF14ADesDeleteFile(const char *Cmd) { CLIParserFree(ctx); if (fnum > 0x1F) { - PrintAndLogEx(ERR, "File number range is invalid (exp 0 - 31), got %d", fnum); + PrintAndLogEx(ERR, "File number range is invalid (exp 0x00 - 0x1f), got 0x%02x", fnum); return PM3_EINVARG; } @@ -4557,7 +4557,7 @@ static int CmdHF14ADesClearRecordFile(const char *Cmd) { CLIParserFree(ctx); if (fnum > 0x1F) { - PrintAndLogEx(ERR, "File number range is invalid (exp 0 - 31), got %d", fnum); + PrintAndLogEx(ERR, "File number range is invalid (exp 0x00 - 0x1f), got 0x%02x", fnum); return PM3_EINVARG; } @@ -4989,7 +4989,7 @@ static int CmdHF14ADesReadData(const char *Cmd) { CLIParserFree(ctx); if (fnum > 0x1F) { - PrintAndLogEx(ERR, "File number range is invalid (exp 0 - 31), got %d", fnum); + PrintAndLogEx(ERR, "File number range is invalid (exp 0x00 - 0x1f), got 0x%02x", fnum); return PM3_EINVARG; } @@ -5188,7 +5188,7 @@ static int CmdHF14ADesWriteData(const char *Cmd) { CLIParserFree(ctx); if (fnum > 0x1F) { - PrintAndLogEx(ERR, "File number range is invalid (exp 0 - 31), got %d", fnum); + PrintAndLogEx(ERR, "File number range is invalid (exp 0x00 - 0x1f), got 0x%02x", fnum); return PM3_EINVARG; } From fc4e912fc1d42e13a8f858072ee7b2513ed84d4b Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Fri, 3 Mar 2023 17:33:38 +0100 Subject: [PATCH 253/924] MifareFesFireGetInformation(): warningw when tag answer is too short --- armsrc/mifaredesfire.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/armsrc/mifaredesfire.c b/armsrc/mifaredesfire.c index 3530dfd9b..04de05f21 100644 --- a/armsrc/mifaredesfire.c +++ b/armsrc/mifaredesfire.c @@ -182,6 +182,12 @@ void MifareDesfireGetInformation(void) { return; } + if (len < sizeof(payload.versionHW)+1) { + Dbprintf("Tag answer to MFDES_GET_VERSION was too short: data in Hardware Information is probably invalid."); + print_result("Answer", resp, len); + memset(resp+len, 0xFF, sizeof(payload.versionHW)+1 - len); // clear remaining bytes + } + memcpy(payload.versionHW, resp + 1, sizeof(payload.versionHW)); // ADDITION_FRAME 1 @@ -194,6 +200,13 @@ void MifareDesfireGetInformation(void) { switch_off(); return; } + + if (len < sizeof(payload.versionSW)+1) { + Dbprintf("Tag answer to MFDES_ADDITIONAL_FRAME 1 was too short: data in Software Information is probably invalid."); + print_result("Answer", resp, len); + memset(resp+len, 0xFF, sizeof(payload.versionSW)+1 - len); // clear remaining bytes + } + memcpy(payload.versionSW, resp + 1, sizeof(payload.versionSW)); // ADDITION_FRAME 2 @@ -206,6 +219,12 @@ void MifareDesfireGetInformation(void) { return; } + if (len < sizeof(payload.details)+1) { + Dbprintf("Tag answer to MFDES_ADDITIONAL_FRAME 2 was too short: data in Batch number and Production date is probably invalid"); + print_result("Answer", resp, len); + memset(resp+len, 0xFF, sizeof(payload.details)+1 - len); // clear remaining bytes + } + memcpy(payload.details, resp + 1, sizeof(payload.details)); LED_B_ON(); From 3444b5e38a431c1a7574d23e7ac8887c154947f7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 10:23:55 +0100 Subject: [PATCH 254/924] text --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c49a7c08e..b9f26516a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `hf mfdes info`- now handles incorrect tag answers better (@didiera) + - Fixed `hf mfdes` generic help text is now correct (@didiera) - Fixed `pm3` script to correctly identify WSL enabled distros (@henrygab) - Changed device enumeration with "unique USB serial numbers when built with `FLASH` -- **_UPDATES BOOTROM ALSO_**" (@henrygab) - Changed the readline package to v8.2 in the CMAKE files for the client (@iceman1001) From f424667d0c00e3da4570754ae8922a6eb799783c Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Sat, 4 Mar 2023 10:40:19 -0700 Subject: [PATCH 255/924] Fix syntax --- client/src/cmdlfhid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index 19c7a3ea0..d04de6cda 100755 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -488,7 +488,7 @@ static int CmdHIDBrute(const char *Cmd) { arg_param_begin, arg_lit0("v", "verbose", "verbose output"), arg_str1("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), - arg_str1(NULL, "field", "", "field to bruteforce. can be _YELLOW("`fc`") for facility code, or _YELLOW("`cn`") for card number"), + arg_str1(NULL, "field", "", "field to bruteforce. can be " _YELLOW("`fc`") " for facility code, or " _YELLOW("`cn`") " for card number"), arg_u64_0(NULL, "fc", "", "facility code"), arg_u64_0(NULL, "cn", "", "card number"), arg_u64_0("i", "issue", "", "issue level"), From 060f452530a038232b9baf69f6fbc90949ce0f22 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:03:53 +0100 Subject: [PATCH 256/924] fix text --- client/src/cmdlfhid.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index d04de6cda..f98ebb16d 100755 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -488,14 +488,14 @@ static int CmdHIDBrute(const char *Cmd) { arg_param_begin, arg_lit0("v", "verbose", "verbose output"), arg_str1("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), - arg_str1(NULL, "field", "", "field to bruteforce. can be " _YELLOW("`fc`") " for facility code, or " _YELLOW("`cn`") " for card number"), + arg_str1(NULL, "field", "", "field to bruteforce"), arg_u64_0(NULL, "fc", "", "facility code"), arg_u64_0(NULL, "cn", "", "card number"), arg_u64_0("i", "issue", "", "issue level"), arg_u64_0("o", "oem", "", "OEM code"), - arg_u64_0("d", "delay", "", "delay betweens attempts in ms. (default is 1000)"), - arg_lit0(NULL, "up", "direction to increment field value. (default is both directions)"), - arg_lit0(NULL, "down", "direction to decrement field value. (default is both directions)"), + arg_u64_0("d", "delay", "", "delay betweens attempts in ms. (def is 1000)"), + arg_lit0(NULL, "up", "direction to increment field value. (def is both directions)"), + arg_lit0(NULL, "down", "direction to decrement field value. (def is both directions)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); From 8f20eed914997fa5071f4f8801f117face61965a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:10:46 +0100 Subject: [PATCH 257/924] fix CID #405232 --- client/src/cmdlfem4x05.c | 3 +- client/src/cmdlfguard.c | 18 +- client/src/cmdlfhid.c | 6 +- client/src/pm3line_vocabulory.h | 1504 ++++++++++++------------- common_arm/flashmem.c | 4 +- tools/mfd_aes_brute/mfd_aes_brute.c | 2 +- tools/mfd_aes_brute/mfd_multi_brute.c | 2 +- 7 files changed, 770 insertions(+), 769 deletions(-) diff --git a/client/src/cmdlfem4x05.c b/client/src/cmdlfem4x05.c index cff7203d2..c21540f45 100644 --- a/client/src/cmdlfem4x05.c +++ b/client/src/cmdlfem4x05.c @@ -1265,7 +1265,8 @@ int CmdEM4x05Info(const char *Cmd) { // read word 1 (serial #) doesn't need pwd // continue if failed, .. non blocking fail. - em4x05_read_word_ext(EM_SERIAL_BLOCK, 0, false, &serial); + int res = em4x05_read_word_ext(EM_SERIAL_BLOCK, 0, false, &serial); + (void)res; printEM4x05info(block0, serial); diff --git a/client/src/cmdlfguard.c b/client/src/cmdlfguard.c index c31629c5a..d39cff47c 100644 --- a/client/src/cmdlfguard.c +++ b/client/src/cmdlfguard.c @@ -163,12 +163,12 @@ int demodGuard(bool verbose) { bool unknown = false; switch (fmtLen) { case 36: - PrintAndLogEx(DEBUG, "DEBUG: FC 1: %x", (plain[3] & 0x7F) << 7); - PrintAndLogEx(DEBUG, "DEBUG: FC 2: %x", plain[4] >> 1); - PrintAndLogEx(DEBUG, "DEBUG: Card 1: %x", (plain[4] & 1) << 19); - PrintAndLogEx(DEBUG, "DEBUG: Card 2: %x", plain[5] << 11); - PrintAndLogEx(DEBUG, "DEBUG: Card 3: %x", plain[6] << 3); - PrintAndLogEx(DEBUG, "DEBUG: Card 4: %x", (plain[7] & 0xE0) >> 5); + PrintAndLogEx(DEBUG, "DEBUG: FC 1: %x", (plain[3] & 0x7F) << 7); + PrintAndLogEx(DEBUG, "DEBUG: FC 2: %x", plain[4] >> 1); + PrintAndLogEx(DEBUG, "DEBUG: Card 1: %x", (plain[4] & 1) << 19); + PrintAndLogEx(DEBUG, "DEBUG: Card 2: %x", plain[5] << 11); + PrintAndLogEx(DEBUG, "DEBUG: Card 3: %x", plain[6] << 3); + PrintAndLogEx(DEBUG, "DEBUG: Card 4: %x", (plain[7] & 0xE0) >> 5); FC = ((plain[3] & 0x7F) << 7) | (plain[4] >> 1); Card = ((plain[4] & 1) << 19) | (plain[5] << 11) | (plain[6] << 3) | ((plain[7] & 0xE0) >> 5); break; @@ -271,7 +271,7 @@ static int CmdGuardClone(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - uint32_t xorval = arg_get_u32_def(ctx, 1, 0); + uint32_t xorval = arg_get_u32_def(ctx, 1, 0); uint32_t fmtlen = arg_get_u32_def(ctx, 2, 0); uint32_t fc = arg_get_u32_def(ctx, 3, 0); uint32_t cn = arg_get_u32_def(ctx, 4, 0); @@ -357,7 +357,7 @@ static int CmdGuardSim(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, false); - uint32_t xorval = arg_get_u32_def(ctx, 1, 0); + uint32_t xorval = arg_get_u32_def(ctx, 1, 0); uint32_t fmtlen = arg_get_u32_def(ctx, 2, 0); uint32_t fc = arg_get_u32_def(ctx, 3, 0); uint32_t cn = arg_get_u32_def(ctx, 4, 0); @@ -376,7 +376,7 @@ static int CmdGuardSim(const char *Cmd) { } PrintAndLogEx(SUCCESS, "Simulating Guardall Prox - xorKey: " _YELLOW_("%u") " Facility Code: " _YELLOW_("%u") " CardNumber: " _YELLOW_("%u") - , xorval + , xorval , facilitycode , cardnumber ); diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index f98ebb16d..d197a6dcb 100755 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -488,7 +488,7 @@ static int CmdHIDBrute(const char *Cmd) { arg_param_begin, arg_lit0("v", "verbose", "verbose output"), arg_str1("w", "wiegand", "", "see " _YELLOW_("`wiegand list`") " for available formats"), - arg_str1(NULL, "field", "", "field to bruteforce"), + arg_str1(NULL, "field", "", "field to bruteforce"), arg_u64_0(NULL, "fc", "", "facility code"), arg_u64_0(NULL, "cn", "", "card number"), arg_u64_0("i", "issue", "", "issue level"), @@ -515,7 +515,7 @@ static int CmdHIDBrute(const char *Cmd) { wiegand_card_t card_hi, card_low; memset(&card_hi, 0, sizeof(wiegand_card_t)); - + char field[3] = {0}; int field_len = 0; CLIParamStrToBuf(arg_get_str(ctx, 3), (uint8_t *)field, sizeof(field), &field_len); @@ -587,7 +587,7 @@ static int CmdHIDBrute(const char *Cmd) { return sendPing(); } - // do one up + // do one up if (direction != 2 && fin_hi != true) { if (sendTry(format_idx, &card_hi, delay, verbose) != PM3_SUCCESS) { return PM3_ESOFT; diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 8e775bd3e..2b42cf4fd 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,758 +31,758 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 0, "emv exec" }, - { 0, "emv pse" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 0, "emv gpo" }, - { 0, "emv readrec" }, - { 0, "emv genac" }, - { 0, "emv challenge" }, - { 0, "emv intauth" }, - { 0, "emv scan" }, - { 1, "emv test" }, - { 1, "emv list" }, - { 0, "emv roca" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 0, "hf mfp info" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp ndefread" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 0, "emv exec" }, + { 0, "emv pse" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 0, "emv gpo" }, + { 0, "emv readrec" }, + { 0, "emv genac" }, + { 0, "emv challenge" }, + { 0, "emv intauth" }, + { 0, "emv scan" }, + { 1, "emv test" }, + { 1, "emv list" }, + { 0, "emv roca" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 0, "hf mfp info" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp ndefread" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, { 0, "hf mfu tamper" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 0, "hf topaz dump" }, - { 1, "hf topaz list" }, - { 0, "hf topaz info" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 brute" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag cc" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 0, "hf topaz dump" }, + { 1, "hf topaz list" }, + { 0, "hf topaz info" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 0, "lf hitag eload" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag reader" }, + { 0, "lf hitag sim" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag writer" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag cc" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -790,4 +790,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif \ No newline at end of file +#endif diff --git a/common_arm/flashmem.c b/common_arm/flashmem.c index 435f51a57..94dcf1fd3 100644 --- a/common_arm/flashmem.c +++ b/common_arm/flashmem.c @@ -366,8 +366,8 @@ void Flashmem_print_status(void) { } } else { Dbprintf(" Device ID............... " _YELLOW_("%02X / %02X (unknown)"), - device_type.manufacturer_id, - device_type.device_id + device_type.manufacturer_id, + device_type.device_id ); } } diff --git a/tools/mfd_aes_brute/mfd_aes_brute.c b/tools/mfd_aes_brute/mfd_aes_brute.c index b19885f34..19bb54ce5 100644 --- a/tools/mfd_aes_brute/mfd_aes_brute.c +++ b/tools/mfd_aes_brute/mfd_aes_brute.c @@ -144,7 +144,7 @@ static void print_time(uint64_t at) { strftime(res, sizeof(res), "('%Y-%m-%d %H:%M:%S')", <); #else strftime(res, sizeof(res), "%s ('%Y-%m-%d %H:%M:%S')", <); -#endif +#endif printf("%s\n", res); } diff --git a/tools/mfd_aes_brute/mfd_multi_brute.c b/tools/mfd_aes_brute/mfd_multi_brute.c index bb2456aa1..226fd9f7f 100644 --- a/tools/mfd_aes_brute/mfd_multi_brute.c +++ b/tools/mfd_aes_brute/mfd_multi_brute.c @@ -174,7 +174,7 @@ static void print_time(uint64_t at) { strftime(res, sizeof(res), "('%Y-%m-%d %H:%M:%S')", <); #else strftime(res, sizeof(res), "%s ('%Y-%m-%d %H:%M:%S')", <); -#endif +#endif printf("%s\n", res); } From b3652c28bee689c23d7cadc979ff06255475305c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:12:00 +0100 Subject: [PATCH 258/924] fixc CID #405232 - init array --- client/src/cmdhffelica.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhffelica.c b/client/src/cmdhffelica.c index 773556543..191a481de 100644 --- a/client/src/cmdhffelica.c +++ b/client/src/cmdhffelica.c @@ -702,7 +702,7 @@ static int CmdHFFelicaAuthentication1(const char *Cmd) { PrintAndLogEx(INFO, "Reader challenge (unencrypted): %s", sprint_hex(nonce, 8)); // Create M1c Challenge with 3DES (3 Keys = 24, 2 Keys = 16) - uint8_t master_key[24]; + uint8_t master_key[24] = {0}; mbedtls_des3_context des3_ctx; mbedtls_des3_init(&des3_ctx); From 173841b53351f242f2ac69f7dd74d69cc959fd24 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:14:09 +0100 Subject: [PATCH 259/924] fix CID #405231 - resource leak --- client/src/cmdhfmfhard.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 7d930a8a3..4cb7873af 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -1481,6 +1481,9 @@ static int acquire_nonces(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_ if (got_match == false) { PrintAndLogEx(FAILED, "No match for the First_Byte_Sum (%u), is the card a genuine MFC Ev1? ", first_byte_Sum); + if (nonce_file_write) { + fclose(fnonces); + } return PM3_EWRONGANSWER; } From 95a19405d8c58a033372529b3e62207772b8a8d0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:17:06 +0100 Subject: [PATCH 260/924] fix CID #405230 - array too small --- client/src/cmdcrc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/cmdcrc.c b/client/src/cmdcrc.c index 98befcc00..ae424662c 100644 --- a/client/src/cmdcrc.c +++ b/client/src/cmdcrc.c @@ -424,8 +424,8 @@ static int CmdrevengSearch(const char *Cmd) { uint8_t width[NMODELS] = {0}; int count = 0; - char result[30]; - char revResult[30]; + char result[50 + 1] = {0}; + char revResult[50 + 1] = {0}; int ans = GetModels(Models, &count, width); bool found = false; if (!ans) { @@ -461,7 +461,7 @@ static int CmdrevengSearch(const char *Cmd) { continue; } - memset(result, 0, 30); + memset(result, 0, sizeof(result)); char *inCRC = calloc(crcChars + 1, sizeof(char)); if (inCRC == NULL) { return 0; From a0feb580c2173042e75cb75e0bdf940055be8af3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:20:10 +0100 Subject: [PATCH 261/924] fix CID #405227 - wrong comparision for the first fix --- client/src/cmdhfemrtd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfemrtd.c b/client/src/cmdhfemrtd.c index bb0808a51..c8edd2054 100644 --- a/client/src/cmdhfemrtd.c +++ b/client/src/cmdhfemrtd.c @@ -2018,7 +2018,7 @@ int infoHF_EMRTD_offline(const char *path) { } // coverity scan CID 395630, - if (data != NULL) { + if (data == NULL) { return PM3_ESOFT; } From b6be8d9532d548a3a485bebd952ff3a2d0a04046 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:24:20 +0100 Subject: [PATCH 262/924] fix CID # 405226 --- client/src/cmdhfmfdes.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 2f45b5165..18b160a9a 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -4843,14 +4843,17 @@ static int DesfileReadFileAndPrint(DesfireContext_t *dctx, } } - if (resplen > 0) { + if (resplen > 0 && reclen > 0) { size_t reccount = resplen / reclen; PrintAndLogEx(SUCCESS, "Read %zu bytes from file 0x%02x from record %d record count %zu record length %zu", resplen, fnum, offset, reccount, reclen); - if (reccount > 1) + if (reccount > 1) { PrintAndLogEx(SUCCESS, "Lastest record at the bottom."); + } + for (int i = 0; i < reccount; i++) { - if (i != 0) + if (i != 0) { PrintAndLogEx(SUCCESS, "Record %zu", reccount - (i + offset + 1)); + } print_buffer_with_offset(&resp[i * reclen], reclen, offset, (i == 0)); } } else { From 7504413f0bfc83c64af5b0f179d6dbe70ce6d727 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:29:39 +0100 Subject: [PATCH 263/924] fix CID #405225 --- client/src/cmdhfmf.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 57de6ee70..1a497c132 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -884,7 +884,7 @@ static int CmdHF14AMfDump(const char *Cmd) { if (fptr == NULL) return PM3_ESOFT; - strcpy(keyFilename, fptr); + strncpy(keyFilename, fptr, sizeof(keyFilename) - 1); free(fptr); } @@ -1179,7 +1179,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { if (fptr == NULL) return PM3_ESOFT; - strcpy(keyfilename, fptr); + strncpy(keyfilename, fptr, sizeof(keyfilename) - 1); free(fptr); } @@ -6009,7 +6009,7 @@ int CmdHFMFNDEFFormat(const char *Cmd) { if (keyfnlen == 0) { char *fptr = GenerateFilename("hf-mf-", "-key.bin"); if (fptr) { - strcpy(keyFilename, fptr); + strncpy(keyFilename, fptr, sizeof(keyFilename) - 1); } free(fptr); DropField(); @@ -6733,7 +6733,7 @@ static int CmdHF14AMfWipe(const char *Cmd) { if (fptr == NULL) return PM3_ESOFT; - strcpy(keyFilename, fptr); + strncpy(keyFilename, fptr, sizeof(keyFilename) - 1); free(fptr); } From f9da8615e4be9b776aadaafa61803365f03005c3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:32:34 +0100 Subject: [PATCH 264/924] fix CID #405224 --- client/src/cmdhfmf.c | 5 +++-- client/src/cmdhfmfu.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 1a497c132..d5a629e90 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2973,7 +2973,8 @@ all_found: free(fptr); return PM3_ESOFT; } - strcpy(filename, fptr); + + strncpy(filename, fptr, sizeof(filename) - 1); free(fptr); saveFile(filename, ".bin", dump, bytes); @@ -5411,7 +5412,7 @@ static int CmdHF14AMfice(const char *Cmd) { fptr = GenerateFilename("hf-mf-", "-nonces.bin"); if (fptr == NULL) return PM3_EFILE; - strcpy(filename, fptr); + strncpy(filename, fptr, sizeof(filename) - 1); free(fptr); } diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index d5ac6537b..963786ebc 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2870,7 +2870,7 @@ static int CmdHF14AMfURestore(const char *Cmd) { if (fnlen == 0) { char *fptr = GenerateFilename("hf-mfu-", "-dump.bin"); if (fptr != NULL) { - strcpy(filename, fptr); + strncpy(filename, fptr, sizeof(filename) - 1); } else { snprintf(filename, sizeof(filename), "dumpdata.bin"); } From aebbdaea2da45a4a12c101fba3b20fed2a665d05 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 20:36:28 +0100 Subject: [PATCH 265/924] fix CID #405223 - use after free, all callers must handle bad returns properly --- client/src/cmdhfmfdes.c | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 18b160a9a..d1451dae9 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -3572,7 +3572,6 @@ static int DesfireCreateFileParameters( bool userawfrights = false; if (frightsid) { if (CLIGetUint32Hex(ctx, frightsid, 0xeeee, &frights, &userawfrights, 2, "File rights must have 2 bytes length")) { - CLIParserFree(ctx); return PM3_EINVARG; } } From c6a8f8cc8901cef63004425e14db33043e2a8b49 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 21:25:23 +0100 Subject: [PATCH 266/924] fix test --- client/src/cmdlfguard.c | 10 +++++----- tools/pm3_tests.sh | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/cmdlfguard.c b/client/src/cmdlfguard.c index d39cff47c..4ba98d903 100644 --- a/client/src/cmdlfguard.c +++ b/client/src/cmdlfguard.c @@ -86,9 +86,9 @@ static int demod_guard_raw(uint8_t *raw, uint8_t rlen) { } if (unknown) - PrintAndLogEx(SUCCESS, "G-Prox-II - xorKey: " _GREEN_("%u")" Unknown len: " _GREEN_("%u") ", Raw: %s", xorKey, fmtlen, sprint_hex_inrow(raw, rlen)); + PrintAndLogEx(SUCCESS, "G-Prox-II - Unknown len: " _GREEN_("%u") "xor: " _GREEN_("%u")", Raw: %s", fmtlen, xorKey, sprint_hex_inrow(raw, rlen)); else - PrintAndLogEx(SUCCESS, "G-Prox-II - xorKey: " _GREEN_("%u")" Len: " _GREEN_("%u")" FC: " _GREEN_("%u") " Card: " _GREEN_("%u") ", Raw: %s", xorKey, fmtlen, FC, Card, sprint_hex_inrow(raw, rlen)); + PrintAndLogEx(SUCCESS, "G-Prox-II - Len: " _GREEN_("%u")" FC: " _GREEN_("%u") " Card: " _GREEN_("%u") "xor: " _GREEN_("%u")", Raw: %s", fmtlen, FC, Card, xorKey, sprint_hex_inrow(raw, rlen)); return PM3_SUCCESS; } @@ -180,10 +180,10 @@ int demodGuard(bool verbose) { unknown = true; break; } - if (!unknown) - PrintAndLogEx(SUCCESS, "G-Prox-II - xorKey: " _GREEN_("%u") " Len: " _GREEN_("%u")" FC: " _GREEN_("%u") " Card: " _GREEN_("%u") ", Raw: %08x%08x%08x", xorKey, fmtLen, FC, Card, raw1, raw2, raw3); + if (unknown) + PrintAndLogEx(SUCCESS, "G-Prox-II - Unknown len: " _GREEN_("%u") " xor: " _GREEN_("%u")", Raw: %08x%08x%08x ", fmtLen, xorKey, raw1, raw2, raw3); else - PrintAndLogEx(SUCCESS, "G-Prox-II - xorKey: " _GREEN_("%u") " Unknown len: " _GREEN_("%u") ", Raw: %08x%08x%08x", xorKey, fmtLen, raw1, raw2, raw3); + PrintAndLogEx(SUCCESS, "G-Prox-II - Len: " _GREEN_("%u")" FC: " _GREEN_("%u") " Card: " _GREEN_("%u") " xor: " _GREEN_("%u") ", Raw: %08x%08x%08x", fmtLen, FC, Card, xorKey, raw1, raw2, raw3); return PM3_SUCCESS; } diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index d03e488e6..f116de2b1 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -428,7 +428,7 @@ while true; do "GALLAGHER - Region: 1 Facility: 16640 Card No.: 201 Issue Level: 1"; then break; fi if ! CheckExecute slow "lf T55 gproxii test" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_gproxii.pm3; lf search -1'" "Guardall G-Prox II ID found"; then break; fi if ! CheckExecute slow "lf T55 gproxii test2" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_gproxii.pm3; lf gproxii demod'" \ - "G-Prox-II - len: 26 FC: 123 Card: 11223, Raw: f98c7038c63356c7ac26398c"; then break; fi + "G-Prox-II - Len: 26 FC: 123 Card: 11223 xor: 102, Raw: f98c7038c63356c7ac26398c"; then break; fi if ! CheckExecute slow "lf T55 hid test" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_hid.pm3; lf search -1'" "HID Prox ID found"; then break; fi if ! CheckExecute slow "lf T55 hid test2" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_hid.pm3; lf hid demod'" \ "FC: 118 CN: 1603"; then break; fi From 855f13d76312e8b69e508b8408e406af0673b6fb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 21:25:44 +0100 Subject: [PATCH 267/924] string formatter --- client/src/nfc/ndef.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index 2fa05d4ad..b995a3e19 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -1069,16 +1069,16 @@ int NDEFDecodeAndPrint(uint8_t *ndef, size_t ndefLen, bool verbose) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, "--- " _CYAN_("NDEF Memory Control") " ---"); if (len != 3) { - PrintAndLogEx(WARNING, "NDEF Memory Control block size must be 3 instead of %d", len); + PrintAndLogEx(WARNING, "NDEF Memory Control block size must be 3 instead of %u", len); } else { uint8_t pages_addr = (ndef[indx] >> 4) & 0x0f; uint8_t byte_offset = ndef[indx] & 0x0f; uint8_t Size = ndef[indx + 1]; uint8_t bytes_per_page = ndef[indx + 2] & 0x0f; - PrintAndLogEx(SUCCESS, "Pages addr (number of pages).... %d", pages_addr); - PrintAndLogEx(SUCCESS, "Byte offset (number of bytes)... %d", byte_offset); - PrintAndLogEx(SUCCESS, "Reserved area size in bits...... %d ( %d bytes )", Size, Size / 8); - PrintAndLogEx(SUCCESS, " Number of bytes / page... %d", bytes_per_page); + PrintAndLogEx(SUCCESS, "Pages addr (number of pages).... %u", pages_addr); + PrintAndLogEx(SUCCESS, "Byte offset (number of bytes)... %u", byte_offset); + PrintAndLogEx(SUCCESS, "Reserved area size in bits...... %u ( %u bytes )", Size, Size / 8); + PrintAndLogEx(SUCCESS, " Number of bytes / page... %u", bytes_per_page); } indx += len; break; @@ -1091,7 +1091,7 @@ int NDEFDecodeAndPrint(uint8_t *ndef, size_t ndefLen, bool verbose) { if (len == 0) { PrintAndLogEx(SUCCESS, "Found NDEF message w zero length"); } else { - PrintAndLogEx(SUCCESS, "Found NDEF message ( " _YELLOW_("%d") " bytes )", len); + PrintAndLogEx(SUCCESS, "Found NDEF message ( " _YELLOW_("%u") " bytes )", len); int res = NDEFRecordsDecodeAndPrint(&ndef[indx], len, verbose); if (res != PM3_SUCCESS) From 514626a0ab766655512bf0f37f3f009942b7f883 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 4 Mar 2023 21:26:12 +0100 Subject: [PATCH 268/924] init array --- client/src/cmdlfem4x50.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index 3bed45d1d..9b5bac06b 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -555,7 +555,7 @@ int em4x50_read(em4x50_data_t *etd, em4x50_word_t *out) { return PM3_ESOFT; uint8_t *data = resp.data.asBytes; - em4x50_word_t words[EM4X50_NO_WORDS]; + em4x50_word_t words[EM4X50_NO_WORDS] = {0}; prepare_result(data, etd->addresses & 0xFF, (etd->addresses >> 8) & 0xFF, words); if (out != NULL) From 37ecae658f8c268086bb300b30980f725f967102 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 5 Mar 2023 08:20:10 +0100 Subject: [PATCH 269/924] added data num command. Takes dec or hex or binary and convert between them. Uses big_int so no issue with hex -> dec limits. It also does a Prime number check, where it will a line in the case of a number happens to be prime. --- CHANGELOG.md | 3 +- client/src/cmddata.c | 148 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 144 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9f26516a..937c092ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Fixed `hf mfdes info`- now handles incorrect tag answers better (@didiera) + - Added `data num` - easy convert between dec/hex/bin (@iceman1001) + - Fixed `hf mfdes info` - now handles incorrect tag answers better (@didiera) - Fixed `hf mfdes` generic help text is now correct (@didiera) - Fixed `pm3` script to correctly identify WSL enabled distros (@henrygab) - Changed device enumeration with "unique USB serial numbers when built with `FLASH` -- **_UPDATES BOOTROM ALSO_**" (@henrygab) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index b9ca854f1..724bc5c65 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -35,6 +35,9 @@ #include "cmdlft55xx.h" // print... #include "crypto/asn1utils.h" // ASN1 decode / print #include "cmdflashmemspiffs.h" // SPIFFS flash memory download +#include "mbedtls/bignum.h" // big num +#include "mbedtls/entropy.h" // +#include "mbedtls/ctr_drbg.h" // random generator uint8_t g_DemodBuffer[MAX_DEMOD_BUF_LEN]; size_t g_DemodBufferLen = 0; @@ -2425,6 +2428,19 @@ static int CmdZerocrossings(const char *Cmd) { return PM3_SUCCESS; } +static bool data_verify_hex(uint8_t *d, size_t n) { + if (d == NULL) + return false; + + for (size_t i = 0; i < n; i++) { + if (isxdigit(d[i]) == false) { + PrintAndLogEx(ERR, "Non hex digit found"); + return false; + } + } + return true; +} + /** * @brief Utility for conversion via cmdline. * @param Cmd @@ -2501,12 +2517,8 @@ static int Cmdhex2bin(const char *Cmd) { return PM3_EINVARG; } - for (int i = 0; i < dlen; i++) { - char x = data[i]; - if (isxdigit(x) == false) { - PrintAndLogEx(ERR, "Non hex digit found"); - return PM3_EINVARG; - } + if (data_verify_hex((uint8_t*)data, dlen) == false) { + return PM3_EINVARG; } PrintAndLogEx(SUCCESS, "" NOLF); @@ -3166,6 +3178,129 @@ static int CmdDiff(const char *Cmd) { return PM3_SUCCESS; } +static int CmdNumCon(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "data num", + "Function takes a decimal or hexdecimal number and print it in decimal/hex/binary\n" + "Will print message if number is a prime number\n", + "data num --dec 2023\n" + "data num --hex 0x1000\n" + ); + + void *argtable[] = { + arg_param_begin, + arg_str0(NULL, "dec", "", "decimal value"), + arg_str0(NULL, "hex", "", "hexadecimal value"), + arg_str0(NULL, "bin", "", "binary value"), + arg_lit0("i", NULL, "print inverted value"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + int dlen = 256; + char dec[256]; + memset(dec, 0, sizeof(dec)); + int res = CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)dec, sizeof(dec), &dlen); + + + int hlen = 256; + char hex[256]; + memset(hex, 0, sizeof(hex)); + res = CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)hex, sizeof(hex), &hlen); + + int blen = 256; + char bin[256]; + memset(bin, 0, sizeof(bin)); + res = CLIParamStrToBuf(arg_get_str(ctx, 3), (uint8_t *)bin, sizeof(bin), &blen); + + bool shall_invert = arg_get_lit(ctx, 4); + CLIParserFree(ctx); + + // sanity checks + if (res) { + PrintAndLogEx(FAILED, "Error parsing bytes"); + return PM3_EINVARG; + } + + // results for MPI actions + bool ret = false; + + // container of big number + mbedtls_mpi N; + mbedtls_mpi_init(&N); + + + // hex + if (hlen > 0) { + if (data_verify_hex((uint8_t*)hex, hlen) == false) { + return PM3_EINVARG; + } + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&N, 16, hex)); + } + + // decimal + if (dlen > 0) { + // should have decimal string check here too + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&N, 10, dec)); + } + + // binary + if (blen > 0) { + // should have bianry string check here too + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&N, 2, bin)); + } + + mbedtls_mpi base; + mbedtls_mpi_init(&base); + mbedtls_mpi_add_int(&base, &base, 10); + + if (shall_invert) { + PrintAndLogEx(INFO, "should invert"); + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&N, &N, &base)); + } + + // printing + typedef struct { + const char* desc; + uint8_t radix; + } radix_t; + + radix_t radix[] = { + {"dec..... ", 10}, + {"hex..... 0x", 16}, + {"bin..... 0b", 2} + }; + + char s[600] = {0}; + size_t slen = 0; + + for (uint8_t i=0; i < ARRAYLEN(radix); i++) { + MBEDTLS_MPI_CHK(mbedtls_mpi_write_string(&N, radix[i].radix, s, sizeof(s), &slen)); + if (slen > 0) { + PrintAndLogEx(INFO, "%s%s", radix[i].desc, s); + } + } + + // check if number is a prime + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_ctr_drbg_init(&ctr_drbg); + mbedtls_entropy_init(&entropy); + + MBEDTLS_MPI_CHK(mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0 )); + + res = mbedtls_mpi_is_prime_ext( &N, 50, mbedtls_ctr_drbg_random, &ctr_drbg ); + if (res == 0) { + PrintAndLogEx(INFO, "prime... " _YELLOW_("yes")); + } + +cleanup: + mbedtls_mpi_free(&N); + mbedtls_mpi_free(&base); + mbedtls_entropy_free(&entropy); + mbedtls_ctr_drbg_free(&ctr_drbg); + return PM3_SUCCESS; +} static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, @@ -3209,6 +3344,7 @@ static command_t CommandTable[] = { {"hexsamples", CmdHexsamples, IfPm3Present, "Dump big buffer as hex bytes"}, {"hex2bin", Cmdhex2bin, AlwaysAvailable, "Converts hexadecimal to binary"}, {"load", CmdLoad, AlwaysAvailable, "Load contents of file into graph window"}, + {"num", CmdNumCon, AlwaysAvailable, "Converts dec/hex/bin"}, {"print", CmdPrintDemodBuff, AlwaysAvailable, "Print the data in the DemodBuffer"}, {"samples", CmdSamples, IfPm3Present, "Get raw samples for graph window (GraphBuffer)"}, {"save", CmdSave, AlwaysAvailable, "Save signal trace data (from graph window)"}, From 47908df32ee6575a7d74f062b6c86081375df492 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 5 Mar 2023 08:21:09 +0100 Subject: [PATCH 270/924] more text changes to hf tesla info --- client/src/cmdhftesla.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhftesla.c b/client/src/cmdhftesla.c index 940687cb4..32b9872e8 100644 --- a/client/src/cmdhftesla.c +++ b/client/src/cmdhftesla.c @@ -202,19 +202,21 @@ static int info_hf_tesla(void) { PrintAndLogEx(INFO, "%d - %s", i, sprint_hex_inrow(pk[i], 65)); } PrintAndLogEx(INFO, "Form factor... %s " NOLF, sprint_hex_inrow(form_factor, sizeof(form_factor))); - uint16_t form_factor_value = form_factor[0] << 8 | form_factor[1]; + + uint16_t form_factor_value = MemBeToUint2byte(form_factor); + switch (form_factor_value) { case 0x0001: - PrintAndLogEx(NORMAL, "(card)"); + PrintAndLogEx(NORMAL, "( card )"); break; case 0x0022: - PrintAndLogEx(NORMAL, "(fob)"); + PrintAndLogEx(NORMAL, "( fob )"); break; case 0x0031: - PrintAndLogEx(NORMAL, "(phone app)"); + PrintAndLogEx(NORMAL, "( phone app )"); break; default: - PrintAndLogEx(NORMAL, "(unknown)"); + PrintAndLogEx(NORMAL, "( unknown )"); break; } @@ -249,7 +251,6 @@ static int CmdHFTeslaInfo(const char *Cmd) { return info_hf_tesla(); } - static int CmdHFTeslaList(const char *Cmd) { return CmdTraceListAlias(Cmd, "hf tesla", "7816"); } @@ -270,4 +271,4 @@ static int CmdHelp(const char *Cmd) { int CmdHFTESLA(const char *Cmd) { clearCommandBuffer(); return CmdsParse(CommandTable, Cmd); -} +} \ No newline at end of file From 7584a7a617b7ff12de7d713220d48e2fdf50864a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 5 Mar 2023 08:22:01 +0100 Subject: [PATCH 271/924] style --- client/src/cmdpiv.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index dc6584f40..4d23a9b4b 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -698,10 +698,12 @@ static int PivSelect(Iso7816CommandChannel channel, bool activateField, bool lea if ((sw != 0) && (silent == false)) { PrintAndLogEx(INFO, "APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); } + if (res != PM3_SUCCESS || sw != ISO7816_OK) { PrintAndLogEx(FAILED, "Applet selection failed. Card is not a PIV card."); return res; } + if (silent == false) { if (decodeTLV == true) { PrintTLVFromBuffer(buf, len); @@ -736,8 +738,10 @@ static int CmdPIVSelect(const char *Cmd) { bool APDULogging = arg_get_lit(ctx, 3); bool decodeTLV = arg_get_lit(ctx, 4); Iso7816CommandChannel channel = CC_CONTACTLESS; - if (arg_get_lit(ctx, 5)) + if (arg_get_lit(ctx, 5)) { channel = CC_CONTACT; + } + PrintChannel(channel); uint8_t applet_id[APDU_AID_LEN] = {0}; @@ -970,7 +974,6 @@ static command_t CommandTable[] = { {"getdata", CmdPIVGetData, IfPm3Iso14443, "Gets a container on a PIV card"}, {"authsign", CmdPIVAuthenticateSign, IfPm3Iso14443, "Authenticate with the card"}, {"scan", CmdPIVScan, IfPm3Iso14443, "Scan PIV card for known containers"}, - {"list", CmdPIVList, AlwaysAvailable, "List ISO7816 history"}, {NULL, NULL, NULL, NULL} }; From bd99523edc7e67068a671c6ce8d6deb553f65850 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 5 Mar 2023 08:22:21 +0100 Subject: [PATCH 272/924] style --- client/src/cmdlfawid.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdlfawid.c b/client/src/cmdlfawid.c index 11db5fc83..5d735a650 100644 --- a/client/src/cmdlfawid.c +++ b/client/src/cmdlfawid.c @@ -274,7 +274,8 @@ int demodAWID(bool verbose) { } free(bits); - PrintAndLogEx(DEBUG, "DEBUG: AWID idx: %d, Len: %zu Printing DemodBuffer:", idx, size); + PrintAndLogEx(DEBUG, "DEBUG: AWID idx: %d, Len: %zu", idx, size); + PrintAndLogEx(DEBUG, "DEBUG: Printing DemodBuffer:"); if (g_debugMode) { printDemodBuff(0, false, false, true); printDemodBuff(0, false, false, false); From 7abfff4095c3d2eae9eb85d243e3ea7f1a030a33 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 5 Mar 2023 19:19:15 +0100 Subject: [PATCH 273/924] moved and unified some reverse array fct --- client/src/cmdhf15.c | 38 ++++++++++------------------------ client/src/mifare/mifarehost.c | 22 +++++++++++--------- client/src/util.c | 1 - common/commonutil.c | 24 +++++++++++++++++++++ common/commonutil.h | 4 ++++ 5 files changed, 51 insertions(+), 38 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index d1b7289e8..c80f8cac4 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -223,16 +223,6 @@ static const productName_t uidmapping[] = { { 0, 0, "no tag-info available" } // must be the last entry }; -static inline void reverse(uint8_t *buff, uint8_t length) { - uint8_t upper_bound = (length % 2 == 0) ? length / 2 : (length / 2) + 1; - uint8_t tmp = 0; - for (int start = 0, end = length - 1; end >= upper_bound; ++start, --end) { - tmp = buff[end]; - buff[end] = buff[start]; - buff[start] = tmp; - } -} - static int CmdHF15Help(const char *Cmd); static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { @@ -287,16 +277,14 @@ static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { } }; */ - uint8_t i; - uint8_t revuid[8]; - for (i = 0; i < sizeof(revuid); i++) { - revuid[i] = uid[7 - i]; - } - uint8_t revsign[32]; - for (i = 0; i < sizeof(revsign); i++) { - revsign[i] = signature[31 - i]; - } + uint8_t revuid[8] = {0}; + reverse_array_copy(uid, sizeof(revuid), revuid); + + uint8_t revsign[32] = {0}; + reverse_array_copy(signature, sizeof(revsign), revsign); + + uint8_t i; int reason = 0; bool is_valid = false; for (i = 0; i < ARRAYLEN(nxp_15693_public_keys); i++) { @@ -1823,7 +1811,7 @@ static int CmdHF15Readmulti(const char *Cmd) { return PM3_EINVARG; } } else { - reverse(uid, HF15_UID_LENGTH); + reverse_array(uid, HF15_UID_LENGTH); } // add UID (scan, uid) memcpy(req + reqlen, uid, HF15_UID_LENGTH); @@ -1953,7 +1941,7 @@ static int CmdHF15Readblock(const char *Cmd) { return PM3_EINVARG; } } else { - reverse(uid, HF15_UID_LENGTH); + reverse_array(uid, HF15_UID_LENGTH); } // add UID (scan, uid) memcpy(req + reqlen, uid, HF15_UID_LENGTH); @@ -2129,7 +2117,7 @@ static int CmdHF15Write(const char *Cmd) { return PM3_EINVARG; } } else { - reverse(uid, HF15_UID_LENGTH); + reverse_array(uid, HF15_UID_LENGTH); } // add UID (scan, uid) memcpy(req + reqlen, uid, HF15_UID_LENGTH); @@ -2356,11 +2344,7 @@ static int CmdHF15CSetUID(const char *Cmd) { // reverse cardUID to compare uint8_t revuid[8] = {0}; - uint8_t i = 0; - while (i < sizeof(revuid)) { - revuid[i] = carduid[7 - i]; - i++; - } + reverse_array_copy(carduid, sizeof(carduid), revuid); if (memcmp(revuid, payload.uid, 8) != 0) { PrintAndLogEx(FAILED, "setting new UID ( " _RED_("fail") " )"); diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 56d10c608..fe2cd1897 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1493,13 +1493,9 @@ const char *vigik_get_service(uint16_t service_code) { return vigik_rsa_pk[ARRAYLEN(vigik_rsa_pk) - 1].desc; } -static void reverse_array(const uint8_t *src, int src_len, uint8_t *dest) { - for (int i = 0; i < src_len; i++) { - dest[i] = src[(src_len - 1) - i]; - } -}; int vigik_verify(mfc_vigik_t *d) { +#define PUBLIC_VIGIK_KEYLEN 128 // iso9796 // Exponent V = 2 @@ -1512,8 +1508,18 @@ int vigik_verify(mfc_vigik_t *d) { PrintAndLogEx(INFO, "Raw signature"); print_hex_noascii_break(d->rsa_signature, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); } + +/* + int dl = 0; + + param_gethex_to_eol("1C07D46DA3849326D24B3468BD76673F4F3C41827DC413E81E4F3C7804FAC727213059B21D047510D6432448643A92EBFC67FBEDDAB468D13D948B172F5EBC79A0E3FEFDFAF4E81FC7108E070F1E3CD0", 0, signature, PUBLIC_VIGIK_KEYLEN, &dl); + + param_gethex_to_eol("1AB86FE0C17FFFFE4379D5E15A4B2FAFFEFCFA0F1F3F7FA03E7DDDF1E3C78FFFB1F0E23F7FFF51584771C5C18307FEA36CA74E60AA6B0409ACA66A9EC155F4E9112345708A2B8457E722608EE1157408", 0, signature, PUBLIC_VIGIK_KEYLEN, &dl); + signature_len = dl; + */ + uint8_t rev_sig[128]; - reverse_array(d->rsa_signature, sizeof(d->rsa_signature), rev_sig); + reverse_array_copy(d->rsa_signature, sizeof(d->rsa_signature), rev_sig); PrintAndLogEx(INFO, "Raw signature reverse"); print_hex_noascii_break(rev_sig, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); @@ -1532,10 +1538,6 @@ int vigik_verify(mfc_vigik_t *d) { // sha1 hash H = 20 bytes, 160 bits // padding = 20 bytes, 96 bits - -// ref: MIFARE Classic EV1 Originality Signature Validation -#define PUBLIC_VIGIK_KEYLEN 128 - uint8_t i; bool is_valid = false; diff --git a/client/src/util.c b/client/src/util.c index b13c5e3a9..ea33de446 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -300,7 +300,6 @@ void print_hex_noascii_break(const uint8_t *data, const size_t len, uint8_t brea } } - static void print_buffer_ex(const uint8_t *data, const size_t len, int level, uint8_t breaks) { // sanity checks diff --git a/common/commonutil.c b/common/commonutil.c index 601dc20e4..c346d7bf7 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -269,3 +269,27 @@ uint16_t get_sw(const uint8_t *d, uint16_t n) { n -= 2; return (d[n] << 8 | d[n + 1]); } + +// reverse same array +void reverse_array(uint8_t *d, size_t n) { + if (d == NULL || n < 2) { + return; + } + + for (int i = 0, j = n - 1; i < j; ++i, --j) { + d[i] ^= d[j]; + d[j] ^= d[i]; + d[i] ^= d[j]; + } +} + +// reverse src array into dest array +void reverse_array_copy(const uint8_t *src, int src_len, uint8_t *dest) { + if (src == NULL || src_len == 0 || dest == NULL) { + return; + } + + for (int i = 0; i < src_len; i++) { + dest[i] = src[(src_len - 1) - i]; + } +} \ No newline at end of file diff --git a/common/commonutil.h b/common/commonutil.h index 8e800f25f..7beb95355 100644 --- a/common/commonutil.h +++ b/common/commonutil.h @@ -86,4 +86,8 @@ uint32_t rotl(uint32_t a, uint8_t n); uint32_t rotr(uint32_t a, uint8_t n); uint16_t get_sw(const uint8_t *d, uint16_t n); + +void reverse_array(uint8_t *d, size_t n); +void reverse_array_copy(const uint8_t *src, int src_len, uint8_t *dest); + #endif From 0f70df5de3da99293741a668786b076bb68ff548 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Mon, 6 Mar 2023 19:55:41 +0800 Subject: [PATCH 274/924] Add TCP connection support on Windows The Windows Sockets 2 API is similar to the BSD Sockets API, so I can reuse a lot of code in uart_posix.c --- client/src/uart/uart_win32.c | 258 ++++++++++++++++++++++++++++++++--- 1 file changed, 241 insertions(+), 17 deletions(-) diff --git a/client/src/uart/uart_win32.c b/client/src/uart/uart_win32.c index 1e57daeb2..cd610c8fa 100644 --- a/client/src/uart/uart_win32.c +++ b/client/src/uart/uart_win32.c @@ -27,14 +27,24 @@ // The windows serial port implementation #ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN #include +#include +#include typedef struct { HANDLE hPort; // Serial port handle DCB dcb; // Device control settings COMMTIMEOUTS ct; // Serial port time-out configuration + SOCKET hSocket; // Socket handle } serial_port_windows_t; +// this is for TCP connection +struct timeval timeout = { + .tv_sec = 0, // 0 second + .tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000 +}; + uint32_t newtimeout_value = 0; bool newtimeout_pending = false; @@ -69,11 +79,111 @@ static int uart_reconfigure_timeouts_polling(serial_port sp) { serial_port uart_open(const char *pcPortName, uint32_t speed) { char acPortName[255] = {0}; serial_port_windows_t *sp = calloc(sizeof(serial_port_windows_t), sizeof(uint8_t)); + sp->hSocket = INVALID_SOCKET; // default: serial port if (sp == 0) { PrintAndLogEx(WARNING, "UART failed to allocate memory\n"); return INVALID_SERIAL_PORT; } + + char *prefix = strdup(pcPortName); + if (prefix == NULL) { + PrintAndLogEx(ERR, "error: string duplication"); + free(sp); + return INVALID_SERIAL_PORT; + } + str_lower(prefix); + + if (memcmp(prefix, "tcp:", 4) == 0) { + free(prefix); + + if (strlen(pcPortName) <= 4) { + free(sp); + return INVALID_SERIAL_PORT; + } + + struct addrinfo *addr = NULL, *rp; + + char *addrstr = strdup(pcPortName + 4); + if (addrstr == NULL) { + PrintAndLogEx(ERR, "error: string duplication"); + free(sp); + return INVALID_SERIAL_PORT; + } + + timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000; + + char *colon = strrchr(addrstr, ':'); + const char *portstr; + if (colon) { + portstr = colon + 1; + *colon = '\0'; + } else { + portstr = "18888"; + } + + WSADATA wsaData; + struct addrinfo info; + int iResult; + + iResult = WSAStartup(MAKEWORD(2,2), &wsaData); + if (iResult != 0) { + PrintAndLogEx(ERR, "error: WSAStartup failed with error: %d", iResult); + free(sp); + return INVALID_SERIAL_PORT; + } + + memset(&info, 0, sizeof(info)); + info.ai_socktype = SOCK_STREAM; + info.ai_protocol = IPPROTO_TCP; + + int s = getaddrinfo(addrstr, portstr, &info, &addr); + if (s != 0) { + PrintAndLogEx(ERR, "error: getaddrinfo: %s", gai_strerror(s)); + freeaddrinfo(addr); + free(addrstr); + free(sp); + WSACleanup(); + return INVALID_SERIAL_PORT; + } + + SOCKET hSocket = INVALID_SOCKET; + for (rp = addr; rp != NULL; rp = rp->ai_next) { + hSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + + if (hSocket == INVALID_SOCKET) + continue; + + if (connect(hSocket, rp->ai_addr, (int)rp->ai_addrlen) != INVALID_SOCKET) + break; + + closesocket(hSocket); + hSocket = INVALID_SOCKET; + } + + freeaddrinfo(addr); + free(addrstr); + + if (rp == NULL) { /* No address succeeded */ + PrintAndLogEx(ERR, "error: Could not connect"); + WSACleanup(); + free(sp); + return INVALID_SERIAL_PORT; + } + + sp->hSocket = hSocket; + + int one = 1; + int res = setsockopt(sp->hSocket, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)); + if (res != 0) { + closesocket(hSocket); + WSACleanup(); + free(sp); + return INVALID_SERIAL_PORT; + } + return sp; + } + // Copy the input "com?" to "\\.\COM?" format snprintf(acPortName, sizeof(acPortName), "\\\\.\\%s", pcPortName); _strupr(acPortName); @@ -120,8 +230,14 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { } void uart_close(const serial_port sp) { - if (((serial_port_windows_t *)sp)->hPort != INVALID_HANDLE_VALUE) - CloseHandle(((serial_port_windows_t *)sp)->hPort); + serial_port_windows_t *spw = (serial_port_windows_t *)sp; + if (spw->hSocket != INVALID_SOCKET){ + shutdown(spw->hSocket, SD_BOTH); + closesocket(spw->hSocket); + WSACleanup(); + } + if (spw->hPort != INVALID_HANDLE_VALUE) + CloseHandle(spw->hPort); free(sp); } @@ -163,31 +279,139 @@ uint32_t uart_get_speed(const serial_port sp) { } int uart_receive(const serial_port sp, uint8_t *pbtRx, uint32_t pszMaxRxLen, uint32_t *pszRxLen) { - uart_reconfigure_timeouts_polling(sp); - int res = ReadFile(((serial_port_windows_t *)sp)->hPort, pbtRx, pszMaxRxLen, (LPDWORD)pszRxLen, NULL); - if (res) - return PM3_SUCCESS; + serial_port_windows_t *spw = (serial_port_windows_t *)sp; + if (spw->hSocket == INVALID_SOCKET) { // serial port + uart_reconfigure_timeouts_polling(sp); - int errorcode = GetLastError(); + int res = ReadFile(((serial_port_windows_t *)sp)->hPort, pbtRx, pszMaxRxLen, (LPDWORD)pszRxLen, NULL); + if (res) + return PM3_SUCCESS; - if (res == 0 && errorcode == 2) { - return PM3_EIO; + int errorcode = GetLastError(); + + if (res == 0 && errorcode == 2) { + return PM3_EIO; + } + + return PM3_ENOTTY; } + else { // TCP + uint32_t byteCount; // FIONREAD returns size on 32b + fd_set rfds; + struct timeval tv; - return PM3_ENOTTY; + if (newtimeout_pending) { + timeout.tv_usec = newtimeout_value * 1000; + newtimeout_pending = false; + } + // Reset the output count + *pszRxLen = 0; + do { + // Reset file descriptor + FD_ZERO(&rfds); + FD_SET(spw->hSocket, &rfds); + tv = timeout; + // the first argument nfds is ignored in Windows + int res = select(0, &rfds, NULL, NULL, &tv); + + // Read error + if (res == SOCKET_ERROR) { + return PM3_EIO; + } + + // Read time-out + if (res == 0) { + if (*pszRxLen == 0) { + // We received no data + return PM3_ENODATA; + } else { + // We received some data, but nothing more is available + return PM3_SUCCESS; + } + } + + // Retrieve the count of the incoming bytes + res = ioctlsocket(spw->hSocket, FIONREAD, (u_long *)&byteCount); + // PrintAndLogEx(ERR, "UART:: RX ioctl res %d byteCount %u", res, byteCount); + if (res == SOCKET_ERROR) return PM3_ENOTTY; + + // Cap the number of bytes, so we don't overrun the buffer + if (pszMaxRxLen - (*pszRxLen) < byteCount) { + // PrintAndLogEx(ERR, "UART:: RX prevent overrun (have %u, need %u)", pszMaxRxLen - (*pszRxLen), byteCount); + byteCount = pszMaxRxLen - (*pszRxLen); + } + + // There is something available, read the data + res = recv(spw->hSocket, (char *)pbtRx + (*pszRxLen), byteCount, 0); + + // Stop if the OS has some troubles reading the data + if (res <= 0) { // includes 0(gracefully closed) and -1(SOCKET_ERROR) + return PM3_EIO; + } + + *pszRxLen += res; + + if (*pszRxLen == pszMaxRxLen) { + // We have all the data we wanted. + return PM3_SUCCESS; + } + } while (byteCount); + + return PM3_SUCCESS; + } } int uart_send(const serial_port sp, const uint8_t *p_tx, const uint32_t len) { - DWORD txlen = 0; - int res = WriteFile(((serial_port_windows_t *)sp)->hPort, p_tx, len, &txlen, NULL); - if (res) + serial_port_windows_t *spw = (serial_port_windows_t *)sp; + if (spw->hSocket == INVALID_SOCKET) { // serial port + DWORD txlen = 0; + int res = WriteFile(((serial_port_windows_t *)sp)->hPort, p_tx, len, &txlen, NULL); + if (res) + return PM3_SUCCESS; + + int errorcode = GetLastError(); + if (res == 0 && errorcode == 2) { + return PM3_EIO; + } + return PM3_ENOTTY; + } + else { // TCP + uint32_t pos = 0; + fd_set wfds; + struct timeval tv; + + while (pos < len) { + // Reset file descriptor + FD_ZERO(&wfds); + FD_SET(spw->hSocket, &wfds); + tv = timeout; + // the first argument nfds is ignored in Windows + int res = select(0, NULL, &wfds, NULL, &tv); + + // Write error + if (res == SOCKET_ERROR) { + PrintAndLogEx(ERR, "UART:: write error (%d)", res); + return PM3_ENOTTY; + } + + // Write time-out + if (res == 0) { + PrintAndLogEx(ERR, "UART:: write time-out"); + return PM3_ETIMEOUT; + } + + // Send away the bytes + res = send(spw->hSocket, (const char *)p_tx + pos, len - pos, 0); + + // Stop if the OS has some troubles sending the data + if (res <= 0) + return PM3_EIO; + + pos += res; + } return PM3_SUCCESS; - int errorcode = GetLastError(); - if (res == 0 && errorcode == 2) { - return PM3_EIO; } - return PM3_ENOTTY; } #endif From d61c972ff9aec9e5fe5a0ee5d7af55c74dd5fb52 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Mon, 6 Mar 2023 20:26:34 +0800 Subject: [PATCH 275/924] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 937c092ea..56143f08e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added TCP connection support on Windows (@wh201906) - Added `data num` - easy convert between dec/hex/bin (@iceman1001) - Fixed `hf mfdes info` - now handles incorrect tag answers better (@didiera) - Fixed `hf mfdes` generic help text is now correct (@didiera) From dba8d811fddcb45468350a863f4b12af4fa36962 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Mon, 6 Mar 2023 22:02:33 +0800 Subject: [PATCH 276/924] Link ws2_32 --- client/CMakeLists.txt | 3 +++ client/Makefile | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 0bd8bd5cc..894af00e7 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -584,6 +584,9 @@ if (MINGW) set(CMAKE_C_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_CXX_FLAGS}") + + # link Winsock2 + set(ADDITIONAL_LNK ws2_32 ${ADDITIONAL_LNK}) endif (MINGW) target_include_directories(proxmark3 PRIVATE diff --git a/client/Makefile b/client/Makefile index b08eb0acb..d0cee355e 100644 --- a/client/Makefile +++ b/client/Makefile @@ -93,7 +93,6 @@ LUALIBLD = LUAPLATFORM = generic ifneq (,$(findstring MINGW,$(platform))) LUAPLATFORM = mingw - LDLIBS += -lws2_32 else ifeq ($(platform),Darwin) LUAPLATFORM = macosx @@ -103,6 +102,11 @@ else endif endif +## Winsock2 +ifneq (,$(findstring MINGW,$(platform))) + LDLIBS += -lws2_32 +endif + ## Reveng REVENGLIBPATH = ./deps/reveng REVENGLIBINC = -I$(REVENGLIBPATH) From ceeb98bd389b41f895432dd4210bd6d9d64c068a Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 7 Mar 2023 11:20:23 +0800 Subject: [PATCH 277/924] Update Troubleshooting, libQt5Core.so.5 not found Update the version number of Ubuntu which has the same problem I checked newer Ubuntu version 22.04 WSL 1 still have problem and solved by same solution sudo strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 Signed-off-by: Jack --- doc/md/Installation_Instructions/Troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index 59735da34..d3fbab571 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -224,7 +224,7 @@ Try running it with ## libQt5Core.so.5 not found ^[Top](#top) -On WSL1 / updated to Ubuntu 20.04, there is a slight chance you experience problems when compiling the repo with QT5. +On WSL1 / updated to Ubuntu 20.04 and 22.04, there is a slight chance you experience problems when compiling the repo with QT5. The following steps is needed to make the development environment happy again. ``` sudo apt reinstall qtbase5-dev From adefd302f55174d74fb5a30332188a035b8e589b Mon Sep 17 00:00:00 2001 From: astrid rowland Date: Wed, 8 Mar 2023 12:45:08 -0600 Subject: [PATCH 278/924] cleaned up original patch (same keys), added new keys from The Horde --- client/dictionaries/mfc_default_keys.dic | 120 +++++++++++------------ 1 file changed, 57 insertions(+), 63 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 381eabaf5..3c43a350f 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1978,74 +1978,68 @@ FE98F38F3EE2 # added by colonelborkmundus # "the more, the marriott" mifare project # -# 1k - graduate hotel -C49DAE1C6049 -209A2B910545 -# -# 1k - westin -8C29F8320617 -5697519A8F02 +# 20230125-01, Elite Member Marriott Rewards +43012BD9EB87 +# 20230125-02, Elite Member Marriott Rewards +3119A70628EB +# 20230125-03, Elite Member Marriott Rewards +23C9FDD9A366 +# 20230125-04, Elite Member Marriott Rewards +7B4DFC6D6525 +# 20230125-05, Elite Member Marriott Rewards +1330824CD356 +# 20230125-06, Elite Member Marriott Rewards +30AAD6A711EF +# 20230125-07, Fairfield Inn & Suites Marriott +7B3B589A5525 +# 20230125-08, Moxy Hotels +20C166C00ADB +# 20230125-09, Westin Hotels & Resorts 7D0A1C277C05 2058580A941F +8C29F8320617 +# 20230125-10, Westin Hotels & Resorts C40964215509 D44CFC178460 -# -# 1k - marriott -7B4DFC6D6525 -23C9FDD9A366 -3119A70628EB -30AAD6A711EF -1330824CD356 -43012BD9EB87 -035C70558D7B -9966588CB9A0 -12AB4C37BB8B -# -# 1k - AC hotels marriott -8EA8EC3F2320 +5697519A8F02 +# 20230125-12, AC Hotels Marriott 7B56B2B38725 -# -# 1k - the ritz-carlton -30FB20D0EFEF -D20289CD9E6E -66A3B064CC4B -D18296CD9E6E -# -# 1k - unknown -722538817225 -# -# 1k - aria resort & casino -316B8FAA12EF +# 20230125-13, AC Hotels Marriott +8EA8EC3F2320 +# 20230125-14, Waldorf Astoria Chicago +011C6CF459E8 +# 20230125-24, Aria Resort & Casino A18D9F4E75AF -# -# 1k - fairfield inn & suites marriott -7AEB989A5525 -7B3B589A5525 -215E9DED9DDF -334E91BE3377 -310308EC52EF -# -# 1k - residence inn marriott -F72CD208FDF9 -# -# 1k - sheraton -42FC522DE987 -# -# 1k - millenium hotels -132F641C948B -# -# 1k - moxy hotels -20C166C00ADB -9EE3896C4530 -# -# 1k - residence inn marriott +# 20230125-25, Aria Resort & Casino +316B8FAA12EF +# 20230125-26, Residence Inn Mariott 3122AE5341EB -# -# 1k - americinn -8AC04C1A4A25 -# -# 1k - the industrialist +# 20230125-27, Residence Inn Mariott +F72CD208FDF9 +# 20230125-28, Marriott +035C70558D7B +# 20230125-29, Marriott +12AB4C37BB8B +# 20230125-30, Marriott +9966588CB9A0 +# 20230125-31, Sheraton +42FC522DE987 +# 20230125-32, The Industrialist 2158E314C3DF -# -# 1k - waldorf astoria -011C6CF459E8 \ No newline at end of file +# 20230125-39, The Ritz-Carlton Balharbour +30FB20D0EFEF +# 20230125-40, The Ritz-Carlton Balharbour +66A3B064CC4B +# 20230125-41, The Ritz-Carlton Balharbour +D18296CD9E6E +# 20230125-42, The Ritz-Carlton Balharbour +D20289CD9E6E +# 20230125-44, Graduate Hotels +209A2B910545 +C49DAE1C6049 +# 20230125-46, AmericInn +8AC04C1A4A25 +# 20230129-53, Marriott Bonvoy +6E029927600D +3E173F64C01C +C670A9AD6066 \ No newline at end of file From 68c74fd3aec6533b2b6fdd674fb3ccbf2e6af478 Mon Sep 17 00:00:00 2001 From: astrid rowland Date: Wed, 8 Mar 2023 13:14:20 -0600 Subject: [PATCH 279/924] removed unconfirmed unleashed keys --- client/dictionaries/mfc_default_keys.dic | 66 +---------- how q | 142 +++++++++++++++++++++++ 2 files changed, 143 insertions(+), 65 deletions(-) create mode 100644 how q diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 3c43a350f..68bb83ae5 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1910,70 +1910,6 @@ D144BD193063 8627C10A7014 453857395635 # -# flipper unleashed additions -# -# Transport cards -E954024EE754 -0CD464CDC100 -BC305FE2DA65 -CF0EC6ACF2F9 -F7A545095C49 -6862FD600F78 -72A0C485D3F7 -6A530C91F85B -# RENFE MADRID (TRAIN) Extracted with detect reader -701AA491A4A5 -12BA20088ED3 -# MISC KEYS FROM MY OLD ACCESS CARDS -F18D91EE3033 -0E726E11CFCC -1D14130D1A0B -4ADLE273EAFL -3DFL4C8000A1 -E64Q986Q5D94 -201106141030 -# D144BD193063 (dupe) -01E2C14F1B18 -0380293A9E6D -08A55BC96DC1 -08ED3F92AA53 -0D61BA88789C -190E6242CE7B -1A8CFF2F1BC7 -25FE2B4E4FA9 -321803E38664 -381F84DB8134 -38540EEE8B1C -42F82DB5C4AF -507A6181E4BF -549BB4FD70C4 -57059FFD3EE6 -5E696FA0EAD1 -6036F9D72D68 -6611DFFAAE32 -6AC79644E0CD -735DD20237A9 -79E8B59A51E0 -7B6C00CBAC92 -7C3AF198425F -81C0BBCE32E9 -8D2B780A148D -9001D0E23F8C -A8700E07A58F -AE683AC2A232 -B6728D9B95BA -C290A397F84A -CA22AF33A19B -CBC83E1548B4 -CC5F59A0CE0A -D410EFF9113E -DE5865F29C44 -E108EA397A9A -E10F0E7A8DD5 -F833E24C3F1C -FA8CA10C7D59 -FE98F38F3EE2 -# ########################################## # added by colonelborkmundus # "the more, the marriott" mifare project @@ -2042,4 +1978,4 @@ C49DAE1C6049 # 20230129-53, Marriott Bonvoy 6E029927600D 3E173F64C01C -C670A9AD6066 \ No newline at end of file +C670A9AD6066i \ No newline at end of file diff --git a/how q b/how q new file mode 100644 index 000000000..a3e923d6d --- /dev/null +++ b/how q @@ -0,0 +1,142 @@ +commit 1aa93869204215ebf232ae9bbf5ed8b911481b9f (HEAD -> origin/dictionaries) +Author: astrid rowland +Date: Wed Mar 8 12:45:08 2023 -0600 + + cleaned up original patch (same keys), added new keys from The Horde + +diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic +index 881c72df0..8368eee31 100644 +--- a/client/dictionaries/mfc_default_keys.dic ++++ b/client/dictionaries/mfc_default_keys.dic +@@ -1914,74 +1914,68 @@ D144BD193063 + # added by colonelborkmundus + # "the more, the marriott" mifare project + # +-# 1k - graduate hotel +-C49DAE1C6049 +-209A2B910545 +-# +-# 1k - westin +-8C29F8320617 +-5697519A8F02 ++# 20230125-01, Elite Member Marriott Rewards ++43012BD9EB87 ++# 20230125-02, Elite Member Marriott Rewards ++3119A70628EB ++# 20230125-03, Elite Member Marriott Rewards ++23C9FDD9A366 ++# 20230125-04, Elite Member Marriott Rewards ++7B4DFC6D6525 ++# 20230125-05, Elite Member Marriott Rewards ++1330824CD356 ++# 20230125-06, Elite Member Marriott Rewards ++30AAD6A711EF ++# 20230125-07, Fairfield Inn & Suites Marriott ++7B3B589A5525 ++# 20230125-08, Moxy Hotels ++20C166C00ADB ++# 20230125-09, Westin Hotels & Resorts + 7D0A1C277C05 + 2058580A941F ++8C29F8320617 ++# 20230125-10, Westin Hotels & Resorts + C40964215509 + D44CFC178460 +-# +-# 1k - marriott +-7B4DFC6D6525 +-23C9FDD9A366 +-3119A70628EB +-30AAD6A711EF +-1330824CD356 +-43012BD9EB87 ++5697519A8F02 ++# 20230125-12, AC Hotels Marriott ++7B56B2B38725 ++# 20230125-13, AC Hotels Marriott ++8EA8EC3F2320 ++# 20230125-14, Waldorf Astoria Chicago ++011C6CF459E8 ++# 20230125-24, Aria Resort & Casino ++A18D9F4E75AF ++# 20230125-25, Aria Resort & Casino ++316B8FAA12EF ++# 20230125-26, Residence Inn Mariott ++3122AE5341EB ++# 20230125-27, Residence Inn Mariott ++F72CD208FDF9 ++# 20230125-28, Marriott + 035C70558D7B +-9966588CB9A0 ++# 20230125-29, Marriott + 12AB4C37BB8B +-# +-# 1k - AC hotels marriott +-8EA8EC3F2320 +-7B56B2B38725 +-# +-# 1k - the ritz-carlton ++# 20230125-30, Marriott ++9966588CB9A0 ++# 20230125-31, Sheraton ++42FC522DE987 ++# 20230125-32, The Industrialist ++2158E314C3DF ++# 20230125-39, The Ritz-Carlton Balharbour + 30FB20D0EFEF +-D20289CD9E6E ++# 20230125-40, The Ritz-Carlton Balharbour + 66A3B064CC4B ++# 20230125-41, The Ritz-Carlton Balharbour + D18296CD9E6E +-# +-# 1k - unknown +-722538817225 +-# +-# 1k - aria resort & casino +-316B8FAA12EF +-A18D9F4E75AF +-# +-# 1k - fairfield inn & suites marriott +-7AEB989A5525 +-7B3B589A5525 +-215E9DED9DDF +-334E91BE3377 +-310308EC52EF +-# +-# 1k - residence inn marriott +-F72CD208FDF9 +-# +-# 1k - sheraton +-42FC522DE987 +-# +-# 1k - millenium hotels +-132F641C948B +-# +-# 1k - moxy hotels +-20C166C00ADB +-9EE3896C4530 +-# +-# 1k - residence inn marriott +-3122AE5341EB +-# +-# 1k - americinn  ++# 20230125-42, The Ritz-Carlton Balharbour ++D20289CD9E6E ++# 20230125-44, Graduate Hotels ++209A2B910545 ++C49DAE1C6049 ++# 20230125-46, AmericInn + 8AC04C1A4A25 +-# +-# 1k - the industrialist +-2158E314C3DF +-# +-# 1k - waldorf astoria +-011C6CF459E8 +\ No newline at end of file ++# 20230129-53, Marriott Bonvoy ++6E029927600D ++3E173F64C01C ++C670A9AD6066 +\ No newline at end of file From 2658b2c52fe9a884648a6fe66fac5821c719a85e Mon Sep 17 00:00:00 2001 From: astrid rowland Date: Wed, 8 Mar 2023 13:19:30 -0600 Subject: [PATCH 280/924] deleted unnecessary file --- how q | 142 ---------------------------------------------------------- 1 file changed, 142 deletions(-) delete mode 100644 how q diff --git a/how q b/how q deleted file mode 100644 index a3e923d6d..000000000 --- a/how q +++ /dev/null @@ -1,142 +0,0 @@ -commit 1aa93869204215ebf232ae9bbf5ed8b911481b9f (HEAD -> origin/dictionaries) -Author: astrid rowland -Date: Wed Mar 8 12:45:08 2023 -0600 - - cleaned up original patch (same keys), added new keys from The Horde - -diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic -index 881c72df0..8368eee31 100644 ---- a/client/dictionaries/mfc_default_keys.dic -+++ b/client/dictionaries/mfc_default_keys.dic -@@ -1914,74 +1914,68 @@ D144BD193063 - # added by colonelborkmundus - # "the more, the marriott" mifare project - # --# 1k - graduate hotel --C49DAE1C6049 --209A2B910545 --# --# 1k - westin --8C29F8320617 --5697519A8F02 -+# 20230125-01, Elite Member Marriott Rewards -+43012BD9EB87 -+# 20230125-02, Elite Member Marriott Rewards -+3119A70628EB -+# 20230125-03, Elite Member Marriott Rewards -+23C9FDD9A366 -+# 20230125-04, Elite Member Marriott Rewards -+7B4DFC6D6525 -+# 20230125-05, Elite Member Marriott Rewards -+1330824CD356 -+# 20230125-06, Elite Member Marriott Rewards -+30AAD6A711EF -+# 20230125-07, Fairfield Inn & Suites Marriott -+7B3B589A5525 -+# 20230125-08, Moxy Hotels -+20C166C00ADB -+# 20230125-09, Westin Hotels & Resorts - 7D0A1C277C05 - 2058580A941F -+8C29F8320617 -+# 20230125-10, Westin Hotels & Resorts - C40964215509 - D44CFC178460 --# --# 1k - marriott --7B4DFC6D6525 --23C9FDD9A366 --3119A70628EB --30AAD6A711EF --1330824CD356 --43012BD9EB87 -+5697519A8F02 -+# 20230125-12, AC Hotels Marriott -+7B56B2B38725 -+# 20230125-13, AC Hotels Marriott -+8EA8EC3F2320 -+# 20230125-14, Waldorf Astoria Chicago -+011C6CF459E8 -+# 20230125-24, Aria Resort & Casino -+A18D9F4E75AF -+# 20230125-25, Aria Resort & Casino -+316B8FAA12EF -+# 20230125-26, Residence Inn Mariott -+3122AE5341EB -+# 20230125-27, Residence Inn Mariott -+F72CD208FDF9 -+# 20230125-28, Marriott - 035C70558D7B --9966588CB9A0 -+# 20230125-29, Marriott - 12AB4C37BB8B --# --# 1k - AC hotels marriott --8EA8EC3F2320 --7B56B2B38725 --# --# 1k - the ritz-carlton -+# 20230125-30, Marriott -+9966588CB9A0 -+# 20230125-31, Sheraton -+42FC522DE987 -+# 20230125-32, The Industrialist -+2158E314C3DF -+# 20230125-39, The Ritz-Carlton Balharbour - 30FB20D0EFEF --D20289CD9E6E -+# 20230125-40, The Ritz-Carlton Balharbour - 66A3B064CC4B -+# 20230125-41, The Ritz-Carlton Balharbour - D18296CD9E6E --# --# 1k - unknown --722538817225 --# --# 1k - aria resort & casino --316B8FAA12EF --A18D9F4E75AF --# --# 1k - fairfield inn & suites marriott --7AEB989A5525 --7B3B589A5525 --215E9DED9DDF --334E91BE3377 --310308EC52EF --# --# 1k - residence inn marriott --F72CD208FDF9 --# --# 1k - sheraton --42FC522DE987 --# --# 1k - millenium hotels --132F641C948B --# --# 1k - moxy hotels --20C166C00ADB --9EE3896C4530 --# --# 1k - residence inn marriott --3122AE5341EB --# --# 1k - americinn  -+# 20230125-42, The Ritz-Carlton Balharbour -+D20289CD9E6E -+# 20230125-44, Graduate Hotels -+209A2B910545 -+C49DAE1C6049 -+# 20230125-46, AmericInn - 8AC04C1A4A25 --# --# 1k - the industrialist --2158E314C3DF --# --# 1k - waldorf astoria --011C6CF459E8 -\ No newline at end of file -+# 20230129-53, Marriott Bonvoy -+6E029927600D -+3E173F64C01C -+C670A9AD6066 -\ No newline at end of file From f56e066e50c524967ceade653c07bf54a6af2d9a Mon Sep 17 00:00:00 2001 From: astrid rowland Date: Wed, 8 Mar 2023 13:24:12 -0600 Subject: [PATCH 281/924] accidentally a typo, thanks vim --- client/dictionaries/mfc_default_keys.dic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 68bb83ae5..8368eee31 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1978,4 +1978,4 @@ C49DAE1C6049 # 20230129-53, Marriott Bonvoy 6E029927600D 3E173F64C01C -C670A9AD6066i \ No newline at end of file +C670A9AD6066 \ No newline at end of file From 917b37178e400110a0b720d6facce7fbea50f635 Mon Sep 17 00:00:00 2001 From: GuruSteve Date: Thu, 9 Mar 2023 16:34:50 -0700 Subject: [PATCH 282/924] Updated verbiage WRT KeyAccess to make it clearer --- client/src/cmdhficlass.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 53bb483ec..1c67f98c4 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -594,17 +594,17 @@ static void mem_app_config(const picopass_hdr_t *hdr) { PrintAndLogEx(INFO, " * Kd, Debit key, AA1 Kc, Credit key, AA2 *"); uint8_t keyAccess = isset(mem, 0x01); if (keyAccess) { - PrintAndLogEx(INFO, " Read A....... debit"); - PrintAndLogEx(INFO, " Read B....... credit"); - PrintAndLogEx(INFO, " Write A...... debit"); - PrintAndLogEx(INFO, " Write B...... credit"); + PrintAndLogEx(INFO, " Read AA1....... debit"); + PrintAndLogEx(INFO, " Write AA1...... debit"); + PrintAndLogEx(INFO, " Read AA2....... credit"); + PrintAndLogEx(INFO, " Write AA2...... credit"); PrintAndLogEx(INFO, " Debit........ debit or credit"); PrintAndLogEx(INFO, " Credit....... credit"); } else { - PrintAndLogEx(INFO, " Read A....... debit or credit"); - PrintAndLogEx(INFO, " Read B....... debit or credit"); - PrintAndLogEx(INFO, " Write A...... credit"); - PrintAndLogEx(INFO, " Write B...... credit"); + PrintAndLogEx(INFO, " Read AA1....... debit or credit"); + PrintAndLogEx(INFO, " Write AA1...... credit"); + PrintAndLogEx(INFO, " Read AA2....... debit or credit"); + PrintAndLogEx(INFO, " Write AA2...... credit"); PrintAndLogEx(INFO, " Debit........ debit or credit"); PrintAndLogEx(INFO, " Credit....... credit"); } From 359bb534f9cc74ce5827905b5ff5901128e37345 Mon Sep 17 00:00:00 2001 From: GuruSteve Date: Thu, 9 Mar 2023 18:58:46 -0700 Subject: [PATCH 283/924] Updated verbiage WRT iClass info (KeyAccess) to make it clearer --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56143f08e..b8634480f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf iclass view` - show credentials on a decrypted dump (@natesales) - Show NTAG213TT tamper info in `hf mfu info` and add commands for configuring it's tamper feature (@mjaksn) - Add Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) + - ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) @@ -176,7 +177,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added new standalone mode `lf_em4100rsww` (@zabszk) - Fixed `hf 15 slixdisable` wrong pass id (@r1ddl3rz) - Added `script run hf_mf_hid_sim.lua` (@micsen) - + - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) ## [Frostbit.4.14831][2022-01-11] - Changed Wiegand format lookup - now case-insensitive (@iceman1001) From 0f206ccef4fff3cf04e3e74bf249d280e759d034 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Sat, 11 Mar 2023 00:27:48 +0800 Subject: [PATCH 284/924] Fix client build on Android Tested with: cmake 3.10.2.4988404/3.24.1 ndk 25.2.9519653 Build command: cmake \ -DCMAKE_TOOLCHAIN_FILE=/home/gitpod/androidsdk/ndk/25.2.9519653/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=armeabi-v7a \ -DANDROID_NATIVE_API_LEVEL=android-19 \ -DSKIPBT=1 -DSKIPPYTHON=1 -DSKIPPTHREAD=1 (armeabi-v7a, arm64-v8a, x86 and x86_64 are all tested) --- client/CMakeLists.txt | 3 ++- client/deps/hardnested.cmake | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 894af00e7..ee1ddcc25 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -163,11 +163,12 @@ endif (NOT SKIPJANSSONSYSTEM EQUAL 1) if(EMBED_BZIP2) set(BZIP2_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2) + # Specify SOURCE_DIR will cause some errors ExternalProject_Add(bzip2 GIT_REPOSITORY https://android.googlesource.com/platform/external/bzip2 GIT_TAG platform-tools-30.0.2 PREFIX deps/bzip2 - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/bzip2 + # SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/bzip2 CONFIGURE_COMMAND mkdir -p ${BZIP2_BUILD_DIR} && git archive --format tar HEAD | tar -C ${BZIP2_BUILD_DIR} -x BUILD_IN_SOURCE ON BUILD_COMMAND make -C ${BZIP2_BUILD_DIR} -j4 CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} libbz2.a diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 524d4c939..cab2aba86 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -17,7 +17,7 @@ target_compile_definitions(pm3rrg_rdv4_hardnested_nosimd PRIVATE NOSIMD_BUILD) ## Mingw platforms: AMD64 set(X86_CPUS x86 x86_64 i686 AMD64) set(ARM64_CPUS arm64 aarch64) -set(ARM32_CPUS armel armhf) +set(ARM32_CPUS armel armv7-a) message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") From 62816a042915796646a516077ed6ac694eb3e7d5 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Sat, 11 Mar 2023 00:44:06 +0800 Subject: [PATCH 285/924] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8634480f..5d180053a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed the client build on Android (@wh201906) - Added TCP connection support on Windows (@wh201906) - Added `data num` - easy convert between dec/hex/bin (@iceman1001) - Fixed `hf mfdes info` - now handles incorrect tag answers better (@didiera) From adcfab2775df3cd6c2e7fa18e51bacd091d91415 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Sat, 11 Mar 2023 00:47:24 +0800 Subject: [PATCH 286/924] Fix hardnested.cmake --- client/deps/hardnested.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index cab2aba86..ec545e2a8 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -17,7 +17,7 @@ target_compile_definitions(pm3rrg_rdv4_hardnested_nosimd PRIVATE NOSIMD_BUILD) ## Mingw platforms: AMD64 set(X86_CPUS x86 x86_64 i686 AMD64) set(ARM64_CPUS arm64 aarch64) -set(ARM32_CPUS armel armv7-a) +set(ARM32_CPUS armel armhf armv7-a) message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") From f63957748dadc3d86c54283c85f20ea9c14a79d7 Mon Sep 17 00:00:00 2001 From: GuruSteve Date: Sat, 11 Mar 2023 02:58:34 -0700 Subject: [PATCH 287/924] Previous PR added change to CHANGELOG.md in wrong place --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d180053a..d17b8a97d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf iclass view` - show credentials on a decrypted dump (@natesales) - Show NTAG213TT tamper info in `hf mfu info` and add commands for configuring it's tamper feature (@mjaksn) - Add Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) + - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) - ## [Nitride.4.16191][2023-01-29] @@ -178,7 +179,6 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added new standalone mode `lf_em4100rsww` (@zabszk) - Fixed `hf 15 slixdisable` wrong pass id (@r1ddl3rz) - Added `script run hf_mf_hid_sim.lua` (@micsen) - - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) ## [Frostbit.4.14831][2022-01-11] - Changed Wiegand format lookup - now case-insensitive (@iceman1001) From ce8c210dbb80380e37d72f75410f5e1175624bbf Mon Sep 17 00:00:00 2001 From: GuruSteve Date: Sat, 11 Mar 2023 03:07:15 -0700 Subject: [PATCH 288/924] Additional update to CHANGELOG.md from previous PR --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d17b8a97d..2840bf892 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf iclass view` - show credentials on a decrypted dump (@natesales) - Show NTAG213TT tamper info in `hf mfu info` and add commands for configuring it's tamper feature (@mjaksn) - Add Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) + - Added XOR key extraction and flag to Guardall G-Prox II (@GuruSteve) - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) - From 70f47aa93e452109bc06c3c0873ea673229afba8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 11 Mar 2023 12:02:51 +0100 Subject: [PATCH 289/924] added a new public key found for MIFARE Plus troika cards --- CHANGELOG.md | 1 + client/src/cmdhfmfp.c | 3 ++- tools/recover_pk.py | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d180053a..3856331b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added new public key for signature MIFARE Plus Troika (@iceman100) - Fixed the client build on Android (@wh201906) - Added TCP connection support on Windows (@wh201906) - Added `data num` - easy convert between dec/hex/bin (@iceman1001) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index fe11836e1..aa7480953 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -171,7 +171,8 @@ static int plus_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signature #define PUBLIC_PLUS_ECDA_KEYLEN 57 const ecdsa_publickey_t nxp_plus_public_keys[] = { {"MIFARE Plus EV1", "044409ADC42F91A8394066BA83D872FB1D16803734E911170412DDF8BAD1A4DADFD0416291AFE1C748253925DA39A5F39A1C557FFACD34C62E"}, - {"MIFARE Plus Ev_x", "04BB49AE4447E6B1B6D21C098C1538B594A11A4A1DBF3D5E673DEACDEB3CC512D1C08AFA1A2768CE20A200BACD2DC7804CD7523A0131ABF607"} + {"MIFARE Plus Ev_x", "04BB49AE4447E6B1B6D21C098C1538B594A11A4A1DBF3D5E673DEACDEB3CC512D1C08AFA1A2768CE20A200BACD2DC7804CD7523A0131ABF607"}, + {"MIFARE Plus Trojka", "040F732E0EA7DF2B38F791BF89425BF7DCDF3EE4D976669E3831F324FF15751BD52AFF1782F72FF2731EEAD5F63ABE7D126E03C856FFB942AF"} }; uint8_t i; diff --git a/tools/recover_pk.py b/tools/recover_pk.py index b9f8dde4b..7ef149ceb 100755 --- a/tools/recover_pk.py +++ b/tools/recover_pk.py @@ -158,6 +158,11 @@ def selftests(): # # uses secp256r1?, SHA-256, # 'samples': ["aa", "DF0E506DFF8FCFC4B7B979D917644445F1230D2C7CDC342AFA842CA240C210BE7275F62073A9670F2DCEFC602CBEE771C2B4CD4A04F3D1EA11F49ABDF7E8B721"], # 'pk': ""}, + {'name': "MIFARE Plus Trojka", + # uses secp224r1, None, + 'samples': ["04B59F6A226F82", "6F577EB7F570D74DB6250477427F68A0088762BD318767537122919A7916597149F9D16D8B135E9BF826FB28AE293F3168661CD4A049FAED", + "04B44A82D80F92", "A0868ECF26733D3C3C838D055968B4559F77693CC3E346E3A4741BC826801F8360FD88857BEC440AAD3A21153D64302DEB6F5ED40B15C3F7"], + 'pk': "040F732E0EA7DF2B38F791BF89425BF7DCDF3EE4D976669E3831F324FF15751BD52AFF1782F72FF2731EEAD5F63ABE7D126E03C856FFB942AF"}, ] succeeded = True for t in tests: From 906e3f4c3262b456c3bb83982e930381f8c96def Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 11 Mar 2023 12:07:31 +0100 Subject: [PATCH 290/924] added pk for signature verification --- client/src/cmdhfmfdes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index d1451dae9..b2cd1f7a5 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -396,6 +396,7 @@ static int desfire_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signat {"MIFARE Plus Ev1", "044409ADC42F91A8394066BA83D872FB1D16803734E911170412DDF8BAD1A4DADFD0416291AFE1C748253925DA39A5F39A1C557FFACD34C62E"}, {"MIFARE Plus EvX", "04BB49AE4447E6B1B6D21C098C1538B594A11A4A1DBF3D5E673DEACDEB3CC512D1C08AFA1A2768CE20A200BACD2DC7804CD7523A0131ABF607"}, {"DESFire Ev2 XL", "04CD5D45E50B1502F0BA4656FF37669597E7E183251150F9574CC8DA56BF01C7ABE019E29FEA48F9CE22C3EA4029A765E1BC95A89543BAD1BC"}, + {"MIFARE Plus Troika", "040F732E0EA7DF2B38F791BF89425BF7DCDF3EE4D976669E3831F324FF15751BD52AFF1782F72FF2731EEAD5F63ABE7D126E03C856FFB942AF"}, }; From 2e8bacb00f68324396b28b79ef91b034a0e5d006 Mon Sep 17 00:00:00 2001 From: Christian Herrmann Date: Sat, 11 Mar 2023 18:59:33 +0100 Subject: [PATCH 291/924] Fixed `data asn1` - now handles bad input better by doing correct root free of obj --- CHANGELOG.md | 1 + client/src/cmdpiv.c | 3 +- client/src/emv/emvcore.c | 7 ++-- client/src/emv/tlv.c | 89 ++++++++++++++++++++++++++-------------- 4 files changed, 66 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b34aa61d..3f0253e58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `data asn1` - now handles bad input better (@iceman1001) - Added new public key for signature MIFARE Plus Troika (@iceman100) - Fixed the client build on Android (@wh201906) - Added TCP connection support on Windows (@wh201906) diff --git a/client/src/cmdpiv.c b/client/src/cmdpiv.c index 4d23a9b4b..8264c5936 100644 --- a/client/src/cmdpiv.c +++ b/client/src/cmdpiv.c @@ -576,7 +576,8 @@ static int PivGetData(Iso7816CommandChannel channel, const uint8_t tag[], size_t struct tlvdb_root *new_root = realloc(root, sizeof(*root) + capacity); if (new_root == NULL) { PrintAndLogEx(FAILED, "Running out of memory while re-allocating buffer"); - free(root); + //free(root); + tlvdb_root_free(root); return PM3_EMALLOC; } root = new_root; diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index fbc59b1c0..0628fcf76 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -177,7 +177,7 @@ bool TLVPrintFromBuffer(uint8_t *data, int datalen) { } void TLVPrintFromTLVLev(struct tlvdb *tlv, int level) { - if (!tlv) + if (tlv == NULL) return; tlvdb_visit(tlv, emv_print_cb, NULL, level); @@ -193,15 +193,16 @@ void TLVPrintAIDlistFromSelectTLV(struct tlvdb *tlv) { PrintAndLogEx(INFO, "|------------------+--------+-------------------------|"); struct tlvdb *ttmp = tlvdb_find(tlv, 0x6f); - if (!ttmp) + if (ttmp == NULL) PrintAndLogEx(INFO, "| none |"); while (ttmp) { const struct tlv *tgAID = tlvdb_get_inchild(ttmp, 0x84, NULL); const struct tlv *tgName = tlvdb_get_inchild(ttmp, 0x50, NULL); const struct tlv *tgPrio = tlvdb_get_inchild(ttmp, 0x87, NULL); - if (!tgAID) + if (!tgAID) { break; + } PrintAndLogEx(INFO, "| %s| %s | %s|", sprint_hex_inrow_ex(tgAID->value, tgAID->len, 17), (tgPrio) ? sprint_hex(tgPrio->value, 1) : " ", diff --git a/client/src/emv/tlv.c b/client/src/emv/tlv.c index 67fa51b58..f025fbe27 100644 --- a/client/src/emv/tlv.c +++ b/client/src/emv/tlv.c @@ -197,9 +197,7 @@ struct tlvdb *tlvdb_parse(const unsigned char *buf, size_t len) { return &root->db; err: - tlvdb_free(&root->db); - - free(root); + tlvdb_root_free(root); return NULL; } @@ -208,22 +206,32 @@ struct tlvdb *tlvdb_parse_multi(const unsigned char *buf, size_t len) { const unsigned char *tmp; size_t left; - if (!len || !buf) + if (len == 0 || buf == NULL) { return NULL; + } root = calloc(1, sizeof(*root) + len); + if (root == NULL) { + return NULL; + } + root->len = len; memcpy(root->buf, buf, len); tmp = root->buf; left = len; - if (!tlvdb_parse_one(&root->db, NULL, &tmp, &left)) + if (tlvdb_parse_one(&root->db, NULL, &tmp, &left) == false) { goto err; + } while (left != 0) { struct tlvdb *db = calloc(1, sizeof(*db)); - if (!tlvdb_parse_one(db, NULL, &tmp, &left)) { + if (db == NULL ) { + goto err; + } + + if (tlvdb_parse_one(db, NULL, &tmp, &left) == false) { free(db); goto err; } @@ -234,9 +242,7 @@ struct tlvdb *tlvdb_parse_multi(const unsigned char *buf, size_t len) { return &root->db; err: - tlvdb_free(&root->db); - - free(root); + tlvdb_root_free(root); return NULL; } @@ -313,8 +319,9 @@ struct tlvdb *tlvdb_external(tlv_tag_t tag, size_t len, const unsigned char *val void tlvdb_free(struct tlvdb *tlvdb) { struct tlvdb *next = NULL; - if (!tlvdb) + if (tlvdb == NULL) { return; + } for (; tlvdb; tlvdb = next) { next = tlvdb->next; @@ -339,36 +346,42 @@ void tlvdb_root_free(struct tlvdb_root *root) { } struct tlvdb *tlvdb_find_next(struct tlvdb *tlvdb, tlv_tag_t tag) { - if (!tlvdb) + if (tlvdb == NULL) { return NULL; + } return tlvdb_find(tlvdb->next, tag); } struct tlvdb *tlvdb_find(struct tlvdb *tlvdb, tlv_tag_t tag) { - if (!tlvdb) + if (tlvdb == NULL) { return NULL; + } for (; tlvdb; tlvdb = tlvdb->next) { - if (tlvdb->tag.tag == tag) + if (tlvdb->tag.tag == tag) { return tlvdb; + } } return NULL; } struct tlvdb *tlvdb_find_full(struct tlvdb *tlvdb, tlv_tag_t tag) { - if (!tlvdb) + if (tlvdb == NULL) { return NULL; + } for (; tlvdb; tlvdb = tlvdb->next) { - if (tlvdb->tag.tag == tag) + if (tlvdb->tag.tag == tag) { return tlvdb; + } if (tlvdb->children) { struct tlvdb *ch = tlvdb_find_full(tlvdb->children, tag); - if (ch) + if (ch) { return ch; + } } } @@ -391,12 +404,14 @@ struct tlvdb *tlvdb_find_path(struct tlvdb *tlvdb, tlv_tag_t tag[]) { } void tlvdb_add(struct tlvdb *tlvdb, struct tlvdb *other) { - if (tlvdb == other) + if (tlvdb == other) { return; + } while (tlvdb->next) { - if (tlvdb->next == other) + if (tlvdb->next == other) { return; + } tlvdb = tlvdb->next; } @@ -405,17 +420,21 @@ void tlvdb_add(struct tlvdb *tlvdb, struct tlvdb *other) { } void tlvdb_change_or_add_node_ex(struct tlvdb *tlvdb, tlv_tag_t tag, size_t len, const unsigned char *value, struct tlvdb **tlvdb_elm) { + struct tlvdb *telm = tlvdb_find_full(tlvdb, tag); if (telm == NULL) { // new tlv element struct tlvdb *elm = tlvdb_fixed(tag, len, value); tlvdb_add(tlvdb, elm); - if (tlvdb_elm) + if (tlvdb_elm) { *tlvdb_elm = elm; + } + } else { // the same tlv structure - if (telm->tag.tag == tag && telm->tag.len == len && !memcmp(telm->tag.value, value, len)) + if (telm->tag.tag == tag && telm->tag.len == len && !memcmp(telm->tag.value, value, len)) { return; + } // replace tlv element struct tlvdb *tnewelm = tlvdb_fixed(tag, len, value); @@ -434,8 +453,9 @@ void tlvdb_change_or_add_node_ex(struct tlvdb *tlvdb, tlv_tag_t tag, size_t len, // elm in root struct tlvdb *celm = tlvdb; // elm in child list of node - if (telm->parent && telm->parent->children) + if (telm->parent && telm->parent->children) { celm = telm->parent->children; + } // find previous element for (; celm; celm = celm->next) { @@ -455,7 +475,8 @@ void tlvdb_change_or_add_node_ex(struct tlvdb *tlvdb, tlv_tag_t tag, size_t len, *tlvdb_elm = tnewelm; tnewelm_linked = true; } - if (! tnewelm_linked) { + + if (!tnewelm_linked) { tlvdb_free(tnewelm); } } @@ -470,8 +491,9 @@ void tlvdb_change_or_add_node(struct tlvdb *tlvdb, tlv_tag_t tag, size_t len, co void tlvdb_visit(const struct tlvdb *tlvdb, tlv_cb cb, void *data, int level) { struct tlvdb *next = NULL; - if (!tlvdb) + if (tlvdb == NULL) { return; + } for (; tlvdb; tlvdb = next) { next = tlvdb->next; @@ -481,12 +503,14 @@ void tlvdb_visit(const struct tlvdb *tlvdb, tlv_cb cb, void *data, int level) { } static const struct tlvdb *tlvdb_next(const struct tlvdb *tlvdb) { - if (tlvdb->children) + if (tlvdb->children) { return tlvdb->children; + } while (tlvdb) { - if (tlvdb->next) + if (tlvdb->next) { return tlvdb->next; + } tlvdb = tlvdb->parent; } @@ -502,8 +526,9 @@ const struct tlv *tlvdb_get(const struct tlvdb *tlvdb, tlv_tag_t tag, const stru while (tlvdb) { - if (tlvdb->tag.tag == tag) + if (tlvdb->tag.tag == tag) { return &tlvdb->tag; + } tlvdb = tlvdb_next(tlvdb); } @@ -570,11 +595,13 @@ bool tlv_is_constructed(const struct tlv *tlv) { } bool tlv_equal(const struct tlv *a, const struct tlv *b) { - if (!a && !b) + if (a == NULL && b == NULL) { return true; + } - if (!a || !b) + if (a == NULL || b == NULL) { return false; + } return a->tag == b->tag && a->len == b->len && !memcmp(a->value, b->value, a->len); } @@ -599,8 +626,9 @@ bool tlvdb_get_uint8(struct tlvdb *tlvRoot, tlv_tag_t tag, uint8_t *value) { bool tlv_get_uint8(const struct tlv *etlv, uint8_t *value) { *value = 0; if (etlv) { - if (etlv->len == 0) + if (etlv->len == 0) { return true; + } if (etlv->len == 1) { *value = etlv->value[0]; @@ -613,8 +641,9 @@ bool tlv_get_uint8(const struct tlv *etlv, uint8_t *value) { bool tlv_get_int(const struct tlv *etlv, int *value) { *value = 0; if (etlv) { - if (etlv->len == 0) + if (etlv->len == 0) { return true; + } if (etlv->len <= 4) { for (int i = 0; i < etlv->len; i++) { From d02e8daba0fe7703738ff90e3fbf9607cac4241e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 12 Mar 2023 09:53:23 +0100 Subject: [PATCH 292/924] Changed CLI max string argument length limit from 512 to 4096. `data asn1` now handles 2048 hex bytes input --- CHANGELOG.md | 1 + client/deps/cliparser/cliparser.c | 101 +++++++++++++++++------------- client/deps/cliparser/cliparser.h | 6 +- client/src/cmddata.c | 6 +- client/src/cmdparser.c | 91 +++++++++++++++------------ 5 files changed, 118 insertions(+), 87 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f0253e58..ffcac2de5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed CLI max string argument length limit from 512 to 4096 (@iceman1001) - Fixed `data asn1` - now handles bad input better (@iceman1001) - Added new public key for signature MIFARE Plus Troika (@iceman100) - Fixed the client build on Android (@wh201906) diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index bcdb4b3d8..e5e8f946c 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -11,10 +11,10 @@ #include "cliparser.h" #include #include -#include // Get color constants -#include // get PrintAndLogEx -#include // tolower -#include // PRIu64 +#include // color constants +#include // PrintAndLogEx +#include // tolower +#include // PRIu64 #ifndef ARRAYLEN # define ARRAYLEN(x) (sizeof(x)/sizeof((x)[0])) @@ -22,10 +22,10 @@ // Custom Colors // To default the color return s -#define _SectionTagColor_(s) _GREEN_(s) -#define _ExampleColor_(s) _YELLOW_(s) -#define _CommandColor_(s) _RED_(s) -#define _DescriptionColor_(s) _CYAN_(s) +#define _SectionTagColor_(s) _GREEN_(s) +#define _ExampleColor_(s) _YELLOW_(s) +#define _CommandColor_(s) _RED_(s) +#define _DescriptionColor_(s) _CYAN_(s) #define _ArgColor_(s) s #define _ArgHelpColor_(s) s // End Custom Colors @@ -34,65 +34,78 @@ int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp) { *ctx = calloc(sizeof(CLIParserContext), sizeof(uint8_t)); - if (!*ctx) { + if (*ctx == NULL) { PrintAndLogEx(ERR, "ERROR: Insufficient memory\n"); return 2; } + (*ctx)->argtable = NULL; (*ctx)->argtableLen = 0; (*ctx)->programName = vprogramName; (*ctx)->programHint = vprogramHint; (*ctx)->programHelp = vprogramHelp; memset((*ctx)->buf, 0x00, sizeof((*ctx)->buf)); - return 0; + + return PM3_SUCCESS; } void CLIParserPrintHelp(CLIParserContext *ctx) { - if (ctx->programHint) + if (ctx->programHint) { PrintAndLogEx(NORMAL, "\n"_DescriptionColor_("%s"), ctx->programHint); + } PrintAndLogEx(NORMAL, "\n"_SectionTagColor_("usage:")); PrintAndLogEx(NORMAL, " "_CommandColor_("%s")NOLF, ctx->programName); arg_print_syntax(stdout, ctx->argtable, "\n\n"); PrintAndLogEx(NORMAL, _SectionTagColor_("options:")); - arg_print_glossary(stdout, ctx->argtable, " "_ArgColor_("%-30s")" "_ArgHelpColor_("%s")"\n"); - PrintAndLogEx(NORMAL, ""); - if (ctx->programHelp) { - PrintAndLogEx(NORMAL, _SectionTagColor_("examples/notes:")); - char *buf = NULL; - int idx = 0; - buf = realloc(buf, strlen(ctx->programHelp) + 1); // more then enough as we are splitting - char *p2; // pointer to split example from comment. + if (ctx->programHelp) { + + // allocate more then enough memory as we are splitting + char *s = calloc(strlen(ctx->programHelp) + 1, sizeof(uint8_t)); + if (s == NULL) { + PrintAndLogEx(FAILED, "cannot allocate memory"); + return; + } + + PrintAndLogEx(NORMAL, _SectionTagColor_("examples/notes:")); + + // pointer to split example from comment. + char *p2; + + int idx = 0; int egWidth = 30; for (int i = 0; i <= strlen(ctx->programHelp); i++) { // <= so to get string terminator. - buf[idx++] = ctx->programHelp[i]; + + s[idx++] = ctx->programHelp[i]; + if ((ctx->programHelp[i] == '\n') || (ctx->programHelp[i] == 0x00)) { - buf[idx - 1] = 0x00; - p2 = strstr(buf, "->"); // See if the example has a comment. + + s[idx - 1] = 0x00; + p2 = strstr(s, "->"); // See if the example has a comment. + if (p2 != NULL) { *(p2 - 1) = 0x00; - if (strlen(buf) > 28) - egWidth = strlen(buf) + 5; + if (strlen(s) > 28) + egWidth = strlen(s) + 5; else egWidth = 30; - PrintAndLogEx(NORMAL, " "_ExampleColor_("%-*s")" %s", egWidth, buf, p2); + PrintAndLogEx(NORMAL, " "_ExampleColor_("%-*s")" %s", egWidth, s, p2); } else { - PrintAndLogEx(NORMAL, " "_ExampleColor_("%-*s"), egWidth, buf); + PrintAndLogEx(NORMAL, " "_ExampleColor_("%-*s"), egWidth, s); } + idx = 0; } } - + free(s); PrintAndLogEx(NORMAL, ""); - free(buf); } - fflush(stdout); } @@ -127,7 +140,7 @@ int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargta return 3; } - return 0; + return PM3_SUCCESS; } enum ParserState { @@ -144,21 +157,25 @@ int CLIParserParseString(CLIParserContext *ctx, const char *str, void *vargtable int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData) { int argc = 0; - char *argv[200] = {NULL}; + char *argv[MAX_INPUT_ARG_LENGTH] = {NULL}; int len = strlen(str); + memset(ctx->buf, 0x00, ARRAYLEN(ctx->buf)); + char *bufptr = ctx->buf; char *bufptrend = ctx->buf + ARRAYLEN(ctx->buf) - 1; char *spaceptr = NULL; enum ParserState state = PS_FIRST; argv[argc++] = bufptr; - // param0 = program name - memcpy(ctx->buf, ctx->programName, strlen(ctx->programName) + 1); // with 0x00 + // param0 = program name + with 0x00 + memcpy(ctx->buf, ctx->programName, strlen(ctx->programName) + 1); + bufptr += strlen(ctx->programName) + 1; - if (len) + if (len) { argv[argc++] = bufptr; + } // parse params for (int i = 0; i < len; i++) { @@ -214,10 +231,9 @@ int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen = 0; int tmplen = 0; - uint8_t tmpstr[(256 * 2) + 1] = {0}; + uint8_t tmpstr[MAX_INPUT_ARG_LENGTH + 1] = {0}; // concat all strings in argstr into tmpstr[] - // int res = CLIParamStrToBuf(argstr, tmpstr, sizeof(tmpstr), &tmplen); if (res || (tmplen == 0)) { return res; @@ -242,7 +258,7 @@ int CLIParamBinToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen = 0; int tmplen = 0; - uint8_t tmpstr[(256 * 2) + 1] = {0}; + uint8_t tmpstr[MAX_INPUT_ARG_LENGTH + 1] = {0}; // concat all strings in argstr into tmpstr[] // @@ -268,7 +284,7 @@ int CLIParamStrToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int if (!argstr->count) return 0; - uint8_t tmpstr[(512 * 2) + 1] = {0}; + uint8_t tmpstr[MAX_INPUT_ARG_LENGTH + 1] = {0}; int ibuf = 0; for (int i = 0; i < argstr->count; i++) { @@ -303,7 +319,7 @@ int CLIParamStrToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int int CLIGetOptionList(struct arg_str *argstr, const CLIParserOption *option_array, int *value) { char data[200] = {0}; - int datalen = 0; + int datalen = 200; int res = CLIParamStrToBuf(argstr, (uint8_t *)data, sizeof(data), &datalen); if (res) return res; @@ -316,7 +332,7 @@ int CLIGetOptionList(struct arg_str *argstr, const CLIParserOption *option_array int val = -1; int cntr = 0; - for (int i = 0; i < CLI_MAX_OPTLIST_LEN && option_array[i].text != NULL; i++) { + for (int i = 0; (i < CLI_MAX_OPTLIST_LEN) && (option_array[i].text != NULL); i++) { // exact match if (strcmp(option_array[i].text, data) == 0) { *value = option_array[i].code; @@ -346,9 +362,10 @@ int CLIGetOptionList(struct arg_str *argstr, const CLIParserOption *option_array const char *CLIGetOptionListStr(const CLIParserOption *option_array, int value) { static const char *errmsg = "n/a"; - for (int i = 0; i < CLI_MAX_OPTLIST_LEN && option_array[i].text != NULL; i++) { - if (option_array[i].code == value) + for (int i = 0; (i < CLI_MAX_OPTLIST_LEN) && (option_array[i].text != NULL); i++) { + if (option_array[i].code == value) { return option_array[i].text; + } } return errmsg; } diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index f50fec2ee..812b44506 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -12,6 +12,7 @@ #define __CLIPARSER_H #include "argtable3.h" #include +#include #include "util.h" #define arg_param_begin arg_lit0("h", "help", "This help") @@ -53,13 +54,16 @@ #define CLIGetOptionListWithReturn(ctx, paramnum, option_array, option_array_len, value) if (CLIGetOptionList(arg_get_str((ctx), (paramnum)), (option_array), (option_array_len), (value))) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define MAX_INPUT_ARG_LENGTH 4096 + + typedef struct { void **argtable; size_t argtableLen; const char *programName; const char *programHint; const char *programHelp; - char buf[1024 + 60]; + char buf[MAX_INPUT_ARG_LENGTH + 60]; } CLIParserContext; #define CLI_MAX_OPTLIST_LEN 50 diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 724bc5c65..3d153022d 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -2915,8 +2915,8 @@ static int CmdAsn1Decoder(const char *Cmd) { arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); - int dlen = 256; - uint8_t data[256]; + int dlen = 2048; + uint8_t data[2048]; CLIGetHexWithReturn(ctx, 1, data, &dlen); CLIParserFree(ctx); @@ -2927,8 +2927,6 @@ static int CmdAsn1Decoder(const char *Cmd) { return PM3_SUCCESS; } - - static int CmdDiff(const char *Cmd) { CLIParserContext *ctx; diff --git a/client/src/cmdparser.c b/client/src/cmdparser.c index 1c360e832..39a6c98ad 100644 --- a/client/src/cmdparser.c +++ b/client/src/cmdparser.c @@ -25,6 +25,9 @@ #include "comms.h" #include "util_posix.h" // msleep + +#define MAX_PM3_INPUT_ARGS_LENGTH 4096 + bool AlwaysAvailable(void) { return true; } @@ -36,54 +39,55 @@ bool IfPm3Present(void) { } bool IfPm3Rdv4Fw(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return (g_pm3_capabilities.is_rdv4); } bool IfPm3Flash(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; - if (!g_pm3_capabilities.compiled_with_flash) + if (g_pm3_capabilities.compiled_with_flash == false) return false; return g_pm3_capabilities.hw_available_flash; } bool IfPm3Smartcard(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; - if (!g_pm3_capabilities.compiled_with_smartcard) + if (g_pm3_capabilities.compiled_with_smartcard == false) return false; return g_pm3_capabilities.hw_available_smartcard; } bool IfPm3FpcUsart(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_fpc_usart; } bool IfPm3FpcUsartHost(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_fpc_usart_host; } bool IfPm3FpcUsartHostFromUsb(void) { // true if FPC USART Host support and if talking from USB-CDC interface - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; - if (!g_pm3_capabilities.compiled_with_fpc_usart_host) + if (g_pm3_capabilities.compiled_with_fpc_usart_host == false) return false; return !g_conn.send_via_fpc_usart; } bool IfPm3FpcUsartDevFromUsb(void) { // true if FPC USART developer support and if talking from USB-CDC interface - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; - if (!g_pm3_capabilities.compiled_with_fpc_usart_dev) + if (g_pm3_capabilities.compiled_with_fpc_usart_dev == false) return false; + return !g_conn.send_via_fpc_usart; } @@ -93,103 +97,101 @@ bool IfPm3FpcUsartFromUsb(void) { } bool IfPm3Lf(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_lf; } bool IfPm3Hitag(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_hitag; } bool IfPm3EM4x50(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_em4x50; } bool IfPm3EM4x70(void) { - - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_em4x70; } bool IfPm3Hfsniff(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_hfsniff; } bool IfPm3Hfplot(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_hfplot; } bool IfPm3Iso14443a(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_iso14443a; } bool IfPm3Iso14443b(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_iso14443b; } bool IfPm3Iso14443(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_iso14443a || g_pm3_capabilities.compiled_with_iso14443b; } bool IfPm3Iso15693(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_iso15693; } bool IfPm3Felica(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_felica; } bool IfPm3Legicrf(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_legicrf; } bool IfPm3Iclass(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_iclass; } bool IfPm3NfcBarcode(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_nfcbarcode; } bool IfPm3Lcd(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_lcd; } bool IfPm3Zx8211(void) { - if (!IfPm3Present()) + if (IfPm3Present() == false) return false; return g_pm3_capabilities.compiled_with_zx8211; } - void CmdsHelp(const command_t Commands[]) { if (Commands[0].Name == NULL) return; int i = 0; @@ -259,7 +261,7 @@ int CmdsParse(const command_t Commands[], const char *Cmd) { } - char cmd_name[128]; + char cmd_name[128] = {0}; memset(cmd_name, 0, sizeof(cmd_name)); int len = 0; @@ -275,8 +277,10 @@ int CmdsParse(const command_t Commands[], const char *Cmd) { // find args, check for -h / --help int tmplen = len; - while (Cmd[tmplen] == ' ') + while (Cmd[tmplen] == ' ') { ++tmplen; + } + bool request_help = (strcmp(Cmd + tmplen, "-h") == 0) || (strcmp(Cmd + tmplen, "--help") == 0); int i = 0; @@ -305,12 +309,15 @@ int CmdsParse(const command_t Commands[], const char *Cmd) { matches++; } } - if (matches == 1) i = last_match; + if (matches == 1) { + i = last_match; + } } if (Commands[i].Name) { - while (Cmd[len] == ' ') + while (Cmd[len] == ' ') { ++len; + } return Commands[i].Parse(Cmd + len); } else { // show help for selected hierarchy or if command not recognised @@ -320,7 +327,7 @@ int CmdsParse(const command_t Commands[], const char *Cmd) { return PM3_SUCCESS; } -static char pparent[512] = {0}; +static char pparent[MAX_PM3_INPUT_ARGS_LENGTH] = {0}; static char *parent = pparent; void dumpCommandsRecursive(const command_t cmds[], int markdown, bool full_help) { @@ -346,11 +353,13 @@ void dumpCommandsRecursive(const command_t cmds[], int markdown, bool full_help) const char *cmd_offline = "N"; - if (cmds[i].IsAvailable()) + if (cmds[i].IsAvailable()) { cmd_offline = "Y"; - if (markdown) + } + + if (markdown) { PrintAndLogEx(NORMAL, "|`%s%-*s`|%-*s|`%s`", parent, w_cmd - (int)strlen(parent) - 2, cmds[i].Name, w_off, cmd_offline, cmds[i].Help); - else if (full_help) { + } else if (full_help) { PrintAndLogEx(NORMAL, "---------------------------------------------------------------------------------------"); PrintAndLogEx(NORMAL, _RED_("%s%-*s\n") "available offline: %s", parent, w_cmd - (int)strlen(parent), cmds[i].Name, cmds[i].IsAvailable() ? _GREEN_("yes") : _RED_("no")); cmds[i].Parse("--help"); @@ -374,15 +383,17 @@ void dumpCommandsRecursive(const command_t cmds[], int markdown, bool full_help) } else { PrintAndLogEx(NORMAL, "### %s%s\n\n %s\n", parent, cmds[i].Name, cmds[i].Help); } - char currentparent[512] = {0}; + + char currentparent[MAX_PM3_INPUT_ARGS_LENGTH] = {0}; snprintf(currentparent, sizeof currentparent, "%s%s ", parent, cmds[i].Name); + char *old_parent = parent; parent = currentparent; // This is what causes the recursion, since commands Parse-implementation // in turn calls the CmdsParse above. - if (markdown) + if (markdown) { cmds[i].Parse("XX_internal_command_dump_markdown_XX"); - else if (full_help) { + } else if (full_help) { cmds[i].Parse("XX_internal_command_dump_full_XX"); } else { cmds[i].Parse("XX_internal_command_dump_XX"); From 5938938226a17d68ba422a848325edc1aa3deae7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 12 Mar 2023 18:54:53 +0100 Subject: [PATCH 293/924] print the string and hex --- client/src/crypto/asn1dump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index 4bab148be..a7197a35d 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -166,7 +166,7 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag } static void asn1_tag_dump_string(const struct tlv *tlv, const struct asn1_tag *tag, int level) { - PrintAndLogEx(NORMAL, " value: '%s'", sprint_hex(tlv->value, tlv->len)); + PrintAndLogEx(NORMAL, " value: '%.*s' hex: '%s'", tlv->len, tlv->value, sprint_hex(tlv->value, tlv->len)); } static void asn1_tag_dump_hex(const struct tlv *tlv, const struct asn1_tag *tag, int level) { From 4a7713070b8a4260f20857b776a0aaf7a70c04f7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 12 Mar 2023 18:59:53 +0100 Subject: [PATCH 294/924] fix object strings. Integers is now 64b which isnt enough. Will need to use big_num here --- client/src/crypto/asn1dump.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index a7197a35d..548a80c49 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -96,7 +96,6 @@ static const struct asn1_tag asn1_tags[] = { { 0xa5, "[5]", ASN1_TAG_GENERIC }, }; - static int asn1_sort_tag(tlv_tag_t tag) { return (int)(tag >= 0x100 ? tag : tag << 8); } @@ -109,9 +108,7 @@ static int asn1_tlv_compare(const void *a, const void *b) { } static const struct asn1_tag *asn1_get_tag(const struct tlv *tlv) { - struct asn1_tag *tag = bsearch(tlv, asn1_tags, ARRAYLEN(asn1_tags), - sizeof(asn1_tags[0]), asn1_tlv_compare); - + struct asn1_tag *tag = bsearch(tlv, asn1_tags, ARRAYLEN(asn1_tags), sizeof(asn1_tags[0]), asn1_tlv_compare); return tag ? tag : &asn1_tags[0]; } @@ -189,8 +186,8 @@ static void asn1_tag_dump_octet_string(const struct tlv *tlv, const struct asn1_ } } -static unsigned long asn1_value_integer(const struct tlv *tlv, unsigned start, unsigned end) { - unsigned long ret = 0; +static uint64_t asn1_value_integer(const struct tlv *tlv, unsigned start, unsigned end) { + uint64_t ret = 0; unsigned i; if (end > tlv->len * 2) @@ -238,8 +235,8 @@ static void asn1_tag_dump_integer(const struct tlv *tlv, const struct asn1_tag * PrintAndLogEx(NORMAL, " value: %d (0x%08X)", val, val); return; } - uint32_t val = asn1_value_integer(tlv, 0, tlv->len * 2); - PrintAndLogEx(NORMAL, " value: %" PRIu32 " (0x%X)", val, val); + uint64_t val = asn1_value_integer(tlv, 0, tlv->len * 2); + PrintAndLogEx(NORMAL, " value: %" PRIu64 " (0x%X)", val, val); } static char *asn1_oid_description(const char *oid, bool with_group_desc) { @@ -293,7 +290,7 @@ static void asn1_tag_dump_object_id(const struct tlv *tlv, const struct asn1_tag char pstr[300]; mbedtls_oid_get_numeric_string(pstr, sizeof(pstr), &asn1_buf); - PrintAndLogEx(INFO, "%*s %s" NOLF, (level * 4), " ", pstr); + PrintAndLogEx(NORMAL, "%*s %s" NOLF, (level * 4), " ", pstr); char *jsondesc = asn1_oid_description(pstr, true); if (jsondesc) { From d11d1fbc33ed7d6b5051837a19df73ce5bfff10b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 12 Mar 2023 19:18:55 +0100 Subject: [PATCH 295/924] data asn1 now decodes timestamp correct... Or I hope so. And strings values are now highlighted with GREEN --- client/src/crypto/asn1dump.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index 548a80c49..db0b2b687 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -116,7 +116,7 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag int len = tlv->len; *needdump = false; - int startindx = longyear ? 4 : 2; + int startidx = longyear ? 4 : 2; if (len > 4) { PrintAndLogEx(NORMAL, " value: '" NOLF); @@ -125,34 +125,38 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag if (longyear == false) PrintAndLogEx(NORMAL, "20" NOLF); - PrintAndLogEx(NORMAL, "%s-" NOLF, sprint_hex(tlv->value, startindx)); + PrintAndLogEx(NORMAL, "%.*s-" NOLF, startidx, tlv->value); - if (len < startindx + 2) + if (len < startidx + 2) break; // month - PrintAndLogEx(NORMAL, "%02x%02x-" NOLF, tlv->value[startindx], tlv->value[startindx + 1]); - if (len < startindx + 4) + PrintAndLogEx(NORMAL, "%.*s-" NOLF, 2, tlv->value + startidx ); + if (len < startidx + 4) break; // day - PrintAndLogEx(NORMAL, "%02x%02x " NOLF, tlv->value[startindx + 2], tlv->value[startindx + 3]); - if (len < startindx + 6) + PrintAndLogEx(NORMAL, "%.*s " NOLF, 2, tlv->value + startidx + 2); + if (len < startidx + 6) break; + // hour - PrintAndLogEx(NORMAL, "%02x%02x:" NOLF, tlv->value[startindx + 4], tlv->value[startindx + 5]); - if (len < startindx + 8) + PrintAndLogEx(NORMAL, "%.*s:" NOLF, 2, tlv->value + startidx + 4); + if (len < startidx + 8) break; + // min - PrintAndLogEx(NORMAL, "%02x%02x:" NOLF, tlv->value[startindx + 6], tlv->value[startindx + 7]); - if (len < startindx + 10) + PrintAndLogEx(NORMAL, "%.*s:" NOLF, 2, tlv->value + startidx + 6); + if (len < startidx + 10) break; + // sec - PrintAndLogEx(NORMAL, "%02x%02x" NOLF, tlv->value[startindx + 8], tlv->value[startindx + 9]); - if (len < startindx + 11) + PrintAndLogEx(NORMAL, "%.*s" NOLF, 2, tlv->value + startidx + 8); + if (len < startidx + 11) break; + // time zone - PrintAndLogEx(NORMAL, " zone: %.*s" NOLF, len - 10 - (longyear ? 4 : 2), &tlv->value[startindx + 10]); + PrintAndLogEx(NORMAL, " zone: %.*s" NOLF, len - 10 - (longyear ? 4 : 2), tlv->value + startidx + 10); break; } PrintAndLogEx(NORMAL, "'"); @@ -163,7 +167,7 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag } static void asn1_tag_dump_string(const struct tlv *tlv, const struct asn1_tag *tag, int level) { - PrintAndLogEx(NORMAL, " value: '%.*s' hex: '%s'", tlv->len, tlv->value, sprint_hex(tlv->value, tlv->len)); + PrintAndLogEx(NORMAL, " value: '" _GREEN_("%.*s") "' hex: '%s'", tlv->len, tlv->value, sprint_hex(tlv->value, tlv->len)); } static void asn1_tag_dump_hex(const struct tlv *tlv, const struct asn1_tag *tag, int level) { From 04173fc961059f49192c52d3dff9b83956446e82 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 13 Mar 2023 21:36:59 +0100 Subject: [PATCH 296/924] added bit string printing in ASN1 decoder --- client/src/crypto/asn1dump.c | 55 +++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index db0b2b687..4136c002d 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -44,6 +44,7 @@ enum asn1_tag_t { ASN1_TAG_STR_TIME, ASN1_TAG_OBJECT_ID, ASN1_TAG_HEX, + ASN1_TAG_BIT_STRING, }; struct asn1_tag { @@ -62,7 +63,7 @@ static const struct asn1_tag asn1_tags[] = { // ASN.1 { 0x01, "BOOLEAN", ASN1_TAG_BOOLEAN }, { 0x02, "INTEGER", ASN1_TAG_INTEGER }, - { 0x03, "BIT STRING", ASN1_TAG_GENERIC }, + { 0x03, "BIT STRING", ASN1_TAG_BIT_STRING }, { 0x04, "OCTET STRING", ASN1_TAG_OCTET_STRING }, { 0x05, "NULL", ASN1_TAG_GENERIC }, { 0x06, "OBJECT IDENTIFIER", ASN1_TAG_OBJECT_ID }, @@ -170,6 +171,54 @@ static void asn1_tag_dump_string(const struct tlv *tlv, const struct asn1_tag *t PrintAndLogEx(NORMAL, " value: '" _GREEN_("%.*s") "' hex: '%s'", tlv->len, tlv->value, sprint_hex(tlv->value, tlv->len)); } +static void asn1_tag_dump_bitstring(const struct tlv *tlv, const struct asn1_tag *tag, int level) { + + size_t len = tlv->len; + size_t n = (len * 8); + bool skip = false; + + if (tlv->value[0] == 0) { + n -= 8; + len--; + skip = true; + } + + uint8_t *d = calloc(n, sizeof(uint8_t)); + if (d == NULL) { + return; + } + + if (skip) + bytes_to_bytebits(tlv->value + 1, len, d); + else + bytes_to_bytebits(tlv->value, len, d); + + level++; + PrintAndLogEx(NORMAL, " (%zu bit)", n); + PrintAndLogEx(INFO, "%*s" NOLF, 1 + (level * 4), ""); + + for (int i = 0; i < n; i++) { + + char c = d[i]; + if (c < 2) { + c += '0'; + } else { + goto out; + } + + PrintAndLogEx(NORMAL, "%c" NOLF, c); + + if (((i + 1) % 64) == 0) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "%*s" NOLF, 1 + (level * 4), ""); + } + } + +out: + free(d); + PrintAndLogEx(NORMAL, ""); +} + static void asn1_tag_dump_hex(const struct tlv *tlv, const struct asn1_tag *tag, int level) { PrintAndLogEx(NORMAL, " value: '%s'", sprint_hex_inrow(tlv->value, tlv->len)); } @@ -378,6 +427,10 @@ bool asn1_tag_dump(const struct tlv *tlv, int level, bool *candump) { asn1_tag_dump_hex(tlv, tag, level); *candump = false; break; + case ASN1_TAG_BIT_STRING: + asn1_tag_dump_bitstring(tlv, tag, level); + *candump = false; + break; }; return true; From 1cc19c3429076865a31af8aa846cd8d27b2a58ac Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 13 Mar 2023 22:09:30 +0100 Subject: [PATCH 297/924] asn1 decoder now handles big integers --- client/src/crypto/asn1dump.c | 68 +++++++++++++++--------------------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index 4136c002d..1b6eede1c 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -26,6 +26,7 @@ #include #include #include +#include "mbedtls/bignum.h" // big num #include #include "emv/emv_tags.h" #include "emv/emvjson.h" @@ -239,36 +240,6 @@ static void asn1_tag_dump_octet_string(const struct tlv *tlv, const struct asn1_ } } -static uint64_t asn1_value_integer(const struct tlv *tlv, unsigned start, unsigned end) { - uint64_t ret = 0; - unsigned i; - - if (end > tlv->len * 2) - return ret; - if (start >= end) - return ret; - - if (start & 1) { - ret += tlv->value[start / 2] & 0xf; - i = start + 1; - } else - i = start; - - for (; i < end - 1; i += 2) { - ret = ret << 4; // was: ret*=10 - ret += tlv->value[i / 2] >> 4; - ret = ret << 4; // was: ret*=10 - ret += tlv->value[i / 2] & 0xf; - } - - if (end & 1) { - ret = ret << 4; // was: ret*=10 - ret += tlv->value[end / 2] >> 4; - } - - return ret; -} - static void asn1_tag_dump_boolean(const struct tlv *tlv, const struct asn1_tag *tag, int level) { PrintAndLogEx(NORMAL, "%*s" NOLF, (level * 4), " "); if (tlv->len > 0) { @@ -279,17 +250,34 @@ static void asn1_tag_dump_boolean(const struct tlv *tlv, const struct asn1_tag * } static void asn1_tag_dump_integer(const struct tlv *tlv, const struct asn1_tag *tag, int level) { - PrintAndLogEx(NORMAL, "%*s" NOLF, (level * 4), " "); - if (tlv->len == 4) { - int32_t val = 0; - for (size_t i = 0; i < tlv->len; i++) { - val = (val << 8) + tlv->value[i]; - } - PrintAndLogEx(NORMAL, " value: %d (0x%08X)", val, val); + + size_t n = (tlv->len * 2); + char *hex = calloc(n + 1, sizeof(uint8_t)); + if (hex == NULL) { return; } - uint64_t val = asn1_value_integer(tlv, 0, tlv->len * 2); - PrintAndLogEx(NORMAL, " value: %" PRIu64 " (0x%X)", val, val); + + hex_to_buffer((uint8_t*)hex, tlv->value, tlv->len, tlv->len, 0, 0, false); + + // results for MPI actions + bool ret = false; + + // container of big number + mbedtls_mpi N; + mbedtls_mpi_init(&N); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&N, 16, hex)); + + char s[600] = {0}; + size_t slen = 0; + MBEDTLS_MPI_CHK(mbedtls_mpi_write_string(&N, 10, s, sizeof(s), &slen)); + if (slen > 0) { + PrintAndLogEx(NORMAL, "%*s value: %s", (level ), "", s); + } + +cleanup: + mbedtls_mpi_free(&N); + free(hex); } static char *asn1_oid_description(const char *oid, bool with_group_desc) { @@ -343,7 +331,7 @@ static void asn1_tag_dump_object_id(const struct tlv *tlv, const struct asn1_tag char pstr[300]; mbedtls_oid_get_numeric_string(pstr, sizeof(pstr), &asn1_buf); - PrintAndLogEx(NORMAL, "%*s %s" NOLF, (level * 4), " ", pstr); + PrintAndLogEx(NORMAL, "%*s %s" NOLF, (level), " ", pstr); char *jsondesc = asn1_oid_description(pstr, true); if (jsondesc) { From 03f6ad02f33e7c4dab180e109c17f5a904ff1d21 Mon Sep 17 00:00:00 2001 From: Fabian Schneebauer Date: Thu, 16 Mar 2023 17:01:57 +0100 Subject: [PATCH 298/924] legic: info command available for more sources, add memory check. --- client/src/cmdhflegic.c | 192 ++++++++++++++++++++++++++++++++-------- 1 file changed, 153 insertions(+), 39 deletions(-) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 35b1ac886..5ca53ecd3 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -57,54 +57,28 @@ static bool legic_xor(uint8_t *data, uint16_t cardsize) { return true; } -/* - * Output BigBuf and deobfuscate LEGIC RF tag data. - * This is based on information given in the talk held - * by Henryk Ploetz and Karsten Nohl at 26c3 - */ -static int CmdLegicInfo(const char *Cmd) { - CLIParserContext *ctx; - CLIParserInit(&ctx, "hf legic info", - "Gets information from a LEGIC Prime tag like systemarea, user areas, etc", - "hf legic info"); - - void *argtable[] = { - arg_param_begin, - arg_param_end - }; - CLIExecWithReturn(ctx, Cmd, argtable, true); - CLIParserFree(ctx); - +static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buffer) { int i = 0, k = 0, segmentNum = 0, segment_len = 0, segment_flag = 0; int crc = 0, wrp = 0, wrc = 0; uint8_t stamp_len = 0; - uint16_t datalen = 0; char token_type[6] = {0, 0, 0, 0, 0, 0}; int dcf = 0; int bIsSegmented = 0; + int return_value = PM3_SUCCESS; - // tagtype - legic_card_select_t card; - if (legic_get_type(&card) != PM3_SUCCESS) { - PrintAndLogEx(WARNING, "Failed to identify tagtype"); - return PM3_ESOFT; + if (!(card_size == LEGIC_PRIME_MIM22 || card_size == LEGIC_PRIME_MIM256 || card_size == LEGIC_PRIME_MIM1024)) { + PrintAndLogEx(FAILED, "Bytebuffer is not any known legic card size! (MIM22, MIM256, MIM1024)"); + return_value = PM3_EFAILED; + return PM3_EFAILED; } - PrintAndLogEx(SUCCESS, "Reading full tag memory of " _YELLOW_("%d") " bytes...", card.cardsize); - - // allocate receiver buffer - uint8_t *data = calloc(card.cardsize, sizeof(uint8_t)); + // copy input buffer into newly allocated buffer, because the existing code mutates the data inside. + uint8_t *data = calloc(card_size, sizeof(uint8_t)); if (!data) { PrintAndLogEx(WARNING, "Cannot allocate memory"); return PM3_EMALLOC; } - - int status = legic_read_mem(0, card.cardsize, 0x55, data, &datalen); - if (status != PM3_SUCCESS) { - PrintAndLogEx(WARNING, "Failed reading memory"); - free(data); - return status; - } + memcpy(data, input_buffer, card_size); // Output CDF System area (9 bytes) plus remaining header area (12 bytes) crc = data[4]; @@ -217,9 +191,10 @@ static int CmdLegicInfo(const char *Cmd) { uint32_t segCalcCRC = 0; uint32_t segCRC = 0; - // Not Data card? - if (dcf > 60000) + // Not a data card by dcf or too small to contain data (MIM22)? + if (dcf > 60000 || card_size == LEGIC_PRIME_MIM22) { goto out; + } PrintAndLogEx(SUCCESS, _CYAN_("ADF: User Area")); PrintAndLogEx(NORMAL, "------------------------------------------------------"); @@ -231,6 +206,13 @@ static int CmdLegicInfo(const char *Cmd) { // decode segments for (segmentNum = 1; segmentNum < 128; segmentNum++) { + // for decoding the segment header we need at least 4 bytes left in buffer + if ((i + 4) > card_size) { + PrintAndLogEx(FAILED, "Cannot read segment header, because the input buffer is too small. " + "Please check that the data is correct and properly aligned. "); + return_value = PM3_EOUTOFBOUND; + goto out; + } segment_len = ((data[i + 1] ^ crc) & 0x0f) * 256 + (data[i] ^ crc); segment_flag = ((data[i + 1] ^ crc) & 0xf0) >> 4; wrp = (data[i + 2] ^ crc); @@ -277,6 +259,14 @@ static int CmdLegicInfo(const char *Cmd) { i += 5; + // for printing the complete segment we need at least wrc + wrp_len + remain_seg_payload_len bytes + if ((i + wrc + wrp_len + remain_seg_payload_len) > card_size) { + PrintAndLogEx(FAILED, "Cannot read segment body, because the input buffer is too small. " + "Please check that the data is correct and properly aligned. "); + return_value = PM3_EOUTOFBOUND; + goto out; + } + if (hasWRC) { PrintAndLogEx(SUCCESS, "\nWRC protected area: (I %d | K %d| WRC %d)", i, k, wrc); PrintAndLogEx(NORMAL, "\nrow | data"); @@ -330,7 +320,6 @@ static int CmdLegicInfo(const char *Cmd) { } // end for loop } else { - // Data start point on unsegmented cards i = 8; @@ -340,7 +329,7 @@ static int CmdLegicInfo(const char *Cmd) { bool hasWRC = (wrc > 0); bool hasWRP = (wrp > wrc); int wrp_len = (wrp - wrc); - int remain_seg_payload_len = (card.cardsize - 22 - wrp); + int remain_seg_payload_len = (card_size - 22 - wrp); PrintAndLogEx(SUCCESS, "Unsegmented card - WRP: %02u, WRC: %02u, RD: %01u", wrp, @@ -348,6 +337,14 @@ static int CmdLegicInfo(const char *Cmd) { (data[7] & 0x80) >> 7 ); + // for printing the complete segment we need at least wrc + wrp_len + remain_seg_payload_len bytes + if ((i + wrc + wrp_len + remain_seg_payload_len) > card_size) { + PrintAndLogEx(FAILED, "Cannot read segment body, because the input buffer is too small. " + "Please check that the data is correct and properly aligned. "); + return_value = PM3_EOUTOFBOUND; + goto out; + } + if (hasWRC) { PrintAndLogEx(SUCCESS, "WRC protected area: (I %d | WRC %d)", i, wrc); PrintAndLogEx(NORMAL, "\nrow | data"); @@ -386,6 +383,55 @@ static int CmdLegicInfo(const char *Cmd) { } out: + free(data); + return (return_value); +} + +/* + * Output BigBuf and deobfuscate LEGIC RF tag data. + * This is based on information given in the talk held + * by Henryk Ploetz and Karsten Nohl at 26c3 + */ +static int CmdLegicInfo(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf legic info", + "Gets information from a LEGIC Prime tag like systemarea, user areas, etc", + "hf legic info"); + + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); + + uint16_t datalen = 0; + + // tagtype + legic_card_select_t card; + if (legic_get_type(&card) != PM3_SUCCESS) { + PrintAndLogEx(WARNING, "Failed to identify tagtype"); + return PM3_ESOFT; + } + + PrintAndLogEx(SUCCESS, "Reading full tag memory of " _YELLOW_("%d") " bytes...", card.cardsize); + + // allocate receiver buffer + uint8_t *data = calloc(card.cardsize, sizeof(uint8_t)); + if (!data) { + PrintAndLogEx(WARNING, "Cannot allocate memory"); + return PM3_EMALLOC; + } + + int status = legic_read_mem(0, card.cardsize, 0x55, data, &datalen); + if (status != PM3_SUCCESS) { + PrintAndLogEx(WARNING, "Failed reading memory"); + free(data); + return status; + } + + decode_and_print_memory(card.cardsize, data); + free(data); return PM3_SUCCESS; } @@ -1174,6 +1220,41 @@ static int CmdLegicEView(const char *Cmd) { return PM3_SUCCESS; } +static int CmdLegicEInfo(const char *Cmd) { + + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf legic einfo", + "It decodes and displays emulator memory", + "hf legic einfo\n" + ); + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); + + size_t card_size = LEGIC_PRIME_MIM256; + + uint8_t *dump = calloc(card_size, sizeof(uint8_t)); + if (dump == NULL) { + PrintAndLogEx(WARNING, "Fail, cannot allocate memory"); + return PM3_EMALLOC; + } + + PrintAndLogEx(INFO, "downloading emulator memory"); + if (GetFromDevice(BIG_BUF_EML, dump, card_size, 0, NULL, 0, NULL, 2500, false) == false) { + PrintAndLogEx(WARNING, "Fail, transfer from device time-out"); + free(dump); + return PM3_ETIMEOUT; + } + + decode_and_print_memory(card_size, dump); + + free(dump); + return PM3_SUCCESS; +} + static int CmdLegicWipe(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf legic wipe", @@ -1290,6 +1371,37 @@ static int CmdLegicView(const char *Cmd) { return PM3_SUCCESS; } +static int CmdLegicDInfo(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf legic view", + "Print a LEGIC Prime dump file (bin/eml/json)", + "hf legic view -f hf-legic-01020304-dump.bin" + ); + void *argtable[] = { + arg_param_begin, + arg_str1("f", "file", "", "Filename of dump"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + int fnlen = 0; + char filename[FILE_PATH_SIZE]; + CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); + CLIParserFree(ctx); + + // read dump file + uint8_t *dump = NULL; + size_t bytes_read = 0; + int res = pm3_load_dump(filename, (void **)&dump, &bytes_read, LEGIC_PRIME_MIM1024); + if (res != PM3_SUCCESS) { + return res; + } + + decode_and_print_memory(bytes_read, dump); + + free(dump); + return PM3_SUCCESS; +} + static command_t CommandTable[] = { {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("operations") " ---------------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, @@ -1306,9 +1418,11 @@ static command_t CommandTable[] = { {"eload", CmdLegicELoad, IfPm3Legicrf, "Load binary dump to emulator memory"}, {"esave", CmdLegicESave, IfPm3Legicrf, "Save emulator memory to binary file"}, {"eview", CmdLegicEView, IfPm3Legicrf, "View emulator memory"}, + {"einfo", CmdLegicEInfo, IfPm3Legicrf, "Display deobfuscated and decoded emulator memory"}, {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("utils") " ---------------------"}, {"crc", CmdLegicCalcCrc, AlwaysAvailable, "Calculate Legic CRC over given bytes"}, {"view", CmdLegicView, AlwaysAvailable, "Display content from tag dump file"}, + {"dinfo", CmdLegicDInfo, AlwaysAvailable, "Display deobfuscated and decoded content from tag dump file"}, {NULL, NULL, NULL, NULL} }; From 4b3e64fbd03c08e53523a1f93c4dd91d3f2e226c Mon Sep 17 00:00:00 2001 From: Fabian Schneebauer Date: Thu, 16 Mar 2023 17:17:44 +0100 Subject: [PATCH 299/924] Add change to changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffcac2de5..178acff1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Add Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) - Added XOR key extraction and flag to Guardall G-Prox II (@GuruSteve) - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) + - Added `hf legic info` command for other sources: `hf legic einfo`, `hf legic dinfo` - ## [Nitride.4.16191][2023-01-29] From fb46e8bae746e8924998fd4d9afd25a3b4553134 Mon Sep 17 00:00:00 2001 From: Fabian Schneebauer Date: Thu, 16 Mar 2023 20:38:13 +0100 Subject: [PATCH 300/924] Merge functionality of view and dinfo. --- CHANGELOG.md | 2 +- client/src/cmdhflegic.c | 32 ++------------------------------ 2 files changed, 3 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 178acff1c..59959b489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Add Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) - Added XOR key extraction and flag to Guardall G-Prox II (@GuruSteve) - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) - - Added `hf legic info` command for other sources: `hf legic einfo`, `hf legic dinfo` + - Added `hf legic info` command for other sources: `hf legic einfo`, `hf legic view` (@0xdeb) - ## [Nitride.4.16191][2023-01-29] diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 5ca53ecd3..02a43e0aa 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -1367,35 +1367,8 @@ static int CmdLegicView(const char *Cmd) { PrintAndLogEx(INFO, "## | 0 1 2 3 4 5 6 7 8 9 A B C D E F | ascii"); PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); print_hex_break(dump, bytes_read, 16); - free(dump); - return PM3_SUCCESS; -} - -static int CmdLegicDInfo(const char *Cmd) { - CLIParserContext *ctx; - CLIParserInit(&ctx, "hf legic view", - "Print a LEGIC Prime dump file (bin/eml/json)", - "hf legic view -f hf-legic-01020304-dump.bin" - ); - void *argtable[] = { - arg_param_begin, - arg_str1("f", "file", "", "Filename of dump"), - arg_param_end - }; - CLIExecWithReturn(ctx, Cmd, argtable, false); - int fnlen = 0; - char filename[FILE_PATH_SIZE]; - CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); - CLIParserFree(ctx); - - // read dump file - uint8_t *dump = NULL; - size_t bytes_read = 0; - int res = pm3_load_dump(filename, (void **)&dump, &bytes_read, LEGIC_PRIME_MIM1024); - if (res != PM3_SUCCESS) { - return res; - } + PrintAndLogEx(NORMAL, ""); decode_and_print_memory(bytes_read, dump); free(dump); @@ -1421,8 +1394,7 @@ static command_t CommandTable[] = { {"einfo", CmdLegicEInfo, IfPm3Legicrf, "Display deobfuscated and decoded emulator memory"}, {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("utils") " ---------------------"}, {"crc", CmdLegicCalcCrc, AlwaysAvailable, "Calculate Legic CRC over given bytes"}, - {"view", CmdLegicView, AlwaysAvailable, "Display content from tag dump file"}, - {"dinfo", CmdLegicDInfo, AlwaysAvailable, "Display deobfuscated and decoded content from tag dump file"}, + {"view", CmdLegicView, AlwaysAvailable, "Display deobfuscated and decoded content from tag dump file"}, {NULL, NULL, NULL, NULL} }; From 69e43b362e0c2c08494a4f8015c9e029f3924386 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 19 Mar 2023 12:47:24 +0100 Subject: [PATCH 301/924] fix asn1 parsing of dates --- client/src/crypto/asn1dump.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index 1b6eede1c..17c38bf55 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -123,12 +123,20 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag if (len > 4) { PrintAndLogEx(NORMAL, " value: '" NOLF); while (true) { + // year - if (longyear == false) - PrintAndLogEx(NORMAL, "20" NOLF); + if (longyear == false) { + int short_year = (tlv->value[0] - '0') * 10 + (tlv->value[1] - '0'); + if (short_year >= 0 && short_year <= 99) { + if (short_year > 50) { + PrintAndLogEx(NORMAL, "19" NOLF); + } else { + PrintAndLogEx(NORMAL, "20" NOLF); + } + } + } PrintAndLogEx(NORMAL, "%.*s-" NOLF, startidx, tlv->value); - if (len < startidx + 2) break; @@ -154,11 +162,11 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag // sec PrintAndLogEx(NORMAL, "%.*s" NOLF, 2, tlv->value + startidx + 8); - if (len < startidx + 11) + if (len < startidx + 12) break; // time zone - PrintAndLogEx(NORMAL, " zone: %.*s" NOLF, len - 10 - (longyear ? 4 : 2), tlv->value + startidx + 10); + PrintAndLogEx(NORMAL, " zone: %.*s" NOLF, len - startidx - 10, tlv->value + startidx + 10); break; } PrintAndLogEx(NORMAL, "'"); From 23926a7a146ce4867f02fa027c12bbda161a1a31 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 19 Mar 2023 12:48:47 +0100 Subject: [PATCH 302/924] fix leading zero call --- client/src/util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/util.c b/client/src/util.c index ea33de446..723f3e758 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -45,7 +45,7 @@ bool g_pendingPrompt = false; #include #endif -#define MAX_BIN_BREAK_LENGTH (3072+384+1) +#define MAX_BIN_BREAK_LENGTH (3072 + 384 + 1) #ifndef _WIN32 #include @@ -1229,7 +1229,7 @@ inline uint64_t bitcount64(uint64_t a) { inline uint32_t leadingzeros32(uint32_t a) { #if defined __GNUC__ - return __builtin_clzl(a); + return __builtin_clz(a); #else PrintAndLogEx(FAILED, "Was not compiled with fct bitcount64"); return 0; From 9399d4e40076ff8b9459f02b301013414ff7b5a2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 19 Mar 2023 12:49:38 +0100 Subject: [PATCH 303/924] fix hex 2 binstring functions --- client/src/util.c | 30 ++++++++++++++++++++---------- client/src/util.h | 4 ++++ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/client/src/util.c b/client/src/util.c index 723f3e758..51408a524 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -911,27 +911,32 @@ https://github.com/ApertureLabsLtd/RFIDler/blob/master/firmware/Pic32/RFIDler.X/ // convert hex to sequence of 0/1 bit values // returns number of bits converted int hextobinarray(char *target, char *source) { - int length, i, count = 0; + return hextobinarray_n(target, source, strlen(source)); +} + +int hextobinarray_n(char *target, char *source, int sourcelen) { + int i, count = 0; char *start = source; - length = strlen(source); // process 4 bits (1 hex digit) at a time - while (length--) { + while (sourcelen--) { char x = *(source++); // capitalize - if (x >= 'a' && x <= 'f') + if (x >= 'a' && x <= 'f') { x -= 32; + } // convert to numeric value - if (x >= '0' && x <= '9') + if (x >= '0' && x <= '9') { x -= '0'; - else if (x >= 'A' && x <= 'F') + } else if (x >= 'A' && x <= 'F') { x -= 'A' - 10; - else { + } else { PrintAndLogEx(INFO, "(hextobinarray) discovered unknown character %c %d at idx %d of %s", x, x, (int16_t)(source - start), start); return 0; } // output - for (i = 0 ; i < 4 ; ++i, ++count) + for (i = 0 ; i < 4 ; ++i, ++count) { *(target++) = (x >> (3 - i)) & 1; + } } return count; @@ -939,9 +944,14 @@ int hextobinarray(char *target, char *source) { // convert hex to human readable binary string int hextobinstring(char *target, char *source) { - int length = hextobinarray(target, source); - if (length == 0) + return hextobinstring_n(target, source, strlen(source)); +} + +int hextobinstring_n(char *target, char *source, int sourcelen) { + int length = hextobinarray_n(target, source, sourcelen); + if (length == 0) { return 0; + } binarraytobinstring(target, target, length); return length; } diff --git a/client/src/util.h b/client/src/util.h index c29fbd50f..4dab9ae06 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -112,7 +112,11 @@ int param_getbin_to_eol(const char *line, int paramnum, uint8_t *data, int maxda int param_getstr(const char *line, int paramnum, char *str, size_t buffersize); int hextobinarray(char *target, char *source); +int hextobinarray_n(char *target, char *source, int sourcelen); + int hextobinstring(char *target, char *source); +int hextobinstring_n(char *target, char *source, int sourcelen); + int binarraytohex(char *target, const size_t targetlen, const char *source, size_t srclen); void binarraytobinstring(char *target, char *source, int length); int binstring2binarray(uint8_t *target, char *source, int length); From 390720144a393d864b5fa1d176ae8ad3510a96bf Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 20 Mar 2023 20:28:57 +0100 Subject: [PATCH 304/924] added another gen3 test to detect gdm --- armsrc/mifarecmd.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 74e75ddce..e198d37c7 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2356,6 +2356,7 @@ void MifareCIdent(bool is_mfc) { uint8_t rats[4] = { ISO14443A_CMD_RATS, 0x80, 0x31, 0x73 }; uint8_t rdblf0[4] = { ISO14443A_CMD_READBLOCK, 0xF0, 0x8D, 0x5f}; uint8_t rdbl00[4] = { ISO14443A_CMD_READBLOCK, 0x00, 0x02, 0xa8}; + uint8_t gen3gmd[4] = { MIFARE_MAGIC_GDM_AUTH_KEYA, 0x00, 0x6C, 0x92}; uint8_t gen4GetConf[8] = { GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); uint8_t *buf = BigBuf_malloc(PM3_CMD_DATA_SIZE); @@ -2479,7 +2480,7 @@ void MifareCIdent(bool is_mfc) { } } } else { - // magic MFC Gen3 test + // magic MFC Gen3 test 1 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); SpinDelay(40); iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); @@ -2491,6 +2492,21 @@ void MifareCIdent(bool is_mfc) { isGen = MAGIC_GEN_3; } } + + // magic MFC Gen3 test 2 + if (isGen != MAGIC_GEN_3) { + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + SpinDelay(40); + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); + res = iso14443a_select_card(uid, NULL, &cuid, true, 0, true); + if (res == 2) { + ReaderTransmit(gen3gmd, sizeof(gen3gmd), NULL); + res = ReaderReceive(buf, par); + if (res == 4) { + isGen = MAGIC_GEN_3; + } + } + } } }; From 07f61627801576a17dcc6af835e3d6691739fa5a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Mar 2023 19:49:52 +0100 Subject: [PATCH 305/924] added support for the magic card called GDM. --- CHANGELOG.md | 2 + armsrc/appmain.c | 16 ++++++- armsrc/mifarecmd.c | 75 ++++++++++++++++++++++++++++-- armsrc/mifarecmd.h | 5 ++ armsrc/mifareutil.c | 22 +++++++-- armsrc/mifareutil.h | 2 + client/src/cmdhfmf.c | 84 ++++++++++++++++++++++++++++++++++ client/src/mifare/mifarehost.c | 4 ++ include/pm3_cmd.h | 4 ++ include/protocols.h | 2 + 10 files changed, 205 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59959b489..1cceee09b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `hf mf gdmsetblk` - Support Gen4 GDM write block (@iceman1001) + - Changed `hf 14a info` - detect Gen GDM magic tags (@iceman1001) - Changed CLI max string argument length limit from 512 to 4096 (@iceman1001) - Fixed `data asn1` - now handles bad input better (@iceman1001) - Added new public key for signature MIFARE Plus Troika (@iceman100) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 66d1380b5..d435f9967 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1686,7 +1686,7 @@ static void PacketReceived(PacketCommandNG *packet) { MifareECardLoadExt(payload->sectorcnt, payload->keytype); break; } - // Work with "magic Chinese" card + // Gen1a / 1b - "magic Chinese" card case CMD_HF_MIFARE_CSETBL: { MifareCSetBlock(packet->oldarg[0], packet->oldarg[1], packet->data.asBytes); break; @@ -1713,6 +1713,7 @@ static void PacketReceived(PacketCommandNG *packet) { MifareGen3Freez(); break; } + // Gen 4 GTU magic cards case CMD_HF_MIFARE_G4_RDBL: { struct p { uint8_t blockno; @@ -1723,7 +1724,6 @@ static void PacketReceived(PacketCommandNG *packet) { MifareG4ReadBlk(payload->blockno, payload->pwd, payload->workFlags); break; } - // Gen 4 GTU magic cards case CMD_HF_MIFARE_G4_WRBL: { struct p { uint8_t blockno; @@ -1735,6 +1735,18 @@ static void PacketReceived(PacketCommandNG *packet) { MifareG4WriteBlk(payload->blockno, payload->pwd, payload->data, payload->workFlags); break; } + + case CMD_HF_MIFARE_G4_GDM_WRBL: { + struct p { + uint8_t blockno; + uint8_t keytype; + uint8_t key[6]; + uint8_t data[16]; // data to be written + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + MifareWriteBlockGDM(payload->blockno, payload->keytype, payload->key, payload->data); + break; + } case CMD_HF_MIFARE_PERSONALIZE_UID: { struct p { uint8_t keytype; diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index e198d37c7..448cadc8f 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -446,6 +446,73 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { set_tracing(false); } +void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t *datain) { + + int retval = PM3_SUCCESS; + + // check args + if (datain == NULL) { + retval = PM3_EINVARG; + goto OUT; + } + + uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); + if (par == NULL) { + retval = PM3_EMALLOC; + goto OUT; + } + + uint8_t *uid = BigBuf_malloc(10); + if (uid == NULL) { + retval = PM3_EMALLOC; + goto OUT; + } + + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); + clear_trace(); + set_tracing(true); + + // variables + uint32_t cuid = 0; + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs; + pcs = &mpcs; + + uint64_t ui64key = bytes_to_num(key, 6); + + if (iso14443a_select_card(uid, NULL, &cuid, true, 0, true) == false) { + retval = PM3_ESOFT; + goto OUT; + } + + if (mifare_classic_authex_2(pcs, cuid, blockno, keytype, ui64key, AUTH_FIRST, NULL, NULL, true)) { + retval = PM3_ESOFT; + goto OUT; + }; + + if (mifare_classic_writeblock_ex(pcs, cuid, blockno, datain, true)) { + retval = PM3_ESOFT; + goto OUT; + }; + + if (mifare_classic_halt(pcs, cuid)) { + retval = PM3_ESOFT; + goto OUT; + }; + + if (g_dbglevel >= 2) DbpString("WRITE BLOCK FINISHED"); + +OUT: + crypto1_deinit(pcs); + + reply_ng(CMD_HF_MIFARE_G4_GDM_WRBL, retval, NULL, 0); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); + set_tracing(false); + BigBuf_free(); +} + + void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t *datain) { // params uint8_t blockNo = arg0; @@ -2356,7 +2423,7 @@ void MifareCIdent(bool is_mfc) { uint8_t rats[4] = { ISO14443A_CMD_RATS, 0x80, 0x31, 0x73 }; uint8_t rdblf0[4] = { ISO14443A_CMD_READBLOCK, 0xF0, 0x8D, 0x5f}; uint8_t rdbl00[4] = { ISO14443A_CMD_READBLOCK, 0x00, 0x02, 0xa8}; - uint8_t gen3gmd[4] = { MIFARE_MAGIC_GDM_AUTH_KEYA, 0x00, 0x6C, 0x92}; + uint8_t gen4gmd[4] = { MIFARE_MAGIC_GDM_AUTH_KEYA, 0x00, 0x6C, 0x92}; uint8_t gen4GetConf[8] = { GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); uint8_t *buf = BigBuf_malloc(PM3_CMD_DATA_SIZE); @@ -2493,17 +2560,17 @@ void MifareCIdent(bool is_mfc) { } } - // magic MFC Gen3 test 2 + // magic MFC Gen4 GDM test if (isGen != MAGIC_GEN_3) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); SpinDelay(40); iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); res = iso14443a_select_card(uid, NULL, &cuid, true, 0, true); if (res == 2) { - ReaderTransmit(gen3gmd, sizeof(gen3gmd), NULL); + ReaderTransmit(gen4gmd, sizeof(gen4gmd), NULL); res = ReaderReceive(buf, par); if (res == 4) { - isGen = MAGIC_GEN_3; + isGen = MAGIC_GEN_4GDM; } } } diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index 30179aa3b..f471ccecc 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -46,16 +46,21 @@ void MifareEMemGet(uint8_t blockno, uint8_t blockcnt); int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype); int MifareECardLoadExt(uint8_t sectorcnt, uint8_t keytype); +// MFC GEN1a /1b void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain); // Work with "magic Chinese" card void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain); void MifareCIdent(bool is_mfc); // is "magic chinese" card? void MifareHasStaticNonce(void); // Has the tag a static nonce? +// MFC GEN3 int DoGen3Cmd(uint8_t *cmd, uint8_t cmd_len); void MifareGen3UID(uint8_t uidlen, uint8_t *uid); // Gen 3 magic card set UID without manufacturer block void MifareGen3Blk(uint8_t block_len, uint8_t *block); // Gen 3 magic card overwrite manufacturer block void MifareGen3Freez(void); // Gen 3 magic card lock further UID changes +// MFC GEN4 GDM +void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t *datain); + // MFC GEN4 GTU void MifareG4ReadBlk(uint8_t blockno, uint8_t *pwd, uint8_t workFlags); void MifareG4WriteBlk(uint8_t blockno, uint8_t *pwd, uint8_t *data, uint8_t workFlags); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 5c0905e68..c349860dd 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -137,8 +137,10 @@ uint16_t mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested) { return mifare_classic_authex(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL, NULL); } - int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing) { + return mifare_classic_authex_2(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL, NULL, false); +} +int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing, bool is_gdm) { int len; uint32_t pos, nt, ntpp; // Supplied tag nonce uint8_t par[1] = {0x00}; @@ -150,8 +152,9 @@ int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockN // "random" reader nonce: num_to_bytes(prng_successor(GetTickCount(), 32), 4, nr); - // Transmit MIFARE_CLASSIC_AUTH - len = mifare_sendcmd_short(pcs, isNested, 0x60 + (keyType & 0x01), blockNo, receivedAnswer, receivedAnswerPar, timing); + // Transmit MIFARE_CLASSIC_AUTH 0x60, 0x61 or GDM 0x80 + uint8_t cmdbyte = (is_gdm) ? MIFARE_MAGIC_GDM_AUTH_KEYA : MIFARE_AUTH_KEYA + (keyType & 0x01); + len = mifare_sendcmd_short(pcs, isNested, cmdbyte, blockNo, receivedAnswer, receivedAnswerPar, timing); if (len != 4) return 1; // Save the tag nonce (nt) @@ -411,6 +414,10 @@ int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData) { } int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData) { + return mifare_classic_writeblock_ex(pcs, uid, blockNo, blockData, false); +} + +int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm) { // variables uint16_t len = 0; uint32_t pos = 0; @@ -421,8 +428,12 @@ int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t bl uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; - // command MIFARE_CLASSIC_WRITEBLOCK - len = mifare_sendcmd_short(pcs, 1, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); + // command MIFARE_MAGIC_GDM_WRITEBLOCK + if (is_gdm) { + len = mifare_sendcmd_short(pcs, 1, MIFARE_MAGIC_GDM_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); + } else { + len = mifare_sendcmd_short(pcs, 1, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); + } if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); @@ -456,6 +467,7 @@ int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t bl return 0; } + int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t action) { // variables uint16_t len = 0; diff --git a/armsrc/mifareutil.h b/armsrc/mifareutil.h index aa5ef7e59..c7c6b4a94 100644 --- a/armsrc/mifareutil.h +++ b/armsrc/mifareutil.h @@ -72,10 +72,12 @@ uint16_t mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t // mifare classic int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested); int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing); +int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing, bool is_gdm); int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData); int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid); int mifare_classic_halt_ex(struct Crypto1State *pcs); int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData); +int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm); int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t action); // Ultralight/NTAG... diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index d5a629e90..900f201d2 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -7560,6 +7560,88 @@ static int CmdHF14AGen4Save(const char *Cmd) { return PM3_SUCCESS; } +static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { + + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mf gdmsetblk", + "Set block data on a magic gen4 GDM card", + "hf mf gdmsetblk --blk 1 -d 000102030405060708090a0b0c0d0e0f" + ); + void *argtable[] = { + arg_param_begin, + arg_int1(NULL, "blk", "", "block number"), + arg_lit0("a", NULL, "input key type is key A (def)"), + arg_lit0("b", NULL, "input key type is key B"), + arg_str0("k", "key", "", "key, 6 hex bytes"), + arg_str0("d", "data", "", "bytes to write, 16 hex bytes"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + int b = arg_get_int_def(ctx, 1, 1); + + uint8_t keytype = MF_KEY_A; + if (arg_get_lit(ctx, 2) && arg_get_lit(ctx, 3)) { + CLIParserFree(ctx); + PrintAndLogEx(WARNING, "Input key type must be A or B"); + return PM3_EINVARG; + } else if (arg_get_lit(ctx, 3)) { + keytype = MF_KEY_B;; + } + + int keylen = 0; + uint8_t key[6] = {0}; + CLIGetHexWithReturn(ctx, 4, key, &keylen); + + uint8_t block[MFBLOCK_SIZE] = {0x00}; + int blen = 0; + CLIGetHexWithReturn(ctx, 5, block, &blen); + CLIParserFree(ctx); + + if (blen != MFBLOCK_SIZE) { + PrintAndLogEx(WARNING, "expected 16 HEX bytes. got %i", blen); + return PM3_EINVARG; + } + + if (b < 0 || b >= MIFARE_4K_MAXBLOCK) { + PrintAndLogEx(FAILED, "target block number out-of-range, got %i", b); + return PM3_EINVARG; + } + + uint8_t blockno = (uint8_t)b; + + PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); + PrintAndLogEx(INFO, "data: %s", sprint_hex(block, sizeof(block))); + + struct p { + uint8_t blockno; + uint8_t keytype; + uint8_t key[6]; + uint8_t data[MFBLOCK_SIZE]; // data to be written + } PACKED payload; + + payload.blockno = blockno; + payload.keytype = keytype; + memcpy(payload.key, key, sizeof(payload.key)); + memcpy(payload.data, block, sizeof(payload.data)); + + clearCommandBuffer(); + SendCommandNG(CMD_HF_MIFARE_G4_GDM_WRBL, (uint8_t *)&payload, sizeof(payload)); + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_HF_MIFARE_G4_GDM_WRBL, &resp, 1500) == false) { + PrintAndLogEx(WARNING, "command execute timeout"); + return PM3_ETIMEOUT; + } + + if (resp.status == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); + PrintAndLogEx(HINT, "try `" _YELLOW_("hf mf rdbl") "` to verify"); + } else { + PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); + PrintAndLogEx(HINT, "Maybe access rights? Try specify keytype `" _YELLOW_("hf mf gdmsetblk -%c ...") "` instead", (keytype == MF_KEY_A) ? 'b' : 'a'); + } + return PM3_SUCCESS; +} static int CmdHF14AMfValue(const char *Cmd) { @@ -7825,6 +7907,8 @@ static command_t CommandTable[] = { {"gsave", CmdHF14AGen4Save, IfPm3Iso14443a, "Save dump from card into file or emulator"}, {"gsetblk", CmdHF14AGen4SetBlk, IfPm3Iso14443a, "Write block to card"}, {"gview", CmdHF14AGen4View, IfPm3Iso14443a, "View card"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "-------------------- " _CYAN_("magic gen4 GDM") " --------------------------"}, + {"gdmsetblk", CmdHF14AGen4_GDM_SetBlk, IfPm3Iso14443a, "Write block to card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("ndef") " -----------------------"}, // {"ice", CmdHF14AMfice, IfPm3Iso14443a, "collect MIFARE Classic nonces to file"}, {"ndefformat", CmdHFMFNDEFFormat, IfPm3Iso14443a, "Format MIFARE Classic Tag as NFC Tag"}, diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index fe2cd1897..a897a507e 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1214,6 +1214,7 @@ int mfG4SetBlock(uint8_t *pwd, uint8_t blockno, uint8_t *data, uint8_t workFlags return PM3_SUCCESS; } + // variables uint32_t cuid = 0; // uid part used for crypto1. @@ -1414,6 +1415,9 @@ int detect_mf_magic(bool is_mfc) { case MAGIC_GEN_4GTU: PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("Gen 4 GTU")); break; + case MAGIC_GEN_4GDM: + PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("Gen 4 GDM")); + break; case MAGIC_GEN_UNFUSED: PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("Write Once / FUID")); break; diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 40a263442..f490cc419 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -686,6 +686,10 @@ typedef struct { #define CMD_HF_MIFARE_G4_RDBL 0x0860 #define CMD_HF_MIFARE_G4_WRBL 0x0861 +// Gen 4 GDM magic cards +#define CMD_HF_MIFARE_G4_GDM_RDBL 0x0870 +#define CMD_HF_MIFARE_G4_GDM_WRBL 0x0871 + #define CMD_UNKNOWN 0xFFFF //Mifare simulation flags diff --git a/include/protocols.h b/include/protocols.h index 0cc89abb7..333dcdb71 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -192,6 +192,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MIFARE_MAGIC_GDM_AUTH_KEYA 0x80 #define MIFARE_MAGIC_GDM_AUTH_KEYB 0x81 +#define MIFARE_MAGIC_GDM_WRITEBLOCK 0xA8 #define MIFARE_EV1_PERSONAL_UID 0x40 #define MIFARE_EV1_SETMODE 0x43 @@ -259,6 +260,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MAGIC_NTAG21X 7 #define MAGIC_GEN_3 8 #define MAGIC_GEN_4GTU 9 +#define MAGIC_GEN_4GDM 10 // Commands for configuration of Gen4 GTU cards. // see https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/magic_cards_notes.md From e1d90b3de205ba91b00a7e4e316a24855011a973 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Mar 2023 19:58:31 +0100 Subject: [PATCH 306/924] annotate the GDM magic write --- client/src/cmdhflist.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index fc3f94d7a..d4778b8be 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -330,6 +330,10 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "MAGIC AUTH-B(%d)", cmd[1]); break; } + case MIFARE_MAGIC_GDM_WRITEBLOCK: { + snprintf(exp, size, "MAGIC WRITEBLOCK(%d)", cmd[1]); + break; + } case MIFARE_MAGICWUPC1: snprintf(exp, size, "MAGIC WUPC1"); break; From 97dced62f4db438bd3762b31b57032581fe7163a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Mar 2023 20:55:06 +0100 Subject: [PATCH 307/924] fix CID# 405674 - array uninitialized --- armsrc/mifarecmd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 448cadc8f..aaf1d795a 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1905,6 +1905,8 @@ void MifareChkKeys(uint8_t *datain, uint8_t reserved_mem) { bool found; } PACKED keyresult; keyresult.found = false; + memset(keyresult.key, 0x00, sizeof(keyresult.key)); + bool have_uid = false; uint8_t keyType = datain[0]; From aa05e2eeaec0133dd16724fc63bc4b9d25885687 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 21 Mar 2023 20:55:57 +0100 Subject: [PATCH 308/924] textual and cleanup --- client/src/crypto/asn1dump.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index 17c38bf55..8445b4cd4 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -166,7 +166,7 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag break; // time zone - PrintAndLogEx(NORMAL, " zone: %.*s" NOLF, len - startidx - 10, tlv->value + startidx + 10); + PrintAndLogEx(NORMAL, " zone: UTC %.*s" NOLF, len - startidx - 10, tlv->value + startidx + 10); break; } PrintAndLogEx(NORMAL, "'"); @@ -177,7 +177,7 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag } static void asn1_tag_dump_string(const struct tlv *tlv, const struct asn1_tag *tag, int level) { - PrintAndLogEx(NORMAL, " value: '" _GREEN_("%.*s") "' hex: '%s'", tlv->len, tlv->value, sprint_hex(tlv->value, tlv->len)); + PrintAndLogEx(NORMAL, " value: '" _GREEN_("%.*s") "' hex: '%s'", (int)tlv->len, tlv->value, sprint_hex(tlv->value, tlv->len)); } static void asn1_tag_dump_bitstring(const struct tlv *tlv, const struct asn1_tag *tag, int level) { @@ -232,20 +232,17 @@ static void asn1_tag_dump_hex(const struct tlv *tlv, const struct asn1_tag *tag, PrintAndLogEx(NORMAL, " value: '%s'", sprint_hex_inrow(tlv->value, tlv->len)); } -static void asn1_tag_dump_octet_string(const struct tlv *tlv, const struct asn1_tag *tag, int level, bool *needdump) { - *needdump = false; - for (size_t i = 0; i < tlv->len; i++) +static void asn1_tag_dump_octet_string(const struct tlv *tlv, const struct asn1_tag *tag, int level) { +/* + for (size_t i = 0; i < tlv->len; i++) { if (!isspace(tlv->value[i]) && !isprint(tlv->value[i])) { *needdump = true; break; } - - if (*needdump) { - PrintAndLogEx(NORMAL, ""); - } else { + } + */ PrintAndLogEx(NORMAL, " " NOLF); asn1_tag_dump_string(tlv, tag, level); - } } static void asn1_tag_dump_boolean(const struct tlv *tlv, const struct asn1_tag *tag, int level) { @@ -399,7 +396,8 @@ bool asn1_tag_dump(const struct tlv *tlv, int level, bool *candump) { *candump = false; break; case ASN1_TAG_OCTET_STRING: - asn1_tag_dump_octet_string(tlv, tag, level, candump); + asn1_tag_dump_octet_string(tlv, tag, level); + *candump = false; break; case ASN1_TAG_BOOLEAN: asn1_tag_dump_boolean(tlv, tag, level); From 693b6487fbf7afd03adfcba6e1ef3692ec4cb5af Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 23 Mar 2023 08:10:02 +0100 Subject: [PATCH 309/924] changed 14a / mifare annotations to more easily see block numbers involved --- client/src/cmdhflist.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index d4778b8be..263a4baa1 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -176,7 +176,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i if (is_response == false) { if ((gs_ntag_i2c_state == 1) && (cmdsize == 6) && (memcmp(cmd + 1, "\x00\x00\x00", 3) == 0)) { - snprintf(exp, size, "SECTOR(%d)", cmd[0]); + snprintf(exp, size, "SECTOR(" _MAGENTA_("%d") ")", cmd[0]); gs_ntag_i2c_state = 0; return PM3_SUCCESS; } @@ -260,10 +260,10 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "REQA"); break; case ISO14443A_CMD_READBLOCK: - snprintf(exp, size, "READBLOCK(%d)", cmd[1]); + snprintf(exp, size, "READBLOCK(" _MAGENTA_("%d") ")", cmd[1]); break; case ISO14443A_CMD_WRITEBLOCK: - snprintf(exp, size, "WRITEBLOCK(%d)", cmd[1]); + snprintf(exp, size, "WRITEBLOCK(" _MAGENTA_("%d") ")", cmd[1]); break; case ISO14443A_CMD_HALT: snprintf(exp, size, "HALT"); @@ -279,10 +279,10 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "OPTIONAL TIMESLOT"); break; case MIFARE_CMD_INC: - snprintf(exp, size, "INC(%d)", cmd[1]); + snprintf(exp, size, "INC(" _MAGENTA_("%d") ")", cmd[1]); break; case MIFARE_CMD_DEC: - snprintf(exp, size, "DEC(%d)", cmd[1]); + snprintf(exp, size, "DEC(" _MAGENTA_("%d") ")", cmd[1]); break; case MIFARE_CMD_RESTORE: @@ -293,7 +293,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "SELECT SECTOR"); gs_ntag_i2c_state = 1; } else { - snprintf(exp, size, "RESTORE(%d)", cmd[1]); + snprintf(exp, size, "RESTORE(" _MAGENTA_("%d") ")", cmd[1]); } } else { return PM3_ESOFT; @@ -301,11 +301,11 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i break; case MIFARE_CMD_TRANSFER: - snprintf(exp, size, "TRANSFER(%d)", cmd[1]); + snprintf(exp, size, "TRANSFER(" _MAGENTA_("%d") ")", cmd[1]); break; case MIFARE_AUTH_KEYA: { if (cmdsize > 3) { - snprintf(exp, size, "AUTH-A(%d)", cmd[1]); + snprintf(exp, size, "AUTH-A(" _MAGENTA_("%d") ")", cmd[1]); MifareAuthState = masNt; } else { // case MIFARE_ULEV1_VERSION : both 0x60. @@ -315,23 +315,23 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i } case MIFARE_AUTH_KEYB: { MifareAuthState = masNt; - snprintf(exp, size, "AUTH-B(%d)", cmd[1]); + snprintf(exp, size, "AUTH-B(" _MAGENTA_("%d") ")", cmd[1]); break; } case MIFARE_MAGIC_GDM_AUTH_KEYA: { if (cmdsize > 3) { - snprintf(exp, size, "MAGIC AUTH-A(%d)", cmd[1]); + snprintf(exp, size, "MAGIC AUTH-A(" _MAGENTA_("%d") ")", cmd[1]); MifareAuthState = masNt; } break; } case MIFARE_MAGIC_GDM_AUTH_KEYB: { MifareAuthState = masNt; - snprintf(exp, size, "MAGIC AUTH-B(%d)", cmd[1]); + snprintf(exp, size, "MAGIC AUTH-B(" _MAGENTA_("%d") ")", cmd[1]); break; } case MIFARE_MAGIC_GDM_WRITEBLOCK: { - snprintf(exp, size, "MAGIC WRITEBLOCK(%d)", cmd[1]); + snprintf(exp, size, "MAGIC WRITEBLOCK(" _MAGENTA_("%d") ")", cmd[1]); break; } case MIFARE_MAGICWUPC1: @@ -371,30 +371,30 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i break; case MIFARE_ULEV1_FASTREAD : { if (cmdsize >= 3 && cmd[2] <= 0xE6) - snprintf(exp, size, "READ RANGE (%d-%d)", cmd[1], cmd[2]); + snprintf(exp, size, "READ RANGE (" _MAGENTA_("%d-%d") ")", cmd[1], cmd[2]); else // outside limits, useful for some tags... - snprintf(exp, size, "READ RANGE (%d-%d) (?)", cmd[1], cmd[2]); + snprintf(exp, size, "READ RANGE (" _MAGENTA_("%d-%d") ") (?)", cmd[1], cmd[2]); break; } case MIFARE_ULC_WRITE : { if (cmd[1] < 0x21) - snprintf(exp, size, "WRITEBLOCK(%d)", cmd[1]); + snprintf(exp, size, "WRITEBLOCK(" _MAGENTA_("%d") ")", cmd[1]); else // outside limits, useful for some tags... - snprintf(exp, size, "WRITEBLOCK(%d) (?)", cmd[1]); + snprintf(exp, size, "WRITEBLOCK(" _MAGENTA_("%d") ") (?)", cmd[1]); break; } case MIFARE_ULEV1_READ_CNT : { if (cmd[1] < 5) - snprintf(exp, size, "READ CNT(%d)", cmd[1]); + snprintf(exp, size, "READ CNT(" _MAGENTA_("%d") ")", cmd[1]); else snprintf(exp, size, "?"); break; } case MIFARE_ULEV1_INCR_CNT : { if (cmd[1] < 5) - snprintf(exp, size, "INCR(%d)", cmd[1]); + snprintf(exp, size, "INCR(" _MAGENTA_("%d") ")", cmd[1]); else snprintf(exp, size, "?"); break; @@ -403,7 +403,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "READ SIG"); break; case MIFARE_ULEV1_CHECKTEAR: - snprintf(exp, size, "CHK TEARING(%d)", cmd[1]); + snprintf(exp, size, "CHK TEARING(" _MAGENTA_("%d") ")", cmd[1]); break; case MIFARE_ULEV1_VCSL: snprintf(exp, size, "VCSL"); @@ -422,7 +422,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i } case NTAG_I2C_FASTWRITE: if (cmdsize == 69) - snprintf(exp, size, "FAST WRITE (%d - %d)", cmd[1], cmd[2]); + snprintf(exp, size, "FAST WRITE (" _MAGENTA_("%d-%d") ")", cmd[1], cmd[2]); else snprintf(exp, size, "?"); From 368bf576616ea0d5b686cef748a8903f39aaecd5 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Fri, 24 Mar 2023 18:44:28 +0800 Subject: [PATCH 310/924] Fix the example of msleep --- client/src/cmdmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdmain.c b/client/src/cmdmain.c index 11f9bfd7b..a9c2cb474 100644 --- a/client/src/cmdmain.c +++ b/client/src/cmdmain.c @@ -250,7 +250,7 @@ static int CmdMsleep(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "msleep", "Sleep for given amount of milliseconds", - "msleep 100" + "msleep -t 100" ); void *argtable[] = { From 2661a2a034a7c5f3a3e18991151c5c6174922928 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sat, 25 Mar 2023 02:00:08 +0300 Subject: [PATCH 311/924] Supercard UID changing from backdoor command --- CHANGELOG.md | 1 + client/src/cmdhfmf.c | 46 ++++++++++++++++++++++++++++++++++++-------- doc/commands.json | 5 +++-- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cceee09b..cc2be3390 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mf supercard` - Support editing UID (@AloneLiberty) - Added `hf mf gdmsetblk` - Support Gen4 GDM write block (@iceman1001) - Changed `hf 14a info` - detect Gen GDM magic tags (@iceman1001) - Changed CLI max string argument length limit from 512 to 4096 (@iceman1001) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 900f201d2..e3ba0c1df 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6572,29 +6572,62 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf supercard", "Extract info from a `super card`", - "hf mf supercard"); + "hf mf supercard -> recover key\n" + "hf mf supercard -r -> reset card\n" + "hf mf supercard -u 11223344 -> change UID\n"); void *argtable[] = { arg_param_begin, - arg_lit0("r", "reset", "reset card"), + arg_lit0("r", "reset", "reset card"), + arg_str0("u", "uid", "", "New UID (4 hex bytes)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); bool reset_card = arg_get_lit(ctx, 1); + uint8_t uid[4]; + int uidlen = 0; + CLIParamHexToBuf(arg_get_str(ctx, 2), uid, sizeof(uid), &uidlen); CLIParserFree(ctx); + if (uidlen && uidlen != 4) { + PrintAndLogEx(ERR, "UID must include 8 HEX symbols"); + return PM3_EINVARG; + } + bool activate_field = true; bool keep_field_on = true; int res = 0; - if (reset_card) { + // Commands: + // a0 - set UID + // b0 - read traces + // c0 - clear card + if (uidlen) { + keep_field_on = false; + uint8_t response[6]; + int resplen = 0; + // --------------- CHANGE UID ---------------- + uint8_t aCHANGE[] = {0x00, 0xa6, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00}; + memcpy(aCHANGE + 5, uid, uidlen); + res = ExchangeAPDU14a(aCHANGE, sizeof(aCHANGE), activate_field, keep_field_on, response, sizeof(response), &resplen); + if (res != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Super card UID change [ " _RED_("fail") " ]"); + DropField(); + return res; + } + + PrintAndLogEx(SUCCESS, "Super card UID change ( " _GREEN_("ok") " )"); + return PM3_SUCCESS; + } + + if (reset_card) { keep_field_on = false; uint8_t response[6]; int resplen = 0; // --------------- RESET CARD ---------------- - uint8_t aRESET[] = { 0x00, 0xa6, 0xc0, 0x00 }; + uint8_t aRESET[] = { 0x00, 0xa6, 0xc0, 0x00 }; res = ExchangeAPDU14a(aRESET, sizeof(aRESET), activate_field, keep_field_on, response, sizeof(response), &resplen); if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Super card reset [ " _RED_("fail") " ]"); @@ -6630,9 +6663,6 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { return res; } -// uint8_t inA[] = { 0x72, 0xD7, 0xF4, 0x3E, 0xFD, 0xAB, 0xF2, 0x35, 0xFD, 0x49, 0xEE, 0xDC, 0x44, 0x95, 0x43, 0xC4}; -// uint8_t inB[] = { 0xF0, 0xA2, 0x67, 0x6A, 0x04, 0x6A, 0x72, 0x12, 0x76, 0xA4, 0x1D, 0x02, 0x1F, 0xEA, 0x20, 0x85}; - uint8_t outA[16] = {0}; uint8_t outB[16] = {0}; @@ -6670,7 +6700,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { // second NT0 = (outB[6] << 8) | outB[7]; - data.nonce2 = prng_successor(NT0, 31);; + data.nonce2 = prng_successor(NT0, 31); data.nr2 = bytes_to_num(outB + 8, 4); data.ar2 = bytes_to_num(outB + 12, 4); data.sector = mfSectorNum(outA[5]); diff --git a/doc/commands.json b/doc/commands.json index 3b1ac6aca..636fdf50a 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -4827,9 +4827,10 @@ "offline": false, "options": [ "-h, --help This help", - "-r, --reset reset card" + "-r, --reset Reset card", + "-u, --uid Change UID" ], - "usage": "hf mf supercard [-hr]" + "usage": "hf mf supercard [-hru]" }, "hf mf value": { "command": "hf mf value", From b903d0bbe227dc497c938ce28f837f6a70fe3164 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sat, 25 Mar 2023 02:15:07 +0300 Subject: [PATCH 312/924] Supercard keys recovery from second generation card --- CHANGELOG.md | 2 +- client/src/cmdhfmf.c | 326 +++++++++++++++++++++++++++---------------- 2 files changed, 206 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc2be3390..3dd2f9b3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Changed `hf mf supercard` - Support editing UID (@AloneLiberty) + - Changed `hf mf supercard` - Support editing UID and recovery of keys from second generation card (@AloneLiberty) - Added `hf mf gdmsetblk` - Support Gen4 GDM write block (@iceman1001) - Changed `hf 14a info` - detect Gen GDM magic tags (@iceman1001) - Changed CLI max string argument length limit from 512 to 4096 (@iceman1001) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index e3ba0c1df..0abc1eb1f 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6568,7 +6568,6 @@ static int CmdHf14AGen3Freeze(const char *Cmd) { } static int CmdHf14AMfSuperCard(const char *Cmd) { - CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf supercard", "Extract info from a `super card`", @@ -6594,139 +6593,224 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { return PM3_EINVARG; } - bool activate_field = true; - bool keep_field_on = true; - int res = 0; + uint32_t trace = 0; + uint8_t traces[7][16]; + for (trace = 0; trace < 7; trace++) { + uint8_t data[] = {0x30, 0x00 + trace}; + uint32_t flags = ISO14A_CONNECT | ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_RATS; - // Commands: - // a0 - set UID - // b0 - read traces - // c0 - clear card - if (uidlen) { - keep_field_on = false; - uint8_t response[6]; - int resplen = 0; + clearCommandBuffer(); + SendCommandOLD(CMD_HF_ISO14443A_READER, flags, sizeof(data), 0, data, sizeof(data)); - // --------------- CHANGE UID ---------------- - uint8_t aCHANGE[] = {0x00, 0xa6, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00}; - memcpy(aCHANGE + 5, uid, uidlen); - res = ExchangeAPDU14a(aCHANGE, sizeof(aCHANGE), activate_field, keep_field_on, response, sizeof(response), &resplen); - if (res != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Super card UID change [ " _RED_("fail") " ]"); - DropField(); - return res; + if (!WaitForResponseTimeout(CMD_ACK, NULL, 1500)) { + break; // Select card } - PrintAndLogEx(SUCCESS, "Super card UID change ( " _GREEN_("ok") " )"); - return PM3_SUCCESS; - } - - if (reset_card) { - keep_field_on = false; - uint8_t response[6]; - int resplen = 0; - - // --------------- RESET CARD ---------------- - uint8_t aRESET[] = { 0x00, 0xa6, 0xc0, 0x00 }; - res = ExchangeAPDU14a(aRESET, sizeof(aRESET), activate_field, keep_field_on, response, sizeof(response), &resplen); - if (res != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Super card reset [ " _RED_("fail") " ]"); - DropField(); - return res; + PacketResponseNG resp; + if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { + break; // Data not received } - PrintAndLogEx(SUCCESS, "Super card reset ( " _GREEN_("ok") " )"); - return PM3_SUCCESS; + + uint16_t len = resp.oldarg[0] & 0xFFFF; + if (len != 18) { + break; // Not trace data + } + + memcpy(&traces[trace], resp.data.asBytes, len - 2); } + if (trace == 7) { + if (uidlen || reset_card) { + PrintAndLogEx(FAILED, "Not supported on this card"); + return PM3_SUCCESS; + } - uint8_t responseA[22]; - uint8_t responseB[22]; - int respAlen = 0; - int respBlen = 0; + for (trace = 0; trace < 7; trace++) { + uint8_t *trace_data = traces[trace]; + nonces_t data; - // --------------- First ---------------- - uint8_t aFIRST[] = { 0x00, 0xa6, 0xb0, 0x00, 0x10 }; - res = ExchangeAPDU14a(aFIRST, sizeof(aFIRST), activate_field, keep_field_on, responseA, sizeof(responseA), &respAlen); - if (res != PM3_SUCCESS) { - DropField(); - return res; - } + // first + uint16_t NT0 = (trace_data[6] << 8) | trace_data[7]; + data.cuid = bytes_to_num(trace_data, 4); + data.nonce = prng_successor(NT0, 31); + data.nr = bytes_to_num(trace_data + 8, 4); + data.ar = bytes_to_num(trace_data + 12, 4); + data.at = 0; - // --------------- Second ---------------- - activate_field = false; - keep_field_on = false; + // second + for (uint8_t s_strace = trace + 1; s_strace < 7; s_strace++) { + uint8_t *s_trace_data = traces[s_strace]; + if (mfSectorNum(s_trace_data[5]) == mfSectorNum(trace_data[5])) { + NT0 = (s_trace_data[6] << 8) | s_trace_data[7]; + data.nonce2 = prng_successor(NT0, 31); + data.nr2 = bytes_to_num(s_trace_data + 8, 4); + data.ar2 = bytes_to_num(s_trace_data + 12, 4); + data.sector = mfSectorNum(trace_data[5]); + data.keytype = trace_data[4]; + data.state = FIRST; - uint8_t aSECOND[] = { 0x00, 0xa6, 0xb0, 0x01, 0x10 }; - res = ExchangeAPDU14a(aSECOND, sizeof(aSECOND), activate_field, keep_field_on, responseB, sizeof(responseB), &respBlen); - if (res != PM3_SUCCESS) { - DropField(); - return res; - } + uint64_t key64 = -1; + int res = mfkey32_moebius(&data, &key64); - uint8_t outA[16] = {0}; - uint8_t outB[16] = {0}; - - uint8_t key[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; - for (uint8_t i = 0; i < 16; i += 8) { - des_decrypt(outA + i, responseA + i, key); - des_decrypt(outB + i, responseB + i, key); - } - - PrintAndLogEx(DEBUG, " in : %s", sprint_hex_inrow(responseA, respAlen)); - PrintAndLogEx(DEBUG, "out : %s", sprint_hex_inrow(outA, sizeof(outA))); - PrintAndLogEx(DEBUG, " in : %s", sprint_hex_inrow(responseB, respAlen)); - PrintAndLogEx(DEBUG, "out : %s", sprint_hex_inrow(outB, sizeof(outB))); - - if (memcmp(outA, "\x01\x01\x01\x01\x01\x01\x01\x01", 8) == 0) { - PrintAndLogEx(INFO, "No trace recorded"); - return PM3_SUCCESS; - } - - // second trace? - if (memcmp(outB, "\x01\x01\x01\x01\x01\x01\x01\x01", 8) == 0) { - PrintAndLogEx(INFO, "Only one trace recorded"); - return PM3_SUCCESS; - } - - nonces_t data; - - // first - uint16_t NT0 = (outA[6] << 8) | outA[7]; - data.cuid = bytes_to_num(outA, 4); - data.nonce = prng_successor(NT0, 31); - data.nr = bytes_to_num(outA + 8, 4); - data.ar = bytes_to_num(outA + 12, 4); - data.at = 0; - - // second - NT0 = (outB[6] << 8) | outB[7]; - data.nonce2 = prng_successor(NT0, 31); - data.nr2 = bytes_to_num(outB + 8, 4); - data.ar2 = bytes_to_num(outB + 12, 4); - data.sector = mfSectorNum(outA[5]); - data.keytype = outA[4]; - data.state = FIRST; - - PrintAndLogEx(DEBUG, "A Sector %02x", data.sector); - PrintAndLogEx(DEBUG, "A NT %08x", data.nonce); - PrintAndLogEx(DEBUG, "A NR %08x", data.nr); - PrintAndLogEx(DEBUG, "A AR %08x", data.ar); - PrintAndLogEx(DEBUG, ""); - PrintAndLogEx(DEBUG, "B NT %08x", data.nonce2); - PrintAndLogEx(DEBUG, "B NR %08x", data.nr2); - PrintAndLogEx(DEBUG, "B AR %08x", data.ar2); - - uint64_t key64 = -1; - res = mfkey32_moebius(&data, &key64); - - if (res) { - PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%12" PRIX64) " ]" - , sprint_hex_inrow(outA, 4) - , data.sector - , (data.keytype == 0x60) ? 'A' : 'B' - , key64); + if (res) { + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " + _GREEN_("%012" + PRIX64) " ]", sprint_hex_inrow(trace_data, 4), data.sector, (data.keytype == 0x60) ? 'A' + : 'B', key64); + break; + } + } + } + } } else { - PrintAndLogEx(FAILED, "failed to recover any key"); + // Commands: + // a0 - set UID + // b0 - read traces + // c0 - clear card + + bool activate_field = true; + bool keep_field_on = true; + int res = 0; + if (uidlen) { + keep_field_on = false; + uint8_t response[6]; + int resplen = 0; + + // --------------- CHANGE UID ---------------- + uint8_t aCHANGE[] = {0x00, 0xa6, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00}; + memcpy(aCHANGE + 5, uid, uidlen); + res = ExchangeAPDU14a(aCHANGE, sizeof(aCHANGE), activate_field, keep_field_on, response, sizeof(response), + &resplen); + if (res != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Super card UID change [ " + _RED_("fail") + " ]"); + DropField(); + return res; + } + + PrintAndLogEx(SUCCESS, "Super card UID change ( " + _GREEN_("ok") + " )"); + return PM3_SUCCESS; + } + + if (reset_card) { + keep_field_on = false; + uint8_t response[6]; + int resplen = 0; + + // --------------- RESET CARD ---------------- + uint8_t aRESET[] = {0x00, 0xa6, 0xc0, 0x00}; + res = ExchangeAPDU14a(aRESET, sizeof(aRESET), activate_field, keep_field_on, response, sizeof(response), + &resplen); + if (res != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Super card reset [ " + _RED_("fail") + " ]"); + DropField(); + return res; + } + PrintAndLogEx(SUCCESS, "Super card reset ( " + _GREEN_("ok") + " )"); + return PM3_SUCCESS; + } + + + uint8_t responseA[22]; + uint8_t responseB[22]; + int respAlen = 0; + int respBlen = 0; + + // --------------- First ---------------- + uint8_t aFIRST[] = {0x00, 0xa6, 0xb0, 0x00, 0x10}; + res = ExchangeAPDU14a(aFIRST, sizeof(aFIRST), activate_field, keep_field_on, responseA, sizeof(responseA), + &respAlen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } + + // --------------- Second ---------------- + activate_field = false; + keep_field_on = false; + + uint8_t aSECOND[] = {0x00, 0xa6, 0xb0, 0x01, 0x10}; + res = ExchangeAPDU14a(aSECOND, sizeof(aSECOND), activate_field, keep_field_on, responseB, sizeof(responseB), + &respBlen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } + + uint8_t outA[16] = {0}; + uint8_t outB[16] = {0}; + + uint8_t key[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; + for (uint8_t i = 0; i < 16; i += 8) { + des_decrypt(outA + i, responseA + i, key); + des_decrypt(outB + i, responseB + i, key); + } + + PrintAndLogEx(DEBUG, " in : %s", sprint_hex_inrow(responseA, respAlen)); + PrintAndLogEx(DEBUG, "out : %s", sprint_hex_inrow(outA, sizeof(outA))); + PrintAndLogEx(DEBUG, " in : %s", sprint_hex_inrow(responseB, respAlen)); + PrintAndLogEx(DEBUG, "out : %s", sprint_hex_inrow(outB, sizeof(outB))); + + if (memcmp(outA, "\x01\x01\x01\x01\x01\x01\x01\x01", 8) == 0) { + PrintAndLogEx(INFO, "No trace recorded"); + return PM3_SUCCESS; + } + + // second trace? + if (memcmp(outB, "\x01\x01\x01\x01\x01\x01\x01\x01", 8) == 0) { + PrintAndLogEx(INFO, "Only one trace recorded"); + return PM3_SUCCESS; + } + + nonces_t data; + + // first + uint16_t NT0 = (outA[6] << 8) | outA[7]; + data.cuid = bytes_to_num(outA, 4); + data.nonce = prng_successor(NT0, 31); + data.nr = bytes_to_num(outA + 8, 4); + data.ar = bytes_to_num(outA + 12, 4); + data.at = 0; + + // second + NT0 = (outB[6] << 8) | outB[7]; + data.nonce2 = prng_successor(NT0, 31); + data.nr2 = bytes_to_num(outB + 8, 4); + data.ar2 = bytes_to_num(outB + 12, 4); + data.sector = mfSectorNum(outA[5]); + data.keytype = outA[4]; + data.state = FIRST; + + PrintAndLogEx(DEBUG, "A Sector %02x", data.sector); + PrintAndLogEx(DEBUG, "A NT %08x", data.nonce); + PrintAndLogEx(DEBUG, "A NR %08x", data.nr); + PrintAndLogEx(DEBUG, "A AR %08x", data.ar); + PrintAndLogEx(DEBUG, ""); + PrintAndLogEx(DEBUG, "B NT %08x", data.nonce2); + PrintAndLogEx(DEBUG, "B NR %08x", data.nr2); + PrintAndLogEx(DEBUG, "B AR %08x", data.ar2); + + uint64_t key64 = -1; + res = mfkey32_moebius(&data, &key64); + + if (res) { + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " + _GREEN_("%12" + PRIX64) " ]" + , sprint_hex_inrow(outA, 4) + , data.sector + , (data.keytype == 0x60) ? 'A' : 'B' + , key64); + } else { + PrintAndLogEx(FAILED, "failed to recover any key"); + } } return PM3_SUCCESS; } From 761ea6e81a8a8543e386cc584a4eed39c664747c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 25 Mar 2023 14:47:51 +0100 Subject: [PATCH 313/924] updated section about GDM styled tags --- doc/magic_cards_notes.md | 86 +++++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 10 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index db8057e5e..02ad66746 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -68,6 +68,7 @@ To restore anticollision config of the Proxmark3: ``` hf 14a config --std ``` + # MIFARE Classic ^[Top](#top) @@ -89,7 +90,7 @@ UID 4b: (actually NUID as there are no more "unique" IDs on 4b) ``` -Computing BCC on UID 11223344: `hf analyse lcr -d 11223344` = `44` +Computing BCC on UID 11223344: `analyse lcr -d 11223344` = `44` UID 7b: @@ -262,6 +263,8 @@ hf 14a info * Read: `40(7)`, `30xx` * Write: `40(7)`, `A0xx`+crc, `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`+crc + + ## MIFARE Classic DirectWrite aka Gen2 aka CUID ^[Top](#top) @@ -396,6 +399,7 @@ hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 04112233445566184200626364656667 # for 4k hf 14a config --std hf 14a reader ``` + ## MIFARE Classic DirectWrite, FUID version aka 1-write ^[Top](#top) @@ -436,14 +440,6 @@ hf 14a raw -k -c e100 hf 14a raw -c 85000000000000000000000000000008 ``` -## MIFARE Classic, other versions -^[Top](#top) - -**TODO** - -* ZXUID, EUID, ICUID ? -* Some cards exhibit a specific SAK=28 ?? - ## MIFARE Classic Gen3 aka APDU ^[Top](#top) @@ -517,6 +513,71 @@ hf 14a raw -s -c -t 2000 90F0CCCC10 041219c3219316984200e32000000000 hf 14a raw -s -c 90FD111100 ``` +## MIFARE Classic Gen4 aka GDM +^[Top](#top) +Tag has shadow mode enabled from start. +Meaning every write or changes to normal MFC memory is restored back to a copy from persistent memory after about 3 seconds +off rfid field. +Tag also seems to support Gen2 style, direct write, to block 0 to the normal MFC memory. + +The persistent memory is also writable. For that tag uses its own backdoor commands. +for example to write, you must use a customer authentication byte, 0x80, to authenticate with an all zeros key, 0x0000000000. +Then send the data to be written. + +** OBS ** +When writing to persistent memory it is possible to write _bad_ ACL and perm-brick the tag. + + +### Identify +^[Top](#top) + +``` +hf 14a info +... +[+] Magic capabilities : Gen 4 GDM +``` +### Magic commands +^[Top](#top) + +* Auth: `80xx`+crc +* Write: `A8xx`+crc, `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`+crc +* Read : `E000`+crc (unidentified) + +### Characteristics +^[Top](#top) +Have no access to card, no knowledge in ATQA/SAK/BCC quirks or if there is a wipe, softbrick recover +* Its magic part seem to be three identified custom command. +* Auth command 0x80, with the key 0x0000000000, Write 0xA8 allows writing to persistent memory, Read 0xE0 which seems to return a configuration. This is unknown today what these bytes are. + +It is also unknown what kind of block 0 changes the tag supports today +* UID: 4b +* ATQA/SAK: unknown +* BCC: unknown +* ATS: none + +### Proxmark3 commands +^[Top](#top) +``` +# Write to persistent memory +hf mf gdmsetblk + +# Read 0xE0 configuration: +hf mf gdmgetblk + +``` + +### libnfc commands +^[Top](#top) +No implemented commands today + +## MIFARE Classic, other versions +^[Top](#top) + +**TODO** + +* ZXUID, EUID, ICUID ? +* Some cards exhibit a specific SAK=28 ?? + ## MIFARE Classic Super ^[Top](#top) @@ -972,7 +1033,6 @@ script run hf_15_magic -u E004013344556677 A.k.a ultimate magic card, most promenent feature is shadow mode (GTU) and optional password protected backdoor commands. - Can emulate MIFARE Classic, Ultralight/NTAG families, 14b UID & App Data - [Identify](#identify) @@ -1010,6 +1070,7 @@ The card will be identified only if the password is the default one. One can ide hf 14a raw -s -c -t 1000 CF00000000C6 ``` If the card is an Ultimate Magic Card, it returns 30 or 32 bytes. + ### Magic commands ^[Top](#top) ^^[Gen4](#g4top) @@ -1156,6 +1217,7 @@ OR (Note the script will correct the ATQA correctly) ``` script run hf_mf_ultimatecard -q 004428 ``` + ### Change ATS ^[Top](#top) ^^[Gen4](#g4top) @@ -1193,6 +1255,7 @@ Example: set UID length to 7 bytes, default pwd ``` hf 14a raw -s -c -t 1000 CF000000006801 ``` + ### Set 14443A UID ^[Top](#top) ^^[Gen4](#g4top) @@ -1306,6 +1369,7 @@ script run hf_mf_ultimatecard -m 02 ``` Now the card supports the 3DES UL-C authentication. + ### Set Ultralight and M1 maximum read/write sectors ^[Top](#top) ^^[Gen4](#g4top) @@ -1319,6 +1383,7 @@ Example: set maximum 63 blocks read/write for Mifare Classic 1K ``` hf 14a raw -s -c -t 1000 CF000000006B3F ``` + ### Set shadow mode (GTU) ^[Top](#top) ^^[Gen4](#g4top) @@ -1432,6 +1497,7 @@ Default configuration: ^^ cf cmd 68: UID length ^^ cf cmd 69: Ultralight protocol ``` + ### Fast configuration ^[Top](#top) ^^[Gen4](#g4top) From 2668fc9a4a3e3eaa3b092d174d011a1240cb9b6d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 25 Mar 2023 14:50:51 +0100 Subject: [PATCH 314/924] textual --- CHANGELOG.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cceee09b..b9e28fad3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed magic note to include a section about GDM tags (@iceman1001) - Added `hf mf gdmsetblk` - Support Gen4 GDM write block (@iceman1001) - Changed `hf 14a info` - detect Gen GDM magic tags (@iceman1001) - Changed CLI max string argument length limit from 512 to 4096 (@iceman1001) @@ -19,7 +20,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed `pm3` script for passing arguments (@doegox) - Fixed python paths to include current directory (@jmichelp) - Fixed infinite loops in spindelayus (@lnv42) - - Add ICECLASS standalone read/sim mode (@natesales) + - Changed ICECLASS standalone to support a read/sim mode (@natesales) - Changed `hf iclass encode` - added verbose flag (@natesales) - Changed `hf waveshare` - now identify 1.54 nfc epaper correct (@ah01) - Fixed `Makefile` regression that broke `make install` (@henrygab) @@ -31,12 +32,13 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added `--back` option to `clear` command to clear the scrollback buffer (@wh201906) - Changed `hf iclass decrypt` - mark credentials as decrypted in the dump (@natesales) - Changed `hf iclass view` - show credentials on a decrypted dump (@natesales) - - Show NTAG213TT tamper info in `hf mfu info` and add commands for configuring it's tamper feature (@mjaksn) - - Add Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) + - Changed `hf mfu info` - NTAG213TT tamper info (mjaksn) + - Added commands for configuring NTAG213TT tamper featue (@mjaksn) + - Added Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) - Added XOR key extraction and flag to Guardall G-Prox II (@GuruSteve) - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) - Added `hf legic info` command for other sources: `hf legic einfo`, `hf legic view` (@0xdeb) - - + ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) From 22a193a7f2fcd042fc5afc38d38415942d1186d9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 25 Mar 2023 14:52:44 +0100 Subject: [PATCH 315/924] text --- doc/magic_cards_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 02ad66746..86a5329a2 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -20,6 +20,7 @@ Useful docs: * [MIFARE Classic DirectWrite, UFUID version](#mifare-classic-directwrite-ufuid-version) * [MIFARE Classic, other versions](#mifare-classic-other-versions) * [MIFARE Classic Gen3 aka APDU](#mifare-classic-gen3-aka-apdu) + * [MIFARE Classic Gen4 aka GDM](#mifare-classic-gen4-aka-gdm) * [MIFARE Classic Super](#mifare-classic-super) - [MIFARE Ultralight](#mifare-ultralight) * [MIFARE Ultralight blocks 0..2](#mifare-ultralight-blocks-02) From 7b93de7a81c6049eb34886abf520cbe0e38f151f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 25 Mar 2023 15:00:58 +0100 Subject: [PATCH 316/924] added GDM read configuration block --- CHANGELOG.md | 1 + armsrc/appmain.c | 11 +++++- armsrc/mifarecmd.c | 59 ++++++++++++++++++++++++++++++++ armsrc/mifarecmd.h | 1 + armsrc/mifareutil.h | 3 ++ client/src/cmdhfmf.c | 80 +++++++++++++++++++++++++++++++++++++++++++- include/protocols.h | 1 + 7 files changed, 154 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9e28fad3..f6e9c9811 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `hf mf gdmgetblk` - Support Gen4 GDM read configuration block (@iceman1001) - Changed magic note to include a section about GDM tags (@iceman1001) - Added `hf mf gdmsetblk` - Support Gen4 GDM write block (@iceman1001) - Changed `hf 14a info` - detect Gen GDM magic tags (@iceman1001) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index d435f9967..c90640828 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1735,7 +1735,16 @@ static void PacketReceived(PacketCommandNG *packet) { MifareG4WriteBlk(payload->blockno, payload->pwd, payload->data, payload->workFlags); break; } - + case CMD_HF_MIFARE_G4_GDM_RDBL: { + struct p { + uint8_t blockno; + uint8_t keytype; + uint8_t key[6]; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + MifareReadBlockGDM(payload->blockno, payload->keytype, payload->key); + break; + } case CMD_HF_MIFARE_G4_GDM_WRBL: { struct p { uint8_t blockno; diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index aaf1d795a..0bcb4fd74 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -214,6 +214,65 @@ void MifareUReadBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { LEDsoff(); } +void MifareReadBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key) { + + int retval = PM3_SUCCESS; + + uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); + if (par == NULL) { + retval = PM3_EMALLOC; + goto OUT; + } + + uint8_t *uid = BigBuf_malloc(10); + if (uid == NULL) { + retval = PM3_EMALLOC; + goto OUT; + } + + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); + clear_trace(); + set_tracing(true); + + // variables + uint32_t cuid = 0; + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs; + pcs = &mpcs; + + uint64_t ui64key = bytes_to_num(key, 6); + uint8_t outbuf[16] = {0x00}; + + if (iso14443a_select_card(uid, NULL, &cuid, true, 0, true) == false) { + retval = PM3_ESOFT; + goto OUT; + } + + if (mifare_classic_authex_2(pcs, cuid, blockno, keytype, ui64key, AUTH_FIRST, NULL, NULL, true)) { + retval = PM3_ESOFT; + goto OUT; + }; + + if (mifare_classic_readblock_ex(pcs, cuid, blockno, outbuf, true)) { + retval = PM3_ESOFT; + goto OUT; + }; + + if (mifare_classic_halt(pcs, cuid)) { + retval = PM3_ESOFT; + goto OUT; + }; + +OUT: + crypto1_deinit(pcs); + + reply_ng(CMD_HF_MIFARE_G4_GDM_RDBL, retval, outbuf, sizeof(outbuf)); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); + set_tracing(false); + BigBuf_free(); +} + //----------------------------------------------------------------------------- // Select, Authenticate, Read a MIFARE tag. // read sector (data = 4 x 16 bytes = 64 bytes, or 16 x 16 bytes = 256 bytes) diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index f471ccecc..062c02367 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -59,6 +59,7 @@ void MifareGen3Blk(uint8_t block_len, uint8_t *block); // Gen 3 magic card overw void MifareGen3Freez(void); // Gen 3 magic card lock further UID changes // MFC GEN4 GDM +void MifareReadBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key); void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t *datain); // MFC GEN4 GTU diff --git a/armsrc/mifareutil.h b/armsrc/mifareutil.h index c7c6b4a94..37b1b1294 100644 --- a/armsrc/mifareutil.h +++ b/armsrc/mifareutil.h @@ -73,7 +73,10 @@ uint16_t mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested); int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing); int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing, bool is_gdm); + int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData); +int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm); + int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid); int mifare_classic_halt_ex(struct Crypto1State *pcs); int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 900f201d2..a0a2c6961 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -7560,6 +7560,78 @@ static int CmdHF14AGen4Save(const char *Cmd) { return PM3_SUCCESS; } +static int CmdHF14AGen4_GDM_GetBlk(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mf gdmgetblk", + "Get block data from magic gen4 GDM card.", + "hf mf gdmgetblk --blk 0 --> get block 0 (manufacturer)\n" + "hf mf gdmgetblk --blk 3 -v --> get block 3, decode sector trailer\n" + ); + void *argtable[] = { + arg_param_begin, + arg_int1("b", "blk", "", "block number"), + arg_lit0("v", "verbose", "verbose output"), + arg_str0("k", "key", "", "key 6 bytes"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + int b = arg_get_int_def(ctx, 1, 0); + bool verbose = arg_get_lit(ctx, 2); + + int keylen = 0; + uint8_t key[6] = {0}; + CLIGetHexWithReturn(ctx, 3, key, &keylen); + CLIParserFree(ctx); + + // validate args + if (b < 0 || b >= MIFARE_4K_MAXBLOCK) { + PrintAndLogEx(FAILED, "target block number out-of-range, got %i", b); + return PM3_EINVARG; + } + + if (keylen != 6 && keylen != 0) { + PrintAndLogEx(FAILED, "Must specify 6 bytes, got " _YELLOW_("%u"), keylen); + return PM3_EINVARG; + } + + uint8_t blockno = (uint8_t)b; + PrintAndLogEx(NORMAL, "Block: %x", blockno) ; + + struct p { + uint8_t blockno; + uint8_t keytype; + uint8_t key[6]; + } PACKED payload; + + payload.blockno = blockno; + payload.keytype = 0; + memcpy(payload.key, key, sizeof(payload.key)); + + clearCommandBuffer(); + SendCommandNG(CMD_HF_MIFARE_G4_GDM_RDBL, (uint8_t *)&payload, sizeof(payload)); + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_HF_MIFARE_G4_GDM_RDBL, &resp, 1500) == false) { + PrintAndLogEx(WARNING, "command execute timeout"); + return PM3_ETIMEOUT; + } + + if (resp.status == PM3_SUCCESS) { + uint8_t sector = mfSectorNum(blockno); + mf_print_sector_hdr(sector); + + uint8_t *d = resp.data.asBytes; + mf_print_block_one(blockno, d, verbose); + + if (verbose) { + decode_print_st(blockno, d); + } else { + PrintAndLogEx(NORMAL, ""); + } + } + + return resp.status; +} + static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { CLIParserContext *ctx; @@ -7599,7 +7671,7 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { CLIParserFree(ctx); if (blen != MFBLOCK_SIZE) { - PrintAndLogEx(WARNING, "expected 16 HEX bytes. got %i", blen); + PrintAndLogEx(WARNING, "expected %u HEX bytes. got %i", MFBLOCK_SIZE, blen); return PM3_EINVARG; } @@ -7608,6 +7680,11 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { return PM3_EINVARG; } + if (keylen != 6 && keylen != 0) { + PrintAndLogEx(FAILED, "Must specify 6 bytes, got " _YELLOW_("%u"), keylen); + return PM3_EINVARG; + } + uint8_t blockno = (uint8_t)b; PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); @@ -7908,6 +7985,7 @@ static command_t CommandTable[] = { {"gsetblk", CmdHF14AGen4SetBlk, IfPm3Iso14443a, "Write block to card"}, {"gview", CmdHF14AGen4View, IfPm3Iso14443a, "View card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "-------------------- " _CYAN_("magic gen4 GDM") " --------------------------"}, + {"gdmgetblk", CmdHF14AGen4_GDM_GetBlk, IfPm3Iso14443a, "Read block from card"}, {"gdmsetblk", CmdHF14AGen4_GDM_SetBlk, IfPm3Iso14443a, "Write block to card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("ndef") " -----------------------"}, // {"ice", CmdHF14AMfice, IfPm3Iso14443a, "collect MIFARE Classic nonces to file"}, diff --git a/include/protocols.h b/include/protocols.h index 333dcdb71..8450dc58a 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -193,6 +193,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MIFARE_MAGIC_GDM_AUTH_KEYA 0x80 #define MIFARE_MAGIC_GDM_AUTH_KEYB 0x81 #define MIFARE_MAGIC_GDM_WRITEBLOCK 0xA8 +#define MIFARE_MAGIC_GDM_READBLOCK 0xE0 #define MIFARE_EV1_PERSONAL_UID 0x40 #define MIFARE_EV1_SETMODE 0x43 From 266ca65dc8eac9269d8058cea4def8e1d90b2e06 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 25 Mar 2023 15:03:05 +0100 Subject: [PATCH 317/924] text --- doc/magic_cards_notes.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 86a5329a2..36846614a 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -546,11 +546,12 @@ hf 14a info ### Characteristics ^[Top](#top) -Have no access to card, no knowledge in ATQA/SAK/BCC quirks or if there is a wipe, softbrick recover -* Its magic part seem to be three identified custom command. -* Auth command 0x80, with the key 0x0000000000, Write 0xA8 allows writing to persistent memory, Read 0xE0 which seems to return a configuration. This is unknown today what these bytes are. -It is also unknown what kind of block 0 changes the tag supports today +* Have no knowledge in ATQA/SAK/BCC quirks or if there is a wipe, softbrick recover +* Its magic part seem to be three identified custom command. +* Auth command 0x80, with the key 0x0000000000, Write 0xA8 allows writing to persistent memory, Read 0xE0 which seems to return a configuration. This is unknown today what these bytes are. + +It is unknown what kind of block 0 changes the tag supports * UID: 4b * ATQA/SAK: unknown * BCC: unknown From ebe7cbf05ff4e841470a616eb4c6bad5446a7e25 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 25 Mar 2023 15:52:18 +0100 Subject: [PATCH 318/924] missing... --- armsrc/mifareutil.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index c349860dd..29754538a 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -230,13 +230,20 @@ int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t bloc } int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData) { + return mifare_classic_readblock_ex(pcs, uid, blockNo, blockData, false); +} +int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm) { - int len; - uint8_t bt[2] = {0x00, 0x00}; uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; - len = mifare_sendcmd_short(pcs, 1, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); + uint16_t len; + if (is_gdm) { + len = mifare_sendcmd_short(pcs, 1, MIFARE_MAGIC_GDM_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); + } else { + len = mifare_sendcmd_short(pcs, 1, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); + } + if (len == 1) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error %02x", receivedAnswer[0]); return 1; @@ -246,6 +253,7 @@ int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blo return 2; } + uint8_t bt[2] = {0x00, 0x00}; memcpy(bt, receivedAnswer + 16, 2); AddCrc14A(receivedAnswer, 16); if (bt[0] != receivedAnswer[16] || bt[1] != receivedAnswer[17]) { @@ -416,19 +424,14 @@ int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData) { int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData) { return mifare_classic_writeblock_ex(pcs, uid, blockNo, blockData, false); } - int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm) { - // variables - uint16_t len = 0; - uint32_t pos = 0; - uint8_t par[3] = {0x00, 0x00, 0x00}; // enough for 18 Bytes to send - uint8_t res = 0; - uint8_t d_block[18], d_block_enc[18]; + // variables uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; // command MIFARE_MAGIC_GDM_WRITEBLOCK + uint16_t len; if (is_gdm) { len = mifare_sendcmd_short(pcs, 1, MIFARE_MAGIC_GDM_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); } else { @@ -440,11 +443,14 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t return 1; } + uint8_t d_block[18], d_block_enc[18]; memcpy(d_block, blockData, 16); AddCrc14A(d_block, 16); + // enough for 18 Bytes to send + uint8_t par[3] = {0x00, 0x00, 0x00}; // crypto - for (pos = 0; pos < 18; pos++) { + for (uint32_t pos = 0; pos < 18; pos++) { d_block_enc[pos] = crypto1_byte(pcs, 0x00, 0) ^ d_block[pos]; par[pos >> 3] |= (((filter(pcs->odd) ^ oddparity8(d_block[pos])) & 0x01) << (7 - (pos & 0x0007))); } @@ -452,9 +458,10 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t ReaderTransmitPar(d_block_enc, sizeof(d_block_enc), par, NULL); // Receive the response + len = ReaderReceive(receivedAnswer, receivedAnswerPar); - res = 0; + uint8_t res = 0; res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 0)) << 0; res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 1)) << 1; res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 2)) << 2; From a81a875df970c2a103988fae65853e92926e44ec Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sat, 25 Mar 2023 18:03:33 +0300 Subject: [PATCH 319/924] Update supercard docs --- doc/magic_cards_notes.md | 59 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index db8057e5e..0e487f8a2 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -520,19 +520,66 @@ hf 14a raw -s -c 90FD111100 ## MIFARE Classic Super ^[Top](#top) -It behaves like DirectWrite but records reader auth attempts. +It behaves like regular Mifare Classic but records reader auth attempts. -To change UID: same commands as for MFC DirectWrite +#### MIFARE Classic Super Gen1 +^[Top](#top) -To do reader-only attack: at least two versions exist. +Old type of cards, hard to obtain. They are DirectWrite, UID can be changed via 0 block or backdoor commands. -* type 1: https://github.com/nfc-tools/nfc-supercard for card with ATS: 0978009102DABC1910F005 -* type 2: https://github.com/netscylla/super-card/blob/master/libnfc-1.7.1/utils/nfc-super.c for ?? +* UID: 4b version +* ATQA/SAK: fixed +* BCC: auto +* ATS: fixed, 0978009102DABC1910F005 + +ATQA/SAK matches 1k card, but works as 4k card. + +Backdoor commands provided over APDU. Format: + +``` +00 A6 A0 00 05 FF FF FF FF 00 +^^ ^^ Backdoor command header + ^^ Backdoor command (A0 - set UID/B0 - get trace/C0 - reset card) + ^^ Type of answer (used in key recovery to select trace number) + ^^ Length of user provided data + ^^ ^^ ^^ ^^ ^^ User data +``` + +👉 You can't change UID with backdoor command if incorrect data is written to the 0 sector trailer! + +#### MIFARE Classic Super Gen1B + +DirectWrite card, ATS unknown. Probably same as Gen1, except backdoor commands. +Implementation: https://github.com/netscylla/super-card/blob/master/libnfc-1.7.1/utils/nfc-super.c + +#### MIFARE Classic Super Gen2 +^[Top](#top) + +New generation of cards, based on limited Gen4 chip. Emulates Gen1 backdoor protocol, but can store up to 7 different traces. + +Card always answer `ff ff ff ff` to auth, so writing/reading it via Mifare protocol is impossible. + +UID is changeable via Gen4 backdoor write to 0 block. + +* UID: 4b and 7b versions +* ATQA/SAK: fixed +* BCC: auto +* ATS: changeable, default as Gen1 + +Gen4 commands available: + +``` +CF 34 <1b length><0-16b ATS> // Configure ATS +CF CC // Factory test, returns 00 00 00 02 AA +CF CD <1b block number><16b block data> // Backdoor write 16b block +CF CE <1b block number> // Backdoor read 16b block +CF FE <4b new_password> // Change password +``` ### Identify ^[Top](#top) -Only type 1 at the moment: +Only Gen1 at the moment: ``` hf 14a info From 581b48f3f93833c351c6b3438d335746c260cc51 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 25 Mar 2023 18:48:07 +0100 Subject: [PATCH 320/924] textual --- doc/magic_cards_notes.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 36846614a..5750b8c8d 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -370,7 +370,7 @@ Android compatible ^[Top](#top) ``` -hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 11223344440804006263646566676869 +hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 11223344440804006263646566676869 --force hf mf wipe --gen2 ``` @@ -385,8 +385,13 @@ e.g. for 4b UID: ``` hf 14a config --atqa force --bcc ignore --cl2 skip --rats skip -hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 11223344440804006263646566676869 # for 1k -hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 11223344441802006263646566676869 # for 4k + +# for 1k +hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 11223344440804006263646566676869 --force + +# for 4k +hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 11223344441802006263646566676869 --force + hf 14a config --std hf 14a reader ``` @@ -395,8 +400,13 @@ e.g. for 7b UID: ``` hf 14a config --atqa force --bcc ignore --cl2 force --cl3 skip --rats skip -hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 04112233445566084400626364656667 # for 1k -hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 04112233445566184200626364656667 # for 4k + +# for 1k +hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 04112233445566084400626364656667 --force + +# for 4k +hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d 04112233445566184200626364656667 --force + hf 14a config --std hf 14a reader ``` From 5bf5d9a28285745c8f2a07d01d7cfe544eaaf7a7 Mon Sep 17 00:00:00 2001 From: KurisuWaifu <96349419+KurisuWaifu@users.noreply.github.com> Date: Sat, 25 Mar 2023 23:25:57 +0100 Subject: [PATCH 321/924] Explain "Unknown Command" behaviour Edited the Magic Gen 4 section Signed-off-by: KurisuWaifu <96349419+KurisuWaifu@users.noreply.github.com> --- doc/magic_cards_notes.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 5750b8c8d..cd3dfa58e 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -1164,7 +1164,7 @@ CF C6 // Dump configuration CF CC // Factory test, returns 6666 CF CD <1b block number><16b block data> // Backdoor write 16b block CF CE <1b block number> // Backdoor read 16b block -CF CF <1b param> // Unknown +CF CF <1b param> // (De)Activate direct write to block 0 CF F0 <30b configuration data> // Configure all params in one cmd CF F1 <30b configuration data> // Configure all params in one cmd and fuse the configuration permanently CF FE <4b new_password> // change password @@ -1457,19 +1457,27 @@ Example: write block0 with factory data, default pwd hf 14a raw -s -c -t 1000 CF00000000CD00112233441C000011778185BA18000000 ``` -### Unknown command +### (De)Activate direct write to block 0 ^[Top](#top) ^^[Gen4](#g4top) -This command modifies one byte in configuration dump, but purpose one is unknown. +This command enables/disables direct writes to block 0. ``` hf 14a raw -s -c -t 1000 CFCF<1b param> ``` * `` - * `??`: ??? + * `00`: Activate direct write to block 0 (Same behaviour of Gen2 cards. Some readers may identify the card as magic) + * `01`: Deactivate direct write to block 0 (Same behaviour of vanilla cards) + * `02`: Default value. (Same behaviour as `00` (?)) -Example: -hf 14a raw -s -c -t 1000 CF00000000CF02 +Example: enable direct writes to block 0, default pwd +``` +hf 14a raw -s -c -t 1000 CF00000000CF00 +``` +Example: disable direct writes to block 0, default pwd +``` +hf 14a raw -s -c -t 1000 CF00000000CF01 +``` ### Change backdoor password ^[Top](#top) ^^[Gen4](#g4top) @@ -1620,4 +1628,3 @@ hf mfu wrbl -b 250 -d 00040402 --force hf mfu wrbl -b 251 -d 01001303 --force hf mfu info ``` - From c436a97aeef75c43452555dfcb23e28a58f62bf0 Mon Sep 17 00:00:00 2001 From: KurisuWaifu <96349419+KurisuWaifu@users.noreply.github.com> Date: Sun, 26 Mar 2023 01:24:38 +0100 Subject: [PATCH 322/924] Small corrections Added "Activate direct write to block 0" to gen 4 gtu index. Edited the "dump configuration" section Signed-off-by: KurisuWaifu <96349419+KurisuWaifu@users.noreply.github.com> --- doc/magic_cards_notes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index cd3dfa58e..158fa98a5 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -1060,6 +1060,7 @@ Can emulate MIFARE Classic, Ultralight/NTAG families, 14b UID & App Data - [Select Ultralight mode](#select-ultralight-mode) - [Set shadow mode (GTU)](#set-shadow-mode-gtu) - [Direct block read and write](#direct-block-read-and-write) +- [(De)Activate direct write to block 0](#deactivate-direct-write-to-block-0) - [Change backdoor password](#change-backdoor-password) - [Dump configuration](#dump-configuration) - [Fast configuration](#fast-configuration) @@ -1507,7 +1508,7 @@ Default configuration: ``` 00000000000002000978009102DABC191010111213141516040008006B024F6B ^^^^ ?? - ^^ cf cmd cf: ?? this byte set by cmd cfcf, factory value 0x02 + ^^ cf cmd cf: block0 direct write setting, factory value 0x02 ^^ cf cmd 6b: maximum read/write sectors, factory value 0x6b ^^ cf cmd 6a: UL mode ^^^^^^ cf cmd 35: ATQA/SAK From 5e8a08c7145ca5d786ddf6ba790a1e89471c31be Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 03:08:01 +0200 Subject: [PATCH 323/924] updated text about configuration GDM --- doc/magic_cards_notes.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 158fa98a5..a8792767a 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -535,9 +535,14 @@ The persistent memory is also writable. For that tag uses its own backdoor comma for example to write, you must use a customer authentication byte, 0x80, to authenticate with an all zeros key, 0x0000000000. Then send the data to be written. +This tag has simular commands to the [UFUID](#mifare-classic-directwrite-ufuid-version) +It seems to be developed by the same person. + ** OBS ** When writing to persistent memory it is possible to write _bad_ ACL and perm-brick the tag. +** OBS ** +It is possible to write a configuration that perma locks the tag, ie no more magic ### Identify ^[Top](#top) @@ -552,7 +557,8 @@ hf 14a info * Auth: `80xx`+crc * Write: `A8xx`+crc, `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`+crc -* Read : `E000`+crc (unidentified) +* Read config: `E000`+crc (unidentified) +* Write config: `E100`+crc ### Characteristics ^[Top](#top) @@ -561,6 +567,21 @@ hf 14a info * Its magic part seem to be three identified custom command. * Auth command 0x80, with the key 0x0000000000, Write 0xA8 allows writing to persistent memory, Read 0xE0 which seems to return a configuration. This is unknown today what these bytes are. +Read config: +1. sending custom auth with all zeros key +2. send 0xE000, will return the configuration bytes. +`results: 850000000000000000005A5A00000008` + +Write config: +1. sending custom auth with all zeros key +2. send 0xE100 +3. send 16 bytes + +** Warning ** +Example of configuration to Perma lock tag: +`85000000000000000000000000000008` + + It is unknown what kind of block 0 changes the tag supports * UID: 4b * ATQA/SAK: unknown From f61a8a774b609b1ddeeb294aedad229e6ba14541 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 03:08:39 +0200 Subject: [PATCH 324/924] textual --- doc/magic_cards_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index a8792767a..324340794 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -526,6 +526,7 @@ hf 14a raw -s -c 90FD111100 ## MIFARE Classic Gen4 aka GDM ^[Top](#top) + Tag has shadow mode enabled from start. Meaning every write or changes to normal MFC memory is restored back to a copy from persistent memory after about 3 seconds off rfid field. From 0d085488a69b4fa0bf1219bfa226fa5cab559c1e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 03:11:05 +0200 Subject: [PATCH 325/924] textual --- doc/magic_cards_notes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 324340794..1a8726de2 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -539,10 +539,10 @@ Then send the data to be written. This tag has simular commands to the [UFUID](#mifare-classic-directwrite-ufuid-version) It seems to be developed by the same person. -** OBS ** +*** OBS *** When writing to persistent memory it is possible to write _bad_ ACL and perm-brick the tag. -** OBS ** +*** OBS *** It is possible to write a configuration that perma locks the tag, ie no more magic ### Identify From 932e345c43562e2fd6dce196935c5bd843c1ddda Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 03:16:35 +0200 Subject: [PATCH 326/924] textual --- doc/magic_cards_notes.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 1a8726de2..8071f7ea7 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -539,10 +539,10 @@ Then send the data to be written. This tag has simular commands to the [UFUID](#mifare-classic-directwrite-ufuid-version) It seems to be developed by the same person. -*** OBS *** +**OBS** When writing to persistent memory it is possible to write _bad_ ACL and perm-brick the tag. -*** OBS *** +**OBS** It is possible to write a configuration that perma locks the tag, ie no more magic ### Identify @@ -578,7 +578,7 @@ Write config: 2. send 0xE100 3. send 16 bytes -** Warning ** +**Warning** Example of configuration to Perma lock tag: `85000000000000000000000000000008` From 97e16ba764d4b3cfe345c20920c55ce629df378c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 03:41:12 +0200 Subject: [PATCH 327/924] renamed gdm getblk to config since that is what it does --- armsrc/appmain.c | 6 +- armsrc/mifarecmd.c | 8 +-- armsrc/mifarecmd.h | 2 +- armsrc/mifareutil.c | 15 ++-- armsrc/mifareutil.h | 2 +- client/src/cmdhfmf.c | 145 +++++++++++++++++++-------------------- doc/magic_cards_notes.md | 5 +- include/pm3_cmd.h | 1 + include/protocols.h | 1 + 9 files changed, 88 insertions(+), 97 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index c90640828..969513d39 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1735,14 +1735,12 @@ static void PacketReceived(PacketCommandNG *packet) { MifareG4WriteBlk(payload->blockno, payload->pwd, payload->data, payload->workFlags); break; } - case CMD_HF_MIFARE_G4_GDM_RDBL: { + case CMD_HF_MIFARE_G4_GDM_CONFIG: { struct p { - uint8_t blockno; - uint8_t keytype; uint8_t key[6]; } PACKED; struct p *payload = (struct p *) packet->data.asBytes; - MifareReadBlockGDM(payload->blockno, payload->keytype, payload->key); + MifareReadConfigBlockGDM(payload->key); break; } case CMD_HF_MIFARE_G4_GDM_WRBL: { diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 0bcb4fd74..9eb44da5a 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -214,7 +214,7 @@ void MifareUReadBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { LEDsoff(); } -void MifareReadBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key) { +void MifareReadConfigBlockGDM(uint8_t *key) { int retval = PM3_SUCCESS; @@ -248,12 +248,12 @@ void MifareReadBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key) { goto OUT; } - if (mifare_classic_authex_2(pcs, cuid, blockno, keytype, ui64key, AUTH_FIRST, NULL, NULL, true)) { + if (mifare_classic_authex_2(pcs, cuid, 0, 0, ui64key, AUTH_FIRST, NULL, NULL, true)) { retval = PM3_ESOFT; goto OUT; }; - if (mifare_classic_readblock_ex(pcs, cuid, blockno, outbuf, true)) { + if (mifare_classic_readblock_ex(pcs, cuid, 0, outbuf, MIFARE_MAGIC_GDM_READBLOCK)) { retval = PM3_ESOFT; goto OUT; }; @@ -266,7 +266,7 @@ void MifareReadBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key) { OUT: crypto1_deinit(pcs); - reply_ng(CMD_HF_MIFARE_G4_GDM_RDBL, retval, outbuf, sizeof(outbuf)); + reply_ng(CMD_HF_MIFARE_G4_GDM_CONFIG, retval, outbuf, sizeof(outbuf)); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); set_tracing(false); diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index 062c02367..6363423fd 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -59,7 +59,7 @@ void MifareGen3Blk(uint8_t block_len, uint8_t *block); // Gen 3 magic card overw void MifareGen3Freez(void); // Gen 3 magic card lock further UID changes // MFC GEN4 GDM -void MifareReadBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key); +void MifareReadConfigBlockGDM(uint8_t *key); void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t *datain); // MFC GEN4 GTU diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 29754538a..11009031b 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -153,7 +153,7 @@ int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t bloc num_to_bytes(prng_successor(GetTickCount(), 32), 4, nr); // Transmit MIFARE_CLASSIC_AUTH 0x60, 0x61 or GDM 0x80 - uint8_t cmdbyte = (is_gdm) ? MIFARE_MAGIC_GDM_AUTH_KEYA : MIFARE_AUTH_KEYA + (keyType & 0x01); + uint8_t cmdbyte = (is_gdm) ? MIFARE_MAGIC_GDM_AUTH_KEYA + (keyType & 0x01) : MIFARE_AUTH_KEYA + (keyType & 0x01); len = mifare_sendcmd_short(pcs, isNested, cmdbyte, blockNo, receivedAnswer, receivedAnswerPar, timing); if (len != 4) return 1; @@ -230,20 +230,14 @@ int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t bloc } int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData) { - return mifare_classic_readblock_ex(pcs, uid, blockNo, blockData, false); + return mifare_classic_readblock_ex(pcs, uid, blockNo, blockData, ISO14443A_CMD_READBLOCK); } -int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm) { +int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t iso_byte) { uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; - uint16_t len; - if (is_gdm) { - len = mifare_sendcmd_short(pcs, 1, MIFARE_MAGIC_GDM_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); - } else { - len = mifare_sendcmd_short(pcs, 1, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); - } - + uint16_t len = mifare_sendcmd_short(pcs, 1, iso_byte, blockNo, receivedAnswer, receivedAnswerPar, NULL); if (len == 1) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error %02x", receivedAnswer[0]); return 1; @@ -458,7 +452,6 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t ReaderTransmitPar(d_block_enc, sizeof(d_block_enc), par, NULL); // Receive the response - len = ReaderReceive(receivedAnswer, receivedAnswerPar); uint8_t res = 0; diff --git a/armsrc/mifareutil.h b/armsrc/mifareutil.h index 37b1b1294..bcc813d00 100644 --- a/armsrc/mifareutil.h +++ b/armsrc/mifareutil.h @@ -75,7 +75,7 @@ int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockN int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing, bool is_gdm); int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData); -int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm); +int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t iso_byte); int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid); int mifare_classic_halt_ex(struct Crypto1State *pcs); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index a0a2c6961..0ba8aac98 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -400,6 +400,47 @@ static void mf_analyse_acl(uint16_t n, uint8_t *d) { } } +/* + Sector trailer sanity checks. + Warn if ACL is strict read-only, or invalid ACL. +*/ +static int mf_analyse_st_block(uint8_t blockno, uint8_t *block, bool force){ + + if (mfIsSectorTrailer(blockno) == false) { + return PM3_SUCCESS; + } + + PrintAndLogEx(INFO, "Sector trailer (ST) write detected"); + + // ensure access right isn't messed up. + if (mfValidateAccessConditions(&block[6]) == false) { + PrintAndLogEx(WARNING, "Invalid Access Conditions detected, replacing with default values"); + memcpy(block + 6, "\xFF\x07\x80\x69", 4); + } + + bool ro_detected = false; + uint8_t bar = mfNumBlocksPerSector(mfSectorNum(blockno)); + for (uint8_t foo = 0; foo < bar; foo++) { + if (mfReadOnlyAccessConditions(foo, &block[6])) { + PrintAndLogEx(WARNING, "Strict ReadOnly Access Conditions on block " _YELLOW_("%u") " detected", blockno - bar + 1 + foo); + ro_detected = true; + } + } + if (ro_detected) { + if (force) { + PrintAndLogEx(WARNING, " --force override, continuing..."); + } else { + PrintAndLogEx(INFO, "Exiting, please run `" _YELLOW_("hf mf acl -d %s") "` to understand", sprint_hex_inrow(&block[6], 3)); + PrintAndLogEx(INFO, "Use `" _YELLOW_("--force") "` to override and write this data"); + return PM3_EINVARG; + } + } else { + PrintAndLogEx(SUCCESS, "ST passed checks, continuing..."); + } + + return PM3_SUCCESS; +} + static int CmdHF14AMfAcl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf acl", @@ -521,7 +562,6 @@ static int CmdHF14AMfWrBl(const char *Cmd) { arg_lit0(NULL, "force", "override warnings"), arg_str0("k", "key", "", "key, 6 hex bytes"), arg_str0("d", "data", "", "bytes to write, 16 hex bytes"), - arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -569,36 +609,8 @@ static int CmdHF14AMfWrBl(const char *Cmd) { uint8_t blockno = (uint8_t)b; - // Sector trailer sanity checks. - // Warn if ACL is strict read-only, or invalid ACL. - if (mfIsSectorTrailer(blockno)) { - PrintAndLogEx(INFO, "Sector trailer (ST) write detected"); - - // ensure access right isn't messed up. - if (mfValidateAccessConditions(&block[6]) == false) { - PrintAndLogEx(WARNING, "Invalid Access Conditions detected, replacing with default values"); - memcpy(block + 6, "\xFF\x07\x80\x69", 4); - } - - bool ro_detected = false; - uint8_t bar = mfNumBlocksPerSector(mfSectorNum(blockno)); - for (uint8_t foo = 0; foo < bar; foo++) { - if (mfReadOnlyAccessConditions(foo, &block[6])) { - PrintAndLogEx(WARNING, "Strict ReadOnly Access Conditions on block " _YELLOW_("%u") " detected", blockno - bar + 1 + foo); - ro_detected = true; - } - } - if (ro_detected) { - if (force) { - PrintAndLogEx(WARNING, " --force override, continuing..."); - } else { - PrintAndLogEx(INFO, "Exiting, please run `" _YELLOW_("hf mf acl -d %s") "` to understand", sprint_hex_inrow(&block[6], 3)); - PrintAndLogEx(INFO, "Use `" _YELLOW_("--force") "` to override and write this data"); - return PM3_EINVARG; - } - } else { - PrintAndLogEx(SUCCESS, "ST passed checks, continuing..."); - } + if (mf_analyse_st_block(blockno, block, force) != PM3_SUCCESS) { + return PM3_EINVARG; } PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); @@ -7560,73 +7572,47 @@ static int CmdHF14AGen4Save(const char *Cmd) { return PM3_SUCCESS; } -static int CmdHF14AGen4_GDM_GetBlk(const char *Cmd) { +static int CmdHF14AGen4_GDM_ConfigBlk(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "hf mf gdmgetblk", - "Get block data from magic gen4 GDM card.", - "hf mf gdmgetblk --blk 0 --> get block 0 (manufacturer)\n" - "hf mf gdmgetblk --blk 3 -v --> get block 3, decode sector trailer\n" + CLIParserInit(&ctx, "hf mf gdmconfig", + "Get configuration data from magic gen4 GDM card.", + "hf mf gdmconfig\n" ); void *argtable[] = { arg_param_begin, - arg_int1("b", "blk", "", "block number"), - arg_lit0("v", "verbose", "verbose output"), arg_str0("k", "key", "", "key 6 bytes"), arg_param_end }; - CLIExecWithReturn(ctx, Cmd, argtable, false); - int b = arg_get_int_def(ctx, 1, 0); - bool verbose = arg_get_lit(ctx, 2); + CLIExecWithReturn(ctx, Cmd, argtable, true); int keylen = 0; uint8_t key[6] = {0}; - CLIGetHexWithReturn(ctx, 3, key, &keylen); + CLIGetHexWithReturn(ctx, 1, key, &keylen); CLIParserFree(ctx); // validate args - if (b < 0 || b >= MIFARE_4K_MAXBLOCK) { - PrintAndLogEx(FAILED, "target block number out-of-range, got %i", b); - return PM3_EINVARG; - } - if (keylen != 6 && keylen != 0) { PrintAndLogEx(FAILED, "Must specify 6 bytes, got " _YELLOW_("%u"), keylen); return PM3_EINVARG; } - uint8_t blockno = (uint8_t)b; - PrintAndLogEx(NORMAL, "Block: %x", blockno) ; - struct p { - uint8_t blockno; - uint8_t keytype; uint8_t key[6]; } PACKED payload; - - payload.blockno = blockno; - payload.keytype = 0; memcpy(payload.key, key, sizeof(payload.key)); clearCommandBuffer(); - SendCommandNG(CMD_HF_MIFARE_G4_GDM_RDBL, (uint8_t *)&payload, sizeof(payload)); + SendCommandNG(CMD_HF_MIFARE_G4_GDM_CONFIG, (uint8_t *)&payload, sizeof(payload)); PacketResponseNG resp; - if (WaitForResponseTimeout(CMD_HF_MIFARE_G4_GDM_RDBL, &resp, 1500) == false) { + if (WaitForResponseTimeout(CMD_HF_MIFARE_G4_GDM_CONFIG, &resp, 1500) == false) { PrintAndLogEx(WARNING, "command execute timeout"); return PM3_ETIMEOUT; } if (resp.status == PM3_SUCCESS) { - uint8_t sector = mfSectorNum(blockno); - mf_print_sector_hdr(sector); - uint8_t *d = resp.data.asBytes; - mf_print_block_one(blockno, d, verbose); - - if (verbose) { - decode_print_st(blockno, d); - } else { - PrintAndLogEx(NORMAL, ""); - } + PrintAndLogEx(SUCCESS, "config... %s", sprint_hex(d, resp.length)); + PrintAndLogEx(NORMAL, ""); } return resp.status; @@ -7636,7 +7622,9 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf gdmsetblk", - "Set block data on a magic gen4 GDM card", + "Set block data on a magic gen4 GDM card\n" + "`--force` param is used to override warnings like bad ACL writes.\n" + " if not specified, it will exit if detected", "hf mf gdmsetblk --blk 1 -d 000102030405060708090a0b0c0d0e0f" ); void *argtable[] = { @@ -7644,8 +7632,9 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { arg_int1(NULL, "blk", "", "block number"), arg_lit0("a", NULL, "input key type is key A (def)"), arg_lit0("b", NULL, "input key type is key B"), - arg_str0("k", "key", "", "key, 6 hex bytes"), arg_str0("d", "data", "", "bytes to write, 16 hex bytes"), + arg_str0("k", "key", "", "key, 6 hex bytes"), + arg_lit0(NULL, "force", "override warnings"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -7661,13 +7650,15 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { keytype = MF_KEY_B;; } - int keylen = 0; - uint8_t key[6] = {0}; - CLIGetHexWithReturn(ctx, 4, key, &keylen); - uint8_t block[MFBLOCK_SIZE] = {0x00}; int blen = 0; - CLIGetHexWithReturn(ctx, 5, block, &blen); + CLIGetHexWithReturn(ctx, 4, block, &blen); + + int keylen = 0; + uint8_t key[6] = {0}; + CLIGetHexWithReturn(ctx, 5, key, &keylen); + + bool force = arg_get_lit(ctx, 6); CLIParserFree(ctx); if (blen != MFBLOCK_SIZE) { @@ -7687,6 +7678,10 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { uint8_t blockno = (uint8_t)b; + if (mf_analyse_st_block(blockno, block, force) != PM3_SUCCESS) { + return PM3_EINVARG; + } + PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); PrintAndLogEx(INFO, "data: %s", sprint_hex(block, sizeof(block))); @@ -7985,7 +7980,7 @@ static command_t CommandTable[] = { {"gsetblk", CmdHF14AGen4SetBlk, IfPm3Iso14443a, "Write block to card"}, {"gview", CmdHF14AGen4View, IfPm3Iso14443a, "View card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "-------------------- " _CYAN_("magic gen4 GDM") " --------------------------"}, - {"gdmgetblk", CmdHF14AGen4_GDM_GetBlk, IfPm3Iso14443a, "Read block from card"}, + {"gdmconfig", CmdHF14AGen4_GDM_ConfigBlk, IfPm3Iso14443a, "Read config block from card"}, {"gdmsetblk", CmdHF14AGen4_GDM_SetBlk, IfPm3Iso14443a, "Write block to card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("ndef") " -----------------------"}, // {"ice", CmdHF14AMfice, IfPm3Iso14443a, "collect MIFARE Classic nonces to file"}, diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 8071f7ea7..9f4be7376 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -540,9 +540,11 @@ This tag has simular commands to the [UFUID](#mifare-classic-directwrite-ufuid-v It seems to be developed by the same person. **OBS** + When writing to persistent memory it is possible to write _bad_ ACL and perm-brick the tag. **OBS** + It is possible to write a configuration that perma locks the tag, ie no more magic ### Identify @@ -579,6 +581,7 @@ Write config: 3. send 16 bytes **Warning** + Example of configuration to Perma lock tag: `85000000000000000000000000000008` @@ -596,7 +599,7 @@ It is unknown what kind of block 0 changes the tag supports hf mf gdmsetblk # Read 0xE0 configuration: -hf mf gdmgetblk +hf mf gdmconfig ``` diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index f490cc419..b99bb8430 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -689,6 +689,7 @@ typedef struct { // Gen 4 GDM magic cards #define CMD_HF_MIFARE_G4_GDM_RDBL 0x0870 #define CMD_HF_MIFARE_G4_GDM_WRBL 0x0871 +#define CMD_HF_MIFARE_G4_GDM_CONFIG 0x0872 #define CMD_UNKNOWN 0xFFFF diff --git a/include/protocols.h b/include/protocols.h index 8450dc58a..5900b377c 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -194,6 +194,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MIFARE_MAGIC_GDM_AUTH_KEYB 0x81 #define MIFARE_MAGIC_GDM_WRITEBLOCK 0xA8 #define MIFARE_MAGIC_GDM_READBLOCK 0xE0 +#define MIFARE_MAGIC_GDM_READBLOCK_1 0xE1 #define MIFARE_EV1_PERSONAL_UID 0x40 #define MIFARE_EV1_SETMODE 0x43 From 96bc2e7a1d13a6f6718f5f78dde969e065d3547a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 13:56:01 +0200 Subject: [PATCH 328/924] text --- doc/magic_cards_notes.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 9f4be7376..e90845c74 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -537,7 +537,7 @@ for example to write, you must use a customer authentication byte, 0x80, to aut Then send the data to be written. This tag has simular commands to the [UFUID](#mifare-classic-directwrite-ufuid-version) -It seems to be developed by the same person. +This indicates that both tagtypes are developed by the same person. **OBS** @@ -560,8 +560,8 @@ hf 14a info * Auth: `80xx`+crc * Write: `A8xx`+crc, `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`+crc -* Read config: `E000`+crc (unidentified) -* Write config: `E100`+crc +* Read config: `E000`+crc +* Write config: `E100`+crc, `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`+crc ### Characteristics ^[Top](#top) @@ -612,7 +612,7 @@ No implemented commands today **TODO** -* ZXUID, EUID, ICUID ? +* ZXUID, EUID, ICUID, KUID, HUID, RFUID ? * Some cards exhibit a specific SAK=28 ?? ## MIFARE Classic Super From 82f5c8512de36fee38b1e72643d24eac848f4958 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 13:58:27 +0200 Subject: [PATCH 329/924] mfc writes now support tear off --- armsrc/mifarecmd.c | 61 +++++++++++++++++++++++--------------------- armsrc/mifareutil.c | 26 +++++++++++-------- client/src/cmdhfmf.c | 41 +++++++++++++++++++---------- 3 files changed, 76 insertions(+), 52 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 9eb44da5a..0d14ffb92 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -453,7 +453,6 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { memcpy(blockdata, datain + 10, 16); // variables - uint8_t isOK = 0; uint8_t uid[10] = {0x00}; uint32_t cuid = 0; struct Crypto1State mpcs = {0, 0}; @@ -469,37 +468,39 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { LED_B_OFF(); LED_C_OFF(); - while (true) { - if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); - break; - }; + uint8_t retval = 0; - if (mifare_classic_auth(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Auth error"); - break; - }; + if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); + goto OUT; + }; - if (mifare_classic_writeblock(pcs, cuid, blockNo, blockdata)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); - break; - }; + if (mifare_classic_auth(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Auth error"); + goto OUT; + }; - if (mifare_classic_halt(pcs, cuid)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); - break; - }; - - isOK = 1; - break; + int res = mifare_classic_writeblock(pcs, cuid, blockNo, blockdata); + if (res == PM3_ETEAROFF) { + retval = PM3_ETEAROFF; + goto OUT; + } else if (res) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + retval = PM3_ESOFT; + goto OUT; } + if (mifare_classic_halt(pcs, cuid)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); + goto OUT; + }; + + retval = 1; + +OUT: crypto1_deinit(pcs); - if (g_dbglevel >= 2) DbpString("WRITE BLOCK FINISHED"); - - reply_mix(CMD_ACK, isOK, 0, 0, 0, 0); - + reply_mix(CMD_ACK, retval, 0, 0, 0, 0); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); set_tracing(false); @@ -549,18 +550,20 @@ void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t goto OUT; }; - if (mifare_classic_writeblock_ex(pcs, cuid, blockno, datain, true)) { + int res = mifare_classic_writeblock_ex(pcs, cuid, blockno, datain, true); + if (res == PM3_ETEAROFF) { + retval = PM3_ETEAROFF; + goto OUT; + } else if (res) { retval = PM3_ESOFT; goto OUT; - }; + } if (mifare_classic_halt(pcs, cuid)) { retval = PM3_ESOFT; goto OUT; }; - if (g_dbglevel >= 2) DbpString("WRITE BLOCK FINISHED"); - OUT: crypto1_deinit(pcs); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 11009031b..fd9260e23 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -18,6 +18,7 @@ //----------------------------------------------------------------------------- #include "mifareutil.h" +#include "appmain.h" // tearoff hook #include "string.h" #include "BigBuf.h" #include "iso14443a.h" @@ -451,18 +452,23 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t ReaderTransmitPar(d_block_enc, sizeof(d_block_enc), par, NULL); - // Receive the response - len = ReaderReceive(receivedAnswer, receivedAnswerPar); + // tearoff occurred + if (tearoff_hook() == PM3_ETEAROFF) { + return PM3_ETEAROFF; + } else { + // Receive the response + len = ReaderReceive(receivedAnswer, receivedAnswerPar); - uint8_t res = 0; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 0)) << 0; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 1)) << 1; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 2)) << 2; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; + uint8_t res = 0; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 0)) << 0; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 1)) << 1; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 2)) << 2; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; - if ((len != 1) || (res != 0x0A)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd send data2 Error: %02x", res); - return 2; + if ((len != 1) || (res != 0x0A)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd send data2 Error: %02x", res); + return 2; + } } return 0; } diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 0ba8aac98..8093c818d 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -628,10 +628,12 @@ static int CmdHF14AMfWrBl(const char *Cmd) { return PM3_ETIMEOUT; } - uint8_t isok = resp.oldarg[0] & 0xff; - if (isok) { + int status = resp.oldarg[0]; + if (status) { PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); PrintAndLogEx(HINT, "try `" _YELLOW_("hf mf rdbl") "` to verify"); + } else if (status == PM3_ETEAROFF) { + return status; } else { PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); // suggest the opposite keytype than what was used. @@ -7708,7 +7710,9 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { if (resp.status == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); PrintAndLogEx(HINT, "try `" _YELLOW_("hf mf rdbl") "` to verify"); - } else { + } else if (resp.status == PM3_ETEAROFF) { + return resp.status; + } else { PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); PrintAndLogEx(HINT, "Maybe access rights? Try specify keytype `" _YELLOW_("hf mf gdmsetblk -%c ...") "` instead", (keytype == MF_KEY_A) ? 'b' : 'a'); } @@ -7831,7 +7835,7 @@ static int CmdHF14AMfValue(const char *Cmd) { } if (action < 3) { - uint8_t isok = true; + if (g_session.pm3_present == false) return PM3_ENOTTY; @@ -7858,7 +7862,15 @@ static int CmdHF14AMfValue(const char *Cmd) { PrintAndLogEx(FAILED, "Command execute timeout"); return PM3_ETIMEOUT; } - isok = resp.oldarg[0] & 0xff; + + if (resp.oldarg[0] & 0xFF) { + // all ok so set flag to read current value + getval = true; + PrintAndLogEx(SUCCESS, "Update ( " _GREEN_("success") " )"); + } else { + PrintAndLogEx(FAILED, "Update ( " _RED_("failed") " )"); + } + } else { // set value // To set a value block (or setup) we can use the normal mifare classic write block // So build the command options can call CMD_HF_MIFARE_WRITEBL @@ -7883,14 +7895,17 @@ static int CmdHF14AMfValue(const char *Cmd) { PrintAndLogEx(FAILED, "Command execute timeout"); return PM3_ETIMEOUT; } - isok = resp.oldarg[0] & 0xff; - } - - if (isok) { - PrintAndLogEx(SUCCESS, "Update ... : " _GREEN_("success")); - getval = true; // all ok so set flag to read current value - } else { - PrintAndLogEx(FAILED, "Update ... : " _RED_("failed")); + int status = resp.oldarg[0]; + if (status) { + // all ok so set flag to read current value + getval = true; + PrintAndLogEx(SUCCESS, "Update ( " _GREEN_("success") " )"); + } else if (status == PM3_ETEAROFF) { + // all ok so set flag to read current value + getval = true; + } else { + PrintAndLogEx(FAILED, "Update ( " _RED_("failed") " )"); + } } } From fae8ffda4454a94e94affbcd31ebd8557c8dce34 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sun, 26 Mar 2023 16:12:39 +0300 Subject: [PATCH 330/924] Fix formatting and run make style --- armsrc/mifaredesfire.c | 12 +- client/src/cmddata.c | 24 +- client/src/cmdhfmf.c | 33 +- client/src/cmdhftesla.c | 2 +- client/src/cmdparser.c | 2 +- client/src/crypto/asn1dump.c | 24 +- client/src/emv/tlv.c | 2 +- client/src/mifare/mifarehost.c | 18 +- client/src/pm3line_vocabulory.h | 1510 ++++++++++++++++--------------- client/src/uart/uart_win32.c | 14 +- common/commonutil.c | 4 +- doc/commands.json | 170 +++- doc/commands.md | 9 +- 13 files changed, 949 insertions(+), 875 deletions(-) diff --git a/armsrc/mifaredesfire.c b/armsrc/mifaredesfire.c index 04de05f21..de2a76a6a 100644 --- a/armsrc/mifaredesfire.c +++ b/armsrc/mifaredesfire.c @@ -182,10 +182,10 @@ void MifareDesfireGetInformation(void) { return; } - if (len < sizeof(payload.versionHW)+1) { + if (len < sizeof(payload.versionHW) + 1) { Dbprintf("Tag answer to MFDES_GET_VERSION was too short: data in Hardware Information is probably invalid."); print_result("Answer", resp, len); - memset(resp+len, 0xFF, sizeof(payload.versionHW)+1 - len); // clear remaining bytes + memset(resp + len, 0xFF, sizeof(payload.versionHW) + 1 - len); // clear remaining bytes } memcpy(payload.versionHW, resp + 1, sizeof(payload.versionHW)); @@ -201,10 +201,10 @@ void MifareDesfireGetInformation(void) { return; } - if (len < sizeof(payload.versionSW)+1) { + if (len < sizeof(payload.versionSW) + 1) { Dbprintf("Tag answer to MFDES_ADDITIONAL_FRAME 1 was too short: data in Software Information is probably invalid."); print_result("Answer", resp, len); - memset(resp+len, 0xFF, sizeof(payload.versionSW)+1 - len); // clear remaining bytes + memset(resp + len, 0xFF, sizeof(payload.versionSW) + 1 - len); // clear remaining bytes } memcpy(payload.versionSW, resp + 1, sizeof(payload.versionSW)); @@ -219,10 +219,10 @@ void MifareDesfireGetInformation(void) { return; } - if (len < sizeof(payload.details)+1) { + if (len < sizeof(payload.details) + 1) { Dbprintf("Tag answer to MFDES_ADDITIONAL_FRAME 2 was too short: data in Batch number and Production date is probably invalid"); print_result("Answer", resp, len); - memset(resp+len, 0xFF, sizeof(payload.details)+1 - len); // clear remaining bytes + memset(resp + len, 0xFF, sizeof(payload.details) + 1 - len); // clear remaining bytes } memcpy(payload.details, resp + 1, sizeof(payload.details)); diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 3d153022d..9524cbc63 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -36,7 +36,7 @@ #include "crypto/asn1utils.h" // ASN1 decode / print #include "cmdflashmemspiffs.h" // SPIFFS flash memory download #include "mbedtls/bignum.h" // big num -#include "mbedtls/entropy.h" // +#include "mbedtls/entropy.h" // #include "mbedtls/ctr_drbg.h" // random generator uint8_t g_DemodBuffer[MAX_DEMOD_BUF_LEN]; @@ -2429,7 +2429,7 @@ static int CmdZerocrossings(const char *Cmd) { } static bool data_verify_hex(uint8_t *d, size_t n) { - if (d == NULL) + if (d == NULL) return false; for (size_t i = 0; i < n; i++) { @@ -2517,7 +2517,7 @@ static int Cmdhex2bin(const char *Cmd) { return PM3_EINVARG; } - if (data_verify_hex((uint8_t*)data, dlen) == false) { + if (data_verify_hex((uint8_t *)data, dlen) == false) { return PM3_EINVARG; } @@ -3230,7 +3230,7 @@ static int CmdNumCon(const char *Cmd) { // hex if (hlen > 0) { - if (data_verify_hex((uint8_t*)hex, hlen) == false) { + if (data_verify_hex((uint8_t *)hex, hlen) == false) { return PM3_EINVARG; } MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&N, 16, hex)); @@ -3257,22 +3257,22 @@ static int CmdNumCon(const char *Cmd) { MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&N, &N, &base)); } - // printing + // printing typedef struct { - const char* desc; + const char *desc; uint8_t radix; } radix_t; radix_t radix[] = { - {"dec..... ", 10}, - {"hex..... 0x", 16}, - {"bin..... 0b", 2} + {"dec..... ", 10}, + {"hex..... 0x", 16}, + {"bin..... 0b", 2} }; char s[600] = {0}; size_t slen = 0; - for (uint8_t i=0; i < ARRAYLEN(radix); i++) { + for (uint8_t i = 0; i < ARRAYLEN(radix); i++) { MBEDTLS_MPI_CHK(mbedtls_mpi_write_string(&N, radix[i].radix, s, sizeof(s), &slen)); if (slen > 0) { PrintAndLogEx(INFO, "%s%s", radix[i].desc, s); @@ -3285,9 +3285,9 @@ static int CmdNumCon(const char *Cmd) { mbedtls_ctr_drbg_init(&ctr_drbg); mbedtls_entropy_init(&entropy); - MBEDTLS_MPI_CHK(mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0 )); + MBEDTLS_MPI_CHK(mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0)); - res = mbedtls_mpi_is_prime_ext( &N, 50, mbedtls_ctr_drbg_random, &ctr_drbg ); + res = mbedtls_mpi_is_prime_ext(&N, 50, mbedtls_ctr_drbg_random, &ctr_drbg); if (res == 0) { PrintAndLogEx(INFO, "prime... " _YELLOW_("yes")); } diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 51d6ccddb..828666a57 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -404,7 +404,7 @@ static void mf_analyse_acl(uint16_t n, uint8_t *d) { Sector trailer sanity checks. Warn if ACL is strict read-only, or invalid ACL. */ -static int mf_analyse_st_block(uint8_t blockno, uint8_t *block, bool force){ +static int mf_analyse_st_block(uint8_t blockno, uint8_t *block, bool force) { if (mfIsSectorTrailer(blockno) == false) { return PM3_SUCCESS; @@ -6665,10 +6665,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { int res = mfkey32_moebius(&data, &key64); if (res) { - PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " - _GREEN_("%012" - PRIX64) " ]", sprint_hex_inrow(trace_data, 4), data.sector, (data.keytype == 0x60) ? 'A' - : 'B', key64); + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ "_GREEN_("%012" PRIX64) " ]", sprint_hex_inrow(trace_data, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); break; } } @@ -6694,16 +6691,12 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { res = ExchangeAPDU14a(aCHANGE, sizeof(aCHANGE), activate_field, keep_field_on, response, sizeof(response), &resplen); if (res != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Super card UID change [ " - _RED_("fail") - " ]"); + PrintAndLogEx(FAILED, "Super card UID change [ " _RED_("fail") " ]"); DropField(); return res; } - PrintAndLogEx(SUCCESS, "Super card UID change ( " - _GREEN_("ok") - " )"); + PrintAndLogEx(SUCCESS, "Super card UID change ( " _GREEN_("ok") " )"); return PM3_SUCCESS; } @@ -6717,15 +6710,11 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { res = ExchangeAPDU14a(aRESET, sizeof(aRESET), activate_field, keep_field_on, response, sizeof(response), &resplen); if (res != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Super card reset [ " - _RED_("fail") - " ]"); + PrintAndLogEx(FAILED, "Super card reset [ " _RED_("fail") " ]"); DropField(); return res; } - PrintAndLogEx(SUCCESS, "Super card reset ( " - _GREEN_("ok") - " )"); + PrintAndLogEx(SUCCESS, "Super card reset ( " _GREEN_("ok") " )"); return PM3_SUCCESS; } @@ -6813,13 +6802,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { res = mfkey32_moebius(&data, &key64); if (res) { - PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " - _GREEN_("%12" - PRIX64) " ]" - , sprint_hex_inrow(outA, 4) - , data.sector - , (data.keytype == 0x60) ? 'A' : 'B' - , key64); + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%12" PRIX64) " ]", sprint_hex_inrow(outA, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); } else { PrintAndLogEx(FAILED, "failed to recover any key"); } @@ -8093,7 +8076,7 @@ static command_t CommandTable[] = { {"gsave", CmdHF14AGen4Save, IfPm3Iso14443a, "Save dump from card into file or emulator"}, {"gsetblk", CmdHF14AGen4SetBlk, IfPm3Iso14443a, "Write block to card"}, {"gview", CmdHF14AGen4View, IfPm3Iso14443a, "View card"}, - {"-----------", CmdHelp, IfPm3Iso14443a, "-------------------- " _CYAN_("magic gen4 GDM") " --------------------------"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "-------------------- " _CYAN_("magic gen4 GDM") " --------------------------"}, {"gdmconfig", CmdHF14AGen4_GDM_ConfigBlk, IfPm3Iso14443a, "Read config block from card"}, {"gdmsetblk", CmdHF14AGen4_GDM_SetBlk, IfPm3Iso14443a, "Write block to card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("ndef") " -----------------------"}, diff --git a/client/src/cmdhftesla.c b/client/src/cmdhftesla.c index 32b9872e8..e1687a170 100644 --- a/client/src/cmdhftesla.c +++ b/client/src/cmdhftesla.c @@ -271,4 +271,4 @@ static int CmdHelp(const char *Cmd) { int CmdHFTESLA(const char *Cmd) { clearCommandBuffer(); return CmdsParse(CommandTable, Cmd); -} \ No newline at end of file +} diff --git a/client/src/cmdparser.c b/client/src/cmdparser.c index 39a6c98ad..fe7243c5e 100644 --- a/client/src/cmdparser.c +++ b/client/src/cmdparser.c @@ -386,7 +386,7 @@ void dumpCommandsRecursive(const command_t cmds[], int markdown, bool full_help) char currentparent[MAX_PM3_INPUT_ARGS_LENGTH] = {0}; snprintf(currentparent, sizeof currentparent, "%s%s ", parent, cmds[i].Name); - + char *old_parent = parent; parent = currentparent; // This is what causes the recursion, since commands Parse-implementation diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index 8445b4cd4..5fcabe20a 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -141,7 +141,7 @@ static void asn1_tag_dump_str_time(const struct tlv *tlv, const struct asn1_tag break; // month - PrintAndLogEx(NORMAL, "%.*s-" NOLF, 2, tlv->value + startidx ); + PrintAndLogEx(NORMAL, "%.*s-" NOLF, 2, tlv->value + startidx); if (len < startidx + 4) break; @@ -233,16 +233,16 @@ static void asn1_tag_dump_hex(const struct tlv *tlv, const struct asn1_tag *tag, } static void asn1_tag_dump_octet_string(const struct tlv *tlv, const struct asn1_tag *tag, int level) { -/* - for (size_t i = 0; i < tlv->len; i++) { - if (!isspace(tlv->value[i]) && !isprint(tlv->value[i])) { - *needdump = true; - break; + /* + for (size_t i = 0; i < tlv->len; i++) { + if (!isspace(tlv->value[i]) && !isprint(tlv->value[i])) { + *needdump = true; + break; + } } - } - */ - PrintAndLogEx(NORMAL, " " NOLF); - asn1_tag_dump_string(tlv, tag, level); + */ + PrintAndLogEx(NORMAL, " " NOLF); + asn1_tag_dump_string(tlv, tag, level); } static void asn1_tag_dump_boolean(const struct tlv *tlv, const struct asn1_tag *tag, int level) { @@ -262,7 +262,7 @@ static void asn1_tag_dump_integer(const struct tlv *tlv, const struct asn1_tag * return; } - hex_to_buffer((uint8_t*)hex, tlv->value, tlv->len, tlv->len, 0, 0, false); + hex_to_buffer((uint8_t *)hex, tlv->value, tlv->len, tlv->len, 0, 0, false); // results for MPI actions bool ret = false; @@ -277,7 +277,7 @@ static void asn1_tag_dump_integer(const struct tlv *tlv, const struct asn1_tag * size_t slen = 0; MBEDTLS_MPI_CHK(mbedtls_mpi_write_string(&N, 10, s, sizeof(s), &slen)); if (slen > 0) { - PrintAndLogEx(NORMAL, "%*s value: %s", (level ), "", s); + PrintAndLogEx(NORMAL, "%*s value: %s", (level), "", s); } cleanup: diff --git a/client/src/emv/tlv.c b/client/src/emv/tlv.c index f025fbe27..737300fe0 100644 --- a/client/src/emv/tlv.c +++ b/client/src/emv/tlv.c @@ -227,7 +227,7 @@ struct tlvdb *tlvdb_parse_multi(const unsigned char *buf, size_t len) { while (left != 0) { struct tlvdb *db = calloc(1, sizeof(*db)); - if (db == NULL ) { + if (db == NULL) { goto err; } diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index a897a507e..d8390b3f5 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1512,16 +1512,16 @@ int vigik_verify(mfc_vigik_t *d) { PrintAndLogEx(INFO, "Raw signature"); print_hex_noascii_break(d->rsa_signature, sizeof(d->rsa_signature), MFBLOCK_SIZE * 2); } - -/* - int dl = 0; - - param_gethex_to_eol("1C07D46DA3849326D24B3468BD76673F4F3C41827DC413E81E4F3C7804FAC727213059B21D047510D6432448643A92EBFC67FBEDDAB468D13D948B172F5EBC79A0E3FEFDFAF4E81FC7108E070F1E3CD0", 0, signature, PUBLIC_VIGIK_KEYLEN, &dl); - param_gethex_to_eol("1AB86FE0C17FFFFE4379D5E15A4B2FAFFEFCFA0F1F3F7FA03E7DDDF1E3C78FFFB1F0E23F7FFF51584771C5C18307FEA36CA74E60AA6B0409ACA66A9EC155F4E9112345708A2B8457E722608EE1157408", 0, signature, PUBLIC_VIGIK_KEYLEN, &dl); - signature_len = dl; - */ - + /* + int dl = 0; + + param_gethex_to_eol("1C07D46DA3849326D24B3468BD76673F4F3C41827DC413E81E4F3C7804FAC727213059B21D047510D6432448643A92EBFC67FBEDDAB468D13D948B172F5EBC79A0E3FEFDFAF4E81FC7108E070F1E3CD0", 0, signature, PUBLIC_VIGIK_KEYLEN, &dl); + + param_gethex_to_eol("1AB86FE0C17FFFFE4379D5E15A4B2FAFFEFCFA0F1F3F7FA03E7DDDF1E3C78FFFB1F0E23F7FFF51584771C5C18307FEA36CA74E60AA6B0409ACA66A9EC155F4E9112345708A2B8457E722608EE1157408", 0, signature, PUBLIC_VIGIK_KEYLEN, &dl); + signature_len = dl; + */ + uint8_t rev_sig[128]; reverse_array_copy(d->rsa_signature, sizeof(d->rsa_signature), rev_sig); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 2b42cf4fd..e6d6dc438 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,758 +31,762 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 0, "emv exec" }, - { 0, "emv pse" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 0, "emv gpo" }, - { 0, "emv readrec" }, - { 0, "emv genac" }, - { 0, "emv challenge" }, - { 0, "emv intauth" }, - { 0, "emv scan" }, - { 1, "emv test" }, - { 1, "emv list" }, - { 0, "emv roca" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 0, "hf mfp info" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp ndefread" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu tamper" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 0, "hf topaz dump" }, - { 1, "hf topaz list" }, - { 0, "hf topaz info" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 brute" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag cc" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data num" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 0, "emv exec" }, + { 0, "emv pse" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 0, "emv gpo" }, + { 0, "emv readrec" }, + { 0, "emv genac" }, + { 0, "emv challenge" }, + { 0, "emv intauth" }, + { 0, "emv scan" }, + { 1, "emv test" }, + { 1, "emv list" }, + { 0, "emv roca" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 0, "hf legic einfo" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf gdmconfig" }, + { 0, "hf mf gdmsetblk" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 0, "hf mfp info" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp ndefread" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu tamper" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 0, "hf topaz dump" }, + { 1, "hf topaz list" }, + { 0, "hf topaz info" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 0, "lf hitag eload" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag reader" }, + { 0, "lf hitag sim" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag writer" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag cc" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -790,4 +794,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif +#endif \ No newline at end of file diff --git a/client/src/uart/uart_win32.c b/client/src/uart/uart_win32.c index cd610c8fa..9cdcc41d1 100644 --- a/client/src/uart/uart_win32.c +++ b/client/src/uart/uart_win32.c @@ -126,7 +126,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { struct addrinfo info; int iResult; - iResult = WSAStartup(MAKEWORD(2,2), &wsaData); + iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { PrintAndLogEx(ERR, "error: WSAStartup failed with error: %d", iResult); free(sp); @@ -231,7 +231,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { void uart_close(const serial_port sp) { serial_port_windows_t *spw = (serial_port_windows_t *)sp; - if (spw->hSocket != INVALID_SOCKET){ + if (spw->hSocket != INVALID_SOCKET) { shutdown(spw->hSocket, SD_BOTH); closesocket(spw->hSocket); WSACleanup(); @@ -294,8 +294,7 @@ int uart_receive(const serial_port sp, uint8_t *pbtRx, uint32_t pszMaxRxLen, uin } return PM3_ENOTTY; - } - else { // TCP + } else { // TCP uint32_t byteCount; // FIONREAD returns size on 32b fd_set rfds; struct timeval tv; @@ -332,12 +331,12 @@ int uart_receive(const serial_port sp, uint8_t *pbtRx, uint32_t pszMaxRxLen, uin // Retrieve the count of the incoming bytes res = ioctlsocket(spw->hSocket, FIONREAD, (u_long *)&byteCount); - // PrintAndLogEx(ERR, "UART:: RX ioctl res %d byteCount %u", res, byteCount); + // PrintAndLogEx(ERR, "UART:: RX ioctl res %d byteCount %u", res, byteCount); if (res == SOCKET_ERROR) return PM3_ENOTTY; // Cap the number of bytes, so we don't overrun the buffer if (pszMaxRxLen - (*pszRxLen) < byteCount) { - // PrintAndLogEx(ERR, "UART:: RX prevent overrun (have %u, need %u)", pszMaxRxLen - (*pszRxLen), byteCount); + // PrintAndLogEx(ERR, "UART:: RX prevent overrun (have %u, need %u)", pszMaxRxLen - (*pszRxLen), byteCount); byteCount = pszMaxRxLen - (*pszRxLen); } @@ -374,8 +373,7 @@ int uart_send(const serial_port sp, const uint8_t *p_tx, const uint32_t len) { return PM3_EIO; } return PM3_ENOTTY; - } - else { // TCP + } else { // TCP uint32_t pos = 0; fd_set wfds; struct timeval tv; diff --git a/common/commonutil.c b/common/commonutil.c index c346d7bf7..4af16b3c0 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -280,7 +280,7 @@ void reverse_array(uint8_t *d, size_t n) { d[i] ^= d[j]; d[j] ^= d[i]; d[i] ^= d[j]; - } + } } // reverse src array into dest array @@ -292,4 +292,4 @@ void reverse_array_copy(const uint8_t *src, int src_len, uint8_t *dest) { for (int i = 0; i < src_len; i++) { dest[i] = src[(src_len - 1) - i]; } -} \ No newline at end of file +} diff --git a/doc/commands.json b/doc/commands.json index 636fdf50a..4ef1ec680 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -406,7 +406,7 @@ }, "data help": { "command": "data help", - "description": "help This help ----------- ------------------------- Modulation------------------------- biphaserawdecode Biphase decode bin stream in DemodBuffer detectclock Detect ASK, FSK, NRZ, PSK clock rate of wave in GraphBuffer fsktonrz Convert fsk2 to nrz wave for alternate fsk demodulating (for weak fsk) manrawdecode Manchester decode binary stream in DemodBuffer modulation Identify LF signal for clock and modulation rawdemod Demodulate the data in the GraphBuffer and output binary ----------- ------------------------- Graph------------------------- askedgedetect Adjust Graph for manual ASK demod using the length of sample differences to detect the edge of a wave autocorr Autocorrelation over window dirthreshold Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev. decimate Decimate samples undecimate Un-decimate samples hide Hide graph window hpf Remove DC offset from trace iir Apply IIR buttersworth filter on plot data grid overlay grid on graph window ltrim Trim samples from left of trace mtrim Trim out samples from the specified start to the specified stop norm Normalize max/min to +/-128 plot Show graph window rtrim Trim samples from right of trace setgraphmarkers Set blue and orange marker in graph window shiftgraphzero Shift 0 for Graphed wave + or - shift value timescale Set a timescale to get a differential reading between the yellow and purple markers as time duration zerocrossings Count time between zero-crossings convertbitstream Convert GraphBuffer's 0/1 values to 127 / -127 getbitstream Convert GraphBuffer's >=1 values to 1 and <1 to 0 ----------- ------------------------- General------------------------- asn1 asn1 decoder bin2hex Converts binary to hexadecimal clear Clears bigbuf on deviceside and graph window diff diff of input files hex2bin Converts hexadecimal to binary load Load contents of file into graph window print Print the data in the DemodBuffer save Save signal trace data (from graph window) setdebugmode Set Debugging Level on client side", + "description": "help This help ----------- ------------------------- Modulation------------------------- biphaserawdecode Biphase decode bin stream in DemodBuffer detectclock Detect ASK, FSK, NRZ, PSK clock rate of wave in GraphBuffer fsktonrz Convert fsk2 to nrz wave for alternate fsk demodulating (for weak fsk) manrawdecode Manchester decode binary stream in DemodBuffer modulation Identify LF signal for clock and modulation rawdemod Demodulate the data in the GraphBuffer and output binary ----------- ------------------------- Graph------------------------- askedgedetect Adjust Graph for manual ASK demod using the length of sample differences to detect the edge of a wave autocorr Autocorrelation over window dirthreshold Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev. decimate Decimate samples undecimate Un-decimate samples hide Hide graph window hpf Remove DC offset from trace iir Apply IIR buttersworth filter on plot data grid overlay grid on graph window ltrim Trim samples from left of trace mtrim Trim out samples from the specified start to the specified stop norm Normalize max/min to +/-128 plot Show graph window rtrim Trim samples from right of trace setgraphmarkers Set blue and orange marker in graph window shiftgraphzero Shift 0 for Graphed wave + or - shift value timescale Set a timescale to get a differential reading between the yellow and purple markers as time duration zerocrossings Count time between zero-crossings convertbitstream Convert GraphBuffer's 0/1 values to 127 / -127 getbitstream Convert GraphBuffer's >=1 values to 1 and <1 to 0 ----------- ------------------------- General------------------------- asn1 asn1 decoder bin2hex Converts binary to hexadecimal clear Clears bigbuf on deviceside and graph window diff diff of input files hex2bin Converts hexadecimal to binary load Load contents of file into graph window num Converts dec/hex/bin print Print the data in the DemodBuffer save Save signal trace data (from graph window) setdebugmode Set Debugging Level on client side", "notes": [], "offline": true, "options": [], @@ -557,6 +557,23 @@ ], "usage": "data norm [-h]" }, + "data num": { + "command": "data num", + "description": "Function takes a decimal or hexdecimal number and print it in decimal/hex/binary Will print message if number is a prime number", + "notes": [ + "data num --dec 2023", + "data num --hex 0x1000" + ], + "offline": true, + "options": [ + "-h, --help This help", + "--dec decimal value", + "--hex hexadecimal value", + "--bin binary value", + "-i print inverted value" + ], + "usage": "data num [-hi] [--dec ] [--hex ] [--bin ]" + }, "data plot": { "command": "data plot", "description": "Show graph window hit 'h' in window for detail keystroke help available", @@ -3597,6 +3614,18 @@ ], "usage": "hf legic dump [-h] [-f ] [--de]" }, + "hf legic einfo": { + "command": "hf legic einfo", + "description": "It decodes and displays emulator memory", + "notes": [ + "hf legic einfo" + ], + "offline": false, + "options": [ + "-h, --help This help" + ], + "usage": "hf legic einfo [-h]" + }, "hf legic eload": { "command": "hf legic eload", "description": "Loads a LEGIC Prime dump file into emulator memory", @@ -3649,7 +3678,7 @@ }, "hf legic help": { "command": "hf legic help", - "description": "----------- --------------------- operations --------------------- help This help list List LEGIC history ----------- --------------------- simulation --------------------- ----------- --------------------- utils --------------------- crc Calculate Legic CRC over given bytes view Display content from tag dump file", + "description": "----------- --------------------- operations --------------------- help This help list List LEGIC history ----------- --------------------- simulation --------------------- ----------- --------------------- utils --------------------- crc Calculate Legic CRC over given bytes view Display deobfuscated and decoded content from tag dump file", "notes": [], "offline": true, "options": [], @@ -4371,6 +4400,37 @@ ], "usage": "hf mf fchk [-h] [-k ]... [--mini] [--1k] [--2k] [--4k] [--emu] [--dump] [--mem] [-f ]" }, + "hf mf gdmconfig": { + "command": "hf mf gdmconfig", + "description": "Get configuration data from magic gen4 GDM card.", + "notes": [ + "hf mf gdmconfig" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-k, --key key 6 bytes" + ], + "usage": "hf mf gdmconfig [-h] [-k ]" + }, + "hf mf gdmsetblk": { + "command": "hf mf gdmsetblk", + "description": "Set block data on a magic gen4 GDM card `--force` param is used to override warnings like bad ACL writes. if not specified, it will exit if detected", + "notes": [ + "hf mf gdmsetblk --blk 1 -d 000102030405060708090a0b0c0d0e0f" + ], + "offline": false, + "options": [ + "-h, --help This help", + "--blk block number", + "-a input key type is key A (def)", + "-b input key type is key B", + "-d, --data bytes to write, 16 hex bytes", + "-k, --key key, 6 hex bytes", + "--force override warnings" + ], + "usage": "hf mf gdmsetblk [-hab] --blk [-d ] [-k ] [--force]" + }, "hf mf gen3blk": { "command": "hf mf gen3blk", "description": "Overwrite full manufacturer block for magic Gen3 card - You can specify part of manufacturer block as 4/7-bytes for UID change only", @@ -4822,15 +4882,17 @@ "command": "hf mf supercard", "description": "Extract info from a `super card`", "notes": [ - "hf mf supercard" + "hf mf supercard -> recover key", + "hf mf supercard -r -> reset card", + "hf mf supercard -u 11223344 -> change UID" ], "offline": false, "options": [ "-h, --help This help", - "-r, --reset Reset card", - "-u, --uid Change UID" + "-r, --reset reset card", + "-u, --uid New UID (4 hex bytes)" ], - "usage": "hf mf supercard [-hru]" + "usage": "hf mf supercard [-hr] [-u ]" }, "hf mf value": { "command": "hf mf value", @@ -4958,7 +5020,7 @@ "but for APP keys crypto algorithm is set by createapp command and can't be changed wo application delete", "", "hf mfdes changekey --aid 123456 -> execute with default factory setup. change des key 0 in the app 123456 from 00..00 to 00..00", - "hf mfdes changekey --isoid df01 -t aes -s lrp --newkeyno 01 -> change key 01 via lrp channelhf mfdes changekey -t des --newalgo aes --newkey 11223344556677889900112233445566 --newver a5 -> change card master key to AES one", + "hf mfdes changekey --isoid df01 -t aes --schann lrp --newkeyno 01 -> change key 01 via lrp channelhf mfdes changekey -t des --newalgo aes --newkey 11223344556677889900112233445566 --newver a5 -> change card master key to AES one", "hf mfdes changekey --aid 123456 -t aes --key 00000000000000000000000000000000 --newkey 11223344556677889900112233445566 -> change app master key", "hf mfdes changekey --aid 123456 -t des -n 0 --newkeyno 1 --oldkey 5555555555555555 --newkey 1122334455667788 -> change key 1 with auth from key 0", "hf mfdes changekey --aid 123456 -t 3tdea --newkey 112233445566778899001122334455667788990011223344 -> change 3tdea key 0 from default 00..00 to provided" @@ -4994,7 +5056,7 @@ "hf mfdes chfilesettings --aid 123456 --fid 01 --amode plain --rrights free --wrights free --rwrights free --chrights key0 -> change file settings app=123456, file=01 with defaults from `default` command", "hf mfdes chfilesettings -n 0 -t des -k 0000000000000000 --kdf none --aid 123456 --fid 01 --rawdata 00EEEE -> execute with default factory setup", "hf mfdes chfilesettings --aid 123456 --fid 01 --rawdata 810000021f112f22 -> change file settings with additional rights for keys 1 and 2", - "hf mfdes chfilesettings --isoid df01 --fid 00 --amode plain --rawrights eee0 -s lrp -t aes -> change file settings via lrp channel" + "hf mfdes chfilesettings --isoid df01 --fid 00 --amode plain --rawrights eee0 --schann lrp -t aes -> change file settings via lrp channel" ], "offline": false, "options": [ @@ -5080,7 +5142,7 @@ "description": "Clear record file. Master key needs to be provided or flag --no-auth set (depend on cards settings).", "notes": [ "hf mfdes clearrecfile --aid 123456 --fid 01 -> clear record file for: app=123456, file=01 with defaults from `default` command", - "hf mfdes clearrecfile --isoid df01 --fid 01 -s lrp -t aes -n 3 -> clear record file for lrp channel with key number 3" + "hf mfdes clearrecfile --isoid df01 --fid 01 --schann lrp -t aes -n 3 -> clear record file for lrp channel with key number 3" ], "offline": false, "options": [ @@ -5218,8 +5280,8 @@ "hf mfdes createmacfile --aid 123456 --fid 01 --rawrights 0FF0 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file with parameters. Rights from default. Authentication with defaults from `default` command", "hf mfdes createmacfile --aid 123456 --fid 01 --amode plain --rrights free --wrights deny --rwrights free --chrights key0 --mackey 00112233445566778899aabbccddeeff -> create file app=123456, file=01, with key, and mentioned rights with defaults from `default` command", "hf mfdes createmacfile -n 0 -t des -k 0000000000000000 --kdf none --aid 123456 --fid 01 -> execute with default factory setup. key and keyver == 0x00..00", - "hf mfdes createmacfile --isoid df01 --fid 0f -s lrp -t aes --rawrights 0FF0 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file via lrp channel", - "hf mfdes createmacfile --isoid df01 --fid 0f -s lrp -t aes --rawrights 0F10 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file via lrp channel with CommitReaderID command enable" + "hf mfdes createmacfile --isoid df01 --fid 0f --schann lrp -t aes --rawrights 0FF0 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file via lrp channel", + "hf mfdes createmacfile --isoid df01 --fid 0f --schann lrp -t aes --rawrights 0F10 --mackey 00112233445566778899aabbccddeeff --mackeyver 01 -> create transaction mac file via lrp channel with CommitReaderID command enable" ], "offline": false, "options": [ @@ -5375,7 +5437,7 @@ "description": "Delete file from application. Master key needs to be provided or flag --no-auth set (depend on cards settings).", "notes": [ "hf mfdes deletefile --aid 123456 --fid 01 -> delete file for: app=123456, file=01 with defaults from `default` command", - "hf mfdes deletefile --isoid df01 --fid 0f -s lrp -t aes -> delete file for lrp channel" + "hf mfdes deletefile --isoid df01 --fid 0f --schann lrp -t aes -> delete file for lrp channel" ], "offline": false, "options": [ @@ -5431,7 +5493,7 @@ "command": "hf mfdes dump", "description": "For each application show fil list and then file content. Key needs to be provided for authentication or flag --no-auth set (depend on cards settings).", "notes": [ - "hf mfdes dump --aid 123456 -> show file dump for: app=123456 with channel defaults from `default` command/nhf mfdes dump --isoid df01 -s lrp -t aes --length 000090 -> lrp default settings with length limit" + "hf mfdes dump --aid 123456 -> show file dump for: app=123456 with channel defaults from `default` command/nhf mfdes dump --isoid df01 --schann lrp -t aes --length 000090 -> lrp default settings with length limit" ], "offline": false, "options": [ @@ -5578,7 +5640,7 @@ "hf mfdes getfileisoids --aid 123456 -> execute with defaults from `default` command", "hf mfdes getfileisoids -n 0 -t des -k 0000000000000000 --kdf none --aid 123456 -> execute with default factory setup", "hf mfdes getfileisoids --isoid df01 -> get iso file ids from Desfire Light with factory card settings", - "hf mfdes getfileisoids --isoid df01 -s lrp -t aes -> get iso file ids from Desfire Light via lrp channel with default key authentication" + "hf mfdes getfileisoids --isoid df01 --schann lrp -t aes -> get iso file ids from Desfire Light via lrp channel with default key authentication" ], "offline": false, "options": [ @@ -5686,7 +5748,7 @@ "description": "Get UID from card. Get the real UID if the random UID bit is on and get the same UID as in anticollision if not. Any card's key needs to be provided.", "notes": [ "hf mfdes getuid -> execute with default factory setup", - "hf mfdes getuid --isoid df01 -t aes -s lrp -> for desfire lights default settings" + "hf mfdes getuid --isoid df01 -t aes --schan lrp -> for desfire lights default settings" ], "offline": false, "options": [ @@ -5843,8 +5905,8 @@ "hf mfdes read --isoid 0102 --fileisoid 1000 --type data -c iso -> read file via ISO channel: app iso id=0102, iso id=1000, offset=0. Select via ISO commands", "hf mfdes read --isoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000001 -> get one record (number 5) from file 1100 via iso commands", "hf mfdes read --isoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000000 -> get all record (from 5 to 1) from file 1100 via iso commands", - "hf mfdes read --isoid df01 --fid 00 -s lrp -t aes --length 000010 -> read via lrp channel", - "hf mfdes read --isoid df01 --fid 00 -s ev2 -t aes --length 000010 --isochain -> read Desfire Light via ev2 channel" + "hf mfdes read --isoid df01 --fid 00 --schann lrp -t aes --length 000010 -> read via lrp channel", + "hf mfdes read --isoid df01 --fid 00 --schann ev2 -t aes --length 000010 --isochain -> read Desfire Light via ev2 channel" ], "offline": false, "options": [ @@ -5922,9 +5984,9 @@ "", "hf mfdes setconfig --param 03 --data 0428 -> set SAK", "hf mfdes setconfig --param 02 --data 0875778102637264 -> set ATS (first byte - length)", - "hf mfdes setconfig --isoid df01 -t aes -s ev2 --param 05 --data 00000000020000000000 -> set LRP mode enable for Desfire Light", - "hf mfdes setconfig --isoid df01 -t aes -s ev2 --param 0a --data 00ffffffff -> Disable failed auth counters for Desfire Light", - "hf mfdes setconfig --isoid df01 -t aes -s lrp --param 0a --data 00ffffffff -> Disable failed auth counters for Desfire Light via lrp" + "hf mfdes setconfig --isoid df01 -t aes --schann ev2 --param 05 --data 00000000020000000000 -> set LRP mode enable for Desfire Light", + "hf mfdes setconfig --isoid df01 -t aes --schann ev2 --param 0a --data 00ffffffff -> Disable failed auth counters for Desfire Light", + "hf mfdes setconfig --isoid df01 -t aes --schann lrp --param 0a --data 00ffffffff -> Disable failed auth counters for Desfire Light via lrp" ], "offline": false, "options": [ @@ -5965,8 +6027,8 @@ "hf mfdes value --aid 123456 --fid 01 -> get value app=123456, file=01 with defaults from `default` command", "hf mfdes value --aid 123456 --fid 01 --op credit -d 00000001 -> credit value app=123456, file=01 with defaults from `default` command", "hf mfdes value -n 0 -t des -k 0000000000000000 --kdf none --aid 123456 --fid 01 -> get value with default factory setup", - "hf mfdes val --isoid df01 --fid 03 -s lrp -t aes -n 1 --op credit --d 00000001 -m encrypt -> credit value in the lrp encrypted mode", - "hf mfdes val --isoid df01 --fid 03 -s lrp -t aes -n 1 --op get -m plain -> get value in plain (nevertheless of mode) works for desfire light (look SetConfiguration option 0x09)" + "hf mfdes val --isoid df01 --fid 03 --schann lrp -t aes -n 1 --op credit --d 00000001 -m encrypt -> credit value in the lrp encrypted mode", + "hf mfdes val --isoid df01 --fid 03 --schann lrp -t aes -n 1 --op get -m plain -> get value in plain (nevertheless of mode) works for desfire light (look SetConfiguration option 0x09)" ], "offline": false, "options": [ @@ -6008,7 +6070,7 @@ "hf mfdes write --isoid 1234 --fileisoid 1000 --type data -c iso -d 01020304 -> write data to std/backup file via iso commandset", "hf mfdes write --isoid 1234 --fileisoid 2000 --type record -c iso -d 01020304 -> send record to record file via iso commandset", "hf mfdes write --aid 123456 --fid 01 -d 01020304 --readerid 010203 -> write data to file with CommitReaderID command before write and CommitTransaction after write", - "hf mfdes write --isoid df01 --fid 04 -d 01020304 --trkey 00112233445566778899aabbccddeeff --readerid 5532 -t aes -s lrp -> advanced CommitReaderID via lrp channel sample" + "hf mfdes write --isoid df01 --fid 04 -d 01020304 --trkey 00112233445566778899aabbccddeeff --readerid 5532 -t aes --schann lrp -> advanced CommitReaderID via lrp channel sample" ], "offline": false, "options": [ @@ -6501,6 +6563,25 @@ ], "usage": "hf mfu sim [-hv] -t <1..10> [-u ] [-n ]" }, + "hf mfu tamper": { + "command": "hf mfu tamper", + "description": "Set the congiguration of the NTAG 213TT tamper feature Supports: NTAG 213TT", + "notes": [ + "hf mfu tamper -e -> enable tamper feature", + "hf mfu tamper -d -> disable tamper feature", + "hf mfu tamper -m 0A0A0A0A -> set the tamper message to 0A0A0A0A", + "hf mfu tamper --lockmessage -> permanently lock the tamper message and mask it from memory" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-e, --enable Enable the tamper feature", + "-d, --disable Disable the tamper feature", + "-m, --message Set the tamper message (4 bytes)", + "--lockmessage Permanently lock the tamper message and mask it from memory (does not lock tamper feature itself)" + ], + "usage": "hf mfu tamper [-hed] [-m ] [--lockmessage]" + }, "hf mfu view": { "command": "hf mfu view", "description": "Print a MIFARE Ultralight/NTAG dump file (bin/eml/json)", @@ -8447,22 +8528,23 @@ }, "lf gproxii clone": { "command": "lf gproxii clone", - "description": "clone a Guardall tag to a T55x7, Q5/T5555 or EM4305/4469 tag. The facility-code is 8-bit and the card number is 20-bit. Larger values are truncated. Currently work only on 26 | 36 bit format", + "description": "Clone a Guardall tag to a T55x7, Q5/T5555 or EM4305/4469 tag. The facility-code is 8-bit and the card number is 20-bit. Larger values are truncated. Currently work only on 26 | 36 bit format", "notes": [ - "lf gproxii clone --fmt 26 --fc 123 --cn 1337 -> encode for T55x7 tag", - "lf gproxii clone --fmt 26 --fc 123 --cn 1337 --q5 -> encode for Q5/T5555 tag", - "lf gproxii clone --fmt 26 --fc 123 --cn 1337 --em -> encode for EM4305/4469" + "lf gproxii clone --xor 141 --fmt 26 --fc 123 --cn 1337 -> encode for T55x7 tag", + "lf gproxii clone --xor 141 --fmt 26 --fc 123 --cn 1337 --q5 -> encode for Q5/T5555 tag", + "lf gproxii clone --xor 141 --fmt 26 --fc 123 --cn 1337 --em -> encode for EM4305/4469" ], "offline": false, "options": [ "-h, --help This help", + "--xor 8-bit xor value (installation dependant)", "--fmt format length 26|32|36|40", "--fc 8-bit value facility code", "--cn 16-bit value card number", "--q5 optional - specify writing to Q5/T5555 tag", "--em optional - specify writing to EM4305/4469 tag" ], - "usage": "lf gproxii clone [-h] --fmt --fc --cn [--q5] [--em]" + "usage": "lf gproxii clone [-h] --xor --fmt --fc --cn [--q5] [--em]" }, "lf gproxii demod": { "command": "lf gproxii demod", @@ -8503,16 +8585,17 @@ "command": "lf gproxii sim", "description": "Enables simulation of Guardall card with specified card number. Simulation runs until the button is pressed or another USB command is issued. The facility-code is 8-bit and the card number is 16-bit. Larger values are truncated. Currently work only on 26 | 36 bit format", "notes": [ - "lf gproxii sim --fmt 26 --fc 123 --cn 1337" + "lf gproxii sim --xor 141 --fmt 26 --fc 123 --cn 1337" ], "offline": false, "options": [ "-h, --help This help", + "--xor 8-bit xor value (installation dependant)", "--fmt format length 26|32|36|40", "--fc 8-bit value facility code", "--cn 16-bit value card number" ], - "usage": "lf gproxii sim [-h] --fmt --fc --cn " + "usage": "lf gproxii sim [-h] --xor --fmt --fc --cn " }, "lf help": { "command": "lf help", @@ -8524,27 +8607,28 @@ }, "lf hid brute": { "command": "lf hid brute", - "description": "Enables bruteforce of HID readers with specified facility code. This is a attack against reader. if cardnumber is given, it starts with it and goes up / down one step if cardnumber is not given, it starts with 1 and goes up to 65535", + "description": "Enables bruteforce of HID readers with specified facility code or card number. This is an attack against the reader. If the field being bruteforced is provided, it starts with it and goes up / down one step while maintaining other supplied values. If the field being bruteforced is not provided, it will iterate through the full range while maintaining other supplied values.", "notes": [ - "lf hid brute -w H10301 --fc 224", - "lf hid brute -w H10301 --fc 21 -d 2000", - "lf hid brute -v -w H10301 --fc 21 --cn 200 -d 2000", - "lf hid brute -v -w H10301 --fc 21 --cn 200 -d 2000 --up" + "lf hid brute -w H10301 --field fc --fc 224 --cn 6278", + "lf hid brute -w H10301 --field cn --fc 21 -d 2000", + "lf hid brute -v -w H10301 --field cn --fc 21 --cn 200 -d 2000", + "lf hid brute -v -w H10301 --field fc --fc 21 --cn 200 -d 2000 --up" ], "offline": false, "options": [ "-h, --help This help", "-v, --verbose verbose output", "-w, --wiegand see `wiegand list` for available formats", + "--field field to bruteforce", "--fc facility code", - "--cn card number to start with", + "--cn card number", "-i, --issue issue level", "-o, --oem OEM code", - "-d, --delay delay betweens attempts in ms. Default 1000ms", - "--up direction to increment card number. (default is both directions)", - "--down direction to decrement card number. (default is both directions)" + "-d, --delay delay betweens attempts in ms. (def is 1000)", + "--up direction to increment field value. (def is both directions)", + "--down direction to decrement field value. (def is both directions)" ], - "usage": "lf hid brute [-hv] -w [--fc ] [--cn ] [-i ] [-o ] [-d ] [--up] [--down]" + "usage": "lf hid brute [-hv] -w --field [--fc ] [--cn ] [-i ] [-o ] [-d ] [--up] [--down]" }, "lf hid clone": { "command": "lf hid clone", @@ -10816,7 +10900,7 @@ "command": "msleep", "description": "Sleep for given amount of milliseconds", "notes": [ - "msleep 100" + "msleep -t 100" ], "offline": true, "options": [ @@ -11903,8 +11987,8 @@ } }, "metadata": { - "commands_extracted": 749, + "commands_extracted": 754, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-02-18T20:20:19" + "extracted_on": "2023-03-26T13:11:48" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 0dbad2544..487cea0c9 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -126,6 +126,7 @@ Check column "offline" for their availability. |`data hexsamples `|N |`Dump big buffer as hex bytes` |`data hex2bin `|Y |`Converts hexadecimal to binary` |`data load `|Y |`Load contents of file into graph window` +|`data num `|Y |`Converts dec/hex/bin` |`data print `|Y |`Print the data in the DemodBuffer` |`data samples `|N |`Get raw samples for graph window (GraphBuffer)` |`data save `|Y |`Save signal trace data (from graph window)` @@ -444,8 +445,9 @@ Check column "offline" for their availability. |`hf legic eload `|N |`Load binary dump to emulator memory` |`hf legic esave `|N |`Save emulator memory to binary file` |`hf legic eview `|N |`View emulator memory` +|`hf legic einfo `|N |`Display deobfuscated and decoded emulator memory` |`hf legic crc `|Y |`Calculate Legic CRC over given bytes` -|`hf legic view `|Y |`Display content from tag dump file` +|`hf legic view `|Y |`Display deobfuscated and decoded content from tag dump file` ### hf lto @@ -521,6 +523,8 @@ Check column "offline" for their availability. |`hf mf gsave `|N |`Save dump from card into file or emulator` |`hf mf gsetblk `|N |`Write block to card` |`hf mf gview `|N |`View card` +|`hf mf gdmconfig `|N |`Read config block from card` +|`hf mf gdmsetblk `|N |`Write block to card` |`hf mf ndefformat `|N |`Format MIFARE Classic Tag as NFC Tag` |`hf mf ndefread `|N |`Read and print NDEF records from card` |`hf mf ndefwrite `|N |`Write NDEF records to card` @@ -564,6 +568,7 @@ Check column "offline" for their availability. |`hf mfu restore `|N |`Restore a dump onto a MFU MAGIC tag` |`hf mfu view `|Y |`Display content from tag dump file` |`hf mfu wrbl `|N |`Write block` +|`hf mfu tamper `|N |`Cofigure the tamper feature on an NTAG 213TT` |`hf mfu eload `|N |`Load Ultralight dump file into emulator memory` |`hf mfu esave `|N |`Save Ultralight dump file from emulator memory` |`hf mfu eview `|N |`View emulator memory` @@ -952,7 +957,7 @@ Check column "offline" for their availability. |`lf hid reader `|N |`attempt to read and extract tag data` |`lf hid clone `|N |`clone HID tag to T55x7` |`lf hid sim `|N |`simulate HID tag` -|`lf hid brute `|N |`bruteforce card number against reader` +|`lf hid brute `|N |`bruteforce facility code or card number against reader` |`lf hid watch `|N |`continuously watch for cards. Reader mode` From fade240031e9711ca57a5f407de0159360a0a2ad Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sun, 26 Mar 2023 16:16:03 +0300 Subject: [PATCH 331/924] Fix formatting and run make style --- client/src/cmdhfmf.c | 2 +- doc/commands.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 828666a57..7c8c7235f 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6589,7 +6589,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("r", "reset", "reset card"), + arg_lit0("r", "reset", "Reset card"), arg_str0("u", "uid", "", "New UID (4 hex bytes)"), arg_param_end }; diff --git a/doc/commands.json b/doc/commands.json index 4ef1ec680..3a59e6f7c 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -11989,6 +11989,6 @@ "metadata": { "commands_extracted": 754, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-03-26T13:11:48" + "extracted_on": "2023-03-26T13:15:37" } } \ No newline at end of file From d434eeae60cd236ac8f4c24f68fde94cc34cc319 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sun, 26 Mar 2023 17:50:17 +0300 Subject: [PATCH 332/924] Supercard gen1/gen2 detection in MifareCIdent --- armsrc/mifarecmd.c | 42 +++++++++++++++++++++------------- client/src/mifare/mifarehost.c | 7 ++++-- doc/magic_cards_notes.md | 4 ++-- include/protocols.h | 11 +++++---- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 9eb44da5a..cb5644fc8 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2481,11 +2481,13 @@ void MifareCIdent(bool is_mfc) { uint8_t isGen = 0; uint8_t rec[1] = {0x00}; uint8_t recpar[1] = {0x00}; - uint8_t rats[4] = { ISO14443A_CMD_RATS, 0x80, 0x31, 0x73 }; - uint8_t rdblf0[4] = { ISO14443A_CMD_READBLOCK, 0xF0, 0x8D, 0x5f}; - uint8_t rdbl00[4] = { ISO14443A_CMD_READBLOCK, 0x00, 0x02, 0xa8}; - uint8_t gen4gmd[4] = { MIFARE_MAGIC_GDM_AUTH_KEYA, 0x00, 0x6C, 0x92}; - uint8_t gen4GetConf[8] = { GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; + uint8_t rats[4] = {ISO14443A_CMD_RATS, 0x80, 0x31, 0x73}; + uint8_t rdblf0[4] = {ISO14443A_CMD_READBLOCK, 0xF0, 0x8D, 0x5f}; + uint8_t rdbl00[4] = {ISO14443A_CMD_READBLOCK, 0x00, 0x02, 0xa8}; + uint8_t gen4gmd[4] = {MIFARE_MAGIC_GDM_AUTH_KEYA, 0x00, 0x6C, 0x92}; + uint8_t gen4GetConf[8] = {GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; + uint8_t superGen1[9] = {0x0A, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x10, 0x14, 0x1D}; + uint8_t superGen2[4] = {0x30, 0x00, 0x02, 0xA8}; uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); uint8_t *buf = BigBuf_malloc(PM3_CMD_DATA_SIZE); uint8_t *uid = BigBuf_malloc(10); @@ -2518,8 +2520,7 @@ void MifareCIdent(bool is_mfc) { int res = iso14443a_select_card(uid, NULL, &cuid, true, 0, true); if (res == 2) { - - // Check for Magic Gen4 GTU with default password : + // Check for Magic Gen4 GTU with default password: // Get config should return 30 or 32 bytes AddCrc14A(gen4GetConf, sizeof(gen4GetConf) - 2); ReaderTransmit(gen4GetConf, sizeof(gen4GetConf), NULL); @@ -2537,7 +2538,6 @@ void MifareCIdent(bool is_mfc) { res = iso14443a_select_card(uid, NULL, &cuid, true, 0, true); if (res == 2) { - if (cuid == 0xAA55C396) { isGen = MAGIC_GEN_UNFUSED; goto OUT; @@ -2546,19 +2546,29 @@ void MifareCIdent(bool is_mfc) { ReaderTransmit(rats, sizeof(rats), NULL); res = ReaderReceive(buf, par); if (res) { + // test for super card + ReaderTransmit(superGen1, sizeof(superGen1), NULL); + res = ReaderReceive(buf, par); + if (res == 22) { + isGen = MAGIC_SUPER_GEN1; - // test for some MFC gen2 - if (memcmp(buf, "\x09\x78\x00\x91\x02\xDA\xBC\x19\x10\xF0\x05", 11) == 0) { + // check for super card gen2 + // not available after RATS, reset card before executing + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + SpinDelay(40); + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - // super card ident - uint8_t super[] = {0x0A, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x10, 0x14, 0x1D}; - ReaderTransmit(super, sizeof(super), NULL); + iso14443a_select_card(uid, NULL, &cuid, true, 0, true); + ReaderTransmit(superGen2, sizeof(superGen2), NULL); res = ReaderReceive(buf, par); - if (res == 22) { - isGen = MAGIC_SUPER; - goto OUT; + if (res == 18) { + isGen = MAGIC_SUPER_GEN2; } + goto OUT; + } + // test for some MFC gen2 + if (memcmp(buf, "\x09\x78\x00\x91\x02\xDA\xBC\x19\x10\xF0\x05", 11) == 0) { isGen = MAGIC_GEN_2; goto OUT; } diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index d8390b3f5..70e601431 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1421,8 +1421,11 @@ int detect_mf_magic(bool is_mfc) { case MAGIC_GEN_UNFUSED: PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("Write Once / FUID")); break; - case MAGIC_SUPER: - PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("super card")); + case MAGIC_SUPER_GEN1: + PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("Super card (") _CYAN_("Gen 1") _GREEN_(")")); + break; + case MAGIC_SUPER_GEN2: + PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("Super card (") _CYAN_("Gen 2") _GREEN_(")")); break; case MAGIC_NTAG21X: PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("NTAG21x")); diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 24d259b44..2d4cd259c 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -677,12 +677,12 @@ CF FE <4b new_password> // Change password ### Identify ^[Top](#top) -Only Gen1 at the moment: +Only Gen1/Gen2 at this moment (Gen1B is unsupported): ``` hf 14a info ... -[+] Magic capabilities : super card +[+] Magic capabilities : Super card (Gen ?) ``` # MIFARE Ultralight diff --git a/include/protocols.h b/include/protocols.h index 5900b377c..54a8ba446 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -258,11 +258,12 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MAGIC_GEN_1B 2 #define MAGIC_GEN_2 4 #define MAGIC_GEN_UNFUSED 5 -#define MAGIC_SUPER 6 -#define MAGIC_NTAG21X 7 -#define MAGIC_GEN_3 8 -#define MAGIC_GEN_4GTU 9 -#define MAGIC_GEN_4GDM 10 +#define MAGIC_SUPER_GEN1 6 +#define MAGIC_SUPER_GEN2 7 +#define MAGIC_NTAG21X 8 +#define MAGIC_GEN_3 9 +#define MAGIC_GEN_4GTU 10 +#define MAGIC_GEN_4GDM 11 // Commands for configuration of Gen4 GTU cards. // see https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/magic_cards_notes.md From 71ddee1386e60b1f8b09d7b86e64df80b0413239 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 16:50:59 +0200 Subject: [PATCH 333/924] added "hf mf gdmsetcfg" to write GDM configuration --- CHANGELOG.md | 3 +- armsrc/appmain.c | 8 +++++ armsrc/mifarecmd.c | 71 ++++++++++++++++++++++++++++++++++++++++-- armsrc/mifarecmd.h | 1 + armsrc/mifareutil.c | 71 ++++++++++++++++++++++++++++++++++-------- armsrc/mifareutil.h | 1 + client/src/cmdhflist.c | 9 ++---- client/src/cmdhfmf.c | 57 ++++++++++++++++++++++++++++++--- include/pm3_cmd.h | 1 + include/protocols.h | 7 ++--- 10 files changed, 197 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6e9c9811..4121234df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Added `hf mf gdmgetblk` - Support Gen4 GDM read configuration block (@iceman1001) + - Added `hf mf gdmsetcfg` - Supprt Gen4 GDM write configuration block (@iceman1001) + - Added `hf mf gdmcfg` - Support Gen4 GDM read configuration block (@iceman1001) - Changed magic note to include a section about GDM tags (@iceman1001) - Added `hf mf gdmsetblk` - Support Gen4 GDM write block (@iceman1001) - Changed `hf 14a info` - detect Gen GDM magic tags (@iceman1001) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 969513d39..6901973f2 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1743,6 +1743,14 @@ static void PacketReceived(PacketCommandNG *packet) { MifareReadConfigBlockGDM(payload->key); break; } + case CMD_HF_MIFARE_G4_GDM_WRCFG: { + struct p { + uint8_t data[16]; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + MifareWriteConfigBlockGDM(payload->data); + break; + } case CMD_HF_MIFARE_G4_GDM_WRBL: { struct p { uint8_t blockno; diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 0d14ffb92..7eaad3e23 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -253,7 +253,7 @@ void MifareReadConfigBlockGDM(uint8_t *key) { goto OUT; }; - if (mifare_classic_readblock_ex(pcs, cuid, 0, outbuf, MIFARE_MAGIC_GDM_READBLOCK)) { + if (mifare_classic_readblock_ex(pcs, cuid, 0, outbuf, MIFARE_MAGIC_GDM_READ_CFG)) { retval = PM3_ESOFT; goto OUT; }; @@ -574,6 +574,73 @@ OUT: BigBuf_free(); } +void MifareWriteConfigBlockGDM(uint8_t *datain) { + + int retval = PM3_SUCCESS; + + // check args + if (datain == NULL) { + retval = PM3_EINVARG; + goto OUT; + } + + uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); + if (par == NULL) { + retval = PM3_EMALLOC; + goto OUT; + } + + uint8_t *uid = BigBuf_malloc(10); + if (uid == NULL) { + retval = PM3_EMALLOC; + goto OUT; + } + + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); + clear_trace(); + set_tracing(true); + + // variables + uint32_t cuid = 0; + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs; + pcs = &mpcs; + + if (iso14443a_select_card(uid, NULL, &cuid, true, 0, true) == false) { + retval = PM3_ESOFT; + goto OUT; + } + + uint64_t key = 0; + if (mifare_classic_authex_2(pcs, cuid, 0, 0, key, AUTH_FIRST, NULL, NULL, true)) { + retval = PM3_ESOFT; + goto OUT; + }; + + int res = mifare_classic_write_cfg_block_gdm(pcs, cuid, datain); + if (res == PM3_ETEAROFF) { + retval = PM3_ETEAROFF; + goto OUT; + } else if (res) { + retval = PM3_ESOFT; + goto OUT; + } + + if (mifare_classic_halt(pcs, cuid)) { + retval = PM3_ESOFT; + goto OUT; + }; + +OUT: + crypto1_deinit(pcs); + + reply_ng(CMD_HF_MIFARE_G4_GDM_WRCFG, retval, NULL, 0); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); + set_tracing(false); + BigBuf_free(); +} + void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t *datain) { // params @@ -2487,7 +2554,7 @@ void MifareCIdent(bool is_mfc) { uint8_t rats[4] = { ISO14443A_CMD_RATS, 0x80, 0x31, 0x73 }; uint8_t rdblf0[4] = { ISO14443A_CMD_READBLOCK, 0xF0, 0x8D, 0x5f}; uint8_t rdbl00[4] = { ISO14443A_CMD_READBLOCK, 0x00, 0x02, 0xa8}; - uint8_t gen4gmd[4] = { MIFARE_MAGIC_GDM_AUTH_KEYA, 0x00, 0x6C, 0x92}; + uint8_t gen4gmd[4] = { MIFARE_MAGIC_GDM_AUTH_KEY, 0x00, 0x6C, 0x92}; uint8_t gen4GetConf[8] = { GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); uint8_t *buf = BigBuf_malloc(PM3_CMD_DATA_SIZE); diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index 6363423fd..415e0333d 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -60,6 +60,7 @@ void MifareGen3Freez(void); // Gen 3 magic card lock further UID changes // MFC GEN4 GDM void MifareReadConfigBlockGDM(uint8_t *key); +void MifareWriteConfigBlockGDM(uint8_t *datain); void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t *datain); // MFC GEN4 GTU diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index fd9260e23..b11625339 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -142,24 +142,21 @@ int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockN return mifare_classic_authex_2(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL, NULL, false); } int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing, bool is_gdm) { - int len; - uint32_t pos, nt, ntpp; // Supplied tag nonce - uint8_t par[1] = {0x00}; + + // "random" reader nonce: uint8_t nr[4]; - uint8_t mf_nr_ar[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + num_to_bytes(prng_successor(GetTickCount(), 32), 4, nr); + uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; - // "random" reader nonce: - num_to_bytes(prng_successor(GetTickCount(), 32), 4, nr); - // Transmit MIFARE_CLASSIC_AUTH 0x60, 0x61 or GDM 0x80 - uint8_t cmdbyte = (is_gdm) ? MIFARE_MAGIC_GDM_AUTH_KEYA + (keyType & 0x01) : MIFARE_AUTH_KEYA + (keyType & 0x01); - len = mifare_sendcmd_short(pcs, isNested, cmdbyte, blockNo, receivedAnswer, receivedAnswerPar, timing); + uint8_t cmdbyte = (is_gdm) ? MIFARE_MAGIC_GDM_AUTH_KEY : MIFARE_AUTH_KEYA + (keyType & 0x01); + int len = mifare_sendcmd_short(pcs, isNested, cmdbyte, blockNo, receivedAnswer, receivedAnswerPar, timing); if (len != 4) return 1; // Save the tag nonce (nt) - nt = bytes_to_num(receivedAnswer, 4); + uint32_t nt = bytes_to_num(receivedAnswer, 4); // ----------------------------- crypto1 create if (isNested) @@ -185,7 +182,9 @@ int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t bloc *ntptr = nt; // Generate (encrypted) nr+parity by loading it into the cipher (Nr) - par[0] = 0; + uint32_t pos; + uint8_t par[1] = {0x00}; + uint8_t mf_nr_ar[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; for (pos = 0; pos < 4; pos++) { mf_nr_ar[pos] = crypto1_byte(pcs, nr[pos], 0) ^ nr[pos]; par[0] |= (((filter(pcs->odd) ^ oddparity8(nr[pos])) & 0x01) << (7 - pos)); @@ -221,8 +220,8 @@ int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t bloc return 2; } - ntpp = prng_successor(nt, 32) ^ crypto1_word(pcs, 0, 0); - + // Supplied tag nonce + uint32_t ntpp = prng_successor(nt, 32) ^ crypto1_word(pcs, 0, 0); if (ntpp != bytes_to_num(receivedAnswer, 4)) { if (g_dbglevel >= DBG_EXTENDED) Dbprintf("Authentication failed. Error card response"); return 3; @@ -473,6 +472,52 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t return 0; } +int mifare_classic_write_cfg_block_gdm(struct Crypto1State *pcs, uint32_t uid, uint8_t *blockData) { + + // variables + uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; + uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; + + uint16_t len = mifare_sendcmd_short(pcs, 1, MIFARE_MAGIC_GDM_WRITE_CFG, 0, receivedAnswer, receivedAnswerPar, NULL); + if ((len != 1) || (receivedAnswer[0] != 0x0A)) { + return 1; + } + + uint8_t d_block[18], d_block_enc[18]; + memcpy(d_block, blockData, 16); + AddCrc14A(d_block, 16); + + // enough for 18 Bytes to send + uint8_t par[3] = {0x00, 0x00, 0x00}; + // crypto + for (uint32_t pos = 0; pos < 18; pos++) { + d_block_enc[pos] = crypto1_byte(pcs, 0x00, 0) ^ d_block[pos]; + par[pos >> 3] |= (((filter(pcs->odd) ^ oddparity8(d_block[pos])) & 0x01) << (7 - (pos & 0x0007))); + } + + ReaderTransmitPar(d_block_enc, sizeof(d_block_enc), par, NULL); + + // tearoff occurred + if (tearoff_hook() == PM3_ETEAROFF) { + return PM3_ETEAROFF; + } else { + // Receive the response + len = ReaderReceive(receivedAnswer, receivedAnswerPar); + + uint8_t res = 0; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 0)) << 0; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 1)) << 1; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 2)) << 2; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; + + if ((len != 1) || (res != 0x0A)) { + return 2; + } + } + return 0; +} + + int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t action) { // variables diff --git a/armsrc/mifareutil.h b/armsrc/mifareutil.h index bcc813d00..e5731ce36 100644 --- a/armsrc/mifareutil.h +++ b/armsrc/mifareutil.h @@ -82,6 +82,7 @@ int mifare_classic_halt_ex(struct Crypto1State *pcs); int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData); int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm); int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t action); +int mifare_classic_write_cfg_block_gdm(struct Crypto1State *pcs, uint32_t uid, uint8_t *blockData); // Ultralight/NTAG... int mifare_ul_ev1_auth(uint8_t *keybytes, uint8_t *pack); diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 263a4baa1..7207e50f9 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -318,18 +318,13 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "AUTH-B(" _MAGENTA_("%d") ")", cmd[1]); break; } - case MIFARE_MAGIC_GDM_AUTH_KEYA: { + case MIFARE_MAGIC_GDM_AUTH_KEY: { if (cmdsize > 3) { - snprintf(exp, size, "MAGIC AUTH-A(" _MAGENTA_("%d") ")", cmd[1]); + snprintf(exp, size, "MAGIC AUTH (" _MAGENTA_("%d") ")", cmd[1]); MifareAuthState = masNt; } break; } - case MIFARE_MAGIC_GDM_AUTH_KEYB: { - MifareAuthState = masNt; - snprintf(exp, size, "MAGIC AUTH-B(" _MAGENTA_("%d") ")", cmd[1]); - break; - } case MIFARE_MAGIC_GDM_WRITEBLOCK: { snprintf(exp, size, "MAGIC WRITEBLOCK(" _MAGENTA_("%d") ")", cmd[1]); break; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 8093c818d..d5d0e913b 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -7574,11 +7574,11 @@ static int CmdHF14AGen4Save(const char *Cmd) { return PM3_SUCCESS; } -static int CmdHF14AGen4_GDM_ConfigBlk(const char *Cmd) { +static int CmdHF14AGen4_GDM_Cfg(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "hf mf gdmconfig", + CLIParserInit(&ctx, "hf mf gdmcfg", "Get configuration data from magic gen4 GDM card.", - "hf mf gdmconfig\n" + "hf mf gdmcfg\n" ); void *argtable[] = { arg_param_begin, @@ -7620,6 +7620,52 @@ static int CmdHF14AGen4_GDM_ConfigBlk(const char *Cmd) { return resp.status; } +static int CmdHF14AGen4_GDM_SetCfg(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mf gdmsetcfg", + "Set configuration data on a magic gen4 GDM card", + "hf mf gdmsetcfg -d 850000000000000000005A5A00000008" + ); + void *argtable[] = { + arg_param_begin, + arg_str1("d", "data", "", "bytes to write, 16 hex bytes"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + uint8_t block[MFBLOCK_SIZE] = {0x00}; + int blen = 0; + CLIGetHexWithReturn(ctx, 1, block, &blen); + CLIParserFree(ctx); + + if (blen != MFBLOCK_SIZE) { + PrintAndLogEx(WARNING, "expected %u HEX bytes. got %i", MFBLOCK_SIZE, blen); + return PM3_EINVARG; + } + + struct p { + uint8_t data[MFBLOCK_SIZE]; + } PACKED payload; + + memcpy(payload.data, block, sizeof(payload.data)); + + clearCommandBuffer(); + SendCommandNG(CMD_HF_MIFARE_G4_GDM_WRCFG, (uint8_t *)&payload, sizeof(payload)); + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_HF_MIFARE_G4_GDM_WRCFG, &resp, 1500) == false) { + PrintAndLogEx(WARNING, "command execute timeout"); + return PM3_ETIMEOUT; + } + + if (resp.status == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); + PrintAndLogEx(HINT, "try `" _YELLOW_("hf mf gdmcfg") "` to verify"); + } else { + PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); + } + return PM3_SUCCESS; +} + static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { CLIParserContext *ctx; @@ -7995,8 +8041,9 @@ static command_t CommandTable[] = { {"gsetblk", CmdHF14AGen4SetBlk, IfPm3Iso14443a, "Write block to card"}, {"gview", CmdHF14AGen4View, IfPm3Iso14443a, "View card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "-------------------- " _CYAN_("magic gen4 GDM") " --------------------------"}, - {"gdmconfig", CmdHF14AGen4_GDM_ConfigBlk, IfPm3Iso14443a, "Read config block from card"}, - {"gdmsetblk", CmdHF14AGen4_GDM_SetBlk, IfPm3Iso14443a, "Write block to card"}, + {"gdmcfg", CmdHF14AGen4_GDM_Cfg, IfPm3Iso14443a, "Read config block from card"}, + {"gdmsetcfg", CmdHF14AGen4_GDM_SetCfg, IfPm3Iso14443a, "Write config block to card"}, + {"gdmsetblk", CmdHF14AGen4_GDM_SetBlk, IfPm3Iso14443a, "Write block to card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("ndef") " -----------------------"}, // {"ice", CmdHF14AMfice, IfPm3Iso14443a, "collect MIFARE Classic nonces to file"}, {"ndefformat", CmdHFMFNDEFFormat, IfPm3Iso14443a, "Format MIFARE Classic Tag as NFC Tag"}, diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index b99bb8430..7a19e6dbe 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -690,6 +690,7 @@ typedef struct { #define CMD_HF_MIFARE_G4_GDM_RDBL 0x0870 #define CMD_HF_MIFARE_G4_GDM_WRBL 0x0871 #define CMD_HF_MIFARE_G4_GDM_CONFIG 0x0872 +#define CMD_HF_MIFARE_G4_GDM_WRCFG 0x0873 #define CMD_UNKNOWN 0xFFFF diff --git a/include/protocols.h b/include/protocols.h index 5900b377c..7b318a9f5 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -190,11 +190,10 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MIFARE_CMD_RESTORE 0xC2 #define MIFARE_CMD_TRANSFER 0xB0 -#define MIFARE_MAGIC_GDM_AUTH_KEYA 0x80 -#define MIFARE_MAGIC_GDM_AUTH_KEYB 0x81 +#define MIFARE_MAGIC_GDM_AUTH_KEY 0x80 #define MIFARE_MAGIC_GDM_WRITEBLOCK 0xA8 -#define MIFARE_MAGIC_GDM_READBLOCK 0xE0 -#define MIFARE_MAGIC_GDM_READBLOCK_1 0xE1 +#define MIFARE_MAGIC_GDM_READ_CFG 0xE0 +#define MIFARE_MAGIC_GDM_WRITE_CFG 0xE1 #define MIFARE_EV1_PERSONAL_UID 0x40 #define MIFARE_EV1_SETMODE 0x43 From 5696dd31cc606b2105c84bef41ef1f89330f2704 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sun, 26 Mar 2023 17:52:48 +0300 Subject: [PATCH 334/924] Use rdbl00 instead superGen2 --- armsrc/mifarecmd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index cb5644fc8..39aa166b8 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2487,7 +2487,6 @@ void MifareCIdent(bool is_mfc) { uint8_t gen4gmd[4] = {MIFARE_MAGIC_GDM_AUTH_KEYA, 0x00, 0x6C, 0x92}; uint8_t gen4GetConf[8] = {GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; uint8_t superGen1[9] = {0x0A, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x10, 0x14, 0x1D}; - uint8_t superGen2[4] = {0x30, 0x00, 0x02, 0xA8}; uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); uint8_t *buf = BigBuf_malloc(PM3_CMD_DATA_SIZE); uint8_t *uid = BigBuf_malloc(10); @@ -2559,7 +2558,7 @@ void MifareCIdent(bool is_mfc) { iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); iso14443a_select_card(uid, NULL, &cuid, true, 0, true); - ReaderTransmit(superGen2, sizeof(superGen2), NULL); + ReaderTransmit(rdbl00, sizeof(rdbl00), NULL); res = ReaderReceive(buf, par); if (res == 18) { isGen = MAGIC_SUPER_GEN2; From eaee87497e9196915f9e5c4951ba9ea633612135 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 16:53:12 +0200 Subject: [PATCH 335/924] text about setcfg --- doc/magic_cards_notes.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index e90845c74..fb7ba7fd2 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -598,9 +598,11 @@ It is unknown what kind of block 0 changes the tag supports # Write to persistent memory hf mf gdmsetblk -# Read 0xE0 configuration: -hf mf gdmconfig +# Read configuration (0xE0): +hf mf gdmcfg +# Write configuration (0xE1): +hf mf gdmsetcfg ``` ### libnfc commands From 9a4c363549842edf027ef7eb03f85fee4d77cd16 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:03:46 +0300 Subject: [PATCH 336/924] Leading zeros in key --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 5aede7d00..7b50a1a9e 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6804,7 +6804,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { res = mfkey32_moebius(&data, &key64); if (res) { - PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%12" PRIX64) " ]", sprint_hex_inrow(outA, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%012" PRIX64) " ]", sprint_hex_inrow(outA, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); } else { PrintAndLogEx(FAILED, "failed to recover any key"); } From d10d8c00396d571dcdd426932afbc0b73e8eefa9 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:05:11 +0300 Subject: [PATCH 337/924] And make style --- armsrc/mifarecmd.c | 2 +- armsrc/mifareutil.c | 2 +- client/src/cmdhfmf.c | 10 +++++----- doc/commands.json | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index feabf15a1..a1c86c2e8 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -497,7 +497,7 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { retval = 1; -OUT: +OUT: crypto1_deinit(pcs); reply_mix(CMD_ACK, retval, 0, 0, 0, 0); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index b11625339..6f04cc3e7 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -183,7 +183,7 @@ int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t bloc // Generate (encrypted) nr+parity by loading it into the cipher (Nr) uint32_t pos; - uint8_t par[1] = {0x00}; + uint8_t par[1] = {0x00}; uint8_t mf_nr_ar[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; for (pos = 0; pos < 4; pos++) { mf_nr_ar[pos] = crypto1_byte(pcs, nr[pos], 0) ^ nr[pos]; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 7b50a1a9e..5703afad4 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -633,7 +633,7 @@ static int CmdHF14AMfWrBl(const char *Cmd) { PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); PrintAndLogEx(HINT, "try `" _YELLOW_("hf mf rdbl") "` to verify"); } else if (status == PM3_ETEAROFF) { - return status; + return status; } else { PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); // suggest the opposite keytype than what was used. @@ -7855,7 +7855,7 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { PrintAndLogEx(HINT, "try `" _YELLOW_("hf mf rdbl") "` to verify"); } else if (resp.status == PM3_ETEAROFF) { return resp.status; - } else { + } else { PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); PrintAndLogEx(HINT, "Maybe access rights? Try specify keytype `" _YELLOW_("hf mf gdmsetblk -%c ...") "` instead", (keytype == MF_KEY_A) ? 'b' : 'a'); } @@ -8007,7 +8007,7 @@ static int CmdHF14AMfValue(const char *Cmd) { } if (resp.oldarg[0] & 0xFF) { - // all ok so set flag to read current value + // all ok so set flag to read current value getval = true; PrintAndLogEx(SUCCESS, "Update ( " _GREEN_("success") " )"); } else { @@ -8040,7 +8040,7 @@ static int CmdHF14AMfValue(const char *Cmd) { } int status = resp.oldarg[0]; if (status) { - // all ok so set flag to read current value + // all ok so set flag to read current value getval = true; PrintAndLogEx(SUCCESS, "Update ( " _GREEN_("success") " )"); } else if (status == PM3_ETEAROFF) { @@ -8137,7 +8137,7 @@ static command_t CommandTable[] = { {"gsave", CmdHF14AGen4Save, IfPm3Iso14443a, "Save dump from card into file or emulator"}, {"gsetblk", CmdHF14AGen4SetBlk, IfPm3Iso14443a, "Write block to card"}, {"gview", CmdHF14AGen4View, IfPm3Iso14443a, "View card"}, - {"-----------", CmdHelp, IfPm3Iso14443a, "-------------------- " _CYAN_("magic gen4 GDM") " --------------------------"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "-------------------- " _CYAN_("magic gen4 GDM") " --------------------------"}, {"gdmcfg", CmdHF14AGen4_GDM_Cfg, IfPm3Iso14443a, "Read config block from card"}, {"gdmsetcfg", CmdHF14AGen4_GDM_SetCfg, IfPm3Iso14443a, "Write config block to card"}, {"gdmsetblk", CmdHF14AGen4_GDM_SetBlk, IfPm3Iso14443a, "Write block to card"}, diff --git a/doc/commands.json b/doc/commands.json index 3a59e6f7c..703ff688c 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -4889,7 +4889,7 @@ "offline": false, "options": [ "-h, --help This help", - "-r, --reset reset card", + "-r, --reset Reset card", "-u, --uid New UID (4 hex bytes)" ], "usage": "hf mf supercard [-hr] [-u ]" @@ -11989,6 +11989,6 @@ "metadata": { "commands_extracted": 754, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-03-26T13:15:37" + "extracted_on": "2023-03-26T15:04:49" } } \ No newline at end of file From 4c3265daec524232c713ae9b35be76ce5fbec08b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 26 Mar 2023 20:26:50 +0200 Subject: [PATCH 338/924] text --- doc/magic_cards_notes.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index fb7ba7fd2..da545a24b 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -575,6 +575,13 @@ Read config: 2. send 0xE000, will return the configuration bytes. `results: 850000000000000000005A5A00000008` + +Mapping of configuration bytes so far: +``` +850000000000000000005A5A00000008 + ^^ --> SAK +``` + Write config: 1. sending custom auth with all zeros key 2. send 0xE100 From 0f0a5d7f043632d4b540215141cf9fb16e9b6106 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Tue, 28 Mar 2023 17:25:03 +0300 Subject: [PATCH 339/924] Fix lost arguments --- armsrc/mifareutil.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index b11625339..6f8acc348 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -139,7 +139,7 @@ int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, return mifare_classic_authex(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL, NULL); } int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing) { - return mifare_classic_authex_2(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL, NULL, false); + return mifare_classic_authex_2(pcs, uid, blockNo, keyType, ui64Key, isNested, ntptr, timing, false); } int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing, bool is_gdm) { From 71293fa2b2c1509cb39a859d51fcbf36eb659377 Mon Sep 17 00:00:00 2001 From: Esteban Martinena Guerrero Date: Wed, 29 Mar 2023 08:42:13 +0200 Subject: [PATCH 340/924] New keys --- client/dictionaries/mfc_default_keys.dic | 76 +++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index ad77c7a9e..1f5bf601b 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -190,6 +190,8 @@ AAFB06045877 # EPI Envisionte# 3dprinter 3e65e4fb65b3 # Fysiken A 25094df6f148 # Fysiken B a05dbd98e0fc # CleverFit +AA4DDA458EBB # GoFit +EAB8066C7479 # GoFit # d3b595e9dd63 # Hotel KeyCard afbecd121004 # Hotel KeyCard @@ -343,6 +345,78 @@ c52876869800 5145c34dba19 25352912cd8d 81b20c274c3f +00B70875AF1D +04B787B2F3A5 +05412723F1B6 +05C301C8795A +066F5AF3CCEE +0A1B6C50E04E +0AD0956DF6EE +0AD6B7E37183 +0F3A4D48757B +1417E5671417 +18AB07270506 +18E887D625B4 +1ABC15934F5A +1AF66F83F5BE +260480290483 +2900AAC52BC3 +2910AFE15C99 +374521A38BCC +3A4C47757B07 +3A524B7A7B37 +3C4ABB877EAF +3F3A534B7B7B +4B787B273A50 +4B92DF1BF25D +4F0E4AE8051A +514B797B2F3A +529CF51F05C5 +52B26C199862 +57A18BFEC381 +5A7D87876EA8 +64CBADC7A313 +65B6C3200736 +67B1B3A4E497 +6B0454D5D3C3 +6B3B7AF45777 +6C273F431564 +702C1BF025DD +738385948494 +76E450094393 +777B1F3A4F4A +7B173A4E4976 +81504133B13C +826576A1AB68 +8A55194F6587 +8DFACF11E778 +8FD6D76742DC +9AFEE1F65742 +9D56D83658AC +9FAC23197904 +A1AB3A08712C +A514B797B373 +A58AB5619631 +A5BB18152EF1 +A777B233A4F4 +AB19BC885A29 +AB91BDA25F00 +AE98BA1E6F2C +B133A4D48757 +B3A4C47757B0 +B6803136F5AF +B793ADA6DB0C +B95BFDEBA7E4 +C0AA2BBD27CD +C27F5C1A9C2B +C9BE49675FE4 +CCCE24102003 +CDE668FDCDBA +D23A31A4AAB9 +DEDD7688BC38 +E9AE90885C39 +F0A3C5182007 +F3A524B7A7B3 # # Data from mall abba1234fcb0 # playland balikesir @@ -1739,4 +1813,4 @@ FFD46FF6C5EE 576A798C9904 1C5179C4A8A1 16CA203B811B -11AC8C8F3AF2 +11AC8C8F3AF2 \ No newline at end of file From a9b3a69100fe0e97eb28b8a936f0c544fa91decc Mon Sep 17 00:00:00 2001 From: Einstein2150 Date: Wed, 29 Mar 2023 20:37:02 +0200 Subject: [PATCH 341/924] Update Mac-OS-X-Homebrew-Installation-Instructions.md Fix for Apple Silicon (M1) installation with arch -arm64 prefix Signed-off-by: Einstein2150 --- .../Mac-OS-X-Homebrew-Installation-Instructions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md b/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md index 4de2ec373..3b2e31530 100644 --- a/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md @@ -54,6 +54,8 @@ Then you are missing Rosetta 2 and need to install it: `/usr/sbin/softwareupdate Homebrew has changed their prefix to differentiate between native Apple Silicon and Intel compiled binaries. The Makefile attempts to account for this but please note that whichever terminal or application you're using must be running under Architecture "Apple" as seen by Activity Monitor as all child processes inherit the Rosetta 2 environment of their parent. You can check which architecture you're currently running under with a `uname -m` in your terminal. +The fastest option is to run the brew command with the `arch -arm64` prefix i.e. `arch -arm64 brew install --HEAD --with-blueshark proxmark3`. This doesn't require running the whole terminal in Rosetta 2. + Visual Studio Code still runs under Rosetta 2 and if you're developing for proxmark3 on an Apple Silicon Mac you might want to consider running the Insiders build which has support for running natively on Apple Silicon. ## Install Proxmark3 tools From ee79e5acb7a6bf634c5c17763998188d139a0320 Mon Sep 17 00:00:00 2001 From: GuruSteve Date: Wed, 29 Mar 2023 15:44:52 -0600 Subject: [PATCH 342/924] Added default iClass credit key to table; reorganized key order --- CHANGELOG.md | 1 + client/src/cmdhficlass.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4121234df..0c5260e11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added XOR key extraction and flag to Guardall G-Prox II (@GuruSteve) - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) - Added `hf legic info` command for other sources: `hf legic einfo`, `hf legic view` (@0xdeb) + - Added iClass credit key to default iClass key table and reorganized key order (@GuruSteve) ## [Nitride.4.16191][2023-01-29] diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 1c67f98c4..b328436bb 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -63,9 +63,9 @@ static void printIclassSIO(uint8_t *iclass_dump); static uint8_t iClass_Key_Table[ICLASS_KEYS_MAX][8] = { { 0xAE, 0xA6, 0x84, 0xA6, 0xDA, 0xB2, 0x32, 0x78 }, - { 0x76, 0x65, 0x54, 0x43, 0x32, 0x21, 0x10, 0x00 }, + { 0xFD, 0xCB, 0x5A, 0x52, 0xEA, 0x8F, 0x30, 0x90 }, { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x76, 0x65, 0x54, 0x43, 0x32, 0x21, 0x10, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, From dab3171ba6fd409b63efc965c6bf88ef0224ba1c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 30 Mar 2023 22:38:03 +0200 Subject: [PATCH 343/924] added loadbinarykeys fct which takes fn and loads binary MFC keys into two arrays KeyA, KeyB. --- client/src/fileutils.c | 80 ++++++++++++++++++++++++++++++++++-------- client/src/fileutils.h | 16 +++++++++ 2 files changed, 82 insertions(+), 14 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 3182f47c3..8a6049d3c 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -304,12 +304,12 @@ int saveFile(const char *preferredName, const char *suffix, const void *data, si return PM3_EMALLOC; } - /* We should have a valid filename now, e.g. dumpdata-3.bin */ + // We should have a valid filename now, e.g. dumpdata-3.bin - /*Opening file for writing in binary mode*/ + // Opening file for writing in binary mode FILE *f = fopen(fileName, "wb"); if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", fileName); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", fileName); free(fileName); return PM3_EFILE; } @@ -336,12 +336,12 @@ int saveFileEML(const char *preferredName, uint8_t *data, size_t datalen, size_t int blocks = datalen / blocksize; uint16_t currblock = 1; - /* We should have a valid filename now, e.g. dumpdata-3.bin */ + // We should have a valid filename now, e.g. dumpdata-3.bin - /*Opening file for writing in text mode*/ + // Opening file for writing in text mode FILE *f = fopen(fileName, "w+"); if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", fileName); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", fileName); retval = PM3_EFILE; goto out; } @@ -770,7 +770,7 @@ int saveFileWAVE(const char *preferredName, const int *data, size_t datalen) { FILE *wave_file = fopen(fileName, "wb"); if (!wave_file) { - PrintAndLogEx(WARNING, "file not found or locked. "_YELLOW_("'%s'"), fileName); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", fileName); retval = PM3_EFILE; goto out; } @@ -806,7 +806,7 @@ int saveFilePM3(const char *preferredName, int *data, size_t datalen) { FILE *f = fopen(fileName, "w"); if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. "_YELLOW_("'%s'"), fileName); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", fileName); retval = PM3_EFILE; goto out; } @@ -939,7 +939,7 @@ int loadFile_safeEx(const char *preferredName, const char *suffix, void **pdata, FILE *f = fopen(path, "rb"); if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", path); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", path); free(path); return PM3_EFILE; } @@ -1050,7 +1050,7 @@ int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { FILE *f = fopen(path, "r"); if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", path); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", path); free(path); return PM3_EFILE; } @@ -1427,6 +1427,7 @@ int loadFileJSONroot(const char *preferredName, void **proot, bool verbose) { return retval; } +// iceman: todo - move all unsafe functions like this from client source. int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, uint8_t keylen, uint32_t *keycnt) { // t5577 == 4 bytes // mifare == 6 bytes @@ -1463,7 +1464,7 @@ int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatale FILE *f = fopen(path, "r"); if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", path); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", path); retval = PM3_EFILE; goto out; } @@ -1566,7 +1567,7 @@ int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t key FILE *f = fopen(path, "r"); if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", path); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", path); retval = PM3_EFILE; goto out; } @@ -1619,6 +1620,57 @@ out: return retval; } +int loadFileBinaryKey(const char *preferredName, const char *suffix, void **keya, void **keyb, size_t *alen, size_t *blen) { + + char *path; + int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, suffix, false); + if (res != PM3_SUCCESS) { + return PM3_EFILE; + } + + FILE *f = fopen(path, "rb"); + if (!f) { + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", path); + free(path); + return PM3_EFILE; + } + free(path); + + // get filesize in order to malloc memory + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + if (fsize <= 0) { + PrintAndLogEx(FAILED, "error, when getting filesize"); + fclose(f); + return PM3_EFILE; + } + + // Half is KEY A, half is KEY B + fsize /= 2; + + *keya = calloc(fsize, sizeof(uint8_t)); + if (*keya == NULL) { + PrintAndLogEx(FAILED, "error, cannot allocate memory"); + fclose(f); + return PM3_EMALLOC; + } + + *alen = fread(*keya, 1, fsize, f); + + *keyb = calloc(fsize, sizeof(uint8_t)); + if (*keyb == NULL) { + PrintAndLogEx(FAILED, "error, cannot allocate memory"); + fclose(f); + return PM3_EMALLOC; + } + + *blen = fread(*keyb, 1, fsize, f); + fclose(f); + return PM3_SUCCESS; +} + mfu_df_e detect_mfu_dump_format(uint8_t **dump, size_t *dumplen, bool verbose) { mfu_df_e retval = MFU_DF_UNKNOWN; @@ -2058,7 +2110,7 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl } if (res != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "File: " _YELLOW_("%s") ": not found or locked.", fn); + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", fn); return PM3_EFILE; } @@ -2068,7 +2120,7 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl int pm3_save_dump(const char *fn, uint8_t *d, size_t n, JSONFileType jsft, size_t blocksize) { if (d == NULL || n == 0) { - PrintAndLogEx(INFO, "No data to save. Skipping..."); + PrintAndLogEx(INFO, "No data to save, skipping..."); return PM3_EINVARG; } diff --git a/client/src/fileutils.h b/client/src/fileutils.h index fc5d274aa..18e0fbd7e 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -236,6 +236,7 @@ int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatale */ int loadFileDICTIONARY_safe(const char *preferredName, void **pdata, uint8_t keylen, uint32_t *keycnt); +int loadFileBinaryKey(const char *preferredName, const char *suffix, void **keya, void **keyb, size_t *alen, size_t *blen); typedef enum { MFU_DF_UNKNOWN, @@ -276,5 +277,20 @@ DumpFileType_t getfiletype(const char *filename); */ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumplen); + +/** STUB + * @brief Utility function to save data to three file files (BIN/EML/JSON). + * It also tries to save according to user preferences set dump folder paths. + * E.g. dumpdata.bin + * E.g. dumpdata.eml + * E.g. dumpdata.json + + * @param fn + * @param d The binary data to write to the file + * @param n the length of the data + * @param jsft json format type for the different memory cards (MFC, MFUL, LEGIC, 14B, 15, ICLASS etc) + * @param blocksize + * @return PM3_SUCCESS if OK + */ int pm3_save_dump(const char *fn, uint8_t *d, size_t n, JSONFileType jsft, size_t blocksize); #endif // FILEUTILS_H From 27b3ba041255b434678251cde4508159295c38a2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 30 Mar 2023 22:38:27 +0200 Subject: [PATCH 344/924] text --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4121234df..a8f8d819b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,8 +39,9 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added Mifare Classic EV1 signature write support to gen4 magic tag lua script (@augustozanellato) - Added XOR key extraction and flag to Guardall G-Prox II (@GuruSteve) - Changed verbiage on `hf iclass info` KeyAccess area to be congruent with AA1 and AA2 areas (@GuruSteve) - - Added `hf legic info` command for other sources: `hf legic einfo`, `hf legic view` (@0xdeb) - + - Added `hf legic info` command for other sources (@0xdeb) + - Added `hf legic einfo` - views emulator menory (@0xdeb) + - Changed `hf legic view` - now also print the decoded info of the dump file (@0xdeb) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) From 4d28c852acab53d1654f5f95270ff75a4e6fb145 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 30 Mar 2023 22:40:26 +0200 Subject: [PATCH 345/924] extracted load keys and mfc tag memory based on @didierA and @alejandro12120 PR. --- client/src/cmdhfmf.c | 459 ++++++++++++++++++++++--------------------- 1 file changed, 238 insertions(+), 221 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index d5d0e913b..e4b15c19e 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -38,15 +38,22 @@ #include "wiegand_formats.h" #include "wiegand_formatutils.h" -#define MIFARE_4K_MAXBLOCK 256 -#define MIFARE_2K_MAXBLOCK 128 -#define MIFARE_1K_MAXBLOCK 64 -#define MIFARE_MINI_MAXBLOCK 20 +#define MIFARE_4K_MAXBLOCK 256 +#define MIFARE_2K_MAXBLOCK 128 +#define MIFARE_1K_MAXBLOCK 64 +#define MIFARE_MINI_MAXBLOCK 20 -#define MIFARE_MINI_MAXSECTOR 5 -#define MIFARE_1K_MAXSECTOR 16 -#define MIFARE_2K_MAXSECTOR 32 -#define MIFARE_4K_MAXSECTOR 40 +#define MIFARE_4K_MAXSECTOR 40 +#define MIFARE_2K_MAXSECTOR 32 +#define MIFARE_1K_MAXSECTOR 16 +#define MIFARE_MINI_MAXSECTOR 5 + +#define MIFARE_4K_MAX_BYTES 4096 +#define MIFARE_2K_MAX_BYTES 2048 +#define MIFARE_1K_MAX_BYTES 1024 +#define MIFARE_MINI_MAX_BYTES 320 + +#define MIFARE_KEY_SIZE 6 static int CmdHelp(const char *Cmd); @@ -319,9 +326,9 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { for (uint16_t i = 0; i < n; i++) { if (mfIsSectorTrailer(i)) { e_sector[mfSectorNum(i)].foundKey[0] = 1; - e_sector[mfSectorNum(i)].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), 6); + e_sector[mfSectorNum(i)].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); e_sector[mfSectorNum(i)].foundKey[1] = 1; - e_sector[mfSectorNum(i)].Key[1] = bytes_to_num(d + (i * MFBLOCK_SIZE) + 10, 6); + e_sector[mfSectorNum(i)].Key[1] = bytes_to_num(d + (i * MFBLOCK_SIZE) + 10, MIFARE_KEY_SIZE); } } printKeyTable(sectors, e_sector); @@ -441,6 +448,191 @@ static int mf_analyse_st_block(uint8_t blockno, uint8_t *block, bool force){ return PM3_SUCCESS; } +/* Reads data from tag + * @param card: (output) card info + * @param carddata: (output) card data + * @param numSectors: size of the card + * @param keyFileName: filename containing keys or NULL. +*/ +static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t numSectors, char *keyfn){ + + // Select card to get UID/UIDLEN/ATQA/SAK information + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { + PrintAndLogEx(WARNING, "iso14443a card select timeout"); + return PM3_ETIMEOUT; + } + + uint64_t select_status = resp.oldarg[0]; + if (select_status == 0) { + PrintAndLogEx(WARNING, "iso14443a card select failed"); + return PM3_SUCCESS; + } + + // store card info + memcpy(card, (iso14a_card_select_t *)resp.data.asBytes, sizeof(iso14a_card_select_t)); + + char *fptr = NULL; + if (keyfn == NULL || keyfn[0] == '\0') { + fptr = GenerateFilename("hf-mf-", "-key.bin"); + if (fptr == NULL) + return PM3_ESOFT; + + keyfn = fptr ; + } + + PrintAndLogEx(INFO, "Using... %s", keyfn); + + size_t alen = 0, blen = 0; + uint8_t *keyA, *keyB; + if (loadFileBinaryKey(keyfn, "", (void**)&keyA, (void**)&keyB, &alen, &blen) != PM3_SUCCESS) { + free(fptr); + return PM3_ESOFT; + } + + PrintAndLogEx(INFO, "Reading sector access bits..."); + PrintAndLogEx(INFO, "." NOLF); + + uint8_t rights[40][4] = {0}; + + mf_readblock_t payload; + uint8_t current_key; + for (uint8_t sectorNo = 0; sectorNo < numSectors; sectorNo++) { + current_key = MF_KEY_A; + for (uint8_t tries = 0; tries < MIFARE_SECTOR_RETRY; tries++) { + PrintAndLogEx(NORMAL, "." NOLF); + fflush(stdout); + + payload.blockno = mfFirstBlockOfSector(sectorNo) + mfNumBlocksPerSector(sectorNo) - 1; + payload.keytype = current_key; + + memcpy(payload.key, (current_key == MF_KEY_A) ? keyA + (sectorNo * MIFARE_KEY_SIZE) : keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + + clearCommandBuffer(); + SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); + + if (WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500)) { + + uint8_t *data = resp.data.asBytes; + if (resp.status == PM3_SUCCESS) { + rights[sectorNo][0] = ((data[7] & 0x10) >> 2) | ((data[8] & 0x1) << 1) | ((data[8] & 0x10) >> 4); // C1C2C3 for data area 0 + rights[sectorNo][1] = ((data[7] & 0x20) >> 3) | ((data[8] & 0x2) << 0) | ((data[8] & 0x20) >> 5); // C1C2C3 for data area 1 + rights[sectorNo][2] = ((data[7] & 0x40) >> 4) | ((data[8] & 0x4) >> 1) | ((data[8] & 0x40) >> 6); // C1C2C3 for data area 2 + rights[sectorNo][3] = ((data[7] & 0x80) >> 5) | ((data[8] & 0x8) >> 2) | ((data[8] & 0x80) >> 7); // C1C2C3 for sector trailer + break; + } else if (tries == (MIFARE_SECTOR_RETRY / 2)) { // after half unsuccessful tries, give key B a go + PrintAndLogEx(WARNING, "\ntrying with key B instead..."); + current_key = MF_KEY_B; + PrintAndLogEx(INFO, "." NOLF); + } else if (tries == (MIFARE_SECTOR_RETRY - 1)) { // on last try set defaults + PrintAndLogEx(FAILED, "\ncould not get access rights for sector %2d. Trying with defaults...", sectorNo); + rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00; + rights[sectorNo][3] = 0x01; + } + } else { + PrintAndLogEx(FAILED, "\ncommand execute timeout when trying to read access rights for sector %2d. Trying with defaults...", sectorNo); + rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00; + rights[sectorNo][3] = 0x01; + } + } + } + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, "Finished reading sector access bits"); + PrintAndLogEx(INFO, "Dumping all blocks from card..."); + + for (uint8_t sectorNo = 0; sectorNo < numSectors; sectorNo++) { + for (uint8_t blockNo = 0; blockNo < mfNumBlocksPerSector(sectorNo); blockNo++) { + bool received = false; + current_key = MF_KEY_A; + uint8_t data_area = (sectorNo < 32) ? blockNo : blockNo / 5; + if (rights[sectorNo][data_area] == 0x07) { // no key would work + PrintAndLogEx(WARNING, "access rights do not allow reading of sector %2d block %3d, skipping", sectorNo, blockNo); + continue; + } + + for (uint8_t tries = 0; tries < MIFARE_SECTOR_RETRY; tries++) { + if (mfIsSectorTrailer(blockNo)) { + + // sector trailer. At least the Access Conditions can always be read with key A. + payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; + payload.keytype = current_key; + memcpy(payload.key, (current_key == MF_KEY_A) ? keyA + (sectorNo * MIFARE_KEY_SIZE) : keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + + clearCommandBuffer(); + SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); + received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); + } else { + // data block. Check if it can be read with key A or key B + if ((rights[sectorNo][data_area] == 0x03) || (rights[sectorNo][data_area] == 0x05)) { + // only key B would work + payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; + payload.keytype = MF_KEY_B; + memcpy(payload.key, keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + + clearCommandBuffer(); + SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); + received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); + } else { + // key A would work + payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; + payload.keytype = current_key; + memcpy(payload.key, (current_key == MF_KEY_A) ? keyA + (sectorNo * MIFARE_KEY_SIZE) : keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + + clearCommandBuffer(); + SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); + received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); + } + } + + if (received) { + if (resp.status == PM3_SUCCESS) { + // break the re-try loop + break; + } + if ((current_key == MF_KEY_A) && (tries == (MIFARE_SECTOR_RETRY / 2))) { + // Half the tries failed with key A. Swap for key B + current_key = MF_KEY_B; + + // clear out keyA since it failed. + memset(keyA + (sectorNo * MIFARE_KEY_SIZE), 0x00, MIFARE_KEY_SIZE); + } + } + } + + if (received) { + + if (resp.status == PM3_SUCCESS) { + + uint8_t *data = resp.data.asBytes; + + if (mfIsSectorTrailer(blockNo)) { + // sector trailer. Fill in the keys. + memcpy(data , keyA + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + memcpy(data + 10, keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + } + + memcpy(carddata + (MFBLOCK_SIZE * (mfFirstBlockOfSector(sectorNo) + blockNo)), data, MFBLOCK_SIZE); + PrintAndLogEx(SUCCESS, "successfully read block %2d of sector %2d.", blockNo, sectorNo); + } else { + PrintAndLogEx(FAILED, "could not read block %2d of sector %2d", blockNo, sectorNo); + } + } else { + PrintAndLogEx(WARNING, "command execute timeout when trying to read block %2d of sector %2d.", blockNo, sectorNo); + } + } + } + + free(fptr); + free(keyA); + free(keyB); + + PrintAndLogEx(SUCCESS, "\nSucceeded in dumping all blocks"); + return PM3_SUCCESS ; +} + static int CmdHF14AMfAcl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf acl", @@ -820,6 +1012,7 @@ static int CmdHF14AMfDump(const char *Cmd) { arg_lit0(NULL, "1k", "MIFARE Classic 1k / S50 (def)"), arg_lit0(NULL, "2k", "MIFARE Classic/Plus 2k"), arg_lit0(NULL, "4k", "MIFARE Classic 4k / S70"), + arg_lit0(NULL, "ns", "no save to file"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -836,7 +1029,7 @@ static int CmdHF14AMfDump(const char *Cmd) { bool m1 = arg_get_lit(ctx, 4); bool m2 = arg_get_lit(ctx, 5); bool m4 = arg_get_lit(ctx, 6); - + bool nosave = arg_get_lit(ctx, 7); CLIParserFree(ctx); uint64_t t1 = msclock(); @@ -850,244 +1043,68 @@ static int CmdHF14AMfDump(const char *Cmd) { } uint8_t numSectors = MIFARE_1K_MAXSECTOR; + uint16_t bytes = MIFARE_1K_MAX_BYTES; if (m0) { numSectors = MIFARE_MINI_MAXSECTOR; + bytes = MIFARE_MINI_MAX_BYTES; } else if (m1) { numSectors = MIFARE_1K_MAXSECTOR; + bytes = MIFARE_1K_MAX_BYTES; } else if (m2) { numSectors = MIFARE_2K_MAXSECTOR; - } else if (m4) { + bytes = MIFARE_2K_MAX_BYTES; + } else if (m4) { numSectors = MIFARE_4K_MAXSECTOR; + bytes = MIFARE_4K_MAX_BYTES; } else { PrintAndLogEx(WARNING, "Please specify a MIFARE Type"); return PM3_EINVARG; } - uint8_t sectorNo, blockNo; - uint8_t keyA[40][6]; - uint8_t keyB[40][6]; - uint8_t rights[40][4]; - uint8_t carddata[256][16]; - - FILE *f; - PacketResponseNG resp; - - char *fptr; - - // Select card to get UID/UIDLEN/ATQA/SAK information - clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); - if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { - PrintAndLogEx(WARNING, "iso14443a card select timeout"); - return PM3_ETIMEOUT; + // read card + iso14a_card_select_t card ; + uint8_t *mem = calloc(MIFARE_4K_MAXBLOCK * MFBLOCK_SIZE, sizeof(uint8_t)); + if (mem == NULL) { + PrintAndLogEx(ERR, "failed to allocate memory"); + return PM3_EMALLOC; } - - uint64_t select_status = resp.oldarg[0]; - if (select_status == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); - return PM3_SUCCESS; - } - - // store card info - iso14a_card_select_t card; - memcpy(&card, (iso14a_card_select_t *)resp.data.asBytes, sizeof(iso14a_card_select_t)); - - if (keyFilename[0] == 0x00) { - fptr = GenerateFilename("hf-mf-", "-key.bin"); - if (fptr == NULL) - return PM3_ESOFT; - - strncpy(keyFilename, fptr, sizeof(keyFilename) - 1); - free(fptr); - } - - if ((f = fopen(keyFilename, "rb")) == NULL) { - PrintAndLogEx(WARNING, "Could not find file " _YELLOW_("%s"), keyFilename); - return PM3_EFILE; - } - - PrintAndLogEx(INFO, "Using `" _YELLOW_("%s") "`", keyFilename); - - // Read keys A from file - size_t bytes_read; - for (sectorNo = 0; sectorNo < numSectors; sectorNo++) { - bytes_read = fread(keyA[sectorNo], 1, MFKEY_SIZE, f); - if (bytes_read != MFKEY_SIZE) { - PrintAndLogEx(ERR, "File reading error."); - fclose(f); - return PM3_EFILE; - } - } - - // Read keys B from file - for (sectorNo = 0; sectorNo < numSectors; sectorNo++) { - bytes_read = fread(keyB[sectorNo], 1, MFKEY_SIZE, f); - if (bytes_read != MFKEY_SIZE) { - PrintAndLogEx(ERR, "File reading error."); - fclose(f); - return PM3_EFILE; - } - } - - fclose(f); - - PrintAndLogEx(INFO, "Reading sector access bits..."); - PrintAndLogEx(INFO, "." NOLF); - - uint8_t tries; - mf_readblock_t payload; - uint8_t current_key; - for (sectorNo = 0; sectorNo < numSectors; sectorNo++) { - current_key = MF_KEY_A; - for (tries = 0; tries < MIFARE_SECTOR_RETRY; tries++) { - PrintAndLogEx(NORMAL, "." NOLF); - fflush(stdout); - - payload.blockno = mfFirstBlockOfSector(sectorNo) + mfNumBlocksPerSector(sectorNo) - 1; - payload.keytype = current_key; - - memcpy(payload.key, current_key == MF_KEY_A ? keyA[sectorNo] : keyB[sectorNo], sizeof(payload.key)); - - clearCommandBuffer(); - SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); - - if (WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500)) { - - uint8_t *data = resp.data.asBytes; - if (resp.status == PM3_SUCCESS) { - rights[sectorNo][0] = ((data[7] & 0x10) >> 2) | ((data[8] & 0x1) << 1) | ((data[8] & 0x10) >> 4); // C1C2C3 for data area 0 - rights[sectorNo][1] = ((data[7] & 0x20) >> 3) | ((data[8] & 0x2) << 0) | ((data[8] & 0x20) >> 5); // C1C2C3 for data area 1 - rights[sectorNo][2] = ((data[7] & 0x40) >> 4) | ((data[8] & 0x4) >> 1) | ((data[8] & 0x40) >> 6); // C1C2C3 for data area 2 - rights[sectorNo][3] = ((data[7] & 0x80) >> 5) | ((data[8] & 0x8) >> 2) | ((data[8] & 0x80) >> 7); // C1C2C3 for sector trailer - break; - } else if (tries == (MIFARE_SECTOR_RETRY / 2)) { // after half unsuccessful tries, give key B a go - PrintAndLogEx(WARNING, "\ntrying with key B instead..."); - current_key = MF_KEY_B; - PrintAndLogEx(INFO, "." NOLF); - } else if (tries == (MIFARE_SECTOR_RETRY - 1)) { // on last try set defaults - PrintAndLogEx(FAILED, "\ncould not get access rights for sector %2d. Trying with defaults...", sectorNo); - rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00; - rights[sectorNo][3] = 0x01; - } - } else { - PrintAndLogEx(FAILED, "\ncommand execute timeout when trying to read access rights for sector %2d. Trying with defaults...", sectorNo); - rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00; - rights[sectorNo][3] = 0x01; - } - } - } - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(SUCCESS, "Finished reading sector access bits"); - PrintAndLogEx(INFO, "Dumping all blocks from card..."); - - for (sectorNo = 0; sectorNo < numSectors; sectorNo++) { - for (blockNo = 0; blockNo < mfNumBlocksPerSector(sectorNo); blockNo++) { - bool received = false; - current_key = MF_KEY_A; - uint8_t data_area = (sectorNo < 32) ? blockNo : blockNo / 5; - if (rights[sectorNo][data_area] == 0x07) { // no key would work - PrintAndLogEx(WARNING, "access rights do not allow reading of sector %2d block %3d, skipping", sectorNo, blockNo); - continue; - } - for (tries = 0; tries < MIFARE_SECTOR_RETRY; tries++) { - if (blockNo == mfNumBlocksPerSector(sectorNo) - 1) { // sector trailer. At least the Access Conditions can always be read with key A. - - payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; - payload.keytype = current_key; - memcpy(payload.key, current_key == MF_KEY_A ? keyA[sectorNo] : keyB[sectorNo], sizeof(payload.key)); - - clearCommandBuffer(); - SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); - received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); - } else { // data block. Check if it can be read with key A or key B - if ((rights[sectorNo][data_area] == 0x03) || (rights[sectorNo][data_area] == 0x05)) { // only key B would work - - payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; - payload.keytype = MF_KEY_B; - memcpy(payload.key, keyB[sectorNo], sizeof(payload.key)); - - clearCommandBuffer(); - SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); - received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); - } else { // key A would work - - payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; - payload.keytype = current_key; - memcpy(payload.key, current_key == MF_KEY_A ? keyA[sectorNo] : keyB[sectorNo], sizeof(payload.key)); - - clearCommandBuffer(); - SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); - received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); - } - } - if (received) { - if (resp.status == PM3_SUCCESS) { - // break the re-try loop - break; - } - if ((current_key == MF_KEY_A) && (tries == (MIFARE_SECTOR_RETRY / 2))) { - // Half the tries failed with key A. Swap for key B - current_key = MF_KEY_B; - - // clear out keyA since it failed. - memset(keyA[sectorNo], 0x00, sizeof(keyA[sectorNo])); - } - } - } - - if (received) { - uint8_t *data = resp.data.asBytes; - if (blockNo == mfNumBlocksPerSector(sectorNo) - 1) { // sector trailer. Fill in the keys. - data[0] = (keyA[sectorNo][0]); - data[1] = (keyA[sectorNo][1]); - data[2] = (keyA[sectorNo][2]); - data[3] = (keyA[sectorNo][3]); - data[4] = (keyA[sectorNo][4]); - data[5] = (keyA[sectorNo][5]); - - data[10] = (keyB[sectorNo][0]); - data[11] = (keyB[sectorNo][1]); - data[12] = (keyB[sectorNo][2]); - data[13] = (keyB[sectorNo][3]); - data[14] = (keyB[sectorNo][4]); - data[15] = (keyB[sectorNo][5]); - } - if (resp.status == PM3_SUCCESS) { - memcpy(carddata[mfFirstBlockOfSector(sectorNo) + blockNo], data, 16); - PrintAndLogEx(SUCCESS, "successfully read block %2d of sector %2d.", blockNo, sectorNo); - } else { - PrintAndLogEx(FAILED, "could not read block %2d of sector %2d", blockNo, sectorNo); - } - } else { - PrintAndLogEx(WARNING, "command execute timeout when trying to read block %2d of sector %2d.", blockNo, sectorNo); - } - } + int res = mfc_read_tag(&card, mem, numSectors, keyFilename); + if (res != PM3_SUCCESS) { + free(mem); + return res; } PrintAndLogEx(SUCCESS, "time: %" PRIu64 " seconds\n", (msclock() - t1) / 1000); - PrintAndLogEx(SUCCESS, "\nSucceeded in dumping all blocks"); + // Skip saving card data to file + if (nosave) { + PrintAndLogEx(INFO, "Called with no save option"); + free(mem); + return PM3_SUCCESS; + } + // Save to file if (strlen(dataFilename) < 1) { - fptr = GenerateFilename("hf-mf-", "-dump"); - if (fptr == NULL) + char *fptr = GenerateFilename("hf-mf-", "-dump"); + if (fptr == NULL) { + free(mem); return PM3_ESOFT; + } strcpy(dataFilename, fptr); free(fptr); } - uint16_t bytes = 16 * (mfFirstBlockOfSector(numSectors - 1) + mfNumBlocksPerSector(numSectors - 1)); - - saveFile(dataFilename, ".bin", (uint8_t *)carddata, bytes); - saveFileEML(dataFilename, (uint8_t *)carddata, bytes, MFBLOCK_SIZE); + saveFile(dataFilename, ".bin", mem, bytes); + saveFileEML(dataFilename, mem, bytes, MFBLOCK_SIZE); iso14a_mf_extdump_t xdump; xdump.card_info = card; - xdump.dump = (uint8_t *)carddata; + xdump.dump = mem; xdump.dumplen = bytes; saveFileJSON(dataFilename, jsfCardMemory, (uint8_t *)&xdump, sizeof(xdump), NULL); + free(mem); return PM3_SUCCESS; } @@ -6892,11 +6909,11 @@ static int CmdHF14AMfView(const char *Cmd) { } uint16_t block_cnt = MIN(MIFARE_1K_MAXBLOCK, (bytes_read / MFBLOCK_SIZE)); - if (bytes_read == 320) + if (bytes_read == MIFARE_MINI_MAX_BYTES) block_cnt = MIFARE_MINI_MAXBLOCK; - else if (bytes_read == 2048) + else if (bytes_read == MIFARE_2K_MAX_BYTES) block_cnt = MIFARE_2K_MAXBLOCK; - else if (bytes_read == 4096) + else if (bytes_read == MIFARE_4K_MAX_BYTES) block_cnt = MIFARE_4K_MAXBLOCK; if (verbose) { From e03f7ed6d2db7dcd1e4ce262984fdaab51d6d234 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 30 Mar 2023 22:41:44 +0200 Subject: [PATCH 346/924] text --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8f8d819b..bf31728a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Change `hf mf dump --ns` - dump command now supports `no save` of MFC card memory (@iceman1001) - Added `hf mf gdmsetcfg` - Supprt Gen4 GDM write configuration block (@iceman1001) - Added `hf mf gdmcfg` - Support Gen4 GDM read configuration block (@iceman1001) - Changed magic note to include a section about GDM tags (@iceman1001) From 222ef4e084d969012c1ddf1fe1ea09145d230a58 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 1 Apr 2023 12:24:32 +0200 Subject: [PATCH 347/924] addded static encrypted nonce checks to nested --- armsrc/mifarecmd.c | 33 +++++++++++++++++++++++++++++++-- client/src/cmdhfmf.c | 29 ++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 7eaad3e23..918e977bd 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1154,7 +1154,12 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags, } memcpy(prev_enc_nt, receivedAnswer, 4); if (prev_counter == 5) { - if (g_dbglevel >= DBG_EXTENDED) DbpString("Static encrypted nonce detected, exiting..."); + if (g_dbglevel >= DBG_EXTENDED) { + DbpString("Static encrypted nonce detected, exiting..."); + uint32_t a = bytes_to_num(prev_enc_nt, 4); + uint32_t b = bytes_to_num(receivedAnswer, 4); + Dbprintf("( %08x vs %08x )", a, b); + } isOK = PM3_ESTATIC_NONCE; break; } @@ -1224,6 +1229,9 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 LED_B_ON(); WDT_HIT(); + uint8_t prev_enc_nt[] = {0, 0, 0, 0}; + uint8_t prev_counter = 0; + uint16_t unsuccessful_tries = 0; uint16_t davg = 0; dmax = 0; @@ -1266,11 +1274,13 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 }; // cards with fixed nonce + /* if (nt1 == nt2) { Dbprintf("Nested: %08x vs %08x", nt1, nt2); break; } - + */ + uint32_t nttmp = prng_successor(nt1, 100); //NXP Mifare is typical around 840,but for some unlicensed/compatible mifare card this can be 160 for (i = 101; i < 1200; i++) { nttmp = prng_successor(nttmp, 1); @@ -1292,6 +1302,25 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 isOK = PM3_EFAILED; } } + + if (prev_enc_nt[0] == receivedAnswer[0] && + prev_enc_nt[1] == receivedAnswer[1] && + prev_enc_nt[2] == receivedAnswer[2] && + prev_enc_nt[3] == receivedAnswer[3] + ) { + prev_counter++; + } + memcpy(prev_enc_nt, receivedAnswer, 4); + if (prev_counter == 5) { + if (g_dbglevel >= DBG_EXTENDED) { + DbpString("Static encrypted nonce detected, exiting..."); + uint32_t a = bytes_to_num(prev_enc_nt, 4); + uint32_t b = bytes_to_num(receivedAnswer, 4); + Dbprintf("( %08x vs %08x )", a, b); + } + isOK = PM3_ESTATIC_NONCE; + break; + } } if (rtr > 1) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index e4b15c19e..725a3dff4 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1528,7 +1528,7 @@ static int CmdHF14AMfNested(const char *Cmd) { //TODO: single mode broken? can't PrintAndLogEx(ERR, "Command execute timeout\n"); break; case PM3_EOPABORTED: - PrintAndLogEx(WARNING, "Button pressed. Aborted.\n"); + PrintAndLogEx(WARNING, "Button pressed. Aborted\n"); break; case PM3_EFAILED: PrintAndLogEx(FAILED, "Tag isn't vulnerable to Nested Attack (PRNG is not predictable).\n"); @@ -1536,6 +1536,9 @@ static int CmdHF14AMfNested(const char *Cmd) { //TODO: single mode broken? can't case PM3_ESOFT: PrintAndLogEx(FAILED, "No valid key found"); break; + case PM3_ESTATIC_NONCE: + PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); + break; case PM3_SUCCESS: key64 = bytes_to_num(keyBlock, 6); @@ -1560,7 +1563,7 @@ static int CmdHF14AMfNested(const char *Cmd) { //TODO: single mode broken? can't } return PM3_SUCCESS; default : - PrintAndLogEx(ERR, "Unknown error.\n"); + PrintAndLogEx(ERR, "Unknown error\n"); } return PM3_SUCCESS; @@ -1608,15 +1611,18 @@ static int CmdHF14AMfNested(const char *Cmd) { //TODO: single mode broken? can't PrintAndLogEx(ERR, "Command execute timeout\n"); break; case PM3_EOPABORTED: - PrintAndLogEx(WARNING, "button pressed. Aborted.\n"); + PrintAndLogEx(WARNING, "button pressed. Aborted\n"); break; case PM3_EFAILED : - PrintAndLogEx(FAILED, "Tag isn't vulnerable to Nested Attack (PRNG is not predictable).\n"); + PrintAndLogEx(FAILED, "Tag isn't vulnerable to Nested Attack (PRNG is not predictable)\n"); break; case PM3_ESOFT: //key not found calibrate = false; continue; + case PM3_ESTATIC_NONCE: + PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); + break; case PM3_SUCCESS: calibrate = false; e_sector[sectorNo].foundKey[trgKeyType] = 1; @@ -1625,7 +1631,7 @@ static int CmdHF14AMfNested(const char *Cmd) { //TODO: single mode broken? can't mfCheckKeys_fast(SectorsCnt, true, true, 2, 1, keyBlock, e_sector, false); continue; default : - PrintAndLogEx(ERR, "Unknown error.\n"); + PrintAndLogEx(ERR, "Unknown error\n"); } free(e_sector); return PM3_ESOFT; @@ -2179,13 +2185,13 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { if (isOK) { switch (isOK) { case PM3_ETIMEOUT : - PrintAndLogEx(ERR, "Error: No response from Proxmark3.\n"); + PrintAndLogEx(ERR, "Error: No response from Proxmark3\n"); break; case PM3_EOPABORTED: - PrintAndLogEx(WARNING, "Button pressed. Aborted.\n"); + PrintAndLogEx(WARNING, "Button pressed. Aborted\n"); break; case PM3_ESTATIC_NONCE: - PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted.\n"); + PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); break; default : break; @@ -2841,6 +2847,11 @@ tryNested: } break; } + case PM3_ESTATIC_NONCE: + PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); + free(e_sector); + free(fptr); + return isOK; case PM3_SUCCESS: { calibrate = false; e_sector[current_sector_i].Key[current_key_type_i] = bytes_to_num(tmp_key, 6); @@ -2878,7 +2889,7 @@ tryHardnested: // If the nested attack fails then we try the hardnested attack break; } case PM3_ESTATIC_NONCE: { - PrintAndLogEx(ERR, "\nError: Static encrypted nonce detected. Aborted.\n"); + PrintAndLogEx(ERR, "\nError: Static encrypted nonce detected. Aborted\n"); break; } default: { From 6e0a6aa1e630c6863e81aace77f20278ca1fbd71 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 1 Apr 2023 12:43:34 +0200 Subject: [PATCH 348/924] fix detection --- armsrc/mifarecmd.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 918e977bd..f5e88a34c 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1229,7 +1229,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 LED_B_ON(); WDT_HIT(); - uint8_t prev_enc_nt[] = {0, 0, 0, 0}; + uint32_t prev_enc_nt = 0; uint8_t prev_counter = 0; uint16_t unsuccessful_tries = 0; @@ -1303,20 +1303,16 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 } } - if (prev_enc_nt[0] == receivedAnswer[0] && - prev_enc_nt[1] == receivedAnswer[1] && - prev_enc_nt[2] == receivedAnswer[2] && - prev_enc_nt[3] == receivedAnswer[3] - ) { + + if (nt1 == nt2) { prev_counter++; } - memcpy(prev_enc_nt, receivedAnswer, 4); + prev_enc_nt = nt2; + if (prev_counter == 5) { if (g_dbglevel >= DBG_EXTENDED) { DbpString("Static encrypted nonce detected, exiting..."); - uint32_t a = bytes_to_num(prev_enc_nt, 4); - uint32_t b = bytes_to_num(receivedAnswer, 4); - Dbprintf("( %08x vs %08x )", a, b); + Dbprintf("( %08x vs %08x )", prev_enc_nt, nt2); } isOK = PM3_ESTATIC_NONCE; break; From 3524306bf48f73e15749ade6b0ebf85a5c6f6cef Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Sat, 1 Apr 2023 20:49:15 +0300 Subject: [PATCH 349/924] Implement transfer to other block in `hf mf value` --- CHANGELOG.md | 1 + armsrc/appmain.c | 2 +- armsrc/mifarecmd.c | 26 ++++++- armsrc/mifarecmd.h | 2 +- armsrc/mifareutil.c | 9 +-- client/src/cmdhfmf.c | 163 +++++++++++++++++++++++++++---------------- 6 files changed, 133 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf31728a6..22850bbae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mf value` - ability to use transfer on different block (@AloneLiberty) - Change `hf mf dump --ns` - dump command now supports `no save` of MFC card memory (@iceman1001) - Added `hf mf gdmsetcfg` - Supprt Gen4 GDM write configuration block (@iceman1001) - Added `hf mf gdmcfg` - Support Gen4 GDM read configuration block (@iceman1001) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 6901973f2..ebc7ecb27 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1584,7 +1584,7 @@ static void PacketReceived(PacketCommandNG *packet) { break; } case CMD_HF_MIFARE_VALUE: { - MifareValue(packet->oldarg[0], packet->oldarg[1], packet->data.asBytes); + MifareValue(packet->oldarg[0], packet->oldarg[1], packet->oldarg[2], packet->data.asBytes); break; } case CMD_HF_MIFAREU_WRITEBL: { diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index f5e88a34c..3cc8b1937 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -642,21 +642,28 @@ OUT: } -void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t *datain) { +void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) { // params uint8_t blockNo = arg0; uint8_t keyType = arg1; + uint8_t transferKeyType = arg2; uint64_t ui64Key = 0; + uint64_t transferUi64Key = 0; uint8_t blockdata[16] = {0x00}; ui64Key = bytes_to_num(datain, 6); - memcpy(blockdata, datain + 10, 16); + memcpy(blockdata, datain + 11, 16); + transferUi64Key = bytes_to_num(datain + 27, 6); // variables uint8_t action = datain[9]; + uint8_t transferBlk = datain[10]; + bool needAuth = datain[33]; uint8_t isOK = 0; uint8_t uid[10] = {0x00}; uint32_t cuid = 0; + uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; + uint8_t len = 0; struct Crypto1State mpcs = {0, 0}; struct Crypto1State *pcs; pcs = &mpcs; @@ -686,6 +693,21 @@ void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t *datain) { break; }; + if (needAuth) { + // transfer to other sector + if (mifare_classic_auth(pcs, cuid, transferBlk, transferKeyType, transferUi64Key, AUTH_NESTED)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Nested auth error"); + break; + } + } + + // send transfer (commit the change) + len = mifare_sendcmd_short(pcs, 1, MIFARE_CMD_TRANSFER, (transferBlk != 0) ? transferBlk : blockNo, receivedAnswer, NULL, NULL); + if (len != 1 && receivedAnswer[0] != 0x0A) { // 0x0a - ACK + if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error in transfer: %02x", receivedAnswer[0]); + break; + } + if (mifare_classic_halt(pcs, cuid)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); break; diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index 415e0333d..a6623c006 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -26,7 +26,7 @@ void MifareUC_Auth(uint8_t arg0, uint8_t *keybytes); void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain); void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t *datain); void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain); -void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t *datain); +void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain); void MifareUWriteBlockCompat(uint8_t arg0, uint8_t arg1, uint8_t *datain); void MifareUWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 6f8acc348..668a544b5 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -533,6 +533,8 @@ int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo if (action == 0x01) command = MIFARE_CMD_DEC; + if (action == 0x02) + command = MIFARE_CMD_RESTORE; // Send increment or decrement command len = mifare_sendcmd_short(pcs, 1, command, blockNo, receivedAnswer, receivedAnswerPar, NULL); @@ -567,13 +569,6 @@ int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd send data2 Error: %02x", res); return 2; } - } else { - // send trnasfer (commit the change) - len = mifare_sendcmd_short(pcs, 1, MIFARE_CMD_TRANSFER, blockNo, receivedAnswer, receivedAnswerPar, NULL); - if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK - if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); - return 1; - } } return 0; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 725a3dff4..233d403ee 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -7802,24 +7802,30 @@ static int CmdHF14AMfValue(const char *Cmd) { "hf mf value --blk 16 -k FFFFFFFFFFFF --inc 10\n" "hf mf value --blk 16 -k FFFFFFFFFFFF -b --dec 10\n" "hf mf value --blk 16 -k FFFFFFFFFFFF -b --get\n" + "hf mf value --blk 16 -k FFFFFFFFFFFF --res --transfer 30 --tk FFFFFFFFFFFF --> transfer block 16 value to block 30 (even if block can't be incremented by ACL)\n" "hf mf value --get -d 87D612007829EDFF87D6120011EE11EE\n" - ); + ); void *argtable[] = { - arg_param_begin, - arg_str0("k", "key", "", "key, 6 hex bytes"), - arg_lit0("a", NULL, "input key type is key A (def)"), - arg_lit0("b", NULL, "input key type is key B"), - arg_u64_0(NULL, "inc", "", "Incremenet value by X (0 - 2147483647)"), - arg_u64_0(NULL, "dec", "", "Dcrement value by X (0 - 2147483647)"), - arg_u64_0(NULL, "set", "", "Set value to X (-2147483647 - 2147483647)"), - arg_lit0(NULL, "get", "Get value from block"), - arg_int0(NULL, "blk", "", "block number"), - arg_str0("d", "data", "", "block data to extract values from (16 hex bytes)"), - arg_param_end + arg_param_begin, + arg_str0("k", "key", "", "key, 6 hex bytes"), + arg_lit0("a", NULL, "input key type is key A (def)"), + arg_lit0("b", NULL, "input key type is key B"), + arg_u64_0(NULL, "inc", "", "Increment value by X (0 - 2147483647)"), + arg_u64_0(NULL, "dec", "", "Decrement value by X (0 - 2147483647)"), + arg_u64_0(NULL, "set", "", "Set value to X (-2147483647 - 2147483647)"), + arg_u64_0(NULL, "transfer", "", "Transfer value to other block (after inc/dec/restore)"), + arg_str0(NULL, "tkey", "", "transfer key, 6 hex bytes (if transfer is preformed to other sector)"), + arg_lit0(NULL, "ta", "transfer key type is key A (def)"), + arg_lit0(NULL, "tb", "transfer key type is key B"), + arg_lit0(NULL, "get", "Get value from block"), + arg_lit0(NULL, "res", "Restore (copy value to card buffer, should be used with --transfer)"), + arg_int0(NULL, "blk", "", "block number"), + arg_str0("d", "data", "", "block data to extract values from (16 hex bytes)"), + arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); - uint8_t blockno = (uint8_t)arg_get_int_def(ctx, 8, 1); + uint8_t blockno = (uint8_t)arg_get_int_def(ctx, 13, 1); uint8_t keytype = MF_KEY_A; if (arg_get_lit(ctx, 2) && arg_get_lit(ctx, 3)) { @@ -7830,29 +7836,44 @@ static int CmdHF14AMfValue(const char *Cmd) { keytype = MF_KEY_B;; } + uint8_t transferkeytype = MF_KEY_A; + if (arg_get_lit(ctx, 9) && arg_get_lit(ctx, 10)) { + CLIParserFree(ctx); + PrintAndLogEx(WARNING, "Input key type must be A or B"); + return PM3_EINVARG; + } else if (arg_get_lit(ctx, 10)) { + keytype = MF_KEY_B;; + } + int keylen = 0; uint8_t key[6] = {0}; CLIGetHexWithReturn(ctx, 1, key, &keylen); + int transferkeylen = 0; + uint8_t transferkey[6] = {0}; + CLIGetHexWithReturn(ctx, 8, transferkey, &transferkeylen); + /* Value /Value Value BLK /BLK BLK /BLK 00000000 FFFFFFFF 00000000 10 EF 10 EF - BLK is used to referece where the backup come from, I suspect its just the current block for the actual value ? + BLK is used to reference where the backup come from, I suspect it's just the current block for the actual value ? increment and decrement are an unsigned value set value is a signed value - We are getting signed and/or bigger values to allow a defult to be set meaning users did not supply that option. + We are getting signed and/or bigger values to allow a default to be set meaning users did not supply that option. */ int64_t incval = (int64_t)arg_get_u64_def(ctx, 4, -1); // Inc by -1 is invalid, so not set. - int64_t decval = (int64_t)arg_get_u64_def(ctx, 5, -1); // Inc by -1 is invalid, so not set. + int64_t decval = (int64_t)arg_get_u64_def(ctx, 5, -1); // Dec by -1 is invalid, so not set. int64_t setval = (int64_t)arg_get_u64_def(ctx, 6, 0x7FFFFFFFFFFFFFFF); // out of bounds (for int32) so not set - bool getval = arg_get_lit(ctx, 7); + int64_t trnval = (int64_t)arg_get_u64_def(ctx, 7, -1); // block to transfer to + bool getval = arg_get_lit(ctx, 11); + bool resval = arg_get_lit(ctx, 12); int dlen = 0; uint8_t data[16] = {0}; - CLIGetHexWithReturn(ctx, 9, data, &dlen); + CLIGetHexWithReturn(ctx, 14, data, &dlen); CLIParserFree(ctx); - uint8_t action = 3; // 0 Increment, 1 - Decrement, 2 - Set, 3 - Get, 4 - Decode from data + uint8_t action = 4; // 0 Increment, 1 - Decrement, 2 - Restore, 3 - Set, 4 - Get, 5 - Decode from data uint32_t value = 0; // Need to check we only have 1 of inc/dec/set and get the value from the selected option @@ -7880,7 +7901,7 @@ static int CmdHF14AMfValue(const char *Cmd) { if (setval != 0x7FFFFFFFFFFFFFFF) { optionsprovided++; - action = 2; + action = 3; if ((setval < -2147483647) || (setval > 2147483647)) { PrintAndLogEx(WARNING, "set value must be between -2147483647 and 2147483647. Got %lli", setval); return PM3_EINVARG; @@ -7888,9 +7909,19 @@ static int CmdHF14AMfValue(const char *Cmd) { value = (uint32_t)setval; } + if (resval) { + if (trnval == -1) { + PrintAndLogEx(WARNING, "You can't use restore without using transfer"); + return PM3_EINVARG; + } + + optionsprovided++; + action = 2; + } + if (dlen != 0) { optionsprovided++; - action = 4; + action = 5; if (dlen != 16) { PrintAndLogEx(WARNING, "date length must be 16 hex bytes long, got %d", dlen); return PM3_EINVARG; @@ -7902,49 +7933,59 @@ static int CmdHF14AMfValue(const char *Cmd) { return PM3_EINVARG; } - // dont want to write value data and break something - if ((blockno == 0) || (mfIsSectorTrailer(blockno))) { - PrintAndLogEx(WARNING, "invlaid block number, should be a data block "); + if (trnval != -1 && action > 2) { + PrintAndLogEx(WARNING, "You can't use transfer without using --inc, --dec or --res"); return PM3_EINVARG; } - if (action < 3) { + if (trnval != -1 && transferkeylen == 0 && mfSectorNum(trnval) != mfSectorNum(blockno)) { + PrintAndLogEx(WARNING, "Transfer is preformed to other sector, but no key for new sector provided"); + return PM3_EINVARG; + } + // don't want to write value data and break something + if ((blockno == 0) || (mfIsSectorTrailer(blockno)) || (trnval == 0) || (trnval != -1 && mfIsSectorTrailer(trnval))) { + PrintAndLogEx(WARNING, "invalid block number, should be a data block"); + return PM3_EINVARG; + } + + if (action < 4) { + uint8_t isok = true; if (g_session.pm3_present == false) return PM3_ENOTTY; - - if (action <= 1) { // increment/decrement value + // 0 Increment, 1 - Decrement, 2 - Restore, 3 - Set, 4 - Get, 5 - Decode from data + if (action <= 2) { // increment/decrement/restore value uint8_t block[MFBLOCK_SIZE] = {0x00}; memcpy(block, (uint8_t *)&value, 4); - uint8_t cmddata[26]; + uint8_t cmddata[34]; memcpy(cmddata, key, sizeof(key)); // Key == 6 data went to 10, so lets offset 9 for inc/dec if (action == 0) - PrintAndLogEx(INFO, "value increment by : %d", value); - else - PrintAndLogEx(INFO, "value decrement by : %d", value); + PrintAndLogEx(INFO, "Value incremented by : %d", value); + if (action == 1) + PrintAndLogEx(INFO, "Value decremented by : %d", value); - PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); - - cmddata[9] = action; // 00 if increment, 01 if decrement. - memcpy(cmddata + 10, block, sizeof(block)); + cmddata[9] = action; // 00 if increment, 01 if decrement, 02 if restore + if (trnval != -1) { + cmddata[10] = trnval; // transfer to block + memcpy(cmddata + 27, transferkey, sizeof(transferkey)); + if (mfSectorNum(trnval) != mfSectorNum(blockno)) + cmddata[33] = 1; // should send nested auth + PrintAndLogEx(INFO, "Transfer block no %d to block %d", blockno, trnval); + } else { + cmddata[10] = 0; + PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); + } + memcpy(cmddata + 11, block, sizeof(block)); clearCommandBuffer(); - SendCommandMIX(CMD_HF_MIFARE_VALUE, blockno, keytype, 0, cmddata, sizeof(cmddata)); + SendCommandMIX(CMD_HF_MIFARE_VALUE, blockno, keytype, transferkeytype, cmddata, sizeof(cmddata)); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { PrintAndLogEx(FAILED, "Command execute timeout"); return PM3_ETIMEOUT; } - - if (resp.oldarg[0] & 0xFF) { - // all ok so set flag to read current value - getval = true; - PrintAndLogEx(SUCCESS, "Update ( " _GREEN_("success") " )"); - } else { - PrintAndLogEx(FAILED, "Update ( " _RED_("failed") " )"); - } - + isok = resp.oldarg[0] & 0xff; } else { // set value // To set a value block (or setup) we can use the normal mifare classic write block // So build the command options can call CMD_HF_MIFARE_WRITEBL @@ -7969,17 +8010,14 @@ static int CmdHF14AMfValue(const char *Cmd) { PrintAndLogEx(FAILED, "Command execute timeout"); return PM3_ETIMEOUT; } - int status = resp.oldarg[0]; - if (status) { - // all ok so set flag to read current value - getval = true; - PrintAndLogEx(SUCCESS, "Update ( " _GREEN_("success") " )"); - } else if (status == PM3_ETEAROFF) { - // all ok so set flag to read current value - getval = true; - } else { - PrintAndLogEx(FAILED, "Update ( " _RED_("failed") " )"); - } + isok = resp.oldarg[0] & 0xff; + } + + if (isok) { + PrintAndLogEx(SUCCESS, "Update ... : " _GREEN_("success")); + getval = true; // all ok so set flag to read current value + } else { + PrintAndLogEx(FAILED, "Update ... : " _RED_("failed")); } } @@ -7988,10 +8026,17 @@ static int CmdHF14AMfValue(const char *Cmd) { int32_t readvalue; int res = -1; - if (action == 4) { - res = PM3_SUCCESS; // alread have data from command line + if (action == 5) { + res = PM3_SUCCESS; // already have data from command line } else { - res = mfReadBlock(blockno, keytype, key, data); + if (trnval == -1) { + res = mfReadBlock(blockno, keytype, key, data); + } else { + if (mfSectorNum(trnval) != mfSectorNum(blockno)) + res = mfReadBlock(trnval, transferkeytype, transferkey, data); + else + res = mfReadBlock(trnval, keytype, key, data); + } } if (res == PM3_SUCCESS) { From 0b106665d49706174ae007f130237be6cd5f418b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 2 Apr 2023 06:58:59 +0200 Subject: [PATCH 350/924] MFU ev1 adaptations --- armsrc/iso14443a.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index f5960626e..637215cc3 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1053,6 +1053,30 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // some first pages of UL/NTAG dump is special data mfu_dump_t *mfu_header = (mfu_dump_t *) BigBuf_get_EM_addr(); *pages = MAX(mfu_header->pages, 15); + + // counters and tearing flags + // for old dumps with all zero headers, we need to set default values. + for (uint8_t i = 0; i < 3; i++) { + + counters[i] = le24toh(mfu_header->counter_tearing[i]); + + if (mfu_header->counter_tearing[i][3] != 0x00) { + tearings[i] = mfu_header->counter_tearing[i][3]; + } + } + + // GET_VERSION + if (memcmp(mfu_header->version, "\x00\x00\x00\x00\x00\x00\x00\x00", 8) == 0) { + memcpy(rVERSION, "\x00\x04\x04\x02\x01\x00\x11\x03", 8); + } else { + memcpy(rVERSION, mfu_header->version, 8); + } + AddCrc14A(rVERSION, sizeof(rVERSION) - 2); + + // READ_SIG + memcpy(rSIGN, mfu_header->signature, 32); + AddCrc14A(rSIGN, sizeof(rSIGN) - 2); + } break; case 3: { // MIFARE DESFire @@ -2577,7 +2601,7 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint uint8_t fudan_read[] = { 0x30, 0x01, 0x8B, 0xB9}; ReaderTransmit(fudan_read, sizeof(fudan_read), NULL); if (!ReaderReceive(resp, resp_par)) { - Dbprintf("Card didn't answer to select all"); + if (g_dbglevel >= DBG_INFO) Dbprintf("Card didn't answer to select all"); return 0; } @@ -2626,7 +2650,7 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint // SELECT_ALL ReaderTransmit(sel_all, sizeof(sel_all), NULL); if (!ReaderReceive(resp, resp_par)) { - Dbprintf("Card didn't answer to CL%i select all", cascade_level + 1); + if (g_dbglevel >= DBG_INFO) Dbprintf("Card didn't answer to CL%i select all", cascade_level + 1); return 0; } @@ -2704,7 +2728,7 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint // Receive the SAK if (!ReaderReceive(resp, resp_par)) { - Dbprintf("Card didn't answer to select"); + if (g_dbglevel >= DBG_INFO) Dbprintf("Card didn't answer to select"); return 0; } sak = resp[0]; From bb4dad45d974b9cec9cd01578bd721363150c0b6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 2 Apr 2023 07:00:48 +0200 Subject: [PATCH 351/924] style --- armsrc/mifarecmd.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 3cc8b1937..3ae1933f4 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1356,10 +1356,13 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 LED_C_ON(); // get crypted nonces for target sector - for (i = 0; i < 2 && !isOK; i++) { // look for exactly two different nonces + for (i = 0; ((i < 2) && (isOK == PM3_SUCCESS)); i++) { + + // look for exactly two different nonces target_nt[i] = 0; - while (target_nt[i] == 0) { // continue until we have an unambiguous nonce + // continue until we have an unambiguous nonce + while (target_nt[i] == 0) { // Test if the action was cancelled if (BUTTON_PRESS() || data_available()) { @@ -1373,7 +1376,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 continue; } - if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { + if (iso14443a_select_card(uid, NULL, &cuid, true, 0, true) == false) { if (g_dbglevel >= DBG_INFO) Dbprintf("Nested: Can't select card"); continue; }; @@ -1452,6 +1455,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 memcpy(payload.nt_b, &target_nt[1], 4); memcpy(payload.ks_b, &target_ks[1], 4); + LED_B_ON(); reply_ng(CMD_HF_MIFARE_NESTED, PM3_SUCCESS, (uint8_t *)&payload, sizeof(payload)); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); @@ -1497,7 +1501,7 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, continue; }; - // first colleciton + // first collection if (mifare_classic_authex(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST, &nt1, NULL)) { continue; }; @@ -1519,7 +1523,7 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, nt2 = bytes_to_num(receivedAnswer, 4); target_ks[0] = nt2 ^ target_nt[0]; - // second colleciton + // second collection if (mifare_classic_halt(pcs, cuid)) { continue; @@ -2074,7 +2078,6 @@ void MifareChkKeys(uint8_t *datain, uint8_t reserved_mem) { uint64_t key = 0; uint32_t cuid = 0; - int i, res; uint8_t cascade_levels = 0; struct { uint8_t key[6]; @@ -2113,12 +2116,12 @@ void MifareChkKeys(uint8_t *datain, uint8_t reserved_mem) { set_tracing(false); - for (i = 0; i < key_count; i++) { + for (uint16_t i = 0; i < key_count; i++) { // Iceman: use piwi's faster nonce collecting part in hardnested. - if (!have_uid) { // need a full select cycle to get the uid first + if (have_uid == false) { // need a full select cycle to get the uid first iso14a_card_select_t card_info; - if (!iso14443a_select_card(uid, &card_info, &cuid, true, 0, true)) { + if (iso14443a_select_card(uid, &card_info, &cuid, true, 0, true) == false) { if (g_dbglevel >= DBG_ERROR) Dbprintf("ChkKeys: Can't select card (ALL)"); --i; // try same key once again continue; @@ -2138,7 +2141,7 @@ void MifareChkKeys(uint8_t *datain, uint8_t reserved_mem) { } have_uid = true; } else { // no need for anticollision. We can directly select the card - if (!iso14443a_select_card(uid, NULL, NULL, false, cascade_levels, true)) { + if (iso14443a_select_card(uid, NULL, NULL, false, cascade_levels, true) == false) { if (g_dbglevel >= DBG_ERROR) Dbprintf("ChkKeys: Can't select card (UID)"); --i; // try same key once again continue; @@ -2146,12 +2149,10 @@ void MifareChkKeys(uint8_t *datain, uint8_t reserved_mem) { } key = bytes_to_num(datain + i * 6, 6); - res = mifare_classic_auth(pcs, cuid, blockNo, keyType, key, AUTH_FIRST); - + if (mifare_classic_auth(pcs, cuid, blockNo, keyType, key, AUTH_FIRST)) { // CHK_TIMEOUT(); - - if (res) continue; + } memcpy(keyresult.key, datain + i * 6, 6); keyresult.found = true; @@ -2159,14 +2160,12 @@ void MifareChkKeys(uint8_t *datain, uint8_t reserved_mem) { } LED_B_ON(); + crypto1_deinit(pcs); reply_ng(CMD_HF_MIFARE_CHKKEYS, PM3_SUCCESS, (uint8_t *)&keyresult, sizeof(keyresult)); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); - set_tracing(false); - crypto1_deinit(pcs); - g_dbglevel = oldbg; } From d33fbf1347fb8e361f475d909b5211e6a36411f5 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Thu, 6 Apr 2023 20:54:00 +0800 Subject: [PATCH 352/924] Fix units --- README.md | 8 ++-- bootrom/bootrom.c | 4 +- client/src/cmdhw.c | 2 +- doc/ext_flash_notes.md | 6 +-- .../4_Advanced-compilation-parameters.md | 42 +++++++++---------- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 3edd4e786..20416bdbb 100644 --- a/README.md +++ b/README.md @@ -102,21 +102,21 @@ We define generic Proxmark3 platforms as following devices. When it comes to these new unknown models we are depending on the community to report in if this repo works and what they did to make it work. -**256kb flash memory size of generic Proxmark3 platforms** +**256KB flash memory size of generic Proxmark3 platforms** > ⚠ **Note**: > You need to keep a eye on how large your ARM chip built-in flash memory is. -> With 512kb you are fine but if its 256kb you need to compile this repo with even less functionality. +> With 512KB you are fine but if its 256KB you need to compile this repo with even less functionality. > When running the `./pm3-flash-all` you can see which size your device have if you have the bootloader from this repo installed. > Otherwise you will find the size reported in the start message when running the Proxmark3 client `./pm3`. > -> [OBS! Read the 256kb flash memory advisory](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md#256kb-versions) +> [OBS! Read the 256KB flash memory advisory](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md#256KB-versions) # What has changed? Proxmark3 RDV4 hardware modifications: - * added flash memory 256kb + * added flash memory 256KB * added smart card module * added FPC connector for peripherals such as Bluetooth+battery addon * improved antennas diff --git a/bootrom/bootrom.c b/bootrom/bootrom.c index 9ca0dc430..4c87a65b0 100644 --- a/bootrom/bootrom.c +++ b/bootrom/bootrom.c @@ -310,10 +310,10 @@ void BootROM(void) { LED_B_OFF(); LED_A_OFF(); - // Set the first 256kb memory flashspeed + // Set the first 256KB memory flashspeed AT91C_BASE_EFC0->EFC_FMR = AT91C_MC_FWS_1FWS | MC_FLASH_MODE_MASTER_CLK_IN_MHZ(48); - // 9 = 256, 10+ is 512kb + // 9 = 256, 10+ is 512KB uint8_t id = (*(AT91C_DBGU_CIDR) & 0xF00) >> 8; if (id > 9) AT91C_BASE_EFC1->EFC_FMR = AT91C_MC_FWS_1FWS | MC_FLASH_MODE_MASTER_CLK_IN_MHZ(48); diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index ed208b5f5..3ddd98189 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -133,7 +133,7 @@ static void lookup_chipid_short(uint32_t iChipID, uint32_t mem_used) { break; } - PrintAndLogEx(NORMAL, " Memory.... " _YELLOW_("%u") " Kb ( " _YELLOW_("%2.0f%%") " used )" + PrintAndLogEx(NORMAL, " Memory.... " _YELLOW_("%u") " KB ( " _YELLOW_("%2.0f%%") " used )" , mem_avail , mem_avail == 0 ? 0.0f : (float)mem_used / (mem_avail * 1024) * 100 ); diff --git a/doc/ext_flash_notes.md b/doc/ext_flash_notes.md index 4b2452d2f..d38b56de6 100644 --- a/doc/ext_flash_notes.md +++ b/doc/ext_flash_notes.md @@ -19,9 +19,9 @@ External 256kbytes flash is a unique feature of the RDV4 edition. Flash memory is -* 256kb (0x40000= 262144) -* divided into 4 pages of 64kb (0x10000 = 65536) -* 4 pages divided into 16 sectors of 4kb (0x1000 = 4096), so last sector is at 0x3F000 +* 256KB (0x40000= 262144) +* divided into 4 pages of 64KB (0x10000 = 65536) +* 4 pages divided into 16 sectors of 4KB (0x1000 = 4096), so last sector is at 0x3F000 Therefore a flash address can be interpreted as such: ``` diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index fa1021d0c..5ead60b1a 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -10,7 +10,7 @@ - [PLATFORM](#platform) - [PLATFORM_EXTRAS](#platform_extras) - [STANDALONE](#standalone) - - [256kb versions](#256kb-versions) + - [256KB versions](#256KB-versions) - [Next step](#next-step) @@ -48,10 +48,10 @@ make SKIPBT=1 ## Firmware ^[Top](#top) -By default, the firmware is of course tuned for the Proxmark3 RDV4 device, which has built-in support for 256kb onboard flash SPI memory, Sim module (smart card support), FPC connector. +By default, the firmware is of course tuned for the Proxmark3 RDV4 device, which has built-in support for 256KB onboard flash SPI memory, Sim module (smart card support), FPC connector. These features make it very different from all other Proxmark3 devices, there is non other like this one. -**Recommendation**: if you don't have a RDV4, we strongly recommend your device to have at least a 512kb arm chip, since this repo is crossing 256kb limit. There is still a way to skip parts to make it fit on a 256kb device, see below. +**Recommendation**: if you don't have a RDV4, we strongly recommend your device to have at least a 512KB arm chip, since this repo is crossing 256KB limit. There is still a way to skip parts to make it fit on a 256KB device, see below. If you need to tune things and save the configuration, create a file `Makefile.platform` in the root directory of the repository, see `Makefile.platform.sample`. For an up-to-date exhaustive list of options, you can run `make PLATFORM=`. @@ -73,7 +73,7 @@ The MCU version (256 or 512) will be detected automatically during flashing. Known issues: -* 256kb Arm chip devices: The compiled firmware image from this repo may/will be too large for your device. +* 256KB Arm chip devices: The compiled firmware image from this repo may/will be too large for your device. * PM3 Evo: it has a different led/button pin assignment. It tends to be messed up. * Proxmark Pro: it has different fpga and unknown pin assignments. Unsupported. @@ -136,10 +136,10 @@ Here are the supported values you can assign to `STANDALONE` in `Makefile.platfo By default `STANDALONE=LF_SAMYRUN`. -## 256kb versions +## 256KB versions ^[Top](#top) -If you own a Proxmark3 Easy with only 256kb, you can use a few definitions to help you getting a smaller firmware. +If you own a Proxmark3 Easy with only 256KB, you can use a few definitions to help you getting a smaller firmware. First thing is of course to use the `PLATFORM=PM3GENERIC`. Adding `PLATFORM_SIZE=256` will provoke an error during compilation of the recovery image if your image is too big, so you can detect the problem before trying to flash the Proxmark3, e.g. @@ -155,22 +155,22 @@ a series of `SKIP_*` allow to skip some of the functionalities and to get a smal | Definitions | Rough estimation of the saved space | |---------------------|-------------------------------------| -|STANDALONE= | 3.6kb -|SKIP_LF=1 | 25.8kb -|SKIP_HITAG=1 | 24.2kb -|SKIP_EM4x50=1 | 2.9kb -|SKIP_ISO15693=1 | 3.2kb -|SKIP_LEGICRF=1 | 3.9kb -|SKIP_ISO14443b=1 | 3.7kb -|SKIP_ISO14443a=1 | 63.0kb -|SKIP_ICLASS=1 | 10.5kb -|SKIP_FELICA=1 | 4.0kb -|SKIP_NFCBARCODE=1 | 1.4kb -|SKIP_HFSNIFF=1 | 0.5kb -|SKIP_HFPLOT=1 | 0.3kb -|SKIP_ZX8211=1 | 0.3kb +|STANDALONE= | 3.6KB +|SKIP_LF=1 | 25.8KB +|SKIP_HITAG=1 | 24.2KB +|SKIP_EM4x50=1 | 2.9KB +|SKIP_ISO15693=1 | 3.2KB +|SKIP_LEGICRF=1 | 3.9KB +|SKIP_ISO14443b=1 | 3.7KB +|SKIP_ISO14443a=1 | 63.0KB +|SKIP_ICLASS=1 | 10.5KB +|SKIP_FELICA=1 | 4.0KB +|SKIP_NFCBARCODE=1 | 1.4KB +|SKIP_HFSNIFF=1 | 0.5KB +|SKIP_HFPLOT=1 | 0.3KB +|SKIP_ZX8211=1 | 0.3KB -So for example, at the time of writing, this is a valid `Makefile.platform` compiling an image for 256k: +So for example, at the time of writing, this is a valid `Makefile.platform` compiling an image for 256KB: ``` PLATFORM=PM3GENERIC PLATFORM_SIZE=256 From 82fe8dbe36cddedccc7bccf3b8a6da887fdcadb8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 6 Apr 2023 19:32:07 +0200 Subject: [PATCH 353/924] fix some coverity findings --- client/src/cmdhfmf.c | 58 ++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 42436530a..adcb39d13 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6627,30 +6627,33 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { bool reset_card = arg_get_lit(ctx, 1); uint8_t uid[4]; int uidlen = 0; - CLIParamHexToBuf(arg_get_str(ctx, 2), uid, sizeof(uid), &uidlen); + int res = CLIParamHexToBuf(arg_get_str(ctx, 2), uid, sizeof(uid), &uidlen); CLIParserFree(ctx); - if (uidlen && uidlen != 4) { + if (res || (!res && uidlen && uidlen != sizeof(uid))) { PrintAndLogEx(ERR, "UID must include 8 HEX symbols"); return PM3_EINVARG; } - uint32_t trace = 0; - uint8_t traces[7][16]; - for (trace = 0; trace < 7; trace++) { + #define SUPER_MAX_TRACES 7 + + uint8_t trace = 0; + uint8_t traces[SUPER_MAX_TRACES][16]; + + // read 7 traces from super card + for (trace = 0; trace < SUPER_MAX_TRACES; trace++) { + uint8_t data[] = {0x30, 0x00 + trace}; uint32_t flags = ISO14A_CONNECT | ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_RATS; - clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO14443A_READER, flags, sizeof(data), 0, data, sizeof(data)); - - if (!WaitForResponseTimeout(CMD_ACK, NULL, 1500)) { - break; // Select card + SendCommandMIX(CMD_HF_ISO14443A_READER, flags, sizeof(data), 0, data, sizeof(data)); + if (WaitForResponseTimeout(CMD_ACK, NULL, 1500) == false) { + break; } PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { - break; // Data not received + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { + break; } uint16_t len = resp.oldarg[0] & 0xFFFF; @@ -6661,13 +6664,17 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { memcpy(&traces[trace], resp.data.asBytes, len - 2); } - if (trace == 7) { + // Super card generation 2 + if (trace == SUPER_MAX_TRACES) { + + // no reset on super card generation 2. if (uidlen || reset_card) { PrintAndLogEx(FAILED, "Not supported on this card"); return PM3_SUCCESS; } - for (trace = 0; trace < 7; trace++) { + // recover key from collected traces + for (trace = 0; trace < SUPER_MAX_TRACES; trace++) { uint8_t *trace_data = traces[trace]; nonces_t data; @@ -6692,24 +6699,26 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { data.state = FIRST; uint64_t key64 = -1; - int res = mfkey32_moebius(&data, &key64); - - if (res) { + if (mfkey32_moebius(&data, &key64)) { PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ "_GREEN_("%012" PRIX64) " ]", sprint_hex_inrow(trace_data, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); break; } } } } + } else { + + // Super card generation 1 + // Commands: // a0 - set UID // b0 - read traces // c0 - clear card - bool activate_field = true; bool keep_field_on = true; - int res = 0; + + // change UID on a super card generation 1 if (uidlen) { keep_field_on = false; uint8_t response[6]; @@ -6730,6 +6739,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { return PM3_SUCCESS; } + // reset a super card generation 1 if (reset_card) { keep_field_on = false; uint8_t response[6]; @@ -6756,8 +6766,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { // --------------- First ---------------- uint8_t aFIRST[] = {0x00, 0xa6, 0xb0, 0x00, 0x10}; - res = ExchangeAPDU14a(aFIRST, sizeof(aFIRST), activate_field, keep_field_on, responseA, sizeof(responseA), - &respAlen); + res = ExchangeAPDU14a(aFIRST, sizeof(aFIRST), activate_field, keep_field_on, responseA, sizeof(responseA), &respAlen); if (res != PM3_SUCCESS) { DropField(); return res; @@ -6768,8 +6777,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { keep_field_on = false; uint8_t aSECOND[] = {0x00, 0xa6, 0xb0, 0x01, 0x10}; - res = ExchangeAPDU14a(aSECOND, sizeof(aSECOND), activate_field, keep_field_on, responseB, sizeof(responseB), - &respBlen); + res = ExchangeAPDU14a(aSECOND, sizeof(aSECOND), activate_field, keep_field_on, responseB, sizeof(responseB), &respBlen); if (res != PM3_SUCCESS) { DropField(); return res; @@ -6829,9 +6837,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { PrintAndLogEx(DEBUG, "B AR %08x", data.ar2); uint64_t key64 = -1; - res = mfkey32_moebius(&data, &key64); - - if (res) { + if (mfkey32_moebius(&data, &key64)) { PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%012" PRIX64) " ]", sprint_hex_inrow(outA, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); } else { PrintAndLogEx(FAILED, "failed to recover any key"); From 52f432a967b13d7409428ca8bbecbb28b56ad944 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 8 Apr 2023 09:03:32 +0200 Subject: [PATCH 354/924] fix memory alloc in hf mf rdsc, when sector was larger than 32 --- client/src/cmdhfmf.c | 3 ++- client/src/cmdhfmfp.c | 6 +++--- client/src/mifare/mifare4.c | 10 +++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index adcb39d13..96c5f9fbc 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -927,7 +927,8 @@ static int CmdHF14AMfRdSc(const char *Cmd) { return PM3_EINVARG; } uint8_t sector = (uint8_t)s; - uint8_t sc_size = mfNumBlocksPerSector(sector) * MFBLOCK_SIZE; + uint16_t sc_size = mfNumBlocksPerSector(sector) * MFBLOCK_SIZE; + uint8_t *data = calloc(sc_size, sizeof(uint8_t)); if (data == NULL) { PrintAndLogEx(ERR, "failed to allocate memory"); diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index aa7480953..7c729cdc0 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -738,7 +738,7 @@ static int CmdHFMFPRdbl(const char *Cmd) { keyn[0] = uKeyNum >> 8; keyn[1] = uKeyNum & 0xff; if (verbose) - PrintAndLogEx(INFO, "--block:%d sector[%d]:%02x key:%04x", blockn, mfNumBlocksPerSector(sectorNum), sectorNum, uKeyNum); + PrintAndLogEx(INFO, "--block:%d sector[%u]:%02x key:%04x", blockn, mfNumBlocksPerSector(sectorNum), sectorNum, uKeyNum); mf4Session_t mf4session; int res = MifareAuth4(&mf4session, keyn, key, true, true, true, verbose, false); @@ -837,7 +837,7 @@ static int CmdHFMFPRdsc(const char *Cmd) { keyn[0] = uKeyNum >> 8; keyn[1] = uKeyNum & 0xff; if (verbose) - PrintAndLogEx(INFO, "--sector[%d]:%02x key:%04x", mfNumBlocksPerSector(sectorNum), sectorNum, uKeyNum); + PrintAndLogEx(INFO, "--sector[%u]:%02x key:%04x", mfNumBlocksPerSector(sectorNum), sectorNum, uKeyNum); mf4Session_t mf4session; int res = MifareAuth4(&mf4session, keyn, key, true, true, true, verbose, false); @@ -945,7 +945,7 @@ static int CmdHFMFPWrbl(const char *Cmd) { keyn[0] = uKeyNum >> 8; keyn[1] = uKeyNum & 0xff; if (verbose) - PrintAndLogEx(INFO, "--block:%d sector[%d]:%02x key:%04x", blockNum & 0xff, mfNumBlocksPerSector(sectorNum), sectorNum, uKeyNum); + PrintAndLogEx(INFO, "--block:%d sector[%u]:%02x key:%04x", blockNum & 0xff, mfNumBlocksPerSector(sectorNum), sectorNum, uKeyNum); mf4Session_t mf4session; int res = MifareAuth4(&mf4session, keyn, key, true, true, true, verbose, false); diff --git a/client/src/mifare/mifare4.c b/client/src/mifare/mifare4.c index 1ac6b6fed..058390659 100644 --- a/client/src/mifare/mifare4.c +++ b/client/src/mifare/mifare4.c @@ -407,12 +407,12 @@ int mfpReadSector(uint8_t sectorNo, uint8_t keyType, uint8_t *key, uint8_t *data keyn[0] = uKeyNum >> 8; keyn[1] = uKeyNum & 0xff; if (verbose) - PrintAndLogEx(INFO, "--sector[%d]:%02x key:%04x", mfNumBlocksPerSector(sectorNo), sectorNo, uKeyNum); + PrintAndLogEx(INFO, "--sector[%u]:%02x key:%04x", mfNumBlocksPerSector(sectorNo), sectorNo, uKeyNum); mf4Session_t _session; int res = MifareAuth4(&_session, keyn, key, true, true, true, verbose, false); if (res) { - PrintAndLogEx(ERR, "Sector %d authentication error: %d", sectorNo, res); + PrintAndLogEx(ERR, "Sector %u authentication error: %d", sectorNo, res); return res; } @@ -423,18 +423,18 @@ int mfpReadSector(uint8_t sectorNo, uint8_t keyType, uint8_t *key, uint8_t *data for (int n = firstBlockNo; n < firstBlockNo + mfNumBlocksPerSector(sectorNo); n++) { res = MFPReadBlock(&_session, plain, n & 0xff, 1, false, true, data, sizeof(data), &datalen, mac); if (res) { - PrintAndLogEx(ERR, "Sector %d read error: %d", sectorNo, res); + PrintAndLogEx(ERR, "Sector %u read error: %d", sectorNo, res); DropField(); return res; } if (datalen && data[0] != 0x90) { - PrintAndLogEx(ERR, "Sector %d card read error: %02x %s", sectorNo, data[0], mfpGetErrorDescription(data[0])); + PrintAndLogEx(ERR, "Sector %u card read error: %02x %s", sectorNo, data[0], mfpGetErrorDescription(data[0])); DropField(); return 5; } if (datalen != 1 + 16 + 8 + 2) { - PrintAndLogEx(ERR, "Sector %d error returned data length:%d", sectorNo, datalen); + PrintAndLogEx(ERR, "Sector %u error returned data length:%d", sectorNo, datalen); DropField(); return 6; } From 3386b8a9f6f24c1ef734d3af45d6f086c2394793 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 8 Apr 2023 09:04:20 +0200 Subject: [PATCH 355/924] text --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f04f903b..53c6dcb5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `hf mf rdsc` - now correctly gets size in bytes when sector is larger than 32 (@iceman1001) - Changed `hf mf supercard` - Support editing UID and recovery of keys from second generation card (@AloneLiberty) - Added iClass credit key to default iClass key table and reorganized key order (@GuruSteve) - Changed `hf mf value` - ability to use transfer on different block (@AloneLiberty) From 04f9850b1b5aebd32d2d69963d377338159f007a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 8 Apr 2023 09:52:17 +0200 Subject: [PATCH 356/924] added the possibility to abort the dumping of mifare card clientside --- client/src/cmdhfmf.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 96c5f9fbc..a8dd09386 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -505,6 +505,14 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n PrintAndLogEx(NORMAL, "." NOLF); fflush(stdout); + if (kbd_enter_pressed()) { + PrintAndLogEx(WARNING, "\naborted via keyboard!\n"); + free(fptr); + free(keyA); + free(keyB); + return PM3_EOPABORTED; + } + payload.blockno = mfFirstBlockOfSector(sectorNo) + mfNumBlocksPerSector(sectorNo) - 1; payload.keytype = current_key; From d9035737afb2561a4b8b102bd7283402b934b74e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 8 Apr 2023 11:03:11 +0200 Subject: [PATCH 357/924] style.. --- client/src/cmdhfmf.c | 66 +++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index a8dd09386..c480631c3 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -488,6 +488,9 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n size_t alen = 0, blen = 0; uint8_t *keyA, *keyB; if (loadFileBinaryKey(keyfn, "", (void**)&keyA, (void**)&keyB, &alen, &blen) != PM3_SUCCESS) { + if (keyA) { + free(keyA); + } free(fptr); return PM3_ESOFT; } @@ -829,7 +832,7 @@ static int CmdHF14AMfWrBl(const char *Cmd) { } int status = resp.oldarg[0]; - if (status) { + if (status > 0) { PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); PrintAndLogEx(HINT, "try `" _YELLOW_("hf mf rdbl") "` to verify"); } else if (status == PM3_ETEAROFF) { @@ -7985,7 +7988,12 @@ static int CmdHF14AMfValue(const char *Cmd) { CLIGetHexWithReturn(ctx, 14, data, &dlen); CLIParserFree(ctx); - uint8_t action = 4; // 0 Increment, 1 - Decrement, 2 - Restore, 3 - Set, 4 - Get, 5 - Decode from data + // sanity checks + + + // Action: 0 Increment, 1 - Decrement, 2 - Restore, 3 - Set, 4 - Get, 5 - Decode from data + // iceman: TODO - should be enum + uint8_t action = 4; uint32_t value = 0; // Need to check we only have 1 of inc/dec/set and get the value from the selected option @@ -8040,7 +8048,7 @@ static int CmdHF14AMfValue(const char *Cmd) { } } - if (optionsprovided > 1) { // more then one option provided + if (optionsprovided > 1) { PrintAndLogEx(WARNING, "must have one and only one of --inc, --dec, --set or --data"); return PM3_EINVARG; } @@ -8056,37 +8064,56 @@ static int CmdHF14AMfValue(const char *Cmd) { } // don't want to write value data and break something - if ((blockno == 0) || (mfIsSectorTrailer(blockno)) || (trnval == 0) || (trnval != -1 && mfIsSectorTrailer(trnval))) { + if ((blockno == 0) || + (mfIsSectorTrailer(blockno)) || + (trnval == 0) || + (trnval != -1 && mfIsSectorTrailer(trnval))) { PrintAndLogEx(WARNING, "invalid block number, should be a data block"); return PM3_EINVARG; } if (action < 4) { + uint8_t isok = true; if (g_session.pm3_present == false) return PM3_ENOTTY; + // 0 Increment, 1 - Decrement, 2 - Restore, 3 - Set, 4 - Get, 5 - Decode from data - if (action <= 2) { // increment/decrement/restore value + if (action <= 2) { + uint8_t block[MFBLOCK_SIZE] = {0x00}; memcpy(block, (uint8_t *)&value, 4); - uint8_t cmddata[34]; - memcpy(cmddata, key, sizeof(key)); // Key == 6 data went to 10, so lets offset 9 for inc/dec - if (action == 0) - PrintAndLogEx(INFO, "Value incremented by : %d", value); - if (action == 1) - PrintAndLogEx(INFO, "Value decremented by : %d", value); - cmddata[9] = action; // 00 if increment, 01 if decrement, 02 if restore + uint8_t cmddata[34]; + memcpy(cmddata, key, sizeof(key)); + // Key == 6 data went to 10, so lets offset 9 for inc/dec + + if (action == 0) { + PrintAndLogEx(INFO, "Value incremented by : %d", (int32_t)value); + } + if (action == 1) { + PrintAndLogEx(INFO, "Value decremented by : %d", (int32_t)value); + } + + // 00 if increment, 01 if decrement, 02 if restore + cmddata[9] = action; + if (trnval != -1) { - cmddata[10] = trnval; // transfer to block + + // transfer to block + cmddata[10] = trnval; + memcpy(cmddata + 27, transferkey, sizeof(transferkey)); - if (mfSectorNum(trnval) != mfSectorNum(blockno)) + if (mfSectorNum(trnval) != mfSectorNum(blockno)) { cmddata[33] = 1; // should send nested auth - PrintAndLogEx(INFO, "Transfer block no %d to block %d", blockno, trnval); + } + PrintAndLogEx(INFO, "Transfer block no %u to block %" PRId64, blockno, trnval); + } else { cmddata[10] = 0; - PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); + PrintAndLogEx(INFO, "Writing block no %u, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); } + memcpy(cmddata + 11, block, sizeof(block)); clearCommandBuffer(); @@ -8097,7 +8124,6 @@ static int CmdHF14AMfValue(const char *Cmd) { PrintAndLogEx(FAILED, "Command execute timeout"); return PM3_ETIMEOUT; } - isok = resp.oldarg[0] & 0xff; } else { // set value // To set a value block (or setup) we can use the normal mifare classic write block @@ -8129,7 +8155,8 @@ static int CmdHF14AMfValue(const char *Cmd) { if (isok) { PrintAndLogEx(SUCCESS, "Update ... : " _GREEN_("success")); - getval = true; // all ok so set flag to read current value + getval = true; + // all ok so set flag to read current value } else { PrintAndLogEx(FAILED, "Update ... : " _RED_("failed")); } @@ -8141,7 +8168,8 @@ static int CmdHF14AMfValue(const char *Cmd) { int res = -1; if (action == 5) { - res = PM3_SUCCESS; // already have data from command line + res = PM3_SUCCESS; + // already have data from command line } else { if (trnval == -1) { res = mfReadBlock(blockno, keytype, key, data); From f65d7cbed9fed49f989d63c70cbb642e1cf2858e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 8 Apr 2023 11:15:19 +0200 Subject: [PATCH 358/924] added some more color to the key table output. Should be clear which keys failed now --- client/src/cmdhfmf.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index c480631c3..153d3a8ce 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2861,6 +2861,11 @@ tryNested: } case PM3_ESTATIC_NONCE: PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); + // Show the results to the user + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, _GREEN_("found keys:")); + printKeyTable(sector_cnt, e_sector); + PrintAndLogEx(NORMAL, ""); free(e_sector); free(fptr); return isOK; @@ -2902,6 +2907,11 @@ tryHardnested: // If the nested attack fails then we try the hardnested attack } case PM3_ESTATIC_NONCE: { PrintAndLogEx(ERR, "\nError: Static encrypted nonce detected. Aborted\n"); + // Show the results to the user + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, _GREEN_("found keys:")); + printKeyTable(sector_cnt, e_sector); + PrintAndLogEx(NORMAL, ""); break; } default: { @@ -3880,8 +3890,11 @@ void printKeyTable(uint8_t sectorscnt, sector_t *e_sector) { } void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_sector) { - char strA[12 + 1] = {0}; - char strB[12 + 1] = {0}; + char strA[26 + 1] = {0}; + char strB[26 + 1] = {0}; + char resA[20 + 1] = {0}; + char resB[20 + 1] = {0}; + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); PrintAndLogEx(SUCCESS, " Sec | Blk | key A |res| key B |res"); @@ -3898,7 +3911,7 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto snprintf(strB, sizeof(strB), "%012" PRIX64, e_sector[i].Key[1]); if (e_sector[i].foundKey[0] > 1) { - PrintAndLogEx(SUCCESS, " "_YELLOW_("%03d")" | %03d | " _GREEN_("%s")" | " _YELLOW_("%c")" | " _GREEN_("%s")" | " _YELLOW_("%c") + PrintAndLogEx(SUCCESS, " "_YELLOW_("%03d")" | %03d | " _GREEN_("%s")" | " _BRIGHT_GREEN_("%c")" | " _GREEN_("%s")" | " _BRIGHT_GREEN_("%c") , i , mfSectorTrailerOfSector(i) , strA, e_sector[i].foundKey[0] @@ -3911,11 +3924,27 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto if (start_sector == 0) s = i; - PrintAndLogEx(SUCCESS, " "_YELLOW_("%03d")" | %03d | " _GREEN_("%s")" | " _YELLOW_("%d")" | " _GREEN_("%s")" | " _YELLOW_("%d") + if (e_sector[i].foundKey[0]) { + snprintf(strA, sizeof(strA), _GREEN_("%012" PRIX64), e_sector[i].Key[0]); + snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%d"), 1); + } else { + snprintf(strA, sizeof(strA), _RED_("%s"), "------------"); + snprintf(resA, sizeof(resA), _RED_("%d"), 0); + } + + if (e_sector[i].foundKey[1]) { + snprintf(strB, sizeof(strB), _GREEN_("%012" PRIX64), e_sector[i].Key[1]); + snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%d"), 1); + } else { + snprintf(strB, sizeof(strB), _RED_("%s"), "------------"); + snprintf(resB, sizeof(resB), _RED_("%d"), 0); + } + + PrintAndLogEx(SUCCESS, " " _YELLOW_("%03d") " | %03d | %s | %s | %s | %s" , s , mfSectorTrailerOfSector(s) - , strA, e_sector[i].foundKey[0] - , strB, e_sector[i].foundKey[1] + , strA, resA + , strB, resB ); } } @@ -3933,7 +3962,7 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto " )" ); } else { - PrintAndLogEx(SUCCESS, "( " _YELLOW_("0") ":Failed / " _YELLOW_("1") ":Success )"); + PrintAndLogEx(SUCCESS, "( " _RED_("0") ":Failed / " _GREEN_("1") ":Success )"); } // MAD detection From e4cf3aa7f9a9a6cb0066254c8c08c3445a24e544 Mon Sep 17 00:00:00 2001 From: Esteban Martinena Guerrero Date: Sat, 8 Apr 2023 18:15:11 +0200 Subject: [PATCH 359/924] Fixinf dups --- client/dictionaries/mfc_default_keys.dic | 96 ++++++++---------------- 1 file changed, 32 insertions(+), 64 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 44ec319f5..74dae9555 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -403,13 +403,43 @@ A160FCD5EC4C 361A62F35BC9 # # Transport system Spain +83F3CB98C258 +070D486BC555 +A9B018868CC1 +9DCDB136110C +749934CC8ED3 +506DB955F161 +F088A85E71D7 +72B458D60363 +70C714869DC7 +B32464412EE3 +F253C30568C4 +1C68315674AC +CFE63749080A +C1E6F8AFC9EC +DD0DE3BA08A6 +3D923EB73534 +FF94F86B09A6 +D61707FFDFB1 +8223205047B6 +9951A273DEE7 +C9449301AF93 +66695A45C9FA +89AA9D743812 +C41514DEFC07 +C52876869800 +5353B3AECB53 +2E4169A5C79D +4BB747E48C2A +6285A1C8EB5C +5145C34DBA19 +25352912CD8D +81B20C274C3F 00B70875AF1D 04B787B2F3A5 05412723F1B6 05C301C8795A 066F5AF3CCEE -070D486BC555 -070d486bc555 0A1B6C50E04E 0AD0956DF6EE 0AD6B7E37183 @@ -419,126 +449,64 @@ A160FCD5EC4C 18E887D625B4 1ABC15934F5A 1AF66F83F5BE -1C68315674AC -1c68315674ac -25352912CD8D -25352912cd8d 260480290483 2900AAC52BC3 2910AFE15C99 -2E4169A5C79D -2e4169a5c79d 374521A38BCC 3A4C47757B07 3A524B7A7B37 3C4ABB877EAF -3D923EB73534 -3d923eb73534 3F3A534B7B7B 4B787B273A50 4B92DF1BF25D -4BB747E48C2A -4bb747e48c2a 4F0E4AE8051A -506DB955F161 -506db955f161 -5145C34DBA19 -5145c34dba19 514B797B2F3A 529CF51F05C5 52B26C199862 -5353B3AECB53 -5353b3aecb53 57A18BFEC381 5A7D87876EA8 -6285A1C8EB5C -6285a1c8eb5c 64CBADC7A313 65B6C3200736 -66695A45C9FA -66695a45c9fa 67B1B3A4E497 6B0454D5D3C3 6B3B7AF45777 6C273F431564 702C1BF025DD -70C714869DC7 -70c714869dc7 -72B458D60363 -72b458d60363 738385948494 -749934CC8ED3 -749934cc8ed3 76E450094393 777B1F3A4F4A 7B173A4E4976 81504133B13C -81B20C274C3F -81b20c274c3f -8223205047B6 -8223205047b6 826576A1AB68 -83F3CB98C258 -83f3cb98c258 -89AA9D743812 -89aa9d743812 8A55194F6587 8DFACF11E778 8FD6D76742DC -9951A273DEE7 -9951a273dee7 9AFEE1F65742 9D56D83658AC -9DCDB136110C -9dcdb136110c 9FAC23197904 A1AB3A08712C A514B797B373 A58AB5619631 A5BB18152EF1 A777B233A4F4 -A9B018868CC1 -a9b018868cc1 AB19BC885A29 AB91BDA25F00 AE98BA1E6F2C B133A4D48757 -B32464412EE3 -b32464412ee3 B3A4C47757B0 B6803136F5AF B793ADA6DB0C B95BFDEBA7E4 C0AA2BBD27CD -C1E6F8AFC9EC -c1e6f8afc9ec C27F5C1A9C2B -C41514DEFC07 -c41514defc07 -C52876869800 -c52876869800 -C9449301AF93 -c9449301af93 C9BE49675FE4 CCCE24102003 CDE668FDCDBA -CFE63749080A -cfe63749080a D23A31A4AAB9 -D61707FFDFB1 -d61707ffdfb1 -DD0DE3BA08A6 -dd0de3ba08a6 DEDD7688BC38 E9AE90885C39 -F088A85E71D7 -f088a85e71d7 F0A3C5182007 -F253C30568C4 -f253c30568c4 F3A524B7A7B3 -FF94F86B09A6 -ff94f86b09a6 # # Data from mall # playland balikesir From 7ebc1c85f15d92b0f3705a302f95adaaf4ac3da4 Mon Sep 17 00:00:00 2001 From: Esteban Martinena Guerrero Date: Sat, 8 Apr 2023 18:16:33 +0200 Subject: [PATCH 360/924] No new line at the end --- client/dictionaries/mfc_default_keys.dic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 74dae9555..97e316472 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2106,4 +2106,4 @@ C670A9AD6066 011C6CF459E8 # # Food GEM -6686FADE5566 +6686FADE5566 \ No newline at end of file From fd9c8f4f7eb61184bc56e76c98f2ac5de3fc4f10 Mon Sep 17 00:00:00 2001 From: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> Date: Sun, 9 Apr 2023 08:52:52 +0300 Subject: [PATCH 361/924] Small corrections to MF+ commands Add -k argument to rdbl, fix chk command Signed-off-by: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> --- client/src/cmdhfmfp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 7c729cdc0..6b9c3230d 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -597,6 +597,7 @@ static int CmdHFMFPCommitPerso(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp commitp", "Executes Commit Perso command. Can be used in SL0 mode only.", + "OBS! This command will not be executed if CardConfigKey, CardMasterKey and L3SwitchKey AES keys are not written.", "hf mfp commitp\n" // "hf mfp commitp --sl 1" ); @@ -689,7 +690,7 @@ static int CmdHFMFPRdbl(const char *Cmd) { arg_lit0("b", "keyb", "Use key B (def: keyA)"), arg_lit0("p", "plain", "Plain communication mode between reader and card"), arg_int1(NULL, "blk", "<0..255>", "Block number"), - arg_str0(NULL, "key", "", "Key, 16 hex bytes"), + arg_str0("k", "key", "", "Key, 16 hex bytes"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -1056,7 +1057,8 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA } // 5 - auth error (rnd not equal) - if (res != 5) { + // PM3 client says that RND not equal is -16. Corrected. Seems to work. + if (res != -16) { if (verbose) PrintAndLogEx(ERR, "\nExchange error. Aborted."); else From 2491c2b7723c17195ee9ae70dc200cd219c1711b Mon Sep 17 00:00:00 2001 From: Esteban Martinena Guerrero Date: Sun, 9 Apr 2023 10:15:50 +0200 Subject: [PATCH 362/924] uniq workflow --- .github/workflows/uniq.yaml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/uniq.yaml diff --git a/.github/workflows/uniq.yaml b/.github/workflows/uniq.yaml new file mode 100644 index 000000000..cff2a12fd --- /dev/null +++ b/.github/workflows/uniq.yaml @@ -0,0 +1,20 @@ +name: Check uniq keys + +on: + push: + paths: + - 'client/dictionaries/**' + pull_request: + paths: + - 'client/dictionaries/**' + workflow_dispatch: + + +jobs: + check-unique: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: | + find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " + if [[ $(find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " | grep -v "./" | wc -l) -gt 0 ]]; then exit 1; fi From a1e8161aff03ef7fe1e8a1036ed5470493a7727e Mon Sep 17 00:00:00 2001 From: Esteban Martinena Guerrero Date: Sun, 9 Apr 2023 10:17:15 +0200 Subject: [PATCH 363/924] fix --- .github/workflows/uniq.yaml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/uniq.yaml b/.github/workflows/uniq.yaml index cff2a12fd..2c56c5bbf 100644 --- a/.github/workflows/uniq.yaml +++ b/.github/workflows/uniq.yaml @@ -15,6 +15,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - run: | - find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " - if [[ $(find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " | grep -v "./" | wc -l) -gt 0 ]]; then exit 1; fi + - name: check unique keys in dic filesç + shell: bash + run: | + find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " + if [[ $(find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " | grep -v "./" | wc -l) -gt 0 ]]; then exit 1; fi + From a7abe86efe1b4ddeb4be13c86d78e2eacb8763e8 Mon Sep 17 00:00:00 2001 From: Esteban Martinena Guerrero Date: Sun, 9 Apr 2023 10:24:21 +0200 Subject: [PATCH 364/924] 22.04 --- .github/workflows/uniq.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/uniq.yaml b/.github/workflows/uniq.yaml index 2c56c5bbf..0c4966574 100644 --- a/.github/workflows/uniq.yaml +++ b/.github/workflows/uniq.yaml @@ -12,7 +12,7 @@ on: jobs: check-unique: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 - name: check unique keys in dic filesç From ee7c68dc41900572caa4e3e87897f6f23378b8d3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Apr 2023 12:30:05 +0200 Subject: [PATCH 365/924] remove duplicates --- .../extras/4_byte_most_common_password_uppercase.dic | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/dictionaries/extras/4_byte_most_common_password_uppercase.dic b/client/dictionaries/extras/4_byte_most_common_password_uppercase.dic index 6ede0c0d9..28e8cbee6 100644 --- a/client/dictionaries/extras/4_byte_most_common_password_uppercase.dic +++ b/client/dictionaries/extras/4_byte_most_common_password_uppercase.dic @@ -18048,8 +18048,6 @@ 584f5345 584d584d 584d4153 -584d414e -584d414e 584c5238 584a5144 58495849 @@ -25582,7 +25580,6 @@ 584d4158 584d4153 4c454741 -584d414e 584d414c 584d3435 584d3045 From c9cab3776633e00b9c1b439eb773a38ce92ced5b Mon Sep 17 00:00:00 2001 From: Alejandro Date: Sun, 9 Apr 2023 15:13:12 +0200 Subject: [PATCH 366/924] Updated hf_ultimatecard.lua --- client/luascripts/hf_mf_ultimatecard.lua | 120 ++++++++++++++++------- desktop.ini | 2 + 2 files changed, 85 insertions(+), 37 deletions(-) create mode 100644 desktop.ini diff --git a/client/luascripts/hf_mf_ultimatecard.lua b/client/luascripts/hf_mf_ultimatecard.lua index 93e64e333..8ba901a6e 100644 --- a/client/luascripts/hf_mf_ultimatecard.lua +++ b/client/luascripts/hf_mf_ultimatecard.lua @@ -48,19 +48,22 @@ script run hf_mf_ultimatecard -h -k -c -w -u -t -p arguments = [[ -h this help -c read magic configuration - -u UID (8-14 hexsymbols), set UID on tag + -u UID (8-20 hexsymbols), set UID on tag -t tag type to impersonate - 1 = Mifare Mini S20 4-byte 12 = NTAG 210 - 2 = Mifare Mini S20 7-byte 13 = NTAG 212 - 3 = Mifare 1k S50 4-byte 14 = NTAG 213 - 4 = Mifare 1k S50 7-byte 15 = NTAG 215 - 5 = Mifare 4k S70 4-byte 16 = NTAG 216 - 6 = Mifare 4k S70 7-byte 17 = NTAG I2C 1K - *** 7 = UL - NOT WORKING FULLY 18 = NTAG I2C 2K - *** 8 = UL-C - NOT WORKING FULLY 19 = NTAG I2C 1K PLUS - 9 = UL EV1 48b 20 = NTAG I2C 2K PLUS - 10 = UL EV1 128b 21 = NTAG 213F - *** 11 = UL Plus - NOT WORKING YET 22 = NTAG 216F + 1 = Mifare Mini S20 4-byte + 2 = Mifare Mini S20 7-byte 15 = NTAG 210 + 3 = Mifare Mini S20 10-byte 16 = NTAG 212 + 4 = Mifare 1k S50 4-byte 17 = NTAG 213 + 5 = Mifare 1k S50 7-byte 18 = NTAG 215 + 6 = Mifare 1k S50 10-byte 19 = NTAG 216 + 7 = Mifare 4k S70 4-byte 20 = NTAG I2C 1K + 8 = Mifare 4k S70 7-byte 21 = NTAG I2C 2K + 9 = Mifare 4k S70 10-byte 22 = NTAG I2C 1K PLUS + *** 10 = UL - NOT WORKING FULLY 23 = NTAG I2C 2K PLUS + *** 11 = UL-C - NOT WORKING FULLY 24 = NTAG 213F + 12 = UL EV1 48b 25 = NTAG 216F + 13 = UL EV1 128b + *** 14 = UL Plus - NOT WORKING YET -p NTAG password (8 hexsymbols), set NTAG password on tag. -a NTAG pack ( 4 hexsymbols), set NTAG pack on tag. @@ -210,6 +213,12 @@ local function read_config() elseif atqaf == '00 44' and sak == '08' then cardtype = 'MIFARE 1k S50 7-byte UID' elseif atqaf == '00 42' and sak == '18' then cardtype = 'MIFARE 4k S70 7-byte UID' end + elseif uidlength == '02' then + uid = send("CF".._key.."CE00"):sub(1,20) + if atqaf == '00 84' and sak == '09' then cardtype = 'MIFARE Mini S20 10-byte UID' + elseif atqaf == '00 84' and sak == '08' then cardtype = 'MIFARE 1k S50 10-byte UID' + elseif atqaf == '00 82' and sak == '18' then cardtype = 'MIFARE 4k S70 10-byte UID' + end end elseif ulprotocol == '01' then -- Read Ultralight config only if UL protocol is enabled @@ -286,6 +295,23 @@ local function read_config() lib14a.disconnect() return true, 'Ok' end +--- +-- calculate block0 +local function calculate_block0(useruid) + local uidbytes = utils.ConvertHexToBytes(useruid) + local i = 1 + local bcc = bxor(uidbytes[i], uidbytes[i+1]); + local length = #useruid / 2; + + -- bcc + for i = 3, length, 1 do bcc = bxor(bcc, uidbytes[i]) end + + -- block0 + local block0 = "" + for i = 1, length, 1 do block0 = block0..string.format('%02X', uidbytes[i]) end + + return block0..string.format('%02X', bcc) +end -- -- Writes a UID for MFC and MFUL/NTAG cards local function write_uid(useruid) @@ -301,11 +327,10 @@ local function write_uid(useruid) -- uid string checks if useruid == nil then return nil, 'empty uid string' end if #useruid == 0 then return nil, 'empty uid string' end - if (#useruid ~= 8) and (#useruid ~= 14) then return nil, 'UID wrong length. Should be 4 or 7 hex bytes' end + if (#useruid ~= 8) and (#useruid ~= 14) and (#useruid ~= 20) then return nil, 'UID wrong length. Should be 4, 7 or 10 hex bytes' end print('Writing new UID ', useruid) - local uidbytes = utils.ConvertHexToBytes(useruid) - local bcc1 = bxor(bxor(bxor(uidbytes[1], uidbytes[2]), uidbytes[3]), uidbytes[4]) - local block0 = string.format('%02X%02X%02X%02X%02X', uidbytes[1], uidbytes[2], uidbytes[3], uidbytes[4], bcc1) + local block0 = calculate_block0(useruid) + print('Calculated block0 ', block0) local resp = send('CF'.._key..'CD00'..block0) -- Writes a MFUL UID with bcc1, bcc2 using NTAG21xx commands. elseif ulprotocol == '01' then @@ -625,36 +650,57 @@ local function set_type(tagtype) send("CF".._key.."F000010000000002000978009102DABC19101011121314151644000900") lib14a.disconnect() write_uid('04112233445566') - -- Setting Mifare 1k S50 4--byte + -- Setting Mifare mini S20 10-byte elseif tagtype == 3 then + print('Setting: Ultimate Magic card to Mifare mini S20 10-byte') + connect() + send("CF".._key.."F000020000000002000978009102DABC19101011121314151684000900") + lib14a.disconnect() + write_uid('04112233445566778899') + -- Setting Mifare 1k S50 4--byte + elseif tagtype == 4 then print('Setting: Ultimate Magic card to Mifare 1k S50 4-byte') connect() send("CF".._key.."F000000000000002000978009102DABC19101011121314151604000800") lib14a.disconnect() write_uid('04112233') -- Setting Mifare 1k S50 7-byte - elseif tagtype == 4 then + elseif tagtype == 5 then print('Setting: Ultimate Magic card to Mifare 1k S50 7-byte') connect() send("CF".._key.."F000010000000002000978009102DABC19101011121314151644000800") lib14a.disconnect() write_uid('04112233445566') + -- Setting Mifare 1k S50 10-byte + elseif tagtype == 6 then + print('Setting: Ultimate Magic card to Mifare 1k S50 10-byte') + connect() + send("CF".._key.."F000020000000002000978009102DABC19101011121314151684000800") + lib14a.disconnect() + write_uid('04112233445566778899') -- Setting Mifare 4k S70 4-byte - elseif tagtype == 5 then + elseif tagtype == 7 then print('Setting: Ultimate Magic card to Mifare 4k S70 4-byte') connect() send("CF".._key.."F000000000000002000978009102DABC19101011121314151602001800") lib14a.disconnect() write_uid('04112233') -- Setting Mifare 4k S70 7-byte - elseif tagtype == 6 then + elseif tagtype == 8 then print('Setting: Ultimate Magic card to Mifare 4k S70 7-byte') connect() send("CF".._key.."F000010000000002000978009102DABC19101011121314151642001800") lib14a.disconnect() write_uid('04112233445566') + -- Setting Mifare 4k S70 10-byte + elseif tagtype == 9 then + print('Setting: Ultimate Magic card to Mifare 4k S70 10-byte') + connect() + send("CF".._key.."F000020000000002000978009102DABC19101011121314151682001800") + lib14a.disconnect() + write_uid('04112233445566778899') -- Setting UL - elseif tagtype == 7 then + elseif tagtype == 10 then print('Setting: Ultimate Magic card to UL') connect() send("CF".._key.."F0010100000000030A0A78008102DBA0C119402AB5BA4D321A44000003") @@ -663,7 +709,7 @@ local function set_type(tagtype) write_otp('00000000') -- Setting OTP to default 00 00 00 00 write_version('0000000000000000') -- UL-C does not have a version -- Setting UL-C - elseif tagtype == 8 then + elseif tagtype == 11 then print('Setting: Ultimate Magic card to UL-C') connect() send("CF".._key.."F0010100000000030A0A78008102DBA0C119402AB5BA4D321A44000002") @@ -678,7 +724,7 @@ local function set_type(tagtype) write_uid('04112233445566') write_otp('00000000') -- Setting OTP to default 00 00 00 00 write_version('0000000000000000') -- UL-C does not have a version - elseif tagtype == 9 then + elseif tagtype == 12 then print('Setting: Ultimate Magic card to UL-EV1 48') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000000") @@ -691,7 +737,7 @@ local function set_type(tagtype) write_uid('04112233445566') write_otp('00000000') -- Setting OTP to default 00 00 00 00 write_version('0004030101000b03') -- UL-EV1 (48) 00 04 03 01 01 00 0b 03 - elseif tagtype == 10 then + elseif tagtype == 12 then print('Setting: Ultimate Magic card to UL-EV1 128') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000000") @@ -704,7 +750,7 @@ local function set_type(tagtype) write_uid('04112233445566') write_otp('00000000') -- Setting OTP to default 00 00 00 00 write_version('0004030101000e03') -- UL-EV1 (128) 00 04 03 01 01 00 0e 03 - elseif tagtype == 12 then + elseif tagtype == 15 then print('Setting: Ultimate Magic card to NTAG 210') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -718,7 +764,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040101000b03') -- NTAG210 00 04 04 01 01 00 0b 03 - elseif tagtype == 13 then + elseif tagtype == 16 then print('Setting: Ultimate Magic card to NTAG 212') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -732,7 +778,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040101000E03') -- NTAG212 00 04 04 01 01 00 0E 03 - elseif tagtype == 14 then + elseif tagtype == 17 then print('Setting: Ultimate Magic card to NTAG 213') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -746,7 +792,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040201000F03') -- NTAG213 00 04 04 02 01 00 0f 03 - elseif tagtype == 15 then + elseif tagtype == 18 then print('Setting: Ultimate Magic card to NTAG 215') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -760,7 +806,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040201001103') -- NTAG215 00 04 04 02 01 00 11 03 - elseif tagtype == 16 then + elseif tagtype == 19 then print('Setting: Ultimate Magic card to NTAG 216') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -774,7 +820,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040201001303') -- NTAG216 00 04 04 02 01 00 13 03 - elseif tagtype == 17 then + elseif tagtype == 20 then print('Setting: Ultimate Magic card to NTAG I2C 1K') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -785,7 +831,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040502011303') -- NTAG_I2C_1K 00 04 04 05 02 01 13 03 - elseif tagtype == 18 then + elseif tagtype == 21 then print('Setting: Ultimate Magic card to NTAG I2C 2K') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -796,7 +842,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040502011503') -- NTAG_I2C_2K 00 04 04 05 02 01 15 03 - elseif tagtype == 19 then + elseif tagtype == 22 then print('Setting: Ultimate Magic card to NTAG I2C plus 1K') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -807,7 +853,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040502021303') -- NTAG_I2C_1K 00 04 04 05 02 02 13 03 - elseif tagtype == 20 then + elseif tagtype == 23 then print('Setting: Ultimate Magic card to NTAG I2C plus 2K') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -817,7 +863,7 @@ local function set_type(tagtype) send('a20500000000') write_uid('04112233445566') write_version('0004040502021503') -- NTAG_I2C_2K 00 04 04 05 02 02 15 03 - elseif tagtype == 21 then + elseif tagtype == 24 then print('Setting: Ultimate Magic card to NTAG 213F') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -831,7 +877,7 @@ local function set_type(tagtype) lib14a.disconnect() write_uid('04112233445566') write_version('0004040401000F03') -- NTAG213F 00 04 04 04 01 00 0f 03 - elseif tagtype == 22 then + elseif tagtype == 25 then print('Setting: Ultimate Magic card to NTAG 216F') connect() send("CF".._key.."F001010000000003000978009102DABC19101011121314151644000001") @@ -899,7 +945,7 @@ local function wipe(wtype) io.flush() end print('\n') - err, msg = set_type(3) + err, msg = set_type(4) if err == nil then return err, msg end lib14a.disconnect() return true, 'Ok' @@ -938,7 +984,7 @@ local function wipe(wtype) print('\n') if err then return nil, "Tag locked down, "..err_lock end -- set NTAG213 default values - err, msg = set_type(14) + err, msg = set_type(17) if err == nil then return err, msg end --set UID err, msg = write_uid('04112233445566') diff --git a/desktop.ini b/desktop.ini new file mode 100644 index 000000000..d1a9e47a5 --- /dev/null +++ b/desktop.ini @@ -0,0 +1,2 @@ +[LocalizedFileNames] +hf-mf-02776EA0-dump.bin=@hf-mf-02776EA0-dump.bin,0 From c9b02c269fcec98a28093f1e355f10742bd8978a Mon Sep 17 00:00:00 2001 From: Alejandro Date: Sun, 9 Apr 2023 15:22:44 +0200 Subject: [PATCH 367/924] Update documentation --- desktop.ini | 2 -- doc/magic_cards_notes.md | 51 ++++++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 25 deletions(-) delete mode 100644 desktop.ini diff --git a/desktop.ini b/desktop.ini deleted file mode 100644 index d1a9e47a5..000000000 --- a/desktop.ini +++ /dev/null @@ -1,2 +0,0 @@ -[LocalizedFileNames] -hf-mf-02776EA0-dump.bin=@hf-mf-02776EA0-dump.bin,0 diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 9122f064d..f2bc1c1e2 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -1128,10 +1128,10 @@ A.k.a ultimate magic card, most promenent feature is shadow mode (GTU) and opti Can emulate MIFARE Classic, Ultralight/NTAG families, 14b UID & App Data -- [Identify](#identify) -- [Magic commands](#magic-commands) -- [Characteristics](#characteristics) -- [Proxmark3 commands](#proxmark3-commands) +- [Identify](#identify-16) +- [Magic commands](#magic-commands-9) +- [Characteristics](#characteristics-12) +- [Proxmark3 commands](#proxmark3-commands-9) - [Change ATQA / SAK](#change-atqa--sak) - [Change ATS](#change-ats) - [Set UID length (4, 7, 10)](#set-uid-length-4-7-10) @@ -1186,19 +1186,22 @@ script run hf_mf_ultimatecard -h -k -c -w -u -t -p Arguments -h this help -c read magic configuration - -u UID (8-14 hexsymbols), set UID on tag + -u UID (8-20 hexsymbols), set UID on tag -t tag type to impersonate - 1 = Mifare Mini S20 4-byte 12 = NTAG 210 - 2 = Mifare Mini S20 7-byte 13 = NTAG 212 - 3 = Mifare 1k S50 4-byte 14 = NTAG 213 - 4 = Mifare 1k S50 7-byte 15 = NTAG 215 - 5 = Mifare 4k S70 4-byte 16 = NTAG 216 - 6 = Mifare 4k S70 7-byte 17 = NTAG I2C 1K - *** 7 = UL - NOT WORKING FULLY 18 = NTAG I2C 2K - *** 8 = UL-C - NOT WORKING FULLY 19 = NTAG I2C 1K PLUS - 9 = UL EV1 48b 20 = NTAG I2C 2K PLUS - 10 = UL EV1 128b 21 = NTAG 213F - *** 11 = UL Plus - NOT WORKING YET 22 = NTAG 216F + 1 = Mifare Mini S20 4-byte + 2 = Mifare Mini S20 7-byte 15 = NTAG 210 + 3 = Mifare Mini S20 10-byte 16 = NTAG 212 + 4 = Mifare 1k S50 4-byte 17 = NTAG 213 + 5 = Mifare 1k S50 7-byte 18 = NTAG 215 + 6 = Mifare 1k S50 10-byte 19 = NTAG 216 + 7 = Mifare 4k S70 4-byte 20 = NTAG I2C 1K + 8 = Mifare 4k S70 7-byte 21 = NTAG I2C 2K + 9 = Mifare 4k S70 10-byte 22 = NTAG I2C 1K PLUS + *** 10 = UL - NOT WORKING FULLY 23 = NTAG I2C 2K PLUS + *** 11 = UL-C - NOT WORKING FULLY 24 = NTAG 213F + 12 = UL EV1 48b 25 = NTAG 216F + 13 = UL EV1 128b + *** 14 = UL Plus - NOT WORKING YET -p NTAG password (8 hexsymbols), set NTAG password on tag. -a NTAG pack ( 4 hexsymbols), set NTAG pack on tag. @@ -1365,18 +1368,20 @@ MFC mode 4b UID => UID `00010203` -`script run hf_mf_ultimatecard -t 3 -u 00010203` +`script run hf_mf_ultimatecard -t 4 -u 00010203` MFC mode 7b UID => UID `00010203040506` -`script run hf_mf_ultimatecard -t 3 -u 00010203040506` +`script run hf_mf_ultimatecard -t 5 -u 00010203040506` MFC mode, 10b UID => UID `00010203040506070809` +`script run hf_mf_ultimatecard -t 6 -u 00010203040506070809` + Ultralight mode, 4b UID => UID `00010203` @@ -1387,9 +1392,9 @@ Ultralight mode, 7b UID 👉 the UID is composed of first two blocks as in regular Ultralights * Examples - * UL-EV1 48b = `script run hf_mf_ultimatecard -t 9 -u 00010203040506` - * UL EV1 128b = `script run hf_mf_ultimatecard -t 10 -u 00010203040506` - * NTAG 215 = `script run hf_mf_ultimatecard -t 15 -u 00010203040506` + * UL-EV1 48b = `script run hf_mf_ultimatecard -t 12 -u 00010203040506` + * UL EV1 128b = `script run hf_mf_ultimatecard -t 13 -u 00010203040506` + * NTAG 215 = `script run hf_mf_ultimatecard -t 18 -u 00010203040506` Ultralight mode, 10b UID => UID `00010203040506070809` @@ -1486,10 +1491,10 @@ If you use it, please enter the pre-write mode first. At this time, write the fu After writing, set it to on. At this time, after writing the data, the first time you read the data just written, the next time you read It is the pre-written data. All modes support this operation. It should be noted that using any block to read and write in this mode may give wrong results. Example: -`script run hf_mf_ultimatecard -w 1 -g 00 -t 15 -u 04112233445566 -s 112233445566778899001122334455667788990011223344556677 -p FFFFFFFF -a 8080 -o 11111111 -g 01` +`script run hf_mf_ultimatecard -w 1 -g 00 -t 18 -u 04112233445566 -s 112233445566778899001122334455667788990011223344556677 -p FFFFFFFF -a 8080 -o 11111111 -g 01` * -w 1 = wipe the card in Ultralight Mode * -g 00 = turn on pre-write mode - * -t 15 = change the type of card to NTAG 215 + * -t 18 = change the type of card to NTAG 215 * -u = set the uid * -s = set the signature * -p = set the NTAG password From 438d95b18b44a01e5639499073cf753bef0ea451 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Sun, 9 Apr 2023 15:23:51 +0200 Subject: [PATCH 368/924] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53c6dcb5e..f3c83e155 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added `hf legic info` command for other sources (@0xdeb) - Added `hf legic einfo` - views emulator menory (@0xdeb) - Changed `hf legic view` - now also print the decoded info of the dump file (@0xdeb) + - Now `script run hf_mf_ultimatecard.lua -u` supports 10bytes UID (@alejandro12120) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) From 3cf938c38a3d4f797bda195558974c9b0ec09af1 Mon Sep 17 00:00:00 2001 From: Esteban Martinena Guerrero Date: Sun, 9 Apr 2023 17:57:24 +0200 Subject: [PATCH 369/924] minor job name fix --- .github/workflows/uniq.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/uniq.yaml b/.github/workflows/uniq.yaml index 0c4966574..89f845483 100644 --- a/.github/workflows/uniq.yaml +++ b/.github/workflows/uniq.yaml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 - - name: check unique keys in dic filesç + - name: check unique keys in dic files shell: bash run: | find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " From 5b93326683d2a9709aea509d91dfe79f4ba0dbec Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Apr 2023 18:36:45 +0200 Subject: [PATCH 370/924] remove dups --- client/dictionaries/mfc_default_keys.dic | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 4d7fa7fc4..c432a072e 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2023,11 +2023,5 @@ C49DAE1C6049 3E173F64C01C C670A9AD6066 # -# 1k - the industrialist -2158E314C3DF -# -# 1k - waldorf astoria -011C6CF459E8 -# # Food GEM -6686FADE5566 \ No newline at end of file +6686FADE5566 From e68123a15a2a1df36b09b98506d7153474ba2be5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Apr 2023 18:47:12 +0200 Subject: [PATCH 371/924] remove dups --- ...12_byte_most_common_password_uppercase.dic | 144 - ...16_byte_most_common_password_uppercase.dic | 6 - .../4_byte_most_common_password_uppercase.dic | 1456 -- .../6_byte_most_common_password_uppercase.dic | 11683 ---------------- 4 files changed, 13289 deletions(-) diff --git a/client/dictionaries/extras/12_byte_most_common_password_uppercase.dic b/client/dictionaries/extras/12_byte_most_common_password_uppercase.dic index b1fb16b15..c6c772cf2 100644 --- a/client/dictionaries/extras/12_byte_most_common_password_uppercase.dic +++ b/client/dictionaries/extras/12_byte_most_common_password_uppercase.dic @@ -241,9 +241,7 @@ 50524f445543544944323046 504f57455252414e47455253 504f5745524c494654494e47 -4e4554574f524b494e475045 4d4152494e414d4152494e41 -4c454156454d45414c4f4e45 494445444556494345503054 4855414e474a494e31393837 4845415254425245414b4552 @@ -372,7 +370,6 @@ 563830393533303534343634 554e494e5354414c4c504552 544551554945524f4d554348 -54454d5050415353574f5244 53545241544f564152495553 535441525453455256494345 534f4e595049435455524553 @@ -503,7 +500,6 @@ 51415a575358313233454443 513141325a33573453355836 5043524d43464e534f51572b -50415353574f524431323334 50414d454c41524146544552 4f5645525748454c4d494e47 4e594d50484554414d494e45 @@ -549,14 +545,12 @@ 44425a555253495445535558 434f4f4c45524d4153544552 434f4e46494755524154494f -434f4e46494755524154494f 434f4d4d554e49434154494f 434e464853514746484a4b4d 434c494547414c4941534553 434c41535344455343524950 434954594f46414e47454c53 4349414f4349414f31323334 -4348524953544f5048455231 434845454b594d4f4e4b4559 42555454455253434f544348 4255544c4552414e44534c59 @@ -627,7 +621,6 @@ 535353535353535353535353 5350494445524d414e313233 534f53434136363631323534 -534f4e594552494353534f4e 534f4c444154454e4b4f3230 5349474e4154555245363733 53455645524f4456494e534b @@ -653,13 +646,11 @@ 51415a575358313233313233 51415a31323351415a313233 514138393136383230313233 -513157324533523454355936 513141315a31573253325832 505345545550494e49545245 50524f4752414d4d41424c45 505245434f4d50494c494e47 504c484644434e4445514e54 -504c415953544154494f4e33 50485a544341363346395a55 504554524f5a41564f44534b 504349494445304348414e4e @@ -670,7 +661,6 @@ 4e5552524547554c4c453935 4e4f424f44594e4f424f4459 4e494748545354414c4b4552 -4d534f52434c4f4c45444252 4d534a45544f4c4544423430 4d4f544f524f4c4131323334 4d4d4d4d4d4d4d4d4d4d4d4d @@ -702,7 +692,6 @@ 4a4156415849534856494c49 4a414e45544a41434b534f4e 4950574e524f42454e313233 -494e54454c4c4947454e4345 494e5354414c4c5045525349 494e495449414c495a415449 494c4f5645594f55504b4552 @@ -743,7 +732,6 @@ 44594e414d49435550444154 4452495645525349474e494e 445245524847454547454852 -444b464c425642484a445946 4449534b5354333132303032 44464b54594e425931393836 444644444446343546444748 @@ -872,7 +860,6 @@ 54494d454b494c4c45525353 535645544c414e4131393834 535645544c414e4131393830 -53555045524e41545552414c 53555045524d414e32303130 53554d455254494d45313137 535548313538344453574b39 @@ -934,13 +921,11 @@ 515745313233343536373839 515741535a58313233343536 5155455354504953544f4c53 -51415a575358454443313233 51415a575358434445564652 513151325133513151325133 505946565459424e4a434e4d 505552455246353435343534 50524f53544f595041524f4c -50524f46455353494f4e414c 505249564554505249564554 505249564154454a41594c41 504f4f504945425241494e53 @@ -949,7 +934,6 @@ 504f4c494e41504f4c494e41 50485a5635525446504b5743 50484f544f47524150484552 -5048494c4144454c50484941 504159434f4d303133303032 50415353574f524432303039 50415353574f524431393831 @@ -1063,7 +1047,6 @@ 4742504c54574742504c5457 47414c415441534152415932 465955544b42594632303037 -46594e465946594648424445 46594c485451353535373236 4652494544434849434b454e 464f554e5441494e48454144 @@ -1071,7 +1054,6 @@ 464c4154524f4e4637323042 464c4154524f4e4637303042 464c414d455448524f574552 -46494e414c46414e54415359 46474a52464b42474e425246 4647484a524342564657425a 464544434241414243444546 @@ -1100,7 +1082,6 @@ 444f4954594f555253454c46 444f44474543554d4d494e53 444e413132335a4542524131 -444b464c425642484a444258 444b464c4256424831393838 444a444648454b424e434743 44494d4144494d4144494d41 @@ -1124,7 +1105,6 @@ 435553544f4d4d4152534841 435448555451534552474559 435241534833383233373736 -434f52504552464d4f4e5359 434f4f4c4552424c494b3536 434f4e46494757495a415244 434f4d4d4f4e5745414c5448 @@ -1133,7 +1113,6 @@ 434e48544b4d5942524a4446 4348524953544f4646455231 4348495945554d494e48454d -434845535445524649454c44 4347464342554a43474a4c42 434552464345524643455246 43414c434156454343484941 @@ -1211,7 +1190,6 @@ 353535353535353535353535 353335313438333236313539 353031383737353031383737 -34524656355447423659484e 343630353730383835333431 343536383532343536383532 343530353132343530383234 @@ -1231,7 +1209,6 @@ 32323850415049524f53494d 323031313230313132303131 3151574532415344335a5843 -3151415a3257535833454443 31513241335a345735533658 314752495a5a4c5932303030 3147524545444953474f4f44 @@ -1250,7 +1227,6 @@ 313539333537303530353035 3133363636313347524f4d46 313234353738393836353332 -3132335157454153445a5843 31323351415a343536575358 31323347454e495953333231 313233414243313233414243 @@ -1281,12 +1257,10 @@ 5a5843565a5843565a584356 5a584356424e5a584356424e 5a584356424e4d3132333435 -5a584356424e4d3132333435 5a5843445341515745524656 5a5843445341515745333231 5a5843313233415344343536 5a5834353438383845424159 -5a544e33544f55524e455931 5a4b454e4d49545854564e53 5a455a494d415a455a494d41 5a43465653515248454e4a51 @@ -1316,7 +1290,6 @@ 5941524f534c415632303131 594150494c4f4c494b313535 59414c55424c555345425941 -593654355234453357325131 59305338344a4b58525a5451 585949565a4c4f4d41455348 5858584d4953544552585858 @@ -1347,7 +1320,6 @@ 56544e465641544e46564259 564f564144494d4132383139 564c454f4644484748585850 -564c4144494d49524f564e41 564c4144494d495232303131 564b4f4e54414b5445313131 564a514e544b54414a593533 @@ -1415,7 +1387,6 @@ 54484543484f53454e4f4e45 544841495345555445414d4f 544553544f535445524f4e45 -544551554945524f4d554348 54454c45564f434f4d49474f 544543484e4f4c4f47494553 544455545942513132333435 @@ -1435,7 +1406,6 @@ 535550455243484152474544 535452554354505446434f52 535452415742455252593132 -53545241544f434153544552 535452414e47455239303030 53544f4e45434f4c44333136 53544c4b50534b33554f4349 @@ -1449,9 +1419,6 @@ 534f554e44424c4153544552 534f52424f4e4e4532303131 534f504849454b495454454e -534f4e594552494353534f4e -534f4e594552494353534f4e -534f4e4e454e53434845494e 534f4e493433363334323535 534f4d4553574f5244313233 534f4d4550415353574f5244 @@ -1547,11 +1514,9 @@ 5157504f41534c4b5a584d4e 5157455254594f4e4c494e45 515745525459313530323730 -515745525459313233343536 515745515745515745313233 515745515745313233313233 515745504f49313233303938 -5157454153445a5843313233 515741535a58585a53415751 5155414e5434333032303030 515541445249464f474c494f @@ -1572,7 +1537,6 @@ 513839353030323832323934 513830363639373037313637 51375458464f464758305142 -513157324533523454355936 513157324533413153324433 513157314531523154315931 513151315131513151315131 @@ -1617,7 +1581,6 @@ 50415353574f524432303033 50415353574f524431393936 50415353574f524431393932 -50415353574f524431393932 504152414d4f524531323334 504152414449534552494f53 504150494e41444f43484b41 @@ -1643,7 +1606,6 @@ 4f4c4f4c4f54524f4c4f4c4f 4f4c45473132333435363738 4f444e4f4b4c4153534e494b -4e5554544552544f4f4c5331 4e544b54414a593132343135 4e4f564f4752414432303131 4e4f5649454d425245323031 @@ -1672,7 +1634,6 @@ 4d594c454e454641524d4552 4d5939353038363639323532 4d555354414e474754353030 -4d555354414e474754353030 4d5553494349534d594c4946 4d554c544946554e4354494f 4d4f554e5441494e42494b45 @@ -1703,7 +1664,6 @@ 4d4153545552424143495941 4d41535445524b4559313233 4d4153544552424c41535445 -4d415353494d494c49414e4f 4d41534c454e4e494b4f5641 4d41524d454c41444f344b41 4d41524c4f4e4252414e444f @@ -2252,13 +2212,10 @@ 313238343132383431323030 313234353738323335363839 313234353738313234353738 -3132335157454153445a5843 -3132335157454153445a5843 313233515745313233415344 31323351415a313233575358 313233455751313233455751 313233454443585a41515753 -313233343536515745525459 313233343536414141414141 313233343536375341534841 3132333435363738564f5641 @@ -2319,10 +2276,7 @@ 5a5843564644534151574552 5a584356424e4e425643585a 5a584356424e4d5157415341 -5a584356424e313233343536 5a5843415344515745333231 -5a5843415344515745333231 -5a5843415344515745313233 5a5843415344515745313131 5a5843415344313233515745 5a5843393738353039303039 @@ -2365,10 +2319,8 @@ 5a4152494e41455231333538 5a4152454348494531393638 5a4152415a415a4152415a41 -5a4151585357434445564652 5a4151585357313233343536 5a415157535858535751415a -5a4151315853573243444533 5a4151314d4a553756465234 5a414c494e415a414c494e41 5a414941534f4c4e43453836 @@ -2415,7 +2367,6 @@ 594b414e464c435141444855 594a594c54524d4b50324350 594a56544849524a4b423232 -594a4453514746484a4b4d31 594a4453515f4746484a4b4d 594a444a5854485246434352 594a444a484a434342514352 @@ -2481,7 +2432,6 @@ 57554c465641524c4f4b4131 57535852465659484e373737 575358454443524656544742 -5753345a564d383556535551 575249544552535041434531 57524553544c494e47313233 574f57303731373839373838 @@ -2538,7 +2488,6 @@ 57414c54455257414c544552 57414c4c494e47544f4e3434 57414c4b494554414c4b4945 -57414954414e44424c454544 5741434854574f4f52443132 573931343033393135363057 565731373432565731373432 @@ -2601,7 +2550,6 @@ 56494b544f52494131393933 56494b544f52323030383038 56494b544f52303138343230 -56494b4156494b4156494b41 56494b4156494b4131393934 56494b413139393656494b41 56494b413135303331393936 @@ -2659,7 +2607,6 @@ 564552494649434154494f4e 5645524554454e4e494b4f56 56454e474c4f56534b415941 -56454c4f4349524150544f52 564548464e4e423132333435 564548454645434f4d495449 56445744514b5147355a4e46 @@ -2712,7 +2659,6 @@ 554e49564552534954415249 554e4956455253414c373737 554e495445444b494e444f4d -554e494e5354414c4c53514c 554e44455254414b45523230 554e44455254414b45523135 554e44455247524f554e4431 @@ -2730,7 +2676,6 @@ 554455424a465242505a4257 554452454e414c494e453230 554446484c54514352465a35 -554348494841534153554b45 554348494841495441434849 554259425a4e454b4b425946 55425052514d534933524452 @@ -2850,7 +2795,6 @@ 54424a485642373856523834 54415459414e413132333435 5441545549524f565348494b -5441534b464f524345313431 5441524153414b4134373437 544152414b4153484b415941 54414e4e454e4241554d3037 @@ -3050,7 +2994,6 @@ 53494c564552464953483830 53494c564552434841495238 53494c564130353037313939 -53494c4d4152494c4c494f4e 53494c4c5942464554495348 53494c49434f4e42524f5354 53494c454e544b494c4c4552 @@ -3079,7 +3022,6 @@ 534845524c4f434b32323142 534843595851565450444c54 534841574e414e444e415445 -534841525053484f4f544552 534841524f395441594c4f52 534841524f365441594c4f52 534841504553484946544552 @@ -3139,7 +3081,6 @@ 5345434f4e445345434f4e44 53454241535449414e313938 53454241535449414e313233 -53454241535449414e313233 53454241535449414e303037 5345415045434b5348524950 534541435343494c414e5931 @@ -3172,7 +3113,6 @@ 534155484152443131464f4f 534154484553484b554d4152 534154414e41533639303931 -534153554b45554348494841 5341534b415443484557414e 534153484157574531393937 53415348414e454348414556 @@ -3183,7 +3123,6 @@ 53415241414c564553313233 5341505048495245424c5545 53414e54414352555a323031 -53414e4652414e434953434f 53414e454b33303536393839 53414e4452494e4142415241 53414e444545503132333435 @@ -3388,7 +3327,6 @@ 515745525459553132333435 5157455254594e425643585a 5157455254594d414e49414b -515745525459415344464748 515745525459373834353132 515745525459323030393931 515745525459315132573345 @@ -3409,7 +3347,6 @@ 515745415344415344515745 515745373839515745373839 51574531415344325a584333 -515741535a58455244464356 515734383135313632333432 515733345254363755493930 515655555351414451493236 @@ -3434,7 +3371,6 @@ 51415a5a415151415a5a4151 51415a585357313233313233 51415a575358515745525459 -51415a575358454443524656 51415a57535845444351415a 51415a575358454443373737 51415a575358454443313539 @@ -3458,8 +3394,6 @@ 513839323134303931343137 513757384539413453354436 513159365732543545335234 -513157324533523454355936 -513157324533523454355936 513157324533523433343532 513157324533345235543659 513157324533313233515745 @@ -3472,7 +3406,6 @@ 505759454f39385a53463452 50555441515545504152494c 50555353594d554e43484552 -50555353594d4f4e53544552 5055535359434154444f4c4c 505553535941535354495453 505552504c4550454f504c45 @@ -3482,7 +3415,6 @@ 50554d5045524e49434b454c 50554c4c41504f494b413132 505546595354494b32353137 -505459424e58545647424a59 50544b54594a554b4650465a 50544b5459465a4e48464446 50535943484f4c4f47495354 @@ -3768,7 +3700,6 @@ 4e4947485450524f574c4552 4e494748544d415245313233 4e4947485443524f574c4552 -4e49474854435241574c4552 4e4947474552464147474f54 4e49455749454d4a414b4945 4e49454c534953434f4f4c31 @@ -3817,7 +3748,6 @@ 4e454944453036313137322e 4e45485256545942434e4659 4e45444c4f47333331393936 -4e4543524f4e4f4d49434f4e 4e4458383736423346354748 4e4256464e42313233343536 4e425133555535534d584947 @@ -3894,9 +3824,6 @@ 4d5057504a5155394a45564b 4d50474f454c575958595136 4d4f544f5253434f4f544552 -4d4f544845524655434b4552 -4d4f544845524655434b4552 -4d4f544845524655434b4552 4d4f53484154494e4b4f5233 4d4f53434f574d4f53434f57 4d4f524e494e47474c4f5259 @@ -3940,7 +3867,6 @@ 4d4952414e44414d45524945 4d494e5954414e4144594139 4d494e494d414c495354494b -4d494e454352414654313233 4d494e454352414654303037 4d494e44465245414b313233 4d494c594153494b32303036 @@ -4045,7 +3971,6 @@ 4d41524959414d4152495941 4d41524954494d5553313233 4d4152494e45434f52505332 -4d4152494e414d4152494e41 4d4152494e41323030353931 4d4152494e41313331313933 4d4152494e41313233343536 @@ -4114,7 +4039,6 @@ 4d32304d32304d32304d3230 4d3141324b33533453355336 4d3141324b33533449354d36 -4d3141324b33533449354d36 4d314131523149314e314131 4d31355331354d3134453137 4d3131313232323333334141 @@ -4164,7 +4088,6 @@ 4c4f56313233343536373839 4c4f554748424f524f554748 4c4f535450524f5048455453 -4c4f535450524f5048455453 4c4f5354494e414c41534b41 4c4f53454b4f4b4f544f5345 4c4f524e45594c4f524e4559 @@ -4183,7 +4106,6 @@ 4c4f4c494b554c4131393938 4c4f4c353332393535363935 4c4f4c3132334c4f4c343536 -4c4f4c313233343536373839 4c4f4b4f4d4f544956313233 4c4f4b4f494c4f5645594f55 4c4f4b494c4f4c3132333435 @@ -4196,7 +4118,6 @@ 4c4a524e4a484c4250544b4d 4c4a524e4a48373832323835 4c4a4b554a4748454c595351 -4c4a4b554a4748454c595351 4c4a434e454750465248534e 4c49584c49584c49584c4958 4c49565245505241564f4152 @@ -4477,7 +4398,6 @@ 4a56514f555a53444232534e 4a55535450415353574f5244 4a555354494e4a555354494e -4a555354494e424945424552 4a5550494c455250494e4b45 4a554e4e452e57494c534f4e 4a554e494f52464c4f524553 @@ -4560,7 +4480,6 @@ 4a4152454447414d45533232 4a414e4147414e414d414e41 4a414d455343484146464559 -4a414d4553424f4e44303037 4a414d313233343536373839 4a414c564159555649484152 4a41434f424f424f32313132 @@ -4735,7 +4654,6 @@ 484950484f50484950484f50 48494f52544844414d49454e 48494e445155415254455253 -48494c544f4e505446434f52 48494c4c544f503335323437 48494c464947455232303030 48494c444547415244313233 @@ -4812,7 +4730,6 @@ 47544e484a435a594a444258 47544d56504a56553732445a 47544854524854434e4a5237 -475448444a47484258425946 475444425746564652434256 475441313232393633303034 475352425649454837414d4a @@ -5069,7 +4986,6 @@ 464b54524346594c484a4459 464b54524346594c48373737 464b54524346594c48313233 -464b54524346594c48313233 464b544946474a474a444258 464b4b4a4c534a594b465159 464b42594a58524631393934 @@ -5312,7 +5228,6 @@ 444a4d415448414641434b41 444a4d41524b555348313435 444a4b554a5548464c313235 -444a4b554a5548464c313235 444a4b4a584654444352465a 444a4b4a4c464843524a554a 444a44463130303531393830 @@ -5497,7 +5412,6 @@ 435452465059535147454743 435450455445525332303030 43544855545444464b545946 -435448555451435448555451 435448545546435448545546 435448545546373635343332 4354484e424142524657425a @@ -5694,7 +5608,6 @@ 42595742524b4a47544c425a 4259524154494e4f31393932 42594e544844545957425a39 -425658515458424d335a4d56 425647484a4442504657425a 42555a5a534841434b4c4552 42555454455246494e474552 @@ -5937,15 +5850,12 @@ 4153444647485a584356424e 415344464748515745525459 4153444647484a4b4c51415a -4153444647484a4b4c313233 415344464748415344464748 415344313233515745343536 -415344313233343536373839 41534153494e473230303030 41534153494e313939383732 415341534153415341534153 4153324d3033444f54313833 -4153324d3033444f54313833 415331325157313241533333 415331324446333447483536 415331323334353637383930 @@ -5987,7 +5897,6 @@ 41504f4c494e415249413838 41503532524931374c413537 414e545249504f5030373233 -414e54515545454e32303130 414e544f4e494f4341524c4f 414e544f4e414e544f4e4f56 414e544943495041544f5259 @@ -6007,7 +5916,6 @@ 414e4a41494c4f5645594f55 414e494e4156494741544f52 414e494d45464f5245564552 -414e494d45464f5245564552 414e494d4546414e30393435 414e494d45314d414e474131 414e494d414c524545464552 @@ -6050,7 +5958,6 @@ 414e44524549474152434941 414e44524542524947414445 414e44524541313930393035 -414e4445524c455932303131 414e4349454e543445564552 414e41544f4c494556494348 414e41535441534959413138 @@ -6868,12 +6775,9 @@ 3151574552545955494f5035 3151415a5843444533325753 3151415a5345444346544742 -3151415a3257535833454443 -3151415a3257535833454443 3151415a3233574553445843 315141535732334544465234 315135413257365333453444 -315132573345345235543659 315132573345345232303030 315132573345334532573151 315132573345315132573345 @@ -7114,7 +7018,6 @@ 313233353738393531323351 313233353332363033323135 313233345245575131323334 -313233345157455241534446 313233344153444631323334 313233343559464c4a544b4a 3132333435564954414c494b @@ -7127,22 +7030,18 @@ 313233343541313233343541 313233343536564943544f52 31323334353653455247494f -313233343536515745525459 313233343536515745415344 31323334353651415a575358 -31323334353651415a575358 3132333435364d4152494e41 3132333435364c454731304e 313233343536393837363534 313233343536373854455354 31323334353637384c4f5645 313233343536373841424344 -3132333435363738395a5843 313233343536373839565656 313233343536373839535353 313233343536373839525553 313233343536373839524f44 -313233343536373839515745 313233343536373839515345 313233343536373839504f50 3132333435363738394f4c41 @@ -7159,10 +7058,8 @@ 313233343536373839454c49 313233343536373839424f53 313233343536373839424d57 -313233343536373839415344 313233343536373839415254 313233343536373839414c45 -313233343536373839414243 313233343536373839393939 313233343536373839393531 313233343536373839373839 @@ -7350,7 +7247,6 @@ 5a5a5a5a4d504f5254455239 5a5a5a5a4141313130393939 5a5a5a5a3231303831393933 -5a5a5a585858434343565656 5a5a5a585858434343313233 5a5a5a585858434343313131 5a5a5a583039303131393937 @@ -7368,7 +7264,6 @@ 5a5a5a3132335a5a5a313233 5a5a5a313233343536373839 5a5a5a5f3132333433343132 -5a5a5a3131315a5a5a323232 5a5a5a3131315a5a5a313131 5a5a5a303554414241444147 5a5a5a303036383136585858 @@ -7522,7 +7417,6 @@ 5a584356424e4d4153313233 5a584356424e4d4131393736 5a584356424e4d3938373635 -5a584356424e4d3938373635 5a584356424e4d3737374552 5a584356424e4d3535353535 5a584356424e4d3534363738 @@ -7530,7 +7424,6 @@ 5a584356424e4d3332303236 5a584356424e4d3239303036 5a584356424e4d3132333639 -5a584356424e4d3132333435 5a584356424e4d3131313131 5a584356424e4d3038363432 5a584356424e4d3030303030 @@ -7560,8 +7453,6 @@ 5a5843464953484b415a5843 5a5843464748313533393537 5a58434453415a5843445341 -5a5843445341515745333231 -5a5843445341515745333231 5a584344534141534443585a 5a584343585a5a5a5a565656 5a584343585a5a584343585a @@ -7572,7 +7463,6 @@ 5a5843415344515745525459 5a5843415344515745524656 5a5843415344515745373737 -5a5843415344515745313233 5a5843415344515745313133 5a5843415344465157455254 5a584339383733323143585a @@ -7597,7 +7487,6 @@ 5a5841535157313243444533 5a5841535157313234353738 5a5841535157313233343536 -5a5841535157313233343536 5a58414e355a585045384351 5a5838393232363430373537 5a5838373635343332315a58 @@ -8870,18 +8759,14 @@ 5a41515a4151313233333231 5a41515a4151313233313233 5a4151585357454443313233 -5a4151585357434445564652 5a4151585357434445524656 5a4151585357434445373839 5a4151585357434445333231 -5a4151585357434445313233 5a4151585357313539333537 -5a41515753585a4151575358 5a4151575358585357454443 5a4151575358515741535a58 5a4151575358434649463133 5a4151575358434445373737 -5a4151575358434445333231 5a4151575358434445303039 5a4151575358383836303932 5a4151575358313938373133 @@ -8897,12 +8782,9 @@ 5a4151385853573543444533 5a415134373132353351415a 5a4151315853573247313233 -5a4151315853573243444533 5a4151315853573233454443 5a4151314057535843444533 5a415131343751415a373431 -5a4151313257535843444533 -5a4151313257535833454443 5a41513132335a4151333231 5a41513132335a4151313233 5a4151313233585357343536 @@ -9742,7 +9624,6 @@ 5954594d5246333636323735 5954594a4856464b4d595351 5954594a4856464b4d59465a -5954594a4856464b4d59465a 595459464f4e4f4641474f57 595459464442434e4d363636 59545944595641434957494e @@ -9854,7 +9735,6 @@ 59544454434e464631313036 595444504b4a564654494d43 595444504b46565344464e4d -595444504b46565344464e4d 595444484a4b4a55425a3734 595444464b5a4952464b4a4b 59544443545647484244544e @@ -10022,7 +9902,6 @@ 594f5741524d414348494e45 594f56454e544f3838303830 594f55594f55594f55594f55 -594f55594f55594f55594f55 594f55594f55313539333537 594f555849414f444553494b 594f55574f4e544b4e4f5732 @@ -10044,7 +9923,6 @@ 594f55533235303331363131 594f55525448454f4e453130 594f555250415353574f5244 -594f555250415353574f5244 594f55524f55545349444552 594f55524e414e5344454144 594f55524e414d4548455245 @@ -10368,7 +10246,6 @@ 594a4453514746484a4b4d35 594a4453514746484a4b4d32 594a4453514746484a4b4d30 -594a4453515f4746484a4b4d 594a4453514345594c53484d 594a445351334746484a4b4d 594a445351324746484a4b4d @@ -10695,7 +10572,6 @@ 5946434e5a434a4b59575432 5946434e5a43454754483232 5946434e5a43424446544446 -5946434e5a43424446544446 5946434e5a4256424b545946 5946434e5a5f425f56424946 5946434e5a4246594c485451 @@ -11187,7 +11063,6 @@ 5941524f534c415631393934 5941524f534c415631393933 5941524f534c415631393931 -5941524f534c415631393931 5941524f534c415631393930 5941524f534c415631343036 5941524f53485f54414e5941 @@ -11495,7 +11370,6 @@ 593730473733493933443939 5936575658384c5756545a52 5936554e353035453749564e -593654355234453357325131 593654355234345235543659 593646595044305831474e56 593645484953545041434b4a @@ -11540,7 +11414,6 @@ 59315356394b4d4548585437 5931464a3937464a31363947 59314232523342344e354636 -59314232523342344e354636 593141374e30413959414e41 59313937413538385239304f 5931354b3236523037443034 @@ -11608,7 +11481,6 @@ 5858585a494e415858583731 585858595959555555363636 585858585858595959595959 -585858585858585858585858 585858585858585858585853 585858585858585858583331 585858585858363636363636 @@ -11869,7 +11741,6 @@ 5850592434415347544d5935 585056474c4d4a594b49344d 5850534c4d33544f41395751 -5850534c4d33544f41395751 585052535353343332313635 5850524553534d5553494331 585052455353353133303237 @@ -12492,7 +12363,6 @@ 57575842464643384f425250 575757575757595959595959 575757575757585858585858 -575757575757575757575757 575757575757575757573535 575757575757575757573130 575757575757575757515341 @@ -13260,7 +13130,6 @@ 57494e444f57535a4947454e 57494e444f57535850535035 57494e444f57532e57494e45 -57494e444f57535649535441 57494e444f57532e4d495343 57494e444f4d413434394850 57494e444f4d303130313830 @@ -13562,7 +13431,6 @@ 574849544556495045523238 574849544554524146464943 574849544554494745525331 -574849544553545249504553 574849544553545249504537 574849544553544f4e453331 5748495445534f5832303131 @@ -13573,7 +13441,6 @@ 57484954452d524f42494e53 5748495445524156454e3833 574849544552414242495441 -5748495445504f5745523838 5748495445504f5745523636 5748495445504f5745523131 5748495445504f4e59313937 @@ -13823,7 +13690,6 @@ 574552543130303731393930 574552534941544552313636 574552534446584356313233 -574552534446584356313233 574552534143484939313039 574552524557574552524557 574552524557373431313437 @@ -14075,7 +13941,6 @@ 57454152455448454d4f4453 5745415245544845424f5247 574541524554484542455354 -574541524554484542455354 5745415245534f4349414c31 5745415245504f5745523935 57454152454d415354455253 @@ -14318,7 +14183,6 @@ 574152494f344c4946455f5f 574152494454454c45434f4d 57415248414d4d4552363636 -57415248414d4d455234304b 57415248414d4d4552313233 57415248414d455238393238 574152465245414b32353238 @@ -14484,7 +14348,6 @@ 57414a414a55584f44594241 57414a24354439345052585a 574149545245535332323838 -57414954414e44424c454544 574149444552363534333231 574149414e41454849383038 574148595a494759574f4341 @@ -15324,7 +15187,6 @@ 564f4c4c455942414c4c3736 564f4c4c455942414c4c3138 564f4c4c455942414c4c3133 -564f4c4c455942414c4c3133 564f4c4c455942414c4c3131 564f4c4c455354494546454c 564f4c4b535741474f4e3132 @@ -15566,7 +15428,6 @@ 564c414449534c4156323932 564c414449534c4156323339 564c414449534c4156313233 -564c414449534c4156313233 564c414449534c4156313031 564c414449534c41562d3037 564c41444950494e41313233 @@ -15593,7 +15454,6 @@ 564c4144494d495232333136 564c4144494d495232325246 564c4144494d495232303132 -564c4144494d495232303132 564c4144494d495232303130 564c4144494d495232303038 564c4144494d495232303037 @@ -15606,13 +15466,10 @@ 564c4144494d495231393933 564c4144494d495231393932 564c4144494d495231393837 -564c4144494d495231393837 564c4144494d495231393835 564c4144494d495231393830 -564c4144494d495231393830 564c4144494d495231393737 564c4144494d495231393735 -564c4144494d495231393734 564c4144494d495231393732 564c4144494d495231393638 564c4144494d495231393634 @@ -15778,7 +15635,6 @@ 564b4f4e54414b5445383930 564b4f4e54414b5445373737 564b4f4e54414b5445343836 -564b4f4e54414b5445313233 564b4f4e54414b5445313035 564b4f4e54414b5445303031 564b4f4e54414b5445212121 diff --git a/client/dictionaries/extras/16_byte_most_common_password_uppercase.dic b/client/dictionaries/extras/16_byte_most_common_password_uppercase.dic index 717e12031..385473a47 100644 --- a/client/dictionaries/extras/16_byte_most_common_password_uppercase.dic +++ b/client/dictionaries/extras/16_byte_most_common_password_uppercase.dic @@ -1,6 +1,5 @@ 504f4c4e495950495a44454330323131 3151415a325753583345444334524656 -504f4c4e495950495a44454330323131 4c48424a4b4a55425a32393537373034 51315732453352345435593655374938 3151415a585357323345444356465234 @@ -98,7 +97,6 @@ 51513131575732324545333352523434 2151415a585357322345444356465234 51415a57535845444352465654474259 -504f4c4e495950495a44454331313032 504152415348413131555641524f5641 4f50455a4153534f4349415445534c42 4e495353414e534b594c494e45475452 @@ -274,7 +272,6 @@ 51415a57535845444331323334353637 51414544525739373037313334363235 513554584c485738535758545a564b4c -51315732453352345435593655374938 51315131513151315131513151315131 50594d4350503034444f4f3551493254 50524f4752455353495645484f555345 @@ -505,7 +502,6 @@ 42414749524f56313530313930313233 415a5358444346564742484e4a4d4b4c 415353484f4c4543414e43454c4c4544 -4153444647484a4b4c5a584356424e4d 41534446474831323334355157455254 41534446474830393837363534333231 4150504c4553414e4442414e414e4153 @@ -682,7 +678,6 @@ 5a5a3534333232383039373132335a5a 5a59585756555453535455565758595a 5a59544454485945434d47484a4f4651 -5a59544454485945434d47484a4f4651 5a59474d394d3750414549565a46534f 5a59464e313939394148464c52425946 5a59463232373139393243544b545946 @@ -699,7 +694,6 @@ 5a584356424e4d315a584356424e4d32 5a584356424e4d313437383532333639 5a584356424e4d3132333635344c4b4a -5a584356424e4d313233343536373839 5a584356424e31323334353637383930 5a58435642313233343555544b54594c 5a584356415344465157455231323334 diff --git a/client/dictionaries/extras/4_byte_most_common_password_uppercase.dic b/client/dictionaries/extras/4_byte_most_common_password_uppercase.dic index 28e8cbee6..1d45b5a41 100644 --- a/client/dictionaries/extras/4_byte_most_common_password_uppercase.dic +++ b/client/dictionaries/extras/4_byte_most_common_password_uppercase.dic @@ -712,7 +712,6 @@ 4d4f4e45 4d454741 4d414e4e -4c4f5645 4c4f424f 4b555254 484f5454 @@ -790,7 +789,6 @@ 4b414e45 4a45524b 48414952 -474f4c46 4649434b 444f4d45 43554253 @@ -979,7 +977,6 @@ 544f4144 53484f50 4e45524f -4a4f484e 4a4f414e 46524f4d 4652414e @@ -1113,8 +1110,6 @@ 4e494b41 4d4e4256 4d494b49 -4d494b45 -4d494b45 4c415354 48454845 4745494c @@ -1139,7 +1134,6 @@ 53544153 534c414d 53414d45 -5041554c 4c494c49 484f4f4b 474d414e @@ -1225,7 +1219,6 @@ 30333032 594f5552 5448454f -53455859 53414142 524f4d45 47555255 @@ -1363,7 +1356,6 @@ 48415254 46494c4d 444f5645 -4449434b 44414e4e 42494646 414c4c59 @@ -1409,7 +1401,6 @@ 4a494d49 49534953 47524559 -4655434b 4445534b 43414645 415a495a @@ -1512,8 +1503,6 @@ 42494747 415a4552 4158454c -414c4558 -414c4558 36323632 34343238 34303030 @@ -1602,7 +1591,6 @@ 4d4f464f 4d414944 484f5353 -46524f4d 434f4d32 43415053 4245544f @@ -1800,9 +1788,7 @@ 4c414441 4b415449 4b415249 -4a4f484e 4a4f4459 -4a41434b 48554559 484f4f50 47455254 @@ -1940,7 +1926,6 @@ 52415454 52414a41 504f5045 -50415353 4e414c41 4d555349 4d4f4c45 @@ -2054,7 +2039,6 @@ 48414c46 46555a5a 4655454c -464f5244 45584954 44554e4e 43555254 @@ -2154,7 +2138,6 @@ 44554646 44494345 44434241 -44414c45 4348415a 43415241 41515541 @@ -2366,10 +2349,8 @@ 4d455341 4d455243 4d454e54 -4d41524b 4d414e41 4d414b4f -4c4f5645 4c414c4f 4c414359 4b4e4f42 @@ -2500,25 +2481,18 @@ 48415250 47494d50 47494654 -46524544 464f5858 464c4f52 -46495348 4645524e 45564f4c 454c4c45 45474f4e 444f4c45 44454d49 -44415645 43484556 43415045 43414e44 42554e53 -424c5545 -424c5545 -42494c4c -42454552 4245414d 42414c44 42414255 @@ -2651,17 +2625,14 @@ 48415645 47555953 474f4453 -47415259 46494649 46454c49 44554d50 -44554b45 44494e4b 44454c49 44415445 44415348 4352555a -434f4f4c 43484f57 42555252 4252414e @@ -2670,7 +2641,6 @@ 42415448 42414841 41524553 -414e4149 414d4152 414c4241 414b3437 @@ -2819,7 +2789,6 @@ 4c414345 4b495341 4a4f4553 -4a414b45 494e474f 494d4553 48494849 @@ -2842,8 +2811,6 @@ 42304e33 41535331 41524e45 -414e4e45 -414c414e 41494b4f 38383839 38383438 @@ -2973,7 +2940,6 @@ 5758595a 57455745 57414e4b -54595045 54555244 54555241 54554241 @@ -2996,9 +2962,7 @@ 4f4c4c49 4f4b4945 4e4f5445 -4e4f4e45 4e494e49 -4e49434b 4e415241 4d554643 4d53444e @@ -3011,7 +2975,6 @@ 4c4f4f4c 4c4f4341 4c494d4f -4b494e47 4b45454e 4b43414a 4b415a55 @@ -3044,12 +3007,10 @@ 43495245 4348554d 43484554 -43415453 424f4f4f 424f4f47 424c5542 424c4143 -42454152 4153454c 4152554e 414e5453 @@ -3207,7 +3168,6 @@ 56495641 54554646 544f4249 -54455354 54415353 54414c4c 53534150 @@ -3215,7 +3175,6 @@ 534c4950 5349474e 53484552 -53455247 53454e44 53414d59 53414441 @@ -3228,7 +3187,6 @@ 504f4f5f 50494341 50415753 -5041554c 4f4e4553 4f494e4b 4f424f59 @@ -3245,7 +3203,6 @@ 4c4f5259 4c4f5049 4c4f4b4f -4c495341 4c494d50 4c494c41 4c45474f @@ -3253,7 +3210,6 @@ 4b554d41 4b4e4f57 4a4f4e47 -4a454646 4a414d53 4a41434f 48594445 @@ -3263,7 +3219,6 @@ 47524950 474f4f4e 474c4144 -46495245 46415945 46415453 45525459 @@ -3427,7 +3382,6 @@ 30323135 30313930 30303135 -574f4c46 57484f41 57415454 56494e4f @@ -3455,12 +3409,10 @@ 524f4f4b 524f4c49 5249544f -5249434b 52454542 51554144 50555454 50554c50 -50494d50 50494c4c 50494b41 50455354 @@ -3480,27 +3432,22 @@ 4c494c4c 4c494441 4c454144 -4b494e47 4b494d4f 4b454553 4b434e47 4b434944 4b414c4f 4a444f47 -4a41434b 49524d41 494e4741 494e4449 4941474f 48544d4c -484f4d45 48495453 48414c54 47524f47 -47524547 474f4f46 47415353 -46524545 464f4441 46455354 46414e4e @@ -3513,7 +3460,6 @@ 44455050 44454e49 44454152 -44415645 44415245 44415242 44414d45 @@ -3528,7 +3474,6 @@ 424f524e 424f4232 424c4f42 -42494c4c 4245524e 42454e4e 42454e44 @@ -3715,7 +3660,6 @@ 57414b45 5455534b 5452414d -544f4e59 544f4d42 544f4b45 54494d4d @@ -3731,7 +3675,6 @@ 53414d41 53414c45 524f4f53 -524f434b 524f4242 52454d49 52415752 @@ -3751,7 +3694,6 @@ 4d4f4f44 4d4f4d53 4d454c54 -4d41524b 4d414e49 4d414e31 4d414a41 @@ -3773,11 +3715,9 @@ 49434544 484f5453 484f5431 -48454c50 48454c49 48434952 48415a45 -48415244 4752414d 47494242 47484a4b @@ -4058,7 +3998,6 @@ 54454444 54415348 53554d4f -53544152 53504543 534f4d41 534f484f @@ -4113,7 +4052,6 @@ 4b455249 4b454d50 4a494d42 -4a454646 494e544f 49434f4e 4855434b @@ -4136,7 +4074,6 @@ 46494641 44555459 44554455 -44554445 44524541 444f5454 444f5353 @@ -4459,9 +4396,7 @@ 54524953 54524159 544f5552 -54495453 54495348 -54494e41 54494c45 5449434f 5448414e @@ -4472,9 +4407,7 @@ 53554b41 53544958 5354454e -53544152 5348454c -53455858 53455853 5345454b 53415a44 @@ -4500,7 +4433,6 @@ 50455453 50455255 50454e45 -50415353 4f50414c 4f4c4c45 4f4c4146 @@ -4514,7 +4446,6 @@ 4d4f5241 4d4f4f4f 4d4f4e49 -4d49434b 4d414c4f 4d414c49 4d414b49 @@ -4538,13 +4469,11 @@ 4b415349 4a554e49 4a554b45 -4a4f4a4f 4a4f4531 4a495645 4a49534d 4a455454 4a414d41 -4a414b45 4a414752 4a41424f 4a41414e @@ -4554,22 +4483,17 @@ 484f5354 48455243 48454e52 -47524547 474f5a4f -474f4c46 474f494e 474f4741 474d4143 46554354 -4655434b 464f524d 455a5241 45564552 454c4b45 45444954 -44554b45 44494749 -4449434b 44455254 44454e4e 44454249 @@ -4583,11 +4507,9 @@ 43414445 42555250 4255445a -424f5953 424f5245 424c4548 4249474f -42414259 415a554c 41534845 41534841 @@ -4919,7 +4841,6 @@ 5452414e 544f5348 544f4655 -54494e41 54494b41 54484541 54484149 @@ -4939,7 +4860,6 @@ 5255495a 524f4e4f 524f4a4f -524f434b 524f4245 5249545a 52495045 @@ -4951,13 +4871,11 @@ 51554954 50524553 504f554c -504f524e 504f5041 504f4f4f 504c4f54 5049564f 50494e41 -50455445 5041504f 50414c4c 50414944 @@ -4968,7 +4886,6 @@ 4f4c4453 4e555454 4e554e55 -4e49434b 4d555445 4d554d55 4d554945 @@ -4976,7 +4893,6 @@ 4d454c49 4d435345 4d415653 -4d415454 4d415441 4d414e44 4d414941 @@ -4984,7 +4900,6 @@ 4c554e47 4c4f5345 4c4f5045 -4c4f4c35 4c4f474f 4c4b4c4b 4c494c4f @@ -4996,8 +4911,6 @@ 4b41494e 4a555259 4a554c45 -4a4f5348 -4a4f4559 4a454e41 494d494e 494d414e @@ -5006,13 +4919,11 @@ 484f4c4c 48455353 4845494e -48415244 4841494c 47574152 47554e5a 47455253 47444f47 -46524544 464f5831 464f524b 464c5558 @@ -5022,7 +4933,6 @@ 4645454c 46323530 45564945 -4552494b 45444e41 44594e4f 4455524f @@ -5057,11 +4967,8 @@ 41524e4f 41524953 414e5445 -414e4e41 -414e4459 414d5931 414c5441 -414a4158 41494b41 41424535 39393136 @@ -5450,7 +5357,6 @@ 5a4d414e 5a474d46 59564553 -574f4c46 57454545 57414753 57414152 @@ -5465,9 +5371,7 @@ 544f4b4f 54495441 54495053 -54484f52 54454554 -5445414d 53555045 53554e47 53544556 @@ -5481,7 +5385,6 @@ 53494e4b 53494d41 5349414e -53484954 53484848 53484145 53445344 @@ -5572,7 +5475,6 @@ 484f5053 48494649 48454c4f -48415348 48415249 48414e4e 47524146 @@ -5599,23 +5501,18 @@ 46414449 45545544 4553434f -45524943 -45524943 454d4954 45415453 44594b45 444f4f53 444f4e4b -444f4954 4449444f 44415249 44414d4f 434f5041 434f4f53 434f4e4e -434f4459 434f4441 -434f434f 434f4259 43484545 43454e54 @@ -5641,7 +5538,6 @@ 4155494f 4153494c 4152414c -414e4e41 414d4945 414d4553 414d4552 @@ -6183,7 +6079,6 @@ 54524143 544f5645 544f5241 -544f4e59 544f4b49 544f4a4f 544f4245 @@ -6197,7 +6092,6 @@ 5448494e 54474946 54455445 -5445414d 54414d4d 5441434b 53555355 @@ -6219,10 +6113,8 @@ 5343414d 53415348 52594e4f -5259414e 52554e54 52554e45 -52554c45 524f4d59 524f4231 52495641 @@ -6250,7 +6142,6 @@ 4f534954 4f4e4531 4f4d4647 -4f4d4152 4f4c4c59 4f494f49 4e554753 @@ -6276,7 +6167,6 @@ 4d454e53 4d454550 4d415349 -4d415249 4d414459 4c554d50 4c554c41 @@ -6295,15 +6185,12 @@ 4b415245 4b414c45 4a55444f -4a4f5348 4a4f4e45 -4a4f4559 4a4d4143 4a4b5455 4a41595a 4a415943 4a415741 -4a414e45 4954494e 4952414e 49504f44 @@ -6322,7 +6209,6 @@ 47525542 4752495a 47524153 -474f4b55 474e494b 47494e4b 47494445 @@ -6350,7 +6236,6 @@ 45464748 45424253 444f5246 -444f4753 444f4553 444b4e59 44455553 @@ -6362,7 +6247,6 @@ 44454544 4445434f 44454341 -4445414e 44445353 44444b4b 44415a5a @@ -6386,16 +6270,12 @@ 43415653 4341545a 42595244 -42555454 42555259 42554e4b 42554431 -4255434b -42524144 424f5554 424f5453 424f5241 -424f4e44 424f4759 424f4641 424f434b @@ -6410,7 +6290,6 @@ 42415346 42414b45 42414431 -42414259 41584953 4154454e 41534554 @@ -6423,7 +6302,6 @@ 414c494b 414c4153 41494e54 -41424344 4141524f 41314232 39393934 @@ -6946,7 +6824,6 @@ 5a494d41 5a454e41 594e4f53 -58585858 58435642 57495045 5749454e @@ -6967,9 +6844,7 @@ 54524156 544f5441 544f504f -544f4f4c 544f4d4f -54495453 5449504f 54494b4f 54494853 @@ -6979,7 +6854,6 @@ 54484144 54475447 54455441 -54455354 54454c4c 54444f47 5441544f @@ -6991,16 +6865,13 @@ 53574143 53564554 53555341 -53554e53 53554741 -53545544 53545542 53524545 534f5552 534f5541 534f544f 534f4e53 -534c5554 534c4544 534b4944 534b4154 @@ -7019,7 +6890,6 @@ 53414e49 53414643 524f5645 -524f5345 52495050 52494241 52454d4f @@ -7035,22 +6905,18 @@ 50524954 50524559 504f5243 -504f4c4f 504f4749 504c4f4b 50494e53 5049314b -5048494c 50454c45 50415445 50415249 5030524e -4f5a5a59 4f504f50 4f4d4552 4e555045 4e554e4f -4e4f4e4f 4e4f4c49 4e4f454d 4e494348 @@ -7076,7 +6942,6 @@ 4d4f4e44 4d4f4d4d 4d495348 -4d494c4b 4d494449 4d454e41 4d454c4f @@ -7085,7 +6950,6 @@ 4d454144 4d415859 4d415853 -4d415259 4d41524c 4d414d4f 4d414a4f @@ -7093,7 +6957,6 @@ 4d363733 4c554e45 4c554345 -4c554341 4c4f5453 4c4f4e4f 4c4f4348 @@ -7108,7 +6971,6 @@ 4b4f4a49 4b4f4259 4b4f4249 -4b495353 4b495249 4b494b45 4b49414e @@ -7153,20 +7015,16 @@ 47524143 474f4f42 474f4c4f -474f4c44 474f4749 47494c41 -47415259 47415254 464f4c44 464f414d 464c4f50 -46495245 46494e53 46455244 46454544 46415454 -46415354 46415249 46414e53 4641494c @@ -7192,7 +7050,6 @@ 444f5345 444f4f46 444f4e41 -444f4747 444f4331 44495348 44494d53 @@ -7206,7 +7063,6 @@ 4441564f 44415344 44414e53 -44414e49 43554d31 434f4e45 434f4e41 @@ -7218,7 +7074,6 @@ 4341544f 43415449 43415448 -43415348 43415041 43414e4f 43414e41 @@ -7229,13 +7084,9 @@ 42524f4e 42524947 4252414b -424f5353 424f4f46 42494732 42455252 -42454152 -42415353 -42414c4c 42414c41 4241494c 41524f44 @@ -7254,7 +7105,6 @@ 41494e41 41494b49 41444441 -4144414d 41444144 41424849 4142424f @@ -7948,16 +7798,13 @@ 544f5252 544f5050 544f4f42 -544f4444 544d4d31 54493041 -54484f52 54455244 54454e54 54415455 5441534b 54414d41 -54414d41 54414b49 53544545 53544142 @@ -7973,27 +7820,21 @@ 53455441 53454c46 53454b41 -5345414e 53435544 53435341 5343484c 53415859 -53415241 53414e45 53414c4c 53414b45 52555255 52554d50 52554249 -524f5345 524f4745 52494f53 -5249434b -52494348 52485953 52455452 5245544f -52454444 52454152 52415945 52414d4f @@ -8024,7 +7865,6 @@ 50454353 5041574e 50415452 -5041524b 4f574c53 4f525950 4f52494f @@ -8057,16 +7897,13 @@ 4d4f4b45 4d4f4b41 4d495243 -4d494e45 4d455550 4d45534f 4d455254 4d455249 4d454c43 4d415453 -4d415259 4d415247 -4d415243 4d414e45 4d414d45 4d414453 @@ -8078,15 +7915,11 @@ 4d353131 4d313533 4d313233 -4c594e4e -4c594e4e 4c564f56 -4c554b45 4c554441 4c524143 4c4f5758 4c4f4f4e -4c4f4f4b 4c4f4749 4c4f4343 4c4c4548 @@ -8096,7 +7929,6 @@ 4c454c45 4c454c41 4c454553 -4c415552 4c415252 4c415244 4b4f5348 @@ -8106,7 +7938,6 @@ 4b494556 4b494152 4b455252 -4b454e54 4b454b4f 4b41545a 4b414e54 @@ -8117,8 +7948,6 @@ 4a4f4242 4a45524d 4a454645 -4a454550 -4a454449 4a444f45 4a415245 4a415041 @@ -8142,16 +7971,11 @@ 484a5646 4849594f 4849504f -48494c4c 4849434b 4845434b -4841574b 48415453 48415349 48415245 -48414e53 -48414e4b -48414c4c 48414255 47555453 47524f4f @@ -8168,7 +7992,6 @@ 47414e54 47414c4c 46524147 -464f5244 464f424f 464f4144 46495a5a @@ -8178,7 +8001,6 @@ 46444644 46414e54 46414753 -46414249 4556454e 45544552 4553534f @@ -8205,7 +8027,6 @@ 444f4444 444f4353 444e4f42 -4449524b 44494445 44494153 44464748 @@ -8216,13 +8037,11 @@ 44454c41 44454242 44454154 -4445414e 44415341 44415241 44414f53 44414e4c 44414e48 -44414e41 43524f4e 43524545 434f5547 @@ -8235,12 +8054,10 @@ 43484559 4348414d 43415641 -43415253 43415231 43415050 43414d4f 43414444 -42555a5a 42555245 42554e4e 4255444f @@ -8248,7 +8065,6 @@ 42524f4b 424f5959 424f5441 -424f5353 424f4e59 424f4e41 424c4f4f @@ -8259,7 +8075,6 @@ 42495348 4249474a 42454e31 -42454c4c 42454b41 42454453 42424e4e @@ -8277,7 +8092,6 @@ 41534d41 41534956 4153494d -41534446 41534444 41525459 41524f4f @@ -8288,7 +8102,6 @@ 414e4b45 414e4741 414e454c -414d4f52 414d4d41 414d494c 414d4154 @@ -8303,7 +8116,6 @@ 41484f59 41484f4a 41444159 -4144414d 4143434f 41424552 41424249 @@ -9149,7 +8961,6 @@ 5a4f4f54 5a494e43 5a494e41 -5a455553 5a445246 59555241 59554d41 @@ -9166,7 +8977,6 @@ 57454e54 57415953 57415445 -5741524d 57414c44 5741434f 564f4441 @@ -9182,12 +8992,9 @@ 54574947 54555348 54555246 -54554e41 -54525545 54524550 54524158 54524142 -544f544f 544f5448 544f4d59 544f444f @@ -9203,7 +9010,6 @@ 53555858 53555241 53554453 -5355434b 53544947 53544159 5350554e @@ -9220,7 +9026,6 @@ 53494d42 53494c4f 53484948 -53455859 53455832 53455641 53455245 @@ -9240,9 +9045,7 @@ 52554e41 52545955 52534a31 -524f5859 524f5745 -524f5353 524f4d4f 524f4749 524f4449 @@ -9259,11 +9062,9 @@ 5245454d 52424346 5241574b -52415645 5241544f 5241544d 52415441 -5241494e 52414855 52414649 52414449 @@ -9280,8 +9081,6 @@ 50524550 50504f4f 504f5345 -504f4f50 -504f4f48 504f494c 504c4548 50494e54 @@ -9291,7 +9090,6 @@ 50484f49 5045534f 5045524b -50455045 50454c41 50454747 5045454c @@ -9368,13 +9166,11 @@ 4d45444f 4d415952 4d415752 -4d415553 4d415552 4d41545a 4d415449 4d41534f 4d414e53 -4d414d41 4d414747 4d414744 4d41434f @@ -9390,24 +9186,18 @@ 4c594f4e 4c555041 4c55495a -4c554359 4c4f5549 4c4f5349 4c4f4f53 -4c4f4e47 4c4c494a 4c495a5a 4c495353 -4c495341 4c495241 -4c49434b -4c454f4e 4c454d41 4c454946 4c45424f 4c414e4b 4c41494e -4c414459 4b554b49 4b554a4f 4b545946 @@ -9415,7 +9205,6 @@ 4b524144 4b4f5441 4b4f4f50 -4b4f4f4c 4b4f4e49 4b4f484c 4b4f4553 @@ -9433,8 +9222,6 @@ 4b414a41 4b414954 4b414745 -4a554d50 -4a554c49 4a524a52 4a4f5441 4a4f5353 @@ -9453,13 +9240,11 @@ 4a484f4e 4a455245 4a454e49 -4a415a5a 4a415649 4a414e4e 4a414e47 4a414741 4a41464f -4a414445 49564f52 49534841 49534545 @@ -9472,18 +9257,13 @@ 494b4541 49424c45 4855534b -484f5045 484f4f46 484a484a 48494b45 48455845 48455252 48455241 -48454c4c -48454c4c 4845494c -48454154 -48454144 4841524c 48414e5a 48414d41 @@ -9496,8 +9276,6 @@ 4752414e 47524142 474f5249 -474f4f44 -474f4c44 474f4431 474a4746 4749474f @@ -9525,7 +9303,6 @@ 464c4550 464a464a 4649544f -46495348 46495053 46494e4f 4649474f @@ -9555,10 +9332,7 @@ 44554d4d 44554848 44525554 -44524f50 -44524557 44524452 -444f5547 444f524f 444f524d 444f474f @@ -9567,20 +9341,14 @@ 44494b45 44494544 44455649 -44454552 4445454e 44454449 4445424f -4441574e -44415747 -4441524b 44414e44 44414e31 -44414c45 43564356 43555453 43555449 -43554e54 43554c54 43524f50 43524f4d @@ -9591,9 +9359,6 @@ 434f5031 434f4f54 434f4e53 -434f4b45 -434f434b -434f434b 434c4152 4348554b 43485542 @@ -9604,13 +9369,11 @@ 43415441 43415435 43415349 -4341524c 43414e53 42555359 4255524b 42554d42 42554b41 -4255434b 42554253 42554249 42524159 @@ -9618,18 +9381,14 @@ 4252414d 424f524b 424f5244 -424f4e45 424f4e42 424f4c41 424f474f 424f4449 424f4348 424f4245 -424f415a -424f4154 424f4152 424d5731 -42495445 42494e44 4249474d 42484149 @@ -9638,12 +9397,10 @@ 42454e43 42454545 4245424f -42415254 42415249 42414d4d 42414d46 42414441 -42414348 42414249 4237424b 42373737 @@ -9667,7 +9424,6 @@ 414c5941 414c4345 414c4259 -414c414e 414b494e 414a4152 41495241 @@ -10640,13 +10396,10 @@ 58415841 57515751 574f4f57 -574f4f44 57494c54 -57494c4c 57494c45 5748495a 57484559 -57455354 57455241 57454952 57415659 @@ -10664,7 +10417,6 @@ 56414c49 56414845 55534e52 -55534d43 55524745 5552414c 554e4c56 @@ -10688,29 +10440,21 @@ 544f4f4b 544f4f46 544f4e4b -544f4e49 544f4c45 -544f4553 544f4449 -544f4444 544f4353 -544f4259 -544f4259 544f4241 54495445 -54494e59 54494e49 54494d59 54494d54 54494d49 -54494d45 54494553 54494341 54455841 5445544f 54454d41 54454449 -54415a5a 54415a4f 54415a31 54415941 @@ -10720,7 +10464,6 @@ 54414841 54414753 54414444 -5356454e 53555249 53554e49 53554c55 @@ -10740,7 +10483,6 @@ 534f4c49 534f4c41 534f434f -534c5554 534c554d 534c4545 534b4953 @@ -10749,7 +10491,6 @@ 53494e4f 53494e44 53494444 -5349434b 5349414d 53484f4e 53484956 @@ -10760,31 +10501,24 @@ 53455837 53455649 53455254 -53455247 53454e41 53454d41 53434950 53415941 53415349 5341524f -53415241 53414e53 -53414d4d 53414d4a 53414c41 53414841 53414649 53414144 -5259414e -52555448 -52555348 5255494e 52554559 52554444 524f5849 524f544f 524f5354 -524f5341 524f4e59 524f4e53 524f4e4e @@ -10798,7 +10532,6 @@ 52495445 52495249 52494d41 -5249434f 52484350 52455454 52454e5a @@ -10807,7 +10540,6 @@ 52414645 5241444f 52414444 -52324432 51554f4f 51444f47 51415a31 @@ -10818,15 +10550,9 @@ 50524f47 50524958 5052304e -504f5354 504f5252 -504f524e -504f4f48 504f4c41 504c4f57 -504c4159 -504c4159 -50495454 50495053 50495050 50494c49 @@ -10845,8 +10571,6 @@ 50415459 50415441 5041524d -50415041 -50414f4c 50414f4b 50414e54 50414e44 @@ -10856,10 +10580,8 @@ 50393131 50314d50 4f594f59 -4f54544f 4f544f4d 4f524943 -4f50454e 4f4e4552 4f4d534b 4f4d414e @@ -10876,9 +10598,7 @@ 4e4f4d4f 4e4f4445 4e4e4d4d -4e494e41 4e494d41 -4e494b49 4e494355 4e494152 4e474555 @@ -10889,7 +10609,6 @@ 4e45434f 4e444941 4e425643 -4e415659 4e41554a 4e415431 4e414952 @@ -10897,9 +10616,7 @@ 4d555353 4d4f564e 4d4f5252 -4d4f5245 4d4f5244 -4d4f4f4e 4d4f4e55 4d4f4e53 4d4f4c49 @@ -10912,8 +10629,6 @@ 4d49534f 4d494e4f 4d494e4e -4d494e45 -4d49434b 4d49414d 4d45545a 4d455241 @@ -10923,16 +10638,11 @@ 4d444d41 4d415a45 4d415953 -4d415941 -4d415858 -4d415858 4d415854 4d415833 4d41544f 4d415255 4d41524f -4d415249 -4d415243 4d415231 4d415041 4d414c53 @@ -10940,7 +10650,6 @@ 4d414953 4d414952 4d41454c -4d41434b 4d414341 4d383838 4d383631 @@ -10973,7 +10682,6 @@ 4d303233 4d303136 4c55474f -4c554341 4c554241 4c524947 4c4f5944 @@ -10989,7 +10697,6 @@ 4c49544f 4c494e43 4c494741 -4c494645 4c494546 4c494449 4c464946 @@ -11014,7 +10721,6 @@ 4b574f4e 4b554d49 4b554c41 -4b524953 4b524547 4b524153 4b524150 @@ -11037,16 +10743,11 @@ 4b434b43 4b434142 4b424b42 -4b415445 4b415348 -4b41524c 4b41504f 4b414e55 -4b414e45 4b414c4c -4a554e45 4a55494e -4a55414e 4a524159 4a505045 4a4f5931 @@ -11057,7 +10758,6 @@ 4a4f4e48 4a4f4d4f 4a4f454d -4a4f454c 4a4f4545 4a4f434f 4a4f4255 @@ -11065,17 +10765,13 @@ 4a4b4c4d 4a494d59 4a494d45 -4a455355 4a454e4b 4a454d4d 4a454c4c -4a454550 -4a454449 4a415945 4a415941 4a415931 4a414e53 -4a414e45 4a414c45 4a414b4f 49564553 @@ -11086,7 +10782,6 @@ 494e4745 494c4254 494b4b49 -49474f52 49474c4f 4947454c 49455354 @@ -11094,16 +10789,13 @@ 4859554e 484f5954 484f5641 -484f5345 484f5253 484f5050 -484f4d45 484f4c4d 484f4b55 48495353 48495245 48495053 -48494c4c 48454e4b 48454c4d 48454c45 @@ -11111,7 +10803,6 @@ 48454245 48445456 48415953 -4841574b 48415641 4841554c 48415256 @@ -11125,7 +10816,6 @@ 47554755 47554741 47524f54 -47524159 474f4f54 474f4c41 474f444f @@ -11133,13 +10823,9 @@ 474e4554 474e4154 474c594e -474c454e 47495a4d -4749524c -47494e41 47464946 47464453 -47455244 47454f46 47454e54 47454c44 @@ -11160,8 +10846,6 @@ 46554455 46524958 46524549 -46524545 -464f5859 464f5832 464f5353 464c5953 @@ -11173,11 +10857,9 @@ 46415253 4641524f 46415245 -46414e4e 46414e49 46414954 46414354 -4556414e 45564131 45554e47 45554c41 @@ -11191,7 +10873,6 @@ 454e4459 454e4453 454e4441 -454d4d41 454c4f59 454c4d41 454c494e @@ -11204,17 +10885,13 @@ 4546494c 45444741 45444552 -45444459 45444441 45424159 45415a59 -45415359 4455534b -4455434b 44534e4b 44524f4c 44524f42 -44524557 4452454b 4452414d 4452414b @@ -11224,7 +10901,6 @@ 444f4f4e 444f4f30 444f4d4f -444f4d45 444f4d41 444f475a 444f4733 @@ -11237,12 +10913,10 @@ 44495441 44495249 44494f52 -44494e4f 44494d4f 44494753 44494747 44494555 -44494547 44474844 44464143 44455731 @@ -11260,8 +10934,6 @@ 44424f59 44424e5a 44424754 -4441574e -44415747 4441524e 44414e54 44414c55 @@ -11272,8 +10944,6 @@ 44414445 4441414e 44303044 -43554d4d -43554253 43534b41 4352554d 43525547 @@ -11284,22 +10954,14 @@ 434f5354 434f524f 434f5049 -434f4f4c 434f4e4f -434f4c45 -434f4c41 -434f4459 434c4f45 -434c4954 434c4546 434a595a 43484945 4348454f 4348414c -43484144 -43484144 43454c41 -43415041 43414d45 43414c55 43414c41 @@ -11307,7 +10969,6 @@ 43313330 42555453 42554d4d -42554c4c 42525941 42525554 42525544 @@ -11317,21 +10978,18 @@ 4252494f 42524945 42524147 -42524144 424f5a5a 424f5931 424f5753 424f544f 424f5254 424f4e5a -424f4e44 424f4749 424f4243 424d4143 424c4f43 42495443 4249524b -42495244 42494e49 42494d41 42494752 @@ -11341,8 +10999,6 @@ 42494241 42484248 42455453 -42455448 -42455354 4245534f 42455245 42454e59 @@ -11358,11 +11014,9 @@ 42415455 42415355 42415354 -42415353 42414e41 42414c54 4241474f -42414245 4241414c 42343139 415a414d @@ -11384,7 +11038,6 @@ 41524153 414f4c31 414e494d -414e4459 414e4445 414e414e 414e414b @@ -12410,12 +12063,10 @@ 5a454e49 5a454252 5a415246 -5a414348 59524147 594f5349 594f5254 594f4449 -594f4441 59475642 59464c5a 59415355 @@ -12435,21 +12086,16 @@ 574f5757 574f574f 574f5443 -574f5244 574f4f4f -574f4f44 574f4e54 574f4c44 57495749 57495350 -57495245 57494e31 57494d50 -57484154 57455331 5745524b 5745474f -57454544 57415a5a 57415a41 57415941 @@ -12457,7 +12103,6 @@ 57415353 57415232 57414e44 -57414954 56494e49 56494e47 56494e41 @@ -12493,7 +12138,6 @@ 54555041 54554e47 54554c41 -54554c41 54554753 54534f59 54534558 @@ -12502,15 +12146,12 @@ 54525452 5452454a 54524547 -54524545 -54524156 544f5453 544f534f 544f5243 544f5049 544f5041 544f5033 -544f4f4c 544f4954 544f4741 544f434f @@ -12520,7 +12161,6 @@ 544d4d32 544b524f 5449545a -5449544f 54495050 54494c41 54494747 @@ -12545,7 +12185,6 @@ 54454b49 54454b41 54454552 -5445454e 54454546 54454453 5445444f @@ -12556,13 +12195,10 @@ 5441524b 54414f53 54414e4e -54414e4b -54414e4b 54414c4f 54414a41 5441484f 54414441 -5441434f 54414242 54335354 53594e43 @@ -12572,11 +12208,9 @@ 53555a55 53555649 53555359 -53555246 53554e32 53554745 53554249 -53545544 53545341 53545238 53544f4e @@ -12598,20 +12232,15 @@ 534f5241 534f5048 534f4e4a -534f4e49 534f4552 534f4343 -534e4f57 -534e4f57 534e4954 534e414b -534d5554 534d5355 534d534d 534d4f4b 534d414b 534c5931 -534c494d 534c4142 534b5541 5349554c @@ -12630,7 +12259,6 @@ 53455a45 53455348 5345524a -53455050 53455045 53454d4f 53454c41 @@ -12644,7 +12272,6 @@ 53415858 53415649 5341534b -53415348 5341524b 53415247 53415245 @@ -12661,7 +12288,6 @@ 53414153 52554e4b 52554d59 -52554c5a 52554b48 52554b41 52553132 @@ -12678,17 +12304,13 @@ 524f434f 524f4254 524f4243 -524f4144 524d4753 524a4b5a 524a4159 -52495441 -52494e47 52494d45 52494b4b 52494b45 52494753 -52494445 52484541 52455859 52455831 @@ -12719,7 +12341,6 @@ 51415a5a 51415753 50555941 -5055545a 50554e47 50554b41 50554753 @@ -12733,7 +12354,6 @@ 5052414d 504f5552 504f5452 -504f5254 504f5233 504f5059 504f4e54 @@ -12745,8 +12365,6 @@ 5049524f 50495241 50494f4e -50494e4b -50494e45 50494c53 50494c45 50494a41 @@ -12771,7 +12389,6 @@ 50415645 50415449 50415443 -5041524b 50415244 50415059 50414e4f @@ -12782,7 +12399,6 @@ 4f595048 4f564941 4f555453 -4f544953 4f54414b 4f534b49 4f53484f @@ -12791,7 +12407,6 @@ 4f52494d 4f524353 4f504552 -4f50454e 4f504536 4f504447 4f4f5433 @@ -12818,7 +12433,6 @@ 4e4f5552 4e4f4c4f 4e4f4841 -4e4f454c 4e4f4249 4e4f4141 4e4e4f44 @@ -12828,8 +12442,6 @@ 4e494e4e 4e494e4a 4e494b53 -4e494b4f -4e494345 4e494341 4e474f43 4e474155 @@ -12838,13 +12450,11 @@ 4e454841 4e454646 4e454554 -4e454544 4e445250 4e434141 4e415355 4e415354 4e415345 -4e414e41 4e414c55 4e414b49 4e414453 @@ -12863,12 +12473,9 @@ 4d4f5a5a 4d4f5941 4d4f5431 -4d4f4f4e 4d4f4c4f 4d4f4c41 -4d4f4a4f 4d4f4a41 -4d4f464f 4d4f444f 4d4f4441 4d4f4249 @@ -12899,16 +12506,13 @@ 4d45454e 4d443131 4d434643 -4d415a45 4d41584f 4d415832 4d415645 4d415459 4d415455 -4d415454 4d414e58 4d414d55 -4d414d41 4d41494b 4d414849 4d414755 @@ -12985,27 +12589,19 @@ 4d303533 4d303037 4d303030 -4c554e41 4c554c5a -4c554c55 4c554b59 -4c554953 4c554643 4c554445 4c544f50 4c4f5641 4c4f5454 -4c4f5244 4c4f4f57 -4c4f4c41 4c4f4b45 4c4f414e 4c4d4c43 4c4c4545 -4c495645 4c495349 -4c494f4e -4c494e4b 4c494b4b 4c494b41 4c494453 @@ -13034,7 +12630,6 @@ 4c414444 4c414349 4c414348 -4c414345 4c414241 4b574f4b 4b555441 @@ -13046,9 +12641,7 @@ 4b544e4a 4b524f4e 4b524f4c -4b524953 4b52494b -4b52414d 4b4f5a41 4b4f5445 4b4f5254 @@ -13075,17 +12668,13 @@ 4b4b4e45 4b495641 4b49524e -4b49524b 4b495242 4b495050 4b494d48 4b494c54 -4b494c4c -4b494c4c 4b494c41 4b494555 4b455659 -4b455649 4b455441 4b455353 4b455348 @@ -13100,7 +12689,6 @@ 4b415259 4b415255 4b41524f -4b414e45 4b414e44 4b414d4f 4b414d45 @@ -13109,7 +12697,6 @@ 4b414941 4a55524b 4a554c53 -4a55414e 4a524e59 4a4f5943 4a4f5359 @@ -13124,26 +12711,20 @@ 4a4f424f 4a4f4241 4a4f4231 -4a4f414e -4a4f414e 4a4e5945 4a4d4831 4a494d57 4a494d54 4a494d46 4a494d33 -4a494c4c 4a494753 4a455354 -4a455353 -4a454e4e 4a454a45 4a443232 4a434a43 4a424f42 4a415944 4a415942 -4a415931 4a415831 4a41534b 4a415345 @@ -13173,7 +12754,6 @@ 4953484f 49534143 4952454b -49524151 4952414b 494e4d45 494e455a @@ -13200,20 +12780,15 @@ 49424558 49414d49 49414d45 -4941474f 49385532 49383132 4859504f 48594859 -48554e47 48554c41 48545955 4853494e -484f524e -484f5045 484f4d49 484f4c5a -484f4c41 484f4731 484f4646 484f434b @@ -13235,14 +12810,12 @@ 48454441 48444844 48415547 -48415445 48415441 48415341 4841524f 4841524d 48414d53 48414d50 -48414c4c 48414c41 48414a4f 48414449 @@ -13258,7 +12831,6 @@ 47544e48 47524f4d 47524954 -47524954 47524946 47524553 47524155 @@ -13268,10 +12840,8 @@ 474f5049 474f4f53 474f4f4f -474f4f44 474f4d45 474f4a4f -474f474f 474f4553 474f4544 474f424f @@ -13282,12 +12852,10 @@ 47495641 47495441 47494e4e -47494e41 4749304f 47484f53 47474848 47455245 -47454e4f 47454e4e 47454e49 47454d49 @@ -13302,7 +12870,6 @@ 47414c49 4741474f 47414646 -47414259 47414253 47414242 4741414e @@ -13320,16 +12887,12 @@ 46524f44 46524941 46524541 -464f5859 -464f5552 464f4e44 464f434b 464f4341 464c5546 464c4f59 -464c4558 464c434c -46495354 4649534b 46494f4e 46494c49 @@ -13337,7 +12900,6 @@ 46494445 46474746 4646554d -46464646 46455241 46454e4a 46454c41 @@ -13384,7 +12946,6 @@ 454d4f54 454d4f4e 454d4d45 -454d4d41 454c5a41 454c5345 454c4f4e @@ -13403,12 +12964,10 @@ 45454f4f 45444f43 4544494c -4544454e 45434952 45424147 45423231 45415448 -45415354 45415348 45414e47 45414b33 @@ -13417,11 +12976,9 @@ 44555348 4455524b 44554c43 -44554445 44554444 44544846 4452454d -444f5547 444f5445 444f5341 444f4f4c @@ -13445,7 +13002,6 @@ 44495a5a 4449584b 44495649 -44495641 44495350 44494f47 4449474f @@ -13456,17 +13012,13 @@ 44464b5a 44455759 44455659 -4445564f 44455641 44455252 44455054 44454a49 44454553 -44454550 4445454c -44454445 44454143 -44444444 44435550 44424947 44415a31 @@ -13492,9 +13044,7 @@ 4354524c 43534f52 43525544 -43524f57 43524f53 -43524557 4352414b 434f5741 434f5732 @@ -13502,7 +13052,6 @@ 434f5252 434f4d4f 434f4d42 -434f4c45 434f4753 434f4544 434f4449 @@ -13510,10 +13059,7 @@ 434c5545 434c4f53 434c4557 -434c454f -434c454f 434c4541 -434c4159 434c4144 4349544f 43494e43 @@ -13535,9 +13081,7 @@ 4346595a 43455241 43454e4b -43415453 43415445 -43415348 43415242 4341504e 43414f53 @@ -13548,9 +13092,6 @@ 43414c4f 43414c46 42595946 -42555a5a -42555454 -42555348 4255524c 42554e54 42554e44 @@ -13560,14 +13101,12 @@ 4252554d 4252415a 42524143 -424f5a4f 424f594f 424f5859 424f5845 424f5343 424f5255 424f5249 -424f4f4d 424f4f48 424f4e49 424f4a4f @@ -13575,7 +13114,6 @@ 424f494c 424f4252 424f424d -424f4242 424f4233 424e5346 424d574d @@ -13601,7 +13139,6 @@ 42494a55 42484135 42455449 -42455448 42455141 42454e51 42454e4f @@ -13609,18 +13146,15 @@ 42454e41 42454d46 42454542 -4245434b 42454153 42444659 42434643 42434445 42434154 -42424242 42424141 42423636 42415053 42414e53 -42414e47 42414a53 42414459 42304e47 @@ -13640,12 +13174,10 @@ 41545459 41544d41 41535349 -41534941 41534553 41524a4f 41524944 41524459 -41524348 41523135 4151494c 41514151 @@ -13653,7 +13185,6 @@ 41504343 414f4c32 414e545a -414e544f 414e5349 414e4b48 414e4953 @@ -13669,8 +13200,6 @@ 414d4249 414c534f 414c4f53 -414c4c59 -414c4641 414c4545 414c4541 414c4341 @@ -13700,7 +13229,6 @@ 41424945 41424944 41424555 -41424259 41424154 41424149 41415645 @@ -14720,7 +14248,6 @@ 30303738 2e2e2e2e 5f5f5f5f -5a5a5a5a 5a5a5542 5a5a4141 5a595758 @@ -14730,7 +14257,6 @@ 5a56554b 5a564552 5a554e49 -5a554c55 5a554556 5a4f4249 5a495053 @@ -14740,7 +14266,6 @@ 5a494747 5a494241 5a455858 -5a455553 5a455241 5a454c4c 5a454954 @@ -14762,10 +14287,8 @@ 594f4f32 594f4e49 594d4341 -59455353 59455050 59454550 -59454148 59445552 59444445 59425246 @@ -14782,11 +14305,9 @@ 58583231 58555855 58545241 -584f584f 58454e4f 58454d41 58454c4a -58454c41 58454553 58415341 5759524d @@ -14797,28 +14318,22 @@ 57544e42 57535843 574f5732 -574f524d 574f5247 574f4f4b -574f4f46 574f4e53 574e5531 574e444f 57495a41 5749545a 57495448 -57494e47 57494c4d -57494c4c 57494c4b -57494c44 57494753 5749444f 57484f4f 57465342 57455645 57454c54 -57454c44 57454759 5745455a 57454552 @@ -14834,9 +14349,7 @@ 57415349 57415333 57415231 -57414e47 57414e45 -57414c4c 57414c45 5741474f 57414641 @@ -14844,13 +14357,9 @@ 57414444 57414441 5730524d -564f5445 564f4e4e 564f4c4f 564f4345 -564c4144 -5649544f -56495341 56495255 56494e48 56494e45 @@ -14864,7 +14373,6 @@ 56455245 56454e55 5645494e -56454741 56454552 5645454e 5645414c @@ -14883,10 +14391,8 @@ 56414c41 56414841 56304539 -55544148 5553554c 55534d53 -55534552 55534141 55525a41 5552534f @@ -14904,7 +14410,6 @@ 554b4545 55495543 55435344 -55434c41 55424552 55423430 55374d32 @@ -14916,7 +14421,6 @@ 54574f4f 54574545 54555249 -54555244 54555050 54554e31 54554b4f @@ -14930,10 +14434,7 @@ 54525554 54524f50 54524943 -54524558 5452454c -5452454b -54524545 5452424c 54524154 5452414b @@ -14943,11 +14444,9 @@ 544f594f 544f5749 544f5649 -544f524f 544f5059 544f4f53 544f4e4f -544f4e49 544f4d4a 544f4d37 544f4d33 @@ -14958,14 +14457,12 @@ 544f4552 544f4348 544f4341 -544f4144 544d4e54 544d4d53 544b4647 544b3131 544a5337 54495454 -54494e59 54494e4e 54494d4c 54494d4b @@ -14976,7 +14473,6 @@ 54494c43 54494a4e 54494741 -54494646 5449454e 54494453 54494252 @@ -14987,7 +14483,6 @@ 5448554e 54484f53 54484f4e -54484f4d 54484935 54484546 54475559 @@ -15001,20 +14496,17 @@ 54454b4b 54454b45 5445455a -5445454e 54454545 54454539 54454533 5445434f 5445434b -54454348 54434259 54424f59 54424f4e 54415649 54415249 54415244 -54415241 54415055 54414f42 54414e5a @@ -15029,7 +14521,6 @@ 5441424f 53594f42 53574f54 -5356454e 5355534f 53555345 53554e44 @@ -15052,29 +14543,23 @@ 53544941 5354454c 53544331 -5354414e 5354414d 53544149 53543337 -53535353 53534f42 53534646 53534444 53524144 -53504f54 53504f45 53504943 53504541 53504154 -5350414d 53504149 -534f554c 534f5349 534f4f4d 534f4f44 534f4e45 534f4c54 -534f4654 534f4449 534e5542 534e4f58 @@ -15085,7 +14570,6 @@ 534d414c 534d4147 534c4c37 -534c494d 534c494b 534c4159 534c4156 @@ -15096,11 +14580,9 @@ 534b4942 534b4150 53495836 -53495445 53495252 5349504f 53494e31 -53494d4f 53494d4a 53494d45 53494c56 @@ -15123,7 +14605,6 @@ 5348494d 53484949 5348454d -53484147 53484142 53484141 53475431 @@ -15138,8 +14619,6 @@ 53454441 5345434f 53454341 -5345414e -5345414c 53454134 53454133 53445355 @@ -15168,7 +14647,6 @@ 53414641 53414459 53414446 -53414445 53414444 53414431 53414331 @@ -15181,16 +14659,9 @@ 52555053 52554f4b 52554d49 -5255495a 52554753 52554747 52554655 -52554646 -52554459 -52554459 -52554444 -52554259 -52554245 52544553 52535650 5252464d @@ -15206,7 +14677,6 @@ 524f4445 524f425a 524f4253 -524f4152 524c4c41 524b4d32 52495a5a @@ -15218,8 +14688,6 @@ 5249474f 52494654 5249454b -52494348 -52494345 52494343 5249415a 52494154 @@ -15239,13 +14707,10 @@ 52454e55 52454e44 52454c4c -52454c4c 52454b41 52454841 52454631 52454554 -52454544 -52454453 52454441 52454432 5245434b @@ -15258,7 +14723,6 @@ 5243384b 52415a41 5241594a -52415645 52415641 52415350 52415341 @@ -15271,13 +14735,10 @@ 52414d34 52414c50 52414c48 -52414c46 52414c45 52414b41 52414a49 -5241494e 52414935 -52414753 52414747 52414445 52414152 @@ -15305,16 +14766,13 @@ 50594152 50575057 50563234 -50555353 50555349 50555055 50554e59 50554e4e 50554e49 50554e45 -50554d41 50554947 -50554646 50554343 50535531 50535354 @@ -15330,10 +14788,8 @@ 50505033 504f5459 504f5454 -504f5354 504f4f4a 504f4e45 -504f4e44 504f4c44 504f4952 504f4445 @@ -15352,17 +14808,14 @@ 504a414d 50495859 50494e58 -50494e47 50494e43 50494531 -50494353 50494146 5049354b 5048594c 5048494f 5048414d 5048414c -50455452 50455348 50455254 50455253 @@ -15386,11 +14839,9 @@ 5041545a 5041544d 50415431 -50415353 50415331 50415045 50414d4d -50414d45 50414c4f 50414b41 50414841 @@ -15398,7 +14849,6 @@ 50414355 50353144 50304c30 -4f5a5a59 4f56414c 4f555253 4f545459 @@ -15417,7 +14867,6 @@ 4f52414e 4f505449 4f505053 -4f50454c 4f4f5a45 4f4f5050 4f4f5048 @@ -15428,7 +14877,6 @@ 4f4e4944 4f4e414e 4f4c5641 -4f4c4c49 4f4c4941 4f4c4553 4f4c4541 @@ -15469,17 +14917,13 @@ 4e555431 4e555353 4e555249 -4e554445 4e524f44 4e504154 4e4f5753 4e4f5731 -4e4f5641 -4e4f5641 4e4f5454 4e4f5245 4e4f4f54 -4e4f4e45 4e4f4c4c 4e4f4b49 4e4f4a4f @@ -15491,10 +14935,7 @@ 4e4a4252 4e495349 4e495241 -4e494e45 -4e494c53 4e494c41 -4e494b45 4e494554 4e485241 4e474f4f @@ -15506,7 +14947,6 @@ 4e455431 4e455256 4e45504f -4e454f4e 4e454f31 4e454e4f 4e454c49 @@ -15520,7 +14960,6 @@ 4e415741 4e415645 4e415449 -4e415445 4e415443 4e415249 4e415244 @@ -15560,7 +14999,6 @@ 4d4f4f4d 4d4f4f46 4d4f4d59 -4d4f4d4f 4d4f4d49 4d4f4d31 4d4f4b4f @@ -15568,7 +15006,6 @@ 4d4f454b 4d4f4449 4d4d5656 -4d4d4d4d 4d4d4d43 4d4d494a 4d4d4242 @@ -15586,13 +15023,9 @@ 4d495349 4d495053 4d495041 -4d494e49 -4d494e41 4d494d4f 4d494d4d -4d494d49 4d494c55 -4d494c4f 4d494b59 4d494b53 4d494b4b @@ -15603,7 +15036,6 @@ 4d494445 4d49434f 4d494331 -4d494148 4d493949 4d493449 4d493447 @@ -15611,7 +15043,6 @@ 4d484d44 4d484736 4d455a41 -4d455453 4d455354 4d455348 4d45525a @@ -15629,14 +15060,10 @@ 4d424552 4d415a5a 4d415a41 -4d415941 -4d415849 -4d415849 4d415845 4d415637 4d415631 4d415450 -4d415253 4d415252 4d41524d 4d415050 @@ -15803,23 +15230,17 @@ 4d303036 4d303034 4d303031 -4c594e58 4c594d45 4c594c41 4c574f42 4c555655 4c555645 4c55554b -4c555354 -4c555354 4c555055 4c554c4c 4c554c49 4c554947 4c554747 -4c554359 -4c55434b -4c554349 4c534b43 4c52414b 4c504f4b @@ -15831,10 +15252,8 @@ 4c4f5050 4c4f4f4f 4c4f4e4e -4c4f4e47 4c4f4d42 4c4f4d41 -4c4f4c41 4c4f4955 4c4f4732 4c4d4245 @@ -15845,9 +15264,6 @@ 4c4c4142 4c4b4d50 4c4a5643 -4c495645 -4c495445 -4c495354 4c495350 4c495348 4c495249 @@ -15855,18 +15271,14 @@ 4c495041 4c494e54 4c494e53 -4c494e4b -4c494e45 4c494c55 4c494c44 4c494b49 4c494850 4c494748 -4c494645 4c494552 4c494345 4c494252 -4c49414d 4c484f42 4c473334 4c455757 @@ -15881,7 +15293,6 @@ 4c454c4f 4c454954 4c454944 -4c454753 4c454550 4c45454d 4c454544 @@ -15899,18 +15310,11 @@ 4c415544 4c41544f 4c415448 -4c415253 4c415249 4c415041 -4c414e45 4c414e43 -4c414e41 -4c414c41 4c414646 -4c414359 4c414341 -4b594c45 -4b594c45 4b57414a 4b574149 4b555348 @@ -15934,7 +15338,6 @@ 4b4f544f 4b4f5354 4b4f5250 -4b4f524e 4b4f5249 4b4f5053 4b4f5046 @@ -15942,7 +15345,6 @@ 4b4f4c4c 4b4f4c42 4b4f4b55 -4b4f4b4f 4b4f4b49 4b4f4954 4b4f4649 @@ -15969,21 +15371,17 @@ 4b495649 4b495453 4b49544f -4b495353 4b495243 4b494f50 4b494f4c 4b494f4b 4b494e53 -4b494d4f 4b494c4e 4b494c45 4b494c33 4b494b55 -4b494b49 4b494154 4b48554f -4b48414e 4b474454 4b455449 4b455255 @@ -15995,7 +15393,6 @@ 4b454c50 4b454c4f 4b454954 -4b454553 4b454453 4b454154 4b434153 @@ -16008,11 +15405,7 @@ 4b415345 4b41524e 4b41524d -4b415249 -4b415245 4b415244 -4b415241 -4b415241 4b415050 4b415049 4b414f5a @@ -16029,7 +15422,6 @@ 4a57494c 4a573132 4a555049 -4a554d50 4a554d41 4a554a4f 4a55474f @@ -16041,7 +15433,6 @@ 4a4f5945 4a4f5941 4a4f544f -4a4f5345 4a4f5231 4a4f4f4e 4a4f4e50 @@ -16054,13 +15445,11 @@ 4a4f4549 4a4f4547 4a4f4533 -4a4f4532 4a4f4359 4a4f4249 4a4d4a4d 4a4c4d52 4a4c4545 -4a4b5455 4a4a3639 4a494d39 4a494747 @@ -16070,17 +15459,13 @@ 4a484154 4a455753 4a454e59 -4a454e4e 4a454e45 4a454e44 4a454e31 4a454b41 4a454552 -4a45414e 4a445542 4a424a42 -4a41595a -4a415953 4a415952 4a415933 4a415341 @@ -16099,7 +15484,6 @@ 4a414252 4a414150 4a313233 -4a313233 4a305348 495a414e 4957414e @@ -16113,14 +15497,10 @@ 49534f4e 49534c45 49534b49 -49534953 4953444e -49524953 -49524953 49505341 494f5441 494f5048 -494e5853 494e5553 494e544c 494e4e4f @@ -16139,8 +15519,6 @@ 494b554f 49494d4d 49475241 -49474759 -49474759 49473838 49455155 49434545 @@ -16154,21 +15532,15 @@ 48594f4e 48555454 48555443 -48554e54 -48554e44 -48554d50 48554d4d 48554d45 48554444 48534946 484f5458 -484f5454 484f5434 484f5348 484f5249 484f4f4c -484f4f44 -484f4f44 484f4e59 484f4e4f 484f4e4b @@ -16179,7 +15551,6 @@ 484f4b49 484f4552 484f4441 -484f424f 484f414f 484f414e 484f3047 @@ -16193,7 +15564,6 @@ 48495253 48494d41 48494c54 -48494748 48494550 48485353 48484545 @@ -16249,7 +15619,6 @@ 47524f43 47524f42 47524947 -47524559 47524541 47524156 474f594f @@ -16264,7 +15633,6 @@ 474f4432 474f4349 474f4249 -474f4154 474e5553 474e5544 474e4f4c @@ -16273,15 +15641,12 @@ 474d454e 474d4350 474c414d -47495a41 47495741 47495454 47495348 47495241 47494f53 47494d49 -47494c4c -47494749 47474a4a 47474552 47474545 @@ -16292,8 +15657,6 @@ 47455354 47455259 47455252 -47455241 -47454e45 47454d41 47454553 47454550 @@ -16306,7 +15669,6 @@ 47415641 47415354 47415256 -47415252 47415247 47415242 47415031 @@ -16317,7 +15679,6 @@ 47414d4d 47414c54 47414654 -47414646 47414641 47414552 4741454c @@ -16345,8 +15706,6 @@ 46544c41 46544232 46525953 -46524f47 -46524f47 46524950 46524559 46524557 @@ -16354,8 +15713,6 @@ 4652415a 4652414b 46523333 -464f5858 -464f5858 464f5849 464f5834 464f524f @@ -16367,8 +15724,6 @@ 464f464f 464f4641 464c5931 -464c4f59 -464c4950 464c4852 464c454d 464c4159 @@ -16378,7 +15733,6 @@ 464c4143 464a3430 46495343 -46494c45 46464954 4645544f 46455449 @@ -16386,7 +15740,6 @@ 46455353 46455242 46454e45 -46454554 4643534d 46415641 46415558 @@ -16396,16 +15749,13 @@ 46415353 46415341 46415256 -46415254 46415252 -46415245 46414e33 4641474f 46414645 46414459 46414441 4641434b -46414345 46414241 46313233 46313137 @@ -16427,13 +15777,11 @@ 45545441 45545355 4554484f -45544841 45544543 45544149 45543341 45535359 4553504f -4553504e 45535041 45534f4a 45534841 @@ -16444,7 +15792,6 @@ 45524e49 45524b49 45524b41 -4552494e 45524745 45524159 45524143 @@ -16465,7 +15812,6 @@ 454c594b 454c5349 454c4f44 -454c4c49 454c4b59 454c4954 454c494f @@ -16486,7 +15832,6 @@ 45444342 4544414d 45434b59 -4543484f 45424f4e 45415449 45313242 @@ -16498,9 +15843,7 @@ 44555454 44555453 44555443 -4455534b 44554e54 -44554d42 44554d41 44554c4c 44554453 @@ -16509,7 +15852,6 @@ 44524956 44524553 44524159 -44524147 44524142 444f5859 444f5744 @@ -16518,26 +15860,21 @@ 444f524e 444f4f54 444f4f50 -444f4f4d 444f4f48 444f4e52 444f4e43 444f4e42 444f4e31 -444f4d49 444f4c4f 444f4c4b 444f4c46 444f4c41 444f4b49 444f4953 -444f4753 444f4749 -444f4747 444f4554 444f454e 444f4447 -444f4441 444f4249 444f3351 444e4152 @@ -16550,12 +15887,9 @@ 444a4552 44495a49 44495448 -4449534b 44495341 -4449524b 4449514b 44494e59 -44494e4f 44494e45 44494c5a 44494c4f @@ -16563,9 +15897,7 @@ 44494c49 44494553 44494441 -44494345 44494241 -4449414e 4449414b 44484138 44464144 @@ -16581,11 +15913,9 @@ 44454f58 44454e53 44454e4f -44454e4e 44454e4b 44454e45 44454d50 -44454c4c 44454531 44454441 44454254 @@ -16598,17 +15928,11 @@ 44415753 44415744 44415731 -4441564f -44415649 44415354 44415345 4441525a 44415259 -4441524b -44415245 -44414f53 44414e42 -44414e41 44414d41 44414c4f 44414843 @@ -16632,8 +15956,6 @@ 43554d45 43554c4c 43554646 -43554245 -43554241 43544d50 4353504d 43534859 @@ -16665,7 +15987,6 @@ 434f4649 434f4645 434f4559 -434f4445 434f4245 434f4241 434f4143 @@ -16673,7 +15994,6 @@ 434c4946 434c4547 434a434a -43495459 43495343 43495243 43495053 @@ -16684,17 +16004,13 @@ 43494753 43494741 43494445 -4348554e 43485543 -43484f57 43484955 43484954 -43484950 4348494b 43484541 43484156 4348414b -43464946 43455a41 43455354 43455249 @@ -16711,7 +16027,6 @@ 43424f45 4341594f 43415433 -43415354 4341525a 4341524d 43415055 @@ -16733,7 +16048,6 @@ 42564431 42564358 42555449 -42555348 4255524f 42555243 42555241 @@ -16749,10 +16063,8 @@ 4252494e 4252494a 42524943 -42524557 42524348 42524252 -424f5a4f 424f5941 424f5932 424f5858 @@ -16763,21 +16075,14 @@ 424f534f 424f534b 424f5349 -424f524f -424f5247 424f5053 424f4f59 424f4f52 -424f4f42 -424f4e45 424f4c53 424f4c49 424f4b4f 424f4b49 424f4b45 -424f4259 -424f424f -424f424f 424f4153 424f324b 424f314b @@ -16786,7 +16091,6 @@ 424c5644 424c5556 424c5550 -424c4f57 424c4f50 424c4557 424c4544 @@ -16796,13 +16100,8 @@ 42494f50 42494f4d 42494e53 -42494b45 -42494754 -4249474a 42494749 42494746 -42494744 -42494744 42494730 42494445 42494159 @@ -16812,16 +16111,12 @@ 4245524d 42455246 42455049 -42454e4e 42454e32 42454d45 42454c55 -42454c4c 42454c45 42454753 42454353 -42454245 -42454154 42445542 42445531 42444244 @@ -16835,20 +16130,15 @@ 42415544 4241544f 42415449 -42415345 42415341 42415255 -4241524e -4241524b 42414e5a -42414e4b 42414e31 42414d42 42414c4d 42414b53 42414b49 42414947 -42414753 42414646 42414455 42414453 @@ -16873,7 +16163,6 @@ 41594159 41585858 41584944 -4158454c 41564f34 41564956 41564953 @@ -16895,7 +16184,6 @@ 41544150 4154414c 41535459 -41535353 41535345 41535344 41535053 @@ -16919,19 +16207,15 @@ 41533639 41525a55 4152545a -41525459 41525455 41525449 41525441 41525431 41525053 41524f43 -41524d59 -41524d59 4152494e 4152454c 41524441 -41524348 41524259 41524159 4152414b @@ -16948,16 +16232,11 @@ 414e4f4f 414e4f4b 414e4e4e -414e4e49 -414e4e45 414e4b49 414e4943 414e4552 -414e4449 414e4441 414e4345 -414e414c -414e4149 414e4143 414d594c 414d5944 @@ -16975,9 +16254,7 @@ 414c4b59 414c4b41 414c4950 -414c494e 414c4944 -414c4943 414c4841 414c454d 414c454c @@ -17002,7 +16279,6 @@ 41494d53 41494a49 41494445 -41494441 41494149 41484f49 41484d45 @@ -17030,9 +16306,7 @@ 41444132 41434c53 4143494d -41434944 41434559 -41434553 41434537 41434532 41434355 @@ -17687,7 +16961,6 @@ 34363031 34353833 34353139 -34344444 34343833 34343337 34343336 @@ -17752,7 +17025,6 @@ 33373634 33373435 33373235 -33364444 33363736 33363731 33363638 @@ -17912,14 +17184,10 @@ 5a4f5459 5a4f544c 5a4f524e -5a4f4f4d 5a4f4f4b -5a4f4e45 5a4f4a41 -5a4f4559 5a4d5a4d 5a4d4549 -5a4d414e 5a4c5542 5a495941 5a495354 @@ -17929,17 +17197,12 @@ 5a494445 5a494255 5a48554b -5a48414f -5a455441 5a455354 -5a45524f 5a454f53 5a454e59 -5a454e41 5a454d50 5a454b4f 5a454b49 -5a454b45 5a454b41 5a454445 5a444f47 @@ -17960,13 +17223,11 @@ 5a414944 5a414753 5a41474f -5a41434b 5a323334 5a315832 595a5154 59593455 5957424a -59564553 5956414e 59564144 59555441 @@ -17983,7 +17244,6 @@ 59525059 59504545 594f5954 -594f594f 594f5949 594f5553 594f554d @@ -17991,15 +17251,12 @@ 594f5532 594f5445 594f5441 -594f524b 594f4f4f 594f4d49 594f4d41 594f4b49 594f484f 594f474f -594f4749 -594f4441 594e594e 594e4441 594d594d @@ -18011,7 +17268,6 @@ 59455332 59455254 59454f4e -59454148 59454144 59454141 59445944 @@ -18047,7 +17303,6 @@ 58504143 584f5345 584d584d -584d4153 584c5238 584a5144 58495849 @@ -18093,11 +17348,9 @@ 574f5749 574f5733 574f5731 -574f524d 574f5245 574f4f50 574f4f4a -574f4e47 574f4e43 574f4d42 574f4c4b @@ -18110,30 +17363,23 @@ 574b5943 574b5250 57495341 -57495245 57494e58 -57494e4b 57494e49 -57494e45 57494e33 57494c59 57494c46 -57494c44 57494c42 57494741 5749464f 57494649 -57494645 57494447 57494348 5748594d 57485032 57484944 57484557 -57484154 57455a4c 57455741 -57455354 57455353 57455243 57455242 @@ -18150,16 +17396,12 @@ 2a57424c 57415441 57415341 -57415252 5741524e -57415244 57415233 -57414e4b 57414e49 57414d53 57414c5a 57414c50 -57414c4b 57414c49 57414b41 57414853 @@ -18182,7 +17424,6 @@ 564f4e47 564f4c45 564f4c41 -564f4944 564c4153 564a595a 564a4e5a @@ -18198,13 +17439,10 @@ 56494f4c 56494e5a 56494b45 -56494557 56494552 56494455 56494453 -56494445 56494354 -5649434b 56494349 56494348 5649414a @@ -18213,11 +17451,9 @@ 56475648 56474b4b 56474552 -56465646 56465243 5646484e 56455849 -56455454 56455453 56455341 56455244 @@ -18226,7 +17462,6 @@ 56454c4c 56454641 5645444f -56454441 56454354 56454157 56444159 @@ -18280,7 +17515,6 @@ 55534a45 55534941 55534849 -55534552 55534152 55525552 55525353 @@ -18319,7 +17553,6 @@ 554a4155 55495549 55485548 -55474c59 55474848 55464646 5546414b @@ -18346,7 +17579,6 @@ 54584246 54574f53 54574159 -54574154 54565456 54564253 54555a5a @@ -18360,13 +17592,10 @@ 54555255 54555254 54555245 -54555244 54554e4b 54554d49 54554d45 -54554646 54554552 -5455434b 54554348 54554343 54554341 @@ -18386,18 +17615,13 @@ 5452594d 54525550 5452554d -54525545 54525259 -54524f59 -54524f59 54524f55 54524f4c 54524f44 5452495a -54524950 54524946 54524942 -54524558 5452454e 54524544 54524543 @@ -18405,12 +17629,10 @@ 5452414a 54524147 54524146 -54524143 54523333 54504952 544f5a5a 544f5553 -544f5552 544f5445 544f534b 544f5250 @@ -18420,7 +17642,6 @@ 544f4f4d 544f4f43 544f4e53 -544f4e45 544f4e41 544f4e31 544f4d58 @@ -18432,10 +17653,8 @@ 544f455a 544f4558 544f4554 -544f4553 544f4445 544f424f -544f4241 544f414e 544e544e 544e4f31 @@ -18450,7 +17669,6 @@ 544d4d33 544d4247 544d4158 -544d414e 544c5054 544c4f42 544c4e44 @@ -18459,8 +17677,6 @@ 544a544a 54495945 5449564f -5449544f -54495445 54495250 5449524f 54495231 @@ -18468,8 +17684,6 @@ 54494f52 54494e48 54494d50 -54494d4f -54494d45 54494d38 54494d36 54494d35 @@ -18480,14 +17694,12 @@ 54494c55 54494b45 54494941 -54494752 5449474f 54494554 54494552 54494550 54494546 54494459 -54494445 54494345 5449424f 54494153 @@ -18495,19 +17707,14 @@ 54493841 54484f50 54484f4f -54484f4f -54484f4e -54484f4d 54484e4c 5448495a -54484953 5448494f 54484939 54484934 54484931 54484554 54484552 -5448454f 5448454c 54484155 5448414f @@ -18515,7 +17722,6 @@ 5448414b 5448414a 54475331 -54474946 54464f53 54464e4d 54464d59 @@ -18524,15 +17730,12 @@ 54455858 54455645 54455546 -54455353 54455352 54455254 5445524e 5445524d 5445524c 54454e4f -54454e4e -54454d50 54454d45 54454c4f 54454c41 @@ -18545,11 +17748,9 @@ 54454535 54454534 54454445 -54454444 54454441 54454154 54454153 -54454153 54454143 54454142 54444b31 @@ -18563,8 +17764,6 @@ 54415a41 54415944 54415754 -54415455 -54415441 54415432 54415359 54415349 @@ -18591,7 +17790,6 @@ 54414731 54414548 5441444f -5441434f 54414349 54414348 54414332 @@ -18625,14 +17823,12 @@ 53574643 53574544 53574159 -5357414e 53574144 53565356 53565352 53565346 53564543 53564158 -53555a59 53555853 53555454 5355544f @@ -18640,7 +17836,6 @@ 53555353 53555351 53555350 -53555349 53555255 53555050 5355504f @@ -18648,9 +17843,7 @@ 53554e45 53554e41 53554e33 -53554d4f 53554d49 -53554b49 53554a49 53554944 53554841 @@ -18670,15 +17863,12 @@ 53545231 53544f55 53544f54 -53544f50 53544f4f 53544f4d 53544956 5354494e 5354494b 53544944 -53544557 -53544545 53544542 53544158 53544155 @@ -18701,11 +17891,8 @@ 53523446 53514d4e 53505953 -53505544 -53505544 53505350 53505152 -53505152 53504f4b 53504f47 53504d53 @@ -18715,14 +17902,11 @@ 53504935 53504930 53504545 -53504543 53504331 -5350414d 53504147 534f5a41 534f5858 534f5831 -534f5550 534f554e 534f554d 534f5441 @@ -18732,19 +17916,14 @@ 534f4f54 534f4f53 534f4f48 -534f4e49 -534f4e47 534f4e31 534f4d55 534f4d33 534f4c55 -534f4c4f 534f4a41 534f4952 534f494c -534f4649 534f444f -534f434b 534f4242 534f4241 534f414d @@ -18758,7 +17937,6 @@ 534e4946 534e4655 534e4548 -534e4150 534e414d 534e4148 534e4146 @@ -18769,7 +17947,6 @@ 534d5342 534d4f4f 534d4f4e -534d4f47 534d4f44 534d4752 534d4554 @@ -18783,7 +17960,6 @@ 534c5331 534c4f56 534c4f54 -534c4950 534c494e 534c4943 534c4157 @@ -18806,7 +17982,6 @@ 534a4f56 5349594b 53495834 -53495641 53495449 5349534b 5349524f @@ -18814,7 +17989,6 @@ 53494e54 53494e49 53494e45 -53494e41 53494e37 53494b49 5349494d @@ -18827,7 +18001,6 @@ 53494431 53494345 53494253 -5349414e 53493744 53493344 53493241 @@ -18841,22 +18014,15 @@ 53485245 53484f59 53484f58 -53484f57 -53484f54 -53484f50 53484f4c -53484f45 53484f44 53484d53 -53484950 53484946 53484941 53484556 53484554 53484553 -5348414e 5348414a -53484148 53484139 53483255 53474552 @@ -18869,15 +18035,12 @@ 53455a59 5345594d 53455857 -5345584f 5345584d 53455843 53455838 53455836 -53455649 53455455 5345544f -53455448 53455345 5345524f 53455246 @@ -18886,7 +18049,6 @@ 53454e53 53454e46 53454e45 -53454e45 53454d50 53454d34 53454c4d @@ -18927,8 +18089,6 @@ 53434331 5343415a 53434159 -53434154 -53434152 53434142 53433854 53433138 @@ -18948,25 +18108,19 @@ 53415231 53415041 53414e55 -53414e44 53414e31 -53414d50 -53414d4d -53414d49 53414d36 53414d33 53414c59 53414c55 53414c50 53414c49 -53414c49 53414b53 53414b4f 53414b38 53414958 53414953 53414952 -5341494c 53414946 53414831 5341474f @@ -18997,8 +18151,6 @@ 52555550 52555544 52555355 -52555353 -52555353 5255534b 52555345 52555245 @@ -19007,12 +18159,10 @@ 52555045 52555041 52554f54 -52554e54 52554e47 52554e39 52554e31 52554d41 -52554c5a 52554c4c 52554c41 52554845 @@ -19040,7 +18190,6 @@ 524f5a45 524f5945 524f5931 -524f5859 524f5831 524f5757 524f5753 @@ -19050,34 +18199,24 @@ 524f5449 524f5445 524f5441 -524f5349 524f5331 -524f5259 524f524b 524f5249 524f5049 -524f5045 524f5041 -524f4f54 524f4f50 524f4f4f -524f4f4b 524f4e4d 524f4e4c 524f4e4b 524f4e4a 524f4e45 524f4e44 -524f4e44 524f4e43 524f4e33 524f4d4d -524f4d45 524f4d43 -524f4d41 -524f4d41 524f4c59 -524f4c4c 524f4c45 524f4c44 524f4b59 @@ -19092,9 +18231,7 @@ 524f4343 524f424d 524f424b -524f4249 524f414b -524f4144 524f3433 524f3333 524f3133 @@ -19115,7 +18252,6 @@ 5249564f 52495645 5249534f -5249534b 52495349 52495348 52495053 @@ -19123,13 +18259,11 @@ 52494f50 52494f47 52494e48 -52494e47 52494e45 52494d55 52494d53 52494c45 52494b53 -52494b49 52494a41 5249494c 52494747 @@ -19137,29 +18271,24 @@ 5249454e 5249444f 52494449 -5249434f 52494333 52494144 52494142 5249364b 5249334b 52484853 -52484541 52484432 52484144 52464c43 52464244 52455a4f -52455a41 52455853 52455550 5245545a 5245534f 52455339 52455231 -52454e4f 52454e49 -52454e45 52454e43 52454d53 52454d45 @@ -19172,7 +18301,6 @@ 52454747 52454641 52454553 -52454544 52454459 5245444c 52454442 @@ -19193,14 +18321,11 @@ 52424442 52424232 52415a45 -52415953 -52415953 5241594e 5241594d 5241594b 52415731 52415653 -52415453 52415432 52415431 52415355 @@ -19210,21 +18335,16 @@ 52415031 52414e59 52414e4f -52414e44 52414d5a 52414d55 -52414d4d -52414d49 52414d31 52414c54 52414c4c -52414a41 52414948 52414946 52414938 52414934 52414755 -52414745 52414654 5241464e 52414553 @@ -19255,7 +18375,6 @@ 5155414b 51554149 51515757 -51515151 51513131 514f4f4c 514e595a @@ -19277,13 +18396,11 @@ 50574f47 50574854 50574549 -50555454 50555453 50555449 50555049 50555045 50554e53 -50554d50 50554c55 50554c45 50554b55 @@ -19308,7 +18425,6 @@ 50525347 50524f57 50524f56 -50524f4e 50524950 5052494e 5052494c @@ -19329,25 +18445,17 @@ 504f5553 504f544c 504f525a -504f5254 504f5245 504f5238 -504f5053 504f5052 -504f5050 -504f504f -504f5045 504f5031 504f4f4d -504f4f4c 504f4f43 504f4f42 -504f4e59 504f4e49 504f4e43 504f4d50 504f4d31 -504f4b45 504f4b41 504f4953 504f4950 @@ -19355,8 +18463,6 @@ 504f4853 504f4843 504f4759 -504f474f -504f4749 504e4352 504d5547 504d4950 @@ -19383,12 +18489,9 @@ 50495449 50495445 50495354 -50495353 50495349 -50495049 50494f4a 50494d53 -50494d50 50494c4f 50494c46 50494b4f @@ -19397,7 +18500,6 @@ 50494841 50494759 50494755 -50494753 5049474f 50494749 50494741 @@ -19405,7 +18507,6 @@ 50494550 50494452 50494355 -5049434b 50494349 50494153 5049394b @@ -19418,11 +18519,9 @@ 50484f54 50484f4f 50484950 -5048494c 50484555 50484544 50484155 -50484154 50484151 50483130 50475550 @@ -19434,21 +18533,16 @@ 5045564f 5045544f 50455449 -50455445 50455431 50455341 50455259 -50455249 -50455245 50455241 50455050 50454e5a -50454e4e 50454c49 50454b41 50454a45 50454554 -5045454b 50454545 50454459 50454441 @@ -19460,7 +18554,6 @@ 50445542 50445044 50444f47 -50444f47 50435245 50434331 50433431 @@ -19486,7 +18579,6 @@ 50415235 50415231 50415050 -50415049 50414e59 50414e55 50414e4e @@ -19497,7 +18589,6 @@ 50414d31 50414b53 50414b4b -50414b49 50414b31 50414a4a 50414952 @@ -19507,7 +18598,6 @@ 50414459 50414453 50414354 -5041434f 50414349 50414343 5041424f @@ -19530,13 +18620,10 @@ 4f58584f 4f584f58 4f58454e -4f574e5a 4f574e54 4f574c31 -4f57454e 4f565250 4f564944 -4f564944 4f555a4f 4f55544c 4f555432 @@ -19545,7 +18632,6 @@ 4f554e4f 4f554e45 4f55414b -4f54544f 4f545241 4f544f54 4f544e44 @@ -19574,7 +18660,6 @@ 4f524541 4f52434f 4f524156 -4f52414c 4f524143 4f505845 4f505550 @@ -19582,14 +18667,12 @@ 4f505059 4f504f54 4f50494e -4f504945 4f504559 4f504539 4f504531 4f4f5354 4f4f5341 4f4f5241 -4f4f4f4f 4f4f4e41 4f4f4c4c 4f4f4c49 @@ -19617,13 +18700,11 @@ 4f4d4945 4f4d4944 4f4d4653 -4f4d4552 4f4d454d 4f4d4544 4f4d4159 4f4d4158 4f4d4153 -4f4d4152 4f4d4144 4f4c4f55 4f4c4f53 @@ -19637,11 +18718,9 @@ 4f4c494f 4f4c494b 4f4c4945 -4f4c4741 4f4c4558 4f4c454e 4f4c454b -4f4c4547 4f4c4455 4f4c4153 4f4c4152 @@ -19668,16 +18747,12 @@ 4f484e45 4f484d53 4f484c41 -4f48494f -4f48494f 4f484341 -4f484131 4f47555a 4f475249 4f474945 4f474941 4f474759 -4f474759 4f474749 4f464953 4f45545a @@ -19686,8 +18761,6 @@ 4f45474f 4f444f47 4f444953 -4f44494e -4f44494e 4f44494c 4f444559 4f444554 @@ -19701,7 +18774,6 @@ 4f434359 4f434150 4f424f4c -4f424f45 4f424931 4f424552 4f414e48 @@ -19725,7 +18797,6 @@ 4e564c54 4e564834 4e55554b -4e55545a 4e555349 4e554e53 4e554e4e @@ -19754,16 +18825,13 @@ 4e4f5341 4e4f5250 4e4f5247 -4e4f5244 4e4f5049 -4e4f5045 4e4f4f4f 4e4f4f4d 4e4f4c53 4e4f4c46 4e4f4953 4e4f4941 -4e4f454c 4e4f4459 4e4f4444 4e4f4259 @@ -19798,12 +18866,9 @@ 4e495245 4e495050 4e494f4e -4e494e4f 4e494d48 4e494c4c 4e494b55 -4e494b4f -4e494b41 4e494853 4e494552 4e494548 @@ -19822,7 +18887,6 @@ 4e474545 4e474158 4e455a59 -4e455854 4e455759 4e45574f 4e45545a @@ -19832,12 +18896,8 @@ 4e455352 4e455348 4e455250 -4e45524f 4e455053 4e455048 -4e454f4e -4e454e41 -4e454d4f 4e454d49 4e454d45 4e454c53 @@ -19870,7 +18930,6 @@ 4e41545a 4e415459 4e415454 -4e415448 4e415344 4e415254 4e415050 @@ -19878,9 +18937,7 @@ 4e414e58 4e414e4b 4e414e45 -4e414e41 4e414d55 -4e414d45 4e414d44 4e414c49 4e414b59 @@ -19911,7 +18968,6 @@ 4d555548 4d55545a 4d55534b -4d555345 4d555331 4d55524f 4d555249 @@ -19926,7 +18982,6 @@ 4d554753 4d554747 4d554659 -4d554643 4d554554 4d55454c 4d554445 @@ -19956,18 +19011,12 @@ 4d4f584c 4d4f5541 4d4f5452 -4d4f544f -4d4f5354 4d4f525a -4d4f5254 4d4f5250 -4d4f5249 4d4f5246 4d4f5050 4d4f5045 4d4f4f5a -4d4f4e4b -4d4f4e49 4d4f4d45 4d4f4d42 4d4f4d32 @@ -19989,10 +19038,8 @@ 4d4f434b 4d4f4348 4d4f4341 -4d4f4259 4d4f424f 4d4e4d4e -4d4e4d4e 4d4d5354 4d4d4d32 4d4d474a @@ -20011,31 +19058,21 @@ 4d4a3132 4d495a41 4d495858 -4d495858 4d495841 4d495455 -4d495445 -4d495441 4d49534b 4d495345 4d495256 4d495252 4d494f53 -4d494e54 4d494d4b -4d494d49 4d494d45 -4d494c4f 4d494c31 -4d494b4f 4d494b4c -4d494b41 4d49484f 4d49475a 4d49454b -4d494348 4d494347 -4d494341 4d494153 4d49414b 4d494143 @@ -20048,24 +19085,17 @@ 4d465252 4d455a32 4d455849 -4d455453 4d455349 4d45524f 4d455244 -4d455243 -4d455243 -4d454f57 4d454e4e 4d454e45 4d454d53 -4d454d4f 4d454d49 -4d454d45 4d454d41 4d454c59 4d454c4b 4d454c44 -4d454c41 4d454c32 4d454b41 4d454a49 @@ -20076,8 +19106,6 @@ 4d454553 4d454546 4d454441 -4d454154 -4d454154 4d454153 4d454142 4d454134 @@ -20096,7 +19124,6 @@ 4d444c47 4d444c38 4d444b55 -4d444b55 4d444a54 4d444a4f 4d444959 @@ -20126,19 +19153,13 @@ 4d415659 4d415649 4d415641 -4d415631 4d41554d -4d415549 4d415547 4d415546 4d415531 -4d415448 -4d415445 4d415431 -4d41534b 4d415343 4d41525a -4d415254 4d41524e 4d415235 4d415045 @@ -20148,10 +19169,7 @@ 4d414d43 4d414d30 4d414c59 -4d414c49 4d414c43 -4d414c41 -4d414b4f 4d414b43 4d414b31 4d414a55 @@ -20171,11 +19189,9 @@ 4d414531 4d41444d 4d41444c -4d414441 4d414357 4d41434d 4d41434c -4d41434b 4d414347 4d414342 4d414152 @@ -20404,7 +19420,6 @@ 4c555649 4c555641 4c555631 -4c55545a 4c555445 4c555441 4c55534b @@ -20415,14 +19430,8 @@ 4c554d59 4c554d49 4c554d41 -4c554b45 -4c554953 -4c55474f 4c554646 4c554449 -4c554441 -4c55434b -4c554241 4c554152 4c554146 4c544e42 @@ -20441,7 +19450,6 @@ 4c4f5555 4c4f5554 4c4f554c -4c4f5549 4c4f5547 4c4f5531 4c4f544a @@ -20449,20 +19457,14 @@ 4c4f5444 4c4f5353 4c4f5343 -4c4f5249 -4c4f5045 4c4f5041 4c4f5039 -4c4f4f50 4c4f4f4d 4c4f4e59 4c4f4e4b 4c4f4c59 -4c4f4c4c 4c4f4c45 4c4f4c44 -4c4f4b49 -4c4f4b49 4c4f4b41 4c4f4852 4c4f4747 @@ -20472,20 +19474,16 @@ 4c4f4449 4c4f4445 4c4f4353 -4c4f434f 4c4f4253 4c4f4242 4c4f4241 -4c4f4144 4c4f3130 -4c4d4c43 4c4d4350 4c4c5331 4c4c4f52 4c4c4f4f 4c4c4950 4c4c4943 -4c4c4942 4c4c4144 4c4a4c4a 4c4a3231 @@ -20495,17 +19493,12 @@ 4c495449 4c49534b 4c495245 -4c495053 4c495048 4c495045 4c495044 -4c494f4e 4c494f32 4c494e5a -4c494d4f 4c494d49 -4c494d41 -4c494c4c 4c494c4a 4c494b53 4c494a4e @@ -20530,19 +19523,14 @@ 4c45534c 4c45514a 4c45504f -4c454f4e 4c454f32 4c454e44 -4c454e41 -4c454e41 4c454d4f 4c454c4c 4c454846 -4c454753 4c454747 4c454745 4c454552 -4c45454e 4c45454b 4c454543 4c454534 @@ -20558,7 +19546,6 @@ 4c415941 4c415645 4c415557 -4c415552 4c415550 4c415542 4c415454 @@ -20568,19 +19555,16 @@ 4c414f43 4c414e5a 4c414e53 -4c414e45 4c414e31 4c414d59 4c414d43 4c414c32 4c414b59 4c414b49 -4c414b45 4c414943 4c414942 4c414644 4c414445 -4c414444 4c41434f 4c41354e 4c413455 @@ -20598,7 +19582,6 @@ 4b595454 4b595259 4b59524f -4b595241 4b583838 4b575431 4b574b57 @@ -20646,13 +19629,10 @@ 4b4f5453 4b4f5256 4b4f5255 -4b4f524e 4b4f5246 4b4f4f52 4b4f4f43 4b4f4e59 -4b4f4e47 -4b4f4e41 4b4f4d50 4b4f4d4f 4b4f4d47 @@ -20660,14 +19640,12 @@ 4b4f4c50 4b4f4b4b 4b4f4b45 -4b4f4b41 4b4f4a4f 4b4f484f 4b4f454e 4b4f454b 4b4f4549 4b4f4445 -4b4f4348 4b4f414e 4b4f414c 4b4e5558 @@ -20697,25 +19675,19 @@ 4b4c3739 4b4b4f49 4b4b4e44 -4b4b4b4b 4b4a5047 4b4a484c 4b495a5a -4b495749 4b495741 4b495541 4b495355 4b495348 -4b495241 4b49504c 4b494e45 4b494d59 4b494d53 4b494d45 -4b494c4f -4b494c4f 4b494b4b -4b494453 4b494441 4b494431 4b49434f @@ -20727,7 +19699,6 @@ 4b48494e 4b484941 4b484152 -4b48414e 4b484149 4b484144 4b483232 @@ -20739,7 +19710,6 @@ 4b455641 4b455631 4b455454 -4b455454 4b455443 4b455431 4b455354 @@ -20755,7 +19725,6 @@ 4b454d41 4b454c59 4b454c53 -4b454c4c 4b454c49 4b454c41 4b454b43 @@ -20785,30 +19754,20 @@ 4b423639 4b415a59 4b415a41 -4b415945 4b415753 4b415552 -4b415459 4b415455 4b41544e -4b415449 4b415433 4b415432 4b415359 4b415252 -4b41524f -4b41524f 4b415055 4b415041 -4b414f53 -4b414e54 4b414e49 -4b414e47 4b414d53 4b414d50 -4b414d49 4b414d31 -4b414c49 4b414953 4b414952 4b414944 @@ -20842,9 +19801,7 @@ 4a555353 4a555041 4a554e47 -4a554e45 4a554d45 -4a554c49 4a554b59 4a554b49 4a554a41 @@ -20852,9 +19809,6 @@ 4a554849 4a554841 4a554747 -4a554459 -4a554445 -4a554444 4a554444 4a554441 4a554359 @@ -20890,9 +19844,6 @@ 4a4f5552 4a4f5355 4a4f534f -4a4f5349 -4a4f5345 -4a4f5247 4a4f5049 4a4f4e56 4a4f4e54 @@ -20900,7 +19851,6 @@ 4a4f4d41 4a4f4c59 4a4f4b49 -4a4f4b45 4a4f484f 4a4f4835 4a4f4832 @@ -20912,8 +19862,6 @@ 4a4f4550 4a4f4546 4a4f4542 -4a4f4459 -4a4f434b 4a4f4349 4a4f4341 4a4f4154 @@ -20954,14 +19902,10 @@ 4a495451 4a49524f 4a494f43 -4a494e58 4a494e4b -4a494d4d -4a494d49 4a494d48 4a494d47 4a494d32 -4a494c4c 4a494b4f 4a494754 4a494646 @@ -20993,7 +19937,6 @@ 4a454345 4a454249 4a454241 -4a445542 4a445331 4a444e44 4a44454c @@ -21014,8 +19957,6 @@ 4a41575a 4a41574b 4a41564f -4a415649 -4a415641 4a415454 4a415453 4a41535a @@ -21024,20 +19965,15 @@ 4a415349 4a41524d 4a41504f -4a414e41 -4a414e41 4a414e31 4a414d59 4a414d4e 4a414c48 -4a414b4f 4a414a4b -4a41494c 4a414943 4a41484e 4a414747 4a414733 -4a41464f 4a414353 4a414351 4a414343 @@ -21047,7 +19983,6 @@ 4a345438 4a335030 4a303037 -495a5a59 495a5a4f 495a5a49 49585858 @@ -21056,7 +19991,6 @@ 49564945 49564558 4956454c -4956414e 49554245 49545450 49545449 @@ -21066,7 +20000,6 @@ 49544153 49535445 49534954 -49534953 49534849 49534558 49534550 @@ -21074,7 +20007,6 @@ 49534141 49524f44 49524d49 -49524d41 49524554 49524545 49524153 @@ -21092,7 +20024,6 @@ 4950454b 49504144 49503131 -494f5741 494f564f 494f5354 494f534d @@ -21104,10 +20035,8 @@ 494f4153 494e5354 494e4f54 -494e4e4f 494e4b4f 494e4b41 -494e4459 494e424c 494e4159 494e4157 @@ -21129,7 +20058,6 @@ 494d4158 494d4144 494d3455 -494c5941 494c4c49 494c4a4c 494c4a41 @@ -21161,7 +20089,6 @@ 49484555 49484349 49484142 -49474f52 49474749 49474242 49464e59 @@ -21179,11 +20106,9 @@ 4944414e 49435550 49435532 -49435532 49434859 49434553 4943424d -4943414e 49424942 49424557 4942454e @@ -21202,7 +20127,6 @@ 49414250 49313132 4930304b -48594f4e 4857414e 48564152 48555941 @@ -21212,16 +20136,11 @@ 4855524b 48555241 48555053 -48554e54 48554e41 48554d53 48554c55 -48554c4b 48554a49 4855484e -4855474f -4855474f -48554559 48554553 48554259 48554253 @@ -21242,26 +20161,21 @@ 484f5753 484f5741 484f5553 -484f5454 484f544f 484f5449 484f5439 484f5435 484f5432 -484f5431 484f5350 484f5052 484f4f53 -484f4f4b 484f4f43 484f4e5a 484f4e49 484f4d4d -484f4c59 484f4c47 484f4c31 484f4953 -484f4753 484f4745 484f4245 484f4242 @@ -21280,12 +20194,10 @@ 48495045 48494f4f 48494d45 -48494d45 48494d31 48494b4f 48494a4b 48494a49 -48494748 48494552 2e484944 4849434f @@ -21302,26 +20214,20 @@ 48455255 48455254 48455253 -48455242 -48455242 -48455241 48454d4f 48454a41 48454954 -4845494c 4845494b 48454933 48454930 4845484f 4845474f 48454645 -4845454c 48454459 48454449 48454249 48454152 4845414c -48454144 48444744 48444241 48434550 @@ -21339,24 +20245,16 @@ 48415738 48415350 4841534c -48415345 -48415254 -48415254 -48415252 -4841524d 48415242 48415155 48415053 48414e54 -48414e4b 48414e49 -48414e44 48414d4f 48414d4b 48414d45 48414c59 48414c53 -48414c4f 48414c49 48414c42 48414b45 @@ -21366,10 +20264,8 @@ 48414954 48414945 48414943 -48414841 4841444e 48414445 -4841434b 48414348 48414147 48413947 @@ -21396,7 +20292,6 @@ 47555441 4755534d 47555345 -47555255 4755524f 4755524e 47555050 @@ -21412,7 +20307,6 @@ 47554249 47554152 47554150 -4755414d 47554143 47553653 47553553 @@ -21430,7 +20324,6 @@ 47524f4b 47524f48 47524c4f -47524953 47524942 47524752 47524557 @@ -21438,11 +20331,9 @@ 47524550 4752454e 47524549 -47524545 47524543 47524542 4752415a -47524159 47524148 47524147 47523854 @@ -21450,9 +20341,7 @@ 474f5a5a 474f554c 474f545a -474f5454 474f5354 -474f5353 474f5349 474f5255 474f524d @@ -21468,9 +20357,7 @@ 474f4f4d 474f4f47 474f4f32 -474f4e45 474f4d55 -474f4d45 474f4d41 474f4c55 474f4c4c @@ -21478,14 +20365,12 @@ 474f4a55 474f494c 474f4841 -474f474f 474f4747 474f4646 474f454c 474f444a 474f4449 474f4259 -474f4259 474f4245 474f4241 474f414e @@ -21532,7 +20417,6 @@ 47494b4f 47494753 4749474e -47494749 4749454c 4749434b 4749424f @@ -21557,7 +20441,6 @@ 4745544e 47455353 4745524b -47455241 4745504d 47454f52 47454f4f @@ -21568,10 +20451,8 @@ 47454c41 47454b41 4745494e -4745494c 47454749 47454552 -4745454b 47454545 47454249 47454150 @@ -21592,7 +20473,6 @@ 47415649 47415645 47415449 -47415445 47415349 47415053 47414f4c @@ -21601,25 +20481,17 @@ 47414d55 47414d50 47414d49 -47414d45 47414c4f -47414c4c -47414c49 47414a41 47414a31 -4741494c -4741494c 47414849 47414747 -47414741 47414649 4741445a 47414453 47414444 47414255 47414252 -47414249 -47414245 47414153 47414152 47414147 @@ -21645,11 +20517,7 @@ 46555241 46555041 46554e5a -46554e4b -46554e4b 46554e33 -46554c4c -46554a49 46554749 46554449 46554441 @@ -21667,23 +20535,17 @@ 46524242 46524155 46524154 -4652414e 46514949 464f584d 464f5553 464f554e -464f5255 -464f524d 464f5247 464f5242 464f5233 464f5231 -464f4f54 -464f4f54 464f4f4f 464f4f4d 464f4f46 -464f4f44 464f4c4c 464f4c49 464f4c45 @@ -21701,41 +20563,29 @@ 464c4f48 464c4f45 464c4f42 -464c4950 464c494e 464c4557 464c4157 -464c4154 464c4153 464b484a 464b4345 464a3230 46495849 -4649545a 46495453 46495445 -46495354 46495349 46494f52 -46494f4e 46494f4c 46494e54 -46494e4e 46494e47 -46494e45 46494c59 -46494c4f -46494c4d 46494a4e 46494753 46494749 46494748 46494747 4649464f -46494649 -46494649 46494552 -4649444f 46494131 46493737 46493331 @@ -21753,22 +20603,18 @@ 4645574f 4645545a 46455455 -46455454 46455433 4645534f 4645525a 46455252 4645524d 46455249 -46454e47 46454e44 46454d49 -46454c49 46454a4c 46454a45 46454553 46454542 -46454152 46453138 46444b35 46444748 @@ -21778,11 +20624,9 @@ 46415941 4641554e 4641545a -46415453 4641544f 46415442 46415441 -46415441 46415432 46415431 4641534b @@ -21797,7 +20641,6 @@ 46414e39 46414e31 46414d41 -46414c4b 46414c49 46414c43 46414b54 @@ -21866,7 +20709,6 @@ 45534f48 45534e47 45534d55 -45534d45 45534c45 4553494e 45534945 @@ -21886,11 +20728,9 @@ 45524f47 45524d41 45524c41 -45524b49 45524952 4552494f 4552494d -4552494b 45524933 4552454b 4552444f @@ -21908,13 +20748,10 @@ 45504f50 45504f43 45504a54 -45504943 45504550 45503832 454f4c41 454f4455 -454e5a4f -454e5659 454e5659 454e554a 454e5259 @@ -21955,7 +20792,6 @@ 454c4f43 454c4d45 454c4c53 -454c4c41 454c4b49 454c494b 454c4949 @@ -22017,11 +20853,9 @@ 45444f59 45444f46 45444d4d -45444954 45444953 45444948 45444553 -4544454e 4544454c 4544454b 45444157 @@ -22043,7 +20877,6 @@ 45434b49 45434b45 4543494f -4543484f 45434152 45434150 45425255 @@ -22060,10 +20893,8 @@ 45424142 45415a49 45415645 -45415359 45415345 45415254 -4541524c 45414e41 45414e31 45414645 @@ -22079,7 +20910,6 @@ 44563834 44555953 44555841 -44555443 44555441 44555345 44555254 @@ -22087,9 +20917,6 @@ 44555245 4455504b 44555045 -44554e4e -44554e43 -44554d42 44554c59 44554c45 44554b49 @@ -22098,7 +20925,6 @@ 44554741 44554553 4455454c -4455434b 44554348 44554341 44554253 @@ -22118,12 +20944,10 @@ 44534653 44534144 44533134 -4452554d 44525545 44525355 44525331 44525231 -44524f57 44524e4f 44524559 44524558 @@ -22133,14 +20957,11 @@ 44524545 4452435a 44524158 -44524147 44523132 44515041 44505453 44504f47 44504c54 -444f574e -444f574e 444f5747 444f5641 444f5554 @@ -22148,23 +20969,16 @@ 444f5354 444f5331 444f5254 -444f524f -444f524b 444f5242 444f504f -444f5045 -444f5045 444f4f59 444f4f57 -444f4f52 444f4f42 444f4f33 444f4e55 444f4e51 -444f4e51 444f4e4a 444f4e48 -444f4e45 444f4e32 444f4d4d 444f4d32 @@ -22172,7 +20986,6 @@ 444f4c53 444f4b58 444f4b45 -444f4954 444f4848 444f4841 444f4745 @@ -22180,7 +20993,6 @@ 444f4738 444f4737 444f4455 -444f444f 444f444a 444f4345 444f4343 @@ -22200,7 +21012,6 @@ 444d4f54 444d4f42 444d4d44 -444d414e 444c5341 444c4950 444c4157 @@ -22218,12 +21029,10 @@ 44495859 4449564f 4449564b -44495645 44495454 44495354 44495345 44495245 -44495245 44495151 44495053 44495050 @@ -22233,12 +21042,9 @@ 44494e55 44494e53 44494e49 -44494e47 44494d4d 44494d49 44494d43 -44494d41 -44494c4c 44494c44 44494c41 44494b4b @@ -22266,18 +21072,15 @@ 44464153 4446414c 44455a4f -4445594f 44455944 44455858 4445574f 44455744 -4445564f 4445554f 44455359 44455353 44455256 4445524d -44455246 44455245 44455242 44455241 @@ -22289,7 +21092,6 @@ 44454f4d 44454e31 44454d53 -44454d4f 44454c53 44454c46 44454b53 @@ -22300,12 +21102,9 @@ 44454741 44454659 4445464f -44454550 44454532 4445425a 44454231 -44454152 -44454144 4444554d 44445031 44444f53 @@ -22344,18 +21143,13 @@ 44415448 44415331 44415253 -44415249 -44415245 44415243 44415231 4441504f 44414f4c 44414f43 -44414e4f -44414e4e 44414e4d 44414e4a -44414e45 44414e37 44414e30 44414d55 @@ -22373,7 +21167,6 @@ 44414641 44414531 44414449 -44414444 44414359 4441434b 44414345 @@ -22400,7 +21193,6 @@ 44314431 44313233 44303050 -4430304d 44303037 44303031 435a435a @@ -22412,7 +21204,6 @@ 43585036 43585032 43575255 -43555a5a 43555645 43555353 4355534b @@ -22421,7 +21212,6 @@ 4355524f 43555244 43555242 -43554e54 43554d41 43554d33 43554d32 @@ -22431,7 +21221,6 @@ 43554545 4355444f 4355434b -43554241 43544c53 43544c31 43544854 @@ -22474,31 +21263,23 @@ 434f5449 434f5441 434f5353 -434f5259 434f5256 -434f524b 434f504f 434f5032 434f4f52 -434f4f50 434f4f4f 434f4e4b 434f4e49 434f4d58 434f4d49 -434f4c54 434f4c4d -434f4c44 434f4b4f -434f4b45 434f4b41 434f4a4f 434f494c 434f4643 434f444f 434f4434 -434f434f -434f4242 434f4231 434e5554 434e4643 @@ -22512,7 +21293,6 @@ 434d4333 434d4143 434c5547 -434c5542 434c5244 434c4f57 434c4f55 @@ -22530,7 +21310,6 @@ 434a4647 434a4545 43495645 -43495459 43495251 43495241 43495049 @@ -22545,7 +21324,6 @@ 43494341 4349424f 43494152 -4349414f 43494143 4348554a 43485534 @@ -22555,17 +21333,8 @@ 43484f45 43484f31 43484e47 -43484950 -4348494e -43484943 -43484941 -43484554 -4348454e -43484543 43484542 43484159 -43484153 -4348414e 43484131 43464552 43464443 @@ -22601,7 +21370,6 @@ 43434e59 43434e4e 43434643 -43434350 4343434d 43433939 43433233 @@ -22616,21 +21384,13 @@ 4341564f 43415459 43415450 -4341544f 43415443 43415436 43415434 43415432 -43415353 -43415341 43415331 43415255 -4341524f -4341524c 4341524b -43415244 -43415231 -43415054 43415049 43414f4e 43414e4e @@ -22641,12 +21401,10 @@ 43414c56 43414c53 43414c50 -43414c49 43414c44 43414c31 43414a4f 43414952 -4341494e 43414646 4341454e 43414453 @@ -22654,7 +21412,6 @@ 43414449 43414348 43414331 -4341424f 4341424c 43414247 43413737 @@ -22662,7 +21419,6 @@ 43353436 43345445 43343845 -4333504f 43333130 43323230 43313732 @@ -22681,7 +21437,6 @@ 42555542 4255545a 42555355 -42555354 4255534f 42555345 42555341 @@ -22691,7 +21446,6 @@ 42554f4e 42554e58 42554e49 -42554d50 42554d41 42554d31 42554c4b @@ -22704,18 +21458,14 @@ 42554745 42554731 4255464f -42554646 -42554646 42554641 42554559 42554445 -42554444 42554443 42554438 42554433 42554432 42554331 -42554255 42554245 42544254 42544153 @@ -22729,14 +21479,11 @@ 42524f4c 42524f46 42524b54 -42524954 42524953 4252494d -4252454e 4252454d 4252454c 4252454b -42524545 42524544 42524441 42524239 @@ -22747,8 +21494,6 @@ 42505053 42504d53 424f5a49 -424f595a -424f595a 424f5957 424f5955 424f5954 @@ -22767,15 +21512,11 @@ 424f4f5a 424f4f53 424f4f4c -424f4f4b 424f4f49 424f4f44 424f4e54 -424f4e42 -424f4d42 424f4c4c 424f4c47 -424f4c44 424f4b55 424f4b41 424f484d @@ -22786,14 +21527,11 @@ 424f4444 424f4441 424f434f -424f4341 424f425a 424f4254 -424f424f 424f4244 424f4235 424f4234 -424f4231 424f4230 424f4142 424f3844 @@ -22806,7 +21544,6 @@ 424d575a 424d5757 424d5732 -424d5731 424d5544 424d534c 424d4f42 @@ -22819,8 +21556,6 @@ 424c5555 424c534a 424c5244 -424c4f57 -424c4f47 424c4c4f 424c4954 424c494d @@ -22831,10 +21566,8 @@ 424c4332 424c424c 424c4244 -424c4155 424c4150 424c414e -424c4143 424c4131 424a4832 424a4159 @@ -22848,7 +21581,6 @@ 4249524e 42495249 42494e4f -42494e44 42494d4f 42494c4b 42494c42 @@ -22858,14 +21590,9 @@ 4249474e 4249474c 42494748 -42494745 -42494744 42494738 -42494731 -42494646 42494631 4249454e -4249454e 4249454c 42494345 42494255 @@ -22890,14 +21617,10 @@ 42464443 42455a4f 42455454 -4245544f -42455354 42455255 -42455254 42455253 42455241 42454f50 -42454e5a 42454e55 42454e4b 42454e42 @@ -22908,19 +21631,12 @@ 42454852 4245484d 4245474f -42454554 -42454550 4245454c -42454546 42454544 42454449 42454445 42454441 42454348 -42454155 -42454154 -4245414e -4245414e 4245414c 42454147 42454144 @@ -22967,25 +21683,18 @@ 4241584f 4241574c 42415553 -4241554d 4241545a 42415441 4241534b 42415349 -42415254 4241524d 42415232 42415055 42414e54 42414e4f -42414e44 42414d53 42414d49 -42414d41 -42414c55 -42414c4c 42414c4b -42414b55 42414a4f 42414953 4241494e @@ -23004,9 +21713,7 @@ 42414442 42414432 42414353 -4241434b 4241424c -42414245 42414235 42414154 42414153 @@ -23016,7 +21723,6 @@ 42373137 42363936 42363035 -42353253 4233504f 42335030 42333833 @@ -23056,7 +21762,6 @@ 4158494d 41584553 41584552 -4158454c 4158414c 41575131 41574f4e @@ -23081,14 +21786,12 @@ 4156414a 41564148 41555745 -41555354 41555341 41555259 41555249 41554e45 41554c54 41554c41 -41554449 4154554e 4154554c 41545455 @@ -23096,7 +21799,6 @@ 41545441 41545346 41544f4e -41544f4d 41544c49 41544951 41544945 @@ -23117,10 +21819,7 @@ 41535359 41535352 4153534d -41535349 41535348 -41535344 -41535341 41535333 41535250 41535157 @@ -23177,14 +21876,12 @@ 4152494c 41524943 41524841 -4152474f 41524745 41524646 41524641 41524558 4152454e 41524547 -41524541 41524453 41524345 41524241 @@ -23210,13 +21907,10 @@ 414e4d4f 414e4a55 414e4a4f -414e4a41 -414e4954 414e494e 414e4944 414e4759 414e4557 -414e4452 414e4341 414e4159 414e414f @@ -23230,24 +21924,20 @@ 414d5341 414d524f 414d5041 -414d4f53 414d4f4c 414d4e41 414d4c49 -414d4954 414d454d 414d4545 414d4447 414d434f 414d4348 414d4232 -414d414e 414d3234 414c5a4f 414c5659 414c564f 414c5645 -414c5641 414c5554 414c5550 414c554d @@ -23269,7 +21959,6 @@ 414c4946 414c4942 414c4745 -414c4641 414c4631 414c4557 414c4552 @@ -23289,12 +21978,10 @@ 414b4953 414b494b 414b414c -414b3437 414b3238 414a5a31 414a4a4a 414a4944 -414a4158 414a3632 4149594d 41495441 @@ -23359,7 +22046,6 @@ 41444f47 41444e44 41444e41 -4144494e 41444944 41444931 41444541 @@ -23386,13 +22072,10 @@ 41434854 41434755 41434555 -41434553 -41434552 4143454e 4143454b 41434545 41434534 -41434531 41434359 41434343 41434341 @@ -23412,7 +22095,6 @@ 41424531 4142435a 41424353 -41424259 41424242 41424159 41423638 @@ -23429,7 +22111,6 @@ 41414153 4141414d 41414142 -41414141 41413636 41373134 41363636 @@ -23437,8 +22118,6 @@ 41343253 4132304d 41323030 -41314232 -41313233 412d3039 41303136 41303037 @@ -23816,7 +22495,6 @@ 36414243 36395834 36395444 -36394d45 36394641 36393834 36393748 @@ -24280,7 +22958,6 @@ 5a594e59 5a594e45 5a594c4f -5a594c4f 5a594c41 5a594b4f 5a594a52 @@ -24310,8 +22987,6 @@ 5a584656 5a584456 5a584358 -5a584356 -5a584356 5a584343 5a58414d 5a583645 @@ -24363,15 +23038,12 @@ 5a554e30 5a554d50 5a554d49 -5a554d49 5a554b41 5a55494b 5a554843 5a554841 5a55474f 5a55474c -5a554553 -5a554553 5a55454c 5a554541 5a554445 @@ -24433,7 +23105,6 @@ 5a4f5345 5a4f525a 5a4f5258 -5a4f524f 5a4f5244 5a4f5243 5a4f5242 @@ -24441,12 +23112,8 @@ 5a4f5053 5a4f4f5a 5a4f4f4c -5a4f4f4c -5a4f4f4b 5a4f4f44 5a4f4e54 -5a4f4e4b -5a4f4e45 5a4f4e44 5a4f4d4f 5a4f4d4d @@ -24459,7 +23126,6 @@ 5a4f4c4f 5a4f4c49 5a4f4c46 -5a4f4c41 5a4f4c31 5a4f4b49 5a4f4a32 @@ -24470,8 +23136,6 @@ 5a4f4741 5a4f4735 5a4f464f -5a4f464f -5a4f4646 5a4f4646 5a4f4554 5a4f454d @@ -24511,7 +23175,6 @@ 5a4d4947 5a4d474b 5a4d4559 -5a4d4559 5a4d4555 5a4d4548 5a4d4445 @@ -24567,14 +23230,12 @@ 5a495254 5a49524b 5a495055 -5a495050 5a49504f 5a495049 5a495048 5a494f54 5a494f53 5a494f4f -5a494f4e 5a494f4d 5a494e4f 5a494e46 @@ -24595,8 +23256,6 @@ 5a49454b 5a49444b 5a494447 -5a49434f -5a49434b 5a49434b 5a494153 5a49414e @@ -24609,7 +23268,6 @@ 5a485547 5a485448 5a484f45 -5a484f45 5a484e36 5a484950 5a48454f @@ -24630,7 +23288,6 @@ 5a455753 5a455741 5a455653 -5a455653 5a455641 5a455557 5a45554e @@ -24644,10 +23301,8 @@ 5a455254 5a455253 5a455250 -5a45524f 5a45524e 5a45524b -5a455247 5a455230 5a455048 5a45502d @@ -24666,8 +23321,6 @@ 5a454c59 5a454c58 5a454c49 -5a454b45 -5a454954 5a45484e 5a45484c 5a454759 @@ -24691,7 +23344,6 @@ 5a454241 5a454154 5a45414c -5a45414c 5a454132 5a45384f 5a453637 @@ -24729,8 +23381,6 @@ 5a423532 5a423345 5a415a4f -5a415a41 -5a415a41 5a415a31 5a415954 5a415952 @@ -24740,14 +23390,12 @@ 5a415831 5a415751 5a415741 -5a415552 5a41544f 5a41535a 5a415358 5a41534f 5a415348 5a415333 -5a415254 5a415253 5a415252 5a41524e @@ -24758,12 +23406,9 @@ 5a415158 5a415046 5a414e49 -5a414e45 5a414e44 5a414e41 -5a414e41 5a414d45 -5a414d41 5a414c55 5a414c4c 5a414c49 @@ -24772,7 +23417,6 @@ 5a414b45 5a414b41 5a414a41 -5a414952 5a41494d 5a414859 5a41484f @@ -24931,19 +23575,16 @@ 59555355 59555341 59555259 -59555241 59555133 59555049 59554f54 59554e54 59554d45 -59554d41 59554d36 59554b53 59554a59 59554a4d 59554950 -5955494f 5955494c 59554931 59554842 @@ -24987,7 +23628,6 @@ 59525751 59525553 59525245 -59525245 59524a57 59524559 59524544 @@ -25007,12 +23647,9 @@ 59503145 59503137 59503132 -594f594f 594f5835 594f555a -594f5555 594f5554 -594f5552 594f554e 594f554b 594f5547 @@ -25022,8 +23659,6 @@ 594f5535 594f5531 594f5434 -594f5349 -594f5348 594f5348 594f524c 594f5055 @@ -25031,24 +23666,20 @@ 594f5031 594f4f55 594f4f54 -594f4f4f 594f4f4c 594f4f47 594f4e58 594f4e4f 594f4e48 594f4e45 -594f4e45 594f4d4b 594f4d42 594f4c4f 594f4c45 594f4c41 -594f4c41 594f4b4b 594f4a52 594f4753 -594f4741 594f4647 594f4559 594f4343 @@ -25059,7 +23690,6 @@ 594e5748 594e5245 594e5241 -594e4f53 594e4e4f 594e4c53 594e4954 @@ -25196,7 +23826,6 @@ 5945534d 59455349 59455344 -59455332 59455250 59455249 59455248 @@ -25205,7 +23834,6 @@ 59455245 5945514d 59454f57 -59454f4a 59454e53 59454e4d 59454e4b @@ -25214,7 +23842,6 @@ 59454c59 59454c50 59454c4d -59454c4c 59454c41 59454b41 59454a37 @@ -25236,12 +23863,9 @@ 59445033 59444f4c 59444f4a -59444f43 -59444f42 59444f42 59444f41 59444d54 -59444d54 59444946 59444941 59444459 @@ -25276,7 +23900,6 @@ 59415952 59415949 59415945 -59415941 5941575a 5941574c 59415741 @@ -25294,7 +23917,6 @@ 5941524c 59415249 59415247 -59415241 59415231 59415155 59415131 @@ -25303,14 +23925,10 @@ 59414f49 59414e54 59414e4f -59414e4f -59414e4b -59414d53 59414d4f 59414d4e 59414d35 59414c50 -59414c4c 59414c43 59414b4b 59414b47 @@ -25422,7 +24040,6 @@ 58593348 58585854 5858584f -5858584c 58585844 58585843 58585833 @@ -25490,7 +24107,6 @@ 5854415a 58543852 58535853 -58535732 58535356 58534d4c 58534c42 @@ -25511,7 +24127,6 @@ 58524350 58524333 5852424f -58524159 58524149 5852395a 58523939 @@ -25575,10 +24190,8 @@ 584d5539 584d4944 584d4841 -584d454e 584d4452 584d4158 -584d4153 4c454741 584d414c 584d3435 @@ -25637,7 +24250,6 @@ 58495245 58495155 58494f4e -58494f4e 58494e4b 58494e49 58494e46 @@ -25715,16 +24327,13 @@ 58455244 58455047 58455041 -58454f4e 58454e55 58454e49 -58454e41 58454b53 58454b45 58454958 5845494f 5845454d -5845454d 58454459 58454445 58454359 @@ -25746,11 +24355,9 @@ 58443258 58435658 58435643 -58434f4d 58434846 58434446 5843424b -58434154 58434139 58433838 58433136 @@ -25761,8 +24368,6 @@ 58425344 5842524b 58424f59 -58424f58 -58424f58 58424e46 58424944 58424643 @@ -25858,7 +24463,6 @@ 58333231 5833315a 58333030 -58333030 58325852 58325556 58324450 @@ -25907,7 +24511,6 @@ 57595041 57594e54 57594e4f -57594e4e 57594e47 57594d58 57594c49 @@ -25929,7 +24532,6 @@ 57575933 57575858 57575759 -57575757 57575752 5757574d 57575745 @@ -25937,10 +24539,8 @@ 57575253 5757524f 57575050 -57575050 57575041 57574d4d -57574a44 57574949 57574643 57574545 @@ -25962,10 +24562,8 @@ 57563743 5756364e 57563536 -57555a5a 57555941 57555755 -57555755 5755574f 57555736 57555353 @@ -25973,7 +24571,6 @@ 57554f43 57554e41 57554d49 -57554c46 57554b45 57554945 57554841 @@ -26042,7 +24639,6 @@ 57524231 5752415a 57524159 -57524159 57524141 5752364a 57523259 @@ -26069,14 +24665,12 @@ 574f5752 574f5741 574f5735 -574f5731 574f564d 574f5645 574f5546 574f5254 574f5250 574f524c -574f5244 574f5243 574f5241 574f5059 @@ -26102,7 +24696,6 @@ 574f4848 574f4843 574f4753 -574f4753 574f4646 574f444b 574f4444 @@ -26183,7 +24776,6 @@ 574a4354 574a4154 574a3035 -57495a5a 5749584f 57495756 57495753 @@ -26196,20 +24788,12 @@ 57495445 57495443 57495354 -57495348 57495343 57495259 57495254 57495241 -57494e53 -57494e53 -57494e4e -57494e4b -57494e45 -57494e44 57494e32 57494e21 -57494d50 57494d4d 57494d45 57494c5a @@ -26227,7 +24811,6 @@ 57494542 5749445a 57494459 -5749434b 57494321 5749424f 5749414c @@ -26235,10 +24818,8 @@ 57493434 57485a50 57485959 -57485959 57485954 57485953 -5748594d 57485932 5748564d 57485552 @@ -26247,16 +24828,12 @@ 57484f55 57484f53 57484f50 -57484f50 57484f33 57484e42 57484953 -57484950 5748494d 57484653 57484554 -57484545 -5748414d 57484149 57484144 57484131 @@ -26294,13 +24871,11 @@ 57455859 57455855 57455753 -57455745 57455553 57455459 5745544e 57455449 57455441 -57455441 57455434 57455431 57455421 @@ -26313,19 +24888,16 @@ 57455345 57455342 57455341 -57455254 57455253 57455252 5745524e 5745524d 57455246 -57455245 573f4552 57454e4f 57454e34 575f454e 57454d59 -57454c4c 57454c43 57454c42 57454b59 @@ -26343,9 +24915,7 @@ 57454559 57454553 5745454c -5745454b 57454546 -57454544 57454448 57454446 57454445 @@ -26353,10 +24923,8 @@ 57454258 57454254 5745424d -5745424d 57454245 57454156 -57454152 5745414c 57454148 57454135 @@ -26428,50 +24996,37 @@ 57415845 57415834 57415745 -57415741 -57415645 5741554c -57415445 57415443 57415431 57415359 57415357 57415355 -57415353 5741534f 5741534e 57415345 5741525a -57415253 57415251 5741524f -5741524e 5741524c -57415244 57415237 -57415231 57415053 57415048 57415042 57414f38 57414e4f 57414e4e -57414e4e 57414e41 57414d50 57414d4f 57414d41 57414d36 -57414c54 -57414c45 -57414c44 57414c41 57414c31 57414b58 57414b4f 57414b4b 57414b49 -57414b45 57414b24 5741494e 57414944 @@ -26484,17 +25039,13 @@ 57414646 5741454c 57414449 -57414445 -57414444 57414352 -5741434f 57414348 57414346 57414341 5741424f 57414249 57414148 -57414148 57414146 57414132 5741374a @@ -26556,7 +25107,6 @@ 57313344 575f3133 57313233 -57313233 57313136 57313031 57305845 @@ -26649,7 +25199,6 @@ 56544845 56544751 56544552 -56544543 56544331 56544246 5654414d @@ -26716,14 +25265,12 @@ 5f564f59 564f5858 564f564f -564f5641 564f5553 564f554b 564f544f 564f5446 564f5354 564f5353 -564f5353 564f5343 564f5256 564f5254 @@ -26732,13 +25279,11 @@ 564f505a 564f4f4d 564f4e5a -564f4e53 564f4e42 564f4e31 564f4d49 564f4d42 564f4c59 -564f4c54 564f4c50 564f4c33 564f4c31 @@ -26754,7 +25299,6 @@ 564f4542 564f4455 564f444b -564f4441 564f4353 564f4249 564f4152 diff --git a/client/dictionaries/extras/6_byte_most_common_password_uppercase.dic b/client/dictionaries/extras/6_byte_most_common_password_uppercase.dic index 61e352acf..d3f5100d7 100644 --- a/client/dictionaries/extras/6_byte_most_common_password_uppercase.dic +++ b/client/dictionaries/extras/6_byte_most_common_password_uppercase.dic @@ -1062,7 +1062,6 @@ 4d5950415353 4d415256454c 4c4155524945 -445241474f4e 415553534945 524f4c4c4552 524f47455253 @@ -1277,7 +1276,6 @@ 424947474552 5a4150484f44 554c54494d41 -54484f4d4153 5448454b4944 53554d4d4954 53454c454354 @@ -1592,7 +1590,6 @@ 5345454b4552 5343414e4941 534150504552 -524f42455254 4d4e42564358 4d4952524f52 464945535441 @@ -1623,7 +1620,6 @@ 363536353635 57414c525553 535455444c59 -534841444f57 534558593639 534144494531 515745525431 @@ -1719,7 +1715,6 @@ 4f5538313232 4d594c494645 4d4f4e41434f -4d4153544552 4c45414e4e45 4a4f594a4f59 4a4f4b455231 @@ -1783,7 +1778,6 @@ 56494e4e4945 53544f4e4544 534143524544 -505553535931 4d4f4d4f4d4f 4c4f4f4e4559 4a4147474552 @@ -1932,7 +1926,6 @@ 425249474854 415249414e41 414c454e4b41 -414243313233 333733373337 313233343554 313233343535 @@ -1947,7 +1940,6 @@ 49414d474f44 48454c4c4f53 48415353414e -4841524c4559 464f52594f55 444152495553 424947544954 @@ -1965,7 +1957,6 @@ 4b454e445241 494f4d454741 484f4f544945 -445241474f4e 444f54434f4d 4449414e4e45 434f534d4943 @@ -2076,7 +2067,6 @@ 4e41504f4c49 4d4158585858 4c414b4f5441 -4841524c4559 4741544f5231 45584f544943 4449414c4f47 @@ -2102,12 +2092,10 @@ 464552475553 4449434b4945 44414e4e5931 -425553544552 424952443333 424541434f4e 4241524e4553 414e4e494b41 -414e44524557 373437343734 343834383438 343634363436 @@ -2127,7 +2115,6 @@ 4e414e4f4f4b 4c494e444131 4c494c49414e -4a4f5244414e 4a4159534f4e 484f54484f54 484f4d45524a @@ -2358,7 +2345,6 @@ 535445464649 53544153494b 525542424c45 -524f42455254 5245464c4558 524544464f58 5245434f5244 @@ -2400,7 +2386,6 @@ 4c414e444f4e 4b45454e414e 4a554c49454e -4a4f5244414e 4a494d4a494d 48414c4c4945 4741534d414e @@ -2429,7 +2414,6 @@ 46454e574159 454444494531 454153544552 -44414e49454c 4348494c4c49 434841534531 4156454e5545 @@ -2501,11 +2485,9 @@ 4c4155524131 4b454c56494e 4a4f45424f42 -48554e544552 484f55534531 484f52414345 48494c415259 -47454f524745 444941504552 44415453554e 4341524d414e @@ -2720,7 +2702,6 @@ 534c4f505059 53414e444945 524f4f464552 -515745525459 515151515131 50554e4b4552 504c41544f4e @@ -2771,7 +2752,6 @@ 5255444f4c46 52494d4d4552 524943415244 -52414e474552 50524f544f4e 50494750454e 504152495331 @@ -2826,7 +2806,6 @@ 42494747554e 4245455a4552 4245414b4552 -4241544d414e 41574e594345 415547474945 393633393633 @@ -2846,7 +2825,6 @@ 524f434b494e 4d5554414e54 4d494e475553 -4d45524c494e 4b53454e4941 4a4557495348 4a414a414a41 @@ -2880,7 +2858,6 @@ 53504f4f4745 53504c494646 53484f44414e -534841444f57 53454c494e41 524944455253 524541534f4e @@ -2914,7 +2891,6 @@ 574554544552 574552444e41 54494d54494d -544947474552 53574f4f5348 535441545553 535155415245 @@ -2930,13 +2906,11 @@ 4d4f4f4e4559 4d494348414c 4d4158444f47 -4d4153544552 4d41444d4144 4c554d494e41 4c494e4b494e 4c494c4c4945 4b41484c5541 -4a4f53485541 494e4c4f5645 484152424f52 475249534841 @@ -3019,7 +2993,6 @@ 5a4150504552 56464e445451 54554a485246 -54484f4d4153 53544f4e4531 534c4f4e494b 534958534958 @@ -3050,7 +3023,6 @@ 48495a494144 484557495454 474f4e5a4f31 -47454f524745 474154534259 46524f444f31 464954544552 @@ -3065,7 +3037,6 @@ 424f55424f55 424f4e4e4552 424152424152 -414e44524557 383038303830 373737363636 313233343530 @@ -3085,7 +3056,6 @@ 53484f4a4f55 5345584d414e 5341534b4941 -53414e445241 52555353454c 524f4c4c494e 50524f424553 @@ -3114,7 +3084,6 @@ 444f4f4c4559 444f4b544f52 44454e54414c -44414c4c4153 435952414e4f 435241505059 434c4f554459 @@ -3154,13 +3123,11 @@ 4d4945524441 4d454c494e41 4d4158494d4f -4d415254494e 4d414e544c45 4d4144434f57 4c5543415331 4c494c424954 4c454f4c454f -4b494c4c4552 475241434531 474947474c45 4741524e4554 @@ -3214,7 +3181,6 @@ 4a4f53494148 48415a415244 4749554c4941 -4655434b4d45 464944444c45 444f4e444f4e 444950504552 @@ -3226,7 +3192,6 @@ 42424b494e47 415253454e41 414f4c313233 -414e44524541 414c5641524f 414343455054 393138323733 @@ -3265,7 +3230,6 @@ 4c494245524f 4c454c414e44 4b4f5245414e -4a4f53485541 495353554553 494e56455354 47495a5a4d4f @@ -3317,7 +3281,6 @@ 504849534831 4b4154485931 49534d41494c -48554e544552 484f55484f55 484f4f594148 4841524d4f4e @@ -3336,7 +3299,6 @@ 434841505059 434252393030 434150434f4d -425553544552 4255464f5244 424f524f4441 4245444c414d @@ -3377,7 +3339,6 @@ 4c414e434941 4b4f4e544f4c 4b49534d4554 -4b494c4c4552 4a4f52444f4e 4a4152524f44 484f4c474552 @@ -3393,7 +3354,6 @@ 434841434849 424c4f4e4453 424545424545 -4241544d414e 4241524f4e4e 415a5241454c 415353313233 @@ -3429,13 +3389,11 @@ 504541524c31 4f5049415445 4e4f4c455331 -4e49434f4c45 4d4f47574149 4d4554414c31 4d4552434552 4d454c495341 4d414e545241 -4d4147474945 4c4f43555354 4c41574d414e 4c415253454e @@ -3461,7 +3419,6 @@ 425032303032 415241474f4e 414e47454c4c -414243313233 383935363233 373737353535 353135303531 @@ -3479,7 +3436,6 @@ 574552545a55 5646434e5448 544849525459 -5441594c4f52 53504f434b31 534f4c414345 534d494c4531 @@ -3488,7 +3444,6 @@ 534152495441 525554484945 52455645414c -52414e474552 514159575358 505241475545 504f50505931 @@ -3497,7 +3452,6 @@ 4d4f55534559 4d494b4b454c 4d41494c5255 -4c4f4e444f4e 4c45474d414e 4b454e5a4945 4b454e4e5931 @@ -3516,8 +3470,6 @@ 444956455253 44494e474552 44454d4f4e31 -44414e49454c -44414c4c4153 434f4f4c3132 434f4d455453 43454c494e41 @@ -3526,7 +3478,6 @@ 4252454e4e41 42454e544f4e 424446594a44 -4241494c4559 415243544943 414e47454c32 414c54414952 @@ -3548,7 +3499,6 @@ 54454c4c4552 544541534552 53544f4f4745 -53544556454e 534d4f4f4348 53485552494b 53414d4d5953 @@ -3573,12 +3523,10 @@ 4e425643585a 4d5954494d45 4d4f52454e41 -4d4f4e4b4559 4d495a554e4f 4d494d4f5341 4d494b453233 4d414c494b41 -4d4147474945 4c4f56454953 4c4950544f4e 4c41484f5245 @@ -3662,16 +3610,13 @@ 43414e415259 425544445932 425259414e31 -4252414e4459 424d57333138 424947554e53 4249474a494d 424545524d45 415544494136 -4153484c4559 415247594c45 414e4b415241 -414d414e4441 363636333333 363531353530 323330304d4a @@ -3710,7 +3655,6 @@ 4c4659424b46 4b4f4e594f52 4a554c494131 -4a4f53455048 4a4f4c454e45 4a4b4a4b4a4b 4a4553534531 @@ -3720,7 +3664,6 @@ 484f42415254 475554544552 474f4f465931 -47494e474552 474159424f59 47415543484f 47414c574159 @@ -3771,7 +3714,6 @@ 535553494551 535550504c59 5354494e4b53 -535041524b59 534841524d41 534446534446 534154495641 @@ -3798,7 +3740,6 @@ 4a4557454c4c 484746445341 48454c49554d -48414d4d4552 474f4f534531 474f43415453 464953544552 @@ -3818,7 +3759,6 @@ 414c45583031 414c45534841 414c4154414d -414141414141 393837373839 333030343635 323530313835 @@ -3855,7 +3795,6 @@ 505241584953 504c4f4b494a 50485245414b -504550504552 4f5343415253 4e45574f4e45 4e45524d414c @@ -3874,7 +3813,6 @@ 494959414d41 485553544c45 48554d4d454c -484f434b4559 48454c4c4e4f 4845454c4544 465a41505041 @@ -3894,7 +3832,6 @@ 425241564f31 424f50504552 42454c495a45 -4241524e4559 4156414e5449 415354524f31 414d414c4941 @@ -3940,7 +3877,6 @@ 4d55544c4559 4d4f52524f57 4d4f4e494553 -4d4152494e45 4c54594d5542 4c494c4d414e 4c4553424f53 @@ -3951,7 +3887,6 @@ 4a41534f4e53 4a41434b4554 494341525553 -474f4c464552 474f41524d59 474c4f564553 465542415231 @@ -3994,7 +3929,6 @@ 544849474853 54414e414b41 53554b454245 -53544556454e 535041525459 534f52524f57 534947524944 @@ -4011,12 +3945,8 @@ 51415a373431 505249564154 50494554524f -504550504552 504449444459 4f5054494d41 -4e49434f4c45 -4d4f5247414e -4d4154524958 4d4144445558 4d3132333435 4d304e4b4559 @@ -4025,7 +3955,6 @@ 4b4f5354494b 4b4f4d424154 4b41564b415a -4a4f484e4e59 4a41594d414e 4a414e494e41 4952414b4c49 @@ -4105,7 +4034,6 @@ 4e4554544945 4e4542554c41 4e4155474854 -4e4153434152 4d5242494c4c 4d4f544f5253 4d494b453132 @@ -4120,7 +4048,6 @@ 484541544845 475245545441 474f45544845 -47494e474552 47415449544f 46554e4e5931 4652414e4349 @@ -4188,7 +4115,6 @@ 56414e44414c 545955494f50 544f4f484f54 -544947474552 5448414c4941 544558414e53 54455841434f @@ -4224,7 +4150,6 @@ 4d494d494d49 4d49414d4931 4d4153534559 -4d4152494e41 4c5543454e54 4c4f54555331 4c4f5249454e @@ -4274,7 +4199,6 @@ 42415353494e 42414b455231 4153594c554d -4153484c4559 414c4f4e534f 41424358595a 414231323334 @@ -4358,7 +4282,6 @@ 4a4159434545 494e5445524e 484f54544552 -48414e4e4148 475241564953 4752414d4d59 474f5041434b @@ -4385,16 +4308,13 @@ 434f4f4b4552 4348414e474f 42554e42554e -424f4f4d4552 42494b455231 -424947424f59 4245594f4e44 4245434b5931 424152544f4b 424147454c53 424144424144 414e47454c45 -414d414e4441 414b41534841 414741544841 414345313233 @@ -4453,10 +4373,8 @@ 50464c4f5944 4f4153495331 4e494b4c4153 -4e494b495441 4e45574a4f42 4e4557444159 -4d5552504859 4d4f52424944 4d4f4e455932 4d4f454d4f45 @@ -4478,7 +4396,6 @@ 484f4c44454d 484952534348 48415a4d4154 -48414d4d4552 47554d425931 474f4d455453 47494e4f4c41 @@ -4492,11 +4409,8 @@ 445348414445 444f47475953 444f44474553 -444941424c4f 444156494443 -44414b4f5441 435241444c45 -434f57424f59 434954524f4e 43494d424f4d 434852495342 @@ -4511,8 +4425,6 @@ 424152414b41 424144475559 4158454d414e -414e47454c41 -414e44524559 414c54484f52 414341434941 414252555054 @@ -4563,7 +4475,6 @@ 303030303639 5a5a5a313131 5a41515a4151 -585858585858 585858363636 57494c4d4552 5749434b4554 @@ -4611,8 +4522,6 @@ 4c4f56453131 4b4c4f50494b 4b41545a454e -4a555354494e -4a4153504552 4a41434b4552 495249534841 484f544d414e @@ -4626,7 +4535,6 @@ 45424f4e5931 444f4f4d4544 44494e474f31 -44454e4e4953 444546434f4e 44425245435a 44414e494c4f @@ -4716,11 +4624,9 @@ 544154415441 54414e44454d 535155495245 -535041524b59 534f46495941 534f4349414c 534e41434b53 -53494c564552 534845455453 534841444553 53454c454e45 @@ -4733,7 +4639,6 @@ 52455453414d 524553554d45 524547454e54 -524544313233 5245424f524e 52415a49454c 524153545553 @@ -4746,14 +4651,12 @@ 50414e50414e 4f53474f4f44 4f4c4f4c4f4c -4f4c49564552 4f4842414259 4f4345414e31 4e4545444954 4d55524d5552 4d4f53414943 4d494c455331 -4d4154555245 4d4152494b4f 4d414a4f5231 4d4147494353 @@ -4764,7 +4667,6 @@ 4b4f534f5641 4b494c4c4148 4b41594c4131 -4a554e494f52 4a4f5946554c 4a4f5244594e 4a414d455332 @@ -4814,7 +4716,6 @@ 424947424144 4241594c4545 42414c444552 -41555354494e 415247454e54 414d4f524553 414c414e4e41 @@ -4897,11 +4798,9 @@ 554c52494b45 554c52494348 544947455237 -5441594c4f52 54414d554e41 5357414e4b59 535041444531 -534e4f4f5059 53494e53494e 5349474d4131 534849465459 @@ -4910,7 +4809,6 @@ 534558593132 53455247454a 52454e54414c -52414348454c 505550505953 505544444c45 504947504947 @@ -4926,12 +4824,10 @@ 4d4f4e474f4c 4d4953434841 4d4154544552 -4d4154524958 4d414d495441 4d414349454b 4c554349454e 4c4545445331 -4c415552454e 4c41444c4553 4b5557414954 4b4f4e524144 @@ -4940,7 +4836,6 @@ 4a4f44454349 4a454e4e4131 4a4159444545 -4a41434b4945 494e4752414d 484f54545542 484f54313233 @@ -4950,10 +4845,8 @@ 464545444d45 4645414e4f52 464154484f4d -46414c434f4e 44494c444f53 44454e544f4e -44454e495345 444156495331 44414e544553 434f55504c45 @@ -4961,12 +4854,10 @@ 434c4f474759 434855434855 43454e545245 -424f53544f4e 424f4f504552 424f42455254 424c55453434 424842595246 -4245524c494e 424153534552 4241524c4f57 414e47454c37 @@ -5069,14 +4960,12 @@ 54414c474154 53544556454f 535441544553 -534f43434552 534d4f4b4544 534859475559 534852494b45 5348414e4e59 5348414d494c 534558544f4e -534552564552 53414249414e 52554e444d43 524f56455231 @@ -5103,7 +4992,6 @@ 4d4f524c4949 4d494b453131 4d494b453031 -4d49434b4559 4d49414d4941 4d4158464c49 4d4154564559 @@ -5116,7 +5004,6 @@ 4b4f53544153 4b48414c4944 4b41594b4159 -4a4552454d59 494d504f5254 49414e49414e 48454c4c4f57 @@ -5127,7 +5014,6 @@ 465245454d45 46454e544f4e 46454c4f4e59 -464142524943 455249434131 455241474f4e 454c4741544f @@ -5148,15 +5034,11 @@ 434152434152 434152313233 43414d494c4f -43414d41524f 434144455453 -424f4f4d4552 424f4f424552 -424f4e4e4945 424f42425953 424f42424552 42494c424f31 -424947444f47 424943455053 4245524b5554 424153544f53 @@ -5313,7 +5195,6 @@ 4e4557414745 4d554c4c4552 4d4f55535345 -4d4f4e455931 4d41594d4159 4d41524f4f4e 4d4152434f31 @@ -5326,7 +5207,6 @@ 4c415245444f 4b4e554c4c41 4b3254524958 -4a4f484e4e59 4a4557424f59 4a4553555353 4a454646524f @@ -5351,7 +5231,6 @@ 464c4f594431 454c49544531 454947485459 -454457415244 44554e4b494e 444f4f444148 444944444c45 @@ -5361,7 +5240,6 @@ 435249534953 434f574d414e 434f56455254 -434f4f4b4945 434f4e564f59 434f4c4f5552 434f474e4143 @@ -5377,12 +5255,10 @@ 424947544f45 4245434f4f4c 415a54454341 -41555354494e 415353535353 41534153494e 415243414445 415155494c41 -41504f4c4c4f 414d59414d59 414c4c344d45 414c45584549 @@ -5459,7 +5335,6 @@ 313330383931 313330373831 313234383136 -313233343541 313233333639 313231323837 313231303837 @@ -5546,7 +5421,6 @@ 4d4f524d4f4e 4d4f5247454e 4d4f4d4d4945 -4d49434b4559 4d49414d4f52 4d4554545353 4d41584d414e @@ -5565,7 +5439,6 @@ 4a4554534f4e 4a4553555343 4a414d494c41 -4a414d455331 4a414b455253 494d434f4f4c 48554e393939 @@ -5575,7 +5448,6 @@ 484f52534559 484f4d4d4552 4841594e4553 -484157414949 475950535931 475559555445 47554c4e415a @@ -5604,7 +5476,6 @@ 425542424141 425255544953 424f4f545931 -424f4f424f4f 424f4e455331 424f47474945 424545504552 @@ -5758,7 +5629,6 @@ 544553543131 54454e50494e 54415254414e -534e4f4f5059 534d55524653 534c55444745 534b38544552 @@ -5789,7 +5659,6 @@ 4f5554335846 4f4d414e4b4f 4e4f4d414453 -4e415448414e 4d4f50415231 4d4e4d4e4d4e 4d455754574f @@ -5798,7 +5667,6 @@ 4d415253494b 4d4152434945 4d414b4f544f -4d4147494331 4d304e4b3359 4c4f4f504552 4c41554e4348 @@ -5819,7 +5687,6 @@ 4841574b5331 474f4f443455 474846444c46 -4746484a4b4d 4655434b5550 465245414b31 464c414d4552 @@ -6041,9 +5908,7 @@ 535155495348 53504f525431 5350414e4b53 -534f50484945 534e4f545459 -534d4f4b4559 534c59444f47 534954525543 53454c4c4552 @@ -6068,7 +5933,6 @@ 4d415244554b 4d414e535552 4d414e313233 -4c55434b5931 4c4648425946 4c41584d414e 4c4155524153 @@ -6085,7 +5949,6 @@ 484f44444c45 4845524d4954 484552414c44 -48454c4c4f31 48415249424f 48414e53454c 48414c455931 @@ -6126,7 +5989,6 @@ 425547425547 4255434b4945 42524f574e45 -4252414e4459 425241425553 424f47474c45 424c55453435 @@ -6135,7 +5997,6 @@ 424554544945 424552455a41 4245474f4f44 -42414e444954 424147474552 415647555354 415554484f52 @@ -6275,7 +6136,6 @@ 313330353833 313330323837 313330313838 -313233515745 313231323638 313231313738 313231313736 @@ -6350,7 +6210,6 @@ 544541435550 54415645524e 54414d54414d -5359444e4559 535645544b41 53554e4e4945 53554e495441 @@ -6362,7 +6221,6 @@ 5354414d5053 534d41525453 5348454c4941 -534841524f4e 53484152494b 53434f544941 534154414e31 @@ -6397,10 +6255,8 @@ 4e4547524954 4e4152455348 4d5a45504142 -4d4f54484552 4d4f4c4c5953 4d494e414b4f -4d494c4c4552 4d49434b4945 4d4152594a4f 4d414e495348 @@ -6411,7 +6267,6 @@ 4c494e534559 4c454d4f4e44 4c414e445259 -4b4e49474854 4b4154494e41 4b4153534945 4b414c4c4945 @@ -6425,13 +6280,11 @@ 4a45414e4945 4a4150414e31 494d41474553 -4943454d414e 484f54454c36 484f53544544 4845414c4559 4841524c414e 47554e4d414e -474f4c44454e 474f4457494e 47454e455349 474159534558 @@ -6446,7 +6299,6 @@ 454c4f48494d 454646454354 4541544d4545 -4541474c4553 445245414d59 444f52534559 444f52454d49 @@ -6468,7 +6320,6 @@ 43484556414c 4348414e4441 434154485931 -434153504552 43414c4c4d45 42554c444f47 42524f4e5445 @@ -6479,10 +6330,8 @@ 42415253554b 424152524554 42414b455253 -424144424f59 415552414c4f 4153484d414e -415254485552 415241524154 415041544859 414f4c393939 @@ -6491,7 +6340,6 @@ 414e4a414c49 414e494d4531 414c45583232 -414c42455254 414c41494e41 414c39414744 414446414446 @@ -6690,7 +6538,6 @@ 584e47574f4a 574f57534552 574f4f474945 -57495a415244 57494e444558 57494e414d50 574553534f4e @@ -6710,18 +6557,14 @@ 544544445942 5441484f4531 53554e53554e -53554d4d4552 535445414459 535441524c41 534f554e4431 534f52415941 -534c41594552 53484f525453 534558424f59 -53434f545431 53414d454552 53414c4c4945 -534142494e45 524f44494f4e 524547494f4e 524541445931 @@ -6744,7 +6587,6 @@ 4e4154415348 4e4147524f4d 4e4146455453 -4d4f5247414e 4d4f4e455959 4d434c414e45 4d4343414245 @@ -6752,7 +6594,6 @@ 4d41434b3130 4c4f56453233 4c4f56453133 -4c4f4e444f4e 4c454f313233 4c4542524f4e 4c4157444f47 @@ -6766,16 +6607,13 @@ 4b454c4c5953 4b4152444f4e 4b414e454441 -4a555354494e 4a554152455a -4a4f53455048 4a4f494e5453 4a414b453132 49534d41454c 494e43484553 494841544555 48523359544d -484f54444f47 4752414e5431 474c414d5552 474946544544 @@ -6783,7 +6621,6 @@ 474648524548 474648464946 47454f524749 -47454d494e49 465554555241 46554e313233 4652454e5a59 @@ -6801,12 +6638,10 @@ 4449434b3639 44454e44454e 4445494d4f53 -444542424945 444156494441 44414c494c41 435241424259 434f4e414e31 -434f4d504151 434b46444252 434845455441 434845434b53 @@ -6819,21 +6654,17 @@ 424c55453231 424c4f4e4449 424c415a494e -424954454d45 42494c4c5953 424947444545 4249414e434f 42455448414e 424542454245 -424541535431 424154544552 -415547555354 41544c415331 415344464a4b 415344455751 4152524f5731 415249534841 -414e44524541 414e44524531 414d4f524d49 414c454b5341 @@ -7071,7 +6902,6 @@ 544d4f4e4559 544954495449 54494d494e47 -544947455253 5448554e4445 5448414c4553 54455243454c @@ -7091,7 +6921,6 @@ 534552454e45 534352494245 5343454e4943 -53414d534f4e 534144534144 524f58414e41 524a57375834 @@ -7102,8 +6931,6 @@ 514247323649 513535353535 505758443558 -505552504c45 -5052494e4345 504f524b4552 5048454e4958 50454e4e4552 @@ -7118,13 +6945,11 @@ 4e4557475559 4e4256435857 4d594c4f5244 -4d554646494e 4d50384f3644 4d4f5a5a4552 4d4f53455331 4d4f524d4f52 4d4f4e54414e -4d4f4e4b4559 4d4943524f53 4d4559455253 4d4544444c45 @@ -7149,7 +6974,6 @@ 4a414e53454e 4a414d494553 495256494e45 -494e4449414e 494345494345 4855464d5157 484f4f4b4544 @@ -7160,7 +6984,6 @@ 48414b45454d 475545535331 47524f47414e -475245454e31 475245415359 475241454d45 47523846554c @@ -7183,7 +7006,6 @@ 464c41564941 46454e434552 463030424152 -4556454c594e 454c4c454e31 444f4c46414e 444944494449 @@ -7195,7 +7017,6 @@ 44415249454e 434f4d4d4945 434c45524943 -434852495331 434152475559 43414d454c4c 42554c4c5331 @@ -7206,11 +7027,9 @@ 424f4e48414d 424d57313233 424c55453133 -424c4f574d45 42494e474552 424947424f49 4245434b4554 -4241524e4559 4241524d414e 415544494133 415354524131 @@ -7504,7 +7323,6 @@ 53494d454f4e 534552415048 53454e534f52 -534543524554 534358414b56 53434f524553 534348554c45 @@ -7521,7 +7339,6 @@ 52414e4b494e 5241494e424f 524143494e45 -524142424954 515141415a5a 513141325a33 505552495459 @@ -7532,7 +7349,6 @@ 50494d504c45 504554524f4c 504550494e4f -5045414e5554 504154454e54 504152545931 5041524f4c31 @@ -7552,7 +7368,6 @@ 4d4f4e4b4545 4d4f4c494e41 4d4554533836 -4d415256494e 4d4152494f53 4d4152474954 4d414e434855 @@ -7584,7 +7399,6 @@ 4a41534f4e42 4a414d4a414d 4a414d455344 -4a4147554152 4a41434b454c 4a41434b3132 495453343230 @@ -7601,7 +7415,6 @@ 474e4f534953 474e42585246 474c444d454f -47454e495553 474153474153 47414d494e47 47414d455241 @@ -7614,7 +7427,6 @@ 46394c4d5744 445552414e44 444f524f4741 -44454e4e4953 44454e313233 4441524b454e 44414e434531 @@ -7650,7 +7462,6 @@ 424c41434b32 424947534b59 42455448454c -4241494c4559 4241444f4e45 41544c414e54 415354414e41 @@ -7659,7 +7470,6 @@ 414c4d455241 414c49534b41 414c4558414e -414c42455254 41454e494d41 393939333333 37384749524c @@ -7917,7 +7727,6 @@ 303130323834 303130313932 303039393838 -5a584356424e 5a554a4c5246 59484e544742 59455349414d @@ -7934,7 +7743,6 @@ 554e4944454e 55484259554a 55444257534b -545241564953 544f4d4d5932 54494d455253 53544f4f5053 @@ -7946,12 +7754,10 @@ 534e4f4f4b53 53494d52414e 53494d4d4552 -53494c564552 534841594e41 534841484944 534156414e54 53414c494e41 -525553534941 524f434b4954 52495a57414e 52464e484259 @@ -7968,7 +7774,6 @@ 504f494c4b4a 50494d503639 5049434f4c4f -504554455231 504550534953 50454e544158 50454e4e4945 @@ -7978,11 +7783,8 @@ 4f4e45455945 4e4f4b494453 4e494b4e494b -4e494b495441 4e415645454e -4e4153545941 4d59484f4d45 -4d5552504859 4d4f56494e47 4d4f53533834 4d4f524f4e53 @@ -7992,9 +7794,7 @@ 4d495454454e 4d4554524f31 4d4153414b49 -4d415254494e 4d4152544131 -4d41524b5553 4d41524a414e 4d4152494136 4d414b455253 @@ -8007,7 +7807,6 @@ 4c494c4c5931 4c454e4f5245 4c425946564a -4c414b455253 4b5249535445 4b4f4e47454e 4b4f4348414d @@ -8031,7 +7830,6 @@ 494e4b4a4554 49434849524f 484f574c4552 -484f524e5931 484f4f504c41 484f4e455942 484f47414e31 @@ -8054,7 +7852,6 @@ 47414d454f4e 47414c4c4f50 474142424945 -4655434b4552 465541515a34 465249474944 464c4f524941 @@ -8062,8 +7859,6 @@ 46494e444d45 464944474554 464552415249 -454457415244 -4541474c4531 454144474245 4452444f4f4d 444f574e4559 @@ -8115,7 +7910,6 @@ 415331323334 415153574445 414e4f4e494d -414e47454c53 414c45583939 414c45583133 41444147494f @@ -8392,8 +8186,6 @@ 5a45414c4f54 5a414e4f5a41 595452455a41 -59454c4c4f57 -584156494552 5745544f4e45 574549534552 5745454e4552 @@ -8460,7 +8252,6 @@ 504c504c504c 504947475931 5049414e4f31 -50484f454e49 504849504849 504841534552 504552534941 @@ -8476,7 +8267,6 @@ 4f50454e4544 4f4e45574159 4f4d41523130 -4e495353414e 4e4947474131 4e49434b3132 4e4557594f52 @@ -8495,7 +8285,6 @@ 4d494449414e 4d41544d414e 4d41524b3132 -4d4152494e45 4d4152494245 4d414d554b41 4d414c4c4554 @@ -8508,7 +8297,6 @@ 4c494f4e5331 4c4946544552 4c49434b454d -4c4553544154 4c4152525953 4b4f55464158 4b4f4c59414e @@ -8551,7 +8339,6 @@ 474f31323334 4749554c494f 4749544c4552 -4749524c5331 474950504552 47464e484252 474548524947 @@ -8568,7 +8355,6 @@ 454c4d4f5245 45474f495354 454153494552 -4541474c4553 44555244454e 44554d4d5931 44554d424552 @@ -8583,7 +8369,6 @@ 43554d4d494e 43525950544f 434f52565553 -434f4f504552 434f46464559 434f43484f4e 434b4a594252 @@ -8593,11 +8378,9 @@ 434845455231 4348414f5353 43415255534f -4341524c4f53 43414e4e4f54 43414e454c41 434142424945 -425249414e31 42524154414e 424f4e474f53 424f4348554d @@ -8616,9 +8399,7 @@ 415344464731 414e544d414e 414e47555353 -414e47454c53 414e444f4e45 -414c50484131 414c4d4f5354 4147454e4441 414449545941 @@ -8934,7 +8715,6 @@ 303130313832 303130313733 5a41534b4152 -59414d414841 575046384555 574f4f424945 57494e53544f @@ -8953,7 +8733,6 @@ 545253384637 54524f504943 544953484b41 -544947455231 54484f525045 544845424f59 544553543031 @@ -9000,12 +8779,10 @@ 504f4e494553 504e354a5657 504c45444745 -504c41594552 5048554f4e47 5048454c5053 50454f524941 50454e4e5953 -5045414e5554 504541434553 5041554c3132 4f524e573644 @@ -9023,7 +8800,6 @@ 4e4543524f4e 4e414245454c 4d4f56454f4e -4d4f54484552 4d4f44414e4f 4d4f43484131 4d494b453133 @@ -9038,13 +8814,11 @@ 4d41524d4f54 4d41524c454e 4d415249534f -4d4152435553 4d4152434831 4d414e474552 4d414b495441 4d41494c544f 4d4144444f58 -4c4f56455231 4c4f56454c4c 4c4f55494531 4c4f4f4b4945 @@ -9067,19 +8841,15 @@ 4b454c4c5942 4b45494e4553 4b415a42454b -4b4152494e41 4b41495a454e 4b41494b4149 4b3132333435 4a5549434553 4a4947474c45 4a4554534554 -4a4553555331 4a45414e4e41 4a415a5a4552 -4a4147554152 494e544a3341 -4943454d414e 485554544f4e 48554e474552 48504b325143 @@ -9093,7 +8863,6 @@ 4845434e4656 484152524945 484150505953 -48414e4e4148 48414c4c4559 47574a553347 475553544552 @@ -9103,7 +8872,6 @@ 47524f554348 475245444459 4752414e4745 -474f4c464552 474f4c463732 474f44474f44 4749524c5353 @@ -9131,12 +8899,10 @@ 444444444431 44415252494e 44414e555441 -44414b4f5441 44414444494f 4441424f5353 435448554c55 434f5252414e -434f4f504552 434f4c494e31 434f4c444552 434954494553 @@ -9146,10 +8912,8 @@ 434845525542 434845434b31 434841495253 -434153504552 434153455932 43414e455331 -43414e414441 43414c4c4552 42554c4f5641 425544425544 @@ -9176,10 +8940,8 @@ 414e44524959 414d594c4545 414d42555348 -414c45584953 414c45583332 4142464b5246 -413132333435 393030303030 383839393838 373839353230 @@ -9527,7 +9289,6 @@ 5a4c5a465248 5a414d4f5241 5a4146495241 -59414d414841 584356424e4d 58333556384c 57494e475331 @@ -9537,8 +9298,6 @@ 574331384332 574152444f47 57414e474552 -57414c544552 -564943544f52 5649434b5931 56455244554e 5642524a4b46 @@ -9548,13 +9307,11 @@ 545249414c53 545249414c31 5452414a414e -545241434559 544f52414e41 544f504d414e 544f50454b41 544f4e494e4f 54494752414e -544947455253 54454f444f52 54454c4e4554 5445464c4f4e @@ -9573,17 +9330,14 @@ 535052554345 535041574e32 534f53413231 -534f50484945 534f4e494332 534f434b4554 534e4f4f5a45 534e4f4f5053 534e4f4f4b59 534e49444552 -534d4f4b4559 534c45555448 534c41534831 -53494d4f4e45 53494d485251 534849564552 53484956414e @@ -9591,10 +9345,8 @@ 53484156454e 5348414e4552 534554544552 -53434f545459 5343414d5049 534159414e41 -534152414831 53414e44414c 53414d4d5932 53414d415049 @@ -9614,14 +9366,10 @@ 515549434b31 514e3633324f 5141504d4f43 -505552504c45 505550504552 50524f504552 -5052494e4345 504f53544954 504f4f503132 -504f4c494e41 -504c41594552 50494e4e4552 5048454e4f4d 504153534552 @@ -9644,7 +9392,6 @@ 4d5547475359 4d5544444552 4d5250494e4b -4d4f5a415254 4d4f544d4f54 4d4f53444546 4d4f4f474c45 @@ -9654,7 +9401,6 @@ 4d494e453132 4d494b455953 4d494b453232 -4d455849434f 4d4554524f53 4d45524b5552 4d454449554d @@ -9669,24 +9415,19 @@ 4c5556425547 4c5550495441 4c55434b5933 -4c4f56454d45 4c4f56453455 4c4954454f4e 4c494e444141 4c494c524544 4c4256454b5a -4c415552454e 4c414e474552 -4c414b455253 4b544a59424c 4b525954454e 4b4f4f4b4f4f -4b4e49474854 4b4d47333635 4b4953535353 4b4554544c45 4a554e4b4552 -4a554e494f52 4a5132344e43 4a4f4e534f4e 4a4f4a4f3132 @@ -9716,7 +9457,6 @@ 474549524259 47414e475354 474147474552 -465245444459 4652414e4341 464c4156494f 46454c494b53 @@ -9745,7 +9485,6 @@ 43524d313134 434f554e5430 434f52544553 -434f46464545 434e3432514a 434d464e5055 434947415231 @@ -9753,7 +9492,6 @@ 434849434f53 434656464846 43454c455354 -43414c56494e 4252554a4148 425249414e44 425245414b53 @@ -9782,7 +9520,6 @@ 4153444c4b4a 415131535732 414e474f4c41 -414e47454c31 414e44493033 414e41544f4c 414c50484133 @@ -9793,7 +9530,6 @@ 4144414d5331 41434c533248 4141524f4e53 -414141414131 413535353535 38384b455953 36424a565045 @@ -10168,7 +9904,6 @@ 574552313233 574157415741 57415252494f -57414c4b4552 56504d46535a 564954414c59 564950455232 @@ -10181,7 +9916,6 @@ 54555343414e 545552424f32 54554d424c45 -544f5047554e 544f4d4d5954 544953535545 544845574159 @@ -10195,12 +9929,10 @@ 535550455232 535546464552 53554444454e -535542415255 535441523939 5354414e4c59 53504f4f4b53 53504a464554 -535049524954 535049434552 535041434552 534f524f4b41 @@ -10213,25 +9945,20 @@ 534558444f47 53455247494b 534359544845 -53434f4f4259 534330304259 534152545245 534152474531 -53414e445241 -53414d55454c 53414c41414d 5341444c4552 534141423933 525553524150 524f434b5953 -524f434b5931 52494e474f31 5249444c4559 524647484250 524544343536 524542454c4c 524146494b49 -524142424954 5155414b4531 5150574f4549 51485842494a @@ -10253,13 +9980,11 @@ 50454e495353 50454b50454b 504154434859 -5041524b4552 504150504153 50415045524f 50414a41524f 4f5a5a4d414e 4f5343415232 -4f52414e4745 4f4d45474137 4f4c4f52494e 4e555242454b @@ -10368,12 +10093,9 @@ 44524558454c 4452414b4553 4452414b454e -444f4d494e4f 444a484a5946 444947455354 -44494553454c 444556494e31 -44454e564552 44454e49414c 44415552454e 4441524f434b @@ -10395,7 +10117,6 @@ 425249414e42 425245545431 425241434553 -424f53544f4e 424f4e4f5532 424f4e4f424f 424f47555331 @@ -10416,7 +10137,6 @@ 41544c415354 415353484154 415350454e31 -415344464748 41524b48414d 414e59574159 414e4e494532 @@ -10432,7 +10152,6 @@ 414b49524131 2e4144474a4d 414253555244 -414243444546 39534b573547 393938384141 393936363939 @@ -10850,7 +10569,6 @@ 575534455444 575357535753 574f4c464552 -57494c534f4e 57494747554d 574844425450 574552545931 @@ -10891,7 +10609,6 @@ 5350494e414c 5350414d4d59 534f55544831 -534e49504552 534e30305059 534c4f574c59 534c4f4f5059 @@ -10905,7 +10622,6 @@ 534841525031 5348414e4b53 5348414b4952 -534543524554 534541544f4e 53434f545449 53434f545432 @@ -10921,7 +10637,6 @@ 5259414e3131 525547455231 524f58414e45 -524f4e414c44 524a4b54434a 5245544c4157 524553484d41 @@ -10930,7 +10645,6 @@ 524153484d49 524147544f50 514755565954 -51415a575358 5055544e414d 505353575244 50524f555354 @@ -10954,7 +10668,6 @@ 4f4d45474135 4e4f54594f55 4e4f53484954 -4e4f524d414e 4e4f434f4445 4e495453554a 4e494b4f4c45 @@ -10998,7 +10711,6 @@ 4c4157544f4e 4c4154544552 4b5a4b5a4b5a -4b4952494c4c 4b494c4c4945 4b484f524e45 4b454e444552 @@ -11013,10 +10725,8 @@ 4a4f4e4e4945 4a494d4d5947 4a494d4d4552 -4a4553534945 4a454c4c4f31 4a4546464552 -4a4153504552 4a41534f4e32 4a414d455352 4a41494d4531 @@ -11024,14 +10734,12 @@ 4a41434b3232 4a41434b3131 4a3132333435 -494d50414c41 494d48455245 4942584e534d 485553544f4e 485542424c45 484f55534532 484f54424f44 -484f52534553 484f4e444132 484f4d455232 484f4c454e31 @@ -11044,14 +10752,12 @@ 48415244494e 475559475559 475559414e41 -475549544152 475549444f31 475541524453 475245454e37 4752414e4431 474f57455354 474f4f4d4241 -474f4c44454e 474f4749524c 474f44444f47 474947475359 @@ -11062,7 +10768,6 @@ 46575341444e 46514b57354d 464f4c534f4d -464c49474854 464c45555259 46494c495045 46415553544f @@ -11111,7 +10816,6 @@ 4341424c4531 43374c525755 425546464945 -42524f4f4b45 424f53434f45 424f4e455231 424f45444552 @@ -11121,11 +10825,9 @@ 424c55455353 424c55453737 424c55453636 -424c41434b31 42494d494e49 424947524f42 42494744414e -424158544552 42414c5a4143 415a42554b41 415a414c4541 @@ -11134,7 +10836,6 @@ 415254415254 4152414b4953 414e544f4841 -414e47454c41 414c46494531 414c46414c46 414a54444d57 @@ -11592,13 +11293,10 @@ 575032303035 574f4c463639 574f4a54454b -57494e544552 -57494e4e4552 5749454e4552 57454c444f4e 574152574152 574151573350 -56494b494e47 56424e56424e 563132333435 55534d433639 @@ -11611,7 +11309,6 @@ 54494a474552 544845524d4f 54454e534f52 -54454e4e4953 544544445953 54415a5a4945 54415343414d @@ -11624,7 +11321,6 @@ 535745455450 53554e54414e 535455464631 -53544546414e 535441525259 535345455858 535155494431 @@ -11632,7 +11328,6 @@ 53504f545333 535041434553 534f4e414c49 -534f4d4d4552 534f4c415231 534e49504553 534d55524659 @@ -11669,11 +11364,8 @@ 505442444857 50534555444f 50524f4e4f31 -504f4f4b4945 -504f4f4b4945 504f4d4f4e41 504f4c4c4954 -504f4c494345 504c415a4d41 504c4159415a 50495455464f @@ -11708,19 +11400,16 @@ 4d594f504941 4d5553494353 4d5548544152 -4d554646494e 4d5546464945 4d5545525445 4d544e444557 4d524245414e -4d4f53434f57 4d4f50415253 4d4f4f534945 4d4f4e455937 4d494d4f5a41 4d494c4f5343 4d494b453737 -4d4154524958 4d41524b4544 4d41504c4553 4d414e59414b @@ -11740,7 +11429,6 @@ 4c4152525942 4c414d454e54 4b524f474552 -4b52414d4552 4b5149474237 4b4a4b424e46 4b494e475358 @@ -11802,7 +11490,6 @@ 4741494e4553 473030474c45 465544474531 -4655434b4d45 465245444444 4652414e4b32 464f4f544552 @@ -11810,8 +11497,6 @@ 4645454c4d45 4641524b4c45 46414e46414e -46414d494c59 -46414c434f4e 45544f574552 455057523439 454e54455232 @@ -11835,7 +11520,6 @@ 444a454d4245 444952545944 44494e4b4c45 -44454e495331 44454d414e44 44454c544134 44454c544132 @@ -11851,7 +11535,6 @@ 435249434b45 435241465453 434f53534945 -434f4f4b4945 434f4c4c4152 434956494353 43494e5a4941 @@ -11859,7 +11542,6 @@ 434652454846 4342434d5242 434154323232 -4341524d454e 43414e4e4553 43414d43414d 43414c4c414e @@ -11876,13 +11558,11 @@ 42494b494e47 42494754454e 424947504947 -4249474d414e 42494746554e 424947444943 4245554c4148 424552424552 42454e485552 -424541564953 424541545249 424152525953 42414c544943 @@ -11903,7 +11583,6 @@ 414c495a4545 414c49594148 414c49534131 -414c46524544 414747494531 41455249414c 414444414d53 @@ -12397,16 +12076,13 @@ 545553594d4f 54554b54554b 545249354133 -544f594f5441 544f57455231 544f52543032 -544f4d4d5931 54494d4d4552 5449464f5349 544852454154 544845524f4e 544845524544 -5448454d414e 5445584d4558 54454c4c4d45 54424f4e4553 @@ -12418,13 +12094,10 @@ 53544f524553 535441535941 5354414e4c45 -535049444552 535045525259 -535045454459 534f4e4e454e 534f4e494131 534f4e445241 -534f43434552 534f42454954 534e4f4f5031 534e414b4559 @@ -12436,10 +12109,8 @@ 534558593131 534558584553 53455256414c -534552474559 5343484d4f45 534341524544 -53414d55454c 53414d55414c 53414d504c45 53414c455331 @@ -12486,7 +12157,6 @@ 504c41594131 50495442554c 504950495049 -50494d50494e 504648465046 504550495441 504541524345 @@ -12497,7 +12167,6 @@ 50414e545259 4f5242495441 4f4d474f4d47 -4f4c49564552 4f4c45344b41 4f4354414e45 4e5552474c45 @@ -12515,14 +12184,11 @@ 4d59574f5244 4d554d4d5931 4d52534b494e -4d4f4e494341 4d4f4a4f3639 4d4953534544 4d49524a414d 4d4952434541 -4d494c4c4552 4d494b4f4c41 -4d45524c494e 4d4544494131 4d4432303230 4d4152494a41 @@ -12534,7 +12200,6 @@ 4d41474e4154 4d414455524f 4d4144455241 -4c4f56455253 4c4f56453333 4c4b4a4c4b4a 4c454e4e4945 @@ -12557,9 +12222,7 @@ 4a4f53494531 4a4f5247454e 4a4f504c494e -4a4f4e455331 4a494d4d5943 -4a4553544552 4a454e4e5942 4a454e4e4552 4a4546464945 @@ -12575,12 +12238,9 @@ 494e54454c31 4944494f5441 49424d49424d -484f55534531 484f4c4c5942 484f47474552 484f44474553 -484f434b4559 -484f42424553 4845534b4559 48454a313233 484542524557 @@ -12591,14 +12251,12 @@ 48414c4c4f57 48414a494d45 4832534c4341 -475549544152 47524f535345 475249464659 474f4e444f52 474f4c46494e 474f4a455453 474f44554b45 -474c4f524941 4749524c3738 47484a484a52 47484a434e42 @@ -12606,9 +12264,7 @@ 47454e455645 4745454d414e 474159444152 -47414d424954 465941424346 -465249454e44 465245443939 465245443031 464f52545932 @@ -12618,13 +12274,11 @@ 464746474647 464646464631 464552524552 -46454e444552 4644464e4648 464154424f42 464153544544 464152544544 4641524f5554 -46414d494c59 464143494c45 45585452454d 455647454e59 @@ -12632,7 +12286,6 @@ 455350414345 455254455254 454e52495155 -454e49474d41 454c4f43494e 454c4c4f434f 454456415244 @@ -12646,8 +12299,6 @@ 444947495441 4449434b3132 44454d4f4e44 -444542424945 -444156494431 44414e554245 44414e494341 44414b494e47 @@ -12667,15 +12318,11 @@ 4348414e4559 4345454a4159 43415645524e -434153534945 -4341524c4f53 4341524c4945 43414e415244 43414c444552 43414a554e31 425558544f4e -425554544552 -425542424131 42544e4a4559 425249444553 425249414e4e @@ -12700,7 +12347,6 @@ 424541523639 4241524f4c4f 42414e4a4f31 -42414e444954 424144313233 415a414c4941 41555354454e @@ -12714,12 +12360,10 @@ 414d52495441 414d49535441 414c494e4131 -414c49434941 414c45583737 414c4243415a 414952424147 414355415249 -414343455353 414341444941 393939393938 385549415a50 @@ -13237,8 +12881,6 @@ 59454e534944 575745313233 574f4c463132 -57494c534f4e -57494c4c4945 57494747494e 574859574859 574841544946 @@ -13275,7 +12917,6 @@ 53594d4f5738 53574f524431 535641524f47 -53555a554b49 535549535345 53554352414d 53554152455a @@ -13285,7 +12926,6 @@ 53504f4f4e59 53504b363636 534f4e534f4e -534d4f4f5448 534d454c4c53 534c49434b53 534b594c494e @@ -13294,16 +12934,13 @@ 534947544155 53484f4f4259 53484c4f4d4f -5348454c4259 534845454c41 534841524553 -534558534558 534556454e31 534550544943 534549464552 534545594f55 534545534157 -53434f545459 5343484d4f4f 53434849534d 53434849434b @@ -13322,7 +12959,6 @@ 52554e574159 524f59414c31 524f5348414e -524f4c414e44 524f434b5353 524f434b5331 524f42594e31 @@ -13339,7 +12975,6 @@ 505547534c59 505545424c4f 504f4e504f4e -504c45415345 50494e50494e 5048554e4b59 504849534947 @@ -13375,7 +13010,6 @@ 4e45454e4552 4e4154555241 4e4154415341 -4e4154414c49 4e4153534552 4e414d524f4e 4e4144524f4a @@ -13394,8 +13028,6 @@ 2a2a2a2a4d45 4d4159464c59 4d4154455553 -4d4152435553 -4d414e555444 4d414e4c4559 4d414e444552 4d4144434150 @@ -13467,22 +13099,17 @@ 474953454c45 47494c4d414e 474947494749 -4749414e5453 4749414e5431 -47454d494e49 474159474159 47414d455231 474147484552 -46594c485451 465946594643 46524f4c4943 465245443639 465245443131 4652414e4359 4652414d4553 -464c55464659 464c4f464c4f -464953484552 46494e424152 464948444656 4645444f5241 @@ -13517,7 +13144,6 @@ 444741394c41 44454c544139 444546454154 -444444444431 444241434b53 444156494e41 444156494450 @@ -13536,7 +13162,6 @@ 43514e574859 434f57504945 434f55525345 -434f55474152 434f4f4f4f4c 434f434b3639 434c4f554748 @@ -13544,7 +13169,6 @@ 43485249534b 4348494e4759 4348494b454e -434845525259 4348414b5241 43454c4c4152 43454c454253 @@ -13553,11 +13177,9 @@ 434152544f4e 4341524c4559 43414e54494b -43414d41524f 43414c4c4153 434145534552 425544445937 -425544445931 425542425931 425249414e54 4252414b4553 @@ -13577,7 +13199,6 @@ 424946464552 42454e464943 424546524545 -424541564552 42415a5a5a5a 424154415441 4241524f4e53 @@ -13600,7 +13221,6 @@ 414c4c345532 414c49313233 414c45583231 -41444f4e4953 41444f4c5048 41434b41434b 393930303939 @@ -13791,9 +13411,7 @@ 315959595959 3153484f5432 31524f434b53 -314d4f4e4559 3148454c4c4f -314249544348 313938393030 313937383738 313937333436 @@ -14141,7 +13759,6 @@ 303030303133 303030303132 303030303039 -5a5a5a5a5a31 5a594c545243 5a53464d5056 5a4a44554333 @@ -14154,7 +13771,6 @@ 58535751415a 584651594252 57514d465548 -57495a415244 57494757414d 5749434b4552 574554415353 @@ -14180,12 +13796,9 @@ 554e49434f52 54594c455242 5457494e5353 -5455434b4552 545259494e47 -545255434b53 545255434b32 5452454e4348 -545241564953 544f55544f55 544f4f4c3639 544f4f424947 @@ -14198,21 +13811,17 @@ 544757445655 5445544f4e53 544552525932 -54454e4e4953 54424f4e5442 54424956424e 5441524b494e 5441494c4f52 535553414e42 -5355434b4d45 535543455353 53554249544f 535452415453 535452414954 53545241494e 5354494c4553 -535445564531 -5354454c4c41 535445454441 535445414b53 53544154454e @@ -14221,25 +13830,20 @@ 5350494b4544 535049434553 535045454348 -5350414e4b59 5350414e4953 535041434544 534f4e494358 534f4c415241 534e45455a45 -534d49544831 534d39393334 534952454e45 53494e545241 53494b494349 -534945525241 -5349444e4559 534855534855 5348494e544f 5348494e4553 534845434b59 534841554e31 -534841524f4e 534841494e41 534841443057 534552534552 @@ -14251,7 +13855,6 @@ 534348414150 5341584f4e53 534156494e41 -534156414745 5341544e414d 534154414e53 53415241484d @@ -14262,7 +13865,6 @@ 524f53453132 524f4f524f4f 524f47455232 -524f434b4554 524f41444945 52494444454e 5249434b4552 @@ -14273,14 +13875,12 @@ 524153544153 524150414c41 5241444c4559 -52414348454c 515745525436 5155494e4345 50595053494b 50555441494e 505553484954 504c4d4f4b4e -504c45415345 504c41504c41 504958494531 50494e544f31 @@ -14300,11 +13900,9 @@ 504153544153 50414d50414d 4f5343415252 -4f52414e4745 4f4d45474139 4f4c49564531 4f4c41313233 -4f4b53414e41 4f3233364e51 4e5552424f4c 4e514447585a @@ -14316,7 +13914,6 @@ 4e4558555331 4e45554d414e 4e454f4e454f -4e454c534f4e 4e45434e4543 4e4255334344 4e41594e4159 @@ -14331,8 +13928,6 @@ 4d4f4f4f4f4f 4d4f4f4b4559 4d4f4e49544f -4d4f4e494b41 -4d4f4e494341 4d4f494b4b41 4d4f47554c53 4d4f4348414a @@ -14355,7 +13950,6 @@ 4d4154494c44 4d4153434f54 4d4153414d49 -4d41524c4559 4d4152494132 4d414e444945 4d414e434f57 @@ -14371,7 +13965,6 @@ 4c4f52454e45 4c4f4c504f50 4c4f444f5353 -4c495a415244 4c4945464445 4c4942455254 4c4552585354 @@ -14458,7 +14051,6 @@ 47454d4d4131 4745434b4f53 474154495441 -4655434b4552 4655434b3131 46524f4c4f56 465249544f53 @@ -14475,7 +14067,6 @@ 464748464748 4643415a4d4a 464154524154 -464154424f59 46414e54494b 46414c434f52 463146324633 @@ -14496,7 +14087,6 @@ 44554e36534d 445548415354 445546465931 -445543415449 44544e464b4d 445344534453 4452554d5353 @@ -14507,15 +14097,12 @@ 444f4f474c45 444f4e544145 444f4e41544f -444f4e414c44 444f4d453639 444f4c46494e 444f47484f54 -444f43544f52 444a444a444a 4445564c5434 4445544c4546 -44455349474e 444553414e54 444549445245 444544484544 @@ -14537,10 +14124,8 @@ 435232353052 434f50494552 434f42524132 -434f42524131 434f42424552 434c4f534554 -434c41495245 434956494331 43494e445953 434852495358 @@ -14550,7 +14135,6 @@ 43454c554c41 43454c455259 434153534559 -434152544552 434150495441 43414d50454f 42555a5a4544 @@ -14566,7 +14150,6 @@ 424c55453032 424c4f54544f 424c494d4559 -424954434831 42494c4c3939 424943484f4e 42485554414e @@ -14578,11 +14161,9 @@ 424153534945 424152524f57 4241524e554d -42414e414e41 424142434941 4230304d4552 415a55595745 -415a45525459 415945534841 415645525931 41534443585a @@ -14595,7 +14176,6 @@ 41524953544f 415249455331 415244454e54 -415243544943 415050454c53 41504f474545 4150454d414e @@ -14615,13 +14195,11 @@ 414c45583639 414c45583030 414c45535941 -414c41534b41 4149524d4158 4147454e5453 4147454e5431 4145494f5559 41444f4c464f -414449444153 414255534544 414141353535 393935353131 @@ -15211,7 +14789,6 @@ 575745524157 574f55544552 574954434831 -57494e4e4945 57494e455259 57484f4f5053 574849504954 @@ -15226,14 +14803,11 @@ 564f4c4b4552 56495348414c 564952555331 -564950455231 564950313233 56494c4c4131 56494747454e -564944454f31 5649414c4c49 564746554e38 -564652434256 5646484e4259 564153534152 564153494c49 @@ -15244,11 +14818,9 @@ 5547414e4441 545955545955 545745454459 -5455434b4552 545255454e4f 545245455353 5452414d5053 -544f594f5441 544f52545545 544f47455049 5449544f5641 @@ -15267,26 +14839,20 @@ 53555a4a5638 535553414e53 53554b52414d -5355434b4954 535455464646 535455424253 535452415553 535452415441 53544a4f484e 535445564552 -5354454c4c41 5354414e4731 5354414c4559 535353535331 5350454c4c53 -535045454459 -5350414e4b59 535031444552 535030304b59 534f55534f55 -534f50484941 534f4e4e4945 -534e49504552 534d4f4f5645 534c4f414e45 534c49434b4f @@ -15297,7 +14863,6 @@ 534952454e53 53494e4e4554 53494d50534f -53494d4f4e45 53484b4f4c41 534849525453 5348414e5459 @@ -15314,7 +14879,6 @@ 53454e444552 53454c57594e 534450415353 -53434f4f4259 534348554c5a 5343484f5454 534348414348 @@ -15330,29 +14894,22 @@ 525547474544 525542494e41 524f53434f31 -524f4e414c44 -524f434b5331 -524f42424945 524f42424552 5248454e4a51 524558444f47 524556455245 524554494e41 5245464f524d -524544534f58 524544425544 524544424f59 524544313131 524544303037 524543434f53 5243434f4c41 -524150544f52 52415049444f 52414d534159 52414d49524f -524149444552 524143484944 -515745525459 515745525435 51554154524f 5152354d5837 @@ -15372,7 +14929,6 @@ 504f4b455253 50494f4c494e 504947424f59 -5048494c4950 504554455243 504541524c59 5041544d414e @@ -15388,7 +14944,6 @@ 4e4f4e524556 4e49434e4943 4e4554434f4d -4e454c534f4e 4e4544564544 4e4343313730 4e4256464e42 @@ -15398,9 +14953,7 @@ 4d554d554d55 4d554d444144 4d554b455348 -4d4f5249545a 4d4f5050454c -4d4f4e455931 4d4f4c444952 4d4a554a554a 4d4953534c45 @@ -15418,22 +14971,17 @@ 4d4154415441 4d4152544945 4d41524b4f53 -4d4152494f4e 4d4150504552 4d414e544153 4d41494e4552 4d41444f4e45 -4d4144444945 4c55524b4552 4c5545544449 4c55434b5938 4c4f57424f59 -4c4f56454c59 4c4f56453134 4c4a434e4547 -4c49434b4d45 4c45534e494b -4c45534c4945 4c4553424941 4c454f4e454c 4c4541465331 @@ -15443,8 +14991,6 @@ 4b4f54454b31 4b4f4c594131 4b4b4b4b4b31 -4b4954545931 -4b495454454e 4b494d424c45 4b4855534849 4b4556494e4b @@ -15469,7 +15015,6 @@ 4a4f484e3031 4a4f45424f4f 4a4b4e453959 -4a494d4d5931 4a494d424f4f 4a4947474131 4a4557454c31 @@ -15480,9 +15025,7 @@ 4a41534f4e44 4a41524d414e 4a414e4e4945 -4a41434f4231 4a41434b494e -4a41434b4945 4a41434b3130 4a4142424152 49534f545745 @@ -15500,10 +15043,8 @@ 484a434e4a44 484552544841 48454c4c4f33 -484152564559 484152525942 484152494f4d -484150505931 48414e473130 48414e44454c 47554c4e5552 @@ -15522,13 +15063,10 @@ 474c454e4e31 47494c4c4945 47494c424552 -47484244544e 47454c4c4152 47424a595448 -4741544f5253 474152554441 47414e535441 -47414c494e41 47414554414e 46554e4b4559 465245443232 @@ -15556,11 +15094,8 @@ 4547524f4547 44554d4d4945 44554d415353 -4455444c4559 445341445341 445255554e41 -445249564552 -445249564552 445241574445 445241494e53 444f5a455231 @@ -15568,14 +15103,11 @@ 444f52534149 444f524f5441 444f4f4d4552 -444f4e4b4559 444f4c494e41 444f44534f4e 44494e474f53 4449414c4552 -444941424c4f 44454e495353 -44454e495345 44454d42454c 44454c544943 44454c454f4e @@ -15589,7 +15121,6 @@ 44414e4e4f4e 44414e494b41 44414c453838 -444149535931 444144445932 435843584358 4355544c4552 @@ -15597,7 +15128,6 @@ 435249535441 435246343530 4352454f4c45 -4352415a5931 434f52564554 434f524b5931 434f524b4559 @@ -15612,7 +15142,6 @@ 434852495333 4348494e4f31 434849434147 -434845565931 434845554e47 434552495345 434543494c59 @@ -15637,7 +15166,6 @@ 424f53534553 424f4f4e4945 424f4f4d414e -424f4e4e4945 424f47494553 424f44474552 424f42424242 @@ -15665,11 +15193,7 @@ 42414c424553 424142593031 42374d47554b -415a414d4154 41564f434154 -415554554d4e -415547555354 -415354524944 415349414e31 41534857494e 415344463131 @@ -15689,7 +15213,6 @@ 414c45583935 414c4452494e 414c414c414c -414952425553 41484a4b4a44 414244554c41 4141524f4e42 @@ -16019,8 +15542,6 @@ 313330313738 313330303030 313251313251 -313233414243 -313233343551 313233323131 313232303030 313231393837 @@ -16282,16 +15803,13 @@ 5a4f554c4f55 5a4f4d553951 5a4f4449414b -5a4944414e45 5a45524f3030 5a4150504544 5a414e554441 59554b4f4e31 5946434e5a31 -59454c4c4f57 59454c454e41 59414b59414b -585858585831 583544585750 583132333435 574f4f54454e @@ -16311,7 +15829,6 @@ 564153494c59 56414e474152 56414c564553 -554e49544544 554a554a4b4d 554a4e425246 554a48494a52 @@ -16336,10 +15853,8 @@ 544552434553 54454d503031 5445464a5053 -544155525553 544150504552 5441504f5554 -53595354454d 5357414e4e59 53555a494551 535550455235 @@ -16367,12 +15882,10 @@ 534e49505059 534d59544845 534d41434b59 -534b49505059 534b454c4c59 53495847554e 534954474553 5349474e5550 -534945525241 534857455441 534849564131 5348414e4441 @@ -16394,11 +15907,9 @@ 534144494553 534144313233 534142455253 -5255534c414e 52554c455a5a 524f554e4453 524f53494e41 -524f4d4d454c 524f4c53454e 524f4242494e 524a434e5a59 @@ -16407,20 +15918,15 @@ 52454d52454d 52454c495348 5245484e5246 -524547474945 524544393131 524156455253 524156454e33 -524156454e31 -52415343414c 524150454d45 52414e4d414e 52414c504853 515549564552 -515151515131 51415a515745 51415a4f4b4d -513157324533 5055544e4559 505553535933 50554e454554 @@ -16452,7 +15958,6 @@ 4f57454e3130 4f5349504f56 4f4f4f4f4f31 -4f4e4c494e45 4f4e454c5556 4f4d47313233 4f44454e5345 @@ -16462,7 +15967,6 @@ 4e4f4b494141 4e4f46415445 4e4f46414753 -4e495353414e 4e494e455459 4e4947485431 4e4942424c45 @@ -16471,7 +15975,6 @@ 4e4553544541 4e45524d494e 4e454d524143 -4e415448414e 4e4154414c45 4e4154414c41 4e4150494552 @@ -16488,7 +15991,6 @@ 4d4f4c494e45 4d4f44554c45 4d4f44455354 -4d4f42494c45 4d4953545932 4d495348454c 4d494b453434 @@ -16511,7 +16013,6 @@ 4d41524c4545 4d41524b4f56 4d41524b3031 -4d4152494e41 4d4152494341 4d414f4d414f 4d414e474131 @@ -16524,7 +16025,6 @@ 4c5955424f56 4c5952494353 4c5558555259 -4c5544574947 4c55434b5936 4c4f56453031 4c4f5244494b @@ -16555,8 +16055,6 @@ 4b4f414c4131 4b494d4f5441 4b4945525241 -4b4556494e31 -4b45524d4954 4b454e534149 4b4549544853 4b4549544842 @@ -16591,7 +16089,6 @@ 494f50383930 494e544f4954 494e48455245 -48554d4d4552 484f4f444f4f 484f4e4b4552 484f4c4d414e @@ -16603,13 +16100,11 @@ 484542455254 484152524f57 484152414d49 -48414e53454e 48414c494d41 48414952444f 475550504945 47554d504552 4752494c4c4f -474f52444f4e 474f4f534532 474f4c443132 474f44454550 @@ -16655,12 +16150,9 @@ 455350414441 4553484f5254 45524f54494b -454e54455231 454e5349474e 454e44555245 454d494c5953 -454444494531 -4541474c4531 445556414c4c 445554544f4e 44555242414e @@ -16675,19 +16167,15 @@ 444f4f464552 444f4f444144 444f4e454954 -444f43544f52 444f43484b41 444d58444d58 444d48343135 -4449534e4559 4449504c4f4d 44494f4e4953 44494c4c4552 -444947474552 44475448544c 4445564f4e31 44454e5a454c -444541544831 444156494457 444156494452 444156494433 @@ -16717,16 +16205,13 @@ 434a484a5246 4348554e4c49 434855424241 -434852495354 43484f525553 4348494e4e41 434845525249 -434845455345 43484152524f 4348414c4b59 434841495345 43484143484f -43454c544943 434543494c49 4342524f574e 43415a5a4f31 @@ -16742,7 +16227,6 @@ 425547455945 4255454e4f53 425259434531 -425255545553 425255444552 425249414e4d 425249414e32 @@ -16753,13 +16237,11 @@ 424f44454741 424f4242594d 424c4f575550 -424c415a4552 424954434845 42494c4c5932 424947574947 424947544f4d 424947535552 -4249474f4e45 4249474a4f4e 42494746414e 42494742524f @@ -16782,8 +16264,6 @@ 415941434443 4158454c4c45 41564f434554 -415641544152 -4156414c4f4e 415544494f31 4153494c4153 415254594f4d @@ -16799,7 +16279,6 @@ 414e44593131 414d49474f31 414c4f4e4531 -414c45584953 414c45584131 414c45583233 414c45583032 @@ -17051,10 +16530,8 @@ 323030343935 323030333736 315a315a315a -315055535359 314a4a4a4a4a 314348524953 -314348524953 313939343233 313939343132 313938393139 @@ -17484,8 +16961,6 @@ 575443414351 575157515751 574d32303036 -57494e544552 -57494c4c4f57 57494c4b4945 57484f57484f 574542475559 @@ -17509,7 +16984,6 @@ 5452454e544f 5452454e4459 545245415453 -544f52524553 544f50415a31 544f4e593838 544f4c544543 @@ -17536,14 +17010,12 @@ 544149534f4e 535745455454 535745455432 -535745455431 535745454554 53555a414e4e 53554e4e5944 53554e4e5937 53554e313233 53554b4b454c -535455504944 5354554d5053 53545544454e 535449434b31 @@ -17553,7 +17025,6 @@ 5354414b414e 535431313030 535055525353 -535049444552 5350414e4b31 534f52544544 534f4b414441 @@ -17586,8 +17057,6 @@ 534152414832 53414e4d414e 53414e445932 -53414e445931 -53414c4c5931 5341494d4f4e 534142455231 533632493933 @@ -17608,7 +17077,6 @@ 52454e52454e 52454e454545 52454d4f5645 -524547494e41 5245444f414b 524542454c32 52414e445932 @@ -17616,7 +17084,6 @@ 524146544552 523731313253 51574551415a -515741535a58 5155494d4259 515545454e59 51414e544153 @@ -17629,7 +17096,6 @@ 505542313133 505249534341 505245455449 -505050505031 504f57574f57 504f55504f55 504f524e4c4f @@ -17645,7 +17111,6 @@ 50454e475549 50454e444552 504157454c31 -5041524b4552 504152495353 50414e4d414e 50414e444f52 @@ -17674,7 +17139,6 @@ 4e4544343637 4e4156454544 4e4153485541 -4e415255544f 4e414f4d4931 4e414c494e49 4d5953495445 @@ -17692,7 +17156,6 @@ 4d4f4e54455a 4d4f4c4f4348 4d4f4c4c5942 -4d4f4c4c5931 4d4f44494659 4d4f44454d53 4d4953545953 @@ -17701,14 +17164,12 @@ 4d494b455942 4d494b453334 4d49434d4143 -4d455849434f 4d4552474552 4d45444d414e 4d4544494349 4d4343414e4e 4d4154543231 4d4152554e49 -4d4152544841 4d4152524f57 4d41524b3131 4d4152494f35 @@ -17716,20 +17177,17 @@ 4d4152494532 4d415247494e 4d4152434832 -4d415243454c 4d414e49454b 4d414e434841 4d414d413131 4d414c56494e 4d414b545542 -4d414b53494d 4d41484f4e45 4d414747494f 4c5556534558 4c4f574b4559 4c4f56453939 4c4f56453838 -4c4f55495345 4c4f55444552 4c4f4c4c4552 4c4a484a5546 @@ -17776,7 +17234,6 @@ 4a4f53454641 4a4f4e4e5931 4a4f484e3233 -4a4f48414e4e 4a4f414b494d 4a4e44464b42 4a494d424f59 @@ -17787,7 +17244,6 @@ 4a41594c454e 4a41534f4e50 4a41534f4e33 -4a41534f4e31 4a414d455350 4a41494d4945 4a41474d414e @@ -17810,7 +17266,6 @@ 484f4d45524f 484f4d453737 484f4d453132 -4849544d414e 4849524f4d49 484943435550 4845524f3633 @@ -17820,7 +17275,6 @@ 484546464552 484542524f4e 484541565931 -48454156454e 4845414c4552 484156564f43 484153545552 @@ -17831,26 +17285,20 @@ 48324f534b49 475742555348 4755524b414e -47554e4e4552 475255424552 475255424259 4752495a5a59 475245454e4e 475245454e38 -47524148414d 475241434553 -474f52444f4e 474f52444954 474f4f534553 474f4e5a4f53 474f4e5a414c -474f4c444945 474f444f4753 474f44455353 474f44415244 47494f47494f -474942534f4e -4749414e5453 4746565a4e4d 47454f524759 47454e49414c @@ -17864,7 +17312,6 @@ 465249545a5a 465245554e44 465245444449 -4652414e4345 464f52554d31 464f44415345 464c594d414e @@ -17878,13 +17325,11 @@ 4641494c4544 4641464e4952 455854524131 -455843455353 45535045524f 454e4455524f 454d494c5942 454d424c454d 454d42333737 -454c56495331 454c4d455253 454c4c495331 454c4c414e44 @@ -17892,7 +17337,6 @@ 4543434c4553 45415359474f 445741524631 -44555248414d 445544453132 445544453131 4455414e4531 @@ -17900,13 +17344,11 @@ 444f4f504552 444f4e313233 444f4d4f444f -444f47474945 44464144414e 444558545552 444557455931 4445504c4f59 44455041554c -44454e564552 44454e4e5953 44454d495345 444546343536 @@ -17923,7 +17365,6 @@ 43554c49544f 43554c45524f 4352415a5a59 -434f57424f59 434f55525453 434f4f4c3639 434f4f4b494e @@ -17944,13 +17385,11 @@ 4341494d414e 434142414e41 433132333435 -425552544f4e 42554e4b4945 425544445959 4255424c554b 42534d495448 425255434553 -42524f574e53 42524f574e49 42524f4e5831 425249414e4b @@ -17965,7 +17404,6 @@ 424c49535337 424c414e4b41 424b4d4c4648 -424954454d45 424952444552 42494e474f4f 42494d424f53 @@ -17988,12 +17426,10 @@ 42414d4d4552 42414d424f55 42414c53414d -42414c4c4552 42414c4b414e 424148414d41 424147474945 424147454c31 -424144474552 4159414e4e41 415753454452 4154574f524b @@ -18676,7 +18112,6 @@ 303130323730 303130313938 303031393639 -5a5a5a5a5a5a 5a5843445341 5a55434b4552 5a4f45444f47 @@ -18692,7 +18127,6 @@ 59415252414b 58595a5a5931 5858584a4159 -584156494552 575941545431 575757575731 574f4c463031 @@ -18707,7 +18141,6 @@ 574150574150 57414c4c4f50 56494c4c414e -564648425946 564152564152 56414e494c4c 56414e455341 @@ -18762,7 +18195,6 @@ 535554544552 535550524153 535550455258 -53544f524d59 535441544552 5354414c4b45 535441424c45 @@ -18788,9 +18220,7 @@ 534c49444553 534c41564132 534c31323030 -534b49505059 534953534945 -53494d4f4e31 534947555244 534945535441 5349434b4c45 @@ -18814,15 +18244,12 @@ 53434f54544d 534348574142 534348554559 -53415455524e 534152564152 53414e444941 53414e44414e -53414d4d5931 53414d4d4d59 534149534841 53414950414e -5341494c4f52 5341444d414e 5259414e3232 525554544552 @@ -18837,7 +18264,6 @@ 524f434b5934 524f424f544f 524f42424f42 -524f42424945 52495455414c 524947485459 524944474553 @@ -18847,19 +18273,16 @@ 524550454e54 524547495331 52454747494e -524544444f47 524544444552 524544323232 5245434f4241 524542454c44 52415454454e -52415343414c 524150524150 524150494431 52414c4c5945 524145524145 5241444d4952 -524144454f4e 524142494553 52345a504d33 515753415a58 @@ -18896,7 +18319,6 @@ 50494e454441 50494d504552 50494553454b -504943415244 50484f424941 5048454c4745 5045594f5445 @@ -18904,7 +18326,6 @@ 504554455247 504552524954 5045504f5445 -50454f504c45 50454e4d414e 50454c564953 50454c453130 @@ -18916,8 +18337,6 @@ 504153533232 5041524d414e 504152454e54 -50414d454c41 -4f55544c4157 4f5454455231 4f5249414e41 4f4b4f434841 @@ -18981,7 +18400,6 @@ 4d414c544259 4d41474f4f31 4d4147494337 -4d4144444f47 4c594e534559 4c59414c5941 4c5554484f52 @@ -18998,14 +18416,11 @@ 4c4c4c4c4c31 4c494e4e4541 4c494c4a4f45 -4c4947485431 4c4947455449 4c4559544f4e 4c4556494e45 4c454e4f5241 -4c4547454e44 4c4543484546 -4c4152495341 4c414f545a55 4c414d4f5552 4c414c554e41 @@ -19026,7 +18441,6 @@ 4b45524e4f57 4b415a414d41 4b41594c494e -4b4154414e41 4b41524c4131 4b4152494d41 4b414e474f4c @@ -19047,8 +18461,6 @@ 4a494e4a494e 4a494d4d5950 4a4942424552 -4a4552454d59 -4a454e4e5931 4a415a4d594e 4a414d414943 4a4142454c4c @@ -19056,7 +18468,6 @@ 49564552534f 495342455354 49524f344b41 -495249534831 494d41474531 494c55564d45 494c55563639 @@ -19066,25 +18477,18 @@ 4855534b4945 48555341494e 48554d414e53 -485544534f4e 485542434150 484f55534552 -484f54524f44 484f54424f54 484f54424f49 484f53455231 484f4c4c5959 -484f42424954 -4845524d414e 484552425354 484552424552 484549484549 484549444945 4845464e4552 -484543544f52 484153534c45 -484152525931 -4841524f4c44 484152445550 48414d5a4148 48414d4c494e @@ -19094,7 +18498,6 @@ 475249464f4e 475245454e34 475245454b31 -475245415431 4752415a4941 474f504e494b 474f4f465553 @@ -19106,7 +18509,6 @@ 474c414d4953 47494e4e4945 47494c4c4953 -474942534f4e 47484a54524e 4745524f494e 474546455354 @@ -19117,13 +18519,9 @@ 47414d474545 4735574b5339 465548524552 -465249454e44 -465245444459 46524544444f 4652414e4b45 4652414e4b41 -4652414e4b31 -464f52455354 464f52443131 464f4e444c45 464c59464c59 @@ -19139,8 +18537,6 @@ 464149544832 463132333435 45584f434554 -455547454e45 -455547454e45 455343524f57 455257494e31 45524f45524f @@ -19171,7 +18567,6 @@ 444b414c4953 444953484553 444952543439 -444558544552 4445524f5341 44454e574552 44454c4c3530 @@ -19194,8 +18589,6 @@ 434f554e5445 434f524d4143 434f4e4f5231 -434f4e4e4945 -434f4d504151 434f4d414e44 434f4c4f5231 434f474e4954 @@ -19219,7 +18612,6 @@ 43424854594d 434154424f59 434152544d41 -4341524d454e 434152494245 43414e564153 43414e4f5059 @@ -19230,8 +18622,6 @@ 4259524f4e31 42594b454d4f 42555a5a5a5a -425554544552 -4255544c4552 4255534d414e 42554e4b5931 42554e444c45 @@ -19239,15 +18629,12 @@ 425546465932 425544445933 425544444f47 -425544444841 4252554e4f53 425255434557 42524953434f 4252494c4c4f 425249474954 425249434b31 -4252454e4441 -4252454d454e 425241494e59 425241494e31 424f554e4359 @@ -19255,7 +18642,6 @@ 424f4f425953 424f4f425353 424f4c495441 -424f42425931 424e4d313233 424c55453238 424c55453030 @@ -19266,7 +18652,6 @@ 424c41434b39 424c41434b33 42495454454e -424954454d45 42494c4c594b 42494c4c5331 42494c4c4554 @@ -19275,7 +18660,6 @@ 42494a4f5558 424947544544 424947524f44 -4249474d4143 424947414c53 42455350494e 42454e57494e @@ -19292,7 +18676,6 @@ 42415a554b41 42415a414152 424153414c54 -42414c4c5331 42414c444945 42414c415441 42414b4c414e @@ -19303,7 +18686,6 @@ 415949303030 415744415744 4156454e4745 -415544524559 4154574f4f44 415441524953 415354524f4e @@ -19314,7 +18696,6 @@ 41524e494531 41524d494e45 415245594f55 -4150504c4553 4150504c4535 414f49383536 414e5452494d @@ -19325,12 +18706,10 @@ 414e44313233 414d5041524f 414d415a4544 -414c59535341 414c53544f4e 414c49455641 414c49434553 414c49415331 -414c45584559 414c45525453 414c45434941 414c4142414d @@ -20098,8 +19477,6 @@ 594f554e4753 594f44554445 59484e554a4d -59464e464946 -59414e4b4545 585a585a585a 5846484b4252 574f4c4c4559 @@ -20109,13 +19486,11 @@ 57494c455931 57494c444f4e 574944444552 -5749434b4544 574841544953 5748414c454e 574552554c45 574552543132 574542545653 -57414c4b4552 57414c455241 574149544552 574148574148 @@ -20124,8 +19499,6 @@ 564952474f53 564950564950 564950455237 -56494b544f52 -564943544f52 564656463132 5646434d5246 564553544552 @@ -20137,7 +19510,6 @@ 564152454c41 55534d433031 554e5345454e -554e49544544 554e49534f4e 554e434c4553 554444455253 @@ -20159,11 +19531,8 @@ 544f4d323034 544f4b594f31 544f44415932 -544f42494153 -54495454454e 5449544f4e45 544950544f45 -54494e4b4552 54494d4f5445 544947485431 544947455238 @@ -20173,22 +19542,17 @@ 5448454d4953 544845464c59 5448414e4b55 -544558415331 544552455a41 54455155494c 54454e4f5231 544545544552 544155545431 -544155525553 544152474131 544152415741 -54414e4e4552 54414c4b3837 54414b454d45 54414b414b4f 535749465453 -535745455453 -535553414e31 535552475554 53555045524d 535550455241 @@ -20200,14 +19564,11 @@ 535455464653 53545041554c 53544f4e4945 -53544f4e4553 53544f4b4552 53544f4b4544 535445564548 5354414e4753 -535353535331 535055444459 -53504f4f4b59 5350494b4532 535041574e37 5350414d4d4d @@ -20250,7 +19611,6 @@ 534152414848 53414e59434f 53414e534f4e -53414d534f4e 53414d4d5959 53414d464f58 53414d424f31 @@ -20267,13 +19627,11 @@ 5253544c4e45 524f54544552 524f53494553 -524f4c414e44 524f4953494e 524f434b5959 524a484a5946 52494e4b4552 52494d494e49 -524943484945 52464e545946 524647484a59 524554544552 @@ -20303,7 +19661,6 @@ 51534345535a 515151414141 513132574533 -505553535953 50554e434859 505547444f47 50524f4c4f47 @@ -20327,7 +19684,6 @@ 50454e50414c 50454e44454a 5041554c3130 -504153534553 504153484131 50415256495a 504152444f4e @@ -20335,15 +19691,12 @@ 50414f4c4954 50414e545331 50414e474954 -50414d454c41 50414c50414c 50414c4c4554 504147455550 5041444f5641 4f52494f4e37 4f50454c4754 -4f4d45474131 -4f4c49564941 4f4354415645 4e555247554c 4e4f5350414d @@ -20357,24 +19710,18 @@ 4e454552414a 4e45454c3231 4e4149524441 -4e4144494e45 4d595455524e 4d594c414b45 4d55534b4554 4d5553494332 -4d5553494331 4d554e4b4545 4d554e434859 4d554e43484f -4d554c444552 4d5250494242 4d4f56494531 -4d4f55534531 4d4f534b5741 -4d4f4f534531 4d4f4f524553 4d4f4f4d414e -4d4f4f4b4945 4d4f4f445931 4d4f4e455938 4d4f4e455935 @@ -20413,7 +19760,6 @@ 4d4158434154 4d4154545931 4d4154543031 -4d4153544552 4d4153534945 4d41534c4f56 4d4153434841 @@ -20440,7 +19786,6 @@ 4c4f56455353 4c4f56453234 4c4f56453135 -4c4f55495345 4c4f52454c49 4c4f50455a31 4c4f4f4e4945 @@ -20460,7 +19805,6 @@ 4c454d4d4f4e 4c454b544f52 4c4547533131 -4c4547414359 4c4157494e41 4c415652494b 4c4154455858 @@ -20497,7 +19841,6 @@ 4b4547474552 4b41554e4153 4b41544c594e -4b4154494531 4b4154313233 4b4152544552 4b414c59414e @@ -20509,8 +19852,6 @@ 4a554d424f53 4a554c593237 4a554c494153 -4a554c49414e -4a5243465946 4a4f594f5553 4a4f53483132 4a4f53453132 @@ -20542,7 +19883,6 @@ 4954534d4532 4954444f4553 495354494e41 -49534142454c 494f414e4e41 494e54455231 494e4e415445 @@ -20551,15 +19891,12 @@ 494d46524545 49434842494e 494245524941 -4942414e455a 48554d54554d 48554d50494e -484f57415244 484f5446554e 484f50484f50 484f4f504c45 484f4f484f4f -484f4d455231 484f47544945 484a4c424a59 4849544d454e @@ -20590,7 +19927,6 @@ 475245455345 475241565931 4752414e4154 -475241434945 474f54594f55 474f54494d45 474f5244414e @@ -20603,7 +19939,6 @@ 474544454f4e 47415741494e 47414e47414e -474142524945 46594c485351 46554e4b4945 465545525445 @@ -20645,8 +19980,6 @@ 455155415445 454d4f4b4944 454d4d413031 -454d494e454d -454d494c5931 454d414e5545 454c49584952 454c49544553 @@ -20660,7 +19993,6 @@ 44594c414e53 4459414e4e41 4457454c4c53 -445741594e45 445550524545 44554b453132 445548445548 @@ -20684,7 +20016,6 @@ 4449414e4153 4449414e4132 44474f494e53 -444558544552 444555434531 4445544f5552 44455252454e @@ -20701,7 +20032,6 @@ 444541544836 444157494431 444156313233 -44414e49494c 44414e474954 44414e47454c 44414e414e47 @@ -20713,7 +20043,6 @@ 4355524c4557 435542425931 435542414e41 -435448555451 4354484c5754 435448444243 4353544f434b @@ -20722,14 +20051,12 @@ 4352415a5944 4352414e4553 435241434b59 -434f594f5445 434f554e5452 434f53494d4f 434f4f544945 434f4f525331 434f4e474153 434f4c545331 -434f4c543435 434f434f3132 434f434b3232 434e544b4b46 @@ -20742,18 +20069,14 @@ 4348494e4e49 434845565959 434845565933 -43484552594c 4348454c5349 -434845455345 434841524954 4348414e5445 4348414e4359 -4348414e4345 4342564a5946 434241333231 434154484159 434153534953 -434153534945 434153494f31 434152494e47 434152445353 @@ -20764,11 +20087,8 @@ 42554e59414e 425546464f4e 4255434b5331 -425543455441 -425542424c45 425255534859 425255434559 -42524f4e434f 42524f47414e 42524f445931 425249544e49 @@ -20790,14 +20110,10 @@ 424c55525259 424c55453932 424c55453330 -424c55453232 424c49474854 -424c415a4552 -424c41434b59 424c41434b35 424a424a424a 4249534f5553 -424952474954 424950424950 42494c4c5947 42494c4c4c59 @@ -20816,9 +20132,7 @@ 424541544d45 424541525353 424541523133 -424541474c45 424441444459 -424242424242 4242414c4c53 424152534348 42414e544841 @@ -20831,17 +20145,13 @@ 41555354314e 415552454c49 415448454e45 -415448454e41 415445415345 4154414d414e 4153544f4e56 -4153534d414e 415353455254 415350454354 415348524146 415254555231 -415254485552 -41524e4f4c44 41524143454c 415241424941 414e5550414d @@ -20849,12 +20159,10 @@ 414e47454c33 414e45544b41 414e445a4941 -414e44524549 414d42455252 414c59534841 414c534b444a 414c4c415244 -414c49534f4e 414c464f5244 414c45583932 414c454d4150 @@ -20868,7 +20176,6 @@ 4144524f4954 414450415353 414345523132 -414343455353 41424b424747 41414348454e 4141415a5a5a @@ -21644,7 +20951,6 @@ 5a5a5a373737 5a555a555a55 5a5547414e47 -5a4f52524f31 5a4f4e54494b 5a45594e4550 5a415041544f @@ -21658,36 +20964,24 @@ 585858595959 5857494e4731 585452343531 -575757575731 -575554414e47 575539393432 574f4f4f4459 -574f4f445931 -574f4c564553 574f4b494e47 57494e444552 57494c4d4152 57494c4d4131 -57494c4c4f57 57484f524531 57484f4f5348 -574849544531 574559465642 574554534558 574554444f47 -5745534c4559 5745524b454e 574542574542 -57454153454c 574153544552 -574150424253 -57414e4b4552 5741484f4f4f 574148494e45 564f53484f44 -564f4c554d45 564a51564248 -56494b494e47 56494a415941 564746554e32 56464945595a @@ -21697,7 +20991,6 @@ 56414c454e54 564144455253 55544d4f5354 -555341313233 555247454e54 55504c414e44 5550494e5941 @@ -21716,7 +21009,6 @@ 5452594f5554 545245564552 5452454b4552 -545245424f52 544f59424f58 544f57534552 544f53484942 @@ -21750,10 +21042,8 @@ 5445544c4559 544552524953 54454852414e -544544445931 54454147414e 544441564953 -5441525a414e 54414f495354 54414e495441 54414e475559 @@ -21778,17 +21068,13 @@ 5355434b454d 535455443639 53544f524d37 -53544f524d31 53544f524559 535445504849 535441523737 -535441434559 535353313233 535155415453 535052554e54 -535052494e47 53504f4f4b31 -535049524954 5350494e4e45 535049454e47 535045524d45 @@ -21819,7 +21105,6 @@ 534944494e47 534944444953 534857494e47 -53484f525459 53484f525431 534849543132 534845505059 @@ -21833,14 +21118,11 @@ 534558593232 534556454e4e 534552564943 -53455247494f -53454c454354 534541534541 534355424144 53434f545442 5343414c4c59 534159414b41 -534156494e47 534154434f4d 5341524d4154 534152414857 @@ -21858,15 +21140,12 @@ 5259414e3132 52555354494b 525552555255 -52554e4e4552 525547425938 52545955494f 524f4f465553 524f4e534f4e -524f4e4e4945 524f4d414e4e 524f44444552 -524f434b4554 524f424f5431 524f42425931 524f414d4552 @@ -21910,7 +21189,6 @@ 515051505150 514557524554 51415a534557 -505553535931 505546465931 5055424c4958 5052554e4553 @@ -21919,7 +21197,6 @@ 5052494d4153 505249434531 505245505059 -505050505050 504f5a4e414e 504f5456494e 504f54504945 @@ -21929,7 +21206,6 @@ 504f4e474f31 504f4e445553 504f4c4f3939 -504f4c494345 504f4b504f4b 504f494e5431 504c414e5431 @@ -21952,7 +21228,6 @@ 50454e4e5932 50454c55444f 50454b494e47 -504545574545 504541434831 5041554c4a52 5041554c3131 @@ -21965,7 +21240,6 @@ 504152534543 5041524c4159 50415243454c -50414e5a4552 50414c45564f 504149474f57 504135355744 @@ -21976,7 +21250,6 @@ 4f4e57415244 4f4e454c4f56 4f4c4c494542 -4f4c49564941 4f48494f5354 4f474f534849 4f474c414c41 @@ -21984,7 +21257,6 @@ 4e5554534143 4e5553524154 4e5552494348 -4e554e5a494f 4e4f5641544f 4e4f534d4153 4e4954524f53 @@ -21993,7 +21265,6 @@ 4e454c4c5931 4e4154524f4e 4e4154415841 -4e4154414c49 4e41494c4544 4e414854414e 4e41484c494b @@ -22020,7 +21291,6 @@ 4d4f4c4c4552 4d4f434b4241 4d4d4d4e4e4e -4d4d4d4d4d31 4d4959554b49 4d4953494131 4d494e4d494e @@ -22056,13 +21326,10 @@ 4d4152313233 4d414d4d4131 4d414d413232 -4d414c494255 4d414b43494d -4d41474e554d 4d4147494332 4d4146494131 4d4145535452 -4d41434d4143 4d41434b494e 4d4143444f47 4c5556323639 @@ -22077,7 +21344,6 @@ 4c4f425a494b 4c495a494b4f 4c4956454c59 -4c4954544c45 4c494e434f4c 4c494c4f4e45 4c494c4c5953 @@ -22134,7 +21400,6 @@ 4b4556494e48 4b4556494e43 4b454e4e5942 -4b454e4e5931 4b454e4e454c 4b454e4e4544 4b454c544f4e @@ -22161,7 +21426,6 @@ 4a4f484e4a52 4a4f484e3130 4a4f45535048 -4a4f414e4e45 4a4b454c4c59 4a4947474153 4a4554424f59 @@ -22178,7 +21442,6 @@ 4a415a5a4544 4a415a4d414e 4a4159544545 -4a4156494552 4a415334414e 4a4152524554 4a414e555331 @@ -22211,10 +21474,8 @@ 485459464e46 484f574c494e 484f57494553 -484f55534553 484f54454c31 484f54434154 -484f524e4559 484f50504945 484f4f524159 484f4d59414b @@ -22230,7 +21491,6 @@ 484557534f4e 484552455359 48454d414e54 -48454c504d45 48454c454e53 48454b544f52 484545484157 @@ -22240,7 +21500,6 @@ 48415353454c 484152534841 4841524c4f54 -484152444f4e 484152444545 484152443639 48415050454e @@ -22250,20 +21509,17 @@ 4834434b3344 4758544b5246 4756414e4341 -47554e4e4552 47554e444f47 475255505041 475255444745 475245544131 475245473738 475241535331 -474f54484943 474f5445414d 474f52494c41 474f52474553 474f5244454e 474f4f474c59 -474f4f424552 474f4d455a31 474f4d455231 474f4c4f5331 @@ -22283,7 +21539,6 @@ 474545515545 4741594d414e 4741594c4f52 -4741544f5253 47414e474553 47414c4c454e 474144494e41 @@ -22292,15 +21547,12 @@ 46554e4e454c 46554e4b4552 46554a494d4f -4655434b4954 4655434b3939 465249545a45 -465249444159 465245594a41 465245454d41 465245443230 465241535345 -4652414e4345 464f55525459 464f52443530 464f52434544 @@ -22308,8 +21560,6 @@ 464f4f544945 464f4f313233 464f464f464f -464c59455253 -464c4f574552 464c4f505359 464c49505045 46495a42414e @@ -22322,7 +21572,6 @@ 464552444945 46454e434553 464155434554 -4641524d4552 464152475553 464151464151 46414e47494f @@ -22331,7 +21580,6 @@ 4556524f5041 45564552544f 4556454e5453 -455354484552 4553504f4952 4553454e494e 455249434343 @@ -22347,33 +21595,24 @@ 454e44494e47 454c4d455231 454c42455254 -454c41494e45 -454545454531 454445444544 454444494532 445644434f4d 44554b453333 445547574159 -4455444c4559 -445245414d53 445245414d32 444f554c4f53 444f54444f54 444f52454e45 444f4f525331 -444f4c4c4152 444f474c4547 444a4354564d 44495a5a4c45 444956494e41 -4449534e4559 44495341524d 444947474954 -444947474552 -444945544552 44494152494f 444648444648 -444556494c53 444555434532 44455252454b 444552454b53 @@ -22428,9 +21667,7 @@ 4348494e4e55 434845535353 434845535331 -434845525259 4348414e4741 -4348414e4345 434841494b41 434644425946 43454e545241 @@ -22444,7 +21681,6 @@ 434152414d45 43414e544552 43414e444f4f -43414c56494e 43414c4c3036 434147495641 434142494e31 @@ -22456,7 +21692,6 @@ 42554d53454e 42554646414c 425544445934 -425544445931 4255434b3031 425542424c59 425542424137 @@ -22472,10 +21707,7 @@ 425249414e43 425245414453 425245414348 -4252415a494c -425241564553 425241564531 -4252414e4449 425235343930 424f58584552 424f584d414e @@ -22494,7 +21726,6 @@ 424c414e4b53 424b4d49464e 424a41524e45 -424953484f50 42494f4d414e 42494e4b4552 42494d424f31 @@ -22508,33 +21739,25 @@ 424947444f4e 424945424552 424944554c45 -4249414e4341 424654455354 424554534945 424554534559 4245544d454e 424552545553 -42454e534f4e 42454e4e5932 42454e444953 42454c4c5931 -424545544c45 424544425547 4245434b5953 42454245544f -424541555459 424541523939 424541434859 -424541434831 424446595358 424352494348 -42415945524e 424153555241 424153534559 424152534943 -4241524e4553 42415244414b -424152424945 42415242454c 42414e444152 42414d413132 @@ -22548,7 +21771,6 @@ 42414255494e 424142415245 423236333534 -4156414c4f4e 415544494138 41534d415241 415348455331 @@ -22569,7 +21791,6 @@ 414e44593736 414d4f555253 414d454e5241 -414d42455231 414d414d414d 414c59444152 414c56494e31 @@ -22591,14 +21812,11 @@ 414552495448 414552444e41 41454e454153 -41445249414e 41444b494e53 4143554d454e -414354494f4e 414255454c41 414153534141 413232323232 -413142324333 393939353535 393858413239 393839393839 @@ -22930,7 +22148,6 @@ 314d4f555345 314d4f4e5448 314d41474943 -314c4f564552 314b4b4b4b4b 314352415a59 313939363139 @@ -23488,7 +22705,6 @@ 574954434859 57494e474544 57494e424947 -57494c4c4945 57494c4c4552 5748594d4532 5745534b4552 @@ -23499,7 +22715,6 @@ 574154455235 5741524d414e 5741504b5531 -57414e4b4552 57414c4c4945 564f43414c53 564956414345 @@ -23528,7 +22743,6 @@ 554348543336 553233343536 545749535445 -545552424f31 545550414353 54554c495031 545543414e4f @@ -23580,7 +22794,6 @@ 54414c4c4953 54414c4c454e 543132333435 -53595354454d 535953534543 5359534d414e 5359444e4545 @@ -23589,10 +22802,8 @@ 535552454e4f 535550455252 53555045524a -535550455231 53554e444552 53554d53554d -53554d4d4552 53554c41434f 535547415232 535544484952 @@ -23622,19 +22833,15 @@ 534e41524553 534e41465532 534e41465531 -534d49545459 -534c55545331 534c55474759 534c4f43554d 534c41564b41 534c41564943 -534c41564531 534c414c4f4d 534b554e4b31 534b49534b49 534b49525453 53495354454d -534952495553 53494c56414e 5349474e494e 5349474d4132 @@ -23643,9 +22850,7 @@ 534852444c55 53484f4f5453 53484948414e -534845525259 5348454c4c45 -5348454c4259 5348415a5a41 5348415a4941 534841575459 @@ -23660,20 +22865,14 @@ 534558313031 53455645524e 534552474955 -534552474549 534545494e47 534541564552 -5345414d5553 534355525659 5343484f4b4b 534341525041 534157534157 -534156414745 -534155524f4e 53415459414d -53415455524e 534154485941 -534153434841 534152414844 534152414837 53414e544153 @@ -23689,11 +22888,8 @@ 533153325333 525952595259 525553544943 -52555354414d -5255534c414e 52554e524947 52554c455355 -52554c455331 525547425932 525546555332 525546494e41 @@ -23702,7 +22898,6 @@ 525332303030 524f59524f59 524f53455331 -524f4e4e4945 524f4c594154 524f464c4f4c 524f44454f53 @@ -23738,11 +22933,9 @@ 524144494f4e 52414449414c 515753585a41 -515545454e31 515541445241 515151373737 513132333451 -513132333435 505552444559 50554e444149 50554e414e59 @@ -23770,7 +22963,6 @@ 504c41494e53 504958454c53 504954504954 -504952415445 50494e4b5953 50494e4b5932 50494e474933 @@ -23796,7 +22988,6 @@ 5045454c4552 50415941534f 5041554c3939 -504154544f4e 504154494e4f 504153533353 504153533238 @@ -23834,13 +23025,11 @@ 4e4a514a4e46 4e494b4b4f31 4e494b4b494e -4e49434f4c41 4e4943454c59 4e4942495255 4e4554484552 4e45524f4e45 4e41554d4f56 -4e4154555245 4e415253494c 4e4152494e45 4e414e4e4552 @@ -23858,19 +23047,16 @@ 4d524d494b45 4d52434f4f4c 4d52424c5545 -4d4f52524953 4d4f52414c45 4d4f4f4e3639 4d4f4f4c4148 4d4f4e545345 4d4f4e4b3359 -4d4f4e444159 4d4f4c415253 4d4f4a4f3131 4d4f47474945 4d4f44454d31 4d4f43414a4f -4d4f42494c31 4d4a32333435 4d4a31323334 4d49554d4955 @@ -23885,7 +23071,6 @@ 4d4554415841 4d4552444553 4d454e415244 -4d454d454d45 4d454c4c4f31 4d454c495441 4d4547414e32 @@ -23894,7 +23079,6 @@ 4d4543414e4f 4d4159555253 4d4159554d49 -4d415948454d 4d415853414d 4d4155524943 4d4155444954 @@ -23904,7 +23088,6 @@ 4d4153534f4e 4d4153534552 4d4153515545 -4d41534f4e31 4d4152555359 4d4152495353 4d4152494133 @@ -23946,28 +23129,23 @@ 4c4953494341 4c494e47414d 4c494e454152 -4c494e444131 4c4946544544 4c49434b3639 4c4556454c31 4c454f4e4f52 4c454e494e41 4c454d55454c -4c4547414359 4c45414c4541 4c415a455231 4c415645524e -4c4155524131 4c4152494154 4c414e4c414e 4c414e444155 4c414d455231 -4c414b4f5441 4c414348454e 4b5552414d41 4b52415a594b 4b524156494e -4b5241555353 4b52414b4f57 4b4f554b4c41 4b4f53544f4e @@ -24002,7 +23180,6 @@ 4b414c494e45 4b414c415348 4b414b414841 -4b4149534552 4b4149534152 4b41484c414e 4b41464b4131 @@ -24023,7 +23200,6 @@ 4a4f484e3231 4a4f48414e31 4a4b5a4a4b5a -4a4a4a4a4a31 4a4954544552 4a494d4d595a 4a494d4d5936 @@ -24031,7 +23207,6 @@ 4a4554544153 4a4554455231 4a4553535550 -4a4553534945 4a454d425554 4a454c574159 4a41594b4159 @@ -24045,7 +23220,6 @@ 4a4150414e32 4a414e45454e 4a414d494532 -4a414d494531 4a414d455359 4a414d455336 4a414d455334 @@ -24059,7 +23233,6 @@ 495645545445 4954534d4545 4954414c4945 -49534c414e44 495348415244 495341414353 495241313233 @@ -24078,7 +23251,6 @@ 485542524953 485045534f4a 484f57494531 -484f57415244 484f54545931 484f53455253 484f524e5953 @@ -24090,9 +23262,7 @@ 484f42534f4e 2e484a585246 48494c4c4552 -484848484831 48454e525935 -48454e52494b 48454e524945 48454e4b4945 484152554d49 @@ -24111,7 +23281,6 @@ 475447544754 47524f4d4f56 47524f434552 -475245474f52 475245474747 475245474552 475245473133 @@ -24128,7 +23297,6 @@ 474f48414253 474f47474c45 474f44363636 -474c4f524941 474c4f4f4d59 474c4f434b39 474c4f424553 @@ -24146,7 +23314,6 @@ 4749414c4c4f 4746444b4a44 474552524931 -47454e495553 47454d47454d 474549474552 474530524745 @@ -24156,7 +23323,6 @@ 474154454545 474153504552 47415256494e -474152434941 47414d4d454c 47414c4c5550 474144464c59 @@ -24174,7 +23340,6 @@ 464f52444754 464f52443938 464f4f464552 -464c4f574552 464c4f4f4453 464c4f474552 464c49454745 @@ -24190,7 +23355,6 @@ 4649414e4e41 46454c4c4552 46454c495832 -46454c495831 4645454e4559 4641554c5459 464152494e41 @@ -24210,7 +23374,6 @@ 45524f494341 4550534f4e31 455041544231 -454d50495245 454d42414c4d 454c52494331 454c454e4f52 @@ -24236,7 +23399,6 @@ 44534e494e45 4452554d4d45 44524f4e4553 -4452495a5a54 4452494c4c53 445241434f53 444f5a5a4552 @@ -24278,10 +23440,8 @@ 444149534849 4441494c4559 444149444149 -444144445931 444142454152 435642435642 -435552544953 43554d424f59 4353434f4d50 4352555a414e @@ -24297,7 +23457,6 @@ 434f4f4c3233 434f4f4c3232 434f4e524f59 -434f4e4e4945 434f4e4e4558 434f4d455441 434f4c554d4e @@ -24311,11 +23470,9 @@ 4348554e4b53 434855434b44 434855434b32 -434852495354 434852495338 43484f505045 43484c4f4553 -43484c4f4531 434849535041 4348494e4b59 4348494e4741 @@ -24329,13 +23486,10 @@ 4348414d504f 4346594d5246 434558464846 -43454c544943 43454c543239 434442594d5a -434153455931 434153434153 434153424148 -4341524f4c45 434152494e4f 43414d555331 43414d4d4552 @@ -24346,16 +23500,13 @@ 433030504552 425944414e44 425554545454 -4255544c4552 4255544b4953 425553484b41 4255524e4544 425552474f53 42554e544552 -42554e4e5931 42554e494133 42554e44414f -42554c4c5331 425549434b53 425547474945 4255434b3133 @@ -24376,11 +23527,9 @@ 424f54424f54 424f4f4d4241 424f4f474c45 -424f4f474945 424f4f474559 424f4f444945 424f4c4c454e -424f4744414e 424f4646494e 424f434d414e 424f4242594a @@ -24395,7 +23544,6 @@ 424b4d594548 4249584c4552 42494f4c4f47 -42494c4c5931 42494754494d 424947544558 42494753414d @@ -24409,7 +23557,6 @@ 424554545950 424554483639 424552524945 -4245524e4945 42454f544348 42454e5a3132 42454e4e4552 @@ -24426,24 +23573,20 @@ 424153544552 424153533131 424153484152 -424152424945 424152415441 42414f42414f 42414e5a4159 42414e54494b 42414e474d45 -42414e414e41 42414c4c5a5a 42414c414e41 42414c414a49 42414b455233 -424144474552 424142414a49 415a5245414c 415a4f524553 415841584158 415644454556 -4155524f5241 4153484f4c45 4153484c4541 415343454e54 @@ -24455,12 +23598,10 @@ 415241554a4f 4152414d4154 415141514151 -4150504c4531 414f4c535558 414e544f4e41 414e544f494e 414e4e494e41 -414e4e494b41 414e49544153 414e49434b41 414e47454c38 @@ -24474,7 +23615,6 @@ 414c54455241 414c4c414e41 414c4c345539 -414c49534f4e 414c494f4e41 414c474f5245 414c45583836 @@ -24492,16 +23632,12 @@ 414755535441 41464649524d 4144554d4153 -4144554c5431 41444d495241 41444d494e53 -41444d494e31 -414449444153 4144414d3031 414345313131 414242593132 41424144414e -4141524f4e31 413241324132 413132333441 393935335242 @@ -25503,7 +24639,6 @@ 574946455931 5749444d4552 574553543132 -5745524e4552 574552323334 574552313338 574544474553 @@ -25513,18 +24648,15 @@ 574541524531 5742454d4f43 5741594e4530 -574154455231 574153445145 574152504947 574152313233 -574150424253 57414e444131 57414c455331 5741494d4541 5741484f4f31 56554c4b414e 565456545654 -564f4f444f4f 564f4c46414e 564f4c415245 564c41443132 @@ -25550,17 +24682,14 @@ 554b43415453 554a594f4252 554550544b4d -545745455459 545741494e31 545554545554 -5455524b4559 545552495354 545552424f36 54554c4c4559 54554a485358 545454313233 5452554f4e47 -545255434b31 545249534831 545249434b31 545249414445 @@ -25570,21 +24699,18 @@ 544f554e4745 544f52544f52 544f524f544f -544f5047554e 544f50415a5a 544f4e593939 544f4e593235 544f4e544f31 544f4e4e4945 544f4d4d5947 -544f4d434154 544f4d415341 544f4c4b4945 544f4655434b 544f42424945 544c31303030 544954544954 -54494e4b4552 544947524531 544947455235 544858313338 @@ -25597,8 +24723,6 @@ 544558544558 544558414e31 544552524131 -544552455341 -544552455341 54454e4f5253 54424f4e4552 54415353454e @@ -25612,8 +24736,6 @@ 5441484f4553 5441474d414e 544141524e41 -53594c564941 -5359444e4559 535853585358 53574956454c 535749465431 @@ -25624,9 +24746,7 @@ 535553534945 535553484953 535550455247 -53554e534554 53554e4f434f -53554e444159 535541564531 535455503144 53545255434b @@ -25646,7 +24766,6 @@ 535441534841 535441523333 535441523233 -535353535353 53534e414b45 535245474954 535242494a41 @@ -25655,9 +24774,7 @@ 53504f52544f 53504f4e4759 53504c494345 -53504c415348 535045434941 -535041525441 535041524553 535041494e31 534f554c4a41 @@ -25672,13 +24789,10 @@ 534e59504552 534e4f573131 534e4f4f5459 -534e41504f4e 534d59524e41 534d4f4f5059 534d4f4b454e -534d49545459 534d494c4945 -534d494c4559 534d414c4c31 534c59534c59 534c55525059 @@ -25690,19 +24804,16 @@ 534b49444f47 534954544552 534952454e31 -53494e474c45 53494d4f4e4e 53494d424144 53494c4b4945 5349474e4544 53484f574954 53484f554259 -53484f525459 53484956414d 534849524f57 534849524c45 53484950504f -534845494c41 534841574e53 534841525059 5348414e4559 @@ -25716,13 +24827,11 @@ 534558594d46 534558593233 534558583639 -53455855414c 5345584f3639 534557494e47 534557455253 5345524f5641 53455247554e -534552474559 53454e484153 53454d544558 53454d505245 @@ -25749,7 +24858,6 @@ 53414c4f4f4e 53414c4d4131 53414c494441 -5341494e5453 53414741504f 53414241444f 533145525241 @@ -25763,18 +24871,14 @@ 524f5341444f 524f4d504552 524f47455453 -524f444e4559 524f434b5937 524f434b3232 524f43484132 524f4242454e 524d414e4953 524a4b4d574a -524950504c45 524947485434 -524944455231 524944454155 -52484f4e4441 524842434e42 52465654594d 524656424b4d @@ -25788,8 +24892,6 @@ 524553455453 52454d4f4e54 5245494e4552 -524547474945 -5245444d414e 524544434150 52432e495246 52424345595a @@ -25798,15 +24900,11 @@ 52414e494552 52414e445942 5241494e4553 -5241494e4552 524147474552 524146464c45 524144444144 524144415253 -524143494e47 52314d494e49 -515745525431 -515745415344 515549434845 515545525459 514554554f50 @@ -25835,7 +24933,6 @@ 504f54454e54 504f52515545 504f524e4f47 -504f524e4f31 504f50504f53 504f504c4f50 504f4f503639 @@ -25859,7 +24956,6 @@ 50494e474552 50494d504954 504946464c45 -504945525245 504944444c45 504943484f4e 50484f4f4559 @@ -25870,7 +24966,6 @@ 504552525953 504552524f4e 5045524b494e -50454e4e5931 50454c4f5341 5045494b4b4f 504547475953 @@ -25909,7 +25004,6 @@ 4f4245525354 4f414b4d414e 4e59564f5454 -4e594d455453 4e5832303030 4e55524a414e 4e5435494953 @@ -25980,7 +25074,6 @@ 4d494d494e4f 4d494c4c454e 4d494c4b4552 -4d494c414e4f 4d494b455935 4d494b453230 4d4554524545 @@ -26001,7 +25094,6 @@ 4d4159533234 4d4158584945 4d415858414d -4d4158494e45 4d4158494d49 4d4158353238 4d4154543639 @@ -26013,7 +25105,6 @@ 4d4153313233 4d4152595345 4d41524d4f33 -4d41524c4559 4d41524b4953 4d41524b494e 4d41524b454c @@ -26022,7 +25113,6 @@ 4d41524b3233 4d4152495454 4d4152494f36 -4d4152494e4f 4d4152434833 4d414e555245 4d414e53454c @@ -26032,11 +25122,8 @@ 4d414d415441 4d414c414b49 4d414b534154 -4d41474e554d 4d4147495553 4d4146464941 -4d41444d4158 -4d41444d414e 4d4144414d45 4d4144313233 4d4143444144 @@ -26045,14 +25132,12 @@ 4c55544f4e31 4c5553544552 4c554d504552 -4c55434b5931 4c55434b4545 4c5543494131 4c5336343534 4c504c504c50 4c4f56454431 4c4f56454255 -4c4f554c4f55 4c4f55414e4e 4c4f52444f46 4c4f51554954 @@ -26062,8 +25147,6 @@ 4c4f47494e31 4c4f434f5445 4c4f41464552 -4c4c4c4c4c31 -4c495a415244 4c495456494e 4c4952494b41 4c494f4e5353 @@ -26086,7 +25169,6 @@ 4c4155474853 4c4150555441 4c414e494552 -4c414e434552 4c41444f4741 4c4143554e41 4c4143534150 @@ -26117,9 +25199,7 @@ 4b4c494d4f56 4b4c45564552 4b4c41535345 -4b4b4b4b4b31 4b4b4b373737 -4b495454454e 4b495441524f 4b4954414543 4b494e473535 @@ -26137,7 +25217,6 @@ 2e4b42585246 4b41594f4445 4b4154544552 -4b415452494e 4b4154494557 4b4153534131 4b41524c4954 @@ -26171,7 +25250,6 @@ 4a4f484e3235 4a4f4747494e 4a4f45393939 -4a4f414e4e41 4a4e434e4a51 4a4a4a313233 4a4a39393939 @@ -26180,8 +25258,6 @@ 4a494d4d5935 4a464a464a46 4a4554533132 -4a4553555331 -4a45524f4d45 4a45524b4954 4a45524b4552 4a454e4e594d @@ -26192,7 +25268,6 @@ 4a4544493031 4a424a424a42 4a414e544a45 -4a414e494345 4a414e45544a 4a414e455448 4a414e434f4b @@ -26212,7 +25287,6 @@ 494f44494e45 494e54414b45 494e474d4152 -494d50414c41 494c4f56454d 494c4c494144 49474e4f5245 @@ -26226,7 +25300,6 @@ 4854564a594e 484f54504f54 484f54494345 -484f54424f59 484f524e4552 484f4e4f5253 484f4e45595a @@ -26248,15 +25321,12 @@ 484552444552 48454e445249 48454e444552 -48454c504d45 48454c4c4f37 -48454c454e41 4845454c4552 4845434b4c45 484541525459 484234323335 48415a454c35 -4841594c4559 4841574c4559 4841574b4553 4841574b3133 @@ -26282,7 +25352,6 @@ 475448414e47 475441475441 475255534841 -4752494e474f 47524946464f 475245473132 475245454e39 @@ -26308,7 +25377,6 @@ 4746484a4b4c 474554534558 474554494e31 -4745524d414e 474552474552 47454f47454f 47454f313233 @@ -26317,11 +25385,9 @@ 47454557495a 474544444f4e 474155544945 -4741544f5231 4741534b4554 474152474c45 474150494e47 -47414c415859 474147474c45 47314e474552 46594f444f52 @@ -26342,15 +25408,12 @@ 464f52545931 464f52443939 464f4d494e41 -464c59455253 464c55525259 464c5547454c 464c4f594453 464c4f524953 -464c4f524553 464c49504552 464c494e5431 -464c41534831 464b54524346 464953483131 46495343414c @@ -26363,7 +25426,6 @@ 4649464e4659 464946413038 464656494949 -464646464631 464556455253 46454c544f4e 46454c495853 @@ -26377,7 +25439,6 @@ 4641524f4f51 464147474554 464143454954 -46414249414e 455850414e44 455848414c45 455843454c31 @@ -26391,11 +25452,9 @@ 454e44455253 454d4f424f59 454d4d415553 -454d494e454d 454d4552534f 454d4241524b 454d41494c53 -454c4c494f54 454c495a4131 454c49544532 454c49414e45 @@ -26410,8 +25469,6 @@ 45414d4f4e4e 4541474c4539 445945585246 -44555354494e -44555244454e 44554d415253 44554b453030 4455474f5554 @@ -26423,7 +25480,6 @@ 444f52544845 444f4f474552 444f4f445931 -444f4d41494e 444f47535353 444c4744444d 444a434e4a52 @@ -26439,7 +25495,6 @@ 444947444f47 4449434b3131 444556495454 -444553495245 444550415254 44454e49535a 44454e48414d @@ -26454,15 +25509,12 @@ 444158414441 444157473639 444156494454 -444156494453 444156494436 444156453737 444156453232 44415354494e -44415257494e 444150504c45 44414e4e5953 -44414e474552 44414d4f5245 44414c4c454e 4441494d4f4e @@ -26484,11 +25536,9 @@ 434f55525431 434f534d494e 434f52534152 -434f524f4e41 434f504c4559 434f4e544558 434f4d504153 -434f4d4d4f4e 434f4d4d4954 434f4d494441 434f4d424f53 @@ -26502,8 +25552,6 @@ 434c49543639 43494e44594c 4348554e4741 -434855434b59 -434855434b31 43485249534e 43484f4a494e 43484f434359 @@ -26515,7 +25563,6 @@ 4348494d5053 4348494c4553 434849454659 -434849454653 434849434b31 434845565659 434841523455 @@ -26526,7 +25573,6 @@ 43464e465946 43454e54524f 43454c4c4f53 -43454c494e45 434544415231 434443444344 43424b4d4446 @@ -26535,7 +25581,6 @@ 43415452494e 43415348494e 434152534341 -434152504554 4341524f4c53 4341524c4f32 434152495441 @@ -26543,14 +25588,10 @@ 434150505931 43414f43414f 43414e4f4553 -43414e4e4f4e 43414e494e4f -43414e434552 -43414e414441 43414d4d414e 43414d494f4e 43414c56314e -434145534152 4255544e5554 425553485241 425552424f4e @@ -26562,13 +25603,10 @@ 425332303130 425255434945 42524f544845 -42524f4f4b53 4252494e4b53 4252494a414d 425249414e46 -4252454e5431 425245425245 -4252415a494c 4252414e4453 4252414e4445 425241443232 @@ -26577,15 +25615,12 @@ 424f5544494e 424f54313233 424f4f4b454d -424f4f474552 424f4e4a4f56 424f4e474552 -424f45494e47 424f424f3132 424f42425934 424f42303037 424d57373530 -424c55455331 424c55453735 424c55453334 424c55453234 @@ -26598,13 +25633,10 @@ 424c41434b49 424c41434b42 424c41434b36 -424c41434b31 424b2e495246 424a4f4e4553 424954434832 424954424954 -424953484f50 -42494f4e4943 42494c4c5943 42494c4c5935 42494c4c4552 @@ -26622,13 +25654,9 @@ 42454c494e44 424545424c45 4245434b3639 -424541564552 -424541555459 424541525332 424541434834 42415952414d -424158544552 -4241534b4554 424153494c31 42415252454e 424152434131 @@ -26639,7 +25667,6 @@ 424149534552 424146464c45 424144444159 -424144415353 424143414c4c 424142594b4f 42414259424f @@ -26652,7 +25679,6 @@ 415a45524f4b 4157414b4531 415641415641 -41545441434b 41544f4e414c 415354524153 415353455353 @@ -26672,15 +25698,11 @@ 415052494c39 415052494c34 415052494c32 -41504f4c4c4f -415041434845 -414e55424953 414e54454e41 414e4e494545 414e4e494542 414e4e413838 414e49545241 -414e494d414c 414e44593232 414e44524941 414e414c3639 @@ -26707,7 +25729,6 @@ 414c45583636 414c45583234 414c45583036 -414c41534b41 414c414e4f4e 414c414e4941 414c41494e45 @@ -26717,7 +25738,6 @@ 41464e425646 414641464146 41454b444231 -41445249414e 4144454f4c41 414444455253 4144414d5353 @@ -26726,7 +25746,6 @@ 41434f544543 41434b424152 414348494c4c -4143434f5244 41424e524752 414243434241 414141444444 @@ -27118,17 +26137,14 @@ 315748495445 315656565656 315355504552 -315157455254 315133453554 31513141315a 314d55534943 314a45525259 -3148454c4c4f 314841505059 314652414e4b 31454c564953 314255444459 -314255424241 313939383238 313939383131 313939363132 @@ -27836,7 +26852,6 @@ 5a554c553434 5a4f544f5641 5a4f4f4b4552 -5a4950504552 5a4947475953 5a45524f3131 5a454e4e4552 @@ -27845,12 +26860,9 @@ 5a45454d414e 5a45445a4544 5a4150524554 -5a4150484f44 5a414c4d414e 5a414b415259 5a41494e4142 -595959595931 -59564f4e4e45 59554d4d4d59 594f4f504552 594f44413939 @@ -27864,14 +26876,12 @@ 594153554b4f 59415348494e 59414e4e4943 -59414e4b4545 59414d4f4f4e 59414d414d41 59414d414441 594144495241 594143485453 585859595a5a -585452454d45 584652313834 584550363234 584154554e41 @@ -27886,11 +26896,9 @@ 574f574f574f 574f52443132 574f4e4b4552 -574f4d424154 574f4d414e31 57495a5a4552 57494f534e41 -57494e4e4552 57494e444f4d 57494c4c4545 5749445a4557 @@ -27909,7 +26917,6 @@ 5741524e4f57 5741524d5448 5741524c4f4b -57414c4c5931 5741474f4e53 574141414748 57344e4b3352 @@ -27921,22 +26928,18 @@ 564f56413132 564f4c564943 564f444b4153 -564953494f4e 564950504552 56494f52454c -56494f4c4554 56494b52414d 564746554e33 56464c423232 564645554b42 5645524e4945 5645524e414c -564547455441 564243375549 564158564158 56414e56414e 56414c555441 -56414c455241 564144494d31 563531353048 55594a564252 @@ -27962,26 +26965,20 @@ 545654565456 5455534b4552 545552524554 -5455524e4552 -5455524b4559 545552424f5a 54554d45494f 54554d42494e 5455474e5554 545255444945 -54524f4a414e 54524f444154 5452494d4958 545249464c45 -545249434b59 -545245564f52 5452454e5431 5452414e5341 544f554c4f4e 544f55434859 544f53434131 544f5254494b -544f52524553 544f524d4f5a 544f5245524f 544f50434f4e @@ -27991,7 +26988,6 @@ 544f4d534f4e 544f4d4d5957 544f4d4d4f54 -544f4d434154 544f4c4c4552 544f46415354 544f45544f45 @@ -28026,21 +27022,16 @@ 54454d504f53 54454c4d414e 5445454f4646 -5445454e5331 544541475545 544455545942 5444484a4746 -54415a4d414e 5441554e5553 544153544552 5441534d494e 544153484132 544153434841 -544152474554 54414e544f52 -54414e4e4552 54414d454b41 -54414d415241 54414946554e 544143544943 5441434f5331 @@ -28049,14 +27040,12 @@ 53594e434f4f 5359444e4945 5357494e4731 -535745455459 535745444553 535741535741 535553414e54 535552455459 535550504c45 53555045524b -53554e534554 53554e414b4f 53554b413131 535549544553 @@ -28067,9 +27056,7 @@ 53545255414e 5354524f4245 535452495053 -535452494e47 53544f4e4532 -53544f4e4531 5354494e4759 5354494e4745 53544845494e @@ -28109,9 +27096,6 @@ 534f4b4f4c31 534f44494245 534e4f573639 -534e414b4531 -534d4f4f5448 -534d494c4559 534c4f545338 534c4f545331 534c494d4559 @@ -28129,7 +27113,6 @@ 53494d4f4e32 53494c494341 5349474d4153 -5349474d4152 5349474d4137 5348594f4e45 53484f52494e @@ -28137,8 +27120,6 @@ 534849534841 5348494b4841 534845524d41 -5348454c4c59 -5348454c4c59 5348454c4249 53484545545a 534845424153 @@ -28151,7 +27132,6 @@ 53484142414e 534558594d41 5345524f4741 -53455247494f 534552454a41 534550543235 5345454c4559 @@ -28178,9 +27158,7 @@ 53414e52494f 53414e444d41 53414d4d5933 -53414d4d4945 53414b414e41 -5341494e5453 5341494e5445 534147415241 534146524f4e @@ -28207,7 +27185,6 @@ 524f54415445 524f53534945 524f53453232 -524f53434f45 524f53414e41 524f53414c45 524f50494e47 @@ -28217,7 +27194,6 @@ 524f4d414e49 524f4c4c4f4e 524f47455247 -524f47455231 524f444e494b 524f44313233 524f434b5942 @@ -28240,7 +27216,6 @@ 524548414e41 5245474e4947 5245474e4152 -524547494e41 524547474954 524547414c31 524545524545 @@ -28256,7 +27231,6 @@ 524544313030 5245434b4f4e 524541444954 -52435459425a 52424b4d5246 5242484a4446 52415a564f44 @@ -28283,7 +27257,6 @@ 515741515741 515731324552 51554f52554d -5155494e4359 51554554414c 5155454e5449 515545455253 @@ -28304,7 +27277,6 @@ 505245464142 50524542454e 505150515051 -504f57455253 504f55504545 504f5354454c 504f52544953 @@ -28329,7 +27301,6 @@ 504947474c59 504945504552 504849534832 -5048494c4c59 5048494c4c49 5048494c444f 5048494c3232 @@ -28343,7 +27314,6 @@ 504554455234 504552564552 504550534936 -50454f504c45 50454e4d454e 50454e495337 50454c41455a @@ -28355,17 +27325,13 @@ 504159434f4d 5041554c3639 504154544152 -504154524943 504154313233 504153534f4e 504153533030 5041534b414c 504150504552 50414e545953 -50414c4d4552 50414958414f -5041434b4552 -5041434b4552 5041424c4954 4f5a41524b53 4f5948375534 @@ -28376,7 +27342,6 @@ 4f5244455253 4f5242495431 4f5045524153 -4f4f4f4f4f31 4f4e45313233 4f4d45474136 4f4d41524f56 @@ -28387,14 +27352,12 @@ 4f4a4f4a4f4a 4f4947524553 4f484655434b -4f4646494345 4f4646454e44 4f454a554e4b 4f4345414e37 4e555454494e 4e55514e4548 4e554b4e554b -4e5547474554 4e554449534d 4e5544494553 4e5544474531 @@ -28402,8 +27365,6 @@ 4e5036313638 4e4f57313233 4e4f534e4f53 -4e4f52544f4e -4e4f524d414e 4e4f4c414e44 4e4f4b494136 4e4f484f5045 @@ -28414,7 +27375,6 @@ 4e4a474a4b4d 4e494e453939 4e494e453131 -4e494d524f44 4e494c534f4e 4e494b534f4e 4e494b4e414b @@ -28472,10 +27432,8 @@ 4d4f4e544543 4d4f4e4b4945 4d4f4e455936 -4d4f4e444159 4d4f4d4d4131 4d4f4c4c5959 -4d4f4c4c4945 4d4f4b534841 4d4f49313233 4d4f48414d45 @@ -28484,7 +27442,6 @@ 4d4f354b5641 4d4e4d434d47 4d495449434f -4d4953544552 4d494e50494e 4d494e4b4158 4d494e494d41 @@ -28500,8 +27457,6 @@ 4d494b414c41 4d4944474945 4d4944474152 -4d494348454c -4d49414d4931 4d4554533331 4d4552525931 4d4552435931 @@ -28519,7 +27474,6 @@ 4d4346433839 4d4159424531 4d415858554d -4d4158494d41 4d415454465a 4d4154543133 4d4154534f4e @@ -28538,12 +27492,9 @@ 4d41524a4f4e 4d415249545a 4d4152494c55 -4d4152494531 4d4152494143 4d4152494141 4d4152475553 -4d4152474954 -4d414e55454c 4d414e524159 4d414e4e5953 4d414e444d53 @@ -28555,9 +27506,7 @@ 4d414c4d414c 4d414b534f4e 4d41494e5354 -4d414944454e 4d4148414f4e -4d41474e5553 4d41474d414e 4d414749434f 4d4147494343 @@ -28578,7 +27527,6 @@ 4c504b4f4a49 4c4f574d414e 4c4f56455355 -4c4f56454954 4c4f56453938 4c4f56453435 4c4f56453434 @@ -28593,7 +27541,6 @@ 4c4f474f4e31 4c4f47494331 4c4f47414e58 -4c4f47414e31 4c4f4557454e 4c4f434b5550 4c4f43444f47 @@ -28619,20 +27566,16 @@ 4c4556454e54 4c4554545245 4c4553534545 -4c45534c4945 4c454f4e4152 4c454f444f47 4c4549474841 4c454944454e -4c4547494f4e 4c45434b454e 4c4541504552 -4c4541444552 4c4244465931 4c4156494e41 4c4153455232 4c4152525952 -4c4152525931 4c4152415a41 4c414e4e4945 4c414d4d4552 @@ -28665,7 +27608,6 @@ 4b4f524e4556 4b4f524e4552 4b4f4d4d4552 -4b4f4449414b 4b4f4348414e 4b4c4f564552 4b4b4b4c4c4c @@ -28673,7 +27615,6 @@ 4b4a594c4a59 4b4957493132 4b4954464f58 -4b4953534553 4b4952524131 4b4950504158 4b494e47444f @@ -28692,8 +27633,6 @@ 4b4553484941 4b45504c4552 4b454e4e5944 -4b454c534559 -4b454c4c5931 4b454c42454c 4b454b4b5554 4b454b454b45 @@ -28711,19 +27650,16 @@ 4b4152524945 4b41524e414b 4b415244414e -4b4152415445 4b414d414c49 4b4149534841 4b4145464552 4b414445454d 4b4142414c4c 4b4142414c41 -4a5553544d45 4a5552495354 4a554e49544f 4a554e453131 4a554c593330 -4a554c495553 4a554c494532 4a554c455331 4a5031323334 @@ -28739,20 +27675,16 @@ 4a4f484e3133 4a4f45593131 4a4f424a4f42 -4a4f414e4e45 4a4f414e4e31 4a4f32444548 4a4a414d4553 4a494d4d5954 -4a494d424f31 4a484b4a4446 -4a4554534b49 4a45544a4554 4a455441494d 4a4554313233 4a4553534559 4a4552524945 -4a454e53454e 4a454e4e4148 4a454e444f53 4a454e313233 @@ -28764,7 +27696,6 @@ 4a4159504545 4a41594c594e 4a4156455254 -4a41534d494e 4a41534d414e 4a4152455448 4a414e455454 @@ -28793,7 +27724,6 @@ 494e4a555259 494e46455354 494e46454354 -494e4449414e 494d50554c53 494d474f4f44 494d4147494e @@ -28806,18 +27736,14 @@ 494345424f59 494345414745 494345313233 -494236554239 485944524f53 48555354454e 485548554855 485544485544 -485542455254 485436323336 484f57534552 484f54524f42 -484f52534553 484f524e4545 -484f4f564552 484f4f544348 484f4f524148 484f4f505459 @@ -28828,7 +27754,6 @@ 484f4d453639 484f4d453131 484f4d414745 -484f4c4d4553 484f474d414e 484a56464952 484a4b484a4b @@ -28836,20 +27761,17 @@ 484559313233 48454e4b454c 48454c4c3636 -48454156454e 484541544f4e 484541525432 48424e454b5a 4841594c4945 484156415355 484152525943 -484152524953 4841524c4945 48415242494e 484152415245 484150505059 48414e554d41 -48414e4e4553 48414d4d4554 48414d44414e 4841434b4954 @@ -28857,7 +27779,6 @@ 48324f48324f 4830434b3359 47594d524154 -475553534945 47555247454e 475550505931 47554e534859 @@ -28879,13 +27800,11 @@ 474f57524f4e 474f544f4e45 474f54454348 -474f54434841 474f53544152 474f4c463139 474f4c454d31 474f47495441 474f43415053 -474f424c5545 474c55434153 474c4f424531 474c454e4e41 @@ -28899,7 +27818,6 @@ 47484f535432 47484a495246 4746484a4b5a -4746484a4b4d 47464746595a 474552524152 4745524d4553 @@ -28910,7 +27828,6 @@ 47415a45424f 474154455331 474153303036 -474152434941 474152424552 47414d4d4f4e 47414d424941 @@ -28918,22 +27835,18 @@ 47414c4f4953 47414c4c4552 46554e4f4e45 -46554e4e5931 46554c564941 46554b594f55 465542553035 46534944334e 4652554e5a45 -46524f535459 46524f474552 4652454e5445 -4652454e4348 465245455a41 465245454c59 465245453939 465245443334 465245443130 -465245414b59 4652415a4552 465241554b45 4652414e545a @@ -28943,7 +27856,6 @@ 465155454b4d 4650464b425a 464f5852554e -464f53544552 464f524d4552 464f524d454c 464f52464152 @@ -28952,13 +27864,11 @@ 464f47474552 464c594e4e31 464c55544553 -464c55464659 464c4f52414c 464c48524349 464c45455453 464c414b4559 464b4d41425a -464953484552 4649524b494e 464952494e47 464952453939 @@ -28981,10 +27891,8 @@ 464154504947 464154475559 464152524f57 -4641524d4552 464152495a41 464152474f31 -46414d494c59 464147424f59 464142494f31 4559454c4944 @@ -28993,7 +27901,6 @@ 455843455054 455652494b41 455645545331 -4556454c594e 455448594c31 455445544554 4554414c4f4e @@ -29024,12 +27931,10 @@ 4541474c4534 44594c414e32 4457494c4c41 -44555354494e 44555249414e 44554e4c4150 44554e4b4552 44554e44554b -44554e43414e 44554d423131 44554b455331 44554b453231 @@ -29043,15 +27948,12 @@ 444f5a494552 444f4f47414e 444f4f444552 -444f4e4b4559 -444f4e414c44 444f474f4e45 444f47475353 444f47474544 444f45444f45 444e414c4f52 44495a5a4945 -444956455231 444953434f53 44494e4b5553 44494e4b4945 @@ -29060,7 +27962,6 @@ 44494c415445 44494b4b4945 444947474c45 -44494553454c 444553534945 444553484f4e 444552524943 @@ -29074,9 +27975,7 @@ 444546524147 444545523939 444545445241 -444545444545 444544494b4f -444444444444 444243453531 4441574e3639 444156524f4e @@ -29085,14 +27984,12 @@ 444156453131 444153313233 4441524e4954 -444152495553 444152494d41 444152494131 44415248414e 444150444150 44414e534552 44414e4e5947 -44414e434552 44414e31454c 44414d4f4e53 44414d415249 @@ -29103,19 +28000,15 @@ 4441424f595a 435642313233 4355544f5554 -435552544953 435543494e41 43534d495448 43524f4f4b53 435249544f4e 435043504350 434f55434832 -434f54544f4e 434f5252414c 434f524e4541 -434f52415a4f 434f51554554 -434f50504552 434f50494553 434f4f4c494e 434f4f444552 @@ -29127,7 +28020,6 @@ 434f44593031 434f434f4153 434f434b5353 -434c4f554439 434c4f434b31 434c494e4348 434c454d454e @@ -29144,15 +28036,12 @@ 4348494e4348 4348494c4c31 434849474741 -434845565953 434845564945 4348454c4c59 43484543434f 434841524c41 4348414f5332 4348414e5449 -4348414d5053 -4348414d5031 4348414d414e 434841444459 434647414248 @@ -29170,7 +28059,6 @@ 43415254454c 434152524f53 434152524f4c -434152524945 4341524d494e 4341524c4153 434152455353 @@ -29194,32 +28082,25 @@ 42554e4b5953 42554c4c5931 42554c4c5336 -42554c4c4554 -42554c4c4554 42554c4c454e 42554c474552 4255474c4552 425547475353 -425546465931 425544445939 425544445935 425542424139 4253414c545a 425259475559 -425255545553 42524f574e32 42524f4c4c59 4252494f4e59 425249475559 -425249444745 425249414e52 425249414e4a 425249414e35 -425241564553 425241555345 425241545641 425241534f56 -42524153494c 4252304b454e 424f58424f58 424f575a4552 @@ -29239,7 +28120,6 @@ 424f4f424545 424f4e4e4559 424f4e455232 -424f4e455231 424f4e454341 424f4d4d4552 424f4c4c4945 @@ -29262,7 +28142,6 @@ 424c55453237 424c55453037 424c4f4f4d53 -424c4f4f4459 424c4f4a4f42 424c4f434b53 424c494e4731 @@ -29271,13 +28150,10 @@ 424c414e4559 424c414b4539 424c414b4534 -424c41444553 424c41444533 -424c41444531 424c41434b37 424a43323130 42495a4e4553 -424952444945 42494f44544c 42494e474f32 42494d42414d @@ -29288,9 +28164,7 @@ 424947475931 424947464154 424947455945 -424947444f47 42494742554d -424842495246 4245584c4559 42455449544f 424553494445 @@ -29365,28 +28239,22 @@ 415350415350 41534c574954 415348494d41 -41525455524f 415253484144 41524d424152 4152474f5331 -415243484552 415155494c45 415052494c4c -4150504c4553 4150504c4539 415041524e41 415041434552 414e59544b41 414e4f4e3939 414e4f4d4945 -414e4e494531 414e4e413131 -414e494d414c 414e494b494e 414e4942414c 414e47494e41 414e47494553 -414e47454c31 414e47454c30 414e45535445 414e44593031 @@ -29399,7 +28267,6 @@ 414d415a494e 414d41524f4b 414d414e5445 -414c59535341 414c53544552 414c50484139 414c50484134 @@ -29424,7 +28291,6 @@ 414741544845 414741544131 414741444952 -414652494341 414649474854 41444c455231 414447313233 @@ -29443,7 +28309,6 @@ 414242494531 4142414b414e 4141524f4e38 -414141313131 413133353739 393939393931 393939323232 @@ -29911,7 +28776,6 @@ 314b49545459 314a494d4d59 314841525259 -314441564944 31434f425241 3142494c4c59 3141535a584d @@ -30206,7 +29070,6 @@ 313235363334 313234353637 313234353132 -313233515745 313233504f49 3132334a4b4c 313233345450 @@ -30752,12 +29615,10 @@ 574f4f445331 574f4f444f4f 574f4e474552 -574f4e444552 574f4c463137 574f42424c59 574952454431 57494e544f4e -57494e4e4945 57494e445931 57494c4d4153 5749455a4441 @@ -30774,13 +29635,9 @@ 5743574e574f 5741594e4532 574154455232 -57415252454e -5741524e4552 574152455a5a 574152444552 -574150424253 57414e4b454c -57414c544552 57414c4c5959 57414c4c5953 57414c4c4f57 @@ -30788,12 +29645,10 @@ 574149574149 5652344d3644 565045524544 -564c4144494b 564a59425246 564a5746484e 564a4b59425a 564956455245 -56494f4c4554 56494f4c4131 56465559424e 56464c425946 @@ -30815,7 +29670,6 @@ 56414c453436 56414c444553 56414b554c41 -564144455231 555053494445 5550524f4152 554e49544543 @@ -30826,10 +29680,7 @@ 554348494841 554249544348 5457494e4745 -545745455459 545554544152 -545552544c45 -545552544c45 54555249534d 54554e54554e 54554e494341 @@ -30846,10 +29697,7 @@ 545249474741 545249455531 545249444552 -545249434941 -545245564f52 5452415a4f4d -54524156454c 545241545241 545241434931 545241434545 @@ -30875,7 +29723,6 @@ 544b4a585246 544a42363131 54495a49414e -54494e54494e 54494d544f4d 54494d4d5944 54494d425245 @@ -30884,7 +29731,6 @@ 54494745524e 54494554454e 544943544f43 -5449434b4c45 544943414c31 54484f554748 5448494e4b31 @@ -30892,7 +29738,6 @@ 544845534b59 544845525348 544845524531 -5448454f4e45 544845475559 54484547414d 544845434f57 @@ -30916,7 +29761,6 @@ 54414c4f4641 54414c414e54 54414b454441 -5441434f4d41 5441424c4531 53574549545a 53574545545a @@ -30932,13 +29776,10 @@ 535548524f42 535547415233 5355434b5353 -5355434b5331 5355434b4d59 535542555242 -535455504944 5354554d5031 535452554e5a -535452494b45 535452494354 535452454741 535452415753 @@ -30947,7 +29788,6 @@ 53544f4e4548 53544f4d4154 5354494e4b45 -535449434b31 535445564547 535445564535 535445505550 @@ -31015,7 +29855,6 @@ 53494c414745 5349474d4134 534947323236 -5349444e4559 5349424c4559 534859424f59 5348554c545a @@ -31036,7 +29875,6 @@ 5348414e4553 5348414e454c 5348414e4145 -534841474759 534841464552 534558593133 534557454c4c @@ -31061,9 +29899,6 @@ 53434f555435 53434f545444 53434f524552 -5343484f4f4c -5343484f4f4c -53434841545a 5343414c4941 534153534559 534153484159 @@ -31077,14 +29912,12 @@ 53414e54524f 53414e544552 53414e534f4f -53414e44524f 53414d4f5448 53414d4f4e45 53414d4d5950 53414d4d5947 53414d4d5944 53414d4d5942 -53414d4d4945 53414d4d4931 53414d4d4153 53414d4d414e @@ -31105,16 +29938,13 @@ 5259414e3231 525755534552 525553545959 -525553545931 52555354494e 52555348494e -525550455254 52554e444c4c 52554d424131 525547425953 525542593132 525245454444 -524f59414c53 524f54494d49 524f53453031 524f53414c49 @@ -31123,7 +29953,6 @@ 524f4e4e4f43 524f4d454f32 524f4d414e32 -524f444e4559 524f434b3133 524f434b3131 524f42494e4e @@ -31134,8 +29963,6 @@ 524a56474643 524a49524631 524a49464846 -524956455241 -524950504552 52494c455932 52494c45524f 52494748544f @@ -31143,7 +29970,6 @@ 5249434b5944 5249434b5942 5249434b3031 -524943484945 524943483639 524842434e5a 5246524e4652 @@ -31167,7 +29993,6 @@ 524547313233 524545434531 52454457494e -524544534f58 524544524f53 524544495053 52454445454d @@ -31192,7 +30017,6 @@ 52414a494e49 52414a414e49 5241494e4559 -524149444552 52414845454d 524147484156 524144524154 @@ -31208,11 +30032,9 @@ 5155494e4e31 515549434b59 515549434b53 -515545454e53 515545444f47 515541525259 5155414e5441 -515151515151 515151515132 514245525431 51415a5a5843 @@ -31234,7 +30056,6 @@ 505241424855 505055535359 505050303030 -504f57455231 504f524e4f4f 504f524e3132 504f524e3031 @@ -31261,16 +30082,13 @@ 50495a5a4141 50495a44455a 5049544e4559 -504952415445 504950504950 50494e474f4e 50494e444552 50494b415049 504947475932 -504945525245 504943534f55 5049434b4d45 -5049434b4c45 504943434f4c 5048415a4552 504841524d44 @@ -31293,7 +30111,6 @@ 504154494e41 504153544953 504153535731 -504153534154 504152544945 504152504152 504152495332 @@ -31328,19 +30145,16 @@ 4f4c45474e41 4f4c45414343 4f4c44434152 -4f494c455253 4f4752414459 4f464c4f5645 4f464c494645 4f46424f5247 -4f4445535341 4f4354554252 4f424f424f42 4f424c414b4f 4f424a53454c 4f42494e4e41 4f4153495353 -4e594c4f4e53 4e5554545931 4e554e554e55 4e554d4e554d @@ -31353,7 +30167,6 @@ 4e4f544f4e45 4e4f544e4f54 4e4f534f5641 -4e4f52574159 4e4f52524945 4e4f5041494e 4e4f4f424945 @@ -31379,7 +30192,6 @@ 4e45574b4944 4e4557424f59 4e4556455241 -4e4556414441 4e4554544552 4e45544e4554 4e45544c5044 @@ -31411,7 +30223,6 @@ 4d59534d5554 4d59525a494b 4d594a454550 -4d594749524c 4d57414c5348 4d555a594b41 4d5553494343 @@ -31421,7 +30232,6 @@ 4d53494e464f 4d534144434f 4d5331323334 -4d4f5a415254 4d4f57455253 4d4f56454954 4d4f55534545 @@ -31452,18 +30262,15 @@ 4d4953534953 4d495353494e 4d494e4f414e -4d494e4e4945 4d494e4b4945 4d494e494f43 4d494e494d49 4d494e455454 4d494e453939 4d494d493132 -4d494c544f4e 4d494c4f5244 4d494c4c4f53 4d494c4c4152 -4d494c455331 4d494b455954 4d494b454c4c 4d494b453537 @@ -31486,7 +30293,6 @@ 4d45494d4549 4d4548564553 4d45484f4646 -4d4547414e31 4d45454d4157 4d454449434f 4d4544313233 @@ -31517,10 +30323,7 @@ 4d4152494f37 4d4152494f32 4d415249434f -4d4152494148 -4d4152494148 4d4152494137 -4d4152474945 4d4152444552 4d4152434f50 4d4152434837 @@ -31545,7 +30348,6 @@ 4d414c494e47 4d414c44454e 4d414c414459 -4d414b53494d 4d414b533936 4d414a4f5241 4d41494c4d45 @@ -31562,7 +30364,6 @@ 4d4147313233 4d4146414c44 4d41444d4143 -4d4144444f47 4d4143524f4e 4d4143495a4f 4d4143464c59 @@ -31603,8 +30404,6 @@ 4c4f43414c33 4c4b4a415344 4c495a5a5932 -4c495a5a4945 -4c4954544c45 4c4953544f4e 4c494e555353 4c494e4b4552 @@ -31622,7 +30421,6 @@ 4c45544d454e 4c45544d4543 4c45535a454b -4c454f4e4944 4c454f434154 4c454e4f4952 4c454e34494b @@ -31631,9 +30429,7 @@ 4c4547414c31 4c4545574159 4c45454d414e -4c45454c4545 4c45444f5558 -4c45414e4e45 4c45414e4452 4c4250465159 4c4246595246 @@ -31652,10 +30448,8 @@ 4c4150415441 4c414e56494e 4c414e44454e -4c414e434531 4c414c454e41 4c414b494e49 -4c4147554e41 4c41424c4142 4c3834414438 4c3330373232 @@ -31668,8 +30462,6 @@ 4b52554e4348 4b52534f4e45 4b524156454e -4b52414d4552 -4b4f53545941 4b4f53544941 4b4f534b4f53 4b4f524e3639 @@ -31718,7 +30510,6 @@ 4b454c454245 4b454b53494b 4b4549544841 -4b4549544831 4b45494b4549 4b4545504954 4b4541524e53 @@ -31755,15 +30546,11 @@ 4a554c593130 4a554c49454d 4a554c494546 -4a554c49414e 4a554c494141 -4a554c494131 4a554b4a554b -4a5544495448 4a55414e3233 4a5431323334 4a4f5649414e -4a4f53434849 4a4f4f4b4945 4a4f4e415441 4a4f4b455238 @@ -31778,13 +30565,10 @@ 4a4a39363834 4a495a5a4552 4a494d4d5933 -4a494d424f42 4a455453414d -4a455448524f 4a4553555334 4a4553494b41 4a4552525933 -4a4552525931 4a454e4e5959 4a454e4e4946 4a454e4e4559 @@ -31817,7 +30601,6 @@ 4a414d45534f 4a414d45534e 4a414d455346 -4a414d455331 4a414d424f31 4a414d414953 4a414b453231 @@ -31842,7 +30625,6 @@ 494e48414c45 494e44455831 494d53455859 -494c4f564555 494b494b494b 494732363531 4945434f4e54 @@ -31857,7 +30639,6 @@ 48555a5a4148 485554485554 48554e42554e -48554d4d4552 48554956414d 485455424a59 485450544c46 @@ -31869,17 +30650,14 @@ 484f5050454c 484f4f4c4546 484f4f484141 -484f4e455931 484f4e444136 484f4d455237 -484f4c4d4553 484f49313233 484f47484f47 484f454e4958 484f42494531 484d4d415049 484b31393937 -4849544d414e 484954484552 484953544f52 4849524f3039 @@ -31892,10 +30670,7 @@ 48455353454e 4845534c4f31 4845524e4941 -4845524d4553 48455243554c -484552424945 -48454e544149 48454e525937 48454e455259 48454c4d4552 @@ -31906,16 +30681,13 @@ 484541443639 4841574b3333 4841574b3131 -484157414949 4841564f434b 484156454e53 484156454954 484154484f52 -484152564559 484152544b45 484152525934 484152504f53 -4841524f4c44 484152415353 484150505947 484150505934 @@ -31925,7 +30697,6 @@ 48414c4c4552 48414c494e41 48414c434f4e -4841494c4559 4841494c4545 4841474c4552 48414645455a @@ -31934,13 +30705,11 @@ 475557495035 475553444f47 475553313233 -47554e4e4152 47554e4d454e 47554d4d4945 47554d424545 475549444f47 47554747454e -475545535431 47554456494e 475531544152 4752555a494e @@ -31970,10 +30739,8 @@ 474f4e5a4f32 474f4e444f4e 474f4c4f5341 -474f4c4c554d 474f4c463130 474f4c463032 -474f4c444945 474f4c443737 474f48415244 474f474f3132 @@ -31982,7 +30749,6 @@ 474f41543131 474c41535359 474c41534552 -47495a4d4f31 474956494e47 47494f56414e 47494d4c4931 @@ -31991,7 +30757,6 @@ 474942424552 47484a313030 4748424a4846 -474747474731 47464e484a59 47464b54444a 47464852544e @@ -32007,20 +30772,17 @@ 47454c41544f 47454b544f52 4745494c4552 -4745455a4552 474232333132 474159414e45 47415354524f 4741524d414e 474152474152 -47415244454e 47414c4c4559 47414c495941 47414c415449 4741494e4552 474147474147 46595a313233 -465554555245 46555353454c 465553435553 46554e345553 @@ -32031,14 +30793,11 @@ 465542415232 465259475559 465255495431 -46524f534348 46524f4d544f 46524f473133 46524544454b 465245443632 -465245414b59 4652414e4b42 -4652414e4b31 464f58585859 464f52534558 464f524d4943 @@ -32048,8 +30807,6 @@ 464f4b494e41 464f49424c45 464c4f594444 -464c4f524941 -464c4f505059 464c4950504f 464c494e5453 464c45534859 @@ -32060,16 +30817,13 @@ 46494e444f55 46494e414c31 464946545931 -464945535441 4649454c4459 464942455253 464748313233 46454e494345 -46454e444552 46454c4c4153 46454c495837 46434e465946 -464154484552 464154423059 464152545931 4641524b4153 @@ -32101,10 +30855,8 @@ 454d494c5933 454d4947554f 454d42455253 -454c56495241 454c4c494e41 454c4c454e53 -454c494a4148 454c49454c49 454c49415331 454c464d414e @@ -32133,11 +30885,9 @@ 445550413132 44554e4b414e 44554e44554e -44554e43414e 44554d505459 44554d424f31 44554d415331 -44554c555448 44554c4c4553 44554b453939 44554b453134 @@ -32167,18 +30917,14 @@ 444f4f574f50 444f4f525353 444f4e555431 -444f4e4e4945 444f4e4e4142 444f4e495441 -444f4d494e4f 444f4c4c4f50 444f4c474f56 444f4c434531 -444f47475931 444f47313131 444f45424f59 444f44475931 -444f44474552 444f43454e54 444e4f444e4f 444c31313139 @@ -32208,7 +30954,6 @@ 44454e534f4e 44454e34494b 44454c544f4e -44454c544131 44454c414e45 444545524531 444545504c59 @@ -32232,7 +30977,6 @@ 444152574549 444152545331 444152534f4c -44415252454e 4441524e4f43 4441524b3636 4441524b3132 @@ -32245,7 +30989,6 @@ 44414e43494e 44414d4f4e32 44414d414e4e -44414c454a52 44414953484f 4441494e5459 444146594444 @@ -32267,9 +31010,7 @@ 4352494d534f 435245454b53 435245454348 -435245415445 435241465431 -434f594f5445 434f574d4f4f 434f57415244 434f53494e45 @@ -32283,7 +31024,6 @@ 434f52444f56 434f4f4c4954 434f4f4b4544 -434f4e4e4f52 434f4e474552 434f4e444f53 434f4e43484f @@ -32304,18 +31044,14 @@ 434c45524759 434c4159544f 434c41554459 -434c41554445 434c41535331 434c41524b59 434c41524531 -434c41495245 434a4b4c464e 43494e445943 -43494e444552 434943454c59 43494152414e 434941313837 -434855524348 4348554c4149 4348535a3230 434852495357 @@ -32335,7 +31071,6 @@ 434845455259 434845434b36 434841525453 -434841524c59 434841505049 4348414e4e41 4348414d5041 @@ -32345,7 +31080,6 @@ 43464e454859 43464945595a 4345594c4f4e -434553534e41 434550484153 434550454441 43454c455841 @@ -32353,7 +31087,6 @@ 434543454345 434536414338 43444a4a4c46 -434343434331 434256434256 434243424342 4342414e4348 @@ -32361,7 +31094,6 @@ 43415448594c 43415448414c 434154455241 -434154444f47 434154363636 434154313131 434153554c4c @@ -32370,7 +31102,6 @@ 4341534b4554 43415348454c 434153313233 -434152544552 4341524f4c4c 4341524f4c49 4341524e5554 @@ -32400,7 +31131,6 @@ 425332303230 425255534b49 42524f504859 -42524f4f4b45 42524f4f4b31 42524f434b31 425249545459 @@ -32409,11 +31139,9 @@ 425249414e4c 4252454e5453 4252454d4552 -425245455a45 425241564f32 425241545459 425241535345 -4252414e444f 424f554c4f55 424f54414e59 424f53533132 @@ -32421,7 +31149,6 @@ 424f525a4f49 424f52495353 424f4f4f5459 -424f4f474552 424f4f425931 424f4f424f59 424f4e45594d @@ -32429,10 +31156,7 @@ 424f4d424f4e 424f4b4b4945 424f47494531 -424f47415254 -424f45494e47 424f424d414e -424f42434154 424f42425933 424f42373433 424f41543131 @@ -32453,7 +31177,6 @@ 424a53424a53 424a4f45524e 4249534f4e53 -424952444945 42494e4e4945 42494e4e454e 42494e4d414e @@ -32495,12 +31218,10 @@ 424545525331 424545523232 4245454e4945 -424541525331 4245414c4553 424541424541 424455535459 4244554e4e31 -424242424231 424236365050 42415a5a5931 42415a5a4552 @@ -32523,12 +31244,10 @@ 42414c4c4153 42414c455253 42414c414e53 -42414747494f 424147474544 424144474952 424144474153 424144444144 -424144424f59 424143435553 424143415244 424143413037 @@ -32541,14 +31260,11 @@ 4156494c4553 415649414e4f 4156454e4952 -415641544152 415544493930 415454495453 415454455354 415454454e44 -41545441434b 415454393233 -41545f415350 4153544f4e31 415353495349 41535346414e @@ -32556,12 +31272,9 @@ 415350313233 415344464736 415344373839 -415344313233 415255534841 -415254495354 41525241434b 41524b414441 -415243484945 415241474f52 415053415241 4150504c4534 @@ -32586,16 +31299,12 @@ 414d42455254 414d41444555 414d31323334 -414c57415953 414c54455231 414c4c534558 -414c4c414e31 414c4c345537 414c4c345536 414c4c345534 414c494a4f4e -414c49434941 -414c49434531 414c46495941 414c45583933 414c45583535 @@ -32610,7 +31319,6 @@ 414959414e41 4149544b454e 4149524f4e45 -41494b49444f 414931333730 4148414d4159 4146594e4a56 @@ -33175,7 +31883,6 @@ 323030303130 315645545445 31545255434b -315449474552 315445584153 315350454544 3152554c455a @@ -33184,10 +31891,8 @@ 31504c555331 314d4f4f5345 314c494e4441 -314b49545459 314b4556494e 314b454e4e59 -314a414d4553 31484f4e4441 314752454154 314741544f52 @@ -33575,7 +32280,6 @@ 313233444444 313233345a58 313233343930 -31323334354d 313233343432 313233343334 313233333132 @@ -34171,7 +32875,6 @@ 5a454e4d414e 5a454c444153 5a4156414c41 -5a4151575358 5a4150504153 5a414e414455 5a414c595041 @@ -34179,7 +32882,6 @@ 5a304d423133 59595a59595a 595942595942 -595645545445 595554414b41 59524b4f4f4e 594f554e4747 @@ -34215,8 +32917,6 @@ 574f4f4c4c59 574f4f464945 574f4f445933 -574f4f444945 -574f4e444552 574f4d454e31 574f4c4c454e 574f4c4b454e @@ -34255,7 +32955,6 @@ 573257325732 57315a415244 5730304b4945 -56554c43414e 564f4e564f4e 564f4e444131 564f4c4f4459 @@ -34276,17 +32975,13 @@ 564746554e35 56464b53494d 5646484e5359 -5646435a595a 5645544d414e -564552454e41 564552414e4f 56454e545553 56454e45544f 56454e444f52 -56454c564554 56454b544f52 564547415353 -564543545241 564248564248 5642414c4c31 564153415241 @@ -34295,7 +32990,6 @@ 56415254414e 56414c56414c 56414c494b4f -56414c455241 56414c444953 5641494c3939 564149444153 @@ -34305,19 +32999,16 @@ 55524d454c49 55524c4f5244 555241555241 -555044415445 554e4c563936 554e49534558 554e44494e45 554e44455253 554c54524137 -554c52494348 554b524e4554 554a4e583332 55485457425a 554842414a59 554650544e46 -55464b425946 554543544446 55444a504c4d 5544414d414e @@ -34336,7 +33027,6 @@ 54554a484a44 545546464945 545542425953 -545454545431 545454525252 5453484f4f54 545348495254 @@ -34349,7 +33039,6 @@ 54524f57454c 54524f4f5053 54524f4f5045 -545249584945 545249554d50 545249554d46 5452494e4b41 @@ -34361,14 +33050,12 @@ 545245495a45 545245415459 54524143544f -545241434559 54523635494b 544f55504945 544f54414c4c 544f54414c45 544f53544552 544f524e4144 -544f50434154 544f4f544853 544f4f4c4559 544f4f464152 @@ -34379,7 +33066,6 @@ 544f4d494b41 544f4d41534f 544f4c535459 -544f4c45444f 544f4b4c4154 544f44474552 544f42425931 @@ -34410,7 +33096,6 @@ 544845574542 544845504954 5448454d4158 -5448454d414e 544845474150 544841544348 544731333833 @@ -34428,10 +33113,8 @@ 544543484552 54435459425a 544155544f47 -544154544f4f 544154494e41 544154413132 -544153484131 544152475553 54414e554841 54414e4e4f59 @@ -34459,31 +33142,24 @@ 535731544348 535643455854 53555a5a4945 -53555a554b49 53555a554b41 535553484d41 535553414e52 535553414e44 535552494e41 535552464646 -535552464552 535552463131 535550455243 535550455236 535550455234 53554e4e5959 -53554e4e5931 53554e444145 53554d45524b 53554d454554 -53554c54414e 53554b493132 53554b484f49 -535545525445 -5355434b4552 535542535542 5355424c494d -535455415254 5354524f4c4c 535452414b41 535452414449 @@ -34505,7 +33181,6 @@ 535441523133 5354414e5a49 535441434b59 -535441434559 5353574f5244 535353353535 535331323334 @@ -34514,22 +33189,14 @@ 535155495a5a 535155494e54 535155414c4f -5350554e4b59 -5350554e4b59 535055443235 -53504f525453 -53504f525453 -53504f525431 -53504f4f4b59 535045434b53 535045434945 535045414b31 5350414e4b4d 5350414d4552 -535041494e31 534f5857494e 534f55544832 -534f554e4431 534f53534531 534f53393131 534f52454e31 @@ -34551,7 +33218,6 @@ 534d4f4b5931 534d49544837 534d494c4c41 -534d494c4553 534d494c4545 534d494c4534 534d45525348 @@ -34583,7 +33249,6 @@ 5349524f5441 53494f555831 53494e544552 -53494d504c45 53494d50454c 53494d494f4e 53494b544952 @@ -34599,18 +33264,13 @@ 53484f424841 5348494f5249 5348494d4f4e -5348494c4f48 -534845525259 -534845494c41 534845455348 534845455241 534845424c4f 534845415448 534844495350 -534841594c41 53484159414e 534841574e59 -534841535441 534841524e41 534841524144 5348414d4f4f @@ -34629,7 +33289,6 @@ 5345524d4f4e 534552474531 53455054454d -53454e4e4131 53454e484131 53454d313233 53454c505041 @@ -34641,13 +33300,11 @@ 53454154544c 53454147414c 534355464659 -534355424131 534355333136 5343524f5445 53434f54544c 53434857554c 53434855545a -534348554c45 5343484f4b4f 534348495354 534348454d41 @@ -34702,7 +33359,6 @@ 525553313233 52554e4f5554 52554e4f4646 -52554e4e4552 52554e4b4c45 52554d4d454c 52554d415441 @@ -34727,14 +33383,11 @@ 524f4d34494b 524f4c4c4558 524f4b4d414e -524f47455253 524f47455244 524f47455242 -524f444d414e 524f44444945 524f434b3135 524f43434f4f -524f42594e31 524f42444f47 524f42424f31 524c47333437 @@ -34745,7 +33398,6 @@ 52494c455953 5249434f4c41 5249434b5953 -524943484152 524943483939 524943483133 524943483132 @@ -34765,11 +33417,8 @@ 524554524f50 52455349474e 524553454441 -524553435545 -524553435545 524550494e53 52454e4e4553 -52454e415441 52454d4f4f42 52454d4f3137 52454d4c4150 @@ -34780,20 +33429,14 @@ 524546554e44 5245454e4945 524544544147 -52454452554d -52454452554d 524544524f43 52454452414d 5245444e4158 -524544444f47 524544343434 524544323334 5245434f4e37 -524541504552 5245414c3131 -524248424b4b 52415a5a4f52 -524156454e53 524156454e35 5241554e4348 524154484552 @@ -34803,7 +33446,6 @@ 52414e47454c 52414e445950 52414e445944 -52414e444f4d 52414e434831 52414a313233 5241494e3132 @@ -34822,7 +33464,6 @@ 515745525455 515745525449 515745523435 -515745313233 51554f544553 5155494e544f 5155494d4943 @@ -34856,7 +33497,6 @@ 505245455459 505241424841 504f57455236 -504f54544552 504f54534945 504f53534552 504f53414441 @@ -34865,7 +33505,6 @@ 504f524b5953 504f52474945 504f52393131 -504f504f504f 504f504f4c49 504f504d414e 504f5043414e @@ -34880,7 +33519,6 @@ 504f4c494e47 504f4c454e4f 504f4c415249 -504f49534f4e 504f435a5441 504c554d4553 504c49455253 @@ -34903,8 +33541,6 @@ 50494c4f5435 50494c415445 50494a50454e -5049474c4554 -5049474c4554 504945333134 504943544f4e 5049434d414e @@ -34930,7 +33566,6 @@ 504550493132 50454d444153 504545544945 -5045434b4552 504541524c32 504541434853 504332303039 @@ -34941,12 +33576,10 @@ 504154524153 504153533333 504153484f4b -504152524f54 5041524c4f52 5041524c4559 5041524b4159 5041524b3131 -504152495331 50415245544f 50415241444f 504152414441 @@ -34956,7 +33589,6 @@ 50414e474541 50414e455241 50414e444132 -50414e414d41 50414d504552 50414d414c41 504147414e4f @@ -34974,7 +33606,6 @@ 4f534b415231 4f5254484f31 4f5249414e45 -4f5245474f4e 4f5242495453 4f5054494d55 4f50504f5050 @@ -34992,14 +33623,11 @@ 4f4c44524544 4f4c444f4c44 4f4b45454645 -4f4859454148 4f484f484f48 4f48454e5259 4f4755524543 4f474f524f44 4f46454e3636 -4f44454e5345 -4f4345414e4f 4f4345414e4f 4f4345414e41 4f424f4c4f4e @@ -35010,7 +33638,6 @@ 4e594d504853 4e555253494e 4e5552534559 -4e555242454b 4e554c4c4552 4e4f54534f42 4e4f54494f4e @@ -35022,11 +33649,9 @@ 4e4f4d555241 4e4f4d414432 4e4f4b4b4552 -4e4f46454152 4e4f44494345 4e4d41534e54 4e4953484154 -4e494b4f4c41 4e494b4b4f4e 4e494b373737 4e4947494e41 @@ -35056,7 +33681,6 @@ 4e4154413535 4e4154413135 4e415352494e -4e415255544f 4e414e435942 4e414b454453 4e4144494e41 @@ -35065,9 +33689,7 @@ 4e30524d414e 4d5950555353 4d594f484d59 -4d594c4f5645 4d59444f4747 -4d5554544f4e 4d55534d5553 4d5553414556 4d555253494b @@ -35108,13 +33730,11 @@ 4d4f4f4e3132 4d4f4f434831 4d4f4e545950 -4d4f4e545931 4d4f4e544552 4d4f4e495155 4d4f4e455942 4d4f4e455930 4d4f4e415348 -4d4f4e41434f 4d4f4e344d45 4d4f4d4f4633 4d4f4d4f3939 @@ -35138,7 +33758,6 @@ 4d4953545933 4d4953545241 4d4953544545 -4d4953535931 4d49534d4953 4d495349414b 4d49524f4b55 @@ -35146,12 +33765,8 @@ 4d494e545455 4d494e544f4e 4d494e4f5255 -4d494e4e4945 -4d494e475553 4d494e434552 -4d494c4c4945 4d494c495441 -4d494c414e4f 4d494b4b4931 4d494b455331 4d494b454c31 @@ -35165,7 +33780,6 @@ 4d494b41494c 4d4948454556 4d4943484945 -4d494348454c 4d4943484131 4d4941544153 4d4745333633 @@ -35184,9 +33798,7 @@ 4d454e544f4c 4d454e47414f 4d454d4f5245 -4d454c56494e 4d454c54454d -4d454c4f4459 4d454c4c4552 4d454c494e45 4d454b4f4e53 @@ -35212,7 +33824,6 @@ 4d415a444137 4d41594c494e 4d4159414e4b -4d41584d4158 4d4158313030 4d4156524943 4d415552494e @@ -35227,13 +33838,9 @@ 4d4153594e59 4d4153534946 4d4153414b4f -4d415256494e -4d4152544841 4d4152524945 -4d41524c494e 4d41524c4945 4d41524b454e -4d41524b4544 4d41524b4159 4d41524b3735 4d41524b3535 @@ -35244,9 +33851,7 @@ 4d4152494c59 4d4152494554 4d4152494150 -4d415249414e 4d4152494147 -4d4152494131 4d4152434f4e 4d4152434f4d 4d4152434835 @@ -35267,9 +33872,7 @@ 4d414d414e53 4d414d413535 4d414c544131 -4d414c4f4e45 4d414c4c4f57 -4d414b534154 4d414b50414c 4d414b414841 4d414a4f5232 @@ -35313,8 +33916,6 @@ 4c4f584c4559 4c4f57454e44 4c4f57444f47 -4c4f56494e47 -4c4f56454c59 4c4f56453235 4c4f56453138 4c4f55524445 @@ -35338,7 +33939,6 @@ 4c4f44474531 4c4f434f4d4f 4c4f434b4531 -4c4c4c4c4c4c 4c4b4a313233 4c4a5642594a 4c495a413232 @@ -35361,7 +33961,6 @@ 4c494c4a4159 4c494c424f4f 4c494b4c494b -4c49434b4552 4c4942455241 4c464c464c46 4c455a47494e @@ -35370,9 +33969,7 @@ 4c4557495353 4c4556454e53 4c45554d4153 -4c4553544552 4c4550414353 -4c454e4e4f4e 4c454e4c454e 4c454e444552 4c454d4d5931 @@ -35394,7 +33991,6 @@ 4c414e47454e 4c414e444553 4c414e444544 -4c414e434552 4c414d424945 4c414d424552 4c414d415231 @@ -35441,7 +34037,6 @@ 2e4b4d584252 4b4c4f4b4c4f 4b4c41555331 -4b4c41555331 4b4b4b4b3838 4b4a48474644 4b4a4554494c @@ -35454,7 +34049,6 @@ 4b494e474f46 4b494e445241 4b494d4d494b -4b494d424552 4b494d414e49 4b494c4c5541 4b494c4c3132 @@ -35471,14 +34065,11 @@ 4b454e574f4f 4b454e4e5937 4b454e4a4953 -4b454c534559 4b454c4c5944 4b454c4c5937 -4b454c4c4559 4b454c4c4545 4b4549544859 4b4549544832 -4b4545504552 4b4545464a45 4b4541524e59 4b4243425746 @@ -35487,7 +34078,6 @@ 4b4159444545 4b4154494535 4b4154485939 -4b4154485931 4b4154454e41 4b4154453633 4b41524e454a @@ -35496,7 +34086,6 @@ 4b4152454e42 4b414f544943 4b414e544f52 -4b414e534153 4b414e4e4f4e 4b414d4f5445 4b414c414e5a @@ -35534,9 +34123,7 @@ 4a4f4e444f45 4a4f4c594f4e 4a4f4c45454e -4a4f4b455253 4a4f4b455235 -4a4f4a4f4a4f 4a4f484e5935 4a4f484e4a4f 4a4f484e3536 @@ -35553,7 +34140,6 @@ 4a4c45574953 4a4b4c4c4b4a 4a4a4c4a4a4c -4a4a4a4a4a4a 4a4a4a313131 4a495a5a554d 4a494d4d594b @@ -35562,7 +34148,6 @@ 4a4947474c59 4a484e323338 4a4554544132 -4a4553544552 4a4553534931 4a4553534552 4a455353454a @@ -35605,7 +34190,6 @@ 4a414e453639 4a414e453131 4a414d4d5931 -4a414d4d4552 4a414d494547 4a414d454e53 4a414d424f4e @@ -35633,13 +34217,10 @@ 495a4d41494c 4954554e4553 4954534d4531 -4954414c4941 495354415249 -49535241454c 49534d494e45 495349534953 49524f424f54 -49524c414e44 495249534832 494f504a4b4c 494f4e49414e @@ -35649,17 +34230,14 @@ 494e5354414c 494e4c414e44 494e47414e47 -494e4449474f 494e43554255 494d414e4931 494953465450 -494949494931 49474f523132 4945484f5354 494357524553 4943534d4752 494341544552 -494341525553 4941534e4150 49414d303037 4855534b4559 @@ -35682,15 +34260,12 @@ 484f544d454e 484f52524944 484f524e5936 -484f524e4554 484f52414349 -484f50504552 484f504b494e 484f4f564553 484f4f50494e 484f4f484148 484f4f434859 -484f4e444131 484f4d49455a 484f4d455931 484f4d455252 @@ -35704,17 +34279,14 @@ 484a4b4e4a59 484a484a484a 484954444f47 -48494d555241 484947313030 48494444454c 484855474552 -484848484848 484559424f59 4845534f5941 484552534559 484552524552 4845524f4c44 -4845524f4553 4845524d4945 484552484552 484552415353 @@ -35725,7 +34297,6 @@ 48454e4e4552 48454c4e4552 48454c4c4f30 -48454c454e41 48454c41444f 4845454c5331 484543554241 @@ -35735,15 +34306,12 @@ 484441323658 484431333430 484159444f4e -48415944454e -4841574b5331 4841574b494e 4841564f4331 48415646554e 4841554c4552 48415547454e 484154544f4e -484152504552 4841524f4f4e 484152494b41 484152444c59 @@ -35754,17 +34322,13 @@ 48414e47494e 48414d535445 48414d4d4152 -48414d4c4554 48414c534559 48414c4f3232 48414c4f3133 48414c495445 48414c455953 -4841494c4559 -484148414841 484147474c45 484144455331 -4841434b4552 483332334343 483042423154 475950534559 @@ -35790,12 +34354,10 @@ 475245473231 475241504531 4752414e5453 -47524148414d 475241445931 475241434544 475045444954 474f54495431 -474f54434841 474f5432474f 474f53554e53 474f52544f4e @@ -35817,30 +34379,24 @@ 474f4c443232 474f4c443231 474f4c443131 -474f474f474f 474f44574954 474f4444414d -474f424c494e 474f41545353 474d43313233 474c594e4953 -474c4f42414c 474c45424f56 474c41535331 47495a5a4945 47495a4d4f4f -474956454d45 47494e413638 47494e413031 47494c524f59 47494c47494c 47494a4f4531 -47484f535431 47484a4e4a59 47484a313233 474847484847 47484256464e -47484244544e 474747313233 4746494e544e 4746444b4259 @@ -35848,8 +34404,6 @@ 474554424947 4745524f4d45 47455249434f -474552415244 -474552414c44 47454f524449 47454f4c4157 47454e494553 @@ -35867,7 +34421,6 @@ 474152593639 474152593031 474152525931 -474152524554 474152434845 47414d494e45 47414d494153 @@ -35888,14 +34441,11 @@ 46554e4b5932 46554e444159 46554c4d4552 -4655434b4d45 4655434b3133 465542415253 46524f4d4d45 -46524f4d4d45 46524f473232 465249545a49 -465249444159 465245455345 465245453433 465245453131 @@ -35908,7 +34458,6 @@ 464f584f4e45 464f58393030 464f5442414c -464f52594f55 464f524e4158 464f524d414c 464f52445055 @@ -35929,7 +34478,6 @@ 464952453131 46494e4e4945 46494e47414c -46494741524f 4649454c4431 464942554c41 464735363332 @@ -35942,8 +34490,6 @@ 464544453452 464542524552 464453464453 -464154484552 -464154434154 464154414c45 464154414c31 464154313233 @@ -35984,7 +34530,6 @@ 454e54524552 454e54455235 454e52494341 -454e49474d41 454e4552474f 454e454d4153 454e414d4f52 @@ -36004,10 +34549,8 @@ 454c4b544f4e 454c4b494e41 454c4b434954 -454c495a4131 454c494f5454 454c454e4141 -454c41494e45 454846554659 45474e41524f 454747454747 @@ -36055,7 +34598,6 @@ 445245573232 445245444745 445245415259 -445245414d53 445245414459 445245414432 445244524452 @@ -36076,19 +34618,14 @@ 444f4f444141 444f4e4e5931 444f4e4e414d -444f4e4e4131 444f4e454c4c 444f4c504859 444f4c4c5953 -444f4c4c5931 444f494e4954 444f47534558 444f47533132 444f474f4f44 -444f47474945 444f47363636 -444f44474531 -444f44474531 444f43494c45 444e4b524f5a 444d41524945 @@ -36106,13 +34643,11 @@ 444950444950 44494f4e4e41 44494f444553 -44494e415241 44494d4f4e44 44494d413233 444947495250 444946464552 444944494e45 -4449434b4945 4449434b3130 444656444656 444654343546 @@ -36120,12 +34655,10 @@ 4445564f5245 4445564f4e37 4445564f4944 -444556494c53 444556494c4c 444555434553 4445544e4557 444553504f54 -444553495245 444553444553 44455331474e 444552454b4d @@ -36134,7 +34667,6 @@ 44454e595345 44454e4d414e 44454e474552 -44454e414c49 44454e314b53 44454d4f4e4e 44454d494e47 @@ -36145,8 +34677,6 @@ 444544453131 444542524953 4445414e4f53 -4445414e4e41 -444541434f4e 444454444454 444444333333 444431323334 @@ -36166,8 +34696,6 @@ 44414e4e4953 44414e495441 44414e444545 -44414e434552 -44414e434531 44414e393939 44414d41534b 44414d304e31 @@ -36176,8 +34704,6 @@ 44414c454533 44414b305441 444149535935 -444147474552 -4441454d4f4e 444145444145 44414444594b 444144445935 @@ -36203,17 +34729,14 @@ 43524f4d4552 43524f424152 43524a48465a -435245535441 435245455053 435245454453 4352415a4545 435241494732 435043503333 434f574d454e -434f534d4f31 434f52534f4e 434f52524559 -434f50504552 434f5041494e 434f4f4c484b 434f4f4c3231 @@ -36221,17 +34744,14 @@ 434f4e555245 434f4e524f44 434f4e4e4553 -434f4e4e4552 434f4e474f31 434f4d505241 434f4d503130 434f4d434154 -434f4c543435 434f4c4c4545 434f4c494e45 434f4c425931 434f48454e31 -434f46464545 434f444d414e 434f434f3939 434f4255524e @@ -36256,7 +34776,6 @@ 434849524147 4348494c4931 434849454d49 -434849454653 434849434845 43484554414e 4348454d4953 @@ -36269,9 +34788,7 @@ 4348415a5a59 434841594b41 434841503232 -4348414f5331 4348414e4749 -4348414e454c 4348414d454c 4348414d424f 434841444552 @@ -36281,7 +34798,6 @@ 434554455241 43455349554d 43455257494e -43454e544552 43454c4c4f31 43454c454231 43454b4e4659 @@ -36289,23 +34805,17 @@ 434446484a55 434354455354 434343323232 -434252363030 434245415253 434231324353 434154545931 434154485953 434154484552 -434154313233 -434153544c45 -434153544c45 43415353414e -434153484544 434153483131 4341524d4152 4341524c4545 434152454341 4341504f5445 -43414e4e4f4e 43414e454d45 43414e445934 43414e444953 @@ -36318,10 +34828,8 @@ 434149524f31 434144434144 43414252414c -433248354f48 43304d504151 4259424c4f53 -425554544f4e 425554543639 425553484944 4255524e4554 @@ -36329,7 +34837,6 @@ 42554c4c3639 425547475931 425547475359 -425547474552 425547424f59 4255454e4153 425544445936 @@ -36340,10 +34847,8 @@ 425542424147 425542424142 425542424135 -425259414e54 425255434545 425255425255 -42524f574e31 42524f544841 42524f4f4d45 42524f434b59 @@ -36380,7 +34885,6 @@ 424f53533232 424f53533031 424f53434f4f -424f52495331 424f52474952 424f5247454e 424f52454431 @@ -36391,9 +34895,7 @@ 424f4f544859 424f4f544845 424f4f4d3639 -424f4f4b4552 424f4f474131 -424f4f424f4f 424f4f424c45 424f4e555331 424f4e473639 @@ -36423,7 +34925,6 @@ 424c55453239 424c55453139 424c55434154 -424c4f574d45 424c4f55494e 424c4f53534f 424c4f4f4d59 @@ -36444,29 +34945,23 @@ 424952444f47 424952443833 42494e4b4559 -42494e474f31 42494e444c45 42494c4f5849 42494c4c5948 42494c4c5938 42494c4c5353 42494c4c4d45 -42494c4c4945 42494c4c3138 42494c4c3136 42494c4c3131 -42494b494e49 42494b453030 42494757494c -424947524544 4249474b4944 424947484154 -424947474945 424944444c45 42494350454e 4249424c494f 4249424c4941 -4249414e4341 42494147494f 424855444441 4248414b5449 @@ -36475,11 +34970,8 @@ 4245594f4e43 424554545945 424553484159 -424552544945 -424552474552 42454e5a494e 42454e54454e -42454e534f4e 42454e4e5942 42454e4e4953 42454c4c4545 @@ -36488,11 +34980,8 @@ 42454c494552 42454c44494e 42454c414d49 -424545544c45 424545523031 4245444f4f50 -4245434f4f4c -424541564953 42454154454e 424541524453 424541523534 @@ -36500,7 +34989,6 @@ 424541523130 424541434835 424342434243 -4241594c4545 424157424147 424153544941 424153534149 @@ -36511,7 +34999,6 @@ 42415249554d 424152435553 424152415348 -42414e4e4552 42414e4a4552 42414e475553 42414e474c45 @@ -36541,10 +35028,7 @@ 415649313233 415647373136 415645535441 -4156454e5545 415645444953 -415553534945 -4155524f5241 415544495333 415544495137 415541554155 @@ -36563,7 +35047,6 @@ 415348414b49 4153454c5941 415344464746 -415344464731 415344463232 415344373737 415344303938 @@ -36610,7 +35093,6 @@ 414e4b555348 414e49474156 414e47555332 -414e47555331 414e44494b41 414e44494553 414e434f5241 @@ -36622,7 +35104,6 @@ 414d4d415241 414d4952414e 414d47454d53 -414d45524943 414d454c4b41 414d42455257 414d42455237 @@ -36634,7 +35115,6 @@ 414c54414e41 414c53414345 414c50494e4f -414c50494e45 414c50484136 414c50414e41 414c4d415359 @@ -36679,7 +35159,6 @@ 4144454c494e 4144454c4531 414441564953 -4144414d5331 4144414d4f56 4144414d4b4f 4144414d3139 @@ -36714,7 +35193,6 @@ 414130334748 413332303835 413142325633 -413131313131 394938553759 3942414c4c53 393939494949 @@ -36827,7 +35305,6 @@ 353535414c49 353535393131 353535353556 -35353535354e 353535353534 353535353530 353535353131 @@ -37320,7 +35797,6 @@ 323131323333 323131313633 323131313631 -323131305345 323131303937 323131303731 323131303636 @@ -37392,15 +35868,11 @@ 323030303035 315641444552 31545552424f -31545255434b 315357454554 31535553414e 315355474152 315354554646 -315354455645 -31534d495448 315332533353 -31524f434b59 31524f42494e 3150494c4f54 314c49474854 @@ -37409,13 +35881,11 @@ 314a41534f4e 31474e454b31 314649534831 -314255444459 31424c554553 3142494e474f 314241424553 314153444647 31414d424552 -31414d424552 313939393132 313939373130 313939363237 @@ -38511,7 +36981,6 @@ 5a59465a5946 5a5853444552 5a5852373530 -5a5843313233 5a5831313030 5a554d5a554d 5a5542494c4f @@ -38523,7 +36992,6 @@ 5a4f52424131 5a4f4f544552 5a4f4f544544 -5a4f4d424945 5a4f454c3639 5a4d4f44454d 5a494e5a414e @@ -38543,7 +37011,6 @@ 59554c495441 59554b415441 5954544f4353 -594f594f594f 594f55534546 594f55383132 594f53534859 @@ -38553,7 +37020,6 @@ 594f32313231 594e4e484f4a 594950504945 -59464e464946 59464859425a 5946434e5a5a 5946434e4252 @@ -38563,7 +37029,6 @@ 59454b43494d 594548594548 5944325a4657 -594252424e46 59415a5a4945 594159594159 59414e4b4d45 @@ -38573,11 +37038,9 @@ 585858434343 585858333231 585858303030 -585452454d45 584958495849 584952434f4d 58464f524345 -5846494c4553 584647465444 584558544b4a 58454c544346 @@ -38586,7 +37049,6 @@ 575757414141 575358585357 575348455854 -575249474854 575241505550 574f54414e31 574f524b4f4e @@ -38598,7 +37060,6 @@ 574f4c463234 57495a5a4945 574954484552 -574953444f4d 57494e5a4950 57494e455253 57494e445550 @@ -38612,7 +37073,6 @@ 574849544552 574849544259 574849505059 -574845454c53 574845415453 574841434b59 5745544d414e @@ -38634,8 +37094,6 @@ 574433333233 5741594e4542 5741594e4535 -5741594e4531 -574154534f4e 574154434853 574154415255 5741524d5550 @@ -38643,19 +37101,15 @@ 57414d4d4553 57414c534831 57414c4b454e -5741474e4552 5741444d414e 5741434b5931 5741434b4544 -573853544544 57314e544552 57314e543352 57314c4c3057 573139343253 573132333457 57304d424154 -565656565631 -56554c43414e 565236565236 564f59554552 564f4e474f45 @@ -38682,7 +37136,6 @@ 5649454a4153 564944454f32 564944414449 -5649434b4945 5649434b4559 564746554e39 564746554e36 @@ -38716,16 +37169,13 @@ 56414c554531 56414c494e45 56414c313233 -564147494e41 564147415259 56314b314e47 555448455231 555445584153 555357455354 -55534e415659 55534d433638 555341465350 -555253554c41 555244454144 555057494e44 555053555053 @@ -38733,13 +37183,11 @@ 555048454c44 554e53414645 554e52554c59 -554e5245414c 554e4f444f53 554e49434546 554e47415741 554e44494349 554c5452414d -554c52494b45 554a594c4a59 55484659424e 55464f55464f @@ -38761,8 +37209,6 @@ 54554f4d4153 54554e475553 54554e455331 -54554e445241 -54554c495053 54554a484252 545545533139 545541505345 @@ -38787,7 +37233,6 @@ 545241564552 5452414e474f 5452414e4553 -545241494e31 545241464943 545241435953 544f574e4553 @@ -38825,18 +37270,14 @@ 54494d455331 54494d454953 54494d424f31 -54494d424552 -54494d424552 54494d373737 544947455245 -544947455232 544941544941 54484f524158 54484f523132 54484f523131 544849455252 544845544f50 -5448454d414e 5448454c4157 544845485554 544845484154 @@ -38851,7 +37292,6 @@ 5445544f4e41 544554484552 544554453734 -544553544552 54455354454e 544553543535 544553543233 @@ -38869,7 +37309,6 @@ 5445434c4953 544543483630 544543483131 -5445414d3358 544442454152 544354594259 544245415231 @@ -38880,12 +37319,10 @@ 5441544d414e 544154495441 5441524c414e -544152474554 544152413939 544152313233 544150504554 54414e594841 -54414e4b4552 54414e495331 54414e494131 54414e474f39 @@ -38920,7 +37357,6 @@ 53594b4b454c 53594249414e 53574f524437 -535745455453 535745455444 535745455438 535745455436 @@ -38933,7 +37369,6 @@ 535553484958 535553414e32 535552474531 -535552464552 53555246454e 535552463639 535550535550 @@ -38951,22 +37386,15 @@ 53554c4c454e 53554c494b4f 53554b534553 -535547415231 535545313233 535542535953 -5355424d4954 5354594c494e 5354594c4531 -535455464631 535455444552 535455444441 535455434b59 -5354524f4e47 535452415053 535452414645 -53544f524d59 -53544f4e4552 -53544f4e4552 5354494d4559 535449474759 535445564554 @@ -38976,7 +37404,6 @@ 535445494e45 535445454c32 53544156524f -535441544531 535441533131 535441525432 535441524b45 @@ -38992,10 +37419,8 @@ 53515541434b 535059535059 535059475559 -535059444552 535055445331 535055443131 -535052495445 535052414e47 53504f524531 53504f4f4f4e @@ -39008,10 +37433,8 @@ 5350494e4e59 5350494e4531 5350494c4c53 -5350494b4531 535045524d59 535045454444 -535045454431 535045434b59 535045434854 535045414b53 @@ -39022,7 +37445,6 @@ 535032303030 535031523154 534f574d5941 -534f50484941 534f4f544945 534f4f534f4f 534f4f4d524f @@ -39039,14 +37461,10 @@ 534f4552454e 534f434f4d33 534f434f4d32 -534f42414b41 534e55525245 534e4f4f5345 -534e41544348 534d55524646 -534d55524631 534d4f524553 -534d4f4b4553 534d49544348 534d45474759 534d4244534d @@ -39059,7 +37477,6 @@ 534c494d4d59 534c49474854 534c49434553 -534c45455059 534c4156494e 534c41564552 534c4156454e @@ -39071,7 +37488,6 @@ 534b4f4f5242 534b494d5059 534b454c4554 -534b41544552 534b41544532 534b41544131 534b38455253 @@ -39093,7 +37509,6 @@ 534855484552 5348544f524d 53485249454b -53484f574d45 53484f57434f 53484f4e454e 53484f414942 @@ -39104,19 +37519,16 @@ 5348494c4f56 5348494c4f31 534848484848 -53484552594c 534845524d4f 534845524c59 5348454c4f42 5348454c4c41 534845455059 -534845454e41 534845424132 534845414e41 53484152494e 534841524545 5348414e4547 -5348414e4531 5348414d5531 534841474753 534841473132 @@ -39135,15 +37547,12 @@ 534552564544 53455250454e 53455248494f -534552454741 534550543238 53454e524142 53454e4f5241 53454e4a4949 53454e474952 53454e454b41 -53454e454341 -53454c454e41 5345494b4f31 534544554345 5345444f5641 @@ -39160,13 +37569,11 @@ 5343555a5a59 5343554d4d59 534355424141 -53435245414d 53434f555459 53434f555436 53434f545457 53434f545443 53434f545435 -53434f544348 5343494c4c41 5343484c4550 534348495a4f @@ -39183,13 +37590,11 @@ 534155434559 534154494e53 534154494e41 -534153554b45 534153534552 534153495341 53415348494b 534153484136 534153484133 -534153484131 534152414833 534152413135 53415053414e @@ -39219,7 +37624,6 @@ 53414a494441 534149534f4e 534147534147 -534146415249 53414453414d 534144424f59 534144415341 @@ -39233,7 +37637,6 @@ 5259414e3134 5259414e3133 525553545933 -525553534941 52555353414b 5255534b4945 52555349414e @@ -39242,12 +37645,10 @@ 52554d4f5552 52554d494b4f 525542524943 -525542424552 525459525459 525459343536 525452545254 525452434252 -525252525231 52524a4a4e4e 525059414c31 525049535558 @@ -39262,7 +37663,6 @@ 524f53454c4c 524f53453639 524f53453231 -524f53434f45 524f50455231 524f4f4d4945 524f4f424f59 @@ -39270,7 +37670,6 @@ 524f4e444131 524f4d524f4d 524f4d414e43 -524f4d414e31 524f4d313233 524f4c544f4e 524f4c4c5550 @@ -39283,9 +37682,7 @@ 524f434f434f 524f434b5944 524f434b5939 -524f434b5931 524f434b5349 -524f434b4552 524f434b3333 524f434b3237 524e4f4d444d @@ -39301,7 +37698,6 @@ 524956494552 524956455239 524956455232 -524956455231 524954494b41 524953484154 52494e415441 @@ -39334,20 +37730,17 @@ 52454e4f4e56 52454e47454e 52454e444f47 -52454e415441 52454d4d4552 52454d383730 52454c4f4f50 52454c415445 524549564158 -5245494c4c59 524549444552 52454741534d 524547415244 524546494c4c 524546455253 52454450454e -524544484f54 524544425554 524544424552 524544424253 @@ -39355,12 +37748,9 @@ 524544313235 524544303030 524542454c37 -524542454c31 -52454147414e 524541474131 5243574f4f44 5242454e4459 -52415a4f5231 5241594c4545 524159414e4e 524159303037 @@ -39376,14 +37766,11 @@ 52414e554c46 52414e4a4954 52414e445948 -52414e445931 -52414e444f4d 52414e444f47 52414e444931 52414d504552 52414d4f5448 52414c554341 -52414c504831 52414b534841 5241494e4945 524149434855 @@ -39414,11 +37801,9 @@ 5155454e4348 515541524b31 5155414c4954 -5155414b4533 51554144524f 515259434845 514544454c31 -51415a585357 51415a415131 51415a373533 51415a303938 @@ -39451,8 +37836,6 @@ 50524f4d414e 50524f4d4143 505249594131 -505249564554 -5052494d5553 505249434b53 5052455a4553 505245565545 @@ -39461,7 +37844,6 @@ 50524156494e 5052414e4b59 50514f573132 -504f57455231 504f55545341 504f55535449 504f55535349 @@ -39470,13 +37852,9 @@ 504f544d414e 504f54415348 504f5354454e -504f5354414c 504f534e4552 -504f52544552 -504f52544552 504f524e3939 504f524b4559 -504f4f504f4f 504f4f504559 504f4f503233 504f4f4e4945 @@ -39504,7 +37882,6 @@ 504b504b504b 50495a5a4135 50495454454e -504953544f4c 504952554c4f 5049524f4c41 504950504f32 @@ -39520,30 +37897,21 @@ 50494e313233 50494d503939 50494d503233 -50494c4f5431 50494c474552 50494b4f524f 504943545553 -504943415244 5049414e4f37 -504933313431 50485953494f 504852454444 50484f4e4943 -50484f4e4531 -504849534831 -5048494c4c59 5048494c4c4c -5048494c4950 5048454e4e4e -50484152414f 504741444d49 504659454c46 504654464b42 504554554c41 504554524545 504554455445 -504554455253 504552555345 504552554e41 504552534943 @@ -39573,7 +37941,6 @@ 504153533032 504153313233 504152545932 -504152545931 504152544841 504152524f4e 5041524f4459 @@ -39586,7 +37953,6 @@ 50414e474741 50414e444954 50414e444142 -50414e43484f 50414e434841 50414e313233 50414d424931 @@ -39614,7 +37980,6 @@ 4f524c45414e 4f52494f4e38 4f52494f4e34 -4f52494f4e31 4f524441494e 4f52414e4a45 4f5054494d4f @@ -39646,14 +38011,11 @@ 4f4353414e41 4f425441494e 4f424c414449 -4f424957414e 4f4245594d45 4f424557414e -4f414b4c4559 4f3233343536 4e595155494c 4e594f555253 -4e594c4f4e53 4e59434e5943 4e55564f4c41 4e5554524941 @@ -39676,7 +38038,6 @@ 4e4f524d4153 4e4f524b5553 4e4f4f4d4945 -4e4f4f4b4945 4e4f4b494132 4e4f4a4f4441 4e4f49534559 @@ -39687,7 +38048,6 @@ 4e4f424c4531 4e4f41484831 4e4e50415353 -4e4e4e4e4e31 4e4a5246484d 4e4a494d4b4f 4e495a5a4c45 @@ -39696,7 +38056,6 @@ 4e4954494b41 4e4953544552 4e494e554341 -4e494e4a4131 4e494e413131 4e494c474149 4e494b4b4f52 @@ -39706,8 +38065,6 @@ 4e494b453133 4e494b453130 4e494b363636 -4e4947485431 -4e49434b5931 4e49434b3939 4e4943453132 4e4943444159 @@ -39719,7 +38076,6 @@ 4e4557534f4d 4e4557504f52 4e4557504153 -4e45574d414e 4e455742454e 4e4556494c4c 4e4556414d4f @@ -39734,7 +38090,6 @@ 4e4550415453 4e454c53454e 4e454c53304e -4e454c53304e 4e454857425a 4e4545474552 4e4543415841 @@ -39749,7 +38104,6 @@ 4e415349524a 4e4153494241 4e415345454d -4e4153434152 4e4152524f57 4e414e435953 4e414e434945 @@ -39776,9 +38130,7 @@ 4d5553495155 4d5553494b45 4d5553494333 -4d5553434c45 4d5552415441 -4d5550504554 4d554e4b4945 4d554e495241 4d554d54415a @@ -39798,7 +38150,6 @@ 4d4f55535341 4d4f55534533 4d4f5452494e -4d4f544c4559 4d4f54495645 4d4f54415244 4d4f53534552 @@ -39816,13 +38167,10 @@ 4d4f4e545959 4d4f4e544533 4d4f4e53554e -4d4f4e524f45 4d4f4e474f4f 4d4f4e474f35 4d4f4e455947 4d4f4e455939 -4d4f4e44454f -4d4f4e41434f 4d4f4d504f50 4d4f4d4f4e45 4d4f4d4f4635 @@ -39836,11 +38184,9 @@ 4d4f45534841 4d4f45444f47 4d4f45424941 -4d4f44454d53 4d4f44454c32 4d4f424d4f42 4d4f424c5545 -4d4f354b5641 4d4d4f4e4559 4d4d4d414141 4d4d46525635 @@ -39849,13 +38195,11 @@ 4d4a4e4d4a4e 4d495858415a 4d4953545937 -4d4953544552 4d495353494f 4d4953484158 4d4953414b4f 4d4952554e41 4d495252454e -4d495249414d 4d4952414441 4d495241434c 4d494f4d494f @@ -39870,7 +38214,6 @@ 4d494d49434f 4d494c4f535a 4d494c4f3031 -4d494c4c4945 4d494c4b4954 4d494c454e45 4d494c414459 @@ -39881,13 +38224,10 @@ 4d494b453636 4d494b453430 4d494b414d49 -4d4947485459 4d4944494f54 4d4943524f42 4d49434b3131 -4d4943484145 4d4943313233 -4d49414d4f52 4d49414d4937 4d49414d4932 4d4941313233 @@ -39907,7 +38247,6 @@ 4d454e313233 4d454c4f4449 4d454c4f3135 -4d454c4c4f4e 4d454c4b454e 4d4548415244 4d454547414e @@ -39929,19 +38268,16 @@ 4d4159414e47 4d4158544552 4d4158494d53 -4d4158313233 4d4158313031 4d4156494341 4d4156313233 4d4155524545 4d4155524131 4d4154544f58 -4d4154544945 4d4154543939 4d4154543838 4d4154543237 4d4154543138 -4d4154484557 4d41534f4e33 4d41534c4f57 4d4153415941 @@ -39955,23 +38291,19 @@ 4d41524b3033 4d415249544f 4d4152495348 -4d4152494e4f 4d415249454e 4d4152494536 -4d4152434941 4d4152434931 4d4152414e4f 4d4152414255 4d41504d4150 4d414e554643 -4d414e55454c 4d414e534558 4d414e4e4f4e 4d414e4e494e 4d414e4e454e 4d414e494f4e 4d414e494331 -4d414e494143 4d414e494131 4d414e474f4c 4d414e474f32 @@ -39987,7 +38319,6 @@ 4d414d413530 4d414d413130 4d414c4b494e -4d414c494345 4d414c464f59 4d414c454e45 4d414c434f4c @@ -40007,8 +38338,6 @@ 4d4147494338 4d4147494336 4d4147494330 -4d4144524944 -4d41444d414e 4d414353494d 4d41434b454d 4d4143494e47 @@ -40037,17 +38366,14 @@ 4c55434c5543 4c55434b5944 4c55434b5942 -4c55434b5937 4c5542415641 4c55414c5541 4c5456425946 4c5441484f45 4c5435363131 4c4f56494e55 -4c4f56455253 4c4f56455237 4c4f56455233 -4c4f56454d45 4c4f56454552 4c4f56453936 4c4f56453332 @@ -40058,11 +38384,9 @@ 4c4f52494e47 4c4f52494e41 4c4f52454e53 -4c4f52454e41 4c4f5245454e 4c4f4f5a4552 4c4f4f53454e -4c4f4e454c59 4c4f4c4f4c41 4c4f4c4f4c31 4c4f4c4c4544 @@ -40088,7 +38412,6 @@ 4c494c4c414e 4c494c49554d 4c4947485454 -4c4947485453 4c4947455230 4c4946453131 4c4945424552 @@ -40097,18 +38420,15 @@ 4c4943444c4c 4c494252414e 4c4942425953 -4c4942425931 4c4942424552 4c49414e4131 4c4930393837 -4c465942424b 4c4655343231 4c4650313233 4c45584d4152 4c4556495459 4c4556454c53 4c455431494e -4c4553544154 4c4553534f52 4c4553313233 4c45524f5558 @@ -40124,7 +38444,6 @@ 4c45484c4a56 4c454755414e 4c45474f3132 -4c4547454e44 4c4545454545 4c454352414d 4c4543484552 @@ -40145,10 +38464,8 @@ 4c4155524148 4c4155524147 4c4155524144 -4c4154494e4f 4c415448414e 4c4154455831 -4c4153534945 4c415353454e 4c4153434152 4c415255454b @@ -40164,7 +38481,6 @@ 4c414b534a44 4c41494e4559 4c4147455231 -4c4142544543 4c4141373737 4c3137333053 4b5956454c49 @@ -40219,7 +38535,6 @@ 4b49524b4f53 4b495247495a 4b4952454556 -4b4952425931 4b495050454e 4b494e534f4e 4b494e534552 @@ -40229,10 +38544,8 @@ 4b494e473232 4b494e444c59 4b494e414e45 -4b494d4d4945 4b494c545331 4b494c4f3939 -4b494c4c4d45 4b494c4c415a 4b494c4c4142 4b494b555955 @@ -40254,7 +38567,6 @@ 4b454c534f4e 4b454c4c594c 4b454c4c4f47 -4b454c4c4559 4b454c4c4152 4b4549545441 4b4549544848 @@ -40277,7 +38589,6 @@ 4b4154494534 4b4154485948 4b4154485932 -4b4154414e41 4b415354524f 4b4153544c45 4b4153534952 @@ -40299,7 +38610,6 @@ 4b414b413535 4b414a54454b 4b414a495241 -4b4149534552 4b4146464952 4b41444f5348 4b4144454e41 @@ -40316,7 +38626,6 @@ 4a554c593236 4a554c494544 4a554c494533 -4a554c494531 4a554c49414b 4a55414e4341 4a534a534a53 @@ -40343,7 +38652,6 @@ 4a4f45524731 4a4f454c4c41 4a4f454c3135 -4a4f454a4f45 4a4f45424c4f 4a4f45373737 4a4f44494553 @@ -40367,19 +38675,14 @@ 4a4554533939 4a4553554953 4a4553535931 -4a4553534943 4a4553534553 4a455353454e 4a4553534532 -4a4553534531 -4a4552534559 4a4552525948 4a45524a4552 4a4552494341 4a454e4e5946 4a454e4e5933 -4a454e4e4945 -4a454e4e4945 4a454c4c5953 4a4546464757 4a4546463639 @@ -40419,13 +38722,10 @@ 4a4152524f57 4a4152474f4e 4a414e495441 -4a414e494e45 -4a414e494345 4a414e494341 4a414e453132 4a414e444f53 4a414d4f4e44 -4a414d4d4552 4a414d494552 4a414d49454b 4a414d494548 @@ -40460,7 +38760,6 @@ 4956414e4553 4956414e3131 49554c49414e -4954414c4941 49534c414d45 4952494e4137 4952454e4b41 @@ -40468,14 +38767,12 @@ 494e544f4d45 494e54494d45 494e53554c54 -494e53494445 494e4a454354 494e494e494e 494e474f4949 494e46494e49 494e4645524e 494e45585246 -494d4f47454e 494d48415244 494d41474f44 494d35313530 @@ -40487,7 +38784,6 @@ 494b454d414e 4949534d5549 4949534d4150 -494755414e41 49474f523131 4947494e4c41 494747593133 @@ -40522,8 +38818,6 @@ 484f54345532 484f52534545 484f52534532 -484f52534531 -484f4f544552 484f4f505353 484f4e455933 484f4e444a45 @@ -40534,20 +38828,16 @@ 484f4d453139 484f4c4d454e 484f4c4c5948 -484f4c4c5931 484f4b414745 484f474c4547 484f46464552 484f45484f45 -484f44474553 484f42424945 484f41525345 484d4d4d4d4d 484a56464946 484a53414a48 -4849544f4d49 484950504949 -484950484f50 48494e4d414e 48494e444552 48494d363636 @@ -40562,8 +38852,6 @@ 484559444552 48455256414d 484552534859 -4845524d414e -48454e525931 48454e444f47 48454d554c49 48454d414e31 @@ -40571,7 +38859,6 @@ 48454c503939 48454c4c424f 48454c4c3639 -484543544f52 4845434e4252 484541565943 484541525354 @@ -40588,13 +38875,11 @@ 484152454d53 48415244595a 48414e545537 -48414e534f4e 48414e4b4a52 48414e4b4945 48414e4b3031 48414e48414e 48414d505553 -48414d495348 48414d454544 48414c4f3132 48414c48414c @@ -40614,7 +38899,6 @@ 4757454e4544 47555a5a4c45 475559534f4e -475553544156 475552554a49 475552474c45 47554e544953 @@ -40639,12 +38923,10 @@ 475245544348 47524547474f 475245473030 -475245454e53 475241564559 4752414e5432 4752414e4450 4752414e444d -4752414e4445 4752414e4144 4752414d424f 475241494c31 @@ -40660,7 +38942,6 @@ 474f52444f36 474f4f4f4f44 474f4f4b3139 -474f4f474c45 474f4f465953 474f4f465932 474f4f445932 @@ -40694,7 +38975,6 @@ 474c41444459 474c32383134 474c31353030 -474a4b425946 47495a4d4f33 47495a313233 474956454e53 @@ -40714,9 +38994,7 @@ 474554324954 474553544552 474552554e44 -474552415244 47455053484d -474550415244 47454e413638 4745454e4144 474545424545 @@ -40732,7 +39010,6 @@ 47414c494c45 474149564552 474144415747 -474142524945 473535304d53 47314e473352 473138303330 @@ -40758,17 +39035,14 @@ 4652594d414e 46524f535449 46524f475332 -46524f474759 46524f474745 46524f473639 46524f444f53 -46524f444f31 465249534259 465249474741 465245554431 465245534832 4652454e4453 -4652454e4348 465245454b53 465245453031 465245444f4d @@ -40781,14 +39055,12 @@ 4652414e5441 4652414e4b36 4652414e4941 -4652414e434f 465238444f47 465232353235 464f55524953 464f5254574f 464f524d454e 464f524d4532 -464f52434531 464f4f544241 464f4e54414e 464f4e445545 @@ -40798,11 +39070,9 @@ 464c59425931 464c4f594432 464c4f52494f -464c4f52454e 464c4f434f4e 464c49503639 464c49503232 -464c494e5431 464c45583131 464b54524354 464b41464b41 @@ -40817,8 +39087,6 @@ 464952453030 46494f4e4153 46494e4b454c -46494e495348 -46494e474552 46494e46414e 46494c4d4552 46494c4c4544 @@ -40830,8 +39098,6 @@ 464946413130 46494556454c 4649454e4431 -4649454c4431 -4649434b454e 464942455231 46465853494e 46455252414e @@ -40847,7 +39113,6 @@ 464155535431 464154544148 4641544d4158 -464154424f59 464153543132 464153434941 4641525a4144 @@ -40861,7 +39126,6 @@ 46414e455241 46414d495348 46414c4b4f4e -464149544831 464149524c59 464147464147 464144454556 @@ -40883,7 +39147,6 @@ 4556414e5331 45554e554348 45554c4f4759 -455547454e49 455545554555 45545241494e 455350454a4f @@ -40891,12 +39154,10 @@ 4553494e4544 45534355444f 4553434f4241 -455343415045 455343414c41 455341455341 455254444647 4552524f5231 -45524e455354 455249433333 455249433139 455249433130 @@ -40907,9 +39168,7 @@ 454e474c4953 454e43554c45 454d54504354 -454d50495245 454d4f313233 -454d4d495454 454d4d413033 454d494c5948 454d49313233 @@ -40933,7 +39192,6 @@ 454954484552 45494c53454c 45494c494448 -45494c45454e 454948504f53 454947485454 454947485448 @@ -40984,7 +39242,6 @@ 445544453333 4455434b5353 445543393936 -4455424c494e 445341415344 445341333231 44524f564552 @@ -41000,15 +39257,12 @@ 445245414431 445244455448 445244415645 -44524147304e 445231323334 445045524554 444f574e4544 444f55474d4f 444f524b4552 444f4f4e4553 -444f4f444c45 -444f4f424945 444f4e4d414e 444f4e444552 444f4d4d4945 @@ -41018,10 +39272,8 @@ 444f4d454b31 444f4d313233 444f4c4d414e -444f4c4c4152 444f47475959 444f47475939 -444f47444f47 444f47373737 444f454e4552 444f44494349 @@ -41037,13 +39289,11 @@ 4449534d4153 444953434f32 444952525459 -444952454354 44494e474859 44494d4f4e4e 44494d4d414b 44494d495452 44494d413232 -44494c4c4f4e 44494c4c494e 44494c424552 44494b534f4e @@ -41061,7 +39311,6 @@ 4445564f4e53 4445564d4752 444556494c36 -444556494345 444556444153 444556363636 444556313233 @@ -41076,7 +39325,6 @@ 44454c544158 44454c544156 44454c544138 -44454c544131 44454c4c4131 44454c4c3132 444546555345 @@ -41100,7 +39348,6 @@ 444444414141 444444313131 444441444459 -4442524e4a48 444252454946 4441594f4646 444159313233 @@ -41108,7 +39355,6 @@ 444156495353 444156494456 444156494449 -444156494445 444156454545 444156453237 444156453231 @@ -41127,15 +39373,12 @@ 444152494741 44415247414e 444152454c4c -44414e5a4947 44414e4e5948 44414e4e5941 -44414e474552 44414e434532 44414e413131 44414d53414d 44414d4d4144 -44414c544f4e 4441495a4945 444149414e41 444147474554 @@ -41184,7 +39427,6 @@ 435241534832 435241504552 4352414d424f -435241494731 435241434b45 43505241494c 434f58434f58 @@ -41194,7 +39436,6 @@ 434f56455231 434f55524147 434f55504553 -434f55474152 434f54544552 434f534d4f32 434f53434f53 @@ -41209,12 +39450,10 @@ 434f4f4e4945 434f4f4c3333 434f4f4c3031 -434f4e444f52 434f4e414e32 434f4d505554 434f4d4d414e 434f4d455850 -434f4c544f4e 434f4c4f4c45 434f4c494e47 434f4c494e41 @@ -41233,19 +39472,15 @@ 434d59544836 434d50554e4b 434d32363939 -434c59444531 434c4f564553 -434c4f564552 434c4b425945 434c49545858 434c49504954 434c494d4231 -434c49454e54 434c45544953 434c41534831 434c41524953 434c31393731 -434a4b595754 434956494c32 43494e445936 434943494349 @@ -41253,7 +39488,6 @@ 4348554d5053 4348554c4131 434855464659 -4348524f4d45 43484f574459 43484f504552 43484f4e4348 @@ -41274,7 +39508,6 @@ 434849454646 434849434f33 434849434f32 -434849434849 434849434841 434845594e45 434845535441 @@ -41283,10 +39516,8 @@ 43484546494e 43484543484f 434841564553 -434841534552 434841534544 434841524d31 -434841524c49 434841504953 4348414e5459 4348414e4e49 @@ -41300,8 +39531,6 @@ 434553415231 43454f43454f 43454c544f4e -43454c494e45 -43454c494341 434545424545 434458535a41 434442595246 @@ -41328,31 +39557,23 @@ 434150503538 43414e494e47 43414e455332 -43414e445931 43414e444f52 43414e444545 -43414e434552 -43414e43454c 43414e41414e 43414d52594e 43414d4f5445 43414d444f47 -43414c4c4945 -43414c4c4945 43414c4c454e 43414c4c414f -43414c49434f 4341494c494e 43414944454e 434149434f53 434147414441 43414443414d -434143545553 43414247504d 433231343538 433046464545 4259544f5231 -425954454d45 42555a5a4945 425554544153 425554425554 @@ -41378,7 +39599,6 @@ 425544484131 425544445942 425544445938 -425544444945 425544444444 425544424f59 4255434b5953 @@ -41390,7 +39610,6 @@ 425542424136 425542424134 425542424133 -425542424131 425532303034 42533738444a 425259414e4e @@ -41403,12 +39622,9 @@ 42525543454a 425255434535 42524f574e44 -42524f4f4b53 -42524f4e434f 425249544e59 4252494e4459 425249444c45 -425249444745 425249414e38 42524557494e 425245545435 @@ -41417,12 +39633,10 @@ 425245414b36 425241574e59 425241564552 -4252414e4449 42524143484f 42524143434f 425230304b53 424f5a4c4559 -424f54544f4d 424f54544552 424f5353454e 424f53534158 @@ -41437,7 +39651,6 @@ 424f4f544c45 424f4f4d5053 424f4f4d3131 -424f4f474945 424f4f444552 424f4f425332 424f4e544558 @@ -41450,7 +39663,6 @@ 424f4c545331 424f4c414e44 424f47524154 -424f474f5441 424f474f5353 424f474d414e 424f47415244 @@ -41460,7 +39672,6 @@ 424f424f3836 424f42425937 424f42424f31 -424f42424945 424f42414c55 424f415a3132 424f41524431 @@ -41496,9 +39707,7 @@ 424c415a4553 424c41535453 424c4153434f -424c41444553 424c41444537 -424c41434b59 424c41434b48 424c41434b30 424b4d564248 @@ -41508,7 +39717,6 @@ 4249544f4c41 424954434839 424954434830 -42495354524f 424952445931 424952445353 424952444d41 @@ -41518,7 +39726,6 @@ 42494d424f4d 42494c4c5957 42494c4c5936 -42494c4c4945 42494c4c3639 42494c4c3236 42494b455232 @@ -41526,12 +39733,9 @@ 4249474d414b 4249474b454e 424947484954 -424947474552 424947455354 42494744454e -424947424f59 424947424f4f -424947424f42 424947424154 424947414c4c 4249434b4c45 @@ -41616,17 +39820,14 @@ 4241524b4c45 424152494741 42414e4b5331 -42414e443154 42414e42414e 42414d434953 -42414d42414d 42414d413932 42414c4c4f4f 42414c4c4553 42414c4b4f4e 42414c415a53 42414b555241 -42414b455231 42414b415249 424149544552 4241494c5931 @@ -41648,7 +39849,6 @@ 415a5249454c 415a5241494c 415a51535758 -415a415a454c 415a4154494b 41594e555241 4158494c4c41 @@ -41656,10 +39856,8 @@ 415641524543 4156414d4f4e 415547494531 -41554255524e 415453554749 415448494e41 -415448454e53 415441544154 41544142454b 415354524147 @@ -41667,7 +39865,6 @@ 415353535341 41535241454c 41534b344d45 -415348544f4e 415344464732 415344464646 415344463939 @@ -41680,7 +39877,6 @@ 4152544f4953 415254494531 415254455259 -4152524f5731 415252454953 415252454152 41524d593131 @@ -41706,7 +39902,6 @@ 414f4c455231 414e55534941 414e544f4f4e -414e544f4e59 414e54455241 414e54415245 414e53455454 @@ -41719,18 +39914,15 @@ 414e494d5553 414e494b4554 414e47494532 -414e47454c4f 414e47454c34 414e4452494b 414e44524532 414e44524153 414e44523357 -414e44455253 414e43555441 414e41534b4f 414e41524b49 414e414e5448 -414e41454c4c 414e41424f4c 414d594c594e 414d4f555245 @@ -41746,23 +39938,19 @@ 414d414c4649 414c544f4e31 414c54454353 -414c50494e45 414c50484142 414c50484141 414c50455348 -414c4f4e5a4f 414c4d323333 414c4c54454c 414c4c524544 414c4c454e42 414c4c454e32 -414c4c454e31 414c4c414855 414c4c345535 414c4a4f4e41 414c49585858 414c49534941 -414c494e4b41 414c494e4531 414c49454e32 414c49434541 @@ -41782,7 +39970,6 @@ 414c44494e41 414c434f434b 414c42494e49 -414c42494e41 414c42454954 414c42414e4f 414c41524d41 @@ -41809,7 +39996,6 @@ 414654455231 41465348414e 4146524e4a48 -414652494b41 41465245454e 414652414944 41464f4e5941 @@ -41820,7 +40006,6 @@ 41444f564253 41444e455242 41444a414e49 -4144474a4d50 4144454c4941 4144434f434b 414441524131 @@ -41830,7 +40015,6 @@ 4144414d3131 414441434849 414431444153 -414355524131 4143544c414e 41434f524553 41434f48454e @@ -42561,12 +40745,8 @@ 3153414d4d59 315255535459 315141315141 -31504f574552 -314d4f555345 -314d4f4f5345 314d494b4531 314d49414d49 -314c49474854 314b41544945 314a49544b41 314a45545441 @@ -42574,7 +40754,6 @@ 314a45455031 314952495348 31484f525345 -31484f525345 31484f4d4552 31484f4c4c59 314845415254 @@ -42594,10 +40773,7 @@ 31424f47474f 31424f424259 314245414348 -3142414c4c53 -314150504c45 31414c504841 -314132423343 313939393130 313939373937 313939373237 @@ -43402,7 +41578,6 @@ 313031333939 313031333837 313031333834 -313031324e57 313031323033 313031313537 313031303536 @@ -43950,7 +42125,6 @@ 5a4950505953 5a4950505932 5a4950373839 -5a4947475931 5a484f504552 5a48454e454b 5a455a455a45 @@ -43965,10 +42139,8 @@ 5a415a393638 5a4157535a45 5a41535a4153 -5a4151313233 5a4151313131 5a4150313233 -5a414e444552 5a414b4d414e 5a41494e4b41 5a4148415241 @@ -43983,7 +42155,6 @@ 5a3030303030 595a34303030 5958414c4147 -59564f4e4e45 595555494e41 595553543937 595552455255 @@ -44047,13 +42218,11 @@ 584348414e47 58424f445958 58414e415831 -58414e414455 58414d58414d 58414d4d4158 583833353433 575358415344 575350343230 -575249474854 575241544831 57504142544d 575032303034 @@ -44066,7 +42235,6 @@ 574f4f4c4559 574f4f443131 574f4e4b4131 -574f4d454e31 574f4c464531 574f4c463732 574f4c463232 @@ -44083,14 +42251,12 @@ 57494c4d4f54 57494c4c5935 57494c4c4c59 -57494c4c4953 57494c444341 574947574147 574947474945 57494747454e 5749434b4b4a 574931314945 -5748594e4f54 574849544550 5748494e4552 574845454c45 @@ -44100,7 +42266,6 @@ 574648425746 574554313233 574553574553 -574553544f4e 574553543535 574553543434 574553543232 @@ -44121,16 +42286,13 @@ 574546574546 574546554e4b 574542414343 -57454153454c 574154555349 574154544945 574154535550 574154455238 574154455234 -574153535550 574153444552 574152534f4e -57415252454e 5741524d4552 57414e474c45 57414e444153 @@ -44140,7 +42302,6 @@ 57414c444f53 57414b4b4f31 57414b414d45 -5741474e4552 574147474552 574146455253 574144445550 @@ -44187,7 +42348,6 @@ 56494b413135 56494b313233 564945524745 -5649454e4e41 564943564943 5649434b5953 564943313233 @@ -44196,9 +42356,7 @@ 564941424c45 56465645435a 564652434445 -564652434256 564648425a5a -564648425946 564554544f52 564552564531 564552495445 @@ -44207,7 +42365,6 @@ 56454e555335 56454e555332 56454e495245 -56454e494345 56454e454552 56454c4c554d 56454c454e4f @@ -44223,8 +42380,6 @@ 564152475553 56414e445931 56414e313030 -56414c4c4f4e -56414c455249 56414c454e53 56414c41414d 564144455236 @@ -44233,7 +42388,6 @@ 564143414e54 563156325633 55594a565246 -555555555531 5554484a4259 555355535553 55534e463937 @@ -44250,7 +42404,6 @@ 554e52455354 554e4f554e4f 554e4c494b45 -554e4b4e4f57 554e49545931 554e494d4f47 554e4553434f @@ -44274,7 +42427,6 @@ 54594c455254 54594c45524e 54594c45524d -5459434f4f4e 545749584945 5457494e4b4c 5457494e3132 @@ -44305,17 +42457,14 @@ 54524f4d4241 54524f46494d 54524e373031 -545249544f4e 5452494b4553 545249434b37 545245453232 545245453132 -545245424f52 545245424f4c 545245353433 545241585858 545241555448 -5452414e4345 5452414d5059 5452414d5031 545241444553 @@ -44333,7 +42482,6 @@ 544f504f4e45 544f5049544f 544f50494353 -544f50444f47 544f50313233 544f50313131 544f4f594f55 @@ -44380,7 +42528,6 @@ 54494f4e4e45 54494f4e4542 54494e544552 -54494e4d414e 54494e413939 54494e413031 54494d555231 @@ -44394,7 +42541,6 @@ 54494b54494b 544947524131 544947455257 -544947455231 544947455230 544946464c45 544942494131 @@ -44418,7 +42564,6 @@ 544742544742 54464c54464c 544558415338 -544553544552 544553543133 544553543030 5445534c4131 @@ -44431,7 +42576,6 @@ 54454e534149 54454e4e4945 54454e4b4559 -54454d504c45 54454c4c5953 54454c454741 54454c415649 @@ -44458,7 +42602,6 @@ 5441574e5941 544157445259 544156524941 -544154544f4f 544154524154 544154414e41 544152534841 @@ -44502,7 +42645,6 @@ 53594d4f4e45 53594c494c4c 535753343131 -53574f524431 535749535332 535749534859 5357494e4753 @@ -44537,7 +42679,6 @@ 53555045524e 53554e504349 53554e4e5938 -53554e444159 53554d4f3732 53554c5a4552 535549434944 @@ -44549,7 +42690,6 @@ 5355434b4131 5355424f4448 535542415348 -535542415255 535455444941 535455444444 535455444431 @@ -44557,25 +42697,20 @@ 535452594645 535452555453 535452495645 -535452494b45 53545249434b -535452454554 535452454348 535452414e47 53545241424f 53544f524b53 53544f503131 -53544f4e4553 53544f4a414e 53544f434b31 53544b343231 53544956454e 535449504559 -5354494e4b59 5354494c5453 5354494b4552 535449474f54 -535445564945 535445564546 535445523536 5354454c4c45 @@ -44602,16 +42737,12 @@ 535354415353 535353313131 535331343838 -535155495254 535059494e47 53505554554d 535055525332 -535055525331 5350554e4b31 -535055445331 535055444c59 535053535053 -535052495445 53505241574c 535052314e47 53504f555345 @@ -44644,7 +42775,6 @@ 534f4e595456 534f4e4e4532 534f4e494345 -534f4e494331 534f4e494141 534f4e414e54 534f4e313233 @@ -44652,7 +42782,6 @@ 534f4d4f5641 534f4c54414e 534f4c4f3639 -534f4c4e4345 534f4c444144 534f4c303031 534f46543137 @@ -44674,12 +42803,9 @@ 534d53534d53 534d4f4e4559 534d4f4c494e -534d4f4b4552 -534d4f4b4531 534d4c333234 534d49544857 534d49544833 -534d494c4553 534d494c4535 534d49434859 534d41534831 @@ -44690,9 +42816,7 @@ 534c494d3639 534c494b4b45 534c49434b36 -534c49434b31 534c45544a45 -534c41594552 534c41564941 534c41564532 534c41564153 @@ -44701,12 +42825,10 @@ 534b594f4e45 534b59475559 534b55524745 -534b554e4b31 534b4f52494b 534b49545a4f 534b49505041 534b49503737 -534b49444f4f 534b49444459 534b414e4b31 534b414e4552 @@ -44716,23 +42838,19 @@ 534958363636 5349544f5241 534954415241 -534953544552 534952534952 -534952495553 534950554c49 53494f50414f 53494e54455a 53494e4d414e 53494e47494e 53494e44454c -53494d4f4e41 53494d415244 53494c534f4c 53494c4c5953 53494c4c4957 53494c4b4536 5349474d4133 -5349474d4131 534947485453 534947455053 53494542454c @@ -44755,7 +42873,6 @@ 5348494e4f42 5348494e4e59 5348494e4545 -5348494c4f48 5348494c494e 53484947454f 534845594c41 @@ -44764,12 +42881,9 @@ 5348454c5459 534845484142 534845455253 -534845454e41 534845415253 -5348415a414d 534841574e4d 534841574e42 -534841524b53 534841524b49 534841524b35 534841524954 @@ -44782,7 +42896,6 @@ 5348414e4550 5348414e454f 5348414d4152 -5348414d414e 5348414c554e 5348414c4c41 5348414c494e @@ -44806,21 +42919,15 @@ 534556534556 53455645524d 534556454e54 -534556454e37 534556454e36 -534553414d45 -534552565553 53455256414e 534552554549 534552464552 534552455a41 -534552454e41 -534552454741 534552414649 53454e534849 53454e534559 53454e53454e -53454e494f52 53454e444954 53454e434f50 53454d4c4f48 @@ -44871,7 +42978,6 @@ 534159494e47 534157414441 534156564153 -534156494f52 534156455253 534156415445 534156415244 @@ -44909,13 +43015,11 @@ 53414c4f4e49 53414c4c414d 53414c454e41 -53414c45454e 53414c414d45 53414c414d31 53414c414b4f 53414c313233 53414b595241 -53414b555241 5341494c494e 5341494b4f55 534147453132 @@ -44950,7 +43054,6 @@ 525554494c45 525553545938 525553534554 -52555353454c 525553533141 5255534e414b 525553484d45 @@ -44958,7 +43061,6 @@ 52554d52554d 52554d505553 52554c4c4954 -52554c455a31 52554c455332 52554c455253 5255494e4544 @@ -44973,7 +43075,6 @@ 525331393138 525330383234 525043525434 -524f57454e41 524f57444945 524f56455233 524f55544536 @@ -44985,7 +43086,6 @@ 524f53494552 524f53494545 524f53494536 -524f53494531 524f53455353 524f53453137 524f53453134 @@ -44999,11 +43099,9 @@ 524f4e444f47 524f4d4f4c4f 524f4d4e4559 -524f4d4d454c 524f4d494e45 524f4d454f36 524f4d454f35 -524f4d454f31 524f4d415245 524f4d414e59 524f4c44414e @@ -45011,13 +43109,11 @@ 524f49535359 524f47455252 524f44494341 -524f44474552 524f44445931 524f434b5947 524f434b5938 524f434b5321 524f434b4e45 -524f434b4552 524f434b3939 524f434b3233 524f434b3031 @@ -45025,7 +43121,6 @@ 524f424a4553 524f42494e57 524f42494e37 -524f42494e31 524f42425952 524f42424544 524f4242414e @@ -45040,10 +43135,7 @@ 524a4e4a4446 524a49564648 52495a56414e -524956455241 -524950504552 52494e54494e -52494d4d4552 52494d484945 524947534259 524946464c45 @@ -45053,13 +43145,11 @@ 5249434b3233 5249434b3137 524943484455 -524943484152 524943483336 524943483131 524942424c45 5249414c544f 5248544e4259 -52484f4e4441 52484f4d4249 524846434a4e 524845545442 @@ -45108,7 +43198,6 @@ 524544524f42 524544524154 5245444e454b -5245444d414e 5245444c494e 524544464953 524544353138 @@ -45116,13 +43205,9 @@ 524544323031 524544313437 524544313236 -524544313233 524544313031 -5245434f4e37 5245434d5246 -524543434f53 5245424d454d -524542454c53 524541524541 52454144494e 524432363833 @@ -45137,24 +43222,16 @@ 524157524157 524156495348 524156494e45 -524156454e53 524156454e34 5241554d484f 524153534941 -5241534d5553 -52415155454c 52414e474531 52414e445947 52414e44454c -52414d5a4553 -52414d534553 52414d50414c 52414d4f5449 -52414d4f4e41 -52414d4a4554 52414d495553 52414d495441 -52414d424f31 52414d42414d 52414d373731 52414c504849 @@ -45165,11 +43242,9 @@ 524147453238 524146524146 52414641494c -52414641454c 524145414e4e 524144594741 524144455253 -524143494e47 524143455233 524141524841 523334475452 @@ -45195,12 +43270,9 @@ 514a5545484e 514551455145 5142414c4c53 -51415a575358 51415a373839 -51415a313233 513351335133 513133353739 -505954484f4e 505952495445 505952414d49 50555a593634 @@ -45209,9 +43281,7 @@ 505553535930 505553485550 505552494659 -505552445545 505550444f47 -50554c534152 50554c504954 50554c4c454e 5055474c4554 @@ -45221,9 +43291,6 @@ 505544534559 5055444d414e 505544474537 -50554444494e -50535943484f -50535943484f 505359434831 505359313233 505355505355 @@ -45244,7 +43311,6 @@ 50524f323030 50524e535452 5052495a4553 -505249535359 505249534b41 5052494e5a31 5052494e5431 @@ -45260,7 +43326,6 @@ 505050313233 50504f574552 504f57455244 -504f57455239 504f57455234 504f57455233 504f544f5349 @@ -45279,7 +43344,6 @@ 504f504b4f56 504f5047554e 504f4f544c45 -504f4f544552 504f4f505932 504f4f503939 504f4f4f5059 @@ -45294,9 +43358,7 @@ 504f4f313233 504f4e474552 504f4e434859 -504f4e43484f 504f4c534b49 -504f4c4c5931 504f4c4c4f4b 504f4c4b4153 504f4c4b4141 @@ -45317,7 +43379,6 @@ 504f44444c45 504f434b4552 504f43484954 -504c55544f31 504c55534831 504c554d4552 504c554d4231 @@ -45328,7 +43389,6 @@ 504c454e554d 504c45424553 504c41593131 -504c4154494e 504c41535449 504c414e434b 504a594e4252 @@ -45348,7 +43408,6 @@ 50494e4b3132 50494e474153 50494e453231 -50494d50494e 50494d504544 50494d503231 50494d503230 @@ -45358,20 +43417,16 @@ 50494b413132 5049494f4c41 504947475959 -504947454f4e 504947415353 504947313233 504946504146 504945545241 5049454d454c 504945445241 -5049434b4c45 5049414e4f32 504850504850 -50484f544f31 50484f534531 50484f4e4532 -50484f454245 50484f424943 5048494c434f 5048454c4348 @@ -45399,7 +43454,6 @@ 50454e544135 50454e4e5959 50454e4e5359 -50454e43494c 50454e313233 504547424f59 504545564545 @@ -45412,19 +43466,16 @@ 504541434837 504344504344 504231323334 -504158544f4e 504158504158 5041584d414e 5041564c4f53 504155504552 5041554c4f53 5041554c4f4f -5041554c494e 5041554c4554 5041554c4132 5041554c3233 5041554c3133 -504154544f4e 504154533131 504154533031 504154524941 @@ -45440,8 +43491,6 @@ 504153533455 504153435541 504153434f45 -50415343414c -5041524f4c4c 5041524b414e 5041524b3332 5041524b3132 @@ -45455,7 +43504,6 @@ 504150414a41 504150413031 50414f4c4131 -50414e5a4552 50414e545948 50414e545931 50414e4b4f56 @@ -45491,12 +43539,10 @@ 4f5343415237 4f5343415235 4f5343415233 -4f5343415231 4f5252454c4c 4f52494f4e4f 4f5247593639 4f5247415a4d -4f524741534d 4f52454f3030 4f5243413735 4f52414d4143 @@ -45507,7 +43553,6 @@ 4f4f4c4f4e47 4f4f49495555 4f4f44494b53 -4f4e4c494e45 4f4e494f4e31 4f4e45474f44 4f4e4547494e @@ -45515,7 +43560,6 @@ 4f4d41523231 4f4c534f4e53 4f4c49564554 -4f4c49564531 4f4c49564153 4f4c47555441 4f4c47414c55 @@ -45526,7 +43570,6 @@ 4f4c454a4b41 4f4c45473137 4f4c44534d4f -4f4c444d414e 4f4c44464f58 4f4c44415353 4f4c44414745 @@ -45550,7 +43593,6 @@ 4e5943313233 4e564f574550 4e5554415445 -4e55524c414e 4e5552445547 4e554b45454d 4e55434b4c45 @@ -45590,17 +43632,14 @@ 4e4957524144 4e49564c454d 4e4955484153 -4e495452414d 4e4954494e31 4e495348414e 4e4953484131 -4e4950504552 4e49504e4950 4e494e4a414b 4e494e4a4136 4e494e4a4133 4e494e49414e -4e494d524f44 4e494c4c454d 4e494c424f47 4e494b4b4933 @@ -45612,7 +43651,6 @@ 4e4946464552 4e49434f5941 4e49434f4c49 -4e49434f4c41 4e49434b3539 4e49434b3331 4e49434b3233 @@ -45621,12 +43659,9 @@ 4e48424e4a59 4e4648504659 4e4558555353 -4e4557544f4e -4e4557544f4e 4e4557533132 4e4557494e4e 4e4557313131 -4e4556414441 4e4555524f31 4e4554544c45 4e455454414e @@ -45657,23 +43692,19 @@ 4e4154413133 4e4153545947 4e4153545932 -4e4153544941 4e41524d494e 4e415243414e -4e41504f4c49 4e414f4e414f 4e414f4d4953 4e414e435947 4e414e435944 4e414e435932 -4e414e435931 4e414e415345 4e414d444f52 4e414d414e41 4e414c535552 4e414c4c4552 4e414b4e414b -4e414b454431 4e4149524231 4e41494d414e 4e41494c5353 @@ -45688,13 +43719,11 @@ 4d595445414d 4d5953544152 4d59534f4e53 -4d5953454c46 4d59524f5345 4d5950494353 4d594f504943 4d594e4f434b 4d594d414d41 -4d594c4f5645 4d594c455331 4d594b4f4e4f 4d5947415259 @@ -45706,13 +43735,11 @@ 4d5941535331 4d59414e4e41 4d5745314f53 -4d5554544552 4d55535a4b41 4d5553544245 4d5553544144 4d55534c494e 4d5553494b41 -4d5552524159 4d55524d414e 4d55524b4131 4d554e4d554e @@ -45729,7 +43756,6 @@ 4d534d41494c 4d534c4f474f 4d534c455341 -4d53494e464f 4d5332303030 4d5258524159 4d52574f4f44 @@ -45756,14 +43782,12 @@ 4d4f534b4155 4d4f53455353 4d4f53455231 -4d4f52544f4e 4d4f5253454c 4d4f52524945 4d4f52524559 4d4f524d414e 4d4f5247554c 4d4f52464559 -4d4f52454e4f 4d4f5245494e 4d4f52414731 4d4f52414553 @@ -45772,13 +43796,11 @@ 4d4f4f4e3434 4d4f4f4e3133 4d4f4e545953 -4d4f4e524f45 4d4f4e4f4e41 4d4f4e4b3639 4d4f4e495441 4d4f4e494e4f 4d4f4e494131 -4d4f4e455953 4d4f4e444f31 4d4f4e444153 4d4f4e414d43 @@ -45793,7 +43815,6 @@ 4d4f48494e49 4d4f48415645 4d4f48414952 -4d4f47574149 4d4f46464154 4d4f45425553 4d4f44554c4f @@ -45802,7 +43823,6 @@ 4d4f42535441 4d4e4d545243 4d4e4d474443 -4d4e42564358 4d4d4f525047 4d4d4f52414e 4d4d4d4d3535 @@ -45826,10 +43846,7 @@ 4d495333484b 4d49524d4952 4d49524b494e -4d495249414d 4d495245494e -4d4952414745 -4d4952414745 4d494e544552 4d494e4e4552 4d494e49554d @@ -45859,7 +43876,6 @@ 4d494b453531 4d494b453432 4d49484d4948 -4d494755454c 4d4947504f4c 4d49474c4941 4d4947475931 @@ -45892,8 +43908,6 @@ 4d4552494348 4d4550373137 4d454e4e454e -4d454e414345 -4d454c4f4e53 4d454c4f434f 4d454c4c4131 4d454c4b4552 @@ -45907,8 +43921,6 @@ 4d4547414c4f 4d454655434b 4d454548414e -4d4544494f4e -4d4544494331 4d454449414e 4d4544415244 4d4534343032 @@ -45968,7 +43980,6 @@ 4d41524d4f4e 4d41524d454c 4d41524c594e -4d41524b5553 4d41524b5331 4d41524b3838 4d4152495a41 @@ -45988,8 +43999,6 @@ 4d4152454b31 4d4152444931 4d4152434f32 -4d4152434941 -4d415243454c 4d4152433639 4d4152433232 4d4152415a4d @@ -45997,19 +44006,15 @@ 4d415241444f 4d4151554953 4d41504c4531 -4d414e555444 4d414e555231 4d414e554e41 4d414e544f4e -4d414e534f4e -4d414e534f4e 4d414e4f5253 4d414e4e5959 4d414e495441 4d414e445959 4d414e44594d 4d414e445942 -4d414e445931 4d414e444f53 4d414e444f52 4d414e444f31 @@ -46044,7 +44049,6 @@ 4d4148414c31 4d4147555331 4d41474f4f4f -4d414749434b 4d4147494339 4d4147475931 4d414747414e @@ -46055,7 +44059,6 @@ 4d4144484154 4d4144454c45 4d4144445953 -4d414444454e 4d4144415353 4d4144414d53 4d4143524145 @@ -46063,7 +44066,6 @@ 4d41434f4e45 4d41434f4e31 4d41434b4f31 -4d41434b4945 4d41434b3132 4d41434b3031 4d4143484f4e @@ -46075,7 +44077,6 @@ 4d314d314d31 4d31434b4559 4d305247414e -4d304e4b3359 4d3030433057 4c5953494e45 4c594e4e3639 @@ -46084,7 +44085,6 @@ 4c55564c4553 4c5556415353 4c5556313233 -4c5554484552 4c5553543639 4c5552474545 4c5550555331 @@ -46101,7 +44101,6 @@ 4c5549474749 4c5543593030 4c55434b5950 -4c55434b5937 4c5543495441 4c5543494c41 4c5543494531 @@ -46109,7 +44108,6 @@ 4c5543434131 4c5543415330 4c55414e4441 -4c55414e4441 4c5344313233 4c4f5a414441 4c4f58343435 @@ -46129,7 +44127,6 @@ 4c4f55494545 4c4f55313233 4c4f54555332 -4c4f54555331 4c4f54544131 4c4f53544954 4c4f53544552 @@ -46147,15 +44144,11 @@ 4c4f4f534531 4c4f4f505331 4c4f4f504d45 -4c4f4f504552 -4c4f4f4e4559 4c4f4f4b4d45 4c4f4f4b4559 4c4f4e473132 4c4f4e455231 4c4f4c594141 -4c4f4c4f4c4f -4c4f4c495441 4c4f4c414745 4c4f4c413639 4c4f4c413132 @@ -46222,8 +44215,6 @@ 4c4947474554 4c4945534a45 4c494553454c -4c49434b4954 -4c49434b454d 4c47424e4146 4c455a424f53 4c455a415244 @@ -46235,7 +44226,6 @@ 4c4556454c32 4c455556454e 4c4553564f53 -4c4553544552 4c455353494b 4c455353454e 4c45534c4553 @@ -46243,10 +44233,8 @@ 4c45524f5953 4c4552413132 4c4550414745 -4c454f4e4945 4c454f4e4345 4c454e4e5953 -4c454e4e4f4e 4c454e4e4152 4c454e413838 4c454e413239 @@ -46266,7 +44254,6 @@ 4c45454e4945 4c4543544f52 4c4543484554 -4c4541564553 4c45414d4f4e 4c45414b494d 4c4541463536 @@ -46281,7 +44268,6 @@ 4c4157444159 4c4157313233 4c4156414e54 -4c4155524945 4c4155524135 4c4155504552 4c41554c4155 @@ -46309,7 +44295,6 @@ 4c414e4e4f4e 4c414e474741 4c414e445255 -4c414e444552 4c414e443455 4c414e344552 4c414d504945 @@ -46323,7 +44308,6 @@ 4c4146495445 4c4144593639 4c4144593131 -4c4144444945 4c41434c5542 4c4143455935 4c4142494c45 @@ -46346,7 +44330,6 @@ 4b5352303333 4b5343565450 4b524f455445 -4b5249535459 4b5249535355 4b5249533133 4b5249533031 @@ -46357,7 +44340,6 @@ 4b5032353030 4b4f5441524f 4b4f54333333 -4b4f53484b41 4b4f524f4c4c 4b4f524e494b 4b4f524b4f52 @@ -46373,15 +44355,12 @@ 4b4f4c4f5353 4b4f4b53494b 4b4f4b4f5348 -4b4f4b4f4b4f 4b4f4b49544f 4b4f4b494c41 4b4f49524154 4b4f4841574b -4b4f4449414b 4b4e59534e41 4b4e4f50494b -4b4e49434b53 4b4e45434854 4b4d4a4e4842 4b4c4f574e53 @@ -46476,7 +44455,6 @@ 4b41524f4c4c 4b41524c4559 4b41524c4153 -4b4152494e41 4b4152494d49 4b4152415353 4b4152414f4b @@ -46514,14 +44492,11 @@ 4a555354474f 4a5553543132 4a554e4f4954 -4a554e474c45 -4a554e474c45 4a554e453036 4a554e453031 4a554e425547 4a554d504d45 4a554d4f4e47 -4a554d424f31 4a554c593939 4a554c593037 4a554c494f30 @@ -46534,7 +44509,6 @@ 4a554c494143 4a554c494132 4a554a484a4c -4a5549434531 4a5547454e44 4a5545474f53 4a5544474531 @@ -46625,10 +44599,8 @@ 4a4553533133 4a4553533132 4a4553533131 -4a4552534559 4a4552524943 4a45524f4d59 -4a45524f4d45 4a45524f4431 4a4552494348 4a4552313233 @@ -46640,7 +44612,6 @@ 4a454e4e5937 4a454e4e5935 4a454e4e4141 -4a454c4c5931 4a454c4c4f37 4a4546463232 4a4546463031 @@ -46675,7 +44646,6 @@ 4a4153534945 4a41534f4e4c 4a41534f4e37 -4a41534d494e 4a4153313233 4a4152524148 4a4152454453 @@ -46685,7 +44655,6 @@ 4a414e555353 4a414e4e4953 4a414e4e4131 -4a414e494e45 4a414e494531 4a414e49434b 4a414e474c45 @@ -46696,7 +44665,6 @@ 4a414d494557 4a414d49454f 4a414d494543 -4a414d455344 4a414d414c49 4a414b4f4231 4a414b455353 @@ -46715,14 +44683,12 @@ 4a4144454431 4a4143534f4e 4a41434f4d4f -4a41434f4253 4a41434f4246 4a41434f4239 4a41434f4235 4a41434d414e 4a41434b504f 4a41434b4553 -4a41434b414c 4a41434b3737 4a41434b3333 4a41434b3237 @@ -46746,12 +44712,9 @@ 495355525553 49535245414c 49534f4d414e -49534c414e44 495348494441 49535f474159 495341494153 -495341494148 -495341414331 495249534839 4952494e4132 494f57415354 @@ -46809,21 +44772,17 @@ 48554d48554d 48554c4c4643 4855474f3131 -485547474552 485545525441 48544d4c3332 485332303030 48504f574552 484f57494544 -484f57454c4c 484f55534545 484f55534544 484f55534538 484f55464653 484f54543637 484f54543635 -484f54534558 -484f54444f47 484f54414952 484f5253544c 484f50454545 @@ -46835,13 +44794,10 @@ 484f4e455937 484f4e455936 484f4e444f4f -484f4e444131 484f4d455331 484f4d455255 -484f4d455253 484f4d455233 484f4c4c4153 -484f4c44454e 484f4c413132 484f47474c45 484f47313233 @@ -46857,13 +44813,11 @@ 484952414e4f 484950504552 48494e4b4c45 -48494d4d454c 48494c4c5931 48494c4c5353 48494c4c474f 48494c4c3333 48494c495445 -48494c415259 48494b455253 48494748484f 48494552524f @@ -46892,7 +44846,6 @@ 48454e48454e 48454e475354 48454c503132 -48454c4d5554 48454c4c4f4e 48454c4c4f41 48454c4c4f21 @@ -46907,16 +44860,12 @@ 4845494b4b49 484549464552 48454944494b -484549444931 484548484548 48454747454d 484544564947 4845444c4559 -484541525453 -484541525453 484541525448 484541525435 -484541525431 484541425946 484349393936 48424e45435a @@ -46933,10 +44882,8 @@ 484152504945 4841524f554e 484152495553 -484152444f4e 484152444153 484152443130 -484150505931 48414e5a454e 48414e544f4e 48414e4e4552 @@ -46948,12 +44895,10 @@ 48414e445959 48414e313233 48414d4d454c -48414d4c4554 48414c544f4e 48414c544552 48414c4f3535 48414c4c4f50 -48414c4c4f31 48414c4c4542 48414c444952 48414c313233 @@ -46975,7 +44920,6 @@ 475559414e45 475559323639 4755524d414e -47554e44414d 47554d4d4d59 47554d4d4552 47554d424f31 @@ -46990,8 +44934,6 @@ 475349313656 475331393035 4752554e5459 -47524f564552 -47524f564552 47524f544f4e 47524f504531 47524f4f4d53 @@ -47009,7 +44951,6 @@ 475241564552 475241544941 475241544531 -4752414e5431 4752414e5041 475241494c53 47524146494b @@ -47029,7 +44970,6 @@ 474f534f5831 474f52313233 474f4f534544 -474f4f534531 474f4f4f4659 474f4f44494e 474f4f444552 @@ -47055,14 +44995,11 @@ 474f44444552 474f434b454c 474e4150504f -474d4f4e4559 474d43415244 474c5032314b 474c4f574945 474c4f525932 -474c4f42414c 474c415a4552 -474c41535331 474b46524346 474a4f4e4553 47495a4d4f38 @@ -47076,10 +45013,8 @@ 47494e413131 47494d504552 47494d4d4545 -47494c524f59 47494c4c5931 47494c4c4559 -47494c4c4553 47494c4c414e 47494c455241 47494c444552 @@ -47087,7 +45022,6 @@ 474947474552 474947414c4f 47494252414e -4749414e5431 4749414e4c55 47484a52464e 47484a524342 @@ -47111,12 +45045,10 @@ 474554474554 4745534d4541 474552534f4e -4745524d414e 474552414c54 47455241494e 47455045544f 47454e474152 -47454e455641 47454e444f53 47454e41524f 47454c444f46 @@ -47134,7 +45066,6 @@ 47415a5a4153 47415a4f4f4f 47415a4d414e -4741544f5231 4741534f494c 474152544842 474152544831 @@ -47149,12 +45080,10 @@ 47414e4a4131 47414e41444f 47414d453132 -47414d424954 47414c56414e 47414c4b494e 47414c47414c 47414c454e31 -47414c415859 47414c313233 474149474149 47414944454e @@ -47174,7 +45103,6 @@ 465646564656 4656464b425a 46555a5a5959 -465553494f4e 4655524c4559 4655524b414e 465552494f53 @@ -47208,7 +45136,6 @@ 465249444131 4652484f524e 465245534153 -4652454e5a59 465245494441 465245474e41 465245453931 @@ -47220,17 +45147,13 @@ 465245443335 465245414b45 465241594544 -465241534552 -4652414e4b53 4652414e4353 -4652414d4531 465231334e44 465230323131 46504656464e 464f58593639 464f58585858 464f545a454e -464f5353494c 464f52544845 464f524e4954 464f524e4941 @@ -47275,7 +45198,6 @@ 464952453232 46494e533133 46494e474f4e -46494e474552 46494e434859 46494e414e53 46494e414c46 @@ -47289,7 +45211,6 @@ 464842595246 464639333237 464631343639 -464554495348 464553544953 464553534553 46455353454c @@ -47309,7 +45230,6 @@ 464249303037 464231464236 4641564f5253 -4641544d414e 464154494d45 464153545750 464152564534 @@ -47331,7 +45251,6 @@ 464147494e41 46414444454e 464143455453 -464142524943 463052455354 455a31393830 45585452494d @@ -47351,21 +45270,16 @@ 455448454c31 455448414e44 455448414e37 -455448414e31 455445524e41 -455354484552 4553504c5444 455350414e4f -4553434f5254 455341454c50 455252414e54 -45524e494531 455249533233 4552494e3132 4552494b4f4c 4552494b4150 4552494b3131 -455249434131 455249433535 455249433233 455249433134 @@ -47382,7 +45296,6 @@ 454e34434552 454d504c4f59 454d5045524f -454d4d495454 454d4d495247 454d4d413639 454d494c5959 @@ -47390,18 +45303,15 @@ 454d494c5930 454d45415247 454c59535341 -454c574f4f44 454c56495343 454c56495336 454c56495335 454c544f4e31 454c53484144 454c4e555241 -454c4d495241 454c4d455249 454c4c494553 454c4c49454b -454c4c494531 454c49584552 454c49534549 454c49534142 @@ -47415,7 +45325,6 @@ 4549545a454e 4549534e4552 454952453139 -454947485438 454945494f31 454846393131 45474f52494b @@ -47437,7 +45346,6 @@ 454241544e41 454239383035 454154594f55 -454153544f4e 454153544c41 454153543137 4541524e4945 @@ -47449,7 +45357,6 @@ 454141313433 453737374b58 453141475750 -44594e414d4f 44594c4c414e 44594c414e42 445744574457 @@ -47458,7 +45365,6 @@ 445553545932 44555354414e 44555242494e -44554e444545 44554c434945 44554b455353 44554b453931 @@ -47469,9 +45375,7 @@ 445546555353 445544494544 4455434b3639 -445543415449 4455424f5345 -4455424c494e 445458333231 44544f4d4d59 44534d44534d @@ -47505,12 +45409,10 @@ 444f5050494f 444f4f4e4552 444f4f4c494e -444f4f474945 444f4e574f4e 444f4e555454 444f4e4f5641 444f4e4e5947 -444f4e4e4552 444f4e4e4152 444f4e4e4141 444f4e4b4552 @@ -47525,7 +45427,6 @@ 444f47474c45 444f47473639 444f47464f4f -444f44474552 444f44474545 444f41524555 444e464c574c @@ -47535,14 +45436,12 @@ 444a4156414e 444a4152554d 4449584f4e53 -444958494531 444956455232 444956414431 444954544f31 4449504f4c45 44494e4f5241 44494e4b5953 -44494e414d4f 44494e413131 44494d414e31 44494d413932 @@ -47562,10 +45461,8 @@ 444944444c59 4449434b5553 4449434b5331 -4449434b4552 4449434b4544 444941564f4c -4449414e4131 4449414d414e 44494144454d 444858524530 @@ -47632,12 +45529,9 @@ 44424e5a504d 444244424442 444231313039 -444157534f4e 4441574f4f44 4441574e3131 4441564a4143 -444156495331 -444156494431 444156494430 444156455937 444156455353 @@ -47652,11 +45546,8 @@ 444154555241 4441544d414e 444154454d45 -44415354414e 444153484f4b -444153484131 444152544853 -44415252454e 444152524148 4441524d4f4b 4441524c4559 @@ -47669,7 +45560,6 @@ 44414e544536 44414e544533 44414e4e5937 -44414e4e5931 44414e4e4f31 44414e4e4932 44414e4b4552 @@ -47680,11 +45570,8 @@ 44414d534f4e 44414d4f4e42 44414d495231 -44414d49454e -44414d49414e 44414d444f47 44414d41434b -44414c544f4e 44414c4d4154 44414c455352 44414c453038 @@ -47740,11 +45627,9 @@ 43524f574544 43524f4e4552 435249535353 -435245444954 4352414e4e59 4352414e4531 435241474759 -435241444c45 435241434b41 435241423633 435231535053 @@ -47774,7 +45659,6 @@ 434f4f434859 434f4e544552 434f4e4e4543 -434f4e444f53 434f4e444553 434f4e414e54 434f4d534146 @@ -47804,7 +45688,6 @@ 434d4f4e4554 434c59455253 434c55424242 -434c4f564552 434c4f544845 434c4f524f58 434c4b4b454e @@ -47817,8 +45700,6 @@ 434c45414e53 434c41593639 434c41574544 -434c41554445 -434c414e4359 434c414d5053 434b46444a59 434a53303037 @@ -47831,7 +45712,6 @@ 43494f52414e 43494e47495a 43494e44594d -43494e445931 434947415252 4348594e4153 434855544941 @@ -47839,7 +45719,6 @@ 4348554e4b31 4348554d4241 43485545434f -434855434b59 434855434b54 4348524f4d41 434852495330 @@ -47859,7 +45738,6 @@ 4348494c494e 434849434b41 434845574545 -434845565931 4348454d4941 434845494631 434845454d41 @@ -47872,7 +45750,6 @@ 434841524c4f 4348414f5330 4348414e5a45 -4348414e474f 4348414b5249 434841495231 434841443639 @@ -47887,14 +45764,12 @@ 4345594c4552 434557424554 43455442414c -434553534e41 43455256455a 434552474549 434552454741 434550485553 43454e544558 43454649524f -434544524943 4344544e4631 434452495645 43444f535953 @@ -47932,12 +45807,9 @@ 434153414c45 434153414459 434153414241 -434152564552 434152524559 434152504544 -4341524f4c45 4341524d4158 -4341524c4131 434152494e49 434152444946 43415055544f @@ -47964,7 +45836,6 @@ 43414c474152 43414c455441 4341494e4544 -434145534152 43414444454e 434142414c41 433057423059 @@ -47988,16 +45859,13 @@ 4255544f564f 425553545931 425553544f53 -425553544544 42555354414e 425553484945 425553434831 -425552544f4e 425552524953 4255524b4559 42555249414c 42555248414e -425552474552 425552444f4e 42555242414e 425552313132 @@ -48019,7 +45887,6 @@ 425544445948 4255434b5353 425542554b41 -425542424c45 425542424154 425542424144 4253544f4e45 @@ -48030,7 +45897,6 @@ 425259425259 425259414e4d 4252554e4954 -425255494e53 425255434552 42524f4f4453 42524f4e544f @@ -48049,7 +45915,6 @@ 425249434b32 425249313233 425245574841 -425245574552 4252454e5459 425241564f4f 425241564f36 @@ -48079,13 +45944,10 @@ 424f4f474c59 424f4f474545 424f4f465553 -424f4f425331 424f4e5a4f53 424f4e544f4e -424f4e495441 424f4e453939 424f4e444552 -424f4d424552 424f4d42454c 424f4c545353 424f4c534f4e @@ -48099,34 +45961,27 @@ 424f424f3939 424f424f3131 424f424c4545 -424f42434154 -424f42424f42 424f42393939 424f42323232 424f41545353 424d58424d58 -424d57424d57 424d57373330 424d57353233 424d57344d45 424d57303037 424d31323334 424c5742594e -424c554e5453 424c5545424f 424c55453839 424c55453832 424c55453638 424c55453337 -424c55453232 424c4f57494e 424c4f544348 424c4f4f5059 424c4f4f5053 -424c4f4f4459 424c4f4f4437 424c4f4f4435 -424c4f4e4445 424c4f4e4431 424c4f473237 424c4f424c4f @@ -48138,7 +45993,6 @@ 424c415a4532 424c414b454d 424c414b4532 -424c414b4531 424c41495a45 424c41444f57 424c41434b4a @@ -48155,13 +46009,11 @@ 424952443131 42494f544943 42494f544543 -42494e444552 42494e415249 42494e414341 42494c4c444f 42494c4c3238 42494c4c3231 -42494c424f31 42494c42494c 42494b453031 424947564943 @@ -48180,7 +46032,6 @@ 424947434152 424947425241 424947424c55 -424947415353 42494646454e 4249434b4552 424943484553 @@ -48197,29 +46048,23 @@ 42455547454c 424554545959 424554545932 -424554544552 424554524159 424554494445 424554483031 424553545348 424552544f4e -424552544945 424552544845 -424552544841 424552544131 424552455453 424552313233 42454e5a4f4c -42454e544f4e 42454e4d414e 42454d42454d 42454c4c4137 42454c4c4134 -42454c4c4131 42454c4c3131 42454c494e41 42454c465259 -424549525554 4245494e4753 4245494a4f53 424548455354 @@ -48229,11 +46074,9 @@ 424545523939 424545523737 4245454e4552 -4245454d4552 424545424552 424544424544 4245434b5952 -4245434b5931 424542455445 424541565553 424541544348 @@ -48261,7 +46104,6 @@ 424154555241 424154545931 424154544e38 -424154544c45 4241544f4f4c 424154494e47 424154424154 @@ -48275,7 +46117,6 @@ 424152545931 424152544945 42415254454c -42415253494b 424152525942 4241524b494e 424152484154 @@ -48286,11 +46127,9 @@ 42414e47494e 42414e473639 42414e414348 -42414d42414d 42414c4f4f4f 42414c4c5931 42414c4c4f54 -42414c4c4552 42414c4c4544 42414c494e41 42414c45454e @@ -48299,16 +46138,12 @@ 4241494c4c59 42414752414d 4241474c414e -424147495241 424147494e41 424147475a5a 424147474554 424147424147 4241444f4e47 -4241444d414e 424144494e47 -424144444f47 -424144424f59 424144393939 424142595959 424142593032 @@ -48324,7 +46159,6 @@ 423030473352 415a554c4553 415a54454337 -415a415a415a 415a41524941 415a41484152 415a41415a41 @@ -48337,7 +46171,6 @@ 415649524f4e 415649524558 415638544f52 -415554554d4e 415553545241 415553544552 415553333136 @@ -48351,7 +46184,6 @@ 415441524931 415441424f59 415357455254 -415354524f53 415354524159 415353465543 41535341494c @@ -48367,16 +46199,11 @@ 415348425931 415347484152 415345524554 -4153445a5843 415344575358 -415344464748 415344464552 415344455254 -415344415344 415344313437 -415344313233 415344313131 -4153434f4e41 4153414e4f56 415341313030 415334303030 @@ -48391,7 +46218,6 @@ 415250495441 41524e554c46 41524e4f4d41 -41524e4f4c44 41524e494b41 41524e415554 41524d593132 @@ -48424,7 +46250,6 @@ 414e54524158 414e544f4e53 414e544f4e32 -414e54484f4e 414e54415241 414e4e494550 414e4e49454d @@ -48441,7 +46266,6 @@ 414e474c4531 414e474b4f52 414e4749454d -414e47494531 414e47454c55 414e47415241 414e46414e47 @@ -48452,12 +46276,9 @@ 414e44524953 414e4452455a 414e44524558 -414e4452454a -414e44524549 414e44524144 414e4349454e 414e41524348 -414e414b494e 414e41494441 414d59444f47 414d58505550 @@ -48469,7 +46290,6 @@ 414d494e4f56 414d494e414c 414d494c4941 -414d454c4941 414d444b3632 414d42494b41 414d4249454e @@ -48481,7 +46301,6 @@ 414d41524953 414d41434841 414d41313233 -414c57415953 414c56494e41 414c56415245 414c554d494e @@ -48489,10 +46308,7 @@ 414c544f4e41 414c5354524f 414c534e4f57 -414c50494e41 -414c50484131 414c50484130 -414c4f4e534f 414c4f4e4452 414c4f484153 414c4f424152 @@ -48512,15 +46328,12 @@ 414c4b414e45 414c4b414c49 414c49564941 -414c49535341 414c49534153 414c494e4152 414c49434544 414c49434537 414c47455249 414c46413132 -414c45585858 -414c45584941 414c45583934 414c45583931 414c45583930 @@ -48538,8 +46351,6 @@ 414c44524544 414c434f5454 414c43414c41 -414c42494f4e -414c42494f4e 414c4245524f 414c42414e49 414c415a4152 @@ -48561,7 +46372,6 @@ 4149524c4945 414952444f47 41494e555241 -41494b4d414e 41484f41484f 41484d454441 414831393333 @@ -48571,7 +46381,6 @@ 414741504f56 414741474147 414741464f4e -414652494341 414649414649 4146464f5244 414646454354 @@ -48591,8 +46400,6 @@ 4144414d3330 4144414d3236 414355534f4e -414354495645 -414354494f4e 41434c415353 41434b4c4559 41434b455253 @@ -49690,9 +47497,7 @@ 31534556454e 315341444945 315331533153 -315255535459 315241434552 -315151515151 315131573145 315055505059 315052494d45 @@ -49707,32 +47512,25 @@ 314b4c415353 314a554d424f 314a55494345 -314a4f4e4553 314a4f484e32 314a4f484e31 314a414d4945 -314952495348 31475245454b 31474f4f5345 3147495a4d4f 3146554e4e59 314652414d45 31464c415348 -314541474c45 31444f4e4e41 -314441444459 -314352415a59 314352415348 31434855434b 314341534559 3143414d454c 3142554e4e59 -31424c41434b 31424552594c 31414e4e4945 3141444d494e 314142433233 -314141414141 314132423356 314131423143 313939383330 @@ -51333,21 +49131,17 @@ 5a5a5a5a5a58 5a5a5a414141 5a5a5a363636 -5a5a5a313131 5a5a36563359 5a5a31323334 5a5957494543 5a5852393030 -5a584356424e 5a5843564235 5a5843535455 5a5843504f49 5a58434d4e42 5a5843313539 5a5843313437 -5a5843313233 5a5843313131 -5a5843303938 5a5833433235 5a5831325a58 5a5741415244 @@ -51371,7 +49165,6 @@ 5a4f45434154 5a4c4f42494e 5a4954434f4d -5a4950504552 5a49504c4f43 5a4950444f47 5a494d4d4945 @@ -51449,7 +49242,6 @@ 59484e4d4a55 594848374f39 594658464b4a -59464e464b42 594647355332 594556524148 594554544552 @@ -51491,7 +49283,6 @@ 585955585955 585858583132 5858584d5250 -585858363636 585858333333 585448445a52 58524f4e4958 @@ -51508,23 +49299,18 @@ 584945584945 5847535a4451 584655434b58 -5846494c4553 58454e495941 58454e49554d 584458445844 -584348414e47 5843454c5238 584156314552 58414e544f53 -58414e544941 58414e544849 -58414e414455 584149564552 583737375858 583132595533 575941545454 575941545453 -575757575757 575746333136 57574546414e 575741424839 @@ -51546,7 +49332,6 @@ 574f534b584e 574f52534849 574f524d5353 -574f524b4552 574f52443030 574f4f5a4945 574f4f544945 @@ -51555,9 +49340,7 @@ 574f4f445935 574f4f445934 574f4f44524f -574f4d424154 574f4d41484f -574f4c564553 574f4c464645 574f4c464553 574f4c463737 @@ -51581,7 +49364,6 @@ 57494e4b5953 57494e4b454c 57494e475353 -57494e475331 57494e443233 57494c4c5950 57494c4c554d @@ -51593,19 +49375,13 @@ 57494c4c3132 57494c444531 57494c443132 -57494c425552 -57494c425552 -57494b494e47 5749474f5554 -574944444552 5749434b4559 574943434131 57484f594f55 57484f524532 -57484f524531 57484f4f5049 5748495a5a31 -574849544559 574849525259 5748454e4345 574845455a59 @@ -51621,25 +49397,21 @@ 574554303938 574553545932 574553504f54 -5745534c4559 574552544859 574552544550 574552373737 574551554954 57454e463535 57454c534831 -57454c444552 57454a4a4557 5745495a454e 574549484552 -5745455a4552 5745454e5553 5745454e4953 574545444c45 574545444945 574544574159 57454245524e -574542424552 574542383030 574542345941 574532335843 @@ -51652,8 +49424,6 @@ 574156455353 574155574155 574154544552 -574154434831 -574153534552 574153504552 5741534e4f54 5741534c4f50 @@ -51665,7 +49435,6 @@ 574152424c45 57414d57414d 57414d504952 -57414c525553 57414c4c494e 57414c4b4f4e 57414c444931 @@ -51697,13 +49466,11 @@ 564f54455253 564f53584f44 564f52434841 -564f4f444f4f 564f4c545353 564f4c4c444f 564f444b4141 564d35353030 564c41444b4f -564c4144494b 564c41444943 564c41443939 564c41443935 @@ -51711,8 +49478,6 @@ 564a59554a4b 564a514c4a56 56495a415244 -56495649414e -56495649414e 564956455241 564956454b41 5649544f5249 @@ -51724,9 +49489,6 @@ 564953343436 5649524c4f53 564952474f32 -56495247494e -56495247494c -564950455253 564950455234 564950373737 56494f4c4f4e @@ -51757,7 +49519,6 @@ 564943484b41 564943454e54 564943453130 -5649424f5247 5649414e4e41 564759424855 564746554e37 @@ -51768,24 +49529,19 @@ 56464e484a43 564649454e46 564648524a44 -56464845435a 5646434b4a44 56455a494e41 564558465846 -564554544531 564554524958 5645544d4544 564552544947 56455253414c -5645524f4e41 -5645524e4f4e 5645524e4143 564552494e41 564552494c59 564552474f4e 56455247494e 564552474153 -56455244554e 564552444531 564552424552 564552413132 @@ -51796,7 +49552,6 @@ 56454e455245 56454c564941 56454c4f4d41 -564543545241 5644464b4450 564343414137 5643424f4430 @@ -51822,11 +49577,8 @@ 56414e44594b 56414e44454e 56414c545241 -56414c4c4559 -56414c4c4559 56414c4c4553 56414c494556 -56414c455249 56414c454e37 5641494f3137 564144455239 @@ -51842,7 +49594,6 @@ 555345524944 555341474931 555341414d41 -55524c415542 555242494e41 555242414e4f 555242414e31 @@ -51887,7 +49638,6 @@ 55425546594e 545957454544 54595547484a -5459524f4e45 54595249414e 545950485553 54594d4f5241 @@ -51904,7 +49654,6 @@ 54574f32544f 5457495a5449 545749535453 -5457454e5459 545745455a45 545739393939 545732303131 @@ -51914,7 +49663,6 @@ 5455544f4e45 54555252494e 5455524e5550 -5455524e4552 545552424f58 545552424f52 545552424f42 @@ -51943,21 +49691,17 @@ 545255545255 545255535432 545255524150 -5452554d414e 545255455454 -545255434b53 545255434b36 545252494d37 54524f594552 54524f593234 54524f593131 -54524f555431 54524f50504f 54524f4e434f 54524f4e3031 54524f4c4c49 54524f494131 -545249584945 54524953544f 545249534b59 5452494d4552 @@ -51999,9 +49743,7 @@ 544f574e4945 544f574e4552 544f57455232 -544f57455231 544f54555249 -544f544f544f 544f544f3932 544f544f3734 544f544f3639 @@ -52021,7 +49763,6 @@ 544f5050454e 544f504b4154 544f50494e41 -544f50434154 544f50414345 544f4f4d4559 544f4f4d4552 @@ -52034,21 +49775,15 @@ 544f4e593333 544f4e494353 544f4e494131 -544f4d544f4d -544f4d544f4d -544f4d544f4d 544f4d505041 544f4d4d5939 544f4d4d5933 -544f4d4d4945 -544f4d4d4945 544f4d4d4559 544f4d494b4f 544f4d42524f 544f4d415241 544f4d414345 544f4d333231 -544f4d313233 544f4c535449 544f4c4f5341 544f4c49414e @@ -52056,7 +49791,6 @@ 544f49544f49 544f47474931 544f45524147 -544f454d414e 544f44445959 544f44444444 544f44443333 @@ -52077,7 +49811,6 @@ 5449544f3030 54495449544f 544954414e58 -544954414e53 544954414e37 544954414e35 544952455334 @@ -52101,7 +49834,6 @@ 54494752414f 544947455254 544947455242 -544947455232 54494646454e 544945544945 5449444e4142 @@ -52114,7 +49846,6 @@ 544852454444 54484f523231 54484f523130 -54484f4e4753 54484f4d3031 54484f444f41 544849525354 @@ -52126,7 +49857,6 @@ 544845534558 544845534541 54484552554e -544845524f4e 544845524556 544845504947 5448454f3132 @@ -52143,18 +49873,14 @@ 544845414345 544843544843 544841544953 -5448414e4b53 5448414e4449 544841493939 5448314f4e45 54475245454e 544631544631 -544558415353 544558415334 -544558415331 544558343536 544555544555 -54455546454c 544554544554 544554524153 544553545858 @@ -52164,7 +49890,6 @@ 544553543130 54455252594b 544552525935 -544552524f52 544552524f4e 544552524158 544552524141 @@ -52203,7 +49928,6 @@ 544545424545 54454444594b 5445434e4943 -544543484e4f 544543484e49 544541534531 5445414d4f4f @@ -52217,7 +49941,6 @@ 54415a434154 544159465552 54415946554e -5441584d414e 544158495354 544156455241 544155484944 @@ -52232,12 +49955,10 @@ 5441534c494d 544153484552 544153484141 -5441525a414e 544152594e31 544152524148 544152495131 544152474f4e -544152444953 544152415331 544152414e31 544152413639 @@ -52246,7 +49967,6 @@ 54414e5a4552 54414e59414d 54414e594132 -54414e594131 54414e555841 54414e4f4e45 54414e4e494e @@ -52255,11 +49975,9 @@ 54414e474f4f 54414e474f36 54414e474f33 -54414e474f31 54414e414245 54414d53414e 54414d4d5944 -54414d4d5931 54414d4d4552 54414d494e4f 54414c4d4944 @@ -52276,7 +49994,6 @@ 54414b455448 54414b455231 54414b414441 -54414950414e 5441494e5453 5441494e4f53 5441494e3247 @@ -52299,7 +50016,6 @@ 5359534f5053 5359534f5031 5359534d4f4e -53594c564941 53594c564149 535753575357 53574f524b53 @@ -52319,7 +50035,6 @@ 535731393737 5356494e544f 5356494e4b41 -53564554494b 5356454e4e49 5356454c5445 535641524741 @@ -52329,12 +50044,10 @@ 53555353414e 5355534c4f56 535553494553 -535553494551 53555348494c 535553484932 535553414e49 535553414e45 -535553414e41 53555259414e 535552463236 53555052454d @@ -52343,9 +50056,7 @@ 535550494e45 535550455248 535550455239 -535550455237 535550313233 -53554e54414e 53554e4e5947 53554e4e5936 53554e45454c @@ -52353,7 +50064,6 @@ 53554e444554 53554e424541 53554d52414b -53554d4d4954 53554d494e41 53554b4c4141 53554b4b5552 @@ -52371,14 +50081,9 @@ 535459474552 535455524459 53545550494e -5354554d5059 -5354554d5059 5354554d414e 5354554b4153 -53545544494f 535455443130 -535455424259 -535455415254 5354524f5550 5354524f5345 5354524f4445 @@ -52399,20 +50104,15 @@ 53544f4e4534 53544f4c4944 53544f4c4146 -53544f434b53 53544f434b49 53544f313233 53544e414947 53544e363636 5354494e4f4c -5354494e4b59 5354494e4b41 -5354494e4731 -5354494d5059 5354494c4c59 5354494c4c45 5354494c4c31 -535449434b59 535445564558 535445564557 535445564550 @@ -52422,10 +50122,8 @@ 535445525741 535445505331 535445504f4e -535445504831 5354454e4348 535445474759 -535445464649 535445454e31 535445454c4f 535445454c4c @@ -52434,12 +50132,9 @@ 535443535443 535441564552 535441544849 -535441544553 -53544153494b 535441534831 53544153414e 535441525645 -535441525253 535441524959 535441523830 535441523636 @@ -52477,7 +50172,6 @@ 535155494c4c 535155494552 535155494242 -535155415348 5350594d414e 535055525453 535055525337 @@ -52487,7 +50181,6 @@ 535053363738 535053363038 535052494e4b -535052494e47 535052454538 53505245434b 53504f543131 @@ -52496,14 +50189,11 @@ 53504f4b454e 53504f434b4b 53504f434b35 -53504f434b31 53504c4f5348 535049564559 5350494b4537 5350494b4535 535049434532 -535049434531 -53504545444f 535045454449 535045454433 535045415231 @@ -52512,7 +50202,6 @@ 535041545a49 535041524b31 5350414e4f53 -5350414e4b31 5350414e4348 5350414d4d45 535041434539 @@ -52529,7 +50218,6 @@ 534f50483145 534f50483133 534f4f574f4e -534f4f4e4552 534f4f4a494e 534f4e595959 534f4e594d44 @@ -52537,14 +50225,10 @@ 534f4e594135 534f4e593233 534f4e593031 -534f4e4f4d41 -534f4e4e5931 534f4e4a4153 534f4e494338 534f4e494153 534f4e474552 -534f4e415441 -534f4e414c49 534f4d454441 534f4d425245 534f4d424552 @@ -52578,7 +50262,6 @@ 534e4f464c41 534e45474f4b 534e41524646 -534e414b4553 534e414b4537 534e414b4533 534e31504552 @@ -52586,14 +50269,11 @@ 534d55434854 534d50343230 534d50313233 -534d4f4b4945 534d4f4b4532 -534d49544859 534d49544841 534d49544832 534d49525245 534d494c4536 -534d494c4531 534d494c4521 534d49464659 534d49444745 @@ -52630,7 +50310,6 @@ 534c41444531 534c41434b53 534b594c4f52 -534b594c4152 534b59474f44 534b59464f58 534b59424f59 @@ -52646,7 +50325,6 @@ 534b45455441 534b4545424f 534b4154494e -534b41544552 534b41544533 534b414e4b53 534b31323334 @@ -52654,14 +50332,11 @@ 534a4f455244 534958584953 534958534f58 -534958455253 -534958455253 534958454c41 534952524f4e 5349524f4c46 53495053494b 53494e554c41 -53494e474c45 53494e474841 53494e47454e 53494e47454c @@ -52671,16 +50346,13 @@ 53494d504552 53494d4f4e54 53494d4f4e43 -53494d4f4e41 53494d4d4f4e 53494d424134 -53494d424131 53494c564131 53494c4b3132 53494c424552 53494b524554 53494b4b494d -5349474e5550 5349474d414e 5349474d4139 5349474c4552 @@ -52699,7 +50371,6 @@ 534852494654 534852455744 534852454b32 -53484f574d45 53484f543131 53484f525445 53484f4f5445 @@ -52734,7 +50405,6 @@ 534841524c59 534841524b39 534841524b38 -534841524b31 534841504552 5348414e5941 5348414e4945 @@ -52751,7 +50421,6 @@ 5348414b4545 5348414b4531 534841494d41 -534841474759 534841474749 534841464951 534841444f31 @@ -52769,7 +50438,6 @@ 534558593737 534558593455 534558593234 -534558534558 534558504947 534558504943 5345584e4554 @@ -52785,7 +50453,6 @@ 534556455232 534556454e39 534556454e33 -534556454e31 534555524154 534554483133 53455258414e @@ -52794,7 +50461,6 @@ 534552484154 534552474552 534552473132 -534552454e41 53455155494e 534550543638 534550543234 @@ -52815,11 +50481,8 @@ 53454e454741 53454e444d45 53454e414441 -53454c4d4552 53454c4c4953 -53454c494e41 53454c494b41 -53454c454e41 53454c414d49 53454953414e 5345494c4552 @@ -52827,9 +50490,6 @@ 5345484f524e 534547555241 53454755494e -534545534545 -5345454b4552 -5345454b4552 534545445331 534544444f4e 5345424e454d @@ -52851,7 +50511,6 @@ 53434f545439 53434f545436 53434f545430 -53434f544348 53434f525059 53434f525031 53434f504531 @@ -52861,13 +50520,11 @@ 53434857494e 5343484f4c4c 53434845494e -534348414c4b 534348414c41 534345434c49 534341525931 534341524559 53434150494e -5343414c4531 5343414c4152 534330313635 5342524f574e @@ -52888,7 +50545,6 @@ 53415449524f 534154414e58 534154414e49 -534154414e31 534153554b49 534153535937 5341534b554e @@ -52914,7 +50570,6 @@ 53414f444154 53414e54494b 53414e544931 -53414e544131 53414e534f4d 53414e4a414e 53414e494f4b @@ -52922,7 +50577,6 @@ 53414e445950 53414e445941 53414e445936 -53414e44524f 53414e444549 53414e344f5a 53414e34455a @@ -52940,18 +50594,14 @@ 53414d4d4143 53414d4a4f45 53414d415249 -53414d415241 53414d363636 53414d313031 53414d313030 53414d303037 -53414c4d4f4e -53414c4d4f4e 53414c4c594f 53414c4c4559 53414c495348 53414c49444f -53414c455331 53414b544849 534149544f55 534149534149 @@ -52981,7 +50631,6 @@ 5259414e3938 5259414e3835 5259414e3832 -5259414e3832 5259414e3831 5259414e3334 5259414e3233 @@ -53001,11 +50650,9 @@ 52554c455353 5255474d414e 525547425936 -525547425931 525546555354 525546464552 525544593131 -5255444f4c46 525544493639 525544444f43 525544443238 @@ -53018,7 +50665,6 @@ 52544e584547 525359315345 525331323334 -525252525252 525252454545 525246465656 525036363034 @@ -53027,11 +50673,9 @@ 524f59414c32 524f57414e53 524f56494e47 -524f56455231 524f554e4459 524f55474533 524f54544f52 -524f5454454e 524f54534845 524f53534552 524f53494e45 @@ -53042,7 +50686,6 @@ 524f53453233 524f53323334 524f4f545331 -524f4f4e4559 524f4f444f47 524f4e504152 524f4e4e5944 @@ -53063,7 +50706,6 @@ 524f4c4c5337 524f4c4c4f31 524f4c4c4954 -524f4c4c4552 524f4c4c4549 524f4c494153 524f4c455832 @@ -53081,12 +50723,10 @@ 524f4445434b 524f44444444 524f44414a43 -524f434f434f 524f434d414e 524f434b5930 524f434b4f53 524f434b4d4f -524f434b4945 524f434b3838 524f434b3735 524f434b3636 @@ -53096,14 +50736,12 @@ 524f43434f53 524f43313233 524f42535550 -524f42524f42 524f424f5441 524f424d414e 524f424c4545 524f42494e43 524f42494e33 524f42454152 -524f41434831 524d57313233 524d30363930 524b59415245 @@ -53153,7 +50791,6 @@ 524942455241 524854434b4a 52484f444941 -52484f44414e 52484f444131 52475241424e 524656454443 @@ -53165,7 +50802,6 @@ 52464e5a3133 52464b565352 524649524651 -524648425946 52464748464b 524631393434 52455a494441 @@ -53181,15 +50817,12 @@ 524550544152 52455053414a 524550524550 -5245504f5254 -524550454154 524550425946 52454e4e4f43 52454e474157 52454e46524f 52454e444f4e 52454e444954 -52454e415445 52454e414d45 52454d4f3232 52454d4d4945 @@ -53202,10 +50835,8 @@ 524547414c53 524546455245 524545443434 -524545424f4b 524544574159 52454456414e -524544534f58 524544534958 524544534558 524544533737 @@ -53235,13 +50866,11 @@ 524542414e45 524542413639 524541564553 -524541504552 5245414e4e41 5245414c4d43 5245414c3132 524541445953 524541445932 -524541444d45 524457524457 524450575358 524446504648 @@ -53269,14 +50898,12 @@ 52415050454c 5241504f5254 524150495241 -524150494453 524150484945 52414e534f4e 52414e52414e 52414e445952 52414e44594b 52414e444f52 -52414d534559 52414d533939 52414d533133 52414d4f5331 @@ -53295,14 +50922,11 @@ 52414849454d 524147453133 524146414c31 -52414641454c 5241444f5332 5241444f4e45 524144494f50 -524144494f31 524144494341 52414348414c -524143455258 524143454341 524143453031 524142424c45 @@ -53314,7 +50938,6 @@ 523244325232 523131303053 523042455254 -523042455254 523042424945 515a54583030 515745525453 @@ -53328,10 +50951,7 @@ 5155494e5453 5155494e4e59 5155494e4e4e -515549434b31 -515545535431 515545454e5a -515545424543 5155415a4152 515541564552 515541545245 @@ -53350,24 +50970,18 @@ 515151513131 515151323232 514b5448584a -51415a575358 51415a393633 514153514153 5141424c4135 513741345a31 51334552494c 513132333445 -505954484f4e 505753494949 50574f524431 505731393734 505654515246 5055544e494b -505553535953 505553535950 -505553535937 -505553535933 -505553535932 505553534159 505553494b41 505553434849 @@ -53412,7 +51026,6 @@ 5052495a4d41 50524959414e 505249534d53 -5052494d414c 5052494a4f4e 505249455441 505249444553 @@ -53434,7 +51047,6 @@ 505050363636 505041505041 505032323838 -504f57455253 504f57455238 504f57455230 504f55445245 @@ -53445,7 +51057,6 @@ 504f534c4c41 504f53455931 504f53455253 -504f52544941 504f52544153 504f52524554 504f524e3231 @@ -53467,7 +51078,6 @@ 504f4f4c4559 504f4f4c4552 504f4f4c3232 -504f4f4b4559 504f4f4b4131 504f4f484f4f 504f4f464552 @@ -53482,13 +51092,11 @@ 504f4c4f3030 504f4c4c4f53 504f4c494e45 -504f4c494e41 504f4c444552 504f4b4f504f 504f4b455234 504f4b455233 504f49553039 -504f49534f4e 504f49333231 504f47524f4d 504f474f3639 @@ -53517,7 +51125,6 @@ 504954543132 5049544c4552 504954434831 -504953544f4c 504953534d45 504953534945 504953474148 @@ -53581,7 +51188,6 @@ 504556504556 504554564554 504554524132 -504554524131 504554453434 504554453133 504554313233 @@ -53591,7 +51197,6 @@ 504552534545 504552525952 504552525944 -504552525931 50455252454f 5045524c4954 504552474531 @@ -53600,23 +51205,19 @@ 504550453132 504550313233 50454e545449 -50454e533636 50454e524f44 50454e4b494e 50454e474152 50454c4f4e41 50454c4f4e31 50454c41594f -504545574545 5045454b4c45 5045454b4159 5045434f5241 50454341444f 504541434f43 -504541434831 504541434545 504541434544 -504541434531 50434b353839 504349494445 504250425042 @@ -53639,14 +51240,11 @@ 504154533132 50415452594e 50415452494f -50415452494b 50415446414e 504154445945 -504154434831 504153544945 50415353474f 504153534155 -504153534154 504153533230 504153484153 504153415741 @@ -53660,7 +51258,6 @@ 504152414449 504150554741 504150505953 -504150505931 504150504154 504150493237 50415041474f @@ -53683,8 +51280,6 @@ 50414c494e41 50414c415041 50414c414348 -50414c414345 -50414c414345 50414b455441 504149474552 504144445953 @@ -53698,7 +51293,6 @@ 504142534152 5041424c4f5a 5041424c4f35 -5041424c4f31 504131323334 503650394a38 503350503352 @@ -53711,7 +51305,6 @@ 4f5a4552534b 4f58574f5254 4f584947454e -4f58464f5244 4f574e594f55 4f574e454431 4f5649444945 @@ -53720,7 +51313,6 @@ 4f5645523138 4f56434f4d50 4f55544f5554 -4f55544c4157 4f554f554f55 4f5543484945 4f55424c414a @@ -53729,7 +51321,6 @@ 4f54544f3636 4f54544f3132 4f54544f3030 -4f5454415741 4f5453544f59 4f5449533132 4f5449533031 @@ -53739,7 +51330,6 @@ 4f534f444f47 4f534e4f5641 4f534d4f4e44 -4f5343415253 4f5343415249 4f5343415234 4f53414f5341 @@ -53750,7 +51340,6 @@ 4f52524d414e 4f524f5a434f 4f524e415445 -4f524c4f5641 4f524b4e4559 4f52494f4e58 4f52494f4e4e @@ -53765,7 +51354,6 @@ 4f5052414831 4f504d4f504d 4f5045524131 -4f50454e5550 4f50454e5331 4f4f4f545454 4f4f4f484848 @@ -53776,10 +51364,8 @@ 4f4e59583031 4f4e574f4f44 4f4e52555348 -4f4e4c594d45 4f4e4952414d 4f4e454e5554 -4f4e454d414e 4f4e45474149 4f4e45424947 4f4e45344d45 @@ -53861,11 +51447,9 @@ 4e5552414c49 4e554e5a4941 4e554d4e5554 -4e554d424552 4e554d414e31 4e55494e5549 4e5546464552 -4e5544495459 4e5544474552 4e5444424847 4e4f57415953 @@ -53891,13 +51475,11 @@ 4e4f4f523132 4e4f4f4e4553 4e4f4f42394b -4e4f4e4f4e4f 4e4f4e4e4f4e 4e4f4e4e4552 4e4f4d455231 4e4f4c455332 4e4f4b494137 -4e4f4b494131 4e4f47485249 4e4f47414e4f 4e4f46435745 @@ -53913,7 +51495,6 @@ 4e49584e4958 4e4958495353 4e495448494e -4e4950504c45 4e494e4e5931 4e494e4e4945 4e494e47554e @@ -53921,12 +51502,10 @@ 4e494e413939 4e494e413231 4e494e413135 -4e494d49545a 4e494c53454e 4e494c533639 4e494c455348 4e494b4f4e53 -4e494b4f4c45 4e494b4f3030 4e494b4b4f54 4e494b4b4f53 @@ -53967,7 +51546,6 @@ 4e4557544f59 4e4557544552 4e4557534541 -4e45574d414e 4e4557455354 4e4557434154 4e4557424545 @@ -53982,7 +51560,6 @@ 4e455354414d 4e4553534131 4e45524e4552 -4e45524d414c 4e4552494e41 4e4550484931 4e454e454e45 @@ -53990,7 +51567,6 @@ 4e454d524f44 4e454c4c5953 4e454c4c494b -4e454c4c4945 4e45494d4144 4e45494c4c59 4e4549474553 @@ -54024,8 +51600,6 @@ 4e4154344d45 4e415357415a 4e4153545959 -4e4153545931 -4e4153545931 4e4153495231 4e4153494d41 4e4153484552 @@ -54048,7 +51622,6 @@ 4e4148414c45 4e4144554841 4e4144494e4c -4e4144494e45 4e41434f5345 4e4134483649 4e39484c3857 @@ -54056,7 +51629,6 @@ 4e31434b5959 4d5a4e584243 4d59544f4553 -4d5954494d45 4d5953544958 4d5950414745 4d594f574e31 @@ -54064,7 +51636,6 @@ 4d594d494d49 4d594c495341 4d594c494e45 -4d594c494645 4d594a4f4253 4d594a414b45 4d59434f4d50 @@ -54080,7 +51651,6 @@ 4d5635303030 4d5558544152 4d5554543232 -4d55544c4559 4d5554484552 4d5553554249 4d5553494b31 @@ -54088,7 +51658,6 @@ 4d5553484945 4d5552554741 4d5552544859 -4d5552524159 4d5552444f47 4d5550504945 4d5550503354 @@ -54097,10 +51666,8 @@ 4d554d424c59 4d554c564131 4d554c4c4945 -4d554c4c4552 4d554c4a5637 4d554c484552 -4d554c444552 4d554c41544f 4d55484b5548 4d5547534945 @@ -54143,7 +51710,6 @@ 4d4f584a4554 4d4f55534535 4d4f554e5453 -4d4f554c494e 4d4f544f5858 4d4f544f5249 4d4f53544c59 @@ -54158,14 +51724,12 @@ 4d4f53434153 4d4f52545931 4d4f5254454c -4d4f52524953 4d4f524f5a5a 4d4f524f534f 4d4f524f5345 4d4f524b4f56 4d4f52455641 4d4f52454c49 -4d4f52444f52 4d4f52415255 4d4f5241444f 4d4f504f4b4f @@ -54175,7 +51739,6 @@ 4d4f4f524534 4d4f4f4e3939 4d4f4f4e3131 -4d4f4f4b4945 4d4f4f474f4f 4d4f4f473335 4d4f4f444557 @@ -54201,20 +51764,16 @@ 4d4f45444552 4d4f444d414e 4d4f44494e45 -4d4f4445524e 4d4f44454c5a -4d4f44454c31 4d4f434b4552 4d4f43455259 4d4f42593138 4d4f42494c53 -4d4f42494c45 4d4e4d544444 4d4e4d4e4554 4d4e4d4d5347 4d4e4d313233 4d4e42564331 -4d4d4d4d4d4d 4d4d4b4d4d4b 4d4d41414444 4d4c4d4c4d4c @@ -54231,7 +51790,6 @@ 4d495354594c 4d4953545942 4d4953545935 -4d4953545931 4d4953545259 4d4953535950 4d495353594b @@ -54241,7 +51799,6 @@ 4d4953534552 4d495353414e 4d495348414e -4d4953484131 4d4953455231 4d4953434849 4d4953414b49 @@ -54265,7 +51822,6 @@ 4d494c49414e 4d494c463639 4d494c455353 -4d494c414e41 4d494c414441 4d494b554e49 4d494b524f4e @@ -54296,17 +51852,14 @@ 4d494b313233 4d494a4d494a 4d494852414e -4d494841494c 4d4948413138 4d4947524f53 4d4947474945 4d4947313233 4d494554454b -4d4944474554 4d4944474531 4d49434b5944 4d49434b4b4b -4d49434b4945 4d4943484545 4d4943484153 4d494348414e @@ -54321,15 +51874,12 @@ 4d45584d414e 4d455454414c 4d455448594c -4d4554484f44 4d455448414d -4d4554454f52 4d4554414c34 4d4554414c32 4d4553534931 4d455343414c 4d4553414241 -4d45524c4f54 4d4552495441 4d4552495431 4d4552494b45 @@ -54345,12 +51895,9 @@ 4d454e44454e 4d454e344d45 4d454d494e45 -4d454d454d45 4d454d453031 4d454d445548 -4d454d424552 4d454d415449 -4d454c56494e 4d454c4e4d45 4d454c4d414b 4d454c4c4953 @@ -54368,7 +51915,6 @@ 4d4547313233 4d45455a4552 4d45454d4f4f -4d4544494e41 4d4544494336 4d4544494132 4d4544414c53 @@ -54378,7 +51924,6 @@ 4d45414e5454 4d45414e4559 4d4541474552 -4d454147414e 4d444d4f5349 4d444d4d4344 4d444d474353 @@ -54447,7 +51992,6 @@ 4d4153544148 4d4153534958 4d415353494b -4d4153534559 4d41534f4f44 4d41534f4e41 4d41534f4e36 @@ -54475,7 +52019,6 @@ 4d4152544141 4d415254314e 4d4152543131 -4d4152534841 4d4152534831 4d415253414e 4d4152533639 @@ -54484,11 +52027,9 @@ 4d4152504154 4d41524c5953 4d41524c4953 -4d41524c494e 4d41524b5649 4d41524b5448 4d41524b5353 -4d41524b4f53 4d41524b4a45 4d41524b4958 4d41524b4956 @@ -54504,10 +52045,8 @@ 4d41524b3234 4d41524b3231 4d41524b3030 -4d4152495553 4d4152494f4d 4d4152494f34 -4d4152494f31 4d4152494547 4d4152494545 4d4152494543 @@ -54561,7 +52100,6 @@ 4d414c4c4f43 4d414c4b4945 4d414c49474e -4d414c494255 4d414c444552 4d414c424543 4d414b554e41 @@ -54583,7 +52121,6 @@ 4d41484d4148 4d4148414e41 4d4147564149 -4d41474e5553 4d41474e4131 4d41474d4131 4d41474c414e @@ -54596,7 +52133,6 @@ 4d41444d4f4d 4d4144445932 4d4144444552 -4d414444454e 4d4144444459 4d4144424f59 4d4144414d41 @@ -54636,7 +52172,6 @@ 4c594e4e4545 4c594e4e4531 4c55584d414e -4c5554484552 4c5552434831 4c5550555353 4c5550544f4e @@ -54659,7 +52194,6 @@ 4c5543494e44 4c554345524e 4c5543415339 -4c5543415331 4c5543413130 4c5534344947 4c5459424331 @@ -54669,7 +52203,6 @@ 4c534d495448 4c5157455254 4c4f57524559 -4c4f57454c4c 4c4f57453639 4c4f56455236 4c4f56454452 @@ -54683,7 +52216,6 @@ 4c4f56453035 4c4f55564552 4c4f55495332 -4c4f55495331 4c4f55494535 4c4f54555336 4c4f54534f46 @@ -54711,7 +52243,6 @@ 4c4f4c4f3133 4c4f4c4f3132 4c4f4c4d414f -4c4f4c4c4f4c 4c4f4c434154 4c4f4c415353 4c4f4c414c50 @@ -54750,10 +52281,8 @@ 4c4b4a484a48 4c4a5754594e 4c4a55424f56 -4c495a5a5931 4c495a414e4e 4c4957414e41 -4c4956494e47 4c4955424549 4c4953534945 4c4953454e4f @@ -54762,7 +52291,6 @@ 4c4953413939 4c4953413538 4c4953413234 -4c4951554944 4c4950533639 4c4950504945 4c4950494453 @@ -54779,7 +52307,6 @@ 4c494e444152 4c494e44414c 4c494e444148 -4c494e444131 4c494e43414c 4c494d4d4552 4c494d494e45 @@ -54796,7 +52323,6 @@ 4c49455a454c 4c4945525345 4c4944494a41 -4c49434b4552 4c4943484552 4c4942524553 4c4942524136 @@ -54805,8 +52331,6 @@ 4c4941424c45 4c484f545345 4c4847373937 -4c4846524a59 -4c4659424b46 4c4631365453 4c4631303132 4c45595a4946 @@ -54820,10 +52344,8 @@ 4c4556454c34 4c4556454c33 4c45554e414d -4c455453474f 4c45544d4531 4c45534e4152 -4c45534c4559 4c455348494b 4c45524f5942 4c45524e4552 @@ -54910,7 +52432,6 @@ 4c414e434542 4c414e415441 4c414e313233 -4c414d4f4e54 4c414d4f4e44 4c414d495353 4c414d49534d @@ -54918,7 +52439,6 @@ 4c414d313233 4c414c4f4c41 4c41494c4131 -4c41474e4146 4c4147415441 4c4144593435 4c4144593031 @@ -54962,19 +52482,15 @@ 4b5455424a59 4b5451434659 4b544d353235 -4b544d323530 4b5354344b54 4b53454e4a41 4b53454e4959 -4b53454e4941 4b5259544f4e 4b5259534941 -4b525950544f 4b5255544f59 4b5255544f56 4b524f54494b 4b52495a4953 -4b5249535459 4b5249534b41 4b5249534841 4b5249533455 @@ -54994,7 +52510,6 @@ 4b4f54494b41 4b4f54454b35 4b4f53544a41 -4b4f534d4f53 4b4f534d4943 4b4f53313233 4b4f52544553 @@ -55041,8 +52556,6 @@ 4b4e554c4c45 4b4e55464649 4b4e55434b53 -4b4e4f504b41 -4b4e49434b53 4b4d4355575a 4b4d434d4e48 4b4d41524945 @@ -55053,17 +52566,14 @@ 4b4c494d4154 4b4c49454e54 4b4c4552494b -4b4c41555349 4b4c41555345 4b4b4b535353 -4b4b4b4b4b4b 4b4b4b393939 4b4b37363438 4b495a5a5931 4b49594f4e45 4b4954545959 4b4954545950 -4b49544b4154 4b4954414e49 4b495353464d 4b4953534131 @@ -55085,12 +52595,10 @@ 4b494e544552 4b494e544149 4b494e475332 -4b494e475331 4b494e473935 4b494e473930 4b494e473230 4b494e473134 -4b494e444552 4b494d455241 4b494d414e4e 4b494c544945 @@ -55126,7 +52634,6 @@ 4b4554414e50 4b45534c4552 4b4553484148 -4b45524d4954 4b455247414e 4b4552425946 4b4552424155 @@ -55145,7 +52652,6 @@ 4b454c504945 4b454c503131 4b454c4c5943 -4b454c4c4552 4b454c434945 4b454c434559 4b4546464552 @@ -55164,7 +52670,6 @@ 4b424b424b42 4b415a554b35 4b4159544945 -4b41594c4545 4b4159434945 4b4159424545 4b4159313233 @@ -55179,7 +52684,6 @@ 4b4154453232 4b4154415241 4b4153544f52 -4b4153504552 4b41534b415a 4b4153455939 4b4152594e31 @@ -55199,7 +52703,6 @@ 4b4152454e4a 4b4152454e46 4b415245454e -4b4152415445 4b4150504136 4b414f4c494e 4b414e554545 @@ -55235,7 +52738,6 @@ 4b41494c594e 4b414944454e 4b4148414e41 -4b4146464545 4b41424f5441 4b4142414c31 4b413850574f @@ -55261,14 +52763,12 @@ 4a554e453737 4a554e453631 4a554e453130 -4a554e453130 4a554e453034 4a554d504d41 4a554d503434 4a554c593139 4a554c593135 4a554c4b4131 -4a554c495553 4a554c495341 4a554c494f32 4a554c494543 @@ -55279,7 +52779,6 @@ 4a554a554241 4a554943594a 4a5544595959 -4a5544495448 4a5542494c45 4a55414e5041 4a55414e434e @@ -55328,7 +52827,6 @@ 4a4f4a4f3230 4a4f4a4f3133 4a4f484e5943 -4a4f484e534f 4a4f484e4f31 4a4f484e4e49 4a4f484e4b45 @@ -55357,9 +52855,7 @@ 4a4f45313131 4a4f44494531 4a4f44454531 -4a4f4348454e 4a4f41534941 -4a4f414e4e41 4a4f31393738 4a4e58313233 4a4e4a4a4e4a @@ -55371,7 +52867,6 @@ 4a4d4f4f5345 4a4c45564552 4a4b54595246 -4a4b54585246 4a4b4c494e45 4a4b4c464453 4a4b4a4b4b4a @@ -55390,7 +52885,6 @@ 4a494d504154 4a494d4d594d 4a494d4d5934 -4a494d4d4945 4a494d4d4143 4a494d444f47 4a494d424f43 @@ -55420,7 +52914,6 @@ 4a4554444f47 4a4553544f52 4a455353494b -4a4553534943 4a455353454b 4a45534c4545 4a45534a4553 @@ -55444,7 +52937,6 @@ 4a454c4c4f57 4a454c4c4f32 4a454b413335 -4a454646524f 4a4546463636 4a4546463635 4a4546463133 @@ -55456,7 +52948,6 @@ 4a4544493130 4a45434b4c45 4a45414e4e59 -4a45414e4e45 4a45414e4b45 4a44534f3530 4a434d4a434d @@ -55466,14 +52957,12 @@ 4a4332303030 4a4252443535 4a415a5a5959 -4a415a5a5931 4a415a5a4545 4a4159564545 4a4159534558 4a41594d4945 4a41594d4143 4a41594c494e -4a41594a4159 4a415946554b 4a4159424952 4a4157574144 @@ -55486,7 +52975,6 @@ 4a41534f4e56 4a41534f4e34 4a41534f4e30 -4a4152564953 4a4152484541 4a4152454437 4a4152313233 @@ -55530,11 +53018,9 @@ 4a4144455253 4a4144453639 4a4144453037 -4a4143515549 4a41434f4252 4a41434f4243 4a41434b4f46 -4a41434b454c 4a41434b3434 4a41434b3432 4a41434b3238 @@ -55562,7 +53048,6 @@ 495448414b41 495446445549 4954414c5937 -49535241454c 49534f424152 49534d4f494c 49534d414c4c @@ -55570,7 +53055,6 @@ 495345455532 495341504e50 495341464147 -49534142454c 495256494e31 4952554c4531 49524f4e3435 @@ -55578,7 +53062,6 @@ 495249484b41 4952454e4835 4952454e4545 -4952454e4531 495053574943 4950504f434d 49504f574552 @@ -55589,20 +53072,16 @@ 494e56414445 494e544f574e 494e54455256 -494e5445524e 494e54455245 494e54455238 494e54454c34 494e54454752 494e53544954 494e534d414e -494e53414e45 494e4e414947 494e494d4547 494e4943494f 494e48454c4c -494e47524944 -494e4752414d 494e474f4c44 494e474c4553 494e4748414d @@ -55630,7 +53109,6 @@ 494c44494b4f 494c41594441 494b55494b55 -494949494949 494841505059 494838594f55 494755455353 @@ -55640,10 +53118,8 @@ 49474e414345 494749545552 4946514e4659 -494445464958 4944434c4950 4944414d414e -494355383132 494350313233 494341524c59 49424d4f5332 @@ -55665,8 +53141,6 @@ 485642485642 485554434831 485553535958 -4855534b4552 -4855524c4559 48554e544c59 48554e4c454d 48554e4b4945 @@ -55691,35 +53165,27 @@ 484f575a4154 484f57494533 484f57484f57 -484f55534553 484f55435448 484f54585858 484f54574158 -484f54544945 484f5453484f 484f544e4f57 -484f54454c31 484f54444f43 -484f54424f59 484f54424152 484f54415045 484f54313130 484f53533131 484f52545553 484f52534535 -484f524e4554 -484f52414345 484f50453455 484f50453132 484f4f534945 484f4f505332 484f4f4f4f4f 484f4f4b4945 -484f4f4b4552 484f4f424f59 484f4e4f5245 484f4e4b4949 -484f4e455953 484f4e455935 484f4e444139 484f4e444137 @@ -55732,10 +53198,7 @@ 484f4c5a4552 484f4c4c5944 484f4c4c4141 -484f4c474552 -484f4c44454e 484f4c42454e -484f4b494553 484f4747494e 484f4552454e 484f44474945 @@ -55748,14 +53211,11 @@ 484a56584252 484a5646594a 484a4b425242 -48495a494144 484954434831 484953414b4f 4849524f424f 484952495345 48494d414e49 -48494c544f4e -48494c544f4e 48494c4c4152 48494c444131 48494b455232 @@ -55773,17 +53233,13 @@ 4845524d494e 4845524d4941 484552494e47 -48454e544149 48454e4b4b41 48454d453737 48454c544f4e -48454c4d4554 48454c4c4f54 48454c4c4f4b 48454c4c4f38 48454c4c3132 -48454c494f53 -48454c454e45 48454c454e44 48454c444552 484549534552 @@ -55803,7 +53259,6 @@ 48424b48424b 484238323134 48415a454c53 -4841594c4559 484159415449 4841574b5353 4841574b454e @@ -55819,13 +53274,11 @@ 48415252594c 484152525947 484152525939 -484152524953 484152504f4f 4841524e4559 4841524d454c 4841524c4553 4841524b4152 -484152445931 484152443031 484150505944 48414e534f4d @@ -55902,7 +53355,6 @@ 475347534753 475341323736 475335303045 -4752554d5059 4752554d414e 475255454e45 475255444552 @@ -55928,8 +53380,6 @@ 475245473232 475245454e57 475245454e54 -475245454e45 -475245454e31 475245415454 475245415445 475245415432 @@ -55945,7 +53395,6 @@ 475241464954 475241445553 475241434550 -475241434531 475241433145 475238534558 475054455854 @@ -55953,14 +53402,12 @@ 474f56494e44 474f5645524e 474f54544931 -474f54434841 474f54334241 474f53555246 474f53544f53 474f534c4f57 474f53484b41 474f5348494e -474f524d414e 474f52454e47 474f5245414e 474f52445932 @@ -55998,7 +53445,6 @@ 474f474f3031 474f464f5231 474f464d414e -474f46495348 474f4542454c 474f44474942 474f44414c45 @@ -56008,7 +53454,6 @@ 474e55545331 474e54595457 474e46495246 -474c4f525931 474c454e4e42 474c414e4453 474b2e495246 @@ -56018,7 +53463,6 @@ 474a484a3335 47495a4d4f5a 474956455550 -4749554c4941 474953534d4f 4749534d4f53 474953454c4c @@ -56038,7 +53482,6 @@ 474947494e4f 474947415454 47494646494e -474944454f4e 474942424554 4749414e5432 4749414e4341 @@ -56056,16 +53499,13 @@ 4748414c4942 474838313934 474747484848 -474747474747 474745434b4f 474731323334 474655444745 -47464f524345 4746484a444a 474648304b4d 474647463132 474644544b4b -4746444b4252 47455454494e 474554534954 4745544d414e @@ -56075,7 +53515,6 @@ 474552494e47 474552414b4c 474552413233 -47454f524749 47454f524731 47454f464631 47454e544f4f @@ -56098,7 +53537,6 @@ 474441564953 474330303033 474252455454 -4742504c5457 47424c464853 474247424742 47415a5a4552 @@ -56116,10 +53554,7 @@ 4741544d414e 474154455253 474154453232 -474153544f4e -474153504152 4741534d494e -4741534d414e 474153424147 474152593133 474152524f4e @@ -56127,17 +53562,13 @@ 4741524f5441 474152494b31 474152474f4c -47415244454e 474152424f31 474152424147 -474152414e44 47414e553231 47414e474552 47414d4f544f -47414d4d4f4e 47414d4d4135 47414d45424f -47414d424c45 47414c524f4e 47414c4f4f54 47414c4c4554 @@ -56146,27 +53577,22 @@ 474147415241 4741444a4554 474144474954 -474144474554 474142493133 474142425933 474142425932 -474142425931 474141524131 473535353535 473455424748 473142534f4e 47304c44454e 465955544b46 -465954585246 46594e4a5931 -46594c485451 46594c484a59 46594243425a 46585a5a3735 465844585354 4656454c414e 46555a5a5932 -465554555245 465552593636 465552544552 465552524f57 @@ -56176,7 +53602,6 @@ 46554e444950 46554e424f31 46554d494b4f -46554c48414d 46554c414e4f 46554a495441 465547474954 @@ -56188,7 +53613,6 @@ 4655434b4e4f 4655434b4b4b 4655434b4b37 -4655434b4544 4655434b3535 465542415244 465542415237 @@ -56196,13 +53620,9 @@ 46544e444a52 465348415250 465255504158 -46524f5a454e 46524f5a4545 -46524f535941 -46524f535459 46524f534941 46524f4d414e -46524f474759 46524f47474f 46524f473333 46524f473233 @@ -56212,8 +53632,6 @@ 4652495a5a59 465249564f4c 465249545a32 -465249545a31 -465249534b59 465249534348 46524945444c 465249454445 @@ -56240,7 +53658,6 @@ 465245414b5a 465245414b4f 465245414b39 -4652414e4b59 4652414e4b50 4652414e4b4d 4652414e4b4b @@ -56255,7 +53672,6 @@ 464f58585931 464f5850524f 464f58444f47 -464f574c4552 464f55524d45 464f53464f52 464f52554d32 @@ -56266,7 +53682,6 @@ 464f524d4531 464f52494c5a 464f52464f52 -464f52455354 464f52455331 464f52445452 464f52445253 @@ -56311,7 +53726,6 @@ 464c414d414e 464c4147414e 464c30505059 -464b54595246 464b54594631 464b4d5a5943 464b4a44464b @@ -56323,7 +53737,6 @@ 464954434831 464953544f4e 464953484d41 -464953484553 464953483737 464953483030 464953435553 @@ -56352,7 +53765,6 @@ 4649474e5941 464946464552 464945535459 -464945535441 4649444c4552 464944474954 464944454c49 @@ -56363,7 +53775,6 @@ 464748484746 464748343536 464649544552 -464646464646 464646323232 46455348454c 464553435545 @@ -56396,7 +53807,6 @@ 4641544d4143 464154494841 464154444f4e -464153544552 464153543334 464153464153 464152543132 @@ -56440,13 +53850,10 @@ 455653454556 455645525431 4556454e5432 -4556454c494e 4556414e524f 4556414e4745 455641363636 4555534b4144 -4555524f5045 -4555524f5041 45554c49454d 455543485245 455455444553 @@ -56497,8 +53904,6 @@ 454e4f524d45 454e4a47425a 454e49424153 -454e47494e45 -454e45524759 454e4452554e 454e444f5241 454e44495645 @@ -56519,8 +53924,6 @@ 454d414c4545 454d31323334 454c59534545 -454c574f4f44 -454c56495241 454c53544f4e 454c53544552 454c53454c53 @@ -56570,7 +53973,6 @@ 454457494745 454457415231 454453544552 -45444d554e44 4544454e4943 454444593132 454444494e47 @@ -56610,11 +54012,9 @@ 445552414b49 445552414345 445550524559 -4455504f4e54 44554e544f56 44554e544f4e 44554e4e4552 -44554e434531 44554e414556 44554d454c41 44554d424f53 @@ -56674,7 +54074,6 @@ 445245444431 44524543594a 445245414d4d -445245414d31 4452415a454e 44524147554e 445241474f31 @@ -56685,7 +54084,6 @@ 444f574e4945 444f5647414e 444f554e4941 -444f55474945 444f55474859 444f55474842 444f54545931 @@ -56697,7 +54095,6 @@ 444f4f564552 444f4f525252 444f4f4c4945 -444f4f4b4945 444f4f464953 444f4f424545 444f4e4e5953 @@ -56722,7 +54119,6 @@ 444f4c4c5944 444f4c4c5942 444f4c4c4f52 -444f4b544f52 444f494e4b59 444f48424f59 444f47504f4f @@ -56751,7 +54147,6 @@ 444d58313233 444d564c5233 444d4954524f -444d49545249 444d494e4f52 444d444d444d 444d424f4f54 @@ -56780,7 +54175,6 @@ 444952545959 444952545938 444952545933 -444952545931 4449524b3431 444952454b54 44494f534d49 @@ -56804,7 +54198,6 @@ 44494d413838 44494d413236 44494d413136 -44494c4c4f4e 44494c454550 44494c444f45 444947444947 @@ -56814,14 +54207,12 @@ 444945384954 444945363636 4449444e4f54 -4449434b4945 4449434b454e 4449434b454c 4449434b3833 4449434b3737 4449434b3232 444941544f4d -4449414e4e41 4449414e4545 4449414e4150 4449414e4148 @@ -56833,7 +54224,6 @@ 444748443939 444732313735 4446594e4550 -444656474248 44464b544842 444647464447 444642444642 @@ -56849,7 +54239,6 @@ 444556494e37 444556494c35 444556494c33 -444556494c31 444555544348 444555444555 4445544f5832 @@ -56897,8 +54286,6 @@ 44454c494d41 44454c494345 44454c494131 -44454c455445 -44454c455445 44454c424152 44454c413735 44454b434957 @@ -56909,7 +54296,6 @@ 444546494e45 444546414345 444545523131 -4445454a4159 444545464552 444545444f4f 44454445444f @@ -56954,14 +54340,12 @@ 44415a5a4131 4441595a4545 444159554d35 -444159544f4e 444159424544 444157473232 444157473133 4441564c494e 444156494459 444156494451 -444156494445 444156455953 444156454d31 444156454a52 @@ -56978,7 +54362,6 @@ 444152594131 44415257454e 444152544f4e -44415252454c 4441524d4f43 4441524c4131 4441524b4f4e @@ -56992,7 +54375,6 @@ 44415243454c 444152434545 44415155414e -444150484e45 44414e5a4153 44414e59454c 44414e544537 @@ -57006,11 +54388,9 @@ 44414e4e5930 44414e4e4f53 44414e4e4e59 -44414e4e4931 44414e4d4152 44414e4b4553 44414e49545a -44414e494c41 44414e494531 44414e493135 44414e48414e @@ -57030,7 +54410,6 @@ 44414d495241 44414d494e49 44414d49434f -44414d49414e 44414d313233 44414c454b31 44414c44414c @@ -57040,7 +54419,6 @@ 444149535944 444149535933 444149534841 -444149534559 4441494c5931 444149434849 4441474f4154 @@ -57049,7 +54427,6 @@ 444147474954 444146465932 444146464e59 -444145574f4f 444144415747 444143554253 444143313233 @@ -57061,7 +54438,6 @@ 4435304b5459 44334e563352 443244324432 -443132333435 44304e4b4559 44304d494e30 443030465553 @@ -57074,7 +54450,6 @@ 4359434c4532 4359434c4144 435942494c4c -435942455231 43585a5a5843 43564e494b45 4355544d414e @@ -57125,7 +54500,6 @@ 4352415a5953 4352415a5933 435241534853 -435241534831 4352414d4544 435241494759 43524149474d @@ -57140,7 +54514,6 @@ 434f56494e41 434f55525433 434f55504532 -434f554e5459 434f554e5453 434f554e5431 434f55474859 @@ -57148,7 +54521,6 @@ 434f53544552 434f5354454c 434f53544152 -434f534d4f53 434f52554e41 434f5252454f 434f52504f4c @@ -57157,7 +54529,6 @@ 434f5242414e 434f52313233 434f50453232 -434f4f544552 434f4f52534c 434f4f4c4544 434f4f4c3737 @@ -57169,15 +54540,11 @@ 434f4e545552 434f4e544143 434f4e524f45 -434f4e524144 -434f4e4e4f52 434f4e4e414e -434f4e464947 434f4e455931 434f4e454354 434f4e434f52 434f4e414e4e -434f4e414e31 434f4d554944 434f4d534543 434f4d524945 @@ -57194,13 +54561,11 @@ 434f4c4e5a45 434f4c4d4152 434f4c4c4953 -434f4c4c494e 434f4c4c454e 434f4c494252 434f4b455350 434f4a41434b 434f494c4552 -434f48494241 434f44595959 434f44595353 434f44593939 @@ -57230,7 +54595,6 @@ 434c59444545 434c59444542 434c55424259 -434c4f574e31 434c4f554437 434c4f554435 434c4f4e4531 @@ -57238,7 +54602,6 @@ 434c49564531 434c49505345 434c45525553 -434c45524943 434c454f4f4f 434c454f3939 434c454e4348 @@ -57262,10 +54625,8 @@ 434a43464e4d 434956494c53 434956494c31 -434954525553 434954524943 4349544f5249 -434952434c45 434952434531 43494e544849 43494e544153 @@ -57286,7 +54647,6 @@ 434859524f4e 4348594e4131 434855505041 -4348554e4b59 4348554c4f31 434855444459 434855443455 @@ -57295,7 +54655,6 @@ 434855434b47 434855434b42 434852495359 -434852495331 43484f57494e 43484f505331 43484f505041 @@ -57311,7 +54670,6 @@ 434849544f4e 434849525059 43484952494b -434849515549 434849505353 4348494f4441 4348494e4b4f @@ -57330,7 +54688,6 @@ 434849434f4e 434849434f37 434849434b4f -434849434b31 434849424f59 434849424931 434849415645 @@ -57341,7 +54698,6 @@ 434845545459 434845545241 434845543233 -43484552594c 434845515545 4348454e5445 4348454e4f41 @@ -57351,15 +54707,12 @@ 4348454c4153 434845464659 434845454e41 -434845454348 434845444441 -434845434b31 434845424259 4348415a5a5a 434841544954 434841535445 434841534532 -434841534531 434841525431 434841524b59 43484150494b @@ -57425,12 +54778,8 @@ 43415645494e 434154543131 434154533132 -4341544d414e 434154464953 434154303037 -43415354524f -434153504152 -434153494e4f 434153494d49 434153455959 434153455944 @@ -57439,7 +54788,6 @@ 434153453131 434153413031 434152544f4f -434152534f4e 434152534558 434152533132 434152524f42 @@ -57461,7 +54809,6 @@ 434152343435 434150554c4c 43415054414e -4341504f4e45 434150455253 43414e54454c 43414e534552 @@ -57472,7 +54819,6 @@ 43414e445943 43414e445935 43414e444f31 -43414e43554e 43414e43524f 43414e414c53 43414e414c49 @@ -57490,7 +54836,6 @@ 43414c444f52 43414c424152 434149535345 -434149524e53 4341494e3838 4341454c414e 434144455445 @@ -57526,7 +54871,6 @@ 425554544148 425554454e45 425554434832 -425553544544 425553534945 425553534553 42555353454e @@ -57539,7 +54883,6 @@ 4255524e5331 4255524e4954 4255524e4559 -425552474552 42554e4e5959 42554e475553 42554d414741 @@ -57556,14 +54899,11 @@ 4255474c4531 425547454930 425547313233 -4255464f5244 425546465942 425544524f57 4255444f4b41 -4255444d414e 425544474552 425544464f58 -425544444841 4255434b5937 4255434b5933 4255434b4d45 @@ -57592,20 +54932,17 @@ 4252554e4348 4252554d4d31 4252554d4259 -425255494e53 425255494e31 425255474553 425255444130 425255434550 425255434542 -425255434531 42524f575345 42524f574e42 42524f574e39 42524f574552 42524f4e4e59 42524f4e4b4f -42524f444945 42524f444552 42524f414453 425249544f4e @@ -57615,14 +54952,12 @@ 425249434b4b 425249415244 425249414e56 -425249414e41 425249414e37 425249414e34 425245545437 425245545434 4252454e5457 4252454e5435 -4252454e4441 4252454d424f 425245414e4e 425245414b32 @@ -57639,7 +54974,6 @@ 4252414e4439 4252414e4430 425241494e4f -425241484d53 42524147494e 425241444459 425241443734 @@ -57655,8 +54989,6 @@ 424f59313131 424f58455236 424f58313233 -424f57534552 -424f574d414e 424f5746494e 424f5652494c 424f554e4453 @@ -57673,7 +55005,6 @@ 424f5353494b 424f53533639 424f534d414e -424f53434f31 424f525a494b 424f52524f57 424f52495342 @@ -57714,12 +55045,10 @@ 424f4e443132 424f4e43554b 424f4d4f4e44 -424f4c495641 424f4b553132 424f4a414e41 424f494c4544 424f484c454e -424f48494341 424f4844414e 424f47555353 424f47555335 @@ -57733,25 +55062,20 @@ 424f42585858 424f42534558 424f42524f42 -424f424f424f 424f424a4f42 424f42495441 424f42494e45 -424f42455254 424f42454b31 424f42454152 -424f42425953 424f42425945 424f42424f59 424f42424f4f 424f42424259 424f42313030 -424f41544552 424d574d3353 424d57373435 424d57353535 424c55454d41 -424c55453939 424c55453837 424c55453831 424c55453830 @@ -57766,7 +55090,6 @@ 424c4f4f4d31 424c4f4f445a 424c4f48494e -424c4f424259 424c4b505245 424c4b4f5053 424c4b4d414e @@ -57777,15 +55100,12 @@ 424c494e4b4f 424c45574d45 424c454e4453 -424c45414348 424c414e494b -424c414e434f 424c414b4557 424c414b4543 424c41495253 424c41444558 424c41444530 -424c41434b53 424c32393134 424b4d594650 424b4d41464e @@ -57830,12 +55150,9 @@ 4249474d4152 4249474a4552 424947494b45 -424947474945 -424947474552 42494747414c 424947464c59 424947464947 -424947444f47 424947425259 424947424f58 424947424952 @@ -57856,7 +55173,6 @@ 42455a4f4152 424556494e47 424554545952 -424554544552 42455454454e 4245544d414e 424554483939 @@ -57876,8 +55192,6 @@ 4245524b4559 4245524b414e 424552474f4e -424552474552 -42455247454e 424552455454 424552454e44 424552454654 @@ -57890,9 +55204,6 @@ 42454d495353 42454c544f4e 42454c4c4953 -42454c4c4552 -42454c4c4531 -42454c4c4153 42454c4c4133 42454c4c4130 42454c4c3939 @@ -57916,9 +55227,7 @@ 424545465931 424545434831 42454457494e -4245434b4552 4245424f5053 -4245424f5031 424541564531 42454154494e 424541535449 @@ -57930,9 +55239,7 @@ 424541523433 424541523432 424541523233 -4245414e4945 4245414c4154 -4245414b4552 4245414b3030 424541434836 424539343930 @@ -57960,7 +55267,6 @@ 424157434154 424154555441 424154545934 -424154544c45 424154444f47 424153544945 424153544544 @@ -57971,7 +55277,6 @@ 424153454241 424153414e54 424153313233 -424152544f4e 424152544c45 424152544a45 42415253594b @@ -57980,7 +55285,6 @@ 424152525935 424152525932 424152524153 -4241524f4e31 4241524f4441 4241524f434b 4241524e4552 @@ -57988,7 +55292,6 @@ 4241524b4c59 4241524b414e 424152455349 -424152424552 424152414a41 424152414241 424152313233 @@ -58000,7 +55303,6 @@ 42414e4e4f52 42414e4b5353 42414e4b4f46 -42414e4b4552 42414e475549 42414e444f53 42414e313233 @@ -58010,9 +55312,7 @@ 42414c534552 42414c53414e 42414c4d4552 -42414c4c494e 42414c4c4557 -42414c4c4554 42414c4c4545 42414c4c3233 42414c4c3132 @@ -58038,16 +55338,13 @@ 424144444142 42414442595a 424144415845 -424144415353 424144414d53 4241434b5553 42414259444f 424142593333 424142593139 424142593035 -424142494553 424142455332 -424142455331 424142453939 424142453435 424142424552 @@ -58064,11 +55361,9 @@ 415a58435642 415a55524534 415a55524153 -415a5241454c 415a495a4f56 415a45515344 415a45415a45 -415a415a3039 415a31323334 41594f545445 41594c4d4552 @@ -58096,22 +55391,16 @@ 415553544f4e 415552455553 415547494532 -415544495454 -415544493830 4155434f494e -415542524559 415542524545 415542455254 415456424c46 4154544d414e 415454495245 -415454494c41 415454494355 41544f4e4345 41544f4b4144 41544c49454e -41544c415331 -41544b494e53 415446433932 4154454e454f 415445414d31 @@ -58120,12 +55409,10 @@ 41535a58465a 415357513132 415354555445 -415354524131 415354414c41 415353594c41 415353555245 4153534c5652 -415353415353 41534c313233 41534b494d31 415349544953 @@ -58144,7 +55431,6 @@ 415344463231 415344463133 415344463030 -415344415344 415344353535 415344323334 415343485241 @@ -58170,10 +55456,7 @@ 41524d494e31 41524d494441 41524d415441 -41524d414e49 -41524d414e44 41524d41414e -41524c454e45 41524953454e 415249455337 415249454c4c @@ -58181,7 +55464,6 @@ 41524941444e 415249413838 415245454241 -415245413531 4152444e4153 41524354414e 4152434f4c41 @@ -58192,11 +55474,9 @@ 4152414d4f4e 41524146454c 41515758535a -415155494c41 415155455545 415052495449 415052494c49 -415052494c31 41505049414e 415050454c31 415050414c4c @@ -58206,7 +55486,6 @@ 41504554434f 41504552544f 415043415043 -415041434845 415031303932 4150304c4c30 414f4c373737 @@ -58216,10 +55495,8 @@ 414e54574f4e 414e5455414e 414e54525947 -414e544f4e31 414e544f3232 414e54494641 -414e53574552 414e53323030 414e4f4e594d 414e4e554c49 @@ -58254,13 +55531,11 @@ 414e44544845 414e4452454b 414e44524544 -414e44524531 414e44523341 414e42415649 414e414d4152 414e414c3334 414e414b4b55 -414e4142454c 414e31393834 414e31323334 414e31323034 @@ -58296,7 +55571,6 @@ 414c534b3130 414c5048414d 414c50484138 -414c50484133 414c50455254 414c50454e41 414c4f564552 @@ -58326,7 +55600,6 @@ 414c46413135 414c46413131 414c45585341 -414c45584549 414c4558414c 414c45584141 414c45583936 @@ -58341,7 +55614,6 @@ 414c45504830 414c454e4135 414c454b5345 -414c454b5341 414c45475245 414c45454345 414c45434954 @@ -58385,7 +55657,6 @@ 4149474e4552 4149454c4c4f 414944493939 -414944414e41 414944413132 41494352414d 414854554e47 @@ -58397,12 +55668,10 @@ 41474e455345 41474c415941 41474b313233 -414747494553 414745313233 4147435a4e4e 414741594556 414741504531 -414741494e31 414741313233 414731323334 414653414e41 @@ -58416,7 +55685,6 @@ 41454e454d41 414547495331 414456414e43 -41445249454e 41445249454c 41444f524544 41444f4e4159 @@ -58424,7 +55692,6 @@ 41444d494e4e 41444d494e49 41444d494e38 -41444d494e32 41444d414e31 41444d313233 41444a4f494e @@ -58450,7 +55717,6 @@ 414348494b4f 414345523334 4143454f4e45 -4143434f5244 414341434143 41425a313233 414259535331 @@ -58489,7 +55755,6 @@ 413237434444 413153325333 413142455254 -413141324133 413134303135 413132413132 413132333132 @@ -59006,11 +56271,9 @@ 353030373737 345631313632 345452455a50 -345452455a50 345354415253 3453414d4d59 34515047564c -345055535359 344f30503552 344d49535459 344d41544943 @@ -59344,7 +56607,6 @@ 333030313638 333030313532 333030313331 -333030304754 32594f554e47 325941424253 325941313535 @@ -60093,7 +57355,6 @@ 31574f4f4459 31564f494345 315649504552 -315641444552 3155594a5335 315534484b57 31545249414c @@ -60106,15 +57367,11 @@ 31534d414331 31534c415645 315349474d41 -31534841524b 3153434f5554 3153414e4459 -3153414d4d59 315249444552 3152454c4f53 3150554e5454 -3150495a5a41 -315045544552 31504541524c 315045414348 314f52494f4e @@ -60123,22 +57380,16 @@ 314d414d4131 314c4f564555 314c4f564531 -314c494e4441 314b4c415553 314b45495448 31484f4e4559 -31484f4e4441 -31484f4d4552 -314841505059 314655434b53 31465249545a 31464c414d45 31454d494c59 -31454c564953 314455535459 314455434b53 31445245414d -31445245414d 3144494c444f 3144454c5441 3144414e4345 @@ -60147,7 +57398,6 @@ 314359424552 31434c4f574e 314348414d50 -314341534559 314255474759 31424f4f5459 3142494c4c53 @@ -60155,7 +57405,6 @@ 314153443445 314152524f57 31414e475553 -31414e47454c 31414c4c4559 31414c4c4148 31414b495441 @@ -60163,7 +57412,6 @@ 314144414d53 314144414d4a 314132523354 -314131413141 31392d4a554e 3139394c4942 313939393131 @@ -60864,7 +58112,6 @@ 313258413334 313257453334 313257333435 -313251574153 313251573345 31324d415254 31324c4f5645 @@ -60921,7 +58168,6 @@ 313233343838 313233343836 313233343639 -313233343554 313233333235 313233323436 313233323331 @@ -62365,14 +59611,12 @@ 5a59585a5958 5a5958313233 5a5954525958 -5a594a585246 5a585843435a 5a5853544552 5a5845303333 5a5844465459 5a5843565a58 5a5843564236 -5a5843564231 5a5843563737 5a5843563233 5a58414b4552 @@ -62381,9 +59625,6 @@ 5a5745524745 5a5745524731 5a564f4e4b4f -5a56455a4441 -5a56455a4441 -5a5552494348 5a554c555555 5a554c553233 5a554c553132 @@ -62409,7 +59650,6 @@ 5a4f4e544152 5a4f4e494e47 5a4f4e453131 -5a4f4d424945 5a4f4c4f5441 5a4f454c4c41 5a4f38384945 @@ -62433,7 +59673,6 @@ 5a494e4e4552 5a494e4b5931 5a494e46414e -5a494d4d4552 5a494c564552 5a494c4f4c41 5a494c4c4148 @@ -62459,7 +59698,6 @@ 5a45504c494e 5a4550484552 5a4550313233 -5a454e495448 5a454d4c5941 5a454c4c4552 5a454c454e41 @@ -62476,14 +59714,10 @@ 5a41585a4158 5a4156545241 5a4156494552 -5a4152494e41 5a4152413131 -5a41515a4151 5a415050454c -5a4150504131 5a414e444f52 5a414d554e44 -5a414d4f5241 5a414d414e49 5a414b444f47 5a4149313233 @@ -62500,13 +59734,11 @@ 5a305a305a30 595a595a595a 595a32353052 -595959595959 595959363636 595843313233 595638505054 595552494b4f 595552494b41 -59554d59554d 59554d4d5959 59554d4d5932 59554c44555a @@ -62533,7 +59765,6 @@ 594f4f594f4f 594f4d4f4d41 594f4d49534d -594f4d414d41 594f4b4f3232 594f47495441 594f44413737 @@ -62557,7 +59788,6 @@ 5946434e5a39 594641425546 594553574159 -594553534952 594553524544 59454e524142 59454d454e31 @@ -62569,7 +59799,6 @@ 594444455246 594259454b5a 5942524a4b46 -594252424e46 59424c4f4b4f 59424c415445 59424b383235 @@ -62577,7 +59806,6 @@ 5941575a4148 5941545a4545 594154455353 -5941534d494e 59415345454e 594152594152 594152444945 @@ -62591,7 +59819,6 @@ 59414d414b41 59414c4f5645 59414b455253 -594148574548 594148415941 594147554152 5941434b4f31 @@ -62652,7 +59879,6 @@ 58414e544831 58414e4e4f4e 58414e4d414e -58414e444552 58414c494441 584146554f4b 58414348494b @@ -62680,7 +59906,6 @@ 575533343631 575450535359 57544a303138 -57535851415a 575358333231 575357414e31 575352593949 @@ -62688,7 +59913,6 @@ 575350575350 575348434f4e 575334393936 -575249544552 575249535431 575245434b53 575242575258 @@ -62696,7 +59920,6 @@ 5751415a5358 574f575a4552 574f57575757 -574f57534552 574f57393837 574f54534954 574f524d5331 @@ -62713,15 +59936,12 @@ 574f4f445938 574f4f445341 574f4f444c45 -574f4f44454e 574f4f444459 574f4e4b4156 -574f4d414e31 574f4c56454e 574f4c465931 574f4c464659 574f4c464559 -574f4c464552 574f4c463937 574f4c463832 574f4c463735 @@ -62760,8 +59980,6 @@ 57494c4c5954 57494c4c5944 57494c4c5942 -57494c4c4941 -57494c4c4941 57494c4c4554 57494c4c4245 57494c4c3737 @@ -62773,7 +59991,6 @@ 57494c414243 57494752414d 574947485431 -574947474945 574947414e31 57494553454c 574945424b45 @@ -62793,10 +60010,8 @@ 574849544533 5748494d5359 574845454c5a -574845454c53 574841543132 574841535550 -5748414c4552 574841484f4f 574830524553 574741544150 @@ -62817,7 +60032,6 @@ 574552543131 5745524d5554 574552445550 -574552444552 574552434941 574552415344 57454e47454e @@ -62825,7 +60039,6 @@ 57454e445933 57454e444945 57454c4c5332 -57454c4c4552 57454c484e47 57454c444954 57454c43554d @@ -62863,7 +60076,6 @@ 574156453130 574155534155 57415453304e -574154455253 574154455244 574154455239 574154434833 @@ -62880,7 +60092,6 @@ 574152443232 574152424f59 574152363636 -574150424253 57414e57414e 57414e54544f 57414e4e4945 @@ -62894,12 +60105,10 @@ 57414e313233 57414d4d4552 57414c57414c -57414c4e5554 57414c4c594a 57414c4c5937 57414c4c5933 57414c4c4c4c -57414c455331 57414c455232 57414c444f32 57414c44454b @@ -62954,12 +60163,10 @@ 564f52373737 564f50524f53 564f4f4f4f54 -564f4f444f4f 564f4c564f4f 564f4c564f36 564f4c564552 564f4c56454c -564f4c554d45 564f4c4f564f 564f4c4f5349 564f4c4b4c31 @@ -62989,7 +60196,6 @@ 564952555349 564952555332 564952474945 -564950455231 56494f4c4132 56494e4e5943 56494e4d414e @@ -63023,14 +60229,11 @@ 564944485941 5649434b594b 5649434b5934 -5649434b4931 564943494e47 564942455331 564941564941 -5649414c4c49 564941474749 56484d424b42 -564835313530 564831393834 564741504e50 5646594d5a52 @@ -63045,7 +60248,6 @@ 564649463131 564648584552 564648524259 -56464845435a 564644484252 5646435a5246 5645544d4158 @@ -63080,15 +60282,12 @@ 56454e4f4d36 56454e4f4d32 56454e4e4552 -56454e455241 56454e444558 56454e44454c 56454c4f534f 56454c4b594e 56454c494b49 56454b31434f -564548504252 -564547415331 564545524c45 5645454a4152 56434a473554 @@ -63114,7 +60313,6 @@ 564152534954 5641524e4559 564152494544 -564152474153 5641504f3636 56414e594f4b 56414e54555a @@ -63126,10 +60324,8 @@ 56414c50414c 56414c4c4945 56414c455552 -56414c455259 56414c454e5a 56414c454e41 -56414c44455a 56414c444159 56414c444149 564149564149 @@ -63163,17 +60359,14 @@ 555345523332 555345523130 555345523031 -555341524d59 555341465346 555341393131 5552534c4f57 55524f4c4f47 55524d414d41 555242414e45 -5552414e5553 555241425553 5550594f5532 -5550544f574e 555053454c4c 555052433939 55504f4e494b @@ -63185,8 +60378,6 @@ 554e4c455353 554e4954454c 554e4954415a -554e49515545 -554e49515545 554e494b554d 554e49444f53 554e4942454e @@ -63202,7 +60393,6 @@ 554d4e494341 554c59424b41 554c54524141 -554c54524131 554c5249434b 554c52494341 554c49344b41 @@ -63236,13 +60426,10 @@ 545959545959 545955353637 5459534f4e4e -5459524f4e45 545952454e45 -545952414e54 545950455348 545950453132 54594c455241 -54594c455231 545947455253 54584f4e5045 5457594d414e @@ -63253,7 +60440,6 @@ 545749535431 5457494e3639 5457494c4131 -545749474759 545749304b53 545748495445 5457454e5445 @@ -63277,9 +60463,7 @@ 545550415049 545550414334 54554e584953 -54554e4e454c 54554e4c4559 -54554e445241 54554e434c45 54554e413939 54554d4c4548 @@ -63291,7 +60475,6 @@ 545546475559 545546465932 545546464552 -545543534f4e 5455424d414e 545542425331 5455414c4554 @@ -63313,7 +60496,6 @@ 545348414b41 545339393939 545259474f44 -545255544831 5452554e494e 5452554d5053 5452554d5031 @@ -63336,16 +60518,13 @@ 54524f434152 545249574159 545249554e45 -545249544f4e 54524954454b 545249534b41 545249505053 545249504143 54524947454d -545249434b59 545249414e41 545249414c33 -545249414c31 545249414745 54524559424f 545245593939 @@ -63363,27 +60542,20 @@ 545245313233 545241584953 545241564945 -54524156454c -545241534831 545241534552 545241505331 5452414e5358 5452414e5353 5452414e5332 -5452414e4e59 5452414d5041 5452414c4545 -545241494e53 -545241494e53 545241444554 -545241444552 545241435954 545241435950 545241435947 545241435944 545241435453 545241434b45 -545241434b31 545241434153 545241425a4f 545241424249 @@ -63411,7 +60583,6 @@ 544f50534945 544f504c494e 544f50494333 -544f50484552 544f50434f4d 544f50415a37 544f50313139 @@ -63434,7 +60605,6 @@ 544f4e593236 544f4e593233 544f4e593139 -544f4e544f4e 544f4e4b4552 544f4e494e41 544f4e493639 @@ -63453,8 +60623,6 @@ 544f4d434f58 544f4d43494f 544f4d424552 -544f4d41544f -544f4d415445 544f4d414e4e 544f4d303030 544f4c50414e @@ -63462,16 +60630,13 @@ 544f4c4b554e 544f4c494d41 544f4c494b31 -544f4b594f31 544f4b544f4b 544f4b454e52 544f4b414c41 544f48454c4c 544f46494b31 -544f46464545 544f44445931 544f44444552 -544f44415931 544f43415244 544f42494531 544f42455931 @@ -63495,13 +60660,11 @@ 544954535353 5449544f4c41 5449544f3133 -544954494553 544954493133 54495446414e 544954414e45 544954414e36 544954414e34 -544954414e31 54495353454e 544953485341 544953484552 @@ -63520,11 +60683,9 @@ 54494d4f5348 54494d4d594b 54494d4d5935 -54494d4d5931 54494d4d4d59 54494d4b454e 54494d494e41 -54494d455331 54494d453939 54494d453636 54494d44414e @@ -63547,7 +60708,6 @@ 544945524e4f 5449454e4b41 5449454d414e -5449434b4c45 5449434b3639 544942424f48 544941524131 @@ -63591,7 +60751,6 @@ 5448454a4554 544845495354 544845484147 -544845454e44 544845454c46 544845444159 544845435552 @@ -63622,7 +60781,6 @@ 544553543737 544553543636 544553543333 -544553543131 544553535353 544553534c41 54455353494f @@ -63645,7 +60803,6 @@ 54454e475249 54454e455841 54454e44454e -54454e434849 54454e434831 54454e313233 54454d504c41 @@ -63657,7 +60814,6 @@ 54454c45434f 54454c453232 54454b544f4e -54454b4b454e 544545564545 544545525453 5445454e5359 @@ -63692,16 +60848,12 @@ 54422d333033 544231373135 54415a5a3132 -54415a54415a -54415a4d414e 54415a424f59 5441594f5441 5441594f4649 5441594c4152 -5441584d414e 5441584c4157 544157544157 -5441574e4545 544156594d50 54415553454e 54415552494e @@ -63716,7 +60868,6 @@ 5441544f4e45 5441544a414e 544154494f4e -54415449414e 544154414d49 544154413032 544153554b49 @@ -63742,7 +60893,6 @@ 54414e59414b 54414e594147 54414e555741 -54414e4b4552 54414e4b3133 54414e4b3132 54414e4b3031 @@ -63766,7 +60916,6 @@ 54414c494531 54414c494341 54414c494131 -54414c474154 54414c414741 54414b4d414e 54414b494e47 @@ -63807,22 +60956,18 @@ 535a4d415441 5359574e5545 5359534f5052 -53594e544158 53594e4e4552 53594b4f5241 53594355414e 535941535941 535832535832 535754504358 -53574f524453 53574f524432 53574f4f5039 535749504552 5357494e4531 -535749465459 535745545459 535745535745 -535745455459 535745455447 535745455439 535745455435 @@ -63849,12 +60994,9 @@ 53555a493231 535558415353 535556415249 -535554544f4e 535554544f36 535553494534 535553494532 -535553494531 -535553484931 535553415241 535553414e57 535553414e37 @@ -63885,7 +61027,6 @@ 53554d494b41 53554d415941 53554d414e41 -53554c54414e 53554c4c5932 53554c494d41 53554c444f4e @@ -63904,8 +61045,6 @@ 535545344d45 535544534559 535543535543 -5355434b4d45 -5355434b4552 5355434b4153 5355434b4148 5355425a4552 @@ -63925,14 +61064,11 @@ 53545547414e 535455464632 535455444f47 -53545544494f 535455443337 535455443231 535455443132 535455313233 535453545354 -5354524f4b45 -535452454554 535452415742 535452415455 535452415354 @@ -63948,13 +61084,10 @@ 53544f504544 53544f503035 53544f4e4b41 -53544f4e4559 -53544f4e4559 53544f4c545a 53544f4c4c45 53544f4c4945 53544f4c4931 -53544f4c454e 53544f4b4945 53544f4b4559 53544f473231 @@ -63962,21 +61095,17 @@ 53544e49434b 53544d414c4f 53544a4f4553 -535449544348 535449535345 5354494e474f 5354494d554c 5354494a5645 535449494e41 -535449434b59 535449414e45 535445573235 -535445564945 53544556455a 53544556454c 535445564541 535445564539 -535445524e31 53544550494b 535445504853 53544550484f @@ -63984,10 +61113,8 @@ 535445494e49 53544548454e 535445464646 -53544546414e 535445454e38 535445454e32 -535445454c45 53544544414e 535445414d53 535445414c54 @@ -63995,17 +61122,14 @@ 5354444d464e 535441595550 535441594544 -535441545553 53544154494f 535441533935 535441533133 535441525949 535441525454 535441525445 -535441525431 535441525339 535441525338 -535441525231 535441524b59 535441524553 535441523936 @@ -64026,12 +61150,10 @@ 535441464653 535441444955 53544143594b -535441435931 535441434845 535432303032 535431363438 535431353237 -5353574f5244 535353525252 535353444444 535353383838 @@ -64055,15 +61177,9 @@ 535237314242 535234353031 535231323334 -535155495254 -535155494431 535155454547 -53515545414b -535155415245 535155414453 -535059444552 535055544e49 -535055525331 53505552414b 535055474759 535053505350 @@ -64092,7 +61208,6 @@ 535049454c45 535049434538 5350455a5a41 -535045524d41 5350454f4e4b 5350454e5441 53504547454c @@ -64104,11 +61219,8 @@ 535041545a31 535041535331 535041525449 -535041525441 535041524f57 -535041524b53 535041524b4c -535041524b31 535041524335 5350414d414e 5350414d3132 @@ -64126,7 +61238,6 @@ 534f59474159 534f58585858 534f56455354 -534f55544853 534f55505359 534f55503132 534f554e4459 @@ -64142,7 +61253,6 @@ 534f52414741 534f50494b4f 534f4f574f4f -534f4f4e4552 534f4e593830 534f4e593737 534f4e593639 @@ -64152,10 +61262,8 @@ 534f4e534945 534f4e4e5944 534f4e4e4552 -534f4e4e454e 534f4e4a4159 534f4e494b53 -534f4e494353 534f4e494343 534f4e444f47 534f4d534f4d @@ -64173,8 +61281,6 @@ 534f4c494345 534f4c455445 534f4c454e54 -534f4c454e54 -534f4c45494c 534f4c434954 534f4c415233 534f4c414e47 @@ -64190,22 +61296,18 @@ 534f434b4954 534f434b4945 534f43414c31 -534f42414b41 534e55474759 534e55464645 534e55424259 534e4f575933 -534e4f575931 534e4f573737 534e4f573237 534e4f573031 534e4f525245 534e4f524b59 -534e4f4f4b53 534e4f444f47 534e4d433130 534e4956454c -534e49544348 534e49504531 534e49464646 534e49434b53 @@ -64213,7 +61315,6 @@ 534e45525745 534e454a4b41 534e45444c59 -534e41544348 534e41524531 534e41505045 534e41504c45 @@ -64223,13 +61324,10 @@ 534e414b4530 534e41434b59 534e41434b31 -534e30305059 534d59444754 534d55545454 534d4f534d4f -534d4f4b4552 534d4b353238 -534d49544853 534d49544845 534d494c4539 534d494c4533 @@ -64238,7 +61336,6 @@ 534d444c4d4e 534d42534d42 534d41534841 -534d41525431 534d38303031 534d34333231 534d304b3352 @@ -64246,7 +61343,6 @@ 534c59434154 534c56534c56 534c56424f59 -534c5547474f 534c55474731 534c55473232 534c4f564f31 @@ -64260,23 +61356,19 @@ 534c4f4e4345 534c4f47414e 534c4b534c4b -534c49564552 534c494d4d4d 534c494d4544 534c494d4531 534c494d3231 534c494d3135 -534c49444552 534c49434b4b 534c49434b45 534c49434b44 534c49434b39 -534c49434b31 534c49434544 534c49434531 534c47313233 534c45455431 -534c45455059 534c45455032 534c45455031 534c4156414e @@ -64293,7 +61385,6 @@ 534c41434552 534b59593939 534b59544142 -534b594c4552 534b59444956 534b59424c55 534b59314152 @@ -64339,18 +61430,12 @@ 53494f4e4544 53494e555353 53494e544f4e -53494e4e4552 -53494e4e4552 53494e494e45 53494e474954 -53494e474552 53494e454d41 53494e444f47 53494e444849 -53494e424144 -53494e424144 53494e363636 -53494d504c45 53494d504550 53494d4f4e4d 53494d4f4e4a @@ -64371,7 +61456,6 @@ 53494d324241 53494c574552 53494c564955 -53494c564941 53494c53494c 53494c4c5936 53494c4c5933 @@ -64410,7 +61494,6 @@ 53484f545a49 53484f545359 53484f525449 -53484f525431 53484f504b4f 53484f503236 53484f4f5459 @@ -64419,14 +61502,11 @@ 53484f4e5449 53484f4e4441 53484f4c4159 -53484f47554e -53484f47554e 53484f464152 53484f444459 53484f434b45 53484f434b31 53484d494454 -534849545459 534849544954 534849543131 534849525955 @@ -64450,19 +61530,15 @@ 534845525945 534845524f5a 5348454d4152 -5348454c4c53 5348454c4245 5348454c4157 5348454b4152 534845455441 534845424f50 -534845424132 -534845424131 534845415245 5348424f4154 534841574e52 534841574e45 -534841574e41 534841574e35 534841554445 534841545449 @@ -64470,7 +61546,6 @@ 53484152594c 534841525041 534841524f56 -534841524b59 534841524b45 534841524b34 534841524945 @@ -64495,7 +61570,6 @@ 5348414d4531 5348414d4153 5348414d3730 -5348414c4f4d 5348414c4c59 5348414c414e 5348414c4131 @@ -64509,7 +61583,6 @@ 534841484142 534841444945 534841444544 -534841443057 534841424f4f 534841424142 534835313532 @@ -64532,26 +61605,20 @@ 534558593136 534558593034 534558593032 -534558585858 5345584d4158 -5345584d414e 53455843414d 534558424f54 534558345532 534558343536 -534558313233 -534558313233 534558313131 534558303037 5345564d454b -534556454e37 534554555033 53455453554e 534554484552 53455432474f 534554313233 53455353454c -534553414d45 534553414d31 53455253414e 53455252414e @@ -64560,9 +61627,7 @@ 5345524b494e 534552494e45 534552494853 -53455249414c 53455247454e -534552474549 534552474545 534552474532 534552473231 @@ -64581,7 +61646,6 @@ 53454e4f5453 53454e4e4133 53454e4e4132 -53454e454341 53454e44454b 53454d4f4e45 53454d4f4c41 @@ -64592,7 +61656,6 @@ 53454c4c4947 53454c494d53 53454c474145 -53454c454354 53454c424552 53454c414e47 53454c313233 @@ -64620,9 +61683,6 @@ 534541544c45 534541544552 534541525252 -534541524348 -534541524348 -534541524159 5345414e5943 5345414e5931 5345414e454c @@ -64634,7 +61694,6 @@ 5345414e3231 5345414e3133 53454147554c -534541424545 534541313233 534537364541 534454534454 @@ -64643,7 +61702,6 @@ 534446584356 534446333231 534446313233 -5343554c4c59 5343554c4c53 534355425953 534355424147 @@ -64656,7 +61714,6 @@ 534350415353 53434f555454 53434f555433 -53434f555431 53434f524941 53434f4f5441 53434f4f4231 @@ -64686,7 +61743,6 @@ 534341555031 534341525938 53434152424f -5343414e4941 5343414e4552 5343414e3939 5343414c4559 @@ -64728,7 +61784,6 @@ 534152553639 534152544f58 5341524f4a41 -534152495441 53415249414e 534152474953 534152474545 @@ -64742,8 +61797,6 @@ 534152414845 534152414838 534152414834 -534152414832 -534152414831 53415241444f 534152414249 534152413930 @@ -64752,7 +61805,6 @@ 534150313233 53414e594f31 53414e545241 -53414e544f53 53414e544953 53414e544146 53414e535549 @@ -64774,13 +61826,10 @@ 53414d534558 53414d53304e 53414d524154 -53414d504c45 53414d504947 -53414d4d5953 53414d4d594b 53414d4d5943 53414d4d5936 -53414d4d5931 53414d4d5930 53414d4c4545 53414d49544f @@ -64796,7 +61845,6 @@ 53414d414e31 53414d373737 53414d344d45 -53414d313233 53414c56414a 53414c555454 53414c4f4e45 @@ -64806,7 +61854,6 @@ 53414c4c5943 53414c4c5936 53414c4c5933 -53414c4c5931 53414c4c4f57 53414c4c4c59 53414c4b494e @@ -64816,19 +61863,14 @@ 53414c415441 53414c415249 53414c41444f -53414b555241 53414b494e49 53414b494d41 -5341494e5431 5341494d414e -5341494c4f52 5341494c4954 5341494c424f 5341494c3836 -534149474f4e 53414944454e 534148454544 -534148415241 534147524553 534147453731 534147453031 @@ -64841,7 +61883,6 @@ 534145454431 534144574552 534144494548 -534144494531 534144494131 534144455253 534144414641 @@ -64853,7 +61894,6 @@ 534142555231 53414255474f 5341424c4537 -534142494e41 534142425931 534142424945 534141534141 @@ -64871,7 +61911,6 @@ 533343555233 53314d304e45 533132333441 -533132333435 533053305330 52595a413531 5259554b5955 @@ -64895,10 +61934,8 @@ 525748313233 525741575746 5256494c4c41 -525644343230 52555454454e 525554494e41 -525553545932 525553544f4e 525553544544 525553535353 @@ -64943,7 +61980,6 @@ 525542494e4f 525542434f56 525542424954 -525542424552 5255414e4441 525532323232 525532313132 @@ -64962,7 +61998,6 @@ 524f59544f59 524f59444f47 524f5944454e -524f59414c31 524f58593133 524f58584931 524f58494445 @@ -65022,20 +62057,15 @@ 524f4f535441 524f4f4f4f4f 524f4f4d3133 -524f4f4b4945 -524f4f4b4945 524f4f464945 524f4f444542 524f4f333031 524f4e534b49 524f4e4e5953 524f4e4b4552 -524f4e494e31 524f4e434559 524f4e303037 -524f4d45524f 524f4d454f33 -524f4d454f31 524f4d444f54 524f4d415249 524f4d414e4d @@ -65050,7 +62080,6 @@ 524f4a453234 524f48495431 524f47554539 -524f47554531 524f4745524d 524f47455245 524f47455239 @@ -65059,17 +62088,12 @@ 524f454c4f46 524f44574159 524f444f4747 -524f44494f4e -524f44494e41 -524f44454f31 524f44444f4d 524f4444494e 524f44414e31 524f44383838 524f434b5a41 -524f434b5932 524f434b5359 -524f434b4f4e 524f434b4b59 524f434b4545 524f434b4544 @@ -65079,7 +62103,6 @@ 524f4344534c 524f4343434f 524f424f3131 -524f42494e53 524f42425932 524f42335254 524f42313030 @@ -65111,16 +62134,13 @@ 524a31393435 524a31313534 524a31313439 -524956455253 52495645524f 524956455235 524956434f4e 524956414745 -524954544552 524954455348 524954413030 5249534b5942 -524953494e47 524953494b4f 524953484945 52495056414e @@ -65135,7 +62155,6 @@ 52494d424153 52494c45594a 52494c455944 -52494c455931 52494c455232 52494c414e41 52494b524f4b @@ -65152,8 +62171,6 @@ 5249434f3231 5249434f3132 5249434b5937 -5249434b5931 -5249434b4945 5249434b414c 5249434b3637 5249434b3234 @@ -65210,10 +62227,8 @@ 524556524556 5245564f4b45 524556494c45 -524556494557 52455645494c 524556414542 -52455455524e 52455454554e 524554545542 524554544948 @@ -65226,7 +62241,6 @@ 524552454952 524552414e44 524550563234 -524550504550 52455045414c 52454e544f43 52454e544954 @@ -65240,11 +62254,9 @@ 52454e4b454e 52454e454553 52454e45454a -52454e454531 52454e453639 52454e453131 52454e415431 -52454e415244 52454e414345 52454d593132 52454d495832 @@ -65266,16 +62278,13 @@ 524549545a44 52454954454e 5245494e4b45 -5245494c4c59 524549464552 524549455735 524549434834 524549434832 5245484d5448 -524548425746 5245474e4552 5245474c4f48 -52454747494e 524547444142 524547414e31 524547343536 @@ -65286,7 +62295,6 @@ 524545534545 5245454b4552 524545424f50 -52454457494e 524544564554 524544554345 524544544544 @@ -65295,16 +62303,13 @@ 5245444d4742 5245444c4559 5245444b4559 -52454449414c 524544484f47 52454447554d -524544455945 524544445353 524544444556 524544443639 524544443232 524544435550 -524544434152 524544425547 524544414f4c 524544393038 @@ -65315,7 +62320,6 @@ 524544343133 524543555345 5245434d414e -5245424f524e 5245424c4950 524542454c36 524542415253 @@ -65375,8 +62379,6 @@ 52415348454c 524152495459 524152453937 -52415155454c -524150544f52 524150534954 52415050494e 5241504f534f @@ -65393,8 +62395,6 @@ 52414d534953 52414d533630 52414d533031 -52414d524f44 -52414d524f44 52414d4f4e32 52414d4d4954 52414d4d4544 @@ -65420,7 +62420,6 @@ 5241494e3455 5241494e3333 5241494c4552 -52414944454e 524149443132 524148574159 524148554c53 @@ -65431,7 +62430,6 @@ 524148415955 524148313233 524147535353 -5241474d414e 5241464f4c53 5241464b4154 524146413132 @@ -65441,7 +62439,6 @@ 5241444c4552 524144444152 524144415233 -524144415231 524144414d53 524144414556 524144333036 @@ -65451,7 +62448,6 @@ 524143484531 524143455239 524143455237 -524143455231 524142424934 524137353330 524134444f4d @@ -65467,7 +62463,6 @@ 515752545945 515751573131 515745575131 -51574552545a 515745525447 515745525433 515745525254 @@ -65475,7 +62470,6 @@ 515745523130 515745464748 515745363636 -515745313233 5157415a4152 515733345254 515731515731 @@ -65512,18 +62506,14 @@ 514557525459 514554414447 514253343435 -51415a585357 51415a534552 51415a534544 -51415a51415a 51415a4d4b4f -51415a313233 514157533132 514131393836 513832384741 513739534538 513132573334 -513132333445 513131515131 505a4b504657 50594c4f4e37 @@ -65539,15 +62529,11 @@ 505554524944 5055544f4e41 505554494e41 -505553535950 -505553535935 -505553535934 505553484d45 505552564953 505552504c33 505552454c4c 505550505958 -505550505931 505550504953 50554e544153 50554e4b4544 @@ -65592,13 +62578,11 @@ 50524f504144 50524f4a4554 50524f474d41 -50524f464954 50524f464931 50524f464553 50524f434f4f 50524f414348 505249594153 -505249564554 505249544348 5052494f5249 5052494e5459 @@ -65610,7 +62594,6 @@ 50524945544f 505249434545 505245545438 -50524553544f 505245535430 505245535341 505245503237 @@ -65618,7 +62601,6 @@ 505245454345 505242313132 5052414e4142 -5052414c4c59 5052414c494e 505241484132 505241444545 @@ -65639,14 +62621,10 @@ 504f554b4945 504f54554c50 504f54545959 -504f54544552 504f5454414e 504f54484544 -504f5441544f 504f53544f50 504f53544d41 -504f53544552 -504f5354414c 504f53534f4d 504f53455552 504f52544f31 @@ -65664,7 +62642,6 @@ 504f50544152 504f50534945 504f50505959 -504f50505931 504f50504159 504f504f4c41 504f504f4b49 @@ -65689,7 +62666,6 @@ 504f4f4e4544 504f4f4c3132 504f4f483031 -504f4f444c45 504f4f363636 504f4e593132 504f4e593130 @@ -65698,10 +62674,6 @@ 504f4e494353 504f4e494341 504f4e443435 -504f4e43484f -504f4d504559 -504f4d504559 -504f4d4d4553 504f4d4d454c 504f4d414445 504f4c59414b @@ -65731,9 +62703,7 @@ 504f4b524f56 504f4b494531 504f4b455953 -504f4b455931 504f4b455353 -504f4b455231 504f4b454d45 504f4b414734 504f4a4b454e @@ -65775,14 +62745,12 @@ 504c41564958 504c41545459 504c41544f56 -504c41544f31 504c41535445 504c41534a57 504c414e5441 504c414e5435 504c414e4f31 504c414e4954 -504c414e4554 504c414e4348 504c414d4b41 504c414d454e @@ -65815,7 +62783,6 @@ 504950495441 504950455945 504950455234 -504950455231 504950454c45 504950434154 50494e555053 @@ -65826,7 +62793,6 @@ 50494e4f4c4f 50494e4b5936 50494e4b5933 -50494e4b5931 50494e4b5930 50494e4b4f44 50494e4b4553 @@ -65912,11 +62878,9 @@ 504554455933 504554455258 504554455256 -50455445524b 504554455249 504554455238 504554455236 -504554455231 504554454545 504554453939 504554415244 @@ -65944,13 +62908,11 @@ 504551554553 504550534958 504550534943 -504550534931 5045504f4e45 504550494a4e 504550455454 504550454b45 504550453136 -50454f524941 50454e574159 50454e555453 50454e534f4e @@ -65976,7 +62938,6 @@ 5045455a4441 504545543231 504545505331 -504545504545 504545424545 5045444f5445 504544444552 @@ -65987,7 +62948,6 @@ 504541544f4e 50454152534f 504541524c43 -504541434859 504541434535 504541434533 504541325650 @@ -66011,7 +62971,6 @@ 504159494e47 50415743494f 504157415741 -5041564c494b 504156454c50 504156414e45 504156414e41 @@ -66057,7 +63016,6 @@ 504153533535 504153533530 504153533235 -504153533132 504153515541 5041534b4154 5041534b4141 @@ -66076,10 +63034,8 @@ 504152495345 504152495341 504152494749 -504152454e54 504152435552 504152414d49 -50415049544f 504150493334 504150484f53 504150455249 @@ -66099,12 +63055,9 @@ 50414e475553 50414e444141 50414e444135 -50414e444131 50414e444130 -50414e43484f 50414e434849 50414e43414b -50414e414d41 50414d53414d 50414d504153 50414d4d5931 @@ -66113,7 +63066,6 @@ 50414d414353 50414c54454e 50414c4d4f54 -50414c4d4552 50414c464659 50414c415441 50414c414e47 @@ -66122,13 +63074,11 @@ 50414b415941 504149555445 504149504149 -5041494e5431 5041494e4544 504147545041 5041474f5341 504147455253 5041454c4c41 -504144524553 5041444f5545 504144313233 50414352494d @@ -66160,7 +63110,6 @@ 503030504945 50303030304c 4f5a4f5a4f5a -4f5a4f4e4531 4f5a45524b49 4f5a454c4f54 4f5a414e414d @@ -66175,19 +63124,15 @@ 4f5543483132 4f553831544f 4f5538313244 -4f5538313233 4f5538313230 4f54544f3835 4f5454494d4f -4f5454455253 4f5449533639 4f5449533539 4f5449533131 4f544156494f 4f544152494f -4f5354534545 4f53544c3236 -4f535445524e 4f53534d454d 4f53534d414e 4f534f313935 @@ -66201,7 +63146,6 @@ 4f5343415236 4f5341474531 4f5255545241 -4f5254454741 4f52534f4e31 4f5253434845 4f524e455259 @@ -66216,16 +63160,13 @@ 4f5245535445 4f52454e4441 4f5245484f56 -4f5245474f4e 4f5244574159 -4f5243484944 4f5136423843 4f5055534954 4f5055534553 4f5055533939 4f5055533232 4f5055533131 -4f5054494d41 4f5054494b41 4f5054454348 4f50504f5345 @@ -66236,13 +63177,11 @@ 4f4f5354494e 4f4f524c4f47 4f4f50505353 -4f4f4f4f4f4f 4f4f4f4f4f48 4f4f4f4b4b4b 4f4f4f414141 4f4f4f313233 4f4f4c414c41 -4f4f48524148 4f4e594e5441 4f4e59454b41 4f4e544f5552 @@ -66261,7 +63200,6 @@ 4f4d4f4e4c41 4f4d494f4d49 4f4d454c4941 -4f4d45474131 4f4d45474130 4f4d41524954 4f4d414c4c59 @@ -66294,8 +63232,6 @@ 4f4c47413130 4f4c47413031 4f4c45534b41 -4f4c45534a41 -4f4c454e4b41 4f4c454a494b 4f4c454a454b 4f4c45474f4e @@ -66346,14 +63282,11 @@ 4f434e415246 4f4349524e45 4f43454f4c41 -4f4345414e53 4f4343555059 4f4343415348 4f4343414d53 4f434153494f 4f4249453031 -4f4245524f4e -4f42454c4958 4f42414f4241 4f414f414f41 4f414b48414d @@ -66365,7 +63298,6 @@ 4f314f314f31 4f3130375433 4e5a37363534 -4e594a455453 4e59474d4941 4e5943495459 4e574f4e574f @@ -66380,10 +63312,8 @@ 4e5554434154 4e555258414e 4e5552504c45 -4e55524a414e 4e5552313233 4e554d4f4b4b -4e554d424552 4e554d424131 4e554d423334 4e554c554e47 @@ -66442,18 +63372,15 @@ 4e4f52544843 4e4f52544836 4e4f52544832 -4e4f52544831 4e4f52534b45 4e4f524e4f52 4e4f524d4945 -4e4f524d4131 4e4f524d3032 4e4f52474531 4e4f52424552 4e4f52414853 4e4f50504552 4e4f4f534553 -4e4f4f4e414e 4e4f4e4e4143 4e4f4e45434b 4e4f4e453455 @@ -66479,7 +63406,6 @@ 4e4f44445931 4e4f43544953 4e4f424f5a4f -4e4f424f4459 4e4f42494c4f 4e4f414b4553 4e4f39383130 @@ -66509,7 +63435,6 @@ 4e494e414445 4e494e413232 4e494e413034 -4e494d49545a 4e494d495348 4e494c524542 4e494c4f4331 @@ -66523,7 +63448,6 @@ 4e494b4b494b 4e494b4b494a 4e494b4b4935 -4e494b4b4931 4e494b455353 4e494b453939 4e494b453639 @@ -66537,9 +63461,7 @@ 4e494b413939 4e49474c4554 4e4947475548 -4e4947474552 4e4947474148 -4e4947454c31 4e49454c5345 4e4945444552 4e49434f4c53 @@ -66548,7 +63470,6 @@ 4e49434e4154 4e49434b5934 4e49434b5331 -4e49434b4945 4e49434b4553 4e49434b3933 4e49434b3838 @@ -66573,7 +63494,6 @@ 4e4842475448 4e4842455641 4e48414e4b53 -4e475559454e 4e4749474741 4e4743383931 4e46595a3838 @@ -66587,8 +63507,6 @@ 4e4557344d45 4e4556464946 4e4556455237 -4e4556455231 -4e45554d414e 4e45554b4552 4e4555444532 4e4554575a43 @@ -66599,7 +63517,6 @@ 4e4554444445 4e4554434953 4e4554373133 -4e4553544f52 4e45534e454a 4e4553434155 4e4553415453 @@ -66630,7 +63547,6 @@ 4e4549444552 4e4548594252 4e454846594e -4e4547524f4e 4e4547524f31 4e4547414745 4e4546454c49 @@ -66640,7 +63556,6 @@ 4e45434d5246 4e454150454c 4e4537534e45 -4e4531343639 4e4441564953 4e44414e474f 4e4343303031 @@ -66660,7 +63575,6 @@ 4e4156593031 4e415652555a 4e41564f4e41 -4e4156414a4f 4e4156414a41 4e4156414952 4e41554d414e @@ -66676,7 +63590,6 @@ 4e4154413031 4e4154373737 4e4153545953 -4e4153545941 4e4153545939 4e4153544945 4e4153544545 @@ -66693,7 +63606,6 @@ 4e4150504945 4e4150313233 4e414e53454e -4e414e4f4f4b 4e414e4e414e 4e414e4b4552 4e414e49544f @@ -66801,7 +63713,6 @@ 4d555354494b 4d5553544152 4d5553543637 -4d55534c494d 4d55534b5931 4d55534b4f58 4d55534b4559 @@ -66809,13 +63720,11 @@ 4d555349434f 4d5553494339 4d5553494338 -4d5553494331 4d5553484552 4d5553415348 4d5552544c45 4d5552524f4e 4d5552494c4f -4d555249454c 4d5552464545 4d5552444f4b 4d5552415431 @@ -66831,7 +63740,6 @@ 4d554d4d4552 4d554d494a41 4d554d414e41 -4d554c4c4554 4d554c494e4f 4d554c454745 4d554b554e44 @@ -66892,18 +63800,15 @@ 4d4f584e4958 4d4f58494539 4d4f57494e47 -4d4f56494531 4d4f55544859 4d4f55544853 4d4f55544831 -4d4f55534552 4d4f55534537 4d4f554e4f55 4d4f54545338 4d4f54544531 4d4f5452494c 4d4f544f3132 -4d4f54494f4e 4d4f53555241 4d4f5354594e 4d4f5354494e @@ -66917,7 +63822,6 @@ 4d4f5257454e 4d4f5256454e 4d4f5256414e -4d4f5254454e 4d4f52544149 4d4f52504831 4d4f524e494e @@ -66940,7 +63844,6 @@ 4d4f4f534544 4d4f4f534539 4d4f4f524554 -4d4f4f524531 4d4f4f4e4e4e 4d4f4f4e4d45 4d4f4f4e3530 @@ -66955,20 +63858,16 @@ 4d4f4e545531 4d4f4e544953 4d4f4e54494b -4d4f4e544147 4d4f4e534f4f 4d4f4e534f4e 4d4f4e4f4e4f 4d4f4e4e4559 4d4f4e4b3232 -4d4f4e494b41 4d4f4e49434f 4d4f4e474f53 -4d4f4e474f31 4d4f4e47454c 4d4f4e464944 4d4f4e45594f -4d4f4e455932 4d4f4e455924 244d4f4e4559 4d4f4e445256 @@ -66983,7 +63882,6 @@ 4d4f4d4d5942 4d4f4d4d5937 4d4f4d4d5936 -4d4f4d4d5931 4d4f4d494553 4d4f4c4f544f 4d4f4c4c594f @@ -67080,7 +63978,6 @@ 4d49534b4131 4d4953494d41 4d4953484f4b -4d4953484b41 4d4953484141 4d4953484132 4d4953424148 @@ -67105,7 +64002,6 @@ 4d494e453537 4d494e453031 4d494e445932 -4d494e445931 4d494e444941 4d494e44454c 4d494e414556 @@ -67116,7 +64012,6 @@ 4d494d494e4b 4d494d494e45 4d494d414d41 -4d494c544f4e 4d494c4f5531 4d494c4f4f4f 4d494c4f3132 @@ -67134,9 +64029,7 @@ 4d494c494e41 4d494c494b41 4d494c464552 -4d494c454e41 4d494c414e43 -4d494c414e31 4d494c414841 4d494c413132 4d494b4f4c4f @@ -67145,7 +64038,6 @@ 4d494b455950 4d494b45594a 4d494b455934 -4d494b455931 4d494b455858 4d494b455341 4d494b45524f @@ -67174,12 +64066,10 @@ 4d494b453036 4d494b363636 4d49484b454c -4d494755454c 4d4947454c34 4d4945534155 4d49454c4b45 4d4945474153 -4d4944574159 4d49444c4552 4d4944454c4f 4d4944444159 @@ -67188,7 +64078,6 @@ 4d49434b4c45 4d49434b3233 4d4943484931 -4d4943484131 4d49414d4944 4d49414d4936 4d49414d4935 @@ -67210,13 +64099,11 @@ 4d4554544552 4d4554533733 4d4554524f32 -4d4554524f31 4d4554524958 4d45544f4f4f 4d45544f4f31 4d4554494f52 4d4554494552 -4d4554484f44 4d4554414445 4d455353494e 4d455257494e @@ -67243,24 +64130,20 @@ 4d454e484552 4d454e474552 4d454e444950 -4d454e44455a 4d454d50484f 4d454d4f3132 4d454d4d4945 4d454d49544f 4d454d453131 -4d454d424552 4d454d305259 4d454c564953 4d454c544552 -4d454c4f4459 4d454c4d4f45 4d454c4c4f52 4d454c4c454d 4d454c4b4949 4d454c4a414d 4d454c495331 -4d454c494e41 4d454c494841 4d454c494441 4d454c454531 @@ -67271,7 +64154,6 @@ 4d45484d414e 4d45474f4f44 4d45474f484d -4d454748414e 4d4547474552 4d4547414e47 4d4547414e43 @@ -67281,7 +64163,6 @@ 4d45454b4945 4d4545434553 4d4544574544 -4d4544564544 4d4544544543 4d45444f5241 4d45444c4152 @@ -67327,26 +64208,22 @@ 4d415a5a4945 4d415a525837 4d415a4d415a -4d415a444133 4d415a413132 4d415a363236 4d4159534f4e 4d41594d4143 4d41594b4f50 -4d415948454d 4d4159415445 4d4159414e4e 4d4159414d41 4d4159413031 4d4159333830 -4d4158585858 4d4158584544 4d415854524f 4d4158524558 4d41584f5554 4d41584f4e45 4d41584b4b4b -4d4158494d31 4d415844414e 4d4158435553 4d4158414952 @@ -67358,23 +64235,17 @@ 4d4155525553 4d415550494e 4d41554d4545 -4d41554c4552 4d41554c3939 4d41554c3131 4d4155493737 4d4155474c49 4d4155444531 4d4154574549 -4d4154564559 4d4154555241 -4d4154545931 4d4154545331 4d4154544f53 4d4154544d4f 4d4154544958 -4d4154544845 -4d4154544845 -4d415454454f 4d415454414d 4d4154543937 4d4154543832 @@ -67421,19 +64292,16 @@ 4d4152595341 4d4152594d41 4d4152594c55 -4d4152593639 4d4152593136 4d4152593135 4d4152593133 4d4152593130 -4d415256454c 4d415256414c 4d415255534a 4d4152554e41 4d4152554a41 4d415254594a 4d4152545942 -4d4152545931 4d4152545930 4d415254545a 4d4152544934 @@ -67453,7 +64321,6 @@ 4d41524e4943 4d41524d4f52 4d41524c4f55 -4d41524c4f4e 4d41524c4552 4d41524b5953 4d41524b5942 @@ -67470,8 +64337,6 @@ 4d41524b3136 4d41524b3039 4d41524a4f53 -4d4152495941 -4d4152494f4e 4d4152494e49 4d4152494c4c 4d4152494941 @@ -67483,9 +64348,7 @@ 4d4152494539 4d4152494537 4d4152494530 -4d4152494245 4d4152494157 -4d415249414e 4d4152494142 4d4152494135 4d4152494134 @@ -67493,10 +64356,7 @@ 4d4152464141 4d4152455441 4d4152454e41 -4d4152444552 4d415244454e -4d4152434f53 -4d415243494e 4d4152434849 4d4152434838 4d4152434559 @@ -67515,13 +64375,11 @@ 4d414e56454c 4d414e555341 4d414e553031 -4d414e544953 4d414e544845 4d414e544741 4d414e4f5331 4d414e4e414e 4d414e4b494e -4d414e474f53 4d414e474f35 4d414e464154 4d414e445937 @@ -67591,7 +64449,6 @@ 4d414b4b4148 4d414b495458 4d414b494148 -4d414b455231 4d414b454241 4d414b444144 4d414b41524f @@ -67606,7 +64463,6 @@ 4d41494c4c45 4d41494c494e 4d41494b454e -4d414944454e 4d414944414e 4d41484f4e49 4d41484e5353 @@ -67642,12 +64498,10 @@ 4d4144474531 4d414445494e 4d4144445959 -4d4144444945 4d4144434156 4d4144345532 4d4143524f31 4d41434f5338 -4d41434b4945 4d41434b4545 4d41434b3139 4d4143485431 @@ -67728,7 +64582,6 @@ 4c5549534645 4c5549534131 4c5549533232 -4c5549474931 4c5547474552 4c55444f5649 4c55444d494c @@ -67764,11 +64617,9 @@ 4c4f57415241 4c4f564c4559 4c4f56495454 -4c4f56494e47 4c4f56455345 4c4f5645525a 4c4f56455254 -4c4f56455252 4c4f56455245 4c4f56455235 4c4f56454e59 @@ -67780,7 +64631,6 @@ 4c4f56453930 4c4f56453836 4c4f56453835 -4c4f56453639 4c4f56453530 4c4f56453331 4c4f56453238 @@ -67791,10 +64641,8 @@ 4c4f55545245 4c4f55495347 4c4f55495346 -4c4f55495341 4c4f55495336 4c4f55494533 -4c4f55494531 4c4f55434153 4c4f54555339 4c4f54555334 @@ -67804,20 +64652,16 @@ 4c4f54544531 4c4f54543432 4c4f544f5331 -4c4f54484152 4c4f53543131 4c4f534d414e 4c4f53494e47 4c4f5348554e 4c4f53484f4b 4c4f53483837 -4c4f53455231 4c4f53414441 4c4f52544142 4c4f524e414b -4c4f5249454e 4c4f52493132 -4c4f52454e5a 4c4f5245444f 4c4f52414c49 4c4f51554154 @@ -67825,13 +64669,10 @@ 4c4f50455a5a 4c4f50415353 4c4f50414b41 -4c4f4f534552 4c4f4f505459 4c4f4f503132 4c4f4f503030 4c4f4f4b4954 -4c4f4f4b4552 -4c4f4f4b4552 4c4f4e475545 4c4f4e474c59 4c4f4e473435 @@ -67847,7 +64688,6 @@ 4c4f4c4c5953 4c4f4c4c4953 4c4f4c49544f -4c4f4c495441 4c4f4c494e47 4c4f4c494c4f 4c4f4c454b31 @@ -67858,7 +64698,6 @@ 4c4f4c413232 4c4f4c393939 4c4f4c393636 -4c4f4c313233 4c4f4b494e47 4c4f4b493636 4c4f4b493131 @@ -67892,7 +64731,6 @@ 4c4c5a524444 4c4c5a315450 4c4c55564941 -4c4c4f594431 4c4c4c313233 4c4c4c313131 4c4c4b4b4a4a @@ -67906,7 +64744,6 @@ 4c4b4d4c4b4d 4c4b4a534446 4c4b4a504f49 -4c4b4a484746 4c4b4a484731 4c4b49535331 4c4a59545752 @@ -67942,8 +64779,6 @@ 4c4953413135 4c4953413134 4c4952494341 -4c4951554944 -4c4950544f4e 4c494f545441 4c494f4e4e45 4c494f4e4553 @@ -67960,7 +64795,6 @@ 4c494e44524f 4c494e444f4e 4c494e444945 -4c494e44454e 4c494e444155 4c494e444135 4c494e444133 @@ -67977,7 +64811,6 @@ 4c494c4c494c 4c494c4c4941 4c494c4c454e -4c494c495448 4c494c454f4f 4c494c443232 4c494c425249 @@ -67990,7 +64823,6 @@ 4c494a503430 4c49474e554d 4c4947485459 -4c4947485453 4c4947485439 4c4947485437 4c4947485435 @@ -68028,7 +64860,6 @@ 4c4556495331 4c4556454c37 4c4556454c35 -4c4556454c31 4c4556414e54 4c455547494d 4c4554544945 @@ -68087,7 +64918,6 @@ 4c4549464552 4c4549444552 4c4547535550 -4c45474d414e 4c4547415245 4c4547414c53 4c4547414c4c @@ -68102,10 +64932,8 @@ 4c4545424545 4c4544554331 4c4544494449 -4c4543484154 4c45424c454b 4c4542424945 -4c45414e4e45 4c4541464152 4c4453485243 4c444f504153 @@ -68123,15 +64951,10 @@ 4c41594d454e 4c4159444545 4c4158313233 -4c4157594552 -4c4157594552 -4c4157534f4e -4c4157534f4e 4c4157475559 4c41564c5543 4c4156415348 4c4156414341 -4c415552454c 4c4155524545 4c4155524531 4c4155524530 @@ -68143,14 +64966,11 @@ 4c4154455241 4c4154454348 4c4153534f53 -4c4153534945 4c4153534553 4c41534f494f -4c4153455231 4c4152594e58 4c415256414c 4c4152564145 -4c4152525953 4c4152525950 4c4152525936 4c4152525933 @@ -68177,7 +64997,6 @@ 4c414e454c4c 4c414e453333 4c414e453232 -4c414e444f4e 4c414e444f46 4c414e444554 4c414e434f4d @@ -68197,7 +65016,6 @@ 4c41494c4132 4c41494b4b55 4c4149304945 -4c4147554e41 4c41474d414e 4c4147494e41 4c41444e494b @@ -68214,7 +65032,6 @@ 4c324c324c32 4c315a415244 4c314f515059 -4c3139353253 4c3137323050 4c3056334c59 4c304e444f4e @@ -68281,7 +65098,6 @@ 4b524f574131 4b524f544f56 4b524f4e4552 -4b5249535449 4b5249535353 4b5249535341 4b524953494b @@ -68309,7 +65125,6 @@ 4b4f5354454c 4b4f5353414e 4b4f534f4e47 -4b4f534d4f53 4b4f534d4f31 4b4f53484b49 4b4f5254494b @@ -68345,7 +65160,6 @@ 4b4f4d414c41 4b4f4c4f4c4f 4b4f4c4c494e -4b4f4c4c4552 4b4f4c45434f 4b4f4c425931 4b4f4c414e4f @@ -68426,7 +65240,6 @@ 4b495257414e 4b4952554e41 4b4952554841 -4b4952535459 4b4952505055 4b49524b4945 4b49524b4552 @@ -68454,7 +65267,6 @@ 4b494e473030 4b494d4f5641 4b494d4d4d4d -4b494d4d4945 4b494d494e41 4b494d424f4f 4b494d424f42 @@ -68472,7 +65284,6 @@ 4b494b493233 4b4949544f53 4b4946415255 -4b494552414e 4b4944533033 4b49444b4944 4b494445474f @@ -68489,11 +65300,9 @@ 4b48414e4f4d 4b48414e4449 4b48414d4953 -4b48414c494c 4b4841444552 4b475245454e 4b4737333534 -4b4648424346 4b46474a5852 4b46434e4252 4b4632333131 @@ -68526,22 +65335,17 @@ 4b454e44594c 4b454d52414e 4b454d504f31 -4b454c56494e 4b454c544943 4b454c4c5959 4b454c4c5957 4b454c4c5952 4b454c4c5945 4b454c4c5933 -4b454c4c5931 -4b454c4c4945 -4b454c4c4945 4b454c4c414e 4b454c494c41 4b45495a4552 4b4549544845 4b4549544833 -4b4549534841 4b45474c4552 4b4545544f4e 4b4545534a45 @@ -68574,7 +65378,6 @@ 4b41594c414b 4b41594c414a 4b41594c4132 -4b41594c4131 4b41594c4130 4b41594a4159 4b4159424552 @@ -68583,7 +65386,6 @@ 4b4156414e41 4b4156414c41 4b4155524953 -4b41545a454e 4b415459444f 4b4154594141 4b4154554e47 @@ -68591,7 +65393,6 @@ 4b4154544953 4b4154533037 4b415452594e -4b415452494e 4b41544f4559 4b41544f3031 4b4154494550 @@ -68613,12 +65414,10 @@ 4b415353494e 4b4153534944 4b4153534941 -4b4153504552 4b41534b4153 4b4153484941 4b415348414e 4b4153465048 -4b4153455931 4b4153434841 4b4152554b45 4b415254494b @@ -68650,7 +65449,6 @@ 4b414f533639 4b414e574152 4b414e54494b -4b414e534153 4b414e494e41 4b414e453232 4b414e445241 @@ -68672,7 +65470,6 @@ 4b414c54454e 4b414c50414b 4b414c4d4941 -4b414c4c4531 4b414c495941 4b414c495341 4b414c494556 @@ -68682,8 +65479,6 @@ 4b414c2d454c 4b414c45454e 4b414c424932 -4b414b545553 -4b414b545553 4b414b4b4131 4b414b41504f 4b414b414c41 @@ -68693,7 +65488,6 @@ 4b4149544149 4b4149424142 4b4149354553 -4b4148554e41 4b41484c4552 4b4148414b4b 4b41474f4154 @@ -68736,7 +65530,6 @@ 4a554e4b5931 4a554e4b3132 4a554e495553 -4a554e454155 4a554e453939 4a554e453839 4a554e453335 @@ -68745,7 +65538,6 @@ 4a554e453037 4a554e453033 4a554e453032 -4a554d504552 4a554d504544 4a554d503234 4a554d503131 @@ -68754,7 +65546,6 @@ 4a554c593032 4a554c593031 4a554c4c4945 -4a554c494554 4a554c494550 4a554c494545 4a554c494157 @@ -68766,7 +65557,6 @@ 4a554a595452 4a554a553132 4a554a553131 -4a5549435931 4a5549434533 4a55474a5547 4a5547475353 @@ -68791,7 +65581,6 @@ 4a53544f4e45 4a534d4a534d 4a5345353234 -4a5342414348 4a5332313636 4a5331303433 4a5330383231 @@ -68824,7 +65613,6 @@ 4a4f53483035 4a4f53455045 4a4f53454d49 -4a4f53454d41 4a4f5345464f 4a4f5345414e 4a4f53453639 @@ -68854,15 +65642,11 @@ 4a4f4c543152 4a4f4c4f4753 4a4f4c494553 -4a4f4c454e45 4a4f4c415348 4a4f4c414e44 -4a4f4b455253 4a4f4b45524a 4a4f4b455249 4a4f4b455241 -4a4f4b455237 -4a4f4b455231 4a4f4b323230 4a4f4a4f4d4f 4a4f4a4f3233 @@ -68888,7 +65672,6 @@ 4a4f484e3033 4a4f484e3030 4a4f48414e53 -4a4f48414e4e 4a4f48414e32 4a4f45595959 4a4f45594246 @@ -68961,7 +65744,6 @@ 4a494e594e41 4a494e524f48 4a494d4c4144 -4a494d424f42 4a494d424f34 4a494d393939 4a494d373737 @@ -68983,7 +65765,6 @@ 4a48474a5231 4a48454c554d 4a4841574b31 -4a4841574b31 4a47554e4e53 4a475245454e 4a474a474a47 @@ -68991,7 +65772,6 @@ 4a4749524c53 4a4649494e43 4a4648373533 -4a4557454c53 4a4556414e53 4a4554545931 4a4554545454 @@ -69035,8 +65815,6 @@ 4a454e533031 4a454e4e5939 4a454e4e5936 -4a454e4e5931 -4a454e4e4131 4a454e4e3639 4a454e494345 4a454e494341 @@ -69045,7 +65823,6 @@ 4a454d4a454d 4a454c4c5942 4a454c4c4945 -4a454c454e41 4a454b454c4c 4a454b413131 4a4546463638 @@ -69063,7 +65840,6 @@ 4a4544493131 4a454249544f 4a4541534f4e -4a45414e4e45 4a45414e3233 4a4453495445 4a4453485351 @@ -69095,7 +65871,6 @@ 4a415a5a5a59 4a415a5a5944 4a415a5a5942 -4a415a5a495a 4a415a5a4954 4a415a5a4953 4a415a5a3737 @@ -69107,7 +65882,6 @@ 4a415a4a415a 4a41595a4545 4a415956414e -4a4159534f4e 4a415953414e 4a4159524f44 4a4159524159 @@ -69120,7 +65894,6 @@ 4a4158544f4e 4a41584d4158 4a4156494f4e -4a4156494552 4a4156413455 4a4156413131 4a4155465245 @@ -69136,7 +65909,6 @@ 4a41524f4445 4a41524f4431 4a4152454432 -4a4152454431 4a4152444f4e 4a415244454c 4a415242524f @@ -69153,7 +65925,6 @@ 4a414e455442 4a414e455441 4a414e455438 -4a414e455431 4a414e454e45 4a414e454c49 4a414e415941 @@ -69170,7 +65941,6 @@ 4a414d494535 4a414d494148 4a414d45535a -4a414d455332 4a414d455253 4a414d454b53 4a414d424552 @@ -69198,7 +65968,6 @@ 4a4148343230 4a4147554141 4a4147533238 -4a4147474552 4a4147313233 4a4146464152 4a4146464131 @@ -69214,9 +65983,7 @@ 4a41434f4254 4a41434f4241 4a41434d4143 -4a41434b534f 4a41434b5331 -4a41434b4554 4a41434b3935 4a41434b3934 4a41434b3734 @@ -69271,17 +66038,13 @@ 49534f564552 49534f544f50 49534e494348 -49534d41494c 49534b494e47 495349434943 495348415241 -4953434f4f4c 495342385858 -495341494148 495341444f52 495341414347 495341313233 -495256494e45 495255534a41 4952554e4b41 495253484144 @@ -69291,11 +66054,8 @@ 49524f49524f 49524e4a554e 49524a4b4632 -495249534b41 49524953484b -495249534841 495249534838 -495249534831 495249534553 4952494e4531 4952494e414b @@ -69311,7 +66071,6 @@ 4950534e4150 49504f4c4954 49504b495353 -4950484f4e45 495045434143 495041544f56 494f4e454c41 @@ -69325,8 +66084,6 @@ 494e54454e44 494e54454348 494e54414659 -494e53494445 -494e53414e45 494e50555453 494e4f494e4f 494e4e413236 @@ -69335,10 +66092,8 @@ 494e4b455253 494e494b4942 494e484f5345 -494e48454154 494e47564152 494e47555348 -494e474f4c44 494e47494e47 494e46524545 494e46414e54 @@ -69348,19 +66103,16 @@ 494e44593232 494e4449474c 494e44494153 -494e44494131 494e43484552 494e43414e54 494e344d4958 494e32594f55 494e32303030 494e31393639 -494d5a414449 494d5449415a 494d5052455a 494d50495348 494d50455241 -494d50414354 494d4f4e4954 494d4e494b45 494d494e4954 @@ -69370,7 +66122,6 @@ 494d41433939 494c55565453 494c55564a43 -494c4f564555 494c4f564554 494c4f564552 494c4f56454e @@ -69427,7 +66178,6 @@ 494331345532 494255494c44 494252414849 -49424d49424d 49424d473732 49424d313233 49424c454553 @@ -69445,7 +66195,6 @@ 494146483931 4938554f5554 493152324133 -493132333435 493131313131 485959504941 485954454348 @@ -69457,10 +66206,8 @@ 485941444553 485559485559 485558303035 -48555354454e 485553534559 485553533737 -4855534b5931 485552544f4d 485552544c45 485552524159 @@ -69469,11 +66216,8 @@ 48554e48554e 48554e473132 48554d504544 -48554d425547 -48554d425547 48554d414e31 4855474f3030 -485547484553 485547455354 485547453639 485545545445 @@ -69494,19 +66238,16 @@ 484f55534534 484f54545953 484f54544f50 -484f54544945 484f54544541 484f54504f50 484f544f494c 484f544e4958 484f544d4958 484f544c5556 -484f54484f54 484f5448414d 484f54474952 484f54444159 484f5444414d -484f54424f58 484f54415255 484f54363636 484f54313030 @@ -69515,7 +66256,6 @@ 484f53533639 484f5348494e 484f53484541 -484f53455231 484f52555331 484f52544558 484f52535449 @@ -69523,19 +66263,16 @@ 484f52534537 484f52534533 484f524e5937 -484f524e4559 484f524e3730 484f524e3031 484f5247454e 484f50534f4e 484f50505931 -484f5050454c 484f50453939 484f50453232 484f4f594141 484f4f574148 484f4f544953 -484f4f544945 484f4f505333 484f4f504945 484f4f474945 @@ -69550,7 +66287,6 @@ 484f4d455947 484f4d455932 484f4d455332 -484f4d45524a 484f4d455236 484f4d455234 484f4d455230 @@ -69560,11 +66296,9 @@ 484f4d424f59 484f4c4c5957 484f4c4c494e -484f4c4c4945 484f4c495353 484f4c453139 484f4c414c41 -484f4b494553 484f494e4b45 484f47504841 484f47475931 @@ -69585,13 +66319,11 @@ 484a4e484a4e 484a4b4c3939 484a4b4b5448 -484a4343425a 484959413632 484958534f4e 484957415454 484954544d45 4849544d5550 -4849544c4552 484954414348 4849534f4b41 484952494e47 @@ -69605,7 +66337,6 @@ 48494d494b45 48494d48494d 48494c4f5249 -48494c444131 48494c415249 48494b495441 4849484f3631 @@ -69655,10 +66386,8 @@ 48454e52594b 48454e525946 48454e4e4131 -48454e4c4559 48454e4b3031 48454e49454b -48454e475354 48454e47454c 48454d50454c 48454d4d4552 @@ -69673,12 +66402,10 @@ 48454c4c4f50 48454c4c4953 48454c4c4741 -48454c4c4153 48454c4c4131 48454c495345 48454c454e4d 48454c454e37 -48454c454e31 48454c454e30 48454c45454e 484549544f52 @@ -69696,11 +66423,9 @@ 484542454742 484541565953 484541565932 -484541544831 484541543130 484541523455 484541445550 -484541444552 484541444544 484541444444 484531303234 @@ -69720,7 +66445,6 @@ 48415a454c4c 48415a454c38 48415a453133 -4841594e4553 4841594d4f4e 4841594b4f54 484159444e31 @@ -69734,7 +66458,6 @@ 4841574b3135 484157484157 484156454e31 -484156414e41 4841554f4c49 4841554c4c4c 484155484155 @@ -69743,7 +66466,6 @@ 484154455532 484154434831 48415353454e -48415353414e 484153534149 4841534c414d 484153414e41 @@ -69814,7 +66536,6 @@ 48414c4c454e 48414c494445 48414c455933 -48414c455931 48414c415641 48414c393030 48414c333030 @@ -69874,7 +66595,6 @@ 475554544544 4755544d414e 475553544f31 -475553544156 475553534152 47555348415a 475552553132 @@ -69898,7 +66618,6 @@ 47554d425938 47554c5a4152 47554c53494d -47554c4e415a 47554c494b4f 47554954454e 475549534d4f @@ -69945,7 +66664,6 @@ 4752494e4730 4752494e4453 4752494d3636 -4752494c4c45 475249474f52 475249455345 475249443737 @@ -69965,21 +66683,17 @@ 475245454e58 475245454e50 475245454e49 -475245454e45 475245424552 475245415435 -475245415345 475244454144 475244414e45 475241593131 47524156454e 4752414e544c 4752414e5441 -4752414e4e59 4752414e4559 4752414e4437 4752414e4259 -4752414d5053 475241464646 475241444541 475241443939 @@ -69991,12 +66705,10 @@ 47524142454e 475241394445 475241334445 -4752384f4e45 475238375345 475041474553 47503937534c 475031343030 -474f57524f4e 474f564e4f31 474f55524f55 474f55524453 @@ -70022,23 +66734,19 @@ 474f5242414e 474f52415448 474f504c4159 -474f50484552 474f4f534545 474f4f534537 474f4f504944 474f4f504552 474f4f4f5345 -474f4f4e4552 474f4f4d4552 474f4f4d414e -474f4f474c45 474f4f47454e 474f4f464659 474f4f455953 474f4f445931 474f4f445353 474f4f424148 -474f4e5a4f31 474f4e4e4552 474f4e47594f 474f4e455253 @@ -70104,13 +66812,10 @@ 474c55494e47 474c55484f56 474c55474c55 -474c5545434b -474c4f564552 474c4f525942 474c4f50455a 474c4f4d4152 474c4f434b45 -474c4f434b31 474c494e4b41 474c494e4441 474c494d4659 @@ -70136,7 +66841,6 @@ 47495553544f 474955534841 4749545a4954 -474953454c41 4749524c5a5a 4749524c5953 4749524c4c4c @@ -70151,7 +66855,6 @@ 47494e544552 47494e54414b 47494e4f3939 -47494e4e5931 47494e474b4f 47494d4d4552 47494c544f54 @@ -70169,7 +66872,6 @@ 474947493232 474946544553 4749454e4b41 -474944474554 474942425359 4749414e5454 474941345453 @@ -70206,7 +66908,6 @@ 474554534f4d 474554524544 4745544e4f57 -474554495431 474554434841 4745534e4552 474552594f4e @@ -70225,12 +66926,10 @@ 47454e544558 47454e4e4149 47454e474552 -47454e455641 47454e455337 47454e455331 47454e414449 47454e313233 -47454d4d4131 47454d314e31 47454c494e49 47454c415449 @@ -70243,7 +66942,6 @@ 4745454b4552 474545454550 474545444545 -474544454f4e 474544444553 474542455254 474541525331 @@ -70265,14 +66963,12 @@ 474159424f42 4741574b3352 474156494e43 -474155544945 474154545355 474154544953 4741544f525a 474154474154 474154454552 474154453838 -474153544f4e 47415353414e 474153505241 4741534b494e @@ -70283,7 +66979,6 @@ 474152593132 474152593130 474152593038 -474152494f4e 474152494d41 47415249414e 47415244454c @@ -70301,8 +66996,6 @@ 47414e444131 47414e414741 47414d4d4552 -47414d4d4131 -47414d455331 47414c554e41 47414c54454e 47414c4f5432 @@ -70321,9 +67014,7 @@ 4741494c3233 474149445953 4741474e4f4e -474147474147 47414741555a -47414554414e 474145525445 474144474144 474144454e47 @@ -70344,7 +67035,6 @@ 473247425945 473147324733 4731414e5453 -473030424552 473030423352 465a52343030 465a44484252 @@ -70361,7 +67051,6 @@ 46555a5a5a5a 46555a5a5953 46555453414c -465554424f4c 465552524259 465552514154 4655524b4154 @@ -70370,7 +67059,6 @@ 465552425953 46554e544f4d 46554e54494d -46554e54494b 46554e4e4552 46554e4b3639 46554e47554d @@ -70382,7 +67070,6 @@ 465549554d44 46552d485541 465547474c59 -465545535345 465545525354 465545474f53 465544474945 @@ -70430,16 +67117,13 @@ 4652494c4c53 465249455a45 465249454453 -465249444745 465249434b45 -465245554e44 465245524553 465245465245 465245455354 465245455348 465245454b4f 46524545454b -465245454545 465245454245 465245453639 465245453535 @@ -70455,7 +67139,6 @@ 465245443432 465245443333 465245443036 -465245414b53 465245414b4e 465245414b35 465245385a59 @@ -70477,21 +67160,16 @@ 464f58494531 464f58393432 464f58333333 -464f574c4552 464f57415244 464f55523434 464f55474854 464f545a494c -464f545a454e -464f53544552 464f53534931 464f52554d38 464f52545934 464f5254494e 464f52544831 464f52494e4f -464f5246554e -464f52455645 464f52445353 464f52444558 464f52443937 @@ -70519,9 +67197,6 @@ 464f43434132 464d31393438 464c594e4e53 -464c59494e47 -464c59494e47 -464c59424f59 464c5547414e 464c4f58494e 464c4f564532 @@ -70533,19 +67208,16 @@ 464c4f424545 464c494e5459 464c494e5441 -464c49474854 464c49434b59 464c45584954 464c45583133 464c4557324b -464c45544348 464c454d4f53 464c45455431 464c4158454e 464c4153484a 464c41534833 464c41524553 -464c414d4553 464c414d4538 464c414b4954 464c414b4531 @@ -70562,7 +67234,6 @@ 464954544f52 4649544f574e 46495354494e -464953544552 464953543434 464953534531 464953485953 @@ -70575,7 +67246,6 @@ 464953483130 464953483032 464953483031 -464953434845 464952555a41 464952453838 464952453432 @@ -70592,7 +67262,6 @@ 46494e49545a 46494e44454e 46494e414e43 -46494e414c31 46494c4d5353 46494c4d4943 46494c4c5550 @@ -70606,7 +67275,6 @@ 464944454c45 464944454c31 4649414e4345 -4649414c4b41 464941475431 464856465942 46484e545632 @@ -70618,7 +67286,6 @@ 464748363738 4646554a4f4e 464556455231 -464554495348 464552564f52 46455253454e 464552524f4c @@ -70628,15 +67295,12 @@ 464552494153 464552484154 464552474f4e -464552474945 -464552474945 46455247414c 46454e525553 46454e4e4543 46454e495831 46454e46454e 46454e444f47 -46454e434552 46454c544552 46454c4c4131 46454c4b4552 @@ -70654,7 +67318,6 @@ 4645424a5231 464542303132 464541523132 -4645414e4f52 464447464447 464433564956 4643554b4d45 @@ -70671,19 +67334,14 @@ 464155434f4e 464154545932 4641544c4950 -464154494d41 -464154415353 -464153544552 464153543737 4641534f4c41 464153414e4f 464153414441 -464152544552 4641524e4949 4641524e415a 4641524e414d 4641524d414e -4641524c4559 4641524c4553 464152494841 464152494241 @@ -70697,10 +67355,8 @@ 46414e544943 46414e544141 46414e544132 -46414e4e4945 46414e4e4559 46414e495941 -46414e46414e 46414e415449 46414e414b49 46414d313233 @@ -70729,7 +67385,6 @@ 464143453639 464143453132 464142554c41 -464142494f4c 464142494f39 464142494f35 464142494f32 @@ -70758,14 +67413,12 @@ 455a31524148 4558544d4752 4558504c4159 -455850455254 455849544552 455849544544 455849535453 455848554d45 4558484f5254 455845524349 -455843495445 4558424b5246 455841524348 4558414d454e @@ -70789,12 +67442,10 @@ 4556414e3132 4556414e3031 455635313530 -4555524f5045 4555524f3938 455547494e41 4555464c4651 4554554c4153 -45544f574552 4554494d4558 455448414e33 455448414e30 @@ -70813,7 +67464,6 @@ 4553484f4c41 455347415249 455345534553 -455343415045 45525a48414e 455256414e44 4552524f5245 @@ -70830,7 +67480,6 @@ 4552494b4141 4552494b4136 4552494b4132 -4552494b4131 45524943534f 455249435341 455249434f4e @@ -70842,7 +67491,6 @@ 455249433330 455249433231 455249433137 -4552464f4c47 455245424941 455244454e49 45524441484c @@ -70872,7 +67520,6 @@ 454e47313233 454e45525946 454e45524f31 -454e45524759 454d53545249 454d53313233 454d50545931 @@ -70889,7 +67536,6 @@ 454d494c5939 454d494c5937 454d494c5936 -454d494c4941 454d494c454b 454d45544942 454d454e454d @@ -70901,9 +67547,7 @@ 454d41534553 454d41474943 454d31393937 -454c56495350 454c56495333 -454c56495331 454c554e4941 454c54525554 454c5445524e @@ -70914,7 +67558,6 @@ 454c52425552 454c50525550 454c504d4953 -454c5041534f 454c4f4d414e 454c4f434b53 454c4e415245 @@ -70936,7 +67579,6 @@ 454c49534153 454c49534147 454c494e4153 -454c494a4148 454c49414d45 454c454e4152 454c454d414e @@ -70944,7 +67586,6 @@ 454c45414e4f 454c4455524f 454c44554345 -454c44524544 454c44455253 454c44455231 454c434f4d45 @@ -70986,14 +67627,12 @@ 454459544b41 454457494e53 454457415253 -454455415244 454455313233 454453454453 454453414453 45445259414e 454452555348 45444f474747 -454449544f52 454449544845 454449505553 454447453334 @@ -71024,10 +67663,8 @@ 4542424c4553 454231363238 4541544d4553 -4541544d4531 454153593455 454153593031 -454153544552 4541524e4954 4541524c4559 4541474c4554 @@ -71048,7 +67685,6 @@ 445941444943 445748495445 445745454253 -445741594e45 445736383436 445731333739 445654434e54 @@ -71057,9 +67693,7 @@ 445648564834 44564350524f 445639343030 -445553545931 445553544945 -445553544552 445552414e47 445550534b4f 445550454b31 @@ -71130,7 +67764,6 @@ 445249563352 4452494e4b32 445246415445 -44524558454c 445245574841 445245573639 445245573434 @@ -71142,10 +67775,8 @@ 445245444453 445245414d41 445245414430 -44524156454e 445241524547 4452414b4f53 -4452414b4f4e 4452414b4545 4452414b4152 4452414b414e @@ -71186,7 +67817,6 @@ 444f524f4e33 444f52494f4e 444f52454d45 -444f5245454e 444f52414441 444f50504552 444f50455953 @@ -71196,14 +67826,12 @@ 444f4f4d3939 444f4f4d3639 444f4f4d3133 -444f4f4c4559 444f4f4b4559 444f4f424559 444f4e544e4f 444f4e53554c 444f4e534f4e 444f4e4e5942 -444f4e4e4945 444f4e4e454c 444f4e4e4144 444f4e4c4559 @@ -71220,10 +67848,7 @@ 444f47533232 444f47533131 444f474d4154 -444f474d414e -444f47475953 444f47475934 -444f47474552 444f47474545 444f47444f43 444f47424947 @@ -71249,13 +67874,11 @@ 444d54543031 444d54444d54 444d53303037 -444d4f4e4559 444d4f444531 444d4d534a44 444d4c4f4144 444d4b455953 444d4b444d4b -444d49545259 444d43525053 444d43444d43 444d41503031 @@ -71284,7 +67907,6 @@ 444958444958 444957414c49 4449564f5431 -444956494e45 444956454954 444956453939 4449545a454c @@ -71297,7 +67919,6 @@ 4449524b5653 4449524b3131 444952444952 -444950534554 444950504544 44494f56414e 44494f52494f @@ -71333,7 +67954,6 @@ 44494c444152 44494b5a414b 44494752414d -444947495431 444947493939 444947474945 4449455a454c @@ -71349,7 +67969,6 @@ 4449414e4142 4449414e4135 4449414c4f52 -4449414c4f47 444931393233 44484952414a 44484156414c @@ -71383,7 +68002,6 @@ 444553574151 444553545259 444553495354 -44455349474e 44455348554e 444553414e4e 444553313233 @@ -71395,8 +68013,6 @@ 444552454b47 444552415445 444552313130 -444550555459 -444550555459 444550555445 44454f4e4953 44454e534552 @@ -71410,19 +68026,15 @@ 44454e495339 44454e474931 44454e444549 -44454e414c49 44454e363636 44454e313131 44454d4f4e54 -44454d4f4e53 44454d4f4e45 -44454d4f4e36 44454d4f4e33 44454d44454d 44454c564953 44454c56494e 44454c564552 -44454c555845 44454c544143 44454c4f5241 44454c4f4953 @@ -71431,15 +68043,12 @@ 44454c4c3734 44454c495348 44454c474144 -44454c414e4f 44454c414e44 44454c413131 44454c313233 44454b494e47 44454b414252 44454a414d45 -444549544552 -4445494d4f53 4445484e4552 444546544552 4445464f524d @@ -71458,7 +68067,6 @@ 444544444544 444544313233 444543524f57 -4445434b4552 44454348454e 444543444543 444543373336 @@ -71528,8 +68136,6 @@ 444156494e4f 444156494531 44415649444e -44415649444c -44415649444b 444156455947 444156455942 444156453736 @@ -71577,7 +68183,6 @@ 44414e544558 44414e54454c 44414e544539 -44414e544531 44414e53414e 44414e4e594a 44414e4e5936 @@ -71585,7 +68190,6 @@ 44414e4b4945 44414e4b3639 44414e495941 -44414e494c41 44414e49434f 44414e493639 44414e493131 @@ -71608,9 +68212,7 @@ 44414d4d4945 44414d4a414e 44414d495441 -44414d49454e 44414d45594f -44414d414745 44414c534f4e 44414c4c5931 44414c4b4559 @@ -71631,7 +68233,6 @@ 4441484f4f44 444147504147 4441474f5448 -4441474d4152 444147474945 444147414d41 444146444146 @@ -71645,12 +68246,10 @@ 444144445937 44414444454c 444144414f45 -444144414441 44414354594c 4441434f5441 444142554c4c 4441424f4e45 -4441424f4d42 444141313233 444134424545 444131425942 @@ -71668,14 +68267,11 @@ 443144314431 443141424c4f 443141424c30 -443043543052 4430354d3136 435a4152454b 43595249454c -435950525553 43594d42414c 435943594359 -4359434c4531 4359414e3233 43585a445341 435857313235 @@ -71688,12 +68284,8 @@ 43564554494b 435631393439 4355594c4552 -435554544552 -435554544552 435554454b4f 435554453838 -435553544f4d -435553544552 43555254494e 4355524c5953 435552453031 @@ -71725,9 +68317,6 @@ 435451584643 43544f424552 43544c424231 -435448555451 -435448545546 -435448545546 435448535131 43544343425a 435346303639 @@ -71739,8 +68328,6 @@ 4352555a3132 43525553494e 4352554d4d59 -435255495345 -435255495345 43525547494b 435255464f31 4352534a4a32 @@ -71751,8 +68338,6 @@ 43524f545459 43524f544f4e 43524f535353 -43524f535331 -43524f534259 43524f4f4b31 43524f4d4147 43524f465453 @@ -71771,7 +68356,6 @@ 4352454d4f4e 435245455345 435245453439 -435245415445 435245414d4d 435245414d45 435245414d37 @@ -71804,27 +68388,23 @@ 434f5744454e 434f5552545a 434f55525445 -434f554e5459 434f554c4c31 434f554c4545 434f55313835 434f5354414e 434f53544131 -434f534d4f53 434f534d4f4b 434f534d4f38 434f534d4f37 434f534d4f30 434f534d4153 434f534d414e -434f5257494e 434f5256494e 434f52564158 434f5253454f 434f52534149 434f52525931 434f52504f52 -434f524f4e41 434f524e5553 434f524e4945 434f524d414e @@ -71846,10 +68426,7 @@ 434f4f4c594f 434f4f4c5450 434f4f4c4c4c -434f4f4c494f 434f4f4c4553 -434f4f4c4552 -434f4f4c4552 434f4f4c3535 434f4f4c3136 434f4f4c3030 @@ -71874,14 +68451,12 @@ 434f4d4f444f 434f4d4d434f 434f4d4d4153 -434f4d494353 434f4d494331 434f4d455454 434f4d455439 434f4d454c59 434f4d434f4e 434f4d434153 -434f4d424154 434f4d313134 434f4c574542 434f4c543434 @@ -71915,7 +68490,6 @@ 434f44453736 434f44444c45 434f434f5454 -434f434f434f 434f434f4141 434f434f3334 434f434f3232 @@ -71930,14 +68504,11 @@ 434f424f4c31 434f4248414d 434f42455241 -434f42414c54 -434f4241494e 434f41535459 434f41434850 434f41434843 434f41434837 434e54475246 -434e54474659 434e4d434e4d 434e4a4b5a48 434e484a5955 @@ -71973,11 +68544,8 @@ 434c454f3133 434c454f3132 434c454c4941 -434c45415231 434c45363738 434c4156494e -434c41554449 -434c41554449 434c41535337 434c41534943 434c41524954 @@ -71990,18 +68558,15 @@ 434b42445242 434a59464e46 434a5248464e -434a4b595754 434a42415254 434a414d4553 434956494c45 -434956494c31 434956494332 434955444144 434953535947 434953434f54 434953434f53 434953434f32 -434952525553 434952494e4f 434952453733 434952453639 @@ -72016,7 +68581,6 @@ 434947415237 434947414e59 434943494e41 -43494343494f 434941525241 4349414e4e41 434941464249 @@ -72036,15 +68600,11 @@ 434855434b4d 434855434b4c 434855434b48 -434855424259 434854335354 434852595345 434852524557 -4348524f4e4f 4348524f4e31 434852495356 -434852495353 -434852495353 434852495345 434852494755 434852313233 @@ -72056,7 +68616,6 @@ 43484f4f5359 43484f4f4e47 43484f4d5059 -43484f494345 43484f434f53 43484f434f4c 43484f424954 @@ -72065,11 +68624,9 @@ 43484c4f4559 43484c4f4556 43484c4f4537 -434849564153 43484953554d 434849524143 434849505349 -434849505331 434849505050 434849503939 4348494e5745 @@ -72078,11 +68635,9 @@ 4348494e4135 4348494e4132 4348494d4552 -4348494c4c49 4348494b4545 434849454636 434849444f4e -434849434f31 434849424259 434848494c4c 434845575953 @@ -72105,7 +68660,6 @@ 434845463939 434845463132 434845455a31 -434845454348 434845454253 434845434849 434845413136 @@ -72122,30 +68676,21 @@ 434841544552 43484154454c 43484153494e -434841534552 434841534535 -434841525453 434841524c53 -434841524c49 -434841524c45 -434841524745 434841524459 434841524259 43484150504f 434841505041 -43484150494e 434841504143 4348414f5337 4348414e5453 4348414e534f 4348414e494e -4348414e4731 -4348414e454c 4348414e444f 4348414e4431 4348414e4348 4348414e4142 -4348414d5053 4348414d5039 4348414d4241 4348414c4f4e @@ -72181,11 +68726,9 @@ 43455243414c 434552414d49 434550455241 -43454e544552 43454e544155 43454c4c5553 43454c4c454e -43454c494e41 43454c494345 43454c494131 43454c45524f @@ -72199,7 +68742,6 @@ 434541425243 43445a4e465a 434455425941 -4344544e4252 4344534c4441 434453494f4d 434453434453 @@ -72213,7 +68755,6 @@ 434343313233 434331303332 434256545943 -434252393030 4342504a4446 43424c595451 4342484a4e46 @@ -72235,9 +68776,7 @@ 43415452414e 434154505245 434154504157 -4341544d414e 4341544b4154 -43415448594c 434154485942 434154485932 434154484559 @@ -72249,7 +68788,6 @@ 434153545241 434153544f4e 434153533131 -434153494e4f 434153484848 434153484552 434153484531 @@ -72263,7 +68801,6 @@ 43415341424c 434153413132 434152535353 -434152534f4e 434152524552 43415252454e 43415250494f @@ -72271,8 +68808,6 @@ 4341524f4c47 4341524f4c42 4341524f4c37 -4341524e4559 -4341524d454c 4341524c594e 4341524c544f 4341524c4f57 @@ -72282,7 +68817,6 @@ 434152474f31 434152464158 434152455441 -434152445331 43415244494e 434152444553 434152444552 @@ -72325,21 +68859,15 @@ 43414d50494e 43414d503433 43414d4f5247 -43414d4d4945 -43414d494f4e 43414d494c45 43414d454f32 43414d454c5a 43414d454c49 -43414d454c31 -43414d44454e 43414d434152 43414d424941 43414c595053 43414c555341 43414c544558 -43414c4c554d -43414c4c554d 43414c4c4931 43414c495836 43414c49504f @@ -72366,7 +68894,6 @@ 434144455454 434144454e41 434144434153 -434143545553 4341434b4c45 434143484f37 434143484954 @@ -72389,7 +68916,6 @@ 433059305445 4330534d3053 4330304b4933 -425954454d45 425950415448 42594c424846 425945524c59 @@ -72403,7 +68929,6 @@ 425559455231 425559425559 425556423130 -425554545331 425554543352 425554543132 4255544d414e @@ -72438,11 +68963,9 @@ 42554e445936 42554e444f4f 42554d50494e -42554d504552 42554d4f4e45 42554d4d4d4d 42554d424f58 -42554d424c45 42554c54454e 42554c4c4949 42554c4c3233 @@ -72458,16 +68981,12 @@ 425547534559 425547533639 425547495334 -425547475931 -425547475359 425547475331 -425547474552 425547474131 425546465959 425546465936 425546465935 425546464646 -425546464131 425546463031 4255454c4552 425544494e47 @@ -72492,8 +69011,6 @@ 425542425542 425542424c41 425542424259 -425542424153 -425542424153 425531374c4c 425531314554 425452494245 @@ -72514,11 +69031,8 @@ 425259414e4a 425259414e43 425259414e37 -425259414e31 -425255544953 425255534831 4252554e4f35 -4252554e4f31 4252554e4f30 4252554e4552 4252554e4549 @@ -72532,7 +69046,6 @@ 425255433145 425255424552 425252525252 -42524f574e53 42524f574e36 42524f574e33 42524f535459 @@ -72545,7 +69058,6 @@ 42524f4e474f 42524f4d4d41 42524f4c4c49 -42524f4b454e 42524f48414d 42524f444459 42524f443131 @@ -72553,8 +69065,6 @@ 42524f43434f 425249545454 42524953555a -42524953434f -42524953434f 425249534259 4252494e5941 4252494e4749 @@ -72564,7 +69074,6 @@ 425249434532 425249434531 425249414e59 -425249414e31 425249414e30 425248494e4f 425245574544 @@ -72574,7 +69083,6 @@ 4252454e4454 4252454d4152 425245474e45 -425245455a45 425245455345 425243313736 425242524252 @@ -72586,7 +69094,6 @@ 4252414e4b41 4252414e4431 4252414b4552 -425241494e53 425241494453 42524148494d 425241444945 @@ -72606,18 +69113,12 @@ 424f59434945 424f59424947 424f58544f50 -424f58494e47 -424f58455253 424f58424f59 424f574d454e -424f574d414e -424f574c4552 424f574c4547 -424f57494531 424f57444f4e 424f5554534f 424f55544f4e -424f554e5459 424f554c4159 424f55474945 424f55444945 @@ -72639,8 +69140,6 @@ 424f52454331 424f52424f52 424f4f5a4544 -424f4f545331 -424f4f544945 424f4f544842 424f4f544834 424f4f535431 @@ -72652,14 +69151,12 @@ 424f4f4b5332 424f4f464148 424f4f425335 -424f4f424f4f 424f4f424553 424f4f424148 424f4e534f4e 424f4e475331 424f4e474f32 424f4e474747 -424f4e455331 424f4e45525a 424f4e455235 424f4e454d45 @@ -72675,9 +69172,7 @@ 424f4c54494b 424f4c543130 424f4c53454e -424f4c4c4f58 424f4c4c4f53 -424f4c495649 424f4c494445 424f4c494131 424f4c474552 @@ -72717,16 +69212,13 @@ 424f4242594c 424f4242594b 424f42424947 -424f42424945 424f42424942 424f42424559 -424f42424552 424f42424545 424f42424544 424f42373037 424f42333333 424f42333231 -424f42303037 424e53465252 424e4d373839 424e4d353637 @@ -72743,7 +69235,6 @@ 424c57303037 424c55544f53 424c554e5454 -424c554e5453 424c554d4158 424c55455932 424c55455354 @@ -72754,14 +69245,12 @@ 424c55453538 424c55453438 424c55453436 -424c55453132 424c55424245 424c4f5a3132 424c4f575941 424c4f573139 424c4f534552 424c4f4f4445 -424c4f4e4445 424c4f4d5354 424c4f4b4a45 424c4f4b4553 @@ -72778,7 +69267,6 @@ 424c424c424c 424c415a4f4e 424c415a4535 -424c415a4531 424c41594e45 424c41534b4f 424c414e4b45 @@ -72789,15 +69277,12 @@ 424c414b4545 424c414b4538 424c414b4536 -424c41494e45 424c41483131 -424c4144455a 424c41444545 424c41444544 424c41444538 424c41444535 424c41434b47 -424c41434b32 424c41414148 424c30574d33 424b574f524d @@ -72867,19 +69352,16 @@ 424947524547 424947504154 4249474f5445 -4249474f4e45 4249474f4c45 4249474e5554 4249474d4f4f 4249474d4f31 4249474d4943 4249474d454c -4249474d414e 4249474d414c 4249474c5547 4249474c4545 4249474a4342 -424947475559 424947475331 424947474942 424947474747 @@ -72890,7 +69372,6 @@ 424947444f53 424947444444 424947425543 -424947424f59 424947424c4b 4249464c4154 424946464131 @@ -72905,8 +69386,6 @@ 4249344b4945 424855383930 42484a59425a -424842595246 -424842495246 424841525459 424841525449 424841505059 @@ -72923,7 +69402,6 @@ 42455454594a 424554545935 424554544c45 -42455448414e 424554483036 424554434841 424554434544 @@ -72938,12 +69416,8 @@ 424552544153 424552543031 424552525932 -424552525931 -4245524e4945 4245524e4943 4245524e4431 -4245524c4954 -4245524c494e 42455050494e 42454e5a3639 42454e555641 @@ -72952,21 +69426,18 @@ 42454e543836 42454e4e5959 42454e4e4e59 -42454e4e4945 42454e4e4559 42454e4e4542 42454e4b4549 42454e4a4949 42454e4a4943 42454e4a4932 -42454e4a4931 42454e494345 42454e474945 42454e474545 42454e455645 42454e454449 42454e444954 -42454e444552 42454e43524f 42454e434835 42454e414d59 @@ -72975,7 +69446,6 @@ 42454d4f414e 42454c544945 42454c544552 -42454c4f5641 42454c4d4f4e 42454c4c4f31 42454c4c4945 @@ -73025,7 +69495,6 @@ 424541555449 424541553132 424541545550 -424541544c45 424541544b41 424541544531 424541524449 @@ -73085,7 +69554,6 @@ 424155424c45 42415459414d 424154554841 -4241544d414e 4241544c4f52 4241544c4547 424154484f53 @@ -73100,10 +69568,7 @@ 424153534531 42415353414d 4241534f5441 -4241534b4554 -424153494c31 424153484b41 -424153484552 424153453636 424153453132 424152554741 @@ -73118,9 +69583,7 @@ 424152543130 424152525957 424152525952 -424152525931 424152525259 -424152524f4e 424152524953 424152524251 424152524131 @@ -73129,7 +69592,6 @@ 4241524f4e41 4241524f4c44 4241524b5553 -4241524b4552 424152494c49 424152474552 424152444945 @@ -73157,7 +69619,6 @@ 42414e444149 42414e444131 42414e414e49 -42414e414e45 42414d504552 42414d4d4131 42414d424552 @@ -73166,7 +69627,6 @@ 42414d413233 42414c545553 42414c544159 -42414c53414d 42414c50454e 42414c4f4f32 42414c4c4c4c @@ -73201,11 +69661,9 @@ 42414452454c 4241444d4144 4241444c4144 -424144444f47 424144444945 424144415241 4241434f4e4e -4241434f4e31 4241434b4544 424143485553 424143484955 @@ -73249,7 +69707,6 @@ 423146324659 423136364552 423133313953 -423132333435 42304c4c3058 423030473133 423030424c33 @@ -73261,7 +69718,6 @@ 415a4e415353 415a495a4148 415a42594b41 -415a415a3039 415a414c494e 415a31393639 41594d453939 @@ -73295,7 +69751,6 @@ 415645525345 415645524e41 41564552494c -4156454e5545 415641544552 4156414e5441 4156414e4553 @@ -73306,23 +69761,17 @@ 4155544f3131 415553544931 415553544558 -415553534945 4155534f4d45 4155534d414e 415552494b41 -415552454c49 415552454c45 41554c333735 415548494542 415547495445 -415547474945 -415544524559 415544495338 415544494f53 -415544494f31 415544493030 415543554e45 -415542524559 415542414445 415531375956 415454554e45 @@ -73334,7 +69783,6 @@ 41545049434b 41544f594f54 41544f523939 -41544f4d4943 41544f313638 41544c4d5246 41544956414e @@ -73346,7 +69794,6 @@ 4154414b4149 41535a583132 4153554b4131 -415354524f53 415354524f39 415354524f37 41535452454c @@ -73367,7 +69814,6 @@ 415353413132 415352503030 4153524f434b -415350495245 415350495241 415350454e34 41534b4f5244 @@ -73376,11 +69822,9 @@ 41534a454554 415349413135 415348544152 -41534852414d 4153484f4b41 4153484c494e 4153484c454e -4153484c4545 415348495441 415348434154 415347415347 @@ -73390,7 +69834,6 @@ 415344504f49 415344465a58 415344464c4b -415344464748 415344464742 415344464730 415344463639 @@ -73417,13 +69860,11 @@ 415255424141 415254555239 4152544f4f4c -415254495354 415254494341 415254475559 415254454d4b 415254454d35 415254415348 -415254313233 415253453939 41525343484c 41525249454c @@ -73439,8 +69880,6 @@ 41524d463636 41524d454e44 41524d414e4f -41524d414e49 -41524d414e44 41524d313233 41524c494e45 41524c455454 @@ -73473,8 +69912,6 @@ 4152434d414e 415243484e41 415243484958 -415243484945 -415243484552 415243483936 415243414459 4152424f4741 @@ -73484,7 +69921,6 @@ 415241424953 415241423730 415157313233 -415155494c41 4151514b5442 415131323334 4150524f5354 @@ -73515,9 +69951,7 @@ 414e58585858 414e55534b41 414e554c494b -414e55424953 414e54544931 -414e544f4e59 414e544f4e37 414e544c4941 414e54495550 @@ -73557,11 +69991,9 @@ 414e4e413035 414e4b455253 414e4a454c49 -414e4a414c49 414e49594131 414e49555441 414e4954414c -414e49544131 414e49535441 414e494d4158 414e494d3852 @@ -73576,7 +70008,6 @@ 414e47455231 414e47454c4d 414e47454c46 -414e46495341 414e4649454c 414e45545441 414e454c4552 @@ -73593,15 +70024,10 @@ 414e44593033 414e44534f4e 414e44525553 -414e44524f4e 414e44524949 -414e44524553 414e4452454f -414e44524545 -414e44524531 414e444f5252 414e44493031 -414e41544f4c 414e414e4b45 414e414c3131 414e41495242 @@ -73613,11 +70039,9 @@ 414d58333930 414d554e5241 414d4f533031 -414d4f524d49 414d4f52494d 414d4f523734 414d4f523031 -414d4f4e5241 414d4f434154 414d4d313233 414d4952554c @@ -73647,7 +70071,6 @@ 414c54555241 414c54454348 414c54454341 -414c54414952 414c53544f4d 414c50484945 414c50484151 @@ -73666,7 +70089,6 @@ 414c4d414641 414c4c594345 414c4c57494e -414c4c534f50 414c4c4f3233 414c4c4d4f4e 414c4c49554d @@ -73674,7 +70096,6 @@ 414c4c494555 414c4c494535 414c4c494345 -414c4c455931 414c4c455453 414c4c454e52 414c4c454e50 @@ -73786,7 +70207,6 @@ 41494e474f54 41494e415241 41494b4f3131 -41494b4d414e 41494b414e45 4149474c4f4e 41494441484f @@ -73808,7 +70228,6 @@ 4147494d5033 4147494c4552 414748415354 -414747494531 4147454f4c44 4147454e5445 414744453930 @@ -73834,13 +70253,11 @@ 414452494131 41445231414e 41444f4e4941 -41444f4e4149 41444f474759 41444f424531 41444e414d53 41444a554c45 4144494e4441 -4144494c4554 41444944414d 414449414e41 4144474a4d31 @@ -73860,7 +70277,6 @@ 4144414d4953 4144414d414e 4144414d3136 -4144414d3132 414431323334 414430394344 414355545553 @@ -73909,7 +70325,6 @@ 414244554c31 414244554354 41424449454c -414243444546 414243393939 414243333333 414243323436 @@ -73926,9 +70341,7 @@ 414241543634 414241534f56 41424153494e -4142414b5553 414241444f4e -414241435553 414235354e47 414233323638 414231393837 @@ -73948,14 +70361,12 @@ 414151513131 41414c494148 4141414a4a4a -414141414141 414141413131 414141333231 414137383030 414134514141 414132324141 414131393830 -414131323334 414131314242 414130304141 413939393939 @@ -73970,8 +70381,6 @@ 4132364c3034 413232323241 413230303047 -413153324433 -413142324333 413139393541 413139393341 413139383741 @@ -74905,7 +71314,6 @@ 353433333030 35343332315a 353433323147 -353433323141 353433323135 353433313233 353432373030 @@ -75363,7 +71771,6 @@ 333530363338 333530343434 333454494e41 -333452535932 33345055434b 333444444444 333444333444 @@ -76649,30 +73056,19 @@ 323030303233 323030303133 315a5a5a5a31 -315a58435642 -315a4f52524f 31594f554e47 -315858585858 -31574f524c44 31574f4d454e 3157494c4c59 315741594e45 3157414c4c59 315645545431 315645474153 -31545552424f -31545241494e -315445584153 315445454e59 315441534841 -3153574f5244 -315355504552 -315355474152 3153544f4e45 315354494e47 315354455048 31535445494e -31535445494e 315354415445 315354415253 315354414944 @@ -76680,14 +73076,9 @@ 3153504f5254 315350494b45 31534f4e5931 -31534e414b45 3153484f434b -3153434f5454 315343415453 315341534841 -315341534841 -315341524148 -3153414e4459 315341494e54 31524f4c4558 31524f475545 @@ -76705,19 +73096,15 @@ 3150484f4e45 315045525259 3150454e4e59 -3150454e4e59 3150454e4953 -315045414348 315041505059 315041424c4f 314f53434152 -314f52494f4e 314e53414e45 314e4f4e4f31 314e4f4b4941 314e48355332 314e454c4c59 -314e41535459 314e414b4544 314d4f4e5459 314d49535459 @@ -76732,13 +73119,11 @@ 314d41524941 314d41524348 314d32413358 -314c55434b59 314c4f564532 314c4f47414e 314c49564553 314c414e4345 314b494e4753 -314b41544945 314b41544859 314a5a475445 314a564b4956 @@ -76750,14 +73135,10 @@ 314a41494d45 314a41434f42 314a32344735 -31484f555345 -31484f4e4559 314845494449 314752414345 -31474f4f5345 31474f4e5a4f 31474c4f434b -314652414e4b 314649525354 314649454c44 3146444d3030 @@ -76767,7 +73148,6 @@ 31444e4c4431 314449525459 314449474954 -314445415448 314441564953 31444152594c 314441524b31 @@ -76778,7 +73158,6 @@ 31435245414d 314352414e4b 314352414947 -31434c4f574e 31434953434f 3143494e434f 31434845434b @@ -76790,7 +73169,6 @@ 314252554e4f 314252554345 3142524f574e -3142524f574e 31425241494e 31424f574945 31424f4f4b53 @@ -77749,7 +74127,6 @@ 313257513132 313257454544 313252464e5a -313251574153 313251333451 31324b454546 313247524547 @@ -77812,7 +74189,6 @@ 313233533332 313233524557 313233524158 -313233515745 313233513132 3132334e4554 3132334d4f49 @@ -77829,7 +74205,6 @@ 313233424152 313233424144 313233415a45 -313233415344 313233414447 313233393131 313233383536 @@ -78326,7 +74701,6 @@ 313131313434 313131313155 313131313146 -313131313141 313131303438 313131303435 313131303330 @@ -79896,7 +76270,6 @@ 303030303230 303030303136 5f5f5f5f5f5f -5a5a5a5a5a5a 5a5a5a503241 5a5a5a4f4f4f 5a5a5a393939 @@ -79921,7 +76294,6 @@ 5a594a345246 5a5946434e5a 5a5944524153 -5a594446484d 5a5942415a45 5a59414e5941 5a58585a5a58 @@ -80028,7 +76400,6 @@ 5a494e4e4941 5a494e444552 5a494d5a414d -5a494d4d4552 5a494d4d414e 5a494d454c45 5a494c434837 @@ -80037,7 +76408,6 @@ 5a49475a4947 5a49474d414e 5a49474c4152 -5a49474c4152 5a4947475959 5a4947475947 5a4947475934 @@ -80078,7 +76448,6 @@ 5a454c454e49 5a454c444f58 5a454c444133 -5a454c444131 5a454c415941 5a454b545441 5a45494e4142 @@ -80114,15 +76483,12 @@ 5a4152474553 5a415245564f 5a415245454e -5a4152415a41 5a4152415445 5a4152414b49 5a4152414b31 -5a4151575358 5a4151573132 5a4151415a41 5a4150504146 -5a4150504131 5a415034354d 5a414e474152 5a414e455454 @@ -80139,7 +76505,6 @@ 5a41474f5241 5a4147474f52 5a4147415241 -5a4146495241 5a4146464152 5a41445a4144 5a41434b4945 @@ -80148,7 +76513,6 @@ 5a41434b3534 5a41434b3130 5a4143484552 -5a4143484152 5a4143483939 5a4143483934 5a4143483035 @@ -80181,11 +76545,9 @@ 59555543354d 595550504552 59554e495441 -59554d494b4f 59554d415455 59554b4f4e37 59554b4f4e32 -59554b4f4e31 59554a494b4f 5955494f5048 5955494f5031 @@ -80200,7 +76562,6 @@ 59534b454e54 5951584d4656 595056424946 -594f594f4d41 594f594f4749 594f594f3939 594f594f3031 @@ -80215,7 +76576,6 @@ 594f554e4742 594f554e4737 594f554e4735 -594f554e4731 594f554c4152 594f554b4e4f 594f554a494e @@ -80276,7 +76636,6 @@ 594630433031 59455a4d494b 594555414e48 -594553594553 594553544552 5945534f4853 5945534d494e @@ -80313,7 +76672,6 @@ 59415a454544 59415a414458 59415a394154 -594159415941 594159414e47 594158584f4e 594157425553 @@ -80345,7 +76703,6 @@ 59414e413839 59414e413137 59414e413131 -59414d41544f 59414d323530 59414c4c4945 59414b554c54 @@ -80406,7 +76763,6 @@ 585459464c4a 58545241494c 585448594a44 -585445525241 585358535853 585357434445 585357313233 @@ -80460,7 +76816,6 @@ 584559414c45 584553544f48 584553534558 -584552584553 5845524f5832 584552455441 584552414e41 @@ -80473,7 +76828,6 @@ 58454b313233 5845484f4d45 5845454c4545 -584458445844 584432435053 5844304a3837 584353485243 @@ -80487,9 +76841,7 @@ 58424e363135 584152444153 584150455232 -58414e544941 58414e544845 -58414e444552 58414d503836 58414d4d4552 58414d44414d @@ -80515,7 +76867,6 @@ 57594c494531 575941545433 575941545432 -575941545431 575843373839 575838373631 5757575a5a5a @@ -80585,13 +76936,10 @@ 574f52445331 574f52443939 574f52443637 -574f4f574f4f 574f4f543132 574f4f504947 574f4f504545 574f4f4f4f54 -574f4f4b4945 -574f4f4b4945 574f4f463434 574f4f445959 574f4f445930 @@ -80618,8 +76966,6 @@ 574f4c4b4945 574f4c4b4537 574f4c46494b -574f4c464945 -574f4c464945 574f4c464532 574f4c463838 574f4c463834 @@ -80634,10 +76980,8 @@ 574f4c463331 574f4c463237 574f4c463235 -574f4c463232 574f4c463135 574f4c463134 -574f4c463031 574f4654414d 574f4646494b 574f434e414d @@ -80665,16 +77009,13 @@ 57495454454e 5749544e4559 574954484954 -574954434831 57495353414d 574953483932 -574953444f4d 5749504c4f43 574950444931 57494f4c4b41 57494f4c4131 57494e585858 -57494e53544f 57494e534f4e 57494e4f4e45 57494e4e5931 @@ -80693,13 +77034,11 @@ 57494e303037 57494d504c45 57494c524f53 -57494c4d4152 57494c4d4141 57494c4c5957 57494c4c5941 57494c4c5936 57494c4c5933 -57494c4c5931 57494c4c5331 57494c4c4f55 57494c4c4947 @@ -80714,8 +77053,6 @@ 57494c48454c 57494c455943 57494c444d41 -57494c444552 -57494c444552 57494c444545 57494c443939 57494c443031 @@ -80733,17 +77070,14 @@ 574944474552 574944444c45 5749434b4945 -5749434b4544 5749434b3333 574943485345 -574942424c45 5749414e4e4f 574939544552 574937544552 574936544552 574933544552 5748594e4f57 -5748594e4f54 574859414d49 574855464331 57484f52455a @@ -80751,7 +77085,6 @@ 57484f524534 57484f505041 57484f4f5059 -57484f4f5053 57484f4f4d50 57484f49414d 57484f46414e @@ -80761,7 +77094,6 @@ 574849544535 574849544534 574849535045 -574849534b59 5748494e4e59 5748494e4553 5748454c414e @@ -80770,7 +77102,6 @@ 574841544556 574841544348 574841543131 -5748414c4553 574831534b59 574831323334 574648544446 @@ -80785,7 +77116,6 @@ 574554424f58 57455355434b 574553545937 -574553544945 57455354434f 574553544152 574553543233 @@ -80793,7 +77123,6 @@ 574553543131 574553543031 574553434f31 -574553313233 57455256454e 57455255494f 574552545950 @@ -80806,7 +77135,6 @@ 574552543639 57455253414c 5745524e4c49 -5745524e4552 57455247554e 574552464552 574552454e54 @@ -80823,7 +77151,6 @@ 57454e4b4945 57454e455241 57454e445935 -57454e445931 57454e44414c 57454c57594e 57454c534552 @@ -80832,7 +77159,6 @@ 57454b4b4552 574549544552 5745494c5348 -574549474854 5745455a5931 5745455a4c45 5745455a494c @@ -80882,10 +77208,8 @@ 5741594e4538 5741594e4536 5741594e4534 -5741594e4531 574158494e47 574158455253 -574156455331 574156444154 574154574154 574154545454 @@ -80916,7 +77240,6 @@ 5741524c4f43 574152494154 574152443031 -574152313233 574152313031 5741504c4553 57414e544f4b @@ -80937,9 +77260,7 @@ 57414c5a454e 57414c57594e 57414c564953 -57414c544f4e 57414c524149 -57414c4e5554 57414c4d4152 57414c4c5957 57414c4c594f @@ -80972,7 +77293,6 @@ 574141474831 573946534531 57385747304b -573853544544 573853543853 573534333239 573357335733 @@ -80998,8 +77318,6 @@ 565831313030 565756565756 56574b503334 -5657474f4c46 -565656565656 565656434343 565653565653 565653373737 @@ -81010,7 +77328,6 @@ 565554484f56 565554415241 56554c504958 -56554c4b414e 565452535031 56544c415858 565448544146 @@ -81028,7 +77345,6 @@ 565236534550 565149364638 565053313131 -564f59455552 564f5854454c 564f564f564f 564f564f3836 @@ -81044,9 +77360,6 @@ 564f5354524f 564f53543536 564f53474553 -564f52544558 -564f52544558 -564f52544543 564f524f4245 564f524d4958 564f4f504552 @@ -81055,7 +77368,6 @@ 564f4c564f4c 564f4c564f38 564f4c564f37 -564f4c564f31 564f4c4f4e44 564f4c4f4449 564f4c4e4f56 @@ -81063,7 +77375,6 @@ 564f4c4c4552 564f4c494d54 564f4c455552 -564f4c414e54 564f4c373737 564f4c343630 564f47454c31 @@ -81095,10 +77406,8 @@ 564a48554559 564a48425946 564a47434252 -564a43524446 564a434c4157 564958454e31 -56495649454e 564956494341 564956414e54 564954564954 @@ -81109,7 +77418,6 @@ 564954413936 564953564953 56495356414b -56495355414c 564953544137 564953544132 5649534f4b4f @@ -81122,9 +77430,7 @@ 564952474f4f 564952474f37 564952474953 -56495247494e 56495155454c -564950455253 564950455245 564950455230 56494f4c4c41 @@ -81146,7 +77452,6 @@ 56494c4c454e 56494c4c4151 56494c4c4132 -56494c4c4131 56494c313233 56494b594c41 56494b544552 @@ -81177,7 +77482,6 @@ 5649434b5942 5649434b5932 5649434b4953 -5649434b4945 5649434b4939 56494345524f 564943455241 @@ -81200,7 +77504,6 @@ 564656463133 564652484a43 56465246434a -564652434252 564652433333 564652433232 5646504c4636 @@ -81219,7 +77522,6 @@ 564648425a31 564645505448 564644484259 -5646435a595a 5646424f4c45 564641323033 564630363238 @@ -81227,13 +77529,11 @@ 564554564554 56455454454e 564554544545 -564554544531 564554543430 564554455253 564554455231 564553545259 56455354454c -564553504552 564552564553 564552564552 564552545449 @@ -81282,7 +77582,6 @@ 56454c353032 564548545946 564548524631 -564547455441 564547415337 564547415334 564547415244 @@ -81318,7 +77617,6 @@ 564158564d53 5641584d414e 56415652494b -56415547484e 56415542414e 564153593138 56415353434f @@ -81347,10 +77645,8 @@ 56414e4d4f52 56414e494c55 56414e474f31 -56414e455353 56414e454b31 56414e444f47 -56414e44414c 56414e43454c 56414e43414e 56414e313031 @@ -81402,7 +77698,6 @@ 563143543052 563141324e33 563135383953 -563132333435 563037305656 563030444f4f 555a554e4943 @@ -81419,7 +77714,6 @@ 555555414141 555551495951 5554524e4a48 -55544f504941 55544b494e41 555448565443 555445533130 @@ -81466,7 +77760,6 @@ 555341323030 555341313031 555255534f56 -555253554c41 555253494e45 555252414341 55524d494c41 @@ -81474,7 +77767,6 @@ 5552494c454e 555246494e45 55524431344d -5552414e5553 5552414c534b 555241425554 5552394d5146 @@ -81499,8 +77791,6 @@ 554e49543333 554e49543031 554e49504b47 -554e494f4e31 -554e494d4f47 554e49434153 554e4943414c 554e47474f59 @@ -81510,7 +77800,6 @@ 554e444f4552 554e44455254 554e44455237 -554e44455231 554e43555453 554e434f4c41 554e434c4554 @@ -81524,17 +77813,14 @@ 554d46463435 554d43313233 554d32444235 -554c59414e41 554c55525532 554c54524158 -554c54494d41 554c54303432 554c4c4d414e 554c44414e41 554c41554c41 554c41313233 554b5250524f -554b524e4554 554b4f554b4f 554b4e574154 554b4a4e4a44 @@ -81575,7 +77861,6 @@ 554650413636 55464f313233 55464c545541 -55464c545541 554648484252 55464846594e 554646495a49 @@ -81623,7 +77908,6 @@ 54594c555a41 54594c45525a 54594c455257 -54594c455250 54594c45524b 54594c455234 545947483232 @@ -81647,7 +77931,6 @@ 54574f424954 54574f343639 54574d54574d -545749535441 545749535434 545749524c53 5457494e4e59 @@ -81700,32 +77983,26 @@ 5455524f4b32 5455524f434b 5455524b454e -545550504552 545550414337 -545550414331 54554e593935 54554e564952 -54554e4e454c 54554e4c4157 54554e4b454c 54554e414550 54554e413639 54554e413232 54554e413131 -54554d54554d 54554d533131 54554d4d4544 54554d423145 54554d414c49 54554c594152 -54554c534131 54554c4b4153 54554c415349 545547475931 545546545931 5455464e454c 54554552544f -545543534f4e 5455434b4945 5455434b3931 545543484552 @@ -81738,7 +78015,6 @@ 54553135344d 545459504531 54545552424f -545454545454 545454353535 545453484b41 5454514e4654 @@ -81766,14 +78042,11 @@ 545331323334 5452594e4f57 5452594c4f4e -545259494e47 545259474741 545257343536 545255544558 545255535445 -545255535431 545255534f56 -5452554e4b53 5452554d5032 5452554c5445 5452554c4c45 @@ -81799,23 +78072,19 @@ 54524f555459 54524f555454 54524f555437 -54524f555437 54524f555432 54524f555045 54524f554748 54524f504f53 54524f50494e 54524f50494b -54524f504943 54524f4f4a4e 54524f4e4958 54524f4e3137 54524f4c4c59 54524f4c4c37 54524f4c4c33 -54524f4c4c31 54524f4c494b -54524f4a414e 54524f495a41 54524f434845 54524c444d31 @@ -81823,10 +78092,8 @@ 545249535459 545249535341 545249534853 -545249534841 54524953414e 545249505050 -545249504f44 54524950494e 545249504553 5452494f4445 @@ -81840,7 +78107,6 @@ 5452494b414c 545249494e55 545249474552 -545249464f4e 54524944454e 545249443344 545249424552 @@ -81850,7 +78116,6 @@ 5452455a4f52 545245585858 545245583333 -545245575131 545245573131 545245564953 545245534549 @@ -81881,7 +78146,6 @@ 545242305931 545241574132 545241564d41 -545241554d41 545241544553 545241544152 545241534e4f @@ -81890,24 +78154,18 @@ 5452414e544f 5452414e5350 5452414e5349 -5452414e4e59 -5452414e4345 5452414d4d4f 545241494e45 545241494e35 545241494e32 54524148414e 54524147454e -545241435954 54524143594a -545241435931 545241434b59 -545241434b53 54524143494c 545241434949 545241434944 545241434941 -545241434552 545241434541 545241433239 545241313233 @@ -81954,7 +78212,6 @@ 544f54414c31 544f53544144 544f53534954 -544f53534552 544f5348494f 544f5348494b 544f53484552 @@ -81974,7 +78231,6 @@ 544f524f524f 544f524b5931 544f52494f4e -544f52494e4f 544f52494e47 544f52494a4f 544f52493233 @@ -81990,26 +78246,18 @@ 544f504c4553 544f50494e4f 544f50485932 -544f50484154 -544f50484154 544f50475559 544f50424f59 544f50415a33 -544f50313233 -544f4f545359 -544f4f544945 544f4f544845 -544f4f544831 544f4f534859 544f4f4f4f54 544f4f4f4f4f 544f4f4d5543 544f4f4d4545 -544f4f4c5331 544f4f4c494e 544f4f4c3434 544f4f4c3030 -544f4f484f54 544f4f484950 544f4f44454c 544f4f434f4f @@ -82038,7 +78286,6 @@ 544f4e4e4132 544f4e4d414e 544f4e4b4132 -544f4e4b4131 544f4e4a554c 544f4e495441 544f4e494e49 @@ -82055,7 +78302,6 @@ 544f4d4f4b41 544f4d4d595a 544f4d4d5956 -544f4d4d5953 544f4d4d594f 544f4d4d5945 544f4d4d5937 @@ -82132,7 +78378,6 @@ 544f4249544f 544f42494e53 544f42454d45 -544f4241474f 544f4241434f 544f41445353 544f41444552 @@ -82184,9 +78429,6 @@ 5449544f4c4f 5449544f3132 5449544c4553 -544954414e53 -544954414e49 -544954414e31 544953544f31 544953535931 544953534552 @@ -82218,7 +78460,6 @@ 54494e43484f 54494e434154 54494e414141 -54494e414141 54494e413733 54494e413539 54494e413235 @@ -82281,19 +78522,14 @@ 544947524141 544947523836 5449474c4554 -544947485453 -544947485453 544947485432 544947475932 544947473352 -544947455252 -544947455236 544946544f4e 544946465931 544946463132 544945524e41 5449454e4e45 -544945445550 544945444945 544944453131 544944444c59 @@ -82332,18 +78568,14 @@ 5448524f4553 5448524f4231 544852455348 -544852454553 54485245454a 544852454544 544852454532 544852454531 -544852454531 -54485241574e 544852414b31 544852414345 544850533334 54484f525259 -54484f524e31 54484f52424f 54484f52414e 54484f524142 @@ -82359,7 +78591,6 @@ 544849524442 544849524433 5448494e4b4b -5448494e4b31 544849454653 544849434b59 544849434b53 @@ -82384,26 +78615,20 @@ 5448454d4136 5448454c4f58 5448454c4144 -5448454b4944 -5448454b4944 5448454b4154 5448454a4557 544845475a41 -544845464f58 544845464f52 544845464f45 544845464c41 54484545474f -544845444f47 544845434c41 544845425544 544845425241 54484541524b -544843343230 544841574542 544841544841 544841524759 -5448414e4f53 5448414e4b58 5448414e4831 5448414e4741 @@ -82435,13 +78660,10 @@ 5445584f4e45 544558424f59 544558415342 -544558414e53 -544558414e53 5445574f3234 544556524153 5445564f4e31 544556495441 -544556494f4e 5445554b4b41 544554485953 544554454e47 @@ -82461,7 +78683,6 @@ 544553534150 54455353414e 544553534132 -544553534131 5445534c4152 544553303032 544552544941 @@ -82470,7 +78691,6 @@ 54455252594a 544552525941 544552525936 -544552525931 544552525249 544552524554 544552524553 @@ -82504,7 +78724,6 @@ 54454d54454d 54454d505241 54454d505050 -54454d504c45 54454d504548 54454d504153 54454d503939 @@ -82527,7 +78746,6 @@ 544548494c41 544548414d41 544547544547 -5445464c4f4e 544546313233 5445454e3639 5445454e3232 @@ -82547,7 +78765,6 @@ 544544444552 544544414444 5445434f4a4f -5445434f4a4f 5445434b454c 544543485456 544543484e30 @@ -82560,7 +78777,6 @@ 544543483030 544543414632 544543393631 -544543393631 544542574543 544542454152 544541534544 @@ -82594,7 +78810,6 @@ 544255525348 544254425442 54424f535354 -54424f4e4531 54424c414445 544249524433 544249524432 @@ -82603,7 +78818,6 @@ 544241545354 544237333746 544232303030 -54415a5a5a5a 54415a5a3232 54415a5a3133 54415a5a3131 @@ -82611,7 +78825,6 @@ 54415a444f47 54415a444144 54415a313131 -544159544159 5441594d4152 5441594c4148 544158494544 @@ -82655,13 +78868,11 @@ 544153544153 544153534553 54415353454c -5441534d414e 5441534b494e 544153484b41 544153313233 544152554e41 544152544552 -54415254414e 54415254414b 544152534953 544152524f42 @@ -82682,7 +78893,6 @@ 544152484952 544152475254 544152454b53 -544152444953 544152415348 544152415341 544152415249 @@ -82724,7 +78934,6 @@ 54414d4d5957 54414d4d5933 54414d4d4953 -54414d4d4945 54414d4d4931 54414d494e53 54414d49454e @@ -82740,15 +78949,11 @@ 54414c4f5245 54414c4f4e45 54414c4f4e37 -54414c4f4e32 -54414c4f4e31 54414c4c5931 -54414c4c4559 54414c4c3132 54414c495348 54414c494345 54414c49414e -54414c454e54 54414c454741 54414c415941 54414c414e45 @@ -82769,8 +78974,6 @@ 54414853494e 544148524545 5441484f4539 -5441484f4531 -544148495449 544147555449 5441474f5245 5441474e4554 @@ -82835,8 +79038,6 @@ 53594d554c54 53594d52414b 53594c57454b -53594c564945 -53594c564945 53594b4f3031 5359444e3359 535943484b41 @@ -82860,7 +79061,6 @@ 535749534831 535749524348 5357494e4759 -5357494e4753 5357494d4d45 5357494d4552 5357494d3838 @@ -82868,7 +79068,6 @@ 5357494c4c49 5357494c4c31 5357494c494e -535749465431 535748495445 535745544b41 535745534441 @@ -82915,7 +79114,6 @@ 5356454d5041 5356454b4c41 535641525445 -535641524f47 5356414e5349 535641323234 53555a5a5951 @@ -82929,8 +79127,6 @@ 5355584b4d45 535554544f30 535554454b49 -535553534558 -5355534c494b 535553494e41 535553494c41 53555349454d @@ -82938,13 +79134,11 @@ 535553494536 535553484945 535553454a4a -535553414e4e 535553414e4b 535553414e47 535553414e39 535553414e34 535553414e33 -535552564559 5355524f5641 5355524c5934 5355524c4559 @@ -82956,7 +79150,6 @@ 535550524137 5355504f5254 535550455246 -535550455244 535550414952 535550303039 53554e574549 @@ -82964,7 +79157,6 @@ 53554e545355 53554e4e5939 53554e4e5933 -53554e4e5931 53554e4e5930 53554e4e4e59 53554e4e4559 @@ -82981,8 +79173,6 @@ 53554e414441 53554d4f4e41 53554d4f3132 -53554d4e4552 -53554d4d4954 53554d4b494e 53554d495441 53554d495431 @@ -83028,7 +79218,6 @@ 535532574549 535532524159 535459583838 -5354594c5553 5354594c4545 5354594c4532 53545554454e @@ -83041,8 +79230,6 @@ 5354554b4131 535455445931 535455445331 -535455444c59 -535455444c59 535455443237 535455443234 535455443131 @@ -83062,7 +79249,6 @@ 5354524f5050 5354524f4f50 5354524f4d50 -5354524f4b45 5354524f434b 535452495059 535452494659 @@ -83072,7 +79258,6 @@ 535452415931 535452415454 535452415448 -535452415431 535452414e41 535452414154 535450415453 @@ -83080,8 +79265,6 @@ 53544f53544f 53544f525931 53544f52544f -53544f524d53 -53544f524d53 53544f524d39 53544f524d38 53544f524b59 @@ -83097,7 +79280,6 @@ 53544f4f5059 53544f4f4c53 53544f4e474f -53544f4e4544 53544f4d5059 53544f4d5053 53544f4c4c59 @@ -83121,7 +79303,6 @@ 5354494e4b31 5354494e4552 5354494e4348 -5354494d5059 5354494c4f4e 5354494c4f31 5354494c4554 @@ -83141,14 +79322,11 @@ 535445573636 535445573031 535445564556 -53544556454f -535445564547 535445564536 535445534849 535445524444 535445505041 535445504c59 -535445504859 535445504835 535445504821 535445503737 @@ -83162,14 +79340,11 @@ 535445454e41 535445454c42 535445454c37 -535445454c31 535445444459 535445414d31 -535445414d31 535445414c53 535445414b59 535445414b31 -535445414b31 535445413738 535444535444 535441594f55 @@ -83187,7 +79362,6 @@ 535441525435 535441525334 535441525333 -535441525331 535441525250 535441525237 535441525232 @@ -83208,7 +79382,6 @@ 535441523033 5354414e5349 5354414e4b31 -5354414e4731 5354414e4431 5354414e4348 5354414e424b @@ -83216,18 +79389,15 @@ 5354414e3030 5354414d5045 5354414d5031 -5354414d5031 5354414d4559 5354414d454e 5354414c4b59 -5354414c494e 5354414c4147 5354414c314e 535441474753 535441435956 535441435953 535441434b31 -535441434945 535441434544 535441434531 535441433132 @@ -83238,7 +79408,6 @@ 535441423232 535441415253 535441393633 -53543356334e 535433523330 535432313234 535431393632 @@ -83257,7 +79426,6 @@ 535353535336 5353534a4a4a 535353393939 -535353353535 5353504f5254 53534f4f5858 53534f4f5353 @@ -83299,10 +79467,7 @@ 535155494646 535155494439 53515549434b -53515545414b -535155414c4c 535155414c45 -535144574645 535141445550 535059574542 535059544558 @@ -83319,12 +79484,9 @@ 535055443333 535053453535 5350524f554c -535052494e54 -535052494e54 535052455341 535050543736 53504f555453 -53504f545459 53504f545454 53504f545453 53504f543639 @@ -83334,9 +79496,7 @@ 53504f524b31 53504f52484d 53504f4f4e36 -53504f4f4e31 53504f4f4b45 -53504f4e4745 53504f4b4945 53504f4b4552 53504f494c54 @@ -83361,34 +79521,26 @@ 5350494e4553 5350494e3639 5350494c4c59 -5350494b4559 -5350494b4553 -5350494b4552 5350494b4538 5350494b4536 5350494b4533 5350494b4530 535049494449 535049474759 -535049444559 535049435931 535049344b41 -535048494e58 535045525245 535045524d31 -5350454e4345 535045494c53 535045454439 535045454437 535045454436 535045454435 535045454434 -535045454432 53504543544f 535045435331 535045434b31 535045415245 -535045415231 535044524352 535043535043 53504338384d @@ -83396,12 +79548,10 @@ 5350415a3131 535041594544 535041574e5a -535041574e31 535041554c49 535041545a4c 535041535449 535041533132 -535041525459 53504152524f 535041524745 535041505059 @@ -83427,7 +79577,6 @@ 535041434542 535041434535 535041434534 -535041434531 535038343732 535035445a45 535032333838 @@ -83449,7 +79598,6 @@ 534f55504945 534f55504544 534f55503639 -534f554e4453 534f554c4d45 534f554c4b59 534f554c464c @@ -83475,7 +79623,6 @@ 534f52454c4c 534f52434552 534f52424f4e -534f52415941 534f52414941 534f50534f50 534f50524953 @@ -83499,16 +79646,13 @@ 534f4e4e5936 534f4e4e5932 534f4e4e4f52 -534f4e4e4531 534f4e4c4142 534f4e4a414d 534f4e4a4141 -534f4e4a4131 534f4e494b41 534f4e494154 534f4e494134 534f4e494132 -534f4e494131 534f4e474f44 534f4e473732 534f4e45524f @@ -83535,7 +79679,6 @@ 534f4c495331 534f4c494445 534f4c494444 -534f4c454441 534f4c444954 534f4c44454e 534f4c415237 @@ -83554,7 +79697,6 @@ 534f47475931 534f47313437 534f46543636 -534f46495941 534f46494e41 534f46494136 534f46494130 @@ -83574,8 +79716,6 @@ 534f42455236 534f42414b49 534f41504945 -534e59444552 -534e55464659 534e55444449 534e53443242 534e4f583939 @@ -83617,7 +79757,6 @@ 534e45473836 534e45454b45 534e45454348 -534e45414b59 534e444d414e 534e41564552 534e41524631 @@ -83625,7 +79764,6 @@ 534e4150504c 534e41504552 534e41503639 -534e414b4553 534e414b4544 534e414b4539 534e414b4535 @@ -83637,7 +79775,6 @@ 534e41455231 534e41414b45 534e33414b59 -534e31504552 534e30595436 534e304d414e 534d57544154 @@ -83646,7 +79783,6 @@ 534d55534859 534d55524645 534d55524632 -534d55444745 534d53544950 534d53544242 534d534d534d @@ -83677,12 +79813,10 @@ 534d454c5453 534d454c4c41 534d454c4c31 -534d45474d41 534d45455453 534d44373737 534d43313233 534d42343536 -534d41525459 534d41525454 534d41525441 534d41525433 @@ -83721,7 +79855,6 @@ 534c4f474141 534c4f424f5a 534c4f414e53 -534c4f414e45 534c4b333230 534c49505045 534c49504552 @@ -83729,7 +79862,6 @@ 534c494e4b41 534c494e4559 534c494d4b41 -534c494d4552 534c494d414b 534c494d3637 534c494d3232 @@ -83742,7 +79874,6 @@ 534c45455045 534c45455034 534c45444f47 -534c45444745 534c45444431 534c42494f50 534c42303037 @@ -83750,8 +79881,6 @@ 534c4157494b 534c41565641 534c41564f4b -534c41564532 -534c41505059 534c41503939 534c414d4d4d 534c414d4d37 @@ -83771,9 +79900,6 @@ 534b59595959 534b59574152 534b59504552 -534b594c4552 -534b594c4152 -534b59464f58 534b59424152 534b59343636 534b5745454b @@ -83785,7 +79911,6 @@ 534b52455755 534b5245414e 534b51545a41 -534b4f524541 534b4f4f5453 534b4f4f4259 534b4f444153 @@ -83799,10 +79924,8 @@ 534b495a3537 534b4954534f 534b49525459 -534b49525453 534b49505550 534b49503031 -534b494e4e59 534b494e4e45 534b494e4554 534b494e4543 @@ -83811,14 +79934,11 @@ 534b494e3636 534b494d454e 534b494c4553 -534b49494e47 534b49494552 534b49464646 534b4945524b 534b49455231 534b4944524f -534b49444f4f -534b4942554d 534b49424152 534b45545459 534b45525259 @@ -83836,7 +79956,6 @@ 534b414e4941 534b414d414e 534b414c4b41 -534b4147454e 534b4131545a 534b41313233 534b384d534a @@ -83854,7 +79973,6 @@ 534958583636 534958545937 534958545553 -53495847554e 534958444f47 534956415331 534954524550 @@ -83870,13 +79988,11 @@ 534953493131 534953455241 534952525553 -534952524f4e 534952504131 5349524f4e53 5349524f4741 5349524b4556 534952495953 -534952495553 534952494f53 534952494f4e 534952484353 @@ -83892,7 +80008,6 @@ 53494e59414b 53494e54454b 53494e4f5045 -53494e4d414e 53494e4b3232 53494e4a554e 53494e495341 @@ -83941,7 +80056,6 @@ 53494c4b454e 53494c4b3639 53494c4b3436 -53494c454e54 53494c454e41 53494b554c41 5349494d4f4e @@ -83994,7 +80108,6 @@ 5348544d4c41 5348524f5544 5348524f5345 -5348524f4f4d 534852454431 53484f574d49 53484f56454d @@ -84014,7 +80127,6 @@ 53484f4e4941 53484f4c4f4d 53484f48494e -53484f455331 53484f434b32 53484f434152 53484f343535 @@ -84026,7 +80138,6 @@ 5348495a494b 534849564954 534849555055 -534849545459 534849545433 534849544f4e 534849543636 @@ -84040,8 +80151,6 @@ 5348494e4b4f 5348494e4b41 5348494e494e -5348494e4559 -5348494e4531 5348494e444f 5348494e414c 5348494d4c41 @@ -84054,8 +80163,6 @@ 5348494c4c53 5348494c454e 534849494e41 -534849465431 -534849454c44 53484944414e 534849434b53 534849383238 @@ -84066,7 +80173,6 @@ 53484554414e 534845534558 534845525941 -534845525041 534845524f44 534845524d59 534845524d31 @@ -84081,12 +80187,9 @@ 5348454d5031 5348454c5645 5348454c5445 -5348454c4c53 5348454c4c4f 534845494b41 534845484c41 -534845455031 -534845454241 534845444952 534845424148 534845424136 @@ -84095,7 +80198,6 @@ 534845414c41 534845413838 534842595246 -5348415a414d 5348415a4144 534841594242 534841575757 @@ -84115,38 +80217,27 @@ 534841554b41 534841545255 53484154494e -534841535441 -534841525045 -534841525031 534841524d49 -534841524b53 534841524b32 534841524b30 53484152494c 534841524941 -534841524544 534841514f4e 53484150454e 534841504544 -5348414e5459 5348414e5448 5348414e4f53 -5348414e4e41 5348414e4e31 5348414e4952 5348414e494e -5348414e4941 5348414e4544 5348414e4542 5348414e4538 5348414e4537 5348414e4533 -5348414e4441 5348414e3132 -5348414d5553 5348414d4d41 5348414d494e -5348414d494c 5348414d4941 5348414d4553 5348414c5641 @@ -84155,7 +80246,6 @@ 5348414c3132 5348414b5241 5348414b494e -5348414b4553 5348414b415a 5348414b4134 534841494c59 @@ -84178,11 +80268,9 @@ 53484144454e 534841444545 534841444532 -534841444531 53484144444f 534841444142 534841434b4f -534841434b31 534841424e41 534841414449 534835373937 @@ -84200,7 +80288,6 @@ 5346534c4f35 534653465346 534652455544 -534652455544 534645524131 5346454d4b46 534645494e43 @@ -84215,7 +80302,6 @@ 534558594741 534558593832 534558593738 -534558593639 534558593535 534558593435 534558593434 @@ -84223,20 +80309,13 @@ 534558593237 534558593235 534558593137 -534558593133 534558593030 -534558585931 -534558585859 534558585849 534558585831 53455856454e -53455855414c 534558545553 -534558534558 534558524558 53455850524f -534558504f54 -5345584e4554 5345584b4559 534558475559 534558455931 @@ -84249,7 +80328,6 @@ 534558363939 534558363930 534558345553 -534558344d45 534558333333 534557455259 534556454e43 @@ -84275,9 +80353,7 @@ 534553434131 5345525a494b 534552564553 -53455256414e 534552524554 -534552524131 534552504943 5345524f4b49 5345524a494f @@ -84286,7 +80362,6 @@ 53455248414e 534552474954 53455247494a -534552474545 534552474544 534552474159 534552473832 @@ -84320,7 +80395,6 @@ 53454e4e4153 53454e4e4137 53454e4c4143 -53454e494f52 53454e474152 53454e44494b 53454e444152 @@ -84330,7 +80404,6 @@ 53454e313131 53454d594f4e 53454d504c45 -53454d4d454c 53454d495445 53454d494e41 53454d455241 @@ -84352,7 +80425,6 @@ 53454c414831 53454b554c41 53454b534153 -53454b524554 53454b4d5733 53454b4c4f53 53454b495455 @@ -84370,7 +80442,6 @@ 534549434849 534549363636 5345484e415a -534547554e44 534547524544 534547413133 534547413130 @@ -84386,9 +80457,7 @@ 534545434154 534545424552 534545424545 -534545424545 53454452494b -5345444f4e41 5345444d4143 534544455331 534544414e4f @@ -84418,15 +80487,12 @@ 5345414e3130 5345414e3035 5345414d4544 -5345414d414e 5345414c5448 5345414c4142 5345414c3434 5345414b4552 53454148414d -534541444f4f 53454143524f -534541424545 534537454e39 534537454e38 534537454e37 @@ -84455,32 +80521,23 @@ 534431323334 5343594f434f 5343554c5931 -5343554c4c59 534355424259 -534355424144 -534355424131 534355313159 534353534353 534352554d39 534352554231 534352494445 -53435245454e 53435245454b -53435245414d 534352415443 534352415032 534352414d53 53434f555438 53434f555045 -53434f545453 53434f545452 53434f54544b 53434f54544a -53434f545431 53434f543034 -53434f525049 53434f525041 -53434f524553 53434f524536 53434f4f545a 53434f4f5459 @@ -84498,7 +80555,6 @@ 53434855524c 53434855524b 534348555241 -534348554d49 53434855434f 5343484f4f4e 5343484f4e45 @@ -84528,12 +80584,10 @@ 534341545459 534341544845 534341544552 -534341524142 534341523132 534341504553 53434150454e 534341504531 -5343414e4941 5343414e4449 5343414d3032 5343414c5a4f @@ -84561,17 +80615,14 @@ 5341594e4f57 5341594d414e 534159455945 -534159455253 534159414848 534159414441 534158585858 534158313233 -534157594552 534157414445 534157333333 534157313233 5341564c4f4e -534156494f52 534156493836 534156455553 534156455249 @@ -84582,8 +80633,6 @@ 534155544552 534155534953 534155534155 -534155525553 -534155524f4e 534155524156 534155524142 5341554c4954 @@ -84602,10 +80651,7 @@ 534154495241 534154494e59 534154444159 -534154414e41 -534154414e36 534153535938 -534153535931 534153534f4e 534153534131 53415348494d @@ -84618,9 +80664,7 @@ 534153413239 534153413233 534152574154 -534152564152 53415256414e -534152545245 534152544f52 53415254494c 534152544152 @@ -84631,12 +80675,10 @@ 5341524d4553 5341524d414e 534152455347 -534152444f52 534152414d45 534152414d41 534152414858 534152414849 -534152414843 534152414835 534152414641 534152414552 @@ -84657,7 +80699,6 @@ 53414e594f32 53414e594348 53414e594139 -53414e544f53 53414e544f31 53414e544139 53414e53554e @@ -84674,7 +80715,6 @@ 53414e494348 53414e475545 53414e474f31 -53414e474552 53414e474159 53414e454b41 53414e454b39 @@ -84682,7 +80722,6 @@ 53414e445954 53414e445948 53414e445937 -53414e445931 53414e445649 53414e444f47 53414e444d45 @@ -84691,7 +80730,6 @@ 53414e443939 53414e443737 53414e435449 -53414e43484f 53414e424f52 53414e415448 53414e415441 @@ -84702,7 +80740,6 @@ 53414d554b41 53414d535944 53414d53494e -53414d53414d 53414d524545 53414d505041 53414d504f31 @@ -84750,10 +80787,8 @@ 53414c543333 53414c543132 53414c524143 -53414c4f5045 53414c4f4f54 53414c4f4d41 -53414c4d414e 53414c4d4148 53414c4d304e 53414c4c594b @@ -84768,7 +80803,6 @@ 53414c454d53 53414c454d41 53414c454d33 -53414c45454e 53414c434f4e 53414c434841 53414c43414c @@ -84811,7 +80845,6 @@ 534148494e35 534148494241 534148454b4f -534148415241 534148414e41 534148413132 534148313233 @@ -84845,28 +80878,21 @@ 534143485345 534143484f4b 534143484b4f -53414348494e 53414348414e 53414255524f 534142534142 -53414252494e 5341424f5941 5341424f5431 5341424f4e41 -5341424c4553 5341424c4533 -5341424c4531 -534142494e41 534142494e31 534142455448 534142455237 534142455233 534142455232 -534142455231 53414241544f 534142415445 534142414b49 -534142414b41 534142314e45 53414148494c 534141424153 @@ -84956,10 +80982,6 @@ 52555354594c 525553545945 525553545942 -525553545937 -525553545933 -525553545931 -52555354494e 525553535459 525553534f57 525553534f31 @@ -84996,7 +81018,6 @@ 52554e4a4f45 52554e473131 52554e464152 -52554e444d43 52554e344d45 52554e343030 52554e333435 @@ -85011,10 +81032,8 @@ 525547525547 525547455232 525547425934 -525547425932 525547414d45 525546555335 -525546555331 525546464945 525546463231 525546415341 @@ -85024,11 +81043,9 @@ 525544593434 525544494531 525544493031 -52554445524e 525544454c39 525544453131 525544444945 -5255434b4552 525542593137 525542525542 5255424c4553 @@ -85074,7 +81091,6 @@ 525158365a42 5251454a5a4a 525056544542 -525056544542 52505554344b 5250554a4f4c 525045524d52 @@ -85091,7 +81107,6 @@ 524f5a413535 524f594c4552 524f59474f44 -524f59424f59 524f5942454e 524f58593232 524f58593033 @@ -85106,8 +81121,6 @@ 524f57413031 524f57363532 524f5649544f -524f56455253 -524f56455253 524f55583938 524f55534836 524f554e414b @@ -85119,7 +81132,6 @@ 524f55424c45 524f54593032 524f54544e45 -524f54544552 524f54544545 524f54505342 524f544f544f @@ -85129,20 +81141,17 @@ 524f53544f4b 524f53534f38 524f53534f32 -524f53534941 524f53533935 524f53533231 524f53533136 524f53533134 524f534c4556 -524f53495441 524f5349454a 524f53494539 524f53494530 524f53493236 524f5348494e 524f53455932 -524f53455931 524f5345544f 524f53455354 524f53454e45 @@ -85169,11 +81178,9 @@ 524f4f543132 524f4f534b49 524f4f504531 -524f4f4e4559 524f4f4d4552 524f4f4b4544 524f4f464559 -524f4f464552 524f4e4e494e 524f4e4e454c 524f4e4c4545 @@ -85200,7 +81207,6 @@ 524f4d494b41 524f4d494a4e 524f4d455353 -524f4d45524f 524f4d454f58 524f4d454f38 524f4d454f37 @@ -85214,8 +81220,6 @@ 524f4d415254 524f4d414e52 524f4d414e50 -524f4d414e4f -524f4d414e41 524f4d414e39 524f4d414e36 524f4d414e35 @@ -85237,7 +81241,6 @@ 524f4c4c5331 524f4c4c4f58 524f4c4c4559 -524f4c4c4552 524f4c4c454d 524f4c494e41 524f4c494b49 @@ -85268,7 +81271,6 @@ 524f45444552 524f444e4f43 524f44494e4f -524f44494e41 524f44474530 524f44454f35 524f44454f34 @@ -85277,9 +81279,7 @@ 524f4441434a 524f43524f43 524f434f5244 -524f434b5936 524f434b535a -524f434b5353 524f434b5335 524f434b5332 524f434b4f32 @@ -85327,7 +81327,6 @@ 524f42393235 524f42333231 524f42333136 -524f42313233 524f42313131 524f41524b45 524f41524b31 @@ -85381,7 +81380,6 @@ 524956595354 5249564b4148 524956455453 -524956455253 524956454e31 524956413939 524956413639 @@ -85408,11 +81406,8 @@ 524950524150 524950504954 524950504945 -524950504559 5249504d4f4d 5249504d414e -5249504c4559 -5249504c4559 52495032424f 524950313233 524950313131 @@ -85421,14 +81416,12 @@ 52494e4f4138 52494e475331 52494e474c45 -52494e474552 52494e473132 52494d4f3039 52494d4d454c 52494d415353 52494d413739 52494c4c4553 -52494c455931 52494c455930 52494c455331 52494b52494b @@ -85448,7 +81441,6 @@ 5249464c4531 5249464b494e 524945474f53 -524944455253 524944455233 524944454f4e 524944444849 @@ -85460,7 +81452,6 @@ 5249434b5936 5249434b5353 5249434b4b4b -5249434b4552 5249434b454c 5249434b3733 5249434b3638 @@ -85483,7 +81474,6 @@ 524943483130 524943453130 524943434931 -524943415244 524943414e53 524943414e31 524943313131 @@ -85528,7 +81518,6 @@ 524659343133 524656544e46 524656434445 -5246524e4543 524652464942 524652454b5a 524652414e4b @@ -85543,14 +81532,12 @@ 5246484c4659 5246484a4446 524648464745 -524648425946 524648424946 524647524647 524643434248 524636303052 524631353737 52455a52455a -52455a4e4f52 52455a4e4552 52455a4c4142 52455a454557 @@ -85559,7 +81546,6 @@ 52455954494d 5245594e414c 524559455331 -5245584f4e41 5245584d414e 524558463244 524558454c4c @@ -85574,7 +81560,6 @@ 5245564f4c47 524556495345 524556495244 -524556494c4f 524556455259 524556454e47 524556454c41 @@ -85606,7 +81591,6 @@ 5245534f4c45 524553494e53 524553484d49 -524553484d41 524553484154 524553484144 524553455421 @@ -85620,18 +81604,14 @@ 524550544f4e 524550534143 524550504552 -5245504f5254 5245504f4f48 5245504c4548 524550494e41 -524550454e54 524550415353 52454f313537 52454e5a4f31 52454e56414e -52454e54414c 52454e534b45 -52454e52454e 52454e4f4f47 52454e4e5547 52454e4e4931 @@ -85647,7 +81627,6 @@ 52454e445241 52454e414543 52454d50454c -52454d4f5445 52454d4f5241 52454d4d5542 52454d4d4f53 @@ -85674,8 +81653,6 @@ 52454b45454d 52454b43494c 524549534947 -52454953454e -5245494e4552 5245494e4153 5245494e4143 5245494e4131 @@ -85683,14 +81660,10 @@ 5245494b4932 524549444152 524549443135 -524548425746 524548414231 524547535652 5245474c414e -524547454e54 524547444f47 -52454741534d -524547414c31 524547393134 52454655454c 524546524553 @@ -85699,13 +81672,11 @@ 524546313233 524545534559 524545534557 -524545534553 524545534534 5245454d4552 5245454b4945 524545463232 524545443131 -524545434531 5245445a3238 524544595053 52454457414c @@ -85737,7 +81708,6 @@ 524544363534 524544343131 524544333334 -524544333231 524544333130 524544333030 524544323933 @@ -85746,14 +81716,12 @@ 524544323132 524544313732 524544313530 -524544313030 524544303031 52454354414c 524543525554 5245434f4e53 5245434f4e4e 5245434f4e41 -5245434f4e31 5245434e4a44 5245434e4143 5245434b4552 @@ -85765,7 +81733,6 @@ 5245424f4f47 524542494c4c 524542455254 -524542454c53 524542454c39 524542454c35 524542445543 @@ -85773,14 +81740,11 @@ 524542313233 524542303054 524541564953 -5245414d4552 5245414d4544 5245414c5353 5245414c3639 524541474132 -524541445931 524541444f4e -524541444552 524541443232 5244524e4e52 524452445244 @@ -85818,11 +81782,9 @@ 52415a313233 52415959414e 52415956454e -524159524159 524159523748 52415950494f 5241594e4531 -5241594d414e 524159444f47 524159434f31 524159434845 @@ -85831,7 +81793,6 @@ 524157534f4e 524157444f4e 524156524156 -5241564e4f53 524156474e49 524156454e58 524156454e43 @@ -85848,7 +81809,6 @@ 524154494e47 524154494659 524154454458 -524154424f59 524154415641 524154415353 524154384d45 @@ -85857,7 +81817,6 @@ 52415353554d 524153494d41 524153484f4e -524153484944 524153484553 524153454143 524152524152 @@ -85873,7 +81832,6 @@ 52414e493232 52414e474945 52414e474553 -52414e474531 52414e44595a 52414e44594f 52414e445935 @@ -85881,17 +81839,13 @@ 52414e44454e 52414e444131 52414e44304d -52414e434944 52414e434853 -52414e434831 52414e414a49 52414d554e45 52414d544841 -52414d534553 52414d533132 52414d4f5345 52414d4f4e44 -52414d4f4e41 52414d4f4e37 52414d495241 52414d495053 @@ -85945,15 +81899,12 @@ 524147554f43 524147544147 524147524f54 -5241474e4152 5241474d4f50 -5241474d414e 524147484942 524147455231 524147444f4c 524147444f47 524147413639 -524146544552 524146495441 524146464941 524146463232 @@ -85964,7 +81915,6 @@ 5241454c594e 5241454c4545 524145434845 -5241444d4952 524144494f38 524144494f37 524144494348 @@ -86045,8 +81995,6 @@ 515751573132 51574d53554a 515745574552 -515745525437 -515745525431 515745525430 515745524557 515745523932 @@ -86066,7 +82014,6 @@ 51554f4b4b41 515549544131 51554953544f -5155494e5441 5155494e5435 5155494e4f41 5155494e4e33 @@ -86080,7 +82027,6 @@ 5155494b3134 5155494a4f54 515549474c59 -515549434b59 515549434b49 515549415241 515549414e41 @@ -86099,11 +82045,9 @@ 515545454e50 515541544552 515541534945 -51554152545a 515541525453 515541524b32 5155414b4553 -5155414b4531 515541494c31 515541484f47 515541474741 @@ -86117,7 +82061,6 @@ 5153435a5345 515343515343 515241593732 -515151575757 515151515157 515151515136 515151363636 @@ -86126,7 +82069,6 @@ 515141413131 515132325757 515131515131 -515131323334 515131323132 515131315757 515058363733 @@ -86141,8 +82083,6 @@ 514554313335 51434f4d3135 514252414e44 -51415a585357 -51415a585357 51415a57415a 51415a544742 51415a4d4c50 @@ -86152,7 +82092,6 @@ 51415a303030 514159584356 514159514159 -514157534544 514153573131 514153534151 514153444647 @@ -86171,7 +82110,6 @@ 513230353451 513157325131 513157324153 -513151325133 51314b345133 513139393151 513132335745 @@ -86204,7 +82142,6 @@ 5055584c494b 50555544454c 50555454494e -505554544552 505554544531 505554534b49 505554534348 @@ -86214,17 +82151,13 @@ 505554415341 505553535958 505553535957 -505553535939 -505553535936 505553535353 -505553534945 505553533737 5055534f4b32 5055534b4153 505553485449 505553484e59 50555348494e -505553484552 505553344d45 505552534552 505552525252 @@ -86232,7 +82165,6 @@ 505552494e45 505552474552 505552474531 -505552445953 505552444945 505550555341 505550534945 @@ -86245,15 +82177,12 @@ 505550494c53 50554e5a4945 50554e4b5858 -50554e4b494e -50554e4b494e 50554e4b3636 50554e4b3134 50554e4b3132 50554e4b3033 50554e474953 50554e47454e -50554d504552 50554d50454e 50554d4f5249 50554d424139 @@ -86262,7 +82191,6 @@ 50554d413130 50554d413033 50554c544531 -50554c534152 50554c4d414e 50554c494341 505549555455 @@ -86320,7 +82248,6 @@ 50524f57414e 50524f56414e 50524f554c58 -50524f544f4e 50524f544f32 50524f534f4e 50524f50414e @@ -86342,7 +82269,6 @@ 50524f434f4c 50524f424533 505249545449 -505249535359 505249505053 5052494e5a45 5052494e545a @@ -86350,25 +82276,16 @@ 5052494e5441 5052494e5432 5052494e4e59 -5052494d5553 5052494d4f37 -5052494d4f31 5052494d4533 -5052494d4531 5052494d4154 505249484f44 -505249455354 505249434544 505249434532 -505249434531 505249414d4f 505246313233 50524556494e 505245545a45 -505245545459 -505245545459 -50524553544f -505245535430 50524553454e 505245534259 505245524e41 @@ -86385,12 +82302,10 @@ 505241564545 505241545449 50524153414e -505241504f52 5052414e4745 5052414e4449 5052414e4144 5052414d494c -505241495345 505241484c31 505241474153 505241444553 @@ -86427,15 +82342,12 @@ 504f57455249 504f57455243 504f57455241 -504f57454c4c -504f57454c4c 504f57313233 504f55545245 504f554c4f53 504f554c414e 504f55434554 504f54534558 -504f544f544f 504f544e494b 504f5445544f 504f54444552 @@ -86446,7 +82358,6 @@ 504f53484552 504f53434845 504f5254454e -504f5254414c 504f52543231 504f52543132 504f52524f53 @@ -86466,13 +82377,10 @@ 504f50555249 504f50534f4e 504f50534b49 -504f50505953 504f50505942 504f50505937 504f50505932 -504f50504f50 504f50504c45 -504f50504552 504f50504153 504f50504150 504f504f4c31 @@ -86481,16 +82389,12 @@ 504f504b4131 504f5049504f 504f50494e47 -504f50455945 -504f50455945 504f50453134 504f50434154 504f50415945 504f50343434 504f4f5a4c45 -504f4f544552 504f4f52414e -504f4f505931 504f4f505353 504f4f505050 504f4f504c59 @@ -86504,7 +82408,6 @@ 504f4f4c494f 504f4f4c4531 504f4f4b5953 -504f4f4b5931 504f4f4b4f4f 504f4f4b4141 504f4f4a4131 @@ -86536,7 +82439,6 @@ 504f4c4c5947 504f4c4c5943 504f4c4c5932 -504f4c4c5931 504f4c4c4554 504f4c4c4152 504f4c4b494c @@ -86545,14 +82447,11 @@ 504f4c4b4552 504f4c4b3039 504f4c495a49 -504f4c49544f 504f4c495441 -504f4c495348 504f4c494e4f 504f4c455641 504f4c453132 504f4c444f58 -504f4c415231 504f4c414b41 504f4c414341 504f4c303030 @@ -86568,12 +82467,9 @@ 504f4b455235 504f4b45454d 504f495a4f4e -504f49555954 504f49555948 -504f49555931 504f49534f34 504f494e5437 -504f494e5431 504f494c5553 504f494c5545 504f49415344 @@ -86607,7 +82503,6 @@ 504d59455253 504d55425443 504d53594a41 -504d53544242 504d53504d53 504d43494e43 504d37383941 @@ -86638,7 +82533,6 @@ 504c4d51415a 504c4d303938 504c48323139 -504c45585553 504c45495445 504c45434b59 504c415a4f54 @@ -86658,7 +82552,6 @@ 504c41535441 504c41534d4f 504c414e5553 -504c414e5431 504c414e4f52 504c414e4e45 504c414d5941 @@ -86678,7 +82571,6 @@ 504a53313030 504a50454b5a 504a50444441 -504a4b4a4e4a 504a4b393337 504a484d5246 504a434d5443 @@ -86687,8 +82579,6 @@ 50495a5a4152 50495a5a4150 50495a5a4138 -50495a5a4131 -50495a444131 504958583243 5049584c4559 504958494533 @@ -86703,15 +82593,12 @@ 504954494553 504954455235 504954444f47 -50495442554c -504953544f4e 504953544953 504953544552 504953535550 50495353494e 504953534553 5049534b4131 -504953434553 504953415241 504952554c41 5049524f434b @@ -86721,7 +82608,6 @@ 504950505931 504950504f58 504950504953 -50495050494e 504950504945 504950504138 504950494e41 @@ -86732,7 +82618,6 @@ 50494f545245 50494f545239 50494f52554e -50494f4e4545 50494f4c4554 50494f434845 50494e5a4f4e @@ -86745,7 +82630,6 @@ 50494e4f5953 50494e4f5431 50494e4b594b -50494e4b5931 50494e4b5031 50494e4b4f32 50494e4b4b49 @@ -86779,36 +82663,28 @@ 50494d503039 50494d503033 50494d503030 -50494c4f5453 50494c4f5449 50494c4f5430 50494c4e494b 50494c4c5342 -50494c4c4f57 50494b4b4945 50494b453938 50494b453133 50494b413459 50494b413234 504947535459 -5049474d414e -504947474945 504947474759 -504947454f4e 504947424147 50494646494e -50494554524f 504945543639 504945534b49 504945525041 -5049434b5550 5049434b4954 5049434b454e 504943484153 504943415241 504943323042 504941535452 -5049414e4f53 5049414e4f4f 5049414d4158 504941474554 @@ -86816,13 +82692,10 @@ 50485953494b 504856465641 5048554b4954 -50485245414b 504850485048 50484f544f5a -50484f544f47 50484f544f43 50484f544f34 -50484f544f31 50484f515545 50484f4e5931 50484f4e4559 @@ -86831,7 +82704,6 @@ 50484d414e4e 50484c595453 50484c594552 -50484c45474d 50484a50484a 504849534848 504849534837 @@ -86853,7 +82725,6 @@ 504842415252 504841543234 504841543233 -504841534552 504841533352 504841524f53 5048414c5958 @@ -86878,10 +82749,8 @@ 504554545931 504554545553 504554544953 -504554544552 50455452554b 504554524f57 -504554524f56 504554524156 5045544f4e45 50455449544f @@ -86909,12 +82778,8 @@ 504553455441 504553434941 50455343414f -504552534f4e -504552534f4e -50455253494b 504552525932 504552524f32 -50455252494e 5045524e4f44 5045524e4153 5045524d454e @@ -86940,7 +82805,6 @@ 50455050494e 504550504931 504550504553 -50455049544f 504550494c4c 504550454c41 504550453639 @@ -86961,7 +82825,6 @@ 50454e4e5933 50454e4e3132 50454e495448 -50454e495331 50454e494e47 50454e49454c 50454e47554e @@ -86994,12 +82857,10 @@ 504544415a4f 504543414e53 5045424c4553 -504542424c45 504541524c42 504541524c41 504541524c36 504541524c35 -504541524c31 5045414e4552 504541434832 504541434534 @@ -87013,7 +82874,6 @@ 504432333039 5043504c5553 50434d50434d -50434d434941 50434d313053 50434c414253 50434a435349 @@ -87032,7 +82892,6 @@ 50415a5a3141 50415a50415a 50415a323030 -504159544f4e 504159503639 5041594d454e 50415948414e @@ -87051,7 +82910,6 @@ 5041554c4c41 5041554c4c31 5041554c4731 -5041554c4559 5041554c454e 5041554c4531 5041554c4431 @@ -87060,7 +82918,6 @@ 5041554c4148 5041554c4142 5041554c4133 -5041554c4131 5041554c3930 5041554c3832 5041554c3738 @@ -87081,11 +82938,9 @@ 504154545950 504154545947 504154545943 -504154545931 50415454494e 50415454494b 504154544949 -504154544945 504154544549 504154544150 504154535934 @@ -87123,7 +82978,6 @@ 50415353544f 504153535441 504153534545 -504153534544 504153534445 504153534150 504153533930 @@ -87139,8 +82993,6 @@ 504153484141 504153454f53 504153434b49 -50415343414c -50415256495a 504152564938 504152555341 504152554c31 @@ -87152,8 +83004,6 @@ 504152534552 504152525553 504152524f57 -504152524f54 -5041524f4c41 5041524f4c32 5041524d4131 5041524c414b @@ -87196,7 +83046,6 @@ 504150455259 504150455237 504150455234 -504150455231 504150415241 504150414e49 504150413437 @@ -87209,7 +83058,6 @@ 50414f4c4132 50414f313233 50414e56454c -50414e545331 50414e54454b 50414e544153 50414e534f4e @@ -87222,7 +83070,6 @@ 50414e474f53 50414e46494c 50414e454c41 -50414e444153 50414e444152 50414e44414d 50414e444137 @@ -87241,7 +83088,6 @@ 50414d383838 50414d383233 50414d313233 -50414c4f4d41 50414c4d5658 50414c4d4f53 50414c4d4952 @@ -87266,7 +83112,6 @@ 50414a414d41 50414a414c41 504149534f4e -5041494e5453 5041494e3639 504149474534 504148494e41 @@ -87283,7 +83128,6 @@ 504147453433 504147453234 504146504146 -504144524553 504144524531 5041444d494e 504144494e41 @@ -87299,11 +83143,9 @@ 5041434f3233 5041434f3131 5041434f3130 -5041434d414e 5041434c4559 5041434b494e 5041434b4945 -5041434b4552 5041434b4545 5041434b3936 5041434b3833 @@ -87311,11 +83153,9 @@ 5041434b3034 5041434b3033 5041434b3031 -504143494e4f 50414348494e 504143484553 50414348414e -504143455253 504143455233 504143444f47 504143434152 @@ -87323,7 +83163,6 @@ 504143414441 504143353136 5041424c4f30 -5041424c4954 504142313233 5041414f5145 50413234434b @@ -87370,7 +83209,6 @@ 4f585943454d 4f5853414e41 4f5852414e41 -4f58464f5244 4f58414e4147 4f5757575757 4f574e533939 @@ -87400,8 +83238,6 @@ 4f553831324a 4f5538313249 4f5538313238 -4f5538313232 -4f5538313232 4f54544f4a52 4f54544f3137 4f54544f3037 @@ -87434,8 +83270,6 @@ 4f534f4b494e 4f534b415253 4f534b415241 -4f5349525553 -4f5349524953 4f53494f5349 4f53484f5858 4f5348495249 @@ -87461,7 +83295,6 @@ 4f5249533237 4f52494f5347 4f52494f5249 -4f52494f4e53 4f52494f4e42 4f52494f4e39 4f52494c4559 @@ -87495,7 +83328,6 @@ 4f5055533731 4f5055533639 4f5055533132 -4f5054494353 4f50524f4f4d 4f5050505050 4f5050313233 @@ -87504,7 +83336,6 @@ 4f5045544831 4f5045524154 4f5045524136 -4f50454e4954 4f50454e4444 4f50454e3939 4f50454e3232 @@ -87530,12 +83361,10 @@ 4f4e53414c45 4f4e524f5031 4f4e4f465249 -4f4e4b454c5a 4f4e4b454c53 4f4e49583735 4f4e49534841 4f4e49534143 -4f4e494f4e31 4f4e494d4f44 4f4e49414e49 4f4e4742414b @@ -87575,7 +83404,6 @@ 4f4c4d45444f 4f4c4c4f5041 4f4c4c494532 -4f4c4c494531 4f4c4b413132 4f4c49574b41 4f4c49564545 @@ -87598,8 +83426,6 @@ 4f4c47413238 4f4c47413237 4f4c47413135 -4f4c45535941 -4f4c45534b41 4f4c45524f4e 4f4c454f4f4f 4f4c454d4953 @@ -87631,10 +83457,8 @@ 4f4c41525259 4f4c414e4f31 4f4c41463031 -4f4c31564552 4f4b54415641 4f4b54383333 -4f4b53414e41 4f4b53313233 4f4b4f4e454c 4f4b4f4b3132 @@ -87696,7 +83520,6 @@ 4f44494e3133 4f44494c4f4f 4f4448313734 -4f4445535341 4f44454c4c41 4f44454c4941 4f4444444f47 @@ -87705,31 +83528,26 @@ 4f4441494b4f 4f4431393935 4f43544f3136 -4f4354415645 4f4352414d31 4f434f434f43 4f434f313939 4f4345414e36 4f4345414e34 4f4343453131 -4f4343414d53 4f43414d504f 4f4341324d37 4f4255484f56 4f425249414e 4f424f4f424f 4f424c494745 -4f424957414e 4f424956414e 4f4245574f4e 4f4245525453 4f42454f4e45 -4f42454c4958 4f4243454543 4f4242593639 4f4241484f52 4f4153495333 -4f4153495331 4f414b4c414e 4f414b424159 4f414b313233 @@ -87785,11 +83603,9 @@ 4e55474e5547 4e5547474f54 4e5547474945 -4e5547454e54 4e5547454e45 4e5545434553 4e55444e494b -4e5544495354 4e5544455354 4e5544453639 4e5544444552 @@ -87826,7 +83642,6 @@ 4e5157544642 4e5149493448 4e504f455353 -4e5045415254 4e4f5a414b49 4e4f594e4f59 4e4f594e454b @@ -87875,7 +83690,6 @@ 4e4f52534b31 4e4f52534531 4e4f52524f4e -4e4f52524953 4e4f524e4559 4e4f524d4954 4e4f524d414b @@ -87883,13 +83697,11 @@ 4e4f524d3639 4e4f524d3135 4e4f524b4559 -4e4f5245454e 4e4f52444f4e 4e4f52444541 4e4f52434f4d 4e4f5243494d 4e4f52424945 -4e4f52424552 4e4f52413235 4e4f504c4159 4e4f50494e53 @@ -87897,11 +83709,9 @@ 4e4f4f534945 4e4f4f50314b 4e4f4f4e4545 -4e4f4f4b4945 4e4f4f4b4552 4e4f4f47414c 4e4f4f464552 -4e4f4f444c45 4e4f4f424f4b 4e4f4f424b41 4e4f4e4f3031 @@ -87918,7 +83728,6 @@ 4e4f4d454154 4e4f4d41524b 4e4f4d415231 -4e4f4d414453 4e4f4d414445 4e4f4d414444 4e4f4c4f474f @@ -87946,7 +83755,6 @@ 4e4f46583639 4e4f4553534c 4e4f454d4953 -4e4f454c4c45 4e4f454c4657 4e4f454c3131 4e4f44524148 @@ -87962,7 +83770,6 @@ 4e4f434b4552 4e4f43484558 4e4f43415348 -4e4f424c4531 4e4f42495441 4e4f42494c49 4e4f42494c45 @@ -88003,9 +83810,7 @@ 4e4956413136 4e49545a4552 4e495453414d -4e4954524f58 4e4954524958 -4e495452414d 4e49544e4f49 4e4954455254 4e4954454c46 @@ -88031,8 +83836,6 @@ 4e494e4a4137 4e494e4a4135 4e494e47414c -4e494e455253 -4e494e455253 4e494e455231 4e494e453830 4e494e413938 @@ -88044,13 +83847,10 @@ 4e494e413133 4e494e373430 4e494d53414a -4e494d425553 -4e494d425553 4e494d383432 4e494c554a45 4e494c4f3733 4e494c4c4f52 -4e494c455348 4e494c415941 4e494b4f5331 4e494b4f4e33 @@ -88059,7 +83859,6 @@ 4e494b4f3839 4e494b4e414d 4e494b4c4f53 -4e494b4c4153 4e494b4b4947 4e494b4b4944 4e494b4b4941 @@ -88083,18 +83882,15 @@ 4e4949444541 4e4948494c31 4e4947485457 -4e4947485453 4e4947485437 4e4947485435 4e4947484e49 4e4947474c45 -4e4947474552 4e4947474135 4e4947474132 4e4947455249 4e4947454c43 4e4947454c42 -4e4947454c31 4e4946453632 4e494554454e 4e49454d4132 @@ -88119,7 +83915,6 @@ 4e49434b4f31 4e49434b4949 4e49434b454e -4e49434b454c 4e49434b4544 4e49434b3938 4e49434b3936 @@ -88134,7 +83929,6 @@ 4e49434b3133 4e49434b3034 4e4943495459 -4e4943484f4c 4e4943483234 4e4943454441 4e4943454153 @@ -88145,7 +83939,6 @@ 4e4943313939 4e4943304c45 4e4943304c41 -4e4941475241 4e4930333730 4e4859544742 4e484e545741 @@ -88173,8 +83966,6 @@ 4e464b55464e 4e4644434f31 4e46434d5246 -4e455854454c -4e455854454c 4e4558543133 4e4557594f55 4e4557574542 @@ -88188,14 +83979,12 @@ 4e4557495454 4e455746414e 4e4557455231 -4e4557454c4c 4e4557444144 4e4557415953 4e4557415353 4e4557393837 4e4557363636 4e4557324d45 -4e4557313233 4e4557304e45 4e4556495454 4e455649454d @@ -88216,7 +84005,6 @@ 4e4554353537 4e4553544544 4e4553544152 -4e4553534945 4e455343494f 4e4553424954 4e4553344133 @@ -88248,7 +84036,6 @@ 4e454d454e53 4e454c554e41 4e454c4c5959 -4e454c4c4945 4e454c4c4931 4e454c4c454b 4e454c4c434a @@ -88290,7 +84077,6 @@ 4e45414c4f4e 4e4541474c45 4e4541443432 -4e4531343639 4e4452373531 4e444f473735 4e44494d514a @@ -88299,7 +84085,6 @@ 4e4349545241 4e4346434f4b 4e4332303030 -4e42564a4946 4e4256313233 4e424e483233 4e4249454b5a @@ -88309,8 +84094,6 @@ 4e415a4d414e 4e415a494d45 4e415a494b4f -4e415a47554c -4e415a47554c 4e415a444152 4e415a415241 4e415a343135 @@ -88322,8 +84105,6 @@ 4e4156593035 4e4156494741 4e4156494441 -4e4156454c53 -4e4156454544 4e4156414a30 4e4156414944 4e4155564f4f @@ -88335,7 +84116,6 @@ 4e41544e4946 4e41544b4152 4e41544a454e -4e4154495645 4e4154494b41 4e4154474153 4e4154455253 @@ -88346,7 +84126,6 @@ 4e4154434132 4e4154425549 4e4154414e31 -4e4154414c59 4e4154414c4b 4e4154414c31 4e4154413837 @@ -88366,9 +84145,7 @@ 4e415354454e 4e4153535459 4e4153534952 -4e4153534155 4e4153524154 -4e41534f4e45 4e4153454259 4e4153415544 4e4153333333 @@ -88377,7 +84154,6 @@ 4e4152554c41 4e415254554e 4e4152534553 -4e41524e4941 4e41524d4552 4e41524b4f5a 4e4152474953 @@ -88387,9 +84163,7 @@ 4e415243595a 4e415241494e 4e41504d4d43 -4e4150494552 4e4150494154 -4e4150414c4d 4e414f544549 4e414f4d4949 4e414f4d4945 @@ -88446,7 +84220,6 @@ 4e414952414d 4e41494e4149 4e41494c554a -4e41494c5331 4e41494c4d45 4e41494c454d 4e4148554d31 @@ -88473,7 +84246,6 @@ 4e4144474552 4e4144454e45 4e4144313233 -4e41434e5544 4e4143494d45 4e4143484f33 4e4143484f32 @@ -88523,8 +84295,6 @@ 4d5954484f52 4d595448454e 4d5953555a45 -4d5953544943 -4d5953544943 4d5953544531 4d5953543232 4d5953504143 @@ -88532,7 +84302,6 @@ 4d59534c494d 4d5952495441 4d59504f5354 -4d5950415353 4d595030524e 4d594e4f5345 4d594e4f4348 @@ -88545,7 +84314,6 @@ 4d594c305645 4d594b4f5441 4d594b4f4c41 -4d594b494453 4d594b453238 4d5949524132 4d5948414e48 @@ -88555,12 +84323,10 @@ 4d59434f4445 4d5943415431 4d5943415348 -4d59424f5953 4d5942455448 4d5942454152 4d5942414e44 4d5941535353 -4d5941535331 4d5937343734 4d5937303058 4d5936323330 @@ -88598,7 +84364,6 @@ 4d5554544f34 4d5554544c45 4d5554544841 -4d55544c4559 4d5554494e47 4d5554485531 4d5554454b49 @@ -88613,7 +84378,6 @@ 4d55534b5953 4d5553494e41 4d5553454e41 -4d5553434849 4d5553414e47 4d55525a4943 4d5552544841 @@ -88630,7 +84394,6 @@ 4d554e4e4945 4d554e4e4559 4d554e4a4954 -4d554e494348 4d554e474f53 4d554e47414d 4d554e454542 @@ -88645,7 +84408,6 @@ 4d554d4d5934 4d554d454e54 4d554c544953 -4d554c4c4554 4d554c4c414e 4d554c4c4148 4d554c453639 @@ -88663,7 +84425,6 @@ 4d5547474945 4d554654414b 4d55464d414e -4d5546464945 4d5546464938 4d5546464931 4d554646454e @@ -88674,7 +84435,6 @@ 4d55454c4c45 4d5544343236 4d55434d5543 -4d55434b454c 4d5543484132 4d5542455349 4d5541423030 @@ -88689,7 +84449,6 @@ 4d5438584145 4d53544f524d 4d535449434b -4d5354313233 4d53534f4654 4d5353353030 4d5350573132 @@ -88720,7 +84479,6 @@ 4d5253504f54 4d52534d5253 4d525249434b -4d5250494e4b 4d5250494d50 4d524f53454e 4d524f42494e @@ -88772,7 +84530,6 @@ 4d4f56455231 4d4f555a4f4e 4d4f55535953 -4d4f55534552 4d4f54594c31 4d4f54545931 4d4f544f3639 @@ -88790,7 +84547,6 @@ 4d4f5353454c 4d4f53533132 4d4f534b4954 -4d4f534b4155 4d4f534b414c 4d4f53484b41 4d4f53484531 @@ -88810,7 +84566,6 @@ 4d4f524f4e32 4d4f524f4348 4d4f524d454c -4d4f524c4559 4d4f524b5641 4d4f52494b41 4d4f52494132 @@ -88833,21 +84588,15 @@ 4d4f52414449 4d4f50484154 4d4f4f534943 -4d4f4f534553 4d4f4f534534 4d4f4f524545 -4d4f4f524541 4d4f4f524537 -4d4f4f4e4559 -4d4f4f4e4559 -4d4f4f4e4552 4d4f4f4e4544 4d4f4f4e3637 4d4f4f4e3535 4d4f4f4e3432 4d4f4f4e3332 4d4f4f4e3130 -4d4f4f4e3031 4d4f4f4c4945 4d4f4f4b494b 4d4f4f4b4553 @@ -88869,7 +84618,6 @@ 4d4f4e544f59 4d4f4e544f53 4d4f4e54494e -4d4f4e535445 4d4f4e534552 4d4f4e4f5859 4d4f4e4f4c49 @@ -88882,13 +84630,9 @@ 4d4f4e493230 4d4f4e474945 4d4f4e45595a -4d4f4e455959 -4d4f4e455932 4d4f4e455437 -4d4f4e455431 4d4f4e444c4c 4d4f4e444553 -4d4f4e44454f 4d4f4e43554c 4d4f4e415454 4d4f4e415248 @@ -88904,27 +84648,22 @@ 4d4f4d4f3635 4d4f4d4f3132 4d4f4d4d5935 -4d4f4d4d4f4d 4d4f4d4d4141 4d4f4d4d4135 4d4f4d444f47 4d4f4c544b45 -4d4f4c534f4e 4d4f4c4f5441 4d4f4c4d4f4c 4d4f4c4c5957 4d4f4c4c5948 4d4f4c4c5939 4d4f4c4c5938 -4d4f4c4c4945 4d4f4c4c454e 4d4f4c494e53 4d4f4c494e4f -4d4f4c494e41 4d4f4c455931 4d4f4c453535 4d4f4c444f56 -4d4f4c444952 4d4f4b4f4e47 4d4f4b4f4b4f 4d4f4b4f444f @@ -88961,7 +84700,6 @@ 4d4f444e4f43 4d4f444d4f44 4d4f44494341 -4d4f44454c53 4d4f44303141 4d4f43524548 4d4f434f534f @@ -89003,7 +84741,6 @@ 4d4d4d373737 4d4d4d353535 4d4d4d303030 -4d4d4b4d4d4b 4d4d49494e47 4d4d46333030 4d4d434f4f4c @@ -89066,7 +84803,6 @@ 4d4a33323030 4d4a32334342 4d4a31353330 -4d495a554e4f 4d495a415244 4d4959414d49 4d4959414b45 @@ -89084,11 +84820,9 @@ 4d4954434849 4d4954434836 4d4954434832 -4d4954434831 4d4954414e49 4d4954414b41 4d4953545934 -4d495354494b 4d4953535935 4d49534e494b 4d49534c4544 @@ -89096,14 +84830,10 @@ 4d4953484b4f 4d495348494e 4d4953484153 -4d4953464954 4d4953455249 -4d4953434841 4d4953415241 4d4953313233 4d4952524f57 -4d4952524f52 -4d4952524f52 4d49524f4d49 4d495249554d 4d4952494e41 @@ -89155,7 +84885,6 @@ 4d494e445957 4d494e445353 4d494e444557 -4d494e44454e 4d494e434849 4d494e415244 4d494e414e47 @@ -89190,7 +84919,6 @@ 4d494c45534d 4d494c455337 4d494c455334 -4d494c454e41 4d494c445245 4d494c414e38 4d494c414752 @@ -89202,7 +84930,6 @@ 4d494b4c4142 4d494b4b4c47 4d494b4b4954 -4d494b4b4559 4d494b494b49 4d494b494559 4d494b494553 @@ -89211,10 +84938,7 @@ 4d494b493132 4d494b493131 4d494b455957 -4d494b455953 4d494b455946 -4d494b455858 -4d494b455343 4d494b455244 4d494b455045 4d494b45454e @@ -89226,9 +84950,7 @@ 4d494b453933 4d494b453832 4d494b453739 -4d494b453737 4d494b453735 -4d494b453636 4d494b453634 4d494b453533 4d494b453436 @@ -89240,8 +84962,6 @@ 4d494b453238 4d494b41594c 4d494b415241 -4d494b41454c -4d494b41444f 4d494b413231 4d494a494b41 4d4948415255 @@ -89255,7 +84975,6 @@ 4d494646494e 4d4945534841 4d4945504945 -4d4944454c4f 4d4944415749 4d4943554c4f 4d4943524f35 @@ -89281,7 +85000,6 @@ 4d494341444f 4d4943383231 4d4942454c4c -4d4941544131 4d4941504941 4d49414f5731 4d49414e5553 @@ -89324,21 +85042,17 @@ 4d45544f4d49 4d45544d4554 4d45544d414e -4d4554484f53 4d4554414c58 4d4554414c47 4d4554414c37 -4d4554414c31 4d455441424f 4d4553544f4e -4d4553534552 4d455349434d 4d4553484f4b 4d4553474552 4d4553454c46 4d455339444f 4d455257414e -4d4552525931 4d455252494e 4d455252454c 4d45524f4e41 @@ -89364,7 +85078,6 @@ 4d454f484d59 4d454e5a4945 4d454e5a454c -4d454e544f52 4d454e544f4e 4d454e544845 4d454e4f5641 @@ -89393,7 +85106,6 @@ 4d454c4f3939 4d454c4e554b 4d454c4d4152 -4d454c4c4945 4d454c4c4153 4d454c4b4159 4d454c494b45 @@ -89406,7 +85118,6 @@ 4d454c424154 4d454c415a41 4d454c415955 -4d454c414e49 4d454c313747 4d454c303030 4d454b4f3132 @@ -89426,7 +85137,6 @@ 4d45474e4943 4d4547484e41 4d454748494e -4d454748414e 4d454744414e 4d4547415353 4d4547415241 @@ -89446,16 +85156,12 @@ 4d4545505331 4d4545504954 4d45454c4953 -4d4544555341 -4d4544555341 4d4544524544 4d45444c494e 4d45444c4552 -4d454449554d 4d4544494e45 4d4544494352 4d4544494332 -4d4544494331 4d4544494321 4d4544494135 4d4544455941 @@ -89505,7 +85211,6 @@ 4d4353554150 4d4353453242 4d435155494c -4d434e414242 4d434d554c45 4d434d504d50 4d434d415454 @@ -89525,7 +85230,6 @@ 4d4344343337 4d4343524159 4d43434f5931 -4d43434f5931 4d4343393838 4d43414c4c49 4d434144414d @@ -89556,7 +85260,6 @@ 4d415a4c4f56 4d415a444f4b 4d415a414b31 -4d415a363236 4d4159554b41 4d41594f5454 4d41594f5231 @@ -89568,7 +85271,6 @@ 4d415949544f 4d4159484f42 4d4159464149 -4d4159444159 4d415944414e 4d415942454c 4d4159415649 @@ -89588,7 +85290,6 @@ 4d4158583230 4d4158583131 4d4158545454 -4d4158544f52 4d4158544f4d 4d4158524f59 4d415850524f @@ -89596,15 +85297,11 @@ 4d41584d4144 4d41584c5431 4d4158494e47 -4d4158494e45 -4d4158494d45 4d4158494d37 4d4158494c49 4d4158494532 4d4158455253 4d4158455250 -4d4158454c4c -4d4158444f47 4d4158434f4d 4d4158383838 4d4158343230 @@ -89623,7 +85320,6 @@ 4d4155524f38 4d4155524f31 4d4155524931 -4d4155524552 4d4155504945 4d41554c414e 4d41554b4153 @@ -89642,9 +85338,7 @@ 4d4154544e47 4d4154544d41 4d415454494f -4d4154544945 4d415454414e -4d4154543939 4d4154543936 4d4154543839 4d4154543833 @@ -89655,7 +85349,6 @@ 4d4154543239 4d415453554f 4d4154525542 -4d4154524958 4d4154524953 4d41544f5553 4d41544f554b @@ -89680,8 +85373,6 @@ 4d4153554b4f 4d4153554441 4d4153545242 -4d4153544552 -4d4153544552 4d4153544153 4d415354414b 4d4153544146 @@ -89711,7 +85402,6 @@ 4d4152594c49 4d4152594b45 4d4152594b31 -4d4152594a4f 4d4152594a42 4d4152594153 4d4152594148 @@ -89727,7 +85417,6 @@ 4d415256314e 4d4152555441 4d415255534b -4d415254594e 4d415254594b 4d4152545933 4d4152545656 @@ -89739,7 +85428,6 @@ 4d4152544941 4d4152544939 4d4152544938 -4d415254454c 4d415254414e 4d4152543239 4d4152543238 @@ -89762,7 +85450,6 @@ 4d41524e4544 4d41524e4531 4d41524d4945 -4d41524c4f57 4d41524c4f4f 4d41524c4f32 4d41524c4f31 @@ -89775,13 +85462,8 @@ 4d41524b4f4d 4d41524b4c49 4d41524b4b4f -4d41524b495a -4d41524b494e 4d41524b4841 4d41524b4559 -4d41524b4554 -4d41524b4552 -4d41524b4552 4d41524b4531 4d41524b4459 4d41524b4153 @@ -89802,7 +85484,6 @@ 4d41524b3330 4d41524b3236 4d41524b3134 -4d41524b3130 4d41524b3038 4d41524b3037 4d41524b3035 @@ -89810,10 +85491,7 @@ 4d41524b3032 4d41524a554e 4d41524a4945 -4d41524a414e 4d4152495841 -4d415249534f -4d4152495341 4d4152495331 4d4152494f52 4d4152494f50 @@ -89840,7 +85518,6 @@ 4d4152493237 4d4152493138 4d4152475254 -4d4152474f54 4d4152474c4f 4d4152454b4b 4d4152454944 @@ -89854,8 +85531,6 @@ 4d4152434f44 4d4152434f43 4d4152434f37 -4d4152434f32 -4d4152434f31 4d415243495a 4d4152434836 4d4152434545 @@ -89866,7 +85541,6 @@ 4d4152433231 4d4152433138 4d4152433132 -4d4152424c45 4d4152424947 4d4152424554 4d415242454c @@ -89885,13 +85559,11 @@ 4d4150313233 4d414e5a4f4e 4d414e594153 -4d414e555444 4d414e554e59 4d414e554943 4d414e553638 4d414e545541 4d414e544f52 -4d414e544953 4d414e544941 4d414e54454b 4d414e534b49 @@ -89899,7 +85571,6 @@ 4d414e524544 4d414e4f5441 4d414e4f5248 -4d414e4f4e31 4d414e4f4d41 4d414e4e5952 4d414e4e5937 @@ -89908,7 +85579,6 @@ 4d414e4e4559 4d414e4e3231 4d414e4e3131 -4d414e4d414e 4d414e4c4f47 4d414e4c494f 4d414e4c414e @@ -89920,7 +85590,6 @@ 4d414e494e49 4d414e494e47 4d414e494d41 -4d414e494c41 4d414e49434b 4d414e494153 4d414e49414e @@ -89928,7 +85597,6 @@ 4d414e474f39 4d414e474f37 4d414e474f33 -4d414e474f31 4d414e474152 4d414e47414e 4d414e474132 @@ -90025,7 +85693,6 @@ 4d414c414d49 4d414c414d41 4d414c414b4f -4d414c414741 4d414c414645 4d414c414445 4d414c34494b @@ -90052,7 +85719,6 @@ 4d4149544545 4d4149524554 4d41494e4c59 -4d41494e4531 4d41494e3737 4d41494c5953 4d41494c5850 @@ -90075,20 +85741,15 @@ 4d4148414841 4d4148414449 4d414759434b -4d4147594152 4d414755524f 4d4147533133 -4d41474f4f31 4d4147494e45 -4d4147494331 4d4147474931 4d4147453133 4d4147444136 -4d4147444136 4d4147444130 4d4147415a49 4d4147414c4c -4d4147414c49 4d4147303037 4d4146495348 4d41445a494b @@ -90097,15 +85758,10 @@ 4d4144554c41 4d4144534558 4d414452494f -4d41444f4b41 -4d41444f4b41 -4d41444d4158 -4d41444d4158 4d41444d4152 4d41444d4147 4d41444b4154 4d41444a4944 -4d414449534f 4d414449454e 4d4144494152 4d414449414e @@ -90146,7 +85802,6 @@ 4d41434b3231 4d4143495354 4d4143494b41 -4d414349454b 4d4143493939 4d4143484f31 4d4143484b41 @@ -90204,8 +85859,6 @@ 4d31344b494d 4d3132423132 4d3132333457 -4d3132333435 -4d3131313131 4d3131313131 4d3130313042 4d3130303030 @@ -90227,7 +85880,6 @@ 4c594e4e4554 4c594e4e4535 4c594e4e4532 -4c594e4e4531 4c594e4e3939 4c594e4e3731 4c594e4e3539 @@ -90235,12 +85887,10 @@ 4c594e4e3333 4c594e4e3130 4c594e4c594e -4c594e474259 4c594e445359 4c594e444945 4c594e444131 4c594c593737 -4c594449414e 4c5944494142 4c59434f5331 4c584c584c58 @@ -90249,7 +85899,6 @@ 4c5651323631 4c56454e4f4b 4c5635443957 -4c555a45524e 4c55584f5234 4c55584c5558 4c5556564552 @@ -90258,7 +85907,6 @@ 4c5556505553 4c5556484552 4c5553544c59 -4c5553544552 4c555354414e 4c5553543455 4c5553455253 @@ -90287,8 +85935,6 @@ 4c554d494e4f 4c554d494552 4c554d454e45 -4c554d424552 -4c554c554c55 4c554c553233 4c554c553139 4c554c553132 @@ -90324,7 +85970,6 @@ 4c5546464141 4c5546425241 4c55454c4c45 -4c5544574947 4c554456494b 4c55444d4f4e 4c5543594245 @@ -90337,11 +85982,7 @@ 4c55434b5954 4c55434b594b 4c55434b5943 -4c55434b5939 -4c55434b4559 -4c5543495553 4c5543494435 -4c554349414e 4c5543493838 4c5543484f31 4c554348494b @@ -90356,7 +85997,6 @@ 4c5543313233 4c55424f4646 4c55424c494e -4c55424c494e 4c5542454c4c 4c5542445542 4c5541503636 @@ -90389,7 +86029,6 @@ 4c5230363332 4c50534c5053 4c5044313233 -4c4f594f4c41 4c4f58585858 4c4f58414e59 4c4f57544152 @@ -90405,14 +86044,12 @@ 4c4f56455931 4c4f56455533 4c4f56455332 -4c4f56455331 4c4f5645524d 4c4f56455238 4c4f56455234 4c4f56455221 4c4f56454d59 4c4f56454d41 -4c4f56454c4c 4c4f56454b4f 4c4f56454521 4c4f56454441 @@ -90420,7 +86057,6 @@ 4c4f56453833 4c4f56453735 4c4f56453733 -4c4f56453639 4c4f56453635 4c4f56453632 4c4f56453534 @@ -90429,7 +86065,6 @@ 4c4f56453432 4c4f56453430 4c4f56453255 -4c4f56453134 4c4f56453038 4c4f56453034 4c4f56313233 @@ -90468,7 +86103,6 @@ 4c4f53534553 4c4f534e4148 4c4f53484b41 -4c4f53455253 4c4f53455236 4c4f53455233 4c4f53455230 @@ -90515,20 +86149,16 @@ 4c4f4f4f5645 4c4f4f4f4f4f 4c4f4f4f4b53 -4c4f4f4e4559 4c4f4f4c4141 4c4f4f4b5353 4c4f4f4b5331 4c4f4f4b4b4b -4c4f4f4b494e 4c4f4f484353 4c4f4f464552 -4c4f4e4e4945 4c4f4e4e4552 4c4f4e47544f 4c4f4e474d59 4c4f4e474c45 -4c4f4e474552 4c4f4e473237 4c4f4e473130 4c4f4e45525a @@ -90591,7 +86221,6 @@ 4c4f47494353 4c4f47474544 4c4f47414e38 -4c4f47414e35 4c4f47414e30 4c4f4741494e 4c4f45575331 @@ -90714,7 +86343,6 @@ 4c4954453232 4c4954414e59 4c495441474f -4c4953544552 4c4953534554 4c49534c4953 4c4953484b41 @@ -90730,7 +86358,6 @@ 4c4953414141 4c4953413938 4c4953413830 -4c4953413639 4c4953413637 4c4953413238 4c4953413032 @@ -90757,7 +86384,6 @@ 4c494e4d4152 4c494e4b5553 4c494e4b4f4e -4c494e4b494e 4c494e4b454e 4c494e4b454c 4c494e494a41 @@ -90769,7 +86395,6 @@ 4c494e444953 4c494e444545 4c494e44415a -4c494e444153 4c494e444138 4c494e443939 4c494e433939 @@ -90790,21 +86415,15 @@ 4c494c574154 4c494c554e41 4c494c4d4f45 -4c494c4d414e 4c494c4c5959 4c494c4c5948 4c494c4c5937 4c494c4c5935 -4c494c4c5931 4c494c4c5930 4c494c4c4f55 -4c494c4c4945 4c494c4c3559 -4c494c4b494d -4c494c495941 4c494c495445 4c494c494153 -4c494c49414e 4c494c493830 4c494c493631 4c494c493233 @@ -90812,7 +86431,6 @@ 4c494c445245 4c494c444f43 4c494c425547 -4c494c424954 4c494c413137 4c494b574944 4c494b4e4f42 @@ -90841,7 +86459,6 @@ 4c49424f4c4f 4c49424d414e 4c494247454d -4c494245524f 4c4942455249 4c4942424559 4c49414d5349 @@ -90867,7 +86484,6 @@ 4c455a5a4945 4c455a4c4945 4c45594c414e -4c4558555331 4c4558544552 4c45584d414e 4c4558493939 @@ -90876,7 +86492,6 @@ 4c4557495354 4c455749534d 4c4557495337 -4c4557495331 4c4557454c4c 4c4556594d31 4c45564f4e31 @@ -90908,7 +86523,6 @@ 4c4553414557 4c4553303032 4c45524f5948 -4c45524f5931 4c45524d414e 4c4552494441 4c4552413934 @@ -90938,7 +86552,6 @@ 4c454e4e5944 4c454e4e5939 4c454e4e5935 -4c454e4e5931 4c454e4e554b 4c454e4d414e 4c454e494e32 @@ -90966,7 +86579,6 @@ 4c4549534f4e 4c4549505a49 4c4549474833 -4c4549474831 4c4548413131 4c4547504547 4c45474f5331 @@ -91027,7 +86639,6 @@ 4c4250544b4d 4c424d4c4143 4c424741534c -4c4246595246 4c4246313433 4c42414b4552 4c4235313432 @@ -91044,7 +86655,6 @@ 4c41594f4646 4c41594e4945 4c41594d4f4e -4c41594d414e 4c41594c4148 4c4159455253 4c4159424f59 @@ -91054,7 +86664,6 @@ 4c4158313030 4c4157524945 4c41574e4559 -4c41574c4157 4c4157494747 4c4157434154 4c4157424f59 @@ -91065,12 +86674,8 @@ 4c4156455247 4c4156415231 4c4156414c33 -4c415552594e -4c4155524945 4c4155524941 -4c415552454c 4c4155524159 -4c4155524153 4c4155524143 4c4155524138 4c4155524130 @@ -91085,7 +86690,6 @@ 4c4154544553 4c4154524f4d 4c4154494e53 -4c4154494e41 4c4154494e35 4c4154494645 4c4154494345 @@ -91110,7 +86714,6 @@ 4c4152554b55 4c4152545546 4c4152544552 -4c415253454e 4c4152533534 4c415252595a 4c4152525945 @@ -91127,13 +86730,11 @@ 4c4152414c41 4c4152413132 4c4152413131 -4c4150544f50 4c4150534841 4c4150534554 4c4150524559 4c4150524153 4c4150504554 -4c4150504552 4c41504f5354 4c4150494445 4c415048414d @@ -91158,7 +86759,6 @@ 4c414e444f31 4c414e444945 4c414e443930 -4c414e434941 4c414e434845 4c414e434548 4c414e434544 @@ -91173,7 +86773,6 @@ 4c414d503432 4c414d503232 4c414d503139 -4c414d4f4e54 4c414d4d4152 4c414d455258 4c414d454a4f @@ -91185,8 +86784,6 @@ 4c414c4b4131 4c414c495448 4c414c494c4f -4c414c494c4f -4c414c414c41 4c414c414444 4c414b534841 4c414b534552 @@ -91205,7 +86802,6 @@ 4c4149384945 4c4148454e53 4c41474f5353 -4c41474f4f4e 4c41474c4147 4c4146554741 4c414646454e @@ -91226,13 +86822,11 @@ 4c4144413037 4c4144413035 4c4143594a4f -4c4143554e41 4c41434b4552 4c4143495459 4c414345594a 4c4143454942 4c4143453838 -4c4143415341 4c4142555354 4c4142524145 4c41424f4654 @@ -91271,7 +86865,6 @@ 4c3130343947 4c3056454d45 4c304f384e36 -4c304e44304e 4c304c4c304c 4c30314a3032 4c3030533352 @@ -91327,7 +86920,6 @@ 4b5553414b41 4b5552554d49 4b5552544e59 -4b5552544953 4b5552543333 4b5552543134 4b5552534b33 @@ -91339,7 +86931,6 @@ 4b5550414c41 4b554f50494f 4b554e574152 -4b554e47454e 4b554e44555a 4b554d415349 4b554d41524e @@ -91359,7 +86950,6 @@ 4b5544524f56 4b554452494e 4b554348554d -4b554348454e 4b5531313934 4b5459463832 4b5459463132 @@ -91368,7 +86958,6 @@ 4b544e584252 4b544d4c4334 4b544d323030 -4b544a59424c 4b5449463131 4b54454c3839 4b544359465a @@ -91376,15 +86965,12 @@ 4b5431313033 4b5359554841 4b5359534841 -4b5355534841 4b53524c4c43 4b5351415344 4b53494e4748 4b5349474d41 4b534558594b -4b53454e5941 4b53454e4b41 -4b53454e4941 4b5343425946 4b53414b5341 4b5332303130 @@ -91397,7 +86983,6 @@ 4b52594c4f56 4b52594c4f4e 4b5258544742 -4b5255535459 4b525550554b 4b5255505031 4b52554d4d45 @@ -91409,10 +86994,8 @@ 4b524f535353 4b524f504f54 4b52495a4941 -4b524953544f 4b524953544e 4b5249535431 -4b5249535359 4b5249533936 4b5249533932 4b5249533735 @@ -91477,7 +87060,6 @@ 4b4f534d494b 4b4f534d4153 4b4f53494d4f -4b4f53484b41 4b4f5348494e 4b4f53484945 4b4f53454b31 @@ -91537,7 +87119,6 @@ 4b4f4c554d4e 4b4f4c54454e 4b4f4c535641 -4b4f4c4f5353 4b4f4c4f4d41 4b4f4c4c4945 4b4f4c494e41 @@ -91546,7 +87127,6 @@ 4b4f4c455245 4b4f4c454e4f 4b4f4c454741 -4b4f4c44554e 4b4f4c413232 4b4f4c393939 4b4f4b555241 @@ -91564,7 +87144,6 @@ 4b4f484c4553 4b4f48414c41 4b4f47555245 -4b4f454e4947 4b4f45424131 4b4f45313030 4b4f44454f52 @@ -91588,7 +87167,6 @@ 4b4e55464645 4b4e544b4e54 4b4e4f545453 -4b4e4f504b41 4b4e4f4c4c53 4b4e49544e4f 4b4e49534831 @@ -91644,7 +87222,6 @@ 4b4c41545455 4b4c4154454e 4b4c4153494b -4b4c41415455 4b4c31323334 4b4b56564444 4b4b54474d4f @@ -91695,9 +87272,6 @@ 4b4953554e41 4b4953554c59 4b4953535341 -4b4953534d45 -4b4953534b41 -4b4953534553 4b495353414e 4b4953533735 4b4953533733 @@ -91711,7 +87285,6 @@ 4b4953413233 4b4953413135 4b4953313233 -4b4952535459 4b49524f434b 4b49524d454e 4b49524d414e @@ -91734,16 +87307,13 @@ 4b494f4c3039 4b494e5a4945 4b494e594f53 -4b494e534b49 4b494e4f4b4f 4b494e4f3435 4b494e4e4552 4b494e4b5959 -4b494e4b5931 4b494e4b4f4e 4b494e4b4b55 4b494e4b4945 -4b494e475358 4b494e475350 4b494e475049 4b494e474b41 @@ -91788,7 +87358,6 @@ 4b494d313030 4b494d303030 4b494c554c55 -4b494c524f59 4b494c524b39 4b494c504154 4b494c4f504f @@ -91812,7 +87381,6 @@ 4b494b4b454e 4b494b4b454c 4b494b494c4f -4b494b494b49 4b494b494341 4b494b493939 4b494b493133 @@ -91822,7 +87390,6 @@ 4b49454c4545 4b49454b4945 4b4944533032 -4b49444d414e 4b4944444f4f 4b49434b414e 4b4942424945 @@ -91867,7 +87434,6 @@ 4b45564d4152 4b45564d414e 4b45564b454e -4b4556494e31 4b4556493931 4b4556455453 4b4556363636 @@ -91884,9 +87450,7 @@ 4b4552525953 4b4552525947 4b4552525943 -4b4552524945 4b4552524941 -4b4552524931 4b45524f5049 4b45524d414e 4b45524d3154 @@ -91896,7 +87460,6 @@ 4b4552424945 4b4552414d41 4b45504b4550 -4b454f4b554b 4b454f4b454f 4b454e5a4f4f 4b454e5a4141 @@ -91919,8 +87482,6 @@ 4b454e49544f 4b454e455448 4b454e454b45 -4b454e445241 -4b454e44414c 4b454e414e31 4b454e414441 4b454e393633 @@ -91928,9 +87489,7 @@ 4b454d503030 4b454d424131 4b454d414c4c -4b454c56494e 4b454c544543 -4b454c534945 4b454c534541 4b454c4e4552 4b454c4d4153 @@ -91949,7 +87508,6 @@ 4b4549544844 4b4549544552 4b454954454c -4b4549534841 4b45494b4f48 4b454944454c 4b4548415256 @@ -92028,7 +87586,6 @@ 4b4154543232 4b415453414d 4b4154504f4c -4b41544f4f4d 4b41544f3237 4b41544e4950 4b41544d4149 @@ -92039,7 +87596,6 @@ 4b4154494f4e 4b4154494b41 4b4154494537 -4b4154494131 4b4154493031 4b4154485956 4b415448594b @@ -92067,7 +87623,6 @@ 4b4153544141 4b4153535945 4b4153534f4e -4b4153534945 4b4153534559 4b41534d4952 4b415349454b @@ -92094,19 +87649,16 @@ 4b41524f4c32 4b41524e454c 4b41524e414c -4b41524d454e 4b41524d4144 4b41524c4f56 4b41524c4931 4b41524c4152 4b41524c414e 4b41524c414a -4b41524c4131 4b41524c3639 4b41524c3132 4b4152494e4b 4b4152494d45 -4b4152494d41 4b4152494348 4b4152493032 4b4152493031 @@ -92114,7 +87666,6 @@ 4b4152454e54 4b4152454e4c 4b4152454e35 -4b4152454e31 4b4152454c53 4b4152424f4e 4b4152424954 @@ -92185,7 +87736,6 @@ 4b414c4b554e 4b414c4b414e 4b414c495441 -4b414c494e41 4b414c494d42 4b414c494b31 4b414c494641 @@ -92196,12 +87746,10 @@ 4b414c44554e 4b414c444f52 4b414c43414e -4b414c414e49 4b414c414e44 4b414c414c41 4b414c413132 4b414b554e41 -4b414b545953 4b414b4f3232 4b414b415449 4b414b41524f @@ -92212,7 +87760,6 @@ 4b414a544257 4b414a4f5454 4b4149544c49 -4b4149524154 4b41494f5941 4b41494e4534 4b41494c494e @@ -92221,7 +87768,6 @@ 4b4149444f4b 4b4149314553 4b4148563030 -4b4148554e41 4b41484f4b41 4b4148494e41 4b4147555241 @@ -92263,7 +87809,6 @@ 4b3231393731 4b3154545931 4b3153534d45 -4b314c4c4552 4b3149474854 4b305a36435a 4b304e444558 @@ -92296,7 +87841,6 @@ 4a5556453130 4a5554544131 4a5553544f4e -4a5553544943 4a555354454c 4a5553543239 4a55534f4c4f @@ -92307,13 +87851,11 @@ 4a5550504945 4a5550494e47 4a554e525545 -4a554e50594f 4a554e4f3132 4a554e4e3636 4a554e4b5944 4a554e4b584c 4a554e4b4559 -4a554e4b4552 4a554e4b3639 4a554e4b3131 4a554e4a4f59 @@ -92328,11 +87870,9 @@ 4a554e453530 4a554e453438 4a554e453434 -4a554e453132 4a554e2d3832 4a554e313233 4a554d505931 -4a554d504552 4a554d503334 4a554d503333 4a554d503330 @@ -92347,7 +87887,6 @@ 4a554c593235 4a554c593033 4a554c4b4141 -4a554c495941 4a554c495441 4a554c494548 4a554c494539 @@ -92367,7 +87906,6 @@ 4a554a553831 4a554a553639 4a5549435932 -4a5549434553 4a55474f5341 4a5547474945 4a5545564553 @@ -92377,7 +87915,6 @@ 4a5544593639 4a55444f4341 4a5544474532 -4a5544474531 4a5544473331 4a5544453239 4a5542554c55 @@ -92404,7 +87941,6 @@ 4a5346333136 4a5344455348 4a5343303132 -4a5342414348 4a5339363537 4a5338363734 4a5336323432 @@ -92453,7 +87989,6 @@ 4a5042303030 4a5041474531 4a5041313233 -4a5041313233 4a5038303030 4a5035484637 4a5032333235 @@ -92463,12 +87998,10 @@ 4a5031313836 4a4f5a454631 4a4f594c4545 -4a4f594a4f59 4a4f59455558 4a4f59434945 4a4f59434553 4a4f5943454d -4a4f59434531 4a4f59373034 4a4f56494341 4a4f56414e36 @@ -92525,7 +88058,6 @@ 4a4f4e455a59 4a4f4e455339 4a4f4e455335 -4a4f4e455331 4a4f4e434c4f 4a4f4e424f42 4a4f4e415448 @@ -92551,7 +88083,6 @@ 4a4f4b45524f 4a4f4b455236 4a4f4a4f4d45 -4a4f4a4f4a4f 4a4f4a4f444f 4a4f4a4f3737 4a4f4a4f3632 @@ -92583,7 +88114,6 @@ 4a4f484e3531 4a4f484e3430 4a4f484e3335 -4a4f484e3133 4a4f484e3037 4a4f48415241 4a4f48414e39 @@ -92604,12 +88134,10 @@ 4a4f454d4158 4a4f454d4143 4a4f454c5931 -4a4f454c4c45 4a4f454a494d 4a4f4547554e 4a4f45444f4e 4a4f4542554b -4a4f45424f42 4a4f45424947 4a4f4541524d 4a4f45383838 @@ -92702,7 +88230,6 @@ 4a4a4d4a4a4d 4a4a4c313233 4a4a4a4d4d4d -4a4a4a4a4a4a 4a4a4a4a3536 4a4a494d424f 4a4a45535345 @@ -92722,12 +88249,10 @@ 4a494e574f4f 4a494e53414d 4a494e4d494e -4a494e474c45 4a494e445241 4a494d544944 4a494d4d5958 4a494d4d5957 -4a494d4d5942 4a494d4d4f4e 4a494d4d4559 4a494d4d424f @@ -92756,7 +88281,6 @@ 4a4948414144 4a4947554c49 4a4947475953 -4a4947474c59 4a4947474141 4a4947414c4f 4a4943364b48 @@ -92778,8 +88302,6 @@ 4a48414e4455 4a4830383833 4a4752414345 -4a474a455351 -4a474a455351 4a4744554445 4a4742314744 4a4731393838 @@ -92794,9 +88316,7 @@ 4a4632323230 4a4630313231 4a455a444f47 -4a4557495348 4a4557454c59 -4a4557454c53 4a4557454c35 4a4555583032 4a4554543432 @@ -92806,14 +88326,11 @@ 4a4554533035 4a4554323030 4a4553594b41 -4a4553555353 4a4553555352 4a4553555339 4a4553555338 -4a4553555337 4a4553555336 4a4553555335 -4a4553555333 4a4553555330 4a4553555321 4a4553535953 @@ -92834,8 +88351,6 @@ 4a45524f4e49 4a45524d414e 4a45524c4557 -4a45524b5931 -4a45524b5931 4a45524b3232 4a4552494e45 4a4552494e41 @@ -92876,8 +88391,6 @@ 4a454d4d5931 4a454d494e49 4a454d353535 -4a454c4c4f4f -4a454c4c4f31 4a454c4c4545 4a454c454e45 4a454b534f4e @@ -92967,7 +88480,6 @@ 4a424d534d50 4a424c41434b 4a424a4c4c4c -4a424a424a42 4a424a423939 4a42424f4e44 4a42424a4242 @@ -93005,7 +88517,6 @@ 4a41594d4542 4a41594c4131 4a4159455348 -4a415944454e 4a4159444533 4a4159434945 4a4159424f4f @@ -93022,34 +88533,26 @@ 4a41574f484c 4a4157444154 4a415649544f -4a4156455254 4a4156415249 4a41544c4558 4a4154313934 4a4153504152 4a41534f4e51 -4a41534f4e50 4a41534f4e4f -4a41534f4e32 -4a41534f4e31 4a41534d454e 4a41534c4541 4a415348414e 4a4153434841 4a4153424952 4a4153304e53 -4a4152564953 4a4152525944 4a415252454c -4a4152524544 4a41524e4154 -4a4152455448 4a4152454458 4a4152454452 4a4152454447 4a4152454442 4a4152454433 -4a415244494e 4a415244494d 4a4152415353 4a415155454c @@ -93057,8 +88560,6 @@ 4a4150494e47 4a4150414e53 4a4150415f4e -4a414e554152 -4a414e4e4953 4a414e4e4531 4a414e4e414a 4a414e4c4545 @@ -93078,7 +88579,6 @@ 4a414e453231 4a414e453136 4a414e453031 -4a414e444f53 4a414e44454c 4a414e43554b 4a414e434559 @@ -93099,8 +88599,6 @@ 4a414d494534 4a414d494533 4a414d455441 -4a414d455353 -4a414d455337 4a414d455231 4a414d454e54 4a414d454c41 @@ -93118,9 +88616,7 @@ 4a414c454e32 4a414c414e47 4a414b4f4249 -4a414b4f4231 4a414b4b4b4b -4a414b4a414b 4a414b495441 4a414b494553 4a414b455931 @@ -93143,18 +88639,15 @@ 4a414b453034 4a414b414e45 4a414b414c31 -4a414a414a41 4a414a414441 4a414a41424f 4a4149523939 4a41494d454f 4a41494d454c -4a41494d4531 4a41494c594e 4a41494b454c 4a414944414e 4a41484e4b45 -4a41484e4b45 4a41484d414c 4a41484d4144 4a4148465832 @@ -93162,7 +88655,6 @@ 4a4147553f52 4a4147533133 4a4147475953 -4a4147474552 4a4147474152 4a4147455234 4a4147415448 @@ -93174,7 +88666,6 @@ 4a4146453939 4a41454c4f4e 4a41454c3235 -4a4145474552 4a414544594e 4a4144495241 4a4144455837 @@ -93193,9 +88684,7 @@ 4a41434b4d44 4a41434b4c4f 4a41434b454e -4a41434b454c 4a41434b424f -4a41434b414c 4a41434b3937 4a41434b3836 4a41434b3835 @@ -93211,9 +88700,7 @@ 4a41434b3033 4a41424f4f4f 4a414245524d -4a4142424552 4a4142424241 -4a4142424131 4a4142373135 4a4141524f4e 4a41414a4141 @@ -93265,8 +88752,6 @@ 49564f383634 495645434f31 495641574b41 -4956414e4e41 -4956414e4b41 4956414e3939 4956414e3934 4956414e3737 @@ -93286,7 +88771,6 @@ 495449544954 495449534f4b 495448494e4b -495448414341 495446433035 495444584552 4954434e4a51 @@ -93309,7 +88793,6 @@ 49534c413044 49534b45574c 495348554e47 -495348544152 4953484f5454 4953484f4d45 495348425554 @@ -93340,7 +88823,6 @@ 495249534845 495249533131 4952494e4b4f -4952494e4b41 4952494e4153 4952494e4138 4952494e4136 @@ -93350,14 +88832,12 @@ 495245534f4e 4952454e4532 4952454d4944 -4952454c414e 49524348494b 495242453332 495241545845 4952414e5941 495241313937 495056544542 -495056544542 495053505a55 49504f443132 495049504950 @@ -93372,12 +88852,9 @@ 494e594f5552 494e57415931 494e5649564f -494e56455354 494e56414441 -494e54524f4e 494e544f4e45 494e54455341 -494e54455250 494e54455242 494e54455241 494e54455236 @@ -93401,7 +88878,6 @@ 494e4e413736 494e4e413133 494e4e413131 -494e4c494e45 494e4c415753 494e4b504f54 494e4b455249 @@ -93428,9 +88904,7 @@ 494e44593333 494e44555354 494e44554e41 -494e44495241 494e44494741 -494e44494341 494e44494141 494e44454e54 494e4445474f @@ -93438,7 +88912,6 @@ 494e43554c4f 494e43495341 494e4348494b -494e43484553 494e42454453 494e414d4f52 494e414d3939 @@ -93476,7 +88949,6 @@ 494c4f564537 494c4f564533 494c4f563355 -494c4f4e4b41 494c4d57564d 494c4d313233 494c4b494e31 @@ -93545,19 +89017,16 @@ 494631323232 494552494552 4945474f5641 -494545584543 49445457425a 494452533031 494452495353 49444c4f4255 4944494f5435 4944494f5432 -4944494f5431 4944494f5430 4944494f4f54 4944494e4148 494449414e4f -494445464958 494441564944 4944414c474f 494441494441 @@ -93617,7 +89086,6 @@ 485947493452 4859454e4153 485944524f57 -485941444553 485939353636 485859363847 485855393635 @@ -93629,8 +89097,6 @@ 485641485641 485554454348 485553544544 -4855534b4945 -4855534b4552 485553455949 48555345494e 48555254494e @@ -93644,12 +89110,10 @@ 48554e4c4559 48554e4b4559 48554e475249 -48554e474552 48554e47424d 48554e473455 48554e445552 48554e444152 -48554d4d454c 48554d494e49 48554d414e41 48554d414e32 @@ -93669,19 +89133,16 @@ 4855474f3939 4855474f3139 485547474753 -485547474552 485547344d45 485546544552 485546464552 485545593233 485545593232 -485544534f4e 485544444552 48554444454e 48554444454c 4855434b3132 485542535441 -485542455254 485542434154 48554148494e 485459555459 @@ -93716,7 +89177,6 @@ 484f59415331 484f574d4544 484f574d414e -484f574c4552 484f574c4154 484f5749434b 484f57454545 @@ -93736,7 +89196,6 @@ 484f55524941 484f55523132 484f554e4435 -484f554e4431 484f55424131 484f54594553 484f54545932 @@ -93751,7 +89210,6 @@ 484f54434841 484f54434150 484f54424142 -484f54415353 484f54383838 484f54344954 484f54343836 @@ -93765,7 +89223,6 @@ 484f53455259 484f53454131 484f53453639 -484f52555331 484f52535431 484f52534538 484f52534530 @@ -93790,7 +89247,6 @@ 484f50505953 484f50505932 484f50504c45 -484f50504552 484f504d414e 484f504a4553 484f50484950 @@ -93801,9 +89257,6 @@ 484f50453430 484f50453133 484f50453031 -484f4f564552 -484f4f544945 -484f4f505331 484f4f504459 484f4f4e4552 484f4f4b5335 @@ -93823,10 +89276,7 @@ 484f4e484f4e 484f4e455945 484f4e455934 -484f4e455932 -484f4e455354 484f4e44454e -484f4e444153 484f4e444152 484f4e414d49 484f4d535550 @@ -93834,27 +89284,21 @@ 484f4d494e59 484f4d494533 484f4d455238 -484f4d455231 484f4d45424f 484f4d453230 -484f4d425245 484f4d415244 484f4c544554 484f4c543435 484f4c4d455a 484f4c4d4552 -484f4c4d414e 484f4c4c5952 484f4c4c594d 484f4c4c5947 484f4c4c5939 484f4c4c5936 484f4c4c5934 -484f4c4c4f57 484f4c4c4c59 -484f4c4c4945 484f4c4c4932 -484f4c4c4552 484f4c4c4144 484f4c495553 484f4c455931 @@ -93862,7 +89306,6 @@ 484f4c444954 484f4b4b4549 484f49535453 -484f484e4552 484f484c494b 484f47535353 484f47533132 @@ -93877,16 +89320,13 @@ 484f46464931 484f4646454e 484f444e4554 -484f44474553 484f44444552 484f2d434849 484f43434559 -484f42534f4e 484f424f4553 484f424f3637 484f424f3132 484f42423154 -484f42415254 484f42414731 484f41484f41 484f31323334 @@ -93897,7 +89337,6 @@ 484d50464646 484d4f555345 484d4d524844 -484d4d415049 484d4d313635 484d43503650 484c45525344 @@ -93921,18 +89360,15 @@ 484956413133 484954583032 48495454454e -4849544d454e 4849544d4545 484953534552 48495352414d 484953414f48 4849525a454c -484952534348 484952414d45 484952414d31 484950505931 484950504f4f -484950504f31 484950504931 484950504147 4849504d414e @@ -93968,7 +89404,6 @@ 484944554445 484944454e4e 484944454b4f -48494444454e 484944444535 484944415941 484944415249 @@ -94010,24 +89445,19 @@ 4845574c4554 484557415453 4845545a4552 -484553544552 48455353454c 484552564548 484552564531 484552554b41 484552525547 -484552504553 4845524f3939 4845524f3935 4845524f3637 4845524f3636 4845524f3333 4845524f3133 -4845524d4553 -4845524c4556 4845524b4945 484552443331 -484552425354 484552423432 4845504c4552 48454e564931 @@ -94050,7 +89480,6 @@ 48454d4c4552 48454d493639 48454d484f47 -48454c504552 48454c504131 48454c503031 48454c4d414e @@ -94058,7 +89487,6 @@ 48454c4c4f4c 48454c4c4f4a 48454c4c4f45 -48454c4c4f31 48454c4c494e 48454c4c4553 48454c4c4148 @@ -94107,13 +89535,11 @@ 48454154494e 484541544852 484541544837 -484541544552 484541543939 484541543131 484541525442 484541504544 4845414e4559 -4845414c5448 484541443939 484541443339 484538445258 @@ -94140,22 +89566,16 @@ 484232313536 484231353634 484231323334 -48415a4d4154 48415a494d53 -48415a454c4c 48415a454c32 -48415a415244 484159544f4e 484159455449 484159455333 -48415944454e 484159444545 484159415445 484159414d41 48415754494e 484157534552 -4841574b4552 -4841574b4552 4841574b3732 4841574b3630 4841574b3537 @@ -94172,12 +89592,10 @@ 484155533132 484154594d39 484154554e41 -484154544552 48415454454e 484154533634 4841544f554d 48415445594f -484154455253 484154453636 484154453134 484154434849 @@ -94201,37 +89619,25 @@ 484152564553 484152564152 484152535445 -484152525953 -48415252594f 484152525945 484152525936 484152524f44 484152524148 484152504943 -484152504552 -4841524d4f4e 4841524d4552 -4841524c454d -4841524c454d 4841524b494e 4841524a4954 -48415249424f 484152445553 -484152445550 484152444f31 484152444f30 -484152444552 -484152444552 484152443939 48415244384b 484152443138 484152443132 484152443131 484152443033 -484152424f52 484152414d31 48415050594a -484150505932 4841504d4143 4841504c4f31 48414e544149 @@ -94245,7 +89651,6 @@ 48414e4e4945 48414e4e4531 48414e4e414e -48414e4e4148 48414e4b554b 48414e4b5431 48414e4b4a43 @@ -94264,7 +89669,6 @@ 48414e494131 48414e474954 48414e445953 -48414e445931 48414e445359 48414e445353 48414e445333 @@ -94284,12 +89688,10 @@ 48414d4d4148 48414d4c594e 48414d4c3354 -48414d495348 48414d494c4c 48414d464154 48414d44454e 48414d44414d -48414d425552 48414d424f4e 48414d343536 48414c55484f @@ -94302,8 +89704,6 @@ 48414c4c5558 48414c4c4f30 48414c4c4c4f -48414c4c4945 -48414c4c4945 48414c4c4752 48414c4c4545 48414c4b494e @@ -94332,7 +89732,6 @@ 484148413535 484148413232 484148413131 -484147524944 484147494f53 484147414e45 4841454b4552 @@ -94345,7 +89744,6 @@ 484144413935 484143544f52 4841434b4559 -4841434b4552 4841434b3344 484142533233 4841424f4f42 @@ -94405,7 +89803,6 @@ 475649444153 47555a5a4931 4755594d414e -4755594d414e 4755594c4157 475554485259 475554484958 @@ -94453,7 +89850,6 @@ 475547555331 475547475547 475547474552 -475545535331 475545535330 4755454e4e45 4755434b4945 @@ -94487,8 +89883,6 @@ 475330303737 475255535330 47525550504f -4752554e5431 -4752554d5059 475255455a49 47525542434f 475254475254 @@ -94498,8 +89892,6 @@ 47524f555032 47524f545459 47524f544552 -47524f4f5659 -47524f4d4954 47524f4d494b 47524f494e53 47524f474a32 @@ -94511,12 +89903,9 @@ 47524f42494e 4752495a5a39 475249534c59 -4752494e474f 4752494d4d53 4752494d3133 47524948414e -475249474753 -475249464659 475249424f4b 475245593130 475245545a4b @@ -94526,7 +89915,6 @@ 4752454d4d59 4752454b5553 475245474753 -475245474753 475245474742 475245473937 475245473935 @@ -94534,15 +89922,10 @@ 475245473434 475245455a59 475245454e30 -475245454b53 475245454b4f -475245454b31 -475245454345 -475245444459 475245434f53 475245434f4e 475245415459 -475245415431 475244494f4c 475241595959 475241593232 @@ -94560,7 +89943,6 @@ 4752414e5448 4752414e5442 4752414e4d41 -4752414e4954 4752414e4449 4752414d3031 475241494e59 @@ -94572,11 +89954,9 @@ 475241444531 475241443038 475241443033 -475241434945 475241424259 475241424245 475241324445 -47523846554c 475238383838 47523445454e 475232313639 @@ -94606,7 +89986,6 @@ 474f5452454b 474f54495453 474f5448494b -474f54484943 474f54474f54 474f54455834 474f53544f50 @@ -94627,22 +90006,18 @@ 474f4f544a45 474f4f4f4f4c 474f4f4e494e -474f4f4e4552 474f4f4e4441 474f4f4e3233 474f4f4e3130 474f4f4c4945 474f4f474552 474f4f465933 -474f4f465931 474f4f464949 474f4f444f47 474f4f444c55 474f4f444a4f -474f4f444945 474f4f443939 474f4f443639 -474f4f443455 474f4f443232 474f4f443134 474f4f425932 @@ -94654,9 +90029,7 @@ 474f4e5a494b 474f4e4f5757 474f4e444f4c -474f4e415659 474f4d495941 -474f4d455a31 474f4d455332 474f4d455241 474f4d424f43 @@ -94674,7 +90047,6 @@ 474f4c464956 474f4c463837 474f4c463830 -474f4c463732 474f4c463635 474f4c463535 474f4c463432 @@ -94747,9 +90119,7 @@ 474f44333134 474f44313131 474f44313030 -474f424c5545 474f424c4f4b -474f424c494e 474f42494b45 474f42493333 474f4245494c @@ -94758,8 +90128,6 @@ 474f42414c4c 474f41544553 474f41543733 -474f414c4945 -474f414c4945 474f41474f41 474f34534558 474f34495432 @@ -94773,7 +90141,6 @@ 474e4552414c 474e41524453 474d53543733 -474d4f4e4559 474d4c474d4c 474d4957354e 474d474d474d @@ -94796,7 +90163,6 @@ 474c574e3939 474c55544545 474c50474c50 -474c4f564553 474c4f564153 474c4f425953 474c4f424f58 @@ -94815,7 +90181,6 @@ 474c414e5a31 474c414e4953 474c414d5952 -474c414d5552 474c41495645 474c41444552 474c41434945 @@ -94827,13 +90192,10 @@ 474b464e4d54 474b39544e37 474b33374a38 -474a59584252 474a57414a54 474a52423132 474a50545941 -474a4b425946 474a474a474a -474a474a4446 474a45524445 474a34545645 47495a5a4559 @@ -94878,7 +90240,6 @@ 47494c534f35 47494c524f4e 47494c524159 -47494c4c5931 47494c4c5331 47494c4c4947 47494c4c414d @@ -94924,17 +90285,14 @@ 47484a594259 47484a4b544e 47484a4b4c46 -47484a434e4a 47484a424e4d 47484a353637 474849445241 -474849424c49 47484941324c 474846585a31 4748464b4444 474846444652 474846313233 -47484554544f 474842505344 474842444a4c 474841464c41 @@ -94949,7 +90307,6 @@ 474748483031 474747545454 474747474748 -474747474747 474747473939 474747464646 474747444444 @@ -94963,8 +90320,6 @@ 474659465646 474653485233 4746494e4348 -4746484a4b4d -4746484a4b4d 474648494259 474648474648 47464745435a @@ -94978,7 +90333,6 @@ 474554415353 474554414645 474552543031 -474552525931 47455252494c 474552524144 4745524f4e4f @@ -94992,7 +90346,6 @@ 474552443133 474552434f47 474552434855 -474552414c44 474552413239 474552313233 47454f46464d @@ -95023,19 +90376,14 @@ 47454d434154 47454d425553 47454c504153 -47454c4c4152 47454c47454c 47454c454e41 47454c454553 47454c303046 47454b534149 4745494c4845 -474549474552 -474548524947 -47454845494d 4745464f5243 474546343536 -4745455a4552 474545564553 4745454e3737 474545445542 @@ -95089,7 +90437,6 @@ 474155383941 474154544f52 47415454494e -474154534259 4741544f5234 4741544f3130 474154494e48 @@ -95113,23 +90460,18 @@ 474152563338 474152544859 474152544839 -47415254454e 474152543132 474152525935 474152524557 474152523132 4741524f4c44 4741524e494b -4741524e4552 4741524d4f4e 4741524d4152 4741524c4f57 -4741524c4943 474152474f4e 47415247454c 474152464945 -474152455448 -474152455448 474152444945 474152444941 474152444546 @@ -95177,11 +90519,9 @@ 47414c4c4953 47414c4c414e 47414c4c4148 -47414c494e41 47414c455241 47414c454556 47414c415641 -47414c414e54 47414c414e44 47414b494f33 474149544552 @@ -95197,7 +90537,6 @@ 4741474d4532 474147415348 474147303031 -4741454c4c45 474144534445 4741434b4552 474143484f54 @@ -95246,7 +90585,6 @@ 46594d524635 46594c482e49 46594658584b -46585a5a3735 465853544331 465744414e51 465741503434 @@ -95257,7 +90595,6 @@ 46555a5a5937 46555a5a5934 46555a5a5933 -46555a5a5931 46555a5a3639 465554555233 465554544446 @@ -95265,7 +90602,6 @@ 4655544b4d45 4655525a4552 4655525a454e -465552593636 465552554e4f 46555251414e 4655524e4f4e @@ -95289,7 +90625,6 @@ 46554e474949 46554e474931 46554e474849 -46554e46554e 46554e464954 46554e445553 46554e424f58 @@ -95298,10 +90633,7 @@ 46554e323639 46554d544152 46554d494e4f -46554c544f4e -46554c4c4552 46554c494e47 -46554c48414d 46554b534941 46554b4e5554 46554b4b4954 @@ -95314,15 +90646,11 @@ 4655484f435a 465547415a31 465547413135 -465545525354 4655454c5550 465545385445 465545374830 465544444c59 -4655434b5532 -4655434b5532 4655434b4f4e -4655434b4954 4655434b4559 4655434b4545 4655434b4146 @@ -95335,7 +90663,6 @@ 4655434b3030 465543434d45 465542555555 -465542415231 465541554a42 465539544132 465533303832 @@ -95389,11 +90716,9 @@ 465249544f30 465249544944 465249535449 -465249534b59 465249534b49 465249534b45 465249534b41 -46524953434f 4652494e4b31 4652494d414e 4652494a4f4c @@ -95403,7 +90728,6 @@ 465249444153 4652455a4552 465245594131 -465245554445 465245543132 465245534954 465245534859 @@ -95415,8 +90739,6 @@ 46524545544f 465245455353 465245455253 -465245454d41 -46524545444f 465245453432 465245453242 465245453039 @@ -95441,7 +90763,6 @@ 465245443331 465245443235 465245443037 -465245443032 465245434f4c 465245434b59 465245434b53 @@ -95454,27 +90775,19 @@ 4652415a5a5a 465241545553 465241505045 -4652414e5a49 4652414e5a34 4652414e4e49 4652414e4e41 -4652414e4b59 4652414e4b57 4652414e4b54 -4652414e4b4f 4652414e4b4a -4652414e4b49 4652414e4b48 4652414e4b47 4652414e4b43 -4652414e4b41 4652414e4b35 4652414e4a4f -4652414e4a4f 4652414e4a49 4652414e454b -4652414e4349 -4652414e4341 4652414e4331 4652414c4943 4652414b4c45 @@ -95516,12 +90829,10 @@ 464f54494f53 464f54494e49 464f54494e41 -464f5353494c 464f53534552 464f52574152 464f52554d55 464f52545939 -464f52545932 464f52544558 464f52544545 464f5254414c @@ -95534,7 +90845,6 @@ 464f524c414e 464f524b4552 464f52484552 -464f52474f54 464f52474552 464f52474544 464f52455453 @@ -95561,8 +90871,6 @@ 464f52434537 464f52434533 464f52425544 -464f52424553 -464f52424553 464f52415350 464f4f545931 464f4f544c45 @@ -95581,11 +90889,9 @@ 464f4f443131 464f4f424f4f 464f4f424c45 -464f4e5a4945 464f4e544553 464f4e534543 464f4e474c49 -464f4c4c4f57 464f4c4c4945 464f4c4c4553 464f4c4c4552 @@ -95593,14 +90899,11 @@ 464f4c4b4553 464f494c4544 464f474d414e -464f47484154 464f47444f47 464f46555241 464f4649544f 464f43555337 464f43555332 -464f43555331 -464f43555331 464f43483031 464f424f5353 462e4f2e422e @@ -95624,7 +90927,6 @@ 464c59493047 464c59425945 464c59425259 -464c59424f59 464c59393939 464c59373437 464c555a414f @@ -95646,15 +90948,12 @@ 464c4f524131 464c4f505045 464c4f4f5a59 -464c4f4f4431 464c4f4d4158 464c4f4a4f45 464c4f483536 464c4f41544e 464c4953414e 464c49525431 -464c4950504f -464c49504552 464c49503939 464c494e5449 464c494d424f @@ -95667,7 +90966,6 @@ 464c45584544 464c45583939 464c45555231 -464c45544348 464c45495353 464c45455432 464c45453031 @@ -95681,9 +90979,7 @@ 464c41545459 464c41544f50 464c41534836 -464c41534833 464c414d4d45 -464c414d4553 464c414d4532 464c414b4953 464c41495245 @@ -95707,7 +91003,6 @@ 464b32383439 464b31393939 464a31313030 -464a31313030 46495a4d4154 464958494e47 464958464f58 @@ -95715,7 +91010,6 @@ 464955474749 464954545935 46495446414e -464953544552 46495353454e 4649534b454e 4649534b3237 @@ -95753,13 +91047,11 @@ 464952453138 464952453135 46494f4e4e41 -46494f4e4131 46494e535550 46494e4b4c45 46494e49544f 46494e495441 46494e495354 -46494e455354 46494e455259 46494e454153 46494e444f47 @@ -95767,8 +91059,6 @@ 46494e434f4e 46494e414c4c 46494d414745 -46494c544859 -46494c544552 46494c4f5558 46494c4f5531 46494c4d5331 @@ -95787,7 +91077,6 @@ 46494a493938 46494a493331 46494757414d -464947485431 46494747454e 464947413939 464947303037 @@ -95796,11 +91085,9 @@ 464946544853 464946413132 464946413036 -4649454c4453 464944445931 464944393236 464943555331 -4649434b4552 4649434b454c 464943494e4f 464943485445 @@ -95819,7 +91106,6 @@ 464847425954 464830363035 46474856424e -464748544b4d 464748525459 4647484e4256 4647484a4b4d @@ -95857,18 +91143,13 @@ 464554555331 464554544c45 464554315348 -464553544552 -464553544552 464553534552 464553534545 464552525553 464552524f4e -464552524953 46455252494e -46455252454c 464552524154 4645524d4f59 -4645524d494e 4645524d414e 464552494441 464552474f4f @@ -95882,7 +91163,6 @@ 46454e523153 46454e494353 46454e434532 -46454d4d4553 46454d494e41 46454c49584c 46454c495843 @@ -95940,8 +91220,6 @@ 464234323138 46415a41494c 464159453434 -464156524534 -464156524531 464156494f4c 464156455253 464155535449 @@ -95960,9 +91238,7 @@ 464154455353 464154454d41 464154454556 -464154423059 464154415a5a -464154415353 464154414c53 464154305353 464153545052 @@ -95989,7 +91265,6 @@ 464152534944 46415253414e 464152524154 -464152524148 464152523057 464152515545 4641524f5245 @@ -95997,7 +91272,6 @@ 4641524d424f 4641524d414b 4641524c4f57 -4641524c4559 4641524b4954 464152494e45 464152494153 @@ -96005,7 +91279,6 @@ 464152474f32 464152474c45 464152464945 -464152464152 46415246414e 46415245414c 46415244454e @@ -96032,15 +91305,11 @@ 46414e444552 46414e313233 46414d553935 -46414d494c49 46414d494441 46414d475559 46414d453930 46414c57415a 46414c4f5554 -46414c4c4f4e -46414c4c4f4e -46414c4c454e 46414c4c3232 46414c4c3033 46414c4c3031 @@ -96055,9 +91324,7 @@ 46414b455259 46414b454c41 46414b453232 -464149544853 464149544833 -464149544831 464149544830 46414953414e 46414952555a @@ -96065,7 +91332,6 @@ 464148414432 464147474954 464146485244 -464146414641 464146413132 464144494d45 464144455252 @@ -96083,10 +91349,8 @@ 464142494f5a 464142494f54 464142494f53 -464142494f4c 464142494f37 464142494532 -46414249414e 464142493730 464141534348 464137393533 @@ -96120,14 +91384,11 @@ 455854524135 455854454e44 4558504f5331 -455850455254 45584f524654 455849545553 455849543534 455849543131 455849444f52 -455845544552 -455845544552 455843454c32 45584143544f 455830445553 @@ -96156,7 +91417,6 @@ 4556494c3132 4556494c3131 4556494c3031 -455647454e59 455645534958 45564552534f 455645524c59 @@ -96186,15 +91446,12 @@ 45554c455353 45554c454c45 455547454e59 -455547454e49 -4555464c4651 45545a495352 455459504553 4554594a4557 455454494f4e 455454414e53 455452554954 -455449454e4e 4554484e4943 455448455231 455448414e4d @@ -96221,7 +91478,6 @@ 455354454c45 455354454641 455354454531 -455354454241 455354414641 45535349454e 455353454e53 @@ -96234,20 +91490,17 @@ 4553504e3535 455350494e41 455350455253 -455350414e41 45534d414c4c 4553454e4941 4553454e4345 455344524153 45534355454c -4553434f5254 4553434f4f4c 455343455343 455342353030 4553414c454e 455331303035 455258544742 -455258544742 45525554414e 455254545245 455254494e4f @@ -96298,11 +91551,9 @@ 455249433730 455249433637 455249433633 -455249433330 455249433239 455249433237 455249433236 -455249433132 455249433035 455249433030 455248454144 @@ -96319,7 +91570,6 @@ 455241534531 4552414f5241 4552414c444f -455241474f4e 455241313233 455231323341 455155495045 @@ -96349,15 +91599,12 @@ 454e54455237 454e54455234 454e54355553 -454e52495155 -454e5249434f 454e52494331 454e4f524d41 454e4f504748 454e4f4f4e45 454e4f454e4f 454e4f383031 -454e4b494455 454e4a554b55 454e4a4f5950 454e4a4f4931 @@ -96368,15 +91615,12 @@ 454e47454c34 454e45534841 454e454d5931 -454e454d5931 454e454c5241 454e45494441 454e44555354 454e4452494b 454e44455257 454e44455232 -454e44455231 -454e434f5245 454e43494e41 454e414d454c 454e32445843 @@ -96410,10 +91654,7 @@ 454d494c594e 454d494c5945 454d494c5935 -454d494c494f 454d494c494e -454d494c4945 -454d494c4941 454d49475245 454d45525931 454d434b4945 @@ -96423,13 +91664,11 @@ 454d42414e4b 454d42313230 452d4d41494c -452d4d41494c 454d41454d41 454d38383431 454d3549454d 454d32333237 454c57454c4c -454c57415931 454c56495348 454c554e4943 454c55454c55 @@ -96442,7 +91681,6 @@ 454c53494553 454c53494543 454c5341504f -454c524f4e44 454c5249454c 454c52454e4f 454c5055544f @@ -96454,7 +91692,6 @@ 454c4f564552 454c4f534f31 454c4f524143 -454c4f444945 454c4e4f5241 454c4e454e45 454c4d4f5354 @@ -96465,9 +91702,7 @@ 454c4d455238 454c4c544547 454c4c495335 -454c4c495331 454c4c495053 -454c4c494f54 454c4c494544 454c4c494530 454c4c455254 @@ -96478,8 +91713,6 @@ 454c4c413232 454c4b454c4b 454c4b453639 -454c4b434954 -454c4b434954 454c4b414e4e 454c4b313233 454c49594148 @@ -96500,7 +91733,6 @@ 454c47494e31 454c46584637 454c46524544 -454c4556454e 454c4553494e 454c454e4341 454c454e415a @@ -96515,14 +91747,12 @@ 454c44415231 454c43483939 454c41544553 -454c414d414e 454c414d4144 454c41454c41 454c41444c41 454c36373838 454c31363238 454b544f3632 -454b4d5a5946 454b4c495053 454b49525453 454b494d4f56 @@ -96545,10 +91775,8 @@ 45494c564f52 45494c495348 45494c454d41 -45494c45454e 45494b4e554a 45494b43414a -454947485431 454947485430 45494747414d 454946524a44 @@ -96572,7 +91800,6 @@ 4546494d4b41 454647313233 454646594f55 -4546464f5254 454646494531 454646414345 454645584f52 @@ -96580,7 +91807,6 @@ 454641454641 454636383646 45455a415445 -4545594f5245 454557454542 454554544545 454552494c59 @@ -96596,7 +91822,6 @@ 454459454459 454457494e4e 454455524e45 -454455415244 454455393131 454455323031 454454313339 @@ -96607,7 +91832,6 @@ 45444f474731 45444f444f45 45444f313233 -45444d4f4e44 45444c524543 454449544853 454449544841 @@ -96621,7 +91845,6 @@ 454446474446 4544454e4849 4544454e3639 -454444494553 45444449454c 454444494537 454444444945 @@ -96684,9 +91907,7 @@ 45415359494e 454153593232 454153545354 -454153544552 454153543737 -454152544831 4541524c4c59 4541524c3639 4541524c3131 @@ -96697,7 +91918,6 @@ 45414e494c4f 45414c524455 4541474c454e -4541474c4549 454146454146 4541444c4552 454143485553 @@ -96722,7 +91942,6 @@ 44594c414e47 44594c414e38 44594c414e33 -44594c414e32 4459444c4531 445941564f4c 445941445941 @@ -96731,13 +91950,11 @@ 445855343537 44585358554f 44584e4e5844 -445844584458 445753574142 4457534d444a 44574f52414b 44574f523339 44574c44574c -445749474854 445746465234 445745454b53 445745454245 @@ -96745,7 +91962,6 @@ 445741594e4f 445741534831 4457414e474f -445741494e45 445741445741 445736393639 445734363637 @@ -96753,9 +91969,7 @@ 445656445656 44564d353137 445641445641 -445641444552 44563643594e -445556414c4c 4455544f5641 445554434853 445554434832 @@ -96763,7 +91977,6 @@ 44555354594e 445553545942 445553545937 -445553545931 445553544931 445553544545 445553484b55 @@ -96784,7 +91997,6 @@ 44554e4e5939 44554e4e4553 44554e4e3231 -44554e4c4f50 44554e4c4f45 44554e4b3232 44554e483232 @@ -96817,9 +92029,7 @@ 4455494b4552 445549303037 445547555353 -44554747414e 44554747414c -445546465931 445545533133 4455454c4c31 445544554c45 @@ -96840,9 +92050,7 @@ 4455434b5936 4455434b5932 4455434b5332 -4455434b5331 4455434b4f31 -4455434b4945 4455434b434f 4455434b3535 4455434b3434 @@ -96920,13 +92128,11 @@ 44524f4d494f 44524f494453 44524f47454e -44524f474241 44524f465542 44524f44524f 44524d41524b 44524956494e 445249564536 -445249564531 445249545a5a 445249535341 4452494e4441 @@ -96953,7 +92159,6 @@ 445245414d34 445245414449 445245414444 -4452444f4f4d 445244313233 4452434f4f4c 445243313233 @@ -96962,7 +92167,6 @@ 445241594b45 445241593132 445241573737 -445241504552 4452414e4552 4452414d4138 4452414b4f31 @@ -96970,7 +92174,6 @@ 4452414b4559 4452414b454c 4452414b4544 -4452414b4531 44524147594e 445241474f5a 445241474f39 @@ -96978,12 +92181,10 @@ 445241474f34 445241474759 445241474552 -44524147414e 445241473630 445241434f52 445241434f37 445241434950 -445241434845 44524143434f 445241433639 445241433031 @@ -97019,9 +92220,7 @@ 444f55473234 444f55473031 444f55425453 -444f55424c45 444f54544f52 -444f54544945 444f54543031 444f54484953 444f54413131 @@ -97059,7 +92258,6 @@ 444f4f4d3233 444f4f4d3131 444f4f474559 -444f4f444c45 444f4f444131 444f4f424159 444f4f313831 @@ -97089,9 +92287,7 @@ 444f4e414952 444f4e333139 444f4e313036 -444f4d494e49 444f4d494e45 -444f4d494e41 444f4d453232 444f4d453031 444f4d333231 @@ -97104,7 +92300,6 @@ 444f4c4c5959 444f4c4c5947 444f4c4c5932 -444f4c4c5931 444f4c4c4953 444f4c494345 444f4c474948 @@ -97125,15 +92320,12 @@ 444f47524544 444f47524154 444f47504157 -444f474d414e 444f474d4141 444f474d4137 -444f474d4131 444f47475947 444f47475936 444f47474f4e 444f47474559 -444f47474552 444f47473235 444f47473133 444f47455254 @@ -97145,7 +92337,6 @@ 444f47343434 444f47323139 444f47313838 -444f47313233 444f47303037 444f45525445 444f4552494e @@ -97179,7 +92370,6 @@ 444f42494553 444f4245444f 444f4245434b -444f42424552 444f41424c45 444f33333541 444f30304945 @@ -97260,11 +92450,9 @@ 44495a33414b 444958593639 444958584945 -4449584f4e31 444958494542 444958494536 444956594141 -444956494e47 444956455354 444956455238 444956455234 @@ -97281,18 +92469,14 @@ 444952545942 444952545937 444952545932 -444952545931 444952543132 4449524c5353 4449524b3639 -444952454354 444950574144 444950555453 444950495459 444950494b41 44494f554c41 -44494f4e4e45 -44494f4e4e45 44494f474945 44494f44494f 44494f444532 @@ -97308,7 +92492,6 @@ 44494e464f53 44494e454c49 44494e444545 -44494e415241 44494e415231 44494e414d49 44494e35474f @@ -97364,13 +92547,11 @@ 444947425959 44494741524f 444946454e44 -4449455a454c 444945564153 444945474f52 444945474f48 444945474f39 444945474f36 -444945474f31 444945415353 444945344d45 4449444c4559 @@ -97385,9 +92566,7 @@ 4449434b534f 4449434b5332 4449434b4d41 -4449434b4559 4449434b4545 -4449434b3639 4449434b3231 4449434b3137 4449434b3032 @@ -97395,8 +92574,6 @@ 444942524f4d 444942424553 4449415a3639 -4449414e4e45 -4449414e4e45 4449414e4533 4449414e4532 4449414e414b @@ -97412,7 +92589,6 @@ 44484f524e45 44484953554d 444846483535 -444841524d41 4448414e4441 4448414d4d41 4448414c4c53 @@ -97435,13 +92611,11 @@ 444659545852 4446594c464b 444659474243 -444656474248 444655595448 444654595546 444653464453 444653414446 444652303739 -44464b544846 44464a353838 44464833354a 444647435642 @@ -97449,7 +92623,6 @@ 444645444645 444644464443 4446435a3131 -4446434d5246 444643425946 44464153585a 444635564652 @@ -97473,7 +92646,6 @@ 444556524131 444556504143 4445564f4e54 -4445564f4e54 4445564f3739 4445564c594e 4445564c414e @@ -97489,22 +92661,18 @@ 444556494c39 444556494c32 444556494c30 -444556494345 44455649414e 444556455241 444556454e31 444555545343 -444555534558 4445554e414e 444555434544 -444555434531 444554544552 444554534144 444554455354 444554455253 444554455231 444554454e54 -444554454354 444554343132 444554323035 444553544552 @@ -97539,7 +92707,6 @@ 444552454b4c 444552454b4b 444552454b35 -444552454b31 444552454b30 44455245434b 44455155494e @@ -97552,10 +92719,7 @@ 44454f4e4f49 44454f4e3131 44454f4c4953 -44454e5a454c -44454e574552 44454e564952 -44454e544f4e 44454e544953 44454e544544 44454e4f5453 @@ -97574,7 +92738,6 @@ 44454e415244 44454e413132 44454e333333 -44454e313233 44454e303037 44454d555241 44454d505345 @@ -97595,8 +92758,6 @@ 44454c555832 44454c544145 44454c544144 -44454c544139 -44454c544136 44454c534559 44454c525553 44454c4f5245 @@ -97613,7 +92774,6 @@ 44454c494748 44454c494153 44454c493939 -44454c46494e 44454c454e41 44454c454d45 44454c44454c @@ -97660,7 +92820,6 @@ 444545324131 444544534554 444544454545 -444544454445 444544453435 444544363636 444544353134 @@ -97675,7 +92834,6 @@ 444543333739 444542544f52 4445424f5353 -4445424f5241 444542495355 444542455254 44454244454e @@ -97777,7 +92935,6 @@ 444159424f59 444159313131 444158414b41 -444157534f4e 4441574f4c46 4441574e4559 4441574e3938 @@ -97788,7 +92945,6 @@ 4441574e3035 4441574e3032 444157475931 -444157475331 444157474954 44415747414e 444157473535 @@ -97803,12 +92959,7 @@ 444156495333 444156495332 444156494e45 -444156494e41 -444156494553 444156494543 -444156494452 -444156494444 -444156494437 444156493838 44415648414d 444156455943 @@ -97849,7 +93000,6 @@ 444154383838 44415353454e 444153495354 -444153484b41 44415348414c 444153484137 444153483132 @@ -97865,7 +93015,6 @@ 444152543733 444152534f4e 44415252594e -44415252594c 44415252414e 4441524e4544 4441524d4552 @@ -97879,7 +93028,6 @@ 4441524b4c59 4441524b4b4b 4441524b4559 -4441524b4552 4441524b454c 4441524b3434 4441524b3335 @@ -97891,15 +93039,12 @@ 4441524b3039 444152494e4f 444152494e44 -444152494e41 44415249454c -44415249414e 44415249414d 444152454e41 444152435935 444152434845 444152434841 -444152425931 444152313039 4441504f5045 444150495351 @@ -97921,7 +93066,6 @@ 44414e4e5952 44414e4e594f 44414e4e494b -44414e4e4949 44414e4e4941 44414e4d4f52 44414e4c4131 @@ -97934,9 +93078,7 @@ 44414e495241 44414e494e4f 44414e494e41 -44414e494c4f 44414e494c32 -44414e49494c 44414e494345 44414e493332 44414e493237 @@ -97950,7 +93092,6 @@ 44414e445936 44414e445933 44414e445932 -44414e445931 44414e445550 44414e44454c 44414e444431 @@ -97964,7 +93105,6 @@ 44414e414c53 44414e414c49 44414e41414e -44414e413639 44414e413432 44414e413233 44414e333333 @@ -97972,9 +93112,7 @@ 44414d50454e 44414d4f4e37 44414d4f3232 -44414d4e4954 44414d4d414e -44414d494f4e 44414d41534f 44414d415241 44414d414e53 @@ -98005,7 +93143,6 @@ 444149535942 444149535939 444149535938 -444149535932 444149535359 4441494e4552 444149474c45 @@ -98016,7 +93153,6 @@ 4441474e5932 4441474e5931 444147474841 -444147474552 444147474152 444147414441 44414655434b @@ -98028,14 +93164,11 @@ 4441444f444f 4441444d414e 444144484144 -444144445953 -44414444594f 44414444594d 444144445947 444144445939 444144445936 444144445934 -444144445931 444144445832 444144444459 444144415645 @@ -98043,10 +93176,8 @@ 444144415241 44414441454c 44414441444f -444144414441 444144413232 444144413131 -4441434b454c 444143495254 444143454e54 44414252494b @@ -98092,7 +93223,6 @@ 435952494c53 435952494c45 435952494c31 -435950525553 43594f554e47 43594f423132 43594e444953 @@ -98150,7 +93280,6 @@ 435552525953 4355524c5951 4355524c5935 -4355524c5931 435552494f55 43555052554d 435550504153 @@ -98171,7 +93300,6 @@ 43554d494e53 43554d343230 43554d323232 -43554d313233 43554c545553 43554c4f5353 43554c4f4e45 @@ -98192,7 +93320,6 @@ 435543555441 435543554a4f 4355434f434f -435543494e41 435543434941 435542533939 435542533938 @@ -98206,7 +93333,6 @@ 435542425933 435542425932 435542424552 -435542414e4f 435542413938 435542313233 435458435458 @@ -98253,7 +93379,6 @@ 435255534853 4352554e5453 4352554e4b31 -4352554e4348 4352554d5053 435255453133 435252435252 @@ -98279,7 +93404,6 @@ 43524c434e32 43524c42544e 435249544348 -43524953544f 435249535331 435249535053 435249535049 @@ -98288,7 +93412,6 @@ 435249504553 4352494d424f 4352494c4c45 -4352494b4554 43524659425a 435246524559 43524558462e @@ -98303,25 +93426,21 @@ 4352454c4c41 435245454c53 435245454444 -435245444954 43524541544f 435245414d4f 435245414d32 -435245414d31 435243435243 43524247524c 435242313233 4352415a5954 4352415a594b 4352415a5936 -4352415a5931 4352415a5930 4352415a3132 435241544f52 43524150554c 435241503639 435241503230 -4352414e4b31 4352414e4539 4352414e4532 4352414d3939 @@ -98363,20 +93482,15 @@ 434f57454e53 434f57454c4c 434f57434154 -434f57424f59 434f57424f49 434f57424152 -434f56494e41 434f56455331 434f555a494e 434f55544545 -434f55525345 434f55524745 434f55524359 -434f55504c45 434f55504552 434f554e5433 -434f55474552 434f55434831 434f544f4e45 434f5444414d @@ -98398,14 +93512,12 @@ 434f52524543 434f524f4c41 434f524e4958 -434f524e4552 434f524c3335 434f524b5932 434f5246494e 434f52455957 434f52455952 434f52455934 -434f52455931 434f52454e45 434f52454c4c 434f52453639 @@ -98439,7 +93551,6 @@ 434f4f424f4f 434f4f424945 434f4f38454e -434f4e545241 434f4e544f52 434f4e544f35 434f4e544953 @@ -98453,10 +93564,8 @@ 434f4e4e5553 434f4e4c4157 434f4e474f36 -434f4e464947 434f4e464552 434f4e453431 -434f4e444f52 434f4e444f47 434f4e444f39 434f4e434849 @@ -98490,7 +93599,6 @@ 434f4d41524f 434f4c55444f 434f4c545332 -434f4c4f5253 434f4c4f5241 434f4c4f4e41 434f4c4f3938 @@ -98547,15 +93655,12 @@ 434f434f4e4f 434f434f4d41 434f434f4132 -434f434b5331 434f434b4945 434f434b3455 434f434b3234 434f434b3031 434f4348414c 434f43414e45 -434f42524153 -434f42524135 434f42524130 434f424f4c33 434f42494153 @@ -98566,9 +93671,7 @@ 434f414c4945 434f414c3232 434f414c3131 -434f41434831 434f32303037 -434e54474659 434e4f544534 434e4e353535 434e4d4c4d4e @@ -98601,18 +93704,15 @@ 434c52534352 434c52313233 434c4f574e59 -434c4f574e53 434c4f574e4e 434c4f574e32 434c4f574d4e -434c4f564953 434c4f545445 434c4f534553 434c4f534531 434c4f503136 434c4f4e4558 434c4f4e4544 -434c4f434b31 434c4b424f42 434c49585858 434c49564941 @@ -98620,10 +93720,7 @@ 434c49505053 434c49505045 434c494f4154 -434c494e5431 434c494e4b31 -434c494d4158 -434c49464659 434c4946464c 434c49464642 434c45574552 @@ -98643,7 +93740,6 @@ 434c41564953 434c41564531 434c41555331 -434c41535359 434c41534837 434c41525252 434c41524b49 @@ -98677,7 +93773,6 @@ 434a31303538 434956494337 434956494333 -434956494331 434954593130 434954593031 43495454454e @@ -98691,7 +93786,6 @@ 434953534945 434953434953 434952444543 -434952435553 43494f545841 43494f544154 43494f434941 @@ -98700,13 +93794,11 @@ 43494e544552 43494e445959 43494e445957 -43494e445954 43494e44594b 43494e44594a 43494e445935 43494e445934 43494e444945 -43494e444552 43494c4c4552 43494b4c4f4e 434947494b45 @@ -98741,12 +93833,10 @@ 434855434b38 434855434b37 434855434b33 -434855424259 434855424231 434852495a5a 43485249535a 434852495355 -434852495341 434852495334 43484f5a454e 43484f575a59 @@ -98756,7 +93846,6 @@ 43484f505241 43484f50454e 43484f4f4b53 -43484f4f4348 43484f4f4259 43484f4e4b59 43484f4e4753 @@ -98778,10 +93867,8 @@ 43484c4f4538 43484c4e4752 43484c415354 -43484b44534b 4348495a5a4f 4348495a5a41 -434849564153 434849544f57 434849544149 434849534549 @@ -98790,7 +93877,6 @@ 434849524f50 43484952414c 434849505858 -434849505059 434849504b41 43484950494b 434849504845 @@ -98809,7 +93895,6 @@ 4348494e4139 4348494e4137 4348494e4136 -4348494e4131 4348494d4d59 4348494d4953 4348494d424f @@ -98825,33 +93910,25 @@ 434849454639 434849454637 434849454635 -434849454631 434849444f52 434849444f47 434849444945 434849434f34 -434849434f31 -434849434b53 434849434b33 434849434859 434849434855 434849424953 -434849415241 434849323735 434849313233 434847555352 434845575935 -434845574945 -434845574945 434845574259 434845565937 -434845565932 43484556524f 434845563930 434845545441 434845535349 434845535334 -434845535331 434845534b41 434845534544 434845524f4b @@ -98861,7 +93938,6 @@ 434845523939 4348454e494e 4348454d494e -4348454c4c45 4348454c414e 4348454c4131 43484549544f @@ -98881,7 +93957,6 @@ 434845434b59 434845434b4d 434845434b41 -434845434b36 434845415448 43484541504f 434845313233 @@ -98910,13 +93985,11 @@ 434841525441 434841524d59 434841524d41 -434841524c59 434841524545 43484152414e 434841523939 434841523132 434841523032 -4348414f5353 4348414f5339 4348414f5336 4348414f5333 @@ -98924,7 +93997,6 @@ 4348414e5355 4348414e4a4b 4348414e4941 -4348414e4745 4348414e4730 4348414e4452 4348414e4341 @@ -98941,14 +94013,12 @@ 4348414b4153 4348414b414c 434841495455 -434841495231 434841493138 434841474152 43484147414c 434841464645 434841444f4f 434841444841 -434841444459 434841444444 434841443231 434841443135 @@ -98992,7 +94062,6 @@ 434554454348 434553454e41 434553415253 -434553415245 434553415233 434552543139 4345524f4f4f @@ -99021,15 +94090,12 @@ 434545534945 434545504545 4345454c5556 -434544524943 434544415242 434544313239 434543434f4e 434542554c41 -434541534152 434541524131 434459455231 -4344544e4252 434453545054 43442d524f4d 434452455353 @@ -99063,7 +94129,6 @@ 4343454d5145 4343435a4152 434343444444 -434343434343 434342424141 434336353133 434336353030 @@ -99099,14 +94164,11 @@ 43415a5a4f53 43415a5a4945 4341594f5445 -4341594d414e 4341594c4131 4341565a3234 4341564f5552 434156454d41 434154545353 -434154544c45 -434154544c45 43415454454e 43415453554e 434154534541 @@ -99127,7 +94189,6 @@ 434154455253 434154455232 434154454152 -434154444f47 434154424f42 434154424947 434154424154 @@ -99141,11 +94202,8 @@ 434154323030 434154313939 434154313331 -434154313233 434154313030 -43415354524f 434153544553 -43415354454c 43415354414e 434153503352 4341534f5454 @@ -99155,7 +94213,6 @@ 434153484f4e 434153484d4f 434153484954 -434153484557 434153483455 434153483330 434153455952 @@ -99170,17 +94227,13 @@ 434153413131 434152594e31 434152574153 -434152564552 43415256454e 43415256454c 434152544859 434152534953 434152524f5a 434152524f57 -434152524f54 -434152524f4c 434152524953 -434152524945 434152524943 434152524554 434152504945 @@ -99188,7 +94241,6 @@ 4341524f4c5a 4341524f4c48 4341524f4c43 -4341524f4c41 4341524f4c39 4341524f4c33 4341524f4c32 @@ -99198,8 +94250,6 @@ 4341524e4552 4341524e4143 4341524d4945 -4341524d414e -4341524d414e 4341524d414c 4341524d4144 4341524d4143 @@ -99217,7 +94267,6 @@ 4341524c3053 4341524b4152 434152495341 -434152494e41 434152494231 434152454e31 434152454c31 @@ -99225,30 +94274,24 @@ 434152443333 434152443132 434152443031 -434152434152 -434152424f4e 434152415a4f 434152413639 434152413132 434152413031 434152343839 434152333231 -434152313233 434150544f52 43415054494e 434150524953 434150524932 434150504544 43415050335a -4341504f4e45 43415049544f 434150453132 -434150434f4d 434150434150 434150415041 43414e564559 43414e555341 -43414e544f4e 43414e54494e 43414e54444f 43414e544142 @@ -99263,47 +94306,32 @@ 43414e4b414c 43414e495350 43414e494f4e -43414e454c41 43414e445958 -43414e445953 43414e44594d 43414e445941 43414e445939 43414e444941 -43414e43554e 43414e43494f 43414e434841 43414e434152 43414e415641 -43414e415259 43414e414c45 -43414e414249 43414e313233 43414d555339 43414d534558 -43414d52594e -43414d504552 43414d504245 43414d504147 43414d4d4143 43414d4c494e 43414d4a4143 -43414d494c4c 43414d494b45 43414d474942 43414d455259 -43414d455241 -43414d455241 -43414d454c53 -43414d454c53 43414d454c45 43414d454c37 -43414d44454e 43414d425241 43414d424954 43414d415259 -43414d415241 -43414d415241 43414d393939 43414d313131 43414c593238 @@ -99314,8 +94342,6 @@ 43414c4d4152 43414c4c4941 43414c4c4553 -43414c4c4552 -43414c4c4552 43414c4c4545 43414c4c4531 43414c4c3639 @@ -99324,7 +94350,6 @@ 43414c495854 43414c494e4f 43414c494630 -43414c49434f 43414c494345 43414c493232 43414c493133 @@ -99346,7 +94371,6 @@ 4341494c594e 4341494c4f4e 4341484f5253 -434148494c4c 434148415941 434147524f4d 434147414e47 @@ -99355,7 +94379,6 @@ 434146455353 434146453132 434145554c4c -434145534552 4341454d4e41 434144535453 4341444f5454 @@ -99374,10 +94397,8 @@ 434143413939 434143413737 434143313233 -434142524f4e 434142524552 4341424c4534 -4341424c4531 434142494e41 434142454341 434142434142 @@ -99406,7 +94427,6 @@ 433134313656 433133343539 433132333452 -433132333435 43313139494e 433052304e41 433050504552 @@ -99421,7 +94441,6 @@ 425954434341 4259524f4e54 4259524f4e39 -4259524f4e31 425952444945 425952414d31 425947414741 @@ -99430,10 +94449,8 @@ 425643393837 425637383233 42555a5a5953 -42555a5a5931 42555a5a4c45 42555a5a494e -42555a5a4552 42555a5a3233 42555a415244 4255584f4d31 @@ -99445,20 +94462,17 @@ 425554544544 425554543535 425554534558 -4255544b5553 425554494b49 42555443484f 425554434821 425554424f59 425553594245 425553545953 -425553545931 425553544f50 425553544153 425553544131 42555353554d 425553534f4c -425553534553 4255534f4c41 4255534b4559 425553485931 @@ -99500,8 +94514,6 @@ 42554e4e4e59 42554e4b5959 42554e4b5932 -42554e4b4552 -42554e4b4552 42554e4a4545 42554e474954 42554e474531 @@ -99510,13 +94522,11 @@ 42554d524150 42554d505953 42554d505553 -42554d4d4552 42554d4d414d 42554d4c4547 42554d455231 42554d424552 42554c534854 -42554c4f5641 42554c4d414e 42554c4c4945 42554c4c3332 @@ -99552,28 +94562,23 @@ 425544533234 4255444f4e45 4255444d454e -4255444d414e 4255444b4f56 425544484141 42554445454b 425544445954 42554444594a 425544445946 -425544445932 425544445353 425544444c59 425544444559 425544444552 425544444545 -425544444148 425544444141 425544414831 425544324d45 425543533032 4255434b5944 4255434b5935 -4255434b5931 -4255434b5331 4255434b4f53 4255434b454c 4255434b3939 @@ -99598,7 +94603,6 @@ 425542494b41 425542424f5a 42554242415a -425542424132 425542424130 425542423031 425541554a42 @@ -99629,7 +94633,6 @@ 42525944454e 425259434538 425259414e57 -425259414e54 425259414e4f 425259414e47 425259414e42 @@ -99645,8 +94648,6 @@ 4252554a4f53 4252554a4153 425255494e35 -425255434945 -425255434552 42525543454c 425255434548 425255434547 @@ -99657,16 +94658,13 @@ 425250303732 42524f574e52 42524f574e4c -42524f574e45 42524f574e43 42524f574e37 42524f574e34 42524f4f5345 42524f4f4348 42524f4e5941 -42524f4e5445 42524f4e3635 -42524f4b4552 42524f4a414e 42524f474559 42524f474552 @@ -99680,8 +94678,6 @@ 42524e444f47 42524b534854 42524956494f -425249545441 -425249545441 425249545432 425249544d45 425249544348 @@ -99691,20 +94687,13 @@ 4252494e4753 4252494e434f 4252494a454e -425249474954 425249474759 425249474144 425249444559 -425249434b53 -425249434b53 425249434b38 425249434b33 -425249434b31 -425249425249 425249424f4e 425249415259 -425249414e4e -425249414e41 425249414e36 425249414e33 42524937414e @@ -99718,7 +94707,6 @@ 425245545459 425245545444 425245545433 -425245545431 4252454e5447 4252454e5441 4252454e5438 @@ -99733,16 +94721,12 @@ 425245454348 425245444f57 425245434b31 -425245414b53 425245414b45 425245334441 425245313233 -425241564f53 425241564f34 -425241564f31 425241564941 425241564535 -425241555345 425241554552 425241545a45 425241545a31 @@ -99750,29 +94734,20 @@ 425241544f4b 425241544953 425241543130 -425241535359 -425241535331 4252414e4e31 -4252414e4445 -4252414e4431 -4252414e4348 4252414d4d59 4252414d4553 4252414d424c 4252414d3939 4252414d3132 425241494e58 -425241494e31 42524149414e 425241445953 425241445939 425241445938 425241445933 -425241444c45 -42524144454e 425241444444 425241443830 -425241443639 425241443434 425241443236 425241443135 @@ -99782,14 +94757,12 @@ 42524143454e 425241434544 425241434531 -425241425553 425241414445 425241364459 425241354459 425241313233 425236363636 425235343941 -425235343939 425235343936 425235333439 425231414e41 @@ -99809,7 +94782,6 @@ 424f5a4f3636 424f5a453638 424f5a373134 -424f59544f59 424f594f4e47 424f594c4535 424f59464154 @@ -99823,8 +94795,6 @@ 424f58455232 424f58414c4c 424f58313732 -424f57574f57 -424f57534552 424f5752494e 424f574f4f44 424f57455334 @@ -99836,10 +94806,7 @@ 424f554e4431 424f554b4a45 424f5544594e -424f55424f55 424f55424153 -424f54544f4d -424f54544c45 424f544f3947 424f544d414e 424f54454348 @@ -99851,17 +94818,14 @@ 424f5354494e 424f53534552 424f53533730 -424f53533639 424f53533535 424f53533434 424f53533335 424f53533330 424f53533139 -424f53515545 424f53485241 424f53484552 424f53434f58 -424f53434f45 424f53434f34 424f53434f21 424f53424f53 @@ -99878,7 +94842,6 @@ 424f52495358 424f52495334 424f5247494f -424f52474553 424f52473739 424f52473737 424f52473137 @@ -99894,8 +94857,6 @@ 424f4f59414b 424f4f545959 424f4f545933 -424f4f545931 -424f4f545331 424f4f544853 424f4f544553 424f4f544545 @@ -99917,8 +94878,6 @@ 424f4f4c4f4f 424f4f4c4553 424f4f4c4545 -424f4f4b5331 -424f4f4b4552 424f4f4b3234 424f4f4b3232 424f4f475359 @@ -99937,13 +94896,11 @@ 424f4e5a4949 424f4e5a4945 424f4e555353 -424f4e534149 424f4e4f4e4f 424f4e4e5932 424f4e4e4553 424f4e4e3939 424f4e4b4559 -424f4e495441 424f4e494e47 424f4e494341 424f4e484555 @@ -99973,13 +94930,10 @@ 424f4d4f4e4b 424f4d425552 424f4d424559 -424f4d424552 424f4d424544 -424f4d424159 424f4d424141 424f4d423131 424f4c564553 -424f4c544f4e 424f4c4f4e47 424f4c4f3636 424f4c4c4531 @@ -99996,9 +94950,7 @@ 424f4a414e47 424f494e4b31 424f494e4759 -424f494e474f 424f494e4737 -424f494c4552 424f48414241 424f47494534 424f47474953 @@ -100008,7 +94960,6 @@ 424f47454d41 424f47444f47 424f47424f47 -424f47415254 424f47414e53 424f45533030 424f45524e49 @@ -100016,12 +94967,10 @@ 424f454b4f45 424f45464a45 424f45464945 -424f45444552 424f44554b45 424f444f5155 424f444f3636 424f444d414e -424f44494e45 424f44494532 424f44465241 424f44454553 @@ -100029,7 +94978,6 @@ 424f44414e45 424f43555345 424f434b3031 -424f4348554d 424f43455441 424f43414a52 424f43414a4a @@ -100063,15 +95011,11 @@ 424f42424953 424f42424943 424f42424553 -424f42424242 424f42415353 424f42383038 424f42313536 -424f42313233 -424f42313233 424f42313032 424f41545332 -424f41545331 424f4154474b 424f41543231 424f41524445 @@ -100092,9 +95036,7 @@ 424d57434341 424d57373238 424d57363530 -424d57353235 424d57333434 -424d57333230 424d57323030 424d56373737 424d53473737 @@ -100119,7 +95061,6 @@ 424c554d4531 424c5547554d 424c55455945 -424c55455353 424c55455335 424c55454f58 424c55454841 @@ -100130,15 +95071,11 @@ 424c55453652 424c55453637 424c55453632 -424c55453535 424c55453534 424c55453455 424c55453339 424c55453336 424c55453331 -424c55453234 -424c55453233 -424c55453131 424c55434b59 424c55424f59 424c55344541 @@ -100147,18 +95084,14 @@ 424c4f573033 424c4f535335 424c4f4f5a45 -424c4f4f4453 424c4f4f4434 424c4f4f4433 424c4f4f4432 -424c4f4f4431 424c4f4e444f -424c4f4e4449 424c4f4e4444 424c4f4d4532 424c4f4d3131 424c4f4b4559 -424c4f434b31 424c4f424242 424c4f423939 424c4e445938 @@ -100193,23 +95126,18 @@ 424c415a4545 424c41535441 424c41535433 -424c41535431 424c41534545 -424c414e4341 424c414e4148 424c414b4945 424c414b4542 424c41495245 424c41495244 -424c41495231 424c41484c41 424c41483639 424c41483333 -424c4144455a 424c4144454e 424c41444539 424c41444536 -424c41444531 424c41434b58 424c41434b54 424c41434b4d @@ -100224,7 +95152,6 @@ 424b55454c46 424b55425741 424b51545a41 -424b51545a41 424b4f534152 424b4d5a3132 424b4d594648 @@ -100244,7 +95171,6 @@ 424a4b424a4b 424a424a4d57 424a41534f4e -424a41524e45 424a41524b45 424a414d4553 424a32303230 @@ -100264,7 +95190,6 @@ 4249544e4554 4249544d4150 424954494e47 -424954454d45 424954434847 424954434836 424954434835 @@ -100293,7 +95218,6 @@ 424952443737 424952443535 424952443434 -424952443333 424952443230 424952443039 424952434859 @@ -100307,7 +95231,6 @@ 42494e4b5959 42494e495441 42494e483132 -42494e474f4f 42494e473639 42494e473233 42494e473133 @@ -100325,15 +95248,12 @@ 42494c4f5554 42494c4e4a37 42494c4c595a -42494c4c5953 42494c4c5950 42494c4c594f 42494c4c594a -42494c4c5938 42494c4c5930 42494c4c554d 42494c4c5332 -42494c4c5331 42494c4c4953 42494c4c4559 42494c4c454e @@ -100348,28 +95268,23 @@ 42494c49544f 42494c444144 42494c424f4f -42494c424f42 42494c424f33 42494c415241 42494b4f5641 42494b4b4552 42494b493549 42494b455331 -42494b455253 -42494b455231 42494b453938 42494b453535 424949544348 42494757495a 424947544947 424947543430 -424947534947 424947534259 424947524159 42494752414d 424947505550 4249474f534f -4249474f4e45 4249474f4445 4249474f414b 4249474e4f42 @@ -100377,24 +95292,19 @@ 4249474e4544 4249474d4952 4249474d414d -4249474d4143 4249474d4142 4249474c4f54 4249474c4f47 4249474c4553 4249474b415a -4249474a4159 4249474a4158 4249474a4150 424947494e43 42494749434b 42494748454e -424947475559 -424947475559 424947474f44 42494747414e 424947473639 -42494746414e 424947454545 424947454444 424947444f43 @@ -100402,7 +95312,6 @@ 424947444f32 424947444557 424947444156 -424947444144 424947443639 424947443047 42494743554d @@ -100411,11 +95320,9 @@ 424947425542 424947424f54 424947424f4e -42494742454e 424947424153 42494742414e 42494742414c -424947414c31 424947414245 424947363939 424946464f37 @@ -100443,7 +95350,6 @@ 424942425953 424942425553 42494242454e -424941544348 424941534341 424941474749 424855525354 @@ -100496,7 +95402,6 @@ 42455454594d 42455454594b 424554545942 -424554535931 424554525545 4245544f4e59 4245544f4e31 @@ -100521,18 +95426,13 @@ 424553543639 424553543136 424553543131 -424553534945 -42455353454c 4245534d4942 42455345454e 424553424553 -424552594c31 -42455257594e 42455257494e 424552554245 424552544d41 42455254494e -424552544841 424552544552 424552543731 424552543232 @@ -100561,17 +95461,13 @@ 42454e5a4552 42454e574148 42454e545550 -42454e544f4e -42454e544c59 42454e544531 42454e544159 42454e543132 42454e525941 42454e525553 42454e4e5935 -42454e4e5931 42454e4e4a49 -42454e4e4945 42454e4d4144 42454e4c4545 42454e4b454e @@ -100584,14 +95480,10 @@ 42454e494552 42454e475553 42454e47494f -42454e474945 -42454e47414c 42454e455354 42454e454b45 42454e444f52 -42454e444958 42454e44494b -42454e444552 42454e363738 42454e303037 42454e303031 @@ -100602,9 +95494,7 @@ 42454c554c49 42454c545241 42454c544544 -42454c4f4954 42454c4e4541 -42454c4d4152 42454c4c5953 42454c4c5831 42454c4c5331 @@ -100622,7 +95512,6 @@ 42454c4c3232 42454c4c3132 42454c494553 -42454c49414c 42454c48414d 42454b4b4552 42454b4b4131 @@ -100636,7 +95525,6 @@ 4245475a4f44 4245474f4e41 424546494e41 -4245455a4552 4245455a454c 4245455a4545 424545564953 @@ -100648,11 +95536,8 @@ 424545523455 424545523230 424545523135 -424545504552 424545504544 -4245454d4552 4245454c4545 -424545474545 424545465953 424545464f52 424545444f4f @@ -100713,9 +95598,7 @@ 424541523135 424541523034 4245414e5333 -4245414e5331 4245414e4553 -4245414e4552 4245414e3134 4245414d4f4e 424541443434 @@ -100743,7 +95626,6 @@ 424431323239 424430303333 424357313233 -424352494348 424350553739 42434f534259 42434f46534f @@ -100792,7 +95674,6 @@ 424242383838 424242363636 424241525259 -4242414c4c31 424241424553 424236373031 424235353030 @@ -100806,8 +95687,6 @@ 42415a415455 42415952414b 4241594f5532 -4241594c4f52 -4241594c4f52 4241594c4953 42415949544b 424159444f47 @@ -100832,7 +95711,6 @@ 42415449474f 424154455353 424153544931 -424153544554 424153543235 424153534f53 42415353494b @@ -100845,7 +95723,6 @@ 4241534b4f56 424153494e31 424153494c42 -424153494131 424153484655 42415348454e 424153484544 @@ -100859,21 +95736,16 @@ 424152565231 424152545353 424152544f57 -424152544f4e -424152544f4b 424152544d41 42415254454e 424152543536 424152543139 424152525950 -424152525932 424152524553 424152524552 -4241524f4e53 4241524f4e35 4241524f4e34 4241524f4e32 -4241524e4553 4241524d5932 4241524d4552 4241524b5331 @@ -100896,21 +95768,17 @@ 42415243454c 424152434154 424152425131 -424152424f53 424152424a42 424152424559 424152424553 -424152424552 424152424551 424152424544 -424152424152 424152423435 42415241544f 424152414b4b 424152303031 424151415249 42414e5a4152 -42414e5a4149 42414e545553 42414e544f54 42414e4e454e @@ -100921,10 +95789,8 @@ 42414e4b3431 42414e4a554c 42414e4a4f4f -42414e4a4f31 42414e474f31 42414e474954 -42414e47494e 42414e47454c 42414e453133 42414e445932 @@ -100970,9 +95836,7 @@ 42414c4a414e 42414c48414d 42414c454e41 -42414c445552 42414c444f31 -42414c444552 42414c444152 42414c443132 42414c415355 @@ -101002,11 +95866,9 @@ 424147574136 424147534259 424147533131 -424147495241 424147474c45 424147474954 424147455241 -424147424147 424147413735 424146464552 424146414e41 @@ -101032,7 +95894,6 @@ 4241434f4e35 4241434f4e32 4241434d414e -4241434b5550 4241434b4f4e 4241434b494e 4241434b4553 @@ -101059,9 +95920,7 @@ 4241424f4f53 4241424d4953 4241424c4552 -4241424c4552 4241424b4131 -424142494553 424142494348 424142455a5a 424142455454 @@ -101070,7 +95929,6 @@ 424142453333 424142453133 424142453030 -424142424c45 424142424945 424142424152 424142415931 @@ -101119,7 +95977,6 @@ 42304744414e 423039364154 423033383934 -4230304d4552 4230304d3352 423030304d4d 415a5a5a5a5a @@ -101131,8 +95988,6 @@ 415a55524531 415a554c3030 415a54485547 -415a54454331 -415a53584443 415a4e4b5250 415a4d495241 415a4d414e34 @@ -101146,7 +96001,6 @@ 415a43415453 415a42594358 415a42454152 -415a415a454c 415a41544f54 415a414e4f56 415a41444548 @@ -101232,15 +96086,10 @@ 415544524131 415544523435 415544495638 -415544495454 415544495431 -415544494f31 415544494e45 -415544494136 -415544494136 415544414345 415544393131 -41554255524e 415542555235 415542555232 415542524945 @@ -101278,9 +96127,6 @@ 415449524144 4154494c4131 415448565448 -4154484c4f4e -415448454e53 -415448454e41 415447533132 415442333330 415441524158 @@ -101301,9 +96147,6 @@ 415354554345 415354525550 415354524f35 -415354524f31 -415354524944 -41535452414c 415354524136 4153544f524d 4153544f4e45 @@ -101315,8 +96158,6 @@ 415354414741 415354313239 4153534f5254 -4153534d414e -4153534d414e 4153534d4133 4153534d4131 4153534c494b @@ -101325,7 +96166,6 @@ 415353475559 415353464154 415353455331 -415353455331 41535345444f 415353444950 415353444647 @@ -101338,7 +96178,6 @@ 415351415351 41535052494e 415350524553 -415350495245 415350494b53 415350494341 415350454e4e @@ -101361,16 +96200,13 @@ 415349545339 41534952414c 415349415441 -415349414e53 415349414e42 415348555241 -415348555241 415348545241 415348544f32 415348544159 415348524145 4153484c4552 -4153484c4545 415348495941 415348495241 415348464151 @@ -101381,19 +96217,16 @@ 415348414e45 415348413237 415348373836 -415347415244 415347313233 415346524557 415346474a4b 415346415346 415346355137 415345525459 -4153454e4e41 4153454c4b41 4153454c3932 415345455641 415345414c4c -4153445a5843 415344574552 415344534446 4153444b4f4d @@ -101413,7 +96246,6 @@ 415344303031 4153435a5844 4153434f4c49 -415343454e54 415343434331 415343415241 415341545552 @@ -101435,7 +96267,6 @@ 415333363938 415331393839 415331393630 -415331323334 415331323231 415331313432 415331313131 @@ -101460,7 +96291,6 @@ 415254455441 415254454d4f 415254454d32 -415254454d31 415254454331 415254434152 415254415831 @@ -101482,7 +96312,6 @@ 41524f53534f 41524f534131 41524f4d4154 -41524e554c46 41524e4f4e53 41524e494553 41524e49454a @@ -101513,14 +96342,12 @@ 41524a554e4f 41524a554e31 415249535341 -4152494f4348 4152494e4131 4152494c4448 415249455333 415249454c49 415249454c37 415249414e49 -415249414e45 415249413737 415249413636 41524935394d @@ -101542,7 +96369,6 @@ 41524455494e 4152444d4f52 415244454c4c -415244424547 415244415448 415243544f53 415243494e47 @@ -101561,12 +96387,10 @@ 41524156454e 41524153454c 415241523432 -4152414d4953 4152414d494b 4152414d414e 415241495a41 415241484953 -415241474f4e 415241424153 415238353538 415237415239 @@ -101580,8 +96404,6 @@ 415053505752 415053313233 415052494c4d -415052494c39 -415052494c36 415052393933 4150522d3737 4150504c4547 @@ -101619,17 +96441,14 @@ 414e59543939 414e59413833 414e57414c54 -414e55544b41 414e554c4131 414e554b5532 -414e55425553 414e55383132 414e55313233 414e54524f4e 414e544f4e4e 414e544f4e35 414e544e4559 -414e544d414e 414e544a4542 414e54495246 414e54495155 @@ -101643,13 +96462,11 @@ 414e534c4559 414e534b4152 414e5348454c -414e53454c4d 414e53454c4c 414e53415441 414e4f544845 414e4f534f56 414e4f4f5348 -414e4f4d4945 414e4f4b454b 414e4e57594e 414e4e4e4e41 @@ -101657,11 +96474,9 @@ 414e4e494556 414e4e49454c 414e4e494533 -414e4e494531 414e4e494345 414e4e474945 414e4e455845 -414e4e455454 414e4e455445 414e4e455441 414e4e455353 @@ -101686,7 +96501,6 @@ 414e4e413334 414e4e413238 414e4e413135 -414e4e413132 414e4e413032 414e4b455441 414e4b454e59 @@ -101730,7 +96544,6 @@ 414e47454c54 414e47454c4e 414e47454c43 -414e47454c32 414e47445544 414e47415244 414e47313233 @@ -101751,8 +96564,6 @@ 414e4453494c 414e44524f49 414e4452494a -414e44524559 -414e44524553 414e44524551 414e44524543 414e44524533 @@ -101766,7 +96577,6 @@ 414e44485241 414e44455245 414e44415348 -414e434f4e41 414e43484f4f 414e4154554d 414e41535441 @@ -101797,10 +96607,8 @@ 414d59544831 414d59535545 414d594c494e -414d594c4545 414d59483736 414d59415353 -414d59414d59 414d59323639 414d59303031 414d58414d58 @@ -101856,15 +96664,12 @@ 414d43414d58 414d42524545 414d42455256 -414d42455253 414d4245524b 414d42455249 414d42455248 414d42455247 414d42455230 414d42313233 -414d415a4f4e -414d415a4f4e 414d415a4552 414d41545355 414d41544552 @@ -101876,7 +96681,6 @@ 414d4152414e 414d414e4150 414d414d4841 -414d414c4941 414d414c4545 414d41454249 414d41444f55 @@ -101895,12 +96699,10 @@ 414c57494e41 414c5741595a 414c56494e53 -414c56494e31 414c56413941 414c554d4e41 414c554d4158 414c54495553 -414c54494d41 414c54455253 414c54454e44 414c54454343 @@ -101917,12 +96719,7 @@ 414c5048454e 414c50484158 414c5048414e -414c50484139 -414c50484136 -414c50484135 -414c50484132 414c4f524f4e -414c4f4e5a4f 414c4f4e5a41 414c4f4e4e41 414c4f4e4553 @@ -101983,7 +96780,6 @@ 414c49544f4d 414c49544153 414c49534f34 -414c49534b41 414c4953414e 414c49534141 414c49534132 @@ -101995,10 +96791,7 @@ 414c494a4148 414c49494941 414c49474153 -414c49454e53 -414c49454e53 414c49454e35 -414c49454e31 414c49454853 414c49434550 414c49434152 @@ -102007,7 +96800,6 @@ 414c49414741 414c49393939 414c49344b41 -414c49313233 414c47494441 414c46414d59 414c46414754 @@ -102038,8 +96830,6 @@ 414c45583434 414c45583337 414c45583235 -414c45583132 -414c45583131 414c45583039 414c45583035 414c45545441 @@ -102047,13 +96837,10 @@ 414c45544841 414c45534b41 414c4553494b -414c45534941 414c45525431 414c4550504f -414c454e4b41 414c454e4132 414c454d4152 -414c454d4150 414c454c5559 414c454a4f53 414c454a4954 @@ -102075,7 +96862,6 @@ 414c4348454d 414c424f525a 414c42495441 -414c42494e4f 414c42494553 414c42493939 414c42455247 @@ -102221,7 +97007,6 @@ 414832303130 414831303437 4147554e4941 -414755494c41 414752414345 41474e455441 41474e414e4f @@ -102255,7 +97040,6 @@ 4146414e3939 414641435041 414641313731 -414641313731 414639383033 414633495348 414631383932 @@ -102266,7 +97050,6 @@ 414552495332 41455249454c 4145504b5250 -41454745414e 414544424231 414543393134 414541474c45 @@ -102286,8 +97069,6 @@ 414450313233 41444f524e53 41444f4e4e41 -41444f4e4953 -41444f4c464f 41444e4f4852 41444d575450 41444d494e39 @@ -102295,7 +97076,6 @@ 41444d493332 41444d415354 41444b343652 -41444b343652 41444a4d5457 41444a454354 41444a41524f @@ -102336,7 +97116,6 @@ 41444449434b 414444434f4d 414444424f54 -414444414d53 414443313233 414442414442 4144414e4337 @@ -102408,7 +97187,6 @@ 4143434f5354 4143434f4d50 4143434f3430 -414343455353 414343454544 414342313233 414341303032 @@ -102433,7 +97211,6 @@ 414252455445 41425245474f 414252415353 -414252414d53 414252414d31 414250313233 41424f4f4231 @@ -102453,7 +97230,6 @@ 41424449434b 4142435a4f56 414243444537 -414243444531 414243393633 414243373737 414243373730 @@ -102474,7 +97250,6 @@ 414242593036 414242593033 414242554e44 -4142424f5454 414242494553 414242494535 414242415445 @@ -102515,14 +97290,12 @@ 414144445353 414144444552 414142425656 -414142424343 414142424141 414142423131 414142414142 414141585858 414141525252 414141524f4e -414141424242 414141414148 414141413132 414141393939 @@ -102555,8 +97328,6 @@ 413635343332 413556335a4f 4135314d3056 -413454454348 -413454454348 41344d4f5259 413441344134 413436333232 @@ -102571,7 +97342,6 @@ 41325a313233 413244334734 413242324332 -413242324332 413230434845 413230303741 413230303641 @@ -102870,7 +97640,6 @@ 393430383234 393430323136 39334a454550 -393348475635 393338333733 393337344a47 393337323630 @@ -103031,7 +97800,6 @@ 38554e473830 385538553855 38534f4d4531 -385055535359 385039334c30 384d59334448 384d4d384d4d @@ -103513,7 +98281,6 @@ 3738594b3735 37384e4f5641 3738494a4859 -3738464f5244 373841545454 37383951415a 373839484a4b @@ -104013,7 +98780,6 @@ 373130313039 373130303731 37305047544f -37304e4f5641 373047533234 373039353937 373037353030 @@ -104080,7 +98846,6 @@ 363957484f41 3639544f4a44 36394d4f4d4f -36394d455453 36394c49434b 36394b494c4c 3639464f5255 @@ -106957,7 +101722,6 @@ 325041524c4f 3250354a4730 324e49584f4e -324e33303535 324d55534943 324d55434834 324d4f4f5345 @@ -108787,7 +103551,6 @@ 315a39413659 3159554b4f4e 3157494e4753 -3157494c4c59 3157484f5245 3157414c444f 315741484f4f @@ -108800,7 +103563,6 @@ 31554e444552 3154594c4552 315457495354 -315457495354 315457494e53 31545552544c 315452555354 @@ -108810,13 +103572,11 @@ 315452454553 31544f4f5448 31544f4f4c53 -31544f4d4d59 31544f4b594f 31544f415354 315449545459 3154494e5453 3154494d4d59 -3154494d4d59 3154494d4553 3154494d424f 315448494546 @@ -108828,31 +103588,24 @@ 315431323354 315355534849 3153554e4e59 -315355434b53 315354524154 3153544f524d 31535445414b -31535445414b 315354424445 315354415254 -315351554944 315350555253 3153504f4f4e -315350494b45 315350494345 315350414345 31534f4e4943 31534f434b53 -31534d494c45 31534d414c4c 31534c494445 -31534c415645 31534b495031 315349524843 3153494d4f4e 3153484f4553 31534841574e -31534841574e 315348414654 31534841434b 3153454e4e41 @@ -108866,10 +103619,8 @@ 315249534b41 315249434b59 315248494e4f -315248494e4f 315245434f4e 31524542454c -31524542454c 315241494c53 31524144494f 315241444152 @@ -108884,31 +103635,25 @@ 3151415a5753 3151415a3151 315141334544 -315132573345 315132533345 315132453354 31505a355330 -315052494d45 315052494d41 -31504f524e4f 31504f4f5059 31504f4e4345 31504c55544f 3150495a4441 315049584945 315049504552 -3150494e4b59 315049414e4f 315048554c45 315048495348 315045505349 315045474759 -315045474759 315041544348 315041525459 3150414f4c4f 315041494e54 -314f4d454741 314f4c495645 314f49555954 314f44494e31 @@ -108917,8 +103662,6 @@ 314e4f4e4c59 314e49584f4e 314e494b4b49 -314e494b4b49 -314e49474854 314e49474741 314e44494730 314e414e4359 @@ -108927,20 +103670,16 @@ 314d554e4348 314d50554c35 314d4f4f5245 -314d4f4f5245 314d4f4f4e31 314d4f4d4d41 314d4f4c4531 314d49544348 314d494c4553 314d494c414e -314d494b4559 314d4554414c 314d4547414e -314d45444943 314d41545459 314d41534f4e -314d41534f4e 314d41525459 314d414e4459 314d414a4f52 @@ -108950,7 +103689,6 @@ 314c4f554953 314c4f554945 314c4f54544f -314c4f534552 314c4f52454e 314c4d4e4f50 314c4b4a4847 @@ -108964,10 +103702,6 @@ 314b59524938 314b4f545355 314b494d4d59 -314b4556494e -314b454c4c59 -314b45495448 -314b41594c41 314b41594c41 314b41544941 314b41534559 @@ -108979,12 +103713,8 @@ 314a55494359 314a4f564131 314a4f504559 -314a4f4b4552 -314a45525259 -314a454e4e59 314a454c4c59 314a454c4c4f -314a41534f4e 314a4150414e 314a41434b53 314a41434b31 @@ -108998,12 +103728,9 @@ 3147554d4259 314755414e41 314752414e54 -314752414e54 -314752414e44 31474f4f4659 31474f474f31 31474c415353 -3147495a4d4f 314749414e54 3147484f5354 3147414d4d41 @@ -109015,7 +103742,6 @@ 31464f524345 31464c4f5944 31464c494e54 -31464c415348 31464a55514b 314649534832 314646454455 @@ -109025,22 +103751,17 @@ 3145524e4945 314552494341 31454e4a4f59 -31454d494c59 31454c454e41 314544474152 31445552414e 314455444553 314452445245 31444f4c4c59 -31444f474759 -31444f444745 314449584945 3144494d514a 31444945474f 314445574559 314441544132 -3144414e4345 -314441495359 3143524f5353 314352494d45 31434f524e45 @@ -109058,20 +103779,15 @@ 31434849434f 31434849434b 314348455353 -314348414d50 314341525535 314341524f4c 314341524c4f 314341524c41 314341524559 -314341524453 314341444459 314341424c45 -314341424c45 314332423341 314259524f4e -3142554e4e59 -314255464659 31425259414e 314252454e54 31425245414b @@ -109079,8 +103795,6 @@ 314252414e4e 314250424642 31424f53434f -31424f53434f -31424f4f5459 31424f4f5453 31424c554531 31424c415354 @@ -109095,24 +103809,18 @@ 31424947414c 314245545459 31424552454e -3142454c4c41 314245434b59 314245415354 -314245415253 314245415231 -314245414348 314244504153 31424144414d 314232423342 314153444631 -31415052494c 31414e544f4e 31414e4e4131 -31414e495441 31414d4e4f31 31414c544543 31414c504f31 -31414c504841 31414c4c454e 31414c49454e 31414c494345 @@ -109121,7 +103829,6 @@ 3141444c4149 314144474a4d 314142434445 -314141524f4e 3141344a3754 3141324e3344 314132424333 @@ -109604,7 +104311,6 @@ 313931323538 313931323334 313931323037 -313931314131 313931313533 313931313231 313931313139 @@ -109961,7 +104667,6 @@ 313730323039 313730323037 313730314145 -313730314142 313730313533 313730313532 313730313531 @@ -110915,7 +105620,6 @@ 313234313633 313234313232 313234313030 -3132335a5843 313233594553 313233574152 313233554e55 @@ -110994,11 +105698,7 @@ 313233344552 313233344356 313233344353 -313233344142 313233343732 -313233343556 -31323334354c -313233343544 31323334352e 313233343338 313233343135 @@ -111775,7 +106475,6 @@ 313036393637 313036383341 313036373030 -313036364144 313036363931 313036363637 313036363432 @@ -114287,7 +108986,6 @@ 2d2d2d2d2d2d 5a5a5a5a5a42 5a5a5a5a3132 -5a5a5a585858 5a5a5a575757 5a5a5a49544f 5a5a5a494e47 @@ -114295,7 +108993,6 @@ 5a5a5a444444 5a5a5a383930 5a5a5a323232 -5a5a5a313233 5a5a5a303039 5a5a595a5a58 5a5a595a5831 @@ -114303,7 +109000,6 @@ 5a5a56475646 5a5a544f5036 5a5a544f5032 -5a5a544f5031 5a5a53535858 5a5a505a5a50 5a5a50554d41 @@ -114329,7 +109025,6 @@ 5a59524d504f 5a594c4b4153 5a594b53454c -5a594a585246 5a59474f5453 5a5947414e38 5a5946313233 @@ -114337,9 +109032,7 @@ 5a5945384f58 5a5945353839 5a5944585a56 -5a594446484d 5a5941495245 -5a585a585a58 5a585a583132 5a585a583131 5a585a435a56 @@ -114353,17 +109046,12 @@ 5a5845525846 5a5844554d42 5a5844523536 -5a58435a5843 5a5843565656 5a5843564f52 -5a584356424e -5a584356424e 5a584356424d 5a5843564237 5a5843564232 -5a5843564231 5a5843563536 -5a5843563132 5a5843563131 5a5843563039 5a5843494f50 @@ -114371,7 +109059,6 @@ 5a5843323334 5a5843303031 5a5843303030 -5a5841535157 5a5839303052 5a5838544b37 5a5836524633 @@ -114390,7 +109077,6 @@ 5a574f4c465a 5a5747435a33 5a5745484d5a -5a5743554c42 5a57414b494c 5a565a565a56 5a565a443730 @@ -114398,7 +109084,6 @@ 5a5655383739 5a5649554144 5a5646375041 -5a56455a4441 5a5645525252 5a5645524f4b 5a56454c4652 @@ -114457,7 +109142,6 @@ 5a54384b3933 5a535a535a53 5a5359544842 -5a5359544842 5a53585a5358 5a5358575141 5a5358443132 @@ -114496,7 +109180,6 @@ 5a515354434d 5a51364d5450 5a513348564a -5a5056544542 5a5050585a47 5a5050515737 5a504c54434d @@ -114507,7 +109190,6 @@ 5a4f5a4f3132 5a4f57494531 5a4f55544442 -5a4f55544442 5a4f554e4945 5a4f554d4554 5a4f5459524a @@ -114520,7 +109202,6 @@ 5a4f52524f57 5a4f52524f4e 5a4f52524f44 -5a4f52524f31 5a4f524f3737 5a4f524f3231 5a4f524f3132 @@ -114538,7 +109219,6 @@ 5a4f4f524f50 5a4f4f4e4945 5a4f4f4d494b -5a4f4f4d4945 5a4f4f4d3838 5a4f4f4d3639 5a4f4f4d3434 @@ -114566,19 +109246,16 @@ 5a4f4d415231 5a4f4c57494b 5a4f4c54454e -5a4f4c54414e 5a4f4c4c4945 5a4f4c4c4552 5a4f4c4b494e 5a4f4c44414e -5a4f4c44414e 5a4f4b5a4f4b 5a4f49443435 5a4f48524142 5a4f48414942 5a4f47414942 5a4f46544947 -5a4f455a4f45 5a4f45594245 5a4f45593833 5a4f45593132 @@ -114590,7 +109267,6 @@ 5a4f45423532 5a4f45353234 5a4f45353131 -5a4f44494143 5a4f4441434b 5a4f434b454e 5a4f42583639 @@ -114608,7 +109284,6 @@ 5a4d414c514f 5a4d414b514f 5a4c52544142 -5a4c52544142 5a4c514f324b 5a4c4f544b4f 5a4c4f444549 @@ -114640,7 +109315,6 @@ 5a4950535142 5a4950533638 5a4950505954 -5a4950505931 5a4950505037 5a4950504f39 5a4950504f38 @@ -114711,7 +109385,6 @@ 5a484f44414e 5a484e5a484e 5a484e545741 -5a484e545741 5a484a444a54 5a48495a4849 5a484958494e @@ -114720,7 +109393,6 @@ 5a484757484b 5a4847415156 5a4846393859 -5a48454e5941 5a48454e4b41 5a48454b4131 5a48414e494b @@ -114737,14 +109409,10 @@ 5a4741524249 5a4741423455 5a4732574e43 -5a46594e4a59 5a4659425654 5a4652414e4b 5a464d385356 5a464c545541 -5a464c545541 -5a464c545541 -5a464c545541 5a46464b4252 5a4558584552 5a4558524354 @@ -114786,7 +109454,6 @@ 5a4552473030 5a4551585749 5a4550504552 -5a4550485952 5a4550393637 5a454e54414f 5a454e535552 @@ -114794,12 +109461,10 @@ 5a454e4f4e31 5a454e4b4552 5a454e4a495a -5a454e495448 5a454e494341 5a454e464f58 5a454e454341 5a454e444f47 -5a454e44454e 5a454e414944 5a454e413030 5a454e363637 @@ -114849,12 +109514,10 @@ 5a4542554c4f 5a4542524141 5a4542524136 -5a4542524131 5a45424f5353 5a4542425241 5a4541504737 5a45414c5335 -5a45414c4f54 5a4541474c45 5a4538535439 5a4532353131 @@ -114868,7 +109531,6 @@ 5a4441564953 5a4359425841 5a4356425946 -5a4356425946 5a4354524342 5a4351333837 5a4349545241 @@ -114928,7 +109590,6 @@ 5a41524b4f53 5a41524b3132 5a4152494e45 -5a4152494e41 5a4152494b41 5a4152494853 5a4152494641 @@ -114949,18 +109610,12 @@ 5a4152413031 5a4152393831 5a4152313136 -5a4151585357 -5a4151585357 -5a4151585357 -5a4151575358 -5a4151575358 5a4151515745 5a4151414154 5a4151323334 5a4151315a41 5a4151315141 5a4151313437 -5a4151313257 5a4151303938 5a4150504c45 5a4150504954 @@ -114970,7 +109625,6 @@ 5a41504f5445 5a4150483044 5a4150444f53 -5a4150415441 5a4150393830 5a4150305030 5a414e5a4153 @@ -114991,7 +109645,6 @@ 5a414d49454c 5a414d464952 5a414d424f41 -5a414d424941 5a414d42414b 5a414d323336 5a414d313233 @@ -115022,7 +109675,6 @@ 5a4149444131 5a4149443130 5a4149434f4d -5a414934494b 5a4148524144 5a4148524141 5a4148494446 @@ -115104,7 +109756,6 @@ 5a324e35584d 5a3158435642 5a3158325933 -5a3158324333 5a3158314331 5a31494e3937 5a3149325633 @@ -115118,7 +109769,6 @@ 5a3130303030 5a3058394338 5a3057315033 -5a304d423133 5a304d315231 5a3044314143 5a3030443030 @@ -115137,7 +109787,6 @@ 595955554747 59594c4c4947 595945554e42 -595945554e42 5959414e4e41 5959414d415a 5959414d4135 @@ -115156,8 +109805,6 @@ 5957414b5257 595736584750 595735583735 -595645545445 -595642554b42 595642554b42 595559595559 595559553939 @@ -115197,10 +109844,8 @@ 59554e464154 59554e414e49 59554d4d5933 -59554d4d5931 59554d4d5559 59554d4d4d4d -59554d4d4945 59554d494e47 59554d43554d 59554d41415a @@ -115213,7 +109858,6 @@ 59554b59554b 59554b4f4e4e 59554b4f4e43 -59554b4f4e31 59554b495955 59554b49544f 59554b493831 @@ -115248,7 +109892,6 @@ 595455414542 595454595454 595454494d53 -595452455751 595452363534 595452335751 59544f4e4559 @@ -115265,7 +109908,6 @@ 5954324b5157 59535a4b3347 595359544842 -595359544842 5953544d4930 595353555050 595353555031 @@ -115295,14 +109937,12 @@ 595136344f51 595058563759 595056544542 -595056544542 595053544e46 59504a54424a 595049544552 595033533531 595032313036 594f5a474154 -594f594f594f 594f594f4e47 594f594f3733 594f594f3430 @@ -115354,12 +109994,10 @@ 594f53484b41 594f5348494e 594f5348494d -594f53484945 594f53484935 594f52543538 594f52524943 594f524e4f43 -594f524d414e 594f524b494e 594f524b3231 594f52495348 @@ -115399,11 +110037,9 @@ 594f44414b31 594f44413838 594f44413732 -594f44413639 594f44413531 594f44413231 594f44413137 -594f44413132 594f44413030 594f44375449 594f434f4e41 @@ -115421,8 +110057,6 @@ 594f31323334 594e594e594e 594e54544342 -594e54544342 -594e54544342 594e50363339 594e4f545532 594e4f544c53 @@ -115445,7 +110079,6 @@ 594d4d4f5431 594d4c4f4157 594d47484a46 -594d4552454a 594d43413031 594d42333238 594d33383236 @@ -115453,7 +110086,6 @@ 594c5a41574f 594c56413536 594c52544142 -594c52544142 594c52313631 594c4d574154 594c4c494242 @@ -115515,14 +110147,11 @@ 59465055454b 594650424b5a 59464f365a46 -59464e464b42 59464e463939 59464e463839 59464c5a3639 59464c5a3535 59464c5a3438 -59464c545541 -59464c545541 59464c544c46 5946494c4a56 594648554250 @@ -115546,7 +110175,6 @@ 594553575757 59455354494e 594553534943 -594553534943 594553524f44 59455352454a 594553515248 @@ -115555,7 +110183,6 @@ 5945534e4f4f 5945534d454e 5945534c454b -594553485541 59455346414e 594553444f47 594553373737 @@ -115567,7 +110194,6 @@ 59454f475357 59454e534f4e 59454e525548 -59454e444f52 59454e313233 59454d494c59 59454d454e49 @@ -115585,18 +110211,15 @@ 59454c4c4f39 59454c4c494e 59454c4c454b -59454c4c454b 59454c4b414f 59454c445544 59454c415041 59454c414e47 59454c323838 59454b545441 -59454b4f4d53 59454b4e4f44 59454b494e49 59454b494d31 -59454b434f48 59454b434952 59454b313233 594549505258 @@ -115620,7 +110243,6 @@ 59445435564d 59444f4f4c42 59444e415231 -59444a545341 594445455053 594444554231 594444414442 @@ -115643,7 +110265,6 @@ 594250465642 59424e4c4e4a 59424c454853 -59424c454853 59424b4d434a 594248545141 592d42483632 @@ -115703,11 +110324,9 @@ 59414e534b49 59414e4e4f55 59414e4e4f53 -59414e4e4943 59414e4e4931 59414e4e4148 59414e4b5337 -59414e4b5331 59414e495441 59414e494953 59414e494348 @@ -115739,7 +110358,6 @@ 59414d414d45 59414d414b4f 59414d414a49 -59414d414441 59414d413132 59414c554e47 59414c503254 @@ -115747,13 +110365,11 @@ 59414c453131 59414c453031 59414c323334 -59414b554d4f 59414b55424f 59414b554241 59414b525554 59414b4e4f57 59414b49544f -59414b494d41 59414b484932 59414b414d4f 59414b313233 @@ -115857,12 +110473,10 @@ 585858505744 585858504143 5858584d4153 -5858584d414e 5858584a4553 585858484942 585858464f4e 585858454e41 -585858393939 585858373736 585858363139 585858344d45 @@ -115887,7 +110501,6 @@ 585846494c45 585846353135 5858454e4f4e -585844554d42 585843435858 585843435656 5858424f5353 @@ -115903,15 +110516,12 @@ 585759383959 5857504a5543 5857474c4558 -585743554c42 -585743554c42 585658565856 585650543844 5856504d5055 58564a58564a 58564339354d 585642554b42 -585642554b42 585641313632 585635445142 585633555241 @@ -115924,10 +110534,8 @@ 585545475232 585542535946 585541554a42 -585541554a42 5854554e4552 5854525a3333 -585452454d45 58545245454d 58545242434e 585452334d33 @@ -115958,7 +110566,6 @@ 585332525642 585258585258 585258544742 -585258544742 5852555a4859 585255585255 585255534841 @@ -115969,7 +110576,6 @@ 585247543637 585242514742 585241593030 -585241544544 585241434552 585232353052 585232303032 @@ -116009,8 +110615,6 @@ 584f30423358 584e57363836 584e54544342 -584e54544342 -584e54544342 584e51495151 584e4d584155 584e4d494553 @@ -116053,8 +110657,6 @@ 584c31323030 584b52393132 584b51545a41 -584b51545a41 -584b51545a41 584b4e324e48 584b494e4758 584b34463230 @@ -116062,7 +110664,6 @@ 584a57505856 584a52333730 584a50545941 -584a50545941 584a4f534858 584a494c5532 584a48595351 @@ -116099,7 +110700,6 @@ 58474d545641 584744333137 584731573541 -584655434b58 584652454458 58464b4a4446 584649444931 @@ -116108,7 +110708,6 @@ 5846484b4231 5846484a424e 5846474b4259 -584647465444 584643483131 584635544532 584631433133 @@ -116125,10 +110724,8 @@ 584552454341 5845514d5135 58455042414d -584550363234 58454e544152 58454e4f4e32 -58454e4f4e31 58454e4f4c45 58454e4f3939 58454e494136 @@ -116138,7 +110735,6 @@ 58454d34494b 58454c503631 58454c4c4f53 -58454c4c4f53 58454c454e41 58454c413639 58454b545441 @@ -116197,7 +110793,6 @@ 58424c414445 58424b505133 584248545141 -584248545141 584236303031 584159465536 584158584158 @@ -116213,7 +110808,6 @@ 584151414e49 584150524133 58414f533237 -58414e445241 58414e444f47 58414e444945 58414e444931 @@ -116307,7 +110901,6 @@ 575850313233 575845564856 575843575843 -57584356424e 575841554455 5758324a4b33 575757575737 @@ -116369,7 +110962,6 @@ 5755524b5553 575550504945 57554e534348 -57554e444552 57554e414c41 57554d4d454e 57554d4d454c @@ -116435,7 +111027,6 @@ 575331333938 575331323532 575259455231 -575258535449 575257525752 57525751415a 575257353434 @@ -116450,7 +111041,6 @@ 5752494b4552 575249474c45 575245585858 -5752454e4348 5752454e3234 575245313435 575244575244 @@ -116471,7 +111061,6 @@ 575144475650 5751415a5843 575058503538 -575056544542 575053544152 57505252414e 5750524f5354 @@ -116520,8 +111109,6 @@ 574f524c444e 574f524c4441 574f524c4435 -574f524c4431 -574f524c4431 574f524c4430 574f524b5353 574f524b5331 @@ -116530,7 +111117,6 @@ 574f524b3038 574f52463636 574f5244544f -574f52445331 574f5244494e 574f52444153 574f52443639 @@ -116556,14 +111142,11 @@ 574f4f4c454e 574f4f4c444f 574f4f4b3137 -574f4f484f4f 574f4f474c45 574f4f474141 574f4f465353 574f4f464e53 574f4f464649 -574f4f464552 -574f4f464552 574f4f463733 574f4f463132 574f4f463031 @@ -116572,9 +111155,7 @@ 574f4f445943 574f4f445942 574f4f445937 -574f4f445331 574f4f44494e -574f4f44454e 574f4f44434f 574f4f443938 574f4f443730 @@ -116594,7 +111175,6 @@ 574f4f443130 574f4f443030 574f4f42494e -574f4f424945 574f4f383838 574f4e5a4559 574f4e574f4e @@ -116608,12 +111188,10 @@ 574f4d504945 574f4d504552 574f4d454e32 -574f4d424c45 574f4d424945 574f4d414d41 574f4c574f53 574f4c574f4c -574f4c564945 574f4c545a59 574f4c534f50 574f4c534559 @@ -116622,7 +111200,6 @@ 574f4c4f4441 574f4c4c4f57 574f4c4c4957 -574f4c4c4559 574f4c4c4546 574f4c4c4537 574f4c4b4f57 @@ -116651,7 +111228,6 @@ 574f4c463534 574f4c463432 574f4c463336 -574f4c463232 574f4c463230 574f4c463033 574f4c463032 @@ -116662,8 +111238,6 @@ 574f4b4b4f4c 574f4b493234 574f4b414445 -574f4a54454b -574f4a54454b 574f4a544153 574f4a4f3434 574f4a41534b @@ -116681,7 +111255,6 @@ 574f44353330 574f43485541 574f4344414d -574f42424c59 574f42424945 574f334f4f57 574e555a4551 @@ -116706,7 +111279,6 @@ 574d37393734 574c574b574b 574c52544142 -574c52544142 574c524f4249 574c4c414d31 574c4c313639 @@ -116766,7 +111338,6 @@ 5749534f5831 5749534e4552 5749534c4559 -5749534c4559 5749534c4131 57495349414e 574953484552 @@ -116793,7 +111364,6 @@ 57494e534d55 57494e533131 57494e524152 -57494e4f4e41 57494e4f3535 57494e4f3432 57494e4f3235 @@ -116810,14 +111380,10 @@ 57494e475339 57494e475337 57494e474c59 -57494e474552 -57494e474552 57494e473352 57494e473131 57494e473031 57494e445535 -57494e444f57 -57494e444f57 57494e444f53 57494e444152 57494e444137 @@ -116830,7 +111396,6 @@ 57494e434559 57494e434331 57494e424545 -57494e414d50 57494e363134 57494e333131 57494e333038 @@ -116848,22 +111413,15 @@ 57494c4d4134 57494c4d4133 57494c4c5959 -57494c4c5953 57494c4c594a 57494c4c5945 57494c4c5943 57494c4c5939 57494c4c5934 57494c4c4d41 -57494c4c4d41 57494c4c4a52 57494c4c4954 -57494c4c4953 57494c4c4932 -57494c4c4931 -57494c4c4559 -57494c4c454d -57494c4c4545 57494c4c424f 57494c4c4152 57494c4c414c @@ -116894,7 +111452,6 @@ 57494c443455 57494c443436 57494c435a45 -57494c434f58 57494c434f37 57494c343536 57494c333333 @@ -116915,15 +111472,12 @@ 5749474c4552 574947485453 574947475936 -57494747554d -574947474c45 574947474936 574947474934 574947474933 57494657474f 574946465553 574946464552 -574946455931 574946453639 574946453233 574945534552 @@ -116934,13 +111488,11 @@ 574945484550 574944554e4e 5749444f5731 -5749444f5731 5749444e4553 5749444e4552 5749444e4155 574944494e47 574944474945 -574944474554 574944473939 574944444f57 574944444c59 @@ -116952,12 +111504,10 @@ 5749434b3130 5749434b3031 574943484559 -57494343414e 574943415341 574942535452 5749424f574f 574942424c59 -574942424c45 57494242454c 574941524457 574938535453 @@ -116990,27 +111540,19 @@ 57484f524e59 57484f524c53 57484f524c46 -57484f524553 57484f524545 57484f524533 -57484f524532 57484f503033 57484f4f5454 -57484f4f5348 57484f4d5041 57484f4d4545 57484f4c4553 57484f4b4142 57484f444953 -57484f414d49 -57484e545741 57484e545741 57484d565249 5748495a4954 5748495a3132 -574849544559 -574849544553 -574849544553 57484954454a 574849544542 574849543232 @@ -117074,15 +111616,11 @@ 5745594c494e 574559455231 574558494e44 -574557455745 574557454445 574557453838 574556555337 -574554574554 -574554544552 574554535531 574554535341 -574554534558 5745544e4554 574554475559 574554455354 @@ -117095,11 +111633,9 @@ 574554303031 574553545550 574553545454 -574553544f4e 574553544c59 574553544c42 57455354494b -574553544945 574553544131 574553543836 574553543639 @@ -117112,7 +111648,6 @@ 5745534c4945 574553455231 574553313131 -574552545955 574552545951 574552545935 574552545933 @@ -117180,7 +111715,6 @@ 57454e445943 57454e445937 57454e445936 -57454e445931 57454e444f52 57454e444c45 57454e444931 @@ -117202,7 +111736,6 @@ 57454c495645 57454c49434b 57454c455354 -57454c434f4d 57454c425953 57454b57454b 57454b545441 @@ -117213,7 +111746,6 @@ 574549535345 574549535337 574549535333 -574549534552 57454953454c 574549534259 574549533235 @@ -117244,7 +111776,6 @@ 574545474531 574545465553 574545445353 -574545445331 574545444f4f 574545444f4e 574545444c59 @@ -117280,8 +111811,6 @@ 574542455254 574542454152 574542434f4c -57454243414d -574542424552 574542423831 574542423233 574542423232 @@ -117293,7 +111822,6 @@ 574542333333 5745415a3030 574541564945 -574541564552 574541534945 57454153434f 574541524954 @@ -117315,7 +111843,6 @@ 57444d415544 57444c4e4344 57444a545341 -57444a545341 574441564953 574437384c58 5744344a4d54 @@ -117357,14 +111884,12 @@ 57415a5a4154 57415a4f4f31 57415a415249 -5741594e4553 5741594e454a 5741594e4548 5741594e4537 5741594e3238 574159415741 574159414e47 -57415932474f 574159313233 574159313131 574158585930 @@ -117390,12 +111915,10 @@ 574154545931 574154545353 574154543132 -574154534f4e 574154534f31 5741544c4f57 5741544c4559 574154455641 -574154455253 574154455252 574154455246 574154455243 @@ -117439,7 +111962,6 @@ 57415254454e 574152543432 574152543132 -574152534157 574152533132 574152524959 574152524157 @@ -117452,7 +111974,6 @@ 5741524e4544 5741524d454e 5741524d4544 -5741524d414e 5741524a4f31 57415248414d 574152464f47 @@ -117480,14 +112001,10 @@ 5741514c4747 574150504851 57415047454e -574150424253 -574150424253 57415041544f 574150414841 574150313233 -574150313233 57414e544d45 -57414e544954 57414e544142 57414e543132 57414e534348 @@ -117521,23 +112038,16 @@ 57414c543337 57414c534552 57414c533435 -57414c525553 57414c504f4c 57414c4f3637 57414c4e4c53 57414c4c5945 57414c4c5944 57414c4c5942 -57414c4c5942 57414c4c5930 57414c4c5331 -57414c4c5331 -57414c4c4f50 57414c4c4c59 -57414c4c4953 57414c4c494f -57414c4c4945 -57414c4c4554 57414c4c454e 57414c4c4545 57414c4c4536 @@ -117550,13 +112060,11 @@ 57414c4b3535 57414c494b4f 57414c494441 -57414c484149 57414c474f4f 57414c455859 57414c455249 57414c444f4f 57414c444f4e -57414c44454e 57414c443136 57414c443132 57414c414e47 @@ -117578,10 +112086,8 @@ 57414952494d 57414950494f 574149504552 -5741494d4541 5741494b494b 574149444552 -5741484f4f4f 574148494e49 574148493637 574148454544 @@ -117676,7 +112182,6 @@ 573254434931 57324d4b4c36 57324b334234 -573245335234 5732375a5839 573235414745 573235383050 @@ -117686,7 +112191,6 @@ 573232323232 5732314a3243 573230303257 -57315a415244 57315a345244 573157324533 573153415244 @@ -117710,7 +112214,6 @@ 573030424945 565a534b4955 565a4f524f56 -565a46554f42 565a45565a45 565a44313233 565a43594a51 @@ -117725,7 +112228,6 @@ 565854555149 565847344549 565844554d42 -565844554d42 565835555435 565832303030 565758595a31 @@ -117764,7 +112266,6 @@ 565536563848 565534574f42 56545a544942 -56545a544942 5654594e4a4b 565459434a59 5654584d4e46 @@ -117785,7 +112286,6 @@ 565445524445 565445434831 565433425332 -565359544842 565354533930 565354524f47 5653544b3032 @@ -117836,7 +112336,6 @@ 565031363837 565031333732 564f594c4553 -564f59455552 564f58564f58 564f58504f50 564f58495348 @@ -117895,9 +112394,6 @@ 564f4d495341 564f4d45524f 564f4c564f56 -564f4c564f53 -564f4c564f31 -564f4c56454c 564f4c544552 564f4c544153 564f4c544152 @@ -117911,14 +112407,11 @@ 564f4c4f4439 564f4c4e494b 564f4c4e4159 -564f4c4c4559 -564f4c4c4559 564f4c4c4153 564f4c4c414e 564f4c4b5357 564f4c4b5353 564f4c4b5331 -564f4c4b4552 564f4c4b3333 564f4c4b3231 564f4c4b3132 @@ -117930,8 +112423,6 @@ 564f4c474132 564f4c455253 564f4c44494b -564f4c434f4d -564f4c434f4d 564f4c415231 564f4c41444f 564f4c353030 @@ -117975,7 +112466,6 @@ 564e41534b4a 564e31393933 564d5831324b -564d53544242 564d4b313233 564d4a303033 564d49303735 @@ -118000,7 +112490,6 @@ 564c41474153 564c41445941 564c41444c32 -564c41444b41 564c4144495a 564c41444953 564c41444531 @@ -118053,7 +112542,6 @@ 56495a415649 564959414e41 564958564958 -564958454e31 564956564956 564956494552 564956494447 @@ -118063,7 +112551,6 @@ 564956493031 564956454d4f 564956454c4f -564956454b41 564956454b37 564956454b31 56495641594f @@ -118075,7 +112562,6 @@ 564954594149 564954594131 564954545555 -56495454454c 5649544f5654 5649544f4c41 5649544f3939 @@ -118090,7 +112576,6 @@ 564954414d49 564954414d45 564954414c4c -564954414c49 564954414841 564954413237 564954413231 @@ -118113,7 +112598,6 @@ 564953413436 564952555335 564952555333 -564952555331 564952505554 564952495a41 564952493639 @@ -118121,7 +112605,6 @@ 56495247454d 564952454e53 564952415941 -56495241474f 564950554c41 564950524531 5649504d454e @@ -118133,21 +112616,16 @@ 564950313330 564950313131 56494f524943 -56494f4c4131 56494e594c45 56494e56414c -56494e544f4e 56494e4f5345 56494e4f4431 56494e4f3639 56494e4e5953 56494e4e5950 56494e4e5939 -56494e4e4945 -56494e4e4945 56494e4e4559 56494e4e4552 -56494e4d414e 56494e4b4f4d 56494e4b454c 56494e495431 @@ -118164,7 +112642,6 @@ 56494e444f47 56494e444153 56494e443137 -56494e434531 56494e434152 56494e415953 56494e415931 @@ -118182,7 +112659,6 @@ 56494c4c4947 56494c4c4556 56494c4c454b -56494c4c4531 56494c4c4137 56494c4c4133 56494c4c3235 @@ -118193,7 +112669,6 @@ 56494c493737 56494c454441 56494c413938 -56494b544f52 56494b534558 56494b4e4753 56494b4e4157 @@ -118215,9 +112690,7 @@ 56494b413234 56494b413231 56494b413136 -56494b413132 56494b413130 -56494b413039 56494b413036 56494b413032 56494b413031 @@ -118227,8 +112700,6 @@ 56494752414a 5649474e4f4e 564947494c31 -56494747454e -564945574552 564945574544 564945573137 564945564945 @@ -118274,7 +112745,6 @@ 564939415344 564931393530 564931323334 -564931323334 564853333231 564852494e4e 564850323335 @@ -118289,7 +112759,6 @@ 564841495259 564835353833 564833493357 -564831393834 564759564759 564759554842 5647554e4552 @@ -118328,7 +112797,6 @@ 564656463237 564656463236 564656463038 -564656454b5a 5646555a354f 56465559464e 564655594556 @@ -118340,7 +112808,6 @@ 564652433737 564652433535 564652433132 -564652373530 564652313233 564651564559 5646514c4659 @@ -118349,8 +112816,6 @@ 564650424b46 56464e4d3133 56464e465946 -56464e445451 -56464c545541 56464c545541 56464c544846 56464b5a5246 @@ -118374,7 +112839,6 @@ 564649463036 564649463030 564648554a31 -564648524543 5646484e4656 5646484e4252 5646484e3132 @@ -118459,7 +112923,6 @@ 564552444f54 56455244414f 56455242554d -564552424154 562d45524241 564552414c49 564552413937 @@ -118486,7 +112949,6 @@ 56454e55534f 56454e555342 56454e555338 -56454e555331 56454e544f52 56454e544552 56454e544544 @@ -118508,7 +112970,6 @@ 56454e444f4d 56454d4f5245 56454d415931 -56454c564554 56454c545249 56454c545241 56454c544f4e @@ -118554,11 +113015,9 @@ 56454452414e 5645444f4f4f 564544494f52 -564544444552 5645435a5246 5645435a3038 564543545553 -564543544f52 5645434d414e 5645434a4846 564543485441 @@ -118612,14 +113071,12 @@ 56424e425946 56424e42564e 56424c4a4842 -56424b545946 56424b524c46 56424b4d5246 56424b4b5448 56424b4a5852 56424b465a35 56424b46594a -56424b465946 56424b464946 56424b424346 564249564552 @@ -118628,10 +113085,8 @@ 564249463133 564249454e52 564249425946 -564248595351 564248594656 564248545141 -564248545141 5642484a5959 564248455642 564248454946 @@ -118656,7 +113111,6 @@ 56415a515545 56415a495249 56415a494e41 -56415a47454e 5641594e4531 564157313137 564156544155 @@ -118669,7 +113123,6 @@ 56415454414e 564154535547 56415453414c -564154454348 564153594f4b 564153594c31 56415359414e @@ -118678,7 +113131,6 @@ 564153544552 564153543131 56415353494c -564153515545 5641534f4d49 5641534b4f56 5641534b4f4f @@ -118738,7 +113190,6 @@ 56414e48454c 56414e455331 56414e454556 -56414e445931 56414e444f52 56414e444e41 56414e444954 @@ -118747,7 +113198,6 @@ 56414e434545 56414e434531 56414e34494b -56414d504952 56414d503733 56414d503639 56414d503331 @@ -118759,7 +113209,6 @@ 56414c554537 56414c545355 56414c544953 -56414c544552 56414c524943 56414c50414b 56414c4f5641 @@ -118782,9 +113231,7 @@ 56414c455441 56414c455431 56414c45534b -56414c45524f 56414c454f4c -56414c454e54 56414c454e45 56414c454e35 56414c454d41 @@ -118792,7 +113239,6 @@ 56414c45454e 56414c444f52 56414c444f31 -56414c44455a 56414c444554 56414c444552 56414c444153 @@ -118832,7 +113278,6 @@ 564144455241 564144455238 564144455235 -564144455231 564144444f52 564143544f52 56414348454c @@ -118941,7 +113386,6 @@ 555555373737 55554349434f 5554594c4248 -5554564f4c53 555455545554 55545447584d 555454454348 @@ -118950,7 +113394,6 @@ 555452434b42 55545241494e 555451495654 -55544f504941 55544f344b41 55544d423936 55544c565053 @@ -119063,7 +113506,6 @@ 555255475541 5552544c3230 555254484531 -555254484531 555253555253 555253414c41 555253414645 @@ -119084,10 +113526,8 @@ 555246414345 555244415049 5552434f434b -555242494e4f 555242414e53 555242414e50 -555242414e31 55524241484e 555241544841 555241534f45 @@ -119099,7 +113539,6 @@ 5552414b454e 555241464147 55524143494c -555241425553 555241313939 555231393638 555231324943 @@ -119112,7 +113551,6 @@ 55505833414a 555057434d44 555056544542 -555056544542 555055415554 555054524545 5550544f4d45 @@ -119135,7 +113573,6 @@ 55504f313131 55504c55544f 55504c494654 -55504c414e44 55504b454550 55504855544a 5550484f4c44 @@ -119144,7 +113581,6 @@ 555046495245 5550454e444f 555044554554 -5550444f574e 555044415441 555043313031 555041534e41 @@ -119173,7 +113609,6 @@ 554e5445434b 554e53544947 554e52554845 -554e5245414c 554e504c5547 554e4f553132 554e4f50454e @@ -119202,12 +113637,10 @@ 554e4953594e 554e49534f4d 554e49534157 -554e494f4e53 554e494f4e4e 554e494f4e34 554e494b4b4f 554e49464945 -554e4944454e 554e49444153 554e49434b53 554e49434154 @@ -119223,13 +113656,11 @@ 554e4741524e 554e454c4d41 554e45454431 -554e44494e45 554e44455558 554e44455257 554e44455247 554e44455244 554e44455232 -554e44454144 554e44444d58 554e44414e47 554e43555439 @@ -119245,7 +113676,6 @@ 554e41444953 554e38324d41 554d54414c49 -554d53544242 554d53434152 554d53373033 554d524b3538 @@ -119272,17 +113702,12 @@ 554d32303034 554c5452415a 554c54524156 -554c54524153 554c54524133 -554c54524132 -554c54494d4f 554c54494d38 554c54494d33 554c54485745 554c53535942 554c52544142 -554c52544142 -554c52544142 554c4f4c4d4f 554c4d554c4d 554c4d4f4449 @@ -119292,7 +113717,6 @@ 554c49584553 554c49554c49 554c49554741 -554c49535345 554c49504153 554c44555a41 554c41594e45 @@ -119310,7 +113734,6 @@ 554b53545544 554b53494c43 554b52534155 -554b524e4554 554b52454431 554b52415a59 554b5048494c @@ -119377,7 +113800,6 @@ 554848554831 554845524856 5548454c4234 -554845474746 554844434953 554842594756 554842564652 @@ -119407,7 +113829,6 @@ 5547474c414e 554745545355 554742484646 -5547414e4441 554741444159 55474144414a 554741393731 @@ -119429,8 +113850,6 @@ 5545594d5246 554554574f34 554552544552 -554550544b4d -554550544b4d 55454b545946 55454b343134 554548504541 @@ -119453,18 +113872,15 @@ 554444454132 55444159414e 5544414e4158 -554441434841 5544314e4641 55435a33314a 554354453434 554354445659 554353423939 -55434f4e4e31 55434c413631 55434c413139 55434c413032 554349545241 -554348494841 554348494441 554348455459 554347344747 @@ -119482,7 +113898,6 @@ 55424b4a3131 55424b455955 55424a485542 -554249544348 554249524941 5542494a4341 554248545141 @@ -119558,21 +113973,16 @@ 545955373635 545955363738 545955313233 -545954595459 545954593434 545954585246 5459534f4e43 5459534f4e36 -5459534f4e31 -5459534f4e31 5459534f4e30 5459534b4945 545952555331 545952545952 54595252414c -545952454c4c 54595245454b -545952414e54 545952414e4f 54595155414e 545950494659 @@ -119590,11 +114000,7 @@ 54594c50414e 54594c4f5645 54594c455247 -54594c455238 54594c455236 -54594c455234 -54594c455232 -54594c455231 54594a55414e 54594a54594a 54594a41434b @@ -119658,22 +114064,16 @@ 545749585858 545749583939 545749544c45 -545749535459 54574953544f 545749535438 -545749535431 545749534d31 5457494e5a5a 5457494e5a53 5457494e544f 5457494e5355 -5457494e5332 -5457494e5332 -5457494e5331 5457494e5330 5457494e4e53 5457494e4b35 -5457494e474f 5457494e4538 5457494e4142 5457494e3632 @@ -119694,7 +114094,6 @@ 545745455432 545745454b59 545745454b45 -545745454431 545745414b59 545744393939 5457415a5a59 @@ -119720,7 +114119,6 @@ 5456494e4b31 545649434b45 545642554b42 -545642554b42 545639493951 545636333253 545631323334 @@ -119729,7 +114127,6 @@ 545559454c4c 545559313539 545558534b2a -54555845444f 545556414c55 545556414b32 545556413137 @@ -119743,7 +114140,6 @@ 545554553938 545554553032 54555454554e -545554544c45 545554544953 5455544f5441 5455544f5253 @@ -119760,7 +114156,6 @@ 545553434f4f 545553434f4e 545553434c39 -54555343414e 545552555255 545552554c55 545552554749 @@ -119770,9 +114165,7 @@ 545552524953 545552514159 5455524f4b53 -5455524f4b32 5455524f4b31 -5455524e4950 5455524e3232 5455524d4554 5455524b5553 @@ -119804,7 +114197,6 @@ 54555054494d 5455504b4552 545550414343 -545550414331 54554f564144 54554f4e4f52 54554e4e4559 @@ -119815,7 +114207,6 @@ 54554e475953 54554e474552 54554e455336 -54554e455331 54554e455231 54554e415931 54554e414447 @@ -119838,13 +114229,11 @@ 54554c4b494e 54554c4b4552 54554c495054 -54554c495045 54554c495037 54554c494e31 54554c415959 54554c415455 54554c414e49 -54554c414e45 54554c413731 54554b554d4f 54554b4f4f4c @@ -119905,12 +114294,10 @@ 545531393335 54545a4f5247 545458393837 -545454545454 545454543939 545454543838 545454535353 545454505050 -5454544f4f4f 5454544e4e4e 5454544c5444 5454544c4c4c @@ -119937,7 +114324,6 @@ 54544f414444 54544e454847 54544d433131 -54544d415831 54544b53334f 545449574544 545449545453 @@ -119978,7 +114364,6 @@ 545357313233 5453564f5757 545355474153 -545354535453 5453544f4e45 545353313233 545353313131 @@ -120030,7 +114415,6 @@ 5452594d4143 5452594c4c45 545259495432 -545259494e47 545259494544 545259475645 545259414e54 @@ -120039,7 +114423,6 @@ 54525941474e 545259363636 545258544742 -545258544742 545258333030 545257313233 5452555a4552 @@ -120047,10 +114430,8 @@ 545255545841 545255544836 545255544832 -545255544831 545255544830 545255543148 -545255535459 54525553544e 54525553544d 54525553544a @@ -120064,14 +114445,12 @@ 5452554d5054 5452554d454e 5452554d4444 -5452554d414e 5452554c5942 5452554c4c59 5452554c494e 5452554b4552 5452554a4b41 545255464659 -545255464659 54525546464c 545255464631 545255454d50 @@ -120127,9 +114506,7 @@ 54524f544f53 54524f534b49 54524f505332 -54524f50504f 54524f504958 -54524f504859 54524f50454e 54524f504541 54524f504532 @@ -120147,10 +114524,8 @@ 54524f4c5a41 54524f4c4f4c 54524f4c4f43 -54524f4c4c53 54524f4c4c4c 54524f4c4c45 -54524f4c4c45 54524f4c4c41 54524f4c4c34 54524f4c4c30 @@ -120162,7 +114537,6 @@ 54524f474f4e 54524f474545 54524f473134 -54524f46494d 54524f455445 54524f424531 54524f303031 @@ -120181,16 +114555,13 @@ 545249583030 545249575857 54524957414a -545249554d50 545249554d33 54524954594c 545249545249 54524954414c -545249535441 545249534f52 545249534b4f 545249534832 -545249534831 54524953434f 545249505449 545249505333 @@ -120212,7 +114583,6 @@ 5452494f3835 5452494e5459 5452494e4b45 -5452494e4953 5452494e4941 5452494e4933 5452494e4931 @@ -120220,7 +114590,6 @@ 5452494e434f 5452494e4153 5452494e4132 -5452494e4131 5452494e3535 5452494d4d59 5452494d4158 @@ -120244,10 +114613,7 @@ 545249434f52 545249434f4e 545249434f4d -545249434b53 545249434b4f -545249434b31 -545249434941 545249434859 545249434559 545249434545 @@ -120273,7 +114639,6 @@ 545245583734 545245583031 545245574552 -545245564f4e 545245564f43 54524556454c 545245564153 @@ -120281,7 +114646,6 @@ 545245564131 545245563938 545245563052 -545245545245 545245544153 545245535354 545245535345 @@ -120312,7 +114676,6 @@ 5452454b3939 5452454b3134 5452454b3130 -545245495a45 545245494e31 545245475542 545245474f4f @@ -120327,7 +114690,6 @@ 545245455338 545245455337 545245455336 -545245455331 545245455254 545245454345 545245453930 @@ -120367,7 +114729,6 @@ 54524156414e 545241563231 545241563135 -545241554d41 54524155444c 545241544f52 545241535345 @@ -120420,19 +114781,14 @@ 54524143594e 54524143594c 545241435937 -545241435931 545241435333 545241434f4e 545241434b34 545241434b33 545241434957 -545241434945 545241434932 -545241434931 545241434859 -545241434552 54524143454e -545241434531 545241424552 54524132434b 545241314c53 @@ -120455,7 +114811,6 @@ 545231383939 545231383136 545157544642 -545157544642 545157455259 54515549434b 5451494e4a33 @@ -120488,7 +114843,6 @@ 544f594f4d41 544f594f474f 544f594f3934 -544f594d414e 544f594d3639 544f594b454c 544f59494e32 @@ -120502,20 +114856,17 @@ 544f58584943 544f58494353 544f57544f4e -544f57534f4e 544f574f4449 544f574e4c59 544f574e4545 544f574e3131 544f574c4945 -544f57494e47 544f57455242 544f57455237 544f57455235 544f57424f42 544f57424545 544f56413132 -544f55544f55 544f55534b49 544f55525332 544f55524e59 @@ -120563,7 +114914,6 @@ 544f54454d4d 544f54414c36 544f54414c33 -544f54414c31 544f53544f4e 544f5354414e 544f53534c45 @@ -120590,7 +114940,6 @@ 544f5252455a 544f52524532 544f52504554 -544f524f4e54 544f524f4749 544f524f3639 544f524f3637 @@ -120605,8 +114954,6 @@ 544f524b4f53 544f524b4552 544f524b454c -544f5249544f -544f52494e4f 544f52494c4c 544f52494b4f 544f52494949 @@ -120624,14 +114971,12 @@ 544f5244454b 544f52434838 544f52434835 -544f5242454e 544f52424159 544f52415845 544f52414d41 544f52414a41 544f52393939 544f52344f4b -544f52344f4b 544f51554553 544f51554552 544f50583936 @@ -120649,8 +114994,6 @@ 544f50504f54 544f50504f31 544f5050494e -544f50504552 -544f50504552 544f504f5254 544f504f524e 544f504f4646 @@ -120691,7 +115034,6 @@ 544f4f4c424f 544f4f4c3939 544f4f4c3739 -544f4f4c3739 544f4f4c3738 544f4f4c3732 544f4f4c3636 @@ -120702,7 +115044,6 @@ 544f4f4c3139 544f4f4c3133 544f4f4b4d45 -544f4f4b4945 544f4f4b4552 544f4f4b4545 544f4f4b3131 @@ -120716,7 +115057,6 @@ 544f4f42494e 544f4f424553 544f4f424148 -544f4f424144 544f4f393939 544f4f363058 544f4f313233 @@ -120742,7 +115082,6 @@ 544f4e593730 544f4e593635 544f4e593633 -544f4e593535 544f4e593534 544f4e593531 544f4e593530 @@ -120751,10 +115090,8 @@ 544f4e593337 544f4e593335 544f4e593332 -544f4e593332 544f4e593137 544f4e593135 -544f4e593131 544f4e593039 544f4e593037 544f4e593036 @@ -120765,8 +115102,6 @@ 544f4e593030 544f4e544f4f 544f4e544f45 -544f4e544f31 -544f4e544f31 544f4e544954 544f4e54494e 544f4e544139 @@ -120782,14 +115117,12 @@ 544f4e494a41 544f4e494447 544f4e494341 -544f4e494331 544f4e49424a 544f4e49414b 544f4e493738 544f4e493330 544f4e493231 544f4e493130 -544f4e475545 544f4e47454e 544f4e455931 544f4e45544f @@ -120815,11 +115148,8 @@ 544f4d4f544f 544f4d4f534f 544f4d4f4f54 -544f4d4f4b4f 544f4d4f4441 -544f4d4d5954 544f4d4d594e -544f4d4d594c 544f4d4d5946 544f4d4d5938 544f4d4d4f34 @@ -120852,9 +115182,7 @@ 544f4d424f42 544f4d424f31 544f4d42414b -544f4d41544f 544f4d415449 -544f4d415445 544f4d415441 544f4d415348 544f4d415346 @@ -120877,7 +115205,6 @@ 544f4d333333 544f4d313935 544f4d313538 -544f4d313233 544f4d313137 544f4d313031 544f4d303632 @@ -120965,11 +115292,9 @@ 544f44443633 544f44443434 544f44443335 -544f44443333 544f44443136 544f44443134 544f44443030 -544f44415931 544f4441524f 544f43544943 544f43524f44 @@ -120977,7 +115302,6 @@ 544f434f434b 544f434b4559 544f43485445 -544f43485445 544f4348494b 544f43484933 544f42595431 @@ -120994,7 +115318,6 @@ 544f42593037 544f42593032 544f42534f4e -544f424c4552 544f42495553 544f42494e42 544f42494532 @@ -121008,7 +115331,6 @@ 544f42424559 544f42414b4b 544f41535432 -544f41535431 544f414e5556 544f414d4e41 544f414c4449 @@ -121016,7 +115338,6 @@ 544f41443639 544f41443535 544f41443434 -544f41443132 544f41443130 544f39593435 544f39383535 @@ -121030,7 +115351,6 @@ 544f30475545 544e5455494f 544e54544342 -544e54544342 544e54534558 544e54383939 544e54383838 @@ -121205,7 +115525,6 @@ 544954574348 544954555347 544954555333 -544954545953 544954545459 544954545453 544954545449 @@ -121237,14 +115556,10 @@ 5449544f3130 5449544f3034 5449544f3031 -5449544f3030 -5449544d414e -5449544d414e 5449544c4f56 5449544c4953 5449544c4559 544954494e4f -544954494e45 544954494d4f 544954494c4f 544954494c45 @@ -121257,7 +115572,6 @@ 544954414e5a 544954414e4f 544954414e4e -544954414e45 544954414e41 544954413334 544954413330 @@ -121266,7 +115580,6 @@ 544954313233 544953544953 544953544947 -544953534f54 544953484135 544953434845 544953434841 @@ -121283,12 +115596,10 @@ 544952495053 54495247454c 544952455831 -544952454431 544952415031 544952414e54 544952414e4f 544950554c41 -544950544f50 544950535531 544950505935 544950505933 @@ -121299,7 +115610,6 @@ 5449504f5558 544950495341 5449502d454e -544950444f47 54494f4e544f 54494f474153 54494f313132 @@ -121330,7 +115640,6 @@ 54494e4b3034 54494e495459 54494e49544f -54494e43414e 54494e425553 54494e424f59 54494e424143 @@ -121340,7 +115649,6 @@ 54494e413932 54494e413839 54494e413737 -54494e413639 54494e413635 54494e413535 54494e413455 @@ -121350,7 +115658,6 @@ 54494e413133 54494e413130 54494e413032 -54494e413031 54494e413030 54494e313634 54494d585858 @@ -121364,7 +115671,6 @@ 54494d4f5341 54494d4f4e32 54494d4f4c41 -54494d4f4841 54494d4e4548 54494d4d594e 54494d4d594d @@ -121373,7 +115679,6 @@ 54494d4d4944 54494d4d4931 54494d4d4559 -54494d4d4552 54494d4d424f 54494d4d4158 54494d4b4141 @@ -121399,7 +115704,6 @@ 54494d42554b 54494d424f59 54494d424f54 -54494d424f31 54494d424131 54494d415331 54494d414c45 @@ -121417,7 +115721,6 @@ 54494d324e50 54494d313939 54494d313534 -54494d313233 54494d313131 54494c5a4954 54494c545550 @@ -121435,7 +115738,6 @@ 54494c4c5935 54494c4c4953 54494c4c4553 -54494c4c4552 54494c49434f 54494c455353 54494c455231 @@ -121459,8 +115761,6 @@ 544947525241 544947524943 544947524537 -544947524531 -54494752414e 544947523832 5449474d4f52 544947494459 @@ -121479,9 +115779,6 @@ 54494745524b 544947455248 544947455244 -544947455238 -544947455235 -544947455234 544947444c4f 544947415244 544947314552 @@ -121492,12 +115789,9 @@ 544946414e49 544945545241 544945534841 -544945525241 -5449454e4441 5449454e4441 5449454b4559 544945484552 -544945474552 544945445945 544945444f4d 544945314f4e @@ -121518,7 +115812,6 @@ 5449434b5331 5449434b4c4a 5449434b4945 -5449434b4552 544943484f55 544943484154 544943453031 @@ -121535,11 +115828,8 @@ 544942455432 544942455421 544942425953 -544942424152 544941524554 -5449414e4e41 5449414e4449 -5449414d4154 5449414d4144 544941474f35 544941444f47 @@ -121569,7 +115859,6 @@ 5448554d4241 5448554d4235 5448554d4231 -5448554d4231 5448554d3634 544855474747 544855474545 @@ -121582,32 +115871,24 @@ 5448524f5732 5448524f4253 5448524f4242 -5448524f4231 -5448524f4154 -5448524f4154 544852455354 544852454554 544852454547 544852454536 -544852454536 544852415858 -544852415348 544852304154 544850524f50 54484f555345 54484f554e47 54484f544835 54484f544831 -54484f525045 54484f524f4e -54484f524e53 54484f524d58 54484f524553 54484f524245 54484f524131 54484f523935 54484f523839 -54484f523639 54484f523635 54484f523437 54484f523333 @@ -121615,8 +115896,6 @@ 54484f523137 54484f523136 54484f523134 -54484f4e4753 -54484f4e4731 54484f4e3936 54484f4d5650 54484f4d5053 @@ -121645,7 +115924,6 @@ 5448494e4e45 5448494e4b45 5448494e4b34 -5448494e4753 5448494e4453 5448494d4d59 5448494d4149 @@ -121653,8 +115931,6 @@ 5448494a4446 544849484149 544849475245 -544849474853 -544849474853 544849455645 544849455253 544849454e45 @@ -121668,14 +115944,12 @@ 544847544759 544847495744 544847495257 -544847494e4b 544846554a59 5448455a4f45 544845594c4c 544845574f4f 544845574f4c 54484557494c -54484557484f 544845574549 544845564950 544845555341 @@ -121696,7 +115970,6 @@ 544845524f33 544845524f32 544845524d41 -544845524d41 54484552494f 544845524553 544845524546 @@ -121733,7 +116006,6 @@ 5448454c4f54 5448454c4d45 5448454c4545 -5448454c4157 5448454c4142 5448454b4152 5448454a4153 @@ -121744,7 +116016,6 @@ 54484548554c 544845484f50 544845484954 -544845484950 54484547594d 54484547555a 544845475554 @@ -121758,8 +116029,6 @@ 54484546414e 54484546414d 544845455945 -544845454e44 -544845454e44 544845454d50 544845454854 544845445231 @@ -121769,7 +116038,6 @@ 544845444541 54484544414d 544845434c45 -544845434152 544845424f44 544845424f42 544845424843 @@ -121777,7 +116045,6 @@ 54484542454e 544845424541 544845424159 -544845424154 544845424152 544845423930 544845415845 @@ -121793,7 +116060,6 @@ 544843414e4e 544842424254 544842415247 -544841594e45 544841555445 544841544d45 544841544755 @@ -121804,12 +116070,10 @@ 5448414e5953 5448414e5941 5448414e5853 -5448414e4b53 5448414d4552 5448414d4249 5448414c4c4f 5448414c4c49 -5448414c4941 5448414b4944 5448414b4152 544841494841 @@ -121844,8 +116108,6 @@ 54474f435041 54474e534e4d 54474d545641 -54474d545641 -54474d545641 54474d54474d 544749463639 5447484e4236 @@ -121884,10 +116146,8 @@ 54455844454c 544558424554 544558415337 -544558415335 544558414e4f 544558414753 -54455841434f 544558313233 5445564c4556 544556495250 @@ -121896,14 +116156,10 @@ 544554554441 544554554245 54455455414e -54455453554f 544554524f43 -544554524953 544554524150 544554524135 544554524132 -5445544f4e53 -5445544f4e41 5445544f4e31 5445544f4d4e 5445544c3145 @@ -121915,13 +116171,11 @@ 544554453231 544554415332 544553553632 -544553545858 544553545454 544553545353 544553544f4e 544553544945 544553544559 -544553544553 544553544541 544553544343 544553544152 @@ -121940,11 +116194,8 @@ 544553535341 544553534f4e 54455353494e -544553534945 -544553534945 544553534855 54455353454e -54455353414e 54455353414a 544553534142 544553534135 @@ -121965,7 +116216,6 @@ 544552554341 54455254494f 544552544553 -544552544552 544552534f4e 544552534131 544552525956 @@ -121989,7 +116239,6 @@ 544552524154 54455252414c 544552524134 -544552524131 544552523052 544552505353 544552505333 @@ -122027,7 +116276,6 @@ 544552354f52 544552313233 544552313131 -54455155494c 544551464553 544550554c49 544550544550 @@ -122069,7 +116317,6 @@ 54454e445241 54454e444f55 54454e444f52 -54454e444552 54454e434f4d 54454e415241 54454d505432 @@ -122078,7 +116325,6 @@ 54454d504f32 54454d504c49 54454d504531 -54454d504531 54454d503435 54454d503432 54454d503338 @@ -122101,7 +116347,6 @@ 54454c54454b 54454c504152 54454c4f4956 -54454c4e4554 54454c4d4143 54454c4c4954 54454c4c454d @@ -122124,7 +116369,6 @@ 54454b52414d 54454b4e4958 54454b4c4131 -54454b4b454e 54454b494b41 54454b484e45 54454b484544 @@ -122142,7 +116386,6 @@ 5445494a494e 54454947414e 544548554953 -54454852414e 544548505738 544548504f54 544548414e49 @@ -122158,7 +116401,6 @@ 544545544853 544545544832 544545544831 -544545544831 5445454f4e41 5445454e5931 5445454e4553 @@ -122169,10 +116411,8 @@ 5445454e3132 5445454d554c 5445454d5531 -5445454c4545 5445454b4545 5445454b4148 -5445454a4159 544545464552 544545463032 54454545454e @@ -122189,12 +116429,10 @@ 544544455553 544544455345 544544445947 -544544445942 544544445939 544544445935 544544444f47 544544444949 -544544444931 544544444444 544544434154 544544393931 @@ -122210,7 +116448,6 @@ 5445434e4941 5445434e3734 5445434d4f31 -544543484e4f 54454348434f 544543483935 544543483930 @@ -122235,9 +116472,6 @@ 544541545245 544541544552 544541534553 -544541504f54 -544541504f54 -5445414e4e41 5445414e4155 5445414d5550 5445414d5232 @@ -122254,7 +116488,6 @@ 5445414c3039 5445414b4552 544541474945 -54454147414e 544541444f47 544541434835 544541434834 @@ -122353,7 +116586,6 @@ 544252435435 544252313147 54424f4f4b53 -54424f4e4553 54424f4e4545 54424f4e4536 54424f4e4534 @@ -122365,15 +116597,12 @@ 54424c495353 54424c494e4b 54424c414952 -54424c41434b 544249595442 544249524437 544249524436 -544249524431 545f42495244 5442494e4341 544248545141 -544248545141 544246535558 544245504b58 544243544243 @@ -122392,7 +116621,6 @@ 544231363233 544231323234 544230303635 -54415a5a5a5a 54415a5a4d4f 54415a5a3435 54415a5a3434 @@ -122433,7 +116661,6 @@ 5441574e5931 544157494148 54415745454c -544157414e41 5441564f3238 544156495432 544156494332 @@ -122475,7 +116702,6 @@ 544154455255 544154455232 544154453636 -544154424f59 544154415941 544154415449 544154415345 @@ -122495,7 +116721,6 @@ 544153544945 544153544943 544153544532 -544153544531 544153535931 544153534552 544153533535 @@ -122511,7 +116736,6 @@ 544153484139 544153484138 544153484134 -544153484132 544153484121 544153434845 544153414d49 @@ -122531,7 +116755,6 @@ 544152524f4e 544152524553 54415252454e -544152504f4e 5441524f434b 5441524e4f57 5441524e4943 @@ -122541,13 +116764,10 @@ 5441524d414b 5441524c4f53 5441524c4143 -5441524b494e 5441524b4153 -544152495441 544152495141 544152495135 544152494e41 -544152494e41 54415247554d 54415247494d 54415247414e @@ -122574,14 +116794,12 @@ 544152413139 544152413136 544152413135 -544152413132 544152413131 544152413032 544152384b41 544151554c49 54415054554e 544150505953 -5441504f5554 5441504f5449 5441504f344b 544150495331 @@ -122602,7 +116820,6 @@ 54414f49534d 54414f323031 54414f313233 -54414e5a454e 54414e594154 54414e59414e 54414e59414a @@ -122617,15 +116834,12 @@ 54414e593133 54414e564952 54414e555348 -54414e554b49 54414e554a41 54414e554741 54414e545249 -54414e545241 54414e544f4e 54414e544f4d 54414e544f36 -54414e54414c 54414e534559 54414e534155 54414e53414e @@ -122651,7 +116865,6 @@ 54414e4a414d 54414e4a4144 54414e4a4132 -54414e4a4131 54414e4a3031 54414e495348 54414e495241 @@ -122659,7 +116872,6 @@ 54414e494153 54414e49414c 54414e494137 -54414e494131 54414e484149 54414e475549 54414e474f4d @@ -122671,7 +116883,6 @@ 54414e473030 54414e454841 54414e45414c -54414e445931 54414e43484f 54414e434841 54414e415441 @@ -122694,7 +116905,6 @@ 54414d553832 54414d553732 54414d553030 -54414d54414d 54414d534841 54414d534558 54414d504943 @@ -122712,12 +116922,10 @@ 54414d4d5939 54414d4d5937 54414d4d5936 -54414d4d4945 54414d4d454c 54414d4d4154 54414d4c594e 54414d495a48 -54414d495941 54414d494e47 54414d494d49 54414d494a4f @@ -122740,13 +116948,11 @@ 54414d415941 54414d415341 54414d415249 -54414d415241 54414d415231 54414d414c41 54414d414b49 54414d41474f 54414d414445 -54414d414441 54414d343031 54414d333231 54414c5a3552 @@ -122773,10 +116979,7 @@ 54414c494141 54414c455348 54414c455331 -54414c455331 54414c455241 -54414c424f54 -54414c424f54 54414c424f31 54414c424552 54414c415342 @@ -122800,7 +117003,6 @@ 54414b415741 54414b415441 54414b414f35 -54414b414b4f 54414b414b41 54414b414a4f 54414b41484f @@ -122813,16 +117015,13 @@ 54414a454a55 54414a44554d 54414a414441 -54414957414e 544149564153 54414953544f 544149534b41 54414953494b 544149534945 54414953484f -54414953484f 54414952494e -54414950414e 5441494e5431 5441494e494b 5441494e4154 @@ -122831,19 +117030,16 @@ 5441494d4544 5441494c5334 5441494c5331 -5441494c5331 5441494c4c4f 5441494c4152 5441494b4141 544149484c4f 544149455249 544149434f4d -544149434849 544149313233 544148555449 544148544f4f 544148524952 -5441484f4d41 5441484f4b41 5441484f4532 5441484e4545 @@ -122851,7 +117047,6 @@ 544148414d41 544148395337 544147545041 -544147545041 544147524944 5441474c4941 544147495241 @@ -122867,7 +117062,6 @@ 544147373737 544146534141 544146465938 -544146465931 544146463035 544146415249 544146415241 @@ -122886,10 +117080,8 @@ 544144414d53 544144313233 544143554d41 -5441434f5353 5441434f5334 5441434f4f4e -5441434f4d41 5441434f4c41 5441434f4553 5441434f4245 @@ -122917,13 +117109,9 @@ 5441424f5231 5441424d4f57 5441424d414e -5441424c4553 -5441424c4553 5441424c4541 5441424c4534 544142495448 -544142495448 -544142495441 544142494a49 544142455231 544142425943 @@ -123029,7 +117217,6 @@ 543131313131 5431304b3238 54313039364a -543059305441 5430534a5231 543050483352 543050443047 @@ -123056,7 +117243,6 @@ 535a4154414e 535a4152494b 535a41424144 -53595a594759 5359584d5048 535958445053 535955524549 @@ -123088,12 +117274,10 @@ 53594e43524f 53594e41414c 53594d50484f -53594d424f4c 53594d42414c 53594d424131 53594d303130 53594c56494f -53594c564149 53594c563230 53594c563132 53594c563030 @@ -123145,9 +117329,7 @@ 535749534853 535749524c31 5357494e4734 -5357494e4731 5357494d4d4d -5357494d4552 5357494d3538 5357494d3131 535749474f31 @@ -123165,7 +117347,6 @@ 535745505453 5357454e4a41 5357454d5045 -5357454c4c31 535745455a59 53574545544d 53574545544b @@ -123175,13 +117356,11 @@ 535745455059 535745455032 535745454e45 -53574544454e 535745415454 535744394955 535743554c42 5357434d5641 535741544841 -535741544348 535741543838 535741543744 535741543535 @@ -123200,7 +117379,6 @@ 5357414d5049 5357414d5039 5357414d4953 -5357414d4931 5357414c5348 5357414c3931 535741494e53 @@ -123241,9 +117419,6 @@ 53564944454f 535649415441 535647475653 -535645544b41 -535645544b41 -53564554494b 53564554414e 53564554414c 535645544147 @@ -123266,7 +117441,6 @@ 535641543039 535641535449 535641525441 -535641444241 535641315543 535637373737 535631393939 @@ -123278,15 +117452,11 @@ 535631343836 535631323035 535631313730 -53555a5a4945 53555a593939 53555a593037 -53555a554b41 53555a554b31 53555a553034 53555a494553 -53555a494551 -53555a494551 53555a494547 53555a494544 53555a494532 @@ -123306,7 +117476,6 @@ 535556415250 535556414b4f 535555534a45 -535554544f4e 5355544e4f50 535554483939 535554434143 @@ -123319,7 +117488,6 @@ 5355534d414e 5355534d4147 5355534c494e -5355534c494b 5355534c4943 5355534b554e 5355534b4d45 @@ -123327,7 +117495,6 @@ 535553494d41 535553494542 535553494533 -535553494531 535553485341 535553484939 535553484934 @@ -123339,11 +117506,7 @@ 535553414e56 535553414e4f 535553414e4a -535553414e41 -535553414e39 -535553414e37 535553414e36 -535553414e32 535553413531 535553413231 535553413131 @@ -123351,7 +117514,6 @@ 53555256454e 535552553031 535552535552 -535552524559 53555252414d 5355524f5852 5355524e4953 @@ -123378,7 +117540,6 @@ 535552414d45 535552413132 535552313233 -535552313233 535550534f4e 53555052494d 535550524139 @@ -123389,11 +117550,6 @@ 5355504f4e47 53555045525a 535550455255 -535550455253 -535550455242 -535550455234 -535550455233 -535550455232 535550455230 53555045522a 535550415249 @@ -123422,10 +117578,7 @@ 53554e52554e 53554e524558 53554e524544 -53554e4e5953 53554e4e594b -53554e4e5944 -53554e4e5936 53554e4e4e4e 53554e4e4558 53554e4e4154 @@ -123463,7 +117616,6 @@ 53554e303037 53554d54494c 53554d534152 -53554d4f4e41 53554d4f4655 53554d4f3939 53554d4d4547 @@ -123501,15 +117653,12 @@ 53554c444f47 53554c414e47 53554c414b45 -53554c41434f 53554b524d43 -53554b52414d 53554b4b4954 53554b4b4152 53554b4a494e 53554b495355 53554b48554d -53554b484f49 53554b415459 53554b414141 53554b413333 @@ -123531,23 +117680,19 @@ 535547475331 535547474945 535547425547 -535547415253 53554741524d 535547415242 535547415236 -535547415231 535547415230 535547313339 53554659414e 5355464c4554 5355464a414e 53554649534d -535546464552 535546414e53 53554559454b 53554556415a 535545535345 -535545535345 535545534a45 535545534543 53554553414d @@ -123577,7 +117722,6 @@ 5355434b5741 5355434b4f4e 5355434b4c45 -5355434b4954 5355434b4949 5355434b4553 5355434b4141 @@ -123590,7 +117734,6 @@ 535543485553 535543484554 535543484545 -535543455353 535543454544 53554341534f 535543415341 @@ -123608,9 +117751,7 @@ 535542504f50 5355424d5554 5355424d4f57 -5355424d4954 5355424b4944 -53554249544f 535542494d45 535542494154 535542494153 @@ -123634,7 +117775,6 @@ 535541564535 535541564532 535541554a42 -53554152455a 535541444553 535535375742 535534344544 @@ -123644,19 +117784,14 @@ 535531574549 535531393938 53545a544942 -53545a544942 535459583939 535459583133 535459555241 5354594e4553 -5354594d4945 -5354594c5553 5354594c4f36 5354594c4f31 5354594c4c41 -5354594c455a 5354594c4554 -5354594c4553 5354594c454c 5354594c4544 5354594c4535 @@ -123676,19 +117811,15 @@ 5354554e5431 5354554e4f44 5354554e4e45 -5354554d5059 5354554d504f 5354554d5045 -5354554d5031 5354554d424f 5354554b4f56 535455474759 53545546465a -535455464659 535455464639 535455454259 535455453736 -535455445331 535455443939 535455443636 535455443632 @@ -123698,10 +117829,8 @@ 535455443138 535455443030 535455434b4f -53545543434f 535455424f54 53545542454e -535455424259 53545542424c 535455424242 535455344b41 @@ -123728,20 +117857,17 @@ 5354524f4e41 5354524f4d4d 5354524f484c -5354524f434b 5354524e3030 535452495441 53545249505a 535452495050 535452495031 535452494e45 -535452494b45 535452494b31 5354523f4554 535452455053 535452454c45 535452454954 -535452454554 535452415953 53545241574e 535452415459 @@ -123751,7 +117877,6 @@ 535452415345 53545241504f 535452415045 -535452414e44 535452414e31 535452414b45 53545241494b @@ -123765,7 +117890,6 @@ 535452304b45 535450505453 535450313433 -535450313233 53544f594e5a 53544f574539 53544f555453 @@ -123779,7 +117903,6 @@ 53544f524d58 53544f524d52 53544f524d4f -53544f524d31 53544f524d30 53544f524b37 53544f52454e @@ -123809,7 +117932,6 @@ 53544f4e4538 53544f4e4535 53544f4e4533 -53544f4e4532 53544f4d5045 53544f4d5041 53544f4d5031 @@ -123851,14 +117973,12 @@ 53544a415254 535449575258 53544956414e -535449544348 535449524b41 535449504545 535449504532 5354494e4b54 5354494e4b49 5354494e4b33 -5354494e4b31 5354494e4752 5354494e4736 5354494e4733 @@ -123878,10 +117998,7 @@ 535449474745 535449473031 535449464a45 -535449464659 535449464649 -535449434b53 -535449434b53 535449434b49 535449434b37 535449434b36 @@ -123897,21 +118014,15 @@ 535445575959 535445575931 535445574559 -535445574559 535445574544 -535445574152 535445565939 535445564f5a 535445564f53 535445564e53 535445564953 535445564941 -535445564553 535445564549 535445564538 -535445564535 -535445564532 -535445564530 53544556424f 53544554414e 53544553534f @@ -123919,7 +118030,6 @@ 53544553414e 53544552545a 535445524e4e -535445524e45 535445524c4f 535445524b41 535445505059 @@ -123929,7 +118039,6 @@ 535445504839 535445504838 535445504836 -535445504836 535445504833 535445503130 535445503031 @@ -123952,7 +118061,6 @@ 535445494e53 535445494e4e 535445494e41 -535445494e31 53544548414c 535445473031 535445464b41 @@ -123968,7 +118076,6 @@ 535445454c5a 535445454c58 535445454c57 -535445454c31 535445454348 535445454253 535445453232 @@ -123978,7 +118085,6 @@ 53544542454c 535445423639 53544541524e -535445414d59 535445414c49 535445414c31 535445363733 @@ -124014,10 +118120,8 @@ 535441544532 535441544156 535441543143 -535441535941 535441535353 535441534f56 -53544153494b 535441534932 535441534839 535441534741 @@ -124035,25 +118139,21 @@ 535441525441 535441525437 535441525434 -535441525434 535441525341 535441525337 535441525336 53544152532a 535441525254 -535441525252 535441525249 535441525245 535441525233 535441524f4e 535441524d45 535441524c43 -535441524c41 535441524b49 535441524a4a 53544152494f 53544152474f -53544152474f 535441524731 535441524552 535441523937 @@ -124061,12 +118161,10 @@ 535441523930 535441523833 535441523739 -535441523737 535441523734 535441523732 535441523731 535441523730 -535441523639 535441523537 535441523532 535441523331 @@ -124075,7 +118173,6 @@ 535441523039 535441523038 535441523037 -535441523034 535441505059 535441504831 535441504553 @@ -124086,7 +118183,6 @@ 5354414e4e4e 5354414e4e49 5354414e4e45 -5354414e4b53 5354414e4b4f 5354414e4b49 5354414e4b45 @@ -124097,7 +118193,6 @@ 5354414e4745 5354414e4741 5354414e454b -5354414e4431 5354414e3939 5354414e3937 5354414e3332 @@ -124105,9 +118200,6 @@ 5354414e3136 5354414e3039 5354414e3032 -5354414e3031 -5354414d5053 -5354414d5045 5354414d494e 5354414c5445 5354414c4f56 @@ -124117,10 +118209,7 @@ 5354414c4c49 5354414c4b53 5354414c4953 -5354414c494e -5354414c4559 5354414c4552 -5354414b414e 535441494e31 535441484c31 535441484341 @@ -124277,7 +118366,6 @@ 535331383035 535331373237 535331373031 -535331343838 535331333133 535331315353 535331313638 @@ -124348,11 +118436,8 @@ 535155455354 535155454b59 535155415731 -535155415731 -535155415245 535155414435 535155414433 -535155414431 5351544e3345 535143383538 535143373733 @@ -124363,7 +118448,6 @@ 535059444545 535059444532 535059443352 -53505943414d 535059424f54 535059343230 535057435343 @@ -124391,7 +118475,6 @@ 5350524f5544 5350524f5353 5350524f4e4b -5350524f4e4b 5350524f4e47 5350524e5631 535052494747 @@ -124406,8 +118489,6 @@ 53504f583935 53504f574552 53504f545931 -53504f545459 -53504f545359 53504f545359 53504f545353 53504f545259 @@ -124420,7 +118501,6 @@ 53504f543130 53504f543038 53504f543031 -53504f525459 53504f525435 53504f525433 53504f525430 @@ -124428,7 +118508,6 @@ 53504f52414e 53504f4f5431 53504f4f5059 -53504f4f4e53 53504f4f4e45 53504f4f4e41 53504f4f4e32 @@ -124440,12 +118519,10 @@ 53504f4e5445 53504f4e4e45 53504f4e4b59 -53504f4e4745 53504f4c4b45 53504f4b4559 53504f4b4531 53504f494e4b -53504f494c54 53504f474c59 53504f454b4f 53504f434b37 @@ -124462,8 +118539,6 @@ 53504c494e4b 53504c494653 53504c494631 -53504c45454e -53504c415432 53504c415432 53504c415431 53504c414d31 @@ -124481,7 +118556,6 @@ 535049543636 535049543635 535049543031 -535049524f53 535049524f51 535049524554 535049524158 @@ -124497,24 +118571,17 @@ 5350494e3237 5350494c4c4c 5350494c4c33 -5350494b4553 -5350494b4552 -5350494b4552 5350494b454e 5350494b454a 535049464646 535049464631 535049455253 535049454c42 -535049444559 535049443639 535049443359 535049435932 535049434b31 -535049434559 -535049434552 53504943414e -535048455245 535048314e58 535047535047 535047383838 @@ -124538,14 +118605,11 @@ 535045454e41 535045454544 535045454452 -53504545444f 535045454445 535045454430 535045444e41 535045443334 535045435441 -535045415253 -535045415253 53504541524f 535045415234 535045313737 @@ -124561,7 +118625,6 @@ 5350415a3232 5350415a3137 535041574e4e -535041574e31 535041574152 535041544552 53504154454c @@ -124574,7 +118637,6 @@ 535041525445 535041525345 535041524b5a -535041524b53 53504152474f 535041524259 535041523838 @@ -124589,11 +118651,9 @@ 5350414e4731 5350414e3435 5350414d5331 -5350414d4d59 5350414d4954 5350414d3838 5350414d3834 -5350414d3639 5350414d3432 5350414d3333 5350414c4953 @@ -124604,13 +118664,10 @@ 535041474a52 535041464f4e 535041443133 -535041434559 535041434558 -535041434552 53504143454f 535041434538 535041434537 -535041434532 53504141545a 5350395a5a41 535035313130 @@ -124636,7 +118693,6 @@ 535031393734 535031303030 535030304e53 -535030304b59 534f5a49414c 534f59534f59 534f59534558 @@ -124657,13 +118713,11 @@ 534f56413132 534f555a4153 534f555a4131 -534f5558494e 534f55544847 534f55544843 534f55544835 534f55544834 534f55544442 -534f55544442 534f55535349 534f55524f55 534f55524945 @@ -124714,13 +118768,11 @@ 534f534d414e 534f5349534b 534f53494131 -534f53413231 534f53363636 534f53353535 534f53323335 534f53303037 534f53303030 -534f52544544 534f52525959 534f524f4e47 534f524f4b49 @@ -124753,7 +118805,6 @@ 534f50474f44 534f50415341 534f50313233 -534f4f545931 534f4f544855 534f4f544552 534f4f543132 @@ -124776,7 +118827,6 @@ 534f4e594142 534f4e593930 534f4e593838 -534f4e593639 534f4e593638 534f4e593637 534f4e593435 @@ -124799,7 +118849,6 @@ 534f4e4f5249 534f4e4f5245 534f4e4f4e45 -534f4e4f4d41 534f4e4f4449 534f4e4e5957 534f4e4e5937 @@ -124814,7 +118863,6 @@ 534f4e4a4142 534f4e494b58 534f4e49444f -534f4e494353 534f4e494351 534f4e49434b 534f4e494348 @@ -124845,7 +118893,6 @@ 534f4d493934 534f4d464157 534f4d455841 -534f4d455253 534f4d455241 534f4d455231 534f4d455057 @@ -124859,8 +118906,6 @@ 534f4c543232 534f4c535246 534f4c52414b -534f4c524143 -534f4c524143 534f4c4f5645 534f4c4f5441 534f4c4f5249 @@ -124880,7 +118925,6 @@ 534f4c4f3231 534f4c4f3031 534f4c4f3030 -534f4c4e5a45 534f4c4e4f4b 534f4c4d4f4e 534f4c4c5931 @@ -124900,16 +118944,12 @@ 534f4c455331 534f4c454e4f 534f4c454a50 -534f4c45494c 534f4c444f55 -534f4c444552 534f4c415253 534f4c415243 -534f4c415241 534f4c414e53 534f4c414e44 534f4c414c53 -534f4c414345 534f4c343939 534f4c313837 534f4b4f4f4c @@ -124979,7 +119019,6 @@ 534f434a4845 534f4349554d 534f43494d49 -534f4349414c 534f43455552 534f43433352 534f43415441 @@ -125001,7 +119040,6 @@ 534f41443132 534f31323334 534e5a4e4d43 -534e59444552 534e59323237 534e57544e51 534e57425244 @@ -125020,8 +119058,6 @@ 534e55424241 534e55414853 534e54544342 -534e54544342 -534e54544342 534e54534e54 534e54494e43 534e54445653 @@ -125058,15 +119094,11 @@ 534e4f525453 534e4f525431 534e4f525249 -534e4f524b59 534e4f524b31 534e4f524431 534e4f505053 534e4f4f5757 -534e4f4f5049 -534e4f4f4b53 534e4f4f4b49 -534e4f4f4b31 534e4f4f4753 534e4f4c494e 534e4f494c31 @@ -125079,14 +119111,12 @@ 534e4d4e4557 534e4d313233 534e4c313233 -534e49504553 534e494f5053 534e494b4441 534e49475552 534e49474759 534e4947454c 534e49464631 -534e49434b53 534e49434b45 534e49434b32 534e49424f52 @@ -125099,7 +119129,6 @@ 534e45505045 534e454a5654 534e45474f4d -534e45474f4b 534e45474952 534e4547344c 534e45464631 @@ -125142,15 +119171,12 @@ 534d55564542 534d55545541 534d55545431 -534d55545431 534d55544c59 534d5554454b 534d55543939 -534d55543639 534d55543232 534d55534d55 534d55525431 -534d55524659 534d55524649 534d55524637 534d55524635 @@ -125162,11 +119188,9 @@ 534d55474759 534d55463639 534d55453132 -534d55444745 534d55434b31 534d54533244 534d54434335 -534d53544242 534d53424f42 534d53373737 534d50574d59 @@ -125186,16 +119210,9 @@ 534d4f4b5933 534d4f4b5553 534d4f4b4f53 -534d4f4b494e -534d4f4b494e -534d4f4b4945 -534d4f4b4559 -534d4f4b4553 534d4f4b4549 -534d4f4b4544 534d4f4b4537 534d4f4b4533 -534d4f4b4531 534d4f4b314e 534d4f474759 534d4f443133 @@ -125204,16 +119221,13 @@ 534d4a423836 534d4a334246 534d4954524f -534d49544853 534d49544852 534d4954484d 534d49544848 534d49544847 -534d49544847 534d49544843 534d49544836 534d49544835 -534d49544832 534d49544531 534d49534d49 534d49523330 @@ -125221,7 +119235,6 @@ 534d494c494b 534d494c454d 534d494c454b -534d494c4535 534d49474d41 534d49464653 534d49464646 @@ -125240,7 +119253,6 @@ 534d4554494d 534d4554414e 534d45525431 -534d45525348 534d45524659 534d454c4f56 534d454c4c4c @@ -125277,8 +119289,6 @@ 534d414d4559 534d414c4c46 534d414c4c32 -534d414c4c31 -534d414c4c31 534d414c4543 534d414b5930 534d414b3232 @@ -125327,7 +119337,6 @@ 534c594d414e 534c594d4143 534c594b4154 -534c59464f58 534c5652544e 534c56413732 534c55545454 @@ -125357,7 +119366,6 @@ 534c52544142 534c50544d54 534c50534c50 -534c4f574c59 534c4f57494e 534c4f574545 534c4f56494e @@ -125366,7 +119374,6 @@ 534c4f544832 534c4f544552 534c4f534831 -534c4f505059 534c4f504f4b 534c4f4f5348 534c4f4f5031 @@ -125390,7 +119397,6 @@ 534c4b313233 534c495a4f56 534c49574b41 -534c49564552 534c49545459 534c49544859 534c49505049 @@ -125398,7 +119404,6 @@ 534c49504b41 534c49503838 534c494f4348 -534c494e4b59 534c494e4b4f 534c494e494f 534c494e4742 @@ -125408,7 +119413,6 @@ 534c494d5331 534c494d4c59 534c494d4a49 -534c494d4552 534c494d3939 534c494d3938 534c494d3638 @@ -125416,8 +119420,6 @@ 534c494d3130 534c494b4552 534c49474f33 -534c49444553 -534c49444552 534c49444545 534c49444539 534c49444532 @@ -125427,18 +119429,13 @@ 534c49434b38 534c49434b35 534c49434b30 -534c49434553 -534c49434531 534c484f524f 534c47534c47 -534c45555448 534c45504f49 534c454d4143 534c45474e41 -534c45455645 534c45455050 534c45455033 -534c45455031 534c45454857 534c45444f4d 534c4544414b @@ -125449,10 +119446,7 @@ 534c41594d45 534c41593032 534c41583338 -534c41564b41 534c41564958 -534c4156494b -534c41564553 534c4156454b 534c41564537 534c41564536 @@ -125462,9 +119456,6 @@ 534c41564139 534c41564138 534c41564135 -534c41544552 -534c41544552 -534c41534831 534c41524745 534c41504954 534c41503232 @@ -125506,7 +119497,6 @@ 534c31313135 534b59564552 534b59544f4d -534b59534b59 534b59534b49 534b59534558 534b59504947 @@ -125558,7 +119548,6 @@ 534b52553054 534b52494d47 534b52303030 -534b51545a41 534b4f553639 534b4f545459 534b4f545449 @@ -125629,13 +119618,11 @@ 534b494c5453 534b494c4f4e 534b494a4554 -534b49494e47 534b49494949 534b49455353 534b49445331 534b49444c59 534b49444552 -534b4942554d 534b49424f59 534b49363636 534b49315050 @@ -125646,7 +119633,6 @@ 534b45544552 534b454d5053 534b454d4531 -534b454c4c59 534b454c4c53 534b454c4c49 534b45495448 @@ -125657,21 +119643,17 @@ 534b45424145 534b44343842 534b43554253 -534b4156454e 534b41545445 534b41544f52 -534b41544553 534b4154454e 534b41544537 534b41544536 -534b41544531 534b41543233 534b41525645 534b41525459 534b41524245 534b414e545a 534b414e4b5a -534b414e4b31 534b414e4452 534b414e4445 534b414c4c49 @@ -125712,7 +119694,6 @@ 534a484f5241 534a48313233 534a46515542 -534a4546454e 534a44503131 534a44484b53 534a43534a43 @@ -125772,13 +119753,11 @@ 534954453031 534954415245 534954415236 -534953544552 53495354415a 534953544148 534953543231 534953535959 534953535939 -534953535931 534953535359 534953534f55 534953534143 @@ -125843,7 +119822,6 @@ 53494e4f4b4f 53494e4f4249 53494e4e4e4e -53494e4e4544 53494e4e414e 53494e4b4c45 53494e4b3333 @@ -125860,10 +119838,8 @@ 53494e47414c 53494e455759 53494e454446 -53494e454144 53494e445931 53494e444558 -53494e444545 53494e444241 53494e43494c 53494e415448 @@ -125885,20 +119861,16 @@ 53494d503734 53494d4f5345 53494d4f4f4c -53494d4f4e53 53494d4f4e52 53494d4f4e4b 53494d4f4e34 53494d4d5332 -53494d4d4f4e 53494d4d414d 53494d4d4144 53494d494c49 53494d494b45 53494d484137 53494d455953 -53494d454f4e -53494d454f4e 53494d434f53 53494d434f4d 53494d434f31 @@ -125931,8 +119903,6 @@ 53494c4c5959 53494c4c594b 53494c4c5947 -53494c4c5942 -53494c4c5931 53494c4c4f4e 53494c4c4c59 53494c4c4947 @@ -125974,7 +119944,6 @@ 5349474f3031 5349474e5932 5349474e5553 -5349474e494e 5349474e4552 5349474e4531 5349474d554e @@ -125983,7 +119952,6 @@ 5349474d4150 5349474d4138 5349474d4135 -5349474c4552 534947495442 534947474931 534947474552 @@ -125993,13 +119961,10 @@ 534947313233 534946553432 53494652454e -534945535441 534945524154 534945524131 534945504945 -5349454e4e41 5349454e4153 -5349454e4131 5349454d5052 534945474544 53494547414c @@ -126034,7 +119999,6 @@ 534943383835 534942554e41 534942544f4d -5349424c4559 534942424945 53494242414c 534942414449 @@ -126058,7 +120022,6 @@ 5348594c4545 5348594c414b 53485949414e -534859475559 534859474952 534859414d41 534859414d31 @@ -126079,10 +120042,7 @@ 534855553836 53485554494b 534855544552 -534855534855 534855524f42 -53485552494b -53485552494b 534855524141 534855505059 5348554e5055 @@ -126107,7 +120067,6 @@ 53485547414c 534855474148 534855444153 -534855434b53 534855434b41 534855424841 534855424259 @@ -126179,7 +120138,6 @@ 53484f4f4559 53484f4e4e59 53484f4e4445 -53484f4e4441 53484f4e4153 53484f4e4149 53484f4d4b4e @@ -126193,10 +120151,8 @@ 53484f455332 53484f453132 53484f444f57 -53484f44414e 53484f434b59 53484f434b41 -53484f434b31 53484f425241 53484f424c41 53484f424148 @@ -126215,14 +120171,12 @@ 53484d4f4f32 53484d4f4553 53484d49434b -53484d49434b 53484d454545 53484d414c31 53484d414749 53484c554841 53484c4f5a32 53484c4f5045 -53484c4f4d4f 53484c46414e 53484b415041 53484b414646 @@ -126236,7 +120190,6 @@ 53484956454e 534849564141 534849564137 -534849564131 534849564130 534849545359 534849545355 @@ -126267,15 +120220,12 @@ 5348494f5259 5348494e4d41 5348494e4b55 -5348494e4b41 -5348494e4a49 5348494e4945 5348494e484f 5348494e474c 5348494e4535 5348494e4534 5348494e4459 -5348494e444f 5348494e4441 5348494e3535 5348494e3035 @@ -126296,13 +120246,10 @@ 5348494b494e 5348494b414b 534849493639 -53484948414e 534849484142 -534849465459 534849465433 534849464552 534849455641 -534849454c44 534849454453 534849434849 534849434152 @@ -126321,16 +120268,12 @@ 53484556414e 534845535445 53484553534f -534845525249 -534845525249 534845525241 534845525231 534845524953 -534845524946 534845524945 534845524944 534845524937 -534845524545 534845524241 53484552414e 534845524148 @@ -126358,7 +120301,6 @@ 5348454c4c38 5348454c4c35 5348454c4c32 -5348454c4c31 5348454c4553 5348454c454d 5348454c4547 @@ -126371,11 +120313,9 @@ 534845494241 53484548414e 534845464641 -534845455a59 534845455a41 534845455641 534845455454 -534845455453 534845455434 534845455237 534845455033 @@ -126384,7 +120324,6 @@ 534845454859 534845454550 534845454459 -534845454459 53484545424f 534845444f57 534845444459 @@ -126396,7 +120335,6 @@ 534845424f4f 534845424137 534845424135 -534845424131 534845415659 534845413134 534845313233 @@ -126407,7 +120345,6 @@ 5348415a3233 534841595959 534841594e49 -534841594e41 534841594c49 534841594553 534841594531 @@ -126429,14 +120366,10 @@ 534841564954 534841564559 534841564553 -534841564552 -534841564544 -534841564544 53484156414e 534841564131 534841554e4f 534841554e4a -534841554e41 534841554e35 534841545a49 534841545a45 @@ -126456,14 +120389,11 @@ 534841524f4c 534841524c4f 534841524c49 -534841524b59 534841524b41 534841524b36 -534841524b36 534841524b33 534841524953 534841524950 -534841524946 534841524943 534841524437 534841524154 @@ -126488,10 +120418,8 @@ 5348414e544f 5348414e5437 5348414e4e55 -5348414e4e4f 5348414e4e45 5348414e4b55 -5348414e4b53 5348414e4b4c 5348414e4b33 5348414e4954 @@ -126502,12 +120430,9 @@ 5348414e474c 5348414e454a 5348414e4541 -5348414e4537 5348414e4535 5348414e4534 5348414e4530 -5348414e4449 -5348414e4449 5348414e415a 5348414e4159 5348414e414b @@ -126516,17 +120441,11 @@ 5348414e3134 5348414e3035 5348414d4f56 -5348414d4f4f 5348414d4945 5348414d4931 5348414d4545 -5348414d4531 -5348414d4152 -5348414d414e 5348414d3132 5348414c594e -5348414c554e -5348414c4f4d 5348414c4e41 5348414c4c4f 5348414c4c31 @@ -126538,9 +120457,6 @@ 5348414c454e 5348414c4545 5348414c304d -5348414b5552 -5348414b5552 -5348414b4b41 5348414b4942 5348414b4941 5348414b454d @@ -126548,7 +120464,6 @@ 5348414b4548 5348414b4539 5348414b4532 -5348414b4131 5348414b3639 534841495241 534841494e49 @@ -126607,14 +120522,12 @@ 534831393639 534831393634 534830525459 -534830525459 534830333230 534755593336 53475554494b 534755505441 53475452454c 5347544d5450 -5347544d414a 5347544a494d 53475442444f 534754423639 @@ -126641,7 +120554,6 @@ 53464f4e4143 53464f435553 53464c545541 -53464c545541 53464c4f3435 53464b313935 53464a334932 @@ -126667,7 +120579,6 @@ 534559554342 534559544f4e 53455952414e -5345594d5552 5345594d414d 534559415244 534559413030 @@ -126675,7 +120586,6 @@ 534558595352 534558595348 534558594d49 -534558594d45 534558594b31 534558594953 534558594552 @@ -126694,12 +120604,10 @@ 534558593335 534558593332 534558593238 -534558593231 534558593135 534558593035 534558593033 534558585932 -534558585931 534558584949 534558584559 534558584544 @@ -126730,21 +120638,16 @@ 534558414343 534558413334 534558393131 -534558373737 -534558363636 534558353132 534558343639 534558343230 534558333231 534558333032 534558323331 -534558323232 534558313039 534558303032 534558303030 534557534557 -534557454c4c -534557415244 534557414e55 534557323334 53455656454e @@ -126754,13 +120657,8 @@ 5345564b4131 534556494e39 534556455253 -53455645524e -53455645524e -534556455245 -534556455231 534556455231 534556454e55 -534556454e53 534556454e44 53455643494b 534556414441 @@ -126768,7 +120666,6 @@ 534555544849 5345554c4156 534555434845 -534554555031 534554544154 5345544f4e31 5345544d414c @@ -126788,7 +120685,6 @@ 534554414242 534554363130 534554313538 -534554313233 534553554a31 53455354524f 53455353554d @@ -126809,32 +120705,26 @@ 534553414d4d 534553414d49 534553414d32 -534553414d31 534552594741 53455258494f 53455257414e 534552574141 534552564f31 534552564554 -534552564552 -53455256414c 534552555553 534552545955 53455254454b 534552543130 534552543030 -534552534552 534552524f54 534552524f53 534552524941 -53455252414e 534552504f4e 53455250494c 5345524f5445 5345524f4a41 5345524e494b 5345524e4941 -5345524d4f4e 5345524d4554 5345524d4152 5345524d414e @@ -126844,7 +120734,6 @@ 534552494e4f 534552494b41 534552494b31 -534552494553 534552494542 534552494532 53455247594e @@ -126858,11 +120747,9 @@ 53455247454f 53455247454c 53455247454b -53455247454a 534552474546 534552474537 534552474533 -534552474531 534552474154 534552473837 534552473833 @@ -126881,7 +120768,6 @@ 534552455345 534552455332 534552454e4f -534552454741 53455245422e 534552453734 534552445a45 @@ -126892,14 +120778,12 @@ 534552424552 534552415449 534552415053 -534552415048 534552415045 534552414645 534552413639 534552363636 534552313930 534551554f49 -53455155454c 534551415349 534551414737 534550554c54 @@ -126910,14 +120794,12 @@ 534550543236 534550543231 534550543139 -534550543133 534550543130 534550543038 534550543032 534550543031 534550534550 534550504c45 -53455050454c 534550503737 534550503031 534550494445 @@ -126935,7 +120817,6 @@ 53454e59554d 53454e594148 53454e54524f -53454e545241 53454e544f4e 53454e544952 53454e544849 @@ -126944,8 +120825,6 @@ 53454e535553 53454e534949 53454e534853 -53454e534549 -53454e534549 53454e534154 53454e524554 53454e504149 @@ -126974,9 +120853,7 @@ 53454e414b41 53454e414954 53454d59454c -53454d544558 53454d524554 -53454d504552 53454d4f5552 53454d4d4934 53454d4d4553 @@ -127059,7 +120936,6 @@ 534549534f52 5345494e4553 5345494c4136 -5345494b4f31 5345494b454f 53454947454c 534549464645 @@ -127109,7 +120985,6 @@ 534545324954 534545313131 534544524654 -5345444f4e41 5345444f4852 5345444f3132 5345444c4559 @@ -127125,9 +121000,7 @@ 534544343239 534544333241 534543573136 -534543555245 5345434f5941 -5345434f4e44 5345434f4e31 5345434f3433 5345434b5359 @@ -127151,11 +121024,8 @@ 534541544544 534541543930 534541543132 -534541534f4e -534541534941 534541534941 534541534552 -534541524159 534541523131 534541505550 53454150524f @@ -127186,7 +121056,6 @@ 5345414e3134 5345414e3032 5345414d5953 -5345414d5553 5345414d4f4e 5345414d4531 5345414d4153 @@ -127203,7 +121072,6 @@ 5345414a4159 534541475559 534541474c45 -534541444f47 534541444858 534541434159 534541433057 @@ -127224,7 +121092,6 @@ 534456323731 534455504552 534454483233 -534453445344 534453323831 5344524f5753 53444f4f4c46 @@ -127288,29 +121155,19 @@ 5343524f5353 5343524f4f54 5343524f4f4c -5343524f4c4c 5343524f4747 534352495448 534352494d41 -534352494245 -534352455731 -53435245454e -53435245414d 534352414753 534352343344 534352335755 53435233414d 534351414542 -53434f555453 53434f55544d -53434f555345 -53434f545453 53434f545450 -53434f54544f 53434f54544e 53434f545446 53434f545441 -53434f544941 53434f544552 53434f543938 53434f543031 @@ -127320,18 +121177,14 @@ 53434f524535 53434f524533 53434f524532 -53434f524531 53434f504552 53434f4f5a49 -53434f4f5445 53434f4f5431 -53434f4f5059 53434f4f5032 53434f4f484c 53434f4f4759 53434f4f425a 53434f4f4245 -53434f4f4241 53434f4d494e 53434f4d4245 53434f4d4153 @@ -127348,19 +121201,16 @@ 53434c414e54 53434a424f47 534349545241 -53434950494f 5343494f544f 5343494f5441 53434946494c 534349415041 -534348574152 534348574131 534348573134 534348554e4b 534348554d4d 534348554d41 534348554c50 -534348554845 534348554552 534348554348 534348524549 @@ -127380,20 +121230,16 @@ 5343484d4f4c 5343484d4158 5343484c554d -5343484c4550 5343484c4545 -534348495a4f 534348495741 534348495454 53434849524d 534348495249 534348494e4b 534348494c41 -534348494646 534348494552 534348455249 534348455245 -534348454e4b 534348454e47 534348454e32 534348454953 @@ -127403,7 +121249,6 @@ 534348454255 53434841554d 534348415544 -53434841545a 534348414e5a 534348414e53 534348414152 @@ -127424,7 +121269,6 @@ 534341525553 534341525252 534341525053 -534341524559 534341524531 534341524241 534341523231 @@ -127438,7 +121282,6 @@ 5343414d5045 5343414d5032 5343414d434f -5343414c4553 5343414c4552 534341443738 534341424241 @@ -127518,23 +121361,17 @@ 534159534841 534159524531 5341594c4552 -5341594c4552 5341594c454d 53415949414e -534159414e47 534159414e31 534158584f4e 534158574158 534158544158 5341584f4e52 5341584f4e46 -5341584f3131 5341584e4f54 -5341584d414e -5341584d414e 5341575a4157 534157594f55 -534157594552 534157575757 534157534545 534157533132 @@ -127560,14 +121397,12 @@ 534156454c4c 53415645454e 534156454444 -534156454431 534156453132 534156415448 534156415353 534156415341 534156415331 534156414e48 -534156414e41 534156413230 534156333435 534155564531 @@ -127579,30 +121414,24 @@ 5341554c3834 534155474552 534155444941 -534155444941 534155444553 534155443133 534155435931 534155343237 5341545a3931 53415459524f -53415459414d 534154545932 534154544552 53415454454c -53415454454c 53415454414e 53415450414d 53415450414c 5341544f5259 -5341544f5249 5341544f4549 5341544f3338 5341544d4159 534154494e35 -534154485941 53415445524e -534154434831 534154415332 534154415241 534154414e4e @@ -127615,35 +121444,24 @@ 53415354524f 534153545241 534153535959 -534153535953 -534153535953 -534153535931 -534153534945 -534153534945 53415353454c 534153534545 534153534152 534153504b46 5341534f5259 -5341534f5249 5341534d414e 5341534d4143 5341534b5941 5341534b4159 534153494e45 534153494e41 -534153484f4b 534153484f31 534153484941 534153484553 53415348415a 534153484158 -534153484153 534153484150 534153484146 -534153484137 -534153484135 -534153484132 534153483233 534153483131 53415341554c @@ -127670,7 +121488,6 @@ 5341524f4e47 5341524f4d41 5341524e4941 -5341524e4941 5341524e4552 5341524c4956 5341524c4553 @@ -127683,7 +121500,6 @@ 53415249414f 534152475553 534152474f53 -534152474f4e 534152474945 534152474841 53415247454e @@ -127702,10 +121518,7 @@ 534152414e31 534152414b31 534152414953 -534152414858 -53415241484a 534152414846 -534152414842 534152414631 534152414556 534152414259 @@ -127722,7 +121535,6 @@ 534151574544 534151415249 534150504945 -534150504552 5341504f4e45 5341504d414e 534150495441 @@ -127753,7 +121565,6 @@ 53414e544549 53414e544543 53414e544531 -53414e54414e 53414e544141 53414e544136 53414e544132 @@ -127781,13 +121592,10 @@ 53414e4b4131 53414e4a594f 53414e4a5555 -53414e4a4f53 -53414e4a4f53 53414e4a4954 53414e4a4545 53414e4a414c 53414e4a4131 -53414e495441 53414e494e41 53414e494441 53414e494341 @@ -127800,11 +121608,9 @@ 53414e474149 53414e465241 53414e46495a -53414e445953 53414e445952 53414e44594c 53414e44594b -53414e445943 53414e445939 53414e445930 53414e44544f @@ -127816,10 +121622,7 @@ 53414e44494a 53414e444949 53414e444946 -53414e444945 -53414e444931 53414e444553 -53414e444552 53414e44454e 53414e444459 53414e44424f @@ -127857,15 +121660,12 @@ 53414d54454c 53414d544547 53414d534952 -53414d53414d 53414d524f4e 53414d524544 53414d505241 53414d505049 -53414d505041 53414d505031 53414d504f4e -53414d504f31 53414d504f30 53414d504954 53414d504559 @@ -127878,22 +121678,15 @@ 53414d4f5245 53414d4f4f4f 53414d4f4a41 -53414d4f4854 -53414d4f4854 53414d4f4841 53414d4f4153 -53414d4d5959 -53414d4d5959 53414d4d5958 53414d4d594f 53414d4d594c -53414d4d594b -53414d4d5937 53414d4d5921 53414d4d4d33 53414d4d4954 53414d4d4953 -53414d4d4931 53414d4d454c 53414d4d4145 53414d4d3031 @@ -127908,8 +121701,6 @@ 53414d4a574d 53414d495941 53414d495352 -53414d495241 -53414d495241 53414d495231 53414d494f4e 53414d494c59 @@ -127918,7 +121709,6 @@ 53414d494741 53414d494553 53414d49414e -53414d49414d 53414d493535 53414d493031 53414d48414d @@ -127929,17 +121719,12 @@ 53414d455252 53414d454c59 53414d45474f -53414d454552 53414d454548 -53414d454449 53414d453437 53414d453132 -53414d444f47 53414d444144 53414d425552 53414d42554b -53414d424f59 -53414d424f59 53414d424f52 53414d424f4e 53414d424f45 @@ -127949,23 +121734,18 @@ 53414d42414d 53414d42414c 53414d424137 -53414d424131 53414d423132 53414d415454 53414d415355 53414d41524f -53414d415241 53414d415041 53414d414e4e 53414d414d45 53414d414c41 53414d414b41 53414d414a41 -53414d41454c -53414d414449 53414d414449 53414d414441 -53414d373737 53414d363536 53414d343536 53414d333435 @@ -127980,7 +121760,6 @@ 53414d313234 53414d313131 53414d303132 -53414d303031 53414c593639 53414c574154 53414c574148 @@ -128016,7 +121795,6 @@ 53414c4c5956 53414c4c5952 53414c4c5950 -53414c4c594d 53414c4c5947 53414c4c5944 53414c4c5939 @@ -128024,13 +121802,11 @@ 53414c4c5937 53414c4c5935 53414c4c5934 -53414c4c5932 53414c4c5930 53414c4c4554 53414c4c4553 53414c4c4552 53414c4c4548 -53414c4c4545 53414c4c4531 53414c4c4150 53414c4c4148 @@ -128047,7 +121823,6 @@ 53414c455332 53414c454d32 53414c454556 -53414c45454d 53414c453033 53414c444154 53414c434544 @@ -128084,22 +121859,18 @@ 53414a414d41 53414a414b37 53414a313633 -53414959414e 534149544f48 53414954414e 53414954414d 53414952414e 534149524133 5341494e545a -5341494e5436 5341494e5435 5341494e5432 5341494e494e 5341494e4149 5341494d4141 -5341494d4141 5341494d4131 -5341494c4552 5341494c4544 5341494c3939 5341494c3637 @@ -128107,7 +121878,6 @@ 5341494b414c 534149474552 534149464552 -53414944494e 534149444941 534149444153 534149444152 @@ -128148,7 +121918,6 @@ 534147453135 534147453133 534147415231 -53414741504f 534147414e53 534147414e34 534147414c41 @@ -128193,7 +121962,6 @@ 534144494538 534144494536 534144494534 -534144494531 534144494341 534144494153 534144485553 @@ -128201,12 +121969,10 @@ 534144465344 534144454356 534144453132 -534144444c45 534144444951 534144444545 534144444159 534144444152 -53414444414d 534144414e41 534144414d41 534144414653 @@ -128214,8 +121980,6 @@ 534144373737 534143534143 534143524f53 -534143524544 -534143524544 5341434d4544 5341434c4153 5341434b4b53 @@ -128226,7 +121990,6 @@ 534143484f4e 534143484b41 53414348494b -53414348494b 534143484931 534143484552 53414348454e @@ -128238,7 +122001,6 @@ 534142554b41 534142554849 534142553031 -534142524553 534142524148 534142524131 5341424f4e47 @@ -128250,7 +122012,6 @@ 534142495441 534142494e4f 534142494e4b -534142494e45 534142494c41 534142494b33 53414249454e @@ -128408,7 +122169,6 @@ 525952593939 525952543534 52595242414e -52594f554b4f 52594f4f4b49 52594f4d594f 52594f4b4f4d @@ -128432,7 +122192,6 @@ 525944455242 525944455237 525943484531 -525943484531 52594345525a 525942434941 5259414e5353 @@ -128457,7 +122216,6 @@ 5259414e3331 5259414e3238 5259414e3230 -5259414e3135 5259414e3130 5259414e3037 5259414e3033 @@ -128528,7 +122286,6 @@ 5255544c4552 525554494c41 525554494b41 -525554484945 525554484552 525554483736 525554483630 @@ -128545,18 +122302,15 @@ 525553545947 525553545943 525553545941 -525553545935 525553545934 525553545930 525553544f53 525553544552 525553544545 -52555354414d 525553535552 525553534f53 525553534f32 525553534b59 -525553534941 525553534731 52555353454b 525553534545 @@ -128593,7 +122347,6 @@ 525553353535 525553323132 525553313234 -525553313233 525553303037 5255524f554e 525552454144 @@ -128602,7 +122355,6 @@ 525550504931 52555050454e 525550455348 -525550455254 525550455232 525550454553 525550414e33 @@ -128644,7 +122396,6 @@ 52554c4c455a 52554c4c4553 52554c4c454e -52554c455a5a 52554c455a38 52554c455858 52554c453632 @@ -128658,14 +122409,11 @@ 525549544552 5255494e4d4e 5255484c4552 -525547524154 5255474f5341 -5255474d414e 5255474c4144 525547474c45 525547474259 525547455234 -525547455231 525547425959 52554655535a 525546555350 @@ -128675,7 +122423,6 @@ 525546555330 5255464e4552 5255464d4152 -52554646494e 525546463833 525546463132 525546463031 @@ -128707,7 +122454,6 @@ 525544434b46 525544393234 5255435a414a -5255434b4552 5255434b3739 525543484b49 525543484949 @@ -128746,7 +122492,6 @@ 525542454e50 525542454e41 525542454e39 -525542454e31 525542454c37 525542453639 525542424c59 @@ -128876,15 +122621,12 @@ 525330363130 525259444552 525258544742 -525258544742 -525258544742 525258515643 525254545252 525254454d48 525254454348 525252545454 525252535353 -525252525252 525252525236 5252524f5343 5252524f434b @@ -128992,9 +122734,7 @@ 524f59424c45 524f5942414c 524f59414c57 -524f59414c53 524f59414c47 -524f59414c31 524f59303639 524f5859554b 524f58593838 @@ -129011,32 +122751,25 @@ 524f58494539 524f58455454 524f58415331 -524f58414e41 524f57574d4d 524f574c414e 524f57494e41 524f57455253 524f57455231 -524f57445931 524f57444545 524f57414e32 524f5653454e 524f5649474f 524f56455241 -524f56455231 524f55544559 524f55544538 524f55544442 -524f55544442 -524f55544442 524f55543636 -524f55524b45 524f554e4436 524f554e4433 524f55484931 524f55474854 524f55474853 -524f55474831 524f55465553 524f55464153 524f55444f55 @@ -129044,10 +122777,8 @@ 524f5542414e 524f54545931 524f54544f4e -524f5454454e 524f54524f54 524f54504152 -524f544f544f 524f544f5255 524f544f5236 524f544f4e44 @@ -129060,15 +122791,12 @@ 524f54475554 524f54433831 524f54415348 -524f54415259 524f54414731 524f54413636 524f53593534 524f5354554b 524f53545241 -524f53544f56 524f53544f4e -524f5354494b 524f5354414d 524f53535441 524f53535241 @@ -129093,20 +122821,17 @@ 524f534b3939 524f53494f31 524f53494558 -524f53494553 524f53494550 524f5349454f 524f5349454d 524f5349454b 524f53494548 524f53494542 -524f53494531 524f53494441 524f5347494c 524f53455645 524f53455441 524f53455335 -524f53455331 524f53454d59 524f53454c59 524f53454c49 @@ -129114,7 +122839,6 @@ 524f53454545 524f5345434f 524f53454343 -524f53454255 524f5345414e 524f5345414c 524f53453935 @@ -129137,7 +122861,6 @@ 524f53434152 524f53425544 524f5341544f -524f53415249 524f53414c42 524f53414952 524f53413938 @@ -129163,7 +122886,6 @@ 524f4f544d45 524f4f544641 524f4f544553 -524f4f544552 524f4f544545 524f4f543838 524f4f543836 @@ -129183,9 +122905,7 @@ 524f4f4b3938 524f4f4b3737 524f4f4b3232 -524f4f465553 524f4f465331 -524f4f464945 524f4f464544 524f4f444f4f 524f4f444c45 @@ -129196,13 +122916,11 @@ 524f4e525253 524f4e4f4335 524f4e4e5948 -524f4e4e5931 524f4e4e4f52 524f4e4e4931 524f4e4e3534 524f4e4d4343 524f4e4d414c -524f4e4b4953 524f4e4a4131 524f4e495431 524f4e495348 @@ -129238,10 +122956,8 @@ 524f4d594d52 524f4d594348 524f4d573751 -524f4d554c4f 524f4d55414c 524f4d505553 -524f4d504552 524f4d504154 524f4d4f5649 524f4d4f4e4f @@ -129270,8 +122986,6 @@ 524f4d415334 524f4d414e5a 524f4d414e58 -524f4d414e53 -524f4d414e53 524f4d414e4b 524f4d414e44 524f4d414e38 @@ -129299,11 +123013,9 @@ 524f4d373737 524f4d363233 524f4d313232 -524f4c53454e 524f4c4f4c4f 524f4c4f3139 524f4c4c4953 -524f4c4c494e 524f4c4c454e 524f4c4c4243 524f4c494e45 @@ -129311,7 +123023,6 @@ 524f4c493031 524f4c464945 524f4c463031 -524f4c455831 524f4c455331 524f4c455050 524f4c414944 @@ -129341,7 +123052,6 @@ 524f48494e41 524f48494d41 524f48415151 -524f47554553 524f47554537 524f474f5a41 524f474f4a41 @@ -129349,7 +123059,6 @@ 524f474c4f56 524f47495348 524f47474f52 -524f47455253 524f47455248 524f47455237 524f47455230 @@ -129379,57 +123088,44 @@ 524f444e494e 524f444e4153 524f444e4143 -524f444d414e 524f444b4554 524f44494e53 524f44494e4e 524f44494b41 524f44494a53 -524f44494341 524f44494249 524f44493535 524f44484d47 524f44455552 -524f44454f53 524f44454f33 524f44454f32 -524f44454e54 524f44454c41 -524f44444552 524f44424f4c 524f44415045 524f4441484e 524f435a454b 524f43524943 524f43515545 -524f434f5244 524f434b5a31 524f434b594e 524f434b594a 524f434b5943 524f434b5941 -524f434b5935 -524f434b5930 524f434b5645 524f434b5553 524f434b4f4f -524f434b4f4e 524f434b4b53 -524f434b494e 524f434b4645 -524f434b4559 524f434b444a 524f434b434b 524f434b4154 524f434b3932 524f434b3835 524f434b3830 -524f434b3736 524f434b3732 524f434b3638 524f434b3537 524f434b3531 -524f434b3531 524f434b3435 524f434b3434 524f434b3432 @@ -129446,7 +123142,6 @@ 524f43484131 524f43464f52 524f43455331 -524f43434f53 524f43434f52 524f43434f44 524f43434f34 @@ -129466,7 +123161,6 @@ 524f42544d32 524f42544545 524f42535545 -524f42534f4e 524f4253414d 524f42524f58 524f42524153 @@ -129491,13 +123185,9 @@ 524f4249544f 524f42494e59 524f42494e50 -524f42494e41 524f42494e38 -524f42494e32 524f42494532 524f4248494c -524f42455254 -524f42455254 524f42455253 524f42455252 524f4245524f @@ -129512,7 +123202,6 @@ 524f42424f59 524f42424f32 524f4242494b -524f4242454e 524f42424545 524f42424242 524f42423636 @@ -129529,11 +123218,9 @@ 524f42343138 524f42323036 524f42313930 -524f42313233 524f42303030 524f41445931 524f41445353 -524f41444945 524f41443939 524f41443639 524f41443636 @@ -129602,7 +123289,6 @@ 524c57524c57 524c53313233 524c52544142 -524c52544142 524c504f4c4f 524c504e5354 524c50303235 @@ -129630,7 +123316,6 @@ 524b2e544446 524b52415553 524b51545a41 -524b51545a41 524b4f363139 524b4f313233 524b4c494e45 @@ -129673,8 +123358,6 @@ 524a52454544 524a5243524b 524a50545941 -524a50545941 -524a50545941 524a5053484d 524a50464646 524a50425946 @@ -129701,8 +123384,6 @@ 524a48504559 524a484a544c 524a484a5246 -524a484a4b4d -524a48494559 524a48474543 524a48464b4b 524a4845594c @@ -129765,7 +123446,6 @@ 5249545a3639 524954555348 524954544f4e -524954544552 52495454454c 5249544f4e41 52495445494b @@ -129806,12 +123486,10 @@ 524952495249 524950535441 524950535256 -524950524950 524950504f4e 52495050454e 52495050454c 5249504d4158 -5249504b454e 52495048454e 524950464947 524950454f4e @@ -129832,10 +123510,8 @@ 52494e4f4153 52494e4f3231 52494e4c4157 -52494e4b4552 52494e4b454c 52494e474f32 -52494e474f31 52494e474f30 52494e474d45 52494e47494c @@ -129849,7 +123525,6 @@ 52494d4d4141 52494d4d4131 52494d4c494e -52494d4a4f42 52494d444947 52494d413638 52494c594e4e @@ -129875,9 +123550,7 @@ 52494b494b49 52494b493132 52494b455236 -52494b455231 52494b453330 -52494b415244 52494b413032 52494b353535 52494b323031 @@ -129889,7 +123562,6 @@ 524947485438 524947484945 524947474954 -524947474552 524947473031 524947454c34 524947415941 @@ -129912,19 +123584,15 @@ 524945424552 52494456414e 5249444f5554 -5249444c4559 524944474944 -524944455253 524944455234 52494445454d 524944453639 524944453235 524944453132 524944444e50 -524944444c45 524944444c41 524944444943 -524944444552 524943545553 524943544552 524943535445 @@ -129951,7 +123619,6 @@ 5249434b5938 5249434b5934 5249434b5933 -5249434b5931 5249434b5930 5249434b524f 5249434b4f31 @@ -129960,7 +123627,6 @@ 5249434b4953 5249434b4949 5249434b4931 -5249434b4559 5249434b454e 5249434b4545 5249434b4154 @@ -130000,18 +123666,14 @@ 524943453032 524943434f31 52494343494d -524943415244 524943313330 524943303630 524942533936 524942524942 5249424d414e 524942494341 -524942455945 -524942455259 524942455259 524942455249 -524942424f4e 524942414c4b 524942414b31 524938383334 @@ -130045,16 +123707,12 @@ 52484f4d454f 52484f444f53 52484f444f31 -52484f444553 52484f44454e 52484f415245 52484e545741 52484b45494d 52484a565246 -52484a495246 -5248494e4f53 5248494e4f35 -5248494e4f31 5248494e4553 5248484c3936 524848415244 @@ -130166,7 +123824,6 @@ 5246484e4549 5246484b4a43 5246484a5946 -524648474a44 524648465842 524648465246 524648464446 @@ -130187,7 +123844,6 @@ 52455a5a414e 52455a564f56 52455a4f4f4e -52455a4e4f52 52455a4a4a4d 52455a495354 52455a494e41 @@ -130218,7 +123874,6 @@ 524558323334 524558323037 524558313433 -524558313233 524558313131 524557574552 52455751415a @@ -130232,7 +123887,6 @@ 5245564f4c55 5245564d414e 5245564c5543 -5245564c4f4e 524556495354 524556494552 524556484a43 @@ -130246,7 +123900,6 @@ 524556333630 524556333231 524556323130 -524556313233 524556313035 52455542414e 52455459504f @@ -130268,16 +123921,11 @@ 5245544e4156 5245544d4f43 5245544d414e -5245544c4157 -524554495245 52455445524e 524554455039 -524554455031 524554454944 524554434f50 524554415346 -524554415244 -52455441494c 524554414548 524554375241 524554363636 @@ -130303,7 +123951,6 @@ 524553424f59 524553415545 524553415246 -524552554e31 5245524b4631 524552494348 524552463535 @@ -130318,7 +123965,6 @@ 52455241524f 524552413344 524551554950 -52455155494e 52455155414c 524551444656 5245505a4b41 @@ -130336,7 +123982,6 @@ 5245504f5345 5245504f3639 5245504d5544 -5245504d5246 5245504d414e 5245504c494b 5245504c4943 @@ -130362,7 +124007,6 @@ 52454e4f3231 52454e4e4e4f 52454e4e4953 -52454e4e4945 52454e4e4944 52454e4e454e 52454e4e454c @@ -130396,7 +124040,6 @@ 52454d533735 52454d524146 52454d504954 -52454d4f5445 52454d4f4e45 52454d4f4e44 52454d4f4e41 @@ -130419,12 +124062,10 @@ 52454d494b4f 52454d494553 52454d454b31 -52454d454459 52454d45444f 52454d454449 52454d434f4d 52454d434f32 -52454d41524b 52454d41504f 52454d414e44 52454d41494e @@ -130439,7 +124080,6 @@ 52454c574f48 52454c574f42 52454c534541 -52454c4f4144 52454c4c5953 52454c4c5542 52454c4c4f57 @@ -130453,19 +124093,14 @@ 52454c454e54 52454c454545 52454c454531 -52454c415831 52454c414e31 52454c414b41 52454c313131 52454b545441 -52454b545441 -52454b545441 52454b544f52 -52454b53494f 52454b52414d 52454b4f4c41 52454b4e4157 -52454b4c4157 52454b494e35 52454b484153 52454b434550 @@ -130525,7 +124160,6 @@ 524547495441 524547495342 524547475931 -524547474944 524547474552 524547455850 524547454e4e @@ -130534,7 +124168,6 @@ 524547414c32 52454741494e 524547373831 -524547313233 524546555445 524546554749 524546524947 @@ -130557,7 +124190,6 @@ 5245454e4153 5245454c494e 5245454c4141 -524545464552 524545463939 524545445834 52454544555a @@ -130592,7 +124224,6 @@ 524544524942 524544524941 524544524558 -524544524544 524544524159 524544524150 52454452414e @@ -130624,25 +124255,19 @@ 524544494e41 52454449434b 524544494345 -524544484f54 524544475441 524544474958 524544474150 52454446524f -524544464f58 -524544464f58 524544464c59 52454446414e 524544455249 524544445953 -524544444552 524544444545 524544444544 524544443936 524544443635 524544435744 -524544434154 -524544424f59 524544424f42 524544424d57 524544424952 @@ -130676,9 +124301,7 @@ 524544353035 524544345834 524544343538 -524544343536 524544343530 -524544343434 524544343334 524544343135 524544333630 @@ -130688,10 +124311,8 @@ 524544333234 524544333137 524544333033 -524544323436 524544323431 524544323235 -524544323232 524544323133 524544313939 524544313938 @@ -130701,12 +124322,9 @@ 52454359434c 524543555252 524543545553 -52454354554d 524543534152 524543524538 5245434f5254 -5245434f5244 -5245434f5244 5245434f4e49 5245434f4e45 5245434f4e36 @@ -130720,7 +124338,6 @@ 524543485453 524543484557 524543465246 -524543455353 524543455054 524543424f59 524543415053 @@ -130732,20 +124349,13 @@ 524542534f50 52454252494b 524542524546 -5245424f4f47 5245424f4f42 5245424f4e47 5245424c4545 5245424a5242 524542473433 524542455236 -524542454c4c -524542454c4c 524542454c33 -524542454c32 -524542454c31 -524542454343 -524542454341 524542425954 524542425552 524542425542 @@ -130763,7 +124373,6 @@ 5245414c5245 5245414c4d35 5245414c4d32 -5245414c4c59 5245414c4c4c 5245414c4954 5245414c4941 @@ -130778,7 +124387,6 @@ 5245414c3030 5245414b4552 524541474c45 -52454147414e 524541474139 524541474138 524541474135 @@ -130848,7 +124456,6 @@ 524357303037 524355544945 524354594543 -52435459425a 524354454348 524353483334 524352414947 @@ -130895,12 +124502,10 @@ 52424f334741 52424e465946 52424b4d4842 -52424b4b5448 52424b303037 524248545444 524248545141 524248524248 -524248424b4b 524248413759 524245434341 524243524652 @@ -130912,8 +124517,6 @@ 524243494e43 524243463535 524243463133 -524243454b5a -524243454b5a 52424345435a 524242494731 524242424242 @@ -130930,7 +124533,6 @@ 524231323632 524231323334 52415a5a4c59 -52415a5a4c45 52415a5a4552 52415a54415a 52415a4f5236 @@ -130957,7 +124559,6 @@ 5241594f4635 5241594e414c 5241594e4145 -5241594d4f4e 5241594d4552 5241594d4531 5241594d4153 @@ -130969,7 +124570,6 @@ 5241594b4159 52415949544f 524159475559 -52415947554e 524159444159 524159434f4e 524159434154 @@ -130992,11 +124592,9 @@ 524157584d4c 524157523434 5241574c4552 -524157444f47 524157363636 524157363139 524157313233 -524157313233 52415656454e 52415653414e 5241564d414e @@ -131028,7 +124626,6 @@ 524155414731 524154554e41 524154544f4e -524154544c45 524154544954 524154544953 524154544552 @@ -131045,7 +124642,6 @@ 524154524f44 524154504143 5241544f4e31 -5241544f4e31 5241544e494b 5241544e4146 5241544d3131 @@ -131060,7 +124656,6 @@ 524153544953 524153544154 524153544141 -524153544131 524153534552 52415353454e 52415353454c @@ -131070,7 +124665,6 @@ 524153504f50 5241534f4e45 5241534f4c4f -5241534d5553 5241534d414e 5241534c5550 5241534b414c @@ -131110,13 +124704,11 @@ 524150505552 52415050524f 524150504945 -524150504552 524150504146 5241504f5341 5241504d454e 5241504b4159 524150495354 -524150494552 524150484f47 52415048454e 524150484131 @@ -131143,18 +124735,15 @@ 52414e4e454c 52414e4b4f52 52414e4b4c45 -52414e4b494e 52414e4b3639 52414e4b3130 52414e4a4841 52414e494e4f 52414e493238 52414e484546 -52414e474552 52414e474152 52414e473052 52414e45544b -52414e44595a 52414e44594d 52414e445945 52414e445943 @@ -131166,13 +124755,10 @@ 52414e44494e 52414e444943 52414e444152 -52414e44414c -52414e434944 52414e434859 52414e434849 52414e424952 52414d5a494b -52414d5a4553 52414d593433 52414d554b4d 52414d54524b @@ -131180,7 +124766,6 @@ 52414d53494e 52414d534841 52414d534554 -52414d534159 52414d53414d 52414d533238 52414d524154 @@ -131199,7 +124784,6 @@ 52414d4d4d4d 52414d4d454c 52414d4d4152 -52414d4d414e 52414d4c4f57 52414d4c4548 52414d4c4544 @@ -131208,17 +124792,13 @@ 52414d4a4153 52414d4a414d 52414d495941 -52414d495553 52414d494e49 52414d494c53 52414d494c4c 52414d494441 -52414d494441 52414d474d43 -52414d46414e 52414d455931 52414d455745 -52414d455348 52414d455245 52414d454e45 52414d454553 @@ -131237,7 +124817,6 @@ 52414d414e31 52414d414c4c 52414d414c41 -52414d414441 52414d413639 52414d345834 52414d333030 @@ -131246,7 +124825,6 @@ 52414d313031 52414d313030 52414d303031 -52414c504859 52414c504858 52414c504857 52414c50484e @@ -131269,7 +124847,6 @@ 52414c4c4152 52414c494e4b 52414c464945 -52414c464945 52414c464553 52414c463236 52414c455953 @@ -131283,7 +124860,6 @@ 52414a553639 52414a553456 52414a553132 -52414a455348 52414a414e44 52414a414e31 52414a414838 @@ -131308,11 +124884,8 @@ 5241494e4e45 5241494e4953 5241494e494e -5241494e4553 5241494e4545 5241494e4544 -5241494e424f -5241494e424f 5241494e3938 5241494e3838 5241494e3637 @@ -131334,7 +124907,6 @@ 5241494c5741 5241494c5334 5241494a494e -52414948414e 524149445548 524149444752 524149443831 @@ -131410,7 +124982,6 @@ 524145424552 524145333039 5241445a494b -524144554741 524144554355 524144554341 524144525048 @@ -131432,7 +125003,6 @@ 524144494f4d 524144494f48 524144494f43 -524144494f32 524144494b53 524144494552 524144494345 @@ -131440,7 +125010,6 @@ 524144484130 524144464c59 52414446414e -524144454f4e 524144454e31 524144454c4e 524144454b31 @@ -131470,17 +125039,13 @@ 524143483931 52414348334c 524143483135 -524143455258 -524143455253 524143455236 524143455235 -524143455231 524143454954 524143454545 524143453838 524143453737 524143453733 -524143453639 524143453531 524143453334 524143453234 @@ -131595,7 +125160,6 @@ 523139343753 523133363942 52313233344d -523132333435 523132333037 523132303043 523131444745 @@ -131628,7 +125192,6 @@ 515a482d4846 515a474e5042 515a46554f42 -515a46554f42 515a45525459 515a45435758 515a45435442 @@ -131657,7 +125220,6 @@ 515753515753 515752545549 515752515752 -515751575157 515751574552 515751455152 515750515750 @@ -131669,7 +125231,6 @@ 51574553415a 515745525955 515745525954 -515745525459 515745525454 515745525445 515745525439 @@ -131683,13 +125244,10 @@ 515745523434 515745523433 515745523231 -51574551415a 5157454e5445 -515745455751 51574545454e 515745444647 515745415346 -515745415344 515745393837 515745393531 515745373431 @@ -131701,7 +125259,6 @@ 215140572345 515744454544 515743554c42 -515743554c42 5157424e5844 515741584844 515741584343 @@ -131718,7 +125275,6 @@ 515731455254 515731415332 515731393931 -515731323334 515730303030 515656495039 515645525459 @@ -131752,29 +125308,22 @@ 5155494e5459 5155494e5439 5155494e5438 -5155494e5435 5155494e5333 5155494e524f 5155494e4e4b 5155494e4e45 -5155494e4e31 5155494e4541 -5155494e4359 5155494e4348 5155494e4147 5155494e3153 5155494d4552 -5155494d4259 5155494c4c41 5155494c455a 5155494b4b31 515549464645 515549455932 -515549455431 -51554944414d 515549434b34 515549434b32 -515549434b32 515548495350 515545545a41 515545545241 @@ -131788,14 +125337,10 @@ 5155454e4449 5155454e4359 515545455231 -515545455231 -515545454e53 -515545454e42 515545454e41 515545454e37 515545454e36 515545454e30 -515545424543 515545415359 515545313536 5155444d5139 @@ -131807,11 +125352,8 @@ 515541554a42 515541545452 515541534954 -515541534152 -51554152545a 515541525235 515541524b37 -515541524b31 515541524453 515541504157 5155414e5455 @@ -131819,14 +125361,10 @@ 5155414e4b41 5155414e474f 5155414c4c53 -5155414c4954 5155414c4953 5155414c4941 5155414c4855 -5155414b4553 -5155414b4534 515541494c4f -515541494c31 515541445331 515541443838 515541443639 @@ -131846,14 +125384,12 @@ 51535a584157 51535a574158 515359544842 -515359544842 515354454c43 515354415254 515352513252 51534e344d45 515348485147 515348454759 -515345465448 515345445741 515345415744 515345313233 @@ -131881,9 +125417,7 @@ 515151574552 515151525252 515151515757 -515151515131 515151343434 -515151313131 515151303238 515151303030 51514d4f5245 @@ -131898,7 +125432,6 @@ 51505a4d3031 515059484353 5150574f3132 -515056544542 51504f455254 51504d5a414c 51504c543354 @@ -131921,7 +125454,6 @@ 514d53504b48 514d32363531 514c52544142 -514c52544142 514c4f474759 514c494e4b53 514c39363131 @@ -131945,7 +125477,6 @@ 514852535336 51484e545741 51474d545641 -51474d545641 514746313439 514744363238 51474152434f @@ -131966,7 +125497,6 @@ 51454c495a31 51454b553547 51454b545441 -51454b545441 51454850344b 514542454c45 514541445753 @@ -131989,12 +125519,10 @@ 514236564453 514233524757 514232313031 -51415a5a4151 51415a59484e 51415a585345 51415a584445 51415a584331 -51415a575358 51415a575353 51415a575344 51415a57454e @@ -132003,7 +125531,6 @@ 51415a544c57 51415a535745 51415a524656 -51415a51415a 51415a434445 51415a415141 51415a393939 @@ -132074,7 +125601,6 @@ 513251335134 51324f43494d 513233343536 -513157324533 513157323334 5131544f3230 513145335732 @@ -132168,11 +125694,9 @@ 50564752414e 505644585443 5056434f4444 -505642554b42 5056414d3134 505636385330 50555a5a5953 -50555a5a4c45 50555a5a4945 505558583735 505555535359 @@ -132188,7 +125712,6 @@ 505554544533 50555454414e 5055544f5554 -50555449544f 505554495449 505554494e49 50555445524f @@ -132201,21 +125724,17 @@ 505554413639 505554413133 50555359414e -505553535959 505553535954 50555353594b 505553535949 505553535947 505553535943 -505553535930 -505553535359 505553534954 50555353494b 505553533132 5055534b494e 505553494e47 50555348544f -505553484f4b 505553484544 50555348414e 505553455441 @@ -132223,7 +125742,6 @@ 505553414e32 505553333231 505553313233 -5055525a454c 505552535545 505552534559 50555252494e @@ -132238,21 +125756,14 @@ 505552454c59 505552454545 505552454342 -505552445545 -505552444559 505550595445 505550555055 -50555053494b -50555053494b 505550534931 505550534552 505550505959 50555050594b 505550505938 -505550505931 -505550505550 5055504f4b31 -5055504b494e 5055504b4131 505550494b41 505550455231 @@ -132271,7 +125782,6 @@ 50554e4e4552 50554e4b5936 50554e4b5445 -50554e4b5445 50554e4b4932 50554e4b4153 50554e4b3238 @@ -132287,12 +125797,10 @@ 50554d505331 50554d504d45 50554d504b59 -50554d504544 50554d50434f 50554d503533 50554d495441 50554d424153 -50554d424131 50554d415353 50554d413738 50554d413639 @@ -132307,7 +125815,6 @@ 50554c544954 50554c534553 50554c534531 -50554c534531 50554c504945 50554c504552 50554c4c414e @@ -132328,7 +125835,6 @@ 50554b414e47 50554b413139 50554a574e43 -50554a4f4c53 50554a4f4c41 50554a4c4c41 5055484f5641 @@ -132337,22 +125843,16 @@ 505547475359 505547474c45 505547454e54 -505547313036 505546465953 505546465944 -505546465931 50554646494b -505546464552 505546463639 -50554552544f -5055454e5445 505544524f57 505544524554 505544495431 505544474559 505544474534 505544444951 -505544444552 505543505543 5055434b5931 5055434b5532 @@ -132427,7 +125927,6 @@ 505354415253 505354415252 505354415234 -505353575244 505353535353 505353494e47 505352574a56 @@ -132489,7 +125988,6 @@ 50525553494b 505255534841 5052554e4533 -505255495454 505255495449 505255455454 505255444f53 @@ -132509,7 +126007,6 @@ 505252303030 505250454e47 505250415049 -50524f5a4143 50524f585931 50524f585649 50524f584553 @@ -132532,7 +126029,6 @@ 50524f535353 50524f53454b 50524f534536 -50524f524f4b 50524f505249 50524f505053 50524f504b45 @@ -132542,10 +126038,8 @@ 50524f503438 50524f4f4f4f 50524f4f4631 -50524f4e544f 50524f4e4f54 50524f4e4753 -50524f4e4731 50524f4e4531 50524f4e3639 50524f4e3131 @@ -132554,7 +126048,6 @@ 50524f4d4153 50524f4c4958 50524f4c4143 -50524f4b4f50 50524f475453 50524f474759 50524f474554 @@ -132593,7 +126086,6 @@ 50524f343230 50524f333231 50524f323232 -50524f313030 50524f303037 50524e524c5a 50524e4b4e47 @@ -132606,8 +126098,6 @@ 505249594141 505249564f44 505249564544 -505249564154 -505249564154 50524956414c 505249564144 505249545454 @@ -132624,12 +126114,7 @@ 5052494d494e 5052494d4558 5052494d4538 -5052494d4158 -5052494d414c -5052494d4131 505249454e43 -505249444531 -505249434553 505249434552 50524943454c 505249415045 @@ -132644,9 +126129,7 @@ 505245544f52 505245544f36 505245543735 -50524553544f 50524553534f -505245535345 505245534554 505245534131 505245533335 @@ -132658,7 +126141,6 @@ 5052454e4445 5052454d4f31 5052454d4955 -5052454d4955 5052454d4941 5052454d4553 5052454d4552 @@ -132697,10 +126179,8 @@ 5052414d3239 5052414b4f53 5052414b4153 -505241495345 505241495245 505241494153 -505241475545 505241474552 505241444f31 505241444841 @@ -132716,7 +126196,6 @@ 505232564154 505232343036 505232303130 -5052314d5553 505231363137 505230543053 505230535439 @@ -132724,8 +126203,6 @@ 50514d354d38 505131374646 505056544542 -505056544542 -505056544542 505056463336 505055524459 5050554d4131 @@ -132784,7 +126261,6 @@ 504f574e414c 504f5745525a 504f57455246 -504f57444552 504f57343535 504f56455248 504f56434c44 @@ -132796,7 +126272,6 @@ 504f55504f4e 504f554e4433 504f554c4f55 -504f554c414e 504f55474e45 504f55444f47 504f5542454c @@ -132823,7 +126298,6 @@ 504f54313030 504f53545354 504f5354494e -504f53544945 504f53544152 504f53544147 504f53543639 @@ -132831,8 +126305,6 @@ 504f53543434 504f53543137 504f53535935 -504f5353554d -504f5353554d 504f53535453 504f53534f50 504f53534945 @@ -132863,7 +126335,6 @@ 504f52543338 504f52543233 504f52543141 -504f52534348 504f52524954 504f5252415a 504f52504f53 @@ -132874,10 +126345,8 @@ 504f524e5933 504f524e5456 504f524e4f5a -504f524e4f53 504f524e4f41 504f524e4f36 -504f524e4f31 504f524e4e4e 504f524e4943 504f524e4941 @@ -132891,8 +126360,6 @@ 504f524e3032 504f524e3030 504f524b5553 -504f524b4945 -504f524b4552 504f524b4153 504f524b3232 504f52475935 @@ -132904,7 +126371,6 @@ 504f52434f53 504f52434941 504f52434859 -504f52434845 504f52434841 504f52434831 504f52424f59 @@ -132933,10 +126399,7 @@ 504f50504f58 504f50504953 504f50504949 -504f50504945 504f50504931 -504f50504552 -504f5050454e 504f50504541 504f50504141 504f504f594f @@ -132959,7 +126422,6 @@ 504f504a4553 504f504a4158 504f50494f55 -504f50494d50 504f50494b32 504f50493637 504f50464c59 @@ -133003,8 +126465,6 @@ 504f4f505359 504f4f504f4e 504f4f50494b -504f4f504945 -504f4f504552 504f4f504153 504f4f503930 504f4f503737 @@ -133039,8 +126499,6 @@ 504f4f4c3031 504f4f4b5531 504f4f4b494e -504f4f4b4559 -504f4f4b4552 504f4f4b4545 504f4f4b4148 504f4f4a4150 @@ -133067,7 +126525,6 @@ 504f4f445931 504f4f445254 504f4f444131 -504f4f434859 504f4f433434 504f4f424f59 504f4f424945 @@ -133121,8 +126578,6 @@ 504f4c564f53 504f4c564f4e 504f4c534f4e -504f4c534b41 -504f4c534b41 504f4c534841 504f4c504f31 504f4c4f534b @@ -133143,7 +126598,6 @@ 504f4c4f3138 504f4c4f3136 504f4c4f3133 -504f4c4f3132 504f4c4f3032 504f4c4d4152 504f4c4c5938 @@ -133156,10 +126610,8 @@ 504f4c4c494a 504f4c4c4932 504f4c4c4930 -504f4c4c4559 504f4c4b5354 504f4c4b4f4c -504f4c4b4d4e 504f4c4b4b4b 504f4c4b4955 504f4c4b3930 @@ -133169,7 +126621,6 @@ 504f4c4b3131 504f4c4b3031 504f4c495a45 -504f4c495441 504f4c495345 504f4c494f50 504f4c494f31 @@ -133193,7 +126644,6 @@ 504f4c415237 504f4c415235 504f4c415232 -504f4c414e44 504f4c414e41 504f4c413132 504f4c373531 @@ -133215,8 +126665,6 @@ 504f4b455250 504f4b45524f 504f4b455236 -504f4b455231 -504f4b454d4f 504f4b454d41 504f4b453132 504f4a4f4241 @@ -133228,7 +126676,6 @@ 504f49534f30 504f49534544 504f494e5454 -504f494e5453 504f494e5438 504f494e5435 504f494c4b4d @@ -133254,7 +126701,6 @@ 504f46494755 504f46465937 504f4646454e -504f45545259 504f45544153 504f45534941 504f45504c45 @@ -133280,9 +126726,6 @@ 504f434f3232 504f434e5442 504f434b4559 -504f434b4554 -504f434b4554 -504f434b4554 504f43495553 504f43484955 504f43415249 @@ -133296,7 +126739,6 @@ 504e55543939 504e55543033 504e54544342 -504e54544342 504e4f4d4953 504e4f434f4e 504e4d4e4834 @@ -133310,7 +126752,6 @@ 504d59313931 504d57414450 504d54414c4b -504d53544242 504d53493939 504d52504d52 504d5247504e @@ -133351,9 +126792,6 @@ 504c59333838 504c56504c56 504c5554544f -504c55544f4e -504c55544f33 -504c55544f31 504c55544f30 504c55544552 504c55543030 @@ -133383,8 +126821,6 @@ 504c534d4545 504c534a3333 504c52544142 -504c52544142 -504c52544142 504c4f594545 504c4f573233 504c4f545459 @@ -133439,15 +126875,12 @@ 504c42494949 504c42363233 504c4231324d -504c415a4d41 504c415a4153 504c415a4141 504c415a4131 504c41594d38 -504c41594954 504c41594645 504c41594445 -504c4159415a 504c41594152 504c41593634 504c41593334 @@ -133457,7 +126890,6 @@ 504c41545a5a 504c41545a59 504c41544f4f -504c41544f4e 504c41544e55 504c4154494d 504c41544831 @@ -133465,23 +126897,18 @@ 504c41544537 504c41544131 504c4154334e -504c41534d41 504c41534b49 504c41533233 504c41523737 504c41504f52 504c414e545a 504c414e5459 -504c414e5453 504c414e5437 504c414e5436 504c414e5432 504c414e4b59 504c414e4958 -504c414e4554 -504c414e4553 504c414e4532 -504c414e4531 504c414e4153 504c414e3639 504c414e3130 @@ -133490,8 +126917,6 @@ 504c41464553 504c41454553 504c41444553 -504c41434553 -504c41434531 504c41434341 504c41373735 504c41324e4f @@ -133511,7 +126936,6 @@ 504b52424b52 504b5157424d 504b51545a41 -504b51545a41 504b5041554c 504b50313338 504b4c4f5645 @@ -133561,13 +126985,10 @@ 504a31323334 504a31303143 50495a5a4950 -50495a5a4153 -50495a5a4153 50495a5a4136 50495a5a4130 50495a494d50 50495a484e43 -50495a444543 50495a444534 50495a444153 50495a444141 @@ -133578,7 +126999,6 @@ 5049594b4c45 504959414c49 504958504958 -504958494531 504958454c4c 504958415348 504958313233 @@ -133623,7 +127043,6 @@ 504953554841 504953544f53 50495354454c -504953534552 504953534348 504953534153 504953533231 @@ -133634,14 +127053,12 @@ 504953484b41 504953454c4c 504953424953 -504953414e49 504953414b4f 504952564953 504952534947 5049524f504f 5049524f4e45 5049524f4749 -5049524f4341 5049524b4b4f 504952494b45 504952454c4c @@ -133653,10 +127070,7 @@ 504952414b41 504952414359 504950504f33 -504950504f31 504950504954 -504950504954 -50495050454e 5049504f5155 5049504f504f 5049504f5049 @@ -133707,15 +127121,12 @@ 50494e4f4b49 50494e4f3633 50494e4f3430 -50494e4e4544 50494e4e4143 50494e4e4131 -50494e4b5959 50494e4b5939 50494e4b5935 50494e4b5331 50494e4b4b55 -50494e4b4945 50494e4b4153 50494e4b3936 50494e4b3935 @@ -133755,7 +127166,6 @@ 50494e435553 50494e434f31 50494e43494f -50494e434849 50494e434841 50494e434153 50494e42414c @@ -133775,7 +127185,6 @@ 50494d503934 50494d503932 50494d503736 -50494d503639 50494d503636 50494d503536 50494d503435 @@ -133790,12 +127199,10 @@ 50494d503130 50494d503036 50494d503034 -50494d4d454c 50494d494b33 50494c55534f 50494c554341 50494c534259 -50494c4f544f 50494c4f5441 50494c4f4e53 50494c4c5331 @@ -133846,7 +127253,6 @@ 5049474f3535 5049474d4549 5049474c4954 -504947475953 504947475936 504947475935 504947475933 @@ -133861,8 +127267,6 @@ 504946464b4f 50494646454c 504946463438 -50494554524f -504945544552 504945544121 504945535345 50494553494f @@ -133872,7 +127276,6 @@ 504945524c45 504945524954 50494552494e -504945524345 504945524241 504945524131 5049454e5341 @@ -133900,7 +127303,6 @@ 5049434f3630 5049434f3231 5049434f3036 -5049434b5550 5049434b4953 5049434b494e 5049434b454d @@ -133915,12 +127317,9 @@ 50494342494e 50494341524f 504942414c44 -5049415a5a41 -5049415a5a41 504941534d48 5049414e5441 5049414e4f35 -5049414e4f31 5049414e4b41 504941475745 504941463939 @@ -133944,15 +127343,12 @@ 5048524f4731 504852494d50 50485245444d -504852454431 504852454144 504852415747 504852415345 504852414e43 50485151514d 504851455859 -50484f544f53 -50484f544f53 50484f544f50 50484f544f4a 50484f544943 @@ -133965,21 +127361,15 @@ 50484f4e4533 50484f4c5553 50484f4c5542 -50484f454e49 50484f454e31 50484e583130 50484d333033 50484c59494e -50484c415348 50484c41464f 50484b50484b 50484b303031 504849535441 -504849534859 504849534836 -504849534835 -504849505053 -504849504849 5048494c5953 5048494c5053 5048494c4f50 @@ -134002,7 +127392,6 @@ 5048494c3237 5048494c3234 5048494c3233 -5048494c3133 5048494c3131 504849464533 504849444152 @@ -134014,8 +127403,6 @@ 5048484f5345 504847373534 50484552414c -5048454e4958 -5048454c5053 5048454c4b59 504845454253 504845445241 @@ -134028,14 +127415,12 @@ 504841545341 504841544d33 504841544552 -504841543639 504841543434 504841543131 504841543030 504841534943 504841534534 50484152545a -504841524d44 504841524c59 504841524953 504841524553 @@ -134063,9 +127448,6 @@ 504756343632 504754423630 50474d545641 -50474d545641 -50474d545641 -50474d545641 50474d4a4147 50474d333132 50474954524e @@ -134090,25 +127472,21 @@ 50464c595454 50464c594257 50464c545541 -50464c4f5944 50464c4f434b 50464c454745 50464c363434 50464c305944 504649535445 504648524731 -504648425946 504647454352 50464742434d 504646584539 -504645524445 504644384d41 5046434d444a 504643313037 50464155454e 5046374d4134 504632343438 -504559544f4e 5045584d4158 504558353235 504556454e31 @@ -134116,7 +127494,6 @@ 504554544954 50455454494e 504554544553 -504554544552 504554543435 50455453555a 50455453484f @@ -134144,7 +127521,6 @@ 504554494857 504554494553 504554494531 -504554494531 504554484553 504554455943 504554455942 @@ -134152,10 +127528,7 @@ 50455445534e 504554455341 504554455331 -504554455253 -504554455250 504554455239 -504554455232 504554454e4f 504554454c4f 504554454c49 @@ -134212,8 +127585,6 @@ 504552544953 504552534b45 504552534959 -50455253494c -50455253494b 504552534945 50455253454f 50455253454e @@ -134233,7 +127604,6 @@ 5045524d4158 5045524d4131 5045524d3937 -5045524c4954 5045524c494e 5045524c4552 5045524c4132 @@ -134270,10 +127640,7 @@ 504552434559 504552415445 504550534f45 -504550534953 -504550534953 504550534941 -504550534931 50455053492e 504550534855 504550534545 @@ -134283,15 +127650,12 @@ 504550504152 5045504f534f 5045504f4e41 -50455049544f 504550495445 -504550495441 504550495045 504550494e53 504550494e45 504550494e31 504550455231 -504550455045 504550454e4f 504550454e31 504550454c45 @@ -134330,8 +127694,6 @@ 50454e4e5944 50454e4e5938 50454e4e5937 -50454e4e5933 -50454e4e5931 50454e4e554d 50454e4e4132 50454e4e3130 @@ -134358,12 +127720,10 @@ 50454d455858 50454c5a4552 50454c555a41 -50454c55444f 50454c554441 50454c4f5455 50454c4f5353 50454c4f534f -50454c4f534f 50454c4f5331 50454c4f4e53 50454c4d454c @@ -134392,11 +127752,8 @@ 5045474f5241 5045474c4552 504547495331 -50454747594f 504547475932 -504547475931 50454747494f -504547474945 50454744454e 504547415a4f 504547415a45 @@ -134405,7 +127762,6 @@ 504547303337 504546464552 5045455a4552 -504545574545 504545534f4e 504545534558 504545525336 @@ -134441,7 +127797,6 @@ 504544524f42 504544524f39 504544524f33 -504544524f31 5045444f4e45 5045444d414e 5045444c4559 @@ -134477,13 +127832,11 @@ 504541533535 504541525345 504541524c5a -504541524c53 504541524c4c 504541524c4a 504541524c39 504541524c37 504541524532 -504541524345 504541523131 5045414e3054 5045414b5931 @@ -134511,7 +127864,6 @@ 50444f444745 50444d474c44 50444d343636 -504449444459 504445574954 504445564552 504445353535 @@ -134540,7 +127892,6 @@ 50434c41524b 50434b504b50 504349545241 -504349545241 504348565049 504348535643 504348415345 @@ -134598,7 +127949,6 @@ 50415a414d4f 50415a414556 50415a313233 -504159544f4e 50415954304e 504159534547 5041594f4c41 @@ -134630,7 +127980,6 @@ 504156455231 504156454c42 504156454c37 -504156454c31 504156444131 504156413738 504156383233 @@ -134638,7 +127987,6 @@ 504155534559 5041554c5953 5041554c5355 -5041554c4f31 5041554c4d43 5041554c4d42 5041554c4d41 @@ -134646,10 +127994,8 @@ 5041554c4b41 5041554c4954 5041554c494f -5041554c4945 5041554c4741 5041554c4556 -5041554c4554 5041554c4532 5041554c4348 5041554c424f @@ -134666,10 +128012,8 @@ 5041554c3933 5041554c3932 5041554c3839 -5041554c3838 5041554c3736 5041554c3731 -5041554c3731 5041554c3730 5041554c3638 5041554c3636 @@ -134683,14 +128027,10 @@ 5041554c3338 5041554c3332 5041554c3239 -5041554c3238 5041554c3236 -5041554c3231 5041554c3141 5041554c3135 -5041554c3132 5041554c3037 -5041554c3031 50415546494f 50415544494f 504155434943 @@ -134704,7 +128044,6 @@ 504154545934 50415454574f 504154545459 -504154544945 504154535943 504154534f4e 504154534945 @@ -134715,7 +128054,6 @@ 504154533431 504154533336 504154524953 -504154524941 504154524559 504154524154 50415452414a @@ -134754,9 +128092,7 @@ 504154424f59 504154424f42 504154424556 -50415441544f 504154415449 -504154415441 504154414d41 504154414b41 504154413636 @@ -134772,16 +128108,13 @@ 504154303031 504153544544 504153544532 -504153544153 50415354414e 504153544147 504153544141 -504153544131 504153543831 504153543231 504153543132 504153535858 -50415353574f 504153535730 504153535645 504153535553 @@ -134795,9 +128128,7 @@ 504153534945 504153534841 504153534559 -504153534559 504153534554 -504153534552 504153534531 50415353434f 504153534152 @@ -134837,7 +128168,6 @@ 504153484135 504153484133 504153434f31 -504153434841 504153424f4e 504153414d41 504153414b41 @@ -134846,7 +128176,6 @@ 504152564545 50415256414e 504152555332 -504152545953 504152545942 504152545936 504152544f53 @@ -134857,7 +128186,6 @@ 504152544549 504152544147 504152543433 -504152534f4e 504152534953 504152534545 504152525252 @@ -134924,8 +128252,6 @@ 504150504f4f 50415050494f 50415050494e -504150504945 -50415050454c 50415050414e 5041504f4e54 5041504f4c4f @@ -134940,7 +128266,6 @@ 504150494e41 504150494b4f 504150494b45 -504150494552 504150493639 50415048494f 504150455441 @@ -134948,12 +128273,10 @@ 504150455248 504150455235 504150455232 -504150455231 50415045454b 504150415953 504150415945 504150415345 -504150415041 504150414e59 504150414e55 504150414e47 @@ -134988,17 +128311,13 @@ 50414e5a4f4e 50414e5a4153 50414e5a414e -50414e545953 50414e545355 50414e545332 50414e544f4a 50414e544841 -50414e544552 50414e535953 -50414e534f4e 50414e534a45 50414e534159 -50414e50414e 50414e4f5a31 50414e4f5849 50414e4f5631 @@ -135015,19 +128334,16 @@ 50414e495858 50414e494b49 50414e494343 -50414e494331 50414e475549 50414e474941 50414e45544f 50414e454c31 50414e445931 -50414e444f52 50414e444531 50414e444156 50414e444149 50414e444144 50414e444136 -50414e444131 50414e434830 50414e41534f 50414e414b41 @@ -135047,11 +128363,9 @@ 50414c4f5445 50414c4f5441 50414c4f4d45 -50414c4f4d41 50414c4f4c41 50414c4d5332 50414c4d4532 -50414c4d4153 50414c4d4131 50414c4d3232 50414c4c4c4c @@ -135104,7 +128418,6 @@ 5041494e5445 5041494e5441 5041494e5439 -5041494e5431 5041494e4f31 5041494e4553 5041494c554d @@ -135116,7 +128429,6 @@ 504148414e47 504148414e32 504148413736 -504147545041 504147494e41 504147455931 504147455353 @@ -135153,7 +128465,6 @@ 5041434f3030 5041434b5931 5041434b4544 -5041434b4152 5041434b3937 5041434b3837 5041434b3230 @@ -135161,14 +128472,12 @@ 50414349544f 504143495441 504143494f5a -504143494e4f 504143494643 504143484f4b 504143484531 504143484153 504143464341 504143455931 -504143455253 504143453433 504143323430 504143313837 @@ -135284,7 +128593,6 @@ 5030505a3150 503050505931 503050503050 -50304f394938 50304c494333 50304c415430 5030434b3354 @@ -135295,7 +128603,6 @@ 503030543352 503030504545 5030304e4945 -5030304b4945 503030443145 503030313737 503030303035 @@ -135306,9 +128613,7 @@ 4f5a5a593738 4f5a5a593637 4f5a5a593535 -4f5a5a593535 4f5a5a593530 -4f5a5a494531 4f5a5a493131 4f5a5a474f44 4f5a5a313233 @@ -135323,7 +128628,6 @@ 4f5a484f5241 4f5a47555431 4f5a46554f42 -4f5a46554f42 4f5a464a3051 4f5a46455354 4f5a45524b4f @@ -135353,7 +128657,6 @@ 4f5754524f46 4f574e5a4954 4f574e495431 -4f574e455253 4f574e455231 4f574c533933 4f574c455453 @@ -135369,7 +128672,6 @@ 4f57454e3233 4f57454e3231 4f5743554c42 -4f5743554c42 4f5741594e45 4f5741593434 4f57414b3530 @@ -135398,7 +128700,6 @@ 4f56454a4954 4f5645434b41 4f5643415441 -4f5642554b42 4f564154494f 4f56414f5641 4f555652455a @@ -135418,7 +128719,6 @@ 4f554c544f4e 4f554c49504f 4f554b484149 -4f55494f5549 4f55494e4f4e 4f5548514448 4f5543553749 @@ -135428,10 +128728,8 @@ 4f5538313258 4f553831324f 4f5538313242 -4f5538313241 4f5538313236 4f5538313235 -4f5538313231 4f5532383132 4f545a544942 2e4f5459524a @@ -135447,7 +128745,6 @@ 4f54544f3535 4f54544f3432 4f54544d5552 -4f5454455253 4f5454455239 4f5454455237 4f5453554b41 @@ -135482,10 +128779,6 @@ 4f54414b4152 4f5437585434 4f535a4b4152 -4f5359544842 -4f535745474f -4f5357414c44 -4f5357414c44 4f535546414e 4f5355455131 4f535541544f @@ -135499,7 +128792,6 @@ 4f5353494532 4f5353313233 4f5352444f43 -4f5350524559 4f5350495445 4f534f555448 4f534f544f31 @@ -135527,7 +128819,6 @@ 4f534b415246 4f534b415245 4f534b415232 -4f534b415231 4f534b373637 4f5349534548 4f53494a454b @@ -135539,7 +128830,6 @@ 4f5348494d41 4f5348494b4f 4f5348454131 -4f53474f4f44 4f53455a4e4f 4f5345544941 4f53454e4b41 @@ -135559,7 +128849,6 @@ 4f53415a4545 4f53414d4f54 4f53414b4953 -4f53414b4131 4f5333363337 4f5331323334 4f5331313231 @@ -135597,16 +128886,12 @@ 4f524c4f434b 4f524c454e53 4f524c414e45 -4f524c414e44 4f524c414e41 4f524b494445 4f524b41414e 4f5249595a32 4f5249535243 4f52494f4e41 -4f52494f4e35 -4f52494f4e34 -4f52494f4e33 4f52494e5441 4f52494e4441 4f52494a4f4b @@ -135614,16 +128899,12 @@ 4f5249483237 4f5249474f4e 4f524947494f -4f524947494e 4f524947414d -4f5249454e54 4f5248414e37 4f5247593733 4f5247495941 4f5247454c57 -4f524741534d 4f5247414e49 -4f5247414e41 4f5246455553 4f52454f5353 4f52454f3534 @@ -135664,7 +128945,6 @@ 4f52414c4c41 4f5241444541 4f524143554c -4f5241434c45 4f524143494f 4f5238585246 4f5238303536 @@ -135672,7 +128952,6 @@ 4f5232323035 4f52314f4e31 4f5157544642 -4f5157544642 4f5155574f47 4f514e545157 4f514a453245 @@ -135685,7 +128964,6 @@ 4f5055535353 4f5055533838 4f5055533531 -4f5055533531 4f5055533432 4f5055533333 4f5055533230 @@ -135693,7 +128971,6 @@ 4f5055533133 4f5055533030 4f50544f5054 -4f5054494f4e 4f5054494553 4f5054415245 4f50534d414e @@ -135718,10 +128995,8 @@ 4f5045524137 4f5045523231 4f50454e5741 -4f50454e5550 4f50454e4f57 4f50454e4e4f -4f50454e4d45 4f50454e4c59 4f50454e3535 4f50454e3534 @@ -135760,7 +129035,6 @@ 4f4f50343030 4f4f4f544558 4f4f4f54414d -4f4f4f4f4f4f 4f4f4f4f4f30 4f4f4f4f3030 4f4f4f4c4f4c @@ -135827,30 +129101,23 @@ 4f4e49544953 4f4e4954414c 4f4e49504141 -4f4e494f4e53 4f4e494f4e36 4f4e494f4e34 4f4e49313233 4f4e47544159 4f4e474d5445 -4f4e4742414b 4f4e47413037 -4f4e46495245 -4f4e4554574f 4f4e4554494d 4f4e4553554e 4f4e45535449 4f4e454f4e32 4f4e454f4638 4f4e454d4f45 -4f4e454d414e 4f4e454c4157 4f4e454b4e45 -4f4e45494441 4f4e45484f54 4f4e45484f45 4f4e45475559 -4f4e45474f44 4f4e4546554e 4f4e45454545 4f4e4544524f @@ -135908,7 +129175,6 @@ 4f4d45474156 4f4d45474154 4f4d45474151 -4f4d45474133 4f4d44475031 4f4d43413434 4f4d43303032 @@ -135919,13 +129185,11 @@ 4f4d41523737 4f4d41523636 4f4d41523535 -4f4d41523535 4f4d41523435 4f4d41523236 4f4d41523234 4f4d41523033 4f4d41523030 -4f4d414e4b4f 4f4d414e434f 4f4d414c4c45 4f4d41495241 @@ -135949,14 +129213,12 @@ 4f4c53454e46 4f4c53454e39 4f4c52544142 -4f4c52544142 4f4c52414332 4f4c50433533 4f4c50333236 4f4c50313233 4f4c4f563733 4f4c4f52554e -4f4c4f52494e 4f4c4f393939 4f4c4f313233 4f4c4d4f3132 @@ -136009,7 +129271,6 @@ 4f4c45584131 4f4c45564552 4f4c45545441 -4f4c45535941 4f4c45535652 4f4c45534b4f 4f4c45534159 @@ -136034,7 +129295,6 @@ 4f4c45473630 4f4c45473539 4f4c45473535 -4f4c45473535 4f4c45473531 4f4c45473333 4f4c45473331 @@ -136042,7 +129302,6 @@ 4f4c45473234 4f4c45473233 4f4c45473232 -4f4c45473232 4f4c45473230 4f4c45473139 4f4c45473138 @@ -136067,14 +129326,9 @@ 4f4c4450524f 4f4c444e4156 4f4c444d494c -4f4c4448414d -4f4c44455354 4f4c44455257 -4f4c44455253 4f4c44455234 4f4c44453430 -4f4c44444f47 -4f4c44444f47 4f4c44393638 4f4c44344d45 4f4c44343432 @@ -136118,7 +129372,6 @@ 4f4b50415241 4f4b4f504f4b 4f4b4f4c4945 -4f4b4f4b4f4b 4f4b4f434845 4f4b4f424941 4f4b4f313030 @@ -136170,7 +129423,6 @@ 4f4a414f4a41 4f4a37303333 4f4955595431 -4f4955595431 4f4955524557 4f4955393837 4f4955373635 @@ -136220,7 +129472,6 @@ 4f484147414e 4f4841444941 4f4835353231 -4f4835353231 4f4833383139 4f4831383035 4f47554f4755 @@ -136250,8 +129501,6 @@ 4f464d494e45 4f464d373639 4f464c545541 -4f464c545541 -4f464c545541 4f464c37354d 4f464b41494e 4f464943494e @@ -136260,7 +129509,6 @@ 4f4646555454 4f4646524f41 4f4646494e47 -4f4646494345 4f4646464646 4f4646415445 4f4646414c59 @@ -136342,9 +129590,7 @@ 4f43554e4c45 4f43554c5553 4f43554c4f53 -4f43554c4152 4f43544f4354 -4f43544f4245 4f4354494c45 4f4354455431 4f435441564f @@ -136356,8 +129602,6 @@ 4f434f4e3235 4f434f454531 4f4349545241 -4f4349545241 -4f4349545241 4f434952454a 4f4349464552 4f4349434154 @@ -136365,7 +129609,6 @@ 4f4346545141 4f4345544552 4f43454e4b41 -4f4345414e53 4f4345414e38 4f4345414e35 4f4345414e33 @@ -136382,7 +129625,6 @@ 4f4253454445 4f425259414e 4f42524f574e -4f425249454e 4f4252464b46 4f4252454a41 4f424f5a4f42 @@ -136399,7 +129641,6 @@ 4f424c49454f 4f424c424c47 4f424c414b41 -4f424a454354 4f42494f5241 4f42494f4249 4f4249453939 @@ -136433,12 +129674,9 @@ 4f414b574f4f 4f414b545245 4f414b4f414b -4f414b4c4559 4f414b494553 4f4148553338 4f4147545041 -4f4147545041 -4f4147545041 4f4144384f4c 4f4144323030 4f4138313433 @@ -136469,7 +129707,6 @@ 4f314a454550 4f3144325433 4f3141325433 -4f3132333435 4f3132333332 4f3049433356 4f3033353936 @@ -136477,7 +129714,6 @@ 4e5a5457434c 4e5a4e313332 4e5a46554f42 -4e5a46554f42 4e5a42554753 4e5a385a4b56 4e5a34323739 @@ -136496,7 +129732,6 @@ 4e5950443039 4e5950415748 4e594e4a4443 -4e594d50484f 4e594d504835 4e594c4f4e4a 4e594c4f4e36 @@ -136505,7 +129740,6 @@ 4e594b324b31 4e5947415244 4e5945554e42 -4e5945554e42 4e5945523131 4e59454e5945 4e5943484153 @@ -136555,7 +129789,6 @@ 4e5645474153 4e5645454d45 4e5645325441 -4e5642554b42 4e56384a3450 4e5631443141 4e5631393730 @@ -136568,7 +129801,6 @@ 4e5554533939 4e5554533333 4e5554533131 -4e55544d4547 4e55544b494e 4e5554444f43 4e5554434f57 @@ -136596,13 +129828,10 @@ 4e5552494153 4e5552484154 4e555248414e -4e5552474c45 4e5552454b45 4e555244494e -4e5552424f4c 4e5552414e45 4e5552414c59 -4e5552414c49 4e5552393939 4e555234494b 4e5550545345 @@ -136632,7 +129861,6 @@ 4e5548383258 4e5547544f50 4e554748434b -4e5547474554 4e5547455453 4e5547343230 4e5546434544 @@ -136640,7 +129868,6 @@ 4e554553454e 4e5545524b31 4e55444c4552 -4e5544495459 4e5544455353 4e5544454d45 4e5544453535 @@ -136717,9 +129944,6 @@ 4e5241524941 4e52414a4353 4e5232303939 -4e5157544642 -4e5157544642 -4e5157544642 4e5056595359 4e5055535455 4e5051333132 @@ -136742,7 +129966,6 @@ 4e4f5843484f 4e4f57574154 4e4f574f524b -4e4f574e4f57 4e4f574d414e 4e4f57495341 4e4f57495331 @@ -136762,11 +129985,9 @@ 4e4f56494532 4e4f56454e4f 4e4f56454d32 -4e4f56454c4c 4e4f56454c41 4e4f56454c34 4e4f56454c31 -4e4f56454c31 4e4f56415941 4e4f56414b53 4e4f56414b4f @@ -136793,8 +130014,6 @@ 4e4f55524148 4e4f554e414e 4e4f55434849 -4e4f54594554 -4e4f54594554 4e4f54574152 4e4f54544945 4e4f54544150 @@ -136807,7 +130026,6 @@ 4e4f544d4544 4e4f544d4533 4e4f544d4531 -4e4f544c4f42 4e4f544c4957 4e4f544c4948 4e4f544c4543 @@ -136854,9 +130072,7 @@ 4e4f5349474e 4e4f53494445 4e4f5349414d -4e4f53484954 4e4f5348494e -4e4f53484552 4e4f53454545 4e4f53454531 4e4f53453237 @@ -136870,7 +130086,6 @@ 4e4f52564559 4e4f52564153 4e4f5255454e -4e4f52544f4e 4e4f52544850 4e4f52544845 4e4f52544837 @@ -136880,8 +130095,6 @@ 4e4f5254414c 4e4f52534b49 4e4f52534559 -4e4f52524953 -4e4f52524945 4e4f52524544 4e4f52524142 4e4f52523133 @@ -136890,9 +130103,7 @@ 4e4f524e4945 4e4f524e4941 4e4f524d494e -4e4f524d4945 4e4f524d4157 -4e4f524d414c 4e4f524d4132 4e4f524d3538 4e4f524d3231 @@ -136907,18 +130118,13 @@ 4e4f52474159 4e4f52455354 4e4f52454c4c -4e4f5245454e 4e4f5245414e 4e4f52444953 4e4f5244494f 4e4f5244494e -4e4f52444943 -4e4f52444943 4e4f52444941 -4e4f5244454e 4e4f52443836 4e4f52443230 -4e4f5243494d 4e4f5242454e 4e4f5241494e 4e4f52414831 @@ -136932,7 +130138,6 @@ 4e4f50455241 4e4f50455231 4e4f50454e4f -4e4f50415353 4e4f4f5a4c45 4e4f4f574159 4e4f4f544a45 @@ -136945,9 +130150,7 @@ 4e4f4f4e3037 4e4f4f4c4945 4e4f4f4b4559 -4e4f4f4b4559 4e4f4f4b3932 -4e4f4f444c45 4e4f4f424c45 4e4f4f42494b 4e4f4f423738 @@ -136957,7 +130160,6 @@ 4e4f4f313233 4e4f4e594153 4e4f4e53544f -4e4f4e4e4945 4e4f4e4e4148 4e4f4e4b454c 4e4f4e49544f @@ -136977,7 +130179,6 @@ 4e4f4d574541 4e4f4d524148 4e4f4d524143 -4e4f4d4f5245 4e4f4d4e4f4d 4e4f4d495335 4e4f4d494b41 @@ -136986,14 +130187,11 @@ 4e4f4d455243 4e4f4d415441 4e4f4d415253 -4e4f4d415235 4e4f4d415232 4e4f4d414d45 4e4f4d414441 4e4f4d414434 -4e4f4d414431 4e4f4c534f4a -4e4f4c4f5645 4e4f4c4f4e47 4e4f4c4f4759 4e4f4c4f4144 @@ -137001,8 +130199,6 @@ 4e4f4c495441 4e4f4c495341 4e4f4c494d49 -4e4f4c455331 -4e4f4c455331 4e4f4c455250 4e4f4c454d44 4e4f4c454753 @@ -137041,7 +130237,6 @@ 4e4f474f4d45 4e4f474f4453 4e4f4749524c -4e4f47474552 4e4f47454e58 4e4f4741524f 4e4f47414441 @@ -137065,10 +130260,8 @@ 4e4f454e4f45 4e4f454d4941 4e4f454d4931 -4e4f454c4c45 4e4f454c4a52 4e4f454c4954 -4e4f454c4941 4e4f454c3535 4e4f454c3530 4e4f454c3334 @@ -137078,12 +130271,10 @@ 4e5f4f454854 4e4f45444947 4e4f44525547 -4e4f44524f47 4e4f44524f44 4e4f4452414b 4e4f444f5345 4e4f4449434b -4e4f44445931 4e4f44444c57 4e4f44373437 4e4f4354554d @@ -137095,7 +130286,6 @@ 4e4f42554348 4e4f424f3231 4e4f424e4f42 -4e4f424e4f42 4e4f424c4554 4e4f424c4537 4e4f42425947 @@ -137199,8 +130389,6 @@ 4e4a53534b35 4e4a52434252 4e4a50545941 -4e4a50545941 -4e4a50545941 4e4a4f485343 4e4a4e4a435a 4e4a4d313233 @@ -137216,7 +130404,6 @@ 4e4a4859464c 4e4a48585452 4e4a4854484a -4e4a4854484a 4e4a48485443 4e4a44564c53 4e4a4455414d @@ -137232,7 +130419,6 @@ 4e4958585858 4e49584f4e39 4e49584f4e36 -4e49584f4e31 4e49584f4c41 4e4958494531 4e4958414d4f @@ -137252,7 +130438,6 @@ 4e4954524f36 4e4954524f33 4e4954524f32 -4e4954524f31 4e4954524953 4e4954455348 4e495445344b @@ -137278,8 +130463,6 @@ 4e495053494c 4e4950524950 4e4950505931 -4e4950504c45 -4e4950504552 4e49504f4e31 4e49504f4c54 4e49504c4f4b @@ -137344,19 +130527,15 @@ 4e494d534159 4e494d4d4954 4e494d494d49 -4e494d424c45 4e494d313233 4e494c59414b 4e494c564544 -4e494c53454e -4e494c52454d 4e494c4e494c 4e494c4d4f54 4e494c4d4148 4e494c4c554d 4e494c47554e 4e494c455331 -4e494c455331 4e494c454d45 4e494c453933 4e494c453238 @@ -137374,7 +130553,6 @@ 4e494b4f4e4e 4e494b4f4e38 4e494b4f4e32 -4e494b4f4e31 4e494b4f4d53 4e494b4f4c53 4e494b4f4c49 @@ -137400,17 +130578,12 @@ 4e494b4b4b4b 4e494b4b4959 4e494b4b4950 -4e494b4b4949 -4e494b4b4949 4e494b4b4948 -4e494b4b4945 4e494b4b4943 -4e494b4b4931 4e494b4b4559 4e494b4b454e 4e494b4b4549 4e494b49544f -4e494b49544f 4e494b49544b 4e494b495431 4e494b495353 @@ -137431,7 +130604,6 @@ 4e494b454c4f 4e494b454149 4e494b453732 -4e494b453732 4e494b453636 4e494b453532 4e494b453434 @@ -137475,7 +130647,6 @@ 4e49474d4154 4e49474c4954 4e4947495249 -4e4947485453 4e494748544d 4e4947485449 4e4947485439 @@ -137483,7 +130654,6 @@ 4e4947474c49 4e4947474134 4e4947474133 -4e4947474131 4e4947454c4d 4e4947454c4a 4e4947454c30 @@ -137511,7 +130681,6 @@ 4e4943544159 4e4943535453 4e494353414d -4e49434f5941 4e49434f5353 4e49434f4c59 4e49434f4c31 @@ -137534,7 +130703,6 @@ 4e49434b5343 4e49434b5043 4e49434b5041 -4e49434b4f53 4e49434b4f50 4e49434b4f4e 4e49434b4d55 @@ -137544,7 +130712,6 @@ 4e49434b494e 4e49434b494d 4e49434b484f -4e49434b454c 4e49434b414c 4e49434b3937 4e49434b3934 @@ -137563,12 +130730,9 @@ 4e49434b3434 4e49434b3335 4e49434b3334 -4e49434b3233 4e49434b3038 4e49434b3037 -4e49434b3034 4e49434b3033 -4e49434b3031 4e4943485932 4e4943485453 4e4943484b41 @@ -137591,7 +130755,6 @@ 4e4943303037 4e49424f5243 4e49424c4954 -4e4942495255 4e4942495055 4e49414e4e41 4e49414d4f52 @@ -137637,7 +130800,6 @@ 4e4756513243 4e4755594853 4e4755594554 -4e475559454e 4e4752313233 4e474f5a4931 4e474f4e4741 @@ -137676,7 +130838,6 @@ 4e4652434631 4e4651594631 4e4651555448 -4e4651434a59 4e464e465642 4e464e454b5a 4e464e424543 @@ -137694,7 +130855,6 @@ 4e4644533532 4e464448425a 4e4643375a4e -4e464243425a 4e46414c444f 4e4632373538 4e455a5a4945 @@ -137732,7 +130892,6 @@ 4e45574f4c44 4e45574f4354 4e45574f424d -4e45574e4557 4e45574e4554 4e45574e4552 4e45574d4f4f @@ -137741,11 +130900,9 @@ 4e4557474f44 4e455746554e 4e4557444f47 -4e4557444159 4e4557435550 4e4557434f4e 4e4557434153 -4e4557434152 4e4557425931 4e4557424f52 4e4557424544 @@ -137761,7 +130918,6 @@ 4e4557333037 4e4557324954 4e4557313455 -4e4557313233 4e4557313132 4e4557303132 4e45565a4f52 @@ -137770,8 +130926,6 @@ 4e45564c4f4e 4e4556494e31 4e4556494341 -4e4556455453 -4e4556455453 4e4556455252 4e455645524e 4e4556455239 @@ -137790,7 +130944,6 @@ 4e4554544531 4e455453554a 4e4554535548 -4e455452554e 4e455452454b 4e455452414c 4e4554505744 @@ -137800,7 +130953,6 @@ 4e45544c414b 4e4554494e48 4e4554494d45 -4e4554474f44 4e4554464144 4e4554455241 4e4554444f47 @@ -137828,7 +130980,6 @@ 4e4553454252 4e4553444552 4e4553434f54 -4e4553424954 4e4553313233 4e4553313131 4e455256494e @@ -137850,11 +131001,9 @@ 4e4552443132 4e4552415241 4e455241444d -4e455054554e 4e45504f4d55 4e4550474950 4e4550425232 -4e4550415453 4e4550415349 4e4550414c4c 4e4550324e45 @@ -137865,7 +131014,6 @@ 4e454f504143 4e454f504142 4e454f4f4e45 -4e454f4e454f 4e454f4e3936 4e454f4d4953 4e454f4d4544 @@ -137888,7 +131036,6 @@ 4e454d5a4f56 4e454d553235 4e454d544131 -4e454d524143 4e454d4f4944 4e454d4f3332 4e454d4f3233 @@ -137984,7 +131131,6 @@ 4e4545524353 4e45454e4b41 4e45454e4945 -4e45454e4545 4e45454e414e 4e45454c4f4e 4e45454c4559 @@ -137998,7 +131144,6 @@ 4e4544574f42 4e4544555241 4e4544525544 -4e4544525544 4e4544524f4e 4e4544524f42 4e45444e494c @@ -138022,7 +131167,6 @@ 4e4543415449 4e4542594148 4e4542554e55 -4e4542554c41 4e4542553031 4e45424d414e 4e4542494154 @@ -138031,7 +131175,6 @@ 4e4541553434 4e4541534531 4e4541525448 -4e454150454c 4e45414e4541 4e45414c4333 4e45414c3139 @@ -138066,7 +131209,6 @@ 4e434f413934 4e434e434e43 4e434c435253 -4e4349545241 4e4348533939 4e4348533333 4e4348455648 @@ -138101,7 +131243,6 @@ 4e4249524259 4e4249463936 4e4248545141 -4e4248545141 4e424656464e 4e4246373336 4e42454c4c45 @@ -138139,7 +131280,6 @@ 4e41594e4552 4e41594d494b 4e41594d414e -4e41594c4f52 4e4159424159 4e4159414b49 4e41584e4158 @@ -138171,7 +131311,6 @@ 4e41564a4f54 4e4156495441 4e415641524f -4e4156415241 4e4156414c4f 4e4156414c45 4e4156324842 @@ -138187,11 +131326,9 @@ 4e4154574553 4e4154555349 4e4154555341 -4e4154555245 4e4154554c41 4e415454594a 4e4154545935 -4e4154545931 4e4154543232 4e415453554f 4e415453554d @@ -138223,20 +131360,14 @@ 4e4154444f4d 4e4154434f4e 4e4154415a41 -4e4154415841 -4e4154415741 4e4154415359 4e415441534a -4e4154415341 4e4154414e49 -4e4154414c59 4e4154414c4a -4e4154414841 4e4154414348 4e4154414341 4e4154413930 4e4154413839 -4e4154413839 4e4154413838 4e4154413835 4e4154413731 @@ -138250,12 +131381,10 @@ 4e4154413037 4e4154413033 4e4153564149 -4e4153545959 4e415354594b 4e4153545942 4e4153545937 4e4153545541 -4e4153544a41 4e4153544959 4e415354494e 4e4153544552 @@ -138263,7 +131392,6 @@ 4e4153544131 4e4153543838 4e415353434f -4e4153534155 4e4153524545 4e41534f4b30 4e41534b4c44 @@ -138273,7 +131401,6 @@ 4e4153494f4e 4e4153494d49 4e4153485741 -4e4153485541 4e4153485459 4e4153484859 4e4153484159 @@ -138335,8 +131462,6 @@ 4e41504f4341 4e41504e4150 4e41504d414e -4e41504c4553 -4e41504b494e 4e41504a4f53 4e4150455256 4e415045524f @@ -138353,12 +131478,10 @@ 4e414e554c49 4e414e554b41 4e414e554b31 -4e414e544553 4e414e544149 4e414e534545 4e414e4f5553 4e414e4f5331 -4e414e4f4f4b 4e414e4f4441 4e414e4f3639 4e414e4f3233 @@ -138410,7 +131533,6 @@ 4e414d53434d 4e414d534154 4e414d525546 -4e414d524f4e 4e414d524f47 4e414d504141 4e414d4f5259 @@ -138453,9 +131575,7 @@ 4e414c4d4553 4e414c4c4944 4e414c4c454c -4e414c474153 4e414c455041 -4e414c414e49 4e414c413233 4e414c393237 4e414b555241 @@ -138468,7 +131588,6 @@ 4e414b495241 4e414b454437 4e414b454435 -4e414b454431 4e414b41544f 4e414b414c49 4e4149564956 @@ -138479,12 +131598,10 @@ 4e41494d4144 4e41494d4131 4e41494d3131 -4e41494c4552 4e41494c4148 4e41494c3933 4e41494c3231 4e4149444e49 -4e414854414e 4e4148534f52 4e41484f4a33 4e4148494441 @@ -138496,7 +131613,6 @@ 4e4147555241 4e414752554c 4e4147524f4e -4e4147524f4d 4e41474f5242 4e41474c414f 4e4147494c41 @@ -138526,7 +131642,6 @@ 4e4144494b41 4e4144494341 4e4144494148 -4e4144494131 4e4144493232 4e4144454e4b 4e4144454c4c @@ -138553,7 +131668,6 @@ 4e4142564f43 4e4142554b4f 4e41424f5448 -4e41424f5253 4e41424c5553 4e41424b4f56 4e414249544f @@ -138677,7 +131791,6 @@ 4e3137303230 4e3135544453 4e3134324c43 -4e3132333435 4e3131313454 4e3130333943 4e3130305042 @@ -138736,13 +131849,10 @@ 4d5953484b41 4d595348454c 4d5953483039 -4d5953454c46 4d5953313137 -4d59525a494b 4d5952594144 4d595255494e 4d5952544f4d -4d5952544c45 4d5952544953 4d59524f4f54 4d59524f4e43 @@ -138751,7 +131861,6 @@ 4d5952494e47 4d595249434b 4d5952494148 -4d5952494144 4d5952455959 4d5952455348 4d5952454b41 @@ -138772,12 +131881,10 @@ 4d5950455354 4d5950455045 4d5950454c45 -4d5950415353 4d5950415041 4d594f554e47 4d594f545453 4d594f4e4753 -4d594e555453 4d594e4f4148 4d594e4f3430 4d594e4c4a55 @@ -138795,12 +131902,8 @@ 4d594d414349 4d594d313233 4d594c554359 -4d594c4f5645 4d594c495a41 -4d594c494645 4d594c455354 -4d594c454e45 -4d594c454e45 4d594c415253 4d594c41524b 4d594c414e44 @@ -138822,7 +131925,6 @@ 4d59484f5431 4d59484f524e 4d59484f5045 -4d59484f4d45 4d5948415747 4d5948414e44 4d5947555953 @@ -138833,7 +131935,6 @@ 4d5946495245 4d5946445644 4d5946415354 -4d5946414345 4d5945554e42 4d5945534841 4d5945525332 @@ -138870,7 +131971,6 @@ 4d5942454c4c 4d5942454542 4d5942444159 -4d5942414259 4d5941524d59 4d59414c4941 4d59414b3437 @@ -138920,8 +132020,6 @@ 4d57464a4b4d 4d5746313233 4d5743554c42 -4d5743554c42 -4d5743554c42 4d5742333136 4d5741594e45 4d57414d5741 @@ -138967,7 +132065,6 @@ 4d5554544f38 4d5554544f37 4d5554544f35 -4d5554544552 4d555454454e 4d5554534348 4d5554524f4e @@ -138980,7 +132077,6 @@ 4d5553544945 4d5553544754 4d555354454f -4d555354414e 4d5553544148 4d5553543936 4d555353554b @@ -138990,7 +132086,6 @@ 4d555350454c 4d55534f4c4f 4d55534b494e -4d55534b4945 4d55534b4132 4d5553494e47 4d5553494b53 @@ -138998,7 +132093,6 @@ 4d5553494a53 4d555349434c 4d5553494349 -4d5553494341 4d5553494336 4d5553494334 4d5553493636 @@ -139006,12 +132100,10 @@ 4d5553485931 4d555348524f 4d5553484553 -4d555345554d 4d5553454e45 4d5553453838 4d5553453334 4d555343554c -4d5553434154 4d5553415349 4d5553415254 4d5553414b41 @@ -139048,8 +132140,6 @@ 4d554e544f4e 4d554e54454e 4d554e535441 -4d554e534f4e -4d554e534f4e 4d554e524f31 4d554e504f50 4d554e4f4441 @@ -139069,14 +132159,12 @@ 4d554e45434f 4d554e444f32 4d554e444941 -4d554e444552 4d554e44454b 4d554e444531 4d554e444131 4d554e434841 4d554e434839 4d554e434832 -4d554e434831 4d554d553030 4d554d534945 4d554d524f4e @@ -139092,7 +132180,6 @@ 4d554c4c4953 4d554c4c4559 4d554c4c4553 -4d554c4c4552 4d554c4c3236 4d554c4b4b55 4d554c494d55 @@ -139115,7 +132202,6 @@ 4d5549523756 4d5549474149 4d554855485f -4d5548544152 4d554853494e 4d5548494348 4d5548414343 @@ -139135,7 +132221,6 @@ 4d5546464936 4d5546464933 4d5546464559 -4d5546464552 4d5546464544 4d5546463836 4d5546463455 @@ -139144,7 +132229,6 @@ 4d5546433330 4d5546433236 4d5546433136 -4d5546415341 4d55454d5545 4d55454b4b45 4d5544594d59 @@ -139152,7 +132236,6 @@ 4d5544494c4f 4d5544474545 4d5544445933 -4d5544444c45 4d554444494e 4d554444454e 4d5544444459 @@ -139174,8 +132257,6 @@ 4d5542444f59 4d5542424949 4d5541554a42 -4d5541554a42 -4d5541554a42 4d5532303031 4d5531393638 4d5530393837 @@ -139189,7 +132270,6 @@ 4d544f525241 4d544e554747 4d544e475449 -4d544e444557 4d544e424f59 4d544e424b52 4d544e383333 @@ -139202,7 +132282,6 @@ 4d54494c4c53 4d5449474552 4d5448533235 -4d54484f4f44 4d5447534335 4d5447524157 4d5447373635 @@ -139323,7 +132402,6 @@ 4d525a45524f 4d525a313233 4d5258544742 -4d5258544742 4d5258455353 4d5257455354 4d5257455353 @@ -139428,7 +132506,6 @@ 4d5243464c44 4d5242555454 4d5242524f57 -4d5242524f57 4d5242524159 4d52424f5a4f 4d52424c3232 @@ -139508,15 +132585,11 @@ 4d4f58495241 4d4f57455232 4d4f57455231 -4d4f57455231 4d4f57424f58 4d4f56535544 4d4f56534553 4d4f564d4f55 -4d4f56494e47 4d4f56494e33 -4d4f56494553 -4d4f56494553 4d4f56494532 4d4f56494441 4d4f56454531 @@ -139524,16 +132597,12 @@ 4d4f555a4f47 4d4f55584c41 4d4f55564945 -4d4f55544859 -4d4f55544831 4d4f55535459 4d4f55535349 4d4f55534d45 -4d4f55534945 4d4f5553454d 4d4f55534539 4d4f55534536 -4d4f55534531 4d4f55534530 4d4f5553414d 4d4f55524f47 @@ -139569,7 +132638,6 @@ 4d4f544f5252 4d4f544f524f 4d4f544f5238 -4d4f544f5231 4d4f544f4f31 4d4f544f4c4f 4d4f544f4b49 @@ -139578,15 +132646,12 @@ 4d4f544f3437 4d4f544f3139 4d4f544f3131 -4d4f544f3131 4d4f544f3130 4d4f544c494e -4d4f544c4559 4d4f54494d45 4d4f54494b49 4d4f54494653 4d4f54485245 -4d4f54485241 4d4f54484d41 4d4f54455331 4d4f54454c45 @@ -139607,14 +132672,10 @@ 4d4f53533939 4d4f53533839 4d4f53533838 -4d4f53533838 4d4f53533231 4d4f53533138 4d4f534e4152 4d4f534c4552 -4d4f534c454d -4d4f534b5641 -4d4f534b5641 4d4f53494d41 4d4f53494531 4d4f53494131 @@ -139622,16 +132683,13 @@ 4d4f53455354 4d4f53455352 4d4f5345534d -4d4f53455331 4d4f53453537 4d4f53435641 4d4f53434f55 4d4f53414e44 4d4f5341494c -4d4f53414943 4d4f53355741 4d4f53303238 -4d4f5256454e 4d4f52545959 4d4f52545939 4d4f52545935 @@ -139640,14 +132698,11 @@ 4d4f52545449 4d4f5254455a 4d4f52544543 -4d4f52544152 4d4f52543938 4d4f52543339 4d4f52543031 4d4f5253494b 4d4f52533258 -4d4f52524f57 -4d4f52524f57 4d4f52524f4e 4d4f5252494e 4d4f52524544 @@ -139667,7 +132722,6 @@ 4d4f524f4c4f 4d4f524f444f 4d4f524f434f -4d4f524f4348 4d4f524f4343 4d4f524e4943 4d4f524e4159 @@ -139682,7 +132736,6 @@ 4d4f52494553 4d4f52494345 4d4f52494153 -4d4f52494148 4d4f5248414d 4d4f52475331 4d4f5247494e @@ -139690,7 +132743,6 @@ 4d4f52474134 4d4f52463639 4d4f52455345 -4d4f52454e4f 4d4f52454d4f 4d4f52454c4c 4d4f52454b49 @@ -139709,13 +132761,11 @@ 4d4f52434f4d 4d4f52434941 4d4f52434845 -4d4f52424944 4d4f52424559 4d4f52415741 4d4f52415641 4d4f52415441 4d4f52414e4f -4d4f52414e45 4d4f52414e44 4d4f52414953 4d4f52413830 @@ -139725,7 +132775,6 @@ 4d4f50535553 4d4f5053454c 4d4f50533132 -4d4f50504554 4d4f504f5242 4d4f50455931 4d4f50455259 @@ -139738,7 +132787,6 @@ 4d4f4f544c45 4d4f4f544945 4d4f4f534b41 -4d4f4f534537 4d4f4f534530 4d4f4f534521 4d4f4f52544a @@ -139759,14 +132807,12 @@ 4d4f4f4e4f49 4d4f4f4e4c54 4d4f4f4e4b53 -4d4f4f4e4945 4d4f4f4e4741 4d4f4f4e4152 4d4f4f4e3936 4d4f4f4e3930 4d4f4f4e3832 4d4f4f4e3738 -4d4f4f4e3639 4d4f4f4e3636 4d4f4f4e3435 4d4f4f4e3336 @@ -139775,7 +132821,6 @@ 4d4f4f4e3230 4d4f4f4e3136 4d4f4f4e3134 -4d4f4f4e3132 4d4f4f4e3037 4d4f4f4e3030 4d4f4f4d4945 @@ -139793,7 +132838,6 @@ 4d4f4f494b45 4d4f4f49454e 4d4f4f475931 -4d4f4f474c45 4d4f4f474949 4d4f4f474141 4d4f4f473535 @@ -139801,7 +132845,6 @@ 4d4f4f463939 4d4f4f445959 4d4f4f445932 -4d4f4f434f57 4d4f4f434841 4d4f4f424f4f 4d4f4f424942 @@ -139813,7 +132856,6 @@ 4d4f4e594131 4d4f4e593636 4d4f4e593030 -4d4f4e545953 4d4f4e54594a 4d4f4e545945 4d4f4e545943 @@ -139821,22 +132863,17 @@ 4d4f4e545937 4d4f4e545936 4d4f4e545459 -4d4f4e545345 4d4f4e544f52 4d4f4e544f4e 4d4f4e544d33 4d4f4e54494d -4d4f4e54494d 4d4f4e544943 4d4f4e54474f -4d4f4e544553 4d4f4e54454d 4d4f4e544535 -4d4f4e544531 4d4f4e54415a 4d4f4e54414c 4d4f4e54414a -4d4f4e544147 4d4f4e543732 4d4f4e543639 4d4f4e534559 @@ -139850,7 +132887,6 @@ 4d4f4e4b4b4b 4d4f4e4b4949 4d4f4e4b4931 -4d4f4e4b4559 4d4f4e4b4531 4d4f4e4b4149 4d4f4e4b3939 @@ -139876,10 +132912,6 @@ 4d4f4e45594a 4d4f4e455944 4d4f4e455941 -4d4f4e455935 -4d4f4e455934 -4d4f4e455933 -4d4f4e455930 4d4f4e455438 4d4f4e455432 4d4f4e455236 @@ -139934,19 +132966,14 @@ 4d4f4d4f3333 4d4f4d4f3234 4d4f4d4f3031 -4d4f4d4d5953 4d4f4d4d594f 4d4f4d4d5939 -4d4f4d4d5935 4d4f4d4d5930 -4d4f4d4d4945 4d4f4d4d4559 4d4f4d4d4545 4d4f4d4d4159 4d4f4d4d4133 4d4f4d494e47 -4d4f4d444144 -4d4f4d444144 4d4f4d434154 4d4f4d424f59 4d4f4d424f4f @@ -139961,7 +132988,6 @@ 4d4f4c594244 4d4f4c554c55 4d4f4c53554e -4d4f4c534f4e 4d4f4c534f35 4d4f4c534f32 4d4f4c534b49 @@ -139971,15 +132997,9 @@ 4d4f4c4f4e47 4d4f4c4f4b41 4d4f4c4f444f -4d4f4c4c5953 4d4f4c4c594d 4d4f4c4c594b -4d4f4c4c5947 4d4f4c4c5946 -4d4f4c4c5938 -4d4f4c4c5932 -4d4f4c4c5931 -4d4f4c4c5930 4d4f4c4c5553 4d4f4c4c494e 4d4f4c4c4947 @@ -140049,7 +133069,6 @@ 4d4f47555241 4d4f47494c41 4d4f47475953 -4d4f47475359 4d4f47474552 4d4f47313233 4d4f46503435 @@ -140066,7 +133085,6 @@ 4d4f4542454c 4d4f45415a59 4d4f45373132 -4d4f44554c45 4d4f44554c41 4d4f44524953 4d4f44524544 @@ -140079,12 +133097,9 @@ 4d4f44495345 4d4f44495331 4d4f44455241 -4d4f44454e41 4d4f44454e34 4d4f44454d4d 4d4f44454d32 -4d4f44454d31 -4d4f44454c53 4d4f4445414e 4d4f44453132 4d4f44415747 @@ -140096,7 +133111,6 @@ 4d4f43533031 4d4f434c414d 4d4f434b4f57 -4d4f434b4241 4d4f43484f5a 4d4f4348414b 4d4f43484141 @@ -140113,7 +133127,6 @@ 4d4f42523752 4d4f424f4253 4d4f424a4f42 -4d4f42495553 4d4f42494c49 4d4f42494c35 4d4f42454552 @@ -140140,7 +133153,6 @@ 4d4e5946554e 4d4e58523455 4d4e54544342 -4d4e54544342 4d4e54483636 4d4e52414947 4d4e52333739 @@ -140149,7 +133161,6 @@ 4d4e4e593745 4d4e4e393838 4d4e4e323138 -4d4e4d4e4d4e 4d4e4d4d4e4d 4d4e4d434c50 4d4e4d343232 @@ -140335,7 +133346,6 @@ 4d4b524e4745 4d4b524d4b52 4d4b51545a41 -4d4b51545a41 4d4b50393237 4d4b4f5a4151 4d4b4f59414e @@ -140437,7 +133447,6 @@ 4d495a5a4552 4d495a5a454e 4d495a554b49 -4d495a554b49 4d495a554b41 4d495a524544 4d495a4e4552 @@ -140462,11 +133471,9 @@ 4d4955524132 4d49554d4155 4d49545a5542 -4d49545a4945 4d49545a4935 4d49545a4545 4d4954555741 -4d495454454e 4d495454414c 4d4954543231 4d495453554f @@ -140508,12 +133515,10 @@ 4d4953544951 4d4953543532 4d4953543131 -4d4953535959 4d495353594d 4d495353594c 4d495353594a 4d4953535944 -4d4953535931 4d495353554d 4d4953535437 4d4953535431 @@ -140541,7 +133546,6 @@ 4d4953494f4b 4d4953494e4f 4d4953494b49 -4d495349454b 4d4953485459 4d4953484f4f 4d495348414d @@ -140551,9 +133555,7 @@ 4d4953484133 4d495348412e 4d4953483132 -4d4953464954 4d4953455445 -4d4953455259 4d4953434941 4d4953434855 4d4953433132 @@ -140565,12 +133567,10 @@ 4d49524f4e31 4d49524f4841 4d49524e5949 -4d49524c414e 4d49524b4f53 4d49524b4f31 4d49524b454e 4d49524b3039 -4d49524a414d 4d4952495941 4d495246494e 4d495246414b @@ -140579,7 +133579,6 @@ 4d4952434c45 4d4952434849 4d4952415353 -4d4952414e44 4d4952414d41 4d4952414731 4d4952413930 @@ -140615,14 +133614,12 @@ 4d494e534855 4d494e4f554e 4d494e4f5532 -4d494e4f5531 4d494e4f5331 4d494e4f5231 4d494e4f4f4e 4d494e4f4c41 4d494e4f4252 4d494e4e5931 -4d494e4e4f57 4d494e4e4943 4d494e4e4148 4d494e4d4f4e @@ -140640,7 +133637,6 @@ 4d494e4a4145 4d494e495445 4d494e494d55 -4d494e494d45 4d494e494b53 4d494e494853 4d494e494554 @@ -140650,9 +133646,7 @@ 4d494e493938 4d494e493933 4d494e493333 -4d494e493134 4d494e485655 -4d494e475553 4d494e47534f 4d494e474531 4d494e47414e @@ -140792,7 +133786,6 @@ 4d494c455454 4d494c455350 4d494c45534a -4d494c455344 4d494c455342 4d494c455341 4d494c455333 @@ -140807,12 +133800,10 @@ 4d494c424f57 4d494c414e55 4d494c414e53 -4d494c414e41 4d494c414e35 4d494c414e34 4d494c414e32 4d494c414a41 -4d494c414459 4d494c414341 4d494c414141 4d494c413636 @@ -140840,7 +133831,6 @@ 4d494b4b524f 4d494b4b4f4c 4d494b4b4945 -4d494b4b4931 4d494b495353 4d494b495332 4d494b494f31 @@ -140885,9 +133875,7 @@ 4d494b454c53 4d494b454c52 4d494b454c4f -4d494b454c4c 4d494b454c43 -4d494b454c31 4d494b454b41 4d494b454a57 4d494b454a4d @@ -140916,11 +133904,6 @@ 4d494b453837 4d494b453831 4d494b453539 -4d494b453535 -4d494b453133 -4d494b453132 -4d494b453031 -4d494b415341 4d494b414e41 4d494b414c55 4d494b414c53 @@ -140934,11 +133917,9 @@ 4d494b333335 4d494b333333 4d494a554b49 -4d494a4d494a 4d494a415331 4d494a41434b 4d49484d4954 -4d49484b454c 4d4948494a4f 4d4948415252 4d494841494b @@ -140959,15 +133940,12 @@ 4d49454b4553 4d4945414159 4d4944574946 -4d4944574159 4d4944535445 -4d49444f5249 4d49444e4947 4d49444d4944 4d49444c414e 4d4944495449 4d4944474559 -4d4944474554 4d4944474553 4d4944445931 4d494444454c @@ -140984,8 +133962,6 @@ 4d4943534d42 4d4943524f50 4d4943524f4d -4d4943524f31 -4d4943524131 4d4943524131 4d4943504154 4d49434f4f4c @@ -140998,7 +133974,6 @@ 4d49434b5932 4d49434b5930 4d49434b4d45 -4d49434b4559 4d49434b4457 4d49434b4145 4d49434b3235 @@ -141019,10 +133994,7 @@ 4d4943484953 4d494348494f 4d494348494e -4d4943484931 4d4943484154 -4d494348414c -4d4943484145 4d4943483234 4d4943483232 4d4943483138 @@ -141052,13 +134024,10 @@ 4d49414f5558 4d49414e4e41 4d49414e4931 -4d49414d4f52 4d49414d4f4f 4d49414d4955 4d49414d4953 -4d49414d4941 4d49414d4938 -4d49414d4931 4d4941434154 4d4941423231 4d4941333331 @@ -141131,7 +134100,6 @@ 4d464f554353 4d464f524345 4d464c545541 -4d464c545541 244d464a4451 4d4649534859 4d4648534947 @@ -141150,10 +134118,8 @@ 4d4631303230 4d455a5a4139 4d455a4c4554 -4d455a43414c 4d455947414e 4d4559455238 -4d4559455231 4d4558524f4a 4d4558524144 4d4558494330 @@ -141168,7 +134134,6 @@ 4d4555414d4f 4d4555363432 4d4554545552 -4d4554533836 4d4554533234 4d4554533137 4d4554533136 @@ -141176,7 +134141,6 @@ 4d4554524f38 4d4554524f37 4d4554524544 -4d45544f4f31 4d45544f4259 4d45544d4f49 4d45544d4154 @@ -141191,18 +134155,14 @@ 4d4554483044 4d4554474f44 4d4554455834 -4d4554455253 4d4554455231 -4d4554454f52 4d4554454f31 4d4554424f59 4d4554414c5a 4d4554414c4f 4d4554414c49 4d4554414c42 -4d4554414c35 4d4554414c33 -4d4554414c31 4d455441414c 4d4554413533 4d4554413131 @@ -141231,7 +134191,6 @@ 4d455257594e 4d4552564953 4d4552554b49 -4d4552544f4e 4d4552544f31 4d4552544945 4d4552544553 @@ -141252,13 +134211,11 @@ 4d45524c4f53 4d45524c4554 4d45524c414e -4d45524b5552 4d45524b4554 4d45524b4553 4d4552495a4f 4d4552495641 4d4552495448 -4d4552495445 4d4552495341 4d4552494c49 4d455249454c @@ -141267,7 +134224,6 @@ 4d4552494331 4d455249414d 4d4552493839 -4d4552474552 4d4552463239 4d4552454e49 4d4552454e45 @@ -141277,14 +134233,11 @@ 4d4552454845 4d4552435950 4d4552435937 -4d4552435931 4d4552435930 -4d4552435552 4d4552434f31 4d4552434931 4d4552434845 4d455243454c -4d4552434544 4d4552433734 4d4552433639 4d4552433439 @@ -141304,7 +134257,6 @@ 4d455041554c 4d4550323334 4d454f575a41 -4d454f575448 4d454f574d45 4d454f574c53 4d454f573838 @@ -141322,8 +134274,6 @@ 4d454e54554d 4d454e544953 4d454e54454e -4d454e54414c -4d454e54414c 4d454e543455 4d454e535558 4d454e535552 @@ -141378,11 +134328,8 @@ 4d454c4f4f4e 4d454c4f4e4e 4d454c4f4e32 -4d454c4f4e31 4d454c4f3735 4d454c4d4154 -4d454c4c4f57 -4d454c4c4f52 4d454c4c4f4a 4d454c4c4c4c 4d454c4c4259 @@ -141392,12 +134339,7 @@ 4d454c4b494e 4d454c4b494a 4d454c495445 -4d454c495353 -4d454c495353 4d454c494f52 -4d454c494e45 -4d454c494e41 -4d454c494b41 4d454c494b41 4d454c49454b 4d454c494345 @@ -141411,7 +134353,6 @@ 4d454c434f4e 4d454c424153 4d454c415741 -4d454c414e49 4d454c414e45 4d454c414e41 4d454c414e31 @@ -141463,15 +134404,12 @@ 4d45474a4f4e 4d4547494f4e 4d4547494d49 -4d4547474945 -4d4547474945 4d4547415a31 4d4547415452 4d4547415244 4d4547414e54 4d4547414e46 4d4547414e39 -4d4547414e32 4d4547413232 4d4547413231 4d4547413138 @@ -141501,7 +134439,6 @@ 4d4545334241 4d4545333230 4d4544574159 -4d4544564544 4d4544555345 4d4544554b41 4d4544554445 @@ -141510,11 +134447,9 @@ 4d45444e4f45 4d45444d4153 4d4544495553 -4d4544494e41 4d4544494b49 4d4544494338 4d454449415a -4d454449414e 4d4544494137 4d4544494134 4d4544494133 @@ -141527,7 +134462,6 @@ 4d4544414152 4d4544303037 4d4543555445 -4d45434f4f4c 4d45434e4554 4d45434b4e39 4d4543485431 @@ -141559,10 +134493,7 @@ 4d45414e414c 4d4541474841 4d454147454e -4d454147414e 4d4541445331 -4d4541444f57 -4d4541444f57 4d4541444532 4d4539323734 4d4538365453 @@ -141679,7 +134610,6 @@ 4d434f525031 4d434f4f4b45 4d434e4f574e -4d434e45494c 4d434e45414c 4d434d585052 4d434d494e4e @@ -141688,7 +134618,6 @@ 4d434d303133 4d434c55434b 4d434c415544 -4d434c414e45 4d434c414d42 4d434b52464b 4d434b4f4f4c @@ -141696,13 +134625,11 @@ 4d434a41434b 4d4349545932 4d4349545241 -4d4349545241 4d43484f5053 4d4348494546 4d4348454245 4d434755524b 4d4347524f57 -4d4347524157 4d43474f4e31 4d4347484f4f 4d4347454553 @@ -141730,7 +134657,6 @@ 4d4343414646 4d434255434b 4d4342455448 -4d434241494e 4d4341544f4e 4d4341543334 4d4341524c4f @@ -141844,7 +134770,6 @@ 4d415a444152 4d415a44414a 4d415a444138 -4d415a444136 4d415a424e52 4d415a414d41 4d415a414b41 @@ -141872,7 +134797,6 @@ 4d4159474152 4d4159455232 4d4159444f47 -4d4159444159 4d4159434f4d 4d4159424f42 4d415941534f @@ -141912,7 +134836,6 @@ 4d4158593136 4d4158585849 4d4158585831 -4d4158585831 4d4158584545 4d4158583935 4d4158583838 @@ -141948,7 +134871,6 @@ 4d4158495331 4d4158494f4e 4d4158494e33 -4d4158494d4f 4d4158494d32 4d4158494c45 4d4158494949 @@ -141972,7 +134894,6 @@ 4d4158425544 4d4158424554 4d415842414d -4d4158393939 4d4158393931 4d4158383931 4d4158373557 @@ -142003,7 +134924,6 @@ 4d4158303938 4d4158303830 4d4158303039 -4d4158303037 4d4158303032 4d4157494e41 4d41565a3238 @@ -142047,8 +134967,6 @@ 4d41545a4953 4d41545a4548 4d415456494a -4d4154564549 -4d4154555245 4d4154554c41 4d4154545a45 4d4154545958 @@ -142058,11 +134976,9 @@ 4d4154545936 4d4154545935 4d4154545934 -4d4154545931 4d4154545831 4d4154545553 4d415454554b -4d4154545454 4d4154545431 4d415454534f 4d4154545343 @@ -142071,19 +134987,16 @@ 4d4154544d43 4d4154544d32 4d4154544a47 -4d4154544953 4d415454494e 4d415454494c 4d4154544857 4d4154544559 -4d415454454f 4d4154544447 4d4154544252 4d4154543931 4d4154543830 4d4154543752 4d4154543738 -4d4154543738 4d4154543734 4d4154543733 4d4154543731 @@ -142093,7 +135006,6 @@ 4d4154543337 4d4154543331 4d4154543230 -4d4154543131 4d4154543039 4d4154543035 4d4154535953 @@ -142108,7 +135020,6 @@ 4d4154495a41 4d4154495a31 4d4154494f55 -4d4154494f4e 4d4154494b41 4d415449474f 4d4154494348 @@ -142119,16 +135030,12 @@ 4d4154485353 4d4154484f54 4d4154484c41 -4d4154484953 -4d4154484945 -4d4154484557 4d4154483738 4d4154483232 4d4154483133 4d4154483131 4d4154483031 4d4154455931 -4d4154455553 4d4154455331 4d4154454f32 4d4154434859 @@ -142171,7 +135078,6 @@ 4d4153534142 4d4153533939 4d4153533232 -4d4153515545 4d41534f4f4e 4d41534f4e52 4d41534f4e4d @@ -142180,7 +135086,6 @@ 4d41534f4e37 4d41534f4e30 4d41534d4f31 -4d41534d4153 4d41534c4f31 4d41534c4150 4d41534b5554 @@ -142213,7 +135118,6 @@ 4d415343414e 4d4153424a47 4d4153415741 -4d415341544f 4d4153414f31 4d4153414e49 4d4153413333 @@ -142243,13 +135147,11 @@ 4d4152593430 4d4152593333 4d4152593235 -4d4152593137 4d4152593035 4d4152574148 4d4152564f4e 4d415256494c 4d4152564943 -4d415256454c 4d4152563132 4d4152563131 4d4152563032 @@ -142261,11 +135163,9 @@ 4d4152545959 4d4152545955 4d415254594f -4d415254594e 4d415254594d 4d4152545944 4d4152545943 -4d4152545942 4d4152545937 4d4152545934 4d4152545449 @@ -142292,7 +135192,6 @@ 4d4152544136 4d4152544135 4d4152544133 -4d4152544131 4d4152543939 4d4152543838 4d4152543834 @@ -142310,11 +135209,9 @@ 4d415253594c 4d4152535931 4d415253494d -4d415253494b 4d4152534945 4d4152534932 4d4152534853 -4d4152534841 4d4152534159 4d4152534152 4d4152534143 @@ -142359,16 +135256,11 @@ 4d41524d4532 4d41524d414e 4d41524d4143 -4d41524c594e -4d41524c4945 -4d41524c454e -4d41524c4545 4d41524c414e 4d41524c314e 4d41524c3032 4d41524b5950 4d41524b594a -4d41524b5931 4d41524b555a 4d41524b5354 4d41524b5348 @@ -142383,18 +135275,14 @@ 4d41524b4a41 4d41524b494f 4d41524b494d -4d41524b4945 4d41524b484f 4d41524b4831 4d41524b474a -4d41524b4554 4d41524b454d 4d41524b4542 4d41524b4331 4d41524b4252 4d41524b4242 -4d41524b4159 -4d41524b4154 4d41524b4142 4d41524b3936 4d41524b3934 @@ -142418,33 +135306,25 @@ 4d41524a4149 4d4152495a55 4d4152495649 -4d4152495441 4d4152495345 4d4152495055 4d4152494f54 -4d4152494f31 4d4152494e55 4d4152494e53 4d4152494e4b -4d4152494e41 4d4152494e33 4d4152494d4f 4d4152494a4e 4d4152494645 4d4152494557 4d4152494556 -4d4152494553 4d4152494552 4d4152494550 4d415249454a 4d4152494534 -4d4152494531 4d4152494433 4d4152494348 4d415249424f -4d4152494153 -4d4152494132 -4d4152494131 4d4152493931 4d4152493841 4d4152493741 @@ -142458,7 +135338,6 @@ 4d4152475953 4d4152474f56 4d4152474f45 -4d4152474945 4d4152474554 4d4152474553 4d4152474452 @@ -142486,7 +135365,6 @@ 4d415245454e 4d4152454545 4d4152445945 -4d415244554b 4d4152444f4b 4d4152444f47 4d4152444f31 @@ -142503,7 +135381,6 @@ 4d4152435041 4d4152434f5a 4d4152434f57 -4d4152434f53 4d4152434f4c 4d4152434f47 4d4152434f41 @@ -142511,15 +135388,12 @@ 4d4152434f36 4d4152434f34 4d4152434f33 -4d4152434f31 4d4152434f30 4d4152434b52 4d4152434b4f 4d4152434b45 4d415243484f -4d4152434849 4d4152434846 -4d4152434831 4d4152434830 4d415243444d 4d415243424f @@ -142582,7 +135456,6 @@ 4d41504d414e 4d41504c4558 4d41504c4548 -4d41504c4531 4d415047414d 4d4150455831 4d4150454e41 @@ -142610,8 +135483,6 @@ 4d414e55434f 4d414e554341 4d414e554331 -4d414e55414c -4d414e55414c 4d414e553937 4d414e553734 4d414e553338 @@ -142643,7 +135514,6 @@ 4d414e4f4e41 4d414e4f4e39 4d414e4f4c59 -4d414e4f4c4f 4d414e4f4c45 4d414e4f4b53 4d414e4f4b41 @@ -142653,13 +135523,11 @@ 4d414e4f3739 4d414e4f3230 4d414e4f3132 -4d414e4e5959 4d414e4e5945 4d414e4e5942 4d414e4e5938 4d414e4e524f 4d414e4e4f4c -4d414e4e4e4e 4d414e4e4931 4d414e4e4557 4d414e4e4553 @@ -142690,12 +135558,9 @@ 4d414e49455a 4d414e494556 4d414e494441 -4d414e494353 4d414e494345 4d414e494158 -4d414e494143 4d414e494141 -4d414e494131 4d414e493939 4d414e493733 4d414e493132 @@ -142709,7 +135574,6 @@ 4d414e474f44 4d414e474f38 4d414e474f36 -4d414e474f32 4d414e47454e 4d414e47415a 4d414e474149 @@ -142730,7 +135594,6 @@ 4d414e445245 4d414e444f55 4d414e444f34 -4d414e444552 4d414e44454e 4d414e444444 4d414e444159 @@ -142747,17 +135610,13 @@ 4d414e415531 4d414e415345 4d414e415244 -4d414e415241 4d414e414e4f -4d414e414e44 4d414e414c41 -4d414e414745 4d414e414556 4d414e41454e 4d414e373839 4d414e373134 4d414e363738 -4d414e354f4e 4d414e353637 4d414e343839 4d414e333131 @@ -142784,7 +135643,6 @@ 4d414d4d4941 4d414d4d4157 4d414d4d4152 -4d414d4d414d 4d414d4d4133 4d414d4b4134 4d414d4b4133 @@ -142808,7 +135666,6 @@ 4d414d425255 4d414d424f53 4d414d424f36 -4d414d424f31 4d414d424141 4d414d415941 4d414d41544f @@ -142816,7 +135673,6 @@ 4d414d414e35 4d414d414d4d 4d414d414d43 -4d414d414d41 4d414d414c59 4d414d414c41 4d414d414b4f @@ -142842,7 +135698,6 @@ 4d414d413237 4d414d413235 4d414d413234 -4d414d413133 4d414d413039 4d414d413036 4d414d413035 @@ -142871,18 +135726,15 @@ 4d414c4c4f4e 4d414c4c4b55 4d414c4c494b -4d414c4c4554 4d414c4c454e 4d414c4c4544 4d414c4c414e 4d414c4b4f56 4d414c4b4f4d 4d414c494e4f -4d414c494e41 4d414c494c49 4d414c494b57 4d414c494b53 -4d414c494b41 4d414c494b35 4d414c494645 4d414c49454e @@ -142904,7 +135756,6 @@ 4d414c444f52 4d414c444f4e 4d414c435944 -4d414c434f4d 4d414c434859 4d414c434152 4d414c42524f @@ -142912,7 +135763,6 @@ 4d414c415649 4d414c414d31 4d414c414c41 -4d414c414b49 4d414c414745 4d414c41434f 4d414c414348 @@ -142926,7 +135776,6 @@ 4d414b53594d 4d414b535544 4d414b535353 -4d414b53494d 4d414b534554 4d414b533933 4d414b533930 @@ -142941,7 +135790,6 @@ 4d414b52414d 4d414b4f5933 4d414b4f5649 -4d414b4f544f 4d414b4f5349 4d414b4f4c41 4d414b4f4b4f @@ -142992,7 +135840,6 @@ 4d414a4f4e47 4d414a4b4f31 4d414a494b38 -4d414a494b31 4d414a494445 4d414a494441 4d414a494343 @@ -143010,7 +135857,6 @@ 4d4149535936 4d414953544f 4d4149535441 -4d4149534945 4d4149524553 4d414952454e 4d4149524132 @@ -143051,7 +135897,6 @@ 4d41484d4f55 4d41484d4f4f 4d41484d4144 -4d41484c4552 4d41484b554d 4d4148495241 4d4148455248 @@ -143081,28 +135926,19 @@ 4d41474e5953 4d41474e4f4c 4d41474e4558 -4d41474e4554 -4d41474e4554 4d41474e4531 -4d41474e4131 4d41474d4f4f 4d41474d4943 4d41474a414e -4d41474a414e 4d4147495941 4d4147495831 4d4147494e4e 4d4147494e49 4d4147494553 -4d4147494552 -4d4147494353 -4d414749434b -4d4147494332 4d414749414e 4d4147493134 4d4147475936 4d4147475553 -4d4147474f54 4d414747494e 4d4147474545 4d4147474541 @@ -143116,7 +135952,6 @@ 4d4147444153 4d414744414b 4d4147444141 -4d4147444131 4d4147434f4d 4d4147424159 4d4147415353 @@ -143169,7 +136004,6 @@ 4d41444f5249 4d41444f4a45 4d41444e5547 -4d41444d4144 4d41444c594e 4d41444c5931 4d41444c494e @@ -143183,7 +136017,6 @@ 4d41444a4143 4d4144494e58 4d4144494e45 -4d4144494e41 4d4144494d41 4d4144494b4f 4d4144494841 @@ -143204,11 +136037,9 @@ 4d4144453333 4d4144445935 4d4144445933 -4d4144444f47 4d4144444958 4d4144444953 4d414444494e -4d4144444945 4d4144444144 4d4144443047 4d4144425547 @@ -143249,12 +136080,8 @@ 4d41434e5554 4d41434e4554 4d41434d4943 -4d41434d414e 4d41434d4144 -4d41434d4143 4d41434c4545 -4d41434b5931 -4d41434b494e 4d41434b4550 4d41434b444a 4d41434b3938 @@ -143265,17 +136092,14 @@ 4d41434b3335 4d41434b3333 4d41434b3137 -4d41434b3130 4d41434b3039 4d41434a4143 -4d4143495553 4d4143494f31 4d4143485542 4d4143484f54 4d4143484f4f 4d4143484f37 4d414348494f -4d414348494e 4d4143484932 4d4143484554 4d414348454c @@ -143312,7 +136136,6 @@ 4d4143414e41 4d4143414c55 4d414341444f -4d414341434f 4d414341434b 4d4143414249 4d4143413132 @@ -143333,10 +136156,8 @@ 4d4143313857 4d4143313539 4d4143313238 -4d4143313233 4d4143313131 4d4143313034 -4d4143303031 4d4142555455 4d4142554e41 4d4142534559 @@ -143413,7 +136234,6 @@ 4d3537374132 4d353733394c 4d35364d3530 -4d3535353535 4d3534523730 4d353331354b 4d3530303031 @@ -143490,7 +136310,6 @@ 4d3135323749 4d3134333038 4d3133353137 -4d313233344d 4d3132333132 4d3132323333 4d3131324555 @@ -143537,7 +136356,6 @@ 4c595a5a4148 4c595a455249 4c5955424147 -4c5954544f4e 4c595448414d 4c5954455952 4c5953593239 @@ -143590,14 +136408,12 @@ 4c5947455232 4c5946494e4e 4c5945554e42 -4c5945554e42 4c5945524c59 4c59454f5737 4c5944524f53 4c59444f3538 4c5944494147 4c5944494143 -4c5944494131 4c5944413837 4c5944393633 4c594352414e @@ -143611,7 +136427,6 @@ 4c5941333433 4c5858493255 4c5844554d42 -4c5844554d42 4c5844384f30 4c58424f5933 4c5834373030 @@ -143648,7 +136463,6 @@ 4c555954454e 4c55594b5937 4c5558584f52 -4c5558555259 4c5558554d49 4c55584f5259 4c55584f5232 @@ -143674,8 +136488,6 @@ 4c5556345532 4c5556343335 4c5556324d38 -4c5556323639 -4c5556323639 4c55545a5a5a 4c55545a454e 4c55545a3138 @@ -143687,7 +136499,6 @@ 4c5554415348 4c555354524f 4c5553545245 -4c5553544552 4c55534d4152 4c55534b494e 4c5553494e41 @@ -143696,10 +136507,8 @@ 4c5553484b41 4c5553484553 4c5553415350 -4c5553414b41 4c55525a5547 4c55524b4559 -4c55524b4552 4c5552494131 4c5552444553 4c5552434859 @@ -143744,8 +136553,6 @@ 4c554e413535 4c554e413135 4c554e343642 -4c554d505931 -4c554d505931 4c554d505553 4c554d50454e 4c554d503636 @@ -143783,7 +136590,6 @@ 4c554b454153 4c554b453938 4c554b453935 -4c554b453639 4c554b453636 4c554b453537 4c554b453531 @@ -143792,12 +136598,10 @@ 4c554b453238 4c554b453230 4c554b453130 -4c554b453031 4c554b415741 4c554b415348 4c554b415338 4c554b415334 -4c554b415334 4c554b415332 4c554b413738 4c554b313233 @@ -143805,12 +136609,10 @@ 4c554953544f 4c5549534d41 4c5549534a41 -4c5549534954 4c5549534953 4c5549534531 4c5549534341 4c5549534146 -4c5549534131 4c5549533937 4c5549533838 4c5549533737 @@ -143843,7 +136645,6 @@ 4c5544455253 4c5544454e53 4c5544454d45 -4c5544444552 4c554444454e 4c5544415441 4c5544413735 @@ -143866,11 +136667,8 @@ 4c5543593236 4c5543593139 4c5543593133 -4c5543593132 -4c5543593030 4c5543554c53 4c55434f4e45 -4c55434b5953 4c55434b5948 4c55434b5921 4c55434b5331 @@ -143889,7 +136687,6 @@ 4c5543494e48 4c5543494e45 4c5543494552 -4c554349454e 4c5543494445 4c5543494439 4c5543494153 @@ -143940,7 +136737,6 @@ 4c54594d5246 4c545942484a 4c5459424338 -4c5459424331 4c5459313235 4c5459313233 4c54574f5246 @@ -143976,7 +136772,6 @@ 4c54314c5431 4c5430323130 4c5356544742 -4c5356544543 4c5356363636 4c5355544947 4c53554e4f31 @@ -144020,15 +136815,12 @@ 4c5231323334 4c5231303536 4c5157544642 -4c5157544642 4c5157343035 4c5155455354 4c5152383235 4c5152383234 4c514c475143 4c5056544542 -4c5056544542 -4c5056544542 4c5054515a58 4c50534e5842 4c50534c5945 @@ -144060,7 +136852,6 @@ 4c4f57525931 4c4f57494531 4c4f57455353 -4c4f57455259 4c4f57455252 4c4f57455235 4c4f57455232 @@ -144092,26 +136883,20 @@ 4c4f56455255 4c4f5645524f 4c4f56455249 -4c4f56455231 4c4f5645522e 4c4f56454e53 4c4f56454e41 4c4f56454d32 4c4f56454a4b -4c4f56454953 -4c4f5645494e 4c4f5645474f -4c4f56454545 4c4f56454531 4c4f56454353 4c4f5645434d -4c4f56454255 4c4f5645424f 4c4f5645424d 4c4f56454154 4c4f56454149 4c4f56454141 -4c4f56453938 4c4f56453934 4c4f56453931 4c4f56453837 @@ -144123,17 +136908,11 @@ 4c4f56453630 4c4f56453536 4c4f56453531 -4c4f56453455 4c4f5645344d 4c4f56453433 4c4f56453336 4c4f56453335 4c4f56453334 -4c4f56453235 -4c4f56453234 -4c4f56453232 -4c4f56453131 -4c4f56453131 2a4c4f56452a 4c4f56434f56 4c4f56415454 @@ -144151,9 +136930,7 @@ 4c4f554c4152 4c4f554c4131 4c4f554a4159 -4c4f55495353 4c4f55495339 -4c4f55495332 4c4f55494554 4c4f5549454c 4c4f5549454a @@ -144169,7 +136946,6 @@ 4c4f55424552 4c4f55415244 4c4f55315345 -4c4f54555337 4c4f54544f32 4c4f54544545 4c4f544f544f @@ -144181,7 +136957,6 @@ 4c4f54464931 4c4f54414e41 4c4f54313032 -4c4f53544954 4c4f53543838 4c4f53543730 4c4f53543536 @@ -144190,13 +136965,11 @@ 4c4f53543039 4c4f53543032 4c4f53535353 -4c4f534e4148 4c4f534b4f56 4c4f5348494d 4c4f53484553 4c4f53455258 4c4f53455239 -4c4f53455231 4c4f53455221 4c4f53454e31 4c4f53414d4f @@ -144233,10 +137006,7 @@ 4c4f52493233 4c4f52493130 4c4f5245524f -4c4f52454e31 4c4f52454c41 -4c4f5245414c -4c4f5244494b 4c4f52444945 4c4f52444558 4c4f52444553 @@ -144255,7 +137025,6 @@ 4c4f52414e4e 4c4f52414e31 4c4f52414b31 -4c4f5241494e 4c4f52383637 4c4f52353030 4c4f52333136 @@ -144263,18 +137032,14 @@ 4c4f5050494b 4c4f50504552 4c4f504f5a41 -4c4f50455a5a 4c4f50455a39 4c4f50455a37 -4c4f50455a31 4c4f50455441 4c4f50455253 4c4f50455241 4c4f50454b49 4c4f50453734 4c4f50453136 -4c4f50415441 -4c4f50415441 4c4f50313233 4c4f4f574954 4c4f4f544945 @@ -144283,8 +137048,6 @@ 4c4f4f535441 4c4f4f534559 4c4f4f534553 -4c4f4f534552 -4c4f4f534531 4c4f4f505353 4c4f4f504c4f 4c4f4f50494e @@ -144299,10 +137062,8 @@ 4c4f4f4e3332 4c4f4f4e3131 4c4f4f4d5041 -4c4f4f4d4953 4c4f4f4d4153 4c4f4f4c4949 -4c4f4f4b5550 4c4f4f4b5359 4c4f4f4b5345 4c4f4f4b4f55 @@ -144312,7 +137073,6 @@ 4c4f4f4b3737 4c4f4f4b3639 4c4f4f4b3455 -4c4f4f4b3455 4c4f4f4b3232 4c4f4f4b3131 4c4f4f464148 @@ -144325,7 +137085,6 @@ 4c4f4e54494b 4c4f4e535452 4c4f4e4e5931 -4c4f4e4e4945 4c4f4e4b4152 4c4f4e475553 4c4f4e474d41 @@ -144342,7 +137101,6 @@ 4c4f4e473233 4c4f4e473232 4c4f4e473133 -4c4f4e455231 4c4f4e444953 4c4f4e444552 4c4f4e434f4e @@ -144351,7 +137109,6 @@ 4c4f4e323433 4c4f4d553131 4c4f4d504552 -4c4f4d4f4e44 4c4f4d49544f 4c4f4d49534d 4c4f4d454c49 @@ -144380,7 +137137,6 @@ 4c4f4c4e5542 4c4f4c4c594b 4c4f4c4c4c4c -4c4f4c4c4936 4c4f4c4c4150 4c4f4c4c3434 4c4f4c4c3132 @@ -144397,7 +137153,6 @@ 4c4f4c455441 4c4f4c455254 4c4f4c455253 -4c4f4c434154 4c4f4c414641 4c4f4c414150 4c4f4c413839 @@ -144426,13 +137181,11 @@ 4c4f4b494c4c 4c4f4b493938 4c4f4b493930 -4c4f4b493839 4c4f4b493730 4c4f4b493639 4c4f4b493334 4c4f4b493232 4c4f4b493137 -4c4f4b493131 4c4f4b493037 4c4f4b45454e 4c4f4b444f47 @@ -144454,7 +137207,6 @@ 4c4f484d414e 4c4f48494e41 4c4f48415249 -4c4f48313233 4c4f48313131 4c4f475a5a5a 4c4f475a4150 @@ -144473,7 +137225,6 @@ 4c4f47494e39 4c4f47494e36 4c4f47494e35 -4c4f47494e31 4c4f47493132 4c4f47455253 4c4f47454e31 @@ -144482,12 +137233,7 @@ 4c4f47414e4f 4c4f47414e4c 4c4f47414e45 -4c4f47414e45 -4c4f47414e35 -4c4f47414e32 4c4f47323341 -4c4f46545553 -4c4f46544f4e 4c4f464f5945 4c4f464c494e 4c4f46494e4b @@ -144516,20 +137262,16 @@ 4c4f434f3234 4c4f434f3232 4c4f434e5553 -4c4f434b5550 4c4f434b4553 -4c4f434b4544 4c4f434b3736 4c4f434b3435 4c4f4348494e 4c4f43484552 4c4f43464142 -4c4f43415445 4c4f4341534f 4c4f43414e47 4c4f43414c39 4c4f43414c35 -4c4f43414c31 4c4f43313233 4c4f424f5341 4c4f424f5337 @@ -144552,9 +137294,6 @@ 4c4f414e4552 4c4f41445341 4c4f4144494e -4c4f41444552 -4c4f41444544 -4c4f41444544 4c4f41443936 4c4f41443737 4c4f41443133 @@ -144607,7 +137346,6 @@ 4c4c524c4c52 4c4c504c4c50 4c4c4f595f53 -4c4c4f594453 4c4c4f594435 4c4c4f594433 4c4c4f594432 @@ -144619,7 +137357,6 @@ 4c4c4c4f4f4f 4c4c4c4d4d4d 4c4c4c4c4c4f -4c4c4c4c4c4c 4c4c4c4c4c32 4c4c4c4c454d 4c4c4c4a4a4a @@ -144666,7 +137403,6 @@ 4c4b4f493030 4c4b4a4f415a 4c4b4a484736 -4c4b4a484731 4c4b4a393837 4c4b4a303938 4c4b48393130 @@ -144682,7 +137418,6 @@ 4c4a55424943 4c4a5350514b 4c4a50545941 -4c4a50545941 4c4a50313233 4c4a4f4e4553 4c4a4b4d5854 @@ -144710,7 +137445,6 @@ 4c495a534f4e 4c495a4f4b32 4c495a483132 -4c495a455448 4c495a44495a 4c495a444731 4c495a424554 @@ -144741,9 +137475,7 @@ 4c49564c4956 4c4956494552 4c4956494131 -4c4956455331 4c4956455237 -4c4956454c59 4c4956454954 4c4956454453 4c4956453739 @@ -144781,7 +137513,6 @@ 4c49535a5431 4c4953554e59 4c4953544554 -4c4953544552 4c495354454b 4c4953543332 4c4953543130 @@ -144829,7 +137560,6 @@ 4c4953413037 4c4953413036 4c4953413034 -4c4953413031 4c4953333030 4c49524f5431 4c4952413233 @@ -144837,11 +137567,8 @@ 4c4951554531 4c4951303034 4c4950574549 -4c4950544f4e 4c495054414b -4c4950533639 4c4950505931 -4c4950504552 4c49504f4c49 4c4950494e47 4c4950494b41 @@ -144857,11 +137584,9 @@ 4c494f4e5336 4c494f4e5333 4c494f4e5332 -4c494f4e5331 4c494f4e4f57 4c494f4e4c45 4c494f4e494f -4c494f4e454c 4c494f4e4153 4c494f4e3937 4c494f4e3930 @@ -144883,14 +137608,12 @@ 4c494e583636 4c494e564f59 4c494e555338 -4c494e555331 4c494e544552 4c494e534159 4c494e504153 4c494e4f4f4f 4c494e4e4845 4c494e4e454c -4c494e4e4541 4c494e4e4131 4c494e4e3437 4c494e4d414e @@ -144933,11 +137656,8 @@ 4c494e444f52 4c494e444f31 4c494e444b45 -4c494e444552 4c494e444154 -4c494e444152 4c494e444150 -4c494e44414c 4c494e444145 4c494e444134 4c494e443838 @@ -145009,7 +137729,6 @@ 4c494c4c5936 4c494c4c5934 4c494c4c4f4e -4c494c4c494c 4c494c4c4949 4c494c4c4931 4c494c4c4533 @@ -145020,7 +137739,6 @@ 4c494c4a414d 4c494c495931 4c494c495454 -4c494c495448 4c494c495441 4c494c495341 4c494c494e47 @@ -145071,7 +137789,6 @@ 4c494748544f 4c4947485445 4c4947485442 -4c4947485437 4c4947485436 4c4947485434 4c4947485433 @@ -145087,7 +137804,6 @@ 4c4945545553 4c4945545441 4c4945534c31 -4c4945534a45 4c4945534131 4c4945524e41 4c49454e444f @@ -145100,10 +137816,8 @@ 4c4945424553 4c4945424536 4c4945424531 -4c4945424531 4c4945324d45 4c4944555250 -4c4944495941 4c4944494153 4c4944494132 4c494444454c @@ -145113,7 +137827,6 @@ 4c4944353637 4c49434b5931 4c49434b5532 -4c49434b4954 4c49434b4545 4c494348524f 4c4943484954 @@ -145133,7 +137846,6 @@ 4c4942425947 4c4942425838 4c4942425241 -4c4942424552 4c494150554c 4c4941504941 4c49414e4b41 @@ -145159,11 +137871,9 @@ 4c484d373737 4c4847573132 4c4846594252 -4c4846524a59 4c4845554a51 4c484555465a 4c4845554659 -4c4845504d5a 4c48454f4d41 4c4845455345 4c4843484f50 @@ -145176,7 +137886,6 @@ 4c4831313938 4c475245454e 4c474d545641 -4c474d545641 4c474d393233 4c474c473333 4c474c454e4e @@ -145202,12 +137911,10 @@ 4c4649463132 4c4649463036 4c4649463030 -4c4649454b5a 4c46484d5a31 4c46484d5246 4c46484a4446 4c4648434252 -4c4648425946 4c4648425646 4c4648424946 4c4643344652 @@ -145235,7 +137942,6 @@ 4c4558555349 4c4558555343 4c4558555335 -4c4558555335 4c4558555330 4c4558553541 4c4558535558 @@ -145261,7 +137967,6 @@ 4c4557495357 4c4557495341 4c4557495336 -4c4557495331 4c4557454b30 4c4557424f59 4c4557415253 @@ -145284,7 +137989,6 @@ 4c4556493033 4c4556455454 4c4556455254 -4c4556454e54 4c455642454e 4c4556415941 4c4556415331 @@ -145307,7 +138011,6 @@ 4c4554484553 4c4554484521 4c4554484157 -4c455448414c 4c455448355a 4c455445524f 4c45535a435a @@ -145325,7 +138028,6 @@ 4c45534e4159 4c45534d495a 4c45534c4157 -4c45534c4157 4c45534b4f31 4c4553494e41 4c4553494b49 @@ -145362,12 +138064,10 @@ 4c4552413231 4c4552413136 4c4552413131 -4c4552413131 4c4550554953 4c455053494b 4c4550505931 4c455050494b -4c4550504552 4c4550455354 4c454f534558 4c454f4f4f4f @@ -145380,8 +138080,6 @@ 4c454f4e495a 4c454f4e494c 4c454f4e494b -4c454f4e4944 -4c454f4e4152 4c454f4e414d 4c454f4e4142 4c454f4e4138 @@ -145424,10 +138122,8 @@ 4c454e4e594d 4c454e4e5949 4c454e4e5947 -4c454e4e4f58 4c454e4e4f52 4c454e4e4559 -4c454e4e4152 4c454e4b494e 4c454e4b414d 4c454e4b4141 @@ -145445,11 +138141,9 @@ 4c454e413936 4c454e413934 4c454e413837 -4c454e413836 4c454e413832 4c454e413831 4c454e413739 -4c454e413739 4c454e413735 4c454e413733 4c454e413732 @@ -145463,14 +138157,11 @@ 4c454e413236 4c454e413231 4c454e413150 -4c454e413131 4c454e413037 4c454e313233 4c454d555232 4c454d4f5254 4c454d4f4e45 -4c454d4f4e44 -4c454d4f4e31 4c454d4f4e5f 4c454d4d4945 4c454d4d4545 @@ -145511,12 +138202,10 @@ 4c4549534552 4c4549524241 4c45494e4553 -4c45494e4144 4c45494d4552 4c45494c4153 4c45494c4131 4c45494b4552 -4c4549474841 4c4549474834 4c4549463139 4c454943414d @@ -145530,7 +138219,6 @@ 4c454755494e 4c4547554932 4c4547544945 -4c4547534558 4c4547533031 4c4547524f4e 4c4547524950 @@ -145543,7 +138231,6 @@ 4c45474f3131 4c45474f3030 4c4547495439 -4c4547494f4e 4c4547494f32 4c4547494a41 4c4547494552 @@ -145580,8 +138267,6 @@ 4c45454e4131 4c45454d4154 4c45454c5545 -4c45454c4f4f -4c45454c4545 4c45454c4148 4c45454b4945 4c45454b4159 @@ -145599,7 +138284,6 @@ 4c4545424f59 4c4545424f42 4c4545424154 -4c4545414e4e 4c4545414e44 4c4545414e41 4c4545414441 @@ -145614,7 +138298,6 @@ 4c4545303031 4c4545303030 4c45445a5a5a -4c45445a4550 4c4544554353 4c4544534531 4c454452414d @@ -145622,8 +138305,6 @@ 4c45444e4552 4c4544495441 4c4544494c49 -4c4544474552 -4c4544474552 4c4544455231 4c4544454f47 4c4544414c45 @@ -145631,10 +138312,8 @@ 4c4544313233 4c4543534535 4c45434f4e41 -4c45434d5246 4c45434c4552 4c45434b4945 -4c45434b4552 4c4543484f4e 4c4543484d49 4c4543484150 @@ -145651,7 +138330,6 @@ 4c4541534841 4c4541534547 4c4541534531 -4c4541534531 4c4541525448 4c4541524e32 4c4541524348 @@ -145673,11 +138351,8 @@ 4c4541483131 4c4541483034 4c4541483033 -4c4541475545 -4c4541465331 4c4541464552 4c454144494e -4c4541444552 4c454144454e 4c4541373333 4c4541363333 @@ -145703,7 +138378,6 @@ 4c4452373137 4c444f433136 4c444a545341 -4c444a545341 4c444a485457 4c444a454533 4c4448454e44 @@ -145752,7 +138426,6 @@ 4c42564d5a59 4c42564a5931 4c42564a4946 -4c42564a4946 4c4256465931 4c4256465646 4c4256463939 @@ -145780,8 +138453,6 @@ 4c424a313233 4c42494c4c59 4c4248545141 -4c4248545141 -4c4248545141 4c4245514955 4c424534394a 4c42444b3534 @@ -145819,7 +138490,6 @@ 4c41594c4153 4c41594c4144 4c41594c4132 -4c41594c4131 4c4159455233 4c4159455231 4c4159414e49 @@ -145838,16 +138508,12 @@ 4c4157533532 4c415752454e 4c41574e4544 -4c41574d414e 4c41574c4f52 4c41574c4559 4c41574c4553 4c4157494e47 4c4157494e45 -4c4157494e41 -4c4157444f47 4c4157444f43 -4c4157424f59 4c4157414e44 4c4157323232 4c4157313532 @@ -145873,7 +138539,6 @@ 4c4155534552 4c4155533130 4c4155524f31 -4c415552494e 4c415552494b 4c4155524931 4c4155524553 @@ -145884,7 +138549,6 @@ 4c415552415a 4c4155524157 4c4155524154 -4c4155524131 4c4155523130 4c41554e4943 4c41554e3637 @@ -145896,7 +138560,6 @@ 4c4154544534 4c4154524943 4c4154523134 -4c41544f5941 4c41544f4e41 4c41544e494b 4c41544d414e @@ -145906,13 +138569,10 @@ 4c4154494e4e 4c4154494e34 4c4154494b41 -4c4154494641 -4c4154494353 4c4154494153 4c4154493639 4c4154484553 4c4154484531 -4c4154455831 4c415445525a 4c415445494e 4c4154313233 @@ -145932,7 +138592,6 @@ 4c41534c4f31 4c41534c4945 4c41534b4931 -4c41534b4552 4c41534b4132 4c41534b4131 4c4153495349 @@ -145941,7 +138600,6 @@ 4c415348554e 4c415348544c 4c4153484e4f -4c4153484552 4c4153484152 4c415345524c 4c4153455236 @@ -145956,14 +138614,11 @@ 4c415253534f 4c415253534a 4c4152534831 -4c415253454e 4c4152534441 4c4152533939 4c4152533131 4c4152533030 4c415252594e -4c4152525942 -4c4152525931 4c4152525930 4c4152525259 4c4152524945 @@ -145976,7 +138631,6 @@ 4c41524d414e 4c41524d414c 4c41524b4f31 -4c41524b494e 4c41524b454e 4c41524b3635 4c41524b3137 @@ -146014,7 +138668,6 @@ 4c4152354f4e 4c4152303031 4c4150555445 -4c4150544f50 4c415050494e 4c41504f4e49 4c41504c4150 @@ -146038,7 +138691,6 @@ 4c414e583536 4c414e545a4b 4c414e545553 -4c414e545553 4c414e544f53 4c414e544f4e 4c414e54494d @@ -146074,7 +138726,6 @@ 4c414e44494b 4c414e444941 4c414e444556 -4c414e444553 4c414e443132 4c414e443031 4c414e435331 @@ -146083,11 +138734,9 @@ 4c414e43454f 4c414e434547 4c414e434537 -4c414e434537 4c414e434536 4c414e434535 4c414e434532 -4c414e434531 4c414e434530 4c414e434150 4c414e424f59 @@ -146097,7 +138746,6 @@ 4c414e413734 4c414e413434 4c414e413231 -4c414e413230 4c414e413133 4c414e413031 4c414d534f4e @@ -146116,9 +138764,7 @@ 4c414d4f3833 4c414d4d4945 4c414d494131 -4c414d455253 4c414d455232 -4c414d454e54 4c414d454c41 4c414d454553 4c414d453132 @@ -146126,13 +138772,11 @@ 4c414d424f4f 4c414d424f47 4c414d424f33 -4c414d424f31 4c414d424141 4c414d423132 4c414d415a4f 4c414d415a49 4c414d415441 -4c414d415252 4c414d41524b 4c414d415241 4c414d415234 @@ -146155,7 +138799,6 @@ 4c414c494b4f 4c414c41504f 4c414c414d4f -4c414c414c41 4c414c413938 4c414c413839 4c414c413838 @@ -146176,7 +138819,6 @@ 4c414b4f4441 4c414b4d414e 4c414b494444 -4c414b455353 4c414b455244 4c414b455238 4c414b454e31 @@ -146207,7 +138849,6 @@ 4c4148313935 4c4147583234 4c4147545041 -4c4147545041 4c4147524154 4c41474f5244 4c41474e4542 @@ -146253,14 +138894,12 @@ 4c4144495241 4c4144494e4f 4c414449455a -4c4144494553 4c4144494441 4c414445524f 4c4144455241 4c4144445932 4c4144445931 4c4144444f4f -4c4144444552 4c4144413939 4c4144413735 4c4144413639 @@ -146299,7 +138938,6 @@ 4c414254454b 4c4142524954 4c4142524541 -4c41424f5552 4c41424f5441 4c41424f524e 4c41424f5245 @@ -146311,8 +138949,6 @@ 4c4142434142 4c4142425241 4c414242414e -4c4142415454 -4c4142415454 4c4142415445 4c4142415254 4c4142415252 @@ -146378,7 +139014,6 @@ 4c3141494b41 4c3139443035 4c3137353353 -4c3137353353 4c3137353053 4c3137333253 4c3137313953 @@ -146395,7 +139030,6 @@ 4c3056453333 4c3054484152 4c305231334e -4c305231334e 4c3050455a35 4c304d384730 4c304c575554 @@ -146412,7 +139046,6 @@ 4b5a55454952 4b5a4f4f4454 4b5a4d313435 -4b5a4b4d5246 4b5a4b425946 4b5a47584252 4b5a4547454c @@ -146487,7 +139120,6 @@ 4b5854414e47 4b584d4f544f 4b5844554d42 -4b5844554d42 4b5759415454 4b575839354e 4b5758333538 @@ -146541,8 +139173,6 @@ 4b5559504552 4b55594f4d41 4b5558474d37 -4b5557414954 -4b5557414954 4b555741474f 4b5556494b35 4b5556455241 @@ -146596,7 +139226,6 @@ 4b55524b494e 4b55524b4945 4b5552495355 -4b5552495355 4b5552494e41 4b5552494c41 4b555249414e @@ -146616,7 +139245,6 @@ 4b554e59554b 4b554e545259 4b554e54494c -4b554e54414f 4b554e544141 4b554e4f3132 4b554e4f3130 @@ -146625,9 +139253,6 @@ 4b554e494e47 4b554e494b4f 4b554e493434 -4b554e474655 -4b554e474655 -4b554e47454e 4b554e45444f 4b554e44595a 4b554e445241 @@ -146639,7 +139264,6 @@ 4b554d50454c 4b554d4d5255 4b554d4d454c -4b554d4b554d 4b554d443345 4b554d415a4f 4b554d415252 @@ -146659,7 +139283,6 @@ 4b554c494c49 4b554c49434b 4b554c444152 -4b554c424954 4b554c353135 4b554b555341 4b554b555249 @@ -146687,7 +139310,6 @@ 4b554445314e 4b5543575552 4b55434b5543 -4b55434b5543 4b55434b454e 4b554348554b 4b5542555337 @@ -146712,8 +139334,6 @@ 4b5536323832 4b5532303030 4b545a544942 -4b545a544942 -4b545a544942 4b5459524a56 4b54594d5246 4b54594a5852 @@ -146724,29 +139344,24 @@ 4b5459463234 4b5459463136 4b5459463131 -4b545945435a 4b545942594a 4b5457585852 4b5455524251 4b5454313832 4b5452494245 -4b5452434543 4b5452413939 4b5452393939 -4b5451434659 4b544f54414d 4b544f4b544f 4b544e594251 4b544e4a3131 4b544d4c4338 -4b544d4c4338 4b544d393930 4b544d363430 4b544d363230 4b544d353031 4b544d353030 4b544d343530 -4b544d333030 4b544d32524d 4b544b545246 4b544b544b54 @@ -146787,12 +139402,10 @@ 4b5359555841 4b5359314148 4b5359313233 -4b5357495353 4b535749524c 4b5357313536 4b5357313331 4b53564b5356 -4b5355534841 4b53554e5941 4b5355373737 4b53544f564f @@ -146809,7 +139422,6 @@ 4b534944594d 4b53484b5348 4b53454e5541 -4b53454e4959 4b5345434444 4b5344443944 4b5344303938 @@ -146832,24 +139444,19 @@ 4b5331313138 4b5331303031 4b5330393131 -4b525954454e 4b5259535459 4b5259505430 -4b52594c4f4e 4b52594b5259 4b525943454b -4b5258544742 4b5256505037 4b52555a4f46 4b525554494b -4b5255535459 4b5255535045 4b5255534b41 4b5255534941 4b5255505053 4b525550494e 4b5255504558 -4b52554d4d45 4b52554b4f56 4b5255473232 4b5255454d45 @@ -146866,7 +139473,6 @@ 4b524f534841 4b524f534552 4b524f51464d -4b524f4e4f53 4b524f4e4f31 4b524f4e4958 4b524f4e4953 @@ -146874,13 +139480,11 @@ 4b524f4e454e 4b524f4e4531 4b524f4e4441 -4b524f4c494b 4b524f4c414b 4b524f4b4f44 4b524f4b4953 4b524f4b3739 4b524f47454e -4b524f455445 4b524f424152 4b524e454b49 4b524e313233 @@ -146893,7 +139497,6 @@ 4b52495a5a59 4b524954494b 4b524954414e -4b5249535441 4b5249535432 4b5249535345 4b524953484d @@ -146953,7 +139556,6 @@ 4b5241594c41 4b524159454d 4b5241564954 -4b5241555345 4b5241544f4e 4b5241535449 4b5241535345 @@ -146998,7 +139600,6 @@ 4b51454a4b44 4b5143333333 4b51344a355a -4b5056544542 4b50564a4a47 4b5053313233 4b5052494445 @@ -147054,7 +139655,6 @@ 4b4f55474945 4b4f55444135 4b4f545a454e -4b4f545a454e 4b4f54573131 4b4f54545552 4b4f54544b45 @@ -147065,7 +139665,6 @@ 4b4f544c494e 4b4f544c4552 4b4f544b4f56 -4b4f544b4f54 4b4f544b4154 4b4f54495445 4b4f54494c41 @@ -147077,13 +139676,11 @@ 4b4f54454b37 4b4f54454b34 4b4f54415245 -4b4f54373737 4b4f54313938 4b4f54313235 4b4f53545045 4b4f53544f53 4b4f53544956 -4b4f5354494b 4b4f5354454e 4b4f53544159 4b4f53544138 @@ -147167,7 +139764,6 @@ 4b4f4f4c3236 4b4f4f4c3131 4b4f4f4c3030 -4b4f4f4b4f4f 4b4f4f4b4f4b 4b4f4f4b4c41 4b4f4f4a4953 @@ -147180,7 +139776,6 @@ 4b4f4e54454e 4b4f4e53554d 4b4f4e535441 -4b4f4e524144 4b4f4e4f5641 4b4f4e4f4d4d 4b4f4e4b4f56 @@ -147189,7 +139784,6 @@ 4b4f4e4a4f4f 4b4f4e4a414b 4b4f4e494b41 -4b4f4e494a4e 4b4f4e494753 4b4f4e494543 4b4f4e475a49 @@ -147198,7 +139792,6 @@ 4b4f4e473736 4b4f4e455254 4b4f4e454855 -4b4f4e444f52 4b4f4e415441 4b4f4e414e4e 4b4f4e414e31 @@ -147218,7 +139811,6 @@ 4b4f4d494b53 4b4f4d454e54 4b4f4d424932 -4b4f4d424154 4b4f4d415453 4b4f4d414c31 4b4f4d41494e @@ -147295,7 +139887,6 @@ 4b4f4a455252 4b4f4a414b34 4b4f4a414b31 -4b4f4a41434b 4b4f49524131 4b4f494e4537 4b4f494b4f49 @@ -147303,11 +139894,9 @@ 4b4f49424f59 4b4f49424f49 4b4f484e414e -4b4f484c4552 4b4f48494c41 4b4f464f4544 4b4f46464931 -4b4f46464552 4b4f46464545 4b4f454c4e31 4b4f454b4f45 @@ -147348,7 +139937,6 @@ 4b4f42414c44 4b4f414c4158 4b4f414c4136 -4b4f414c4131 4b4f414c4130 4b4f41313233 4b4f37373737 @@ -147363,10 +139951,8 @@ 4b4e554b4844 4b4e55464c55 4b4e55444445 -4b4e55434b53 4b4e55424245 4b4e54544342 -4b4e54544342 4b4e524a4d48 4b4e4f585858 4b4e4f583133 @@ -147396,7 +139982,6 @@ 4b4e4549545a 4b4e45454553 4b4e4542454c -4b4e4542454c 4b4e4153454e 4b4e41524c59 4b4e41524653 @@ -147427,7 +140012,6 @@ 4b4d494c4c4c 4b4d48415344 4b4d475a3131 -4b4d46444d31 4b4d46373134 4b4d45524441 4b4d444b4d44 @@ -147443,7 +140027,6 @@ 4b4d34363334 4b4d31393833 4b4d31393732 -4b4d31393732 4b4d31313238 4b4c59554348 4b4c594e4e45 @@ -147477,7 +140060,6 @@ 4b4c4f504f56 4b4c4f504f4b 4b4c4f50494f -4b4c4f50494b 4b4c4f503938 4b4c4f503332 4b4c4f503232 @@ -147487,7 +140069,6 @@ 4b4c4f4b4f56 4b4c4f4b4b4b 4b4c4f4b4544 -4b4c4f4b414e 4b4c4f474249 4b4c4f45504f 4b4c4f45484e @@ -147496,7 +140077,6 @@ 4b4c4d4e3735 4b4c4d494f50 4b4c4c44505a -4b4c4b4c4b4c 4b4c4b313131 4b4c49545459 4b4c49524f53 @@ -147515,19 +140095,15 @@ 4b4c464b4c46 4b2e4c463737 4b4c45574552 -4b4c45534b4f 4b4c45534348 4b4c45525431 4b4c45505041 4b4c454d4e53 4b4c454d4d41 4b4c454b5331 -4b4c45494e45 4b4c45494e44 -4b4c45494e31 4b4c45454e31 4b4c45453031 -4b4c45424552 4b4c44313233 4b4c43313233 4b4c42543435 @@ -147571,7 +140147,6 @@ 4b4b524b4b52 4b4b52454444 4b4b51545a41 -4b4b51545a41 4b4b4f333333 4b4b4e554758 4b4b4e443232 @@ -147655,7 +140230,6 @@ 4b4a4855454a 4b4a484f5045 4b4a484a4b48 -4b4a47464e46 4b4a4556494e 4b4a44373948 4b4a434a434d @@ -147689,12 +140263,10 @@ 4b4954545952 4b4954545947 4b4954545944 -4b4954545939 4b4954545938 4b4954545930 4b495454592e 4b4954545455 -4b4954544945 4b495454454c 4b4954544538 4b4954544537 @@ -147731,7 +140303,6 @@ 4b4953533135 4b4953533038 4b495350414c -4b49534d4554 4b49534c4959 4b49534b554e 4b49534b4141 @@ -147756,7 +140327,6 @@ 4b4952545359 4b495254414e 4b4952535441 -4b4952534348 4b4952504943 4b495250414c 4b49524f4d49 @@ -147791,7 +140361,6 @@ 4b4952425938 4b4952425936 4b4952425935 -4b4952425931 4b4952424545 4b4952414e33 4b4952414e32 @@ -147806,7 +140375,6 @@ 4b4952413131 4b4952413031 4b4952373737 -4b4950504552 4b4950504148 4b49504b554c 4b49504b4950 @@ -147829,21 +140397,18 @@ 4b494e4f3535 4b494e4e4b59 4b494e4e4945 -4b494e4e4559 4b494e4b5953 4b494e4b5331 4b494e4b4f31 4b494e4b4159 4b494e4b3737 4b494e4b3235 -4b494e4a414c 4b494e494f4e 4b494e494e53 4b494e494131 4b494e47594f 4b494e475931 4b494e475431 -4b494e475358 4b494e475354 4b494e475351 4b494e47534b @@ -147865,7 +140430,6 @@ 4b494e473733 4b494e473732 4b494e473730 -4b494e473639 4b494e473538 4b494e473534 4b494e473435 @@ -147899,7 +140463,6 @@ 4b494d524532 4b494d50524f 4b494d504552 -4b494d4f4e4f 4b494d4f424f 4b494d4e4741 4b494d4d5957 @@ -147910,19 +140473,16 @@ 4b494d4d4152 4b494d4d414e 4b494d4c4942 -4b494d4b494d 4b494d4b4154 4b494d49544f 4b494d495348 4b494d494a4f 4b494d493137 4b494d46414c -4b494d434849 4b494d425241 4b494d424f39 4b494d424f32 4b494d424c59 -4b494d424131 4b494d414e4f 4b494d414d41 4b494d393531 @@ -147934,7 +140494,6 @@ 4b494d353638 4b494d333333 4b494d323334 -4b494d313233 4b494d313232 4b494d313231 4b494d303031 @@ -147951,19 +140510,15 @@ 4b494c4f3333 4b494c4f3133 4b494c4e4d53 -4b494c4d4552 4b494c4d414c 4b494c4c594f 4b494c4c4f4b 4b494c4c4b49 4b494c4c4b41 -4b494c4c494e 4b494c4c4838 4b494c4c4154 -4b494c4c4148 4b494c4c4144 4b494c4c4141 -4b494c4c4131 4b494c4c3737 4b494c4c3133 4b494c4c3131 @@ -148022,18 +140577,15 @@ 4b4948415241 4b4947485431 4b4947414c49 -4b4947414c49 4b4947393936 4b494646454c 4b4946323037 4b4945534552 4b4945534131 -4b494552414e 4b49454c5459 4b49454c4552 4b49454c4345 4b49454b454e -4b4945464552 4b4945313233 4b49445a5a5a 4b494459414b @@ -148046,7 +140598,6 @@ 4b4944524f43 4b494452494b 4b494452414d -4b49444e4559 4b49444d4f45 4b49444c454f 4b49444c4154 @@ -148064,8 +140615,6 @@ 4b4944313031 4b49434b5353 4b49434b5331 -4b49434b5331 -4b49434b4552 4b49434b4131 4b49434b3131 4b4943484f53 @@ -148107,7 +140656,6 @@ 4b48524f4c31 4b484f4c3635 4b484e545741 -4b484e545741 4b484d455231 4b484c4f5645 4b484b393939 @@ -148130,7 +140678,6 @@ 4b48414d554c 4b48414d5041 4b48414d4954 -4b48414c494c 4b48414c4941 4b48414c454c 4b48414c4545 @@ -148145,13 +140692,10 @@ 4b48364a5546 4b4831323938 4b4830313931 -4b475245454e 4b4752414e54 4b4750435750 4b474f4e5a4f 4b474e534459 -4b474d545641 -4b474d545641 4b474b4b494d 4b47464f5552 4b47454e4e4e @@ -148196,12 +140740,10 @@ 4b4559574553 4b4559574159 4b4559544446 -4b4559534552 4b4559533839 4b4559533132 4b45594f4e45 4b45594f4e41 -4b45594b4559 4b4559464552 4b4559463830 4b4559444f47 @@ -148218,12 +140760,6 @@ 4b45564f4741 4b45564f3137 4b4556494e56 -4b4556494e53 -4b4556494e4a -4b4556494e43 -4b4556494e42 -4b4556494e37 -4b4556494e32 4b4556493531 4b4556493042 4b4556455253 @@ -148265,7 +140801,6 @@ 4b4553434841 4b4553413038 4b45525a454e -4b4552535449 4b4552534f4e 4b4552534841 4b4552534545 @@ -148274,7 +140809,6 @@ 4b4552525942 4b4552525933 4b4552525932 -4b4552525931 4b4552525930 4b4552524f4e 4b455252494e @@ -148283,7 +140817,6 @@ 4b4552523232 4b4552505554 4b45524f5532 -4b45524e454c 4b45524d5a59 4b45524d4953 4b45524d454e @@ -148314,17 +140847,13 @@ 4b454f4b4541 4b454f333731 4b454f313233 -4b454e5a4f31 4b454e5a414e -4b454e594f4e 4b454e594153 -4b454e59414e 4b454e56494e 4b454e545741 4b454e545553 4b454e545454 4b454e544f59 -4b454e544f4e 4b454e544f31 4b454e544b45 4b454e544a50 @@ -148349,20 +140878,16 @@ 4b454e543138 4b454e543132 4b454e543131 -4b454e543130 4b454e543037 4b454e543031 4b454e53494e 4b454e534831 4b454e53414c 4b454e504f4b -4b454e504f31 4b454e50454e 4b454e504547 -4b454e4e5953 4b454e4e594f 4b454e4e594a -4b454e4e5942 4b454e4e5941 4b454e4e5939 4b454e4e5936 @@ -148370,10 +140895,7 @@ 4b454e4e524f 4b454e4e4f31 4b454e4e4e59 -4b454e4e4559 4b454e4e4558 -4b454e4e454c -4b454e4e4544 4b454e4e4131 4b454e4e3130 4b454e4d4f52 @@ -148424,19 +140946,15 @@ 4b454c544f49 4b454c54494b 4b454c54454e -4b454c534945 4b454c503132 4b454c4d3435 4b454c4c5947 -4b454c4c5942 -4b454c4c5937 4b454c4c5936 4b454c4c4f57 4b454c4c4949 4b454c4c4948 4b454c4c4942 4b454c4c4932 -4b454c4c4931 4b454c4c4759 4b454c4c4533 4b454c4c414d @@ -148492,8 +141010,6 @@ 4b4545564552 4b4545554846 4b4545544348 -4b4545534841 -4b4545534841 4b4545533132 4b4545525448 4b4545524545 @@ -148504,7 +141020,6 @@ 4b45454e4131 4b45454c4945 4b45454c4941 -4b45454b4545 4b45454b4544 4b4545463737 4b4545414e41 @@ -148518,8 +141033,6 @@ 4b4542303031 4b4541545342 4b4541545331 -4b4541544f4e -4b4541544f4e 4b4541543432 4b4541525345 4b4541524131 @@ -148580,7 +141093,6 @@ 4b434b415353 4b4349545331 4b4349545241 -4b4349545241 4b4349505441 4b4349444e55 4b4348523039 @@ -148670,7 +141182,6 @@ 4b415a554531 4b415a55414c 4b415a504552 -4b415a4f4f53 4b415a4f4f4d 4b415a4f4f32 4b415a4d494e @@ -148693,15 +141204,12 @@ 4b41594d414b 4b41594c4f4e 4b41594c4c41 -4b41594c4545 4b41594c4541 4b41594c4531 4b41594c4156 4b41594c4143 4b41594c4139 4b41594c4134 -4b41594c4131 -4b41594b4159 4b4159464153 4b4159424f53 4b4159424f4f @@ -148719,29 +141227,23 @@ 4b4157414441 4b4157413132 4b4156544f4d -4b41564b415a -4b4156495441 4b4156494e44 4b4156494b41 4b415649434b -4b4156494152 4b4156454e41 4b4156414e31 4b4156414c49 4b4155534552 4b4155524f56 4b4155504552 -4b41554e4153 4b415546454e 4b4155414931 4b41545a4b4b 4b41545a4559 -4b41545a4531 4b41545a3435 4b4154595445 4b4154594153 4b4154594148 -4b4154594135 4b4154593836 4b4154593331 4b4154593130 @@ -148770,8 +141272,6 @@ 4b41544f3133 4b41544f3132 4b41544f3131 -4b41544c594e -4b41544c4f4e 4b41544b494e 4b41544a4f4e 4b41544a4132 @@ -148780,10 +141280,7 @@ 4b4154494e4b 4b4154494554 4b415449454f -4b4154494547 4b4154494546 -4b4154494545 -4b4154494532 4b4154494530 4b4154494141 4b4154494139 @@ -148795,10 +141292,7 @@ 4b4154485945 4b4154485944 4b4154485935 -4b4154485931 -4b4154485259 4b4154484952 -4b4154484945 4b4154484848 4b4154484559 4b4154484552 @@ -148844,14 +141338,11 @@ 4b41535a414b 4b415359414e 4b4153554e4f -4b4153554d49 -4b4153554d49 4b415354554d 4b4153544131 4b4153535931 4b4153534f53 4b4153534953 -4b415353454c 4b415353414e 4b41534b4f4f 4b41534b4554 @@ -148868,7 +141359,6 @@ 4b4153494133 4b415348494e 4b4153484949 -4b415348414e 4b415348414b 4b4153483235 4b4153455953 @@ -148915,14 +141405,12 @@ 4b41524e4945 4b41524e4552 4b41524d494b -4b41524d454e 4b41524d454c 4b41524d4154 4b41524d4148 4b41524d4139 4b41524d4136 4b41524d4133 -4b41524d4131 4b41524c4f4f 4b41524c4f47 4b41524c4b41 @@ -148954,15 +141442,11 @@ 4b4152493034 4b415247494c 4b4152455931 -4b4152455441 4b4152454e4f -4b4152454e46 4b4152454e45 4b4152454e38 4b4152454e36 4b4152454e33 -4b4152454c31 -4b415245454d 4b4152445831 4b4152444953 4b415244494e @@ -149029,7 +141513,6 @@ 4b414e4f4f4b 4b414e4e4953 4b414e4e454e -4b414e4e454e 4b414e4b4941 4b414e4a5554 4b414e4a454e @@ -149065,8 +141548,6 @@ 4b414e373737 4b414e334441 4b414e303037 -4b414d52594e -4b414d524f4e 4b414d504153 4b414d4f5453 4b414d4e4556 @@ -149080,7 +141561,6 @@ 4b414d494e4f 4b414d494c4f 4b414d494c49 -4b414d494c41 4b414d494c33 4b414d494b4f 4b414d494b31 @@ -149091,9 +141571,7 @@ 4b414d455255 4b414d454e5a 4b414d454c53 -4b414d454c4c 4b414d454c45 -4b414d454441 4b414d453131 4b414d42455a 4b414d415953 @@ -149102,7 +141580,6 @@ 4b414d414e4f 4b414d414c53 4b414d414c45 -4b414d414c31 4b414d414a49 4b414d413132 4b414d393631 @@ -149130,7 +141607,6 @@ 4b414c495348 4b414c495053 4b414c494f42 -4b414c494d41 4b414c494b4f 4b414c494b41 4b414c494b32 @@ -149218,10 +141694,8 @@ 4b41494d454e 4b41494d4549 4b41494d414e -4b41494c594e 4b41494c554d 4b41494c4953 -4b41494c4559 4b41494c414e 4b41494c3139 4b41494a415a @@ -149241,7 +141715,6 @@ 4b4147573659 4b4147554c41 4b4147545041 -4b4147545041 4b41474f5232 4b414745324b 4b4147415741 @@ -149273,16 +141746,11 @@ 4b4144454c53 4b4144415448 4b4144313233 -4b41435a4b41 4b4143514143 -4b4143504552 4b41434b4552 4b4143455931 4b4142555455 -4b4142554b49 -4b4142554b49 4b4142534245 -4b41424f4f4d 4b41424c4553 4b41424b4142 4b4142495255 @@ -149359,7 +141827,6 @@ 4b334c575353 4b3349474854 4b3348445450 -4b3337414844 4b3337373442 4b3337333435 4b33334c5943 @@ -149409,7 +141876,6 @@ 4a5a49474759 4a5a484f524e 4a5a46554f42 -4a5a46554f42 4a5a46534a48 4a5a36415356 4a5a35313135 @@ -149498,7 +141964,6 @@ 4a5555494538 4a5554594842 4a5554544e45 -4a5554544131 4a5554494c41 4a5554455558 4a555357494e @@ -149506,15 +141971,10 @@ 4a555354594a 4a5553545932 4a5553545931 -4a5553545553 -4a5553545553 4a5553545535 -4a5553544d45 -4a5553544d45 4a5553544c59 4a555354454e 4a5553544245 -4a5553544153 4a5553544152 4a555354414d 4a5553544144 @@ -149547,14 +142007,10 @@ 4a554e4b5057 4a554e4b4f31 4a554e4b4949 -4a554e4b4945 -4a554e4b4559 -4a554e4b4552 4a554e4b4544 4a554e4b3133 4a554e4b3039 4a554e4b3030 -4a554e49544f 4a554e495445 4a554e494e41 4a554e494535 @@ -149571,9 +142027,6 @@ 4a554e453638 4a554e453633 4a554e453435 -4a554e453231 -4a554e453134 -4a554e453132 4a554e453039 4a554e453035 4a554e435553 @@ -149597,7 +142050,6 @@ 4a554d494841 4a554d45455a 4a554d424f39 -4a554d424c45 4a554d424953 4a554d424945 4a554d424545 @@ -149611,7 +142063,6 @@ 4a554c593536 4a554c593531 4a554c593454 -4a554c593231 4a554c593036 4a554c534945 4a554c4d454c @@ -149623,19 +142074,12 @@ 4a554c494f39 4a554c494e48 4a554c494e45 -4a554c494a41 4a554c49455a -4a554c49454e -4a554c49454e -4a554c494543 -4a554c494542 -4a554c494535 4a554c494535 4a554c494534 4a554c494158 4a554c494151 4a554c494134 -4a554c494131 4a554c493132 4a554c455348 4a554c455338 @@ -149664,7 +142108,6 @@ 4a55494f5050 4a55494c4c45 4a5549435943 -4a5549435931 4a5549435921 4a5549434849 4a554943455a @@ -149712,7 +142155,6 @@ 4a5542414848 4a5541593539 4a5541554a42 -4a5541554a42 4a55414e4c48 4a55414e4b49 4a55414e4b41 @@ -149725,7 +142167,6 @@ 4a55414e434f 4a55414e414e 4a55414e3639 -4a55414e3232 4a55414e3138 4a55414e3133 4a55414e3031 @@ -149753,7 +142194,6 @@ 4a544b333733 4a544b31524b 4a544a54484f -4a544a54484f 4a54494d4d53 4a54494c4c59 4a54484f4d45 @@ -149936,7 +142376,6 @@ 4a5057373430 4a5057323030 4a5056544542 -4a5056544542 4a5054534149 4a5054484a44 4a5054484a31 @@ -149984,12 +142423,10 @@ 4a4f5954574f 4a4f5953414d 4a4f59504d4b -4a4f594f5553 4a4f594d4158 4a4f594d414e 4a4f594a414e 4a4f59495441 -4a4f5946554c 4a4f5943454c 4a4f59434548 4a4f59434542 @@ -150009,8 +142446,6 @@ 4a4f56414e42 4a4f56414e31 4a4f55544442 -4a4f55544442 -4a4f55544442 4a4f55524e4f 4a4f55505049 4a4f55455454 @@ -150026,7 +142461,6 @@ 4a4f534f4c4f 4a4f53495441 4a4f53494542 -4a4f53494531 4a4f53484d56 4a4f53484c48 4a4f53484542 @@ -150090,15 +142524,12 @@ 4a4f52474543 4a4f52474542 4a4f52474535 -4a4f52474531 4a4f52474530 4a4f5247414e -4a4f5244594e 4a4f52444f38 4a4f52444f36 4a4f52444f33 4a4f52444f30 -4a4f5244454e 4a4f52415348 4a4f52414e41 4a4f514b4851 @@ -150112,7 +142543,6 @@ 4a4f50413030 4a4f4f544859 4a4f4f503635 -4a4f4f4e4153 4a4f4f424f4f 4a4f4f325354 4a4f4e5a4544 @@ -150125,15 +142555,12 @@ 4a4f4e4e594a 4a4f4e4e5941 4a4f4e4e5934 -4a4f4e4e5931 4a4f4e4e4e4e 4a4f4e4d414e 4a4f4e4c5652 4a4f4e4b494e 4a4f4e4b454c 4a4f4e4b4134 -4a4f4e4a4f4e -4a4f4e4a4f4e 4a4f4e4a4159 4a4f4e494d49 4a4f4e494441 @@ -150142,7 +142569,6 @@ 4a4f4e493032 4a4f4e474f53 4a4f4e455357 -4a4f4e455353 4a4f4e45534e 4a4f4e45534d 4a4f4e45534a @@ -150157,11 +142583,9 @@ 4a4f4e424541 4a4f4e415350 4a4f4e41534c -4a4f4e415331 4a4f4e414e44 4a4f4e414853 4a4f4e414834 -4a4f4e414831 4a4f4e414553 4a4f4e343431 4a4f4e343230 @@ -150182,7 +142606,6 @@ 4a4f4d41524f 4a4f4d415231 4a4f4d414e55 -4a4f4d414d41 4a4f4d414445 4a4f4d41434b 4a4f4c53454e @@ -150225,7 +142648,6 @@ 4a4f4a4f3931 4a4f4a4f3930 4a4f4a4f3830 -4a4f4a4f3830 4a4f4a4f3736 4a4f4a4f3731 4a4f4a4f3638 @@ -150234,7 +142656,6 @@ 4a4f4a4f3434 4a4f4a4f3239 4a4f4a4f3237 -4a4f4a4f3237 4a4f4a4f3236 4a4f4a4f3234 4a4f4a4f3139 @@ -150245,7 +142666,6 @@ 4a4f4a4f3034 4a4f4a49544f 4a4f494e5431 -4a4f494e4552 4a4f49454949 4a4f49434849 4a4f49434538 @@ -150277,7 +142697,6 @@ 4a4f484e4a4a 4a4f484e4a47 4a4f484e494e -4a4f484e4945 4a4f484e4542 4a4f484e4453 4a4f484e4442 @@ -150295,23 +142714,18 @@ 4a4f484e3736 4a4f484e3735 4a4f484e3734 -4a4f484e3639 4a4f484e3537 -4a4f484e3537 -4a4f484e3535 4a4f484e3533 4a4f484e3532 4a4f484e3437 4a4f484e3343 4a4f484e3255 -4a4f484e3131 4a4f484d4152 4a4f484d414b 4a4f48484e59 4a4f4847494c 4a4f48424531 4a4f48414e48 -4a4f48414e41 4a4f48414e35 4a4f48414c49 4a4f48414153 @@ -150329,7 +142743,6 @@ 4a4f48313259 4a4f48303939 4a4f4756414e -4a4f47474552 4a4f46524559 4a4f46433353 4a4f455a454e @@ -150357,13 +142770,11 @@ 4a4f45544845 4a4f45544546 4a4f45535445 -4a4f45535048 4a4f45534d4f 4a4f45533030 4a4f45524f44 4a4f45524945 4a4f45524749 -4a4f45524731 4a4f45524547 4a4f45524544 4a4f4550524f @@ -150379,7 +142790,6 @@ 4a4f454d414d 4a4f454d3634 4a4f454c4c59 -4a4f454c4c45 4a4f454c4a52 4a4f454c494f 4a4f454c4144 @@ -150405,7 +142815,6 @@ 4a4f4544414e 4a4f45434150 4a4f45424f54 -4a4f45424f42 4a4f4542454e 4a4f45423638 4a4f45423636 @@ -150442,10 +142851,8 @@ 4a4f434b4f38 4a4f434b4f37 4a4f434b4f32 -4a4f434b4559 4a4f434b3639 4a4f43494d41 -4a4f4348454e 4a4f4348414e 4a4f43454c49 4a4f43453837 @@ -150460,7 +142867,6 @@ 4a4f424e3932 4a4f424d4f42 4a4f424c4f37 -4a4f424a4f42 4a4f42494537 4a4f42455231 4a4f42453132 @@ -150468,10 +142874,8 @@ 4a4f42414245 4a4f42393939 4a4f42323232 -4a4f42313233 4a4f42313131 4a4f41525345 -4a4f41515549 4a4f414e5353 4a4f414e524f 4a4f414e4e53 @@ -150479,8 +142883,6 @@ 4a4f414e4e4c 4a4f414e4e47 4a4f2d414e4e -4a4f414e4945 -4a4f414e4945 4a4f414e3537 4a4f414c454f 4a4f41474152 @@ -150636,7 +143038,6 @@ 4a4c42313233 4a4c414e4548 4a4c41313233 -4a4c41313233 4a4c39373237 4a4c36333535 4a4c35353333 @@ -150676,7 +143077,6 @@ 4a4b4d344252 4a4b4c563131 4a4b4c4f4955 -4a4b4c4a4b4c 4a4b4c454533 4a4b4c424e4d 4a4b4c393955 @@ -150759,7 +143159,6 @@ 4a4a47313839 4a4a464d3853 4a4a45525259 -4a4a454e4e59 4a4a45455050 4a4a45454242 4a4a444f4747 @@ -150825,14 +143224,12 @@ 4a4950453832 4a4950453037 4a494f545841 -4a494f545841 4a494e583237 4a494e583231 4a494e54414f 4a494e4b4545 4a494e4a4552 4a494e474f53 -4a494e474552 4a494e474138 4a494e455445 4a494e455348 @@ -150850,11 +143247,8 @@ 4a494d4d594f 4a494d4d5945 4a494d4d5938 -4a494d4d5938 -4a494d4d5931 4a494d4d4f45 4a494d4d4d49 -4a494d4d4945 4a494d4d4544 4a494d4d4344 4a494d4d4152 @@ -150868,7 +143262,6 @@ 4a494d4c4558 4a494d4c4553 4a494d4b4153 -4a494d4a494d 4a494d494e4f 4a494d494845 4a494d493730 @@ -150886,7 +143279,6 @@ 4a494d424f45 4a494d424f37 4a494d424f33 -4a494d424f31 4a494d424f30 4a494d424c4f 4a494d42494d @@ -150929,7 +143321,6 @@ 4a4947495038 4a4947475933 4a4947475932 -4a4947475931 4a4947475353 4a4947475331 4a494747415a @@ -151047,11 +143438,9 @@ 4a46524f5354 4a464d4d5344 4a464c545541 -4a464c545541 4a464b445339 4a464b444945 4a464b313233 -4a464b313233 4a464b313131 4a464b303938 4a464b303333 @@ -151084,11 +143473,8 @@ 4a4557555645 4a4557464147 4a4557455454 -4a4557454c5a 4a4557454c52 4a4557454c32 -4a4557454c31 -4a4557454c31 4a4557444f47 4a4557434545 4a4557424945 @@ -151108,7 +143494,6 @@ 4a4554543031 4a455453554d 4a455453474f -4a4554534554 4a4554534552 4a4554534158 4a4554533938 @@ -151116,12 +143501,10 @@ 4a4554533737 4a4554533232 4a4554533231 -4a4554533130 4a4554533032 4a45544f4e53 4a45544c4559 4a4554494949 -4a455448524f 4a4554484552 4a4554373437 4a4554353535 @@ -151131,21 +143514,15 @@ 4a4553555345 4a4553555341 4a455354454d -4a4553535953 4a4553535932 -4a4553535931 4a4553535545 4a4553534f50 4a4553534934 4a4553534557 -4a455353454c -4a4553534545 -4a4553534544 4a4553534543 4a4553534538 4a4553534536 4a4553534534 -4a4553534531 4a4553534530 4a4553534153 4a455353414c @@ -151154,7 +143531,6 @@ 4a4553533839 4a4553533737 4a4553533235 -4a4553533233 4a4553533145 4a4553533138 4a4553533031 @@ -151167,11 +143543,9 @@ 4a45525a4559 4a455257494e 4a4552564953 -4a4552564953 4a4552555348 4a455252594f 4a455252594e -4a455252594c 4a455252594a 4a4552525938 4a4552524f4e @@ -151196,7 +143570,6 @@ 4a45524b4945 4a45524b3639 4a45524b3133 -4a45524a4552 4a4552494b41 4a4552494345 4a4552454e45 @@ -151210,7 +143583,6 @@ 4a455045544f 4a4550414e47 4a454e564555 -4a454e53454e 4a454e53454c 4a454e533435 4a454e532121 @@ -151218,7 +143590,6 @@ 4a454e52494b 4a454e524159 4a454e504f4f -4a454e4e5943 4a454e4e4e59 4a454e4e4d4f 4a454e4e4935 @@ -151245,14 +143616,12 @@ 4a454e4a4f4e 4a454e495348 4a454e495345 -4a454e495345 4a454e494e45 4a454e494c4f 4a454e494b41 4a454e494641 4a454e473133 4a454e454c4c -4a454e454c4c 4a454e45454e 4a454e435a49 4a454e424152 @@ -151262,10 +143631,8 @@ 4a454e353535 4a454e343435 4a454e323334 -4a454e313233 4a454d504f4c 4a454d4d4945 -4a454d494d41 4a454d494c4f 4a454d494341 4a454d425255 @@ -151299,7 +143666,6 @@ 4a454953534f 4a45494a4549 4a4549393233 -4a45484f5641 4a45484f4f4e 4a4548414e31 4a4547313233 @@ -151311,7 +143677,6 @@ 4a45464a4546 4a4546465957 4a4546465932 -4a454646524f 4a4546464f4e 4a4546464d55 4a4546464849 @@ -151323,9 +143688,7 @@ 4a4546463936 4a4546463838 4a4546463734 -4a4546463732 4a4546463730 -4a4546463638 4a4546463538 4a4546463537 4a4546463534 @@ -151354,7 +143717,6 @@ 4a4545505050 4a4545504545 4a4545504450 -4a4545503937 4a4545503930 4a4545503832 4a4545503735 @@ -151381,7 +143743,6 @@ 4a4544493232 4a4544493134 4a4544493032 -4a4544493031 4a4544493030 4a4544454e32 4a454441484c @@ -151396,7 +143757,6 @@ 4a4542424241 4a4541564e4d 4a45414e5459 -4a45414e5331 4a45414e4d41 4a45414e494e 4a45414e4941 @@ -151485,7 +143845,6 @@ 4a4434373532 4a4434343030 4a4434313135 -4a4434303230 4a4433363332 4a4432383335 4a4431393837 @@ -151538,7 +143897,6 @@ 4a4343434a52 4a4343415252 4a4342543033 -4a4342313233 4a434154454f 4a4341525053 4a43414d5042 @@ -151595,7 +143953,6 @@ 4a424f41544e 4a424c554553 4a424c414b45 -4a424c41434b 4a424c353030 4a424b535430 4a424b494e47 @@ -151646,7 +144003,6 @@ 4a4230343235 4a4230303735 4a415a5a5943 -4a415a5a5931 4a415a5a5550 4a415a5a4f4b 4a415a5a4d45 @@ -151679,7 +144035,6 @@ 4a415955424c 4a4159544543 4a4159535343 -4a4159534f4e 4a4159534f34 4a4159534f33 4a4159534153 @@ -151694,7 +144049,6 @@ 4a41594e4559 4a41594e454d 4a41594e414d -4a41594d4553 4a41594d4531 4a41594d344e 4a41594c4559 @@ -151704,7 +144058,6 @@ 4a4159484157 4a4159454c4c 4a415944494e -4a415944454e 4a4159444531 4a4159444153 4a4159444130 @@ -151723,13 +144076,11 @@ 4a4159313837 4a4159313831 4a4159313331 -4a4159313233 4a4159313231 4a4159313131 4a4159303037 4a4158583733 4a4158583132 -4a4158583132 4a4158524544 4a41584f4e54 4a41584f4646 @@ -151770,14 +144121,6 @@ 4a4153504953 4a4153504952 4a4153503352 -4a41534f4e54 -4a41534f4e53 -4a41534f4e4e -4a41534f4e4a -4a41534f4e44 -4a41534f4e37 -4a41534f4e36 -4a41534f4e33 4a41534d4f4e 4a41534d4934 4a41534d4144 @@ -151801,9 +144144,6 @@ 4a4153313131 4a41525a4150 4a4152563237 -4a4152524f57 -4a4152524f44 -4a4152524f44 4a4152524944 4a4152524144 4a41524f535a @@ -151812,7 +144152,6 @@ 4a41524f4348 4a41524e5342 4a41524d454e -4a41524d414e 4a41524d414b 4a41524b4f31 4a41524b4b4f @@ -151861,13 +144200,11 @@ 4a414f424144 4a414e5a4f45 4a414e555347 -4a414e555331 4a414e555330 4a414e553031 4a414e545552 4a414e54414e 4a414e535345 -4a414e53454e 4a414e534348 4a414e4f5645 4a414e4f535a @@ -151878,9 +144215,7 @@ 4a414e4e5552 4a414e4e5531 4a414e4e4f54 -4a414e4e494b 4a414e4e4931 -4a414e4e4553 4a414e4e454b 4a414e4e4153 4a414e4e4148 @@ -151889,10 +144224,7 @@ 4a414e4d414e 4a414e4b4945 4a414e4b4552 -4a414e4a414e -4a414e4a414e 4a414e495455 -4a414e494531 4a414e474952 4a414e455942 4a414e455932 @@ -151952,7 +144284,6 @@ 4a414d4d5959 4a414d4d4d59 4a414d4d4954 -4a414d4d494e 4a414d4d4531 4a414d4d4158 4a414d4d3235 @@ -151970,11 +144301,9 @@ 4a414d494e34 4a414d494c4f 4a414d494c45 -4a414d494553 4a414d494550 4a414d49454e 4a414d49454a -4a414d494542 4a414d494538 4a414d494536 4a414d494530 @@ -151983,21 +144312,8 @@ 4a414d455931 4a414d455358 4a414d455356 -4a414d455353 4a414d455351 -4a414d455350 -4a414d455350 -4a414d45534b 4a414d455349 -4a414d455347 -4a414d455344 -4a414d455344 -4a414d455341 -4a414d455339 -4a414d455336 -4a414d455333 -4a414d455332 -4a414d455330 4a414d455245 4a414d454e31 4a414d454c49 @@ -152006,14 +144322,11 @@ 4a414d42454b 4a414d424153 4a414d415941 -4a414d414c4c 4a414d414c44 4a414d414c41 4a414d414c37 -4a414d414c31 4a414d414a4b 4a414d41494e -4a414d41414c 4a414d413033 4a414d383035 4a414d373737 @@ -152064,7 +144377,6 @@ 4a414b454559 4a414b454552 4a414b45444f -4a414b453939 4a414b453936 4a414b453934 4a414b453931 @@ -152083,7 +144395,6 @@ 4a414b453237 4a414b453039 4a414b453033 -4a414b453030 4a414b434945 4a414b415353 4a414b415345 @@ -152105,14 +144416,12 @@ 4a41494e4131 4a41494d4f4e 4a41494d4f45 -4a41494d4945 4a41494d4550 4a41494c4d45 4a41494c4544 4a41494c4241 4a41494b4e45 4a4149445934 -4a414944454e 4a4149444131 4a4149383930 4a4148574548 @@ -152123,7 +144432,6 @@ 4a41484c4f56 4a41484c4956 4a41484c494c -4a41484a4148 4a414845494d 4a4148415249 4a4148415241 @@ -152135,8 +144443,6 @@ 4a4147584b45 4a4147553036 4a4147545041 -4a4147545041 -4a4147545041 4a4147535142 4a4147533234 4a4147524159 @@ -152145,7 +144451,6 @@ 4a41474e3233 4a4147485554 4a4147474949 -4a4147455231 4a4147434154 4a4147424f59 4a4147424147 @@ -152154,8 +144459,6 @@ 4a4147393939 4a4147383138 4a4147323932 -4a4147313233 -4a4146464131 4a4145594f4f 4a4145574f4e 4a4145564c41 @@ -152168,7 +144471,6 @@ 4a41444f574e 4a41444f524f 4a41444d414e -4a4144495241 4a4144484156 4a4144454e45 4a4144454e30 @@ -152178,7 +144480,6 @@ 4a4144454444 4a4144454432 4a414445434b -4a4144453639 4a4144453530 4a4144453434 4a4144453431 @@ -152186,7 +144487,6 @@ 4a4144453332 4a4144453236 4a4144453234 -4a4144453232 4a4144453231 4a4144453135 4a4144453131 @@ -152197,22 +144497,16 @@ 4a4143575041 4a414353594c 4a4143535441 -4a4143515545 4a4143504554 4a41434f5443 4a41434f4e45 -4a41434f4257 4a41434f4256 4a41434f424b 4a41434f424a 4a41434f4244 -4a41434f4232 -4a41434f4231 -4a41434c594e 4a41434c4f53 4a41434c4158 4a41434b5959 -4a41434b5959 4a41434b5953 4a41434b5936 4a41434b5754 @@ -152228,7 +144522,6 @@ 4a41434b4d43 4a41434b4b31 4a41434b4a52 -4a41434b4544 4a41434b4432 4a41434b4145 4a41434b3936 @@ -152249,13 +144542,10 @@ 4a41434b3433 4a41434b3336 4a41434b3138 -4a41434b3131 4a41434b3039 4a41434b3037 -4a41434b3031 4a4143495631 4a4143495353 -4a4143495353 4a4143484950 4a4143484149 4a4143455353 @@ -152387,7 +144677,6 @@ 4a3132453132 4a3132393830 4a3132373936 -4a3132333435 4a3131383857 4a305946554c 4a3053335034 @@ -152408,7 +144697,6 @@ 495a54454e49 495a5245414c 495a5241494c -495a4d41494c 495a48414e30 495a45524c49 495a41383736 @@ -152423,7 +144711,6 @@ 495853594346 49585345414e 4958494c4930 -495844554d42 495841545a58 49575a35354d 495759484658 @@ -152461,8 +144748,6 @@ 495641534841 4956414e5331 4956414e5041 -4956414e4f56 -4956414e4f56 4956414e4b45 4956414e4954 4956414e4949 @@ -152499,8 +144784,6 @@ 49554f443932 495545435741 495541554a42 -495541554a42 -49545a544942 49545a544942 49545745454e 495455533031 @@ -152514,7 +144797,6 @@ 4954534e4f57 4954534d494f 4954534d4536 -4954534d4531 4954534c4156 49545349524b 495453464d53 @@ -152527,7 +144809,6 @@ 49544e4f5433 49544c4f5645 49544b4b4948 -495449534d45 4954494e4d45 4954484f4d31 4954484b4a52 @@ -152546,8 +144827,6 @@ 495441544943 495441534341 4954414c5932 -4954414c5931 -4954414c5931 4954414c4153 4954414c3639 4954414c3135 @@ -152568,7 +144847,6 @@ 495353555331 4953534f4646 4953534b494e -495353455859 495353415241 495353414353 495353414132 @@ -152582,7 +144860,6 @@ 49534f574245 49534f544f56 49534f4e5a4f -49534f4c4445 49534f4c4441 49534f4b454e 49534f4b414d @@ -152613,7 +144890,6 @@ 495349533233 495349533036 495349495349 -495349444f52 495349414849 495349414831 495348554745 @@ -152631,8 +144907,6 @@ 49534841414e 495348413735 495348353136 -4953474f4f44 -4953474f4c44 4953474f4c44 495346415241 49534556494c @@ -152644,7 +144918,6 @@ 4953444e5757 495343555445 4953434f5454 -4953434f4f4c 495343495343 495343494e49 495343484941 @@ -152659,7 +144932,6 @@ 495341473044 495341444f47 495341423132 -495341414353 495341414352 495341414339 495341414338 @@ -152671,10 +144943,8 @@ 495331393532 49525953494b 495258544742 -495258544742 495257494e45 495256594e32 -495256494e47 495256414e49 495255535941 4952554e3136 @@ -152710,7 +144980,6 @@ 495249535345 495249534953 495249534853 -49524953484b 495249534836 495249534835 495249534833 @@ -152720,7 +144989,6 @@ 495249533137 495249533133 4952494e4f4b -4952494e4b41 4952494e4154 4952494e414d 4952494e4149 @@ -152768,14 +145036,12 @@ 495155494c54 495151323030 49514c464c46 -495056544542 4950504f4e31 49504f443231 49504f434552 49504e323641 49504c493833 49504c42494e -49504b495353 49504b495331 495045544552 49504547494d @@ -152805,7 +145071,6 @@ 494f4e494353 494f4e494333 494f4d494f4d -494f4d454741 494f4c494f4c 494f4c434d58 494f48453455 @@ -152866,8 +145131,6 @@ 494e534b4950 494e53495354 494e53494e53 -494e53455254 -494e53455254 494e53454c31 494e53454b32 494e53454144 @@ -152894,9 +145157,7 @@ 494e4e413930 494e4e413739 494e4e413138 -494e4e413138 494e4e413132 -494e4c4f5645 494e4c495645 494e4c305645 494e4b593737 @@ -152915,7 +145176,6 @@ 494e48454144 494e47554e4e 494e47534f43 -494e4752414d 494e474f4941 494e474f424f 494e474f4245 @@ -152937,7 +145197,6 @@ 494e46414345 494e46314c54 494e455a3535 -494e45535341 494e45533934 494e45533132 494e45533031 @@ -152959,7 +145218,6 @@ 494e44495941 494e4449554e 494e44494f53 -494e4449474f 494e44494354 494e4449434f 494e44494148 @@ -153105,9 +145363,7 @@ 494c55565345 494c55565049 494c55564242 -494c55563639 494c5553494f -494c55534841 494c54555033 494c5453424c 494c54533936 @@ -153118,10 +145374,8 @@ 494c534f5653 494c53454b45 494c52544142 -494c52544142 494c52414843 494c50454633 -494c4f564555 494c4f564551 494c4f564548 494c4f564547 @@ -153157,12 +145411,10 @@ 494c49464657 494c4944414e 494c49424f52 -494c49414e41 494c49413737 494c49413030 494c48414d45 494c4752494d -494c464f5244 494c46414954 494c45564545 494c45414454 @@ -153227,7 +145479,6 @@ 494953393131 494952494e41 49494f49494f -494949494949 494949373737 494948414d44 494945543931 @@ -153281,8 +145532,6 @@ 49474f313638 49474e555453 49474e4f544f -49474e495445 -49474d545641 49474d545641 49474c4f4f4f 49474c4f4f31 @@ -153349,9 +145598,6 @@ 49444b494443 49444b464131 49444a545341 -49444a545341 -4944494f5453 -4944494f5453 4944494f4d53 494449444944 494447495453 @@ -153368,7 +145614,6 @@ 4944414d4145 4944414c4941 494441484f45 -494441484f31 494438494438 494436345035 494431305453 @@ -153393,12 +145638,9 @@ 49434b4b4945 494349545241 4943494e4731 -494349434c45 49434855434b 4943484f4d50 -49434849524f 494348494e49 -49434842494e 494348313131 494345593435 494345593434 @@ -153415,7 +145657,6 @@ 494345303037 494345303030 494342494454 -494341525553 494341524f53 494341524431 4943414e444f @@ -153445,12 +145686,9 @@ 494244465242 4942424f4c45 494242313931 -4942414e455a 49424144414e -494236554239 494235313530 494154473242 -494153313030 494152554245 494150393939 49414f494643 @@ -153471,8 +145709,6 @@ 49414d494153 49414d484f54 49414d48494d -49414d474f44 -49414d474f44 49414d444f4e 49414d444131 49414d424947 @@ -153648,7 +145884,6 @@ 485552544144 485552534849 485552524552 -485552524159 485552524136 4855524f4e53 4855524f4e36 @@ -153664,7 +145899,6 @@ 48554e545454 48554e545233 48554e544f4e -48554e544544 48554e543533 48554e543233 48554e543133 @@ -153676,12 +145910,10 @@ 48554e4b3139 48554e484f57 48554e47564e -48554e475553 48554e474945 48554e473639 48554e473130 48554e445431 -48554e44454e 48554e444159 48554e443234 48554e443232 @@ -153689,7 +145921,6 @@ 48554d505931 48554d505041 48554d504931 -48554d504552 48554d50454c 48554d503437 48554d4f5245 @@ -153727,7 +145958,6 @@ 4855474f4f4f 4855474f4e4f 4855474f474f -4855474f3939 4855474f3938 4855474f3933 4855474f3838 @@ -153740,7 +145970,6 @@ 4855474d4532 485547494e31 485547485547 -485547484553 485547484231 485547475942 485547475932 @@ -153775,11 +146004,9 @@ 485542424945 485542424559 485542424552 -485542424552 485542424148 485542424141 485542424136 -485542424131 485542423145 485542414556 485542313233 @@ -153792,8 +146019,6 @@ 4855314b3132 48545a544942 4854594c4a56 -485459464e46 -485455425946 4854524a484c 485452434252 485452415757 @@ -153882,7 +146107,6 @@ 485142535757 4851364b3231 485059554134 -485056544542 485055583830 485055485055 485054424159 @@ -153914,22 +146138,17 @@ 484f574f4f46 484f574d4554 484f57494537 -484f57494531 484f5747504a 484f57464152 484f57455645 484f57455331 484f57455259 -484f57454c4c 484f57445938 484f57445937 484f57445933 -484f57445933 -484f57445932 484f57444f49 484f57444f47 484f57444545 -484f57444545 484f5741444f 484f57363136 484f5734544f @@ -153947,13 +146166,10 @@ 484f55534537 484f55524c59 484f554e4459 -484f554e4453 484f554e4432 484f55474853 484f54574542 484f54545956 -484f54545542 -484f54544f4d 484f54544f4d 484f54544559 484f54544545 @@ -153962,17 +146178,14 @@ 484f54543234 484f54543131 484f5453554e -484f54524f44 484f54504958 484f5450494e 484f544f5050 -484f544f4e45 484f544f3038 484f544e4553 484f544d554d 484f544d414d 484f544c4950 -484f544c4547 484f544b4944 484f544b4559 484f544a4f42 @@ -153985,7 +146198,6 @@ 484f54465456 484f54464f58 484f54464154 -484f54454c53 484f54454c35 484f54454c33 484f54454c32 @@ -154024,8 +146236,6 @@ 484f53453233 484f53453133 484f52564154 -484f52544f4e -484f52544f4e 484f5254454e 484f52544131 484f52535432 @@ -154033,26 +146243,19 @@ 484f52534d41 484f52534945 484f5253455a -484f52534559 484f5253454e 484f52534534 -484f52534532 484f5253434c 484f52525931 -484f52524f52 -484f52524f52 484f52524159 484f524f5348 -484f524e5953 484f524e594d 484f524e594a -484f524e5944 484f524e5939 484f524e5938 484f524e5437 484f524e5354 484f524e5331 -484f524e4544 484f524e4159 484f524e3535 484f524e3139 @@ -154066,7 +146269,6 @@ 484f52415449 484f52414d41 484f52414359 -484f52414349 484f52314554 484f50544f4e 484f50535353 @@ -154095,13 +146297,10 @@ 484f4f56494b 484f4f544f4e 484f4f544e41 -484f4f544552 484f4f543537 484f4f524e31 484f4f505456 484f4f504f4f -484f4f504c41 -484f4f504552 484f4f504544 484f4f503535 484f4f503239 @@ -154114,15 +146313,11 @@ 484f4f4b5353 484f4f4b5331 484f4f4b4f4f -484f4f4b4954 484f4f4b4559 -484f4f4b4552 -484f4f4b454d 484f4f4b4153 484f4f4b3639 484f4f4b3232 484f4f474552 -484f4f444f4f 484f4f444c59 484f4f444945 484f4f443839 @@ -154134,7 +146329,6 @@ 484f4e4e4945 484f4e4b5932 484f4e4b5931 -484f4e4b4945 484f4e475955 484f4e474841 484f4e474455 @@ -154144,8 +146338,6 @@ 484f4e455944 484f4e455939 484f4e455938 -484f4e455937 -484f4e455932 484f4e455930 484f4e444f53 484f4e444f37 @@ -154174,8 +146366,6 @@ 484f4d49414b 484f4d455353 484f4d455335 -484f4d455253 -484f4d455253 484f4d45524b 484f4d454f4e 484f4d454e53 @@ -154190,9 +146380,7 @@ 484f4d453232 484f4d453038 484f4d453034 -484f4d425245 484f4d414e4e -484f4d414745 484f4d414453 484f4d313233 484f4c5a4150 @@ -154216,8 +146404,6 @@ 484f4c4c5930 484f4c4c5353 484f4c4c4f4e -484f4c4c4953 -484f4c4c4559 484f4c4c4545 484f4c4c4152 484f4c4c4148 @@ -154236,7 +146422,6 @@ 484f4c413233 484f4c413231 484f4c413230 -484f4c413132 484f4c413030 484f4b4b4559 484f4b4b4149 @@ -154258,7 +146443,6 @@ 484f47534949 484f47533131 484f474e4f31 -484f474d414e 484f474d3737 484f474a4157 484f47484f54 @@ -154266,7 +146450,6 @@ 484f47414e38 484f47414e35 484f47414e33 -484f464e4552 484f464e4152 484f46465931 484f46464945 @@ -154300,7 +146483,6 @@ 484f424f4a4f 484f424f3939 484f424f3432 -484f424f3132 484f424f3131 484f424f3031 484f42495454 @@ -154315,7 +146497,6 @@ 484f31313638 484f31303234 484e54544342 -484e54544342 484e54505343 484e4e465541 484e4b535452 @@ -154363,7 +146544,6 @@ 484d31323334 484c57393636 484c52544142 -484c52544142 484c4f564552 484c4f50554e 484c4e484c4e @@ -154397,7 +146577,6 @@ 484b31303238 484b30353634 484b30303133 -484a56584252 484a56524631 484a56505443 484a56503938 @@ -154428,7 +146607,6 @@ 484a4354454e 484a434e5352 484a43463130 -484a4343425a 484a43425952 484a41584936 484a41533738 @@ -154446,7 +146624,6 @@ 484954594f55 484954554a49 48495454494e -484954544552 484954535531 484954534d35 484954534949 @@ -154454,15 +146631,11 @@ 484954533132 484954524949 4849544f5249 -4849544f4d49 -4849544d454e 4849544d4531 -4849544c4552 484954494d45 484954494445 484954494431 484954484954 -484954454348 484954434845 484954434834 484954343230 @@ -154508,13 +146681,11 @@ 48494e444855 48494e444545 48494e434859 -48494e415441 48494e414b49 48494e413535 48494e30304e 48494d4d4552 48494d484552 -48494d455241 48494d454e4f 48494d41524b 48494d414c41 @@ -154539,7 +146710,6 @@ 48494c494645 48494c445931 48494c444553 -48494c44454e 48494c444530 48494c414e44 48494c414c43 @@ -154578,7 +146748,6 @@ 4849434f434b 4849434b4f4b 4849434b4c45 -4849434b4559 4849424f5953 4849424f5537 484942495244 @@ -154660,7 +146829,6 @@ 48464e494e45 48464c4d5246 48464c46434e -48464c455546 48462e4a4e46 2e4846495246 484645494659 @@ -154677,13 +146845,11 @@ 48455952414d 484559504f50 4845594f5532 -4845594e4f57 4845594d4f4e 4845594c5556 4845594b4556 484559485548 484559474246 -484559424f59 484559424142 484559415a5a 484559345132 @@ -154697,13 +146863,10 @@ 484558494e45 484558484558 48455848414d -48455848414d 484558464547 484558453131 48455841474f -484557534f4e 484557504143 -484557495454 48455744454e 484557425536 484557415249 @@ -154721,7 +146884,6 @@ 48455448454e 48455445524f 484554455245 -484553544552 484553534545 484553534159 484553504552 @@ -154734,9 +146896,7 @@ 484552564554 484552564550 484552554449 -484552544841 48455254454c -484552544131 484552534348 484552524f31 48455252494e @@ -154744,13 +146904,11 @@ 4845524f5949 4845524f5331 4845524f4b49 -4845524f494e 4845524f3737 4845524f3639 4845524f3030 4845524e4553 4845524e444f -4845524d4f53 4845524d4131 4845524d3733 4845524d3232 @@ -154770,8 +146928,6 @@ 484552425353 48455242534d 484552425331 -484552424945 -484552424552 484552423939 484552423935 484552423435 @@ -154790,13 +146946,10 @@ 48454e534849 48454e534348 48454e525957 -48454e525957 48454e525954 -48454e525953 48454e525952 48454e525950 48454e52594d -48454e525938 48454e525930 48454e524953 48454e52494d @@ -154847,7 +147000,6 @@ 48454c505050 48454c50504f 48454c504954 -48454c504552 48454c50454e 48454c503455 48454c503238 @@ -154859,29 +147011,18 @@ 48454c4d4b45 48454c4d4553 48454c4c5945 -48454c4c5941 48454c4c4f5a -48454c4c4f57 48454c4c4f52 -48454c4c4f4f 48454c4c4f4d 48454c4c4f48 48454c4c4f42 -48454c4c4f39 -48454c4c4f38 -48454c4c4f35 -48454c4c4f32 -48454c4c4f30 48454c4c4f2e -48454c4c4e4f 48454c4c4d41 48454c4c494b 48454c4c4555 -48454c4c4153 48454c4c3335 48454c4c3131 48454c495831 -48454c49554d 48454c495431 48454c494f54 48454c494f4e @@ -154895,20 +147036,17 @@ 48454c474131 48454c454e52 48454c454e4e -48454c454e45 48454c453641 48454c453541 48454c453441 48454c453241 48454c453141 -48454c444552 48454c415558 48454c415531 48454c414d41 48454c313233 48454c313131 48454c313030 -48454b544f52 48454b54494b 48454b4d414e 48454b4b454c @@ -154924,15 +147062,12 @@ 484549505041 4845494e5a4b 4845494e5a4a -4845494e5a49 -4845494e5a31 4845494e5249 4845494e4f32 4845494e4553 4845494e4531 4845494e3036 4845494d434f -4845494c4947 4845494c4552 4845494b4552 4845494b454b @@ -154943,7 +147078,6 @@ 48454944494c 484549444942 484549444937 -484549444931 484549444552 484549385245 484549313233 @@ -154975,19 +147109,14 @@ 484544455241 48454444454e 484544415941 -484543544943 484543543052 4845434e3232 4845434b4552 -4845434b454c 4845434b4252 484543484552 -484543415445 -484542524557 4845424e4552 48454249414e 48454247454e -484542455254 48454242454e 484542424152 484542313136 @@ -155002,7 +147131,6 @@ 484541544853 484541544850 484541544847 -484541544845 484541544832 484541543938 484541543638 @@ -155010,7 +147138,6 @@ 484541543036 484541535445 48454152545a -484541525431 484541524e45 484541445953 484541445333 @@ -155120,8 +147247,6 @@ 48415a495148 48415a454c4a 48415a454c39 -48415a454c35 -48415a415244 48415a415241 48415a414e31 48415a414c31 @@ -155136,7 +147261,6 @@ 484159444f47 484159444e50 484159444e47 -484159444e31 484159444159 484159424553 484159424154 @@ -155163,14 +147287,11 @@ 4841574b3636 4841574b3539 4841574b3538 -4841574b3538 4841574b3535 4841574b3431 4841574b3334 4841574b3230 4841574b3137 -4841574b3131 -4841574b3037 4841574b3037 484157493434 484157475331 @@ -155190,7 +147311,6 @@ 48415630434b 484155544552 484155534b41 -484155534552 484155525541 4841554d414e 4841554c4954 @@ -155201,11 +147321,8 @@ 484154594d32 484154554e32 484154554b4f -484154544945 -484154544945 4841544c4552 48415449414e -484154484f52 484154455531 484154455231 484154455048 @@ -155227,7 +147344,6 @@ 4841534e4148 4841534d414e 4841534c4f34 -4841534c4f31 4841534c4556 4841534c4552 4841534b494e @@ -155255,7 +147371,6 @@ 484152564945 484152564545 48415256414e -484152554d49 484152554d31 484152554849 484152544f4e @@ -155265,17 +147380,11 @@ 484152543136 484152543132 484152535441 -484152525953 484152525952 48415252594b 484152525946 -484152525946 484152525941 484152525938 -484152525938 -484152525936 -484152525932 -484152525931 484152525559 484152524f54 484152524931 @@ -155298,12 +147407,10 @@ 4841524d4f39 4841524d4f34 4841524d4f33 -4841524c4f57 4841524c4556 4841524c4554 4841524c454e 4841524c4541 -4841524c414e 4841524c414d 4841524c3932 4841524c3359 @@ -155336,23 +147443,18 @@ 48415242454e 484152415441 484152415259 -484152415245 -484152414c44 -484152414441 484152314559 484152304c44 484150554e41 484150554741 484150534150 484150505954 -484150505953 48415050594d 484150505948 484150505946 484150505943 484150505942 484150505930 -484150505059 484150504953 484150504949 4841504b4944 @@ -155367,16 +147469,12 @@ 48414e555441 48414e554b41 48414e54484f -48414e544552 48414e54414c 48414e534f4f -48414e534f4e -48414e534f4c 48414e534b41 48414e534945 48414e534931 48414e534552 -48414e53454e 48414e534541 48414e533938 48414e533737 @@ -155395,7 +147493,6 @@ 48414e4e414d 48414e4e414b 48414e4e4138 -48414e4e4131 48414e4e4130 48414e4b5931 48414e4b4857 @@ -155424,8 +147521,6 @@ 48414e454546 48414e444d45 48414e444c59 -48414e44454c -48414e44454c 48414e444544 48414e444241 48414e44414e @@ -155450,7 +147545,6 @@ 48414d524943 48414d505059 48414d505055 -48414d504552 48414d4f4c4f 48414d4d5934 48414d4d5933 @@ -155467,7 +147561,6 @@ 48414d454155 48414d444f47 48414d444941 -48414d44414e 48414d43484a 48414d434150 48414d43414d @@ -155497,11 +147590,9 @@ 48414c4f4f32 48414c4f4e45 48414c4f3336 -48414c4f3333 48414c4f3332 48414c4f3236 48414c4f3235 -48414c4f3233 48414c4f5f32 48414c4f3137 48414c4f3131 @@ -155562,7 +147653,6 @@ 48414b494d45 48414b494d41 48414b494d31 -48414b494d31 48414b455252 48414b455231 48414b414e45 @@ -155589,7 +147679,6 @@ 484149474841 48414946414e 48414944594b -48414944454e 484149444545 484149415349 484149373030 @@ -155604,10 +147693,8 @@ 484147545041 484147534545 4841474c4559 -4841474c4552 4841474b4559 484147484147 -484147474953 484147474552 48414747414e 484147474149 @@ -155633,21 +147720,18 @@ 484144524f4e 4841444f4f44 4841444c4f57 -4841444c4559 4841444b4544 4841444a4552 484144495441 484144495345 484144494d41 484144494a41 -484144455331 484144455241 484144444f4e 48414444454e 484144414741 4841434b5548 4841434b3938 -4841434b3344 4841434b3332 4841434b3132 484143484953 @@ -155854,7 +147938,6 @@ 475745494c4f 475745454449 475743554c42 -475742555348 475742475742 475742425747 4757415a4f4f @@ -155883,15 +147966,12 @@ 47555a454e41 47555a454c31 47555a43554d -475559564552 -475559564552 475559544f55 4755594f4e4e 47555946554e 475559444f47 475559433231 475559343137 -475559313233 475559303031 475558344357 47555741504f @@ -155910,7 +147990,6 @@ 475553543031 475553535931 475553535359 -475553534945 475553533237 475553503537 4755534f5641 @@ -155920,7 +147999,6 @@ 475553483132 47555345594e 47555345504f -475553454e41 47555345494e 475553434a46 475553434154 @@ -155928,7 +148006,6 @@ 475553333231 475553313937 475553313930 -475553313233 475553303931 475553303036 475552574e53 @@ -156003,8 +148080,6 @@ 47554d384f45 47554c564152 47554c504552 -47554c4e5552 -47554c4e4152 47554c4c5953 47554c4c4945 47554c4c4552 @@ -156032,7 +148107,6 @@ 4755494e4e41 4755494e4553 4755494e4545 -4755494e4541 4755494c4c59 4755494c4953 4755494c494e @@ -156046,7 +148120,6 @@ 475549444f43 475549444f42 47554944454c -475549444531 47554943484f 475549393837 475549373434 @@ -156069,16 +148142,13 @@ 475545535459 475545535438 475545535433 -475545535432 475545535354 475545524f56 4755454e4e41 4755454d4153 475545424f4e -47554452554e 475544424159 4755434b5532 -4755434b4945 47554343494f 475542494e4f 475542494e4e @@ -156086,10 +148156,8 @@ 475541554a42 475541534f4e 47554152524f -475541525241 47554152494e 475541524943 -475541524431 47554152414e 475541504153 4755414c444f @@ -156104,7 +148172,6 @@ 475532555232 4755314e454e 47545a544942 -47545a544942 47545943425a 475458323630 475457373256 @@ -156136,7 +148203,6 @@ 475448554d42 4754484c4543 4754484b4259 -475448434252 475448424a4c 4754475a5246 475445544f4e @@ -156146,7 +148212,6 @@ 475442475442 475442373737 475442313233 -475441475441 47544146414e 475441444552 475441333435 @@ -156209,8 +148274,6 @@ 475255505045 4752554e5430 4752554e494e -4752554e4745 -4752554e4745 4752554e4449 4752554d4d54 4752554d4259 @@ -156219,7 +148282,6 @@ 475255475255 475255465459 475255465449 -47525544454e 475255434852 475255434841 475255424c45 @@ -156230,7 +148292,6 @@ 475252323535 47524f574e33 47524f57494e -47524f564553 47524f56454e 47524f56454c 47524f564543 @@ -156261,7 +148322,6 @@ 47524f443030 47524f424552 47524f42454e -47524f42454e 47524f424245 47524f423133 47524f423033 @@ -156280,7 +148340,6 @@ 4752495a3137 475249543132 475249535345 -475249534f55 475249534f4e 47524953454c 475249505041 @@ -156293,11 +148352,9 @@ 4752494e444c 4752494e4433 4752494e442a -4752494e4348 4752494e3533 4752494e3036 4752494d5553 -4752494d4d59 4752494d4d4f 4752494d4953 4752494d3736 @@ -156306,7 +148363,6 @@ 4752494c4c49 4752494c4c41 4752494c4c32 -475249474f52 475249474854 475249474131 475249464653 @@ -156330,13 +148386,11 @@ 475245593736 475245593432 475245545a39 -475245545441 475245544f4f 475245544845 47524554414c 475245544147 475245544133 -475245544131 4752454e4b41 4752454e444f 4752454e4445 @@ -156346,7 +148400,6 @@ 475245475352 475245475041 475245474f53 -475245474f52 475245474d41 475245474754 475245474745 @@ -156376,19 +148429,16 @@ 475245454e47 475245454e43 475245454e42 -475245454e39 475245454c59 475245454b45 475245454b37 475245454b32 475245454646 475245454545 -475245454459 475245454444 475245454432 475245454430 475245454348 -475245454345 475245454241 475245453434 475245434f31 @@ -156425,9 +148475,6 @@ 475241565938 475241565935 475241565932 -475241564953 -475241564553 -47524156454c 475241554552 475241545441 475241544553 @@ -156436,15 +148483,11 @@ 475241535941 475241535337 475241535332 -475241535331 47524153484f 47524150504f 475241504859 475241504831 -475241504553 -475241504553 47524150454e -475241504531 475241504152 4752414f554c 4752414e5941 @@ -156458,24 +148501,19 @@ 4752414e4e49 4752414e4a41 4752414e494e -4752414e444f 4752414e444c 4752414e4443 4752414e4438 4752414e4433 4752414e4432 -4752414e4431 -4752414d5053 4752414d504f 4752414d4f52 4752414d4f4e -4752414d4d59 4752414d4259 4752414d4153 4752414d3436 475241475241 475241445957 -475241445931 475241445538 475241444f56 475241444f53 @@ -156494,8 +148532,6 @@ 475241434943 475241434931 47524143484f -475241434553 -475241434544 475241434536 475241424945 475241424552 @@ -156518,7 +148554,6 @@ 475238415353 475238383854 475238324355 -475238324355 475238304e45 475237373433 475236313230 @@ -156583,14 +148618,11 @@ 474f57455231 474f57415244 474f56543332 -474f564f4c53 474f564e554b 474f564e4f4f 474f56455254 474f56343638 474f55544442 -474f55544442 -474f55544442 474f55534544 474f554c4554 474f554b4935 @@ -156667,7 +148699,6 @@ 474f52494345 474f52494341 474f5247494f -474f52474553 474f52474532 474f52474531 474f5247415a @@ -156676,12 +148707,8 @@ 474f52454544 474f52444f39 474f52444f35 -474f52444f31 474f52444f30 474f5244494d -474f52444945 -474f52444945 -474f5244454e 474f52444545 474f52444131 474f52425931 @@ -156693,7 +148720,6 @@ 474f504f524e 474f504e4943 474f50494b41 -474f50484552 474f50454431 474f50415353 474f50413838 @@ -156702,10 +148728,7 @@ 474f4f545359 474f4f544545 474f4f544348 -474f4f534553 474f4f534538 -474f4f534537 -474f4f534531 474f4f524f4f 474f4f504945 474f4f4f4459 @@ -156752,11 +148775,9 @@ 474f4f443233 474f4f443031 474f4f434836 -474f4f434831 474f4f425931 474f4f424f59 474f4f424c45 -474f4f424552 474f4f424131 474f4f423133 474f4f363636 @@ -156779,16 +148800,13 @@ 474f4e473939 474f4e455453 474f4e455249 -474f4e444f52 474f4e444c41 474f4e44454b 474f4e443739 474f4e313233 474f4d455a38 -474f4d455a31 474f4d455331 474f4d455232 -474f4d455231 474f4d454e41 474f4d424559 474f4d415254 @@ -156797,7 +148815,6 @@ 474f4c534b41 474f4c4f5741 474f4c4f4e47 -474f4c4f4e47 474f4c4f4c49 474f4c4f4146 474f4c4d414e @@ -156814,7 +148831,6 @@ 474f4c465454 474f4c464f53 474f4c464f48 -474f4c46494e 474f4c464754 474f4c464544 474f4c464253 @@ -156829,16 +148845,13 @@ 474f4c463435 474f4c463339 474f4c463238 -474f4c463138 474f4c463039 474f4c463033 -474f4c463031 474f4c453738 474f4c445931 474f4c445353 474f4c444f4e 474f4c444f31 -474f4c44494e 474f4c444941 474f4c444934 474f4c444932 @@ -156879,8 +148892,6 @@ 474f4b453937 474f4b414e45 474f4a554d50 -474f4a495241 -474f4a455453 474f4a455435 474f4a41434b 474f494e544f @@ -156912,13 +148923,10 @@ 474f47455431 474f47454152 474f47415255 -474f46495348 474f46465931 474f46455253 -474f46415354 474f45545a45 474f45545449 -474f45544845 474f45524945 474f45455253 474f45444445 @@ -156930,7 +148938,6 @@ 474f44535353 474f44534b59 474f44534b49 -474f44534554 474f4453454e 474f44524943 474f444f5249 @@ -156942,7 +148949,6 @@ 474f44454b45 474f44444f54 474f44444945 -474f44444444 474f44415645 474f4441554d 474f44414e31 @@ -156952,12 +148958,10 @@ 474f43455041 474f42554c4c 474f424f574c -474f424c494e 474f424c454e 474f42494c4c 474f42494553 474f42454156 -474f42424c45 474f42424c41 474f4242454c 474f42415254 @@ -156966,7 +148970,6 @@ 474f4241434b 474f42414245 474f41574559 -474f41574159 474f41554c44 474f41545a38 474f41545331 @@ -156976,7 +148979,6 @@ 474f41543536 474f41543237 474f41543138 -474f41524d59 474f414c4558 474f414c3232 474f414c3139 @@ -156991,7 +148993,6 @@ 474f32313132 474f31393936 474f31333133 -474f31323334 474f31303130 474e57593332 474e55534d41 @@ -157065,7 +149066,6 @@ 474d35343134 474d35333631 474d34363832 -474d34333235 474d34323432 474d304e4559 474c59505547 @@ -157087,7 +149087,6 @@ 474c53313233 474c4f594552 474c4f574d45 -474c4f564553 474c4f56454d 474c4f535341 474c4f524631 @@ -157097,7 +149096,6 @@ 474c4f474c4f 474c4f434b4b 474c4f434b32 -474c4f425553 474c4f424f31 474c4f424558 474c4f42454e @@ -157120,7 +149118,6 @@ 474c45525953 474c454e5953 474c454e534d -474c454e4e59 474c454e4e4b 474c454e4e45 474c454e4e37 @@ -157170,7 +149167,6 @@ 474c33313331 474c31393834 474c31383030 -474c31383030 474c31353630 474c31313030 474c30425553 @@ -157200,10 +149196,7 @@ 474a53414d53 474a52544831 474a524a4343 -474a50545941 -474a50545941 474a4e594252 -474a4d505457 474a4d4d5953 474a4d474a4d 474a4d343536 @@ -157233,13 +149226,10 @@ 474a31393732 474a31363038 474a31343135 -47495a5a5931 47495a5a554b 47495a5a4c45 47495a5a4552 47495a4d4f54 -47495a4d4f53 -47495a4d4f53 47495a4d4f50 47495a4d4f39 47495a4d4f30 @@ -157259,16 +149249,12 @@ 474955505049 4749554e5441 4749554d4552 -4749554c494f 474955474e4f 474955474749 47495454454e 47495454454c 474954544131 4749544d414e -4749544c4552 -474954415241 -474954414e41 474954414e41 474953544d45 474953534f32 @@ -157283,7 +149269,6 @@ 4749524f3737 4749524f3434 4749524c5336 -4749524c5332 4749524c3638 4749524c3455 4749524c3244 @@ -157292,7 +149277,6 @@ 4749524c3031 474952494e41 474952474953 -474952444c45 474952444945 474952434841 474952373232 @@ -157305,7 +149289,6 @@ 47495041414e 47494f585451 47494f545441 -47494f524749 47494f503639 47494f4d4f4c 47494f42454c @@ -157354,7 +149337,6 @@ 47494c533137 47494c524f44 47494c4d4f52 -47494c4d4f52 47494c4c5953 47494c4c4e4a 47494c4c494e @@ -157371,14 +149353,12 @@ 474948433938 474947554c49 474947534f4e -474947494749 474947493730 474947493138 474947493132 474947493032 474947485459 47494748454e -474947474c45 474947474559 47494747454c 474947454c31 @@ -157386,7 +149366,6 @@ 474947413636 474947413455 474947413131 -474946544544 474946543455 474946543132 474946494445 @@ -157396,16 +149375,12 @@ 4749454e454b 474944535a54 474944524f53 -474944474554 4749434f3639 -47494252414e 47494245524f 474942454e4f 474942425953 474942425352 474942425331 -474942424f4e -474942424f31 474942424f31 474942424945 474942313238 @@ -157415,17 +149390,12 @@ 474941504552 4749414e544f 4749414e5433 -4749414e5433 4749414e4e59 -4749414e4e41 -4749414e4e41 4749414e3432 4749414d4d49 -4749414c4c4f 4749414c4c41 474941444131 474941434f4d -474941434f4d 474941434849 47494142414f 474941365453 @@ -157449,7 +149419,6 @@ 47484f535454 47484f53544a 47484f535444 -47484f535437 47484f535433 47484f535430 47484f505059 @@ -157470,7 +149439,6 @@ 47484a475448 47484a444a4c 47484a434e46 -47484a434e42 47484a41544e 47484a383838 47484a373839 @@ -157479,7 +149447,6 @@ 47484a313234 474849413936 474848484848 -474847484748 474847464853 472448474556 474846593933 @@ -157495,7 +149462,6 @@ 47482e44544e 474842594e54 474842534b4d -474842524a4b 4748424e4a59 474842474842 47484244464b @@ -157566,7 +149532,6 @@ 474653474653 474652554954 474651475448 -47464f524345 47464e484259 47464e48424a 47464c545541 @@ -157575,11 +149540,9 @@ 47464b425946 474649524631 474649463132 -474649454b5a 474648464847 47464846444a 474648454346 -474648304b4d 4746474a5852 47464746515a 474647464447 @@ -157625,7 +149588,6 @@ 474554534554 474554533031 4745544f4e31 -4745544f4646 4745544d4531 4745544d4144 4745544c4f53 @@ -157637,7 +149599,6 @@ 474554455550 47455445524f 474554444f57 -474554414645 474554383532 474554373838 474554363736 @@ -157652,7 +149613,6 @@ 474552555a41 47455255444f 474552544c45 -474552544945 474552544552 474552534643 47455252594d @@ -157682,7 +149642,6 @@ 474552444131 474552424c45 474552424945 -474552424552 47455242454e 474552423738 474552415241 @@ -157735,7 +149694,6 @@ 47454e4e4144 47454e494a45 47454e494a41 -47454e494553 47454e494545 47454e494539 47454e474941 @@ -157797,7 +149755,6 @@ 47454b415441 47454b415353 474549544552 -474549524259 4745494c3033 4745494a5231 47454948494e @@ -157844,7 +149801,6 @@ 4745434b4f4f 4745434b4f34 4745434b4f33 -4745434b4f31 4745434b4b4f 4745434b4552 474542454c53 @@ -157880,7 +149836,6 @@ 474442585858 474442454152 474441594d38 -4744414e534b 474441444459 474437363435 474432363037 @@ -157945,7 +149900,6 @@ 474230363136 47415a5a4f31 47415a5a4141 -47415a5a4141 47415a5a4132 47415a4f5558 47415a4f4e4b @@ -157964,8 +149918,6 @@ 474159534552 474159524159 474159524154 -4741594e4f52 -4741594e4f52 4741594c594e 4741594c4545 474159484152 @@ -157978,7 +149930,6 @@ 474157474157 474157414e41 47415652494c -47415652494b 474156524943 4741564f3530 4741564e594b @@ -157993,14 +149944,12 @@ 474156494e36 474156494e33 474156494e32 -474156494e31 474156494e30 47415649414f 474156484152 474155535345 474155535331 474155524931 -474155524156 4741554c4c45 47415544494e 474155444554 @@ -158020,7 +149969,6 @@ 474154534f4e 4741544f5449 4741544f5353 -4741544f525a 4741544f5258 4741544f5244 4741544f5237 @@ -158035,8 +149983,6 @@ 474154494341 474154455558 474154455353 -474154455331 -474154454348 474154453939 474154453938 474154453737 @@ -158057,7 +150003,6 @@ 474153484f47 474153484953 474153484544 -474153474153 47415343414e 474153424531 474153313233 @@ -158081,14 +150026,11 @@ 474152593230 474152593032 47415256494b -474152564559 -474152564552 474152564552 47415256454e 474152545a31 474152544f4e 474152544848 -474152544552 474152525953 474152525950 474152525949 @@ -158106,11 +150048,9 @@ 4741524e4f4e 4741524e4945 4741524e4559 -4741524e4554 4741524e454b 4741524d494e 4741524c594e -4741524c4943 4741524c454e 4741524c454a 474152494e41 @@ -158150,7 +150090,6 @@ 47414e533930 47414e504f4e 47414e4f4e47 -47414e4e4f4e 47414e4e4147 47414e4d4152 47414e4b4153 @@ -158166,15 +150105,12 @@ 47414e474153 47414e474147 47414e473032 -47414e455348 47414e454556 47414e445a49 47414e445553 47414e445531 47414e444f52 47414e444f4f -47414e444f4e -47414e444f4e 47414e444f4c 47414e44494e 47414e444931 @@ -158187,9 +150123,7 @@ 47414d504552 47414d4f5241 47414d4d415a -47414d4c4554 47414d494e4f -47414d494e47 47414d494c41 47414d474152 47414d455a41 @@ -158197,7 +150131,6 @@ 47414d455338 47414d455337 47414d455333 -47414d455331 47414d455330 47414d455237 47414d455236 @@ -158216,8 +150149,6 @@ 47414d413138 47414d413132 47414c594e41 -47414c574159 -47414c574159 47414c564953 47414c564947 47414c544545 @@ -158297,11 +150228,9 @@ 4741474d414e 4741474c4d41 474147494e4f -474147474544 47414741504f 474147414e47 474147414b41 -474147414741 474147414653 474147413939 474147413936 @@ -158313,7 +150242,6 @@ 474147413030 474146524544 474146464c45 -474146464552 474146464131 474146373432 474146313233 @@ -158324,7 +150252,6 @@ 4741444d414e 47414447494c 474144474945 -474144474554 474144474531 474144454552 47414444414d @@ -158344,7 +150271,6 @@ 4741424f5641 4741424f5241 4741424f4c49 -4741424f4c49 4741424f3939 474142494f4e 474142494e4f @@ -158452,7 +150378,6 @@ 4731344e5035 473134343538 473133313532 -473132333435 473132313434 473054434841 473052444f4e @@ -158461,7 +150386,6 @@ 47304c44334e 473044414e31 473043415453 -4730424c5545 473035353036 473033323443 473032313331 @@ -158471,8 +150395,6 @@ 465a534d5a42 465a4b4f5346 465a46554f42 -465a46554f42 -465a41505041 465a36435452 465a31333133 465a31323334 @@ -158490,17 +150412,13 @@ 465952453637 465951415a53 465950595a35 -46594f444f52 46594e54494b -46592e4e5246 46594e4a5938 46594e4a5932 -46594e4a5931 46594e4a4952 46592e4e4646 46594e455249 46594e424f53 -46594c485451 46594c484251 46594c46594c 46594a343046 @@ -158510,10 +150428,8 @@ 465945554e42 465945504d32 465945495243 -465942585246 465942524259 465942484656 -465941424346 465939383534 465938314c41 465858414a4f @@ -158521,7 +150437,6 @@ 465852465852 46584c365144 465844554d42 -465844554d42 465844524558 465844324b32 465843415045 @@ -158565,14 +150480,11 @@ 46555a5a5951 46555a5a5950 46555a5a5935 -46555a5a4945 46555a5a3832 465558583052 465558305253 4655545a3232 465554594e53 -46555455524f -465554555241 465554484552 46555445424f 465554453231 @@ -158597,7 +150509,6 @@ 465552544953 465552534f56 465552525259 -465552524f57 465552524552 465552504945 4655524f5245 @@ -158620,13 +150531,10 @@ 46554e544943 46554e53494e 46554e505945 -46554e4f4e45 -46554e4e5953 46554e4e594d 46554e4e5937 46554e4e5934 46554e4e5933 -46554e4e5931 46554e4e4e59 46554e4d454e 46554e4b5954 @@ -158641,12 +150549,10 @@ 46554e4b3132 46554e494f4e 46554e475552 -46554e47554e 46554e474f57 46554e474f32 46554e47454e 46554e474153 -46554e46554e 46555f4e4554 46554e44554b 46554e445336 @@ -158659,8 +150565,6 @@ 46554e43504c 46554e43414d 46554e42554e -46554e424f59 -46554e424f59 46554e42495a 46554e415941 46554e414930 @@ -158685,22 +150589,17 @@ 46554b444953 46554b414441 46554b313233 -46554a59425a 46552d4a5549 46554a494e4f 46554a494d49 4655494e5552 465548515545 465547474c45 -465547415a49 465547415445 465547415244 -465546554655 4655464b4d45 465546414a59 465545564a59 -4655454e5445 -4655454e5445 4655454c4c45 4655454c4945 4655454c4544 @@ -158710,7 +150609,6 @@ 465545305445 46554449444f 465544474545 -465544474545 465544474539 465544473145 465544444444 @@ -158720,11 +150618,9 @@ 4655434f4646 4655434c495a 4655434b5647 -4655434b5550 4655434b554d 4655434b5f55 4655434b5333 -4655434b4f46 4655434b4c59 4655434b4854 4655434b4845 @@ -158734,12 +150630,10 @@ 4655434b3930 4655434b3835 4655434b3739 -4655434b3639 4655434b3637 4655434b3537 4655434b3337 4655434b3336 -4655434b3255 4655434b3238 4655434b3237 4655434b3236 @@ -158750,14 +150644,12 @@ 465543485337 465543485332 465543485331 -465543485331 465542554b49 465542553232 465542553133 465542454341 465542454157 465542454152 -465542415233 465537365757 465531393631 465531333133 @@ -158812,7 +150704,6 @@ 46534f555341 46534e414947 46534c484747 -46534944334e 465344464453 4653434f5454 465343484a47 @@ -158829,9 +150720,6 @@ 465259443635 465259424f59 465259363637 -465258544742 -465258544742 -465258544742 465258353031 46525754594e 46525643494c @@ -158839,9 +150727,7 @@ 465255544953 465255544348 465255544153 -465255495459 465255495435 -465255495431 465255464552 465254474859 465254465254 @@ -158850,10 +150736,8 @@ 4652524a484c 465252373755 465251333235 -46524f5a454e 46524f574e53 46524f544832 -46524f535431 46524f535341 46524f4f5431 46524f4f4f4f @@ -158868,8 +150752,6 @@ 46524f4c4c59 46524f4c3931 46524f49545a -46524f475353 -46524f475331 46524f47475a 46524f474753 46524f47444f @@ -158887,7 +150769,6 @@ 46524f473036 46524f455459 46524f444f58 -46524f444f53 46524f444f47 46524f444f34 46524f444945 @@ -158900,8 +150781,6 @@ 465249573858 465249545a50 465249545a4f -465249545a49 -465249545a45 465249545a39 465249545a37 465249545a35 @@ -158914,13 +150793,10 @@ 4652494e4b59 4652494e4b4b 4652494e4753 -465249474854 465249474753 465249474745 465249455353 -465249455331 465249455245 -465249454453 465249444f4d 46524944454c 46524944414b @@ -158939,7 +150815,6 @@ 465245544546 465245535345 465245534852 -46524553434f 465245524546 4652454e4441 4652454d4553 @@ -158953,9 +150828,7 @@ 465245494552 465245474f4e 465245455a5a -465245455a45 465245455457 -465245454d45 465245454c53 465245454a41 465245454646 @@ -158985,9 +150858,7 @@ 46524544474f 465245444652 465245444636 -465245444552 465245444531 -465245444449 465245444343 465245444231 465245443938 @@ -158998,8 +150869,6 @@ 465245443736 465245443735 465245443733 -465245443639 -465245443639 465245443631 465245443539 465245443534 @@ -159012,8 +150881,6 @@ 465245443138 465245443135 465245443039 -465245414b53 -465245414b4f 465245414b4d 465245414b4b 465245414b49 @@ -159027,11 +150894,9 @@ 465245325a59 465242455345 4652415a5a45 -4652415a4552 465241574553 465241545a45 465241543434 -465241534552 46524153434f 46524153414c 465241504c41 @@ -159043,19 +150908,10 @@ 4652414e5a45 4652414e5a33 4652414e5345 -4652414e4e59 4652414e4e4f -4652414e4b53 -4652414e4b52 -4652414e4b50 -4652414e4b37 4652414e4b34 -4652414e4b32 4652414e4749 4652414e4459 -4652414e434f -4652414e434b -4652414e4331 4652414e3639 4652414e3636 4652414d5553 @@ -159063,13 +150919,10 @@ 4652414d4953 4652414d4943 4652414d4558 -4652414d4552 -4652414d4552 4652414d414e 4652414c494f 4652414c494e 4652414b4552 -465241495345 465241494c53 465241494445 465241474c45 @@ -159090,13 +150943,11 @@ 465233383934 465233344b59 465231534330 -465231444159 465231373839 465231313331 4652305a454e 465230443031 465157544642 -465155454b4d 465155425046 465150413031 46514c465946 @@ -159116,7 +150967,6 @@ 465035363753 465031383134 464f5a5a5959 -464f5a5a4945 464f59543134 464f58593939 464f58593737 @@ -159134,11 +150984,9 @@ 464f58464952 464f58455353 464f58455331 -464f58455331 464f58435542 464f58434733 464f58424f59 -464f58424154 464f58383130 464f58383030 464f58373435 @@ -159167,7 +151015,6 @@ 464f54495348 464f54484552 464f53534945 -464f53534552 464f5353314c 464f53464f53 464f53313233 @@ -159183,7 +151030,6 @@ 464f52544552 464f52544543 464f52544532 -464f52544531 464f52543339 464f5253544c 464f52535445 @@ -159194,7 +151040,6 @@ 464f524d4553 464f524d4544 464f524d4535 -464f524d4531 464f524d4259 464f524d3639 464f524d3434 @@ -159209,7 +151054,6 @@ 464f52474531 464f52465245 464f52464f55 -464f52455645 464f5245534b 464f52454d45 464f52454d41 @@ -159223,14 +151067,12 @@ 464f52444d57 464f52444b41 464f5244494b -464f52444754 464f52444553 464f52444544 464f52444532 464f5244434f 464f52444153 464f52444150 -464f52443937 464f52443935 464f5244384e 464f52443833 @@ -159245,10 +151087,8 @@ 464f52443136 464f5243554d 464f52434558 -464f52434532 464f52434530 464f52424953 -464f5242494e 464f52424947 464f5242455a 464f52415345 @@ -159291,8 +151131,6 @@ 464f4f424f59 464f4f424545 464f4f42415a -464f4f424152 -464f4f424152 464f4f424148 464f4e4e4945 464f4e464f4f @@ -159313,8 +151151,6 @@ 464f49464552 464f474c4f47 464f4749544f -464f47484154 -464f47475931 464f47474945 464f47474941 464f47474544 @@ -159339,7 +151175,6 @@ 464e52443233 464e514d5939 464e4f524431 -464e4f524431 464e4a564252 464e4943454f 464e464c4d42 @@ -159351,7 +151186,6 @@ 464e31344454 464d57313031 464d54545031 -464d53544242 464d53313233 464d52464d52 464d4c4f5453 @@ -159379,7 +151213,6 @@ 464c59493547 464c59493247 464c59484947 -464c59475559 464c59464953 464c59455237 464c59455236 @@ -159393,7 +151226,6 @@ 464c55584954 464c55534d43 464c55534831 -464c55534831 464c554f524f 464c554e4b59 464c554d5053 @@ -159414,14 +151246,12 @@ 464c4f594459 464c4f594441 464c4f594434 -464c4f594431 464c4f573336 464c4f573332 464c4f573234 464c4f555259 464c4f545341 464c4f544f37 -464c4f535359 464c4f535353 464c4f535345 464c4f535331 @@ -159434,7 +151264,6 @@ 464c4f524141 464c4f524132 464c4f523333 -464c4f505059 464c4f505053 464c4f505049 464c4f503131 @@ -159451,7 +151280,6 @@ 464c4f445552 464c4f444f52 464c4f434b53 -464c4f434b45 464c4f434b31 464c4f434349 464c4f424541 @@ -159492,7 +151320,6 @@ 464c49424259 464c4942424c 464c49414e41 -464c48524349 464c474a4d44 464c47474552 464c46564a52 @@ -159500,9 +151327,7 @@ 464c46495348 464c45584d45 464c45583639 -464c45555253 464c45555245 -464c45534859 464c45534831 464c45534348 464c454e544f @@ -159516,7 +151341,6 @@ 464c444d5547 464c4244534d 464c41583838 -464c41564f52 464c41564953 464c41564945 464c4155544f @@ -159529,11 +151353,9 @@ 464c41534b45 464c41534852 464c41534834 -464c41534831 464c41534830 464c41534348 464c41524e37 -464c41524553 464c41505053 464c41505049 464c41503031 @@ -159542,7 +151364,6 @@ 464c414e4e4f 464c414d4535 464c414d4533 -464c414d4531 464c414d4452 464c414d4153 464c414d3234 @@ -159565,7 +151386,6 @@ 464b54595842 464b54524f59 464b54524331 -464b54495246 464b54435a31 464b54335353 464b52575958 @@ -159574,12 +151394,10 @@ 464b4e465946 464b4e46484d 464b4d564248 -464b4d41425a 464b494e4733 464b44535838 464b4444414e 464b40444142 -464b42595246 464b42594637 464b42495246 464b42434646 @@ -159598,7 +151416,6 @@ 464a414c4c45 464a35373636 464a31323334 -464a31323030 46495a5a5931 46495a5a454e 46495a554c49 @@ -159626,7 +151443,6 @@ 464954454348 464954434859 46495354494b -464953544544 464953543639 464953543138 4649534b5552 @@ -159640,13 +151456,9 @@ 464953485935 464953485934 464953485932 -464953484f4e -464953484f4e 464953484e4e 464953484d45 464953484954 -46495348494e -464953484553 46495348454e 46495348454c 464953484544 @@ -159671,7 +151483,6 @@ 464953483135 464953483134 464953454c54 -464953434831 46495342494e 464952535454 46495253544a @@ -159680,11 +151491,9 @@ 46495248414e 464952455831 464952455459 -464952455353 46495245524e 464952454d4e 464952454654 -46495245464c 464952454431 464952454154 464952453934 @@ -159708,7 +151517,6 @@ 464952453239 464952453236 464952453134 -464952453131 464952393559 464950533432 46494f545841 @@ -159731,7 +151539,6 @@ 46494e4f524b 46494e4e4f52 46494e4e454a -46494e4b4c45 46494e4a414e 46494e494b49 46494e49414e @@ -159746,10 +151553,8 @@ 46494e45434f 46494e453031 46494e444f4e -46494e444552 46494e44454d 46494e434f4d -46494e414c45 46494e414c33 46494e414944 46494e413031 @@ -159759,7 +151564,6 @@ 46494c555031 46494c54524f 46494c544f4e -46494c544859 46494c544831 46494c4f5553 46494c4d4553 @@ -159767,11 +151571,9 @@ 46494c4d3232 46494c4d3132 46494c4c5953 -46494c4c5550 46494c4c4d45 46494c4c494e 46494c4c3739 -46494c495050 46494c495049 46494c494f4e 46494c494e53 @@ -159794,7 +151596,6 @@ 46494a493935 46494a493131 464948544446 -46494756414d 4649474f5749 4649474f4e45 4649474f3639 @@ -159812,7 +151613,6 @@ 46494745524f 464947454143 464947415441 -46494741524f 46494741494f 464946545936 464946545934 @@ -159822,15 +151622,12 @@ 464946493132 464946455231 464946453030 -464946413131 -464946413037 464946413037 46494554454e 464945524f38 464945524f31 464945524153 4649454e444f -4649454c4453 4649454c4435 4649454c4434 4649454c4433 @@ -159900,8 +151697,6 @@ 46474f393537 46474a555451 46474a47464a -4647484a4b4c -4647484a4b4c 4647484a3132 464748444648 464748363534 @@ -159925,7 +151720,6 @@ 46464f4f4c4c 46464d434344 46464c545541 -46464c545541 46464c455858 46464c415348 46464b4e4f58 @@ -159964,11 +151758,9 @@ 464557455231 4645565a4931 464556455235 -464556455231 464555455253 46455544414c 464555434854 -4645545a4552 464554545454 464554544947 464554544558 @@ -159979,7 +151771,6 @@ 464554484953 464554484552 464554434832 -464553545553 46455354494e 464553544153 464553544143 @@ -159998,7 +151789,6 @@ 464552524954 464552524934 464552524544 -464552524152 46455252414f 464552523153 4645524f5449 @@ -160008,12 +151798,10 @@ 4645524d4f4e 4645524c4f4e 4645524c494e -4645524b454c 464552495331 464552494b41 46455249454c 464552474f54 -464552454e43 464552454445 464552445931 46455244494e @@ -160024,9 +151812,7 @@ 46454f46554e 46454f46414e 46454e55545a -46454e544f4e 46454e534b45 -46454e524952 46454e4f4d31 46454e4e4947 46454e4d414e @@ -160037,7 +151823,6 @@ 46454e455232 46454e455231 46454e454348 -46454e434553 46454e415349 46454d54494f 46454d4d5553 @@ -160045,22 +151830,17 @@ 46454d4b594e 46454d493238 46454d424f54 -46454d414c45 46454c544348 46454c534f4e 46454c50524f -46454c4f4e59 46454c4f4e31 46454c4d414e -46454c4c4f57 -46454c4c4f57 46454c4c4f53 46454c4c494e 46454c4c4441 46454c4c415a 46454c495a41 46454c495a31 -46454c495858 46454c49584f 46454c49584d 46454c49584b @@ -160071,9 +151851,7 @@ 46454c495844 46454c495839 46454c495834 -46454c495830 46454c49544f -46454c495045 46454c495031 46454c434941 46454c424552 @@ -160086,7 +151864,6 @@ 46454b414c4e 46454953414c 4645494e4552 -4645494e4552 4645494c4552 4645494b4531 4645494a414f @@ -160107,7 +151884,6 @@ 464545504f31 4645454e4c49 4645454c4958 -464545444d45 464545444a49 4645444f5331 4645444f524f @@ -160135,7 +151911,6 @@ 464541544845 464541535454 464541523639 -4645414e4f52 464541333836 464537444552 464532444552 @@ -160152,7 +151927,6 @@ 46444c343434 46444c313031 46444a545341 -46444a545341 46444a443333 464448464656 464448313233 @@ -160213,8 +151987,6 @@ 46424a414753 464249505554 4642494d414e -464249464249 -464248545141 464248545141 464246424642 464244464542 @@ -160252,7 +152024,6 @@ 4641555a4941 464155583231 464155535454 -46415553544f 464155535441 464155535438 4641554c5453 @@ -160261,17 +152032,12 @@ 464154545954 464154545937 464154545935 -464154545931 -464154545931 464154534f32 464154534f31 -464154534f31 464154534558 464154534158 46415453414d 464154534143 -464154504947 -4641544d414e 4641544d4148 4641544d4131 4641544c5556 @@ -160281,12 +152047,10 @@ 4641544a4143 464154494f53 464154494d4f -464154494d41 46415448494d 464154484541 464154453131 464154444144 -464154434154 464154424257 464154424154 464154415231 @@ -160295,7 +152059,6 @@ 464154414c50 464154414c4c 464154414c49 -464154414c31 464154414158 464154373437 464154333134 @@ -160375,8 +152138,6 @@ 46415252554e 46415252554b 464152525252 -464152524f57 -464152524953 464152524552 46415252454e 464152523132 @@ -160399,7 +152160,6 @@ 4641524d3536 4641524d3035 4641524d3031 -4641524c4f57 4641524c4f53 4641524c4f50 4641524c4545 @@ -160411,7 +152171,6 @@ 46415249454c 464152494431 464152484941 -464152484144 464152474f54 464152474f39 464152474552 @@ -160435,7 +152194,6 @@ 464152415a5a 464152415a49 464152414f53 -464152414f4e 464152414e41 464152414e31 464152414a49 @@ -160458,8 +152216,6 @@ 46414f545555 46414e56494c 46414e555441 -46414e544f4d -46414e544f4d 46414e544945 46414e544552 46414e544158 @@ -160467,7 +152223,6 @@ 46414e544137 46414e544134 46414e544133 -46414e544131 46414e543636 46414e535858 46414e535542 @@ -160480,7 +152235,6 @@ 46414e4e5954 46414e4e5935 46414e4e5932 -46414e4e5931 46414e4e4f4e 46414e4e4f32 46414e4e4939 @@ -160505,10 +152259,8 @@ 46414e435953 46414e435950 46414e435932 -46414e435931 46414e43554c 46414e435349 -46414e424f59 46414e42494b 46414e423059 46414e415241 @@ -160521,7 +152273,6 @@ 46414d564952 46414d553934 46414d553735 -46414d4f5553 46414d4f5341 46414d4f4c4f 46414d4f4944 @@ -160573,7 +152324,6 @@ 46414c4c3233 46414c4c3131 46414c4c3032 -46414c4c3032 46414c4b5553 46414c4b4536 46414c4b414e @@ -160593,7 +152343,6 @@ 46414b46414b 46414b455331 46414b455031 -46414b454944 46414b454552 46414b453132 46414b353535 @@ -160603,7 +152352,6 @@ 464149544856 464149544839 464149544838 -464149544833 464149544552 464149534f4e 46414953454c @@ -160611,7 +152359,6 @@ 464149524641 464149524553 464149524531 -4641494c4544 464149464149 464148524552 464148513639 @@ -160622,7 +152369,6 @@ 464148414459 4641474f5431 4641474c4947 -464147474f54 464147474552 464147454154 464147415353 @@ -160634,7 +152380,6 @@ 464146463132 464146445257 464146413034 -464145524945 4641454e5a41 464145445259 464144533639 @@ -160646,8 +152391,6 @@ 464143554c41 464143544953 464143534941 -46414349414c -46414349414c 46414347414e 464143454d45 464143453332 @@ -160662,9 +152405,6 @@ 4641424d414e 4641424c4532 464142494f43 -464142494f31 -46414249454e -46414249454e 464142494534 464142494531 464142493437 @@ -160790,21 +152530,16 @@ 455854524134 455854524133 455854524132 -455854524131 4558544f5254 4558544c5247 45585445524e 455854454e53 455854415a59 -455854415359 455854414e54 45585441434f 455854353830 455854353530 455852333932 -4558504f5331 -4558504f5254 -4558504f3938 4558504f3938 4558504f3836 4558504f3137 @@ -160814,7 +152549,6 @@ 45585045444f 455850454354 45584f4c4f4e -45584f445553 45584e524934 45584d4f5245 45584d41494c @@ -160823,7 +152557,6 @@ 455849543532 455849535256 4558494c494d -45584947454e 45584942494e 455848494245 4558474d414e @@ -160832,7 +152565,6 @@ 455845455845 455845435554 455844554d42 -455843495445 455843454c53 455843454c35 455843454c33 @@ -160866,8 +152598,6 @@ 45565a585858 4556564f544d 45565350524f -455652494b41 -455652494b41 455652494341 455652463536 455652454e53 @@ -160891,22 +152621,18 @@ 4556494c4c4c 4556494c3635 4556494c3533 -4556494c3031 455649453130 455649414e41 455647455741 455647454e4e -455647454e49 455647454e41 455647454e38 455647454e37 455647454e31 455647454841 455646585246 -455645545445 455645545353 455645525959 -45564552544f 455645525131 455645524544 455645523838 @@ -160915,20 +152641,15 @@ 455645523132 455645523035 455645515545 -4556454e5453 4556454e5449 4556454e5431 4556454e5334 4556454e4542 455645373233 -455642554b42 -455642554b42 -455642554b42 45564244534f 4556414e5354 4556414e5339 4556414e5332 -4556414e5331 4556414e4a52 4556414e4748 4556414e444c @@ -160947,7 +152668,6 @@ 4556414c454f 455641444f47 455641444e45 -455641444552 455641443139 455641333431 455641323030 @@ -160969,19 +152689,15 @@ 4555524f3939 4555524f3333 455552495448 -455552454b41 -455552454b41 455552454341 4555504c494f 455550484945 45554e55434f 45554e4c4545 45554e4a4931 -45554e494345 45554e455641 45554d45534d 45554d454c49 -45554c455353 45554c453031 45554c415331 45554c413836 @@ -161001,7 +152717,6 @@ 455454455454 455453413536 4554524f4e45 -45545241494e 455452414445 455450323136 45544f574148 @@ -161020,7 +152735,6 @@ 455448414e43 455448414e41 455448414e38 -455448414e31 455447475453 455445524e4f 4554454e3031 @@ -161075,7 +152789,6 @@ 455353414949 455353413537 455350554d41 -455350524954 4553504d3530 4553504c494e 455350494531 @@ -161136,7 +152849,6 @@ 455330393934 45525a314e36 455259353237 -455258544742 455258525252 455257494e53 455257494e45 @@ -161161,7 +152873,6 @@ 455253434a45 4552524f5234 4552524f5233 -4552524f5231 455252494b41 45525249434f 45525249434b @@ -161190,7 +152901,6 @@ 45524e494537 45524e494533 45524e494530 -45524e455354 45524e333538 45524d41534b 45524d414e4e @@ -161243,7 +152953,6 @@ 455249434f4b 455249434d53 455249434c43 -455249434b41 455249434b39 455249434a52 455249434a4f @@ -161263,7 +152972,6 @@ 455249434133 455249434132 455249433936 -455249433936 455249433830 455249433738 455249433737 @@ -161274,7 +152982,6 @@ 455249433534 455249433332 455249433234 -455249433230 455249433138 455249433136 455249433037 @@ -161285,7 +152992,6 @@ 4552474f4e44 4552474f4e31 4552474b314b -455247414c49 455246455232 455245544f4c 455245534d49 @@ -161310,12 +153016,9 @@ 4552415a4552 455241544f31 45524153594c -45524153494c -455241534552 455241534544 455241533237 4552414e4449 -455241474f4e 455241303341 455238303838 4552354c454e @@ -161328,12 +153031,10 @@ 455157544642 4551574d5458 455155553753 -455155495459 455155495331 455155414e54 45514c35544a 455056544542 -455056544542 455054495332 4550534f4e32 455053494c4f @@ -161362,7 +153063,6 @@ 455041383745 455037333337 455031393737 -455031393737 455031373730 454f57424f59 454f5739594e @@ -161393,16 +153093,13 @@ 454e56455248 454e54593533 454e54544342 -454e54544342 454e54525935 454e54524553 -454e54524152 454e544d414e 454e54455259 454e5445524d 454e5445524c 454e54455238 -454e54455238 454e54455230 454e54454348 454e53555245 @@ -161438,7 +153135,6 @@ 454e4b4f5349 454e4a585246 454e4a4f5959 -454e4a4f5931 454e49563031 454e49535445 454e49534559 @@ -161453,7 +153149,6 @@ 454e47494d45 454e47454e53 454e47454c4c -454e47414745 454e47373731 454e47353632 454e47333138 @@ -161475,7 +153170,6 @@ 454e444c4f53 454e444c4553 454e4446494e -454e44455257 454e44455248 454e44455237 454e44454e54 @@ -161495,7 +153189,6 @@ 454e414e4f53 454e414a3132 454e41485331 -454e41424c45 454e32545245 454e32525553 454e324d4154 @@ -161511,8 +153204,6 @@ 454d54323135 454d53544552 454d53544242 -454d53544242 -454d53544242 454d53544152 454d53454d53 454d53323130 @@ -161532,7 +153223,6 @@ 454d4f525932 454d4f525931 454d4f52414e -454d4f4e4559 454d4f4a4f59 454d4f475552 454d4f454b45 @@ -161544,8 +153234,6 @@ 454d4d4f5454 454d4d4a3234 454d4d495453 -454d4d455454 -454d4d455454 454d4d455437 454d4d455259 454d4d454d4d @@ -161577,19 +153265,15 @@ 454d49544348 454d4952414c 454d494c594c -454d494c5939 454d494c5938 454d494c5934 454d494c5553 454d494c4f55 454d494c4c59 454d494c4c45 -454d494c494f 454d494c4949 -454d494c4945 454d494c4931 454d494c454e -454d494c4545 454d494c4345 454d494c4131 454d494c3231 @@ -161614,7 +153298,6 @@ 454d42525941 454d42524559 454d424c4552 -454d42455231 454d42454e47 454d41585345 454d41535331 @@ -161651,10 +153334,8 @@ 454c564f5753 454c5649535a 454c56495357 -454c56495353 454c5649534f 454c56495341 -454c56495333 454c56494e53 454c56494e39 454c56494e31 @@ -161668,7 +153349,6 @@ 454c5454494c 454c54534957 454c5453494e -454c544f524f 454c544e414d 454c5449504f 454c54454c54 @@ -161685,7 +153365,6 @@ 454c53413938 454c53413737 454c52544142 -454c52544142 454c524f5935 454c524f5932 454c524f5931 @@ -161701,11 +153380,9 @@ 454c5048494e 454c50454e4b 454c5041544f -454c5041534f 454c5041434f 454c4f503639 454c4f4b5555 -454c4f495345 454c4f47414e 454c4f43484b 454c4d4f5331 @@ -161748,7 +153425,6 @@ 454c4c454e35 454c4c454e33 454c4c454e32 -454c4c454e31 454c4c444f47 454c4c41534e 454c4c414e41 @@ -161761,27 +153437,22 @@ 454c4c363636 454c4b4f4e47 454c4b494e5a -454c4b494e53 454c4b455833 -454c4b434954 454c4b414e41 454c4a313233 454c495a5a41 454c495a4142 -454c495a4131 454c49544545 454c49534941 454c49534557 454c49534553 454c4953454a 454c49534542 -454c49534531 454c49534135 454c4952414e 454c49505345 454c494f5453 454c494f5431 -454c494f5431 454c494f3132 454c494e4b52 454c494e3937 @@ -161793,7 +153464,6 @@ 454c49494653 454c49455a45 454c49455445 -454c49454c49 454c49454345 454c49444f47 454c49434941 @@ -161801,7 +153471,6 @@ 454c4941534d 454c49415344 454c49415332 -454c49415332 454c49414e4e 454c49414e31 454c49414345 @@ -161810,7 +153479,6 @@ 454c48414a4a 454c47554150 454c47494e4c -454c4741544f 454c47415231 454c46584646 454c46584631 @@ -161829,7 +153497,6 @@ 454c45584941 454c4554524f 454c45534841 -454c454e4b41 454c454e4953 454c454e4952 454c454e4941 @@ -161864,7 +153531,6 @@ 454c43414941 454c424f5731 454c424d5552 -454c42455254 454c42454c41 454c42454152 454c42424f57 @@ -161893,7 +153559,6 @@ 454b54585246 454b54465343 454b51545a41 -454b51545a41 454b504f4d41 454b4f525245 454b4f4e4944 @@ -161914,7 +153579,6 @@ 454b454b454b 454b44454147 454b42455247 -454b42455247 454b41544552 454b414a454b 454b39383132 @@ -161949,7 +153613,6 @@ 454954524542 45495452414d 454954414b41 -454953544545 45495348494e 454953454e37 454953454e31 @@ -161960,7 +153623,6 @@ 4549524a444a 454952454252 454952453332 -454952453139 454952453137 45494f545841 45494e593137 @@ -161968,7 +153630,6 @@ 45494e4e4956 45494e4e4552 45494e4d414c -45494e4b4155 45494e4b414d 45494e475041 45494e415232 @@ -162016,8 +153677,6 @@ 454852415431 454852313233 45484e545741 -45484e545741 -45484e545741 45484e4f4953 4548494d4531 4548494c5049 @@ -162032,8 +153691,6 @@ 454842333853 45483549314b 45475a585246 -454759505445 -454759505431 4547564c5742 4547554e4f4e 454753504543 @@ -162062,10 +153719,7 @@ 4547494b3737 4547494b3132 454747533430 -4547474d414e 454747484541 -454747455254 -454747455253 454747414c4c 454747303030 454745524941 @@ -162148,7 +153802,6 @@ 4545455a5a5a 454545535353 454545455757 -454545454545 454545454535 454545363636 454545333231 @@ -162171,12 +153824,8 @@ 454458454458 454458415631 45445759554b -4544574f4f44 4544574b4f46 -454457494e53 454457494e47 -454457494e41 -454457494e31 454457454457 454457415254 454456494e41 @@ -162242,7 +153891,6 @@ 454447453032 45444741524d 454447415237 -454447415231 454446524544 45444647484a 454445524c45 @@ -162266,13 +153914,8 @@ 454444494e53 454444494559 454444494558 -454444494558 -45444449454c 454444494548 454444494541 -454444494539 -454444494537 -454444494531 454444454444 454444415747 454443434445 @@ -162394,7 +154037,6 @@ 454156414e54 454154505553 4541544f4e45 -4541544d4545 4541544d4536 4541544d4534 4541544d414e @@ -162423,8 +154065,6 @@ 454153373435 454152544835 454152544833 -454152544832 -454152544831 454152534f4e 4541524e5354 4541524e494c @@ -162448,21 +154088,15 @@ 45414d313233 454147554b56 4541474c4544 -4541474c4537 -4541474c4537 -4541474c4535 4541474c4530 454147494143 454147314553 45414656594e -454144474245 -454144474245 454144463333 4541434f434b 45414348414e 454142414e49 454142333333 -454141313433 454138303738 454135333935 454131414d41 @@ -162544,7 +154178,6 @@ 4531344d4143 45313435434b 453132363737 -453132333435 453131343332 453131304158 453130355045 @@ -162591,8 +154224,6 @@ 44594c414e4a 44594c414e44 44594c414e39 -44594c414e36 -44594c414e31 44594c313031 44594b4b4552 44594b41524e @@ -162630,7 +154261,6 @@ 445749504845 4457494e4753 4457494c4c39 -445749474854 445749454245 445745523132 4457454c4348 @@ -162639,14 +154269,12 @@ 44574455434b 44574452554d 445744445444 -445743554c42 4457434a4d43 4457424e4a42 445742425352 445741545453 445741524659 445741494e33 -445741445741 445741434b59 445738353239 445734343434 @@ -162688,13 +154316,10 @@ 445556434539 445555554445 4455554e434f -445554434859 445554434835 445554434833 -445554434831 445554413936 445553545959 -44555354594e 44555354594a 445553545944 445553545939 @@ -162724,7 +154349,6 @@ 445552474131 445552454c4c 44555244454c -445552414e44 445552414b33 7c4455524149 445552413732 @@ -162735,7 +154359,6 @@ 445550505936 445550505245 445550504945 -4455504f4e54 4455504c4f31 4455504b4933 445550494531 @@ -162755,7 +154378,6 @@ 44554e4e4554 44554e4e3434 44554e4d4152 -44554e4c4150 44554e4b5331 44554e4b4d45 44554e4b4945 @@ -162780,10 +154402,8 @@ 44554d505931 44554d504945 44554d504150 -44554d4f4e54 44554d4d594f 44554d4d5939 -44554d4d5931 44554d495245 44554d484149 44554d46414e @@ -162815,14 +154435,12 @@ 44554b453632 44554b453433 44554b453430 -44554b453344 44554b453339 44554b453334 44554b453236 44554b453234 44554b453137 44554b453135 -44554b453132 44554b453130 44554b453039 44554b453036 @@ -162848,7 +154466,6 @@ 445547414c44 445547333231 445546464659 -445546464552 44554646454b 445546464545 445546463733 @@ -162900,9 +154517,7 @@ 4455434b4a52 4455434b4954 4455434b494e -4455434b4945 4455434b4554 -4455434b4552 4455434b4455 4455434b3939 4455434b3838 @@ -162948,7 +154563,6 @@ 4455414e4539 4455414e4538 4455414e4532 -4455414c4c59 4455414c494e 4455365a5558 44553554494e @@ -162956,8 +154570,6 @@ 445532373231 445531373133 44545a544942 -44545a544942 -44545a544942 445459344d31 445458594252 445457574156 @@ -163041,7 +154653,6 @@ 445342445342 4453415a5843 4453414e5453 -445341445341 445341444153 445341363636 445341353632 @@ -163080,9 +154691,7 @@ 44525553454e 4452554e4b45 4452554e4b41 -4452554e4b31 4452554d5332 -4452554d5331 4452554d4f53 4452554d424f 4452554d3232 @@ -163095,7 +154704,6 @@ 445255475359 445255475339 445255474f56 -445255474759 445255474745 44525547454e 445255454e32 @@ -163104,7 +154712,6 @@ 445255423532 445254524559 4452544f4444 -4452544f4444 445254353535 445253504f54 445253485459 @@ -163125,7 +154732,6 @@ 44524f505045 44524f504b41 44524f504552 -44524f4f5059 44524f4f5053 44524f4f4c30 44524f4f4753 @@ -163155,7 +154761,6 @@ 44524f42454e 44524e49434b 44524d505359 -44524d505359 44524d4d4153 44524d47524c 44524d445244 @@ -163171,7 +154776,6 @@ 445249564545 445249564535 44524956414e -445249563352 445249535458 445249505050 445249503132 @@ -163210,7 +154814,6 @@ 445245573235 445245573136 445245573039 -44524556494c 445245535355 44524553454e 4452454e5546 @@ -163227,7 +154830,6 @@ 445245453232 445245444552 445245444459 -445245444431 445245443639 44524542494e 44524541524c @@ -163246,7 +154848,6 @@ 445244495254 44524445455a 445244414e32 -445244414e32 445244414253 445244313131 44524341494e @@ -163263,16 +154864,12 @@ 445241584f4e 445241583631 445241574d45 -445241574552 445241573132 44524156494e -44524156454e 44524156334e 445241554b41 44524153544f 445241504553 -445241504552 -4452414e4552 4452414e454d 4452414e434f 4452414d4f56 @@ -163285,7 +154882,6 @@ 445241494e31 445241485349 44524147554c -445241474f4e 445241474f38 445241474f37 445241474f33 @@ -163297,14 +154893,10 @@ 445241464553 445241445241 445241443333 -44524143554c -445241434f4e 445241434f48 445241434f36 -445241434f31 445241434953 445241434952 -445241434950 445241433030 44524142454b 445241423232 @@ -163318,7 +154910,6 @@ 445235383744 445235363233 445234474f4e -44523447304e 445234373434 445234363231 445233303035 @@ -163327,7 +154918,6 @@ 445231393935 445231393833 445231343233 -445231323334 445231303037 445230353034 445230333239 @@ -163356,7 +154946,6 @@ 4450484a5231 445047433133 445046303132 -445045525259 445045524359 445045443231 445042414441 @@ -163381,14 +154970,11 @@ 444f57534f4e 444f57534552 444f574e5931 -444f574e4945 -444f574e4559 444f574e4545 444f574e3939 444f574e3332 444f574e3233 444f574e3132 -444f574c4554 444f57384552 444f57324552 444f56494531 @@ -163405,10 +154991,8 @@ 444f55544348 444f55474c4f 444f55474c45 -444f55474831 444f55474552 444f55474545 -444f5547414c 444f55473636 444f55473531 444f55473530 @@ -163421,16 +155005,13 @@ 444f55473231 444f55473131 444f55473130 -444f55444f55 444f55425532 444f55424f59 444f55424c47 -444f55424c45 444f55414345 444f54593939 444f54545953 444f54545930 -444f54534f4e 444f544f5247 444f544d414e 444f54455354 @@ -163439,7 +155020,6 @@ 444f54323032 444f54313233 444f5354554d -444f53544f4e 444f53534f53 444f534e4552 444f53484552 @@ -163451,12 +155031,10 @@ 444f52593733 444f5256414c 444f52534f4e -444f52534559 444f52524545 444f52523939 444f524f5841 444f524f5449 -444f524f4741 444f524f424f 444f524e4559 444f524e414e @@ -163474,12 +155052,9 @@ 444f52495441 444f52495344 444f52495341 -444f52495331 444f52494d45 444f5249434b 444f52494345 -444f5249414e -444f5249414e 444f52465553 444f52455354 444f52454d4f @@ -163491,8 +155066,6 @@ 444f52414d58 444f52414c4c 444f52414c31 -444f52414c31 -444f5241444f 444f52414231 444f52413132 444f5231414e @@ -163534,15 +155107,12 @@ 444f4f4c5931 444f4f4c5341 444f4f4c5333 -444f4f4c4559 444f4f483131 444f4f47534f 444f4f474542 444f4f474148 444f4f473133 444f4f464945 -444f4f444f4f -444f4f444f4f 444f4f444545 444f4f425931 444f4f424f4f @@ -163595,9 +155165,7 @@ 444f4e473035 444f4e46414e 444f4e453030 -444f4e445245 444f4e445241 -444f4e444f4e 444f4e44494e 444f4e444159 444f4e435549 @@ -163617,7 +155185,6 @@ 444f4e343230 444f4e323639 444f4e313434 -444f4e313233 444f4e303030 444f4d544f4d 444f4d534f4e @@ -163628,7 +155195,6 @@ 444f4d4d4341 444f4d4b4f50 444f4d4a554c -444f4d494e49 444f4d494e30 444f4d494b41 444f4d49434f @@ -163664,7 +155230,6 @@ 444f4c4c5937 444f4c4c5935 444f4c4c5331 -444f4c4c5331 444f4c4c4c59 444f4c4c494e 444f4c4c4559 @@ -163686,7 +155251,6 @@ 444f4b595341 444f4b54414e 444f4b4f4646 -444f4b4b454e 444f4a414e47 444f49543233 444f494e4f55 @@ -163729,9 +155293,7 @@ 444f47475938 444f47475937 444f47475933 -444f47475931 444f47475559 -444f47475353 444f47475331 444f47474954 444f47474553 @@ -163751,8 +155313,6 @@ 444f4744494b 444f47434f50 444f47434855 -444f47434154 -444f47424f59 444f47424f54 444f4742454e 444f47424544 @@ -163775,7 +155335,6 @@ 444f46444f46 444f4554454e 444f45524745 -444f4552414b 444f454d3132 444f45494552 444f4544454e @@ -163804,7 +155363,6 @@ 444f44454341 444f44413838 444f44333333 -444f4357484f 444f43544148 444f43535547 444f43534348 @@ -163813,7 +155371,6 @@ 444f434d414f 444f434b5331 444f434b4945 -444f434b4552 444f434b454c 444f434b4544 444f434b3434 @@ -163966,7 +155523,6 @@ 444c534c5053 444c52303334 444c4f564552 -444c4f564552 444c4f564531 444c4f52454e 444c4f50455a @@ -164013,7 +155569,6 @@ 444b48544552 444b484f3131 444b464c4256 -444b464c4252 444b464c4243 444b464c3733 444b464c3139 @@ -164027,7 +155582,6 @@ 444b38353530 444b37343130 444b36393031 -444b36393031 444b36333039 444b32323131 444b31393934 @@ -164067,7 +155621,6 @@ 444a4b53594d 444a4b523737 444a4b4d4352 -444a4b4a4c5a 444a4b494e47 444a4b415943 444a4a503831 @@ -164086,12 +155639,10 @@ 444a46504147 444a464f5831 444a45535349 -444a45535349 444a454e4e45 444a45465249 444a45444a45 444a45313233 -444a44584252 444a44494d41 444a4449434b 444a44463734 @@ -164107,10 +155658,8 @@ 444a415a5a59 444a41524544 444a414e494b -444a414e474f 444a414e4741 444a414e4730 -444a414d494c 444a414c4558 444a41425249 444a41424241 @@ -164131,7 +155680,6 @@ 444a30393034 44495a5a5947 44495a5a5944 -44495a5a5931 44495a57594e 44495a574152 44495a4b4944 @@ -164153,7 +155701,6 @@ 444958494539 444958494538 444958494534 -444958494531 444958494530 444957415441 444957414432 @@ -164161,8 +155708,6 @@ 4449564f5432 444956495441 444956494e4f -444956494e47 -444956494e45 444956494e33 444956494c53 44495649414e @@ -164170,7 +155715,6 @@ 444956455237 444956455236 444956455235 -444956455231 444956454e53 444956453639 444956453539 @@ -164222,13 +155766,11 @@ 444953434f36 444953434f35 444953434f34 -444953434f31 444953434950 44495341424c 444952545955 44495254594a 444952545948 -444952545944 444952545454 444952544945 444952543131 @@ -164236,7 +155778,6 @@ 4449524b4945 4449524b3939 4449524b3938 -4449524b3639 4449524b3333 4449524b3133 4449524b3130 @@ -164283,18 +155824,14 @@ 44494e4f3234 44494e4f3233 44494e4f3231 -44494e4f3132 44494e4f3037 44494e4f3031 44494e4e5944 44494e4e494e 44494e4e4945 -44494e4e4552 44494e4e4145 44494e4b594b 44494e4b5934 -44494e4b5931 -44494e4b5553 44494e4b5331 44494e4b4f35 44494e4b4545 @@ -164306,8 +155843,6 @@ 44494e475236 44494e474f50 44494e474f38 -44494e474f31 -44494e474c45 44494e47494c 44494e474553 44494e474241 @@ -164320,7 +155855,6 @@ 44494e415253 44494e414e54 44494e414e33 -44494e414d4f 44494e414141 44494e413832 44494d594c41 @@ -164333,7 +155867,6 @@ 44494d4f4e38 44494d4f4e35 44494d4f4e33 -44494d4f4e31 44494d4f4b53 44494d4f434b 44494d4d4554 @@ -164341,7 +155874,6 @@ 44494d4c4552 44494d4b494e 44494d4b4153 -44494d4b4131 44494d495441 44494d494e45 44494d49414e @@ -164363,7 +155895,6 @@ 44494d414c4b 44494d41494f 44494d414141 -44494d413934 44494d413831 44494d413739 44494d413738 @@ -164371,12 +155902,8 @@ 44494d413733 44494d413333 44494d413237 -44494d413237 -44494d413233 44494d413231 44494d413139 -44494d413132 -44494d413131 44494d413031 44494d413030 44494d313937 @@ -164420,8 +155947,6 @@ 4449474f594f 4449474f5241 4449474d414e -4449474c4552 -444947495453 444947495438 444947494f32 444947494a52 @@ -164454,7 +155979,6 @@ 444945474f47 444945474f38 444945474f33 -444945444945 444945444552 44494544454c 444945425552 @@ -164463,21 +155987,18 @@ 44494452494b 4449444f5538 4449444f5531 -444944494552 44494449444f 444944493936 444944493637 444944493231 444944474554 444944474552 -444944444c45 444944444c31 444944444944 444944434f54 44494354554d 4449434e4152 4449434c494e -4449434b5931 4449434b5255 4449434b5041 4449434b4e55 @@ -164486,7 +156007,6 @@ 4449434b4a52 4449434b4953 4449434b4931 -4449434b454e 4449434b444f 4449434b3936 4449434b3837 @@ -164519,9 +156039,6 @@ 444941525931 444941524545 444941504553 -444941504552 -4449414e4e41 -4449414e4b41 4449414e4559 4449414e4552 4449414e454d @@ -164531,16 +156048,13 @@ 4449414e4537 4449414e4157 4449414e4156 -4449414e4153 4449414e414e 4449414e4146 4449414e4139 4449414e4136 -4449414d4f4e 4449414d494e 4449414d4544 4449414c5351 -4449414c4f47 4449414c494e 4449414c4933 4449414c3931 @@ -164589,7 +156103,6 @@ 444842303534 444841594553 444841525259 -444841524d41 4448414d4f4e 444841343437 444838393330 @@ -164619,7 +156132,6 @@ 44474e455353 44474e43414d 44474e423636 -44474d545641 44474d443537 44474b48414e 44474b313233 @@ -164668,7 +156180,6 @@ 444648545942 444648464446 44464754484a -444647484a4b 444647484a39 444647474644 444647464646 @@ -164680,7 +156191,6 @@ 444646313830 444645524759 4446454c4431 -444644464446 444644343533 4446435a4b2e 4446435a3636 @@ -164716,19 +156226,15 @@ 444557554c46 444557534151 4445574f4c46 -444557495454 444557494531 444557455a5a 444557455934 444557455932 -444557455931 444557455253 444557444f47 444557424f59 444557424f57 -444557415253 444557415231 -444557414c54 444557414c44 44455741494e 444557383136 @@ -164741,7 +156247,6 @@ 4445564f5241 4445564f4e4d 4445564f4e33 -4445564f4e31 4445564f4c53 4445564f3535 4445564d414e @@ -164778,7 +156283,6 @@ 44455639355a 444556333633 444556303037 -444555545343 444555544552 44455553544f 444555534553 @@ -164788,15 +156292,12 @@ 44455457494e 4445544f444f 4445544d4f43 -4445544c4546 4445544b4932 444554494e55 -444554494e55 444554483639 444554483535 444554483132 444554454b54 -444554454354 44455354594b 444553545241 44455354454e @@ -164826,8 +156327,6 @@ 444553493131 444553484b41 444553484157 -444553455254 -444553455254 444553424945 444553424553 444553414649 @@ -164859,8 +156358,6 @@ 444552464552 444552463231 444552463031 -44455245574f -44455245564f 444552454e54 444552454d4f 444552454b56 @@ -164876,7 +156373,6 @@ 444552425943 444552425935 444552425934 -444552425931 444552424553 444552415341 444550505050 @@ -164914,7 +156410,6 @@ 44454e4f4952 44454e4e5959 44454e4e5950 -44454e4e5931 44454e4e4e4e 44454e4e494f 44454e4c4559 @@ -164953,23 +156448,15 @@ 44454e323238 44454e313437 44454e5f3133 -44454e313233 -44454e303037 44454d555252 44454d53564b 44454d52454e 44454d513339 44454d4f5345 44454d4f4e5a -44454d4f4e53 -44454d4f4e49 44454d4f4e47 -44454d4f4e41 -44454d4f4e41 44454d4f4e37 44454d4f4e34 -44454d4f4e31 -44454d4f4e30 44454d4f4c41 44454d4f3639 44454d4a414e @@ -165004,7 +156491,6 @@ 44454c535552 44454c53414d 44454c524f4e -44454c52494f 44454c52414e 44454c50484f 44454c4e4f52 @@ -165026,7 +156512,6 @@ 44454c4c3239 44454c4c3235 44454c4c3234 -44454c4c3232 44454c4c3133 44454c4c3130 44454c4c3036 @@ -165043,7 +156528,6 @@ 44454c494143 44454c484931 44454c474152 -44454c454e4e 44454c454e49 44454c454c45 44454c444f4e @@ -165051,7 +156535,6 @@ 44454c434f50 44454c434f4e 44454c42524f -44454c424f59 44454c415953 44454c414e58 44454c414d4f @@ -165087,7 +156570,6 @@ 4445494e4544 4445494d4f4e 4445494a5238 -444549445245 444549444152 444549434b45 444549434941 @@ -165153,7 +156635,6 @@ 444545454550 444545445331 444545444f47 -444545444545 444545444241 44454544414e 444545434f59 @@ -165189,7 +156670,6 @@ 4445434f3132 4445434e4554 4445434c4943 -4445434c414e 4445434b5953 4445434b4553 4445434b454e @@ -165213,11 +156693,8 @@ 444542524152 44454252414a 444542524132 -444542524131 -444542524131 4445424f5348 4445424f5254 -4445424f5241 4445424f4e4f 4445424f4e45 4445424f4c41 @@ -165234,7 +156711,6 @@ 444542493639 444542455247 444542455231 -444542454552 44454244454c 444542423532 444542415353 @@ -165246,7 +156722,6 @@ 444541564148 444541563037 444541544845 -444541544831 444541544830 444541534941 444541525332 @@ -165254,7 +156729,6 @@ 4445414e5850 4445414e5445 4445414e5331 -4445414e4e41 4445414e4e31 4445414e4d43 4445414e4b41 @@ -165276,9 +156750,7 @@ 4445414c534c 4445414c5331 4445414c494e -4445414c4552 4445414c3034 -4445414b494e 444541444d41 44454144454a 444541444441 @@ -165289,10 +156761,8 @@ 444541443331 444541443232 444541443231 -444541443133 444541443130 444541443031 -444541434f4e 444541314241 444539374953 444538323838 @@ -165311,7 +156781,6 @@ 444530353239 44445a5a4941 44445556414c -44445556414c 444455465553 444455464659 444454543131 @@ -165323,7 +156792,6 @@ 444452353637 444450503532 444450313233 -44444f4f4747 44444f474747 44444e494345 44444d444458 @@ -165332,7 +156800,6 @@ 44444c494e47 44444b49524b 44444b344e43 -44444a545341 444449564552 4444494e4f31 444449313939 @@ -165340,7 +156807,6 @@ 444448444448 44444749524c 444447444447 -444447444447 444447393936 444447324e44 444446465252 @@ -165352,7 +156818,6 @@ 4444444f4e47 4444444c4c4c 44444446414e -444444444444 444444444432 444444434343 444444424d54 @@ -165419,11 +156884,9 @@ 44434e4a474e 44434d44434d 44434d323635 -44434c585649 44434c494f4e 44434c415753 444349545241 -444349545241 4443484b3937 444348454e47 444348415345 @@ -165474,7 +156937,6 @@ 444252463937 444252463233 444252463231 -444252454b5a 444252415645 444252363930 444251554349 @@ -165486,7 +156948,6 @@ 44424e5a3536 44424e5a3132 44424e524a44 -44424e464b5a 44424e464b4d 44424d41544b 44424d343230 @@ -165543,7 +157004,6 @@ 44415a313233 444159595959 444159544f50 -444159544f4e 444159535441 4441594f3031 4441594e594b @@ -165580,16 +157040,13 @@ 4441574e3235 4441574e3232 4441574e3133 -4441574e3131 4441574e3033 4441574e3031 -4441574e3031 4441574c4253 4441574b3230 444157495345 444157494438 444157483037 -444157475353 444157475332 444157474753 444157474749 @@ -165604,12 +157061,10 @@ 444157414741 444157413630 44415657494c -444156524f53 444156524f44 444156524148 444156504c41 444156504154 -4441564f5554 4441564f5341 4441564f5332 4441564f5331 @@ -165633,17 +157088,7 @@ 444156494e31 444156494554 44415649454a -444156494531 444156494458 -444156494454 -444156494453 -44415649444f -44415649444a -444156494447 -444156494443 -444156494439 -444156494436 -444156494433 444156494348 444156494153 44415649414e @@ -165675,13 +157120,11 @@ 444156453833 444156453832 444156453730 -444156453636 444156453635 444156453634 444156453536 444156453531 444156453438 -444156453434 444156453332 444156453330 44415645324b @@ -165704,11 +157147,8 @@ 444156314457 444156314446 444155524941 -44415552454e -4441554c4554 444155425353 444154544552 -44415453554e 44415453494e 444154525531 444154524f4e @@ -165735,7 +157175,6 @@ 444153533132 4441534b4152 444153484e41 -444153484954 44415348494b 444153484945 444153484553 @@ -165746,7 +157185,6 @@ 444153483130 444153475554 444153445341 -444153444153 444153415241 444153414b49 444153413332 @@ -165757,27 +157195,22 @@ 444152594c47 444152594c45 444152594c43 -444152594c31 444152574953 444152564f4e 444152545953 444152545334 44415254484d -444152544839 444152544832 444152543639 444152543235 44415253494b 44415253414e -44415252594c 444152525542 444152525252 444152524953 444152524943 444152524941 444152524558 -44415252454c -44415252414e 44415252414a 444152524147 4441524f5831 @@ -165786,7 +157219,6 @@ 4441524f4249 4441524e4f4b 4441524e4552 -4441524e454c 4441524e3838 4441524d4154 4441524d304b @@ -165801,12 +157233,10 @@ 4441524b3535 4441524b3332 4441524b3234 -4441524b3131 4441524b3037 4441524b3034 4441524b3033 4441524b3032 -444152495553 444152495353 444152495331 444152494f50 @@ -165827,18 +157257,15 @@ 444152455831 44415245544f 44415245454e -44415244454e 442741524359 444152434f4f 444152434b53 444152434941 444152434931 -444152434559 44415243414e 444152433234 44415242594b 444152425932 -444152425931 444152424c59 444152424559 444152414e41 @@ -165849,7 +157276,6 @@ 44415231414e 4441504f4f48 4441504b4b47 -444150484e45 444150415441 444150415353 444150414c41 @@ -165857,9 +157283,7 @@ 44414f554441 44414f44414f 44414e5a4b41 -44414e5a4947 44414e5a4531 -44414e5a4153 44414e5a4152 44414e594541 44414e593933 @@ -165886,16 +157310,12 @@ 44414e4f3630 44414e4f3133 44414e4e594e -44414e4e5947 -44414e4e5935 44414e4e5933 44414e4e4f4f 44414e4e4f32 -44414e4e4f31 44414e4e4e4f 44414e4e4e4e 44414e4e4943 -44414e4e4932 44414e4e4631 44414e4e454e 44414e4e4545 @@ -165928,13 +157348,11 @@ 44414e495858 44414e495445 44414e494d41 -44414e494c4f 44414e494c4c 44414e494c45 44414e494c31 44414e494b4f 44414e494b4b -44414e494b41 44414e494949 44414e494553 44414e494552 @@ -165976,14 +157394,11 @@ 44414e44494e 44414e44494b 44414e44434f -44414e44414e 44414e434f47 44414e434f31 -44414e43494e 44414e434841 44414e434539 44414e434534 -44414e434531 44414e434521 44414e434154 44414e415441 @@ -166016,8 +157431,6 @@ 44414e353830 44414e343534 44414e333536 -44414e313233 -44414e313233 44414e313131 44414e313031 44414e313030 @@ -166038,7 +157451,6 @@ 44414d4f3332 44414d4f3132 44414d4e4d45 -44414d4e4954 44414d4e4554 44414d4e3132 44414d4d454e @@ -166067,7 +157479,6 @@ 44414d414c53 44414d414c49 44414d414a41 -44414d41434b 44414c555641 44414c555241 44414c544558 @@ -166080,7 +157491,6 @@ 44414c4f4e59 44414c4e4959 44414c4d4554 -44414c4d4154 44414c4d414b 44414c4c5553 44414c4c4953 @@ -166093,7 +157503,6 @@ 44414c493131 44414c455642 44414c454f31 -44414c454b53 44414c454b41 44414c452e4b 44414c454a4f @@ -166137,7 +157546,6 @@ 444149535941 444149535936 444149535934 -444149535931 444149535930 444149534f4e 444149534552 @@ -166160,7 +157568,6 @@ 444148554941 4441484f524e 4441484f414d -4441484c4941 444148454c4c 444148433032 44414841434b @@ -166171,7 +157578,6 @@ 444147524547 4441474e5939 4441474e4143 -4441474d4152 444147493035 444147474f4f 444147474c59 @@ -166190,7 +157596,6 @@ 4441464e4158 444146465953 444146465934 -444146465931 444146464b41 444146464659 444146463259 @@ -166213,13 +157618,11 @@ 4441444f5553 4441444f554e 4441444f4e45 -4441444f4e45 4441444f4747 4441444f4635 4441444f4633 4441444f4632 4441444f4553 -4441444d4f4d 4441444a494f 444144495941 444144494531 @@ -166228,11 +157631,8 @@ 444144455253 444144454550 444144453131 -44414444594f 44414444594a 444144445945 -444144445933 -444144445930 444144444f47 444144444c45 444144444931 @@ -166298,7 +157698,6 @@ 44413149454c 444131393934 444131363132 -444131314153 444130313031 443955344338 44394d4b4f39 @@ -166322,7 +157721,6 @@ 443546473648 443541374c31 443535393152 -443535353535 443534373630 443531463639 443531314b31 @@ -166334,7 +157732,6 @@ 44344d4f4e35 44344d423654 443449314132 -443446365434 443444334536 4434434f4753 443439424846 @@ -166405,7 +157802,6 @@ 443130333134 44304e4b3359 44304e414c44 -44304e414c44 44304e413144 44304c4c4945 44304c4c4152 @@ -166442,7 +157838,6 @@ 4359543b4a52 43595445454e 435952555334 -435952555331 435952494c42 435952494158 435952494143 @@ -166465,19 +157860,14 @@ 43594c455354 43594b4c4f50 4359474f4e59 -4359474e5553 4359474e4937 -4359474e4554 435947414e31 435946383838 4359444e4545 4359434c494b -4359434c4531 43594348414e -4359424f5247 4359424f4c4f 435942495244 -435942494c4c 435942483533 435942455247 435942455233 @@ -166497,14 +157887,12 @@ 43584c495645 43584855345a 435848323939 -435846434e4d 435844534557 435839363332 435833495058 435833373945 435833353030 435833323030 -435831384b41 4357584a5643 435754414e47 435753435753 @@ -166525,7 +157913,6 @@ 435747335155 435744313233 435743554c42 -435743554c42 435743353630 435743313131 435742593737 @@ -166572,7 +157959,6 @@ 4355554e4d41 435554545245 435554534554 -4355544c4552 435554494538 435554494534 435554494521 @@ -166586,7 +157972,6 @@ 435554435554 435554415353 435553544f53 -435553544f4d 435553534f4e 43555353454e 435553484c41 @@ -166604,17 +157989,14 @@ 435552543435 435552543236 435552525934 -435552525931 435552524954 43555252494e -43555252494e 435552524559 4355524d4552 4355524c5937 4355524c5936 4355524c4953 4355524c4945 -4355524c4559 4355524c4552 435552494555 43555249454c @@ -166651,7 +158033,6 @@ 43554d46414e 43554d454154 43554d444f47 -43554d43554d 43554d42554d 43554d415353 43554d415255 @@ -166660,7 +158041,6 @@ 43554d363930 43554d353535 43554d333333 -43554d324d45 43554d313031 43554c544f56 43554c544943 @@ -166726,7 +158106,6 @@ 435542533034 435542533033 4355424f4e45 -43554246414e 435542455254 435542454433 435542454431 @@ -166846,7 +158225,6 @@ 435259554646 43525953544f 435259505459 -43525950544f 4352594f3130 4352594b4552 435259424142 @@ -166856,13 +158234,10 @@ 4352555a4442 4352555a4431 4352555a3333 -435255535459 -435255535459 435255535445 435255534531 4352554e4745 4352554d5031 -4352554d4d59 4352554d4d45 4352554d4552 4352554d3232 @@ -166888,7 +158263,6 @@ 43524f5a4552 43524f575a5a 43524f575332 -43524f575331 43524f574e59 43524f574e44 43524f574e33 @@ -166896,7 +158270,6 @@ 43524f574444 43524f573930 43524f573733 -43524f573639 43524f573233 43524f573232 43524f573231 @@ -166911,7 +158284,6 @@ 43524f534d4f 43524f534953 43524f533233 -43524f4f4b53 43524f4f4b45 43524f4e4f31 43524f4e4953 @@ -166942,8 +158314,6 @@ 43524a433134 435249545459 435249544941 -435249544348 -435249535449 435249535445 435249535349 435249535045 @@ -166958,7 +158328,6 @@ 435249503436 4352494d4f4e 4352494d4534 -4352494d4531 435249444745 435249444552 435249434b53 @@ -166969,7 +158338,6 @@ 435249333333 435247313156 435246594c42 -435246505246 435246505242 435246345246 435246323330 @@ -166985,7 +158353,6 @@ 435245535434 435245534349 435245505433 -4352454f4c45 4352454e5448 4352454e5445 4352454e4e59 @@ -166994,7 +158361,6 @@ 435245455045 435245454b59 435245454b57 -435245454b53 435245454b32 43524545454c 43524545454b @@ -167004,19 +158370,15 @@ 435245444e45 435245434f4e 435245414d35 -435245414d31 435245384552 435244535953 435243524352 4352424f5944 435242414e44 435242373937 -4352415a5938 4352415a5934 -435241594f4e 435241574c53 43524156494e -43524156454e 435241543236 435241535338 435241534b41 @@ -167045,19 +158407,16 @@ 4352414d3031 4352414c4559 435241494c49 -435241494759 43524149474f 43524149474e 43524149474a 435241494739 43524148414e -435241465459 435241434b4f 435241434b32 435241434b30 435241434b21 43524143494e -435241424259 435241423530 435241423132 435241415348 @@ -167076,7 +158435,6 @@ 435230533638 435230465453 435157544642 -435157544642 43515554494c 435139535238 435132425559 @@ -167145,21 +158503,15 @@ 434f55564552 434f55544348 434f55535445 -434f5553494e 434f5552544e 434f5552544c 434f55525439 434f55525432 -434f55525431 -434f55504c45 434f55504554 434f55504545 434f55504531 434f554e5437 -434f554e5430 -434f55434f55 434f54554954 -434f54544f4e 434f54544c45 434f5454454e 434f5454414d @@ -167185,7 +158537,6 @@ 434f534d4554 434f534c4554 434f534b554e -434f53495441 434f53484f57 434f53484b41 434f53483132 @@ -167202,12 +158553,9 @@ 434f52593035 434f52593031 434f5257594e -434f52564554 434f52564149 434f52555054 434f52544f31 -434f5254455a -434f52544558 434f5254454e 434f52535452 434f52534132 @@ -167218,19 +158566,14 @@ 434f52505353 434f5250454e 434f524e5931 -434f524e4552 434f524e4544 434f524d5952 -434f524d414e 434f524b5959 434f524b5947 -434f524b5931 -434f524b4945 434f524b4545 434f524b3931 434f52494e31 434f5249494e -434f52474931 434f52455950 434f52455945 434f52455932 @@ -167251,8 +158594,6 @@ 434f52425553 434f52424f54 434f52424954 -434f52415a4f -434f52414c49 434f52414c44 434f5241494c 434f5241434f @@ -167280,11 +158621,9 @@ 434f50414341 434f50363636 434f4f544559 -434f4f544552 434f4f544348 434f4f534559 434f4f525332 -434f4f525331 434f4f505331 434f4f503232 434f4f503230 @@ -167304,9 +158643,7 @@ 434f4f4c4c59 434f4f4c4c45 434f4f4c4b49 -434f4f4c494f 434f4f4c4755 -434f4f4c4559 434f4f4c4531 434f4f4c434f 434f4f4c424f @@ -167363,7 +158700,6 @@ 434f4e535049 434f4e534f4e 434f4e533254 -434f4e524f45 434f4e524143 434f4e504f54 434f4e4f524c @@ -167371,11 +158707,8 @@ 434f4e4e5943 434f4e4e5932 434f4e4e4e4e -434f4e4e4552 434f4e4e454c -434f4e4e4543 434f4e4e414c -434f4e4b4552 434f4e4a5552 434f4e4a4f4e 434f4e494e45 @@ -167387,11 +158720,9 @@ 434f4e473535 434f4e464952 434f4e464554 -434f4e464552 434f4e455953 434f4e455254 434f4e453735 -434f4e444f4d 434f4e444f31 434f4e444954 434f4e444155 @@ -167402,8 +158733,6 @@ 434f4e434154 434f4e424f59 434f4e414e39 -434f4e414e31 -434f4e414952 434f4e414341 434f4e313430 434f4e313030 @@ -167437,13 +158766,10 @@ 434f4d49474f 434f4d494345 434f4d494335 -434f4d494331 434f4d455550 434f4d455434 434f4d455432 -434f4d455431 434f4d455253 -434f4d454459 434f4d454449 434f4d444159 434f4d424f45 @@ -167462,12 +158788,10 @@ 434f4d303938 434f4c594552 434f4c57454c -434f4c56494e 434f4c555341 434f4c545353 434f4c545339 434f4c545337 -434f4c545331 434f4c545330 434f4c545249 434f4c544f4d @@ -167480,7 +158804,6 @@ 434f4c543138 434f4c543130 434f4c543031 -434f4c4f5231 434f4c4f5059 434f4c4f4e33 434f4c4f4e31 @@ -167492,17 +158815,14 @@ 434f4c4e4147 434f4c4d454e 434f4c4c4f4d -434f4c4c494e 434f4c4c4745 434f4c4c4531 -434f4c4c4152 434f4c4c4142 434f4c4c3936 434f4c4c3132 434f4c4b4547 434f4c494e5a 434f4c494e48 -434f4c494e47 434f4c494e46 434f4c494e36 434f4c494e34 @@ -167557,10 +158877,8 @@ 434f49444749 434f484f5253 434f484f3031 -434f48494241 434f48455245 434f47524950 -434f474e4f53 434f474d4f42 434f474d414e 434f47434f47 @@ -167588,7 +158906,6 @@ 434f44593236 434f44593234 434f44593137 -434f44593131 434f44593039 434f44593033 434f44593030 @@ -167604,7 +158921,6 @@ 434f44455858 434f44455253 434f44455235 -434f44455231 434f44454e4f 434f44454b53 434f44454353 @@ -167677,15 +158993,12 @@ 434f4242494e 434f4242414e 434f42415354 -434f42414c54 -434f4241494e 434f42413830 434f42323839 434f41545359 434f41544552 434f41543131 434f41535447 -434f41535431 434f41434854 434f41434852 434f4143484a @@ -167703,17 +159016,12 @@ 434e56395342 434e55545453 434e54544342 -434e54544342 -434e54544342 -434e54544342 -434e54484446 434e54474252 434e54414659 434e53593636 434e534c4c52 434e53423131 434e50415353 -434e50415353 434e50313539 434e4f544553 434e4e583233 @@ -167758,7 +159066,6 @@ 434d5259414e 434d52343238 434d504a4f42 -434d504a4f42 434d4f4f5245 434d4f453733 434d4e4e5658 @@ -167806,15 +159113,12 @@ 434c56534b53 434c564d414e 434c55553434 -434c55544348 434c55535455 -434c554e5931 434c554e4745 434c55493138 434c55464f58 434c55453131 434c55425331 -434c55425331 434c55424b45 434c5542494e 434c55424741 @@ -167834,7 +159138,6 @@ 434c54373238 434c53434c53 434c524c4d35 -434c524c4d35 434c51535345 434c50424554 434c4f574e5a @@ -167847,19 +159150,14 @@ 434c4f554e45 434c4f55445a 434c4f554458 -434c4f554453 434c4f554444 434c4f554438 -434c4f554431 434c4f554430 434c4f544f5a 434c4f54484f -434c4f534552 -434c4f534552 434c4f534532 434c4f52545a 434c4f515545 -434c4f4e4531 434c4f4b4559 434c4f494531 434c4f443632 @@ -167879,7 +159177,6 @@ 434c49565553 434c49564559 434c49564552 -434c49564552 434c49564533 434c49545553 434c49545453 @@ -167915,10 +159212,8 @@ 434c45574953 434c45564f4e 434c45564953 -434c45564552 434c4556454c 434c45564531 -434c45545553 434c4552494b 434c454f5045 434c454f4d45 @@ -167930,7 +159225,6 @@ 434c454e5550 434c454d4d4d 434c454d4d41 -434c454d454e 434c454d414e 434c454d3732 434c45494748 @@ -167941,7 +159235,6 @@ 434c45453031 434c4544414e 434c45424552 -434c45414e31 434c45373735 434c4348454e 434c42434142 @@ -167985,7 +159278,6 @@ 434c4152414c 434c41524149 434c41524133 -434c4150544f 434c414e554b 434c414e3134 434c414d4552 @@ -168017,7 +159309,6 @@ 434b4c4f4b31 434b4c494e4b 434b4c463236 -434b4c463236 434b4c45494e 434b4b414243 434b4a444652 @@ -168030,8 +159321,6 @@ 434b46595753 434b4644524a 434b4644425a -434b46444252 -434b46444252 434b454c4c59 434b45495448 434b4547454c @@ -168088,7 +159377,6 @@ 434a33363839 434a32343130 434a31393531 -434a31323334 434957415259 434956574152 434956564945 @@ -168112,7 +159400,6 @@ 4349544f3132 4349544c4543 434954495a45 -434954494553 43495443484f 434954323336 434953534e41 @@ -168122,7 +159409,6 @@ 434953434f33 434952555841 434952554a41 -434952525553 4349524f4e45 4349524f3131 4349524c414e @@ -168135,7 +159421,6 @@ 434952453131 434952453032 43495243554c -434952434c45 434952434931 434952434131 434952414e4f @@ -168147,7 +159432,6 @@ 434950313233 43494f43414e 43494f415241 -43494e5a4941 43494e544931 43494e54414e 43494e544141 @@ -168178,14 +159462,9 @@ 4349474e414c 434947475953 43494741525a -434947415253 -434947415253 -434947415231 -434947415231 434947414c41 434945535345 434945525641 -434945525241 434945524745 4349454e5445 4349454e4e41 @@ -168237,20 +159516,15 @@ 434855534841 434855525245 434855524b41 -434855524348 434855515549 434855504954 43485550494c 4348554f4f4f -4348554f4e47 4348554e5941 4348554e5449 -4348554e4b59 4348554e4759 4348554e4753 4348554e474f -4348554d5031 -4348554d4d59 4348554d4d41 4348554d4c45 4348554d414e @@ -168258,7 +159532,6 @@ 4348554c5931 4348554c4f53 4348554c4f32 -4348554c4f31 4348554c4c41 4348554c4133 4348554b5231 @@ -168272,7 +159545,6 @@ 434855444153 43485544414b 434855434b55 -434855434b4b 434855434b4a 434855434b39 434855434b36 @@ -168294,11 +159566,6 @@ 4348524f5448 4348524f4e49 4348524c4945 -434852495359 -434852495356 -434852495354 -43485249534a -434852495348 434852494b49 434852315354 43484f574d4b @@ -168318,7 +159585,6 @@ 43484f4f4b41 43484f4e564f 43484f4e5441 -43484f4e474f 43484f4e4553 43484f4e414e 43484f4d4245 @@ -168329,7 +159595,6 @@ 43484f4c4131 43484f4b4531 43484f495231 -43484f494345 43484f48414e 43484f444e41 43484f444552 @@ -168338,17 +159603,14 @@ 43484f444153 43484f44414e 43484f434f42 -43484f434f31 43484f434b53 43484f434859 -43484f43484f 43484f434154 43484f414459 43484f313233 43484f303037 43484e55524f 43484e545741 -43484e545741 43484d4e5351 43484d433833 43484d353533 @@ -168374,8 +159636,6 @@ 434849535441 434849535059 434849535049 -434849535041 -434849534f58 434849534f4d 43484953434f 434849534341 @@ -168396,7 +159656,6 @@ 43484950414e 434849504131 434849503833 -434849503639 434849503539 434849503338 434849503333 @@ -168406,16 +159665,13 @@ 4348494f444f 4348494e5941 4348494e5541 -4348494e4f4f 4348494e4f37 4348494e4f33 4348494e4f32 -4348494e4b59 4348494e4b55 4348494e4755 4348494e4749 4348494e4745 -4348494e4731 4348494e4554 4348494e4545 4348494e4455 @@ -168424,7 +159680,6 @@ 4348494e4138 4348494e4134 4348494e4133 -4348494e4131 4348494e3639 4348494e3232 4348494d5741 @@ -168441,10 +159696,8 @@ 4348494c4941 4348494c4550 4348494c4545 -4348494c4545 4348494c4535 4348494c4433 -4348494c4431 4348494c4157 4348494b4f53 4348494b4b55 @@ -168467,13 +159720,9 @@ 434849434f4f 434849434f36 434849434b55 -434849434b53 434849434b4e 434849434b49 -434849434b41 -434849434b41 434849434b35 -434849434147 434849434142 434849434138 434849425552 @@ -168511,11 +159760,8 @@ 434845543430 434845543232 434845543130 -434845535459 -434845535445 434845535436 434845535431 -434845535349 43484553494b 434845534341 434845534157 @@ -168526,7 +159772,6 @@ 434845524c49 43484552494e 434845524946 -434845524945 434845524157 434845524141 434845523738 @@ -168536,12 +159781,10 @@ 434845504f53 4348454f4e47 4348454e5259 -4348454e4f41 4348454e4e59 4348454e4b36 4348454e4745 4348454e4731 -4348454e4731 4348454e4441 4348454e3631 4348454e3135 @@ -168552,10 +159795,7 @@ 4348454d3139 4348454d3130 4348454c5459 -4348454c5359 -4348454c5345 4348454c5331 -4348454c4954 4348454c4953 4348454c494f 4348454c4359 @@ -168569,7 +159809,6 @@ 434845474554 434845465931 434845464a4f -434845464659 43484546464b 434845463634 434845463534 @@ -168579,20 +159818,16 @@ 434845455641 43484545534e 43484545525a -434845455253 434845455238 434845455236 434845455233 434845455232 -434845455231 434845455230 434845455059 434845454e4f 434845454e45 434845454e33 -434845454d41 434845454b55 -434845454b53 434845454341 434845454259 434845453545 @@ -168600,7 +159835,6 @@ 434845444941 434845444445 434845434f53 -434845434b53 434845434b4f 434845434b49 434845434b45 @@ -168615,13 +159849,11 @@ 434845415431 434845415354 434845415059 -434845415031 434845414431 434845303038 43484448414c 434844444d41 434843554253 -4348415a5a59 4348415a5a48 4348415a5a41 4348415a5a37 @@ -168647,7 +159879,6 @@ 434841535349 434841534f4e 434841534945 -434841534559 434841534557 434841534550 43484153454e @@ -168670,9 +159901,7 @@ 434841524e47 434841524d4f 434841524d35 -434841524d31 43484152494f -434841524745 434841524445 434841524153 434841524146 @@ -168681,13 +159910,10 @@ 434841523337 434841523139 434841523131 -434841523032 434841505332 -434841505059 434841505045 434841504d41 434841504552 -43484150454c 434841504153 434841504131 434841503039 @@ -168712,7 +159938,6 @@ 4348414d5044 4348414d5036 4348414d5034 -4348414d5031 4348414d5030 4348414d4f31 4348414d4d41 @@ -168731,11 +159956,9 @@ 4348414b4b55 4348414b4b4f 4348414b4552 -434841494e53 434841494d57 434841494d41 434841494d31 -434841494d31 434841494c44 43484148454e 434841474153 @@ -168746,7 +159969,6 @@ 434841444431 434841444357 434841444131 -434841443938 434841443839 434841443832 434841443737 @@ -168762,11 +159984,7 @@ 434841434f32 434841434f31 434841434d4f -434841434849 -434841434849 434841434845 -434841434841 -434841434841 434841434831 434841434153 434841424f4b @@ -168806,7 +160024,6 @@ 43475245454e 434752353533 43474d545641 -43474d545641 434749524c53 43474945444d 4347484f524e @@ -168828,7 +160045,6 @@ 434659585443 434659545252 434659545245 -434659545231 434659523137 43465646594e 43465644544b @@ -168845,7 +160061,6 @@ 434649463338 434649463333 434649463137 -434649454b5a 43464846594d 434648465946 434648363636 @@ -168881,7 +160096,6 @@ 434553434f31 434553434154 434553415252 -43455341524f 434553415244 434553415243 434553415239 @@ -168901,7 +160115,6 @@ 434552474551 434552463133 434552454e31 -434552454741 434552454333 434552444f4f 434552434953 @@ -168911,7 +160124,6 @@ 434552393939 434552393030 43455047454e -434550455241 434550323136 43454f324245 43454e54554d @@ -168946,9 +160158,7 @@ 43454c4c3231 43454c4c3037 43454c494e4f -43454c494341 43454c494143 -43454c494131 43454c493030 43454c464944 43454c454249 @@ -168966,7 +160176,6 @@ 434545584d35 4345454d4545 4345454d414e -4345454a4159 434545464552 434545464158 434545303037 @@ -168981,11 +160190,8 @@ 434543494e41 434543494c57 434543494c4c -434543494c49 -434543494c45 434543494c33 434543494c32 -434543494c31 434543455245 434543424643 434543415348 @@ -168995,8 +160201,6 @@ 4345424f4c37 434542494348 434541534553 -434541534552 -434541534152 43454144314b 43453937574a 434538424653 @@ -169018,7 +160222,6 @@ 434452535334 434452434452 43442d523830 -434452373030 434452333231 4344504d3334 434450315354 @@ -169026,7 +160229,6 @@ 43444d375345 43444c455353 43444c313233 -43444c313233 43444b423654 434449323230 434448475058 @@ -169141,7 +160343,6 @@ 4342575a4449 434257383135 434256544250 -4342564a5946 434256454b5a 43425554545a 4342554e4e59 @@ -169173,8 +160374,6 @@ 434245415459 434243544241 4342434e5456 -4342434d5242 -4342434d5242 4342434a444c 434242554946 434242434242 @@ -169215,10 +160414,8 @@ 43415a313233 434159544f4e 4341594d454e -4341594d414e 4341594c494e 4341594c4945 -4341594c4131 4341594a454e 434159444545 434159434545 @@ -169259,7 +160456,6 @@ 434154544f59 434154543737 434154535832 -434154535353 434154535256 43415453414d 434154533939 @@ -169294,7 +160490,6 @@ 434154485943 434154485936 434154485935 -434154485931 434154484937 434154484152 434154483031 @@ -169303,7 +160498,6 @@ 434154455231 434154435550 434154434853 -434154434154 434154425554 434154424f31 434154424954 @@ -169338,36 +160532,28 @@ 434154313130 434154313037 434154313031 -434154303037 434154303031 -43415355414c 434153545953 434153545553 434153544c33 -434153544552 434153544543 434153544131 -434153544131 434153543052 434153535959 43415353554c 434153534f4e 43415353494d 43415353494c -434153534559 434153533f45 434153534133 434153533437 434153533231 -434153504f4c 434153504954 434153504952 434153504941 434153504554 -434153504552 4341534f4e49 4341534f4c41 -4341534d414e 4341534c4f4e 434153494f54 434153494f50 @@ -169389,7 +160575,6 @@ 434153483434 434153483333 434153483233 -434153483132 434153483130 434153483032 434153455957 @@ -169416,13 +160601,10 @@ 434152594131 434152593639 434152574158 -43415256494e 434152564559 434152564531 434152555448 434152555441 -43415255534f -43415255534f 434152554a41 434152545953 434152544f59 @@ -169443,11 +160625,8 @@ 434152525945 434152525353 434152525252 -434152524f54 434152524f4e 434152524f4d -434152524f4c -434152524552 43415252454c 434152524544 434152524153 @@ -169458,7 +160637,6 @@ 434152505353 43415250524f 434152504f34 -434152504544 434152503939 434152503639 434152503434 @@ -169469,16 +160647,12 @@ 4341524f4c57 4341524f4c4b 4341524f4c4a -4341524f4c41 4341524f4c35 -4341524f4c31 4341524f3330 4341524f3132 4341524e4f4e 4341524d4954 4341524d454d -4341524d454c -4341524d414e 4341524d4132 4341524d4131 4341524d3358 @@ -169487,12 +160661,10 @@ 4341524c5933 4341524c5353 4341524c534f -4341524c4f31 4341524c4953 4341524c494d 4341524c494b 4341524c4936 -4341524c4559 4341524c4554 4341524c4553 4341524c4245 @@ -169501,7 +160673,6 @@ 4341524c414b 4341524c414a 4341524c4135 -4341524c4132 4341524c3839 4341524c3838 4341524c3737 @@ -169518,12 +160689,10 @@ 43415249534d 434152494e53 434152494e48 -434152494e45 434152494c4c 434152494441 43415249434f 43415249424f -434152494245 43415249414e 434152484f50 434152464958 @@ -169580,7 +160749,6 @@ 434150544e31 434150544748 43415054444b -434150544149 434150543132 434150543131 434150533939 @@ -169602,7 +160770,6 @@ 43415045544f 434150455441 434150454e41 -434150434f4d 434150415441 434150393837 434150343638 @@ -169610,18 +160777,13 @@ 434150303132 43414f46564d 43414f333231 -43414e594f4e -43414e594f4e 43414e59304e 43414e554d41 -43414e55434b 43414e545241 -43414e544f4e 43414e544152 43414e4f534f 43414e4f5241 43414e4f4e4f -43414e4f4e31 43414e4f4c41 43414e4f3636 43414e4e4953 @@ -169635,7 +160797,6 @@ 43414e4b414e 43414e495441 43414e495331 -43414e494e45 43414e494d49 43414e494d31 43414e494b4f @@ -169650,7 +160811,6 @@ 43414e464f58 43414e464c59 43414e455445 -43414e455331 43414e455330 43414e455253 43414e454c45 @@ -169662,22 +160822,17 @@ 43414e445531 43414e445231 43414e444f36 -43414e444c45 43414e444958 43414e44494c 43414e44494b 43414e444949 -43414e444945 -43414e444943 43414e443130 43414e43554d 43414e434f4c -43414e43454c 43414e425559 43414e415649 43414e415041 43414e414c41 -43414e41414e 43414e384558 43414e313131 43414d555337 @@ -169704,19 +160859,14 @@ 43414d4c4143 43414d4a4f4e 43414d495241 -43414d494e4f 43414d494e41 -43414d494c4f -43414d494c4f 43414d494552 43414d49414f 43414d49414e 43414d475559 43414d455255 -43414d45524f 43414d454c58 43414d454c35 -43414d454c31 43414d444f4e 43414d444144 43414d434f52 @@ -169728,11 +160878,9 @@ 43414d424f54 43414d424f53 43414d424c45 -43414d424552 43414d415230 43414d414e44 43414d414c41 -43414d414c41 43414d393136 43414d313031 43414d303032 @@ -169754,16 +160902,13 @@ 43414c4c4f46 43414c4c4954 43414c4c4949 -43414c4c4544 43414c4c4542 43414c4c4154 43414c4c4152 -43414c4c414e 43414c4c4143 43414c4c4131 43414c4c3931 43414c4c3232 -43414c4c3036 43414c4b4954 43414c49584f 43414c495354 @@ -169787,7 +160932,6 @@ 43414c454237 43414c454235 43414c445553 -43414c444552 43414c444531 43414c444159 43414c444153 @@ -169795,7 +160939,6 @@ 43414c434f4e 43414c434f4c 43414c434d45 -43414c43494f 43414c434943 43414c433733 43414c415441 @@ -169814,13 +160957,11 @@ 43414b323030 43414a55534f 43414a554e33 -43414a554e31 43414a313233 434149584153 434149545931 43414954414c 434149524f33 -434149524f31 4341494f4c41 4341494f3136 4341494e5441 @@ -169828,7 +160969,6 @@ 4341494e4532 4341494e3634 4341494c4c4f -4341494c494e 4341494c4559 434149464153 434149434149 @@ -169837,7 +160977,6 @@ 434148313233 4341475a3731 434147545041 -434147545041 4341474d4147 4341474c494f 434147453031 @@ -169852,7 +160991,6 @@ 434144553030 4341444f5754 4341444d4941 -4341444d414e 434144495331 434144474552 434144455431 @@ -169862,8 +161000,6 @@ 434144454e31 434144454c41 434144445937 -434144445931 -43414443414d 434144425552 434144415645 434144383431 @@ -169877,7 +161013,6 @@ 434143484f35 43414348414e 434143455245 -434143434941 43414343414f 434143434143 434143415353 @@ -169897,7 +161032,6 @@ 4341424f4f4d 4341424f3132 4341424c4558 -434142455a41 434142425953 434142424931 434142414e4f @@ -170014,7 +161148,6 @@ 433131313131 433130363643 433130323344 -433059305445 433059305433 433055474152 433052335937 @@ -170047,11 +161180,9 @@ 4259544f5253 4259544f5252 4259544e4252 -425954454d45 425954454d33 42595445494e 425954435246 -425954434346 425954393352 42595252454a 4259524f4e53 @@ -170075,7 +161206,6 @@ 4259464f5244 425946445644 425945554e42 -425945554e42 425944533236 425943484f4b 42594346514e @@ -170092,8 +161222,6 @@ 425849484e36 4258474a3935 425844554d42 -425844554d42 -425844554d42 425844454b30 425841514648 425834584436 @@ -170113,14 +161241,12 @@ 425745474432 425745425745 425743554c42 -425743554c42 4257434f4c45 425741594e45 425741544552 4257414e4153 4257414e4142 4257414e4132 -4257414e4131 425738363236 425736353433 425733373532 @@ -170141,7 +161267,6 @@ 42555a5a5932 42555a5a4559 42555a5a4355 -42555a5a4152 42555a5a3732 42555a5a3731 42555a5a3639 @@ -170157,14 +161282,11 @@ 4255594d414e 425559494e47 425559414253 -425558544f4e 42555846414e 425558413132 425555444441 425554545931 425554545542 -425554544f58 -425554544f4e 425554544f4d 425554544d41 425554544c45 @@ -170182,7 +161304,6 @@ 42555453554e 425554534559 425554525553 -4255544d414e 4255544c494e 425554484950 425554484541 @@ -170197,7 +161318,6 @@ 425554434841 425554434838 425554434834 -425554434831 425554414e47 425554414556 425554414341 @@ -170255,7 +161375,6 @@ 425552524f4e 425552524f31 425552524a31 -425552524953 425552524159 42555252414b 425552504c45 @@ -170268,7 +161387,6 @@ 4255524e5359 4255524e5352 4255524e534b -4255524e4552 4255524e454c 4255524d4141 4255524c4c4c @@ -170303,7 +161421,6 @@ 425552444131 425552443737 425552434831 -425552424f4e 425552424945 425552414e4f 425552414b4b @@ -170329,7 +161446,6 @@ 42554e494341 42554e475936 42554e47554c -42554e474c45 42554e474953 42554e47484f 42554e474559 @@ -170341,7 +161457,6 @@ 42554e44454e 42554e44454c 42554e444545 -42554e444153 42554e444131 42554e434859 42554e434855 @@ -170349,7 +161464,6 @@ 42554d5a3059 42554d574144 42554d534b49 -42554d53454e 42554d505931 42554d505050 42554d504545 @@ -170357,30 +161471,23 @@ 42554d503237 42554d4d5931 42554d4d4945 -42554d4d4552 42554d4d4544 42554d4d414e 42554d49414e 42554d485547 -42554d424c45 42554d424159 42554d424152 42554d424131 -42554d424131 42554d415353 42554d414e4e 42554d313233 42554c544552 42554c4d4152 -42554c4d414e 42554c4c5441 -42554c4c5331 42554c4c4f43 42554c4c4c4c 42554c4c4953 42554c4c4544 -42554c4c444f -42554c4c444f 42554c4c4159 42554c4c4154 42554c4c4131 @@ -170400,7 +161507,6 @@ 42554c4b494e 42554c4b4150 42554c494f4e -42554c454e54 42554c43414c 42554c415259 42554c414e44 @@ -170418,16 +161524,13 @@ 42554b414b45 42554b414255 42554a55414e -42554a485452 42554a484d54 42554a484d51 42554a484d4d 42554a484d38 4255494c4432 -4255494c4432 4255494b4b4b 425549434b37 -425549434b31 4255484a5246 425548455241 425548454b5a @@ -170438,7 +161541,6 @@ 425547535953 425547535934 425547535932 -425547535931 425547534255 425547533939 425547533636 @@ -170450,10 +161552,8 @@ 4255474e5554 4255474e4f4e 4255474e4554 -4255474d414e 4255474c4554 425547475933 -425547475331 425547455253 425547444f47 42554744454e @@ -170461,20 +161561,13 @@ 425547415449 425547415249 42554741474f -425547414741 425546555331 4255464c4558 -425546465936 -425546465935 -425546465934 -425546465932 -425546465931 425546465339 425546464f53 425546464d45 425546464c45 425546464949 -425546464554 42554646454c 425546463553 425546463333 @@ -170503,17 +161596,12 @@ 4255444c4954 425544495331 425544445958 -425544445953 -425544445953 425544445952 -42554444594a 425544445930 42554444494e -425544444945 425544444935 42554444454e 42554444454c -425544444148 425544434152 425544424147 425544414854 @@ -170535,15 +161623,11 @@ 4255434b5959 4255434b5938 4255434b5934 -4255434b4c45 -4255434b4954 4255434b4931 -4255434b4554 4255434b4544 4255434b3938 4255434b3839 4255434b3735 -4255434b3639 4255434b3635 4255434b3532 4255434b3531 @@ -170569,7 +161653,6 @@ 425542533434 4255424f4e41 4255424d414e -4255424c494b 4255424c4531 4255424b5447 425542494341 @@ -170581,11 +161664,9 @@ 42554242454e 425542424545 425542424531 -425542424241 425542424158 425542424157 425542424145 -425542424141 425542423931 425542415353 425542414c41 @@ -170630,8 +161711,6 @@ 425432323745 425431393732 425359544842 -425359544842 -425359544842 425359425a4a 4253574f5244 4253554e4e59 @@ -170665,7 +161744,6 @@ 42534542414c 425344425344 425344323137 -4253434f5454 425341573731 425341363530 425337584443 @@ -170678,7 +161756,6 @@ 425332343131 425332333836 425332313033 -425332303030 425331393936 425331323036 425331313233 @@ -170698,7 +161775,6 @@ 425259414e46 425259414e45 425259414e44 -425259414e43 425259414e38 425259414e36 425259414e35 @@ -170709,8 +161785,6 @@ 425255564552 425255554345 425255544153 -42525554414c -42525554414c 425255535345 425255534c59 425255534853 @@ -170718,15 +161792,12 @@ 425255503131 4252554e5331 4252554e4f58 -4252554e4f53 4252554e4f50 4252554e4f48 4252554e4f47 4252554e4f44 4252554e4f38 4252554e4f36 -4252554e4f32 -4252554e4f31 4252554e4e45 4252554e4931 4252554d505a @@ -170740,7 +161811,6 @@ 425255444153 425255444152 425255434b59 -425255434559 425255434555 425255434554 42525543454b @@ -170753,11 +161823,8 @@ 425254425254 425254414e4b 42524f584945 -42524f575345 42524f574e4b 42524f574e35 -42524f574e32 -42524f574e31 42524f564b4f 42524f564152 42524f554748 @@ -170769,7 +161836,6 @@ 42524f525759 42524f524f47 42524f524154 -42524f504859 42524f4f5431 42524f4f5354 42524f4f4d59 @@ -170780,8 +161846,6 @@ 42524f4f4431 42524f4f4345 42524f4e5a4f -42524f4e5a45 -42524f4e5a45 42524f4e5837 42524f4e5745 42524f4e4841 @@ -170792,8 +161856,6 @@ 42524f4d4c45 42524f4d424f 42524f4c4741 -42524f4b4552 -42524f4b454e 42524f4b4545 42524f4b4539 42524f4b4537 @@ -170861,27 +161923,19 @@ 4252494d4552 4252494d414e 4252494d4143 -4252494c4c4f -4252494c4c45 4252494b4554 4252494b3636 4252494a4f4e 425249475359 -425249474854 -425249474854 -425249474753 425249474445 425249464641 425249455231 425249454c49 425249454741 -425249454653 425249454531 425249444731 425249444531 -425249444531 425249434f4c -425249434b59 425249434b4f 425249434b37 425249434b30 @@ -170894,11 +161948,7 @@ 425249424945 425249415234 425249414e5a -425249414e53 -425249414e4d -425249414e42 425249414e39 -425249414e32 42524936414e 425249313932 425248353537 @@ -170942,7 +161992,6 @@ 4252454e3937 4252454d5345 4252454d4d49 -4252454d454e 4252454d414e 4252454c4c45 425245484d34 @@ -170961,13 +162010,9 @@ 425245444f4e 425245444441 425245444153 -425245434854 425245415a45 425245415558 425245415453 -425245415448 -425245415354 -425245415354 425245414d53 425245414d31 425245414b5a @@ -170981,7 +162026,6 @@ 425244353131 425243373031 4252424c5545 -4252415a4f53 42524158544f 425241564f33 42524156494c @@ -171008,9 +162052,6 @@ 4252414e4e41 4252414e494b 4252414e474f -4252414e4454 -4252414e444f -4252414e4430 4252414e3434 4252414e3132 4252414d424f @@ -171033,7 +162074,6 @@ 425241474741 42524145454c 425241445943 -425241445931 425241444f52 425241444f47 425241444c53 @@ -171041,7 +162081,6 @@ 425241444b31 425241444950 425241444552 -42524144454e 425241444259 425241443832 425241443735 @@ -171054,7 +162093,6 @@ 425241443333 425241443238 425241443130 -425241434b45 425241434b41 425241434559 42524142454e @@ -171154,7 +162192,6 @@ 424f59455231 424f59454545 424f59444f4e -424f59444f47 424f59443234 424f59434f57 424f59424c55 @@ -171176,17 +162213,13 @@ 424f5846494c 424f58455252 424f58455239 -424f58455231 -424f58455230 424f58455230 424f58415441 424f58333639 424f58323736 424f58313030 -424f57594552 424f574c5331 424f574c4d45 -424f574c4552 424f574c4545 424f574c4259 424f574b4552 @@ -171194,12 +162227,10 @@ 424f5749454e 424f57494548 424f57494532 -424f57455253 424f57455231 424f57454e38 424f57454e32 424f57454e31 -424f57424f57 424f57415454 424f564f5449 424f56415259 @@ -171209,8 +162240,6 @@ 424f55525345 424f5552444f 424f554e4432 -424f554e4345 -424f554e4345 424f554c4f54 424f554c4f53 424f554c4531 @@ -171220,7 +162249,6 @@ 424f55454646 424f55444f55 424f55434c45 -424f55424f55 424f55424945 424f55424159 424f5459524a @@ -171247,7 +162275,6 @@ 424f54434831 424f54413838 424f54313131 -424f53544f4e 424f53544f38 424f53544f32 424f53544f30 @@ -171261,7 +162288,6 @@ 424f53534953 424f53534945 424f53534554 -424f53534553 424f53534545 424f53533939 424f53533836 @@ -171277,10 +162303,7 @@ 424f53533133 424f534f5853 424f534f5837 -424f534e4941 424f534d4143 -424f534c4559 -424f534c4559 424f534b4f56 424f534b4931 424f534b4153 @@ -171291,7 +162314,6 @@ 424f53483034 424f53454446 424f53434f57 -424f53434f53 424f53434f4d 424f53434f42 424f53434f39 @@ -171311,12 +162333,10 @@ 424f52544153 424f52535449 424f52534b49 -424f52524953 424f52524943 424f52524547 424f524f5353 424f524f494e -424f524f4441 424f524f3836 424f524f3737 424f524f3639 @@ -171337,7 +162357,6 @@ 424f52495336 424f52495335 424f52495333 -424f52494e47 424f52494b41 424f52484553 424f52474e45 @@ -171349,27 +162368,21 @@ 424f52473935 424f52473033 424f52455253 -424f52454153 424f5244554b 424f52444557 -424f5244454e 424f5244414e 424f52413031 424f51554954 424f5050494e -424f50504552 424f50455445 424f50424f4f 424f50414c4f 424f4f5a4553 424f4f5a4531 -424f4f5a4531 -424f4f594148 424f4f594131 424f4f564552 424f4f545a31 424f4f54595a -424f4f545953 424f4f545942 424f4f545938 424f4f545937 @@ -171377,8 +162390,6 @@ 424f4f545934 424f4f54574f 424f4f545453 -424f4f545359 -424f4f545359 424f4f545349 424f4f545338 424f4f544f4f @@ -171386,36 +162397,28 @@ 424f4f544e59 424f4f544d45 424f4f544a45 -424f4f544859 424f4f544831 424f4f544559 -424f4f544552 -424f4f544552 424f4f543232 424f4f543145 424f4f535459 -424f4f535445 424f4f534b49 424f4f534b41 424f4f534841 424f4f534559 424f4f505353 -424f4f504552 424f4f504153 424f4f503537 424f4f503233 424f4f503137 424f4f4f5941 424f4f4f5341 -424f4f4f4f54 424f4f4f4e47 424f4f4f4b53 424f4f4f4841 424f4f4f4749 424f4f4e4d41 -424f4f4e4945 424f4f4e4741 -424f4f4e4552 424f4f4e4536 424f4f4e4148 424f4f4e3132 @@ -171431,12 +162434,10 @@ 424f4f4d3132 424f4f4d3033 424f4f4c4958 -424f4f4b5353 424f4f4b5334 424f4f4b5330 424f4f4b4954 424f4f4b494e -424f4f4b4945 424f4f4b4944 424f4f4b4759 424f4f4b3730 @@ -171457,19 +162458,14 @@ 424f4f444f53 424f4f444141 424f4f425959 -424f4f425953 424f4f425932 -424f4f425932 -424f4f425931 424f4f425555 424f4f425547 424f4f425544 424f4f425359 424f4f425336 -424f4f425332 424f4f424d41 424f4f424c59 -424f4f424945 424f4f424159 424f4f424153 424f4f424139 @@ -171485,13 +162481,10 @@ 424f4f324f4f 424f4f313131 424f4e5a4f32 -424f4e5a4f31 424f4e5a4932 -424f4e5a4149 424f4e5a4131 424f4e5a3436 424f4e593737 -424f4e555331 424f4e534f31 424f4e534552 424f4e4f4d4f @@ -171504,7 +162497,6 @@ 424f4e4e5858 424f4e4e4f55 424f4e4e4e4e -424f4e4e4554 424f4e4e4545 424f4e4e3137 424f4e4b494e @@ -171513,15 +162505,12 @@ 424f4e4b3134 424f4e4a4f4e 424f4e495941 -424f4e49544f 424f4e494b41 424f4e493336 424f4e475241 424f4e474f54 424f4e474f35 424f4e474f33 -424f4e474f31 -424f4e473639 424f4e473436 424f4e473138 424f4e473136 @@ -171529,7 +162518,6 @@ 424f4e455445 424f4e455337 424f4e455334 -424f4e455332 424f4e455238 424f4e455237 424f4e455234 @@ -171541,7 +162529,6 @@ 424f4e453532 424f4e453235 424f4e453232 -424f4e453131 424f4e445553 424f4e445354 424f4e445353 @@ -171549,7 +162536,6 @@ 424f4e444f4e 424f4e444a41 424f4e444554 -424f4e444544 424f4e444459 424f4e443939 424f4e443737 @@ -171563,8 +162549,6 @@ 424f4e443038 424f4e443034 424f4e43454c -424f4e424f4e -424f4e424f4e 424f4e415a41 424f4e414952 424f4e363430 @@ -171576,7 +162560,6 @@ 424f4d42494b 424f4d424553 424f4d42454e -424f4d424159 424f4d424158 424f4d424154 424f4d424131 @@ -171584,7 +162567,6 @@ 424f4d414e53 424f4d414e4e 424f4d414e31 -424f4c545353 424f4c544c4c 424f4c544943 424f4c54424f @@ -171593,15 +162575,12 @@ 424f4c4f5831 424f4c4f5353 424f4c4f474e -424f4c4f474e 424f4c4f3639 424f4c4f3131 424f4c4f3031 424f4c4c4f31 424f4c4c4553 -424f4c4c4552 424f4c4b4544 -424f4c495441 424f4c494e4b 424f4c494e48 424f4c49444f @@ -171628,20 +162607,15 @@ 424f4b41524f 424f4b41485a 424f4a415858 -424f4a41434b 424f4a414331 424f49544553 424f49544532 424f494e4732 -424f494e4731 424f494e3033 -424f494c4552 424f48554e4b 424f484f4e47 424f484e4552 -424f48494341 424f48454d49 -424f4844414e 424f48424f48 424f48414e41 424f48414c4c @@ -171653,20 +162627,16 @@ 424f47494e4a 424f47494e49 424f47494b41 -424f47494553 424f47494545 424f47494537 424f47494532 -424f47494531 424f47484f47 424f47475953 424f47474954 424f47455936 424f47455934 -424f47455931 424f47455253 424f47454545 -424f4744414e 424f47415353 424f47414348 424f47413236 @@ -171690,7 +162660,6 @@ 424f4449524b 424f44494e49 424f44494c59 -424f44494553 424f44494531 424f44444148 424f44424f59 @@ -171724,7 +162693,6 @@ 424f42533031 424f42525544 424f42524f53 -424f42524f42 424f42524546 424f42524159 424f42504150 @@ -171732,7 +162700,6 @@ 424f424f5331 424f424f5252 424f424f4d42 -424f424f3938 424f424f3734 424f424f3539 424f424f3534 @@ -171752,7 +162719,6 @@ 424f424c4f47 424f424c4954 424f424c4559 -424f424b4f56 424f424a4950 424f424a424a 424f42494b53 @@ -171761,7 +162727,6 @@ 424f42484f50 424f42464f57 424f42455247 -424f42455247 424f42455241 424f42454b32 424f4245414e @@ -171769,14 +162734,8 @@ 424f42444f42 424f4243494f 424f42433131 -424f42425959 424f42425951 -424f4242594d -424f4242594a -424f42425947 -424f42425942 424f42425936 -424f42425934 424f42425921 424f42424f53 424f42424952 @@ -171785,7 +162744,6 @@ 424f42424933 424f4242454e 424f4242454c -424f42424259 424f42424231 424f4242414e 424f42424143 @@ -171796,7 +162754,6 @@ 424f4241494e 424f4241434b 424f42414259 -424f42414259 424f42413437 424f42413330 424f42413131 @@ -171899,15 +162856,11 @@ 424d57453436 424d57453339 424d57373630 -424d57373530 424d57373333 424d57363435 424d57363030 424d57353333 -424d57353330 -424d57353230 424d57334552 -424d57333230 424d57323232 424d57313437 424d57303737 @@ -171928,7 +162881,6 @@ 424d4d365739 424d4c4f5645 424d4c424d4c -424d495a5a59 424d494a3936 424d48503031 424d48313233 @@ -171961,7 +162913,6 @@ 424d31353433 424d31343453 424d31323433 -424c59544845 424c59414e54 424c57523639 424c57425955 @@ -171993,17 +162944,12 @@ 424c55454559 424c55454352 424c55454341 -424c55453935 424c55453933 424c55453635 424c55453633 424c55453439 -424c55453435 -424c55453434 -424c55453430 424c55453338 424c55453255 -424c55453132 424c55453036 424c55453035 424c55453034 @@ -172021,7 +162967,6 @@ 424c50524f31 424c50363035 424c4f575344 -424c4f574d45 424c4f574932 424c4f574931 424c4f574930 @@ -172035,10 +162980,8 @@ 424c4f4f4f4f 424c4f4f4d55 424c4f4f4d33 -424c4f4f4453 424c4f4f4449 424c4f4e4553 -424c4f4e4453 424c4f4e424c 424c4f4d414e 424c4f4d3836 @@ -172047,7 +162990,6 @@ 424c4f473737 424c4f473232 424c4f454d45 -424c4f434b53 424c4f434b41 424c4f43434f 424c4f42424f @@ -172105,7 +163047,6 @@ 424c454e4445 424c45495a49 424c45494552 -424c45455448 424c4545504f 424c45454b53 424c45454431 @@ -172117,14 +163058,11 @@ 424c45415247 424c45414b53 424c45414b31 -424c45414348 424c44313233 424c44303031 424c424f554e 424c424a4e53 424c424a4e31 -424c415a494e -424c415a494e 424c415a4539 424c415a4538 424c415a4534 @@ -172139,7 +163077,6 @@ 424c41554750 424c41545459 424c41544152 -424c41535453 424c41534f4e 424c41534553 424c41524b53 @@ -172148,25 +163085,20 @@ 424c41523548 424c414e4b4f 424c414e4b32 -424c414e4b31 424c414e4b21 424c414e4531 424c414e4459 424c414e444f 424c414e4441 -424c414e434f 424c414d4545 424c414b4b41 424c414b4550 424c414b454a 424c414b4548 -424c414b4547 424c414b4541 -424c41495345 424c41495235 424c41494e53 424c41494e4f -424c41494e45 424c41494e31 424c41493945 424c41493745 @@ -172180,15 +163112,10 @@ 424c41464552 424c41443531 424c41434b57 -424c41434b53 424c41434b51 424c41434b4f -424c41434b4b -424c41434b42 424c41434b34 -424c41434b33 424c41434841 -424c41424c41 424c41424552 424c41415454 424c41413338 @@ -172219,7 +163146,6 @@ 424b4b4b4b4b 424b4b303430 424b49545459 -424b2e495246 424b38333332 424b35393041 424b35323835 @@ -172238,7 +163164,6 @@ 424a4f524e54 424a4f524e53 424a4f524e41 -424a4f524e31 424a4f524b41 424a4f523554 424a4f4c4741 @@ -172293,7 +163218,6 @@ 4249545a4152 424954545553 424954545331 -424954544553 424954544152 42495454414e 424954534953 @@ -172306,14 +163230,11 @@ 424954454d33 424954453934 424954453236 -424954434853 42495443484f 42495443484e 424954434841 424954434838 424954434834 -424954434834 -424954434830 42495443482a 424954424f58 424954413932 @@ -172322,7 +163243,6 @@ 424953534d49 42495353454e 42495353454c -424953534155 4249534f5531 4249534f4e34 4249534b5550 @@ -172334,7 +163254,6 @@ 42495344414b 424953435553 424953434159 -424953424545 424952544831 424952544531 42495253494e @@ -172349,8 +163268,6 @@ 424952475553 424952445934 424952445932 -424952445931 -424952445331 424952444559 424952444444 424952443939 @@ -172399,7 +163316,6 @@ 42494e4e4544 42494e4b5934 42494e4b5933 -42494e4b4945 42494e4b4131 42494e4b3738 42494e4a3234 @@ -172422,14 +163338,12 @@ 42494d574132 42494d514152 42494d504553 -42494d4d4552 42494d483138 42494d424f59 42494d424f4f 42494d424f37 42494d424f35 42494d424f32 -42494d424f31 42494d41424a 42494c5a4143 42494c57494c @@ -172444,11 +163358,8 @@ 42494c4c5958 42494c4c5952 42494c4c5946 -42494c4c5942 42494c4c5941 -42494c4c5935 42494c4c5934 -42494c4c5932 42494c4c5749 42494c4c5550 42494c4c4f58 @@ -172458,8 +163369,6 @@ 42494c4c494b 42494c4c4949 42494c4c4931 -42494c4c4554 -42494c4c4545 42494c4c4431 42494c4c434f 42494c4c4252 @@ -172469,12 +163378,10 @@ 42494c4c4131 42494c4c3938 42494c4c3934 -42494c4c3839 42494c4c3736 42494c4c3632 42494c4c3538 42494c4c3537 -42494c4c3536 42494c4c3533 42494c4c3435 42494c4c3434 @@ -172483,7 +163390,6 @@ 42494c4c3330 42494c4c3246 42494c4c3239 -42494c4c3232 42494c4c3135 42494c4c3134 42494c4c3036 @@ -172512,17 +163418,14 @@ 42494b52414d 42494b4f5348 42494b4b454c -42494b494e49 42494b493649 42494b493249 42494b465954 42494b455353 -42494b455253 42494b455239 42494b455234 42494b455233 42494b454d45 -42494b453030 42494a4f5531 42494a494b4f 42494a414e31 @@ -172540,17 +163443,12 @@ 424947564153 42494756414e 424947555344 -424947554e31 424947553636 424947545245 424947544f59 424947544a48 -424947544954 424947544953 -42494754494d 424947544943 -424947544558 -42494754454e 424947543534 424947535445 424947534958 @@ -172558,10 +163456,8 @@ 424947534143 424947524f4f 424947524f47 -424947524544 424947524148 424947524142 -42494750554e 424947504943 42494750454e 424947504159 @@ -172582,7 +163478,6 @@ 4249474d4150 4249474d414a 4249474c5936 -4249474c4f55 4249474c4f4e 4249474c495a 4249474c4559 @@ -172593,10 +163488,7 @@ 4249474c4144 4249474b474b 4249474a5553 -4249474a4f4e -4249474a4f45 4249474a4f42 -4249474a4552 4249474a4143 4249474a3838 4249474a3131 @@ -172609,12 +163501,10 @@ 42494748324f 424947475953 424947475554 -42494747554e 42494747554d 424947475359 424947475353 424947474f54 -42494747494f 42494747494c 424947474753 424947474544 @@ -172624,13 +163514,11 @@ 424947474148 424947473939 424947473130 -424947473130 424947473032 42494746524f 424947464d4d 424947464953 42494746494e -424947464947 424947455444 424947454437 424947454431 @@ -172639,10 +163527,8 @@ 424947445544 424947444f33 424947444950 -424947444545 42494744415a 424947444159 -42494744414e 424947443832 424947443238 424947443231 @@ -172654,13 +163540,10 @@ 424947434a35 424947434545 424947434341 -424947434154 424947433737 424947425931 424947425553 424947424f57 -424947424f49 -424947424f42 424947424c4f 42494742494c 424947424943 @@ -172678,7 +163561,6 @@ 424947414c4b 424947414c49 424947414c48 -424947414952 424947413838 424947413134 424947393939 @@ -172697,7 +163579,6 @@ 424946465938 424946465553 424946464f53 -424946464c45 424946464544 424946463737 424946463730 @@ -172721,7 +163602,6 @@ 424944493935 424944455842 424944445931 -424944444c45 424944444945 42494441534b 4249434f434f @@ -172745,12 +163625,10 @@ 424942493030 424942425945 424942425931 -424942424c45 424942414e55 424942414259 424942413234 424941534544 -4249414e434f 4249414e4348 4249414e3333 424941464352 @@ -172786,10 +163664,8 @@ 424845415254 424842594638 424842594633 -424842435246 424841565941 42484156414e -424841524154 4248414e5553 424841475941 424841445241 @@ -172876,7 +163752,6 @@ 42455a49524b 42455a44454c 42455a313233 -4245594f4e44 4245594e4f4e 4245594d4552 4245594b4f5a @@ -172887,7 +163762,6 @@ 424557524150 4245574c4559 42455748414e -424557415245 4245564f4c59 4245564f4552 4245564f3936 @@ -172899,7 +163773,6 @@ 424556313233 42455554454c 424555525331 -4245554c4148 4245554b3235 42455548445a 424555434845 @@ -172908,12 +163781,9 @@ 424554545946 424554545943 424554545941 -424554545931 424554545441 424554545359 -424554544953 424554544947 -424554544945 424554544931 424554544544 424554544153 @@ -172928,17 +163798,13 @@ 4245544f3539 4245544f3232 4245544f3039 -42455449544f 424554485749 424554484f52 424554484d43 424554484a31 -424554484945 424554484745 -42455448454c 424554484531 424554484242 -42455448414e 424554483936 424554483430 424554483332 @@ -172958,8 +163824,6 @@ 424554313231 424553544d41 424553544953 -424553544945 -424553544552 424553544544 424553544255 424553543937 @@ -173021,14 +163885,11 @@ 4245524e4c44 4245524e4558 4245524e4553 -4245524e4454 -4245524e4449 4245524e4435 4245524e3639 4245524e3231 4245524d4554 4245524d4153 -4245524d414e 4245524d3838 4245524c4559 4245524c4549 @@ -173046,7 +163907,6 @@ 424552474f4f 424552474954 424552474953 -424552474945 424552474553 42455247414c 424552473238 @@ -173069,7 +163929,6 @@ 42454f57554c 42454f42454f 42454e5a4931 -42454e5a4552 42454e59494e 42454e574154 42454e574141 @@ -173089,8 +163948,6 @@ 42454e53494e 42454e53454e 42454e53314e -42454e4f4954 -42454e4f4954 42454e4e5954 42454e4e5950 42454e4e594d @@ -173117,11 +163974,9 @@ 42454e4a454e 42454e4a4153 42454e495445 -42454e495441 42454e49474e 42454e49434b 42454e49414e -42454e485552 42454e48414d 42454e483736 42454e475431 @@ -173141,11 +163996,9 @@ 42454e444159 42454e443639 42454e434859 -42454e434835 42454e425241 42454e424f42 42454e424947 -42454e42454e 42454e414c49 42454e413737 42454e393333 @@ -173167,9 +164020,7 @@ 42454c57494e 42454c564944 42454c554841 -42454c554741 42454c545245 -42454c544f4e 42454c544d45 42454c543244 42454c534b49 @@ -173182,8 +164033,6 @@ 42454c4c5959 42454c4c5932 42454c4c5332 -42454c4c5331 -42454c4c4f57 42454c4c4c45 42454c4c494f 42454c4c494e @@ -173204,7 +164053,6 @@ 42454c4c4139 42454c4c4136 42454c4c4135 -42454c4c4131 42454c4c3737 42454c4c3639 42454c4c3336 @@ -173212,7 +164060,6 @@ 42454c4c3236 42454c4c3031 42454c4b4953 -42454c4b494e 42454c4b454e 42454c4b4141 42454c495441 @@ -173229,7 +164076,6 @@ 42454c42454b 42454c415445 42454c414e47 -42454c414952 42454c413831 42454c413533 42454c413331 @@ -173241,7 +164087,6 @@ 42454b4e4f57 42454b4a4554 42454b4a414e -42454b4a414e 42454b455231 42454b454c45 42454b44414e @@ -173266,7 +164111,6 @@ 4245484c554c 4245484a3634 424548455041 -4245475a4f44 424547554d53 424547554d31 424547524950 @@ -173291,7 +164135,6 @@ 42454554454c 424545535353 424545525252 -424545524d45 424545524b41 424545524945 424545524552 @@ -173311,8 +164154,6 @@ 4245454e5353 4245454e4f52 4245454c4552 -4245454c4552 -4245454b4552 4245454b4545 424545494e47 424545474c45 @@ -173342,7 +164183,6 @@ 424544415231 424544313133 4245434d414e -4245434b5953 4245434b594c 4245434b5948 4245434b5947 @@ -173350,9 +164190,6 @@ 4245434b5943 4245434b5936 4245434b4c49 -4245434b4841 -4245434b4554 -4245434b4552 4245434b454e 4245434b4441 4245434b3233 @@ -173362,11 +164199,9 @@ 424543495050 424543484952 424543455252 -424543434153 424543434143 424543434137 424543434132 -424543434131 424543415553 424543414c49 424542555348 @@ -173375,7 +164210,6 @@ 4245424f5445 4245424f5032 4245424f3039 -42454249544f 424542494538 424542455449 424542455448 @@ -173410,14 +164244,11 @@ 424541545455 424541544f53 424541544f31 -424541544c45 424541544945 424541544132 424541543232 424541543031 -424541535459 424541535454 -424541535453 424541535435 424541534f4e 424541534c59 @@ -173431,13 +164262,9 @@ 424541524559 424541524553 424541524545 -424541524431 -424541523939 424541523934 424541523838 -424541523838 424541523830 -424541523737 424541523735 424541523732 424541523656 @@ -173451,20 +164278,14 @@ 424541523336 424541523139 424541523136 -424541523134 -424541523132 424541523039 424541523035 424541523033 424541523032 -424541523031 4245414e5554 4245414e5345 4245414e4f52 -4245414e4945 4245414e4559 -4245414e4559 -4245414e4552 4245414e424f 4245414e3434 4245414e3430 @@ -173476,10 +164297,8 @@ 4245414e3030 4245414d4a45 4245414d494e -4245414d494e 4245414d4945 4245414d4553 -4245414d4552 4245414d454e 4245414c4c53 4245414c4c45 @@ -173489,11 +164308,9 @@ 424541445931 424541445353 424541444f47 -424541434853 424541434848 424541434844 424541434838 -424541434831 424538333733 424536394552 424535464535 @@ -173523,8 +164340,6 @@ 424447424447 424447333231 424446595946 -424446595358 -424446594a44 424446593035 424446505450 424445525453 @@ -173613,7 +164428,6 @@ 424252415645 424252414b45 424252343835 -424250415353 42424f595353 42424f593133 42424f593031 @@ -173636,10 +164450,8 @@ 424249524444 424249524431 4242494c4c59 -4242494c4c59 424249494c4c 424248545141 -424248545141 424248494c4c 424247554e53 424247425242 @@ -173671,7 +164483,6 @@ 424242424947 424242424258 424242424256 -424242424242 424242424241 424242424237 424242424232 @@ -173684,7 +164495,6 @@ 4242414e4b53 4242414e334b 4242414c4c39 -4242414c4c38 4242414c4c37 424241414444 424236393639 @@ -173743,7 +164553,6 @@ 42415948414e 424159474c41 424159455231 -424159415244 424158543352 4241574c4552 424157424157 @@ -173758,7 +164567,6 @@ 424155455231 424155424153 4241545a454e -42415459414d 424154554641 424154545936 424154545545 @@ -173780,7 +164588,6 @@ 4241544d4131 4241544d4130 4241544c4c45 -4241544c4552 4241544a414b 424154494f4e 424154494e41 @@ -173793,12 +164600,9 @@ 424154464f52 424154455249 424154453339 -424154444f47 424154434f4d 424154434839 -424154424154 424154415649 -424154415441 424154415244 424154414341 424154374550 @@ -173815,10 +164619,8 @@ 424153544153 424153544132 424153544131 -424153535353 424153534f31 424153534e4e -424153534945 424153534931 42415353484f 42415353454d @@ -173837,7 +164639,6 @@ 4241534d415a 4241534d414e 4241534d4143 -4241534c4552 4241534b4f53 4241534b414b 4241534a4531 @@ -173880,14 +164681,10 @@ 42415256494e 424152564552 424152545454 -424152544f4b 424152544f31 424152544c4b 424152544c42 -424152544a45 424152544831 -42415254455a -42415254454b 424152544243 424152543939 424152543934 @@ -173903,12 +164700,10 @@ 424152543235 424152543233 424152543133 -424152543031 424152535543 424152534f56 424152534f45 424152534b45 -42415253494b 424152534841 424152534154 424152534131 @@ -173919,14 +164714,11 @@ 424152525939 424152525936 424152525553 -424152524f53 424152524f4f 424152524a42 424152524954 42415252494c 424152524943 -424152524554 -42415252454c 42415252414c 42415252414b 424152515549 @@ -173946,13 +164738,9 @@ 4241524e3031 4241524d5931 4241524d494c -4241524c4f57 -4241524c4f57 4241524c4f47 4241524c4f45 -4241524c4559 4241524b4953 -4241524b4552 4241524b4544 4241524b3639 4241524b3232 @@ -173975,7 +164763,6 @@ 424152454954 424152454654 424152454153 -424152444f54 424152444f53 42415244494e 424152444554 @@ -173989,18 +164776,13 @@ 424152425545 424152424f59 424152424953 -42415242454c -424152424152 42415242414c 424152424144 424152423432 424152423332 42415241534b 424152414d55 -424152414b41 -424152414b41 424152414b33 -424152414b31 424152414745 424152414741 424152414557 @@ -174018,33 +164800,26 @@ 42414f544849 42414f53554b 42414f4b5550 -42414e5a4149 42414e594f4e 42414e545532 42414e545531 42414e544159 -42414e54414d 42414e544149 42414e535249 42414e534f4e 42414e4f5355 42414e4f4f4c 42414e4e5531 -42414e4e4f4e 42414e4e494e -42414e4e4544 42414e4e4142 42414e4b5953 42414e4b5931 42414e4b5335 42414e4b5333 -42414e4b5331 -42414e4b5331 42414e4b5249 42414e4b4f4e 42414e4b4f4b 42414e4b4954 -42414e4b4954 42414e4b4544 42414e4b3939 42414e4b3330 @@ -174062,11 +164837,8 @@ 42414e49414e 42414e475545 42414e475531 -42414e474f52 -42414e47494e 42414e474941 42414e474655 -42414e474552 42414e47454d 42414e473737 42414e473352 @@ -174095,8 +164867,6 @@ 42414e434849 42414e425552 42414e414e59 -42414e414348 -42414e414348 42414e373839 42414d534953 42414d53494b @@ -174113,9 +164883,7 @@ 42414d424f53 42414d424f31 42414d424c45 -42414d424c45 42414d424939 -42414d424931 42414d424559 42414d424545 42414d424159 @@ -174129,10 +164897,8 @@ 42414d413234 42414d413231 42414d413230 -42414d413132 42414c5a4c49 42414c5a414d -42414c5a4143 42414c574547 42414c555354 42414c553132 @@ -174149,8 +164915,6 @@ 42414c4f5532 42414c4f5332 42414c4f5331 -42414c4f4f4e -42414c4f4f31 42414c4f4531 42414c4e4f53 42414c4d4f4c @@ -174159,9 +164923,7 @@ 42414c4c5355 42414c4c5339 42414c4c5335 -42414c4c5331 42414c4c4f53 -42414c4c4f4e 42414c4c4c53 42414c4c4935 42414c4c4559 @@ -174171,7 +164933,6 @@ 42414c4c3434 42414c4c3338 42414c4c3136 -42414c4c3131 42414c4c3130 42414c4c3039 42414c4b4931 @@ -174193,17 +164954,13 @@ 42414c455231 42414c445953 42414c445932 -42414c445931 42414c445749 42414c444f58 42414c444f52 42414c444c59 42414c444958 -42414c444945 42414c444556 42414c444544 -42414c424f41 -42414c424f41 42414c424952 42414c424153 42414c415331 @@ -174220,7 +164977,6 @@ 42414b4f4646 42414b4d414e 42414b4b494e -42414b4b4552 42414b4b4536 42414b4b4153 42414b4b414c @@ -174230,8 +164986,6 @@ 42414b455239 42414b455238 42414b455234 -42414b455232 -42414b455231 42414b454431 42414b453832 42414b44524f @@ -174255,7 +165009,6 @@ 4241494c4552 4241494c4459 4241494c3333 -4241494b414c 4241485a4144 424148555353 42414854494b @@ -174283,7 +165036,6 @@ 4241474e494f 424147475953 424147475931 -42414747494f 424147474142 424147473130 42414745524f @@ -174337,7 +165089,6 @@ 424144455231 424144454747 42414445434f -424144444f47 424144444153 424144434f58 424144434f57 @@ -174354,7 +165105,6 @@ 424144353030 424144333231 424144333132 -424144313034 424144313030 42414353454b 4241434f5441 @@ -174411,8 +165161,6 @@ 424142593631 424142593530 424142593137 -424142593132 -424142593130 424142593036 424142593033 424142555249 @@ -174421,7 +165169,6 @@ 424142553130 424142533131 4241424f5532 -4241424f4f4e 4241424f4f32 4241424f4559 4241424f454e @@ -174451,7 +165198,6 @@ 424142414c4c 424142414449 424142414255 -424142414241 424142413737 424142413735 424142413639 @@ -174595,10 +165341,8 @@ 42314242494f 423141544348 4231414e4341 -4231414e4341 423141334d36 423139394342 -423137464c59 4231364e4857 423135363342 423135353531 @@ -174627,7 +165371,6 @@ 423030544933 4230304b314d 423030483030 -423030474552 423030464552 423030424945 423030423133 @@ -174647,7 +165390,6 @@ 415a55525249 415a55524f4e 415a5552494b -415a55524531 415a554d4148 415a554c454a 415a554c4141 @@ -174660,7 +165402,6 @@ 415a53343832 415a53313233 415a52554e52 -415a5245414c 415a5241334c 415a50313233 415a4f544831 @@ -174685,15 +165426,11 @@ 415a49413838 415a49313233 415a48524549 -415a48524549 415a48414755 415a46554f42 -415a46554f42 -415a46554f42 415a45555331 415a45525455 415a4552544f -415a45525241 415a45524b41 415a45523132 415a45523130 @@ -174708,10 +165445,7 @@ 415a415a3031 415a41543935 415a41524445 -415a414d4154 415a414c4959 -415a414c494e -415a414c4541 415a41484154 415a41424247 415a41313233 @@ -174732,7 +165466,6 @@ 415a31353434 415a31343838 415a31335354 -415a31323334 415a31323231 415a3039415a 415a30393637 @@ -174744,7 +165477,6 @@ 415954414334 415953484157 415953454e41 -415952544f4e 415952544f37 415952544f33 41594f554e47 @@ -174794,7 +165526,6 @@ 4158474b454f 415845535331 4158454d454e -4158454d414e 4158454c4b4b 4158454c4954 4158454c4646 @@ -174815,7 +165546,6 @@ 415831343430 415759593458 415753554d31 -4157534f4d45 415753484954 415753415753 415753393031 @@ -174840,7 +165570,6 @@ 415746374133 415746313435 415745535341 -415745534f4d 415745415344 415745343536 415745313233 @@ -174853,7 +165582,6 @@ 415742565359 415742523359 415742313233 -415741574157 41574154544f 415741544b41 415741544946 @@ -174904,10 +165632,8 @@ 41564944494e 415649414e41 415649414c4c -415647555354 41564749524c 415646353830 -415645535441 415645535041 415645525958 41564552594c @@ -174931,7 +165657,6 @@ 41564152454c 41564150524f 4156414e5a41 -4156414e5449 4156414e5432 4156414e5431 4156414e4345 @@ -174959,16 +165684,13 @@ 4155544f3034 4155544c414e 415554495354 -41555449534d 415554494137 -415554484f52 415554454641 415553573132 415553544945 415553544939 415553544936 415553544934 -415553544558 415553504558 4155534c414e 415553475559 @@ -174979,10 +165701,8 @@ 4155524f4348 415552495441 41555249474f -415552494341 415552494331 415552454e53 -415552414c4f 415550504552 41554f445541 41554f434152 @@ -175013,13 +165733,10 @@ 415547353935 4155472d3030 415546424155 -415546424155 415545563652 415544524152 -415544524131 4155444d414e 4155444c4559 -415544495454 415544495441 415544495438 415544495336 @@ -175033,9 +165750,7 @@ 415544494552 415544494147 415544494141 -415544494138 415544494135 -415544494134 415544493839 415544493441 41554449324b @@ -175066,8 +165781,6 @@ 41545a313233 4154594c5448 415459434c42 -415459425243 -415457454c4c 415456415253 415456313233 415455415455 @@ -175104,7 +165817,6 @@ 41544f4e4552 41544f4d4948 41544f4d4947 -41544f4d4943 41544f4d4552 41544f4d414e 41544f4d3937 @@ -175115,7 +165827,6 @@ 41544d41544d 41544d313233 41544c4a4847 -41544c49454e 41544c454531 41544c415336 41544c414e44 @@ -175130,7 +165841,6 @@ 4154494e4154 4154494d3232 4154494c494f -4154494c494f 4154494c4153 415449464153 415449435553 @@ -175140,8 +165850,6 @@ 4154484f5337 4154484f5332 4154484f5331 -4154484f4d45 -4154484f4d45 415448495241 415448484556 415448454c4c @@ -175172,7 +165880,6 @@ 415441563836 415441524f53 415441524937 -415441524937 415441524148 415441515545 4154414e4f53 @@ -175191,8 +165898,6 @@ 4154304d494b 415430333235 415359544842 -415359544842 -415359544842 415359533532 415359413933 415359413131 @@ -175223,12 +165928,10 @@ 415354524139 415354524138 415354524137 -415354524136 415354524130 415354523031 4153544f5249 4153544f5231 -4153544f5231 4153544f4e53 4153544f4e37 415354495350 @@ -175283,7 +165986,6 @@ 415353313030 415352594d54 415352493031 -415352493031 415352414d41 415352414c52 415351574445 @@ -175294,8 +165996,6 @@ 415350494445 415350485958 415350454e4c -415350454e33 -415350454e31 41535045434b 415350363530 415350353535 @@ -175309,7 +166009,6 @@ 41534e415448 41534e414b45 41534d43414d -41534d415241 41534d414e31 41534d414d4d 41534d373135 @@ -175335,17 +166034,13 @@ 41534b455354 41534b415455 41534b415235 -41534b414e49 41534a41534a 415349594154 41534954534e 4153494f4e47 -4153494d4f56 4153494d414e 4153494d4148 415349463731 -415349414e53 -41534941474f 41534941474f 415349414141 415349413232 @@ -175359,14 +166054,10 @@ 415348544f30 41534854414c 415348524159 -41534852414d 4153484f5245 4153484f4b50 4153484e414b 4153484d454e -4153484d414e -4153484c594e -4153484c594e 4153484c4941 4153484c3359 4153484b4c48 @@ -175424,10 +166115,8 @@ 415344494f50 415344465344 415344465246 -415344464a4b 41534446484a 41534446474a -415344464748 415344464738 415344464737 415344464734 @@ -175442,8 +166131,6 @@ 415344463138 415344463137 415344463134 -415344463132 -415344463132 415344463038 415344463031 415344455441 @@ -175454,7 +166141,6 @@ 415344454144 415344453132 415344424e4d -415344415344 415344414752 415344413131 415344393131 @@ -175466,10 +166152,8 @@ 415344353637 415344353135 415344343537 -415344343536 415344333333 415344313234 -4153434f5454 4153434f5431 415343494931 415343484945 @@ -175482,7 +166166,6 @@ 415343303031 415342415342 415342414348 -41534153494e 415341533038 415341524150 415341523739 @@ -175549,7 +166232,6 @@ 415331343632 415331333330 415331325745 -415331323334 415331323333 415331323132 415331323130 @@ -175583,9 +166265,7 @@ 415255424137 41525459454d 415254574159 -41525455524f 415254555249 -415254555231 415254545531 415254545454 415254545241 @@ -175606,11 +166286,9 @@ 4152544a4147 41525449554d 415254494741 -415254494531 415254493135 415254484f53 415254484f52 -41525446554c 415254464147 415254455354 415254455053 @@ -175621,7 +166299,6 @@ 415254454d44 415254454d39 415254454531 -415254454331 415254434f4d 415254424f58 415254424f4e @@ -175643,14 +166320,12 @@ 4152534f4e53 4152534c4f4e 4152534c4c43 -4152534c414e 415253494e4f 415253494e31 415253484941 41525348414d 41525348414b 415253454f32 -415253454e59 415253454e4e 415253454e4c 415253453132 @@ -175658,7 +166333,6 @@ 415253313335 415252524748 4152524f5757 -4152524f5753 4152524f5738 4152524f4e42 4152524f4348 @@ -175706,12 +166380,10 @@ 41524e444855 41524e41524e 41524e414c44 -41524e304c44 41524d594e49 41524d594536 41524d593939 41524d593936 -41524d593936 41524d593836 41524d593832 41524d593735 @@ -175734,7 +166406,6 @@ 41524d4c4554 41524d4b4154 41524d494e4e -41524d494e31 41524d494a4f 41524d494553 41524d454e45 @@ -175750,7 +166421,6 @@ 41524d414e43 41524d414e41 41524d41444f -41524d414441 41524d413731 41524d305231 41524c594c45 @@ -175758,7 +166428,6 @@ 41524c494e44 41524c493034 41524c454e5a -41524c454e45 41524c454531 41524c414e44 41524c413637 @@ -175788,7 +166457,6 @@ 415249474854 415249464f4e 41524946494e -415249455445 41524945534b 415249455338 415249455334 @@ -175798,7 +166466,6 @@ 415249454c52 415249454c45 415249454c39 -415249454c31 415249454745 41524943414e 41524942454e @@ -175806,7 +166473,6 @@ 415249424150 415249414e53 415249414e4f -415249414e41 415249414d41 415249414a41 415249414749 @@ -175815,7 +166481,6 @@ 415248454e32 415248415241 415248414d45 -415247594c4c 415247555a41 415247555337 4152474f5353 @@ -175836,7 +166501,6 @@ 415245574531 41524556494b 415245545553 -415245544841 415245544153 415245533737 415245505448 @@ -175847,9 +166511,7 @@ 4152454e4453 4152454e4431 4152454e414c -4152454e414c 4152454e4141 -4152454e4131 4152454d414b 4152454d4143 4152454c4953 @@ -175861,7 +166523,6 @@ 41524546494e 415245434845 415245415331 -415245413531 415245413131 415244595448 415244534643 @@ -175899,8 +166560,6 @@ 415243434f53 415243415249 415243414e49 -415243414e45 -415243414445 415243313730 415243313233 415243313131 @@ -175924,15 +166583,12 @@ 41524155434f 415241554341 41524153414e -415241524154 -415241524154 415241504f56 4152414e5458 4152414e4745 4152414e454b 4152414e4345 4152414e4153 -4152414d4953 4152414d4952 4152414d494c 4152414d4544 @@ -175948,8 +166604,6 @@ 41524142554c 415241424c45 415241424b41 -415241424953 -415241424941 415241424552 41524142454c 415241424141 @@ -176020,7 +166674,6 @@ 4150524f4e53 4150524e414c 415052495941 -415052494c53 415052494c52 415052494c43 415052494c41 @@ -176100,7 +166753,6 @@ 4150414d414e 415041494745 415041474553 -415041434552 415041424f4e 415041363636 415041323238 @@ -176161,14 +166813,12 @@ 414e5554494e 414e55544141 414e55544131 -414e55534941 414e55534341 414e554e4137 414e554c5553 414e5548414b 414e5542495a 414e54574154 -414e5457414e 414e54554e45 414e54544342 414e54524f50 @@ -176177,14 +166827,11 @@ 414e544f5741 414e544f5348 414e544f4e50 -414e544f4e49 414e544f4e36 414e544f4e33 414e544f4e30 414e544f4a4f -414e544f4841 414e544e5931 -414e544d414e 414e54494e45 414e54494e41 414e54494d4f @@ -176197,12 +166844,10 @@ 414e54493232 414e54493133 414e54484f53 -414e54484f4e 414e54484553 414e54483732 414e54483439 414e5447494f -414e5445524f 414e54455249 414e54454b31 414e54424f59 @@ -176212,7 +166857,6 @@ 414e54313036 414e54303032 414e5357494e -414e53574552 414e53544152 414e534e3031 414e534a4f53 @@ -176220,7 +166864,6 @@ 414e53494e47 414e53474152 414e53455232 -414e53454c4d 414e53415445 414e53415241 414e53414e53 @@ -176234,7 +166877,6 @@ 414e4f524f43 414e4f4f504b 414e4f4f5048 -414e4f4e594d 414e4f4e494f 414e4f4d4953 414e4f4d414c @@ -176252,9 +166894,7 @@ 414e4e4c4545 414e4e495553 414e4e495459 -414e4e495441 414e4e494557 -414e4e494553 414e4e49454e 414e4e494547 414e4e494538 @@ -176296,18 +166936,13 @@ 414e4e414b31 414e4e414544 414e4e414445 -414e4e414141 -414e4e413939 414e4e413938 414e4e413934 -414e4e413833 414e4e413830 -414e4e413737 414e4e413734 414e4e413733 414e4e413731 414e4e413730 -414e4e413639 414e4e413636 414e4e413632 414e4e413539 @@ -176321,12 +166956,10 @@ 414e4e413239 414e4e413237 414e4e413236 -414e4e413133 414e4e413039 414e4e413038 414e4e413036 414e4e313433 -414e4e313233 414e4e303037 414e4e303031 414e4d4f4c45 @@ -176338,7 +166971,6 @@ 414e4b4f4e41 414e4b4b4131 414e4b453638 -414e4b415241 414e4b413235 414e4b413131 414e4a554e41 @@ -176362,7 +166994,6 @@ 414e49544142 414e49544136 414e4953544f -414e49535341 414e4953494d 414e49534831 414e49534148 @@ -176378,14 +167009,11 @@ 414e494d4545 414e494d4539 414e494d4533 -414e494d4153 414e494c4f56 414e494c4153 414e494c4147 414e494b4b41 -414e494b4131 414e494a414e -414e49474552 414e49454845 414e49434941 414e49434852 @@ -176396,7 +167024,6 @@ 414e49413737 414e49413636 414e49413138 -414e49413132 414e49373737 414e49344b41 414e49313233 @@ -176413,28 +167040,17 @@ 414e47554c41 414e47535431 414e4752454e -414e474d4152 414e474c4f31 -414e474c4941 414e474c4554 -414e474c4552 414e474c454f 414e474c4545 -414e474c4531 414e474c4153 414e47495441 414e47494546 414e47494533 414e47494530 414e4747554e -414e47454c58 -414e47454c4f -414e47454c4c 414e47454c48 -414e47454c45 -414e47454c41 -414e47454c33 -414e47454c32 414e4745454c 414e47453235 414e47453136 @@ -176470,7 +167086,6 @@ 414e44594653 414e44594444 414e44594431 -414e44594431 414e44593936 414e44593838 414e44593837 @@ -176486,9 +167101,7 @@ 414e44593332 414e44593330 414e44593238 -414e44593230 414e44593039 -414e44593031 414e44555249 414e44554b45 414e44534558 @@ -176498,7 +167111,6 @@ 414e44524f4f 414e44524f35 414e44524f31 -414e44524959 414e4452494f 414e44524554 414e44524552 @@ -176581,8 +167193,6 @@ 414e414e4452 414e414e444b 414e414e4431 -414e414e4153 -414e414e4153 414e414e4143 414e414d4f52 414e414d494b @@ -176591,7 +167201,6 @@ 414e414c555a 414e414c4f55 414e414c4f4e -414e414c4f47 414e414c4954 414e414c4953 414e414c4558 @@ -176637,7 +167246,6 @@ 414d59524b41 414d594d4152 414d594a4f35 -414d59473231 414d5944414e 414d59443031 414d59413034 @@ -176656,7 +167264,6 @@ 414d53545245 414d53545241 414d53544242 -414d53544242 414d5349554d 414d53414c50 414d53313233 @@ -176687,7 +167294,6 @@ 414d4f523736 414d4f4e4a43 414d4f4e4941 -414d4f454241 414d4f44494f 414d4f44454c 414d4f434f50 @@ -176703,7 +167309,6 @@ 414d4d4a414b 414d4d494e4f 414d4d455253 -414d4d415241 414d4d414d4d 414d4d41434f 414d4d413939 @@ -176739,7 +167344,6 @@ 414d49475549 414d49474f4f 414d49474f36 -414d49474f31 414d4947414c 414d49474136 414d49474133 @@ -176770,13 +167374,11 @@ 414d45533130 414d4552494f 414d45524945 -414d45524943 414d45523232 414d454f5445 414d454f4241 414d454e3336 414d454c494e -414d454c4941 414d454b434f 414d45494c41 414d45494341 @@ -176807,14 +167409,12 @@ 414d424f5953 414d424c4553 414d424c4552 -414d424c4552 414d42493036 414d42455448 414d42455259 414d42455258 414d4245524d 414d42455245 -414d42455231 414d4241544f 414d42415353 414d42373732 @@ -176830,7 +167430,6 @@ 414d41535941 414d41535337 414d41524f51 -414d41524f4b 414d4152494f 414d4152494e 414d41524941 @@ -176845,7 +167444,6 @@ 414d414e4a49 414d414e4931 414d414e4449 -414d414e4441 414d414e4144 414d414e4131 414d414e3532 @@ -176853,7 +167451,6 @@ 414d414c4f55 414d414c4c45 414d414c494b -414d414c4941 414d414c3034 414d414b5553 414d414b414d @@ -176889,7 +167486,6 @@ 5f414c5a495f 414c5a41444f 414c59535345 -414c59534f4e 414c594c4553 414c594b4154 414c59455332 @@ -176903,7 +167499,6 @@ 414c58414c58 414c58333438 414c58303939 -414c56495241 414c56494e4e 414c56494e4b 414c56494e4a @@ -176930,16 +167525,12 @@ 414c54494e4f 414c54494e41 414c54494a44 -414c54484f52 414c5445524f -414c54454348 414c54454332 -414c54454331 414c54434f4d 414c5441544f 414c54415231 414c54414c54 -414c54414952 414c54414345 414c54413938 414c54353736 @@ -176950,7 +167541,6 @@ 414c53444e31 414c53444131 414c53414441 -414c53343237 414c53303230 414c52583031 414c524f4341 @@ -176962,19 +167552,14 @@ 414c51554453 414c504f3131 414c504c414e -414c50494e49 -414c50494e41 414c50484558 414c5048415a -414c50484153 414c50484152 414c50484150 414c5048414f 414c50484149 414c50484144 414c50484143 -414c50484137 -414c50455254 414c50454556 414c50454536 414c50415353 @@ -176992,7 +167577,6 @@ 414c4f4e4b41 414c4f4e4749 414c4f4e4552 -414c4f4e4452 414c4f4e4157 414c4f4e4133 414c4f4e4131 @@ -177006,10 +167590,8 @@ 414c4f313233 414c4e495445 414c4d4f4e54 -414c4d4f4e44 414c4d4f4e41 414c4d4f3138 -414c4d495441 414c4d494b41 414c4d455231 414c4d454e41 @@ -177032,13 +167614,11 @@ 414c4c594331 414c4c57594e 414c4c574159 -414c4c555245 414c4c555241 414c4c544f57 414c4c535558 414c4c535438 414c4c534554 -414c4c4f5953 414c4c4f5931 414c4c4f5741 414c4c4f5645 @@ -177054,7 +167634,6 @@ 414c4c4d4f59 414c4c4d4532 414c4c4d4158 -414c4c4d414e 414c4c4a4f59 414c4c494e47 414c4c494e45 @@ -177077,7 +167656,6 @@ 414c4c454e30 414c4c454745 414c4c453455 -414c4c444159 414c4c434152 414c4c415941 414c4c415331 @@ -177108,7 +167686,6 @@ 414c4c393939 414c4c34594f 414c4c345553 -414c4c344d45 414c4c333333 414c4c325853 414c4c323436 @@ -177128,10 +167705,8 @@ 414c4a41434b 414c4a383134 414c4a363230 -414c495a4545 414c495a4541 414c49594f55 -414c49594148 414c49564532 414c4956414e 414c49545441 @@ -177139,13 +167714,10 @@ 414c4954414b 414c49534f32 414c49534f30 -414c49534841 -414c49534841 414c49534152 414c49534144 414c49534139 414c49534135 -414c49534131 414c4952494f 414c49524941 414c4950494f @@ -177157,7 +167729,6 @@ 414c494e4156 414c494e4144 414c494e4139 -414c494e4139 414c494e4138 414c494e4136 414c494e4133 @@ -177190,15 +167761,12 @@ 414c49443931 414c49434841 414c4943455a -414c49434553 414c4943454e 414c49434547 414c49434542 -414c49434538 414c49434534 414c49424f59 414c49415332 -414c49415331 414c49414e53 414c49413831 414c49413639 @@ -177214,10 +167782,8 @@ 414c474f4f44 414c474c494e 414c474a4447 -414c47455249 414c47353939 414c46593333 -414c46524544 414c46495241 414c46494e41 414c46494543 @@ -177249,7 +167815,6 @@ 414c46313936 414c46313433 414c45594e41 -414c45585858 414c45585841 414c4558564e 414c4558544f @@ -177265,12 +167830,9 @@ 414c45584b4f 414c45584956 414c4558494e -414c45584941 414c45584841 -414c45584559 414c45584554 414c4558454e -414c4558454a 414c45584545 414c45584456 414c45584445 @@ -177282,21 +167844,14 @@ 414c45584153 414c45584152 414c45584150 -414c4558414e 414c4558414a 414c45584148 414c45584146 414c45584137 414c45584135 414c45584133 -414c45584131 -414c45583938 -414c45583839 414c45583739 -414c45583737 -414c45583639 414c45583632 -414c45583630 414c45583539 414c45583537 414c45583533 @@ -177308,11 +167863,6 @@ 414c45583335 414c4558324b 414c45583237 -414c45583135 -414c45583133 -414c45583130 -414c45583031 -414c45583030 414c45565241 414c4556494e 414c45564934 @@ -177320,18 +167870,14 @@ 414c45545445 414c4553494f 414c45525438 -414c4550504f 414c454f4e41 -414c454e4b41 414c454e4153 414c454e414b 414c454e4143 -414c454e4131 414c454e3536 414c454d424f 414c454c4152 414c454b555a -414c454b5331 414c454b4345 414c454a5238 414c454a4f41 @@ -177347,9 +167893,7 @@ 414c45454e41 414c45444f47 414c45443030 -414c45434941 414c45433034 -414c45414c45 414c45393235 414c45353530 414c45333333 @@ -177375,7 +167919,6 @@ 414c434f4f4c 414c434f4e4e 414c434f4d4d -414c43494445 414c43494249 414c4348414e 414c43483131 @@ -177401,14 +167944,12 @@ 414c42495a55 414c42495345 414c42494e45 -414c42494e41 414c42494558 414c4249414d 414c42455253 414c42454e41 414c4241524e 414c42415245 -414c42414e59 414c42414e41 414c42413739 414c42413435 @@ -177441,7 +167982,6 @@ 414c414e4a57 414c414e494e 414c414e4452 -414c414e4452 414c414e4345 414c414e4242 414c414e4132 @@ -177475,7 +168015,6 @@ 414c41474e41 414c41444f53 414c41444c46 -414c4144494e 414c41444449 414c41444152 414c4144414e @@ -177508,10 +168047,7 @@ 414c31393730 414c31393635 414c31393338 -414c31393137 -414c31393136 414c31373531 -414c31373136 414c31363638 414c31334e35 414c31323536 @@ -177554,7 +168090,6 @@ 414b52414d41 414b52413031 414b52323635 -414b514a3130 414b4f544f48 414b4f524f53 414b4f524655 @@ -177585,7 +168120,6 @@ 414b49524146 414b49524137 414b49524135 -414b49524131 414b494f3133 414b494e4e41 414b494e494e @@ -177606,7 +168140,6 @@ 414b46495645 414b45543637 414b45525331 -414b45524b45 414b454d4931 414b454d4531 414b454c5556 @@ -177628,7 +168161,6 @@ 414b41535941 414b41534f4e 414b4153484d -414b41534841 414b4153414e 414b41533132 414b4152494d @@ -177697,13 +168229,11 @@ 414a444d4447 414a42313233 414a42303037 -414a41585858 414a41583939 414a41583935 414a41583638 414a41583030 414a41524b4f -414a414e5441 414a414e454d 414a414d3436 414a414b3939 @@ -177746,9 +168276,7 @@ 4149524e4550 4149524e4156 4149524d4d52 -4149524d4158 4149524d4154 -4149524d414e 414952475559 414952464958 414952464156 @@ -177763,7 +168291,6 @@ 414952303837 414950483033 414950455249 -414950455249 41494f545841 41494f524941 41494f41494f @@ -177783,7 +168310,6 @@ 41494b4f3030 41494b4b4132 41494b494e53 -41494b49444f 41494b415741 41494b413930 41494b363636 @@ -177837,7 +168363,6 @@ 41484d455449 41484d45542e 41484d415249 -4148494c4553 41484845434b 414845524f4e 414845524e53 @@ -177849,7 +168374,6 @@ 414843484f4f 414843484159 414841524459 -4148414d4159 4148414b494d 414841484143 414841424f50 @@ -177860,7 +168384,6 @@ 414836373134 414834313134 414832383038 -414832303130 414831393936 414831393935 414831393833 @@ -177877,7 +168400,6 @@ 414755414755 414753415347 414752454554 -414752414752 414752414645 414750524f31 41474f555241 @@ -177909,7 +168431,6 @@ 414749313233 414748415441 414747564941 -414747494553 414747494532 41474745524e 414747314553 @@ -177922,9 +168443,6 @@ 414741564553 414741544f4e 414741544f4d -414741544845 -414741544841 -414741544531 414741544531 414741544153 414741534849 @@ -177956,14 +168474,12 @@ 414654455241 414654454e49 41465348494e -41465348494e 414652544831 414652454552 414652415541 414652343334 414652313233 414650303343 -414650303343 41464f4c4559 41464f463839 41464e4d5246 @@ -178018,7 +168534,6 @@ 414631313331 414631303130 414630333332 -4145594e4252 4145594a4159 414559363456 414556414556 @@ -178046,12 +168561,10 @@ 41454e4e4553 41454e4a4b4b 41454e4a4535 -41454e494d41 41454e454953 41454e435951 41454c524544 41454c495553 -41454c495441 41454c415241 41454b4f4c45 41454b4a5946 @@ -178090,7 +168603,6 @@ 414457454c4c 414457414e31 41445649434b -414456454e54 414456415244 414456415241 414456313233 @@ -178134,9 +168646,7 @@ 41444f524137 41444f505431 41444f4e3130 -41444f4c5048 41444f4c4647 -41444f4c4631 41444f494843 41444f474731 41444f424f31 @@ -178146,7 +168656,6 @@ 41444e4f434b 41444e494c31 41444e414e31 -41444e414d41 41444e323334 41444e313839 41444d4f5245 @@ -178156,8 +168665,6 @@ 41444d494e58 41444d494e4f 41444d494e41 -41444d494e33 -41444d494e30 41444d494e2e 41444d493632 41444d493132 @@ -178184,7 +168691,6 @@ 4144494b3934 414449444f53 41444944415a -414449444153 41444943544f 414449434141 414449424f55 @@ -178213,7 +168719,6 @@ 4144454c4c53 4144454c4954 4144454c4945 -4144454c4941 4144454c4554 4144454c4553 4144454c4149 @@ -178223,8 +168728,6 @@ 4144445a4534 414444535353 414444514431 -4144444d414e -4144444d414e 4144444c4544 4144444a4552 414444495331 @@ -178262,7 +168765,6 @@ 4144414d4348 4144414d4341 4144414d4158 -4144414d4153 4144414d414d 4144414d4148 4144414d4141 @@ -178285,12 +168787,10 @@ 4144414d3230 4144414d3137 4144414d3135 -4144414d3132 4144414d3039 4144414d3037 4144414a454e 414441494b41 -41444147494f 414441455a45 414441444647 414441444548 @@ -178302,8 +168802,6 @@ 414441313131 414438414d41 414438324e54 -414436383037 -414436303432 414436303432 414435363930 414432353339 @@ -178320,19 +168818,14 @@ 4143584c3938 4143564d4752 414355525553 -414355524131 4143554f4e45 414355464558 414355455241 414354555031 -414354524f53 414354524f4e -4143544f5253 4143544f5252 4143544f3131 4143544d4d50 -414354495645 -41435449554d 41435449554d 414354494e53 414354494546 @@ -178365,7 +168858,6 @@ 414349545441 414349545241 414349535345 -4143494e4f4d 4143494e4f4b 4143494e4943 4143494e4332 @@ -178379,7 +168871,6 @@ 414348524953 414348504951 4143484f4b49 -4143484d4544 414348494f55 414348494e54 414348494d36 @@ -178388,7 +168879,6 @@ 41434845434b 414348415453 414348414c4d -414348414c4d 414348414431 414348414348 4143474f4c44 @@ -178446,14 +168936,10 @@ 414344313233 41434357495a 414343535953 -4143434f554e 4143434f3132 41434348414e 414343455341 414343455334 -414343455054 -414343455054 -414343454e54 414343454445 414343453535 414343385448 @@ -178512,7 +168998,6 @@ 414252454335 414252414e4f 414252414e44 -414252414d53 414252414d41 414252414b41 414252414445 @@ -178533,7 +169018,6 @@ 41424f4f4449 41424f4e4531 41424f455249 -41424f415244 41424e595443 41424e455231 41424e424b4d @@ -178564,7 +169048,6 @@ 414249444148 414249414c41 414249313233 -414248545141 414248455252 414248455046 414248415944 @@ -178622,7 +169105,6 @@ 414243323032 414243313335 414243313237 -414243313233 414243313132 414243313038 41424259444f @@ -178639,7 +169121,6 @@ 414242494534 414242455959 414242455932 -414242455931 414242454152 414242433938 414242415449 @@ -178697,7 +169178,6 @@ 414231324333 414231324142 414231323638 -414231323334 414231323237 414231323132 414231303135 @@ -178716,19 +169196,12 @@ 414153484951 41415257594e 414152543132 -4141524f4e53 -4141524f4e53 -4141524f4e50 4141524f4e50 4141524f4e4c 4141524f4e41 -4141524f4e33 -4141524f4e32 -4141524f4e31 4141524e4945 414152494553 414152494349 -414152485553 414152454e44 41415052594c 41415052494c @@ -178738,7 +169211,6 @@ 41414f343634 41414e4e3932 41414e495441 -41414e495441 41414e493931 41414e474945 41414e445245 @@ -178766,7 +169238,6 @@ 414144444141 414144323544 414143484947 -41414348454e 414143435353 414143434545 414143414143 @@ -178778,7 +169249,6 @@ 414142313636 4141415a4141 414141545454 -414141535353 414141505050 414141454545 414141444544 @@ -178790,8 +169260,6 @@ 414141414136 414141413939 414141413938 -414141373737 -414141363636 414141363435 414141313030 414139313836 @@ -178823,7 +169291,6 @@ 414131414132 414131414131 414131393939 -414131393938 414131393931 414131393837 414131393836 @@ -178873,7 +169340,6 @@ 413742375337 413738353333 413737373741 -413737373737 413734393733 413732313438 413653414253 @@ -178885,25 +169351,21 @@ 413638353541 413636364545 413636363636 -413636363636 41363438324d 4136324d3734 413631333939 4135554c5531 -413541354135 41353834305a 413537353830 413535383939 413535373435 413535354141 -413535353535 413534343831 413534343541 413533373858 413532303242 413531473831 413531353042 -413454454348 413453414c45 413451443550 41344d454348 @@ -178929,12 +169391,10 @@ 413346344435 413345494c32 413342534b53 -413341334133 413339383741 413338373036 413333384a52 413333383131 -413333333333 413332334647 4133314c3432 41333130374d @@ -178949,7 +169409,6 @@ 413241524f4e 413241424344 413241334134 -413241324132 413241314132 413239373634 413239373041 @@ -178998,7 +169457,6 @@ 413141413141 413141393531 413141343434 -413141314131 413141303037 41313939384b 413139393441 @@ -179026,7 +169484,6 @@ 413134393044 413134373938 413133363636 -413133353739 413133333141 413133323135 413133313341 @@ -179042,7 +169499,6 @@ 413131323233 413131323232 413131314141 -413131313141 4131305a3530 413130504d54 413130373943 @@ -179396,7 +169852,6 @@ 393852395035 39384e364f4f 39384d453658 -39384b555044 393848554e47 39384841574b 393842363243 @@ -180867,7 +171322,6 @@ 384d55475359 384d51353247 384d4f4e4559 -384d4f4e4559 384d4a4b4431 384d37304e53 384d36543552 @@ -180909,7 +171363,6 @@ 38424d543352 384249524438 3842454c4c53 -3842414c4c53 384152454759 38414e565a33 38414b543458 @@ -182656,7 +173109,6 @@ 375134543657 37513441315a 3750595a3237 -375055535359 37505247364e 37504c453136 37504a354445 @@ -188650,8 +179102,6 @@ 353535353631 353535353557 35353535354f -353535353547 -353535353544 353535353543 353535353538 353535353533 @@ -190055,7 +180505,6 @@ 353132303032 3531314b4753 3531314b4556 -3531314b4556 353131393931 353131393838 353131393835 @@ -190134,8 +180583,6 @@ 353044494345 353044415953 353044323154 -353043454e54 -353043454e54 353042415253 353039393530 353039393131 @@ -190557,14 +181004,12 @@ 344348494348 34434845434b 344346343639 -3443414e4459 34425a313747 344255424241 34425249414e 344252454e54 344252415453 34424f593147 -34424f4f4b53 34424f4e4553 34424d354e42 34424a46374e @@ -190572,7 +181017,6 @@ 3442494c4c59 344241534943 3442414c4c53 -3442414c4c53 344156494539 344152524f57 34414e4a4938 @@ -194938,7 +185382,6 @@ 3333334a4a4a 333333474747 33333346554e -33333346554e 333333445543 333333444444 333333434152 @@ -196340,7 +186783,6 @@ 3254414e474f 325441313557 3253574f4c45 -325357454554 325355434544 3253544f5259 3253544f524d @@ -196447,7 +186889,6 @@ 324b4152454e 324b41464645 324b33504f4c -324b3350304c 324b324b324b 324a5a475445 324a4f555253 @@ -196472,14 +186913,12 @@ 324850414734 32484f545454 32484f544550 -32484f543455 32484f543436 32484f4c4553 32484b355944 324845494449 3248444d5346 324844314141 -324844314141 324842554e53 3248414e4453 324758345958 @@ -200061,7 +190500,6 @@ 32312d4a554e 32314a41434b 32314859314b -323147554e53 323147343232 323146524f47 3231444f5547 @@ -200721,7 +191159,6 @@ 323036303239 323036303030 3230354d4931 -323035475449 323035393230 323035383833 323035383131 @@ -201072,7 +191509,6 @@ 323030303234 323030303134 323030303033 -315a5a5a5a5a 315a514d3441 315a45544133 315a424c4e33 @@ -201081,7 +191517,6 @@ 315a34413751 315a32533345 315a32493341 -3159554b4f4e 315955494f50 315954535544 315954484f4e @@ -201107,12 +191542,10 @@ 31574f574f57 31574f524453 31574f4f4632 -31574f4f4459 31574f4f4453 31574f4d414e 31574f4c4631 31574d323531 -3157494e4753 3157494c4c49 315745525451 3157454e4459 @@ -201121,31 +191554,25 @@ 315745444745 315741564553 315741545453 -315741544552 315741544348 3157414e4441 -3157414c4c59 315733523559 315733513245 315733335731 3157324c395a 315732464741 315732333435 -31564f4c564f 3156494c4c41 3156494b4131 315649434b59 315646484e46 -315645545445 315645543132 -3156454e5553 315632563356 31563241334c 315631563156 315554545931 31554e494f31 31554e474552 -31554e444552 31554d4b494e 31554d425241 31554c465946 @@ -201154,14 +191581,11 @@ 315544494e45 3155385a4931 315459534f4e -315459534f4e 315455504143 315454595845 -315452555354 31545255454b 315452494b4f 31545249434b -31545249434b 315452455134 315452454531 315452415348 @@ -201182,14 +191606,12 @@ 31544943414c 315448525539 315448524545 -315448524545 315448494e4b 315448455245 315445535459 315445535432 315445535431 315445535341 -315445525259 315445525249 315445525241 315445444a4f @@ -201206,29 +191628,21 @@ 3153574f4f50 315357494e47 315357494e44 -315357454554 315357414d50 315357414445 -31535553414e 315355505241 315355474e41 315355434b41 315354554d50 315354554453 315354534f4e -3153544f4e45 3153544d4159 315354494d45 -31535449434b 31535445524e -315354455048 31535445454e 31535444414e -315354434156 -315354415254 315354414453 315354414359 -3153504f5254 31535045434b 31535045414b 31535041574e @@ -201244,46 +191658,37 @@ 31534e414552 31534d555454 31534d415254 -31534d415254 31534c49434b 31534c494345 31534c415348 31534b323430 3153494f5558 -3153494d4f4e 3153494d4241 3153494c4c59 315349454e41 315348544152 3153484f5753 3153484f5254 -3153484f4553 -3153484f434b 315348494c4f 315348455249 315348454550 315348454241 315348415250 -315348414e45 315345585859 315345583233 -31534556454e 315345545550 31534553414d 315345524b31 315345524745 -3153454e4e41 3153454d414a 315345424259 3153444d4f39 315343554241 315343524557 -3153434f5554 315341535359 3153414e5441 3153414e4b59 3153414c4d4f -315341444945 315341424c45 315341424552 31533241334d @@ -201298,9 +191703,7 @@ 31524f554748 31524f4e4e59 31524f4e424f -31524f4d454f 31524f4d414e -31524f434b53 31524f43434f 31524f414453 31524b464343 @@ -201320,14 +191723,12 @@ 315245414459 315242504c46 315241535441 -3152414e4459 3152414e4348 31524146414c 31515a325758 315157324552 315157323334 31515549434b -31515545454e 315155414b45 31515541494c 315152544b5a @@ -201339,14 +191740,11 @@ 3151415a5345 3151415a4342 315141575358 -315141325753 31513554394f 315132575a58 -315132513351 315131513257 315059335152 3150554d4241 -315052494d41 315052455353 31504f554e44 31504f524b59 @@ -201356,30 +191754,21 @@ 31504c555332 31504c41544f 31504c414345 -315049504552 3150494c4532 3150494c4531 -315049414e4f -3150484f4e45 -315048495348 3150474f4c44 315045524359 -315045505349 3150454d454c 31504544524f 315045414345 -315045414345 3150434d4143 315041554c41 -315041544348 315041535331 315041524953 315041504131 3150414e5a52 3150414e4943 3150414e4441 -315041494e54 -315041424c4f 315032503350 314f5a5a4945 314f5a4f4e45 @@ -201387,10 +191776,8 @@ 314f54544f31 314f5247414e 314f52454f31 -314f4f4f4f4f 314f4f354f4f 314f4e494f4e -314f4e494f4e 314f4e444552 314f4c4c4945 314f4c4c4548 @@ -201412,10 +191799,8 @@ 314e4954524f 314e494e4b59 314e494e4a41 -314e494e4a41 314e494d4f31 314e494c4553 -314e49474741 314e4944414e 314e49415341 314e45575454 @@ -201425,7 +191810,6 @@ 314e45543454 314e42524544 314e41535553 -314e414e4359 314e414e4349 314e41494c53 314e41444941 @@ -201441,11 +191825,9 @@ 314d4f525048 314d4f524934 314d4f504544 -314d4f4e5459 314d4f4e4b31 314d4f4b4b47 314d4f44454c -314d4f44454c 314d4f434841 314d4d454144 314d49535354 @@ -201463,7 +191845,6 @@ 314d45545241 314d45544f4f 314d454d4f52 -314d4547414e 314d45454b31 314d43494d45 314d43434f59 @@ -201471,20 +191852,14 @@ 314d41585858 314d4158494d 314d41525155 -314d4152494f -314d41524945 -314d41524941 314d41524745 314d4152434f -314d4152434f 314d41504c45 314d414e4741 314d414d4d59 314d414d4d41 314d414b4552 -314d414b4552 314d41494b32 -314d41474943 314d41444c59 314d41444557 314d41435249 @@ -201494,8 +191869,6 @@ 314d314d314d 314c594e4e42 314c554d5059 -314c4f564552 -314c4f554953 314c4f4f5345 314c4f4e4731 314c4f4d4158 @@ -201515,9 +191888,6 @@ 314c42564631 314c42465946 314c41594552 -314c41555241 -314c41534552 -314c41525259 314c414d4552 314c324b334a 314c3245334f @@ -201545,21 +191915,17 @@ 314b454c4c49 314b45463533 314b41524945 -314b4152454e 314b41504c41 314b414e4f4e 314b324f3353 314b314b314b 314a554c494f -314a554c4945 314a554c4532 314a4f524745 314a4f4e4153 314a4f494e54 314a4d434541 314a494e4a55 -314a494d4d59 -314a494d424f 314a494d424f 314a47415256 314a47344247 @@ -201569,8 +191935,6 @@ 314a41524f44 314a414e4f53 314a414e4e41 -314a41434f42 -314a41434b53 314a39443550 314a324a334a 314a32423347 @@ -201596,7 +191960,6 @@ 31484f4e4f52 31484f4d4531 31484f4d414e -31484f4c4c59 31484f415245 31484a564632 31484950504f @@ -201606,28 +191969,22 @@ 3148454c4552 314845494e5a 314845454c53 -314845415254 314845414c59 3148415a454c 314841574b53 314841544555 314841534c4f -314841525259 3148414e4459 3148414c4c4f 314841444553 3148344a4f4d 314755535441 3147554e5231 -31475549444f -314755455354 314755455353 314755445546 314753584236 3147524f544f 314752494e44 -31475245454e -31475245454b 314752415353 314752415045 31474f545031 @@ -201653,7 +192010,6 @@ 314735443443 314659444635 314655444745 -314655424152 3146524f5354 314652455941 314652414e43 @@ -201662,11 +192018,8 @@ 31464f4f5445 31464e4f5244 31464c59424f -31464c414d45 314649534859 -314649525354 314645574552 -3146454c4958 3146414e4359 3146324f3358 314559454331 @@ -201676,9 +192029,7 @@ 314552593432 3145524e5354 314552494b41 -314552494b41 31454e545259 -31454e544552 31454d52454d 31454d455448 31454c524943 @@ -201686,8 +192037,6 @@ 31454c494f54 314549474854 31454457494e -31454457494e -314544444945 314544434241 314541544552 314541525448 @@ -201702,7 +192051,6 @@ 314455544348 3144554b4531 314455464659 -314455434b53 314452554d53 3144524f4e4b 314452494e4b @@ -201713,9 +192061,7 @@ 31444f4f5253 314449564131 3144494e4b59 -3144494e4b59 3144494e4552 -3144494c444f 314449444954 314449434b59 314449414e45 @@ -201731,40 +192077,31 @@ 314445414431 314444444f54 314441574753 -314441574753 -314441564953 314441564559 314441564531 314441543739 314441524b32 31444152494e 3144414e5445 -3144414e4e59 3144414e4e4f 3144414e4931 3144414e4459 3144414d414e -3144414d414e -314441495359 314438463431 314435374332 31443338395a 31443249334d 314432453349 314432413347 -314359434c45 314356565656 314355524c59 -314352414947 314352414654 31435241434b 31434f555254 -31434f555254 31434f534d4f 31434f4f5253 31434f4e444f 31434f4e414e -31434f4e414e 31434f4e3233 31434f4c4f52 31434f434b53 @@ -201772,18 +192109,12 @@ 31434c454152 31434c415353 31434956494c -31434953434f 314349474152 -31434855434b 3143484f5045 3143484f4445 314348495053 -314348494e4f 314348494e41 -31434849434f -314348455659 314348454946 -31434845434b 314348415345 31434841524d 31434841524c @@ -201797,9 +192128,6 @@ 314341544859 314341535441 314341533842 -314341524c4f -314341524c41 -3143414e4459 314341494e45 314339364330 3143335a3258 @@ -201808,7 +192136,6 @@ 314331413345 31425a484359 31425954574f -314259524f4e 314258313131 31425643585a 314255545431 @@ -201825,13 +192152,11 @@ 31424f584552 31424f535331 31424f524953 -31424f4f5453 31424f4e5a4f 31424f4c4459 31424f444531 31424f444449 31424f424d45 -31424f424259 31424f423733 31424f415453 31424d58464d @@ -201841,20 +192166,16 @@ 31424c4f434b 31424c495353 31424c494e44 -31424c415354 31424c414e4b 31424a4f524e 314249524453 -3142494e474f 3142494c4c44 -3142494c424f 314249474531 314249473939 3142474f4e45 3142474c4731 314245545453 314245545359 -314245545359 314245544831 314245525459 314245525259 @@ -201870,7 +192191,6 @@ 31424152414b 3142414e4a4f 3142414c4f53 -3142414b4552 314241445252 314241444d46 314232433344 @@ -201882,7 +192202,6 @@ 314153545241 314153534131 314153484b45 -314153444647 314152544945 3141524d4f52 3141524b4552 @@ -201894,26 +192213,20 @@ 31414e4e4958 31414e4e4544 31414e474945 -31414e445245 31414d49474f 31414d494741 31414d494341 31414c56494e 31414c544132 31414c4c4945 -31414c4c4148 -31414c494345 31414c494153 31414c454e41 31414c414e31 31414c414345 314148504c41 3141484d4544 -314147474945 314147415445 -314144554c54 314144524541 -314144414d53 31414355535f 314143555241 3141434b4552 @@ -202891,7 +193204,6 @@ 3139314e4943 313931395249 313931394346 -313931394134 313931393638 313931393634 313931393630 @@ -205458,17 +195770,13 @@ 313335374a4c 313335374153 313335374143 -31333537395a 313335373959 313335373954 313335373953 -313335373953 -313335373951 31333537394e 313335373948 313335373946 313335373945 -313335373941 313335373933 313335373940 313335373921 @@ -206259,8 +196567,6 @@ 31323357494e 313233574859 313233574553 -313233574552 -313233565656 313233565656 313233564f4c 31323356494b @@ -206302,7 +196608,6 @@ 313233515157 313233515131 313233514554 -31323351415a 313233504f54 313233504f50 313233504f4f @@ -206360,7 +196665,6 @@ 313233464443 31323346414d 313233464144 -313233455751 313233455354 313233455241 313233455234 @@ -206393,7 +196697,6 @@ 313233423132 313233415a41 31323341534a -313233415344 313233414e59 313233414e4e 313233414d59 @@ -206401,7 +196704,6 @@ 31323341424f 31323341424b 313233414249 -313233414141 313233393938 313233393937 313233393930 @@ -206457,7 +196759,6 @@ 313233345955 313233345751 31323334534e -313233345348 313233345252 313233345245 313233345145 @@ -206486,11 +196787,6 @@ 313233344135 313233343735 313233343636 -313233343557 -313233343553 -313233343550 -31323334354f -31323334354e 313233343540 313233343521 31323334355f @@ -207629,15 +197925,12 @@ 313131323037 313131315941 313131315341 -313131315141 313131314f4b -313131314141 313131313432 313131313335 313131313237 313131313157 313131313156 -313131313151 31313131314e 31313131314a 313131313147 @@ -207765,7 +198058,6 @@ 31304d414b4f 31304b494444 31304b415453 -3130494e4348 3130484f4f54 313046495348 313045415a59 @@ -208523,14 +198815,12 @@ 3053424c504b 3052594f4b4f 305257454c4c -3052414e4745 3052414e4733 30504f4c4c4f 305049415433 305048414c31 305041434154 304f4b304f4b -304f39493855 304f39493749 304f35523151 304f30304f30 @@ -208562,7 +198852,6 @@ 30395a545045 303956495649 303951303951 -30394c4b4a48 303943593038 3039415a415a 303941324433 @@ -212616,13 +202905,11 @@ 252525252525 232323232323 7e7e7e7e7e7e -5a5a5a5a5a5a 5a5a5a5a5a54 5a5a5a5a5a41 5a5a5a5a5a36 5a5a5a5a5a35 5a5a5a5a5a33 -5a5a5a5a5a31 5a5a5a5a5858 5a5a5a5a5241 5a5a5a5a4445 @@ -212635,7 +202922,6 @@ 5a5a5a5a3033 5a5a5a595857 5a5a5a585a5a -5a5a5a585858 5a5a5a555555 5a5a5a555545 5a5a5a54594f @@ -212660,7 +202946,6 @@ 5a5a5a484848 5a5a5a474153 5a5a5a464742 -5a5a5a464742 5a5a5a455441 5a5a5a45524f 5a5a5a454b41 @@ -212671,8 +202956,6 @@ 5a5a5a414e48 5a5a5a414843 5a5a5a414441 -5a5a5a414141 -5a5a5a393939 5a5a5a383932 5a5a5a383838 5a5a5a363534 @@ -212704,7 +202987,6 @@ 5a5a58585a41 5a5a58585353 5a5a58584356 -5a5a58584343 5a5a58583030 5a5a58464242 5a5a58434358 @@ -212737,7 +203019,6 @@ 5a5a52473435 5a5a52414243 5a5a52364f55 -5a5a52363030 5a5a52323530 5a5a52313235 5a5a51544656 @@ -212746,7 +203027,6 @@ 5a5a50515144 5a5a504f5053 5a5a504a5544 -5a5a504a5544 5a5a50424e48 5a5a4f554b48 5a5a4f534f4f @@ -212759,7 +203039,6 @@ 5a5a4f454f4b 5a5a4e4a4c48 5a5a4d514948 -5a5a4d514948 5a5a4c4c5050 5a5a4c475341 5a5a4c455143 @@ -212779,8 +203058,6 @@ 5a5a47583157 5a5a47534447 5a5a46554f42 -5a5a46554f42 -5a5a46554f42 5a5a46455354 5a5a46393533 5a5a45595048 @@ -212818,7 +203095,6 @@ 5a5a41513132 5a5a41513131 5a5a41504f54 -5a5a41504f54 5a5a4150434f 5a5a41503031 5a5a414e5858 @@ -212896,7 +203172,6 @@ 5a5a31393835 5a5a31393834 5a5a31393831 -5a5a31393831 5a5a31393735 5a5a31393637 5a5a31393536 @@ -212992,7 +203267,6 @@ 5a59544e4f46 5a59544c4656 5a59544a5a44 -5a59544a5a44 5a5954484f53 5a5954484f4e 5a5954454b37 @@ -213038,7 +203312,6 @@ 5a594d335244 5a594c563635 5a594c555332 -5a594c545243 5a594c4f5247 5a594c4d3849 5a594c464941 @@ -213055,7 +203328,6 @@ 5a594b384651 5a594b384151 5a594a564648 -5a594a564648 5a594a535044 5a594a524a4b 5a594a513930 @@ -213089,9 +203361,7 @@ 5a59464a3839 5a5946485349 5a5946445644 -5a5946445644 5a594644434a -5a5946434e5a 5a5946384439 5a5946373839 5a5946373737 @@ -213102,20 +203372,14 @@ 5a5946313539 5a5945564b41 5a5945554e42 -5a5945554e42 -5a5945554e42 -5a5945554e42 -5a5945554e42 5a59454e4a41 5a59454b4d52 5a5945435246 5a5945434259 5a5945434252 -5a5945434252 5a5944525855 5a59444f544d 5a59444f5444 -5a594446484d 5a5944454c35 5a5944413333 5a5944383957 @@ -213183,7 +203447,6 @@ 5a5931303031 5a5930383239 5a585a5a585a -5a585a585a58 5a585a584356 5a585a583130 5a585a4a3256 @@ -213242,7 +203505,6 @@ 5a5852494659 5a5852435942 5a5852383138 -5a5852373530 5a5852303237 5a5852303138 5a5851575a58 @@ -213300,26 +203562,15 @@ 5a5846313233 5a5845504632 5a5845445544 -5a5845445544 5a5845434a48 5a584541575a 5a5845383738 -5a5844554d42 -5a5844554d42 -5a5844554d42 -5a5844554d42 -5a5844554d42 -5a5844554d42 -5a5844554d42 5a5844535945 5a5844474446 5a5844463139 5a5844353837 5a5844323334 5a58435a585a -5a58435a5843 -5a58435a5843 -5a58435a5843 5a5843593132 5a584358435a 5a5843584331 @@ -213339,21 +203590,14 @@ 5a5843564256 5a5843564253 5a5843564251 -5a584356424e -5a584356424e -5a584356424e 5a5843564248 5a5843564242 5a5843564241 5a5843564239 -5a5843564239 -5a5843564236 -5a5843563939 5a5843563939 5a5843563937 5a5843563931 5a5843563930 -5a5843563930 5a5843563839 5a5843563739 5a5843563738 @@ -213379,7 +203623,6 @@ 5a5843535353 5a5843535151 5a5843525459 -5a5843515745 5a5843515151 5a5843474142 5a5843465642 @@ -213387,8 +203630,6 @@ 5a5843464748 5a5843464453 5a5843455751 -5a5843445341 -5a5843445341 5a5843444647 5a5843444444 5a5843443351 @@ -213397,8 +203638,6 @@ 5a5843435632 5a5843425057 5a5843424e4d -5a5843415344 -5a5843415344 5a5843415331 5a5843414d42 5a5843413231 @@ -213435,7 +203674,6 @@ 5a5843313256 5a5843313241 5a5843313238 -5a5843313233 5a5843313038 5a5843313035 5a5843303730 @@ -213447,7 +203685,6 @@ 5a58424d5649 5a5842474c4c 5a5841575055 -5a5841535157 5a584153504f 5a5841534446 5a5841534433 @@ -213468,7 +203705,6 @@ 5a5839333531 5a5839313130 5a583930504c -5a5839303052 5a5838584d34 5a5838514b32 5a58384a444f @@ -213511,7 +203747,6 @@ 5a5834393236 5a5834383950 5a5834354e38 -5a5834354e38 5a5834353641 5a5834353637 5a5834353435 @@ -213569,7 +203804,6 @@ 5a5831323939 5a5831323538 5a583132335a -5a5831323334 5a5831323233 5a5831323231 5a5831314332 @@ -213592,14 +203826,11 @@ 5a575a575a57 5a575a565445 5a575a4e4543 -5a575a4e4543 5a575a4c4732 5a575957384a 5a575951394b 5a5759474a45 5a5759455248 -5a5759455248 -5a5759455248 5a5758544335 5a5758493447 5a5758314846 @@ -213612,7 +203843,6 @@ 5a575553454c 5a5755504631 5a5755463950 -5a5755434b49 5a5755363734 5a5755303538 5a57544c5255 @@ -213627,7 +203857,6 @@ 5a57524e4d46 5a57524a4446 5a5752475743 -5a5752475743 5a5752445044 5a5751485446 5a5751424954 @@ -213640,7 +203869,6 @@ 5a574f55495a 5a574f534644 5a574f4c4c45 -5a574f4c4c45 5a574f4c414b 5a574f484947 5a574f415945 @@ -213656,8 +203884,6 @@ 5a574b374844 5a574a584e51 5a574a514648 -5a574a514648 -5a574a514648 5a574a4f4255 5a574a464448 5a574a46434e @@ -213674,7 +203900,6 @@ 5a574655514d 5a57464e5433 5a5745524b49 -5a5745524745 5a5745524741 5a5745524735 5a5745524732 @@ -213700,11 +203925,6 @@ 5a5744445444 5a5744434948 5a5744345652 -5a5743554c42 -5a5743554c42 -5a5743554c42 -5a5743554c42 -5a57434b5147 5a57434b5147 5a5743343033 5a57424e4d35 @@ -213775,7 +203995,6 @@ 5a5650565536 5a5650545659 5a56504f524b -5a564f4e4b4f 5a564f4e4b41 5a564f4e3930 5a564f4c454e @@ -213825,7 +204044,6 @@ 5a5646323035 5a56455a4449 5a56455a4445 -5a56455a4441 5a5645544f4c 5a564552594f 5a5645525850 @@ -213835,7 +204053,6 @@ 5a5645524953 5a564552494b 5a5645524344 -5a5645524344 5a5645523936 5a5645523836 5a5645523830 @@ -213852,11 +204069,6 @@ 5a5643524a51 5a5643373132 5a5643323237 -5a5642554b42 -5a5642554b42 -5a5642554b42 -5a5642554b42 -5a5642554b42 5a5642515448 5a5642505639 5a56424b465a @@ -213930,8 +204142,6 @@ 5a5558495348 5a5558453138 5a5558445a45 -5a5558445a45 -5a5558445a45 5a5558343133 5a55575a5043 5a5557533743 @@ -213981,12 +204191,10 @@ 5a55524f4646 5a55524d414e 5a55524b4552 -5a55524b4552 5a5552495831 5a5552495733 5a555249544f 5a5552494e41 -5a555249474f 5a555249414e 5a5552493032 5a5552475554 @@ -214023,12 +204231,10 @@ 5a554f593546 5a554f544e45 5a554f343036 -5a554e5a554e 5a554e594b41 5a554e544954 5a554e54414e 5a554e4b4552 -5a554e494741 5a554e494341 5a554e493043 5a554e455641 @@ -214083,7 +204289,6 @@ 5a554c553737 5a554c553731 5a554c553730 -5a554c553639 5a554c553635 5a554c553535 5a554c553533 @@ -214098,9 +204303,7 @@ 5a554c553232 5a554c553159 5a554c553135 -5a554c553133 5a554c553036 -5a554c553031 5a554c553030 5a554c525553 5a554c52494e @@ -214108,14 +204311,12 @@ 5a554c4d4554 5a554c4d414e 5a554c4d4131 -5a554c4d4131 5a554c4c4f34 5a554c4c4941 5a554c4c4548 5a554c4c4545 5a554c4c3530 5a554c4b5146 -5a554c4b5146 5a554c4b4941 5a554c4a4948 5a554c495348 @@ -214154,7 +204355,6 @@ 5a554b413232 5a554b383059 5a554b303037 -5a554a4c5246 5a554a485358 5a554a445946 5a5549555a5a @@ -214168,16 +204368,12 @@ 5a5549413534 5a5548524142 5a5548514448 -5a5548514448 5a5548443932 5a5548424946 5a5548414952 -5a5548414952 -5a5548414952 5a5548414942 5a5548383936 5a5548323030 -5a55475a5547 5a5547595243 5a5547554d38 5a55474d414e @@ -214187,7 +204383,6 @@ 5a5547474759 5a5547455231 5a5547424f4c -5a5547414e47 5a5547343536 5a5547333733 5a5547313034 @@ -214256,8 +204451,6 @@ 5a5542495841 5a5542494e52 5a5542494e41 -5a5542494e41 -5a5542494c4f 5a5542494c41 5a5542494b49 5a5542494b5f @@ -214274,8 +204467,6 @@ 5a5542454645 5a5542454542 5a5542445244 -5a5542445244 -5a5542445244 5a554241524e 5a5542414b41 5a5542394b4e @@ -214286,9 +204477,6 @@ 5a5542303038 5a55415a3735 5a5541554a42 -5a5541554a42 -5a5541554a42 -5a5541554a42 5a5541504b4e 5a5541424935 5a5539454e34 @@ -214320,11 +204508,6 @@ 5a5531393833 5a5531324f50 5a5531323334 -5a545a544942 -5a545a544942 -5a545a544942 -5a545a544942 -5a545a544942 5a545a524b4d 5a545a4b5657 5a545a4b5531 @@ -214391,10 +204574,8 @@ 5a544b303037 5a544a544642 5a544a503559 -5a544a503559 5a544a4b3237 5a544a4a4f44 -5a544a4a4f44 5a544a435646 5a544a414658 5a544a393837 @@ -214408,7 +204589,6 @@ 5a5448385555 5a5448373638 5a5447515741 -5a5447515741 5a5447474352 5a5447464148 5a5447383939 @@ -214461,16 +204641,11 @@ 5a5430474757 5a535a4c5149 5a535a435044 -5a535a435044 -5a535a435044 -5a5359544842 -5a5359544842 5a5359535047 5a5359534e59 5a53594f4633 5a5358524656 5a53584a4b4c -5a5358444346 5a5358444341 5a5358434243 5a5358433131 @@ -214480,7 +204655,6 @@ 5a53565a5356 5a5356565743 5a5356544742 -5a5356544742 5a5356445845 5a5356323236 5a5356313532 @@ -214510,12 +204684,9 @@ 5a534f4e4a41 5a534f4d4249 5a534f4c5449 -5a534f4c5431 5a534e4b5044 5a534e495754 5a534e475343 -5a534e475343 -5a534e475343 5a534e455357 5a534d5f5549 5a534d495448 @@ -214540,7 +204711,6 @@ 5a5347323839 5a5346515641 5a5346514248 -5a5346514248 5a5346314848 5a534559524c 5a5345585351 @@ -214552,7 +204722,6 @@ 5a5345515358 5a5345515343 5a5345505744 -5a5345505744 5a53454d5456 5a5345465647 5a5345465642 @@ -214562,7 +204731,6 @@ 5a5345373533 5a53455f3730 5a5345345246 -5a5345345246 5a5345313539 5a5344535744 5a5344523534 @@ -214619,17 +204787,8 @@ 5a5259513554 5a52594e5641 5a5259434f44 -5a5259434f44 -5a5259434f44 5a5259313130 5a5258544742 -5a5258544742 -5a5258544742 -5a5258544742 -5a5258544742 -5a5258544742 -5a5258544742 -5a5258544742 5a5258534f47 5a5258514f47 5a52584e3545 @@ -214653,10 +204812,8 @@ 5a52544d4f44 5a52544d374f 5a5254454d48 -5a5254454d48 5a5240544153 5a5254393030 -5a5254383030 5a5253474950 5a5253363636 5a5253355533 @@ -214717,8 +204874,6 @@ 5a5248344152 5a52475a4452 5a5247485047 -5a5247485047 -5a5247485047 5a5246584a52 5a5246564650 5a52464b4858 @@ -214797,18 +204952,10 @@ 5a5158434e44 5a5158433748 5a5158424348 -5a5158424348 -5a5158424348 5a5158323632 5a515758585a 5a5157584153 5a5157583636 -5a5157544642 -5a5157544642 -5a5157544642 -5a5157544642 -5a5157544642 -5a5157544642 5a51574a4b47 5a5157414957 5a5157323438 @@ -214839,7 +204986,6 @@ 5a514e53484b 5a514d504131 5a514d4b5545 -5a514d4b5545 5a514c4e5243 5a514c483957 5a514c475143 @@ -214859,7 +205005,6 @@ 5a51464d4742 5a51464c5658 5a5146484f47 -5a5146484f47 5a5145535245 5a51454a4348 5a5145475644 @@ -214911,8 +205056,6 @@ 5a50584f4349 5a505747364f 5a5057424248 -5a5056544542 -5a5056544542 5a5056505358 5a5056333135 5a5055544432 @@ -214960,7 +205103,6 @@ 5a504c575841 5a504c54435a 5a504b4e5143 -5a504b4e5143 5a504b4d524f 5a504b494851 5a504b414536 @@ -215065,7 +205207,6 @@ 5a4f59413433 5a4f59413238 5a4f59413132 -5a4f59413132 5a4f59413131 5a4f59413130 5a4f59413034 @@ -215092,19 +205233,12 @@ 5a4f56415244 5a4f56394655 5a4f56305950 -5a4f555a4f55 5a4f55544f55 5a4f55544941 -5a4f55544442 -5a4f55544442 -5a4f55544442 -5a4f55544442 -5a4f55544442 5a4f55543730 5a4f55534f54 5a4f55524954 5a4f55504d48 -5a4f554c4f55 5a4f554c3434 5a4f554b4b49 5a4f554b4953 @@ -215127,7 +205261,6 @@ 5a4f54544f4c 5a4f5454414e 5a4f54524154 -5a4f5451304f 5a4f544f4646 5a4f544d414e 5a4f544c4f4c @@ -215182,13 +205315,9 @@ 5a4f52544342 5a4f52524f54 5a4f52524f52 -5a4f52524f39 5a4f52524f38 5a4f52524f36 5a4f52524f34 -5a4f52524f34 -5a4f52524f33 -5a4f52524f32 5a4f52524f30 5a4f52524f5f 5a4f52524b53 @@ -215239,13 +205368,11 @@ 5a4f52494f4e 5a4f52494e4f 5a4f52494e45 -5a4f52494e41 5a4f52494e35 5a4f52494c4f 5a4f52494b53 5a4f52494b38 5a4f52494348 -5a4f52494341 5a4f52474545 5a4f52474536 5a4f5247414e @@ -215258,7 +205385,6 @@ 5a4f52455837 5a4f52455831 5a4f52445445 -5a4f52445445 5a4f52444d56 5a4f52434859 5a4f52433636 @@ -215282,7 +205408,6 @@ 5a4f52414e32 5a4f52414b39 5a4f52414b34 -5a4f52414b31 5a4f52414941 5a4f52413037 5a4f52385053 @@ -215332,7 +205457,6 @@ 5a4f4f504f50 5a4f4f504841 5a4f4f504152 -5a4f4f504152 5a4f4f50414b 5a4f4f504141 5a4f4f503939 @@ -215351,7 +205475,6 @@ 5a4f4f4d4f4f 5a4f4f4d4b41 5a4f4f4d4954 -5a4f4f4d4552 5a4f4f4d4259 5a4f4f4d4241 5a4f4f4d4152 @@ -215363,7 +205486,6 @@ 5a4f4f4d3637 5a4f4f4d3536 5a4f4f4d3436 -5a4f4f4d3434 5a4f4f4d3432 5a4f4f4d3334 5a4f4f4d3333 @@ -215433,8 +205555,6 @@ 5a4f4e4e4e4e 5a4f4e4e4947 5a4f4e4b4945 -5a4f4e4b4552 -5a4f4e4b4544 5a4f4e4b4131 5a4f4e4b3635 5a4f4e4b3339 @@ -215466,7 +205586,6 @@ 5a4f4e453030 5a4f4e444f52 5a4f4e444943 -5a4f4e444552 5a4f4e444343 5a4f4e444153 5a4f4e44414b @@ -215498,7 +205617,6 @@ 5a4f4d504952 5a4f4d4f584f 5a4f4d4d4553 -5a4f4d494731 5a4f4d485442 5a4f4d473939 5a4f4d455235 @@ -215518,16 +205636,10 @@ 5a4f4d413837 5a4f4c545249 5a4f4c54494e -5a4f4c544152 -5a4f4c544152 -5a4f4c54414e 5a4f4c524f4e 5a4f4c4f5641 -5a4f4c4f544f 5a4f4c4f544b 5a4f4c4f4747 -5a4f4c4f4654 -5a4f4c4f4654 5a4f4c4f3735 5a4f4c4f3133 5a4f4c4f3132 @@ -215581,8 +205693,6 @@ 5a4f4b455253 5a4f4b41314f 5a4f4a544446 -5a4f4a544446 -5a4f4a544446 5a4f4a474f43 5a4f4a415f42 5a4f495a4f49 @@ -215635,7 +205745,6 @@ 5a4f45593231 5a4f45593136 5a4f45593135 -5a4f45593131 5a4f45593031 5a4f45544a45 5a4f4554495a @@ -215687,7 +205796,6 @@ 5a4f45313938 5a4f45313935 5a4f45313535 -5a4f45313233 5a4f45313232 5a4f45303037 5a4f45303030 @@ -215699,7 +205807,6 @@ 5a4f44494e41 5a4f44494b49 5a4f44494a41 -5a4f44494143 5a4f44484d47 5a4f4446395a 5a4f44445a4f @@ -215708,18 +205815,15 @@ 5a4f43573638 5a4f4352414d 5a4f4350524f -5a4f434b4552 5a4f4349414e 5a4f43484f52 5a4f43484952 5a4f43434f4c -5a4f43434f4c 5a4f43434849 5a4f43414e45 5a4f43413830 5a4f43413738 5a4f43413343 -5a4f425a4f42 5a4f42555247 5a4f42523534 5a4f42523230 @@ -215783,12 +205887,9 @@ 5a4e55525246 5a4e554b4552 5a4e55434b44 -5a4e55434b44 5a4e55343236 5a4e5459585a 5a4e54544342 -5a4e54544342 -5a4e54544342 5a4e54534b47 5a4e54383936 5a4e54373435 @@ -215798,7 +205899,6 @@ 5a2e4e515745 5a4e51544242 5a4e514e5642 -5a4e514e5642 5a4e51464c44 5a4e51445345 5a4e51374b30 @@ -215832,7 +205932,6 @@ 5a4e495a4e49 5a4e49594347 5a4e49544346 -5a4e49544346 5a4e49504552 5a4e494a5253 5a4e49433747 @@ -215935,7 +206034,6 @@ 5a4d5a2d3533 5a4d5a353131 5a4d5a343036 -5a4d5a343036 5a4d59595448 5a4d59504f4e 5a4d5856554e @@ -215954,9 +206052,6 @@ 5a4d54394750 5a4d54333333 5a4d53544242 -5a4d53544242 -5a4d53544242 -5a4d53544242 5a4d53433853 5a4d5338324d 5a4d53323837 @@ -215987,7 +206082,6 @@ 5a4d4f524531 5a4d4f4f5345 5a4d4f4f4e53 -5a4d4f44454d 5a4d4f363134 5a4d4f303037 5a4d4e564c59 @@ -216021,12 +206115,10 @@ 5a4d49434b31 5a4d49425548 5a4d49414e59 -5a4d49414e59 5a4d49413639 5a4d49373732 5a4d48594752 5a4d484e4346 -5a4d484e4346 5a4d484d5646 5a4d48474d43 5a4d48384342 @@ -216056,22 +206148,18 @@ 5a4d45493131 5a4d45475447 5a4d45455641 -5a4d45455641 5a4d45413232 5a4d444b4946 5a4d44343636 5a4d43573734 5a4d4354534a 5a4d43514444 -5a4d43514444 -5a4d43514444 5a4d43474545 5a4d4341534a 5a4d43413637 5a4d43394a59 5a4d424e5831 5a4d42484b47 -5a4d42484b47 5a4d42323838 5a4d42313335 5a4d41583639 @@ -216131,19 +206219,15 @@ 5a4d30315a45 5a4c5a4c5a4c 5a4c5a495847 -5a4c5a465248 5a4c5a435741 5a4c59554b41 5a4c59505547 -5a4c59505547 5a4c594f4b41 5a4c594e4348 5a4c59414b41 5a4c58525433 5a4c57415041 5a4c55514445 -5a4c55514445 -5a4c554f5248 5a4c554f5248 5a4c54594243 5a4c54523235 @@ -216153,10 +206237,6 @@ 5a4c53574f32 5a4c53554259 5a4c53455044 -5a4c52544142 -5a4c52544142 -5a4c52544142 -5a4c52544142 5a4c524a4c47 5a4c52363339 5a4c52353435 @@ -216190,7 +206270,6 @@ 5a4c4f45424f 5a4c4f445145 5a4c4f44494b -5a4c4f444559 5a4c4f424f56 5a4c4f424e49 5a4c4f373737 @@ -216326,17 +206405,10 @@ 5a4b53454142 5a4b53343635 5a4b52434844 -5a4b52434844 5a4b52425747 5a4b52345451 5a4b52313233 5a4b51545a41 -5a4b51545a41 -5a4b51545a41 -5a4b51545a41 -5a4b51545a41 -5a4b51545a41 -5a4b514a4547 5a4b514a4547 5a4b50564e42 5a4b50524f31 @@ -216473,15 +206545,9 @@ 5a4a51434744 5a4a51425647 5a4a515f3132 -5a4a50545941 -5a4a50545941 -5a4a50545941 -5a4a50545941 -5a4a50545941 5a4a504c494d 5a4a504b3738 5a4a504a4447 -5a4a504a4447 5a4a50453039 5a4a50335650 5a4a4f4e4553 @@ -216506,7 +206572,6 @@ 5a4a4b305a41 5a4a4a575842 5a4a4a465141 -5a4a4a465141 5a4a4a43424b 5a4a4a363337 5a4a4a323333 @@ -216545,7 +206610,6 @@ 5a4a35574932 5a4a35363436 5a4a34544e31 -5a4a34544e31 5a4a34513337 5a4a3353385a 5a4a3255575a @@ -216562,7 +206626,6 @@ 5a495a554544 5a495a553130 5a495a4f5536 -5a495a4f5531 5a495a4d414e 5a495a4c4552 5a495a4b4137 @@ -216596,15 +206659,12 @@ 5a4958545133 5a4958535645 5a4958474747 -5a4958474747 -5a4958474747 5a4958333235 5a4958313832 5a4957514442 5a4957494b49 5a4957353235 5a4956505247 -5a4956505247 5a4956494c49 5a4956455047 5a4955524b45 @@ -216629,8 +206689,6 @@ 5a49544b5448 5a4954493232 5a4954493131 -5a4954484552 -5a4954484552 5a4954454c49 5a4954454348 5a495441474f @@ -216670,7 +206728,6 @@ 5a4952464646 5a4952463131 5a4952453731 -5a4952453731 5a4952433133 5a4952424553 5a4952414641 @@ -216696,13 +206753,11 @@ 5a4950505353 5a4950505336 5a4950505059 -5a4950505050 5a4950504f5a 5a4950504f58 5a4950504f52 5a4950504f37 5a4950504f33 -5a4950504f31 5a4950504c45 5a4950504954 5a495050494e @@ -216721,17 +206776,14 @@ 5a49504f3034 5a49504e4152 5a4950495259 -5a4950494e41 5a4950493444 5a4950484952 5a4950483452 5a495047554e -5a495047554e 5a495046494c 5a4950464946 5a4950464552 5a495046454c -5a495046454c 5a4950455252 5a4950454d44 5a4950445544 @@ -216739,8 +206791,6 @@ 5a4950435554 5a495043554c 5a4950434644 -5a4950434644 -5a4950434644 5a4950434154 5a4950393835 5a4950383838 @@ -216762,17 +206812,9 @@ 5a4950323238 5a4950313432 5a4950313132 -5a4950313030 5a4950303632 5a494f5a494f 5a494f55474f -5a494f545841 -5a494f545841 -5a494f545841 -5a494f545841 -5a494f545841 -5a494f545841 -5a494f545841 5a494f534647 5a494f534446 5a494f53414e @@ -216791,7 +206833,6 @@ 5a494f4e3232 5a494f4e3131 5a494f4d4b49 -5a494f4d414c 5a494f4d3132 5a494f4c4f31 5a494f4b454b @@ -216829,7 +206870,6 @@ 5a494e4e4444 5a494e4e4154 5a494e4e3430 -5a494e4e3430 5a494e4e3230 5a494e4b4f56 5a494e4b454e @@ -216846,7 +206886,6 @@ 5a494e474f31 5a494e474c33 5a494e47494e -5a494e474552 5a494e473837 5a494e473533 5a494e473333 @@ -216863,7 +206902,6 @@ 5a494e415941 5a494e415449 5a494e414c4c -5a494e414944 5a494e413938 5a494e413935 5a494e413934 @@ -216932,7 +206970,6 @@ 5a494d413838 5a494d413834 5a494d413831 -5a494d413831 5a494d413734 5a494d413638 5a494d413630 @@ -216951,7 +206988,6 @@ 5a494d413038 5a494d413034 5e5a494d415e -5e5a494d415e 5a494d373337 5a494d343833 5a494d323132 @@ -216963,12 +206999,10 @@ 5a494c564941 5a494c554554 5a494c545741 -5a494c545741 5a494c54504b 5a494c544348 5a494c535a42 5a494c52554c -5a494c4f4c41 5a494c4e5142 5a494c4d5552 5a494c4c4f4e @@ -216991,7 +207025,6 @@ 5a494c323234 5a494c313537 5a494c313435 -5a494c313330 5a494c313031 5a494b594f48 5a494b555348 @@ -217007,7 +207040,6 @@ 5a494b495349 5a494b465249 5a494b454448 -5a494b454448 5a494b413639 5a494b413538 5a494b363636 @@ -217033,7 +207065,6 @@ 5a49475a5547 5a49475a4f47 5a49475a414b -5a49475a4147 5a4947555244 5a4947554c4b 5a4947554c49 @@ -217056,7 +207087,6 @@ 5a4947475933 5a4947474747 5a4947474552 -5a4947474552 5a4947474532 5a4947473131 5a4947464954 @@ -217074,7 +207104,6 @@ 5a4946534b49 5a4946524f4e 5a49464f5735 -5a49464e4142 5a4946474137 5a4946415f52 5a4946414e41 @@ -217105,7 +207134,6 @@ 5a49444f4e49 5a49444f4e31 5a49444e5945 -5a49444e5945 5a49444d5958 5a49444d4744 5a49444a4a44 @@ -217117,13 +207145,10 @@ 5a4944415353 5a4944415249 5a4944414e49 -5a4944414e45 -5a4944414e45 5a4944414e31 5a494441494e 5a4944413734 5a4944313838 -5a49435a4943 5a4943544245 5a49434f5a5a 5a49434f4244 @@ -217134,7 +207159,6 @@ 5a49434f3131 5a49434d454e 5a49434b4531 -5a49434b4531 5a49434b3931 5a494341524f 5a4943373037 @@ -217172,7 +207196,6 @@ 5a4924414a59 5a4941495245 5a4941474c38 -5a4941444d41 5a4941433534 5a4941425247 5a4941424c49 @@ -217233,7 +207256,6 @@ 5a48554d4152 5a48554c5941 5a48554c4b41 -5a48554c4b41 5a48554c4542 5a48554b5553 5a48554b3732 @@ -217283,18 +207305,12 @@ 5a484f484f56 5a484f444943 5a484f434544 -5a484f434544 5a484f425447 5a484f424259 5a484e554a4d -5a484e545741 -5a484e545741 -5a484e545741 -5a484e545741 5a484e4e3534 5a484d574745 5a484d4e4344 -5a484d4e4344 5a484d455346 5a484d435041 5a484c50514e @@ -217343,7 +207359,6 @@ 5a4845545449 5a4845544f59 5a48454e5141 -5a48454e4b41 5a48454e4a41 5a48454e4953 5a48454e494b @@ -217390,7 +207405,6 @@ 5a4841574935 5a4841535941 5a484153494b -5a484153494b 5a484153454d 5a4841524c59 5a4841524946 @@ -217400,8 +207414,6 @@ 5a4841524137 5a48414f3850 5a48414f3237 -5a48414e4e41 -5a48414e4b41 5a48414e4b41 5a48414e494d 5a48414e474c @@ -217412,7 +207424,6 @@ 5a48414e3131 5a48414d414c 5a48414c594e -5a48414c594e 5a48414c4c41 5a48414c4245 5a48414b5550 @@ -217421,7 +207432,6 @@ 5a48414b4149 5a48414b3733 5a4841494e41 -5a4841494e41 5a4841465249 5a484144414e 5a4841424b41 @@ -217461,7 +207471,6 @@ 5a4831393835 5a4831393834 5a4831393735 -5a4831393735 5a4831393732 5a4831393539 5a4831393534 @@ -217493,7 +207502,6 @@ 5a4756355734 5a475552555a 5a4755495347 -5a4755495347 5a475454524f 5a47544e3543 5a47544e3130 @@ -217524,14 +207532,8 @@ 5a474e404943 5a474e454d4d 5a474e434444 -5a474d545641 -5a474d545641 -5a474d545641 -5a474d545641 -5a474d545641 5a474d534447 5a474d313233 -5a474d313233 5a474c58534b 5a474c414253 5a474c384c51 @@ -217541,7 +207543,6 @@ 5a474b333533 5a474a595457 5a474a59535a -5a474a59425a 5a474a545541 5a474a4b3939 5a474a444c45 @@ -217571,8 +207572,6 @@ 5a47424a4844 5a4742485358 5a4742474743 -5a4742474743 -5a4742474743 5a4742373456 5a4742313233 5a4741544233 @@ -217594,7 +207593,6 @@ 5a4731303030 5a4730323231 5a465a465a46 -5a465a465a46 5a465a333235 5a465955544b 5a4659554b4b @@ -217638,7 +207636,6 @@ 5a464d313233 5a464c574857 5a464c564259 -5a464c545541 5a464c504448 5a464c4e3347 5a464c4a5a46 @@ -217653,7 +207650,6 @@ 5a464a444543 5a4649535337 5a46494e4e42 -5a46494e4e42 5a4649444f31 5a4649424a46 5a46484f4140 @@ -217661,7 +207657,6 @@ 5a46484e4548 5a46484a324f 5a4648454148 -5a4648454148 5a464758374d 5a464746475a 5a4647464746 @@ -217716,7 +207711,6 @@ 5a455a494e48 5a455a494e41 5a455a494644 -5a455a494644 5a455a454252 5a455a453636 5a455a453435 @@ -217739,7 +207733,6 @@ 5a4558583434 5a4558555353 5a4558544552 -5a4558544552 5a4558495248 5a4558445a41 5a455843484d @@ -217807,7 +207800,6 @@ 5a4555533537 5a4555533530 5a4555533437 -5a4555533435 5a4555533336 5a4555533237 5a4555533236 @@ -217817,7 +207809,6 @@ 5a4555533135 5a4555535f31 5a4555533036 -5a4555533034 5a4555525337 5a45554e4552 5a4555494e41 @@ -217831,12 +207822,10 @@ 5a4554544c45 5a4554544552 5a455454454c -5a455454454c 5a4554534954 5a4554524f4e 5a4554524f31 5a4554524958 -5a4554524958 5a4554504356 5a45544f554e 5a45544f3432 @@ -217849,7 +207838,6 @@ 5a4554485959 5a4554484f55 5a4554474347 -5a4554474347 5a4554455333 5a4554454c53 5a4554454334 @@ -217885,7 +207873,6 @@ 5a4554303235 5a4553585954 5a4553545931 -5a4553545931 5a4553545241 5a4553504f4c 5a45534e4f56 @@ -217918,7 +207905,6 @@ 5a45524f5355 5a45524f5046 5a45524f5030 -5a45524f4f4f 5a45524f4f4d 5a45524f4f4b 5a45524f4f48 @@ -217929,7 +207915,6 @@ 5a45524f4d41 5a45524f4c51 5a45524f4636 -5a45524f4553 5a45524f4544 5a45524f3939 5a45524f3938 @@ -217951,8 +207936,6 @@ 5a45524f304f 5a45524f3034 5a45524f3033 -5a45524f3031 -5a45524f3031 5a45524e494b 5a45524e4552 5a45524d4154 @@ -217983,7 +207966,6 @@ 5a4552454741 5a455242594a 5a4552425354 -5a4552425354 5a4552424553 5a4552415946 5a4552415757 @@ -218027,11 +208009,9 @@ 5a45504c594e 5a45504c4958 5a45504a414a -5a4550485952 5a4550485259 5a4550485241 5a4550484f4e -5a4550484f4e 5a4550484558 5a4550474e52 5a4550455452 @@ -218093,7 +208073,6 @@ 5a454e4e5935 5a454e4e5931 5a454e4d4549 -5a454e4d414e 5a454e4c4142 5a454e4b4f56 5a454e4b4f55 @@ -218137,7 +208116,6 @@ 5a454e454b41 5a454e454b36 5a454e454b32 -5a454e444552 5a454e44414f 5a454e444134 5a454e424f54 @@ -218148,7 +208126,6 @@ 5a454e414f4b 5a454e414e49 5a454e414e41 -5a454e414944 5a454e414249 5a454e414242 5a454e413534 @@ -218156,13 +208133,11 @@ 5a454e413133 5a454e413039 5a454e413036 -5a454e413036 5a454e373432 5a454e353236 5a454e353030 5a454e343333 5a454e343230 -5a454e343230 5a454e333734 5a454e315448 5a454e313433 @@ -218180,7 +208155,6 @@ 5a454d4f3830 5a454d4f3030 5a454d4e4f59 -5a454d4c5941 5a454d4c4a41 5a454d4c4934 5a454d4c4552 @@ -218231,14 +208205,12 @@ 5a454c494e45 5a454c494b31 5a454c494741 -5a454c494741 5a454c494646 5a454c494445 5a454c48414e 5a454c483030 5a454c454e4f 5a454c454e4d -5a454c454e49 5a454c454e47 5a454c454e31 5a454c454842 @@ -218247,14 +208219,11 @@ 5a454c44494e 5a454c44454e 5a454c444158 -5a454c444153 5a454c44414e 5a454c444142 5a454c444134 -5a454c444132 5a454c425245 5a454c425147 -5a454c425147 5a454c414e45 5a454c414e44 5a454c414941 @@ -218263,13 +208232,6 @@ 5a454c374c45 5a454c334441 5a454c313736 -5a454b545441 -5a454b545441 -5a454b545441 -5a454b545441 -5a454b545441 -5a454b545441 -5a454b545441 5a454b535459 5a454b524f42 5a454b524131 @@ -218287,7 +208249,6 @@ 5a454b455253 5a454b455250 5a454b454d4d -5a454b454d4d 5a454b454d43 5a454b453937 5a454b453839 @@ -218341,20 +208302,17 @@ 5a45494e495a 5a45494e4542 5a45494e4152 -5a45494e4142 5a45494e3835 5a45494e3637 5a45494d5538 5a45494d5249 5a45494c4943 -5a4549474552 5a4549444b48 5a454944494e 5a4549444552 5a4549444443 5a454942454c 5a4548545341 -5a4548545341 5a4548524953 5a4548524142 5a45484f4d36 @@ -218366,7 +208324,6 @@ 5a4548454b54 5a4548444a45 5a4548415553 -5a4548415553 5a4548413438 5a4548343539 5a4547495441 @@ -218390,7 +208347,6 @@ 5a4546334134 5a4546303230 5a45455a4f4f -5a45455a4545 5a4545585858 5a4545585154 5a4545564f53 @@ -218424,7 +208380,6 @@ 5a454547414e 5a4545464f44 5a4545464c41 -5a4545464c41 5a4545455241 5a4545434152 5a4545425542 @@ -218489,13 +208444,9 @@ 5a4542524553 5a4542524159 5a4542524158 -5a4542524153 -5a4542524153 5a4542524144 -5a4542524137 5a4542524135 5a4542524134 -5a4542524133 5a45424f5241 5a45424f5050 5a45424f3835 @@ -218511,8 +208462,6 @@ 5a4542454445 5a4542444148 5a4542435445 -5a4542435445 -5a4542435445 5a4542434f34 5a4542424953 5a454242414e @@ -218530,7 +208479,6 @@ 5a4541505341 5a45414f5453 5a45414e5553 -5a45414c4f54 5a4541444f47 5a4541443234 5a4541434f4e @@ -218643,13 +208591,8 @@ 5a444b383537 5a444b314c44 5a444a545341 -5a444a545341 -5a444a545341 -5a444a545341 -5a444a545341 5a444a4c5859 5a444a4a5846 -5a444a4a5846 5a444a484344 5a444a413239 5a44494e5943 @@ -218684,7 +208627,6 @@ 5a4445534a41 5a44454e5a5a 5a44454e4b4f -5a44454e4b41 5a44454e4953 5a44454e3232 5a4445484e50 @@ -218771,7 +208713,6 @@ 5a4354594a52 5a435459425a 5a4354585246 -5a4354524342 5a43544b4a4a 5a43544a5747 5a4354363536 @@ -218779,7 +208720,6 @@ 5a4353534649 5a4353445858 5a4352474147 -5a4352474147 5a4352414d49 5a4352343834 5a43514c4952 @@ -218791,7 +208731,6 @@ 5a434f51324a 5a434f4f4c5a 5a434f4f4c58 -5a434f4f4c58 5a434f4e5354 5a434f4d4e42 5a434f4c3031 @@ -218814,20 +208753,15 @@ 5a434b484146 5a434b455850 5a434a524746 -5a434a524746 5a434a4e5244 5a434a465246 5a434a454744 -5a434a454744 5a434a435a43 5a434a435946 5a434a394a51 5a434a363837 5a434a353642 5a4349584156 -5a4349545241 -5a4349545241 -5a4349545241 5a43494f5542 5a4348595050 5a43484c5945 @@ -218854,7 +208788,6 @@ 5a4346303637 5a4345525446 5a4345504145 -5a4345475448 5a4345423733 5a4345363334 5a4344553435 @@ -218949,7 +208882,6 @@ 5a4252363138 5a425057474f 5a4250494e47 -5a4250494e47 5a4250313839 5a4250313236 5a424f554259 @@ -218984,13 +208916,6 @@ 5a42494b5531 5a424941424e 5a4248575537 -5a4248545141 -5a4248545141 -5a4248545141 -5a4248545141 -5a4248545141 -5a4248545141 -5a4248545141 5a4248514241 5a42484a5646 5a424751324a @@ -219025,7 +208950,6 @@ 5a4243313233 5a42425a4832 5a4242464941 -5a4242464941 5a424158524c 5a424152554d 5a4241525259 @@ -219081,8 +209005,6 @@ 5a415a415a59 5a415a415a58 5a415a415a45 -5a415a415a41 -5a415a415a41 5a415a415641 5a415a415345 5a415a414f4e @@ -219121,7 +209043,6 @@ 5a41594b4153 5a41594b4139 5a41594b4138 -5a41594b4131 5a4159494e31 5a4159494b41 5a4159474558 @@ -219150,7 +209071,6 @@ 5a4159383838 5a4159313233 5a4159313133 -5a4158584f4e 5a4158584f31 5a415858494b 5a4158574152 @@ -219194,7 +209114,6 @@ 5a4157334f4f 5a41565a4156 5a4156554348 -5a4156545241 5a4156525553 5a4156525542 5a415652414e @@ -219246,7 +209165,6 @@ 5a41554c4152 5a4155494432 5a4155475845 -5a4155475845 5a4155474747 5a4155444939 5a4155433435 @@ -219271,7 +209189,6 @@ 5a41544f5441 5a41544f5231 5a41544f4b41 -5a41544f4b41 5a41544f3733 5a41544d414e 5a41544b494e @@ -219287,7 +209204,6 @@ 5a4154415649 5a4154415252 5a415441524b -5a4154415241 5a4154414845 5a4154373737 5a4154333637 @@ -219322,8 +209238,6 @@ 5a4153444658 5a4153444552 5a4153444458 -5a4153414441 -5a4153414441 5a4153343434 5a4153334b49 5a4153333635 @@ -219332,7 +209246,6 @@ 5a41525a4f52 5a41525a4f4f 5a41525a495a -5a41525a4152 5a41525a414e 5a41525a414c 5a4152594f50 @@ -219355,7 +209268,6 @@ 5a4152544943 5a4152544553 5a4152544348 -5a415254414e 5a4152534953 5a415253494f 5a4152534849 @@ -219397,10 +209309,8 @@ 5a4152495558 5a415249544f 5a4152495041 -5a4152494853 5a4152494343 5a4152494131 -5a4152494131 5a4152493130 5a4152484941 5a4152484935 @@ -219416,16 +209326,12 @@ 5a4152454736 5a4152454241 5a4152453445 -5a4152444f5a 5a415244454e 5a4152444444 5a4152434f51 5a415243415a 5a4152424f4f 5a415242454b -5a4152415a41 -5a4152415a41 -5a4152415445 5a4152415354 5a4152415353 5a4152415347 @@ -219453,24 +209359,18 @@ 5a4152413230 5a4152413139 5a4152413132 -5a4152413131 5a4152413130 5a4152413039 5a4152413038 5a4152413035 5a4152413034 -5a4152413031 5a4152363636 5a4152323030 5a4152313738 5a4152313637 5a41515a5843 5a4151594b4b -5a4151585357 -5a4151585357 5a4151584452 -5a4151575358 -5a4151575358 5a4151575257 5a4151574534 5a4151574153 @@ -219479,8 +209379,6 @@ 5a415155414e 5a4151534444 5a4151514531 -5a415151415a -5a415151415a 5a4151504f49 5a4151504c50 5a41514f4e49 @@ -219511,7 +209409,6 @@ 5a4151313335 5a4151313334 5a4151313332 -5a4151313233 5a4151313151 5a4151313035 5a4151313030 @@ -219535,7 +209432,6 @@ 5a4150504f4e 5a415050494f 5a4150504945 -5a4150504552 5a4150504144 5a4150504138 5a4150504132 @@ -219553,22 +209449,16 @@ 5a41504c3333 5a415049544f 5a4150485154 -5a4150484f44 5a4150484131 -5a4150483044 -5a4150475946 5a4150475946 5a415046494e 5a415046454e 5a415045534f 5a4150455232 -5a4150444f53 5a4150444248 5a4150415a41 -5a4150415a41 5a4150415944 5a4150415445 -5a4150415441 5a4150415359 5a4150415241 5a4150415155 @@ -219605,20 +209495,16 @@ 5a414e544941 5a414e544537 5a414e544152 -5a414e544143 -5a414e544143 5a414e544138 5a414e534952 5a414e534852 5a414e524f50 5a414e524154 -5a414e4f5a41 5a414e4f5844 5a414e4f564f 5a414e4f554b 5a414e4f5349 5a414e4f4e49 -5a414e4f4e49 5a414e4f4d49 5a414e4f4c4c 5a414e4f4b41 @@ -219654,7 +209540,6 @@ 5a414e48414f 5a414e474849 5a414e474655 -5a414e474152 5a414e47415f 5a414e473732 5a414e473137 @@ -219674,13 +209559,11 @@ 5a414e453035 5a414e445339 5a414e445255 -5a414e445241 5a414e445231 5a414e444f58 5a414e444f31 5a414e444942 5a414e444850 -5a414e444552 5a414e444153 5a414e44414d 5a414e44414c @@ -219691,7 +209574,6 @@ 5a414e41544f 5a414e415241 5a414e414e49 -5a414e414455 5a414e414245 5a414e413639 5a414e413132 @@ -219716,11 +209598,9 @@ 5a414d50494b 5a414d4f5441 5a414d4f5252 -5a414d4f5241 5a414d4f5232 5a414d4f4c4f 5a414d4f4b4b -5a414d4f4b4b 5a414d4f4b41 5a414d4f4b37 5a414d4f4b31 @@ -219751,7 +209631,6 @@ 5a414d424f31 5a414d424c41 5a414d424945 -5a414d424941 5a414d424931 5a414d424545 5a414d424154 @@ -219778,7 +209657,6 @@ 5a414c564938 5a414c555050 5a414c55504f -5a414c555041 5a414c544558 5a414c544152 5a414c52344c @@ -219791,7 +209669,6 @@ 5a414c4c4157 5a414c495a41 5a414c494e45 -5a414c494e41 5a414c494d5a 5a414c494d41 5a414c494d35 @@ -219850,7 +209727,6 @@ 5a414b49525a 5a414b495245 5a414b495241 -5a414b495241 5a414b494159 5a414b483130 5a41244b4754 @@ -219920,7 +209796,6 @@ 5a41494e5931 5a41494e4f4e 5a41494e4e55 -5a41494e4b41 5a41494e4545 5a41494e4542 5a41494e4241 @@ -219985,7 +209860,6 @@ 5a41484b4956 5a41484b4952 5a4148495241 -5a4148495241 5a4148495231 5a4148494c41 5a4148494557 @@ -219993,8 +209867,6 @@ 5a4148485559 5a414845454e 5a4148454431 -5a4148415641 -5a4148415241 5a4148415231 5a4148415230 5a4148414449 @@ -220008,23 +209880,13 @@ 5a4147594341 5a4147564338 5a4147555931 -5a4147545041 -5a4147545041 -5a4147545041 -5a4147545041 -5a4147545041 -5a4147545041 -5a4147545041 -5a4147545041 5a4147524f53 5a4147524f4a 5a4147524953 -5a4147524542 5a4147524159 5a4147524149 5a41474f554c 5a41474f5245 -5a41474f5241 5a41474f5231 5a41474f4e41 5a41474f4d45 @@ -220080,7 +209942,6 @@ 5a4145434841 5a4145433638 5a4145433132 -5a4145433132 5a4145424c49 5a4145423535 5a4145423133 @@ -220095,7 +209956,6 @@ 5a4144544f41 5a4144544733 5a4144534552 -5a4144524f54 5a4144524f4e 5a4144524f4d 5a4144524f44 @@ -220106,7 +209966,6 @@ 5a41444f4b4b 5a41444f4a41 5a41444f4646 -5a41444f434b 5a41444e4943 5a41444e4552 5a41444e4158 @@ -220149,7 +210008,6 @@ 5a41434b5831 5a41434b5241 5a41434b4c45 -5a41434b4945 5a41434b4559 5a41434b4544 5a41434b4531 @@ -220157,7 +210015,6 @@ 5a41434b434b 5a41434b4331 5a41434b424f -5a41434b3938 5a41434b3937 5a41434b3838 5a41434b3737 @@ -220186,8 +210043,6 @@ 5a4143484854 5a4143484557 5a4143484554 -5a414348454d -5a4143483939 5a4143483937 5a4143483933 5a4143483930 @@ -220203,7 +210058,6 @@ 5a4143483333 5a4143483239 5a4143483238 -5a4143483238 5a4143483233 5a4143483230 5a4143483136 @@ -220279,7 +210133,6 @@ 5a4142415649 5a414241524b 5a4142414c41 -5a4142414c41 5a414241444f 5a4142414255 5a4142414141 @@ -220542,7 +210395,6 @@ 5a3737413552 5a3737374156 5a3737373737 -5a3737373737 5a3736554845 5a3736324655 5a37355a5a41 @@ -220694,7 +210546,6 @@ 5a3535373831 5a3535363738 5a3535355a35 -5a3535353535 5a3535343531 5a353455334f 5a3534485533 @@ -220893,7 +210744,6 @@ 5a325a335331 5a32585a3258 5a3258334334 -5a3258334334 5a3258325944 5a3257323536 5a3256444b31 @@ -220970,7 +210820,6 @@ 5a323236325a 5a323233305a 5a323232325a -5a3232323232 5a3231413958 5a3231393933 5a3231393630 @@ -221010,7 +210859,6 @@ 5a3151325733 5a3150504f4f 5a3150504552 -5a3150504552 5a3150504544 5a3150503145 5a3150354345 @@ -221049,9 +210897,7 @@ 5a3141394937 5a3141393030 5a3141345137 -5a3141325133 5a3141324833 -5a3141315131 5a313939385a 5a5f31393937 5a2e31393935 @@ -221107,7 +210953,6 @@ 5a3133414348 5a3133373133 5a3133353939 -5a3133353739 5a3133353636 5a3133345245 5a3133333033 @@ -221125,7 +210970,6 @@ 5a3132334544 5a313233344e 5a313233344c -5a3132333435 5a3132333333 5a3132333132 5a313232344b @@ -221158,7 +211002,6 @@ 5a3050474f56 5a304f325957 5a304e4b4552 -5a304e4b4552 5a304e443352 5a304d424945 5a304d424933 @@ -221166,7 +211009,6 @@ 5a304d422133 5a304d423145 5a304d414152 -5a304d315231 5a304c305430 5a304c304654 5a304b414f43 @@ -221253,9 +211095,6 @@ 595a55525843 595a554a4145 595a55475a43 -595a55475a43 -595a55475a43 -595a55475a43 595a5534514d 595a54373333 595a53415956 @@ -221293,17 +211132,10 @@ 595a48415457 595a47475548 595a47445744 -595a47445744 -595a47445744 595a47373841 -595a46554f42 -595a46554f42 -595a46554f42 -595a46554f42 595a46523731 595a462d5231 595a464b5447 -595a464b5447 595a46464255 595a46443157 595a46343530 @@ -221336,10 +211168,8 @@ 595a36474b37 595a35514f42 595a35344c4d -595a34353046 595a34334d58 595a34323646 -595a34323646 595a34303031 595a32593748 595a32504a59 @@ -221402,7 +211232,6 @@ 595954544e46 595954525556 595954475943 -595954475943 595954434e49 595954424946 595954343636 @@ -221470,16 +211299,10 @@ 595946464345 595946363553 595946323433 -595945554e42 -595945554e42 -595945554e42 -595945554e42 -595945554e42 595945545650 595945383835 595944504148 5959444f5444 -5959444f5444 5959444e4942 595943534f44 5959434f544c @@ -221492,7 +211315,6 @@ 5959414e4445 5959414d4141 595941425843 -595941425843 595941424f4d 595941415353 595939343234 @@ -221535,8 +211357,6 @@ 595930303730 59585a563853 59585a455348 -59585a455348 -59585a455348 59585a425957 59585a393837 59585a393135 @@ -221563,7 +211383,6 @@ 595854363137 595853575636 5958534a5944 -5958534a5944 595853373655 595852524338 595852485157 @@ -221603,20 +211422,12 @@ 595845454643 59584544575a 595845445544 -595845445544 595845434a48 595845373734 595844593442 595844564643 -595844554d42 -595844554d42 -595844554d42 -595844554d42 -595844554d42 -595844554d42 5958444a4856 595843574552 -59584356424e 595843564236 595843564231 595843563935 @@ -221630,7 +211441,6 @@ 595841554c42 5958414f4643 5958414e4941 -5958414c4147 5958394a5636 59583936344b 59583935504f @@ -221731,8 +211541,6 @@ 595744474256 595744445444 595744434948 -595743554c42 -595743554c42 595743544a47 595743415343 5957424e514e @@ -221769,7 +211577,6 @@ 595730303730 595659525757 5956594e4443 -5956594e4443 5956584e5836 595658495843 595658494445 @@ -221780,7 +211587,6 @@ 595656323738 5956555a3458 5956554d4d48 -5956554d4d48 595655425343 5956544e4645 595654454e32 @@ -221796,8 +211602,6 @@ 595652383435 595652313233 595651544b46 -595651544b46 -595651544b46 595651414253 595650485346 59564f554e55 @@ -221820,7 +211624,6 @@ 59564b575058 59564b4b4352 59564b485447 -59564b485447 59564b433850 59564b313233 59564a4a4848 @@ -221862,12 +211665,8 @@ 595643482a41 595643445344 595643353132 -595642554b42 -595642554b42 -595642554b42 595642553159 5956424b5047 -5956424b5047 595642464e52 595641533932 595641524f56 @@ -221960,14 +211759,12 @@ 595554414e49 595554414c4b 595554414c41 -595554414b41 595554414849 595554414531 595554414241 595554413931 595554413738 59555431354b -595553554b45 595553554655 59555355464e 59555355464b @@ -222029,7 +211826,6 @@ 5955524b454e 5955524b3733 59555249594c -595552495931 59555249545a 59555249534e 595552495249 @@ -222131,7 +211927,6 @@ 59554e54494c 59554e53454f 59554e4f5354 -59554e4f4e41 59554e4e414e 59554e4d414e 59554e4a5539 @@ -222183,14 +211978,10 @@ 59554d4e554d 59554d4e414d 59554d4d595a -59554d4d5959 59554d4d5937 59554d4d5936 -59554d4d5931 -59554d4d4d59 59554d4d4559 59554d4d4545 -59554d4d4545 59554d4d4159 59554d4d3339 59554d4d3333 @@ -222228,12 +212019,8 @@ 59554c4b4b45 59554c4b4139 59554c495a43 -59554c495941 -59554c495941 59554c495932 59554c495553 -59554c495553 -59554c495441 59554c49514e 59554c494e31 59554c494b41 @@ -222266,7 +212053,6 @@ 59554b53454c 59555f4b5f53 59554b4f5241 -59554b4f4e53 59554b4f4e4a 59554b4f4e47 59554b4f4e42 @@ -222328,8 +212114,6 @@ 5955494f504c 5955494f504b 5955494f5034 -5955494f5031 -5955494f5030 5955494f3234 595549494157 595549393232 @@ -222341,7 +212125,6 @@ 595548553534 59554853494e 5955484b4c4e -5955484a4e4d 595548484848 595548415445 595548344135 @@ -222357,9 +212140,7 @@ 5955474c3033 59554749594f 595547495331 -595547494f48 595547424154 -595547414e47 595547414d41 595547393531 595547373135 @@ -222368,7 +212149,6 @@ 595547303648 595546554b55 59554649434b -595546464945 595546313738 595545575430 595545564a53 @@ -222381,7 +212161,6 @@ 595545313233 595544534134 5955444f4b4b -595544494e41 595544494646 595544424f48 595544414e49 @@ -222408,18 +212187,11 @@ 595542454c33 595542454557 595542445244 -595542445244 -595542445244 595542424c45 595542424945 595542415741 595542383838 595541594950 -595541554a42 -595541554a42 -595541554a42 -595541554a42 -595541554a42 5955414e5441 5955414e4c49 5955414e4655 @@ -222490,8 +212262,6 @@ 595530333131 595530303039 59545a544942 -59545a544942 -59545a544942 59545a323530 595459545555 595459543532 @@ -222504,7 +212274,6 @@ 595459363844 595459323030 595458465444 -595458465444 5954574e4243 5954574b4a44 595457483152 @@ -222536,10 +212305,8 @@ 5954544f5453 5954544f5031 5954544f4e53 -5954544f4353 595454494b31 595454464142 -595454464142 595454455250 595454455053 595454414631 @@ -222551,7 +212318,6 @@ 595453555235 595453555232 595453555231 -595453555231 5954534e5144 5954534d494e 5954534c5244 @@ -222571,12 +212337,9 @@ 595452484a59 595452484252 595452464748 -595452455a41 -595452455751 595452455741 595452455341 595452455157 -595452455157 595452454c46 595452454747 595452453332 @@ -222599,19 +212362,14 @@ 59544f4a5544 59544f484955 59544f475443 -59544f475443 59544f384445 59544f333537 59544e554f43 -59544e54554a 59544e544343 59544e4f3134 59544e485146 -59544e485146 -59544e485146 59544e465152 59544e455754 -59544e455754 59544e454742 59544e453839 59544e433133 @@ -222628,7 +212386,6 @@ 59544b5a3136 59544b544852 59544b4d5246 -59544b4d505a 59544b4b5a36 59544b4b425a 59544b495943 @@ -222650,7 +212407,6 @@ 5954494d4e45 5954494a324a 595449485247 -595449485247 595449475241 595449454e42 59544944444f @@ -222723,7 +212479,6 @@ 595441473630 595441455254 595441445144 -595441445144 595441444e49 595441353635 595438323247 @@ -222759,14 +212514,9 @@ 595430313037 59535a545147 59535a435044 -59535a435044 59535a424548 595359583441 595359575633 -595359544842 -595359544842 -595359544842 -595359544842 5953594e4752 595358533458 595358375746 @@ -222785,7 +212535,6 @@ 595355435355 595354593456 595354524144 -5953544d3130 5953544c3634 595354494e4f 595354494e49 @@ -222918,7 +212667,6 @@ 595331393236 595331383750 595331373439 -595331373439 595331373038 595331343137 595331323135 @@ -222936,11 +212684,6 @@ 595259525936 595259525646 595259434f44 -595259434f44 -595258544742 -595258544742 -595258544742 -5952584a4c47 5952584a4c47 5952574d4830 595257463835 @@ -222955,7 +212698,6 @@ 595255473555 595255464154 595255445745 -595255445745 595255444a4d 595255444a42 595255415050 @@ -222970,7 +212712,6 @@ 595254425055 595254414e4f 5952534d4c44 -5952534d4c44 595253414730 59525257564f 595252554d42 @@ -222981,7 +212722,6 @@ 595252455046 595252454b31 595252454a38 -595252454a31 595252454753 59525241484c 595252414848 @@ -223030,7 +212770,6 @@ 5952484a4141 595247544858 595247485047 -595247485047 595246595246 595246235359 5952464c4941 @@ -223077,7 +212816,6 @@ 59524132494d 595241313630 595241313233 -595241313233 595241313231 595241303132 595239463237 @@ -223108,17 +212846,12 @@ 595230313238 59515a343737 595158525546 -595158525546 595158485955 595158434e44 595158383433 595158375a35 595158325548 595157544642 -595157544642 -595157544642 -595157544642 -595157544642 595157535345 5951574d4647 5951574a4b47 @@ -223149,7 +212882,6 @@ 595150303146 59514e553933 59514e434646 -59514e434646 59514e373335 59514d4d3937 59514d383237 @@ -223173,14 +212905,11 @@ 5951464b4e42 595146494a48 595146484f47 -595146484f47 -595146484f47 59514551444f 595145485349 59514538412a 59514456494f 595144515a47 -595144515a47 595144484149 595144394452 59514432524f @@ -223210,11 +212939,6 @@ 595058334d59 595058303839 595057353236 -595056544542 -595056544542 -595056544542 -595056544542 -5950564a4a47 5950564a4a47 59505642434e 59505636584e @@ -223231,7 +212955,6 @@ 595053543344 59505349594f 595053445545 -595053445545 59505343514e 59505342514e 595053313233 @@ -223246,15 +212969,12 @@ 595050505041 595050504948 5950504f5031 -5950504f5031 5950504d5347 595050495342 -595050494b53 595050473439 595050415243 595050414c53 59504f50434b -59504f4f4e53 59504f4f4853 59504f353230 59504e433850 @@ -223269,9 +212989,7 @@ 59504b494d36 59504b475043 59504a484d46 -59504a484d46 59504a333832 -595049544552 595048484247 595047333753 5950464b5132 @@ -223330,7 +213048,6 @@ 594f5a363139 594f59554d4f 594f59553031 -594f594f594f 594f594f5941 594f594f4f4b 594f594f4b4e @@ -223375,24 +213092,14 @@ 594f56434c44 594f56414e49 594f56413537 -594f55594f55 594f55585858 -594f5557494e -594f5557494e 594f55574552 594f55574153 594f55574152 594f55553531 594f55553232 -594f5554574f -594f55544f4f 594f55544f31 594f55544845 -594f55544831 -594f55544442 -594f55544442 -594f55544442 -594f55544442 594f55535558 594f55535352 594f55535338 @@ -223435,14 +213142,9 @@ 594f554e4754 594f554e4750 594f554e474f -594f554e474a 594f554e4748 -594f554e4747 594f554e4743 -594f554e4742 594f554e4739 -594f554e4737 -594f554e4731 594f554e4153 594f554e4148 594f554c4f56 @@ -223452,7 +213154,6 @@ 594f554c414d 594f554b4956 594f554a4947 -594f554a4947 594f554a4552 594f55494e43 594f55494d45 @@ -223472,12 +213173,10 @@ 594f55444f32 594f55443735 594f55434538 -594f5543414e 594f55425554 594f55425537 594f55425442 594f55415344 -594f55415245 594f55414e54 594f55413438 594f55393231 @@ -223528,7 +213227,6 @@ 594f534b4150 594f53494e35 594f53494d49 -594f53494d49 594f53494b49 594f53494741 594f53494531 @@ -223537,14 +213235,11 @@ 594f53485541 594f53484e4a 594f53484958 -594f5348494f -594f5348494d 594f53484948 594f53484944 594f53484943 594f53484942 594f53484933 -594f53484931 594f53483933 594f53483639 594f53483630 @@ -223566,7 +213261,6 @@ 594f52553230 594f5254454c 594f52544342 -594f52544342 594f52543235 594f52543039 594f52525851 @@ -223587,8 +213281,6 @@ 594f524b5041 594f524b4c45 594f524b494d -594f524b4945 -594f524b4945 594f524b4831 594f524b4539 594f524b4531 @@ -223600,7 +213292,6 @@ 594f52494f4e 594f52494b4f 594f52494b49 -594f5249434b 594f52494337 594f5247554e 594f5247494e @@ -223633,11 +213324,9 @@ 594f4f59454b 594f4f544841 594f4f505941 -594f4f504552 594f4f503939 594f4f503639 594f4f503130 -594f4f4f4f4f 594f4f4e4953 594f4f4e4841 594f4f4e3937 @@ -223651,7 +213340,6 @@ 594f4f4b414c 594f4f4b4149 594f4f4a4f45 -594f4f484f4f 594f4f484559 594f4f484159 594f4f474945 @@ -223686,7 +213374,6 @@ 594f4e494747 594f4e494655 594f4e493639 -594f4e493639 594f4e493633 594f4e493236 594f4e475355 @@ -223756,7 +213443,6 @@ 594f4c4b494e 594f4c495053 594f4c49454a -594f4c49454a 594f4c494156 594f4c493938 594f4c493739 @@ -223767,16 +213453,13 @@ 594f4c454441 594f4c444153 594f4c434446 -594f4c434446 594f4c425249 -594f4c414e44 594f4c413438 594f4c303738 594f4b594f50 594f4b594f4b 594f4b55544c 594f4b554e49 -594f4b4f5441 594f4b4f534f 594f4b4f4e4f 594f4b4f4849 @@ -223816,14 +213499,12 @@ 594f4a364242 594f49594f49 594f49484c46 -594f49434849 594f49424933 594f4941425a 594f49363330 594f48544131 594f484f4e31 594f484f4c49 -594f484f484f 594f484f3639 594f484f3233 594f484f3139 @@ -223838,8 +213519,6 @@ 594f4752455a 594f47524547 594f474f4441 -594f47495441 -594f47494e49 594f47494e45 594f47494e36 594f47494d41 @@ -223885,7 +213564,6 @@ 594f46535558 594f464b4b46 594f46495443 -594f46495443 594f46495348 594f46435459 594f4643534c @@ -223896,8 +213574,6 @@ 594f45534954 594f45524947 594f45514644 -594f45514644 -594f45514644 594f454d414e 594f454c5649 594f454c4245 @@ -223936,23 +213612,16 @@ 594f44413836 594f44413738 594f44413735 -594f44413735 594f44413733 594f44413636 594f44413535 594f44413435 594f44413434 -594f44413434 -594f44413434 594f44413338 594f44413335 594f44413234 -594f44413234 594f44413135 594f44413133 -594f44413133 -594f44413131 -594f44413130 594f44413036 594f44413033 594f44413032 @@ -223963,7 +213632,6 @@ 594f434f4d4f 594f434b454c 594f434a4148 -594f434a4148 594f4348414e 594f43484149 594f43454e41 @@ -223972,7 +213640,6 @@ 594f4259414a 594f42594142 594f42593130 -594f42574f43 594f42564153 594f42555a5a 594f42535341 @@ -223992,8 +213659,6 @@ 594f4247494d 594f4245454e 594f42444f47 -594f42444142 -594f42444142 594f42424f31 594f42424945 594f4233554e @@ -224002,12 +213667,10 @@ 594f41563132 594f41525345 594f41505344 -594f41505344 594f414e4e41 594f414e4441 594f414d4f54 594f414c4545 -594f414b414d 594f41493232 594f41434d57 594f41434244 @@ -224046,7 +213709,6 @@ 594f31383035 594f31343536 594f31333337 -594f31323334 594f31313132 594f31303335 594f30383139 @@ -224067,21 +213729,14 @@ 594e555a4948 594e5554344f 594e5553494b -594e5553494b 594e55534558 594e5552344b 594e55473530 594e55434b44 -594e55434b44 -594e55434b44 594e5543494b 594e55425a47 -594e55425a47 594e55425856 594e55324f57 -594e54544342 -594e54544342 -594e54544342 594e54525342 594e544a4847 594e54453639 @@ -224105,7 +213760,6 @@ 594e4f544c43 594e4f544142 594e4f543939 -594e4f543639 594e4f543535 594e4f543432 594e4f543335 @@ -224128,7 +213782,6 @@ 594e4e4e4144 594e4e49564b 594e4e494b53 -594e4e484f4a 594e4e455044 594e4e454c47 594e4e454c31 @@ -224151,7 +213804,6 @@ 594e4a444846 594e4a394b45 594e49564552 -594e49564552 594e4954415a 594e49525432 594e49515545 @@ -224160,8 +213812,6 @@ 594e4845314a 594e48375138 594e47574949 -594e47574945 -594e47574945 594e47564945 594e47564553 594e47564545 @@ -224188,7 +213838,6 @@ 594e45434846 594e44555949 594e44514544 -594e44514544 594e444a4944 594e44395447 594e44383630 @@ -224264,7 +213913,6 @@ 594d54383834 594d53575842 594d53544242 -594d53544242 594d53504b48 594d534c3945 594d53433131 @@ -224286,11 +213934,9 @@ 594d4f4e3233 594d4f474d43 594d4f454848 -594d4f454848 594d4f444f43 594d4f44454d 594d4f414c43 -594d4f414c43 594d4f345250 594d4f344b41 594d4f313734 @@ -224341,7 +213987,6 @@ 594d484d5646 594d48474d43 594d47594d47 -594d47484a46 594d47343330 594d47335837 594d4649544c @@ -224396,7 +214041,6 @@ 594d30333739 594c5a384149 594c59505547 -594c59505547 594c59453834 594c59414e41 594c59413334 @@ -224417,7 +214061,6 @@ 594c53495431 594c53494147 594c53434944 -594c52544142 594c52534947 594c52414c31 594c52414843 @@ -224568,7 +214211,6 @@ 594b54414743 594b5354424f 594b53494857 -594b53494857 594b53493131 594b53425642 594b53355355 @@ -224576,15 +214218,10 @@ 594b53313232 594b524f5050 594b52434844 -594b52415053 594b5241494e 594b52414853 594b52353733 594b51545a41 -594b51545a41 -594b51545a41 -594b51545a41 -594b51534847 594b51534847 594b51383735 594b50574746 @@ -224750,12 +214387,6 @@ 594a52415446 594a52363133 594a515a5859 -594a50545941 -594a50545941 -594a50545941 -594a50545941 -594a50545941 -594a50545941 594a5050464b 594a504c4842 594a504b5045 @@ -224772,8 +214403,6 @@ 594a4e425231 594a4e373947 594a4d545841 -594a4d545841 -594a4d545841 594a4d4d5344 594a4d4d494a 594a4d4c504f @@ -224821,11 +214450,9 @@ 594a464b4e45 594a46494643 594a45545945 -594a45545945 594a45505049 594a454a4f48 594a454a4b44 -594a454a4b44 594a45433956 594a45425445 594a44564658 @@ -224846,7 +214473,6 @@ 2e594a434e42 594a434a5230 594a434a4453 -594a434a4446 594a43454b4d 594a43425242 594a43313938 @@ -224891,7 +214517,6 @@ 5949594f5555 594959453031 594958474747 -594958474747 594958473658 594958455542 594958385a48 @@ -224919,7 +214544,6 @@ 594954504f57 5949544f4e47 594954464b48 -594954424f53 594954423532 594954323936 59495353454c @@ -224943,7 +214567,6 @@ 594950505931 59495050484f 594950504552 -594950504545 5949504f5559 5949504d414e 59495049594f @@ -224952,19 +214575,12 @@ 594950444f47 594950434644 594950425547 -594950425547 -59494f545841 -59494f545841 -59494f545841 -59494f545841 -59494f545841 59494f545841 59494f534c4f 59494f534647 59494f4f4945 59494f4c4b47 59494f4a4347 -59494f4a4347 59494f493952 59494f464453 59494f354d5a @@ -224991,8 +214607,6 @@ 59494d35564e 59494d323132 59494c545741 -59494c545741 -59494c545741 59494c4f4c41 59494c4d3630 59494c4c5245 @@ -225004,7 +214618,6 @@ 59494b455334 59494b455321 59494b454448 -59494b454448 59494a594954 59494a59494a 59494a523343 @@ -225015,7 +214628,6 @@ 59494a394435 594949525741 594949474356 -594949465041 594948514b53 5949484f4e47 5949484e4644 @@ -225064,7 +214676,6 @@ 594941594931 594941555355 594941534f55 -5949414e4e49 594941473232 594941323139 594938564441 @@ -225091,7 +214702,6 @@ 59485a554939 59485a504b4f 59485a464f47 -59485a464f47 5948595a4b53 594859564f42 594859484d43 @@ -225148,16 +214758,9 @@ 59484f4d5256 59484f4b4b49 59484f434544 -59484f434544 -59484f434544 -59484f425447 59484f425447 59484f424259 59484e554842 -59484e545741 -59484e545741 -59484e545741 -59484e544742 59484e544158 59484e4f3650 59484e4e4859 @@ -225178,14 +214781,12 @@ 59484d434643 59484b545641 59484b4e5042 -59484b4e5042 59484b444d45 59484a574152 59484a54594a 59484a524854 59484a4d4353 59484a474843 -59484a474843 59484a454348 59484a364d30 594849574255 @@ -225206,7 +214807,6 @@ 594847345853 59484652434a 592e48464946 -592e48464946 594845575931 594845505451 594845475941 @@ -225279,7 +214879,6 @@ 5947564f4950 594756494a4e 594756474547 -594756474547 594756424855 594756353537 594756313233 @@ -225292,7 +214891,6 @@ 594754573349 594754524244 594754505047 -594754505047 594754445347 594754425248 594754395a50 @@ -225324,7 +214922,6 @@ 59474e41374d 59474e363243 59474d545641 -59474d545641 59474d504548 59474d4a4147 59474d48544d @@ -225395,7 +214992,6 @@ 59465a585349 59465a584831 59465a535944 -59465a535944 59465a475547 59465a474346 59465a455558 @@ -225431,7 +215027,6 @@ 59465547314f 594655465931 594655465444 -594655465444 594655464e4a 594655464b46 59465532554e @@ -225468,7 +215063,6 @@ 59464e465938 59464e46564a 59464e464e46 -59464e464b5a 59464e464b53 59464e464b4d 59464e464b46 @@ -225487,10 +215081,7 @@ 59464e463237 59464e463236 59464e463235 -59464e463235 59464e463232 -59464e454b5a -59464e45435a 59464e434252 59464e424946 59464e323031 @@ -225506,7 +215097,6 @@ 59464c5a3239 59464c5a3237 59464c5a3236 -59464c5a3236 59464c5a3235 59464c5a3231 59464c5a3134 @@ -225515,15 +215105,6 @@ 59464c5a3130 59464c545946 59464c545852 -59464c545541 -59464c545541 -59464c545541 -59464c545541 -59464c545541 -59464c545541 -59464c545541 -59464c545541 -59464c545541 59464c545444 59464c545231 59464c544b4d @@ -225556,7 +215137,6 @@ 594649564548 594649543030 5946494e4e42 -5946494e4e42 5946494b5459 594649444b45 594649425546 @@ -225576,7 +215156,6 @@ 594648465a59 594648465946 594648463137 -594648454e4a 594648454e46 594648454148 594648453937 @@ -225589,7 +215168,6 @@ 594647535255 59464748544b 594647464b56 -594647464b56 594647455942 594647424e4a 594647424945 @@ -225597,10 +215175,8 @@ 594647373737 59464735484f 594647343532 -594647343532 594646555431 594646554e53 -594646554e53 594646554c46 594646554231 59464649544c @@ -225613,7 +215189,6 @@ 594646353138 594646333037 5946455a5a54 -594645564a44 594645544347 594645514137 594645454d45 @@ -225630,13 +215205,11 @@ 594643564652 59464354575a 59464353434e -5946434e5a5a 5946434e5a57 5946434e5a4e 5946434e5a44 5946434e5a35 5946434e5a32 -5946434e5a31 5946434e5a30 5946434e5459 5946434e2e49 @@ -225644,7 +215217,6 @@ 5946434d4e5a 5946434c4652 594643444651 -594643444651 594643435545 594643425646 594643414842 @@ -225660,7 +215232,6 @@ 5946414e4743 5946414e3833 5946414d4f46 -59464146595a 594641373236 594639445558 594639313231 @@ -225681,12 +215252,9 @@ 594630393231 59455a5a4952 59455a535445 -59455a535445 59455a4f4c42 59455a47494b 59455a464543 -59455a464543 -59455a464543 594559594559 594559585841 594559553031 @@ -225711,15 +215279,12 @@ 594557393631 594557353439 594556524150 -594556524148 -594556524148 594556524147 594556505837 5945564f4842 5945564d494e 5945564a4146 594556484a43 -594556484a43 59455648454e 594556454c43 594556415045 @@ -225733,9 +215298,7 @@ 5945554c4241 594555495a43 594555454d31 -594555454d31 594555424550 -594555414e48 594555393134 59455532524e 594554593931 @@ -225759,7 +215322,6 @@ 594554415a54 594554313131 594553594554 -594553594553 594553593136 594553585858 594553574152 @@ -225777,10 +215339,8 @@ 59455353494b 59455353494a 594553534945 -594553534943 594553534937 594553534558 -594553534558 594553534542 594553534341 59455353414d @@ -225799,20 +215359,15 @@ 5945534e4f44 5945534e4f34 5945534e4f31 -5945534e4f31 5945534d4f4d 5945534d4958 5945534d4545 -5945534d414e -5945534d414d 5945534c5556 5945534c4554 5945534b4131 594553494431 594553494341 59455349414e -59455349414d -59455349414d 594553494134 594553494131 594553493433 @@ -225824,7 +215379,6 @@ 594553475542 594553474141 594553463435 -594553454e49 594553454d4d 594553454c4d 594553454854 @@ -225844,7 +215398,6 @@ 594553393939 594553384e4f 594553383838 -594553373737 594553363734 594553363431 594553344c46 @@ -225856,8 +215409,6 @@ 594553313938 594553313533 594553313234 -594553313233 -594553313233 594553313131 594553313030 594552594559 @@ -225877,12 +215428,10 @@ 5945524d414c 5945524d414b 5945524d4149 -5945524c414e 594552494e47 594552464134 594552454d59 594552454c49 -594552444e41 594552424557 594552415949 594552414c32 @@ -225905,14 +215454,12 @@ 59454f52324a 59454f4e4f4b 59454f4d4f4e -59454f4d414e 59454f4a4438 59454f363034 59454f353737 59454f323432 59454f313131 59454e59494e -59454e59454e 59454e594152 59454e574f52 59454e57454e @@ -225950,9 +215497,7 @@ 59454e46414f 59454e455231 59454e454342 -59454e444f52 59454e444f47 -59454e444953 59454e444557 59454e444152 59454e434f49 @@ -225971,7 +215516,6 @@ 59454d455453 59454d454c42 59454d424131 -59454d415941 59454d414e45 59454d373636 59454d373238 @@ -225985,12 +215529,10 @@ 59454c54554d 59454c544f4d 59454c534f4d -59454c53454c 59454c525550 59454c525543 59454c525542 59454c524f4d -59454c524148 59454c50494e 59454c50454c 59454c504544 @@ -226002,14 +215544,12 @@ 59454c4c5554 59454c4c5543 59454c4c4f59 -59454c4c4f57 59454c4c4f53 59454c4c4f4f 59454c4c4f43 59454c4c4e4f 59454c4c4e34 59454c4c4939 -59454c4c4552 59454c4c4547 59454c4c4157 59454c4c4156 @@ -226017,55 +215557,40 @@ 59454c4c414d 59454c4c414a 59454c4c4132 -59454c4c4132 -59454c4c4131 59454c4c4131 59454c4c3938 59454c4c3535 59454c4c3132 59454c4b454e -59454c4b414f 59454c49545a 59454c495231 59454c494e41 59454c494d53 59454c494148 -59454c494142 59454c474144 59454c474142 -59454c454e41 59454c45454b 59454c45444f -59454c445544 59454c444952 59454c444553 59453b4c4259 59454c424953 59454c424944 59454c42434e -59454c42434e 59454c414d54 59454c363839 59454b5a4257 59454b59454b 59454b574f4c -59454b545441 -59454b545441 -59454b545441 -59454b545441 -59454b545441 -59454b545441 59454b534f4b 59454b52414d 59454b4e4f50 -59454b4e4f44 59454b4e454b 59454b4c414f 59454b4b5932 59454b4b454e 59454b464c59 59454b434f52 -59454b434f48 59454b434957 59454b43494e 59454b43414d @@ -226088,7 +215613,6 @@ 594548594131 594548564649 594548545341 -594548545341 594548544f4d 5945484f4555 5945484d5a59 @@ -226145,11 +215669,7 @@ 5945454b554b 5945454b494d 594545484545 -594545484157 -594545484157 594545484148 -594545484141 -594545484141 594545464c41 594545454545 59454545444f @@ -226166,7 +215686,6 @@ 59454447554e 594544464f54 594544454c32 -594544454c32 594544444554 594544434843 594544415247 @@ -226223,10 +215742,8 @@ 594541483435 594541483137 594541483130 -594541474552 594541474152 594541465332 -594541444f4e 594541444557 594541424459 594541424142 @@ -226294,7 +215811,6 @@ 594452534c42 5944524a5657 594452495047 -594452495047 594452494854 594451584c4c 594451504741 @@ -226312,7 +215828,6 @@ 59444e4f4c42 59444e47535a 2459444e4559 -59444e415242 59444e415241 59444e414341 59444e413137 @@ -226329,9 +215844,6 @@ 59444b425047 59444b375734 59444b303331 -59444a545341 -59444a545341 -59444a545341 59444a514137 59444a4e5442 59444a4b3531 @@ -226356,7 +215868,6 @@ 594446534651 5944464a5548 594446455947 -594446455947 594446454e47 59444558434d 594445524634 @@ -226387,7 +215898,6 @@ 5944414c4553 5944414c4548 5944414c434d -594441434841 594441414749 594441373839 594441353830 @@ -226451,11 +215961,6 @@ 59434a544147 59434958554f 594349545241 -594349545241 -594349545241 -594349545241 -594349545241 -594349545241 594349505841 5943494a4d35 594349473856 @@ -226528,7 +216033,6 @@ 594259463836 594259463736 594259463533 -594259454b5a 59425945435a 594259425145 59425942434d @@ -226543,7 +216047,6 @@ 594257494344 594257464243 594257435543 -594257435543 594256535544 59425652494b 594256484a4c @@ -226565,9 +216068,7 @@ 594253415a55 59425338445a 5942524a5645 -5942524a4b5a 5942524a4b53 -5942524a4b46 5942524a3531 594252484558 594252484258 @@ -226584,9 +216085,7 @@ 594252463131 594252463035 594252454b5a -594252434a59 594252425946 -594252424e46 594252424a59 594252424946 594252423234 @@ -226604,7 +216103,6 @@ 594252313030 594251574154 594251475a46 -594251475a46 594251434257 59425054444a 594250524251 @@ -226645,14 +216143,9 @@ 594249434e49 594249425955 594248595058 -594248545141 -594248545141 -594248545141 -594248545141 594248494e35 594248353432 5942474e5743 -5942474e5743 59424748564a 594247473536 59424744484b @@ -226691,7 +216184,6 @@ 594241524245 594241515956 5942414b4552 -594241425546 59424142454d 594241423838 594241303536 @@ -226721,13 +216213,11 @@ 59415a5a5931 59415a5a5858 59415a5a5555 -59415a5a4945 59415a555a41 59415a554b49 59415a535846 59415a4f4f38 59415a4f4f31 -59415a4f4f31 59415a3f4d43 59415a4d4154 59415a4d414e @@ -226742,10 +216232,7 @@ 59415a414a49 59415a343250 59415a333133 -59415a333133 59415a303038 -594159594159 -594159594159 594159553636 5941594f5531 5941594f535a @@ -226760,7 +216247,6 @@ 594159455253 594159454341 59415941594f -594159415941 594159415552 594159415459 594159415441 @@ -226796,9 +216282,6 @@ 59415756444e 594157535353 594157534553 -594157534553 -594157524f4e -594157524f4e 594157524f4e 594157505959 5941574f4e41 @@ -226838,7 +216321,6 @@ 594156495344 594156494e45 594156494e36 -594156494e34 594156464143 594156455355 594156454c41 @@ -226875,7 +216357,6 @@ 594154494c47 594154494552 594154474552 -594154455353 594154455344 594154455341 594154455339 @@ -226924,7 +216405,6 @@ 594153494d4f 594153494b49 594153485649 -594153485541 594153484d41 594153484b49 594153484947 @@ -226939,7 +216419,6 @@ 594153455241 594153455238 594153454730 -59415345454e 594153434946 594153434152 59415343414e @@ -226961,8 +216440,6 @@ 59415254594d 59415254454e 594152534848 -59415252554d -59415252554d 59415252454e 59415252414e 594152524131 @@ -226986,7 +216463,6 @@ 594152495341 594152495338 594152495331 -594152495331 594152494d41 594152494c41 594152494b49 @@ -226996,7 +216472,6 @@ 594152494748 59415249454c 59415249434b -59415249434b 594152494348 59415249414d 594152474a52 @@ -227060,8 +216535,6 @@ 59415049534d 594150484554 594150475946 -594150475946 -594150475946 594150464d39 594150445446 594150364351 @@ -227072,7 +216545,6 @@ 59414f4c5941 59414f4a494e 59414f494d47 -59414f494d47 59414f493639 59414f455447 59414f454349 @@ -227092,7 +216564,6 @@ 59414e544933 59414e544554 59414e544153 -59414e544152 59414e53494b 59414e534845 59414e53454c @@ -227106,7 +216577,6 @@ 59414e4f4232 59414e4f3136 59414e4e494b -59414e4e4943 59414e4e4938 59414e4e4937 59414e4e4932 @@ -227117,7 +216587,6 @@ 59414e4e3435 59414e4e3034 59414e4d4552 -59414e4d4152 59414e4c4f4c 59414e4c414d 59414e4b5953 @@ -227125,7 +216594,6 @@ 59414e4b5552 59414e4b554b 59414e4b5355 -59414e4b5353 59414e4b5352 59414e4b5347 59414e4b5336 @@ -227143,7 +216611,6 @@ 59414e4b3437 59414e4b3434 59414e4b3232 -59414e4b3232 59414e4b3135 59414e4b3134 59414e4b3133 @@ -227152,19 +216619,14 @@ 59414e495645 59414e495635 59414e495631 -59414e495441 -59414e495441 59414e495354 59414e495345 59414e495341 59414e495331 59414e495245 -59414e494e41 -59414e494e41 59414e494c37 59414e49494b 59414e494531 -59414e494348 59414e49414e 59414e493931 59414e493031 @@ -227185,7 +216647,6 @@ 59414e473333 59414e473231 59414e473131 -59414e473131 59414e464c55 59414e463132 59414e455a53 @@ -227233,10 +216694,8 @@ 59414e414445 59414e413936 59414e413934 -59414e413934 59414e413933 59414e413931 -59414e413931 59414e413838 59414e413837 59414e413835 @@ -227251,7 +216710,6 @@ 59414e413333 59414e413332 59414e413235 -59414e413235 59414e413233 59414e413231 59414e413230 @@ -227264,12 +216722,10 @@ 59414e413033 59414e393258 59414e344b53 -59414e34494b 59414e323338 59414e323030 59414e314b53 59414e313938 -59414e313938 59414e313435 59414e313233 59414e303037 @@ -227322,8 +216778,6 @@ 59414d424f31 59414d415841 59414d415741 -59414d415741 -59414d415441 59414d415252 59414d415241 59414d415236 @@ -227333,15 +216787,12 @@ 59414d414e44 59414d414d4f 59414d414d4d -59414d414d45 59414d414c4f 59414d414c31 59414d414a41 59414d41484f -59414d414841 59414d414834 59414d414741 -59414d414441 59414d413833 59414d413336 59414d413130 @@ -227405,7 +216856,6 @@ 59414c453537 59414c453236 59414c453133 -59414c453131 59414c45304a 59414c435241 59414c434d33 @@ -227417,7 +216867,6 @@ 59414c414459 59414c413034 59414c313233 -59414b555a41 59414b555348 59414b555034 59414b555031 @@ -227433,7 +216882,6 @@ 59414b4f5354 59414b4f4259 59414b4f4255 -59414b4e4f57 59414b4c414b 59414b4b5935 59414b4b4f31 @@ -227446,7 +216894,6 @@ 59414b455459 59414b455231 59414b454c49 -59414b454c49 59414b454553 59414b45454d 59414b453830 @@ -227508,7 +216955,6 @@ 594148484f4f 594148454544 594148435843 -594148435843 594148425555 594148424f59 594148424545 @@ -227521,15 +216967,6 @@ 594148303030 594147594147 594147585a44 -594147554152 -594147545041 -594147545041 -594147545041 -594147545041 -594147545041 -594147545041 -594147545041 -594147545041 594147544f4e 594147535846 594147525554 @@ -227555,7 +216992,6 @@ 594147415941 594147415931 594147415255 -594147414d49 594146524f4c 594146503132 594146494c55 @@ -227588,9 +217024,7 @@ 594144524945 5941444f5243 5941444f4d41 -5941444e5553 5941444c4a45 -594144495246 594144494747 594144494741 59414449454c @@ -227622,7 +217056,6 @@ 594143485459 594143485443 594143485432 -594143485431 594143484952 59414348494e 59414348494b @@ -227924,7 +217357,6 @@ 593735574156 593735504d59 593735355932 -593735355932 593735344158 5937344b4945 593734485a51 @@ -228146,7 +217578,6 @@ 59335037564c 59334e444142 59334c4c3357 -59334c4c3357 59334c4c3057 59334b555a33 59334b525a59 @@ -228358,7 +217789,6 @@ 593132334e44 593132334441 593132333459 -593132333435 593132324b4d 593131474f4a 593131393753 @@ -228427,7 +217857,6 @@ 585a58563335 585a58513354 585a58484543 -585a58484543 585a58415741 585a58394d41 585a58393333 @@ -228488,9 +217917,6 @@ 585a47445744 585a47323454 585a47303153 -585a46554f42 -585a46554f42 -585a46554f42 585a464b5447 585a45515655 585a45504555 @@ -228562,12 +217988,10 @@ 585a30323038 58595a5a5939 58595a5a5933 -58595a5a5931 58595a5a5858 58595a5a3030 58595a585a58 58595a574552 -58595a504451 58595a4d5450 58595a494a4b 58595a47484c @@ -228581,9 +218005,7 @@ 58595a435647 58595a434241 58595a414345 -58595a414243 58595a414234 -58595a393837 58595a383538 58595a373836 58595a373738 @@ -228596,7 +218018,6 @@ 58595a333438 58595a333335 58595a333333 -58595a333231 58595a323735 58595a323538 58595a323341 @@ -228605,7 +218026,6 @@ 58595a315a59 58595a313250 58595a313234 -58595a313233 58595a313131 58595a313031 58595a303938 @@ -228618,7 +218038,6 @@ 585959394638 585959384d54 585959343539 -585958595859 585958595832 585958593535 585958525831 @@ -228704,10 +218123,6 @@ 585946475149 585946464345 585946434e5a -585945554e42 -585945554e42 -585945554e42 -585945554e42 585945545647 585945544141 585945515748 @@ -228779,7 +218194,6 @@ 585931354751 58593132335a 585931323334 -585931323334 585930494a43 585930343631 58585a5a5959 @@ -228795,14 +218209,9 @@ 5858585a5a43 5858585a5a32 5858585a4151 -585858595959 585858595932 585858595135 585858585a31 -585858585858 -585858585858 -585858585858 -58585858584c 585858585848 585858585832 2d5858585858 @@ -228860,8 +218269,6 @@ 5858584d4d42 5858584d454c 5858584d4150 -5858584d414e -5858584d414e 5858584c564e 5858584c4f55 5858584c4f48 @@ -228884,7 +218291,6 @@ 585858465242 585858464542 585858455331 -585858455331 58585845524e 585858454c41 585858454545 @@ -228903,7 +218309,6 @@ 585858424d58 585858424947 585858415544 -585858415353 585858415241 585858414d59 585858414d31 @@ -228915,7 +218320,6 @@ 585858374559 585858373839 585858373738 -585858373737 585858373435 585858373238 585858373133 @@ -228930,7 +218334,6 @@ 585858353259 585858343738 585858343536 -585858343434 585858343332 585858343231 585858343132 @@ -228939,8 +218342,6 @@ 585858333531 585858333435 585858333433 -585858333333 -585858333231 585858324342 585858323534 585858323437 @@ -228956,14 +218357,12 @@ 585858313238 585858313235 585858312d32 -585858313131 585858313035 585858303938 585858303637 585858303438 585858303337 585858303039 -585858303039 585857554a37 58585752314b 585857484745 @@ -228984,7 +218383,6 @@ 5858534a5343 58585347594d 585853475843 -585853475843 585853415348 58585341444f 585853363739 @@ -228992,7 +218390,6 @@ 585853344142 585852543438 585852485546 -585852485546 585852474b54 585852415953 585852373730 @@ -229006,19 +218403,15 @@ 5858504f524e 5858504c4f44 5858504b3437 -585850494353 585850455041 585850313344 585850303050 58584f554931 58584f544552 -58584f4f5858 58584f4f4d4d 58584f4f3639 58584f495955 58584f494344 -58584f494344 -58584f494344 58584f485737 58584f463032 58584f393132 @@ -229033,7 +218426,6 @@ 58584d4d4141 58584d494b45 58584d485647 -58584d485647 58584d453739 58584d415858 58584d334b47 @@ -229067,7 +218459,6 @@ 5858494f4157 5858494e4a41 585849484844 -585849484844 585849465a42 585849444544 58584855474f @@ -229092,11 +218483,8 @@ 585845445544 585845424644 585844573130 -585844554d42 -585844554d42 5858444b5858 5858444b5247 -5858444b5247 585844484e47 585844465454 585844415858 @@ -229105,14 +218493,12 @@ 585843563746 585843563134 585843435a5a -585843435858 585843415645 585843363636 585842524e38 585842495443 585842383836 585841584341 -585841554c42 5858414d5241 585841494945 585841493636 @@ -229204,7 +218590,6 @@ 585831333036 585831323833 585831323758 -585831323334 585831313437 585831313239 585830383132 @@ -229215,7 +218600,6 @@ 585830313039 585830303158 585830303139 -585830303139 585830303131 585830303034 58575a504d32 @@ -229236,7 +218620,6 @@ 585758485a4e 585757534e43 585757464442 -585757464442 58575743584a 585757353830 585756504949 @@ -229265,7 +218648,6 @@ 585750365733 58574f524d58 58574f524c44 -58574f524c44 58574f515745 58574f4f5058 58574f4d414e @@ -229279,21 +218661,15 @@ 58574d4b424f 58574d454357 58574c485547 -58574c485547 58574b59335a 58574b553252 58574b4a4948 58574b444842 58574a524e4c 58574a514648 -58574a514648 -58574a514648 -58574a514648 -58574a514648 58574a504633 58574a475152 58574a464448 -58574a464448 58574a433957 58574a363532 585749524637 @@ -229317,13 +218693,9 @@ 585744534147 5857444d4f43 585744445444 -585744445444 -585744434948 585744434948 585744343336 585743564b43 -585743554c42 -585743554c42 585743474855 58574342554e 58574252534f @@ -229369,7 +218741,6 @@ 585653485444 585653473958 585653434b46 -585653434b46 585653343739 585652465043 585652383455 @@ -229435,16 +218806,12 @@ 585644313239 585643465a44 585643445344 -585643445344 -585643445344 585643434848 585643353231 585643345834 585643323232 585643313731 585642585642 -585642554b42 -585642554b42 585642545347 585642513545 5856424e5856 @@ -229506,7 +218873,6 @@ 585558553132 5855584f3934 5855584e4343 -5855584e4343 585558413639 585558413232 585558413035 @@ -229589,7 +218955,6 @@ 585549425539 585549313533 585548514448 -585548514448 585548393235 585548344137 585547465a4d @@ -229612,13 +218977,6 @@ 585543363250 585542445244 585542383939 -585541554a42 -585541554a42 -585541554a42 -585541554a42 -585541554a42 -585541554a42 -585541554a42 58554155484a 585541525247 5855414e4e49 @@ -229645,8 +219003,6 @@ 585531313736 585531304a34 58545a544942 -58545a544942 -58545a544942 58545a4a4e47 58545a373530 58545a363630 @@ -229691,7 +219047,6 @@ 58545249434b 58545246444a 585452454d5a -585452454d45 585452454558 585452453754 58545243485a @@ -229708,7 +219063,6 @@ 5854514a5952 585451474651 585451325351 -585450393939 58544f544946 58544f523032 58544f504841 @@ -229725,7 +219079,6 @@ 58544f425245 58544f313233 58544e534854 -58544e534854 58544e52465a 58544e4f4531 58544e494345 @@ -229741,7 +219094,6 @@ 58544b524631 58544b4d5546 58544b4a4454 -58544b4a4454 58544b495943 58544b43425a 58544b434252 @@ -229754,22 +219106,18 @@ 5854494d4537 5854494d4535 585449485247 -585449485247 585449444151 585449433449 585448595a52 585448595457 585448595444 -585448595351 585448592e52 585448594a54 -585448594a44 58544859465a 585448594252 585448565459 585448564649 585448544c46 -585448544c46 585448544753 585448544752 585448544442 @@ -229789,7 +219137,6 @@ 585447545946 585447544b4d 585447514348 -585447514348 5854474f4c44 5854474e4554 585447464148 @@ -229801,7 +219148,6 @@ 585446454c54 585446343835 585445535458 -585445525241 5854454f5358 5854454d4734 585445454e53 @@ -229813,7 +219159,6 @@ 585444355a41 585444303039 585443593131 -585443585443 5854434e5953 5854434e5247 5854434e444a @@ -229840,14 +219185,12 @@ 585441544943 585441544158 585441534953 -585441534953 585441524d49 585441504143 5854414e4b58 5854414b5458 585441445458 585441445144 -585441445144 585441435958 585441434559 585441434545 @@ -229893,12 +219236,9 @@ 58535a383431 58535a353637 58535a313839 -585359544842 -585359544842 585359505148 585359393231 5853584e4e44 -5853584e4e44 585358424133 585358373331 585357583236 @@ -229917,11 +219257,9 @@ 58535f564b31 5853564a5534 585356445845 -585356445845 585356323130 5853555a534a 585355534849 -585355534552 58535550454a 585355424c46 585355333130 @@ -229963,7 +219301,6 @@ 58534e505550 58534e4d4350 58534e475343 -58534e475343 58534e465244 58534e415031 58534e364152 @@ -229973,7 +219310,6 @@ 58534d52454a 58534d495448 58534d485046 -58534d485046 58534d444358 58534d415454 58534d374859 @@ -229997,7 +219333,6 @@ 58534854544b 5853484b4c45 585348485147 -585348485147 585348473455 585348454c4c 585348434541 @@ -230074,14 +219409,8 @@ 585259505147 58525948524b 585259434f44 -585259434f44 585259433441 585259424448 -585258544742 -585258544742 -585258544742 -585258544742 -585258544742 585258523131 5852584a4c47 5852584a4b37 @@ -230116,7 +219445,6 @@ 58525354414c 585253445551 5852514d4948 -5852514d4948 585251424243 585251343433 585250485742 @@ -230158,8 +219486,6 @@ 5852464a4448 585245595441 585245514148 -585245514148 -585245514148 5852454e4e4e 5852454e3136 5852454d4147 @@ -230196,11 +219522,7 @@ 585241593234 585241593139 585241593134 -585241593132 585241593039 -585241593030 -585241544544 -585241544544 585241503939 5852414d4f56 585241433032 @@ -230218,8 +219540,6 @@ 585237314242 585236555445 585236353052 -585236353052 -58523635304c 585236353030 58523549584d 585235414138 @@ -230227,7 +219547,6 @@ 5852345a4d4d 585234514d4d 585234343052 -585234303052 585233593230 5852334a504b 585233434152 @@ -230254,17 +219573,9 @@ 585159415448 58515854494e 585158525546 -585158525546 585158425044 585158424348 5851575a5453 -585157544642 -585157544642 -585157544642 -585157544642 -585157544642 -585157544642 -585157544642 5851574e3344 5851574a4b47 5851574a3335 @@ -230279,7 +219590,6 @@ 585154373133 585153475143 585153454c48 -585153454c48 585153353037 585152585152 585152333757 @@ -230311,7 +219621,6 @@ 585147395054 585146564931 5851464b3137 -585146484f47 585146453534 5851455a3446 5851454e4d5a @@ -230352,9 +219661,6 @@ 585058345134 5850574f5244 585057435a57 -585056544542 -585056544542 -585056544542 5850564e5847 585056425338 585056383735 @@ -230425,7 +219731,6 @@ 58504d363931 58504c544753 58504c4f5245 -58504c4f5245 58504c4f5241 58504c4f4954 58504c4f4436 @@ -230438,7 +219743,6 @@ 58504c304445 58504b4a5144 58504b475043 -58504b475043 58504b353633 58504a4b4141 58504a383334 @@ -230554,16 +219858,10 @@ 584f5649584f 584f56455344 584f56434c44 -584f56434c44 -584f56434c44 584f56383431 584f56373935 584f55585955 584f55584f5a -584f55544442 -584f55544442 -584f55544442 -584f55544442 584f55525345 584f55505256 584f554d4158 @@ -230583,8 +219881,6 @@ 584f53494843 584f5348494d 584f53453031 -584f53444552 -584f53444552 584f53424543 584f525a4544 584f52594f4b @@ -230670,7 +219966,6 @@ 584f4a4e5043 584f4a4e4546 584f4a4a5044 -584f4a4a5044 584f4a474f43 584f4a454c49 584f4a415641 @@ -230700,7 +219995,6 @@ 584f46495443 584f46463137 584f46434946 -584f46434946 584f46323537 584f45544835 584f454a4a44 @@ -230710,7 +220004,6 @@ 584f44554432 584f44493131 584f44484d47 -584f44484d47 584f44445458 584f4444414d 584f44373130 @@ -230723,7 +220016,6 @@ 584f4348414f 584f43482121 584f42554441 -584f42544f48 584f42515847 584f42504158 584f424c4552 @@ -230769,11 +220061,6 @@ 584e55525541 584e54594254 584e5456574e -584e54544342 -584e54544342 -584e54544342 -584e54544342 -584e54544342 584e54534b47 584e5453474d 584e5453414d @@ -230899,11 +220186,6 @@ 584d54455144 584d54425947 584d53544242 -584d53544242 -584d53544242 -584d53544242 -584d53544242 -584d53544242 584d534d355a 584d534a4747 584d53413536 @@ -230916,15 +220198,12 @@ 584d51584945 584d50555245 584d50544142 -584d50544142 584d50453436 584d50445245 584d4f5a3231 584d4f545955 584d4f4f4e58 584d4f4f4433 -584d4f454848 -584d4f454848 584d4c584d4c 584d4c524544 584d4c4d3432 @@ -230986,7 +220265,6 @@ 584d42543031 584d424f4b33 584d42484b47 -584d42484b47 584d4244314c 584d42343935 584d41534158 @@ -231084,10 +220362,6 @@ 584c53463948 584c53444f43 584c53434944 -584c52544142 -584c52544142 -584c52544142 -584c52544142 584c524a4647 584c524a4159 584c52385239 @@ -231148,7 +220422,6 @@ 584c48303133 584c474e4246 584c474a4d44 -584c474a4d44 584c47425645 584c46514452 584c464b5348 @@ -231160,14 +220433,12 @@ 584c44554345 584c44524e38 584c444d4252 -584c43483639 584c43483638 584c43483635 584c43343242 584c42514a46 584c424f4e45 584c424a4744 -584c424a4744 584c42475042 584c42434352 584c41504558 @@ -231180,7 +220451,6 @@ 584c414d494b 584c41485955 584c41484a47 -584c41484a47 584c41444f4e 584c41384545 584c39393939 @@ -231203,7 +220473,6 @@ 584c31383035 584c31333135 584c31323435 -584c31323030 584c31303053 584c30595645 584b5a584b5a @@ -231235,10 +220504,6 @@ 584b52584b52 584b52584b38 584b52454f44 -584b51545a41 -584b51545a41 -584b51545a41 -584b51545a41 584b51435839 584b51334b32 584b50364a50 @@ -231290,7 +220555,6 @@ 584b42313335 584b41545958 584b41514244 -584b41514244 584b414e5547 584b414e4958 584b41373537 @@ -231340,11 +220604,6 @@ 584a51433245 584a51323330 584a505a4c4c -584a50545941 -584a50545941 -584a50545941 -584a50545941 -584a504a4447 584a504a4447 584a50383435 584a50313337 @@ -231355,12 +220614,10 @@ 584a4e373937 584a4d545841 584a4d4e5242 -584a4d4e5242 584a4d494c43 584a4d313333 584a4d313138 584a4c434344 -584a4c434344 584a4b534a43 584a4b4a4139 584a4b425657 @@ -231380,7 +220637,6 @@ 584a47465151 584a47333333 584a464b4e45 -584a464b4e45 584a45575253 584a45524b59 584a45524843 @@ -231400,7 +220656,6 @@ 584a41534f4e 584a414b5136 584a41494f43 -584a41494f43 584a41413650 584a41313834 584a39584a38 @@ -231411,7 +220666,6 @@ 584a374b4d42 584a37353046 584a37303054 -584a36584a36 584a36524544 584a36365436 584a36353052 @@ -231439,7 +220693,6 @@ 58495a574f41 58495a4f5236 58495a484e43 -58495a484e43 58495a414e37 58495a313035 58495855584b @@ -231493,10 +220746,6 @@ 584950345a43 58494f58494f 58494f545841 -58494f545841 -58494f545841 -58494f545841 -58494f545841 58494f544d5a 58494f4f3741 58494f4e4958 @@ -231533,7 +220782,6 @@ 58494d4a4a4a 58494d455445 58494d455041 -58494d454e41 58494d424155 58494d414e47 58494d414152 @@ -231575,7 +220823,6 @@ 584949484841 584949474939 584949465041 -584949465041 584949324955 584948535553 5849484e4644 @@ -231768,7 +221015,6 @@ 584758595446 5847584c4238 584758484c43 -584758484c43 584758365452 584757494b39 584757373230 @@ -231784,10 +221030,8 @@ 5847554d5145 5847554d4149 584755495347 -584755495347 584755494445 584755435241 -584755435241 584754554f4d 5847544e5054 584754464d57 @@ -231807,16 +221051,6 @@ 58474f594352 58474f4c4432 58474e434444 -58474d545641 -58474d545641 -58474d545641 -58474d545641 -58474d545641 -58474d545641 -58474d545641 -58474d545641 -58474d545641 -58474d545641 58474d534447 58474d373339 58474c323030 @@ -231829,7 +221063,6 @@ 5847494b455a 584749484738 584749454248 -584749454248 584749344f48 584748534a4b 584748464745 @@ -231844,8 +221077,6 @@ 584746384b37 5847454e3133 584745484c42 -584745484c42 -584745484c42 584745455252 584745315232 584744383237 @@ -231950,14 +221181,8 @@ 58464d434344 58464d425247 58464c545541 -58464c545541 -58464c545541 -58464c545541 -58464c545541 -58464c545541 58464c4a355a 58464c495058 -58464c495058 58464c494553 58464c424741 58464c415458 @@ -231969,15 +221194,12 @@ 584649534a58 5846494c4f45 5846494c455a -5846494c4553 -5846494c4553 5846494c4533 5846494c4531 584648564252 584648524259 5846484c4649 5846484c3830 -5846484b4252 5846484b4249 5846484b4236 584648495947 @@ -232085,7 +221307,6 @@ 5845584b5250 584558465846 584558465845 -584558455246 584558454b46 584558425242 584558383338 @@ -232117,7 +221338,6 @@ 5845535a3132 584553594d41 584553594147 -584553584553 584553533639 5845534e5546 5845534e4f53 @@ -232130,14 +221350,11 @@ 584553353532 584553333231 584553303032 -584552595553 584552584953 584552584941 58455258465a 584552584646 584552584557 -584552584553 -584552584553 58455257414d 584552545331 584552544e49 @@ -232152,7 +221369,6 @@ 5845524f5839 5845524f5836 5845524f5835 -5845524f5835 5845524f5834 5845524f5833 5845524f5830 @@ -232174,7 +221390,6 @@ 584552474943 584552455830 584552455330 -584552454341 584552444f47 584552434f4e 584552434953 @@ -232226,7 +221441,6 @@ 58454e574552 58454e555a58 58454e555346 -58454e555332 58454e555331 58454e554b53 58454e55414c @@ -232242,7 +221456,6 @@ 58454e4f4f4f 58454e4f4e58 58454e4f4e54 -58454e4f4e53 58454e4f4e37 58454e4f3833 58454e4f3639 @@ -232301,7 +221514,6 @@ 58454d332e32 58454c595941 58454c595553 -58454c544346 58454c524943 58454c504a4f 58454c4f5236 @@ -232335,18 +221547,10 @@ 58454c313233 58454b594c44 58454b574932 -58454b545441 -58454b545441 -58454b545441 -58454b545441 -58454b545441 -58454b545441 -58454b545441 58454b524a44 58454b4c4959 58454b4a5946 58454b494f4e -58454b474659 58454b353733 58454a4f4f45 58454a4f454a @@ -232401,7 +221605,6 @@ 584544534146 5845444f5339 5845444f5336 -5845444f5336 584544465444 584544465252 58454446524a @@ -232494,10 +221697,8 @@ 584452524458 5844524d3554 584452495645 -584452495645 584452473431 584452455a41 -58445245414d 584452435a44 584452374950 584452373831 @@ -232527,13 +221728,8 @@ 58444b594d59 58444b544250 58444b425047 -58444b425047 58444b313335 58444a545341 -58444a545341 -58444a545341 -58444a545341 -58444a545341 58444a4a5846 58444a394546 5844494e5943 @@ -232619,8 +221815,6 @@ 584358595634 58435856414e 584358464343 -584358464343 -584358464343 584358435858 58435843565a 584358434b50 @@ -232638,7 +221832,6 @@ 584356444652 584356435658 584356434342 -584356424e4d 584356424e32 584356424e31 584356393948 @@ -232650,7 +221843,6 @@ 584356333435 584356323444 584356313233 -584356313233 584355583335 584355534d45 584355524550 @@ -232675,7 +221867,6 @@ 584350593032 584350575453 584350504c47 -584350504c47 584350464657 584350414833 584350413150 @@ -232717,7 +221908,6 @@ 58434a435a43 58434a424f47 58434a394d50 -584349545241 584349544552 584349544544 58434952494c @@ -232771,7 +221961,6 @@ 5843414c4252 58434147364d 58434145484f -584341343831 58433938494a 584339305436 584338504354 @@ -232801,8 +221990,6 @@ 58425a244c58 584259584259 584259564733 -584259554250 -584259554243 584259465642 584259464846 58425946415a @@ -232816,8 +222003,6 @@ 584258343035 5842575a4e46 584257464243 -584257464243 -584257464243 584257434352 584256584256 58425656364d @@ -232838,7 +222023,6 @@ 58425350544b 5842534a4957 584253484743 -584253484743 584253465a39 584253373534 584253303449 @@ -232849,7 +222033,6 @@ 5842524a4446 584252494546 584252465959 -58425246554a 584252464f44 58425246442e 584252464342 @@ -232859,9 +222042,6 @@ 584252334e51 5842514e4655 584251475a46 -584251475a46 -584251475a46 -584251475a46 584251354f35 584251303230 5842504d5344 @@ -232871,7 +222051,6 @@ 58424f583930 58424f583835 58424f583732 -58424f583639 58424f583539 58424f583434 58424f583234 @@ -232918,11 +222097,6 @@ 584248565a4c 584248564347 58424856415a -584248545141 -584248545141 -584248545141 -584248545141 -584248545141 584248524632 584248524259 584248504941 @@ -232973,7 +222147,6 @@ 584241425932 584241424558 584241424553 -584241424553 584241384c48 584239504334 584239303033 @@ -233127,7 +222300,6 @@ 584151553134 584151545758 584151505243 -584151505243 58415147554e 584151425257 584151365347 @@ -233142,8 +222314,6 @@ 584150494e41 584150484152 584150475946 -584150475946 -584150475946 584150454b31 584150393439 584150373443 @@ -233157,13 +222327,11 @@ 58414e555241 58414e55324f 58414e545553 -58414e544f53 58414e544f52 58414e544931 58414e544858 58414e544855 58414e544836 -58414e544831 58414e544830 58414e544552 58414e54454e @@ -233195,7 +222363,6 @@ 58414e425245 58414e415853 58414e415832 -58414e415831 58414e414431 58414e413636 58414e413139 @@ -233256,7 +222423,6 @@ 58414b455253 58414b455234 58414b455231 -58414b455053 58414b455035 58414b444945 58414b415041 @@ -233280,10 +222446,6 @@ 58414853424c 5841484c4941 584147545041 -584147545041 -584147545041 -584147545041 -584147545041 5841474d4448 5841474a5546 584147415a55 @@ -233299,7 +222461,6 @@ 58414533494c 584144545157 584144544f41 -584144544f41 58414452455a 5841444f4f4d 584144494b41 @@ -233317,7 +222478,6 @@ 5841434b3452 584143494b41 584143485850 -58414348494b 584143483737 584143455647 584143434553 @@ -233386,7 +222546,6 @@ 583950443634 58394e4a4947 58394e43474c -58394e43474c 58394d345033 58394c564c49 58394c544545 @@ -233661,7 +222820,6 @@ 583637364b4b 583636553346 583636373658 -583636365858 58363636414d 583636364148 583636363834 @@ -233877,7 +223035,6 @@ 583359394d38 58335935384e 583359335a33 -583359335a33 583358493835 583358345835 583358335833 @@ -234081,7 +223238,6 @@ 58323530354c 583234593931 583234564354 -583234494b33 583234455355 583234413933 583234374d43 @@ -234125,7 +223281,6 @@ 583158534d37 583158353637 583158345837 -583158325833 583157353739 58315733554e 583155515952 @@ -234209,7 +223364,6 @@ 583133323358 583133323134 583133315845 -583132595533 583132583234 5831324f4c50 5831324f4146 @@ -234220,8 +223374,6 @@ 58313235424d 583132333639 58313233345a -583132333458 -583132333435 583132313130 583131593256 583131525044 @@ -234252,7 +223404,6 @@ 5830584b3058 5830584a4c4b 583058394147 -583058305830 583058305434 583058303939 583054414e30 @@ -234326,7 +223477,6 @@ 575a52323336 575a514f5230 575a50515144 -575a50515144 575a504f4746 575a50313536 575a50313035 @@ -234354,17 +223504,12 @@ 575a48514555 575a4843374d 575a47445744 -575a47445744 575a47434c48 575a47375950 575a46585a48 575a46554f42 -575a46554f42 -575a46554f42 575a46525747 575a464b5447 -575a464b5447 -575a464b5447 575a46474a4a 575a46454a47 575a4632364f @@ -234376,7 +223521,6 @@ 575a44423432 575a44374847 575a43554e42 -575a43554e42 575a434f5053 575a434b4947 575a434a4244 @@ -234404,7 +223548,6 @@ 575a31383032 575a31303830 57595a49464f -57595a415244 575959573234 57595952444f 5759594a4d57 @@ -234423,8 +223566,6 @@ 575957483735 575957383636 5759564f4e49 -57595645524e -57595645524e 575956434e46 575955584659 575955563635 @@ -234485,10 +223626,8 @@ 57594f465941 57594e554359 57594e543352 -57594e543352 57594e534b32 57594e533856 -57594e4f4e41 57594e4e5353 57594e4e5331 57594e4e4552 @@ -234526,7 +223665,6 @@ 57594c554c49 57594c4f3234 57594c4c5044 -57594c4c4945 57594c4b4e4b 57594c494e47 57594c494543 @@ -234588,16 +223726,12 @@ 575946344239 575946323951 57594556414c -575945554e42 -575945554e42 -575945554e42 575945554648 575945545844 575945515a55 575945505641 5759454e3332 5759454b5347 -5759454b5347 57594548474e 575945474f45 575945415354 @@ -234618,7 +223752,6 @@ 575944414449 5759434f4d42 5759434f4646 -5759434f4646 5759434c4946 5759434b4544 5759434b414e @@ -234634,7 +223767,6 @@ 575942554d42 57594252454e 5759424f5453 -5759424f5453 575942464931 575942445049 575942424750 @@ -234696,7 +223828,6 @@ 575853543535 5758534a5944 575853475843 -575853475843 575853333931 5758524f4f4d 5758524b574b @@ -234741,13 +223872,6 @@ 575845353632 5758445a4147 575844554d42 -575844554d42 -575844554d42 -575844554d42 -575844554d42 -575844554d42 -575844554d42 -575844554d42 575844545547 5758444b5247 575844465659 @@ -234758,7 +223882,6 @@ 575843565153 575843543232 5758434f5344 -5758434f5344 575843454e48 575843353650 575842524631 @@ -234799,7 +223922,6 @@ 575757593934 575757585733 575757583133 -575757575757 575757575739 575757575736 575757575732 @@ -234814,10 +223936,8 @@ 575757573232 575757573139 575757573132 -575757573132 575757573131 575757564c51 -575757545454 575757535455 575757535354 575757535341 @@ -234836,7 +223956,6 @@ 5757574f5244 5757574f4f50 5757574f4c46 -5757574f4c46 5757574e5536 5757574e4554 5757574e4141 @@ -234865,10 +223984,8 @@ 575757415a4d 575757415645 575757414445 -575757393939 575757393938 575757383838 -575757383838 575757383736 575757374449 575757373751 @@ -234876,7 +223993,6 @@ 575757373338 575757373239 575757363939 -575757363636 575757363531 575757363334 575757363037 @@ -234888,7 +224004,6 @@ 575757343555 575757343434 575757333538 -575757333538 575757333131 575757325757 575757323734 @@ -234900,9 +224015,7 @@ 575757313731 575757313337 5757572d3133 -575757313233 575757313157 -575757313131 575757303037 575756553948 575756435a44 @@ -234917,7 +224030,6 @@ 575754463635 575754455247 575754415342 -575753535858 575753534343 575753494949 575753393939 @@ -234944,7 +224056,6 @@ 575750493238 57575048514d 575750443437 -575750415353 575750343734 575750343536 57574f524c44 @@ -234971,7 +224082,6 @@ 57574c4f5244 57574c494949 57574c485547 -57574c485547 57574c42424c 57574b564352 57574b4b4c4c @@ -235001,7 +224111,6 @@ 57574a324848 57574a313233 5757494e4843 -5757494c4c59 575749474e4f 575749474741 575749354d56 @@ -235014,7 +224123,6 @@ 575748484744 575748484646 575748455242 -575746574357 57574652554c 575746523430 5757464e574f @@ -235031,7 +224139,6 @@ 575746343539 575746323437 575746313132 -575745575745 575745574357 575745573231 575745545431 @@ -235086,8 +224193,6 @@ 575741594e45 575741545453 575741534d44 -575741534d44 -575741534d44 57574153434f 5757414e4955 5757414d4353 @@ -235218,7 +224323,6 @@ 575653323631 575652514c35 5756524b5a45 -5756524b5a45 575652343434 5756514e5743 575651355652 @@ -235265,9 +224369,6 @@ 575644303236 575643583731 575643345930 -575642554b42 -575642554b42 -575642554b42 57564252524c 5756424b5047 575642463031 @@ -235349,7 +224450,6 @@ 575554455652 575554455641 575554455441 -575554414e47 575554414e32 575554383949 575554363636 @@ -235372,7 +224472,6 @@ 575553434845 575553373632 57555331574b -5755525a454c 5755525a454b 5755525a4147 575552535457 @@ -235405,7 +224504,6 @@ 57554f545533 57554f4e3737 57554f4b494e -57554e534348 57554e515546 57554e4e5459 57554e4e4552 @@ -235419,7 +224517,6 @@ 57554d5a554d 57554d545652 57554d524f53 -57554d505553 57554d504c55 57554d504153 57554d4e4959 @@ -235437,7 +224534,6 @@ 57554c4c4947 57554c4c4945 57554c4c4145 -57554c4b414e 57554c495755 57554c495645 57554c494155 @@ -235464,7 +224560,6 @@ 57554a4f3939 57554a494e32 57554a485347 -57554a485347 57554a464743 575549525a38 575549525055 @@ -235477,7 +224572,6 @@ 575548554c49 575548524552 575548514448 -575548514448 5755484d5352 575548464248 575548424259 @@ -235536,12 +224630,6 @@ 575542393736 57554158434f 575541563249 -575541554a42 -575541554a42 -575541554a42 -575541554a42 -575541554a42 -575541554a42 575541545247 575541484c38 575541425544 @@ -235570,12 +224658,6 @@ 575531355032 575531303235 575530474d5a -57545a544942 -57545a544942 -57545a544942 -57545a544942 -57545a544942 -57545a544942 57545a535147 57545a4c3543 57545a373234 @@ -235623,7 +224705,6 @@ 575452554d50 575452543235 575452534b49 -575452534b49 575452505752 5754524f5554 5754524f454d @@ -235647,7 +224728,6 @@ 57544f4e494f 57544f4d4347 57544f475443 -57544f475443 57544f434144 57544e5a4253 57544e554344 @@ -235693,7 +224773,6 @@ 5754484c434e 5754484b4944 575448483130 -575448483130 575448414c4c 572e54482e41 575448383039 @@ -235802,14 +224881,9 @@ 57535a313635 575359544d49 575359544842 -575359544842 -575359544842 -575359544842 -575359544842 5753594e4431 5753594a4d47 575359424c45 -5753585a4151 5753585a3132 575358585858 575358584356 @@ -235820,12 +224894,10 @@ 5753584a4c4b 575358494a4e 575358474734 -575358454443 575358453333 575358444533 575358444335 575358434654 -575358434445 57535841454a 575358373431 575358363332 @@ -235851,7 +224923,6 @@ 5753564f4c37 5753564e4450 575356445845 -575356445845 575356433138 575356325952 575355523348 @@ -235909,7 +224980,6 @@ 57534f534945 57534f524941 57534f4b5745 -57534f4b5745 57534f474d4d 57534f434b53 57534f424445 @@ -235922,10 +224992,8 @@ 57534e435945 57534e424346 57534d485046 -57534d485046 57534d413030 57534d394b34 -57534d394b34 57534d363734 57534d333134 57534d313636 @@ -235964,7 +225032,6 @@ 575348494c4c 575348493438 575348485147 -575348485147 57534848464c 575348454c4d 575348454444 @@ -236083,7 +225150,6 @@ 575331333037 575331323338 575331323334 -575331323334 575331323232 575331303132 575330513348 @@ -236100,7 +225166,6 @@ 575259535059 575259534648 575259525646 -575259525646 575259495032 575259455644 57525945354e @@ -236111,12 +225176,10 @@ 575259323436 575259313251 575258544742 -575258544742 57525850504d 5752584d5053 5752584b4944 5752584a4c47 -5752584a4c47 575258463234 575258424d57 575258393335 @@ -236179,7 +225242,6 @@ 57524f4e4735 57524f4e4733 57524f4e4732 -57524f4e4731 57524f4e4730 57524f5f4e47 57524f474d58 @@ -236210,13 +225272,11 @@ 57524954544c 575249544f43 57524954494e -575249544552 575249544544 575249544532 575249544531 575249543352 575249534849 -575249515545 5752494f4c56 5752494e4b59 5752494e4b53 @@ -236270,7 +225330,6 @@ 5752454e3639 5752454e3137 5752454d5941 -5752454d5941 5752454d4a41 5752454d454e 5752454b415a @@ -236287,7 +225346,6 @@ 575245425147 57524541434f 575245323733 -575244575244 575244524144 575244454334 575244413131 @@ -236356,7 +225414,6 @@ 5752344e544a 575234444158 575234434342 -575234353046 575234353041 575234343838 575234333838 @@ -236385,7 +225442,6 @@ 57515a57515a 57515a564b4a 57515a473347 -57515a473347 57515a455631 575158544f47 575158514e55 @@ -236395,8 +225451,6 @@ 57515830354b 575157584443 575157544642 -575157544642 -575157544642 575157533847 575157483955 575157454949 @@ -236505,13 +225559,6 @@ 575057505731 575057333439 575057333330 -575056544542 -575056544542 -575056544542 -575056544542 -575056544542 -5750564a4a47 -5750564a4a47 5750564a4a47 575056455444 575056434945 @@ -236572,8 +225619,6 @@ 572d504c4545 57504c313937 57504b544546 -57504b544546 -57504b544546 57504b4b5054 57504b4a5144 57504b453838 @@ -236727,7 +225772,6 @@ 574f574e5547 574f574e4f57 574f574e4158 -574f574d414e 574f574a5335 574f574a414e 574f57495453 @@ -236780,19 +225824,13 @@ 574f57313633 574f57313433 574f57313333 -574f57313233 574f57313133 574f56455335 574f56454e34 574f56454e31 574f56323351 574f55574549 -574f55574549 574f55544445 -574f55544442 -574f55544442 -574f55544442 -574f55534c47 574f55534c47 574f554e4445 574f554e4430 @@ -236811,7 +225849,6 @@ 574f54574f54 574f54545459 574f54535457 -574f54534954 574f544e4548 574f544c4949 574f544a4438 @@ -236822,9 +225859,7 @@ 574f54414e53 574f54414e4f 574f54414e47 -574f54414e47 574f54414e38 -574f54414e31 574f54414831 574f54363433 574f54303031 @@ -236849,8 +225884,6 @@ 574f52555348 574f52553732 574f5254495a -574f52544859 -574f52544859 574f52544848 574f52544845 574f52544838 @@ -236859,11 +225892,9 @@ 574f52535445 574f52535434 574f52534945 -574f5253454c 574f5252594f 574f52525935 574f52525550 -574f52524f4d 574f52524b53 574f52524146 574f52524142 @@ -236875,16 +225906,13 @@ 574f524d5334 574f524d5333 574f524d5332 -574f524d5332 574f524d524d 574f524d4f4f 574f524d4d4d 574f524d4b53 574f524d4945 -574f524d4945 574f524d4741 574f524d4553 -574f524d4552 574f524d4544 574f524d424f 574f524d414e @@ -236909,15 +225937,12 @@ 574f524c445a 574f524c4458 574f524c4455 -574f524c4453 -574f524c4453 574f524c444f 574f524c4447 574f524c4444 574f524c4443 574f524c4442 574f524c4439 -574f524c4439 574f524c4438 2d574f524c44 574f524c414b @@ -236927,15 +225952,12 @@ 574f524b554d 574f524b5350 574f524b5332 -574f524b5331 574f524b5330 574f524b4f55 574f524b4f4b 574f524b4d45 -574f524b494e 574f524b4944 574f524b4553 -574f524b4552 574f524b4542 574f524b4154 574f524b3939 @@ -236944,7 +225966,6 @@ 574f524b3835 574f524b3833 574f524b3735 -574f524b3735 574f524b3734 574f524b3455 40574f524b34 @@ -236960,11 +225981,9 @@ 574f52463132 574f52463130 574f52445a31 -574f52445a31 574f52445930 574f52445858 574f5244574f -574f52445550 574f5244554b 574f52445445 574f52445031 @@ -237005,10 +226024,7 @@ 574f52313832 574f51545430 574f51495143 -574f51495143 574f51454a48 -574f51454a48 -574f50574f50 574f50535555 574f50524f5a 574f50515151 @@ -237032,7 +226048,6 @@ 574f4f54574f 574f4f545331 574f4f544f4e -574f4f544945 574f4f543434 574f4f543233 574f4f543138 @@ -237048,7 +226063,6 @@ 574f4f505459 574f4f505353 574f4f504f4f -574f4f504947 574f4f504945 574f4f504544 574f4f504148 @@ -237057,7 +226071,6 @@ 574f4f503132 574f4f4f5359 574f4f4f5348 -574f4f4f4f4f 574f4f4f4f4c 574f4f4f4f46 574f4f4f4f44 @@ -237065,7 +226078,6 @@ 574f4f4f4b53 574f4f4f4849 574f4f4f4841 -574f4f4f4459 574f4f4f4453 574f4f4e4945 574f4f4e3030 @@ -237076,7 +226088,6 @@ 574f4f4c5048 574f4f4c4e4f 574f4f4c4653 -574f4f4c4631 574f4f4c414e 574f4f4c3839 574f4f4c3639 @@ -237094,9 +226105,7 @@ 574f4f484141 574f4f475932 574f4f474c59 -574f4f474945 574f4f474559 -574f4f474552 574f4f465932 574f4f465753 574f4f465553 @@ -237120,13 +226129,10 @@ 574f4f463138 574f4f445a47 574f4f44595a -574f4f445953 574f4f445948 574f4f445947 574f4f445944 574f4f445941 -574f4f445934 -574f4f445931 574f5f4f4459 574f4f44592e 575f4f4f4459 @@ -237139,12 +226145,10 @@ 574f4f445338 574f4f445337 574f4f445336 -574f4f44524f 574f4f444d4f 574f4f444b41 574f4f444956 574f4f44494b -574f4f444945 574f4f444942 574f4f444931 574f4f444841 @@ -237161,7 +226165,6 @@ 574f4f443935 574f4f443839 574f4f443838 -574f4f443838 574f4f443833 574f4f443738 574f4f443737 @@ -237176,9 +226179,6 @@ 574f4f443336 574f4f443334 574f4f443236 -574f4f443236 -574f4f443232 -574f4f443231 574f4f443139 574f4f443137 574f4f443136 @@ -237207,8 +226207,6 @@ 574f4e5a5252 574f4e574f48 574f4e554445 -574f4e544f4e -574f4e544f4e 574f4e544d4f 574f4e544845 574f4e54434f @@ -237227,7 +226225,6 @@ 574f4e4b4544 574f4e4b4153 574f4e4b4141 -574f4e4b4131 574f4e4b3734 574f4e4b3731 574f4e4b3232 @@ -237251,8 +226248,6 @@ 574f4e473031 574f4e455945 574f4e454e4f -574f4e453837 -574f4e444552 574f4e444531 574f4e444148 574f4e444131 @@ -237285,7 +226280,6 @@ 574f4d493232 574f4d474958 574f4d465141 -574f4d454e53 574f4d454e4e 574f4d454e39 574f4d454e36 @@ -237298,12 +226292,9 @@ 574f4d453153 574f4d453053 574f4d425553 -574f4d424c45 -574f4d424154 574f4d424131 574f4d41524b 574f4d414e54 -574f4d414e53 574f4d414e4e 574f4d414e4c 574f4d414e39 @@ -237311,11 +226302,8 @@ 574f4d414e35 574f4d414e34 574f4d414e33 -574f4d414e32 -574f4d414e31 574f4d414a41 574f4d414431 -574f4d41434b 574f4d354a59 574f4d333135 574f4d313234 @@ -237325,7 +226313,6 @@ 574f4c574531 574f4c56494b 574f4c564734 -574f4c56454e 574f4c564532 574f4c563734 574f4c554641 @@ -237344,7 +226331,6 @@ 574f4c4f444a 574f4c4f4449 574f4c4f4445 -574f4c4f4441 574f4c4f424e 574f4c4f3231 574f4c4d4954 @@ -237355,7 +226341,6 @@ 574f4c4c5542 574f4c4c5454 574f4c4c4f50 -574f4c4c4957 574f4c4c494e 574f4c4c4945 574f4c4c4553 @@ -237365,10 +226350,8 @@ 574f4c4c4538 574f4c4c4531 574f4c4c4154 -574f4c4b4f57 574f4c4b4f56 574f4c4b4947 -574f4c4b4552 574f4c4b4531 574f4c4b414e 574f4c4b4131 @@ -237378,7 +226361,6 @@ 574f4c475931 574f4c475241 574f4c465937 -574f4c465931 2a574f4c4659 574f4c465742 574f4c465553 @@ -237396,10 +226378,7 @@ 574f4c464e54 574f4c464d50 574f4c464c59 -574f4c464b45 574f4c464a59 -574f4c46494e -574f4c46494b 574f4c464931 574f4c464747 574f4c464741 @@ -237408,11 +226387,7 @@ 574f4c464558 574f4c464557 574f4c464554 -574f4c46454e -574f4c46454e 574f4c46454b -574f4c464545 -574f4c464531 574f4c464452 574f4c46444f 574f4c464352 @@ -237422,25 +226397,17 @@ 574f4c463957 574f4c463936 574f4c463935 -574f4c463935 574f4c463932 574f4c463839 -574f4c463837 574f4c463833 574f4c463831 574f4c46375a -574f4c463739 -574f4c463736 574f4c463731 -574f4c463639 574f4c463638 574f4c463539 -574f4c463534 574f4c463444 574f4c463438 -574f4c463438 574f4c463436 -574f4c463432 574f4c463431 574f4c463339 574f4c463334 @@ -237449,17 +226416,12 @@ 574f4c463239 574f4c463238 574f4c463236 -574f4c463233 -574f4c463231 -574f4c463230 574f4c463139 -574f4c463133 574f4c462d31 574f4c463039 574f4c463038 574f4c463036 574f4c463035 -574f4c463031 574f4c455858 574f4c455331 574f4c454e34 @@ -237467,7 +226429,6 @@ 574f4c443639 574f4c434331 574f4c415431 -574f4c414e44 574f4c373031 574f4c353134 574f4c323738 @@ -237495,8 +226456,6 @@ 574f4a4f3131 574f4a4c4d42 574f4a4a5044 -574f4a4a5044 -574f4a4a5044 574f4a43494b 574f4a434945 574f4a425650 @@ -237538,7 +226497,6 @@ 574f47483734 574f47475953 574f47474953 -574f47474945 574f47454841 574f47444f47 574f47413132 @@ -237573,7 +226531,6 @@ 574f444b4131 574f44494553 574f44484d47 -574f44484d47 574f44474552 574f44454e38 574f44454e35 @@ -237584,10 +226541,8 @@ 574f44444f41 574f44444c45 574f44415348 -574f44415348 574f44414e47 574f44414e31 -574f44414853 574f44413233 574f44313233 574f435a414c @@ -237611,14 +226566,11 @@ 574f42563637 574f42534f54 574f42515847 -574f42515847 -574f42515847 574f424f4f54 574f424c4a41 574f424c4553 574f42494c4c 574f42453130 -574f42424945 574f42424557 574f42424552 574f42424531 @@ -237632,7 +226584,6 @@ 574f414c5337 574f414b5553 574f41494e56 -574f41494e49 574f41494a4a 574f41494a49 574f41493334 @@ -237698,16 +226649,10 @@ 574e55585a58 574e55554b59 574e55434b44 -574e54544342 -574e54544342 -574e54544342 -574e54544342 -574e54544342 574e544e344e 574e544d4431 574e544b464b 574e544a4847 -574e544a4847 574e54424254 574e54415433 574e53584f31 @@ -237744,8 +226689,6 @@ 574e4f434b31 574e4f373134 574e4e465541 -574e4e465541 -574e4d594131 574e4d594131 574e4d544b47 574e4d494658 @@ -237766,7 +226709,6 @@ 574e49303432 574e48505245 574e48484b46 -574e48484b46 574e47505043 574e474e545a 572e4e474e47 @@ -237788,8 +226730,6 @@ 574e4452574d 574e44524a45 574e44514544 -574e44514544 -574e44514544 574e444f5753 574e444d414e 574e444b5331 @@ -237870,21 +226810,12 @@ 574d54455144 574d54454348 574d54434a44 -574d54434a44 -574d54434a44 -574d54434a44 574d54414654 574d54383431 574d54313939 574d54303037 574d53574f59 574d5354544d -574d53544242 -574d53544242 -574d53544242 -574d53544242 -574d53544242 -574d53504b48 574d53504b48 574d534a4835 574d534a4747 @@ -237918,8 +226849,6 @@ 574d4e504b47 574d4e424d48 574d4d465441 -574d4d465441 -574d4d465441 574d4d41524b 574d4d354e51 574d4d313533 @@ -237933,7 +226862,6 @@ 574d4b4e4653 574d4b4c5643 574d4b485242 -574d4b485242 574d4b454556 574d4b393039 574d4a545047 @@ -237992,8 +226920,6 @@ 574d42545741 574d424b5738 574d42484b47 -574d42484b47 -574d42484b47 574d42424d57 574d42393132 574d42363534 @@ -238057,7 +226983,6 @@ 574d30363731 574c5a514742 574c59505547 -574c59505547 574c59423533 574c59423531 574c59323138 @@ -238092,7 +227017,6 @@ 574c53444c38 574c53444c31 574c53434944 -574c53434944 574c53434854 574c53433435 574c53425847 @@ -238102,9 +227026,6 @@ 574c53353533 574c53343230 574c52574d55 -574c52544142 -574c52544142 -574c52544142 574c52534947 574c524e5148 574c524e4d57 @@ -238124,7 +227045,6 @@ 574c4f44454b 574c4e544c46 574c4e454748 -574c4e454748 574c4d4d5842 574c4d454543 574c4d433435 @@ -238133,7 +227053,6 @@ 57214c4c4945 574c4c47524e 574c4c465341 -574c4c465341 574c4c465244 574c4c414d53 574c4b4c5445 @@ -238177,7 +227096,6 @@ 574c44554438 574c44545254 574c44533333 -574c444f4a52 574c444e3734 574c444d5331 574c444b534c @@ -238218,7 +227136,6 @@ 574c41445a49 574c41444f57 574c41444f53 -574c4144494b 574c41444931 574c41444552 574c4144454b @@ -238271,15 +227188,12 @@ 574b5935444c 574b585a3252 574b58505447 -574b58505447 574b58495024 574b58455247 -574b58455247 574b58435836 574b58353437 574b57555354 574b57545342 -574b57545342 574b574d4453 574b574c5a4c 574b574a5352 @@ -238305,8 +227219,6 @@ 574b52335730 574b52304654 574b51545a41 -574b51545a41 -574b51545a41 574b51544743 574b51344e31 574b51344b54 @@ -238352,7 +227264,6 @@ 574b48565145 574b48475851 574b48373834 -574b48373232 574b48353835 574b48344154 574b47514e32 @@ -238446,7 +227357,6 @@ 574a5a343033 574a594e374b 574a59474847 -574a59474847 574a59343137 574a58595348 574a58595159 @@ -238490,14 +227400,9 @@ 574a512d5931 574a51524e46 574a51434744 -574a51434744 574a5142594d 574a51373737 574a51313233 -574a50545941 -574a50545941 -574a50545941 -574a50545941 574a50534747 574a504b5a33 574a50414e47 @@ -238556,7 +227461,6 @@ 574a45524532 574a454a4b44 574a45474a43 -574a45474a43 574a45454a31 574a45414e53 574a44574c44 @@ -238632,7 +227536,6 @@ 57495a5a4f31 57495a5a4943 57495a5a454c -57495a5a454c 57495a5a4544 57495a5a3131 57495a583334 @@ -238658,7 +227561,6 @@ 57495a444f47 57495a43555a 57495a424f59 -57495a424f59 57495a42495a 57495a415749 57495a415231 @@ -238732,11 +227634,9 @@ 574954485941 574954484f46 574954484e45 -57495448494e 57495448434a 574954484154 57495448414d -57495448414d 57495448414b 574954483939 574954475343 @@ -238745,7 +227645,6 @@ 57495443484e 574954434838 574954434837 -574954434837 574954434833 574954434832 574954415338 @@ -238766,13 +227665,11 @@ 574953535931 574953535553 57495353454d -57495353454d 574953534153 574953533131 574953524933 574953515332 574953504136 -5749534e4552 5749534d5554 5749534d4552 5749534d4152 @@ -238784,8 +227681,6 @@ 5749534b5953 5749534b5931 5749534b4841 -5749534b4559 -5749534b4559 5749534b4552 5749534b4545 5749534b4153 @@ -238799,8 +227694,6 @@ 574953484d41 57495348494e 574953484949 -574953484553 -574953484553 57495348454b 574953483559 574953483431 @@ -238813,7 +227706,6 @@ 57495345524a 574953454e54 574953454d41 -574953454d41 57495345434f 574953453634 574953453433 @@ -238881,31 +227773,18 @@ 574950494b41 574950493738 574950463231 -574950455253 574950454f54 574950453030 574950434644 -574950434644 574950385258 574950353437 57494f575241 -57494f545841 -57494f545841 -57494f545841 -57494f545841 -57494f545841 -57494f545841 -57494f545841 -57494f545841 57494f54574b 57494f543438 57494f514633 -57494f4c4b41 57494f4c454b 57494f4c4133 57494f4a4347 -57494f4a4347 -57494f4a4347 57494e5a5558 57494e5a4552 57494e595749 @@ -238926,24 +227805,19 @@ 57494e583130 57494e583035 57494e583032 -57494e57494e 57494e563130 57494e555239 57494e545953 57494e545639 57494e54554e 57494e544f54 -57494e544f4e 57494e544f47 57494e544937 57494e544653 -57494e544552 -57494e544552 57494e544545 57494e544543 57494e544536 57494e543752 -57494e534f52 57494e534f4d 57494e534d53 57494e534954 @@ -238958,7 +227832,6 @@ 57494e504f4f 57494e503030 57494e4f5558 -57494e4f4e45 57494e4f3639 57494e4f3638 57494e4f3232 @@ -238967,12 +227840,10 @@ 57494e4e5935 57494e4e5932 57494e4e5531 -57494e4e5531 57494e4e5435 57494e4e5353 57494e4e4f56 57494e4e4a4f -57494e4e4553 57494e4e454c 57494e4e4148 57494e4e4141 @@ -238987,13 +227858,10 @@ 57494e4c4541 57494e4b5937 57494e4b5932 -57494e4b5931 -57494e4b5931 57494e4b544f 57494e4b5359 57494e4b4c59 57494e4b494e -57494e4b4945 57494e4b4131 57494e4b3930 57494e4b3738 @@ -239082,7 +227950,6 @@ 57494e445537 57494e445532 57494e445355 -57494e44534f 57494e44534b 57494e44524f 57494e445241 @@ -239097,13 +227964,11 @@ 57494e444941 57494e444559 57494e444556 -57494e444552 57494e44454e 57494e444459 57494e444141 57494e443939 57494e443938 -57494e443938 57494e443833 57494e443736 57494e443639 @@ -239176,8 +228041,6 @@ 57494d544f56 57494d544552 57494d533033 -57494d505931 -57494d505931 57494d504741 57494d504559 57494d504552 @@ -239186,7 +228049,6 @@ 57494d4d5544 57494d4d494e 57494d4d4559 -57494d4d4552 57494d4d4532 57494d4c4956 57494d4c4558 @@ -239222,7 +228084,6 @@ 57494c543135 57494c543132 57494c53554d -57494c534f4e 57494c534f4a 57494c534f41 57494c534559 @@ -239245,20 +228106,14 @@ 57494c4d414e 57494c4d4136 57494c4d4132 -57494c4d4132 -57494c4d4131 57494c4c5a5a 57494c4c5958 57494c4c5955 -57494c4c5953 -57494c4c594f 57494c4c594f 57494c4c594b 57494c4c5948 57494c4c5947 -57494c4c5942 57494c4c5937 -57494c4c5934 57494c4c5930 57494c4c5741 57494c4c5636 @@ -239290,7 +228145,6 @@ 57494c4c4958 57494c4c4957 57494c4c494e -57494c4c494e 57494c4c4944 57494c4c4942 57494c4c4935 @@ -239300,18 +228154,13 @@ 57494c4c4845 57494c4c4734 57494c4c455a -57494c4c4559 57494c4c4558 -57494c4c454d -57494c4c4545 57494c4c4544 57494c4c4531 -57494c4c444f 57494c4c444b 57494c4c4446 57494c4c4354 57494c4c424c -57494c4c4245 57494c4c4241 57494c4c4231 57494c4c415a @@ -239320,7 +228169,6 @@ 57494c4c4150 57494c4c414e 57494c4c4142 -57494c4c4142 57494c4c4133 57494c4c3938 57494c4c3937 @@ -239331,7 +228179,6 @@ 57494c4c3832 57494c4c3830 57494c4c3736 -57494c4c3736 57494c4c3732 57494c4c3638 57494c4c3637 @@ -239351,7 +228198,6 @@ 57494c4c3237 57494c4c3236 57494c4c3137 -57494c4c3057 57494c4c3039 57494c4c3038 57494c4c3036 @@ -239363,10 +228209,7 @@ 57494c4b4c57 57494c4b4a45 57494c4b494e -57494c4b494e -57494c4b4945 57494c4b4559 -57494c4b4553 57494c4b454e 57494c4b4532 57494c4b4154 @@ -239384,10 +228227,7 @@ 57494c494741 57494c494552 57494c49444f -57494c49414d -57494c49414d 57494c484f31 -57494c48454c 57494c48415a 57494c475553 57494c474552 @@ -239424,7 +228264,6 @@ 57494c444559 57494c44454e 57494c444547 -57494c444531 57494c444444 57494c444343 57494c44424f @@ -239462,13 +228301,10 @@ 57494c443135 57494c443134 57494c443133 -57494c443133 -57494c443132 57494c443131 57494c443130 57494c443037 57494c443032 -57494c434f58 57494c434f53 57494c434f52 57494c434f35 @@ -239478,7 +228314,6 @@ 57494c424b35 57494c42494c 57494c424931 -57494c424552 57494c423736 57494c414e44 57494c414e41 @@ -239498,9 +228333,7 @@ 57494c313131 57494c303037 57494b554c41 -57494b554c41 57494b553132 -57494b544f52 57494b53454c 57494b4e5859 57494b4e4552 @@ -239565,17 +228398,12 @@ 574947494459 574947485457 574947475959 -574947475953 574947475353 -574947474c45 -574947474c45 574947474954 574947474939 574947474938 574947474937 574947474935 -574947474552 -574947474552 57494747415a 57494747414d 574947474131 @@ -239597,14 +228425,12 @@ 574946463938 574946463539 574946455957 -574946455931 574946455353 574946454c59 574946453235 574946453030 574946444152 574946435845 -574946435845 57494633595a 574946303432 574945574945 @@ -239613,13 +228439,10 @@ 574945544f41 574945544552 57494554454b -57494554454b 574945543635 574945543430 574945535445 -574945534552 57494553454e -57494553454c 574945534537 574945533034 57494552534d @@ -239630,7 +228453,6 @@ 57494552424f 57494552344c 5749454e4e41 -5749454e4552 5749454e3836 5749454e3434 5749454e3237 @@ -239650,7 +228472,6 @@ 574945444f4c 574945444945 574945434841 -574945424b45 57494542434b 574945363837 574944574944 @@ -239666,7 +228487,6 @@ 5749444c4157 5749444c4152 5749444a4a44 -5749444a4a44 574944493138 574944474954 574944474539 @@ -239699,13 +228519,6 @@ 574943503233 5749434b4c45 5749434b4954 -5749434b4944 -5749434b4559 -5749434b4554 -5749434b4554 -5749434b4552 -5749434b4544 -5749434b4544 5749434b4532 5749434b4531 5749434b4345 @@ -239806,8 +228619,6 @@ 574859544845 574859505432 5748594f4e45 -5748594e4f54 -5748594e4f54 5748594e4f50 5748594e3054 5748594d4f4f @@ -239845,14 +228656,12 @@ 574857363536 574856545242 574856495447 -574856495447 574856383836 574856353531 5748555a5550 5748555a4e4f 574855574855 574855545550 -574855545550 574855505041 5748554a564f 57485546464f @@ -239865,7 +228674,6 @@ 574854574f46 574854544c50 574854534f58 -574854534f58 574854465348 57485446414c 57485443504c @@ -239911,14 +228719,11 @@ 57484f57494e 57484f574841 57484f544845 -57484f544845 57484f54414e 57484f534552 57484f534531 57484f534142 57484f525534 -57484f524553 -57484f524544 57484f524539 57484f524538 57484f524536 @@ -239934,7 +228739,6 @@ 57484f503635 57484f503037 57484f4f5345 -57484f4f5049 57484f4f4749 57484f4f4459 57484f4f4241 @@ -239956,10 +228760,8 @@ 57484f484f57 57484f484148 57484f46594f -57484f46414e 57484f444f47 57484f444949 -57484f444154 57484f43414e 57484f425447 57484f424253 @@ -239974,9 +228776,6 @@ 57484f313036 57484e56574f 57484e554d4d -57484e545741 -57484e545741 -57484e545741 57484e4d5432 57484e495048 57484e425953 @@ -240004,7 +228803,6 @@ 57484a383334 57484a353137 57484a303031 -5748495a5a59 5748495a5a39 5748495a5a34 5748495a4d4f @@ -240018,8 +228816,6 @@ 574849544f52 574849544e59 574849544e49 -574849544e49 -574849544e45 574849544d41 574849544c4b 574849544c45 @@ -240028,20 +228824,14 @@ 57484954455a 574849544558 574849544557 -574849544552 57484954454b -57484954454a 574849544547 -574849544547 -574849544545 574849544543 574849544541 574849544538 574849544537 -574849544534 57484954452e 574849544348 -574849544259 574849543639 574849543333 574849543238 @@ -240052,10 +228842,7 @@ 57484953544c 574849535431 574849535041 -574849535041 574849534c56 -574849534b59 -574849534b45 574849534b41 57484952594f 574849524c59 @@ -240063,7 +228850,6 @@ 574849524c53 574849505053 574849505050 -574849505050 574849505045 574849504f4c 574849504c4c @@ -240080,7 +228866,6 @@ 574849503131 5748494e4f31 5748494e4e45 -5748494d5359 5748494d5345 5748494c5931 5748494c4945 @@ -240113,7 +228898,6 @@ 574845574557 574845573139 574845564545 -574845564545 574845545459 574845534f58 574845525259 @@ -240137,13 +228921,11 @@ 574845454c4f 574845454c42 574845454c38 -574845454c31 57484545454e 574845454345 574845415439 574845415436 574845415434 -574845415431 574845393433 405748453236 574844565846 @@ -240165,7 +228947,6 @@ 5748434b4431 574843474843 574843343230 -574842574842 574842484546 574842475936 574842333634 @@ -240179,7 +228960,6 @@ 574841574b53 57484156454e 574841545a55 -574841545550 57484154545a 574841545459 574841545441 @@ -240187,7 +228967,6 @@ 574841545245 574841544c55 57484154494e -574841544946 574841544845 574841544753 57484154464f @@ -240201,7 +228980,6 @@ 574841543232 574841543142 574841543133 -574841543131 574841543030 574841534954 57484152544f @@ -240226,11 +229004,8 @@ 5748414c574a 5748414c4f4d 5748414c4c45 -5748414c4553 -5748414c4552 5748414c4542 5748414c4535 -5748414c4535 5748414c4534 574841495252 574841445331 @@ -240305,7 +229080,6 @@ 574757353939 574757314d50 574756474547 -574756474547 574756393457 574756333236 5747555a5a49 @@ -240347,12 +229121,8 @@ 57474e4d414e 57474e494d36 57474e434444 -57474e434444 57474e425347 57474e373230 -57474d545641 -57474d545641 -57474d545641 57474d534447 57474d313433 57474c4e4244 @@ -240372,7 +229142,6 @@ 574749524c53 572e4749524c 574749513241 -574749513241 574749414853 574749374549 574749333735 @@ -240396,8 +229165,6 @@ 574745313830 574744504741 574744435645 -574744435645 -574744435645 574744333238 5747435a4244 5747434b5043 @@ -240490,7 +229257,6 @@ 57465041434b 57464f593837 57464f57464f -57464f57464f 57464f4f4453 57464f4d5831 57464f473838 @@ -240501,7 +229267,6 @@ 57464e385047 57464d4e3232 57464d434344 -57464d434344 57464d343832 57464d335244 57464d333636 @@ -240511,9 +229276,6 @@ 57464c57464c 57464c574244 57464c545541 -57464c545541 -57464c545541 -57464c545541 57464c445456 57464c415348 57464c414d46 @@ -240530,7 +229292,6 @@ 57464a373635 574649574649 574649545441 -574649545441 574649495649 574648583453 5746484d5246 @@ -240541,7 +229302,6 @@ 5746484d3133 5746484d3132 574648474643 -574648474643 574648435943 574648434252 574648425946 @@ -240586,7 +229346,6 @@ 574641535433 5746414e4e59 574641474643 -574641474643 57464146434f 574639383736 574639333934 @@ -240631,7 +229390,6 @@ 5745594e3749 5745594c5858 5745594b3838 -574559465642 574559435357 574559414148 574559365745 @@ -240682,12 +229440,10 @@ 574554553438 574554545454 574554544557 -574554544552 574554544544 574554544153 574554543455 574554535554 -574554535531 574554534554 574554534446 574554534157 @@ -240701,12 +229457,10 @@ 574554524544 574554524147 574554524131 -574554505553 574554504f32 574554504945 574554504554 5745544f5245 -5745544f4e45 5745544e4150 5745544c414e 574554494c46 @@ -240746,7 +229500,6 @@ 574554325735 574554313859 574554313433 -574554313233 574554303039 5745535a454b 5745535a414b @@ -240756,13 +229509,11 @@ 574553545753 574553545745 574553545459 -574553545454 574553545452 574553545359 574553545354 574553545331 57455354524e -57455354524e 574553545241 574553545131 57455354504c @@ -240776,12 +229527,9 @@ 574553544757 574553544558 574553544553 -574553544552 -57455354454e 57455354454c 574553544545 574553544544 -57455354434f 574553544345 574553544344 574553544343 @@ -240811,18 +229559,13 @@ 574553543235 574553543234 574553543231 -574553543231 574553543137 574553543136 574553543134 -574553543133 -574553543133 -574553543131 574553543130 574553543038 574553543037 574553543035 -574553543031 574553543030 57455353593b 574553535431 @@ -240831,8 +229574,6 @@ 574553534952 57455353494e 574553534945 -574553534558 -574553534558 574553534552 57455353454e 574553534445 @@ -240907,14 +229648,12 @@ 574553373231 574553364133 574553343230 -574553343230 574553343138 574553343132 574553333231 574553323336 574553323031 574553313933 -574553313233 7c5745537c31 574553303238 5745525a5843 @@ -240962,11 +229701,8 @@ 574552544839 574552544748 574552544553 -574552544553 -574552544552 57455254454e 574552544531 -574552544153 57455254414c 57455254414b 574552543939 @@ -240975,7 +229711,6 @@ 574552543830 574552543737 574552543736 -574552543736 574552543735 574552543734 574552543730 @@ -240988,7 +229723,6 @@ 574552543333 574552543237 574552543236 -574552543231 574552543230 574552543133 574552543035 @@ -240997,10 +229731,8 @@ 574552535353 574552534b50 574552534553 -574552534446 574552534153 574552534144 -574552534144 574552524656 57455252414e 574552515454 @@ -241029,7 +229761,6 @@ 5745524d414c 5745524c4f57 5745524c4b4a -5745524c4b4a 5745524c4559 5745524c4344 5745524b4b4f @@ -241117,7 +229848,6 @@ 574552373839 574552365453 574552363741 -574552353637 574552353634 57455235344b 574552353433 @@ -241128,7 +229858,6 @@ 574552343434 574552343231 574552333432 -574552333333 574552333232 574552333030 574552323337 @@ -241137,8 +229866,6 @@ 574552313739 57455231372d 574552313638 -574552313338 -574552313338 574552313334 574552313241 574552303339 @@ -241207,7 +229934,6 @@ 57454e493335 57454e485549 57454e485541 -57454e474552 57454e473631 57454e473434 57454e473135 @@ -241215,36 +229941,27 @@ 57454e455731 57454e455253 57454e455245 -57454e455241 57454e454544 57454e445959 57454e445957 -57454e445953 57454e44594f 57454e44594b 57454e445947 57454e445946 57454e445945 -57454e445943 57454e445941 57454e445939 -57454e445937 -57454e445935 57454e44592e 57454e44554c 57454e445431 57454e444f58 57454e444f4c 57454e44494d -57454e44494d -57454e444947 57454e444947 57454e444841 57454e44454e -57454e44454e 57454e444152 57454e44414e -57454e44414c 57454e443133 57454e434f31 57454e434859 @@ -241292,12 +230009,10 @@ 57454c534f50 57454c534858 57454c534836 -57454c534831 57454c534559 57454c534348 57454c524946 57454c504552 -57454c4f5645 57454c4f4855 57454c4d4554 57454c4c5959 @@ -241308,11 +230023,9 @@ 57454c4c544f 57454c4c534a 57454c4c5341 -57454c4c5331 57454c4c4f4b 57454c4c4b4f 57454c4c4945 -57454c4c4945 57454c4c484f 57454c4c4849 57454c4c454e @@ -241331,7 +230044,6 @@ 57454c4c3055 57454c4c3031 57454c4b5641 -57454c4b4f4d 57454c4b4453 57454c4a554e 57454c4a4f59 @@ -241341,14 +230053,10 @@ 57454c454e47 57454c454441 57454c454231 -57454c444f4e -57454c444f4e 57454c44454e 57454c443537 -57454c434f4d 57454c434859 57454c434853 -57454c434853 57454c434852 57454c434845 57454c434837 @@ -241370,14 +230078,6 @@ 57454c323030 57454c313136 57454c313131 -57454b545441 -57454b545441 -57454b545441 -57454b545441 -57454b545441 -57454b545441 -57454b545441 -57454b545441 57454b4f5354 57454b4c5550 57454b4c5333 @@ -241401,9 +230101,7 @@ 57454a393138 57454a374d58 57454a303031 -5745495a454e 574549564953 -574549564552 57454953594d 574549535359 574549535341 @@ -241412,7 +230110,6 @@ 574549534b45 574549534752 574549534558 -574549534552 57454953454e 574549534530 574549533631 @@ -241427,12 +230124,10 @@ 5745494e4b59 5745494e4a36 5745494e4945 -5745494e4552 5745494e3734 5745494e3232 5745494d4f4e 5745494d4552 -5745494d4152 5745494d414e 5745494c5941 5745494c5533 @@ -241442,9 +230137,7 @@ 5745494a554e 5745494a4945 574549485541 -574549484552 574549474c45 -574549474854 574549474853 574549455837 574549454e33 @@ -241497,7 +230190,6 @@ 574547475931 574547474552 574547455a47 -574547455a47 574547455255 574547455231 574547454c45 @@ -241511,7 +230203,6 @@ 574547413031 574547373733 574547313233 -574547313233 574546525745 574546524545 5745464f3639 @@ -241524,7 +230215,6 @@ 5745455a5959 5745455a5953 5745455a5946 -5745455a5946 5745455a5937 5745455a5921 5745455a4559 @@ -241534,7 +230224,6 @@ 5745455a3536 5745455a3436 574545574958 -574545574545 574545564945 57454556454e 574545564531 @@ -241571,15 +230260,11 @@ 5745454e5a59 5745454e5932 5745454e5931 -5745454e5931 5745454e5858 5745454e5548 5745454e4f53 5745454e4954 -5745454e4945 -5745454e4945 5745454e4554 -5745454e4552 5745454e4131 5745454e4121 5745454e3939 @@ -241596,11 +230281,9 @@ 5745454b5553 5745454b5332 5745454b5331 -5745454b4c59 5745454b494d 5745454b4945 5745454b454e -5745454b454e 5745454b4441 5745454b3531 5745454b3433 @@ -241617,16 +230300,12 @@ 574545454b53 574545454554 574545454552 -574545454545 574545445339 574545445338 574545445337 574545445336 -574545445336 574545445335 574545445333 -574545445333 -574545445332 574545445332 574545445330 57454544532e @@ -241637,11 +230316,9 @@ 574545444d41 574545444b42 574545444953 -574545444945 574545444553 57454544454e 574545444545 -574545444544 574545444444 57454544424f 574545443936 @@ -241685,19 +230362,16 @@ 574544514742 5745444f534f 5745444f5259 -5745444e4553 5745444e3133 5745444a4154 574544495541 574544495441 574544494449 574544493839 -574544474945 574544474541 574544474535 574544474534 574544474532 -574544474531 574544474142 574544464144 57454445414e @@ -241756,7 +230430,6 @@ 5745424f4c4c 5745424e4153 5745424d4154 -5745424d414e 5745424c4f53 5745424a454d 5745424a414d @@ -241769,7 +230442,6 @@ 57454246454d 574542455253 574542455250 -574542455250 57454245524d 57454245524b 574542455241 @@ -241794,7 +230466,6 @@ 574542424e43 57454242495a 574542424953 -574542424945 574542424559 57454242454e 574542424544 @@ -241831,14 +230502,12 @@ 574542313031 574542303037 5745415a4c45 -5745415a4c45 5745415a3131 5745415a3032 574541584544 574541574552 574541574541 57454157354e -574541564552 57454153444b 57454153414c 574541533145 @@ -241847,11 +230516,9 @@ 574541525255 574541524d45 57454152494e -574541524552 57454152454e 574541524535 574541524534 -574541524531 574541523659 574541523438 574541523232 @@ -241863,8 +230530,6 @@ 5745414f4e53 5745414e4945 5745414e4459 -5745414c5448 -5745414c5448 57452d414c4c 5745414c3938 5745414b4d45 @@ -241873,7 +230538,6 @@ 5745414b3330 574541484c51 574541484848 -574541474c45 57454147464d 57454147454c 574541465354 @@ -242027,7 +230691,6 @@ 574452455346 57445245414d 574452355955 -574451574f35 574451464d39 574451454b47 5744505a4358 @@ -242054,11 +230717,6 @@ 57444b475735 57444b434144 57444b313337 -57444a545341 -57444a545341 -57444a545341 -57444a545341 -57444a545341 57444a543538 57444a4d4d5a 57444a433144 @@ -242203,7 +230861,6 @@ 574355424544 574354535343 5743544a5344 -5743544a5344 5743544a4841 574354494d4f 574354485334 @@ -242257,8 +230914,6 @@ 57434b363535 57434b335449 57434954534f -574349545241 -574349545241 57434954454f 5743494f4858 5743494e4255 @@ -242276,7 +230931,6 @@ 574347575741 574347574347 574347444243 -574347444243 574347414e47 574347323839 574347323335 @@ -242343,7 +230997,6 @@ 574334313434 574334304242 574333544654 -574333544654 5743334d4f44 5743334d424a 574333474d31 @@ -242357,7 +231010,6 @@ 574332373535 574332303036 574331393531 -574331384332 574331383036 574331343439 574331324333 @@ -242370,7 +231022,6 @@ 574330373139 574330333235 57425a474742 -57425a474742 57425a35435a 574259443244 574259355153 @@ -242379,7 +231030,6 @@ 574257535145 5742574b4559 574257494344 -574257494344 57425735514b 574257324d51 57425659415a @@ -242418,7 +231068,6 @@ 574251514541 5742514e4e4e 574251475a46 -574251475a46 574251473933 574250494e47 574250333634 @@ -242460,18 +231109,13 @@ 57424a4f5933 574249545a46 574249524646 -574249524646 574249504e52 5742494b4552 5742494b4442 574249454644 -574249435943 -574249435943 574249374b33 5742485a3842 574248545141 -574248545141 -574248545141 574248535946 574248523232 5742484b4d43 @@ -242485,8 +231129,6 @@ 574246414e52 57424559494f 574245545041 -574245545041 -574245545041 574245524e49 574245524759 574245514e41 @@ -242584,7 +231226,6 @@ 574231393935 574231393832 574231393735 -574231393731 574231393230 574231373232 574231373039 @@ -242600,7 +231241,6 @@ 574230564446 574230424451 574230343231 -57415a5a5550 57415a5a5532 57415a5a4f37 57415a5a4f31 @@ -242615,7 +231255,6 @@ 57415a555032 57415a534552 57415a4f4f32 -57415a4f4f31 57415a4c4553 57415a4c4156 57415a495941 @@ -242627,7 +231266,6 @@ 57415a455358 57415a455231 57415a45454c -57415a45454c 57415a454243 57415a415a41 57415a415031 @@ -242655,7 +231293,6 @@ 574159534841 574159504851 574159504552 -5741594f5554 5741594f5349 5741594f4e45 5741594e4f57 @@ -242665,28 +231302,18 @@ 5741594e474f 5741594e4557 5741594e4554 -5741594e4553 -5741594e4552 5741594e4550 5741594e454b -5741594e4548 5741594e4546 5741594e4544 -5741594e4542 5741594e4541 -5741594e4536 5741594e4533 -5741594e4532 -5741594e4532 5741594e4155 5741594e414c 5741594e3345 5741594d4f52 5741594d4944 5741594d4152 -5741594d414e -5741594c4f4e -5741594c4f4e 5741594c494e 5741594c454e 5741594c414e @@ -242703,7 +231330,6 @@ 574159424f59 574159424153 574159424144 -574159414e47 574159393233 574159353338 574159343934 @@ -242725,7 +231351,6 @@ 5741584e4f53 5741584d4f4e 5741584d4158 -5741584d414e 5741584c4c59 5741584c3837 5741584c3636 @@ -242733,7 +231358,6 @@ 574158494e31 574158494553 574158494544 -574158484157 574158455239 574158454e31 574158454d59 @@ -242763,7 +231387,6 @@ 574157454e47 574157453434 574157415951 -574157415741 574157415144 574157414e39 574157414e32 @@ -242790,7 +231413,6 @@ 574156455339 574156455335 574156455334 -574156455333 574156455321 574156455253 574156454f54 @@ -242804,7 +231426,6 @@ 574156453433 574156453432 574156453332 -574156453332 574156453132 574156453039 574156453030 @@ -242823,7 +231444,6 @@ 574155495354 574155484451 574155484138 -574155474831 574155424159 5741545a4552 574154575542 @@ -242840,7 +231460,6 @@ 574154543535 574154543434 574154535238 -574154534f4e 574154534954 574154534150 57415453414c @@ -242872,8 +231491,6 @@ 57415445524b 57415445524a 574154455248 -574154455232 -574154455231 574154454b41 574154453138 574154444f54 @@ -242923,9 +231540,7 @@ 57415354494e 574153544845 574153544557 -574153544544 574153544535 -574153544531 574153543536 57415353594d 574153535353 @@ -242933,7 +231548,6 @@ 574153534c45 574153534956 574153534555 -574153534552 57415353454e 574153534546 574153534545 @@ -243006,9 +231620,6 @@ 574153484949 574153484945 574153484641 -574153484552 -574153484552 -574153484545 574153484545 57415348444b 574153483939 @@ -243060,9 +231671,6 @@ 57415341494c 574153414741 574153414445 -574153414441 -574153414249 -574153414249 574153414241 574153414231 574153413837 @@ -243079,7 +231687,6 @@ 574153313933 574153313636 574153313238 -574153313233 574153313037 5741525a5949 5741525a4556 @@ -243106,7 +231713,6 @@ 574152534958 57415253494b 574152534552 -574152534157 574152534144 574152533433 574152533231 @@ -243117,7 +231723,6 @@ 574152524f54 574152524f52 574152524d52 -57415252494f 574152524931 574152524544 574152524459 @@ -243129,7 +231734,6 @@ 574152505633 574152505550 574152504f54 -574152504947 574152504154 574152503939 574152503935 @@ -243139,7 +231743,6 @@ 574152503147 574152503131 5741524f5045 -5741524e4552 5741524e3733 5741524e3031 5741524d5553 @@ -243152,7 +231755,6 @@ 5741524d3539 5741524d3130 5741524c4f44 -5741524c4f43 5741524c4e51 5741524c494e 5741524c4943 @@ -243176,15 +231778,12 @@ 574152493745 574152484849 574152484643 -574152484643 -574152474f44 574152474153 57415247414e 574152464f52 574152464552 574152464152 574152455a58 -574152455a31 574152454f4c 574152454e5a 57415245484f @@ -243202,8 +231801,6 @@ 574152444a52 574152444a45 57415244454f -57415244454e -57415244454e 57415244454c 574152444153 57415244414d @@ -243211,7 +231808,6 @@ 574152444144 574152444141 574152443939 -574152443939 574152443838 574152443831 574152443734 @@ -243314,8 +231910,6 @@ 574150454545 574150444441 574150444144 -574150424253 -574150424253 574150415741 574150415353 574150415041 @@ -243337,7 +231931,6 @@ 57414e594145 57414e593131 57414e584149 -57414e57414e 57414e54594f 57414e545941 57414e54555a @@ -243347,12 +231940,8 @@ 57414e544d33 57414e544a4f 57414e544945 -57414e544544 -57414e544544 -57414e544544 57414e543243 57414e543232 -57414e543132 57414e54304e 57414e534f4e 57414e53494b @@ -243361,7 +231950,6 @@ 57414e524c54 57414e514552 57414e504a47 -57414e504a47 57414e4f3039 57414e4e4f52 57414e4e4953 @@ -243381,9 +231969,6 @@ 57414e4b5354 57414e4b4f53 57414e4b4f4f -57414e4b494e -57414e4b4552 -57414e4b454c 57414e4b4150 57414e4b3233 57414e4b3232 @@ -243391,7 +231976,6 @@ 57414e4a414c 57414e4a4149 57414e495534 -57414e495441 57414e494f4b 57414e494453 57414e494441 @@ -243447,12 +232031,10 @@ 57414e444142 57414e444141 57414e444139 -57414e444139 57414e444138 57414e444137 57414e444136 57414e444132 -57414e444131 57414e443137 57414e435259 57414e424f44 @@ -243495,13 +232077,11 @@ 57414d444158 57414d425547 57414d424f54 -57414d424f54 57414d424f4f 57414d424f4e 57414d424c59 57414d424931 57414d424157 -57414d424154 57414d42414c 57414d424148 57414d363836 @@ -243512,7 +232092,6 @@ 57414c593639 57414c593234 57414c584f4d -57414c564953 57414c554e47 57414c545a5a 57414c545252 @@ -243527,7 +232106,6 @@ 57414c543633 57414c543630 57414c543536 -57414c543337 57414c543336 57414c543332 57414c543232 @@ -243545,7 +232123,6 @@ 57414c534331 57414c53414d 57414c53414c -57414c525553 57414c524953 57414c524153 57414c504f50 @@ -243558,19 +232135,14 @@ 57414c4f3439 57414c4e4f4a 57414c4d4552 -57414c4d4552 57414c4c5954 -57414c4c5953 57414c4c5952 57414c4c594b 57414c4c5948 57414c4c5946 57414c4c5943 -57414c4c5939 57414c4c5938 57414c4c5934 -57414c4c5934 -57414c4c5931 57414c4c5333 57414c4c4f4e 57414c4c4f31 @@ -243579,9 +232151,6 @@ 57414c4c4933 57414c4c4558 57414c4c4557 -57414c4c4552 -57414c4c454e -57414c4c4545 57414c4c4537 57414c4c4535 57414c4c4534 @@ -243614,8 +232183,6 @@ 57414c4b5550 57414c4b4d45 57414c4b494e -57414c4b4552 -57414c4b4552 57414c4b4544 57414c4b4259 57414c4b414a @@ -243647,7 +232214,6 @@ 57414c493738 57414c475553 57414c474b43 -57414c474b43 57414c464552 57414c455945 57414c455931 @@ -243656,14 +232222,11 @@ 57414c45534b 57414c455334 57414c455332 -57414c455331 57414c455259 57414c455253 -57414c455249 57414c454e54 57414c454e41 57414c454c41 -57414c454c41 57414c454441 57414c453038 57414c445952 @@ -243679,8 +232242,6 @@ 57414c444f38 57414c444f37 57414c444f34 -57414c444f33 -57414c444f33 57414c444958 57414c444954 57414c444953 @@ -243728,7 +232289,6 @@ 57414b534154 57414b534141 57414b505754 -57414b505754 57414b4f5552 57414b4f4d49 57414b4f4b4f @@ -243742,12 +232302,10 @@ 57414b4b4f30 57414b4b4945 57414b4b4559 -57414b4b4552 57414b4b4131 57414b495552 57414b494f4e 57414b494e47 -57414b494e47 57414b494d57 57414b494d4f 57414b494b49 @@ -243799,7 +232357,6 @@ 574149564552 574149554b55 57414954524f -574149544553 574149544544 574149544531 57414954344d @@ -243807,7 +232364,6 @@ 574149534831 57414953414e 57414952455a -574149504552 5741494e5549 5741494e5346 5741494e4947 @@ -243825,7 +232381,6 @@ 5741494c494e 5741494c4554 5741494c454e -5741494c4541 5741494b3258 5741494a4632 574149484f4f @@ -243867,7 +232422,6 @@ 574148454b41 574148454845 574148454755 -574148454544 574148454441 574148444154 574148434e53 @@ -243885,12 +232439,8 @@ 57414757414e 574147554c49 57414755494e -574147545041 -574147545041 -574147545041 574147535654 574147535445 -574147535445 574147534f4e 574147533132 574147533130 @@ -243901,10 +232451,8 @@ 5741474f4e52 5741474f4e38 5741474f4e32 -5741474f4e31 5741474e5554 5741474e4f4e -5741474e4552 5741474d4933 5741474d414e 5741474c494f @@ -243924,7 +232472,6 @@ 574147455257 574147455254 574147455231 -574147455231 574147454e32 574147444f47 57414744414c @@ -243949,10 +232496,7 @@ 574146493739 574146465957 574146464c59 -574146464c45 -574146464c45 574146464949 -57414646454e 57414646454c 574146464545 57414645524f @@ -243988,7 +232532,6 @@ 574144554b45 574144553431 574144544f41 -574144544f41 57414453574f 574144535353 574144535252 @@ -244004,10 +232547,8 @@ 5741444e4942 5741444c4f35 5741444c4559 -5741444c4559 5741444c3644 574144495242 -574144494e47 574144494e43 574144494d31 574144494141 @@ -244040,7 +232581,6 @@ 574144445a5a 574144444945 574144444552 -57414444454c 574144444159 574144443639 574144443435 @@ -244061,24 +232601,19 @@ 5741434f3137 5741434d4143 5741434c4157 -5741434c4157 5741434c414e 5741434b595a 5741434b5937 5741434b5936 -5741434b5931 5741434b4f57 5741434b4f53 5741434b4f37 5741434b4f32 -5741434b4f31 5741434b4b38 5741434b4953 5741434b4945 5741434b4931 5741434b4559 -5741434b4552 -5741434b4552 5741434b4531 5741434b3939 5741434b3434 @@ -244095,7 +232630,6 @@ 574143483032 57414345564d 574143455647 -574143455647 574143455045 574143454e47 574143454b31 @@ -244280,7 +232814,6 @@ 57394c4d4c45 573949355644 5739475a414f -5739475a414f 57394746464c 573946534532 573945574e32 @@ -244543,7 +233076,6 @@ 573535363457 573535353737 573535353557 -573535353557 573535303639 573534565a42 573534525456 @@ -244602,7 +233134,6 @@ 573448435947 573447523934 5734474e3352 -573447384154 573446464c33 573445553859 573444514255 @@ -244678,7 +233209,6 @@ 57334d384653 57334d355738 57334c4b304d -57334c43304d 57334c324f42 57334c305645 57334b4f5059 @@ -244861,7 +233391,6 @@ 573233333437 573232343653 573232343353 -573232343353 573232343153 573232323257 5732315a494d @@ -244914,11 +233443,9 @@ 57315041524b 57314e57314e 57314e545237 -57314e543352 57314e504547 57314e4f4e41 57314e4e4945 -57314e4e4552 57314e4e3352 57314e4e3145 57314e4c3143 @@ -244937,8 +233464,6 @@ 57314c4c5953 57314c4c5059 57314c4c3153 -57314c4c3153 -57314c4c3145 57314c4c3145 57314c444f57 57314c324834 @@ -244958,7 +233483,6 @@ 573145573145 573145564552 573145363754 -573145325233 573145324e33 573145314231 5731445a4a52 @@ -244992,7 +233516,6 @@ 573139353650 573139343854 573139343537 -573139343253 573139333457 573139323346 573137513131 @@ -245013,7 +233536,6 @@ 573133424141 573133415244 573133395457 -573133395457 573133333436 573133313936 573133313357 @@ -245035,7 +233557,6 @@ 573132333738 573132333636 573132333444 -573132333435 573132323944 573132313836 573132313730 @@ -245086,10 +233607,8 @@ 57304e544f4e 57304e454237 57304e444552 -57304e444552 57304e443352 57304d564456 -57304d424154 57304d334e31 57304c564945 57304c504859 @@ -245134,7 +233653,6 @@ 573030445931 573030444945 573030443145 -573030424945 573030423133 573030333333 573030303044 @@ -245148,7 +233666,6 @@ 565a58245359 565a584e5355 565a58425946 -565a58425946 565a58425242 565a58355641 565a57434f46 @@ -245210,15 +233727,8 @@ 565a48303037 565a474a5058 565a47445744 -565a47445744 -565a46554f42 -565a46554f42 -565a46554f42 -565a46554f42 -565a46554f42 565a464c484b 565a464b5447 -565a464b5447 565a464b4e57 565a46333831 565a45585448 @@ -245332,7 +233842,6 @@ 56594e565033 56594e4e4144 56594e485747 -56594e485747 56594e48414e 56594e444552 56594e434b45 @@ -245375,9 +233884,6 @@ 565946424648 565945574533 565945554e42 -565945554e42 -565945554e42 -565945554e42 565945533645 565945515748 5659454b5849 @@ -245390,7 +233896,6 @@ 56594252594b 5659424f5247 5659424f4743 -5659424f4743 5659424a4144 565942453939 5659415a4f56 @@ -245436,7 +233941,6 @@ 565854523839 565853594950 565853533031 -565853533031 565853424846 565852564c44 565852534a45 @@ -245457,9 +233961,6 @@ 56584d453833 56584c425a45 56584b514748 -56584b514748 -56584b514748 -56584b514748 56584b514142 56584a4e4943 56584a393135 @@ -245474,12 +233975,7 @@ 565846333033 565845584f55 565845445544 -565845445544 565845303239 -565844554d42 -565844554d42 -565844554d42 -565844554d42 5658444b5247 56584446564d 565843313637 @@ -245574,7 +234070,6 @@ 565748495445 565748315445 565747544931 -5657474f4c46 5657474a3035 565747455257 565747433737 @@ -245589,8 +234084,6 @@ 565744445444 565744325846 565743554c42 -565743554c42 -565743554c42 565743545447 565742555331 565742554732 @@ -245602,7 +234095,6 @@ 565741533344 56574152474f 5657414c4e31 -5657414c4e31 565741474f4e 56574147454e 56574145444f @@ -245632,13 +234124,11 @@ 565732303038 565732303036 565731393934 -565731393739 565731393733 565731393732 565731393639 565731393637 565731393544 -565731393544 565731393247 565731373736 565731373431 @@ -245690,10 +234180,7 @@ 565656335633 565656333733 565656323547 -565656323232 565656323031 -565656313233 -565656313131 562e562e562e 565655565655 56565545524b @@ -245724,7 +234211,6 @@ 5656504c5748 5656504b4d5a 565650485346 -565650485346 565650415353 565650313638 56564f583034 @@ -245760,7 +234246,6 @@ 56564956584c 565649544150 565649514548 -565649514548 5656494e4345 5656494b4b41 565649495454 @@ -245795,9 +234280,6 @@ 565643373635 565642565642 565642554b42 -565642554b42 -565642554b42 -565642554b42 565642545347 5656424b5047 565642495246 @@ -245971,7 +234453,6 @@ 56554f373333 56554e5a4947 56554e545a59 -56554e545a59 56554e545349 56554e49534f 56554e494353 @@ -245991,14 +234472,12 @@ 56554c544953 56554c515139 56554c504f49 -56554c504958 56554c50454e 56554c4f5453 56554c4c454e 56554c4b5146 56554c4b494e 56554c4b454d -56554c4b414e 56554c4b4135 56554c4b4132 56554c495a43 @@ -246061,11 +234540,7 @@ 565542454156 56554244534a 565542445244 -565542445244 -565542445244 565542434748 -565541554a42 -565541554a42 565540415456 565541545247 565541544b41 @@ -246091,16 +234566,12 @@ 565531323334 565530424f44 56545a59344a -56545a544942 -56545a544942 -56545a544942 56545a4d4349 56545a4a4e47 56545a414432 56545a383537 5654595a4b46 5654594e4f44 -5654594e4f44 5654594e464b 5654594e3739 5654594e3135 @@ -246156,7 +234627,6 @@ 565453313233 565452535038 565452535032 -565452535031 565452524d44 5654524b4252 565452484656 @@ -246174,7 +234644,6 @@ 56545034314d 56544f5a4744 56544f544946 -56544f544946 56544f52594d 56544f524f56 56544f524f4a @@ -246202,8 +234671,6 @@ 56544c53594d 56544c49444c 56544c454b5a -56544c44544c -56544c44544c 56544c425954 56544c414652 56544c313531 @@ -246213,7 +234680,6 @@ 56544b545946 56544b545254 56544b525351 -56544b52465a 56544b4d5246 56544b4a584d 56544b4a4c42 @@ -246232,7 +234698,6 @@ 565449523938 5654494c5050 565449485247 -565449485247 565449464b4a 565449455546 565449454e46 @@ -246249,7 +234714,6 @@ 565448424446 5654475a4950 565447514348 -565447514348 5654474e4651 5654474b504e 56544746334d @@ -246353,15 +234817,7 @@ 56535a525746 56535a493555 56535a435044 -56535a435044 565359574a4c -565359544842 -565359544842 -565359544842 -565359544842 -565359544842 -565359544842 -565359544842 5653594e545a 5653594b5739 5653594a4d47 @@ -246422,8 +234878,6 @@ 565350494359 565350455241 565350434846 -565350434846 -565350434846 565350333137 56534f574845 56534f56494b @@ -246435,9 +234889,6 @@ 56534f313632 56534e4e584e 56534e4e4946 -56534e4e4946 -56534e4b4638 -56534e4a5444 56534e4a5444 56534e464431 56534e424f42 @@ -246565,7 +235016,6 @@ 565332303039 565332303038 565332303037 -565332303035 565332303031 5653314d3037 565331433744 @@ -246576,7 +235026,6 @@ 565331393833 565331393832 565331393831 -565331393831 565331393830 565331393738 565331393532 @@ -246601,16 +235050,10 @@ 56525a424343 565259534841 565259525646 -565259525646 5652594b4f56 565259464153 565259453239 56525942454c -565258544742 -565258544742 -565258544742 -565258544742 -565258544742 5652584e4350 5652584c4948 565258313633 @@ -246648,7 +235091,6 @@ 565253313233 565253303030 565252544343 -56525252524d 565252524d4d 5652524f4f4d 565252465347 @@ -246660,7 +235102,6 @@ 56524f4f4d53 56524f4f4d4d 56524f4f4d31 -56524f4f4d31 56524f4d4f45 56524f4c454b 56524f4a4c55 @@ -246812,9 +235253,6 @@ 565158482d42 565158414735 565157544642 -565157544642 -565157544642 -565157544642 565157504f48 5651574a4b47 5651564e4c44 @@ -246844,8 +235282,6 @@ 56514c544646 56514c4e4746 56514c4a5244 -56514c4a5244 -56514c4a5244 56514c46504a 56514c424146 56514c333634 @@ -246869,7 +235305,6 @@ 56514633584a 565145464f42 565144515a47 -565144515a47 565144445132 565144365041 565143343239 @@ -246917,17 +235352,7 @@ 565057455444 565057445742 565057434d44 -565057434d44 -565057434d44 565057424248 -565056544542 -565056544542 -565056544542 -565056544542 -565056544542 -565056544542 -565056544542 -565056534d47 565056534d47 565056505553 56505556564c @@ -247008,15 +235433,12 @@ 56504554494e 565045544552 56504552455a -565045524544 565045523739 565045523137 5650454b4441 56504541364d 565045353138 565043515947 -565043515947 -565043515947 5650434f4d50 565043353732 562e5042524b @@ -247084,8 +235506,6 @@ 564f5a445958 564f5a445948 564f5a445558 -564f5a445558 -564f5a445548 564f5a42524d 564f5a344e4a 564f5a333437 @@ -247103,18 +235523,14 @@ 564f594e4554 564f594e4132 564f594d414e -564f594d414e 564f59484f54 564f59474552 -564f59414745 564f58593930 564f58583939 -564f5854454c 564f58535445 564f5852594b 564f58504f4f 564f58495656 -564f58495656 564f5846414e 564f58424f58 564f58424543 @@ -247172,8 +235588,6 @@ 564f56414e4c 564f56414e41 564f56414e35 -564f56414e31 -564f56414e31 564f56414c31 564f56414b41 564f5641494e @@ -247184,8 +235598,6 @@ 564f56413933 564f56413931 564f56413930 -564f56413930 -564f56413839 564f56413836 564f56413835 564f56413834 @@ -247193,7 +235605,6 @@ 564f56413753 564f56413739 564f56413737 -564f56413737 564f56413736 564f56413734 564f56413732 @@ -247210,9 +235621,7 @@ 564f56413434 564f56413332 564f56413331 -564f56413238 564f56413237 -564f56413233 564f56413139 564f56413138 564f56413137 @@ -247234,7 +235643,6 @@ 564f5554454e 564f55544531 564f55544442 -564f55544442 564f55535550 564f55533434 564f554c455a @@ -247271,7 +235679,6 @@ 564f54313337 564f53564f44 564f53554d49 -564f53544f4b 564f53544552 564f53543935 564f53543531 @@ -247295,7 +235702,6 @@ 564f534a4531 564f5348554e 564f53484b41 -564f53474553 564f53454d4f 564f53453533 564f53434845 @@ -247309,10 +235715,8 @@ 564f52555348 564f52554d53 564f52545551 -564f52544558 564f52544553 564f52544537 -564f52544143 564f52544135 564f52543358 564f52543039 @@ -247328,7 +235732,6 @@ 564f524f5641 564f524f542d 564f524f4e4e -564f524f4e41 564f524f4e35 564f524f4e33 564f524f4e32 @@ -247344,8 +235747,6 @@ 564f524d5342 564f524d4156 564f524d4143 -564f524c4f4e -564f524c4f4e 564f524c4f4b 564f524c4f47 564f524c304e @@ -247367,7 +235768,6 @@ 564f52393939 564f52393331 564f52385550 -564f52373737 564f52373238 564f52363636 564f52363136 @@ -247414,7 +235814,6 @@ 564f4f443030 564f4e5a4950 564f4e594141 -564f4e564f4e 564f4e55344b 564f4e544539 564f4e543536 @@ -247427,8 +235826,6 @@ 564f4e4f524e 564f4e4e5936 564f4e4e5931 -564f4e4e5931 -564f4e4e4945 564f4e4e3635 564f4e4c4b5a 564f4e4c4721 @@ -247437,7 +235834,6 @@ 564f4e4b3635 564f4e4a4a4c 564f4e494531 -564f4e494531 564f4e474f31 564f4e47454e 564f4e474159 @@ -247475,10 +235871,8 @@ 564f4c59424f 564f4c594141 564f4c594133 -564f4c564f53 564f4c564f51 564f4c564f4e -564f4c564f36 564f4c564f30 564f4c56494b 564f4c564131 @@ -247486,16 +235880,12 @@ 564f4c554e54 564f4c554e44 564f4c554d53 -564f4c554d45 564f4c554834 564f4c545a5a 564f4c544c49 564f4c54494d 564f4c54494b -564f4c54494b 564f4c54494a -564f4c544552 -564f4c544552 564f4c54454e 564f4c54454b 564f4c544531 @@ -247538,8 +235928,6 @@ 564f4c4f4b48 564f4c4f4b41 564f4c4f444a -564f4c4f4449 -564f4c4f4441 564f4c4f3834 564f4c4e4137 564f4c4d4552 @@ -247552,15 +235940,12 @@ 564f4c4c4932 564f4c4c4930 564f4c4c4549 -564f4c4c444f 564f4c4c4132 564f4c4c3636 564f4c4c3332 564f4c4b534f 564f4c4b5338 564f4c4b5332 -564f4c4b4f56 -564f4c4b4f56 564f4c4b4f52 564f4c4b4f4d 564f4c4b4c4c @@ -247574,7 +235959,6 @@ 564f4c4b3539 564f4c4b3336 564f4c4b3234 -564f4c4b3234 564f4c4b3233 564f4c4b3133 564f4c4a494e @@ -247593,7 +235977,6 @@ 564f4c474141 564f4c474135 564f4c474134 -564f4c474131 564f4c463737 564f4c455437 564f4c45524f @@ -247615,7 +235998,6 @@ 564f4c434446 564f4c434154 564f4c434152 -564f4c43414e 564f4c434145 564f4c424552 564f4c41594e @@ -247623,8 +236005,6 @@ 564f4c415332 564f4c414e53 564f4c414e4f -564f4c414e44 -564f4c414e44 564f4c414646 564f4c373930 564f4c363730 @@ -247634,7 +236014,6 @@ 564f4c333333 564f4c323434 564f4c323433 -564f4c313233 564f4c313230 564f4c313131 564f4c303731 @@ -247661,7 +236040,6 @@ 564f4a4f484e 564f4a4f4838 564f4a4a5044 -564f4a4a5044 564f4a49534f 564f4a494e44 564f4a474f43 @@ -247672,7 +236050,6 @@ 564f4a313334 564f49583535 564f49564f49 -564f49564f44 564f4954544f 564f49535332 564f49525858 @@ -247699,13 +236076,10 @@ 564f49435537 564f49434f49 564f49434931 -564f49434553 -564f49434553 564f4943454b 564f49434537 564f49434535 564f49434533 -564f49434531 564f49414e49 564f49393537 564f49313136 @@ -247716,7 +236090,6 @@ 564f47545858 564f47544552 564f47543739 -564f474f4e31 564f474e4552 564f474c4941 564f474c4552 @@ -247758,13 +236131,10 @@ 564f444b4552 564f444b4154 564f444b4147 -564f444b4141 564f444b4137 564f444b4134 564f444b4133 564f444b4132 -564f444b4131 -564f444b4131 564f444b4130 564f444b4121 564f44495331 @@ -247780,7 +236150,6 @@ 564f4441564f 564f44415649 564f4441464f -564f4441464f 564f44413636 564f44413133 564f44383631 @@ -247797,7 +236166,6 @@ 564f43455441 564f43415245 564f43415244 -564f43414c53 564f43414c4c 564f43313233 564f43304854 @@ -247835,7 +236203,6 @@ 564f324d4158 564f32444f52 564f32365641 -564f32303035 564f32303030 564f31564f31 564f31395641 @@ -247877,17 +236244,11 @@ 564e55484131 564e55465047 564e55434b44 -564e55434b44 564e55393538 564e5538334f 564e55344f4b 564e5534454b 564e55323939 -564e54544342 -564e54544342 -564e54544342 -564e54544342 -564e54544342 564e54534b47 564e544f3235 564e544a4847 @@ -247901,7 +236262,6 @@ 564e514c5745 564e5149484f 564e5059515a -564e50564e50 564e50555352 564e504b514b 564e50495043 @@ -247927,7 +236287,6 @@ 564e4b4b5132 564e4b434347 564e4b434346 -564e4b434346 564e4b424e42 564e4b363730 564e4b334d53 @@ -247992,7 +236351,6 @@ 564e38303043 564e37494b48 564e37373939 -564e37373939 564e37373737 564e37314b4f 564e37313231 @@ -248021,7 +236379,6 @@ 564e31393832 564e31393735 564e31375936 -564e31353030 564e31345330 564e31343532 564e30383032 @@ -248050,8 +236407,6 @@ 564d54363534 564d54353236 564d535a5355 -564d53544242 -564d53544242 564d53503331 564d53474e51 564d53415a52 @@ -248064,7 +236419,6 @@ 564d514d5851 564d5142544f 564d50544142 -564d50544142 564d50495245 564d50425547 56404d503152 @@ -248115,7 +236469,6 @@ 564d48333137 564d48314856 564d47544645 -564d47544645 564d47523639 564d474f4c44 564d474b4b5a @@ -248136,7 +236489,6 @@ 564d46323239 564d46323233 564d46323137 -564d46323134 564d46313431 564d46313231 564d454c4157 @@ -248152,7 +236504,6 @@ 564d43414844 564d43333334 564d42484b47 -564d42484b47 564d42363036 564d42343130 564d41585854 @@ -248227,7 +236578,6 @@ 564d30383130 564c59564454 564c59455347 -564c59455347 564c59313131 564c5859544c 564c57313533 @@ -248263,10 +236613,6 @@ 564c53434944 564c53313233 564c52544142 -564c52544142 -564c52544142 -564c52544142 -564c52504a48 564c52504a48 564c5249434f 564c52454544 @@ -248327,7 +236673,6 @@ 564c474e494b 564c464b5741 564c46484946 -564c46484946 564c46464854 564c46395431 564c46393432 @@ -248336,7 +236681,6 @@ 564c45545933 564c45515755 564c454e494e -564c454e494e 564c454e414d 564c454e3333 564c45493130 @@ -248356,7 +236700,6 @@ 564c434c524a 564c43373631 564c43343039 -564c43343039 564c42564c42 564c424b5643 564c42454c4b @@ -248364,9 +236707,7 @@ 564c41545445 564c4153594b 564c41535442 -564c41535441 564c41535349 -564c41534f56 564c41534b4f 564c41534948 564c4153414b @@ -248397,7 +236738,6 @@ 564c41445353 564c41445344 564c41444f56 -564c41444f53 564c41444f52 564c41444f4d 564c41444f31 @@ -248415,7 +236755,6 @@ 564c41444348 564c41444242 564c41444153 -564c41444152 564c41444136 564c41443933 564c41443932 @@ -248423,7 +236762,6 @@ 564c41443838 564c41443836 564c41443833 -564c41443737 564c41443735 564c41443638 564c41443637 @@ -248435,17 +236773,13 @@ 564c41443453 564c41443439 564c41443239 -564c41443238 564c41443234 564c41443136 -564c41443136 -564c41443131 564c41443039 564c41443038 564c41443034 564c41443032 564c41443031 -564c41443031 564c4142494f 564c41413935 564c4139494b @@ -248453,7 +236787,6 @@ 564c39513358 564c39465157 564c39404337 -564c39404337 564c39343031 564c384e3237 564c384c4f45 @@ -248530,17 +236863,10 @@ 564b524b3135 564b52473831 564b52425747 -564b52425747 564b52333932 564b51545a41 -564b51545a41 -564b51545a41 -564b51545a41 -564b51545a41 -564b51545a41 564b51544148 564b51534847 -564b51534847 564b514c4248 564b51434d44 564b50564b50 @@ -248591,7 +236917,6 @@ 564b45525441 564b454d414c 564b45484846 -564b45484846 564b4454364c 564b44504242 564b444f474e @@ -248691,13 +237016,11 @@ 564a594a5646 564a59484a43 564a59474847 -564a59474847 564a59465642 564a59464c46 564a59464656 564a59463838 564a5942594a -564a59425246 564a59424e4a 564a59343138 564a5850334f @@ -248732,7 +237055,6 @@ 564a52313131 564a51524e46 564a51524a4e -564a51524a4e 564a514e4548 564a514c544c 564a514c374b @@ -248748,10 +237070,6 @@ 564a505a4747 564a50553931 564a50553230 -564a50545941 -564a50545941 -564a50545941 -564a50545941 564a5053484d 564a5051574a 564a504e324d @@ -248793,7 +237111,6 @@ 564a4b594648 564a4b584559 564a4b4d5246 -564a4b4d5246 564a4b4d4e42 564a4b4d3835 564a4b4c4248 From be7ab51df592c055b6f4747c93417bcdb3642946 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Sun, 9 Apr 2023 19:04:36 +0200 Subject: [PATCH 372/924] update documentation x2 --- client/luascripts/hf_mf_ultimatecard.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/luascripts/hf_mf_ultimatecard.lua b/client/luascripts/hf_mf_ultimatecard.lua index 8ba901a6e..09b53937f 100644 --- a/client/luascripts/hf_mf_ultimatecard.lua +++ b/client/luascripts/hf_mf_ultimatecard.lua @@ -39,7 +39,7 @@ example = [[ ]]..ansicolors.yellow..[[script run hf_mf_ultimatecard -k ffffffff -w 1]]..ansicolors.reset..[[ -- Wipe tag, turn into NTAG215, set sig, version, NTAG pwd/pak, and OTP. - ]]..ansicolors.yellow..[[script run hf_mf_ultimatecard -w 1 -t 15 -u 04112233445566 -s 112233445566778899001122334455667788990011223344556677 -p FFFFFFFF -a 8080 -o 11111111]]..ansicolors.reset..[[ + ]]..ansicolors.yellow..[[script run hf_mf_ultimatecard -w 1 -t 18 -u 04112233445566 -s 112233445566778899001122334455667788990011223344556677 -p FFFFFFFF -a 8080 -o 11111111]]..ansicolors.reset..[[ ]] usage = [[ From 344105a4ed2910e01811eb2823e32c578e0d2ac9 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Sun, 9 Apr 2023 19:05:56 +0200 Subject: [PATCH 373/924] update documentation x3 --- doc/magic_cards_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index f2bc1c1e2..fa5cd0a64 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -1232,7 +1232,7 @@ Example usage -- use a non default UMC key. Only use this if the default key for the MAGIC CARD was changed. script run hf_mf_ultimatecard -k ffffffff -w 1 -- Wipe tag, turn into NTAG215, set sig, version, NTAG pwd/pak, and OTP. - script run hf_mf_ultimatecard -w 1 -t 15 -u 04112233445566 -s 112233445566778899001122334455667788990011223344556677 -p FFFFFFFF -a 8080 -o 11111111 + script run hf_mf_ultimatecard -w 1 -t 18 -u 04112233445566 -s 112233445566778899001122334455667788990011223344556677 -p FFFFFFFF -a 8080 -o 11111111 ``` Special raw commands summary: From 05a0fa7f3f3a928b4f308f9d8e4cb4452a6dd09b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Apr 2023 20:04:31 +0200 Subject: [PATCH 374/924] added some keys from discord --- client/dictionaries/mfc_default_keys.dic | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 4b6d2c9b6..1cd3b0d79 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2101,3 +2101,7 @@ C670A9AD6066 # # Food GEM 6686FADE5566 +# +# Data from Discord, French pool +9B7C25052FC3 +494446555455 From 0b8514bab0d59ea2e3e162cb82b5d5033e2f8e0c Mon Sep 17 00:00:00 2001 From: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> Date: Tue, 11 Apr 2023 18:08:07 +0300 Subject: [PATCH 375/924] Add iKey blanks Too much stuff we don't know yet. The cloners cost too much. Signed-off-by: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> --- doc/magic_cards_notes.md | 43 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index fa5cd0a64..f37ae22a9 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -15,6 +15,7 @@ Useful docs: * [MIFARE Classic block0](#mifare-classic-block0) * [MIFARE Classic Gen1A aka UID](#mifare-classic-gen1a-aka-uid) * [MIFARE Classic Gen1B](#mifare-classic-gen1b) + * [MIFARE Classic Gen1A OTP/One Time Programming](#mifare-classic-gen1a-otp/one-time-programming) * [MIFARE Classic DirectWrite aka Gen2 aka CUID](#mifare-classic-directwrite-aka-gen2-aka-cuid) * [MIFARE Classic DirectWrite, FUID version aka 1-write](#mifare-classic-directwrite-fuid-version-aka-1-write) * [MIFARE Classic DirectWrite, UFUID version](#mifare-classic-directwrite-ufuid-version) @@ -264,7 +265,32 @@ hf 14a info * Read: `40(7)`, `30xx` * Write: `40(7)`, `A0xx`+crc, `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`+crc +## MIFARE Classic Gen1A OTP/One Time Programming +^[Top](#top) +aka MF OTP 2.0 + +Similar to Gen1A, but after first block 0 edit, tag no longer replies to 0x40 command. + +Initial UID is 00000000 + +All bytes are 00 from factory wherever possible. + +### Identify +^[Top](#top) + +Only possible before personalization. + +``` +hf 14a info +... +[+] Magic capabilities : Gen 1a +``` + +### Magic commands +^[Top](#top) + +* Write: `40(7)`, `43`, `A0xx`+crc, `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`+crc ## MIFARE Classic DirectWrite aka Gen2 aka CUID ^[Top](#top) @@ -414,6 +440,8 @@ hf 14a reader ## MIFARE Classic DirectWrite, FUID version aka 1-write ^[Top](#top) +aka. MF OTP + Same as MIFARE Classic DirectWrite, but block0 can be written only once. Initial UID is AA55C396 @@ -545,7 +573,7 @@ When writing to persistent memory it is possible to write _bad_ ACL and perm-bri **OBS** -It is possible to write a configuration that perma locks the tag, ie no more magic +It is possible to write a configuration that perma locks the tag, i.e. no more magic ### Identify ^[Top](#top) @@ -844,6 +872,8 @@ See `--uid` and `--full` ## MIFARE Ultralight EV1 DirectWrite ^[Top](#top) +aka. UL2 + Similar to MFUL DirectWrite ### Identify @@ -880,6 +910,12 @@ hf 14a info * BCC: play blindly the block0 BCC0 and block2 BCC1 bytes, beware! * ATS: 850000A00A000AC30004030101000B0316D7 +#### MIFARE Ultralight EV1 DirectWrite flavour 3 +^[Top](#top) + +* BCC: play blindly the block0 BCC0 and block2 BCC1 bytes, beware! +* ATS: 850000A000000A3C0004030101000E03 + ## MIFARE Ultralight C Gen1A ^[Top](#top) @@ -919,6 +955,11 @@ hf 14a info * ATS: 0A78008102DBA0C119402AB5 * Anticol shortcut (CL1/3000): fails +**TODO** + +* UL-X, UL-Y, UL-Z, ULtra, UL-5 ? + + # NTAG ^[Top](#top) From 9c5079dc9d34ee3866fdd0ecbf1d2f058760cc4f Mon Sep 17 00:00:00 2001 From: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> Date: Tue, 11 Apr 2023 18:44:19 +0300 Subject: [PATCH 376/924] Add iKey blanks Too much we don't know. Their cloners are expensive... Signed-off-by: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> --- doc/magic_cards_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index f37ae22a9..4775b6cdc 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -15,7 +15,7 @@ Useful docs: * [MIFARE Classic block0](#mifare-classic-block0) * [MIFARE Classic Gen1A aka UID](#mifare-classic-gen1a-aka-uid) * [MIFARE Classic Gen1B](#mifare-classic-gen1b) - * [MIFARE Classic Gen1A OTP/One Time Programming](#mifare-classic-gen1a-otp/one-time-programming) + * [MIFARE Classic Gen1A OTP/One Time Programming](#mifare-classic-gen1a-otpone-time-programming) * [MIFARE Classic DirectWrite aka Gen2 aka CUID](#mifare-classic-directwrite-aka-gen2-aka-cuid) * [MIFARE Classic DirectWrite, FUID version aka 1-write](#mifare-classic-directwrite-fuid-version-aka-1-write) * [MIFARE Classic DirectWrite, UFUID version](#mifare-classic-directwrite-ufuid-version) From 022c06c596d8bbcd15a4321953c8fd901542de1d Mon Sep 17 00:00:00 2001 From: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> Date: Tue, 11 Apr 2023 19:14:55 +0300 Subject: [PATCH 377/924] Fix a bug I can't code Signed-off-by: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> --- client/src/cmdhfmfp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 6b9c3230d..b6d4aa96a 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -596,8 +596,7 @@ static int CmdHFMFPInitPerso(const char *Cmd) { static int CmdHFMFPCommitPerso(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp commitp", - "Executes Commit Perso command. Can be used in SL0 mode only.", - "OBS! This command will not be executed if CardConfigKey, CardMasterKey and L3SwitchKey AES keys are not written.", + "Executes Commit Perso command. Can be used in SL0 mode only.\nOBS! This command will not be executed if CardConfigKey, CardMasterKey and L3SwitchKey AES keys are not written.", "hf mfp commitp\n" // "hf mfp commitp --sl 1" ); From ef9e14da3bcc96af959f54dda8629ad81d926695 Mon Sep 17 00:00:00 2001 From: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> Date: Tue, 11 Apr 2023 19:42:46 +0300 Subject: [PATCH 378/924] grammar correction, add 1 missing definition Signed-off-by: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> --- doc/magic_cards_notes.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/magic_cards_notes.md b/doc/magic_cards_notes.md index 4775b6cdc..c588d3b54 100644 --- a/doc/magic_cards_notes.md +++ b/doc/magic_cards_notes.md @@ -109,6 +109,8 @@ UID 7b: ## MIFARE Classic Gen1A aka UID ^[Top](#top) +aka MF ZERO + ### Identify ^[Top](#top) @@ -440,7 +442,7 @@ hf 14a reader ## MIFARE Classic DirectWrite, FUID version aka 1-write ^[Top](#top) -aka. MF OTP +aka MF OTP Same as MIFARE Classic DirectWrite, but block0 can be written only once. @@ -872,7 +874,7 @@ See `--uid` and `--full` ## MIFARE Ultralight EV1 DirectWrite ^[Top](#top) -aka. UL2 +aka UL2 Similar to MFUL DirectWrite From a78cc4223052f02c306ea355ae31b53a80184484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C5=BEe=20Jen=C5=A1terle?= Date: Wed, 12 Apr 2023 13:31:54 +0200 Subject: [PATCH 379/924] Added Siemens Default key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Anže Jenšterle --- client/dictionaries/mfdes_default_keys.dic | 1 + 1 file changed, 1 insertion(+) diff --git a/client/dictionaries/mfdes_default_keys.dic b/client/dictionaries/mfdes_default_keys.dic index 7a92e895d..fbf3a459f 100644 --- a/client/dictionaries/mfdes_default_keys.dic +++ b/client/dictionaries/mfdes_default_keys.dic @@ -23,6 +23,7 @@ f7ddac306ae266ccf90bc11ee46d513b a0a1a2a3a4a5a6a7a0a1a2a3a4a5a6a7 b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7 b0b1b2b3b4b5b6b7b8b9babbbcbdbebf +a0a1a2a3b0b1b2b3c0c1c2c3d0d1d2d3 d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 C238E449F725B1510EAA699550CABA16 # J2A040 11111111111111111111111111111111 From d5cd08b30e621ff1d20ef67b8382fc9dc27edbc0 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Thu, 13 Apr 2023 01:10:07 +0800 Subject: [PATCH 380/924] Fix the USB enumeration process Keep the interval between usb_enable() and AT91F_CDC_Enumerate() as short as possible --- armsrc/appmain.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index ebc7ecb27..f68739da2 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2722,12 +2722,6 @@ void __attribute__((noreturn)) AppMain(void) { usart_init(USART_BAUD_RATE, USART_PARITY); #endif - // This is made as late as possible to ensure enumeration without timeout - // against device such as http://www.hobbytronics.co.uk/usb-host-board-v2 - usb_disable(); - usb_enable(); - allow_send_wtx = true; - #ifdef WITH_FLASH // If flash is not present, BUSY_TIMEOUT kicks in, let's do it after USB loadT55xxConfig(); @@ -2735,9 +2729,18 @@ void __attribute__((noreturn)) AppMain(void) { // // Enforce a spiffs check/garbage collection at boot so we are likely to never // fall under the 2 contigous free blocks availables + // This is a time-consuming process on large flash. rdv40_spiffs_check(); #endif + // This is made as late as possible to ensure enumeration without timeout + // against device such as http://www.hobbytronics.co.uk/usb-host-board-v2 + // In other words, keep the interval between usb_enable() and the main loop as short as possible. + // (AT91F_CDC_Enumerate() will be called in the main loop) + usb_disable(); + usb_enable(); + allow_send_wtx = true; + for (;;) { WDT_HIT(); From 4ede50e865f305fe79f148541661627e4b72a767 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Thu, 13 Apr 2023 01:13:48 +0800 Subject: [PATCH 381/924] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3c83e155..f57df0761 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed the USB enumeration process (@wh201906) - Fixed `hf mf rdsc` - now correctly gets size in bytes when sector is larger than 32 (@iceman1001) - Changed `hf mf supercard` - Support editing UID and recovery of keys from second generation card (@AloneLiberty) - Added iClass credit key to default iClass key table and reorganized key order (@GuruSteve) From 3a87979a22a14040c3dbf6283ea022c9d94edb52 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Thu, 13 Apr 2023 01:23:50 +0800 Subject: [PATCH 382/924] Add the missing definition for commit 79cfa1d8faa56c390a045d779b997633b357c515 (Although this definition is unused) --- include/pmflash.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/pmflash.h b/include/pmflash.h index f0deac507..65e373f8f 100644 --- a/include/pmflash.h +++ b/include/pmflash.h @@ -91,9 +91,9 @@ typedef struct { uint8_t signature[FLASH_MEM_SIGNATURE_LEN]; } PACKED rdv40_validation_t; -// SPIFFS current allocates 128kb of the 256kb available. +// SPIFFS current allocates 192KB of the 256KB available. #ifndef FLASH_SPIFFS_ALLOCATED_SIZE -# define FLASH_SPIFFS_ALLOCATED_SIZE (1024 * 128) +# define FLASH_SPIFFS_ALLOCATED_SIZE (1024 * 192) #endif #endif // __PMFLASH_H From 62fb634fdbaed318bbefd15ccbf90e35db0fc10b Mon Sep 17 00:00:00 2001 From: PiervitoCreanza Date: Thu, 13 Apr 2023 20:29:15 +0200 Subject: [PATCH 383/924] Fix wrong variable assignment --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 153d3a8ce..765342ec2 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -7986,7 +7986,7 @@ static int CmdHF14AMfValue(const char *Cmd) { PrintAndLogEx(WARNING, "Input key type must be A or B"); return PM3_EINVARG; } else if (arg_get_lit(ctx, 10)) { - keytype = MF_KEY_B;; + transferkeytype = MF_KEY_B;; } int keylen = 0; From f022a8f96e77e6c2894260e5589e09f6e5b3934e Mon Sep 17 00:00:00 2001 From: astrid rowland Date: Thu, 13 Apr 2023 14:44:03 -0500 Subject: [PATCH 384/924] added new keys from The Horde --- client/dictionaries/mfc_default_keys.dic | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 1cd3b0d79..665757f25 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2029,9 +2029,8 @@ D144BD193063 8627C10A7014 453857395635 # -# Data from "the more, the marriott" mifare project (colonel borkmundus) -# -# Isn't theirs Saflok ? +# Data from "the more the marriott" mifare project (colonelborkmundus) +# aka The Horde # # 20230125-01, Elite Member Marriott Rewards 43012BD9EB87 @@ -2098,6 +2097,15 @@ C49DAE1C6049 6E029927600D 3E173F64C01C C670A9AD6066 +# 20230413-69, Westin +487339FA02E0 +# 20230413-70, Marriott Bonvoy +DBD5CA4EE467 +A0B1F234006C +180DE12B700E +# 20230413-71, Westin +1352C68F7A56 +# # # Food GEM 6686FADE5566 From 17aa99b0c70adf489765efc7af458fb2165265c6 Mon Sep 17 00:00:00 2001 From: astrid rowland Date: Thu, 13 Apr 2023 17:44:55 -0500 Subject: [PATCH 385/924] added new keys from The Horde, badges 76-94 --- client/dictionaries/mfc_default_keys.dic | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 665757f25..4af8cf64a 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2105,6 +2105,43 @@ A0B1F234006C 180DE12B700E # 20230413-71, Westin 1352C68F7A56 +# 20230413-76, Ritz Carlton +318BD98C1CEF +# 20230413-77, Marriott +D23C1CB1216E +# 20230413-78, Caesars +A1D92F808CAF +# 20230413-79, The Cosmopolitan, Vegas +96A301BCE267 +# 20230413-80, Aria +1153C319B4F8 +# 20230413-81, Aria +110C819BBEF8 +# 20230413-82, Aria +1332117E8756 +# 20230413-83, Kimpton +500AE915F50A +5032E362B484 +8B63AB712753 +# 20230413-85, Kimpton +06106E187106 +2E45C23DC541 +D9FF8BEE7550 +# 20230413-87, Marriott +42F7A186BF87 +# 20230413-88, Meritage Resort +D213B093B79A +# 20230413-89, Meritage Resort +216024C49EDF +# 20230413-90, Gaylord Palms +D201DBB6AB6E +# 20230413-91, Residence Inn +9F4AD875BB30 +# 20230413-92, Marriott +3352DB1E8777 +# 20230413-94, Marriott +09074A146605 +151F3E85EC46 # # # Food GEM From 1bb78e02a4e788ee27ee72f3208b6e7fe08ec9d9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 15 Apr 2023 20:44:52 +0200 Subject: [PATCH 386/924] fix MFP check with defines and easier logic --- client/src/cmdhfmfp.c | 13 +++++++------ client/src/mifare/mifare4.c | 6 ++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index b6d4aa96a..7646953e8 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1023,8 +1023,8 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA keyn[1] = uKeyNum & 0xff; for (int retry = 0; retry < 4; retry++) { - res = MifareAuth4(NULL, keyn, keyList[i], selectCard, true, false, false, true); - if (res != 2) + res = MifareAuth4(NULL, keyn, keyList[i], selectCard, true, false, false, true); + if (res == PM3_SUCCESS || PM3_EWRONGANSWER) break; if (verbose) @@ -1041,7 +1041,7 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA PrintAndLogEx(WARNING, "\nsector %02d key %d [%s] res: %d", sector, keyAB, sprint_hex_inrow(keyList[i], 16), res); // key for [sector,keyAB] found - if (res == 0) { + if (res == PM3_SUCCESS) { if (verbose) PrintAndLogEx(INFO, "\nFound key for sector %d key %s [%s]", sector, keyAB == 0 ? "A" : "B", sprint_hex_inrow(keyList[i], 16)); else @@ -1055,9 +1055,10 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA break; } - // 5 - auth error (rnd not equal) - // PM3 client says that RND not equal is -16. Corrected. Seems to work. - if (res != -16) { + // RES can be: + // PM3_ERFTRANS -7 + // PM3_EWRONGANSWER -16 + if (res == PM3_ERFTRANS) { if (verbose) PrintAndLogEx(ERR, "\nExchange error. Aborted."); else diff --git a/client/src/mifare/mifare4.c b/client/src/mifare/mifare4.c index 058390659..f42111ba8 100644 --- a/client/src/mifare/mifare4.c +++ b/client/src/mifare/mifare4.c @@ -289,8 +289,9 @@ int MifareAuth4(mf4Session_t *mf4session, uint8_t *keyn, uint8_t *key, bool acti uint8_t kenc[16] = {0}; memcpy(&kenc[0], &RndA[11], 5); memcpy(&kenc[5], &RndB[11], 5); - for (int i = 0; i < 5; i++) + for (int i = 0; i < 5; i++) { kenc[10 + i] = RndA[4 + i] ^ RndB[4 + i]; + } kenc[15] = 0x11; aes_encode(NULL, key, kenc, kenc, 16); @@ -301,8 +302,9 @@ int MifareAuth4(mf4Session_t *mf4session, uint8_t *keyn, uint8_t *key, bool acti uint8_t kmac[16] = {0}; memcpy(&kmac[0], &RndA[7], 5); memcpy(&kmac[5], &RndB[7], 5); - for (int i = 0; i < 5; i++) + for (int i = 0; i < 5; i++) { kmac[10 + i] = RndA[0 + i] ^ RndB[0 + i]; + } kmac[15] = 0x22; aes_encode(NULL, key, kmac, kmac, 16); From ba3d5c32ae7abd652f016b25509a9b205edb1191 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Sun, 16 Apr 2023 09:51:07 +0800 Subject: [PATCH 387/924] Fix logic --- client/src/cmdhfmfp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 7646953e8..7c45455f4 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1024,7 +1024,7 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA for (int retry = 0; retry < 4; retry++) { res = MifareAuth4(NULL, keyn, keyList[i], selectCard, true, false, false, true); - if (res == PM3_SUCCESS || PM3_EWRONGANSWER) + if (res == PM3_SUCCESS || res == PM3_EWRONGANSWER) break; if (verbose) From 0a66f809a6830a78fd846f413e1823949297b5f4 Mon Sep 17 00:00:00 2001 From: Angel Date: Sat, 15 Apr 2023 22:23:06 -0400 Subject: [PATCH 388/924] Removed deprecated CRC calculation --- client/src/cmdlfparadox.c | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index a2fa50f11..f18444737 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -36,13 +36,6 @@ #include "cliparser.h" static int CmdHelp(const char *Cmd); - -static const uint8_t paradox_lut[] = { - 0xDB, 0xFC, 0x3F, 0xC5, 0x50, 0x14, 0x05, 0x47, - 0x9F, 0xED, 0x7D, 0x59, 0x22, 0x84, 0x21, 0x4E, - 0x39, 0x48, 0x12, 0x88, 0x53, 0xDE, 0xBB, 0xE4, - 0xB4, 0x2D, 0x4D, 0x55, 0xCA, 0xBE, 0xA3, 0xE2 -}; // FC:108, Card01827 // 00000000 01101100 00000111 00100011 // hex(0xED xor 0x7D xor 0x22 xor 0x84 xor 0xDE xor 0xBB xor 0xE4 xor 0x4D xor 0xA3 xor 0xE2 xor 0x47) 0xFC @@ -135,29 +128,6 @@ int demodParadox(bool verbose) { uint32_t cardnum = (lo >> 10) & 0xFFFF; uint8_t chksum = (lo >> 2) & 0xFF; - - // Calc CRC & Checksum - // 000088f0b - FC: 8 - Card: 36619 - Checksum: 05 - RAW: 0f55555559595aa559a5566a - // checksum? - uint8_t calc_chksum = 0x47; - uint8_t pos = 0; - for (uint8_t i = 0; i < 8; i++) { - - uint8_t ice = rawhex[i + 1]; - for (uint8_t j = 0x80; j > 0; j >>= 2) { - - if (ice & j) { - calc_chksum ^= paradox_lut[pos]; - } - pos++; - } - } - - uint32_t crc = CRC8Maxim(rawhex + 1, 8); - PrintAndLogEx(DEBUG, " FSK/MAN raw : %s", sprint_hex(rawhex, sizeof(rawhex))); - PrintAndLogEx(DEBUG, " raw : %s = (maxim crc8) %02x == %02x", sprint_hex(rawhex + 1, 8), crc, calc_chksum); -// PrintAndLogEx(DEBUG, " OTHER sample CRC-8/MAXIM : 55 55 69 A5 55 6A 59 5A = FC"); - uint32_t rawLo = bytebits_to_byte(bits + idx + 64, 32); uint32_t rawHi = bytebits_to_byte(bits + idx + 32, 32); uint32_t rawHi2 = bytebits_to_byte(bits + idx, 32); From ab460c4a226f82b3e3903fe30dc03e2a7993da2f Mon Sep 17 00:00:00 2001 From: Angel Date: Sat, 15 Apr 2023 22:25:20 -0400 Subject: [PATCH 389/924] Extract bitstream creation to function. --- client/src/cmdlfparadox.c | 93 +++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index f18444737..186bdd28d 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -46,6 +46,54 @@ static int CmdHelp(const char *Cmd); // Paradox Prox demod - FSK2a RF/50 with preamble of 00001111 (then manchester encoded) // print full Paradox Prox ID and some bit format details if found +// This function will calculate the bitstream for a paradox card and place the result in bs. +// It returns the calculated CRC from the fc and cn. +// CRC calculation by mwalker33 +static uint8_t GetParadoxBits(const unsigned long fc, const unsigned long cn, unsigned int *bs){ + + uint8_t manchester[13] = { 0x00 }; // check size needed + uint32_t t1; + + manchester[0] = 0x0F; // preamble + manchester[1] = 0x05; // Leading zeros - Note: from this byte on, is part of the CRC calculation + manchester[2] = 0x55; // Leading zeros its 4 bits out for the CRC, so we need to move + manchester[3] = 0x55; // Leading zeros back 4 bits once we have the crc (done below) + + // add FC + t1 = manchesterEncode2Bytes(fc); + manchester[4] = (t1 >> 8) & 0xFF; + manchester[5] = t1 & 0xFF; + + // add cn + t1 = manchesterEncode2Bytes(cn); + manchester[6] = (t1 >> 24) & 0xFF; + manchester[7] = (t1 >> 16) & 0xFF; + manchester[8] = (t1 >> 8) & 0xFF; + manchester[9] = t1 & 0xFF; + + uint8_t crc = (CRC8Maxim(manchester + 1, 9) ^ 0x6) & 0xFF; + + // add crc + t1 = manchesterEncode2Bytes(crc); + manchester[10] = (t1 >> 8) & 0xFF; + manchester[11] = t1 & 0xFF; + + // move left 4 bits left 4 bits - Now that we have the CRC we need to re-align the data. + for (int i = 1; i < 12; i++) + manchester[i] = (manchester[i] << 4) + (manchester[i + 1] >> 4); + + // Add trailing 1010 (11) + manchester[11] |= (1 << 3); + manchester[11] |= (1 << 1); + + // move into tag blocks + + for (int i = 0; i < 12; i++) + bs[1 + (i / 4)] += (manchester[i] << (8 * (3 - i % 4))); + + return crc; +} + int demodParadox(bool verbose) { (void) verbose; // unused so far //raw fsk demod no manchester decoding no start bit finding just get binary from wave @@ -132,6 +180,12 @@ int demodParadox(bool verbose) { uint32_t rawHi = bytebits_to_byte(bits + idx + 32, 32); uint32_t rawHi2 = bytebits_to_byte(bits + idx, 32); + uint32_t blocks[4] = {0}; + uint8_t crc = GetParadoxBits(fc,cardnum,blocks); + if(chksum != crc) + PrintAndLogEx(ERR,"CRC Error! Calculated CRC is " _GREEN_("%d") " but card CRC is " _RED_("%d") ".",crc,chksum); + + PrintAndLogEx(INFO, "Paradox - ID: " _GREEN_("%x%08x") " FC: " _GREEN_("%d") " Card: " _GREEN_("%d") ", Checksum: %02x, Raw: %08x%08x%08x", hi >> 10, (hi & 0x3) << 26 | (lo >> 10), @@ -245,44 +299,7 @@ static int CmdParadoxClone(const char *Cmd) { blocks[i] = bytes_to_num(raw + ((i - 1) * 4), sizeof(uint32_t)); } } else { - uint8_t manchester[13] = { 0x00 }; // check size needed - uint32_t t1; - - manchester[0] = 0x0F; // preamble - manchester[1] = 0x05; // Leading zeros - Note: from this byte on, is part of the CRC calculation - manchester[2] = 0x55; // Leading zeros its 4 bits out for the CRC, so we need too move - manchester[3] = 0x55; // Leading zeros back 4 bits once we have the crc (done below) - - // add FC - t1 = manchesterEncode2Bytes(fc); - manchester[4] = (t1 >> 8) & 0xFF; - manchester[5] = t1 & 0xFF; - - // add cn - t1 = manchesterEncode2Bytes(cn); - manchester[6] = (t1 >> 24) & 0xFF; - manchester[7] = (t1 >> 16) & 0xFF; - manchester[8] = (t1 >> 8) & 0xFF; - manchester[9] = t1 & 0xFF; - - uint8_t crc = (CRC8Maxim(manchester + 1, 9) ^ 0x6) & 0xFF; - - // add crc - t1 = manchesterEncode2Bytes(crc); - manchester[10] = (t1 >> 8) & 0xFF; - manchester[11] = t1 & 0xFF; - - // move left 4 bits left 4 bits - Now that we have the CRC we need to re-align the data. - for (int i = 1; i < 12; i++) - manchester[i] = (manchester[i] << 4) + (manchester[i + 1] >> 4); - - // Add trailing 1010 (11) - manchester[11] |= (1 << 3); - manchester[11] |= (1 << 1); - - // move into tag blocks - for (int i = 0; i < 12; i++) - blocks[1 + (i / 4)] += (manchester[i] << (8 * (3 - i % 4))); + GetParadoxBits(fc, cn, blocks); } // Paradox - FSK2a, data rate 50, 3 data blocks From 76e3f38772d97d0f54d1b0895606e1e8b640e2f7 Mon Sep 17 00:00:00 2001 From: Angel Date: Sat, 15 Apr 2023 22:26:09 -0400 Subject: [PATCH 390/924] Add check to make sure user did not specify Raw and cn/fc --- client/src/cmdlfparadox.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 186bdd28d..97def9789 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -287,6 +287,11 @@ static int CmdParadoxClone(const char *Cmd) { return PM3_EINVARG; } + if ((fc || cn) && raw_len != 0) { + PrintAndLogEx(FAILED, "Can't specify both FC/CN and RAW at the same time"); + return PM3_EINVARG; + } + uint32_t blocks[4] = {0}; if (raw_len != 0) { From 8841991b297c8404858c180e8ffa1c633f802cc3 Mon Sep 17 00:00:00 2001 From: Angel Date: Sat, 15 Apr 2023 22:42:03 -0400 Subject: [PATCH 391/924] Add check for max fc and cn, changed types to match rest of file --- client/src/cmdlfparadox.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 97def9789..757544fb4 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -49,7 +49,7 @@ static int CmdHelp(const char *Cmd); // This function will calculate the bitstream for a paradox card and place the result in bs. // It returns the calculated CRC from the fc and cn. // CRC calculation by mwalker33 -static uint8_t GetParadoxBits(const unsigned long fc, const unsigned long cn, unsigned int *bs){ +static uint8_t GetParadoxBits(const uint32_t fc, const uint32_t cn, unsigned int *bs){ uint8_t manchester[13] = { 0x00 }; // check size needed uint32_t t1; @@ -292,6 +292,11 @@ static int CmdParadoxClone(const char *Cmd) { return PM3_EINVARG; } + if (fc > 999 || cn > 99999){ + PrintAndLogEx(FAILED, "FC has a max value of 999 and CN has a max value of 99999"); + return PM3_EINVARG; + } + uint32_t blocks[4] = {0}; if (raw_len != 0) { @@ -304,6 +309,7 @@ static int CmdParadoxClone(const char *Cmd) { blocks[i] = bytes_to_num(raw + ((i - 1) * 4), sizeof(uint32_t)); } } else { + //This function generates the bitstream and puts it in blocks. it returns the crc but we don't need it here GetParadoxBits(fc, cn, blocks); } From 5192c5f5d5febaed781bd77287fe8778b6e0b666 Mon Sep 17 00:00:00 2001 From: Angel Date: Sat, 15 Apr 2023 23:20:48 -0400 Subject: [PATCH 392/924] Added ability to emulate paradox tag. --- client/src/cmdlfparadox.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 757544fb4..6cff88c86 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -254,7 +254,7 @@ static int CmdParadoxClone(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf paradox clone", "clone a paradox tag to a T55x7, Q5/T5555 or EM4305/4469 tag.", - "lf paradox clone --fc 96 --cn 40426 -> encode for T55x7 tag with fc and cn\n" + "lf paradox clone --fc 96 --cn 40426 [--q5|--em] -> encode for T55x7 tag with fc and cn\n" "lf paradox clone --raw 0f55555695596a6a9999a59a -> encode for T55x7 tag\n" "lf paradox clone --raw 0f55555695596a6a9999a59a --q5 -> encode for Q5/T5555 tag\n" "lf paradox clone --raw 0f55555695596a6a9999a59a --em -> encode for EM4305/4469" @@ -353,12 +353,15 @@ static int CmdParadoxSim(const char *Cmd) { CLIParserInit(&ctx, "lf paradox sim", "Enables simulation of paradox card with specified card number.\n" "Simulation runs until the button is pressed or another USB command is issued.", - "lf paradox sim --raw 0f55555695596a6a9999a59a" + "lf paradox sim --raw 0f55555695596a6a9999a59a -> simulate tag" + "lf paradox clone --fc 96 --cn 40426 -> simulate tag with fc and cn\n" ); void *argtable[] = { arg_param_begin, arg_str0("r", "raw", "", " raw hex data. 12 bytes"), + arg_u64_0(NULL, "fc", "", "facility code"), + arg_u64_0(NULL, "cn", "", "card number"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -367,13 +370,32 @@ static int CmdParadoxSim(const char *Cmd) { // skip first block, 3*4 = 12 bytes left uint8_t raw[12] = {0}; CLIGetHexWithReturn(ctx, 1, raw, &raw_len); + + uint32_t fc = arg_get_u32_def(ctx, 2, 0); + uint32_t cn = arg_get_u32_def(ctx, 3, 0); CLIParserFree(ctx); - if (raw_len != 12) { - PrintAndLogEx(ERR, "Data must be 12 bytes (24 HEX characters) %d", raw_len); + if ((fc || cn) && raw_len != 0) { + PrintAndLogEx(FAILED, "Can't specify both FC/CN and RAW at the same time"); return PM3_EINVARG; } + if (fc > 999 || cn > 99999){ + PrintAndLogEx(FAILED, "FC has a max value of 999 and CN has a max value of 99999"); + return PM3_EINVARG; + } + if (raw_len != 0) { + if (raw_len != 12) { + PrintAndLogEx(ERR, "Data must be 12 bytes (24 HEX characters) %d", raw_len); + return PM3_EINVARG; + } + } else{ + uint32_t blocks[4] = {0}; + GetParadoxBits(fc,cn,blocks); + for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { + num_to_bytes(blocks[i], sizeof(uint32_t), raw + ((i - 1) * 4)); + } + } PrintAndLogEx(SUCCESS, "Simulating Paradox - raw " _YELLOW_("%s"), sprint_hex_inrow(raw, sizeof(raw))); uint8_t bs[sizeof(raw) * 8]; From 98438c8dd764db1118c645b1f905bf427c7e6ce1 Mon Sep 17 00:00:00 2001 From: Angel Date: Sat, 15 Apr 2023 23:26:34 -0400 Subject: [PATCH 393/924] Remove redundant comment. --- client/src/cmdlfparadox.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 6cff88c86..79cebb86d 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -424,21 +424,8 @@ static int CmdParadoxSim(const char *Cmd) { return PM3_SUCCESS; } -/* - if (sscanf(Cmd, "%u %u", &fc, &cn) != 2) return usage_lf_paradox_sim(); - facilitycode = (fc & 0x000000FF); - cardnumber = (cn & 0x0000FFFF); - - // if ( GetParadoxBits(facilitycode, cardnumber, bs) != PM3_SUCCESS) { - // PrintAndLogEx(ERR, "Error with tag bitstream generation."); - // return 1; - // } - - PrintAndLogEx(NORMAL, "Simulating Paradox - Facility Code: %u, CardNumber: %u", facilitycode, cardnumber); - -*/ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdParadoxDemod, AlwaysAvailable, "demodulate a Paradox FSK tag from the GraphBuffer"}, From 03070778a2aae68bdc1c08028f692944c10f1a0d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 16 Apr 2023 05:58:34 +0200 Subject: [PATCH 394/924] mfp chk - allow for breaking out at every attempt --- client/src/cmdhfmfp.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 7c45455f4..b079e15c1 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1006,15 +1006,17 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA for (uint8_t keyAB = startKeyAB; keyAB <= endKeyAB; keyAB++) { // main cycle with key check for (int i = 0; i < keyListLen; i++) { + + // allow client abort every iteration + if (kbd_enter_pressed()) { + PrintAndLogEx(WARNING, "\naborted via keyboard!\n"); + DropField(); + return PM3_EOPABORTED; + } + if (i % 10 == 0) { - - if (verbose == false) + if (verbose == false) { PrintAndLogEx(NORMAL, "." NOLF); - - if (kbd_enter_pressed()) { - PrintAndLogEx(WARNING, "\naborted via keyboard!\n"); - DropField(); - return PM3_EOPABORTED; } } @@ -1037,9 +1039,6 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA msleep(100); } - if (verbose) - PrintAndLogEx(WARNING, "\nsector %02d key %d [%s] res: %d", sector, keyAB, sprint_hex_inrow(keyList[i], 16), res); - // key for [sector,keyAB] found if (res == PM3_SUCCESS) { if (verbose) @@ -1052,9 +1051,14 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA DropField(); selectCard = true; msleep(50); + + // break out from keylist check loop, break; } + if (verbose) + PrintAndLogEx(WARNING, "\nsector %02d key %d [%s] res: %d", sector, keyAB, sprint_hex_inrow(keyList[i], 16), res); + // RES can be: // PM3_ERFTRANS -7 // PM3_EWRONGANSWER -16 From 207e5bbc5367e247e63f225fbc99f305922216a0 Mon Sep 17 00:00:00 2001 From: Angel Date: Sun, 16 Apr 2023 14:29:58 -0400 Subject: [PATCH 395/924] Final cleanup --- client/src/cmdlfparadox.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 79cebb86d..3276333d0 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -20,7 +20,6 @@ #include #include #include -#include #include "commonutil.h" // ARRAYLEN #include "cmdparser.h" // command_t #include "comms.h" @@ -309,7 +308,7 @@ static int CmdParadoxClone(const char *Cmd) { blocks[i] = bytes_to_num(raw + ((i - 1) * 4), sizeof(uint32_t)); } } else { - //This function generates the bitstream and puts it in blocks. it returns the crc but we don't need it here + //This function generates the bitstream and puts it in blocks. it returns the crc, but we don't need it here GetParadoxBits(fc, cn, blocks); } @@ -389,7 +388,7 @@ static int CmdParadoxSim(const char *Cmd) { PrintAndLogEx(ERR, "Data must be 12 bytes (24 HEX characters) %d", raw_len); return PM3_EINVARG; } - } else{ + } else { uint32_t blocks[4] = {0}; GetParadoxBits(fc,cn,blocks); for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { From 1a3a6e5f1998d0d38aea7f228036fab015aa12c7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 17 Apr 2023 20:12:03 +0200 Subject: [PATCH 396/924] added no save to t55xx dump. and some minor text output style --- CHANGELOG.md | 1 + client/src/cmdlft55xx.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f57df0761..8ff678161 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `lf t55xx dump --ns` - now supports `no save` of memory (@iceman1001) - Fixed the USB enumeration process (@wh201906) - Fixed `hf mf rdsc` - now correctly gets size in bytes when sector is larger than 32 (@iceman1001) - Changed `hf mf supercard` - Support editing UID and recovery of keys from second generation card (@AloneLiberty) diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index f1cb773fb..554658c9f 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -397,7 +397,8 @@ int t55xxWrite(uint8_t block, bool page1, bool usepwd, bool testMode, uint32_t p } void printT5xxHeader(uint8_t page) { - PrintAndLogEx(SUCCESS, "Reading Page %d:", page); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, "Page " _YELLOW_("%d"), page); PrintAndLogEx(SUCCESS, "blk | hex data | binary | ascii"); PrintAndLogEx(SUCCESS, "----+----------+----------------------------------+-------"); } @@ -815,7 +816,7 @@ static void T55xx_Print_DownlinkMode(uint8_t downlink_mode) { break; } - PrintAndLogEx(NORMAL, msg); + PrintAndLogEx(SUCCESS, msg); } static int CmdT55xxWakeUp(const char *Cmd) { @@ -2222,14 +2223,15 @@ static int CmdT55xxDump(const char *Cmd) { "lf t55xx dump -f my_lf_dump" ); - // 1 (help) + 3 (two user specified params) + (5 T55XX_DLMODE_SINGLE) - void *argtable[4 + 5] = { + // 1 (help) + 4 (two user specified params) + (5 T55XX_DLMODE_SINGLE) + void *argtable[5 + 5] = { arg_param_begin, arg_str0("f", "file", "", "filename (default is generated on blk 0)"), arg_lit0("o", "override", "override, force pwd read despite danger to card"), arg_str0("p", "pwd", "", "password (4 hex bytes)"), + arg_lit0(NULL, "ns", "no save"), }; - uint8_t idx = 4; + uint8_t idx = 5; arg_add_t55xx_downloadlink(argtable, &idx, T55XX_DLMODE_SINGLE, T55XX_DLMODE_SINGLE); CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -2251,10 +2253,12 @@ static int CmdT55xxDump(const char *Cmd) { usepwd = true; } - bool r0 = arg_get_lit(ctx, 4); - bool r1 = arg_get_lit(ctx, 5); - bool r2 = arg_get_lit(ctx, 6); - bool r3 = arg_get_lit(ctx, 7); + bool nosave = arg_get_lit(ctx, 4); + + bool r0 = arg_get_lit(ctx, 5); + bool r1 = arg_get_lit(ctx, 6); + bool r2 = arg_get_lit(ctx, 7); + bool r3 = arg_get_lit(ctx, 8); CLIParserFree(ctx); if ((r0 + r1 + r2 + r3) > 1) { @@ -2278,8 +2282,9 @@ static int CmdT55xxDump(const char *Cmd) { // will save the dump file if ALL page 0 is OK printT5xxHeader(0); for (uint8_t i = 0; i < 8; ++i) { - if (T55xxReadBlock(i, 0, usepwd, override, password, downlink_mode) != PM3_SUCCESS) + if (T55xxReadBlock(i, 0, usepwd, override, password, downlink_mode) != PM3_SUCCESS) { success = false; + } // only show override warning on the first block read if (override == 1) { @@ -2287,12 +2292,14 @@ static int CmdT55xxDump(const char *Cmd) { } } printT5xxHeader(1); - for (uint8_t i = 0; i < 4; i++) - if (T55xxReadBlock(i, 1, usepwd, override, password, downlink_mode) != PM3_SUCCESS) + for (uint8_t i = 0; i < 4; i++) { + if (T55xxReadBlock(i, 1, usepwd, override, password, downlink_mode) != PM3_SUCCESS) { T55x7_SaveBlockData(8 + i, 0x00); + } + } // all ok, save dump to file - if (success) { + if (success && nosave == false) { // set default filename, if not set by user if (strlen(filename) == 0) { @@ -4019,7 +4026,11 @@ static int CmdT55xxSniff(const char *Cmd) { // setup and sample data from Proxmark // if not directed to existing sample/graphbuffer if (use_graphbuf == false) { + + // make loop to call sniff with skip samples.. + // then build it up by adding CmdLFSniff(""); + } // Headings From 3bc472c9bba0bbb8cbd868eb36fa2d58fd5a5589 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 17 Apr 2023 23:22:48 +0200 Subject: [PATCH 397/924] hf mf cwipe: use same default ACL as for hf mf wipe --- client/src/mifare/mifarehost.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 70e601431..9e9f674e1 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1042,7 +1042,8 @@ int mfCWipe(uint8_t *uid, const uint8_t *atqa, const uint8_t *sak) { uint8_t block0[16] = {0x00, 0x56, 0x78, 0xBB, 0x95, 0x08, 0x04, 0x00, 0x02, 0xB2, 0x1E, 0x24, 0x23, 0x27, 0x1E, 0x1D}; // uint8_t block0[16] = {0x04, 0x03, 0x02, 0x01, 0x04, 0x08, 0x04, 0x00, 0x64, 0xB9, 0x95, 0x11, 0x4D, 0x20, 0x42, 0x09}; uint8_t blockD[16] = {0x00}; - uint8_t blockK[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x77, 0x8F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + // default transport ACL + uint8_t blockK[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint8_t params = MAGIC_SINGLE; if (uid != NULL) { From ed9cdebbfaf20048aea544cf9b77ed019ac9cf03 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 19 Apr 2023 02:02:20 +0200 Subject: [PATCH 398/924] remove some debug statement --- armsrc/mifarecmd.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 90dbf2bfc..30558541d 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1194,8 +1194,6 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags, reply_old(CMD_ACK, isOK, cuid, num_nonces, buf, sizeof(buf)); LED_B_OFF(); - if (g_dbglevel >= DBG_ERROR) DbpString("AcquireEncryptedNonces finished"); - if (field_off) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); From 6950344567283501faff59a4733d7a0773154b67 Mon Sep 17 00:00:00 2001 From: Davi Mikael <31720422+penegui@users.noreply.github.com> Date: Wed, 19 Apr 2023 01:39:18 -0300 Subject: [PATCH 399/924] Adjusting hf_msdsal standalone module --- armsrc/Standalone/hf_msdsal.c | 31 +++++++++++++++++++------------ armsrc/iso14443a.c | 15 ++++++++++++++- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index 55c545489..64db3a446 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -168,7 +168,7 @@ void RunMod(void) { //Expiration date: 17/11 //Service code: 201 //Discretionary data: 0000030000991 - //char token[19] = {0x44,0x12,0x34,0x56,0x05,0x78,0x12,0x34,0xd1,0x71,0x12,0x01,0x00,0x00,0x03,0x00,0x00,0x99,0x1f}; + //char token[19] = {0x44,0x12,0x34,0x56,0x05,0x78,0x56,0x78,0xd1,0x71,0x12,0x01,0x00,0x00,0x03,0x00,0x00,0x99,0x1f}; // // It is possible to initialize directly the emulation mode, having "token" with data and set "chktoken" = true ;) // @@ -185,11 +185,11 @@ void RunMod(void) { // in case there is a read command received we shouldn't break uint8_t data[PM3_CMD_DATA_SIZE] = {0x00}; - uint8_t visauid[7] = {0x01, 0x02, 0x03, 0x04}; + uint8_t visauid[7] = {0x05, 0x06, 0x07, 0x08}; memcpy(data, visauid, 4); // to initialize the emulation - uint8_t tagType = 4; // 4 = ISO/IEC 14443-4 - javacard (JCOP) + uint8_t tagType = 11; // 11 = ISO/IEC 14443-4 - javacard (JCOP) tag_response_info_t *responses; uint32_t cuid = 0; uint32_t counters[3] = { 0x00, 0x00, 0x00 }; @@ -376,7 +376,8 @@ void RunMod(void) { // dynamic_response_info will be in charge of responses dynamic_response_info.response_n = 0; - + + //Dbprintf("receivedCmd: %02x\n", receivedCmd); // received a REQUEST if (receivedCmd[0] == ISO14443A_CMD_REQA && len == 1) { odd_reply = !odd_reply; @@ -386,30 +387,35 @@ void RunMod(void) { // received a HALT } else if (receivedCmd[0] == ISO14443A_CMD_HALT && len == 4) { -// DbpString(_YELLOW_("+") "Received a HALT"); + //DbpString(_YELLOW_("+") "Received a HALT"); p_response = NULL; // received a WAKEUP } else if (receivedCmd[0] == ISO14443A_CMD_WUPA && len == 1) { -// DbpString(_YELLOW_("+") "WAKEUP Received"); + //DbpString(_YELLOW_("+") "WAKEUP Received"); prevCmd = 0; p_response = &responses[RESP_INDEX_ATQA]; // received request for UID (cascade 1) } else if (receivedCmd[1] == 0x20 && receivedCmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && len == 2) { -// DbpString(_YELLOW_("+") "Request for UID C1"); - p_response = &responses[RESP_INDEX_UIDC1]; + //DbpString(_YELLOW_("+") "Request for UID C1"); + p_response = &responses[RESP_INDEX_UIDC1]; // received a SELECT (cascade 1) } else if (receivedCmd[1] == 0x70 && receivedCmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && len == 9) { -// DbpString(_YELLOW_("+") "Request for SELECT S1"); - p_response = &responses[RESP_INDEX_SAKC1]; + //DbpString(_YELLOW_("+") "Request for SELECT S1"); + p_response = &responses[RESP_INDEX_SAKC1]; // received a RATS request } else if (receivedCmd[0] == ISO14443A_CMD_RATS && len == 4) { -// DbpString(_YELLOW_("+") "Request for RATS"); + DbpString(_YELLOW_("+") "Request for RATS"); prevCmd = 0; - p_response = &responses[RESP_INDEX_RATS]; + //p_response = &responses[RESP_INDEX_RATS]; + + static uint8_t rRATS[] = { 0x13, 0x78, 0x80, 0x72, 0x02, 0x80, 0x31, 0x80, 0x66, 0xb1, 0x84, 0x0c, 0x01, 0x6e, 0x01, 0x83, 0x00, 0x90, 0x00 }; + + memcpy(&dynamic_response_info.response[0], rRATS, sizeof(rRATS)); + dynamic_response_info.response_n = sizeof(rRATS); } else { DbpString(_YELLOW_("[ ") "Card reader command" _YELLOW_(" ]")); @@ -483,6 +489,7 @@ void RunMod(void) { } } } + if (dynamic_response_info.response_n > 0) { DbpString(_GREEN_("[ ") "Proxmark3 answer" _GREEN_(" ]")); Dbhexdump(dynamic_response_info.response_n, dynamic_response_info.response, false); diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 637215cc3..f38edd00d 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1151,6 +1151,11 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r sak = 0x20; } break; + case 11: { // ISO/IEC 14443-4 - javacard (JCOP) + rATQA[0] = 0x04; + sak = 0x20; + } + break; default: { if (g_dbglevel >= DBG_ERROR) Dbprintf("Error: unknown tagtype (%d)", tagType); @@ -1183,7 +1188,15 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // Configure the ATQA and SAK accordingly rATQA[0] &= 0xBF; - rSAKc1[0] = sak & 0xFB; + + if(tagType == 11){ + rSAKc1[0] = sak & 0xFC & 0X70; + DbpString(_YELLOW_("[ ") "Passando no Sak Penegui" _YELLOW_(" ]")); + }else{ + rSAKc1[0] = sak & 0xFB; + //DbpString(_YELLOW_("[ ") "Passando no Sak Antigo" _YELLOW_(" ]")); + } + AddCrc14A(rSAKc1, sizeof(rSAKc1) - 2); *cuid = bytes_to_num(data, 4); From 62b226108daaa489f26604fee8c02b82bd9fa56c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lteri=C5=9F=20Ya=C4=9F=C4=B1ztegin=20Ero=C4=9Flu?= Date: Wed, 19 Apr 2023 13:45:07 +0300 Subject: [PATCH 400/924] doc(macos-macports): refactor macports docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since mid-2022, arm64 builds of stable releases are working. So its been a while not updating this doc :) Signed-off-by: İlteriş Yağıztegin Eroğlu --- CHANGELOG.md | 1 + ...OS-X-MacPorts-Installation-Instructions.md | 82 +++++++++++-------- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ff678161..d69b05a8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added `hf legic einfo` - views emulator menory (@0xdeb) - Changed `hf legic view` - now also print the decoded info of the dump file (@0xdeb) - Now `script run hf_mf_ultimatecard.lua -u` supports 10bytes UID (@alejandro12120) + - Update documentation for installation on macOS with MacPorts (@linuxgemini) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) diff --git a/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md b/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md index 6fa5a1754..3ea25c20d 100644 --- a/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md @@ -2,7 +2,6 @@ # Mac OS X - MacPorts automatic installation -

These insturctions won't work on Apple Silicon yet!

An arm64 native build of arm-none-eabi-gcc is still not available (as of 2021-11-26).
# Table of Contents - [Mac OS X - MacPorts automatic installation](#mac-os-x---macports-automatic-installation) @@ -23,70 +22,82 @@ 1. Have MacPorts installed. Visit https://www.macports.org/ for more information. - * MacPorts may require a bit more setup. You first need to set up your PATH variable: - - ```bash - export "/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:$PATH" - ``` - - For a somewhat seamless development environment: - - ```bash - export C_INCLUDE_PATH="/opt/local/include" - export CPLUS_INCLUDE_PATH="/opt/local/include" - export LIBRARY_PATH="/opt/local/lib" - export LDFLAGS="-L/opt/local/lib" - export CFLAGS="-I/opt/local/include" - export CPPFLAGS="-isystem/opt/local/include -I/opt/local/include" - ``` - -## Installing latest releases +## Installing stable releases directly ^[Top](#top) -Packaging for latest releases are available on MacPorts with the port name `proxmark3-iceman`, with a variant for PM3GENERIC firmwares available as `+pm3generic`. +Packaging for latest releases are available on MacPorts with the port name [`proxmark3-iceman`](https://ports.macports.org/port/proxmark3-iceman/details/), with a variant for PM3GENERIC firmwares available as `+pm3generic`. Installing is as simple as `sudo port install proxmark3-iceman` and if you want to install for PM3GENERIC, you can run `sudo port install proxmark3-iceman +pm3generic` instead. + ## Build from source ^[Top](#top) These instructions will show how to setup the environment on OSX to the point where you'll be able to clone and compile the repo by yourself, as on Linux, Windows, etc. -1. Have MacPorts installed. See above for details. +1. Have MacPorts installed. Visit https://www.macports.org/ for more information. + + * Since you're going to compile directly; this will require a bit more setup, you first need to set up your PATH variable (we assume your MacPorts prefix is located at its default, which is `/opt/local`) in your shell rc file: + + ```bash + export MACPORTS_PREFIX="/opt/local" + # we assume you'll use GNU coreutils; which is also a required dependency for proxmark3 + # install it with `sudo port install coreutils` + export "$MACPORTS_PREFIX/libexec/gnubin:$MACPORTS_PREFIX/bin:$MACPORTS_PREFIX/sbin:$PATH" + ``` + + For a somewhat seamless development environment, you can use these in your shell rc file: + + ```bash + export C_INCLUDE_PATH="$MACPORTS_PREFIX/include:$C_INCLUDE_PATH" + export CPLUS_INCLUDE_PATH="$MACPORTS_PREFIX/include:$CPLUS_INCLUDE_PATH" + export LIBRARY_PATH="$MACPORTS_PREFIX/lib:$LIBRARY_PATH" + export LDFLAGS="-L$MACPORTS_PREFIX/lib $LDFLAGS" + export CFLAGS="-I$MACPORTS_PREFIX/include $CFLAGS" + export CPPFLAGS="-isystem$MACPORTS_PREFIX/include -I$MACPORTS_PREFIX/include $CPPFLAGS" + export PKG_CONFIG_PATH="$MACPORTS_PREFIX/lib/pkgconfig:$MACPORTS_PREFIX/share/pkgconfig:$PKG_CONFIG_PATH" + ``` 2. Install dependencies: - ``` - sudo port install readline qt5 qt5-qtbase pkgconfig arm-none-eabi-gcc arm-none-eabi-binutils lua52 coreutils openssl@3 + ```bash + sudo port install readline jansson lua52 python311 bzip2 openssl11 arm-none-eabi-gcc arm-none-eabi-binutils coreutils qt5 qt5-qtbase pkgconfig ``` 3. Clamp Python version for pkg-config MacPorts doesn't handle Python version defaults when it comes to pkg-config. So even if you have done: - ``` - sudo port install python39 cython39 + ```bash + sudo port install python311 cython311 - sudo port select --set python python39 # this also makes calls to "python" operate on python3.9 - sudo port select --set python3 python39 - sudo port select --set cython cython39 + sudo port select --set python python311 # this also makes calls to "python" operate on python3.11 + sudo port select --set python3 python311 + sudo port select --set cython cython311 ``` This won't set a default python3.pc (and python3-embed.pc) under the MacPorts pkgconfig includes folder. To fix that, follow these steps: - ``` + ```bash cd /opt/local/lib/pkgconfig - sudo ln -svf python3.pc python-3.9.pc - sudo ln -svf python3-embed.pc python-3.9-embed.pc + sudo ln -svf python3.pc python-3.11.pc + sudo ln -svf python3-embed.pc python-3.11-embed.pc + ``` + + _Or_ you can use a framework definition in your shell rc file: + + ```bash + export MACPORTS_FRAMEWORKS_DIR="$MACPORTS_PREFIX/Library/Frameworks" + export PYTHON_FRAMEWORK_DIR="$MACPORTS_FRAMEWORKS_DIR:/Python.framework/Versions/3.11" + export PKG_CONFIG_PATH="$PYTHON_FRAMEWORK_DIR:$PKG_CONFIG_PATH" ``` 4. (optional) Install makefile dependencies: - ``` - sudo port install recode - sudo port install astyle + ```bash + sudo port install recode astyle ``` @@ -103,7 +114,7 @@ cd proxmark3 Now you're ready to follow the [compilation instructions](/doc/md/Use_of_Proxmark/0_Compilation-Instructions.md). From there, you can follow the original instructions. -_Take extra note to instructions if you don't have a Proxmark3 RDV4 device._ +_Take extra note to instructions if you **don't** have a Proxmark3 RDV4 device._ To flash on OS X, better to enter the bootloader mode manually, else you may experience errors. @@ -125,4 +136,3 @@ If you want to manually select serial port, remember that the Proxmark3 port is ```sh proxmark3 /dev/ttyACM0 => proxmark3 /dev/tty.usbmodemiceman1 ``` - From bcc2b1ee700415eb16d1b0cb0971a9cc04f9b5f1 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Thu, 20 Apr 2023 13:30:36 +0800 Subject: [PATCH 401/924] Fix changelog reminder --- .github/workflows/rebase.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rebase.yml b/.github/workflows/rebase.yml index ac6a71242..b1cc0e0c1 100644 --- a/.github/workflows/rebase.yml +++ b/.github/workflows/rebase.yml @@ -9,7 +9,7 @@ jobs: - name: Changelog Reminder uses: peterjgrainger/action-changelog-reminder@v1.2.0 with: - changelog_regex: '/CHANGELOG.md' + changelog_regex: 'CHANGELOG.md' customPrMessage: 'You are welcome to add an entry to the CHANGELOG.md as well' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 039937e28a6cb6446ee6f0b46c646bac8c20baf4 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Apr 2023 11:27:12 +0200 Subject: [PATCH 402/924] added the possibility to load .MCT dump files in the client. MCT format is a textual one like EML but with extra descriptive lines of text before each sector --- CHANGELOG.md | 1 + client/src/fileutils.c | 97 +++++------------------------------------- client/src/fileutils.h | 13 +++++- 3 files changed, 24 insertions(+), 87 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d69b05a8d..cb3c3e059 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added the possibility to load `.MCT` dump files (@iceman1001) - Changed `lf t55xx dump --ns` - now supports `no save` of memory (@iceman1001) - Fixed the USB enumeration process (@wh201906) - Fixed `hf mf rdsc` - now correctly gets size in bytes when sector is larger than 32 (@iceman1001) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 8a6049d3c..dfc59b9fb 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -85,6 +85,8 @@ DumpFileType_t getfiletype(const char *filename) { o = JSON; } else if (str_endswith(s, "dic")) { o = DICTIONARY; + } else if (str_endswith(s, "mct")) { + o = MCT; } else { // mfd, trc, trace is binary o = BIN; @@ -112,27 +114,6 @@ int fileExists(const char *filename) { return result == 0; } -/** - * @brief checks if path is file. - * @param filename - * @return - */ -/* -static bool is_regular_file(const char *filename) { -#ifdef _WIN32 - struct _stat st; - if (_stat(filename, &st) == -1) - return false; -#else - struct stat st; -// stat(filename, &st); - if (lstat(filename, &st) == -1) - return false; -#endif - return S_ISREG(st.st_mode) != 0; -} -*/ - /** * @brief checks if path is directory. * @param filename @@ -152,68 +133,6 @@ static bool is_directory(const char *filename) { return S_ISDIR(st.st_mode) != 0; } -/** - * @brief create a new directory. - * @param dirname - * @return - */ -// Not used... -/* -#ifdef _WIN32 -#define make_dir(a) _mkdir(a) -#else -#define make_dir(a) mkdir(a,0755) //note 0755 MUST have leading 0 for octal linux file permissions -#endif -bool create_path(const char *dirname) { - - if (dirname == NULL) // nothing to do - return false; - - if ((strlen(dirname) == 1) && (dirname[0] == '/')) - return true; - - if ((strlen(dirname) == 2) && (dirname[1] == ':')) - return true; - - if (fileExists(dirname) == 0) { - - char *bs = strrchr(dirname, '\\'); - char *fs = strrchr(dirname, '/'); - - if ((bs == NULL) && (fs != NULL)) { - *fs = 0x00; - create_path (dirname); - *fs = '/'; - } - - if ((bs != NULL) && (fs == NULL)) { - *bs = 0x00; - create_path (dirname); - *bs = '\\'; - } - - if ((bs != NULL) && (fs != NULL)) { - if (strlen (bs) > strlen (fs)) { - *fs = 0x00; // No slash - create_path (dirname); - *fs = '/'; - } else { - *bs = 0x00; - create_path (dirname); - *bs = '\\'; - } - - } - - if (make_dir(dirname) != 0) { - PrintAndLogEx(ERR, "could not create directory.... "_RED_("%s"),dirname); - return false; - } - } - return true; -} -*/ - bool setDefaultPath(savePaths_t pathIndex, const char *path) { if (pathIndex < spItemCount) { @@ -1041,7 +960,8 @@ out: free(fileName); return retval; } -int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { + +int loadFileMCT_safe(const char *preferredName, void **pdata, size_t *datalen) { char *path; int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, "", false); if (res != PM3_SUCCESS) { @@ -1096,7 +1016,8 @@ int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { return PM3_EFILE; } - if (line[0] == '#') + // skip lines like "+Sector:" + if (line[0] == '+') continue; strcleanrn(line, sizeof(line)); @@ -1110,7 +1031,7 @@ int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { } } fclose(f); - PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from text file " _YELLOW_("%s"), counter, preferredName); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from MCT file " _YELLOW_("%s"), counter, preferredName); uint8_t *newdump = realloc(*pdata, counter); @@ -2107,6 +2028,10 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl PrintAndLogEx(ERR, "Error: Only BIN/EML/JSON formats allowed"); return PM3_EINVARG; } + case MCT: { + res = loadFileMCT_safe(fn, pdump, dumplen); + break; + } } if (res != PM3_SUCCESS) { diff --git a/client/src/fileutils.h b/client/src/fileutils.h index 18e0fbd7e..5a49f529a 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -56,6 +56,7 @@ typedef enum { EML, JSON, DICTIONARY, + MCT, } DumpFileType_t; int fileExists(const char *filename); @@ -176,9 +177,19 @@ int loadFile_safeEx(const char *preferredName, const char *suffix, void **pdata, * @param datalen the number of bytes loaded from file * @return 0 for ok, 1 for failz */ -int loadFileEML(const char *preferredName, void *data, size_t *datalen); int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen); +/** + * @brief Utility function to load data from a textfile (MCT). This method takes a preferred name. + * E.g. dumpdata-15.mct + * + * @param preferredName + * @param data The data array to store the loaded bytes from file + * @param datalen the number of bytes loaded from file + * @return 0 for ok, 1 for failz +*/ +int loadFileMCT_safe(const char *preferredName, void **pdata, size_t *datalen); + /** * @brief Utility function to load data from a JSON textfile. This method takes a preferred name. * E.g. dumpdata-15.json From fe31bd4064fe1d84352b5493da525203968f9281 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Apr 2023 11:32:32 +0200 Subject: [PATCH 403/924] cleaning out memory unsafe functions for loading files. Also made the loading of files to honor the preference dump/trace settings. Experimental support, which will need more love. I have been using it for some months now but there are still other save/load file operations scattered in the PM3 client which will not benefit from this yet. They need to be adapted too --- CHANGELOG.md | 1 + client/src/fileutils.c | 287 ++++++++++++++++++++++----------------- client/src/fileutils.h | 18 +-- client/src/preferences.c | 11 +- 4 files changed, 172 insertions(+), 145 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb3c3e059..ef2cf914c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed the PM3 client to honor the preferences dump/trace paths. experimental support (@iceman1001) - Added the possibility to load `.MCT` dump files (@iceman1001) - Changed `lf t55xx dump --ns` - now supports `no save` of memory (@iceman1001) - Fixed the USB enumeration process (@wh201906) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index dfc59b9fb..bb9c7635e 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -181,37 +181,55 @@ static size_t path_size(savePaths_t a) { } char *newfilenamemcopy(const char *preferredName, const char *suffix) { + return newfilenamemcopyEx(preferredName, suffix, spDefault); +} + +char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePaths_t e_save_path) { if (preferredName == NULL || suffix == NULL) { return NULL; } uint16_t p_namelen = strlen(preferredName); - if (str_endswith(preferredName, suffix)) + if (str_endswith(preferredName, suffix)) { p_namelen -= strlen(suffix); + } - // 10: room for filenum to ensure new filename - const size_t len = p_namelen + strlen(suffix) + 1 + 10; + int save_path_len = path_size(e_save_path); - int foobar = path_size(spDefault); - (void) foobar; + // 1: null terminator + // 16: room for filenum to ensure new filename + // save_path_len + strlen(PATHSEP): the user preference save paths + const size_t len = p_namelen + strlen(suffix) + 1 + 16 + save_path_len + strlen(PATHSEP); char *fileName = (char *) calloc(len, sizeof(uint8_t)); if (fileName == NULL) { return NULL; } + char *pfn = fileName; + + // user preference save paths + if (save_path_len) { + snprintf(pfn, save_path_len + strlen(PATHSEP) + 1, "%s%s", g_session.defaultPaths[e_save_path], PATHSEP); + pfn += save_path_len + strlen(PATHSEP); + } + int num = 1; - snprintf(fileName, len, "%.*s%s", p_namelen, preferredName, suffix); + // modify filename + snprintf(pfn, len, "%.*s%s", p_namelen, preferredName, suffix); + + // check complete path/filename if exists while (fileExists(fileName)) { - snprintf(fileName, len, "%.*s-%d%s", p_namelen, preferredName, num, suffix); + // modify filename + snprintf(pfn, len, "%.*s-%03d%s", p_namelen, preferredName, num, suffix); num++; } - PrintAndLogEx(INFO, "FILE PATH: %s", fileName); return fileName; } +// --------- SAVE FILES int saveFile(const char *preferredName, const char *suffix, const void *data, size_t datalen) { if (data == NULL || datalen == 0) { @@ -240,13 +258,14 @@ int saveFile(const char *preferredName, const char *suffix, const void *data, si return PM3_SUCCESS; } +// dump file int saveFileEML(const char *preferredName, uint8_t *data, size_t datalen, size_t blocksize) { if (data == NULL || datalen == 0) { return PM3_EINVARG; } - char *fileName = newfilenamemcopy(preferredName, ".eml"); + char *fileName = newfilenamemcopyEx(preferredName, ".eml", spDump); if (fileName == NULL) { return PM3_EMALLOC; } @@ -290,16 +309,19 @@ out: return retval; } +// dump file (normally, we also got preference file, etc) int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, void (*callback)(json_t *)) { - return saveFileJSONex(preferredName, ftype, data, datalen, true, callback); + return saveFileJSONex(preferredName, ftype, data, datalen, true, callback, spDump); } -int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *)) { +int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *), savePaths_t e_save_path) { + if (ftype != jsfCustom) { if (data == NULL || datalen == 0) { return PM3_EINVARG; } + } - char *fileName = newfilenamemcopy(preferredName, ".json"); + char *fileName = newfilenamemcopyEx(preferredName, ".json", e_save_path); if (fileName == NULL) { return PM3_EMALLOC; } @@ -638,7 +660,7 @@ int saveFileJSONrootEx(const char *preferredName, void *root, size_t flags, bool if (overwrite) filename = filenamemcopy(preferredName, ".json"); else - filename = newfilenamemcopy(preferredName, ".json"); + filename = newfilenamemcopyEx(preferredName, ".json", spDump); if (filename == NULL) return PM3_EMALLOC; @@ -658,13 +680,14 @@ int saveFileJSONrootEx(const char *preferredName, void *root, size_t flags, bool return PM3_EFILE; } +// wave file of trace, int saveFileWAVE(const char *preferredName, const int *data, size_t datalen) { if (data == NULL || datalen == 0) { return PM3_EINVARG; } - char *fileName = newfilenamemcopy(preferredName, ".wav"); + char *fileName = newfilenamemcopyEx(preferredName, ".wav", spTrace); if (fileName == NULL) { return PM3_EMALLOC; } @@ -710,13 +733,14 @@ out: return retval; } +// Signal trace file, PM3 int saveFilePM3(const char *preferredName, int *data, size_t datalen) { if (data == NULL || datalen == 0) { return PM3_EINVARG; } - char *fileName = newfilenamemcopy(preferredName, ".pm3"); + char *fileName = newfilenamemcopyEx(preferredName, ".pm3", spTrace); if (fileName == NULL) { return PM3_EMALLOC; } @@ -743,11 +767,12 @@ out: return retval; } +// key file dump int createMfcKeyDump(const char *preferredName, uint8_t sectorsCnt, sector_t *e_sector) { if (e_sector == NULL) return PM3_EINVARG; - char *fileName = newfilenamemcopy(preferredName, ".bin"); + char *fileName = newfilenamemcopyEx(preferredName, ".bin", spDump); if (fileName == NULL) return PM3_EMALLOC; FILE *f = fopen(fileName, "wb"); @@ -785,66 +810,7 @@ int createMfcKeyDump(const char *preferredName, uint8_t sectorsCnt, sector_t *e_ return PM3_SUCCESS; } -int loadFile(const char *preferredName, const char *suffix, void *data, size_t maxdatalen, size_t *datalen) { - - if (data == NULL) return 1; - char *fileName = filenamemcopy(preferredName, suffix); - if (fileName == NULL) return PM3_EINVARG; - - int retval = PM3_SUCCESS; - - FILE *f = fopen(fileName, "rb"); - if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", fileName); - free(fileName); - return PM3_EFILE; - } - - // get filesize in order to malloc memory - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); - - if (fsize <= 0) { - PrintAndLogEx(FAILED, "error, when getting filesize"); - retval = PM3_EFILE; - goto out; - } - - uint8_t *dump = calloc(fsize, sizeof(uint8_t)); - if (!dump) { - PrintAndLogEx(FAILED, "error, cannot allocate memory"); - retval = PM3_EMALLOC; - goto out; - } - - size_t bytes_read = fread(dump, 1, fsize, f); - - if (bytes_read != fsize) { - PrintAndLogEx(FAILED, "error, bytes read mismatch file size"); - free(dump); - retval = PM3_EFILE; - goto out; - } - - if (bytes_read > maxdatalen) { - PrintAndLogEx(WARNING, "Warning, bytes read exceed calling array limit. Max bytes is %zu bytes", maxdatalen); - bytes_read = maxdatalen; - } - - memcpy((data), dump, bytes_read); - free(dump); - - PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from binary file " _YELLOW_("%s"), bytes_read, fileName); - - *datalen = bytes_read; - -out: - fclose(f); - free(fileName); - return retval; -} - +// --------- LOAD FILES int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, size_t *datalen) { return loadFile_safeEx(preferredName, suffix, pdata, datalen, true); } @@ -894,34 +860,53 @@ int loadFile_safeEx(const char *preferredName, const char *suffix, void **pdata, *datalen = bytes_read; - if (verbose) + if (verbose) { PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from binary file " _YELLOW_("%s"), bytes_read, preferredName); + } return PM3_SUCCESS; } -int loadFileEML(const char *preferredName, void *data, size_t *datalen) { +int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { + char *path; + int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, "", false); + if (res != PM3_SUCCESS) { + return PM3_EFILE; + } - if (data == NULL) return PM3_EINVARG; - - char *fileName = filenamemcopy(preferredName, ".eml"); - if (fileName == NULL) return PM3_EMALLOC; - - size_t counter = 0; - int retval = PM3_SUCCESS, hexlen = 0; - - FILE *f = fopen(fileName, "r"); + FILE *f = fopen(path, "r"); if (!f) { - PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", fileName); - retval = PM3_EFILE; - goto out; + PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", path); + free(path); + return PM3_EFILE; + } + free(path); + + // get filesize in order to malloc memory + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + if (fsize <= 0) { + PrintAndLogEx(FAILED, "error, when getting filesize"); + fclose(f); + return PM3_EFILE; + } + + *pdata = calloc(fsize, sizeof(uint8_t)); + if (!*pdata) { + PrintAndLogEx(FAILED, "error, cannot allocate memory"); + fclose(f); + return PM3_EMALLOC; } // 128 + 2 newline chars + 1 null terminator char line[131]; memset(line, 0, sizeof(line)); uint8_t buf[64] = {0x00}; + size_t counter = 0; + int retval = PM3_SUCCESS, hexlen = 0; - uint8_t *udata = (uint8_t *)data; + uint8_t *tmp = (uint8_t *)*pdata; while (!feof(f)) { @@ -933,8 +918,7 @@ int loadFileEML(const char *preferredName, void *data, size_t *datalen) { fclose(f); PrintAndLogEx(FAILED, "File reading error."); - retval = PM3_EFILE; - goto out; + return PM3_EFILE; } if (line[0] == '#') @@ -942,22 +926,29 @@ int loadFileEML(const char *preferredName, void *data, size_t *datalen) { strcleanrn(line, sizeof(line)); - int res = param_gethex_to_eol(line, 0, buf, sizeof(buf), &hexlen); + res = param_gethex_to_eol(line, 0, buf, sizeof(buf), &hexlen); if (res == 0) { - memcpy(udata + counter, buf, hexlen); + memcpy(tmp + counter, buf, hexlen); counter += hexlen; } else { retval = PM3_ESOFT; } } fclose(f); - PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from text file " _YELLOW_("%s"), counter, fileName); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from text file " _YELLOW_("%s"), counter, preferredName); + + + uint8_t *newdump = realloc(*pdata, counter); + if (newdump == NULL) { + free(*pdata); + return PM3_EMALLOC; + } else { + *pdata = newdump; + } if (datalen) *datalen = counter; -out: - free(fileName); return retval; } @@ -1824,51 +1815,84 @@ int searchAndList(const char *pm3dir, const char *ext) { } static int searchFinalFile(char **foundpath, const char *pm3dir, const char *searchname, bool silent) { - if ((foundpath == NULL) || (pm3dir == NULL) || (searchname == NULL)) return PM3_ESOFT; + + if ((foundpath == NULL) || (pm3dir == NULL) || (searchname == NULL)) { + return PM3_ESOFT; + } + // explicit absolute (/) or relative path (./) => try only to match it directly char *filename = calloc(strlen(searchname) + 1, sizeof(char)); - if (filename == NULL) return PM3_EMALLOC; + if (filename == NULL) { + return PM3_EMALLOC; + } + strcpy(filename, searchname); if ((g_debugMode == 2) && (!silent)) { - PrintAndLogEx(INFO, "Searching %s", filename); + PrintAndLogEx(INFO, "pm3dir...... %s", pm3dir); + PrintAndLogEx(INFO, "Searching... %s", filename); } + + // try implicit relative path + PrintAndLogEx(DEBUG, "Searching implicit relative paths"); + if (fileExists(filename)) { + *foundpath = filename; + if ((g_debugMode == 2) && (!silent)) { + PrintAndLogEx(INFO, "Found %s", *foundpath); + } + return PM3_SUCCESS; + } + if (((strlen(filename) > 1) && (filename[0] == '/')) || ((strlen(filename) > 2) && (filename[0] == '.') && (filename[1] == '/'))) { - if (fileExists(filename)) { - *foundpath = filename; + goto out; + } + + // try the session paths + PrintAndLogEx(DEBUG, "Searching preferences paths"); + for (int i = 0; i < spItemCount; i++) { + + size_t sn = strlen(g_session.defaultPaths[i]) + strlen(filename) + strlen(PATHSEP) + 1; + char *default_path = calloc(sn, sizeof(char)); + if (default_path == NULL) { + goto out; + } + + snprintf(default_path, sn, "%s%s%s", g_session.defaultPaths[i], PATHSEP, filename); + + if ((g_debugMode == 2) && (!silent)) { + PrintAndLogEx(INFO, "Searching %s", default_path); + } + + if (fileExists(default_path)) { + free(filename); + *foundpath = default_path; if ((g_debugMode == 2) && (!silent)) { PrintAndLogEx(INFO, "Found %s", *foundpath); } return PM3_SUCCESS; } else { - goto out; + free(default_path); } } - // else - // try implicit relative path - { - if (fileExists(filename)) { - *foundpath = filename; - if ((g_debugMode == 2) && (!silent)) { - PrintAndLogEx(INFO, "Found %s", *foundpath); - } - return PM3_SUCCESS; - } - } // try pm3 dirs in user .proxmark3 (user mode) + PrintAndLogEx(DEBUG, "Searching user .proxmark3 paths"); const char *user_path = get_my_user_directory(); if (user_path != NULL) { char *path = calloc(strlen(user_path) + strlen(PM3_USER_DIRECTORY) + strlen(pm3dir) + strlen(filename) + 1, sizeof(char)); - if (path == NULL) + if (path == NULL) { goto out; + } + strcpy(path, user_path); strcat(path, PM3_USER_DIRECTORY); strcat(path, pm3dir); strcat(path, filename); + if ((g_debugMode == 2) && (!silent)) { PrintAndLogEx(INFO, "Searching %s", path); } + if (fileExists(path)) { free(filename); *foundpath = path; @@ -1880,7 +1904,9 @@ static int searchFinalFile(char **foundpath, const char *pm3dir, const char *sea free(path); } } + // try pm3 dirs in current client workdir (dev mode) + PrintAndLogEx(DEBUG, "Searching current workdir paths"); const char *exec_path = get_my_executable_directory(); if ((exec_path != NULL) && ((strcmp(DICTIONARIES_SUBDIR, pm3dir) == 0) || @@ -1913,23 +1939,28 @@ static int searchFinalFile(char **foundpath, const char *pm3dir, const char *sea free(path); } } + // try pm3 dirs in current repo workdir (dev mode) + PrintAndLogEx(DEBUG, "Searching PM3 dirs in current workdir"); if ((exec_path != NULL) && ((strcmp(TRACES_SUBDIR, pm3dir) == 0) || (strcmp(FIRMWARES_SUBDIR, pm3dir) == 0) || (strcmp(BOOTROM_SUBDIR, pm3dir) == 0) || (strcmp(FULLIMAGE_SUBDIR, pm3dir) == 0))) { - const char *above = "../"; - char *path = calloc(strlen(exec_path) + strlen(above) + strlen(pm3dir) + strlen(filename) + 1, sizeof(char)); - if (path == NULL) + char *path = calloc(strlen(exec_path) + strlen(ABOVE) + strlen(pm3dir) + strlen(filename) + 1, sizeof(char)); + if (path == NULL) { goto out; + } + strcpy(path, exec_path); - strcat(path, above); + strcat(path, ABOVE); strcat(path, pm3dir); strcat(path, filename); + if ((g_debugMode == 2) && (!silent)) { PrintAndLogEx(INFO, "Searching %s", path); } + if (fileExists(path)) { free(filename); *foundpath = path; @@ -1941,18 +1972,24 @@ static int searchFinalFile(char **foundpath, const char *pm3dir, const char *sea free(path); } } + // try pm3 dirs in pm3 installation dir (install mode) + PrintAndLogEx(DEBUG, "Searching PM3 installation dir paths"); if (exec_path != NULL) { char *path = calloc(strlen(exec_path) + strlen(PM3_SHARE_RELPATH) + strlen(pm3dir) + strlen(filename) + 1, sizeof(char)); - if (path == NULL) + if (path == NULL) { goto out; + } + strcpy(path, exec_path); strcat(path, PM3_SHARE_RELPATH); strcat(path, pm3dir); strcat(path, filename); + if ((g_debugMode == 2) && (!silent)) { PrintAndLogEx(INFO, "Searching %s", path); } + if (fileExists(path)) { free(filename); *foundpath = path; @@ -1988,15 +2025,15 @@ int searchFile(char **foundpath, const char *pm3dir, const char *searchname, con free(filename); return PM3_EFILE; } + int res = searchFinalFile(foundpath, pm3dir, filename, silent); if (res != PM3_SUCCESS) { - if ((res == PM3_EFILE) && (!silent)) + if ((res == PM3_EFILE) && (!silent)) { PrintAndLogEx(FAILED, "Error - can't find `" _YELLOW_("%s") "`", filename); + } + } free(filename); return res; - } - free(filename); - return PM3_SUCCESS; } int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumplen) { diff --git a/client/src/fileutils.h b/client/src/fileutils.h index 5a49f529a..81cb13e05 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -60,12 +60,12 @@ typedef enum { } DumpFileType_t; int fileExists(const char *filename); -//bool create_path(const char *dirname); // set a path in the path list g_session.defaultPaths bool setDefaultPath(savePaths_t pathIndex, const char *path); char *newfilenamemcopy(const char *preferredName, const char *suffix); +char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePaths_t save_path); /** * @brief Utility function to save data to a binary file. This method takes a preferred name, but if that @@ -105,7 +105,7 @@ int saveFileEML(const char *preferredName, uint8_t *data, size_t datalen, size_t * @return 0 for ok, 1 for failz */ int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, void (*callback)(json_t *)); -int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *)); +int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *), savePaths_t e_save_path); int saveFileJSONroot(const char *preferredName, void *root, size_t flags, bool verbose); int saveFileJSONrootEx(const char *preferredName, void *root, size_t flags, bool verbose, bool overwrite); /** STUB @@ -142,20 +142,6 @@ int saveFilePM3(const char *preferredName, int *data, size_t datalen); */ int createMfcKeyDump(const char *preferredName, uint8_t sectorsCnt, sector_t *e_sector); -/** - * @brief Utility function to load data from a binary file. This method takes a preferred name. - * E.g. dumpdata-15.bin - * - * @param preferredName - * @param suffix the file suffix. Including the ".". - * @param data The data array to store the loaded bytes from file - * @param maxdatalen the number of bytes that your data array has - * @param datalen the number of bytes loaded from file - * @return PM3_SUCCESS for ok, PM3_E* for failz -*/ -int loadFile(const char *preferredName, const char *suffix, void *data, size_t maxdatalen, size_t *datalen); - - /** * @brief Utility function to load data from a binary file. This method takes a preferred name. * E.g. dumpdata-15.bin, tries to search for it, and allocated memory. diff --git a/client/src/preferences.c b/client/src/preferences.c index 99fb20d30..e3aef4ccb 100644 --- a/client/src/preferences.c +++ b/client/src/preferences.c @@ -122,17 +122,18 @@ int preferences_save(void) { PrintAndLogEx(INFO, "Saving preferences..."); char *fn = prefGetFilename(); - int fnLen = strlen(fn) + 5; // .bak\0 + int fn_len = strlen(fn) + 5; // .bak\0 // [FILENAME_MAX+sizeof(preferencesFilename)+10] - char *backupFilename = (char *)calloc(fnLen, sizeof(uint8_t)); + char *backupFilename = (char *)calloc(fn_len, sizeof(uint8_t)); if (backupFilename == NULL) { PrintAndLogEx(ERR, "failed to allocate memory"); free(fn); return PM3_EMALLOC; } - snprintf(backupFilename, fnLen, "%s.bak", fn); + snprintf(backupFilename, fn_len, "%s.bak", fn); + // remove old backup file if (fileExists(backupFilename)) { if (remove(backupFilename) != 0) { PrintAndLogEx(FAILED, "Error - could not delete old settings backup file \"%s\"", backupFilename); @@ -142,6 +143,7 @@ int preferences_save(void) { } } + // rename file to backup file if (fileExists(fn)) { if (rename(fn, backupFilename) != 0) { PrintAndLogEx(FAILED, "Error - could not backup settings file \"%s\" to \"%s\"", fn, backupFilename); @@ -154,8 +156,9 @@ int preferences_save(void) { uint8_t dummyData = 0x00; size_t dummyDL = 0x01; - if (saveFileJSON(fn, jsfCustom, &dummyData, dummyDL, &preferences_save_callback) != PM3_SUCCESS) + if (saveFileJSONex(fn, jsfCustom, &dummyData, dummyDL, true, &preferences_save_callback, spItemCount) != PM3_SUCCESS) { PrintAndLogEx(ERR, "Error saving preferences to \"%s\"", fn); + } free(fn); free(backupFilename); From e252668866df6db7e106f3cc5bba0089c23e0667 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Apr 2023 11:32:59 +0200 Subject: [PATCH 404/924] style --- client/src/flash.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/src/flash.c b/client/src/flash.c index 20729b2da..cca2de7b1 100644 --- a/client/src/flash.c +++ b/client/src/flash.c @@ -236,11 +236,14 @@ static int check_segs(flash_file_t *ctx, int can_write_bl, uint32_t flash_size) } static int print_and_validate_version(struct version_information_t *vi) { - if (vi->magic != VERSION_INFORMATION_MAGIC) + if (vi->magic != VERSION_INFORMATION_MAGIC) { return PM3_EFILE; + } + char temp[PM3_CMD_DATA_SIZE - 12]; // same limit as for ARM image FormatVersionInformation(temp, sizeof(temp), "", vi); PrintAndLogEx(SUCCESS, _CYAN_("ELF file version") _YELLOW_(" %s"), temp); + if (strlen(g_version_information.armsrc) == 9) { if (strncmp(vi->armsrc, g_version_information.armsrc, 9) != 0) { PrintAndLogEx(WARNING, _RED_("ARM firmware does not match the source at the time the client was compiled")); From 6fe32635760bc17caaf89e5ef115e4ebec35f98b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Apr 2023 00:06:55 +0200 Subject: [PATCH 405/924] hf mfu dump now supports the --ns param to not save the memory dump to file --- CHANGELOG.md | 1 + client/src/cmdhfmfu.c | 31 ++++++++++++++++++------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef2cf914c..c4d075061 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mfu dump --ns` - now supports `no save` of card memory (@iceman1001) - Changed the PM3 client to honor the preferences dump/trace paths. experimental support (@iceman1001) - Added the possibility to load `.MCT` dump files (@iceman1001) - Changed `lf t55xx dump --ns` - now supports `no save` of memory (@iceman1001) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 963786ebc..e47a60e7c 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2439,6 +2439,7 @@ static int CmdHF14AMfUDump(const char *Cmd) { arg_lit0("l", NULL, "Swap entered key's endianness"), arg_int0("p", "page", "", "Manually set start page number to start from"), arg_int0("q", "qty", "", "Manually set number of pages to dump"), + arg_lit0(NULL, "ns", "no save to file"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -2454,6 +2455,7 @@ static int CmdHF14AMfUDump(const char *Cmd) { bool swap_endian = arg_get_lit(ctx, 3); int start_page = arg_get_int_def(ctx, 4, 0); int pages = arg_get_int_def(ctx, 5, 16); + bool nosave = arg_get_lit(ctx, 6); CLIParserFree(ctx); bool has_auth_key = false; @@ -2649,21 +2651,24 @@ static int CmdHF14AMfUDump(const char *Cmd) { printMFUdumpEx(&dump_file_data, pages, start_page); - // user supplied filename? - if (fnlen < 1) { + if (nosave == false) { + // user supplied filename? + if (fnlen < 1) { + PrintAndLogEx(INFO, "Using UID as filename"); + uint8_t uid[7] = {0}; + memcpy(uid, (uint8_t *)&dump_file_data.data, 3); + memcpy(uid + 3, (uint8_t *)&dump_file_data.data + 4, 4); + strcat(filename, "hf-mfu-"); + FillFileNameByUID(filename, uid, "-dump", sizeof(uid)); + } - PrintAndLogEx(INFO, "Using UID as filename"); - uint8_t uid[7] = {0}; - memcpy(uid, (uint8_t *)&dump_file_data.data, 3); - memcpy(uid + 3, (uint8_t *)&dump_file_data.data + 4, 4); - strcat(filename, "hf-mfu-"); - FillFileNameByUID(filename, uid, "-dump", sizeof(uid)); + uint16_t datalen = pages * MFU_BLOCK_SIZE + MFU_DUMP_PREFIX_LENGTH; + pm3_save_dump(filename, (uint8_t *)&dump_file_data, datalen, jsfMfuMemory, MFU_BLOCK_SIZE); + + if (is_partial) { + PrintAndLogEx(WARNING, "Partial dump created. (%d of %d blocks)", pages, card_mem_size); + } } - uint16_t datalen = pages * MFU_BLOCK_SIZE + MFU_DUMP_PREFIX_LENGTH; - pm3_save_dump(filename, (uint8_t *)&dump_file_data, datalen, jsfMfuMemory, MFU_BLOCK_SIZE); - - if (is_partial) - PrintAndLogEx(WARNING, "Partial dump created. (%d of %d blocks)", pages, card_mem_size); return PM3_SUCCESS; } From 94b0bcc7580cc4523ba98e5d646a688f7d735345 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Apr 2023 00:08:01 +0200 Subject: [PATCH 406/924] changed the key table output. In some cases it didnt print non found keys red --- client/src/cmdhfmf.c | 90 ++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 765342ec2..a647d90c2 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2861,6 +2861,9 @@ tryNested: } case PM3_ESTATIC_NONCE: PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); + + e_sector[current_sector_i].Key[current_key_type_i] = 0xffffffffffff;; + e_sector[current_sector_i].foundKey[current_key_type_i] = false; // Show the results to the user PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, _GREEN_("found keys:")); @@ -2907,6 +2910,10 @@ tryHardnested: // If the nested attack fails then we try the hardnested attack } case PM3_ESTATIC_NONCE: { PrintAndLogEx(ERR, "\nError: Static encrypted nonce detected. Aborted\n"); + + e_sector[current_sector_i].Key[current_key_type_i] = 0xffffffffffff;; + e_sector[current_sector_i].foundKey[current_key_type_i] = false; + // Show the results to the user PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, _GREEN_("found keys:")); @@ -3899,57 +3906,48 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); PrintAndLogEx(SUCCESS, " Sec | Blk | key A |res| key B |res"); PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); + + bool extended_legend = false; for (uint8_t i = 0; i < sectorscnt; i++) { - snprintf(strA, sizeof(strA), "------------"); - snprintf(strB, sizeof(strB), "------------"); - - if (e_sector[i].foundKey[0]) - snprintf(strA, sizeof(strA), "%012" PRIX64, e_sector[i].Key[0]); - - if (e_sector[i].foundKey[1]) - snprintf(strB, sizeof(strB), "%012" PRIX64, e_sector[i].Key[1]); - - if (e_sector[i].foundKey[0] > 1) { - PrintAndLogEx(SUCCESS, " "_YELLOW_("%03d")" | %03d | " _GREEN_("%s")" | " _BRIGHT_GREEN_("%c")" | " _GREEN_("%s")" | " _BRIGHT_GREEN_("%c") - , i - , mfSectorTrailerOfSector(i) - , strA, e_sector[i].foundKey[0] - , strB, e_sector[i].foundKey[1] - ); - } else { - - // keep track if we use start_sector or i... - uint8_t s = start_sector; - if (start_sector == 0) - s = i; - - if (e_sector[i].foundKey[0]) { - snprintf(strA, sizeof(strA), _GREEN_("%012" PRIX64), e_sector[i].Key[0]); - snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%d"), 1); - } else { - snprintf(strA, sizeof(strA), _RED_("%s"), "------------"); - snprintf(resA, sizeof(resA), _RED_("%d"), 0); - } - - if (e_sector[i].foundKey[1]) { - snprintf(strB, sizeof(strB), _GREEN_("%012" PRIX64), e_sector[i].Key[1]); - snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%d"), 1); - } else { - snprintf(strB, sizeof(strB), _RED_("%s"), "------------"); - snprintf(resB, sizeof(resB), _RED_("%d"), 0); - } - - PrintAndLogEx(SUCCESS, " " _YELLOW_("%03d") " | %03d | %s | %s | %s | %s" - , s - , mfSectorTrailerOfSector(s) - , strA, resA - , strB, resB - ); + if ((e_sector[i].foundKey[0] > 1) || (e_sector[i].foundKey[1] > 1)) { + extended_legend = true; } + + if (e_sector[i].foundKey[0]) { + snprintf(strA, sizeof(strA), _GREEN_("%012" PRIX64), e_sector[i].Key[0]); + snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[0]); + } else { + snprintf(strA, sizeof(strA), _RED_("%s"), "------------"); + snprintf(resA, sizeof(resA), _RED_("%d"), 0); + } + + if (e_sector[i].foundKey[1]) { + snprintf(strB, sizeof(strB), _GREEN_("%012" PRIX64), e_sector[i].Key[1]); + snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[1]); + } else { + snprintf(strB, sizeof(strB), _RED_("%s"), "------------"); + snprintf(resB, sizeof(resB), _RED_("%d"), 0); + } + + // keep track if we use start_sector or i + // show one sector or all. + uint8_t s = start_sector; + if (start_sector == 0) { + s = i; + } + + PrintAndLogEx(SUCCESS, " " _YELLOW_("%03d") " | %03d | %s | %s | %s | %s" + , s + , mfSectorTrailerOfSector(s) + , strA, resA + , strB, resB + ); } + PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); - if (e_sector[0].foundKey[0] > 1) { + + if (extended_legend) { PrintAndLogEx(INFO, "( " _YELLOW_("D") ":Dictionary / " _YELLOW_("S") ":darkSide / " From d480cbd1d0f679cf009887e6d533ab469a1b71e3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Apr 2023 00:10:15 +0200 Subject: [PATCH 407/924] hf 14b dump now supports the no save parameter --- CHANGELOG.md | 1 + client/src/cmdhf14b.c | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4d075061..c73f7641a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf 14b dump --ns` - now supports `no save` of card memory (@iceman1001) - Changed `hf mfu dump --ns` - now supports `no save` of card memory (@iceman1001) - Changed the PM3 client to honor the preferences dump/trace paths. experimental support (@iceman1001) - Added the possibility to load `.MCT` dump files (@iceman1001) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index 12440c676..d0083fbb5 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -1359,6 +1359,7 @@ static int CmdHF14BDump(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_str0("f", "file", "", "(optional) filename, if no UID will be used as filename"), + arg_lit0(NULL, "ns", "no save to file"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1366,6 +1367,7 @@ static int CmdHF14BDump(const char *Cmd) { int fnlen = 0; char filename[FILE_PATH_SIZE] = {0}; CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); + bool nosave = arg_get_lit(ctx, 2); CLIParserFree(ctx); @@ -1514,15 +1516,17 @@ static int CmdHF14BDump(const char *Cmd) { print_sr_blocks(data, cardsize, card.uid); - // save to file - if (fnlen < 1) { - PrintAndLogEx(INFO, "using UID as filename"); - char *fptr = filename + snprintf(filename, sizeof(filename), "hf-14b-"); - FillFileNameByUID(fptr, SwapEndian64(card.uid, card.uidlen, 8), "-dump", card.uidlen); - } + if (nosave == false) { + // save to file + if (fnlen < 1) { + PrintAndLogEx(INFO, "using UID as filename"); + char *fptr = filename + snprintf(filename, sizeof(filename), "hf-14b-"); + FillFileNameByUID(fptr, SwapEndian64(card.uid, card.uidlen, 8), "-dump", card.uidlen); + } - size_t datalen = (lastblock + 2) * ST25TB_SR_BLOCK_SIZE; - pm3_save_dump(filename, data, datalen, jsf14b, ST25TB_SR_BLOCK_SIZE); + size_t datalen = (lastblock + 2) * ST25TB_SR_BLOCK_SIZE; + pm3_save_dump(filename, data, datalen, jsf14b, ST25TB_SR_BLOCK_SIZE); + } } return switch_off_field_14b(); From 9eca7fce8394aad879993134aaf41a259e39ac64 Mon Sep 17 00:00:00 2001 From: Mistial Developer Date: Fri, 28 Apr 2023 00:09:24 -0500 Subject: [PATCH 408/924] Add text explaining that the format is H10301 for binary, and specifying it for non-binary --- client/src/cmdhficlass.c | 6 +++--- doc/commands.json | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index b328436bb..ba6d984ad 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -3836,9 +3836,9 @@ static int CmdHFiClassEncode(const char *Cmd) { CLIParserInit(&ctx, "hf iclass encode", "Encode binary wiegand to block 7,8,9\n" "Use either --bin or --wiegand/--fc/--cn", - "hf iclass encode --bin 10001111100000001010100011 --ki 0 -> FC 31 CN 337\n" - "hf iclass encode --fc 31 --cn 337 --ki 0 -> FC 31 CN 337\n" - "hf iclass encode --bin 10001111100000001010100011 --ki 0 --elite -> FC 31 CN 337, writing w elite key" + "hf iclass encode --bin 10001111100000001010100011 --ki 0 -> FC 31 CN 337 (H10301)\n" + "hf iclass encode -w H10301 --fc 31 --cn 337 --ki 0 -> FC 31 CN 337 (H10301)\n" + "hf iclass encode --bin 10001111100000001010100011 --ki 0 --elite -> FC 31 CN 337 (H10301), writing w elite key" ); void *argtable[] = { diff --git a/doc/commands.json b/doc/commands.json index 703ff688c..f8712fc47 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3100,9 +3100,9 @@ "command": "hf iclass encode", "description": "Encode binary wiegand to block 7,8,9 Use either --bin or --wiegand/--fc/--cn", "notes": [ - "hf iclass encode --bin 10001111100000001010100011 --ki 0 -> FC 31 CN 337", - "hf iclass encode --fc 31 --cn 337 --ki 0 -> FC 31 CN 337", - "hf iclass encode --bin 10001111100000001010100011 --ki 0 --elite -> FC 31 CN 337, writing w elite key" + "hf iclass encode --bin 10001111100000001010100011 --ki 0 -> FC 31 CN 337 (H10301)", + "hf iclass encode -w H10301 --fc 31 --cn 337 --ki 0 -> FC 31 CN 337 (H10301)", + "hf iclass encode --bin 10001111100000001010100011 --ki 0 --elite -> FC 31 CN 337 (H10301), writing w elite key" ], "offline": true, "options": [ @@ -11991,4 +11991,4 @@ "extracted_by": "PM3Help2JSON v1.00", "extracted_on": "2023-03-26T15:04:49" } -} \ No newline at end of file +} From 2678c8e1a45678b9236d650321b49537616a20c0 Mon Sep 17 00:00:00 2001 From: kormax Date: Tue, 2 May 2023 22:04:40 +0300 Subject: [PATCH 409/924] Add more AID entries --- client/resources/aidlist.json | 60 +++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/client/resources/aidlist.json b/client/resources/aidlist.json index 81a153bba..bd6e4eac8 100644 --- a/client/resources/aidlist.json +++ b/client/resources/aidlist.json @@ -2243,8 +2243,8 @@ "AID": "A0000002480400", "Vendor": "ISO/IEC JTC1/SC17", "Country": "", - "Name": "Personal identification (mDL)", - "Description": "ISO/IEC 18013-5:2021 compliant Mobile driving licence (mDL) application.", + "Name": "Personal identification (mDL) data transfer", + "Description": "ISO/IEC 18013-5:2021 compliant Mobile driving licence (mDL) application data transfer.", "Type": "identity" }, { @@ -2259,10 +2259,26 @@ "AID": "A000000809434343444B467631", "Vendor": "Car Connectivity Consortium (CCC)", "Country": "", + "Name": "Digital Car Key Framework", + "Description": "Used during key provisioning and configuration", + "Type": "access" + }, + { + "AID": "A000000809434343444B417631", + "Vendor": "Car Connectivity Consortium (CCC)", + "Country": "", "Name": "Digital Car Key", "Description": "", "Type": "access" }, + { + "AID": "A0000008580102", + "Vendor": "Apple", + "Country": "", + "Name": "Apple Home Key Framework", + "Description": "Home Key configuration applet. Selected after a first transaction on a newely-invited device (allegedly for mailbox sync/attestation exchange)", + "Type": "" + }, { "AID": "A0000008580101", "Vendor": "Apple", @@ -2270,5 +2286,45 @@ "Name": "Apple Home Key", "Description": "NFC Home Key for select HomeKit-compatible locks", "Type": "access" + }, + { + "AID": "A000000396564341", + "Vendor": "NXP", + "Country": "", + "Name": "MIFARE 2GO", + "Description": "RID used by MIFARE 2GO-based cards", + "Type": "" + }, + { + "AID": "A0000002164954534F2D31", + "Vendor": "ITSO", + "Country": "United Kingdom", + "Name": "ITSO CMD2", + "Description": "AID used by ITSO for smartcard/phone-based transit cards", + "Type": "transit" + }, + { + "AID": "A000000632010105", + "Vendor": "CTTIC", + "Country": "China", + "Name": "China T-Union", + "Description": "Universal transit card used by many big public transit operators", + "Type": "transit" + }, + { + "AID": "D2760000254D010200", + "Vendor": "Zentraler Kreditausschuss (ZKA)", + "Country": "Germany", + "Name": "Girocard Jugendschutz", + "Description": "Age verification", + "Type": "" + }, + { + "AID": "A00000000491", + "Vendor": "MasterCard International", + "Country": "", + "Name": "Mastercard Private Label Transit", + "Description": "RID Used by transit cards that use private label mastercards (E.g. Ventra and HOP)", + "Type": "transit" } ] From f9ea12b98d376a1c0f9aadb2f08a3ee9208cc693 Mon Sep 17 00:00:00 2001 From: Maksym Date: Wed, 3 May 2023 00:48:21 +0300 Subject: [PATCH 410/924] Update aidlist.json Replace "rid" with prefix as it is more correct this way --- client/resources/aidlist.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/resources/aidlist.json b/client/resources/aidlist.json index bd6e4eac8..ff574dd6a 100644 --- a/client/resources/aidlist.json +++ b/client/resources/aidlist.json @@ -2292,7 +2292,7 @@ "Vendor": "NXP", "Country": "", "Name": "MIFARE 2GO", - "Description": "RID used by MIFARE 2GO-based cards", + "Description": "AID prefix used by MIFARE 2GO-based cards", "Type": "" }, { @@ -2324,7 +2324,7 @@ "Vendor": "MasterCard International", "Country": "", "Name": "Mastercard Private Label Transit", - "Description": "RID Used by transit cards that use private label mastercards (E.g. Ventra and HOP)", + "Description": "AID prefix used by transit cards that use private label mastercards (E.g. Ventra and HOP)", "Type": "transit" } ] From f1aedc6bcedf3ae0c4f2c6570cab23e8b546e23f Mon Sep 17 00:00:00 2001 From: Nat McHugh Date: Tue, 2 May 2023 19:42:18 +0000 Subject: [PATCH 411/924] Add paxton id to hitg2 info --- CHANGELOG.md | 1 + client/src/cmdlfhitag.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c73f7641a..61333107d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf legic view` - now also print the decoded info of the dump file (@0xdeb) - Now `script run hf_mf_ultimatecard.lua -u` supports 10bytes UID (@alejandro12120) - Update documentation for installation on macOS with MacPorts (@linuxgemini) + - Added possible Paxton id to hitag2 tag info output ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 66fb3ea42..23b8ac235 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -324,6 +324,37 @@ static int CmdLFHitagSim(const char *Cmd) { return PM3_SUCCESS; } + +static void printHitag2PaxtonDowngrade(const uint8_t *data) { + + uint64_t bytes = 0; + uint64_t num = 0; + uint64_t paxton_id = 0; + uint16_t skip = 48; + uint16_t digit = 0; + uint64_t mask = 0xF80000000000; + + for (int i = 16; i < 22; i++) { + bytes = (bytes * 0x100) + data[i]; + } + + for (int j = 0; j< 8; j++) { + num = bytes & mask; + skip -= 5; + mask = mask >> 5; + digit = (num >> skip & 15); + paxton_id = (paxton_id * 10) + digit; + + if (j == 5) { + skip -= 2; + mask = mask >> 2; + } + } + + PrintAndLogEx(INFO, "-------- " _CYAN_("Possible de-scramble patterns") " ---------"); + PrintAndLogEx(SUCCESS, "Paxton id: %lu | 0x%lx", paxton_id, paxton_id); +} + static void printHitag2Configuration(uint8_t config) { char msg[100]; @@ -630,6 +661,8 @@ static int CmdLFHitagReader(const char *Cmd) { // print data print_hex_break(data, 48, 4); + + printHitag2PaxtonDowngrade(data); } return PM3_SUCCESS; } From b8c7e02ad847a7874ab04ca4246a6c0e2a70e9e4 Mon Sep 17 00:00:00 2001 From: flamebarke <39644720+flamebarke@users.noreply.github.com> Date: Thu, 4 May 2023 21:34:27 +1000 Subject: [PATCH 412/924] Create lf_multihid.c Signed-off-by: flamebarke <39644720+flamebarke@users.noreply.github.com> --- armsrc/Standalone/lf_multihid.c | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 armsrc/Standalone/lf_multihid.c diff --git a/armsrc/Standalone/lf_multihid.c b/armsrc/Standalone/lf_multihid.c new file mode 100644 index 000000000..d2edd867c --- /dev/null +++ b/armsrc/Standalone/lf_multihid.c @@ -0,0 +1,76 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Shain Lakin, 2023 +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// LF HID 26 Bit (H10301) multi simulator: +// Simple LF HID26 (H10301) tag simulator +// Short click - select next slot and start simulation +// LEDS = LED ON for selected slot +// Add tags (raw) to the hid26_predefined_raw array +//----------------------------------------------------------------------------- + + +#include "standalone.h" +#include "proxmark3_arm.h" +#include "appmain.h" +#include "fpgaloader.h" +#include "util.h" +#include "dbprint.h" +#include "ticks.h" +#include "lfops.h" + +#define ARRAYLEN(x) (sizeof(x) / sizeof((x)[0])) +#define MAX_IND 4 + +void LED_Slot(int i); + +static uint64_t hid26_predefined_raw[] = {0x2004ec2e87, 0x2004421807, 0x20064312d6, 0x2006ec0c86}; +static uint8_t hid26_slots_count; + +void ModInfo(void) { + DbpString("LF HID 26 Bit (H10301) multi simulator - aka MultiHID (Shain Lakin)"); +} + +void LED_Slot(int i) { + LEDsoff(); + if (hid26_slots_count > 4) { + LED(i % MAX_IND, 0); + } else { + LED(1 << i, 0); + } +} + +void RunMod(void) { + StandAloneMode(); + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); + Dbprintf(">> LF HID26 multi simulator started - aka MultiHID (Shain Lakin) <<"); + + int selected = 0; //selected slot after start + hid26_slots_count = ARRAYLEN(hid26_predefined_raw); + for (;;) { + WDT_HIT(); + if (data_available()) { + LEDsoff(); + break; + } + + SpinDelay(100); + SpinUp(100); + LED_Slot(selected); + uint64_t raw_data = hid26_predefined_raw[selected]; + CmdHIDsimTAG(0, raw_data >> 32, raw_data & 0xFFFFFFFF, 0, false); + selected = (selected + 1) % hid26_slots_count; + } +} From 0fac149a039d26a33e52ac685bd1a42ae48770e4 Mon Sep 17 00:00:00 2001 From: flamebarke <39644720+flamebarke@users.noreply.github.com> Date: Thu, 4 May 2023 21:44:12 +1000 Subject: [PATCH 413/924] Update Makefile.hal Signed-off-by: flamebarke <39644720+flamebarke@users.noreply.github.com> --- armsrc/Standalone/Makefile.hal | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index cb41bc148..da204eaca 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -50,6 +50,9 @@ define KNOWN_STANDALONE_DEFINITIONS | LF_ICEHID | LF HID collector to flashmem | | (RDV4 only) | | +----------------------------------------------------------+ +| LF_MULTIHID | LF HID 26 Bit (H1031) multi simulator | +| | - Shain Lakin | ++----------------------------------------------------------+ | LF_NEDAP_SIM | LF Nedap ID simple simulator | | | | +----------------------------------------------------------+ @@ -126,7 +129,7 @@ endef STANDALONE_MODES := LF_SKELETON -STANDALONE_MODES += LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_NEDAP_SIM LF_NEXID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE +STANDALONE_MODES += LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_MULTIHID LF_NEDAP_SIM LF_NEXID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE STANDALONE_MODES += HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY HF_TCPRST HF_TMUDFORD HF_YOUNG STANDALONE_MODES += DANKARMULTI STANDALONE_MODES_REQ_BT := HF_REBLAY From 92ec161d08380135d8a233ffe14f9b45ce648dc2 Mon Sep 17 00:00:00 2001 From: flamebarke <39644720+flamebarke@users.noreply.github.com> Date: Thu, 4 May 2023 21:50:14 +1000 Subject: [PATCH 414/924] Update Makefile.inc Signed-off-by: flamebarke <39644720+flamebarke@users.noreply.github.com> --- armsrc/Standalone/Makefile.inc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index 48ac2217f..6aeb163bb 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -49,6 +49,10 @@ endif ifneq (,$(findstring WITH_STANDALONE_LF_ICEHID,$(APP_CFLAGS))) SRC_STANDALONE = lf_icehid.c endif +# WITH_STANDALONE_LF_MULTIHID +ifneq (,$(findstring WITH_STANDALONE_LF_MULTIHID,$(APP_CFLAGS))) + SRC_STANDALONE = lf_multihid.c +endif # WITH_STANDALONE_LF_NEDAP_SIM ifneq (,$(findstring WITH_STANDALONE_LF_NEDAP_SIM,$(APP_CFLAGS))) SRC_STANDALONE = lf_nedap_sim.c From 6880c51ad60bc760d298bc5c8884c3ebd530be88 Mon Sep 17 00:00:00 2001 From: flamebarke <39644720+flamebarke@users.noreply.github.com> Date: Thu, 4 May 2023 21:55:23 +1000 Subject: [PATCH 415/924] Update CHANGELOG.md Signed-off-by: flamebarke <39644720+flamebarke@users.noreply.github.com> --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61333107d..d8c6d5e95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added new standalone mode `LF_MULTIHID` - HID26 (H1031) multi simulator (@flamebarke) - Changed `hf 14b dump --ns` - now supports `no save` of card memory (@iceman1001) - Changed `hf mfu dump --ns` - now supports `no save` of card memory (@iceman1001) - Changed the PM3 client to honor the preferences dump/trace paths. experimental support (@iceman1001) From caf3bbc026696ff5aa6d20ded92b826e6e2f859d Mon Sep 17 00:00:00 2001 From: flamebarke <39644720+flamebarke@users.noreply.github.com> Date: Thu, 4 May 2023 22:26:39 +1000 Subject: [PATCH 416/924] Update 4_Advanced-compilation-parameters.md Signed-off-by: flamebarke <39644720+flamebarke@users.noreply.github.com> --- doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index 5ead60b1a..53726b9dd 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -108,6 +108,7 @@ Here are the supported values you can assign to `STANDALONE` in `Makefile.platfo | LF_HIDBRUTE | HID corporate 1000 bruteforce - Federico dotta & Maurizio Agazzini | LF_HIDFCBRUTE | LF HID facility code bruteforce - ss23 | LF_ICEHID | LF HID collector to flashmem - Iceman1001 +| LF_MULTIHID | LF HID 26 Bit (H1031) multi simulator - Shain Lakin | LF_NEDAP_SIM | LF Nedap ID simulator | LF_NEXID | Nexwatch credentials detection mode - jrjgjk & Zolorah | LF_PROXBRUTE | HID ProxII bruteforce - Brad Antoniewicz From dd28bc8e5d94f7740b77bc1824c606df951bca75 Mon Sep 17 00:00:00 2001 From: flamebarke <39644720+flamebarke@users.noreply.github.com> Date: Thu, 4 May 2023 22:29:14 +1000 Subject: [PATCH 417/924] Update build_all_firmwares.sh Signed-off-by: flamebarke <39644720+flamebarke@users.noreply.github.com> --- tools/build_all_firmwares.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index 644438032..b38f557ab 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -32,7 +32,7 @@ mv bootrom/obj/bootrom.elf "$DEST/PM3BOOTROM.elf" # cf armsrc/Standalone/Makefile.hal STANDALONE_MODES=(LF_SKELETON) -STANDALONE_MODES+=(LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_NEDAP_SIM LF_NEXID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE) +STANDALONE_MODES+=(LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_MULTIHID LF_NEDAP_SIM LF_NEXID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE) STANDALONE_MODES+=(HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY HF_TCPRST HF_TMUDFORD HF_YOUNG) STANDALONE_MODES+=(DANKARMULTI) STANDALONE_MODES_REQ_BT=(HF_REBLAY) From b1839d7318f39f940b6925ec0e3f6ab83847c4ef Mon Sep 17 00:00:00 2001 From: Jonathan Liu Date: Fri, 5 May 2023 12:19:11 +1000 Subject: [PATCH 418/924] hf mf sim: reduce 50ms threshold to 6ms for reset to idle Fixes reader not being able to detect the simulated card on second Inventory command due to the RF field being powered off for only 6ms before being turned on again to reset the card to idle state. Closes #1974 --- CHANGELOG.md | 1 + armsrc/iso14443a.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61333107d..2332cb2c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Now `script run hf_mf_ultimatecard.lua -u` supports 10bytes UID (@alejandro12120) - Update documentation for installation on macOS with MacPorts (@linuxgemini) - Added possible Paxton id to hitag2 tag info output + - Changed `hf mf sim` - reduce 50ms threshold to 6ms for reset to idle #1974 (@net147) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 637215cc3..a8cc1414b 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -2084,8 +2084,8 @@ int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *par) { if (timer == 0) { timer = GetTickCount(); } else { - // 50ms no field --> card to idle state - if (GetTickCountDelta(timer) > 50) { + // 6ms no field --> card to idle state + if (GetTickCountDelta(timer) > 6) { return 2; } } From 0c9a64438f7e359ad2a1d48e7fafd32f7fac4380 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 10:45:35 +0200 Subject: [PATCH 419/924] 256kb version is too large --- tools/build_all_firmwares.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index b38f557ab..4a0fe5947 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -22,8 +22,7 @@ echo "Destination: ${DEST:=firmware}" echo "Produce stats?: ${STATS:=false}" # Which parts to skip for the 256kb version? -SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_ISO14443b=1 SKIP_NFCBARCODE=1 SKIP_ZX8211=1" - +SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_ISO14443b=1 SKIP_NFCBARCODE=1 SKIP_ZX8211=1 SKIP_LF=1" make $MKFLAGS bootrom || exit 1 chmod 644 bootrom/obj/bootrom.elf From 52981476e208f31c9527dc1751ed47da550114a1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 10:47:02 +0200 Subject: [PATCH 420/924] fixed ndef parsing of signature version 1 records --- CHANGELOG.md | 1 + client/src/nfc/ndef.c | 68 ++++++++++++++++++++++++++++++------------- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1795ed0a1..35e5f756c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `nfc decode` - now handles NDEF Signature version1 records better (@iceman1001) - Added new standalone mode `LF_MULTIHID` - HID26 (H1031) multi simulator (@flamebarke) - Changed `hf 14b dump --ns` - now supports `no save` of card memory (@iceman1001) - Changed `hf mfu dump --ns` - now supports `no save` of card memory (@iceman1001) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index b995a3e19..99df7e419 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -289,22 +289,35 @@ static int ndef_print_signature(uint8_t *data, uint8_t data_len, uint8_t *signat } static int ndefDecodeSig1(uint8_t *sig, size_t siglen) { - size_t indx = 1; + size_t indx = 1; uint8_t sigType = sig[indx] & 0x7f; bool sigURI = sig[indx] & 0x80; + indx++; - PrintAndLogEx(SUCCESS, "\tsignature type: %s", ((sigType < stNA) ? ndefSigType_s[sigType] : ndefSigType_s[stNA])); - PrintAndLogEx(SUCCESS, "\tsignature uri: %s", (sigURI ? "present" : "not present")); + PrintAndLogEx(SUCCESS, "\tSignature type... " _YELLOW_("%s"), ((sigType < stNA) ? ndefSigType_s[sigType] : ndefSigType_s[stNA])); + PrintAndLogEx(SUCCESS, "\tSignature URI.... " _YELLOW_("%s"), (sigURI ? "present" : "not present")); + + if (sigType == 0 && sigURI == false) { + PrintAndLogEx(INFO, "\tRecord should be considered a start marker"); + } + if (sigType == 0 && sigURI) { + PrintAndLogEx(INFO, _RED_("\tSignature record is invalid")); + } + + uint16_t intsiglen = MemBeToUint2byte(sig + indx); + indx += 2; - size_t intsiglen = (sig[indx + 1] << 8) + sig[indx + 2]; // ecdsa 0x04 if (sigType == stECDSA_P192 || sigType == stECDSA_P256) { - indx += 3; + int slen = 24; - if (sigType == stECDSA_P256) + if (sigType == stECDSA_P256) { slen = 32; - PrintAndLogEx(SUCCESS, "\tsignature [%zu]: %s", intsiglen, sprint_hex_inrow(&sig[indx], intsiglen)); + } + + PrintAndLogEx(SUCCESS, "\tSignature [%u]...", intsiglen); + print_hex_noascii_break(&sig[indx], intsiglen, 32); uint8_t rval[300] = {0}; uint8_t sval[300] = {0}; @@ -313,38 +326,53 @@ static int ndefDecodeSig1(uint8_t *sig, size_t siglen) { PrintAndLogEx(SUCCESS, "\t\tr: %s", sprint_hex(rval + 32 - slen, slen)); PrintAndLogEx(SUCCESS, "\t\ts: %s", sprint_hex(sval + 32 - slen, slen)); } + } else { + PrintAndLogEx(SUCCESS, "\tSignature [%u]...", intsiglen); + print_hex_noascii_break(&sig[indx], intsiglen, 32); } + indx += intsiglen; if (sigURI) { - size_t intsigurilen = (sig[indx] << 8) + sig[indx + 1]; + + uint16_t intsigurilen = MemBeToUint2byte(sig + indx); indx += 2; - PrintAndLogEx(SUCCESS, "\tsignature uri [%zu]: %.*s", intsigurilen, (int)intsigurilen, &sig[indx]); + + PrintAndLogEx(SUCCESS, "\tSignature URI... " _YELLOW_("%.*s"), (int)intsigurilen, &sig[indx]); indx += intsigurilen; } + // CERTIFICATE SECTION + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, _CYAN_("Certificate")); + uint8_t certFormat = (sig[indx] >> 4) & 0x07; uint8_t certCount = sig[indx] & 0x0f; bool certURI = sig[indx] & 0x80; + indx++; - PrintAndLogEx(SUCCESS, "\tcertificate format: %s", ((certFormat < sfNA) ? ndefCertificateFormat_s[certFormat] : ndefCertificateFormat_s[sfNA])); - PrintAndLogEx(SUCCESS, "\tcertificates count: %d", certCount); + PrintAndLogEx(SUCCESS, "\tFormat............ " _YELLOW_("%s"), ((certFormat < sfNA) ? ndefCertificateFormat_s[certFormat] : ndefCertificateFormat_s[sfNA])); + if (certCount) { + PrintAndLogEx(SUCCESS, "\tNum of certs#..... " _YELLOW_("%d"), certCount); + } // print certificates - indx++; - for (int i = 0; i < certCount; i++) { - size_t intcertlen = (sig[indx + 1] << 8) + sig[indx + 2]; + for (uint8_t i = 0; i < certCount; i++) { + uint16_t intcertlen = MemBeToUint2byte(sig + indx); indx += 2; - PrintAndLogEx(SUCCESS, "\tcertificate %d [%zu]: %s", i + 1, intcertlen, sprint_hex_inrow(&sig[indx], intcertlen)); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(SUCCESS, "\tCertificate %u [%u]...", i + 1, intcertlen); + print_hex_noascii_break(&sig[indx], intcertlen, 32); + indx += intcertlen; } - // have certificate uri + // print certificate uri if ((indx <= siglen) && certURI) { - size_t inturilen = (sig[indx] << 8) + sig[indx + 1]; + uint16_t inturilen = MemBeToUint2byte(sig + indx); indx += 2; - PrintAndLogEx(SUCCESS, "\tcertificate uri [%zu]: %.*s", inturilen, (int)inturilen, &sig[indx]); + PrintAndLogEx(SUCCESS, "\tCertificate URI... " _YELLOW_("%.*s"), (int)inturilen, &sig[indx]); } return PM3_SUCCESS; @@ -417,9 +445,9 @@ static int ndefDecodeSig2(uint8_t *sig, size_t siglen) { } static int ndefDecodeSig(uint8_t *sig, size_t siglen) { - PrintAndLogEx(SUCCESS, "\tsignature version : \t" _GREEN_("0x%02x"), sig[0]); + PrintAndLogEx(SUCCESS, "\tVersion... " _GREEN_("0x%02x"), sig[0]); if (sig[0] != 0x01 && sig[0] != 0x20) { - PrintAndLogEx(ERR, "signature version unknown."); + PrintAndLogEx(ERR, _RED_("Version unknown")); return PM3_ESOFT; } From 3e293b4bc8dbce24c81f18818ad330bf1159ab72 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 12:33:14 +0200 Subject: [PATCH 421/924] changed nfc decode to handle external records and if the record happens to be estonian ekaart also ASN1 decode it --- CHANGELOG.md | 1 + client/src/nfc/ndef.c | 63 ++++++++++++++++++++++++++++++++++++------- client/src/nfc/ndef.h | 3 ++- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35e5f756c..e20b440f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `nfc decode` - now handles EXTERNAL RECORDS better (@iceman1001) - Fixed `nfc decode` - now handles NDEF Signature version1 records better (@iceman1001) - Added new standalone mode `LF_MULTIHID` - HID26 (H1031) multi simulator (@flamebarke) - Changed `hf 14b dump --ns` - now supports `no save` of card memory (@iceman1001) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index 99df7e419..a97d5bb55 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -39,8 +39,6 @@ #define NDEF_VCARDTEXT "text/vcard" #define NDEF_XVCARDTEXT "text/x-vcard" - - static const char *TypeNameFormat_s[] = { "Empty Record", "Well Known Record", @@ -295,8 +293,8 @@ static int ndefDecodeSig1(uint8_t *sig, size_t siglen) { bool sigURI = sig[indx] & 0x80; indx++; - PrintAndLogEx(SUCCESS, "\tSignature type... " _YELLOW_("%s"), ((sigType < stNA) ? ndefSigType_s[sigType] : ndefSigType_s[stNA])); - PrintAndLogEx(SUCCESS, "\tSignature URI.... " _YELLOW_("%s"), (sigURI ? "present" : "not present")); + PrintAndLogEx(SUCCESS, "\tType...... " _YELLOW_("%s"), ((sigType < stNA) ? ndefSigType_s[sigType] : ndefSigType_s[stNA])); + PrintAndLogEx(SUCCESS, "\tURI....... " _YELLOW_("%s"), (sigURI ? "present" : "not present")); if (sigType == 0 && sigURI == false) { PrintAndLogEx(INFO, "\tRecord should be considered a start marker"); @@ -327,7 +325,7 @@ static int ndefDecodeSig1(uint8_t *sig, size_t siglen) { PrintAndLogEx(SUCCESS, "\t\ts: %s", sprint_hex(sval + 32 - slen, slen)); } } else { - PrintAndLogEx(SUCCESS, "\tSignature [%u]...", intsiglen); + PrintAndLogEx(SUCCESS, "\tData [%u]...", intsiglen); print_hex_noascii_break(&sig[indx], intsiglen, 32); } @@ -817,7 +815,7 @@ static int ndefDecodeMime_bt(NDEFHeader_t *ndef) { return PM3_SUCCESS; } PrintAndLogEx(INFO, "Type............ " _YELLOW_("%.*s"), (int)ndef->TypeLen, ndef->Type); - uint16_t ooblen = (ndef->Payload[1] << 8 | ndef->Payload[0]); + uint16_t ooblen = MemBeToUint2byte(ndef->Payload); PrintAndLogEx(INFO, "OOB data len.... %u", ooblen); PrintAndLogEx(INFO, "BT MAC.......... " _YELLOW_("%s"), sprint_hex(ndef->Payload + 2, 6)); // Let's check payload[8]. Tells us a bit about the UUID's. If 0x07 then it tells us a service UUID is 128bit @@ -856,6 +854,38 @@ static int ndefDecodeMime_bt(NDEFHeader_t *ndef) { return PM3_SUCCESS; } +// https://raw.githubusercontent.com/haldean/ndef/master/docs/NFCForum-TS-RTD_1.0.pdf +static int ndefDecodeExternal_record(NDEFHeader_t *ndef) { + + if (ndef->TypeLen == 0) { + PrintAndLogEx(INFO, "no type"); + return PM3_SUCCESS; + } + + if (ndef->PayloadLen == 0) { + PrintAndLogEx(INFO, "no payload"); + return PM3_SUCCESS; + } + + PrintAndLogEx(INFO + , " URN... " _GREEN_("urn:nfc:ext:%.*s") + , (int)ndef->TypeLen + , ndef->Type + ); + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "Payload [%u]...", ndef->PayloadLen); + print_hex_noascii_break(ndef->Payload, ndef->PayloadLen, 32); + + // do a character check? + if (!strncmp((char *)ndef->Type, "pilet.ee:ekaart:2", ndef->TypeLen)) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, _GREEN_("Ekaart detected") " - Trying ASN1 decode..."); + asn1_print(ndef->Payload, ndef->PayloadLen, " "); + } + return PM3_SUCCESS; +} + static int ndefDecodePayload(NDEFHeader_t *ndef, bool verbose) { PrintAndLogEx(INFO, ""); @@ -863,7 +893,7 @@ static int ndefDecodePayload(NDEFHeader_t *ndef, bool verbose) { case tnfEmptyRecord: PrintAndLogEx(INFO, "Empty Record"); if (ndef->TypeLen != 0 || ndef->IDLen != 0 || ndef->PayloadLen != 0) { - PrintAndLogEx(FAILED, "unexpected data in TNF_EMPTY record"); + PrintAndLogEx(FAILED, "unexpected data in empty record"); break; } break; @@ -959,20 +989,33 @@ static int ndefDecodePayload(NDEFHeader_t *ndef, bool verbose) { } case tnfAbsoluteURIRecord: PrintAndLogEx(INFO, "Absolute URI Record"); - PrintAndLogEx(INFO, " payload : %.*s", (int)ndef->PayloadLen, ndef->Payload); + PrintAndLogEx(INFO, " payload : " _YELLOW_("%.*s"), (int)ndef->PayloadLen, ndef->Payload); break; case tnfExternalRecord: PrintAndLogEx(INFO, "External Record"); - PrintAndLogEx(INFO, "- decoder to be impl -"); + ndefDecodeExternal_record(ndef); break; case tnfUnknownRecord: PrintAndLogEx(INFO, "Unknown Record"); - PrintAndLogEx(INFO, "- decoder to be impl -"); + if (ndef->TypeLen != 0) { + PrintAndLogEx(FAILED, "unexpected type field"); + break; + } break; case tnfUnchangedRecord: PrintAndLogEx(INFO, "Unchanged Record"); PrintAndLogEx(INFO, "- decoder to be impl -"); break; + case tnfReservedRecord: + PrintAndLogEx(INFO, "Reserved Record"); + if (ndef->TypeLen != 0) { + PrintAndLogEx(FAILED, "unexpected type field"); + break; + } + break; + default: + PrintAndLogEx(FAILED, "unexpected tnf value... 0x%02x", ndef->TypeNameFormat); + break; } PrintAndLogEx(INFO, ""); return PM3_SUCCESS; diff --git a/client/src/nfc/ndef.h b/client/src/nfc/ndef.h index 478c28e0a..643bb70a7 100644 --- a/client/src/nfc/ndef.h +++ b/client/src/nfc/ndef.h @@ -31,7 +31,8 @@ typedef enum { tnfAbsoluteURIRecord = 0x03, tnfExternalRecord = 0x04, tnfUnknownRecord = 0x05, - tnfUnchangedRecord = 0x06 + tnfUnchangedRecord = 0x06, + tnfReservedRecord = 0x07, } TypeNameFormat_t; typedef enum { From ed555be1804b9f98d59351541a16ee171939d2a8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 13:18:53 +0200 Subject: [PATCH 422/924] fix wrong copying when skipping sector trailers --- client/src/mifare/mifarehost.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 9e9f674e1..3b37182fe 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1467,12 +1467,12 @@ int convert_mfc_2_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen) if (mfIsSectorTrailer(blockno) == false) { memcpy(out, in, MFBLOCK_SIZE); + out += MFBLOCK_SIZE; + *olen += MFBLOCK_SIZE; } blockno++; - out += MFBLOCK_SIZE; in += MFBLOCK_SIZE; ilen -= MFBLOCK_SIZE; - *olen += MFBLOCK_SIZE; } return PM3_SUCCESS; } From 78f097cb5581081f0ee42958b13c41d4b487aa90 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 13:20:52 +0200 Subject: [PATCH 423/924] the nfc decode now handling MFC dump files, it detects the MAD key and if so removes all sector trailers. this means a lot of zeros in the end might be there. And ndef prints a bunch of empty records. Better than before atleast --- CHANGELOG.md | 1 + client/src/cmdnfc.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e20b440f8..dff4bcf59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `nfc decode -f` - now can detect and convert MFC dumpfiles to NDEF byte arrays (@iceman1001) - Changed `nfc decode` - now handles EXTERNAL RECORDS better (@iceman1001) - Fixed `nfc decode` - now handles NDEF Signature version1 records better (@iceman1001) - Added new standalone mode `LF_MULTIHID` - HID26 (H1031) multi simulator (@flamebarke) diff --git a/client/src/cmdnfc.c b/client/src/cmdnfc.c index df87ee6f8..6f9561783 100644 --- a/client/src/cmdnfc.c +++ b/client/src/cmdnfc.c @@ -30,6 +30,8 @@ #include "cmdhftopaz.h" #include "cmdnfc.h" #include "fileutils.h" +#include "mifare/mifaredefault.h" +#include "mifare/mad.h" void print_type4_cc_info(uint8_t *d, uint8_t n) { if (n < 0x0F) { @@ -111,6 +113,17 @@ static int CmdNfcDecode(const char *Cmd) { return res; } + // convert from MFC dump file to a pure NDEF byte array + if (HasMADKey(dump)) { + PrintAndLogEx(SUCCESS, "MFC dump file detected. Converting..."); + uint8_t ndef[4096] = {0}; + uint16_t ndeflen = 0; + uint8_t skip = (4 * MFBLOCK_SIZE); + convert_mfc_2_arr(dump + skip, bytes_read - skip, ndef, &ndeflen); + memcpy(dump, ndef, ndeflen); + bytes_read = ndeflen; + } + res = NDEFDecodeAndPrint(dump, bytes_read, verbose); if (res != PM3_SUCCESS) { PrintAndLogEx(INFO, "Trying to parse NDEF records w/o NDEF header"); From 3b68acd2864b3cd401b07da4b98fa2bfc080e529 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 19:37:35 +0200 Subject: [PATCH 424/924] comment out duplicate but kept it since documentation --- client/dictionaries/mfc_default_keys.dic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 4af8cf64a..b51989bda 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2112,7 +2112,7 @@ D23C1CB1216E # 20230413-78, Caesars A1D92F808CAF # 20230413-79, The Cosmopolitan, Vegas -96A301BCE267 +# 96A301BCE267 # 20230413-80, Aria 1153C319B4F8 # 20230413-81, Aria From cb0a447600c66d5f8a4792b1b3aa3ae898f45c66 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 22:24:53 +0200 Subject: [PATCH 425/924] bt handover req/select and reverse BT MAC --- client/src/nfc/ndef.c | 57 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index a97d5bb55..b0a32daec 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -499,6 +499,51 @@ static int ndefDecodePayloadDeviceInfo(uint8_t *payload, size_t len) { return PM3_SUCCESS; } +static int ndefDecodePayloadHandoverRequest(uint8_t *payload, size_t len) { + if (payload == NULL) + return PM3_EINVARG; + if (len < 1) + return PM3_EINVARG; + + PrintAndLogEx(INFO, _CYAN_("Handover Request")); + uint8_t *p = payload; + uint8_t major = (*(p) >> 4) & 0x0F; + uint8_t minor = *(p) & 0x0F; + p++; + + PrintAndLogEx(INFO, "Version....... " _YELLOW_("%u.%u"), major, minor); + if (major != 1 && minor != 2) { + PrintAndLogEx(FAILED, "Wrong version numbers"); + } + + uint16_t collision = MemBeToUint2byte(p); + p += 2; + PrintAndLogEx(INFO, "Collision Resolution... " _YELLOW_("%u"), collision); + PrintAndLogEx(NORMAL, ""); + + return PM3_SUCCESS; +} + +static int ndefDecodePayloadHandoverSelect(uint8_t *payload, size_t len) { + if (payload == NULL) + return PM3_EINVARG; + if (len < 1) + return PM3_EINVARG; + + PrintAndLogEx(INFO, _CYAN_("Handover select")); + + uint8_t *p = payload; + uint8_t major = (*(p) >> 4) & 0x0F; + uint8_t minor = *(p) & 0x0F; + p++; + PrintAndLogEx(INFO, "Version....... " _YELLOW_("%u.%u"), major, minor); + if (major != 1 && minor != 2) { + PrintAndLogEx(FAILED, "Wrong version numbers"); + } + PrintAndLogEx(NORMAL, ""); + return PM3_SUCCESS; +} + static int ndefDecodePayloadSmartPoster(uint8_t *ndef, size_t ndeflen, bool print, bool verbose) { if (print) { PrintAndLogEx(INFO, _YELLOW_("Well Known Record - Smartposter {")); @@ -817,7 +862,11 @@ static int ndefDecodeMime_bt(NDEFHeader_t *ndef) { PrintAndLogEx(INFO, "Type............ " _YELLOW_("%.*s"), (int)ndef->TypeLen, ndef->Type); uint16_t ooblen = MemBeToUint2byte(ndef->Payload); PrintAndLogEx(INFO, "OOB data len.... %u", ooblen); - PrintAndLogEx(INFO, "BT MAC.......... " _YELLOW_("%s"), sprint_hex(ndef->Payload + 2, 6)); + + uint8_t rev[6] = {0}; + reverse_array_copy(ndef->Payload + 2, 6, rev); + PrintAndLogEx(INFO, "BT MAC.......... " _YELLOW_("%s"), sprint_hex(rev, sizeof(rev))); + // Let's check payload[8]. Tells us a bit about the UUID's. If 0x07 then it tells us a service UUID is 128bit switch (ndef->Payload[8]) { case 0x02: @@ -942,13 +991,11 @@ static int ndefDecodePayload(NDEFHeader_t *ndef, bool verbose) { } if (!strncmp((char *)ndef->Type, "Hr", ndef->TypeLen)) { - PrintAndLogEx(INFO, _CYAN_("Handover request")); - PrintAndLogEx(INFO, "- decoder to be impl -"); + ndefDecodePayloadHandoverRequest(ndef->Payload, ndef->PayloadLen); } if (!strncmp((char *)ndef->Type, "Hs", ndef->TypeLen)) { - PrintAndLogEx(INFO, _CYAN_("Handover select")); - PrintAndLogEx(INFO, "- decoder to be impl -"); + ndefDecodePayloadHandoverSelect(ndef->Payload, ndef->PayloadLen); } if (!strncmp((char *)ndef->Type, "ac", ndef->TypeLen)) { From 27576be5c25241ea7bf2b7a20b3f954e1feb3e83 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 22:26:44 +0200 Subject: [PATCH 426/924] trying to extract ndef data from dumps by looking at MAD --- client/src/cmdhfmf.c | 18 ------------ client/src/cmdnfc.c | 11 +++++-- client/src/mifare/mad.c | 48 +++++++++++++++++++++++++++++++ client/src/mifare/mad.h | 1 + client/src/mifare/mifaredefault.h | 21 ++++++++++++-- 5 files changed, 77 insertions(+), 22 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index a647d90c2..dc0dbe412 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -18,7 +18,6 @@ #include "cmdhfmf.h" #include - #include "cmdparser.h" // command_t #include "commonutil.h" // ARRAYLEN #include "comms.h" // clearCommandBuffer @@ -38,23 +37,6 @@ #include "wiegand_formats.h" #include "wiegand_formatutils.h" -#define MIFARE_4K_MAXBLOCK 256 -#define MIFARE_2K_MAXBLOCK 128 -#define MIFARE_1K_MAXBLOCK 64 -#define MIFARE_MINI_MAXBLOCK 20 - -#define MIFARE_4K_MAXSECTOR 40 -#define MIFARE_2K_MAXSECTOR 32 -#define MIFARE_1K_MAXSECTOR 16 -#define MIFARE_MINI_MAXSECTOR 5 - -#define MIFARE_4K_MAX_BYTES 4096 -#define MIFARE_2K_MAX_BYTES 2048 -#define MIFARE_1K_MAX_BYTES 1024 -#define MIFARE_MINI_MAX_BYTES 320 - -#define MIFARE_KEY_SIZE 6 - static int CmdHelp(const char *Cmd); /* diff --git a/client/src/cmdnfc.c b/client/src/cmdnfc.c index 6f9561783..221b33020 100644 --- a/client/src/cmdnfc.c +++ b/client/src/cmdnfc.c @@ -118,8 +118,15 @@ static int CmdNfcDecode(const char *Cmd) { PrintAndLogEx(SUCCESS, "MFC dump file detected. Converting..."); uint8_t ndef[4096] = {0}; uint16_t ndeflen = 0; - uint8_t skip = (4 * MFBLOCK_SIZE); - convert_mfc_2_arr(dump + skip, bytes_read - skip, ndef, &ndeflen); + // uint8_t skip = (4 * MFBLOCK_SIZE); + // convert_mfc_2_arr(dump + skip, bytes_read - skip, ndef, &ndeflen); + + if (convert_mad_to_arr(dump, bytes_read, ndef, &ndeflen) != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Failed converting, aborting..."); + free(dump); + return PM3_ESOFT; + } + memcpy(dump, ndef, ndeflen); bytes_read = ndeflen; } diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 023f3cbf6..49d3de065 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -421,3 +421,51 @@ int DetectHID(uint8_t *d, uint16_t manufacture) { return -1; } + +int convert_mad_to_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen) { + + if (in == NULL || out == NULL || ilen == 0 ) { + return PM3_EINVARG; + } + + // MAD detection + if (HasMADKey(in) == false) { + PrintAndLogEx(FAILED, "No MAD key was detected in the dump file"); + return PM3_ESOFT; + } + + uint8_t sector0[MFBLOCK_SIZE * 4] = {0}; + uint8_t sector10[MFBLOCK_SIZE * 4] = {0}; + + memcpy(sector0, in, sizeof(sector0)); + if (ilen == MIFARE_4K_MAX_BYTES) { + memcpy(sector10, in + (MF_MAD2_SECTOR * 4 * MFBLOCK_SIZE), sizeof(sector10)); + } + + uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; + size_t madlen = 0; + if (MADDecode(sector0, sector10, mad, &madlen, false)) { + PrintAndLogEx(ERR, "can't decode MAD"); + return PM3_ESOFT; + } + + uint16_t ndef_aid = 0xE103; + for (int i = 0; i < madlen; i++) { + if (ndef_aid == mad[i]) { + uint8_t tmp[MFBLOCK_SIZE * 4] = {0}; + memset(tmp, 0x00, sizeof(tmp)); + + // sector i dump (skip first sector +1) + memcpy(tmp, in + (i + 1) * sizeof(tmp), sizeof(tmp)); + + // debug print + // print_hex_noascii_break(tmp, sizeof(tmp) - MFBLOCK_SIZE, MFBLOCK_SIZE); + + // copy to out (skip ST) + memcpy(out, tmp, sizeof(tmp) - MFBLOCK_SIZE); + out += sizeof(tmp) - MFBLOCK_SIZE; + *olen += sizeof(tmp) -MFBLOCK_SIZE; + } + } + return PM3_SUCCESS; +} \ No newline at end of file diff --git a/client/src/mifare/mad.h b/client/src/mifare/mad.h index e1ebec62c..d1f5240f4 100644 --- a/client/src/mifare/mad.h +++ b/client/src/mifare/mad.h @@ -30,4 +30,5 @@ int MADCardHolderInfoDecode(uint8_t *data, size_t datalen, bool verbose); void MADPrintHeader(void); bool HasMADKey(uint8_t *d); int DetectHID(uint8_t *d, uint16_t manufacture); +int convert_mad_to_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen); #endif // _MAD_H_ diff --git a/client/src/mifare/mifaredefault.h b/client/src/mifare/mifaredefault.h index 7ce83e29f..fe11a2a27 100644 --- a/client/src/mifare/mifaredefault.h +++ b/client/src/mifare/mifaredefault.h @@ -21,8 +21,25 @@ #include "common.h" -#define MFKEY_SIZE 6 -#define MFBLOCK_SIZE 16 +#define MFKEY_SIZE 6 +#define MFBLOCK_SIZE 16 + +#define MIFARE_4K_MAXBLOCK 256 +#define MIFARE_2K_MAXBLOCK 128 +#define MIFARE_1K_MAXBLOCK 64 +#define MIFARE_MINI_MAXBLOCK 20 + +#define MIFARE_4K_MAXSECTOR 40 +#define MIFARE_2K_MAXSECTOR 32 +#define MIFARE_1K_MAXSECTOR 16 +#define MIFARE_MINI_MAXSECTOR 5 + +#define MIFARE_4K_MAX_BYTES 4096 +#define MIFARE_2K_MAX_BYTES 2048 +#define MIFARE_1K_MAX_BYTES 1024 +#define MIFARE_MINI_MAX_BYTES 320 + +#define MIFARE_KEY_SIZE 6 static const uint64_t g_mifare_default_keys[] = { 0xffffffffffff, // Default key (first key used by program if no user defined key) From f5e93c0a1cf89c21c46932f65a59d4360fb5da1c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 5 May 2023 22:27:00 +0200 Subject: [PATCH 427/924] added a test for ndef signatures --- tools/pm3_tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index f116de2b1..3320d9866 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -388,6 +388,7 @@ while true; do if ! CheckExecute "nfc decode test - device info" "$CLIENTBIN -c 'nfc decode -d d1025744690004536f6e79010752432d533338300220426c61636b204e46432052656164657220636f6e6e656374656420746f2050430310123e4567e89b12d3a45642665544000004124e464320506f72742d3130302076312e3032'" "NFC Port-100 v1.02"; then break; fi if ! CheckExecute "nfc decode test - vcard" "$CLIENTBIN -c 'nfc decode -d d20ca3746578742f782d7643617264424547494e3a56434152440a56455253494f4e3a332e300a4e3a43687269733b4963656d616e3b3b3b0a464e3a476f7468656e627572670a5245563a323032312d30362d32345432303a31353a30385a0a6974656d322e582d4142444154453b747970653d707265663a323032302d30362d32340a4954454d322e582d41424c4142454c3a5f24213c416e6e69766572736172793e21245f0a454e443a56434152440a'" "END:VCARD"; then break; fi if ! CheckExecute "nfc decode test - apple wallet" "$CLIENTBIN -c 'nfc decode -d 031AD10116550077616C6C65743A2F2F61637469766174652F6E6663FE'" "activate/nfc"; then break; fi + if ! CheckExecute "nfc decode test - signature" "$CLIENTBIN -c 'nfc decode -d 03FF010194113870696C65742E65653A656B616172743A3266195F26063132303832325904202020205F28033233335F2701316E1B5A13333038363439303039303030323636343030355304EBF2CE704103000000AC536967010200803A2448FCA7D354A654A81BD021150D1A152D1DF4D7A55D2B771F12F094EAB6E5E10F2617A2F8DAD4FD38AFF8EA39B71C19BD42618CDA86EE7E144636C8E0E7CFC4096E19C3680E09C78A0CDBC05DA2D698E551D5D709717655E56FE3676880B897D2C70DF5F06ECE07C71435255144F8EE41AF110E7B180DA0E6C22FB8FDEF61800025687474703A2F2F70696C65742E65652F6372742F33303836343930302D303030312E637274FE'" "30864900-0001.crt"; then break; fi echo -e "\n${C_BLUE}Testing LF:${C_NC}" if ! CheckExecute "lf AWID test" "$CLIENTBIN -c 'data load -f traces/lf_AWID-15-259.pm3;lf search -1'" "AWID ID found"; then break; fi From 31b01fff5a7634424d27123883fff47b341996fb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 6 May 2023 06:55:10 +0200 Subject: [PATCH 428/924] clearning variable before each call to hardnested --- client/src/cmdhfmf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index dc0dbe412..c9f473033 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2841,7 +2841,7 @@ tryNested: } break; } - case PM3_ESTATIC_NONCE: + case PM3_ESTATIC_NONCE: { PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); e_sector[current_sector_i].Key[current_key_type_i] = 0xffffffffffff;; @@ -2854,6 +2854,7 @@ tryNested: free(e_sector); free(fptr); return isOK; + } case PM3_SUCCESS: { calibrate = false; e_sector[current_sector_i].Key[current_key_type_i] = bytes_to_num(tmp_key, 6); @@ -2878,6 +2879,7 @@ tryHardnested: // If the nested attack fails then we try the hardnested attack slow ? "Yes" : "No"); } + foundkey = 0; isOK = mfnestedhard(mfFirstBlockOfSector(sectorno), keytype, key, mfFirstBlockOfSector(current_sector_i), current_key_type_i, NULL, false, false, slow, 0, &foundkey, NULL); DropField(); if (isOK) { From a3fa6c3df5c0980f2ee53f5dba6c293377eab308 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 6 May 2023 14:13:44 +0200 Subject: [PATCH 429/924] fixed ACL when recoving keys from SIM --- client/src/cmdhfmf.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index c9f473033..c158bde19 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3606,9 +3606,6 @@ void showSectorTable(sector_t *k_sector, uint8_t k_sectorsCount) { void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, bool setEmulatorMem, bool verbose) { - uint64_t key = 0; - bool success = false; - if (k_sector == NULL) { int32_t res = initSectorTable(&k_sector, k_sectorsCount); if (res != k_sectorsCount) { @@ -3617,8 +3614,8 @@ void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, boo } } - success = mfkey32_moebius(&data, &key); - if (success) { + uint64_t key = 0; + if (mfkey32_moebius(&data, &key)) { uint8_t sector = data.sector; uint8_t keytype = data.keytype; @@ -3633,7 +3630,7 @@ void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, boo //set emulator memory for keys if (setEmulatorMem) { - uint8_t memBlock[16] = {0, 0, 0, 0, 0, 0, 0xff, 0x0F, 0x80, 0x69, 0, 0, 0, 0, 0, 0}; + uint8_t memBlock[16] = {0, 0, 0, 0, 0, 0, 0xFF, 0x07, 0x80, 0x69, 0, 0, 0, 0, 0, 0}; num_to_bytes(k_sector[sector].Key[0], 6, memBlock); num_to_bytes(k_sector[sector].Key[1], 6, memBlock + 10); //iceman, guessing this will not work so well for 4K tags. From 02248162086171be16f802837050f84f7d506883 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 6 May 2023 14:31:19 +0200 Subject: [PATCH 430/924] refactoring the return value of function --- client/src/cmdhfmf.c | 37 ++++++++++++++----------------------- client/src/cmdhfmf.h | 4 ++-- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index c158bde19..b71a5ffc1 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -134,12 +134,12 @@ static char *GenerateFilename(const char *prefix, const char *suffix) { return fptr; } -static int32_t initSectorTable(sector_t **src, int32_t items) { +static int initSectorTable(sector_t **src, size_t items) { (*src) = calloc(items, sizeof(sector_t)); if (*src == NULL) - return -1; + return PM3_EMALLOC; // empty e_sector for (int i = 0; i < items; ++i) { @@ -148,7 +148,7 @@ static int32_t initSectorTable(sector_t **src, int32_t items) { (*src)[i].foundKey[j] = false; } } - return items; + return PM3_SUCCESS; } static void decode_print_st(uint16_t blockno, uint8_t *data) { @@ -2390,7 +2390,6 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { iso14a_card_select_t card; memcpy(&card, (iso14a_card_select_t *)resp.data.asBytes, sizeof(iso14a_card_select_t)); - // detect MFC EV1 Signature bool is_ev1 = detect_mfc_ev1_signature(); if (is_ev1) { @@ -2400,9 +2399,7 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { // create/initialize key storage structure uint32_t e_sector_size = sector_cnt > sectorno ? sector_cnt : sectorno + 1; - res = initSectorTable(&e_sector, e_sector_size); - if (res != e_sector_size) { - free(e_sector); + if (initSectorTable(&e_sector, e_sector_size) != PM3_SUCCESS) { return PM3_EMALLOC; } @@ -3195,8 +3192,7 @@ static int CmdHF14AMfChk_fast(const char *Cmd) { // create/initialize key storage structure sector_t *e_sector = NULL; - int32_t res = initSectorTable(&e_sector, sectorsCnt); - if (res != sectorsCnt) { + if (initSectorTable(&e_sector, sectorsCnt) != PM3_SUCCESS) { free(keyBlock); return PM3_EMALLOC; } @@ -3231,7 +3227,7 @@ static int CmdHF14AMfChk_fast(const char *Cmd) { if (size == keycnt - i) lastChunk = true; - res = mfCheckKeys_fast(sectorsCnt, firstChunk, lastChunk, strategy, size, keyBlock + (i * 6), e_sector, false); + int res = mfCheckKeys_fast(sectorsCnt, firstChunk, lastChunk, strategy, size, keyBlock + (i * 6), e_sector, false); if (firstChunk) firstChunk = false; @@ -3438,8 +3434,7 @@ static int CmdHF14AMfChk(const char *Cmd) { // create/initialize key storage structure sector_t *e_sector = NULL; - int32_t res = initSectorTable(&e_sector, SectorsCnt); - if (res != SectorsCnt) { + if (initSectorTable(&e_sector, SectorsCnt) != PM3_SUCCESS) { free(keyBlock); return PM3_EMALLOC; } @@ -3597,19 +3592,18 @@ out: return PM3_SUCCESS; } -void showSectorTable(sector_t *k_sector, uint8_t k_sectorsCount) { +void showSectorTable(sector_t *k_sector, uint8_t k_sectors_cnt) { if (k_sector != NULL) { - printKeyTable(k_sectorsCount, k_sector); + printKeyTable(k_sectors_cnt, k_sector); free(k_sector); } } -void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, bool setEmulatorMem, bool verbose) { +void readerAttack(sector_t *k_sector, uint8_t k_sectors_cnt, nonces_t data, bool setEmulatorMem, bool verbose) { + // init if needed if (k_sector == NULL) { - int32_t res = initSectorTable(&k_sector, k_sectorsCount); - if (res != k_sectorsCount) { - free(k_sector); + if (initSectorTable(&k_sector, k_sectors_cnt) != PM3_SUCCESS) { return; } } @@ -4566,12 +4560,9 @@ static int CmdHF14AMfEKeyPrn(const char *Cmd) { return PM3_EINVARG; } - sector_t *e_sector = NULL; - // create/initialize key storage structure - int32_t res = initSectorTable(&e_sector, sectors_cnt); - if (res != sectors_cnt) { - free(e_sector); + sector_t *e_sector = NULL; + if (initSectorTable(&e_sector, sectors_cnt) != PM3_SUCCESS) { return PM3_EMALLOC; } diff --git a/client/src/cmdhfmf.h b/client/src/cmdhfmf.h index 94610421b..62b95de4c 100644 --- a/client/src/cmdhfmf.h +++ b/client/src/cmdhfmf.h @@ -30,8 +30,8 @@ int CmdHFMFNDEFRead(const char *Cmd); // used by "nfc mf cread" int CmdHFMFNDEFFormat(const char *Cmd); // used by "nfc mf cformat" int CmdHFMFNDEFWrite(const char *Cmd); // used by "nfc mf cwrite" -void showSectorTable(sector_t *k_sector, uint8_t k_sectorsCount); -void readerAttack(sector_t *k_sector, uint8_t k_sectorsCount, nonces_t data, bool setEmulatorMem, bool verbose); +void showSectorTable(sector_t *k_sector, uint8_t k_sectors_cnt); +void readerAttack(sector_t *k_sector, uint8_t k_sectors_cnt, nonces_t data, bool setEmulatorMem, bool verbose); void printKeyTable(uint8_t sectorscnt, sector_t *e_sector); void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_sector); void printKeyTable_fast(uint8_t sectorscnt, icesector_t *e_sector, uint64_t bar, uint64_t foo); From d91b576034c8ce57eab940353d009099fd7234d7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 6 May 2023 14:37:47 +0200 Subject: [PATCH 431/924] style --- client/src/cmdhfmf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index b71a5ffc1..87c253525 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2355,7 +2355,6 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { // Attack key storage variables uint8_t *keyBlock = NULL; uint32_t key_cnt = 0; - sector_t *e_sector; uint8_t tmp_key[6] = {0}; // Nested and Hardnested returned status @@ -2398,8 +2397,9 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { } // create/initialize key storage structure - uint32_t e_sector_size = sector_cnt > sectorno ? sector_cnt : sectorno + 1; - if (initSectorTable(&e_sector, e_sector_size) != PM3_SUCCESS) { + sector_t *e_sector = NULL; + uint32_t e_sector_cnt = (sector_cnt > sectorno) ? sector_cnt : sectorno + 1; + if (initSectorTable(&e_sector, e_sector_cnt) != PM3_SUCCESS) { return PM3_EMALLOC; } From 149cc025ce3c941ca27a3530497ea3146b6d669b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 6 May 2023 14:38:14 +0200 Subject: [PATCH 432/924] style --- client/src/cmdnfc.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/src/cmdnfc.c b/client/src/cmdnfc.c index 221b33020..eadfa7161 100644 --- a/client/src/cmdnfc.c +++ b/client/src/cmdnfc.c @@ -118,8 +118,6 @@ static int CmdNfcDecode(const char *Cmd) { PrintAndLogEx(SUCCESS, "MFC dump file detected. Converting..."); uint8_t ndef[4096] = {0}; uint16_t ndeflen = 0; - // uint8_t skip = (4 * MFBLOCK_SIZE); - // convert_mfc_2_arr(dump + skip, bytes_read - skip, ndef, &ndeflen); if (convert_mad_to_arr(dump, bytes_read, ndef, &ndeflen) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Failed converting, aborting..."); From 85f1785ccb564154a587ccd5dd36a6182473606a Mon Sep 17 00:00:00 2001 From: phaseloop Date: Thu, 15 Dec 2022 20:51:54 +0000 Subject: [PATCH 433/924] initial bruteforce module --- armsrc/em4x50.c | 1 + client/src/cmdlfem4x50.c | 48 +++++++++---- common/bruteforce.c | 149 +++++++++++++++++++++++++++++++++++++++ common/bruteforce.h | 78 ++++++++++++++++++++ include/em4x50.h | 3 + 5 files changed, 267 insertions(+), 12 deletions(-) create mode 100644 common/bruteforce.c create mode 100644 common/bruteforce.h diff --git a/armsrc/em4x50.c b/armsrc/em4x50.c index 86d44cd9a..bc0c255fa 100644 --- a/armsrc/em4x50.c +++ b/armsrc/em4x50.c @@ -27,6 +27,7 @@ #include "BigBuf.h" #include "spiffs.h" #include "appmain.h" // tear +#include "bruteforce.h" // Sam7s has several timers, we will use the source TIMER_CLOCK1 (aka AT91C_TC_CLKS_TIMER_DIV1_CLOCK) // TIMER_CLOCK1 = MCK/2, MCK is running at 48 MHz, Timer is running at 48/2 = 24 MHz diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index 3bed45d1d..a4083d3d0 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -349,26 +349,50 @@ int CmdEM4x50Brute(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf em 4x50 brute", "Tries to bruteforce the password of a EM4x50 card.\n" - "Function can be stopped by pressing pm3 button.", - "lf em 4x50 brute --first 12330000 --last 12340000 -> tries pwds from 0x12330000 to 0x1234000000\n" + "Function can be stopped by pressing pm3 button.\n", + + "lf em 4x50 brute --mode range --begin 12330000 --end 12340000 -> tries pwds from 0x12330000 to 0x12340000\n" + "lf em 4x50 brute --mode charset --digits --uppercase -> tries all combinations of ASCII codes for digits and uppercase letters\n" ); void *argtable[] = { arg_param_begin, - arg_str1(NULL, "first", "", "first password (start), 4 bytes, lsb"), - arg_str1(NULL, "last", "", "last password (stop), 4 bytes, lsb"), + arg_str1(NULL, "mode", "", "Bruteforce mode (range|charset)"), + arg_str0(NULL, "begin", "", "Range mode - start of the key range"), + arg_str0(NULL, "end", "", "Range mode - end of the key range"), + arg_lit0(NULL, "digits", "Charset mode - include ASCII codes for digits"), + arg_lit0(NULL, "uppercase", "Charset mode - include ASCII codes for uppercase letters"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); - int first_len = 0; - uint8_t first[4] = {0, 0, 0, 0}; - CLIGetHexWithReturn(ctx, 1, first, &first_len); - int last_len = 0; - uint8_t last[4] = {0, 0, 0, 0}; - CLIGetHexWithReturn(ctx, 2, last, &last_len); - CLIParserFree(ctx); + em4x50_data_t etd; + + int mode_len = 64; + char mode[64]; + CLIGetStrWithReturn(ctx, 1, (uint8_t*) mode, &mode_len); + PrintAndLogEx(INFO, "Chosen mode: %s", mode); + + if(strcmp(mode, "range") == 0){ + etd.bruteforce_mode = BRUTEFORCE_MODE_RANGE; + } else if(strcmp(mode, "charset") == 0){ + etd.bruteforce_mode = BRUTEFORCE_MODE_CHARSET; + } else { + PrintAndLogEx(FAILED, "unknown bruteforce mode: %s", mode); + return PM3_EINVARG; + } + + PrintAndLogEx(INFO, "Chosen mode2: %d", etd.bruteforce_mode); + + // int first_len = 0; + // uint8_t first[4] = {0, 0, 0, 0}; + // CLIGetHexWithReturn(ctx, 1, first, &first_len); + // int last_len = 0; + // uint8_t last[4] = {0, 0, 0, 0}; + // CLIGetHexWithReturn(ctx, 2, last, &last_len); + CLIParserFree(ctx); +/* if (first_len != 4) { PrintAndLogEx(FAILED, "password length must be 4 bytes"); return PM3_EINVARG; @@ -410,7 +434,7 @@ int CmdEM4x50Brute(const char *Cmd) { PrintAndLogEx(SUCCESS, "found valid password [ " _GREEN_("%08"PRIX32) " ]", resp.data.asDwords[0]); else PrintAndLogEx(WARNING, "brute pwd failed"); - +*/ return PM3_SUCCESS; } diff --git a/common/bruteforce.c b/common/bruteforce.c new file mode 100644 index 000000000..1d5535277 --- /dev/null +++ b/common/bruteforce.c @@ -0,0 +1,149 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- + +#include "bruteforce.h" +#include +#include + +uint8_t charset_digits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', +}; + +uint8_t charset_uppercase[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'W', + 'X', 'Y', 'Z' +}; + +void generator_init(generator_context_t* ctx, uint8_t mode){ + memset(ctx, 0, sizeof(generator_context_t)); + ctx->mode = mode; +} + +int generator_set_charset(generator_context_t* ctx, uint8_t charsets){ + if (ctx->mode != BRUTEFORCE_MODE_CHARSET){ + return -1; + } + + if(charsets & CHARSET_DIGITS){ + memcpy(ctx->charset, charset_digits, sizeof(charset_digits)); + ctx->charset_length += sizeof(charset_digits); + } + + if(charsets & CHARSET_UPPERCASE){ + memcpy(ctx->charset+ctx->charset_length, charset_uppercase, sizeof(charset_uppercase)); + ctx->charset_length += sizeof(charset_uppercase); + } +} + +int generate32(generator_context_t *ctx){ + + switch(ctx->mode){ + case BRUTEFORCE_MODE_RANGE: + return _generate_mode_range32(ctx); + case BRUTEFORCE_MODE_CHARSET: + return _generate_mode_charset32(ctx); + } +} + +int _generate_mode_range32(generator_context_t *ctx){ + + if(ctx->current_key32 >= ctx->range_high){ + return GENERATOR_END; + } + + // we use flag1 as indicator if value of range_low was already emitted + // so the range generated is + if(ctx->current_key32 <= ctx->range_low && ctx->flag1==false){ + ctx->current_key32 = ctx->range_low; + ctx->pos[0] = true; + return GENERATOR_NEXT; + } + + ctx->current_key32++; + return GENERATOR_NEXT; +} + +int _generate_mode_charset32(generator_context_t *ctx){ + + if(ctx->flag1) + return GENERATOR_END; + + char str[5]; + for (int i = 0; i < 5;i++) + str[i] = ctx->charset[ctx->pos[i]]; + str[4] = 0; + printf("%s\n", str); + + ctx->current_key32 = ctx->charset[ctx->pos[0]] << 24 | ctx->charset[ctx->pos[1]] << 16 | + ctx->charset[ctx->pos[2]] << 8 | ctx->charset[ctx->pos[3]]; + + + if(array_increment(ctx->pos, 4, ctx->charset_length) == -1) + // set flag1 to emit value last time and end generation + ctx->flag1 = true; + + return GENERATOR_NEXT; +} + +// increments values in array with carryover using modulo limit for each byte +// this is used to iterate each byte in key over charset table +// returns -1 if incrementing reaches its end +int array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo){ + + uint8_t prev_value; + + // check if we reached max value already + uint8_t i; + for (i = 0; i < data_len; i++) + if(data[i] < modulo - 1) + break; + + if(i == data_len) + return -1; + + for (uint8_t pos = data_len - 1;; pos--){ + prev_value = ++data[pos]; + data[pos] = data[pos] % modulo; + if (prev_value == data[pos]) + return 0; + else if (pos == 0){ + // we cannot carryover to next byte + // with the max value check in place before, we should not reach this place + return -1; + } + } + + return 0; +} + +/* +int main(){ + generator_context_t ctx; + generator_init(&ctx, BRUTEFORCE_MODE_CHARSET); + generator_set_charset(&ctx, CHARSET_DIGITS | CHARSET_UPPERCASE); + + int ret = 0; + while( (ret=generate32(&ctx)) == GENERATOR_NEXT){ + printf("%X\n", ctx.current_key32); + } + + // printf("Charset len: %d\n", ctx.charset_length); + // printf("Digits len: %d\n", sizeof(charset_digits)); + // printf("Uppercase len: %d\n", sizeof(charset_uppercase)); + return 1; +} +*/ \ No newline at end of file diff --git a/common/bruteforce.h b/common/bruteforce.h new file mode 100644 index 000000000..2b856dfa7 --- /dev/null +++ b/common/bruteforce.h @@ -0,0 +1,78 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// functions for bruteforcing card keys +//----------------------------------------------------------------------------- + +#ifndef __BRUTEFORCE_H +#define __BRUTEFORCE_H + +#include "common.h" + +typedef uint8_t bruteforce_mode_t; +// bruteforcing all keys sequentially between X and Y +#define BRUTEFORCE_MODE_RANGE 1 + +// try keys based on limited charset/passphrases +// some payment systems use user-provided passphrase as system key +#define BRUTEFORCE_MODE_CHARSET 2 + +// "smart" mode - try some predictable patterns +#define BRUTEFORCE_MODE_SMART 3 + + +typedef uint8_t bruteforce_charset_t; +#define CHARSET_DIGITS 1 +#define CHARSET_UPPERCASE 2 + +#define GENERATOR_END 0 +#define GENERATOR_NEXT 1 +#define GENERATOR_ERROR 2 + +#define CHARSET_DIGITS_SIZE 10 +#define CHARSET_UPPERCASE_SIZE 25 + +extern uint8_t charset_digits[]; +extern uint8_t charset_uppercase[]; + +// structure to hold key generator temporary data +typedef struct { + // position of each of 4 bytes in 32 bit key in charset mode + // add more bytes to support larger keys + // pos[0] is most significant byte - all maths avoid relying on little/big endian memory layout + uint8_t pos[4]; + uint32_t current_key32; + uint8_t mode; + uint8_t charset[ + CHARSET_DIGITS_SIZE + + CHARSET_UPPERCASE_SIZE + ]; + uint8_t charset_length; + + uint32_t range_low; + uint32_t range_high; + // flags to use internally by generators as they wish + bool flag1, flag2, flag3; + +} generator_context_t; + +void generator_init(generator_context_t *ctx, uint8_t mode); +int generator_set_charset(generator_context_t *ctx, uint8_t charsets); +int generate32(generator_context_t *ctx); +int _generate_mode_range32(generator_context_t *ctx); +int _generate_mode_charset32(generator_context_t *ctx); +int _generate_mode_smart32(generator_context_t *ctx); +int array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo); +#endif \ No newline at end of file diff --git a/include/em4x50.h b/include/em4x50.h index bed01901c..9bf1ffc24 100644 --- a/include/em4x50.h +++ b/include/em4x50.h @@ -20,6 +20,7 @@ #define EM4X50_H__ #include "common.h" +#include "bruteforce.h" #define EM4X50_NO_WORDS 34 @@ -62,6 +63,8 @@ typedef struct { uint32_t password2; uint32_t word; uint32_t addresses; + bruteforce_mode_t bruteforce_mode; + bruteforce_charset_t bruteforce_charset; } PACKED em4x50_data_t; typedef struct { From f09a8cfa281e49ab4e2e19c8ecc5d6ba095fb130 Mon Sep 17 00:00:00 2001 From: phaseloop Date: Fri, 5 May 2023 12:57:47 +0000 Subject: [PATCH 434/924] add bruteforce parameters to command line --- armsrc/em4x50.c | 2 +- client/src/cmdlfem4x50.c | 97 +++++++++++++++++++++++++++------------- common/bruteforce.h | 1 + 3 files changed, 69 insertions(+), 31 deletions(-) diff --git a/armsrc/em4x50.c b/armsrc/em4x50.c index bc0c255fa..ed1fdad0e 100644 --- a/armsrc/em4x50.c +++ b/armsrc/em4x50.c @@ -703,7 +703,7 @@ void em4x50_login(uint32_t *password, bool ledcontrol) { reply_ng(CMD_LF_EM4X50_LOGIN, status, NULL, 0); } -// envoke password search +// invoke password search void em4x50_brute(em4x50_data_t *etd, bool ledcontrol) { em4x50_setup_read(); diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index a4083d3d0..a67508848 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -19,6 +19,7 @@ #include "cliparser.h" #include "cmdlfem4x50.h" #include +#include #include "cmdparser.h" // command_t #include "util_posix.h" // msclock #include "fileutils.h" @@ -368,6 +369,7 @@ int CmdEM4x50Brute(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, true); em4x50_data_t etd; + bzero(&etd, sizeof(etd)); int mode_len = 64; char mode[64]; @@ -379,48 +381,83 @@ int CmdEM4x50Brute(const char *Cmd) { } else if(strcmp(mode, "charset") == 0){ etd.bruteforce_mode = BRUTEFORCE_MODE_CHARSET; } else { - PrintAndLogEx(FAILED, "unknown bruteforce mode: %s", mode); + PrintAndLogEx(FAILED, "Unknown bruteforce mode: %s", mode); return PM3_EINVARG; } - PrintAndLogEx(INFO, "Chosen mode2: %d", etd.bruteforce_mode); + if(etd.bruteforce_mode == BRUTEFORCE_MODE_RANGE){ + int begin_len = 0; + uint8_t begin[4] = {0x0}; + CLIGetHexWithReturn(ctx, 2, begin, &begin_len); + + int end_len = 0; + uint8_t end[4] = {0x0}; + CLIGetHexWithReturn(ctx, 3, end, &end_len); + + if(begin_len!=4){ + PrintAndLogEx(FAILED, "'begin' parameter must be 4 bytes"); + return PM3_EINVARG; + } + + if(end_len!=4){ + PrintAndLogEx(FAILED, "'end' parameter must be 4 bytes"); + return PM3_EINVARG; + } + + etd.password1 = BYTES2UINT32_BE(begin); + etd.password2 = BYTES2UINT32_BE(end); + } else if(etd.bruteforce_mode == BRUTEFORCE_MODE_CHARSET){ + bool enable_digits = arg_get_lit(ctx, 4); + bool enable_uppercase = arg_get_lit(ctx, 5); + + if(enable_digits) + etd.bruteforce_charset |= CHARSET_DIGITS; + if(enable_uppercase) + etd.bruteforce_charset |= CHARSET_UPPERCASE; + + if(etd.bruteforce_charset == 0){ + PrintAndLogEx(FAILED, "Please enable at least one charset when using charset bruteforce mode."); + return PM3_EINVARG; + } + + PrintAndLogEx(INFO, "Enabled charsets: %s%s", + enable_digits ? "digits " : "", + enable_uppercase ? "uppercase " : ""); + + } - // int first_len = 0; - // uint8_t first[4] = {0, 0, 0, 0}; - // CLIGetHexWithReturn(ctx, 1, first, &first_len); - // int last_len = 0; - // uint8_t last[4] = {0, 0, 0, 0}; - // CLIGetHexWithReturn(ctx, 2, last, &last_len); CLIParserFree(ctx); -/* - if (first_len != 4) { - PrintAndLogEx(FAILED, "password length must be 4 bytes"); - return PM3_EINVARG; - } - if (last_len != 4) { - PrintAndLogEx(FAILED, "password length must be 4 bytes"); - return PM3_EINVARG; - } - - em4x50_data_t etd; - etd.password1 = BYTES2UINT32_BE(first); - etd.password2 = BYTES2UINT32_BE(last); - + // 27 passwords/second (empirical value) const int speed = 27; + int no_iter = 0; + + if(etd.bruteforce_mode == BRUTEFORCE_MODE_RANGE){ + no_iter = etd.password2 - etd.password1 + 1; + PrintAndLogEx(INFO, "Trying " _YELLOW_("%i") " passwords in range [0x%08x, 0x%08x]" + , no_iter + , etd.password1 + , etd.password2 + ); + } else if(etd.bruteforce_mode == BRUTEFORCE_MODE_CHARSET){ + unsigned int digits = 0; + + if(etd.bruteforce_charset & CHARSET_DIGITS) + digits += CHARSET_DIGITS_SIZE; + + if(etd.bruteforce_charset & CHARSET_UPPERCASE) + digits += CHARSET_UPPERCASE_SIZE; + + no_iter = pow(digits, 4); + } // print some information - int no_iter = etd.password2 - etd.password1 + 1; int dur_s = no_iter / speed; int dur_h = dur_s / 3600; int dur_m = (dur_s - dur_h * 3600) / 60; dur_s -= dur_h * 3600 + dur_m * 60; - PrintAndLogEx(INFO, "Trying " _YELLOW_("%i") " passwords in range [0x%08x, 0x%08x]" - , no_iter - , etd.password1 - , etd.password2 - ); + PrintAndLogEx(INFO, "Estimated duration: %ih %im %is", dur_h, dur_m, dur_s); // start @@ -434,7 +471,7 @@ int CmdEM4x50Brute(const char *Cmd) { PrintAndLogEx(SUCCESS, "found valid password [ " _GREEN_("%08"PRIX32) " ]", resp.data.asDwords[0]); else PrintAndLogEx(WARNING, "brute pwd failed"); -*/ + return PM3_SUCCESS; } @@ -1214,7 +1251,7 @@ int CmdEM4x50Sim(const char *Cmd) { static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("operations") " ---------------------"}, - {"brute", CmdEM4x50Brute, IfPm3EM4x50, "Simple bruteforce attack to find password"}, + {"brute", CmdEM4x50Brute, IfPm3EM4x50, "Bruteforce attack to find password"}, {"chk", CmdEM4x50Chk, IfPm3EM4x50, "Check passwords from dictionary"}, {"dump", CmdEM4x50Dump, IfPm3EM4x50, "Dump EM4x50 tag"}, {"info", CmdEM4x50Info, IfPm3EM4x50, "Tag information"}, diff --git a/common/bruteforce.h b/common/bruteforce.h index 2b856dfa7..f01cfd3ca 100644 --- a/common/bruteforce.h +++ b/common/bruteforce.h @@ -34,6 +34,7 @@ typedef uint8_t bruteforce_mode_t; typedef uint8_t bruteforce_charset_t; +// bit flags - can be used together using logical OR #define CHARSET_DIGITS 1 #define CHARSET_UPPERCASE 2 From fa033a98b22f1d94ec208cc7e923356a8d7d0059 Mon Sep 17 00:00:00 2001 From: phaseloop Date: Sat, 6 May 2023 14:45:20 +0000 Subject: [PATCH 435/924] enable em4x50 bruteforce in proxmark firmware --- armsrc/Makefile | 2 ++ armsrc/em4x50.c | 17 +++++++++++++---- common/bruteforce.c | 28 +++++++++++++--------------- common/bruteforce.h | 22 +++++++++++----------- 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index c0703ccf4..4a088cbf6 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -46,6 +46,7 @@ SRC_CRC = crc.c crc16.c crc32.c SRC_ICLASS = iclass.c optimized_cipherutils.c optimized_ikeys.c optimized_elite.c optimized_cipher.c SRC_LEGIC = legicrf.c legicrfsim.c legic_prng.c SRC_NFCBARCODE = thinfilm.c +SRC_BRUTEFORCE = bruteforce.c # SRC_BEE = bee.c @@ -143,6 +144,7 @@ THUMBSRC = start.c \ $(SRC_FELICA) \ $(SRC_STANDALONE) \ $(SRC_ZX) \ + $(SRC_BRUTEFORCE) \ appmain.c \ printf.c \ dbprint.c \ diff --git a/armsrc/em4x50.c b/armsrc/em4x50.c index ed1fdad0e..5043d753b 100644 --- a/armsrc/em4x50.c +++ b/armsrc/em4x50.c @@ -633,12 +633,21 @@ static int login(uint32_t password) { return PM3_EFAILED; } -// searching for password in given range -static bool brute(uint32_t start, uint32_t stop, uint32_t *pwd) { +// searching for password using chosen bruteforce algorithm +static bool brute(em4x50_data_t *etd, uint32_t *pwd) { + + generator_context_t ctx; bool pwd_found = false; + int generator_ret = 0; int cnt = 0; - for (*pwd = start; *pwd <= stop; (*pwd)++) { + bf_generator_init(&ctx, etd->bruteforce_mode); + + if(etd->bruteforce_mode == BRUTEFORCE_MODE_CHARSET) + bf_generator_set_charset(&ctx, etd->bruteforce_charset); + + while ( (generator_ret=bf_generate32(&ctx)) == GENERATOR_NEXT) { + *pwd = ctx.current_key32; WDT_HIT(); @@ -715,7 +724,7 @@ void em4x50_brute(em4x50_data_t *etd, bool ledcontrol) { LED_C_OFF(); LED_D_ON(); } - bsuccess = brute(etd->password1, etd->password2, &pwd); + bsuccess = brute(etd, &pwd); } if (ledcontrol) LEDsoff(); diff --git a/common/bruteforce.c b/common/bruteforce.c index 1d5535277..62d411240 100644 --- a/common/bruteforce.c +++ b/common/bruteforce.c @@ -28,12 +28,12 @@ uint8_t charset_uppercase[] = { 'X', 'Y', 'Z' }; -void generator_init(generator_context_t* ctx, uint8_t mode){ +void bf_generator_init(generator_context_t* ctx, uint8_t mode){ memset(ctx, 0, sizeof(generator_context_t)); ctx->mode = mode; } -int generator_set_charset(generator_context_t* ctx, uint8_t charsets){ +int bf_generator_set_charset(generator_context_t* ctx, uint8_t charsets){ if (ctx->mode != BRUTEFORCE_MODE_CHARSET){ return -1; } @@ -47,19 +47,23 @@ int generator_set_charset(generator_context_t* ctx, uint8_t charsets){ memcpy(ctx->charset+ctx->charset_length, charset_uppercase, sizeof(charset_uppercase)); ctx->charset_length += sizeof(charset_uppercase); } + + return 0; } -int generate32(generator_context_t *ctx){ +int bf_generate32(generator_context_t *ctx){ switch(ctx->mode){ case BRUTEFORCE_MODE_RANGE: - return _generate_mode_range32(ctx); + return _bf_generate_mode_range32(ctx); case BRUTEFORCE_MODE_CHARSET: - return _generate_mode_charset32(ctx); + return _bf_generate_mode_charset32(ctx); } + + return GENERATOR_ERROR; } -int _generate_mode_range32(generator_context_t *ctx){ +int _bf_generate_mode_range32(generator_context_t *ctx){ if(ctx->current_key32 >= ctx->range_high){ return GENERATOR_END; @@ -77,22 +81,16 @@ int _generate_mode_range32(generator_context_t *ctx){ return GENERATOR_NEXT; } -int _generate_mode_charset32(generator_context_t *ctx){ +int _bf_generate_mode_charset32(generator_context_t *ctx){ if(ctx->flag1) return GENERATOR_END; - char str[5]; - for (int i = 0; i < 5;i++) - str[i] = ctx->charset[ctx->pos[i]]; - str[4] = 0; - printf("%s\n", str); - ctx->current_key32 = ctx->charset[ctx->pos[0]] << 24 | ctx->charset[ctx->pos[1]] << 16 | ctx->charset[ctx->pos[2]] << 8 | ctx->charset[ctx->pos[3]]; - if(array_increment(ctx->pos, 4, ctx->charset_length) == -1) + if(bf_array_increment(ctx->pos, 4, ctx->charset_length) == -1) // set flag1 to emit value last time and end generation ctx->flag1 = true; @@ -102,7 +100,7 @@ int _generate_mode_charset32(generator_context_t *ctx){ // increments values in array with carryover using modulo limit for each byte // this is used to iterate each byte in key over charset table // returns -1 if incrementing reaches its end -int array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo){ +int bf_array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo){ uint8_t prev_value; diff --git a/common/bruteforce.h b/common/bruteforce.h index f01cfd3ca..b8ed3d9ca 100644 --- a/common/bruteforce.h +++ b/common/bruteforce.h @@ -13,11 +13,11 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- -// functions for bruteforcing card keys +// functions for bruteforcing card keys - key generators //----------------------------------------------------------------------------- -#ifndef __BRUTEFORCE_H -#define __BRUTEFORCE_H +#ifndef BRUTEFORCE_H__ +#define BRUTEFORCE_H__ #include "common.h" @@ -69,11 +69,11 @@ typedef struct { } generator_context_t; -void generator_init(generator_context_t *ctx, uint8_t mode); -int generator_set_charset(generator_context_t *ctx, uint8_t charsets); -int generate32(generator_context_t *ctx); -int _generate_mode_range32(generator_context_t *ctx); -int _generate_mode_charset32(generator_context_t *ctx); -int _generate_mode_smart32(generator_context_t *ctx); -int array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo); -#endif \ No newline at end of file +void bf_generator_init(generator_context_t *ctx, uint8_t mode); +int bf_generator_set_charset(generator_context_t *ctx, uint8_t charsets); +int bf_generate32(generator_context_t *ctx); +int _bf_generate_mode_range32(generator_context_t *ctx); +int _bf_generate_mode_charset32(generator_context_t *ctx); +int _bf_generate_mode_smart32(generator_context_t *ctx); +int bf_array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo); +#endif // BRUTEFORCE_H__ \ No newline at end of file From 19d7851c732781215ec163fca123410442c5ab6f Mon Sep 17 00:00:00 2001 From: PhaseLoop Date: Mon, 8 May 2023 17:08:24 +0000 Subject: [PATCH 436/924] run "make style" --- armsrc/em4x50.c | 4 +- client/src/cmdlfem4x50.c | 48 +++++++-------- client/src/pm3line_vocabulory.h | 1 + common/bruteforce.c | 54 ++++++++--------- common/bruteforce.h | 10 ++-- doc/commands.json | 100 ++++++++++++++++++++------------ doc/commands.md | 5 +- 7 files changed, 124 insertions(+), 98 deletions(-) diff --git a/armsrc/em4x50.c b/armsrc/em4x50.c index 5043d753b..d43a6a15f 100644 --- a/armsrc/em4x50.c +++ b/armsrc/em4x50.c @@ -643,10 +643,10 @@ static bool brute(em4x50_data_t *etd, uint32_t *pwd) { bf_generator_init(&ctx, etd->bruteforce_mode); - if(etd->bruteforce_mode == BRUTEFORCE_MODE_CHARSET) + if (etd->bruteforce_mode == BRUTEFORCE_MODE_CHARSET) bf_generator_set_charset(&ctx, etd->bruteforce_charset); - while ( (generator_ret=bf_generate32(&ctx)) == GENERATOR_NEXT) { + while ((generator_ret = bf_generate32(&ctx)) == GENERATOR_NEXT) { *pwd = ctx.current_key32; WDT_HIT(); diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index a67508848..aeffb9c18 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -373,19 +373,19 @@ int CmdEM4x50Brute(const char *Cmd) { int mode_len = 64; char mode[64]; - CLIGetStrWithReturn(ctx, 1, (uint8_t*) mode, &mode_len); + CLIGetStrWithReturn(ctx, 1, (uint8_t *) mode, &mode_len); PrintAndLogEx(INFO, "Chosen mode: %s", mode); - if(strcmp(mode, "range") == 0){ + if (strcmp(mode, "range") == 0) { etd.bruteforce_mode = BRUTEFORCE_MODE_RANGE; - } else if(strcmp(mode, "charset") == 0){ + } else if (strcmp(mode, "charset") == 0) { etd.bruteforce_mode = BRUTEFORCE_MODE_CHARSET; } else { PrintAndLogEx(FAILED, "Unknown bruteforce mode: %s", mode); return PM3_EINVARG; } - if(etd.bruteforce_mode == BRUTEFORCE_MODE_RANGE){ + if (etd.bruteforce_mode == BRUTEFORCE_MODE_RANGE) { int begin_len = 0; uint8_t begin[4] = {0x0}; CLIGetHexWithReturn(ctx, 2, begin, &begin_len); @@ -394,58 +394,58 @@ int CmdEM4x50Brute(const char *Cmd) { uint8_t end[4] = {0x0}; CLIGetHexWithReturn(ctx, 3, end, &end_len); - if(begin_len!=4){ + if (begin_len != 4) { PrintAndLogEx(FAILED, "'begin' parameter must be 4 bytes"); return PM3_EINVARG; } - if(end_len!=4){ + if (end_len != 4) { PrintAndLogEx(FAILED, "'end' parameter must be 4 bytes"); return PM3_EINVARG; } etd.password1 = BYTES2UINT32_BE(begin); etd.password2 = BYTES2UINT32_BE(end); - } else if(etd.bruteforce_mode == BRUTEFORCE_MODE_CHARSET){ + } else if (etd.bruteforce_mode == BRUTEFORCE_MODE_CHARSET) { bool enable_digits = arg_get_lit(ctx, 4); bool enable_uppercase = arg_get_lit(ctx, 5); - if(enable_digits) + if (enable_digits) etd.bruteforce_charset |= CHARSET_DIGITS; - if(enable_uppercase) + if (enable_uppercase) etd.bruteforce_charset |= CHARSET_UPPERCASE; - - if(etd.bruteforce_charset == 0){ + + if (etd.bruteforce_charset == 0) { PrintAndLogEx(FAILED, "Please enable at least one charset when using charset bruteforce mode."); return PM3_EINVARG; } - PrintAndLogEx(INFO, "Enabled charsets: %s%s", - enable_digits ? "digits " : "", - enable_uppercase ? "uppercase " : ""); + PrintAndLogEx(INFO, "Enabled charsets: %s%s", + enable_digits ? "digits " : "", + enable_uppercase ? "uppercase " : ""); } CLIParserFree(ctx); - + // 27 passwords/second (empirical value) const int speed = 27; int no_iter = 0; - if(etd.bruteforce_mode == BRUTEFORCE_MODE_RANGE){ + if (etd.bruteforce_mode == BRUTEFORCE_MODE_RANGE) { no_iter = etd.password2 - etd.password1 + 1; PrintAndLogEx(INFO, "Trying " _YELLOW_("%i") " passwords in range [0x%08x, 0x%08x]" - , no_iter - , etd.password1 - , etd.password2 - ); - } else if(etd.bruteforce_mode == BRUTEFORCE_MODE_CHARSET){ + , no_iter + , etd.password1 + , etd.password2 + ); + } else if (etd.bruteforce_mode == BRUTEFORCE_MODE_CHARSET) { unsigned int digits = 0; - if(etd.bruteforce_charset & CHARSET_DIGITS) + if (etd.bruteforce_charset & CHARSET_DIGITS) digits += CHARSET_DIGITS_SIZE; - if(etd.bruteforce_charset & CHARSET_UPPERCASE) + if (etd.bruteforce_charset & CHARSET_UPPERCASE) digits += CHARSET_UPPERCASE_SIZE; no_iter = pow(digits, 4); @@ -457,7 +457,7 @@ int CmdEM4x50Brute(const char *Cmd) { int dur_m = (dur_s - dur_h * 3600) / 60; dur_s -= dur_h * 3600 + dur_m * 60; - + PrintAndLogEx(INFO, "Estimated duration: %ih %im %is", dur_h, dur_m, dur_s); // start diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 6b15007c3..f70717c8f 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -349,6 +349,7 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mf gen3freeze" }, { 0, "hf mf ggetblk" }, { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, { 0, "hf mf gsetblk" }, { 0, "hf mf gview" }, { 0, "hf mf ndefformat" }, diff --git a/common/bruteforce.c b/common/bruteforce.c index 62d411240..d4855aefa 100644 --- a/common/bruteforce.c +++ b/common/bruteforce.c @@ -28,50 +28,50 @@ uint8_t charset_uppercase[] = { 'X', 'Y', 'Z' }; -void bf_generator_init(generator_context_t* ctx, uint8_t mode){ +void bf_generator_init(generator_context_t *ctx, uint8_t mode) { memset(ctx, 0, sizeof(generator_context_t)); ctx->mode = mode; } -int bf_generator_set_charset(generator_context_t* ctx, uint8_t charsets){ - if (ctx->mode != BRUTEFORCE_MODE_CHARSET){ +int bf_generator_set_charset(generator_context_t *ctx, uint8_t charsets) { + if (ctx->mode != BRUTEFORCE_MODE_CHARSET) { return -1; } - if(charsets & CHARSET_DIGITS){ + if (charsets & CHARSET_DIGITS) { memcpy(ctx->charset, charset_digits, sizeof(charset_digits)); ctx->charset_length += sizeof(charset_digits); } - if(charsets & CHARSET_UPPERCASE){ - memcpy(ctx->charset+ctx->charset_length, charset_uppercase, sizeof(charset_uppercase)); + if (charsets & CHARSET_UPPERCASE) { + memcpy(ctx->charset + ctx->charset_length, charset_uppercase, sizeof(charset_uppercase)); ctx->charset_length += sizeof(charset_uppercase); } return 0; } -int bf_generate32(generator_context_t *ctx){ +int bf_generate32(generator_context_t *ctx) { - switch(ctx->mode){ + switch (ctx->mode) { case BRUTEFORCE_MODE_RANGE: return _bf_generate_mode_range32(ctx); case BRUTEFORCE_MODE_CHARSET: return _bf_generate_mode_charset32(ctx); - } + } - return GENERATOR_ERROR; + return GENERATOR_ERROR; } -int _bf_generate_mode_range32(generator_context_t *ctx){ - - if(ctx->current_key32 >= ctx->range_high){ +int _bf_generate_mode_range32(generator_context_t *ctx) { + + if (ctx->current_key32 >= ctx->range_high) { return GENERATOR_END; } // we use flag1 as indicator if value of range_low was already emitted // so the range generated is - if(ctx->current_key32 <= ctx->range_low && ctx->flag1==false){ + if (ctx->current_key32 <= ctx->range_low && ctx->flag1 == false) { ctx->current_key32 = ctx->range_low; ctx->pos[0] = true; return GENERATOR_NEXT; @@ -81,44 +81,44 @@ int _bf_generate_mode_range32(generator_context_t *ctx){ return GENERATOR_NEXT; } -int _bf_generate_mode_charset32(generator_context_t *ctx){ +int _bf_generate_mode_charset32(generator_context_t *ctx) { - if(ctx->flag1) + if (ctx->flag1) return GENERATOR_END; ctx->current_key32 = ctx->charset[ctx->pos[0]] << 24 | ctx->charset[ctx->pos[1]] << 16 | ctx->charset[ctx->pos[2]] << 8 | ctx->charset[ctx->pos[3]]; - - if(bf_array_increment(ctx->pos, 4, ctx->charset_length) == -1) + + if (bf_array_increment(ctx->pos, 4, ctx->charset_length) == -1) // set flag1 to emit value last time and end generation ctx->flag1 = true; - + return GENERATOR_NEXT; } // increments values in array with carryover using modulo limit for each byte // this is used to iterate each byte in key over charset table // returns -1 if incrementing reaches its end -int bf_array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo){ - +int bf_array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo) { + uint8_t prev_value; // check if we reached max value already uint8_t i; for (i = 0; i < data_len; i++) - if(data[i] < modulo - 1) + if (data[i] < modulo - 1) break; - if(i == data_len) - return -1; + if (i == data_len) + return -1; - for (uint8_t pos = data_len - 1;; pos--){ + for (uint8_t pos = data_len - 1;; pos--) { prev_value = ++data[pos]; data[pos] = data[pos] % modulo; if (prev_value == data[pos]) return 0; - else if (pos == 0){ + else if (pos == 0) { // we cannot carryover to next byte // with the max value check in place before, we should not reach this place return -1; @@ -144,4 +144,4 @@ int main(){ // printf("Uppercase len: %d\n", sizeof(charset_uppercase)); return 1; } -*/ \ No newline at end of file +*/ diff --git a/common/bruteforce.h b/common/bruteforce.h index b8ed3d9ca..91e01172d 100644 --- a/common/bruteforce.h +++ b/common/bruteforce.h @@ -25,11 +25,11 @@ typedef uint8_t bruteforce_mode_t; // bruteforcing all keys sequentially between X and Y #define BRUTEFORCE_MODE_RANGE 1 -// try keys based on limited charset/passphrases +// try keys based on limited charset/passphrases // some payment systems use user-provided passphrase as system key #define BRUTEFORCE_MODE_CHARSET 2 -// "smart" mode - try some predictable patterns +// "smart" mode - try some predictable patterns #define BRUTEFORCE_MODE_SMART 3 @@ -57,8 +57,8 @@ typedef struct { uint32_t current_key32; uint8_t mode; uint8_t charset[ - CHARSET_DIGITS_SIZE - + CHARSET_UPPERCASE_SIZE + CHARSET_DIGITS_SIZE + + CHARSET_UPPERCASE_SIZE ]; uint8_t charset_length; @@ -76,4 +76,4 @@ int _bf_generate_mode_range32(generator_context_t *ctx); int _bf_generate_mode_charset32(generator_context_t *ctx); int _bf_generate_mode_smart32(generator_context_t *ctx); int bf_array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo); -#endif // BRUTEFORCE_H__ \ No newline at end of file +#endif // BRUTEFORCE_H__ diff --git a/doc/commands.json b/doc/commands.json index a94e5bc6a..633dd198e 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3391,6 +3391,20 @@ ], "usage": "hf jooki sim [-h] [-b ]" }, + "hf ksx6924 balance": { + "command": "hf ksx6924 balance", + "description": "Gets the current purse balance", + "notes": [ + "hf ksx6924 balance" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-k, --keep keep field ON for next command", + "-a, --apdu Show APDU requests and responses" + ], + "usage": "hf ksx6924 balance [-hka]" + }, "hf ksx6924 help": { "command": "hf ksx6924 help", "description": "help This help", @@ -3399,19 +3413,6 @@ "options": [], "usage": "" }, - "hf ksx6924 select": { - "command": "hf ksx6924 select", - "description": "Selects KS X 6924 application, and leaves field up", - "notes": [ - "hf ksx6924 select" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-a, --apdu Show APDU requests and responses" - ], - "usage": "hf ksx6924 select [-ha]" - }, "hf ksx6924 info": { "command": "hf ksx6924 info", "description": "Get info about a KS X 6924 transit card. This application is used by T-Money (South Korea) and Snapper+ (Wellington, New Zealand).", @@ -3426,23 +3427,9 @@ ], "usage": "hf ksx6924 info [-hka]" }, - "hf ksx6924 balance": { - "command": "hf ksx6924 balance", - "description": "Gets the current purse balance", - "notes": [ - "hf ksx6924 balance" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-k, --keep keep field ON for next command", - "-a, --apdu Show APDU requests and responses" - ], - "usage": "hf ksx6924 balance [-hka]" - }, "hf ksx6924 init": { "command": "hf ksx6924 init", - "description": "Perform transaction initialization (mpda)", + "description": "Perform transaction initialization with Mpda (Money of Purchase Transaction)", "notes": [ "hf ksx6924 init 000003e8 -> Mpda" ], @@ -3468,7 +3455,19 @@ ], "usage": "hf ksx6924 prec [-hka] " }, - + "hf ksx6924 select": { + "command": "hf ksx6924 select", + "description": "Selects KS X 6924 application, and leaves field up", + "notes": [ + "hf ksx6924 select" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-a, --apdu Show APDU requests and responses" + ], + "usage": "hf ksx6924 select [-ha]" + }, "hf legic crc": { "command": "hf legic crc", "description": "Calculates the legic crc8/crc16 on the given data", @@ -3971,7 +3970,7 @@ "--1k MIFARE Classic 1k / S50 (def)", "--2k MIFARE Classic/Plus 2k", "--4k MIFARE Classic 4k / S70", - "--emu from emulator memory" + "--emu to emulator memory" ], "usage": "hf mf csave [-h] [-f ] [--mini] [--1k] [--2k] [--4k] [--emu]" }, @@ -4348,6 +4347,27 @@ ], "usage": "hf mf gload [-hv] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu] [--start ] [--end ]" }, + "hf mf gsave": { + "command": "hf mf gsave", + "description": "Save `magic gen4 gtu` card memory into three files (BIN/EML/JSON)or into emulator memory", + "notes": [ + "hf mf gsave", + "hf mf gsave --4k", + "hf mf gsave -p DEADBEEF -f hf-mf-01020304.json" + ], + "offline": false, + "options": [ + "-h, --help This help", + "--mini MIFARE Classic Mini / S20", + "--1k MIFARE Classic 1k / S50 (def)", + "--2k MIFARE Classic/Plus 2k", + "--4k MIFARE Classic 4k / S70", + "-p, --pwd password 4bytes", + "-f, --file filename of dump", + "--emu to emulator memory" + ], + "usage": "hf mf gsave [-h] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu]" + }, "hf mf gsetblk": { "command": "hf mf gsetblk", "description": "Set block data on a magic gen4 GTU card", @@ -6176,7 +6196,7 @@ }, "hf mfu esave": { "command": "hf mfu esave", - "description": "Saves emulator memory to a MIFARE Ultralight/NTAG dump file (bin/eml/json) By default number of pages saved depends on defined tag type. You can overrife this with option --end.", + "description": "Saves emulator memory to a MIFARE Ultralight/NTAG dump file (bin/eml/json) By default number of pages saved depends on defined tag type. You can override this with option --end.", "notes": [ "hf mfu esave", "hf mfu esave --end 255 -> saves whole memory", @@ -6192,7 +6212,7 @@ }, "hf mfu eview": { "command": "hf mfu eview", - "description": "Displays emulator memory By default number of pages shown depends on defined tag type. You can overrife this with option --end.", + "description": "Displays emulator memory By default number of pages shown depends on defined tag type. You can override this with option --end.", "notes": [ "hf mfu eview", "hf mfu eview --end 255 -> dumps whole memory" @@ -7799,15 +7819,19 @@ "command": "lf em 4x50 brute", "description": "Tries to bruteforce the password of a EM4x50 card. Function can be stopped by pressing pm3 button.", "notes": [ - "lf em 4x50 brute --first 12330000 --last 12340000 -> tries pwds from 0x12330000 to 0x1234000000" + "lf em 4x50 brute --mode range --begin 12330000 --end 12340000 -> tries pwds from 0x12330000 to 0x12340000", + "lf em 4x50 brute --mode charset --digits --uppercase -> tries all combinations of ASCII codes for digits and uppercase letters" ], "offline": false, "options": [ "-h, --help This help", - "--first first password (start), 4 bytes, lsb", - "--last last password (stop), 4 bytes, lsb" + "--mode Bruteforce mode (range|charset)", + "--begin Range mode - start of the key range", + "--end Range mode - end of the key range", + "--digits Charset mode - include ASCII codes for digits", + "--uppercase Charset mode - include ASCII codes for uppercase letters" ], - "usage": "lf em 4x50 brute [-h] --first --last " + "usage": "lf em 4x50 brute [-h] --mode [--begin ] [--end ] [--digits] [--uppercase]" }, "lf em 4x50 chk": { "command": "lf em 4x50 chk", @@ -11616,8 +11640,8 @@ } }, "metadata": { - "commands_extracted": 732, + "commands_extracted": 733, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2022-11-20T20:19:15" + "extracted_on": "2023-05-08T17:05:11" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 4b91901f4..2cd9fe2b3 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -370,7 +370,7 @@ Check column "offline" for their availability. |`hf ksx6924 select `|N |`Select application, and leave field up` |`hf ksx6924 info `|N |`Get info about a KS X 6924 (T-Money, Snapper+) transit card` |`hf ksx6924 balance `|N |`Get current purse balance` -|`hf ksx6924 init `|N |`Perform transaction initialization with Mpda (Money of Purchase Transaction)` +|`hf ksx6924 init `|N |`Perform transaction initialization with Mpda` |`hf ksx6924 prec `|N |`Send proprietary get record command (CLA=90, INS=4C)` @@ -512,6 +512,7 @@ Check column "offline" for their availability. |`hf mf gen3freeze `|N |`Perma lock UID changes. irreversible` |`hf mf ggetblk `|N |`Read block from card` |`hf mf gload `|N |`Load dump to card` +|`hf mf gsave `|N |`Save dump from card into file or emulator` |`hf mf gsetblk `|N |`Write block to card` |`hf mf gview `|N |`View card` |`hf mf ndefformat `|N |`Format MIFARE Classic Tag as NFC Tag` @@ -851,7 +852,7 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`lf em 4x50 help `|Y |`This help` -|`lf em 4x50 brute `|N |`Simple bruteforce attack to find password` +|`lf em 4x50 brute `|N |`Bruteforce attack to find password` |`lf em 4x50 chk `|N |`Check passwords from dictionary` |`lf em 4x50 dump `|N |`Dump EM4x50 tag` |`lf em 4x50 info `|N |`Tag information` From d74b625b8b8d92b4db9913ee12f0e01098e126ea Mon Sep 17 00:00:00 2001 From: PhaseLoop Date: Mon, 8 May 2023 17:20:35 +0000 Subject: [PATCH 437/924] place bruteforce lib with em4x50 in Makefile --- armsrc/Makefile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index 4a088cbf6..32bfef50c 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -46,7 +46,6 @@ SRC_CRC = crc.c crc16.c crc32.c SRC_ICLASS = iclass.c optimized_cipherutils.c optimized_ikeys.c optimized_elite.c optimized_cipher.c SRC_LEGIC = legicrf.c legicrfsim.c legic_prng.c SRC_NFCBARCODE = thinfilm.c -SRC_BRUTEFORCE = bruteforce.c # SRC_BEE = bee.c @@ -78,7 +77,7 @@ else endif ifneq (,$(findstring WITH_EM4x50,$(APP_CFLAGS))) - SRC_EM4x50 = em4x50.c + SRC_EM4x50 = em4x50.c bruteforce.c else SRC_EM4x50 = endif @@ -144,7 +143,6 @@ THUMBSRC = start.c \ $(SRC_FELICA) \ $(SRC_STANDALONE) \ $(SRC_ZX) \ - $(SRC_BRUTEFORCE) \ appmain.c \ printf.c \ dbprint.c \ From 1fd331ea7ff09a07237ab79caade894cbe111417 Mon Sep 17 00:00:00 2001 From: PhaseLoop Date: Mon, 8 May 2023 17:57:14 +0000 Subject: [PATCH 438/924] remove dead code --- common/bruteforce.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/common/bruteforce.c b/common/bruteforce.c index d4855aefa..891796690 100644 --- a/common/bruteforce.c +++ b/common/bruteforce.c @@ -127,21 +127,3 @@ int bf_array_increment(uint8_t *data, uint8_t data_len, uint8_t modulo) { return 0; } - -/* -int main(){ - generator_context_t ctx; - generator_init(&ctx, BRUTEFORCE_MODE_CHARSET); - generator_set_charset(&ctx, CHARSET_DIGITS | CHARSET_UPPERCASE); - - int ret = 0; - while( (ret=generate32(&ctx)) == GENERATOR_NEXT){ - printf("%X\n", ctx.current_key32); - } - - // printf("Charset len: %d\n", ctx.charset_length); - // printf("Digits len: %d\n", sizeof(charset_digits)); - // printf("Uppercase len: %d\n", sizeof(charset_uppercase)); - return 1; -} -*/ From b52dfa381bc279e73bc91381a5324c302dafa56e Mon Sep 17 00:00:00 2001 From: Christian Herrmann Date: Mon, 8 May 2023 20:03:31 +0200 Subject: [PATCH 439/924] fix output when printing 0,1 numbers like in nested, view commands. Bonus, added NDEF key detection to give hint --- client/src/cmdhfmf.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 87c253525..559057459 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3882,6 +3882,8 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto PrintAndLogEx(SUCCESS, " Sec | Blk | key A |res| key B |res"); PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); + uint64_t ndef_key = 0xD3F7D3F7D3F7; + bool has_ndef_key = false; bool extended_legend = false; for (uint8_t i = 0; i < sectorscnt; i++) { @@ -3889,20 +3891,32 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto extended_legend = true; } + if (e_sector[i].Key[0] == ndef_key || e_sector[i].Key[1] == ndef_key) { + has_ndef_key = true; + } + if (e_sector[i].foundKey[0]) { snprintf(strA, sizeof(strA), _GREEN_("%012" PRIX64), e_sector[i].Key[0]); - snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[0]); + if (extended_legend) { + snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[0]); + } else { + snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%d"), e_sector[i].foundKey[0]); + } } else { snprintf(strA, sizeof(strA), _RED_("%s"), "------------"); - snprintf(resA, sizeof(resA), _RED_("%d"), 0); + snprintf(resA, sizeof(resA), _RED_("0")); } if (e_sector[i].foundKey[1]) { snprintf(strB, sizeof(strB), _GREEN_("%012" PRIX64), e_sector[i].Key[1]); - snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[1]); + if (extended_legend) { + snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[1]); + } else { + snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%d"), e_sector[i].foundKey[1]); + } } else { snprintf(strB, sizeof(strB), _RED_("%s"), "------------"); - snprintf(resB, sizeof(resB), _RED_("%d"), 0); + snprintf(resB, sizeof(resB), _RED_("0")); } // keep track if we use start_sector or i @@ -3939,9 +3953,13 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto } // MAD detection - if (e_sector[MF_MAD1_SECTOR].foundKey[0] && e_sector[MF_MAD1_SECTOR].Key[MF_KEY_A] == 0xA0A1A2A3A4A5) { + if (e_sector[MF_MAD1_SECTOR].foundKey[0] && e_sector[MF_MAD1_SECTOR].Key[0] == 0xA0A1A2A3A4A5) { PrintAndLogEx(HINT, "MAD key detected. Try " _YELLOW_("`hf mf mad`") " for more details"); } + // NDEF detection + if (has_ndef_key) { + PrintAndLogEx(HINT, "NDEF key detected. Try " _YELLOW_("`hf mf ndefread`") " for more details"); + } PrintAndLogEx(NORMAL, ""); } From fcc922259fb2bd5628d1337990eea20ddea9a3ff Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 8 May 2023 20:03:31 +0200 Subject: [PATCH 440/924] fix output when printing 0,1 numbers like in nested, view commands. Bonus, added NDEF key detection to give hint --- client/src/cmdhfmf.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 87c253525..559057459 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3882,6 +3882,8 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto PrintAndLogEx(SUCCESS, " Sec | Blk | key A |res| key B |res"); PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); + uint64_t ndef_key = 0xD3F7D3F7D3F7; + bool has_ndef_key = false; bool extended_legend = false; for (uint8_t i = 0; i < sectorscnt; i++) { @@ -3889,20 +3891,32 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto extended_legend = true; } + if (e_sector[i].Key[0] == ndef_key || e_sector[i].Key[1] == ndef_key) { + has_ndef_key = true; + } + if (e_sector[i].foundKey[0]) { snprintf(strA, sizeof(strA), _GREEN_("%012" PRIX64), e_sector[i].Key[0]); - snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[0]); + if (extended_legend) { + snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[0]); + } else { + snprintf(resA, sizeof(resA), _BRIGHT_GREEN_("%d"), e_sector[i].foundKey[0]); + } } else { snprintf(strA, sizeof(strA), _RED_("%s"), "------------"); - snprintf(resA, sizeof(resA), _RED_("%d"), 0); + snprintf(resA, sizeof(resA), _RED_("0")); } if (e_sector[i].foundKey[1]) { snprintf(strB, sizeof(strB), _GREEN_("%012" PRIX64), e_sector[i].Key[1]); - snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[1]); + if (extended_legend) { + snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%c"), e_sector[i].foundKey[1]); + } else { + snprintf(resB, sizeof(resB), _BRIGHT_GREEN_("%d"), e_sector[i].foundKey[1]); + } } else { snprintf(strB, sizeof(strB), _RED_("%s"), "------------"); - snprintf(resB, sizeof(resB), _RED_("%d"), 0); + snprintf(resB, sizeof(resB), _RED_("0")); } // keep track if we use start_sector or i @@ -3939,9 +3953,13 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto } // MAD detection - if (e_sector[MF_MAD1_SECTOR].foundKey[0] && e_sector[MF_MAD1_SECTOR].Key[MF_KEY_A] == 0xA0A1A2A3A4A5) { + if (e_sector[MF_MAD1_SECTOR].foundKey[0] && e_sector[MF_MAD1_SECTOR].Key[0] == 0xA0A1A2A3A4A5) { PrintAndLogEx(HINT, "MAD key detected. Try " _YELLOW_("`hf mf mad`") " for more details"); } + // NDEF detection + if (has_ndef_key) { + PrintAndLogEx(HINT, "NDEF key detected. Try " _YELLOW_("`hf mf ndefread`") " for more details"); + } PrintAndLogEx(NORMAL, ""); } From dadaf9cd11e5eced49d7b97d1398cb1e96e0e334 Mon Sep 17 00:00:00 2001 From: 0xdanneh <126520353+0xdanneh@users.noreply.github.com> Date: Mon, 8 May 2023 20:48:41 +0100 Subject: [PATCH 441/924] 'Fix' writing on hitag2 in password mode Needs more investigation, but it does solve the issue of write commands not working consistently --- armsrc/hitag2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index f5730f14b..90a667105 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -655,6 +655,7 @@ static bool hitag2_password(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen = 0; if (bPwd && (bAuthenticating == false) && write) { + SpinDelay(2); if (hitag2_write_page(rx, rxlen, tx, txlen) == false) { return false; } From cb0a3257be390edaea8feca95986bce128075dac Mon Sep 17 00:00:00 2001 From: dash Date: Wed, 10 May 2023 00:33:15 +0300 Subject: [PATCH 442/924] fix reading NDEF from Mifare Classic --- client/src/cmdhfmf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 559057459..a77f14c59 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -5922,10 +5922,10 @@ int CmdHFMFNDEFRead(const char *Cmd) { } PrintAndLogEx(INFO, "reading data from tag"); - for (int i = 1; i <= madlen; i++) { + for (int i = 0; i < madlen; i++) { if (ndef_aid == mad[i]) { uint8_t vsector[MFBLOCK_SIZE * 4] = {0}; - if (mfReadSector(i, keyB ? MF_KEY_B : MF_KEY_A, ndefkey, vsector)) { + if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, ndefkey, vsector)) { PrintAndLogEx(ERR, "error, reading sector %d ", i + 1); return PM3_ESOFT; } From eae5da6b229e629eb3a8092a7ff6a1a871547180 Mon Sep 17 00:00:00 2001 From: Cory Solovewicz Date: Thu, 18 May 2023 00:15:55 -0700 Subject: [PATCH 443/924] Update amiibo_tools.lua Update Lua Table with new entries. Signed-off-by: Cory Solovewicz --- client/lualibs/amiibo_tools.lua | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/client/lualibs/amiibo_tools.lua b/client/lualibs/amiibo_tools.lua index b4c3f3bbf..e5838ebef 100644 --- a/client/lualibs/amiibo_tools.lua +++ b/client/lualibs/amiibo_tools.lua @@ -55,6 +55,9 @@ amiibo_tools.db = ["0x00000003039bff02"] = { name = "Mario - Power Up Band" }, + ["0x000000030430ff02"] = { + name = "Golden - Power Up Band" + }, ["0x0000010000190002"] = { name = "Dr. Mario" }, @@ -214,6 +217,9 @@ amiibo_tools.db = ["0x0100000003990902"] = { name = "Link - Link's Awakening" }, + ["0x0100000004180902"] = { + name = "Link - Tears of the Kingdom" + }, ["0x0100010000160002"] = { name = "Toon Link" }, @@ -1834,6 +1840,9 @@ amiibo_tools.db = ["0x0800010003820002"] = { name = "Inkling" }, + ["0x0800010004150402"] = { + name = "Inkling - Yellow" + }, ["0x08000200003f0402"] = { name = "Inkling Boy" }, @@ -1870,9 +1879,15 @@ amiibo_tools.db = ["0x08050200038f0402"] = { name = "Octoling Boy" }, + ["0x08050200041b0402"] = { + name = "Octoling - Blue" + }, ["0x0805030003900402"] = { name = "Octoling Octopus" }, + ["0x08060100041c0402"] = { + name = "Smallfry" + }, ["0x09c0010102690e02"] = { name = "Mario - Soccer" }, @@ -2374,6 +2389,9 @@ amiibo_tools.db = ["0x3380000003781402"] = { name = "Solaire of Astora" }, + ["0x33c0000004200002"] = { + name = "Kazuya" + }, ["0x3480000000310002"] = { name = "Mega Man" }, @@ -2455,6 +2473,9 @@ amiibo_tools.db = ["0x3600010003620002"] = { name = "Cloud - Player 2" }, + ["0x3601000004210002"] = { + name = "Sephiroth" + }, ["0x3640000003a20002"] = { name = "Hero" }, @@ -2520,6 +2541,12 @@ amiibo_tools.db = }, ["0x3c80000003a40002"] = { name = "Terry" + }, + ["0x3dc0000004220002"] = { + name = "Steve" + }, + ["0x3dc1000004230002"] = { + name = "Alex" } }, game_series = { @@ -2621,6 +2648,7 @@ amiibo_tools.db = ["0x324"] = "Bayonetta", ["0x334"] = "Pac-man", ["0x338"] = "Dark Souls", + ["0x33c"] = "Tekken", ["0x348"] = "Megaman", ["0x34c"] = "Street fighter", ["0x350"] = "Monster Hunter", @@ -2635,7 +2663,8 @@ amiibo_tools.db = ["0x38c"] = "Diablo", ["0x3a0"] = "Persona", ["0x3b4"] = "Banjo Kazooie", - ["0x3c8"] = "Fatal Fury" + ["0x3c8"] = "Fatal Fury", + ["0x3dc"] = "Minecraft" }, types = { ["0x00"] = "Figure", From 3939bcb541c95c86428cbd1c0af170bab0ee914f Mon Sep 17 00:00:00 2001 From: Cory Solovewicz Date: Thu, 18 May 2023 09:35:09 -0700 Subject: [PATCH 444/924] Create update_amiibo_tools_lua.py This is a python script to automate what the updating of the amiibo_tools.lua file which holds a lua table of all known amiibos. Previously updating the amiibo_tools.lua was a very manual process and prone to errors. This simplifies the process. Signed-off-by: Cory Solovewicz --- client/update_amiibo_tools_lua.py | 114 ++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 client/update_amiibo_tools_lua.py diff --git a/client/update_amiibo_tools_lua.py b/client/update_amiibo_tools_lua.py new file mode 100644 index 000000000..873a6e18d --- /dev/null +++ b/client/update_amiibo_tools_lua.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 + +""" +----------------------------------------------------------------------------- +Name: update_amiibo_tools_lua.py + +Author: Cory Solovewicz + +Description: +This is a python script to automate what the updating of the amiibo_tools.lua +file which holds a lua table of all known amiibos. Previously updating the +amiibo_tools.lua was a very manual process. + +This script automates the following original command: +curl https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/database/amiibo.json | jq 'del(.amiibos[].release)' | jq 'del(.characters)' | pbcopy --> transform to table +And outputs the formatted file as amiibo_tools.lua +If everything goes well, this should be an updated copy of amiibo_tools.lua +which can then be placed in the /lualibs/ directory. +The temporary amiibo.json file is then deleted + +Dependencies: +python3 -m pip install jq + +How to run: +python update_amiibo_tools_lua.py +The script will create the file amiibo_tools.lua + +After running, manually backup the original /lualibs/amiibo_tools.lua and move the +updated amiibo_tools.lua to the /lualibs/ directory. +----------------------------------------------------------------------------- +""" + +import os +import re +import subprocess +import json +from jq import jq + +def fetch_data(): + print("Fetching amiibo.json") + # Perform the curl command + curl_command = "curl https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/database/amiibo.json" + curl_process = subprocess.Popen(curl_command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = curl_process.communicate() + + if curl_process.returncode != 0: + print("Error fetching data: ", error.decode()) + return None + return output + +def filter_data(data): + print("Filtering downloaded data") + # Convert the output to JSON and use jq to filter data + data_json = json.loads(data) + filtered_data_json = jq('del(.amiibos[].release) | del(.characters)').transform(data_json) + # Convert the filtered JSON data back to a string, preserving Unicode characters + filtered_data = json.dumps(filtered_data_json, indent=2, ensure_ascii=False) + return filtered_data + +def save_data(filtered_data, filename): + # Save filtered data to file + with open(filename, 'w', encoding='utf-8') as file: + file.write(filtered_data) + print(f"Data saved to {filename}") + +def process_file(filename): + # Open the file + with open(filename, 'r', encoding='utf-8') as file: + data = file.read() + + # Perform the replacements + data = data.replace('"name"', 'name') + data = data.replace('"amiibo_series"', 'amiibo_series') + data = data.replace('"amiibos"', 'amiibos') + data = data.replace('"game_series"', 'game_series') + data = data.replace('"types"', 'types') + data = data.replace(':', ' =') + data = re.sub('"0x', '["0x', data) + data = re.sub('" =', '"] =', data) + + # Prepend the text + prepend_text = 'local amiibo_tools = {}\n\n-- curl https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/database/amiibo.json | jq \'del(.amiibos[].release)\' | jq \'del(.characters)\' | pbcopy --> transform to table\namiibo_tools.db =\n' + data = prepend_text + data + + # Append the text + append_text = '\n\nreturn amiibo_tools\n' + data = data + append_text + + return data + +def write_to_file(data, filename): + # Write the output + with open(filename, 'w', encoding='utf-8') as file: + file.write(data) + print(f"Output written to {filename}") + +def delete_file(filename): + try: + os.remove(filename) + print(f"Temporary file {filename} deleted") + except OSError as e: + print(f"Error deleting file {filename}: ", e) + +def main(): + data = fetch_data() + if data: + filtered_data = filter_data(data) + save_data(filtered_data, 'amiibo.json') + processed_data = process_file('amiibo.json') + write_to_file(processed_data, 'amiibo_tools.lua') + delete_file('amiibo.json') + +if __name__ == "__main__": + main() From 6f8a4eb79aa7beab21762872e40fad641dfed23d Mon Sep 17 00:00:00 2001 From: Cory Solovewicz Date: Thu, 18 May 2023 09:43:06 -0700 Subject: [PATCH 445/924] Update CHANGELOG.md Add description of changes to the change log. Signed-off-by: Cory Solovewicz --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dff4bcf59..41c051541 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Update documentation for installation on macOS with MacPorts (@linuxgemini) - Added possible Paxton id to hitag2 tag info output - Changed `hf mf sim` - reduce 50ms threshold to 6ms for reset to idle #1974 (@net147) + - Update `amiibo_tools.lua` with new identifiers and create a python script `update_amiibo_tools_lua.py` to automate the process in the future. (@CorySolovewicz) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) From f9deb75b3d3e9f5f84a41e85c534cd77c1a69131 Mon Sep 17 00:00:00 2001 From: OscarAkaElvis Date: Sat, 20 May 2023 00:00:55 +0200 Subject: [PATCH 446/924] Add python3 script to convert amiibo nfc Flipper Zero files to eml files to be used with Proxmark3 --- client/pyscripts/pm3_nfc2eml.py | 112 ++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 client/pyscripts/pm3_nfc2eml.py diff --git a/client/pyscripts/pm3_nfc2eml.py b/client/pyscripts/pm3_nfc2eml.py new file mode 100755 index 000000000..e47ff8464 --- /dev/null +++ b/client/pyscripts/pm3_nfc2eml.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +Script to convert amiibo nfc Flipper Zero files to eml files to be used with Proxmark3 +Date: 18/05/2023 +Script Author: OscarAkaElvis +Tested on: Linux and Windows +OscarAkaElvis - https://twitter.com/OscarAkaElvis +""" + +import re +import argparse +import os +from os import path +from sys import argv + +# Vars +script_name = path.basename(argv[0]) +script_version = "1.0" + +# Function to print script's version +def print_version(): + print() + return 'v{}'.format(script_version) + +# Check if the input file is a text file based on its content +def is_text_file(file_path): + with open(file_path, 'rb') as file: + try: + file_content = file.read().decode('utf-8') + return all(ord(char) < 128 for char in file_content) + except UnicodeDecodeError: + return False + +# Main script code +def main(): + # Text help data + description_text = "Script to convert amiibo nfc Flipper Zero files to eml files to be used with Proxmark3." + epilog_text = 'Example:\n python3 ' + script_name + ' -i file.nfc -o output.eml' + + # Create an argument parser + parser = argparse.ArgumentParser(exit_on_error=False, description=description_text, formatter_class=argparse.RawDescriptionHelpFormatter, epilog=epilog_text) + # Add the input file argument + parser.add_argument("-i", "--input", required=True, help="Path to the input nfc file.") + # Add the output file argument + parser.add_argument("-o", "--output", required=True, help="Name of the output eml file.") + # Add the version argument + parser.add_argument('-v', '--version', action='version', version=print_version(), help="Show script's version number and exit") + + # Parse the command-line arguments + + args = parser.parse_args() + + # Extract the file paths from the command-line arguments + file_path = args.input + output_file = args.output + + # Check if the target file exists + if not os.path.isfile(file_path): + print(f"[!] The input file '{file_path}' does not exist.") + exit(0) + + # Validation to check if the input file is a text file based on its content + if not is_text_file(file_path): + print("[!] The input file does not appear to be a nfc text file.") + + # Check if the input file name has the .nfc extension + if not file_path.lower().endswith('.nfc'): + print("[+] Warning. The input file should have the '.nfc' extension.") + + # Get the absolute path of the output file + output_file_path = os.path.abspath(output_file) + + # Check if the directory of the output file is writable + output_dir = os.path.dirname(output_file_path) + if not os.access(output_dir, os.W_OK): + print(f"[!] The output directory '{output_dir}' is not writable or doesn't exist.") + + # Check if the output file name has the .eml extension + if not output_file.lower().endswith('.eml'): + print("[+] Warning. The output file should have the '.eml' extension.") + + # Read the target file + with open(file_path, 'r') as file: + file_content = file.read() + + # Extract the data from each "Page X" line + matches = re.findall(r'Page \d+:(.*?)$', file_content, re.MULTILINE | re.DOTALL) + + if matches: + # Remove spaces and convert to lowercase for each match + extracted_data = [re.sub(r'\s', '', match).lower() for match in matches] + + # Join the extracted data with line feeds + result = '\n'.join(extracted_data) + + # Write the extracted data to the output file + with open(output_file_path, 'w', newline='\n') as output_file: + output_file.write(result) + print(f"[*] File converted successfully. Output eml file written as '{os.path.basename(output_file.name)}'.") + else: + # If the needed data is not there + print("[!] Provided input file seems to not be a valid nfc file to work with.") + +# Application entrypoint +if __name__ == '__main__': + try: + main() + except: + pass + From 5132900d9c20ed6f1241b3990f08f6c2518d0e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Alfonso=20D=C3=ADaz?= Date: Sat, 20 May 2023 00:05:55 +0200 Subject: [PATCH 447/924] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Óscar Alfonso Díaz --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dff4bcf59..9694529ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added python3 script to convert amiibo nfc Flipper Zero files to eml files to be used with Proxmark3 (@OscarAkaElvis) - Changed `nfc decode -f` - now can detect and convert MFC dumpfiles to NDEF byte arrays (@iceman1001) - Changed `nfc decode` - now handles EXTERNAL RECORDS better (@iceman1001) - Fixed `nfc decode` - now handles NDEF Signature version1 records better (@iceman1001) From ca6e9e4ba948b834f14db3e3461ec044541e2af9 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Sun, 21 May 2023 10:07:17 +0800 Subject: [PATCH 448/924] Auth both key A and key B in hf mf restore --- client/src/cmdhfmf.c | 45 +++++++++++++------------------------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 559057459..8f39ca3e8 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1109,7 +1109,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { "Restore MIFARE Classic dump file to tag.\n" "\n" "The key file and dump file will program the card sector trailers.\n" - "By default we authenticate to card with key B 0xFFFFFFFFFFFF.\n" + "By default we authenticate to card with key 0xFFFFFFFFFFFF.\n" "If access rights in dump file is all zeros, it will be replaced with default values\n" "\n" "`--uid` param is used for filename templates `hf-mf--dump.bin` and `hf-mf--key.bin.\n" @@ -1321,56 +1321,37 @@ static int CmdHF14AMfRestore(const char *Cmd) { uint8_t wdata[26]; memcpy(wdata + 10, bldata, sizeof(bldata)); - if (use_keyfile_for_auth) { - for (int8_t kt = MF_KEY_B; kt > -1; kt--) { - + for (int8_t kt = MF_KEY_B; kt > -1; kt--) { + if (use_keyfile_for_auth) { if (kt == MF_KEY_A) memcpy(wdata, keyA[s], 6); else memcpy(wdata, keyB[s], 6); - - PrintAndLogEx(INFO, "block %3d: %s", mfFirstBlockOfSector(s) + b, sprint_hex(bldata, sizeof(bldata))); - - clearCommandBuffer(); - SendCommandMIX(CMD_HF_MIFARE_WRITEBL, mfFirstBlockOfSector(s) + b, kt, 0, wdata, sizeof(wdata)); - PacketResponseNG resp; - if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { - uint8_t isOK = resp.oldarg[0] & 0xff; - if (isOK == 0) { - if (b == 0) { - PrintAndLogEx(INFO, "Writing to manufacture block w key %c ( " _RED_("fail") " )", (kt == MF_KEY_A) ? 'A' : 'B'); - } else { - PrintAndLogEx(FAILED, "Write to block %u w key %c ( " _RED_("fail") " ) ", b, (kt == MF_KEY_A) ? 'A' : 'B'); - } - } else { - // if success, skip to next block - break; - } - } else { - PrintAndLogEx(WARNING, "Command execute timeout"); - } + } else { + // use default key to authenticate for the write command + memcpy(wdata, default_key, 6); } - } else { - // use default key to authenticate for the write command - memcpy(wdata, default_key, 6); PrintAndLogEx(INFO, "block %3d: %s", mfFirstBlockOfSector(s) + b, sprint_hex(bldata, sizeof(bldata))); clearCommandBuffer(); - SendCommandMIX(CMD_HF_MIFARE_WRITEBL, mfFirstBlockOfSector(s) + b, MF_KEY_B, 0, wdata, sizeof(wdata)); + SendCommandMIX(CMD_HF_MIFARE_WRITEBL, mfFirstBlockOfSector(s) + b, kt, 0, wdata, sizeof(wdata)); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { uint8_t isOK = resp.oldarg[0] & 0xff; if (isOK == 0) { if (b == 0) { - PrintAndLogEx(INFO, "Writing to manufacture block w key B ( " _RED_("fail") " )"); + PrintAndLogEx(INFO, "Writing to manufacture block w key %c ( " _RED_("fail") " )", (kt == MF_KEY_A) ? 'A' : 'B'); } else { - PrintAndLogEx(FAILED, "Write to block %u w key B ( " _RED_("fail") " )", b); + PrintAndLogEx(FAILED, "Write to block %u w key %c ( " _RED_("fail") " ) ", b, (kt == MF_KEY_A) ? 'A' : 'B'); } + } else { + // if success, skip to next block + break; } } else { PrintAndLogEx(WARNING, "Command execute timeout"); } - } // end use_keyfile_for_auth + } } // end loop B } // end loop S From 98c0046bdb12c780107f90307818e4f5f2b78a82 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Sun, 21 May 2023 10:51:10 +0800 Subject: [PATCH 449/924] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dff4bcf59..f88ee7ef1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mf restore` - Auth both key A and key B with default password (@wh201906) - Changed `nfc decode -f` - now can detect and convert MFC dumpfiles to NDEF byte arrays (@iceman1001) - Changed `nfc decode` - now handles EXTERNAL RECORDS better (@iceman1001) - Fixed `nfc decode` - now handles NDEF Signature version1 records better (@iceman1001) From 03e1b23fb02157e2cd385e5cdb252413c0b910ec Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 23 May 2023 13:05:29 +0200 Subject: [PATCH 450/924] fixes #1986. spelling --- client/src/cmdhfmfu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index e47a60e7c..f720d8599 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -2690,7 +2690,7 @@ static void wait4response(uint8_t b) { int CmdHF14MfUTamper(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfu tamper", - "Set the congiguration of the NTAG 213TT tamper feature\n" + "Set the configuration of the NTAG 213TT tamper feature\n" "Supports:\n" "NTAG 213TT\n", "hf mfu tamper -e -> enable tamper feature\n" @@ -4697,7 +4697,7 @@ static command_t CommandTable[] = { {"restore", CmdHF14AMfURestore, IfPm3Iso14443a, "Restore a dump onto a MFU MAGIC tag"}, {"view", CmdHF14AMfuView, AlwaysAvailable, "Display content from tag dump file"}, {"wrbl", CmdHF14AMfUWrBl, IfPm3Iso14443a, "Write block"}, - {"tamper", CmdHF14MfUTamper, IfPm3Iso14443a, "Cofigure the tamper feature on an NTAG 213TT"}, + {"tamper", CmdHF14MfUTamper, IfPm3Iso14443a, "Configure the tamper feature on an NTAG 213TT"}, {"---------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("simulation") " -----------------------"}, {"eload", CmdHF14AMfUeLoad, IfPm3Iso14443a, "Load Ultralight dump file into emulator memory"}, {"esave", CmdHF14AMfuESave, IfPm3Iso14443a, "Save Ultralight dump file from emulator memory"}, From c10fbacd2023dd4b082c1033041e9c24de1d67cc Mon Sep 17 00:00:00 2001 From: d18c7db Date: Tue, 23 May 2023 14:26:20 +0200 Subject: [PATCH 451/924] Synchronized minor FPGA orphaned change In file hi_iso14443a.v from fpga-xc3s100e to fpga-xc2s30 and rebuilt the FPGA bitstream files for the Spartan-2 --- CHANGELOG.md | 2 ++ fpga-xc2s30/fpga_felica.bit | Bin 42179 -> 42172 bytes fpga-xc2s30/fpga_hf.bit | Bin 42175 -> 42168 bytes fpga-xc2s30/fpga_hf_15.bit | Bin 42178 -> 42171 bytes fpga-xc2s30/fpga_lf.bit | Bin 42175 -> 42168 bytes fpga-xc2s30/hi_iso14443a.v | 24 ++++++++++++++++++------ 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73db91565..5783b0f46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Rebuilt the Spartan-2 `fpga_*.bit` files to include the `hi_iso14443a.v` update (@d18c7db) + - Added minor orphaned change from `hi_iso14443a.v` in `fpga-xc3s100e` to `hi_iso14443a.v` in `fpga-xc2s30` (@d18c7db) - Added python3 script to convert amiibo nfc Flipper Zero files to eml files to be used with Proxmark3 (@OscarAkaElvis) - Changed `hf mf restore` - Auth both key A and key B with default password (@wh201906) - Changed `nfc decode -f` - now can detect and convert MFC dumpfiles to NDEF byte arrays (@iceman1001) diff --git a/fpga-xc2s30/fpga_felica.bit b/fpga-xc2s30/fpga_felica.bit index d87b879de72ddc013ddb7da919f9f255421a835d..83009b499879dedcd6b741fb39cd016f915c9107 100644 GIT binary patch literal 42172 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

4u?&%}qr#jTc&F>9hiLT#NQhiOD-%ZGRs!(` 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 diff --git a/fpga-xc2s30/fpga_hf.bit b/fpga-xc2s30/fpga_hf.bit index ce658c702206a40d0feb7f89a4aae0eb9db38739..06a4569f93098a4631f0a7f2e2f2eed4d93e32da 100644 GIT binary patch literal 42168 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 E0pOhEnE(I) diff --git a/fpga-xc2s30/fpga_hf_15.bit b/fpga-xc2s30/fpga_hf_15.bit index 30db5253b0bfc0a846cf6bfd9722ee50293b32b1..0e59dd3d0f48262003e37efb22b43b55b0e97372 100644 GIT binary patch literal 42171 zcma&Pe|S{onKyo)=bVI-Ig`vG1m6@DPbPs5>0~k_h%to8Lz1`eR8Uga?_O-Les@P? zZQ7Uarmoj}(QdDPpG+bQ1Y|(8)R*lZBD&Gib_`S_SbD(J9Wcd_vM##Rju%Kqt=X2lBBbE3ja{nVz?kC@a-Cw)^Z@M1*o5i<> z{_cTww3a*#|IirzU*B3B4$}i%+I#H#E{ZDp|aw8UJs*o&J_+U-u1sp8LW7 z^I({SLPWE|N=*J!4=a{JqO~qej{J9;`ty=7;rqhBD`Dc)Ni`2pxhcQ?KYTRd{=t8t zjl%v9ugHC!d(VHRP5J-rJzDNP|CKg#{;%(G|M0p=f?`xj#iUF1%QlIklk}7lJX&HhFZEIl*TZZ*B`N6W7F(;h?{Vh-g!-x0)NQh8ko*ach{vqm z6mm+E@op_9-$Qdx(nngoQ<`Nh;utMSdAF($&>3ot{l9%`r{=yVs|;&5C{pgr81K?= zsD6d-ih3mWdx|_*7Hc2Ii1Fd(etL}>GG3wX7Z-T5<2~5>yXd6Z(y{evHKSRwO}Z#h zxgA|WSBbWepLC7ALc^V*PW@^2F>%=@Tg0jNe#_LuclFToWM%a`*(jw%FsAEl5?c%( zOSz+Mlc>rDqU?vX(W$a1T7HUN5DQ}Z8kWwzC#sY63U+JIR0W;mO;2j1I^GHTE+4gK zox<16j|af4hpJxr0Wq2bal zIy2Z%TehWtz#gX|3JO*BIZ_+k(i>7cWt-i%o;I(bhown%jDAfK$Cp$)=nA!RUq(G& z+%4Nw7G1s5>qR5z>Vi(A({mqtgzC8`1S9kov=)gP@OP3%XgVCQk|oB zv+=3-=<}`1B5Z}a)Oqx3yw37%XxvHni5ANnRX=2MDM-K7PCkz%D6`e|=BE@9zOcHE z@Zk7TYP>im+wh|6d{iv6%F^mXG$I-;Ut0ZyekEFC-ZQF`Td%>{yZ9sMkJZ5{=n<_d zY4FAj|HP~l`u*&~+&mK{SN55UsMcap`XN;n8|&F+>k++<2RfOPv#(gianVCHowR`6 zv*NLYox0g-dxZu>Q0O%*om=<8xi+k+c{udA8e?Z-4cJI9^DQDGyw9mqza{8*7{#Hq zucCdQb%7%3+mh}3vBx6Zw^PaH>`O5x=;NbH6Tu0!lJ23~c93S&Uq(P1PyMV&2yB9 z`(yfkh6fRf=?QjG{32GJ(I?bcZk`jcuO211qNJ*P45%3tCB#Oo13J84m<=GDz{i=p zPv1&uer|nrtxbleME-{(-Nd{v!%@|j2b$sH#puM{btU-(nUeN zmj|IJZUQ;b+ za(am0x{E%e$U8A)(%mX)zj>+ zNusdc#1IV1--=d@dV7<>orplnv|eF3(Eux>{-osu7PIo)x{uF&4*h9Odb61McdSM` znCs59<8Sd~Vl?S7jdQ$7W zPpa_zc0(*U1HT?D-t73h13TCU;w9VPiDeq2mz;)}UIA-z?W?k=Mr_lo+hAXSwsL=a zWwH%zxIe1zVtM?6+mZgzEFY0E32!pl2!GzRR_U|L^Z0d_ogO?;>wPXBqe%dnCaN)t z@gdXuXn!8R;NGQ|$jrH{eI{Y6v;9@^nccMB_jUolF4M1A0|#1-(Q)ANwxoJl|BM!M z?^(4t=MS6A@p6PuiZ0**w!oDGwz4#gov9~0WtuxKz34Q9t910v@@we)vnxuvncMjj z7(1KBFKJ&ceqBy%Q~u{GfUPk)On#2pD9){gJ@nt$(`W^q_p-qELsl@ZdNg?9rL`yBmck0)ne zwo>VC$v(cT@x=_zBAQtYOnV+ zX1!Y4fj3xfZk~Z(WK-2KAnaLy?}8OZH@hrR zuS4%dZ`}E@Dn=0&T9rU*2e57>4W(@(?Iddjc7mR>ufe&4@blPpFd6fTwUm4bb{;HX z$nmC(soxUtYnQ0S@g2l)K9&zDb&SJHI2d3yXBUe3F8zuc2zL5047M>IJoXoVGLO>p zJa}294%a{TXb)0?`5jM^U6dxn^^|`EAm#2To4fl^6a_6wVe}{1@5EsT4=FV6C!m8w zG!C}`8laI7w&k%J972J>kOEcE<&>dI1la$FHmAMfMNm?N(o=f2~@UF3YIp2s{?cxTQO1U&8#5Halxm zfo;{*ERporpsOKrM=@NU=U?Mw&$egl3b0AQG`nS&ow?6yo5?Tq z6x9S06@Ia0cRWbXN#gT7>&~q^pL>BmG6y<>r1Z6=W6h}_4y%jM1~b34z`qW4ekvka z-^44=neg*>fjnLY5rdzfRP+36Fa5eI%(3oOn3fmJ;BfmQ0Y>I{`>ON!rR)8%wdrVT zpq}?WWS`Ras~s99zCv$`=ke=HVkg;015HdYq10H+EbmaPv4E*Jvpjw^=RAM3_=mAg zJ8H(*ciDHUeku$J3VHm}OHS2Tj+YEU4lOZ@lST*jROK;mSjpqpZieBE_$I)=ZqTx9 z=_SM)?;xl^yphMRH2o2~H$hLfS1-Veox&a%GJZ2vc`V>aSLYX<*{j#ow)Mv6YGe0J6ii zp|W0^CK1-4&w2d1re9&MpC5z6U&8NxTV0n!GS#1c`{?K7>o78T{x$bidW$5_RV5Ki@vMh^RJ>s9Jnm>z?J~plBgEj*0Du& zh=-EKK6WDK>jFiR+FOp^R1Dn)o6TruJyt5Zo>pq{DgI?EEd&{XLq;&=0|5*65ct!HJ*_d{4F0tz*Pocjq>boLAm*uzy`a_gA>hpOuRVN|3F)H~ zea6CBI*;FC=GH4d#lNhIlcs1RjVxAL3D`QNTWtyrS;3?yz!I8^DT8yjS+B8hcHds3 zUYs%;#)G%3ettC?*=IaG&Go>)#JCLOA6K*bg)c`4%OqKUqyrCm{&kIBSMCsATMdJD zVH*z`O>{EZXnQZ@`4_DxIBN=+{p;x^-S5DxH0lwS6gsB)S5XjXwGdvN1rcJQ%??&$ z_G|uM>Z!JA{-p(H3udiIgc(;30KW`TuH(&?^c%+%2?fBf_0Y$b3ixLWAq4s(Kr~$c zoKo}r>x}2JWLtUu&Dy5K0z0sV zm75!nR%MMS^YHKY)MXJdMsx3p>N*tfrD^Dg5Gk#2r%yio8b;&|tM@Yb8t|`Scz|W1 z{te9hbp<9P7w!+h<@yOVSsasX28$eeMMzx!3(Y(pZ*Y9W*Z{e4wde6GDPfDI?cFgf zkIptx-I>4){cyZfQ#qVW zZtQvd8U)*F5Z=8WNxQIKS+xldz%P3SezD262(1<>AV6+N0YifpN4}mJ_{HA>ms#~B zX!3CeV@#^Q#0F@IfruT;?J=P}C^pAJJYcrf0Hi{l2Dp`cSQ|*PsW`I|_VrKj>W~d9 zq=wc8{2HUpeSa54(DiC=Ep)8{k#Jo{^bO`daA;Og4@B@TC>~SxHC%c>RO^W8)zm6D zYVvkaW)XU2=&S`0^E6&V88zeqCmgfBAN(H2{tj#>Fr| z(YRuDraI5RvVbki4@H{oOGvvAEX)$zPb&qOZ&OT)F0pH<>-$ zmYpx~FG76CyC5xM?A6@J6fbeVfg{TEuMs-R8=xP~sbR;doUh(xe4a~U2(+5XzmiAL zMs;Cp9fZVJ5j9~^b{cv78lZ8YRhcs<#YXj3@;bd?EN+A_KY9FWq9aNu3H~0S_5Yt$dYk1e;o8;rl?my^r0-VFu)a1hiZLiM&PsUn6W)C=0A<`R}X zeqE(siAKvi-X0;OQDWXS2+PT2Yt}odQqCU^&fY;A!G!}E&*F}MA;^Xgm!AcY)nx+T zQooUl!=XUaBWAUxbC1;U>+rzNP#>!wfepfC$ThVpvJ}s$PnPu*1ImaMVrkcp_2&5(=%g0WeWD#gVhpsaMg3QOl1Dm0#PawxNhje+ z?#ZY_ViYL}Z@SmAUbmM!-ibVZX%DbOww?mW-LU?O&=A~vo!QSr_rpKu@vD|L_beoj zU2apq9umN`QmeM`KuwD1HH3dCt z%0K7vD}!)%x#POQYua+!?!YnL(3U%Y-R9JxlT6_Z}`sjO5)sV`Jw=_ zZaL46`Flz@K$+q4-)jfRf6Um=ey<-Ep)3GsihrexE>heKq|w7sh@V#4urSMr&y<_3 z;ynM_Pg|_#(w?E>i)iD2b*0n~p|47y59ijM&%KCk+vEg~s91~k@(G`OTrA=zk{8Vc=iutM0 z5NkPb__ew9O3y}os8l)8ZuP5x`6|a)%PO@OlsYnE)B2&Hoz|nGI;(Gp|Fia@xIb&u z`sWk+oHaJEyncAh>J|QQK=V5^%>5NuQ_@o$NeU|Hhll8-)9}oyA6NI&)!jn}ebFxj z;3Y!BXV1#(huPxE@H12e?6bU%)R+tzhE}_!a2y1OFPP zdc=s+`L8JA!yd)Yfv_WH4_Q%AstRyM^jTuA`<}|V`&hps`RT?n>ec*hMkhN+Key_+ zv9rLx&RfT=hRz_eZym>>!Gd-zq$>ist=;Mr|LRiqMK9Se|ATL*dS1V>=ZNmxrJfg8 z#P>Kxn#ZrbG^sa0*J{TDZ#I!9g5T(Ctim^W{ZKcLj8rFed+j70v8pY@ZX2gV3L@BS z`(3$MLh`R6ZrS?hSf7QYiM^8AoFbVKi#D*les~KVfexv6v(unm$TxLDl>3F;z2mGa z_a5*s`jdFx4sK}wA^g~)y>MTrz`vfif@@~zhvvr`RuEE^_GxjX55tk-6>LXL=f9}v zIzMUOku96VaIPm?_xaAWe?p&$)|hWx$>Y~9I$ctq(7(mr&|X|z*JtpyGX(x6j95WG ze7R_2)dB~7K0^nAap?1D5HYM5FW}b*?WEA|L^z&~J`X9)C}}$(kSR$S+Y0*Oemd5+ zG!;Df*t`5ncLZjoek88ikssqBk6#z*Dvyjvw9;T-TYV`7frl31v-%47^$A_q4_Mx7 zi0~2m+g_PVx~?Pm&-PB~hlmgPA;;gYr^+vY{s;R&G+h78jjhb$ru3Q64{2EV)9xP) zn;`*=`#ni4Sh*jYmdiHK4=b>OGQ#g5P!xdx#-T8|euH5aXBHH-;j^z@vG<)IxUvVH03E8p+@_jX!Z5@Z)3NQX^wvi zzfiwHiN284K3IN^B_Mu+e|;AIm!tl1jKa>v35lXHN&;cw*~Vyqx&+K>l=sFKIy$xa zXS??0%zdV&UxcuY{paaNR;^>~f_C~N@*mZQSZXS6nftHwmWWu}cdF;a1!{JDd*@sP zE-!I{BfT_@Uk7VGQ(F1z43^-m<`z6$V}GL7G;A=>zxLBO18YmERY?ReBj71PWW-R> zku2zkHRQ6tVNpW8o&E`=AY0({{Kra@$lh`}huNYp(tuSXFs>*GzJJIlE)SYdF*{pg zvpoO0$=WJDZJ(~D zCdiUwk5;^<_0sxx?_A!tz4I~6I<>NijZ&`?Onc@Q^uuBCX6N$3Rb$5grt5S__`acz zdrpwLV|}bWU%!F07e(|ku_7kAEjSR-?jWCh1P{Fh{ZL$R8lu5u?-(8D4P8DE1S(OQ zW5Hc&Jh#V$_C>Mze)#Y`>;u5oQpb1#TxK)b9noDg@e3N`3P{sqHps}AHz%n^f0mwe zkpJ2^ZC~=E4J{2g_+2wtznV@OLVSgUeDZ+gjHa7N_p7z?NT$3Pz@YQR`a@{A+}E&^it}S&W?BLfQE~+Dq15=_lIS^7!@T&5r+p zn<42C@)vENjXI7Eywt*Ww6NO`iZk7)M0yjkizpFRhu5Wa|a3 zQ=92gu{L33LBt@uDEj(ds2K7SD7yRp14n~4E%D#u>HVwN1S;{oR84^~D2iLi^<$P| zDlZT!PP#qwLI3Y}jFGlm==)YxIxsP<&j<9IfL5SgYt+A_Uy7==r5n`wJs)J3O$Ilp zTYwn&=(p~J&ukH8sdf++imZVKa?$#TA9}k!Je~jIb5EiCqp`*}u13_?MPv51ZyS-C z*PW^{2#IEHy#_y*q&Lf}yod&Gp^aA6F5>}qi`Z^fjq05R{&f(vt17v&v-lSJ7Y5C9 zqFjpkpLY`XF`k>lnD$GN%*KQfZu7urTC<^+;#O>WN*&V7zv(;;i5dIJK9 zun}LA+Cs0>3lrX#r+-V(IRBI%5rE_0(WykUGb`a@!J$z&y)1wOAH}@RUKg#F&oRQ< zq-gB$W#NDRoepH-A*b-GM_c9eSBA8kz5Z%3eD6T#%?Z?R{D(5&1SZ?;Y5eMf?Szz- zgU9?bQ0y`GK$C&sCTj+)+@kUGmBn#Ib_a_QgcU>-L#P(Q z?;$+QX<@HZqXXTB*c5&Ntu%>N)fov}0%3f~-DBaB#YMTLMh#05%SE49Opo&ytu@M6O=atkZS!B%7_2N8! z3DHlXV{jMa%3)q6K9^(*O8QMOyF`J1y-VqIBw3oAb1pi08n|4f7U{2u#Xuq>&%aV| z@2%XIRj->j1Rg-dDi9+%c*x@y?29ABI-rhmJUHGy)glOq$GlC2`ok)II1zdnaQq=H zQ$hjH5w@tKzq9(|XsY~U;&Pg^MVudq24jZC(#ghf$SSFcduWG1Q4N((@h?j$HxG(B z8_eZR!b8^hlK&>_aj_s0kwD3|()%hF1<dL1 ztUt6)(4n|*FZu&2ItZa{r4|xzp2nGGH1{ohPj!f}o`nisW zgEjbDJR~bRUd^qk%r8%6j%04VuES#%qZUHLn`ajv%h}g(X^e(7Os~YRVHBU>;ha6r zBDLN}d-M9?WyyTGPfC<{7%v0q(`Dgk=?wfDk#>qU7!FDkO>c6=nE4iRN#2Z_*AK@@ zmL1*V$HQn$0q2DmGp%dh`4X`L9GMZVaNb@lc}PuiNH_8uEIHvMfBd zYhQsP&O|h5!Noc78vz@+{$nCVUNV|ko`1DiP`@1+hG84m^?}r!t&;VJo`(U5?t2Dx znYCXY1MPZ~ekSf5DBGZ(QvOqZGn0SiOeUqcdv*6u#T+mfX+$&XH>3>JYL`m>^^;_) zU3Xla&qu}ow=al1(G-5oPSQb!wczY*>~?S~^v6WT85`*@X5_!{IV+Kkb|b7v*VOyyLSq|T$j=&Awc3>Cx8HVJIh1)w1AUco5(h!yr&~`&b^og41ord9F?IMLJ}Gh}i}HMRHu+ zpf*`z6ck37IZ!-8yo9h<;Z^ZL{_9f>J(RTTu*9Zm{uLB?{#EMsnb2oED9Z(Cm;7eA z{3c(&@d^FASSev`_mCjX z-crN1La49lR>B@H*;tf>UZ~$_fQi?wGuE)3v`>6|hKf>iyzD*L4(c4rne2|NKQwP>%X-RU>Ua4Kx-EOpf2t4?%~q<974YjKa4)yKjip+rq)@|wWOz=(hpI8s2>FFa&yNr5r+L!D)wo25-e_Kj^{e`q;gPHS)MdI zr9k}j8ym``3JMe+XW^WEMJrA!2Qt>>X!xdW)N5MjUJEmfT?8x$i90oS&!hfOd`!rH z)v6c732IFFY&F16uBjjPb@k@;L+m;oxe}?DU0VgGCqZG7nwf7Veu?AePzT)U!ocxl zdCY6hso^pa=G|ei+;5?No;Gu3YLfeo+(lg+v+mP}MlrzolF+&|L7RV;3pN}!*PpQmy^A3&V zeMGfHnj<4-7xY8dy*u^cc3Ho%lyBeBK1M&cTf2OndHqniO#cS`ur#Ae{cy3w3(3Er zD0U*L>n`gL--@MpDI`HUN>WIai7+1G-Y2H@!+^3+ z!dA!jqf<^Hm`Ar_b=7|?L^uu$k z5@h>!;k5xbr>MF|f4_HzehAqx9jJ+WWw~;uBL^h6l%gKY+|K zf2#yV*URM=ckN5SXCmgeQMU0R8vAV{?2#%K@Jretm*bN0Az+K(B^<?6>*ftR|lI_wJG|2wQ`i)kx$~GvcZ`ij^kXyge2_(8KVQXT}Btd5rsFTU#*E>je z0s{L4xJtwetk`XSDL(P1l;kTw6gc}^5Lp!Uen z*-Z0;0uutN5gM|BIy!%D8o&0-k#7`lF|1LPs?+Nd) zk;ktjZKAyh3q6(ECJTvXj$8>c;2eQszJC4%`Vn$==wXC5rM`9!4}WbT|1}Zaur`lh zqh!ky5KEZOdo3%g7c)-791~Sl$bbESKI9D|INsaLMyu`+TlcBopsPHR3SLz6_?7kV zma+Oq^?2AK>0;1V1U8@WD zRdgD#1&KiVjpMc~utb}))TjW+3iyRx7b2uz&(Rs~2W+V+O6>R7&cv@*2^A(B*5ufa ztf=B8o&M95B#ZwUewl7I5PXpRz>6VgkpJodqTxhO9=}Eq>`(DQME$ZqzZ9rQj0S&D zz^`W#SFA{zFIk=KyR<_#?v=_Lh}iIo0)7cZO(r6ctbR6jfV?tDmi3w5zTRp5u;@<6 zhV{cn);|&3!u_^qkbNj#uBokpLV7Sp}#sC6Ja(1$Y``TC7p z=n-DWSIV;aO;nxnbjM}vhmz|2KAfRt73T;WrsJcj96>~wocIvyV0Imzu}I8 z1FhtNDTpC%%wO`oKHm#7@#{ZDV|M$Q>g(jDz0zugZX_B9eV?g${`F7bR(t;v$Iwv5 zAFWFo;9v9$y-FD0n&w1AyDS+)B4TtozGF-vSVEr@E4$&F@tA0$;YeJR5)J{3br-_Z1L33B5oxl9N%Vv&sR z5%nT)IkI*8K{bzGpYW5c)xk1dvk($Lw7NxY7B|dBfs9yQKfId~JlO3K><_VF2W6rH z*mU^l5}~)i?M>kqP8ex8LNy3#2L9D^b069q(EUi3`SbWyL#WnpP(?Xv0?7EyDUXiA zi5d||74T~v>?~E9*B<9Y*FU?O; ztJsUM5D6oRxpCk@2{HdPem&#wR~9A`DONAjUY5kKh9`C4g(&c^_s9|9B-BEcfL{S$ zs(KOlS2$T325)lXAJiYxwUK4ndZ`xPa4;_UaE%aeOc;6mvian?hF!jAud_>$co_J*+_vy*vkcuZjFux`1C}l$ohtVz9+c{zl{48o_ah@-4A-9jBmSdM*s?n`v??19u)TODR6?ZzbNNr1hr3<>Y} z4E%!B8X-s@z%RE@3a%haN6hU<;bh$R=;o_*T(}ie$hnwHyLD6Y6gwQ-nk?kM)?sS_ zlJ>Ck{3WtF0ZHH&!v9_UR%|p=_6Ph+^qXiSImlsJDC-Yvm@LK%WN^5K%Qm`(EQ1Ct zFy)#80&2_Sn&O@a>zuZ);nKBsR6(C@bsU8pOKb0m8-5hh57l}wz^3G! z)6nZ$U2IAr*1|V={#A61{R(zkiZfz3_SLw;o58qTB9>8#bMax0e<6aE{A(Dd?*@31 zks%sWvi$?=3YBkIm6QdaG{h0lcjfF0{3{Ipb*U6uF7_(?yu{o~c7(4^s#_=~=P+RI z?Zlc^f=Wa1r=dz8spJOIWt$58>rV5C7209E&#uxIty%z}2k}rfP?`m|;_iD;A9bKA z$W@a@{f|*V0-0CtG2scKjcZ@F;?^HJMn~Ik>7NzUZ*&*$(QpFYDcMjQn8q*EZ}csX zZI7z&(D%iiS>J|PW%O_2`D`dWqkaP(GV(V1JWB7;Qb*b#|F$GzGxWockw1)Hi1846nVv>`Sof_t-^j(`geusd zRW9l&o*oRclF`6Jbqacwzz?# zm*!!rb>PE;>{})Vr|pYqNQQ+bDpL=j@&n^qmD{T`&VQ{(zQ8>ZpT(jy%W(zu z3k-}SmDdl!zpk-6oRTa;qvevG0LY3_G3C@xs9nYGS~#fR7!`+Q{_9@4C|v$^ihgS~ z;vBsi=D9X9|J4U`7%q2@eL3J(<8-*9R=_}}@GD)ECb&3>R-A0fzbuwkuptFT;TIN` z9p}HmzpMeLD>W}j{T%#jn2n3W_kTkKhAEu09h!ZV9BSIRt)}H&XPeXyx_r36h?0;PTbVKlQcltDor4#GaT>gdpSGYlV z^SSjj^m&=vkD}g~$wZjm4ZY<>Zo(u8JJ$+~V5qQ)v2F29QoIJT`HK_1P0&-h$nOG{s%vWW3)CQ8Weufu?B_jy zrXP}DRwL9_nY8V5u zBIq){Vtf+6IMCV^dRraH+1Ku(5eAtK<5EZTcj*x1P_@Pc5$gnA%*3xEpq11mwvyi; zNO=4MTeAK@-~`Suhq3GwExInd%5~(wl&2As;Gv@D>88E%p*$BKR?d9}yf+sIm> zcOI*FuF+->dOeM-vWM_vW>0CWB66dN?AX@i>fm79%g&2 z12iimvJ}m=k@bf-_GSAvl+V}R6xDWU+&Dy^NFugI^)UB6Q|FgCpf)R0tD@9y?x}vdy}qL{7W}$mPUF`u>NBhQ0{50zh!?8dq~vA# z_b^uHfkOS^bxpg0$`z-xh45c+Jllat%qA9l<4pniiss)*2bnS(}9 z;Q$LRA_$B)WzS)xF}ID0P@k3wZ^l@v{~o@@E6=&4okkJNfPYzT8|u;yYZkxDQlkhI z>jlb0Hz3Mw6oJke_@&@x7_P_5t>m)+pvojJtdO_jcx>$6PWc|FpOhlx8NzIpBFpBZ z@-l%Q^7AI!1NZ0t7W9otdJfwLQu#Q7TkM~hhCqn0At|?B&<{1p8ji19hVg_n3iuZs z$erZN7*n;fPSFI729}k2C#$7y+*nig$KHqdjiyGYG+W(0H9zKilyI7h^kFrm9}=~? zez}eMHpTo$^#{vSxp__$9i45npyf#+d^${l6;C$!IY^ClLa&K8DDFHvbDvV46`>f~ ztf#|PZ71S+uZh}~qq%u{%AoLJzAfIKpK;>ZTJ=vnRgqR)toM&kGT}6(Qt(3HK?Qf6|mWLBnnlHVZTzm(q=~8}} zLP-3n5=m@5*h|`LCUd|m^ZMZ)U1qlp_&Nynb&mcqHbgIO4A9ql8ghQjAz5}<7hAcZ z{7rh%sk6VZfqhT=zP&yh{W{C$<_G+%>HrI60NE!1TcI=1y8n*;H$CWp7u=g$_wl)h zt?RsX(D$7Bwz%#@l86(&z3^>10w2X@;MZ_>L|-jnO_Npx7T0cD<8XRDq3)!x9G7l> zK$m(OR(N;M8A}|uBF<{~dG;1HcLaCl@rxc5FU9;FfgRPTKa3;4vzvXMHd_r*T!Lih z{Fuyty(AU0>}&Yf*q9zPFD1ocE_R_ z^&4yL$^8w@UV+(2Aj$4~^rv_vpY^1AU3`0BSy$PU z>NCaep06yDA(or}T7nV?z{C!th8?G+u~KCEa{C$gZ$R4cBi3uPacz|4AJmyYenu<_ z>nDsU`~v?%pJN<-*61a=pL=lUmGv`y!M!D!_^F(Ip?=GQlK!!}Oi*Lk|~rH1>!tv*jzI&q#lseX;i8>P^nDW3rTWg~hA&z1QUY_?KUl{a!k z_@hbnD>?ge@hdij73>B7LMcv}i(gtZs!V&gXqH^lKv7f8MyGlJS0{by#0dw%1^{Fp z0GY>9^ZaWS*jCLcV=+UqP&}AsEl-x2YWlhCH{>xw*B{!-e0mJmZW!JEcL-;xIO4I} zw2j`XW1e+*A(y`;@#{@-d+fFi>N{*i)Y)a7Y7={1+=dtBWN=hZL!}wPDX*yW6 zNa@FcDLPHh>UZ7ic`i54&<|tK58L{?0b4J~n#oR&8G8aY7>%)xoPAjpBXpp_viig2 z$YkRh4%AB&(QYlU!b9xIoP7<>{V9Fw40Zbk)%V3!*5JUt>JiUNy~XIt{g$8$Ni5SE z-^=Rz7Bofz>PhDWzGpo8Hvi zYaC?#Ml1c)DdfL!-&eBH3W6rL{Z<^vE=a4_`ra`cS?L)yuOE(*hb>L$@mVoSRQY8g z$HnZUv4OAXJDHuEA9;Schn{N>U=Pxd^jbbI%tmQTtVWcW_H_Nm?EQcMzoVxx8<0oD zlY%bN7KU$<`TF_U7c0{kvKKh$JfJtF%lfMS5Wforx~01d`r*qc)rKzW7#NPzN~PIX zt_ys#0+oAt{Mt{)t%V$B^-cbfwY0M|rT$JkA?)4QwE6lC@UJ%iS^ai(t$D`p-vzh) zd+SXHh4i}-NV;~BEn2T6X&u!r_HbeIV6sF5Ngtp<7>Avw^urkJ>xan)Y}~f-J^l;v zz&ezmze7W(7Fqq@_3OF!NdEN(9ptsl;FQ%`sC21vkUDPYj`-7+w%?`p&yGyF+Iu}*e+3Rm2B8}kBHk<*+nzz=P&BLDz1%^ zB`dl64`BmwLha?9G~@j8htw>*lHPuW8b#^2`VZfDl!ipfjPuJfMGGws;gj5csO776 zzcI`D)VzK;#*fpXm^bN{a#llk+3sr8i;5xCy7k!}t*s~F zUt9V(P{x#VDDi7EE&3}^k6q@|$N_nh#q0FVmc0T(Vxj)9ZJW$?eRNS+&5^zbM|a;WskXA16Mu zk8~C44|f;IDoVf>WI9MXxAS1eXb{(MploZVkpFUYsTKwV>;n7?L`?P5xa}WACgNny zkLkccFsT^W7SefCgK@F{Zlx?s`h-ILhK{-vgexSuCqiNnRckLn{l?gH>u#g|@B$6- zt$UOj{SsRmD>Hj*5D^WbkfXYQU-$-WYqvV)e+#+D(mg8f`@&^z0K1v_FQt)!U{2T+ z4XkXFYMJRA5zF(h0Co##*C5jgaorAmjHNKZ7nhdK&<|I;TML^Ytb2!4IW{d0DA{)z4w!HKXBbMs7e5ExhQ=$Adi^o#)bcCa&u=c}AW`TQ67 z7Ye?-gxvZ9Yj3nB(XW^HTTdy^I3;Ew|Fs_>#C*qlNZC&h(9+B-GY-uP2ZG=ar+!O% z(T_yLT8$D}nv6GRw+l5P1CKY#uy8s5EX-^4D{SM?7`vUl&X2xpGcTjaGi?qz^U*2VjE6zmOS_j36j z)XytuLvW{#wgp)2Ps~do?zNB3%jdrY_!m@bs+CdXyER>EO zY4)H79gm9#E_*hV-9-CD-G|73 z&DZ2v;FVFBG?()n)dAd;I_7NvJDxCGoZEJ&xur$#dKFPq9>2!0?xOg`(8}qAoC0D}T5@W~ z2p8%%kpDWqJXvN}U!kjdYdn~(9@nn|zkC<_^Yt6=Zjs(k5$#!PLPXeV7r%H5&8*)T z;cwXu-|#+J4PHqNow%^#)xM+fw5#A-G}pd_wvIL*^LI!0w2g6`J%I@Czi4f?{A&>Z zsaX$Ca-gEY(aH--sGi^20&cv_N^x3}FuGLSfm+49y>Nn0*zmLrn;q^1>=OzDg z%MO=d;oL%w8hq0#$Mxzo|AI76C?h9Xc8D<5aETbAQ+R+peo6jS>y{nrNQA`<5Ham} zTF+9r0rVxXn|5MP;M`zmF96ynT0eu00z(bOFT`(wv>q}#Wvw?95KZ4CRXoJynInT0w)AQ*}Q^17Cfeh{dxX%i}oU~ z&Y%{(l71GiqLmM`3hPBZn86Mo&%H)<^dfM4l=A z(5g6=JKjsIn8U2JmFBTkv;z)bR!rsg{NUUHx*~AeLSC=*DGi0UOQ{@!l7qU7so#Qr zXie5cI*@9)AnPiVzTI==Ek>@8IE7z|`A2ux;rfm{QT*1}4Odx(8EdtC6NUQ2E*kC$ zhIP?aD-QG8E~9eZ=V>?^nhhh$=f7$QK0JoILxXgf`w5|bz&d1xMplLk_*F(=TRdR4 zX;?~^S9D@TmvP|LkI(OkeU`b=}nQE=^sTrc;Gyduvp7w}7>RfNOhYRm_as`Cca z06#v66OJ?PpWlPn5BlN6mL`}C3OPFOt?cWisyPvlNRbXX5_!l^9yFA1E(ZVHZRK#rLcheWR7B7 zdHnkC2>C)Q^gV6GT94v?II+t=!rp?VfM4YCYl-z^J=mr{4(fr6d^36`4*bfs$>Udr z{)idu2q>N3_5ep4WtJn&-rGY|AJSS z)$%9W&-Yyc5nG*9Ps`l;pPgSu8x3*P?q2Z9;vuesh`A@-uvhc>uW^)ZfPeJ?zY-uC zE)m218_G(d7W6|%!PPMxX)pZ|22Onj&QsO{7-n0Zf9;36sJ=hZ*>;QKCd)F#lB}T` zb7w(6d>wtBbvelZ+=EQep@-i2}( z#pK>_>*pog8c`S1D98B%M-5kwa`&KIo_{Th9wJNVd$$CvEwXHWu&tJD5h2l!+*a;f zWDdWq2_2~f9Kf-%*kc@Lw_RVC=U>R)@~Vu^5n0Kkl75-3);4kM@P8=qubW6-9|Ybs zpGh4F*KXX)oB?t_~nS_M{xG71x!;!Yld``@qq;eg>gp#ztBSgIsN4?)brP3OHX-)+(`JwxIA5} z5B*U4GzQPl+GTxjvx4E^fE&(w;9*K1Q_RZ*59!>U0`0;@QUcp=iF7hzbxL(Qa{NoX z-#o;FM-z}S&CU0PzKnXCMYt~|6a#)`xhdyR-oGIkM+wR{q*)zXY2o3p9(q-_AuikK znqF}LZKA|17AIU~nVd&c_%$6LlFWZ85v5cZAW?EH!a1HI{u%vIJLP-qTQ8%2!}W(q zqtNoB(*h3nO%&=6KcQx5TUeN5rks2KM9q0M8rB!sIUo~JFM z{t}ddtmcj#_s`p@m<3&p>6T4M-l2Y;VIMlWRj8ler{ljOu^0*jQ|cnh$^!UD)c1LsTAZK_-sJWts~oYeNQNlO4kr`Kd3{1Xk5~dL zXczRueO%rL>%M1_LpSbI7l5cn9Isu_4@0zBSbd(b`Vk)nrhrarSd@Cl`}?+`+*)Ld zRx61p%qrYaj~viGgb-y3=2n8$PV0x3GM^qvR=r<~vP1htQDqt5zUfKY)Kiz`T`ZA% z5At7aN294Pt_mAoI$$jkzQw?=W4y(wn{oc@Aeis+4)En`xXuxK?2`H&j)!A2`4?`? z7DEo|H$rglDefIs0UQ)L=G&{z&<}Aw#nHRfRS;+3>#!&|`(KyFMN)bE`XS=p>TDuc zzahbw&7+M8AX*p8oMMZPe55fjhk<9V~Jal4){ON3h%; z6B_V~hj?wJXF&{!FknG^L>du%IAT9j?)jX47($H)bjY8REIagHCaC(nUmh0YvW*U; z!f7wZ0}8`2Q5>LfTKWx%gH!RLy#MgTg$Q9>)pEkEU;+sd?4Md(gc!=%*X~vyT|vm5C1>dehE?(das%bRl-xZp9_o*N*l)ARhx!CC1LO~F>B*LOTa}FLX7r*lS3$o9Oh#3^UI2K0@+Ey&C zi5sO5oXj}COpogL?;w1r{v$m~%m$r=mTE6esy5q_TMPX6Qu8{xorOb#C>LOZx%Uj}^V)tXmS;;hV3l7H z&u4?Ue;yTyi)BT99=~k3_ZATft79q#DBXn{4a$cZ{OhDxZhQZ+I)b|qmc`08R5#OU zv3MWq@bmmDNl3%>K`q3w6m#)?x~z{nXv+GiLjA^W>Z`2p)Ytk=8BB6dj8*dgzrE`X zj;p%v=e>O^JxMF;t-MPXFz_r3d*d!<<$oC4v9DILSir@b*nrdVbe^ea;z=nZLx&KC zBvh6x-QO)re!(;95As1Pr`E5R3)b210f77)RS?I0YON{ZjIgFx$n=e zESK`3-=gQV<0k*el4LORJFg3i!&y+Hp3qUI!;J#IQI~(6iVZie&PHL ziFH`Fnfu|tN`%diMHY*fV{^J=!wuA}WcrM6&_Ri5e5$dHzF$EYHZ{)0gTZ%!ol^mS zT@9JGa>KzQj=;6yB>aKutMjRUKraXS#cZWYK|F2{Tm+nwCiKjr#wv*Y%iU;;g>Lgu zM46KW1Jgzdb`%awia(^6Wy{1I?302a*5WNdVCV0#YW(48Iwe=I+4YHab_dRN+!$Gm zpoor2tT*rQ(SYrbaMycS6qKnC@8 zdYtBRTZHi&h@K_;Sb6{l0$-0qNFbBuMRsAzaQ!QJQoK*g3z=Q7oOI!ics3*9aQmek z5)1RqmR@^`|uWx(zh0EwEBU zGqmjq!)BSWXxhO%p^Uq~rybHTEU(hRXtZ>q`9O93>(5d1nV}o4NB{ZQGxE-2(*i_} z?{m_}8?#snE^s~-?J_zraP1bvAHGS?KlB&nrZ?&uY0tnsdl#0Yy*B0Zdp{N{N1ClW z#_2h+atv-m!-C&PB2uLl&5KK1F^KLLoG*&-A)I^gpL7q8;r&(n>xB6E&SkPWJ+lpg zNlPW#op64_ka$>jebbw7jN$!XI2N0SxLGRxuyFzh-RyzxK))7x^8`tc8_n{MDmTIh z2{Y(w$6Q;tkkmrhxbC3O;mRk*XuGg2Ggj1WDd(PU9MYSOAJQGi^DB#C{QQvpYR9sH z=BJBamOnSID`zU;(>GxlHXo1N@7)XUPiZ|ZR=2jeH-C&d(((j0f=$R%0*>D!k&wSe z=wAj_IkWa+D)Mb@)t1=bLSgZOkF8*|kiWJ#yWYL4GyQn$Z^Vn@F2@{*tdXzDw)@O0 zBTmR)IvA}7uMYXN{bzI+j@>A>#~(Jak@;AazYNiba9l-OFAxl|ct*r3E}s+S9MCT3MVKK(FJrIAgrjj_wEk(w2j%zyBsV zd@tBv)|iRu?vcn4uYXywB8Cg>yGg+i3+=Ckv?q^gDsNjZ(w~{8ON~4NNb`8tO`cwW zzZ~>2jBWgWhrTi&tarn{}uEah3IvTyhFC{DP-ngYhSg2h-P#oA+RU$_}ez941vZ z2Sxx;IYf576JSX|@dSsKGJ%NV3oL;iS6uyyLJTb$65M2V6@n#M%%lWH10GI zn?V>4D+w4`N1JibI`>Q-sQvjN>@TrvHoR)Gu3{Y$a7|}hGbt~sp)TaF81)hCuWW7{ z?;63TkF1X3YGrO^pTA`DomxMp5a4ATfuh5#$Tp?D^;3$JQPa4}SDe+^e^}47^*aO0 zLlZb3`vq;ayRIgF9{ygr+Cl659^s~o92^LvHtro?H-cX&yesTQ#AdKA@JnA{Rs)BNz zWn0(pghc3X;K{|&EV;O#u|BzR^V8XmD_Q-wjAt>TU^t`<0T^vLo`VV6b z|ABkKZaPIHcpgljaF7%|;9}G3zjO04e;r0dkSfJlW$d>Mqg-HWY-FzTmnubN2DdxR zE;q*Dx5%*N>FweAm*+nOTd8BQ;g-+wCdwr)?53LaFD!fE%wdF@?8L)2J^=8t{Bi}0 zch&VTF8dL5zgOW0$W-R@`G?O45dD%We+|-qMOKv`DMwC9m|cT2_D4?8@Aoa2El*e9 z{{?R$czK4hzW^HKb{JyjT-aY#{^F_rLIExSZ2_QM?Rcl#!cKsZK)<%o^*Iik*WrH_ z_p+e@Z#+i%X3XeA{-O@iR=7N&8+KoJI%isV+2tXVV65p!y*5SsAxdEvuQX$j{F&3Tw~3EgDHz&?enzt9#UgW~D|^MSg(#0$HPy|wFK=j3zcYfj(=EPEvUhu1gp`%}JB!2;Gv zoo@yIA+IUGgejwoa?D%(vop7%O;?Sqo3#G*nOx!E^agcoFQ4b|xOmlFZMU3>xB-7* z{fn;2H}Mf(KQXQ*xaHrVod$flz18@QC-8&_O%(buepCmJ#JzF&7zvx#T#vu_{a*(u z(~edi5eKP#OH-ma#=ac^A{+DCozLIE_9z!?kxKDp%Ym7LmMd2wr8a&8V+Ascq2feoJecBCS+k~LncWcJph&Tv5TuRMS0esb8&neH-6`@Sd$o9qTF4Mxu zuYfsHmo2H3pbjOWV}nEq-sb?|H8Wm{P3n@mmX&MmnWizKzSo>y!m2k%~?N8#slkhqN?r!A_c*@Shp?&uNx4Y^YU^EX{x(v&JDs3q;oBbXIU1^Gg6(_CTNH*V4$KTmow4 zX;TR5gA~79qasqHUwi3ZsFl{Mc^VhojEt-nqb{;sAEaDN5BjYx!*W9zRx77gzm8Em zN}^JHp=i9Ldu?H6!Wh*$#M;7ofM^HhkpivsuQ}1J!++9y+wSC346>K(jz48=buY^z zMFuj2UW2-HW zwt1}rS7%Lt=wqBB0wGhoo0tot0T(34>hJF4l(-wn%t_^sS{sJu?2W0*h)v zD6`_bx4iSi7mj~$hQXuP9e?=Diu>|MXFhZM)VD(!P45*?So4gA;aV_m%}X@6fshg1 z7V>fxtW~@m$mkc28%EJfNf|PbA-V{k1`O*9na17PEO~<+AG-jgt8MYc^0|PQ1A=z2 z?CoFkjhp&f%iV+VsUUb7H%99z;YPFC+9^O-o|LQTm;zp|0YZaz@@2Y0DM_vVgo;#^ zVV0k713JD4P#Fn4U{+$E zi3v-%3c#mGag~U=*Cammh!ul5fIl7z?P9#_&rqb7PeIEmIu3bxQa-`Ggi+8Ew1(of zfD$l261rEeJk=4lSUW~an+m*aC=ZScc$onL9gHx=ml5F83wT)(^by6&{y4Ao7~A@0 zIX9#<(5M1&25XTL^i`qt=-cEIpyP(4wP2i6T<>OuH9Y~F2fWNgk9@%IBSCxpulmKj ztS*7FZ0%}OX^)n)-8?hrtz-b?8d4*C*hWU+Ww7A|$}xC;C=3Ij z6I2Qyh^@rnvP!YprrD)ivSb6~uoev$zKjXIDub7~hc;}ShsM;HQK!)k*e*dfM8#~- z$xLY3BJNv;O|zKAyvv&zia^SM;e#((Z=t}UOscQWCSC^GD;sUIzYR;nvduPkBgN0j zR5Jo8(W(0hPbn911~af#6e*!hV@cmfgJQnLV4T5aJM?|BEEe!8GG8X25P))_6loMk zfsJ)@VR^$^_e3CLmrN{Zpf&((1NCDK?8vgQtcUlqtooH2JBVkw^;wND7|p6g+cBNJ z8>gsyJ(}}Ld--Hhy@WLriyq8wCa!1yc_571hO(;gx>VBTY|Kx-r0su}ETgXK^Ln3cLi6!uljVUp%?=(?eE~f^f8J$yRRC6h z?;S726Tsh4X7xLP@Hrn`L?+DV-0F|q@OuW;d_tK3gmSeq-*f$6dElZl-lO7I|E+{W z8Bdox;R}W?QyNa;VkxsvU;}ea`IQQT=LD2m5Ua3Zsm@lFu}Wr#iJl2vHacXC`zn-L zTtt_Z*MT(2U41X>vg{1|JRVExo(`IFt{r1#G`E|!Y^e4zPnXG4VS+OW-ApGNx`e*! zw=DEj)@7;RZlkoEn~kvwn{t6oyY(7fHZdz9bY*0KultZk3P3$Um``J=tt_F!vmPon zLaFbWpO_D&9%H2rWzxna+PGJo`Cf7QjfI|4hcZeBW2m1($?6~;>qKdBhf$-0CUn`t zRQ?{CC85jXv`tG*AY~jW12wu#7%HK;4$fcUe5`WGz?d*umwEg{ZH!Pm0LD7Botx)! z%AnzS(v0(FbQ+RI7E!0V9FXlQDnul#}%NNbDYPmppEU6$VOLZ$XT5_H*- z_>Og11RzMM(PiOlZUlV{nvBa;DIVs}XhQW5e`HXS5Cq@gF1ErcN_pMWA~bRBRjWIp zUU(oByNJx^>GC_C3a|d?{Qs%TUpfB;#)Qw85&W3^gbMJ7FL+^DPU9|_rQD5Q@F&w^ z(={+%1JgAyT?5lKFkJ)FHSh;j18Tm62@~c^;t#6e(}kU`f$18Uu7T+qn68288knvD m)Ib)|d_>m{XG!8eMY1FszDULR^3g1n`FDOk!{52^xBml(CtkV$ literal 42178 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 Tp;7)FM;+krx$?49kjei6eNHWv diff --git a/fpga-xc2s30/fpga_lf.bit b/fpga-xc2s30/fpga_lf.bit index d8ff55b3210a7e7472795e7411e170dcea28889b..93a26841a35f0e01f50465fe6acfd602abd8e758 100644 GIT binary patch literal 42168 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Ξ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 Y@BP;AUzNsNXt>3D&cRAr%74iJ2d|!5u>b%7 literal 42175 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 Y@<)FAnk41;_uxzMdqyj1DZl0a3*Ltj4*&oF diff --git a/fpga-xc2s30/hi_iso14443a.v b/fpga-xc2s30/hi_iso14443a.v index 81643b8c3..c9bc64f94 100644 --- a/fpga-xc2s30/hi_iso14443a.v +++ b/fpga-xc2s30/hi_iso14443a.v @@ -222,17 +222,29 @@ reg signed [10:0] rx_mod_falling_edge_max; reg signed [10:0] rx_mod_rising_edge_max; reg curbit; -`define EDGE_DETECT_THRESHOLD 5 +`define EDGE_DETECT_THRESHOLD 3 +`define EDGE_DETECT_THRESHOLDHIGH 20 always @(negedge adc_clk) begin if(negedge_cnt[3:0] == mod_detect_reset_time) begin - // detect modulation signal: if modulating, there must have been a falling AND a rising edge - if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLD) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLD)) - curbit <= 1'b1; // modulation - else - curbit <= 1'b0; // no modulation + if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) + begin + // detect modulation signal: if modulating, there must have been a falling AND a rising edge + if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLDHIGH) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLDHIGH)) + curbit <= 1'b1; // modulation + else + curbit <= 1'b0; // no modulation + end + else + begin + // detect modulation signal: if modulating, there must have been a falling AND a rising edge + if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLD) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLD)) + curbit <= 1'b1; // modulation + else + curbit <= 1'b0; // no modulation + end // reset modulation detector rx_mod_rising_edge_max <= 0; rx_mod_falling_edge_max <= 0; From 74bb64f31666c47934d296bb7d6e491582bc1501 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 24 May 2023 07:01:33 +0200 Subject: [PATCH 452/924] formatting --- client/src/nfc/ndef.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index b0a32daec..311615c2a 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -923,7 +923,7 @@ static int ndefDecodeExternal_record(NDEFHeader_t *ndef) { ); PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "Payload [%u]...", ndef->PayloadLen); + PrintAndLogEx(INFO, "Payload [%zu]...", ndef->PayloadLen); print_hex_noascii_break(ndef->Payload, ndef->PayloadLen, 32); // do a character check? From d25f20fb109e676220f607041a3c1d10519f6a67 Mon Sep 17 00:00:00 2001 From: Jonathan Liu Date: Wed, 24 May 2023 11:03:02 +1000 Subject: [PATCH 453/924] hf mf sim: reduce 6ms threshold to 4ms for reset to idle Fixes some readers not being able to detect the simulated card on second Inventory command due to the RF field being powered off for a short time before being turned on again to reset the card to idle state. Closes #1974 --- CHANGELOG.md | 1 + armsrc/iso14443a.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5783b0f46..85593f3b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mf sim` - reduce 6ms threshold to 4ms for reset to idle #1974 (@net147) - Rebuilt the Spartan-2 `fpga_*.bit` files to include the `hi_iso14443a.v` update (@d18c7db) - Added minor orphaned change from `hi_iso14443a.v` in `fpga-xc3s100e` to `hi_iso14443a.v` in `fpga-xc2s30` (@d18c7db) - Added python3 script to convert amiibo nfc Flipper Zero files to eml files to be used with Proxmark3 (@OscarAkaElvis) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index a8cc1414b..f689d6bec 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -2084,8 +2084,8 @@ int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *par) { if (timer == 0) { timer = GetTickCount(); } else { - // 6ms no field --> card to idle state - if (GetTickCountDelta(timer) > 6) { + // 4ms no field --> card to idle state + if (GetTickCountDelta(timer) > 4) { return 2; } } From e3f4012d78a745dc2344f7fb44f1c79be3089100 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 24 May 2023 08:07:35 +0200 Subject: [PATCH 454/924] maybe proxspace gets happier --- client/src/cmdhfmf.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 8f39ca3e8..8d862b78d 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -137,15 +137,14 @@ static char *GenerateFilename(const char *prefix, const char *suffix) { static int initSectorTable(sector_t **src, size_t items) { (*src) = calloc(items, sizeof(sector_t)); - if (*src == NULL) return PM3_EMALLOC; // empty e_sector - for (int i = 0; i < items; ++i) { - for (int j = 0; j < 2; ++j) { + for (int i = 0; i < items; i++) { + for (int j = 0; j < 2; j++) { (*src)[i].Key[j] = 0xffffffffffff; - (*src)[i].foundKey[j] = false; + (*src)[i].foundKey[j] = 0; } } return PM3_SUCCESS; From 2103d695f85bcc9ae1d4ff6240bad2975861b9d7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 24 May 2023 09:13:01 +0200 Subject: [PATCH 455/924] maur keys --- client/dictionaries/mfc_default_keys.dic | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index b51989bda..7ae6ead7f 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2150,3 +2150,7 @@ D201DBB6AB6E # Data from Discord, French pool 9B7C25052FC3 494446555455 +# +# Data from Discord, seems to be related to ASSA +427553754D47 + From 5e3710c232b34a1d666b5ef812976630059da24b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 24 May 2023 14:02:54 +0200 Subject: [PATCH 456/924] rearranged for easier testing --- client/src/mifare/mifaredefault.h | 51 ++++++++++++++++--------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/client/src/mifare/mifaredefault.h b/client/src/mifare/mifaredefault.h index fe11a2a27..941abf41c 100644 --- a/client/src/mifare/mifaredefault.h +++ b/client/src/mifare/mifaredefault.h @@ -43,10 +43,36 @@ static const uint64_t g_mifare_default_keys[] = { 0xffffffffffff, // Default key (first key used by program if no user defined key) - 0x000000000000, // Blank key 0xa0a1a2a3a4a5, // NFCForum MAD key 0xd3f7d3f7d3f7, // NDEF public key 0x4b791bea7bcc, // MFC EV1 Signature B + 0xfc00018778f7, // Public Transport + 0x6471a5ef2d1a, // SimonsVoss + 0x4E3552426B32, // ID06 + 0x6A1987C40A21, // Salto + 0xef1232ab18a0, // Schlage + 0x3B7E4FD575AD, // + 0xb7bf0c13066e, // Gallagher + 0x135b88a94b8b, // Saflok + 0x2A2C13CC242A, // Dorma Kaba + 0x5a7a52d5e20d, // Bosch + 0x314B49474956, // VIGIK1 A + 0x564c505f4d41, // VIGIK1 B + 0x021209197591, // BTCINO + 0x484558414354, // Intratone + 0xEC0A9B1A9E06, // Vingcard + 0x66b31e64ca4b, // Vingcard + 0x97F5DA640B18, // Bangkok metro key + 0xA8844B0BCA06, // Metro Valencia key + 0xE4410EF8ED2D, // Armenian metro + 0x857464D3AAD1, // HTC Eindhoven key + 0x08B386463229, // troika + 0xe00000000000, // icopy + 0x199404281970, // NSP A + 0x199404281998, // NSP B + 0x6A1987C40A21, // SALTO + 0x7F33625BC129, // SALTO + 0x000000000000, // Blank key 0xb0b1b2b3b4b5, 0xaabbccddeeff, 0x1a2b3c4d5e6f, @@ -64,29 +90,6 @@ static const uint64_t g_mifare_default_keys[] = { 0x0000014b5c31, 0xb578f38a5c61, 0x96a301bce267, - 0xfc00018778f7, // Public Transport - 0x6471a5ef2d1a, // SimonsVoss - 0x4E3552426B32, // ID06 - 0x6A1987C40A21, // Salto - 0xef1232ab18a0, // Schlage - 0x3B7E4FD575AD, // - 0xb7bf0c13066e, // Gallagher - 0x135b88a94b8b, // Saflock - 0x5a7a52d5e20d, // Bosch - 0x314B49474956, // VIGIK1 A - 0x564c505f4d41, // VIGIK1 B - 0x021209197591, // BTCINO - 0x484558414354, // Intratone - 0xEC0A9B1A9E06, // Vingcard - 0x66b31e64ca4b, // Vingcard - 0x97F5DA640B18, // Bangkok metro key - 0xA8844B0BCA06, // Metro Valencia key - 0xE4410EF8ED2D, // Armenian metro - 0x857464D3AAD1, // HTC Eindhoven key - 0x08B386463229, // troika - 0xe00000000000, // icopy - 0x199404281970, // NSP A - 0x199404281998, // NSP B }; static const uint8_t g_mifare_default_key[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; From 757e53c6ac12fce80f4f11f6e89c4bedc88ee870 Mon Sep 17 00:00:00 2001 From: Davi Mikael <31720422+penegui@users.noreply.github.com> Date: Wed, 24 May 2023 09:48:00 -0300 Subject: [PATCH 457/924] removing debug statement in iso14443a --- armsrc/iso14443a.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 741440a0a..b4730b62d 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1190,11 +1190,9 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r rATQA[0] &= 0xBF; if(tagType == 11){ - rSAKc1[0] = sak & 0xFC & 0X70; - DbpString(_YELLOW_("[ ") "Passando no Sak Penegui" _YELLOW_(" ]")); + rSAKc1[0] = sak & 0xFC & 0X70; }else{ - rSAKc1[0] = sak & 0xFB; - //DbpString(_YELLOW_("[ ") "Passando no Sak Antigo" _YELLOW_(" ]")); + rSAKc1[0] = sak & 0xFB; } AddCrc14A(rSAKc1, sizeof(rSAKc1) - 2); From 416abae4bb05d250401d102c15fde5eadecbedbb Mon Sep 17 00:00:00 2001 From: Davi Mikael <31720422+penegui@users.noreply.github.com> Date: Wed, 24 May 2023 09:49:40 -0300 Subject: [PATCH 458/924] Changing token and uid of hf_msdsal --- armsrc/Standalone/hf_msdsal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index 64db3a446..b0d81ff79 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -168,7 +168,7 @@ void RunMod(void) { //Expiration date: 17/11 //Service code: 201 //Discretionary data: 0000030000991 - //char token[19] = {0x44,0x12,0x34,0x56,0x05,0x78,0x56,0x78,0xd1,0x71,0x12,0x01,0x00,0x00,0x03,0x00,0x00,0x99,0x1f}; + //char token[19] = {0x44,0x12,0x34,0x56,0x05,0x78,0x12,0x34,0xd1,0x71,0x12,0x01,0x00,0x00,0x03,0x00,0x00,0x99,0x1f}; // // It is possible to initialize directly the emulation mode, having "token" with data and set "chktoken" = true ;) // @@ -185,7 +185,7 @@ void RunMod(void) { // in case there is a read command received we shouldn't break uint8_t data[PM3_CMD_DATA_SIZE] = {0x00}; - uint8_t visauid[7] = {0x05, 0x06, 0x07, 0x08}; + uint8_t visauid[7] = {0x01, 0x02, 0x03, 0x04}; memcpy(data, visauid, 4); // to initialize the emulation From 37e5540aab52d7b57ed206b65ca71d06435e4bae Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 24 May 2023 15:43:44 +0200 Subject: [PATCH 459/924] fixed a logic error. param N is used as total number of blocks. I is using it as zero based index... --- client/src/cmdhfmf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 8d862b78d..ffc607617 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -304,7 +304,9 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { return PM3_EMALLOC; } - for (uint16_t i = 0; i < n; i++) { + // n is number of blocks, but in the loop its a zero based index. + // n = 20, i = 0-19 + for (uint16_t i = 0; i < n - 1; i++) { if (mfIsSectorTrailer(i)) { e_sector[mfSectorNum(i)].foundKey[0] = 1; e_sector[mfSectorNum(i)].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); From 1b67921086c2be20a3d6cf84ee7ec126707799a9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 24 May 2023 17:19:34 +0200 Subject: [PATCH 460/924] renaming and making sure N never is a strange number --- client/src/cmdhf14a.c | 22 ++++++--- client/src/cmdhfmf.c | 112 +++++++++++++++++++++++------------------- client/src/cmdhfmf.h | 9 ++-- 3 files changed, 79 insertions(+), 64 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index e1453be3b..0a9a23578 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -41,6 +41,7 @@ #include "atrs.h" // getATRinfo #include "desfire.h" // desfire enums #include "mifare/desfirecore.h" // desfire context +#include "mifare/mifaredefault.h" static bool g_apdu_in_framing_enable = true; bool Get_apdu_in_framing(void) { @@ -738,9 +739,6 @@ int CmdHF14ASim(const char *Cmd) { return PM3_EINVARG; } - sector_t *k_sector = NULL; - uint8_t k_sectorsCount = 40; - if (useUIDfromEML) { flags |= FLAG_UID_IN_EMUL; } @@ -761,17 +759,24 @@ int CmdHF14ASim(const char *Cmd) { SendCommandNG(CMD_HF_ISO14443A_SIMULATE, (uint8_t *)&payload, sizeof(payload)); PacketResponseNG resp; + sector_t *k_sector = NULL; + size_t k_sectors_cnt = MIFARE_4K_MAXSECTOR; + PrintAndLogEx(INFO, "Press pm3-button to abort simulation"); bool keypress = kbd_enter_pressed(); while (keypress == false) { - if (WaitForResponseTimeout(CMD_HF_MIFARE_SIMULATE, &resp, 1500) == 0) continue; - if (resp.status != PM3_SUCCESS) break; + if (WaitForResponseTimeout(CMD_HF_MIFARE_SIMULATE, &resp, 1500) == 0) + continue; - if ((flags & FLAG_NR_AR_ATTACK) != FLAG_NR_AR_ATTACK) break; + if (resp.status != PM3_SUCCESS) + break; + + if ((flags & FLAG_NR_AR_ATTACK) != FLAG_NR_AR_ATTACK) + break; nonces_t *data = (nonces_t *)resp.data.asBytes; - readerAttack(k_sector, k_sectorsCount, data[0], setEmulatorMem, verbose); + readerAttack(k_sector, k_sectors_cnt, data[0], setEmulatorMem, verbose); keypress = kbd_enter_pressed(); } @@ -783,7 +788,8 @@ int CmdHF14ASim(const char *Cmd) { } if (resp.status == PM3_EOPABORTED && ((flags & FLAG_NR_AR_ATTACK) == FLAG_NR_AR_ATTACK)) { - showSectorTable(k_sector, k_sectorsCount); + //iceman: readerAttack call frees k_sector , this call is useless. + showSectorTable(k_sector, k_sectors_cnt); } } diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index ffc607617..12799b25f 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -141,8 +141,8 @@ static int initSectorTable(sector_t **src, size_t items) { return PM3_EMALLOC; // empty e_sector - for (int i = 0; i < items; i++) { - for (int j = 0; j < 2; j++) { + for (size_t i = 0; i < items; i++) { + for (uint8_t j = 0; j < 2; j++) { (*src)[i].Key[j] = 0xffffffffffff; (*src)[i].foundKey[j] = 0; } @@ -294,19 +294,21 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { sectors = MIFARE_4K_MAXSECTOR; break; case MIFARE_1K_MAXBLOCK: + sectors = MIFARE_1K_MAXSECTOR; + break; default: sectors = MIFARE_1K_MAXSECTOR; + n = MIFARE_1K_MAXBLOCK; break; } sector_t *e_sector = calloc(sectors, sizeof(sector_t)); - if (e_sector == NULL) { + if (e_sector == NULL) { return PM3_EMALLOC; } - // n is number of blocks, but in the loop its a zero based index. - // n = 20, i = 0-19 - for (uint16_t i = 0; i < n - 1; i++) { + for (uint16_t i = 0; i < n; i++) { + if (mfIsSectorTrailer(i)) { e_sector[mfSectorNum(i)].foundKey[0] = 1; e_sector[mfSectorNum(i)].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); @@ -2380,7 +2382,7 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { // create/initialize key storage structure sector_t *e_sector = NULL; - uint32_t e_sector_cnt = (sector_cnt > sectorno) ? sector_cnt : sectorno + 1; + size_t e_sector_cnt = (sector_cnt > sectorno) ? sector_cnt : sectorno + 1; if (initSectorTable(&e_sector, e_sector_cnt) != PM3_SUCCESS) { return PM3_EMALLOC; } @@ -3151,7 +3153,7 @@ static int CmdHF14AMfChk_fast(const char *Cmd) { m1 = true; } - uint8_t sectorsCnt = 1; + uint8_t sectorsCnt = MIFARE_1K_MAXSECTOR; if (m0) { sectorsCnt = MIFARE_MINI_MAXSECTOR; } else if (m1) { @@ -3367,42 +3369,42 @@ static int CmdHF14AMfChk(const char *Cmd) { return PM3_EINVARG; } - uint8_t SectorsCnt = 1; + size_t sectors_cnt = 1; if (m0) { - SectorsCnt = MIFARE_MINI_MAXSECTOR; + sectors_cnt = MIFARE_MINI_MAXSECTOR; } else if (m1) { - SectorsCnt = MIFARE_1K_MAXSECTOR; + sectors_cnt = MIFARE_1K_MAXSECTOR; } else if (m2) { - SectorsCnt = MIFARE_2K_MAXSECTOR; + sectors_cnt = MIFARE_2K_MAXSECTOR; } else if (m4) { - SectorsCnt = MIFARE_4K_MAXSECTOR; + sectors_cnt = MIFARE_4K_MAXSECTOR; } if (singleSector) { - uint8_t MinSectorsCnt = 0; + size_t min_sectors_cnt = 0; // find a MIFARE type that can accommodate the provided block number uint8_t s = mfSectorNum(blockNo); if (s < MIFARE_MINI_MAXSECTOR) { - MinSectorsCnt = MIFARE_MINI_MAXSECTOR; + min_sectors_cnt = MIFARE_MINI_MAXSECTOR; } else if (s < MIFARE_1K_MAXSECTOR) { - MinSectorsCnt = MIFARE_1K_MAXSECTOR; + min_sectors_cnt = MIFARE_1K_MAXSECTOR; } else if (s < MIFARE_2K_MAXSECTOR) { - MinSectorsCnt = MIFARE_2K_MAXSECTOR; + min_sectors_cnt = MIFARE_2K_MAXSECTOR; } else if (s < MIFARE_4K_MAXSECTOR) { - MinSectorsCnt = MIFARE_4K_MAXSECTOR; + min_sectors_cnt = MIFARE_4K_MAXSECTOR; } else { PrintAndLogEx(WARNING, "Provided block out of possible MIFARE Type memory map"); return PM3_EINVARG; } - if (SectorsCnt == 1) { - SectorsCnt = MinSectorsCnt; - } else if (SectorsCnt < MinSectorsCnt) { + if (sectors_cnt == 1) { + sectors_cnt = min_sectors_cnt; + } else if (sectors_cnt < min_sectors_cnt) { PrintAndLogEx(WARNING, "Provided block out of provided MIFARE Type memory map"); return PM3_EINVARG; } } - if (SectorsCnt == 1) { - SectorsCnt = MIFARE_1K_MAXSECTOR; + if (sectors_cnt == 1) { + sectors_cnt = MIFARE_1K_MAXSECTOR; } uint8_t *keyBlock = NULL; @@ -3416,7 +3418,7 @@ static int CmdHF14AMfChk(const char *Cmd) { // create/initialize key storage structure sector_t *e_sector = NULL; - if (initSectorTable(&e_sector, SectorsCnt) != PM3_SUCCESS) { + if (initSectorTable(&e_sector, sectors_cnt) != PM3_SUCCESS) { free(keyBlock); return PM3_EMALLOC; } @@ -3441,7 +3443,7 @@ static int CmdHF14AMfChk(const char *Cmd) { // loop sectors but block is used as to keep track of from which blocks to test int b = blockNo; - for (int i = mfSectorNum(b); i < SectorsCnt; ++i) { + for (int i = mfSectorNum(b); i < sectors_cnt; ++i) { // skip already found keys. if (e_sector[i].foundKey[trgKeyType]) continue; @@ -3480,7 +3482,7 @@ static int CmdHF14AMfChk(const char *Cmd) { // loop sectors but block is used as to keep track of from which blocks to test int b = blockNo; - for (int i = mfSectorNum(b); i < SectorsCnt; i++) { + for (int i = mfSectorNum(b); i < sectors_cnt; i++) { // KEY A but not KEY B if (e_sector[i].foundKey[0] && !e_sector[i].foundKey[1]) { @@ -3526,13 +3528,13 @@ out: if (singleSector) printKeyTableEx(1, e_sector, mfSectorNum(blockNo)); else - printKeyTable(SectorsCnt, e_sector); + printKeyTable(sectors_cnt, e_sector); if (transferToEml) { // fast push mode g_conn.block_after_ACK = true; uint8_t block[16] = {0x00}; - for (int i = 0; i < SectorsCnt; ++i) { + for (int i = 0; i < sectors_cnt; ++i) { uint8_t blockno = mfFirstBlockOfSector(i) + mfNumBlocksPerSector(i) - 1; mfEmlGetMem(block, blockno, 1); @@ -3542,7 +3544,7 @@ out: if (e_sector[i].foundKey[1]) num_to_bytes(e_sector[i].Key[1], 6, block + 10); - if (i == SectorsCnt - 1) { + if (i == sectors_cnt - 1) { // Disable fast mode on last packet g_conn.block_after_ACK = false; } @@ -3553,7 +3555,7 @@ out: if (createDumpFile) { char *fptr = GenerateFilename("hf-mf-", "-key.bin"); - if (createMfcKeyDump(fptr, SectorsCnt, e_sector) != PM3_SUCCESS) { + if (createMfcKeyDump(fptr, sectors_cnt, e_sector) != PM3_SUCCESS) { PrintAndLogEx(ERR, "Failed to save keys to file"); } free(fptr); @@ -3574,14 +3576,14 @@ out: return PM3_SUCCESS; } -void showSectorTable(sector_t *k_sector, uint8_t k_sectors_cnt) { +void showSectorTable(sector_t *k_sector, size_t k_sectors_cnt) { if (k_sector != NULL) { printKeyTable(k_sectors_cnt, k_sector); free(k_sector); } } -void readerAttack(sector_t *k_sector, uint8_t k_sectors_cnt, nonces_t data, bool setEmulatorMem, bool verbose) { +void readerAttack(sector_t *k_sector, size_t k_sectors_cnt, nonces_t data, bool setEmulatorMem, bool verbose) { // init if needed if (k_sector == NULL) { @@ -3715,22 +3717,19 @@ static int CmdHF14AMfSim(const char *Cmd) { } CLIParserFree(ctx); - sector_t *k_sector = NULL; - //Validations if (atqalen > 0) { if (atqalen != 2) { PrintAndLogEx(WARNING, "Wrong ATQA length"); return PM3_EINVARG; - } flags |= FLAG_FORCED_ATQA; } + if (saklen > 0) { if (saklen != 1) { PrintAndLogEx(WARNING, "Wrong SAK length"); return PM3_EINVARG; - } flags |= FLAG_FORCED_SAK; } @@ -3740,7 +3739,7 @@ static int CmdHF14AMfSim(const char *Cmd) { flags |= FLAG_UID_IN_EMUL; } - uint8_t k_sectorsCount = 40; + size_t k_sectors_cnt = MIFARE_4K_MAXSECTOR; char csize[13] = { 0 }; if ((m0 + m1 + m2 + m4) > 1) { @@ -3751,19 +3750,19 @@ static int CmdHF14AMfSim(const char *Cmd) { if (m0) { flags |= FLAG_MF_MINI; snprintf(csize, sizeof(csize), "MINI"); - k_sectorsCount = MIFARE_MINI_MAXSECTOR; + k_sectors_cnt = MIFARE_MINI_MAXSECTOR; } else if (m1) { flags |= FLAG_MF_1K; snprintf(csize, sizeof(csize), "1K"); - k_sectorsCount = MIFARE_1K_MAXSECTOR; + k_sectors_cnt = MIFARE_1K_MAXSECTOR; } else if (m2) { flags |= FLAG_MF_2K; snprintf(csize, sizeof(csize), "2K with RATS"); - k_sectorsCount = MIFARE_2K_MAXSECTOR; + k_sectors_cnt = MIFARE_2K_MAXSECTOR; } else if (m4) { flags |= FLAG_MF_4K; snprintf(csize, sizeof(csize), "4K"); - k_sectorsCount = MIFARE_4K_MAXSECTOR; + k_sectors_cnt = MIFARE_4K_MAXSECTOR; } else { PrintAndLogEx(WARNING, "Please specify a MIFARE Type"); return PM3_EINVARG; @@ -3801,15 +3800,26 @@ static int CmdHF14AMfSim(const char *Cmd) { if (flags & FLAG_INTERACTIVE) { PrintAndLogEx(INFO, "Press pm3-button or send another cmd to abort simulation"); - while (!kbd_enter_pressed()) { - if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) continue; - if (!(flags & FLAG_NR_AR_ATTACK)) break; - if ((resp.oldarg[0] & 0xffff) != CMD_HF_MIFARE_SIMULATE) break; + sector_t *k_sector = NULL; + + while (kbd_enter_pressed() == 0) { + + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) + continue; + + if ((flags & FLAG_NR_AR_ATTACK) != FLAG_NR_AR_ATTACK) + break; + + if ((resp.oldarg[0] & 0xffff) != CMD_HF_MIFARE_SIMULATE) + break; + nonces_t data[1]; memcpy(data, resp.data.asBytes, sizeof(data)); - readerAttack(k_sector, k_sectorsCount, data[0], setEmulatorMem, verbose); + readerAttack(k_sector, k_sectors_cnt, data[0], setEmulatorMem, verbose); } - showSectorTable(k_sector, k_sectorsCount); + //iceman: readerAttack call frees k_sector. this call below is useless. + showSectorTable(k_sector, k_sectors_cnt); + } else { PrintAndLogEx(INFO, "Press pm3-button to abort simulation"); } @@ -3849,11 +3859,11 @@ static int CmdHF14AMfKeyBrute(const char *Cmd) { } */ -void printKeyTable(uint8_t sectorscnt, sector_t *e_sector) { +void printKeyTable(size_t sectorscnt, sector_t *e_sector) { return printKeyTableEx(sectorscnt, e_sector, 0); } -void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_sector) { +void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector) { char strA[26 + 1] = {0}; char strB[26 + 1] = {0}; char resA[20 + 1] = {0}; @@ -3867,7 +3877,7 @@ void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_secto uint64_t ndef_key = 0xD3F7D3F7D3F7; bool has_ndef_key = false; bool extended_legend = false; - for (uint8_t i = 0; i < sectorscnt; i++) { + for (size_t i = 0; i < sectorscnt; i++) { if ((e_sector[i].foundKey[0] > 1) || (e_sector[i].foundKey[1] > 1)) { extended_legend = true; @@ -4545,7 +4555,7 @@ static int CmdHF14AMfEKeyPrn(const char *Cmd) { m1 = true; } - uint8_t sectors_cnt = MIFARE_1K_MAXSECTOR; + size_t sectors_cnt = MIFARE_1K_MAXSECTOR; if (m0) { sectors_cnt = MIFARE_MINI_MAXSECTOR; diff --git a/client/src/cmdhfmf.h b/client/src/cmdhfmf.h index 62b95de4c..5c21c7fb3 100644 --- a/client/src/cmdhfmf.h +++ b/client/src/cmdhfmf.h @@ -30,11 +30,10 @@ int CmdHFMFNDEFRead(const char *Cmd); // used by "nfc mf cread" int CmdHFMFNDEFFormat(const char *Cmd); // used by "nfc mf cformat" int CmdHFMFNDEFWrite(const char *Cmd); // used by "nfc mf cwrite" -void showSectorTable(sector_t *k_sector, uint8_t k_sectors_cnt); -void readerAttack(sector_t *k_sector, uint8_t k_sectors_cnt, nonces_t data, bool setEmulatorMem, bool verbose); -void printKeyTable(uint8_t sectorscnt, sector_t *e_sector); -void printKeyTableEx(uint8_t sectorscnt, sector_t *e_sector, uint8_t start_sector); -void printKeyTable_fast(uint8_t sectorscnt, icesector_t *e_sector, uint64_t bar, uint64_t foo); +void showSectorTable(sector_t *k_sector, size_t k_sectors_cnt); +void readerAttack(sector_t *k_sector, size_t k_sectors_cnt, nonces_t data, bool setEmulatorMem, bool verbose); +void printKeyTable(size_t sectorscnt, sector_t *e_sector); +void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector); int mfc_ev1_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature_len); #endif From 832afcd0d494683ec4bcda3635e286dbcd3104a9 Mon Sep 17 00:00:00 2001 From: Angel Date: Wed, 24 May 2023 20:45:51 -0400 Subject: [PATCH 461/924] Fix help menu format --- client/src/cmdlfparadox.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 3276333d0..2885227d3 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -352,13 +352,13 @@ static int CmdParadoxSim(const char *Cmd) { CLIParserInit(&ctx, "lf paradox sim", "Enables simulation of paradox card with specified card number.\n" "Simulation runs until the button is pressed or another USB command is issued.", - "lf paradox sim --raw 0f55555695596a6a9999a59a -> simulate tag" + "lf paradox sim --raw 0f55555695596a6a9999a59a -> simulate tag\n" "lf paradox clone --fc 96 --cn 40426 -> simulate tag with fc and cn\n" ); void *argtable[] = { arg_param_begin, - arg_str0("r", "raw", "", " raw hex data. 12 bytes"), + arg_str0("r", "raw", "", "raw hex data. 12 bytes"), arg_u64_0(NULL, "fc", "", "facility code"), arg_u64_0(NULL, "cn", "", "card number"), arg_param_end From 4dc8d5316a56921b763b2aed91aae396b25de1e0 Mon Sep 17 00:00:00 2001 From: Angel Date: Wed, 24 May 2023 21:54:42 -0400 Subject: [PATCH 462/924] Make Style --- armsrc/Standalone/hf_msdsal.c | 8 +-- armsrc/iso14443a.c | 10 +-- armsrc/mifarecmd.c | 4 +- client/luascripts/hf_mf_ultimatecard.lua | 10 +-- client/src/cmdhfmf.c | 84 ++++++++++++------------ client/src/cmdhfmfp.c | 6 +- client/src/cmdlfhitag.c | 2 +- client/src/cmdlfparadox.c | 14 ++-- client/src/cmdlft55xx.c | 2 +- client/src/fileutils.c | 12 ++-- client/src/mifare/mad.c | 8 +-- client/src/nfc/ndef.c | 22 +++---- client/src/pm3line_vocabulory.h | 3 +- client/update_amiibo_tools_lua.py | 14 ++-- doc/commands.json | 76 ++++++++++++++------- doc/commands.md | 5 +- 16 files changed, 154 insertions(+), 126 deletions(-) diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index b0d81ff79..f97a2e57f 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -376,7 +376,7 @@ void RunMod(void) { // dynamic_response_info will be in charge of responses dynamic_response_info.response_n = 0; - + //Dbprintf("receivedCmd: %02x\n", receivedCmd); // received a REQUEST if (receivedCmd[0] == ISO14443A_CMD_REQA && len == 1) { @@ -399,12 +399,12 @@ void RunMod(void) { // received request for UID (cascade 1) } else if (receivedCmd[1] == 0x20 && receivedCmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && len == 2) { //DbpString(_YELLOW_("+") "Request for UID C1"); - p_response = &responses[RESP_INDEX_UIDC1]; + p_response = &responses[RESP_INDEX_UIDC1]; // received a SELECT (cascade 1) } else if (receivedCmd[1] == 0x70 && receivedCmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && len == 9) { //DbpString(_YELLOW_("+") "Request for SELECT S1"); - p_response = &responses[RESP_INDEX_SAKC1]; + p_response = &responses[RESP_INDEX_SAKC1]; // received a RATS request } else if (receivedCmd[0] == ISO14443A_CMD_RATS && len == 4) { @@ -412,7 +412,7 @@ void RunMod(void) { prevCmd = 0; //p_response = &responses[RESP_INDEX_RATS]; - static uint8_t rRATS[] = { 0x13, 0x78, 0x80, 0x72, 0x02, 0x80, 0x31, 0x80, 0x66, 0xb1, 0x84, 0x0c, 0x01, 0x6e, 0x01, 0x83, 0x00, 0x90, 0x00 }; + static uint8_t rRATS[] = { 0x13, 0x78, 0x80, 0x72, 0x02, 0x80, 0x31, 0x80, 0x66, 0xb1, 0x84, 0x0c, 0x01, 0x6e, 0x01, 0x83, 0x00, 0x90, 0x00 }; memcpy(&dynamic_response_info.response[0], rRATS, sizeof(rRATS)); dynamic_response_info.response_n = sizeof(rRATS); diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index b4730b62d..01eed12c1 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1189,12 +1189,12 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // Configure the ATQA and SAK accordingly rATQA[0] &= 0xBF; - if(tagType == 11){ - rSAKc1[0] = sak & 0xFC & 0X70; - }else{ - rSAKc1[0] = sak & 0xFB; + if (tagType == 11) { + rSAKc1[0] = sak & 0xFC & 0X70; + } else { + rSAKc1[0] = sak & 0xFB; } - + AddCrc14A(rSAKc1, sizeof(rSAKc1) - 2); *cuid = bytes_to_num(data, 4); diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 30558541d..5dd5dfcf6 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1300,7 +1300,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 break; } */ - + uint32_t nttmp = prng_successor(nt1, 100); //NXP Mifare is typical around 840,but for some unlicensed/compatible mifare card this can be 160 for (i = 101; i < 1200; i++) { nttmp = prng_successor(nttmp, 1); @@ -1354,7 +1354,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 LED_C_ON(); // get crypted nonces for target sector - for (i = 0; ((i < 2) && (isOK == PM3_SUCCESS)); i++) { + for (i = 0; ((i < 2) && (isOK == PM3_SUCCESS)); i++) { // look for exactly two different nonces diff --git a/client/luascripts/hf_mf_ultimatecard.lua b/client/luascripts/hf_mf_ultimatecard.lua index 09b53937f..4bb6034ee 100644 --- a/client/luascripts/hf_mf_ultimatecard.lua +++ b/client/luascripts/hf_mf_ultimatecard.lua @@ -50,20 +50,20 @@ arguments = [[ -c read magic configuration -u UID (8-20 hexsymbols), set UID on tag -t tag type to impersonate - 1 = Mifare Mini S20 4-byte + 1 = Mifare Mini S20 4-byte 2 = Mifare Mini S20 7-byte 15 = NTAG 210 3 = Mifare Mini S20 10-byte 16 = NTAG 212 4 = Mifare 1k S50 4-byte 17 = NTAG 213 5 = Mifare 1k S50 7-byte 18 = NTAG 215 - 6 = Mifare 1k S50 10-byte 19 = NTAG 216 + 6 = Mifare 1k S50 10-byte 19 = NTAG 216 7 = Mifare 4k S70 4-byte 20 = NTAG I2C 1K 8 = Mifare 4k S70 7-byte 21 = NTAG I2C 2K 9 = Mifare 4k S70 10-byte 22 = NTAG I2C 1K PLUS *** 10 = UL - NOT WORKING FULLY 23 = NTAG I2C 2K PLUS *** 11 = UL-C - NOT WORKING FULLY 24 = NTAG 213F 12 = UL EV1 48b 25 = NTAG 216F - 13 = UL EV1 128b - *** 14 = UL Plus - NOT WORKING YET + 13 = UL EV1 128b + *** 14 = UL Plus - NOT WORKING YET -p NTAG password (8 hexsymbols), set NTAG password on tag. -a NTAG pack ( 4 hexsymbols), set NTAG pack on tag. @@ -297,7 +297,7 @@ return true, 'Ok' end --- -- calculate block0 -local function calculate_block0(useruid) +local function calculate_block0(useruid) local uidbytes = utils.ConvertHexToBytes(useruid) local i = 1 local bcc = bxor(uidbytes[i], uidbytes[i+1]); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 12799b25f..17ad30184 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -439,7 +439,7 @@ static int mf_analyse_st_block(uint8_t blockno, uint8_t *block, bool force) { * @param numSectors: size of the card * @param keyFileName: filename containing keys or NULL. */ -static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t numSectors, char *keyfn){ +static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t numSectors, char *keyfn) { // Select card to get UID/UIDLEN/ATQA/SAK information clearCommandBuffer(); @@ -472,7 +472,7 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n size_t alen = 0, blen = 0; uint8_t *keyA, *keyB; - if (loadFileBinaryKey(keyfn, "", (void**)&keyA, (void**)&keyB, &alen, &blen) != PM3_SUCCESS) { + if (loadFileBinaryKey(keyfn, "", (void **)&keyA, (void **)&keyB, &alen, &blen) != PM3_SUCCESS) { if (keyA) { free(keyA); } @@ -562,7 +562,7 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); } else { // data block. Check if it can be read with key A or key B - if ((rights[sectorNo][data_area] == 0x03) || (rights[sectorNo][data_area] == 0x05)) { + if ((rights[sectorNo][data_area] == 0x03) || (rights[sectorNo][data_area] == 0x05)) { // only key B would work payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; payload.keytype = MF_KEY_B; @@ -572,7 +572,7 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); } else { - // key A would work + // key A would work payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; payload.keytype = current_key; memcpy(payload.key, (current_key == MF_KEY_A) ? keyA + (sectorNo * MIFARE_KEY_SIZE) : keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); @@ -604,9 +604,9 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n uint8_t *data = resp.data.asBytes; - if (mfIsSectorTrailer(blockNo)) { + if (mfIsSectorTrailer(blockNo)) { // sector trailer. Fill in the keys. - memcpy(data , keyA + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + memcpy(data, keyA + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); memcpy(data + 10, keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); } @@ -1051,7 +1051,7 @@ static int CmdHF14AMfDump(const char *Cmd) { } else if (m2) { numSectors = MIFARE_2K_MAXSECTOR; bytes = MIFARE_2K_MAX_BYTES; - } else if (m4) { + } else if (m4) { numSectors = MIFARE_4K_MAXSECTOR; bytes = MIFARE_4K_MAX_BYTES; } else { @@ -3809,7 +3809,7 @@ static int CmdHF14AMfSim(const char *Cmd) { if ((flags & FLAG_NR_AR_ATTACK) != FLAG_NR_AR_ATTACK) break; - + if ((resp.oldarg[0] & 0xffff) != CMD_HF_MIFARE_SIMULATE) break; @@ -3919,11 +3919,11 @@ void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector } PrintAndLogEx(SUCCESS, " " _YELLOW_("%03d") " | %03d | %s | %s | %s | %s" - , s - , mfSectorTrailerOfSector(s) - , strA, resA - , strB, resB - ); + , s + , mfSectorTrailerOfSector(s) + , strA, resA + , strB, resB + ); } PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); @@ -6656,7 +6656,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { return PM3_EINVARG; } - #define SUPER_MAX_TRACES 7 +#define SUPER_MAX_TRACES 7 uint8_t trace = 0; uint8_t traces[SUPER_MAX_TRACES][16]; @@ -7928,24 +7928,24 @@ static int CmdHF14AMfValue(const char *Cmd) { "hf mf value --blk 16 -k FFFFFFFFFFFF -b --get\n" "hf mf value --blk 16 -k FFFFFFFFFFFF --res --transfer 30 --tk FFFFFFFFFFFF --> transfer block 16 value to block 30 (even if block can't be incremented by ACL)\n" "hf mf value --get -d 87D612007829EDFF87D6120011EE11EE\n" - ); + ); void *argtable[] = { - arg_param_begin, - arg_str0("k", "key", "", "key, 6 hex bytes"), - arg_lit0("a", NULL, "input key type is key A (def)"), - arg_lit0("b", NULL, "input key type is key B"), - arg_u64_0(NULL, "inc", "", "Increment value by X (0 - 2147483647)"), - arg_u64_0(NULL, "dec", "", "Decrement value by X (0 - 2147483647)"), - arg_u64_0(NULL, "set", "", "Set value to X (-2147483647 - 2147483647)"), - arg_u64_0(NULL, "transfer", "", "Transfer value to other block (after inc/dec/restore)"), - arg_str0(NULL, "tkey", "", "transfer key, 6 hex bytes (if transfer is preformed to other sector)"), - arg_lit0(NULL, "ta", "transfer key type is key A (def)"), - arg_lit0(NULL, "tb", "transfer key type is key B"), - arg_lit0(NULL, "get", "Get value from block"), - arg_lit0(NULL, "res", "Restore (copy value to card buffer, should be used with --transfer)"), - arg_int0(NULL, "blk", "", "block number"), - arg_str0("d", "data", "", "block data to extract values from (16 hex bytes)"), - arg_param_end + arg_param_begin, + arg_str0("k", "key", "", "key, 6 hex bytes"), + arg_lit0("a", NULL, "input key type is key A (def)"), + arg_lit0("b", NULL, "input key type is key B"), + arg_u64_0(NULL, "inc", "", "Increment value by X (0 - 2147483647)"), + arg_u64_0(NULL, "dec", "", "Decrement value by X (0 - 2147483647)"), + arg_u64_0(NULL, "set", "", "Set value to X (-2147483647 - 2147483647)"), + arg_u64_0(NULL, "transfer", "", "Transfer value to other block (after inc/dec/restore)"), + arg_str0(NULL, "tkey", "", "transfer key, 6 hex bytes (if transfer is preformed to other sector)"), + arg_lit0(NULL, "ta", "transfer key type is key A (def)"), + arg_lit0(NULL, "tb", "transfer key type is key B"), + arg_lit0(NULL, "get", "Get value from block"), + arg_lit0(NULL, "res", "Restore (copy value to card buffer, should be used with --transfer)"), + arg_int0(NULL, "blk", "", "block number"), + arg_str0("d", "data", "", "block data to extract values from (16 hex bytes)"), + arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -8002,7 +8002,7 @@ static int CmdHF14AMfValue(const char *Cmd) { // Action: 0 Increment, 1 - Decrement, 2 - Restore, 3 - Set, 4 - Get, 5 - Decode from data // iceman: TODO - should be enum - uint8_t action = 4; + uint8_t action = 4; uint32_t value = 0; // Need to check we only have 1 of inc/dec/set and get the value from the selected option @@ -8073,10 +8073,10 @@ static int CmdHF14AMfValue(const char *Cmd) { } // don't want to write value data and break something - if ((blockno == 0) || - (mfIsSectorTrailer(blockno)) || - (trnval == 0) || - (trnval != -1 && mfIsSectorTrailer(trnval))) { + if ((blockno == 0) || + (mfIsSectorTrailer(blockno)) || + (trnval == 0) || + (trnval != -1 && mfIsSectorTrailer(trnval))) { PrintAndLogEx(WARNING, "invalid block number, should be a data block"); return PM3_EINVARG; } @@ -8094,7 +8094,7 @@ static int CmdHF14AMfValue(const char *Cmd) { memcpy(block, (uint8_t *)&value, 4); uint8_t cmddata[34]; - memcpy(cmddata, key, sizeof(key)); + memcpy(cmddata, key, sizeof(key)); // Key == 6 data went to 10, so lets offset 9 for inc/dec if (action == 0) { @@ -8105,13 +8105,13 @@ static int CmdHF14AMfValue(const char *Cmd) { } // 00 if increment, 01 if decrement, 02 if restore - cmddata[9] = action; - + cmddata[9] = action; + if (trnval != -1) { // transfer to block - cmddata[10] = trnval; - + cmddata[10] = trnval; + memcpy(cmddata + 27, transferkey, sizeof(transferkey)); if (mfSectorNum(trnval) != mfSectorNum(blockno)) { cmddata[33] = 1; // should send nested auth @@ -8164,7 +8164,7 @@ static int CmdHF14AMfValue(const char *Cmd) { if (isok) { PrintAndLogEx(SUCCESS, "Update ... : " _GREEN_("success")); - getval = true; + getval = true; // all ok so set flag to read current value } else { PrintAndLogEx(FAILED, "Update ... : " _RED_("failed")); diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index b079e15c1..4f956d3af 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1006,7 +1006,7 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA for (uint8_t keyAB = startKeyAB; keyAB <= endKeyAB; keyAB++) { // main cycle with key check for (int i = 0; i < keyListLen; i++) { - + // allow client abort every iteration if (kbd_enter_pressed()) { PrintAndLogEx(WARNING, "\naborted via keyboard!\n"); @@ -1052,14 +1052,14 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA selectCard = true; msleep(50); - // break out from keylist check loop, + // break out from keylist check loop, break; } if (verbose) PrintAndLogEx(WARNING, "\nsector %02d key %d [%s] res: %d", sector, keyAB, sprint_hex_inrow(keyList[i], 16), res); - // RES can be: + // RES can be: // PM3_ERFTRANS -7 // PM3_EWRONGANSWER -16 if (res == PM3_ERFTRANS) { diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 23b8ac235..8cd28b842 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -338,7 +338,7 @@ static void printHitag2PaxtonDowngrade(const uint8_t *data) { bytes = (bytes * 0x100) + data[i]; } - for (int j = 0; j< 8; j++) { + for (int j = 0; j < 8; j++) { num = bytes & mask; skip -= 5; mask = mask >> 5; diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 2885227d3..650a8c5c4 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -48,7 +48,7 @@ static int CmdHelp(const char *Cmd); // This function will calculate the bitstream for a paradox card and place the result in bs. // It returns the calculated CRC from the fc and cn. // CRC calculation by mwalker33 -static uint8_t GetParadoxBits(const uint32_t fc, const uint32_t cn, unsigned int *bs){ +static uint8_t GetParadoxBits(const uint32_t fc, const uint32_t cn, unsigned int *bs) { uint8_t manchester[13] = { 0x00 }; // check size needed uint32_t t1; @@ -180,9 +180,9 @@ int demodParadox(bool verbose) { uint32_t rawHi2 = bytebits_to_byte(bits + idx, 32); uint32_t blocks[4] = {0}; - uint8_t crc = GetParadoxBits(fc,cardnum,blocks); - if(chksum != crc) - PrintAndLogEx(ERR,"CRC Error! Calculated CRC is " _GREEN_("%d") " but card CRC is " _RED_("%d") ".",crc,chksum); + uint8_t crc = GetParadoxBits(fc, cardnum, blocks); + if (chksum != crc) + PrintAndLogEx(ERR, "CRC Error! Calculated CRC is " _GREEN_("%d") " but card CRC is " _RED_("%d") ".", crc, chksum); PrintAndLogEx(INFO, "Paradox - ID: " _GREEN_("%x%08x") " FC: " _GREEN_("%d") " Card: " _GREEN_("%d") ", Checksum: %02x, Raw: %08x%08x%08x", @@ -291,7 +291,7 @@ static int CmdParadoxClone(const char *Cmd) { return PM3_EINVARG; } - if (fc > 999 || cn > 99999){ + if (fc > 999 || cn > 99999) { PrintAndLogEx(FAILED, "FC has a max value of 999 and CN has a max value of 99999"); return PM3_EINVARG; } @@ -379,7 +379,7 @@ static int CmdParadoxSim(const char *Cmd) { return PM3_EINVARG; } - if (fc > 999 || cn > 99999){ + if (fc > 999 || cn > 99999) { PrintAndLogEx(FAILED, "FC has a max value of 999 and CN has a max value of 99999"); return PM3_EINVARG; } @@ -390,7 +390,7 @@ static int CmdParadoxSim(const char *Cmd) { } } else { uint32_t blocks[4] = {0}; - GetParadoxBits(fc,cn,blocks); + GetParadoxBits(fc, cn, blocks); for (uint8_t i = 1; i < ARRAYLEN(blocks); i++) { num_to_bytes(blocks[i], sizeof(uint32_t), raw + ((i - 1) * 4)); } diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 554658c9f..ffb90513b 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -4028,7 +4028,7 @@ static int CmdT55xxSniff(const char *Cmd) { if (use_graphbuf == false) { // make loop to call sniff with skip samples.. - // then build it up by adding + // then build it up by adding CmdLFSniff(""); } diff --git a/client/src/fileutils.c b/client/src/fileutils.c index bb9c7635e..3c904ac70 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -316,9 +316,9 @@ int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, s int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *), savePaths_t e_save_path) { if (ftype != jsfCustom) { - if (data == NULL || datalen == 0) { - return PM3_EINVARG; - } + if (data == NULL || datalen == 0) { + return PM3_EINVARG; + } } char *fileName = newfilenamemcopyEx(preferredName, ".json", e_save_path); @@ -2032,8 +2032,8 @@ int searchFile(char **foundpath, const char *pm3dir, const char *searchname, con PrintAndLogEx(FAILED, "Error - can't find `" _YELLOW_("%s") "`", filename); } } - free(filename); - return res; + free(filename); + return res; } int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumplen) { @@ -2067,7 +2067,7 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl } case MCT: { res = loadFileMCT_safe(fn, pdump, dumplen); - break; + break; } } diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 49d3de065..328c2e63c 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -424,8 +424,8 @@ int DetectHID(uint8_t *d, uint16_t manufacture) { int convert_mad_to_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen) { - if (in == NULL || out == NULL || ilen == 0 ) { - return PM3_EINVARG; + if (in == NULL || out == NULL || ilen == 0) { + return PM3_EINVARG; } // MAD detection @@ -464,8 +464,8 @@ int convert_mad_to_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen) // copy to out (skip ST) memcpy(out, tmp, sizeof(tmp) - MFBLOCK_SIZE); out += sizeof(tmp) - MFBLOCK_SIZE; - *olen += sizeof(tmp) -MFBLOCK_SIZE; + *olen += sizeof(tmp) - MFBLOCK_SIZE; } } return PM3_SUCCESS; -} \ No newline at end of file +} diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index 311615c2a..09ff31945 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -313,7 +313,7 @@ static int ndefDecodeSig1(uint8_t *sig, size_t siglen) { if (sigType == stECDSA_P256) { slen = 32; } - + PrintAndLogEx(SUCCESS, "\tSignature [%u]...", intsiglen); print_hex_noascii_break(&sig[indx], intsiglen, 32); @@ -508,7 +508,7 @@ static int ndefDecodePayloadHandoverRequest(uint8_t *payload, size_t len) { PrintAndLogEx(INFO, _CYAN_("Handover Request")); uint8_t *p = payload; uint8_t major = (*(p) >> 4) & 0x0F; - uint8_t minor = *(p) & 0x0F; + uint8_t minor = *(p) & 0x0F; p++; PrintAndLogEx(INFO, "Version....... " _YELLOW_("%u.%u"), major, minor); @@ -866,7 +866,7 @@ static int ndefDecodeMime_bt(NDEFHeader_t *ndef) { uint8_t rev[6] = {0}; reverse_array_copy(ndef->Payload + 2, 6, rev); PrintAndLogEx(INFO, "BT MAC.......... " _YELLOW_("%s"), sprint_hex(rev, sizeof(rev))); - + // Let's check payload[8]. Tells us a bit about the UUID's. If 0x07 then it tells us a service UUID is 128bit switch (ndef->Payload[8]) { case 0x02: @@ -903,29 +903,29 @@ static int ndefDecodeMime_bt(NDEFHeader_t *ndef) { return PM3_SUCCESS; } -// https://raw.githubusercontent.com/haldean/ndef/master/docs/NFCForum-TS-RTD_1.0.pdf +// https://raw.githubusercontent.com/haldean/ndef/master/docs/NFCForum-TS-RTD_1.0.pdf static int ndefDecodeExternal_record(NDEFHeader_t *ndef) { - + if (ndef->TypeLen == 0) { PrintAndLogEx(INFO, "no type"); return PM3_SUCCESS; } - + if (ndef->PayloadLen == 0) { PrintAndLogEx(INFO, "no payload"); return PM3_SUCCESS; } PrintAndLogEx(INFO - , " URN... " _GREEN_("urn:nfc:ext:%.*s") - , (int)ndef->TypeLen - , ndef->Type - ); + , " URN... " _GREEN_("urn:nfc:ext:%.*s") + , (int)ndef->TypeLen + , ndef->Type + ); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "Payload [%zu]...", ndef->PayloadLen); print_hex_noascii_break(ndef->Payload, ndef->PayloadLen, 32); - + // do a character check? if (!strncmp((char *)ndef->Type, "pilet.ee:ekaart:2", ndef->TypeLen)) { PrintAndLogEx(NORMAL, ""); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index e6d6dc438..ffe9c66ff 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -360,7 +360,8 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mf gsave" }, { 0, "hf mf gsetblk" }, { 0, "hf mf gview" }, - { 0, "hf mf gdmconfig" }, + { 0, "hf mf gdmcfg" }, + { 0, "hf mf gdmsetcfg" }, { 0, "hf mf gdmsetblk" }, { 0, "hf mf ndefformat" }, { 0, "hf mf ndefread" }, diff --git a/client/update_amiibo_tools_lua.py b/client/update_amiibo_tools_lua.py index 873a6e18d..8a31b9d60 100644 --- a/client/update_amiibo_tools_lua.py +++ b/client/update_amiibo_tools_lua.py @@ -8,15 +8,15 @@ Author: Cory Solovewicz Description: This is a python script to automate what the updating of the amiibo_tools.lua -file which holds a lua table of all known amiibos. Previously updating the +file which holds a lua table of all known amiibos. Previously updating the amiibo_tools.lua was a very manual process. -This script automates the following original command: +This script automates the following original command: curl https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/database/amiibo.json | jq 'del(.amiibos[].release)' | jq 'del(.characters)' | pbcopy --> transform to table -And outputs the formatted file as amiibo_tools.lua -If everything goes well, this should be an updated copy of amiibo_tools.lua -which can then be placed in the /lualibs/ directory. -The temporary amiibo.json file is then deleted +And outputs the formatted file as amiibo_tools.lua +If everything goes well, this should be an updated copy of amiibo_tools.lua +which can then be placed in the /lualibs/ directory. +The temporary amiibo.json file is then deleted Dependencies: python3 -m pip install jq @@ -25,7 +25,7 @@ How to run: python update_amiibo_tools_lua.py The script will create the file amiibo_tools.lua -After running, manually backup the original /lualibs/amiibo_tools.lua and move the +After running, manually backup the original /lualibs/amiibo_tools.lua and move the updated amiibo_tools.lua to the /lualibs/ directory. ----------------------------------------------------------------------------- """ diff --git a/doc/commands.json b/doc/commands.json index f8712fc47..4e8f0fd90 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -1354,9 +1354,10 @@ "offline": false, "options": [ "-h, --help This help", - "-f, --file (optional) filename, if no UID will be used as filename" + "-f, --file (optional) filename, if no UID will be used as filename", + "--ns no save to file" ], - "usage": "hf 14b dump [-h] [-f ]" + "usage": "hf 14b dump [-h] [-f ] [--ns]" }, "hf 14b help": { "command": "hf 14b help", @@ -4218,9 +4219,10 @@ "--mini MIFARE Classic Mini / S20", "--1k MIFARE Classic 1k / S50 (def)", "--2k MIFARE Classic/Plus 2k", - "--4k MIFARE Classic 4k / S70" + "--4k MIFARE Classic 4k / S70", + "--ns no save to file" ], - "usage": "hf mf dump [-h] [-f ] [-k ] [--mini] [--1k] [--2k] [--4k]" + "usage": "hf mf dump [-h] [-f ] [-k ] [--mini] [--1k] [--2k] [--4k] [--ns]" }, "hf mf ecfill": { "command": "hf mf ecfill", @@ -4400,18 +4402,18 @@ ], "usage": "hf mf fchk [-h] [-k ]... [--mini] [--1k] [--2k] [--4k] [--emu] [--dump] [--mem] [-f ]" }, - "hf mf gdmconfig": { - "command": "hf mf gdmconfig", + "hf mf gdmcfg": { + "command": "hf mf gdmcfg", "description": "Get configuration data from magic gen4 GDM card.", "notes": [ - "hf mf gdmconfig" + "hf mf gdmcfg" ], "offline": false, "options": [ "-h, --help This help", "-k, --key key 6 bytes" ], - "usage": "hf mf gdmconfig [-h] [-k ]" + "usage": "hf mf gdmcfg [-h] [-k ]" }, "hf mf gdmsetblk": { "command": "hf mf gdmsetblk", @@ -4431,6 +4433,19 @@ ], "usage": "hf mf gdmsetblk [-hab] --blk [-d ] [-k ] [--force]" }, + "hf mf gdmsetcfg": { + "command": "hf mf gdmsetcfg", + "description": "Set configuration data on a magic gen4 GDM card", + "notes": [ + "hf mf gdmsetcfg -d 850000000000000000005A5A00000008" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-d, --data bytes to write, 16 hex bytes" + ], + "usage": "hf mf gdmsetcfg [-h] -d " + }, "hf mf gen3blk": { "command": "hf mf gen3blk", "description": "Overwrite full manufacturer block for magic Gen3 card - You can specify part of manufacturer block as 4/7-bytes for UID change only", @@ -4902,6 +4917,7 @@ "hf mf value --blk 16 -k FFFFFFFFFFFF --inc 10", "hf mf value --blk 16 -k FFFFFFFFFFFF -b --dec 10", "hf mf value --blk 16 -k FFFFFFFFFFFF -b --get", + "hf mf value --blk 16 -k FFFFFFFFFFFF --res --transfer 30 --tk FFFFFFFFFFFF -> transfer block 16 value to block 30 (even if block can't be incremented by ACL)", "hf mf value --get -d 87D612007829EDFF87D6120011EE11EE" ], "offline": true, @@ -4910,14 +4926,19 @@ "-k, --key key, 6 hex bytes", "-a input key type is key A (def)", "-b input key type is key B", - "--inc Incremenet value by X (0 - 2147483647)", - "--dec Dcrement value by X (0 - 2147483647)", + "--inc Increment value by X (0 - 2147483647)", + "--dec Decrement value by X (0 - 2147483647)", "--set Set value to X (-2147483647 - 2147483647)", + "--transfer Transfer value to other block (after inc/dec/restore)", + "--tkey transfer key, 6 hex bytes (if transfer is preformed to other sector)", + "--ta transfer key type is key A (def)", + "--tb transfer key type is key B", "--get Get value from block", + "--res Restore (copy value to card buffer, should be used with --transfer)", "--blk block number", "-d, --data block data to extract values from (16 hex bytes)" ], - "usage": "hf mf value [-hab] [-k ] [--inc ] [--dec ] [--set ] [--get] [--blk ] [-d ]" + "usage": "hf mf value [-hab] [-k ] [--inc ] [--dec ] [--set ] [--transfer ] [--tkey ] [--ta] [--tb] [--get] [--res] [--blk ] [-d ]" }, "hf mf view": { "command": "hf mf view", @@ -6146,7 +6167,7 @@ }, "hf mfp commitp": { "command": "hf mfp commitp", - "description": "Executes Commit Perso command. Can be used in SL0 mode only.", + "description": "Executes Commit Perso command. Can be used in SL0 mode only. OBS! This command will not be executed if CardConfigKey, CardMasterKey and L3SwitchKey AES keys are not written.", "notes": [ "hf mfp commitp" ], @@ -6246,9 +6267,9 @@ "-b, --keyb Use key B (def: keyA)", "-p, --plain Plain communication mode between reader and card", "--blk <0..255> Block number", - "--key Key, 16 hex bytes" + "-k, --key Key, 16 hex bytes" ], - "usage": "hf mfp rdbl [-hvbp] [-n ] --blk <0..255> [--key ]" + "usage": "hf mfp rdbl [-hvbp] [-n ] --blk <0..255> [-k ]" }, "hf mfp rdsc": { "command": "hf mfp rdsc", @@ -6335,9 +6356,10 @@ "-k, --key Key for authentication (UL-C 16 bytes, EV1/NTAG 4 bytes)", "-l Swap entered key's endianness", "-p, --page Manually set start page number to start from", - "-q, --qty Manually set number of pages to dump" + "-q, --qty Manually set number of pages to dump", + "--ns no save to file" ], - "usage": "hf mfu dump [-hl] [-f ] [-k ] [-p ] [-q ]" + "usage": "hf mfu dump [-hl] [-f ] [-k ] [-p ] [-q ] [--ns]" }, "hf mfu eload": { "command": "hf mfu eload", @@ -6565,7 +6587,7 @@ }, "hf mfu tamper": { "command": "hf mfu tamper", - "description": "Set the congiguration of the NTAG 213TT tamper feature Supports: NTAG 213TT", + "description": "Set the configuration of the NTAG 213TT tamper feature Supports: NTAG 213TT", "notes": [ "hf mfu tamper -e -> enable tamper feature", "hf mfu tamper -d -> disable tamper feature", @@ -9610,7 +9632,7 @@ "command": "lf paradox clone", "description": "clone a paradox tag to a T55x7, Q5/T5555 or EM4305/4469 tag.", "notes": [ - "lf paradox clone --fc 96 --cn 40426 -> encode for T55x7 tag with fc and cn", + "lf paradox clone --fc 96 --cn 40426 [--q5|--em] -> encode for T55x7 tag with fc and cn", "lf paradox clone --raw 0f55555695596a6a9999a59a -> encode for T55x7 tag", "lf paradox clone --raw 0f55555695596a6a9999a59a --q5 -> encode for Q5/T5555 tag", "lf paradox clone --raw 0f55555695596a6a9999a59a --em -> encode for EM4305/4469" @@ -9663,14 +9685,17 @@ "command": "lf paradox sim", "description": "Enables simulation of paradox card with specified card number. Simulation runs until the button is pressed or another USB command is issued.", "notes": [ - "lf paradox sim --raw 0f55555695596a6a9999a59a" + "lf paradox sim --raw 0f55555695596a6a9999a59a -> simulate tag", + "lf paradox clone --fc 96 --cn 40426 -> simulate tag with fc and cn" ], "offline": false, "options": [ "-h, --help This help", - "-r, --raw raw hex data. 12 bytes" + "-r, --raw raw hex data. 12 bytes", + "--fc facility code", + "--cn card number" ], - "usage": "lf paradox sim [-h] [-r ]" + "usage": "lf paradox sim [-h] [-r ] [--fc ] [--cn ]" }, "lf pcf7931 config": { "command": "lf pcf7931 config", @@ -10199,12 +10224,13 @@ "-f, --file filename (default is generated on blk 0)", "-o, --override override, force pwd read despite danger to card", "-p, --pwd password (4 hex bytes)", + "--ns no save", "--r0 downlink - fixed bit length", "--r1 downlink - long leading reference", "--r2 downlink - leading zero", "--r3 downlink - 1 of 4 coding reference" ], - "usage": "lf t55xx dump [-ho] [-f ] [-p ] [--r0] [--r1] [--r2] [--r3]" + "usage": "lf t55xx dump [-ho] [-f ] [-p ] [--ns] [--r0] [--r1] [--r2] [--r3]" }, "lf t55xx help": { "command": "lf t55xx help", @@ -11987,8 +12013,8 @@ } }, "metadata": { - "commands_extracted": 754, + "commands_extracted": 755, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-03-26T15:04:49" + "extracted_on": "2023-05-25T01:54:13" } -} +} \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 487cea0c9..c11a548e8 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -523,7 +523,8 @@ Check column "offline" for their availability. |`hf mf gsave `|N |`Save dump from card into file or emulator` |`hf mf gsetblk `|N |`Write block to card` |`hf mf gview `|N |`View card` -|`hf mf gdmconfig `|N |`Read config block from card` +|`hf mf gdmcfg `|N |`Read config block from card` +|`hf mf gdmsetcfg `|N |`Write config block to card` |`hf mf gdmsetblk `|N |`Write block to card` |`hf mf ndefformat `|N |`Format MIFARE Classic Tag as NFC Tag` |`hf mf ndefread `|N |`Read and print NDEF records from card` @@ -568,7 +569,7 @@ Check column "offline" for their availability. |`hf mfu restore `|N |`Restore a dump onto a MFU MAGIC tag` |`hf mfu view `|Y |`Display content from tag dump file` |`hf mfu wrbl `|N |`Write block` -|`hf mfu tamper `|N |`Cofigure the tamper feature on an NTAG 213TT` +|`hf mfu tamper `|N |`Configure the tamper feature on an NTAG 213TT` |`hf mfu eload `|N |`Load Ultralight dump file into emulator memory` |`hf mfu esave `|N |`Save Ultralight dump file from emulator memory` |`hf mfu eview `|N |`View emulator memory` From 0606388e03ae9ca99320e3f5583fc88caf7a3b6d Mon Sep 17 00:00:00 2001 From: Angel Date: Wed, 24 May 2023 22:02:20 -0400 Subject: [PATCH 463/924] Updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85593f3b2..f5f2103ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added possible Paxton id to hitag2 tag info output - Changed `hf mf sim` - reduce 50ms threshold to 6ms for reset to idle #1974 (@net147) - Update `amiibo_tools.lua` with new identifiers and create a python script `update_amiibo_tools_lua.py` to automate the process in the future. (@CorySolovewicz) + - Added `lf paradox sim --fc --cn` - Simulates Paradox fob from facility code and card number (jerji) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) From 9ee7bd29365888e05d3d184dd6071a9969f31c10 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 25 May 2023 07:15:43 +0200 Subject: [PATCH 464/924] adjust potential type conversion --- client/src/cmdhfmf.c | 1 - client/src/mifare/mifare4.c | 10 +++++----- client/src/mifare/mifare4.h | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 12799b25f..335898ef1 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -308,7 +308,6 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { } for (uint16_t i = 0; i < n; i++) { - if (mfIsSectorTrailer(i)) { e_sector[mfSectorNum(i)].foundKey[0] = 1; e_sector[mfSectorNum(i)].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); diff --git a/client/src/mifare/mifare4.c b/client/src/mifare/mifare4.c index f42111ba8..ec8d1a6bf 100644 --- a/client/src/mifare/mifare4.c +++ b/client/src/mifare/mifare4.c @@ -530,7 +530,7 @@ uint8_t mfSectorTrailerOfSector(uint8_t sectorNo) { } // assumes blockno is 0-255.. -uint8_t mfSectorTrailer(uint8_t blockNo) { +uint8_t mfSectorTrailer(uint16_t blockNo) { if (blockNo < 32 * 4) { return (blockNo | 0x03); } else { @@ -539,15 +539,15 @@ uint8_t mfSectorTrailer(uint8_t blockNo) { } // assumes blockno is 0-255.. -bool mfIsSectorTrailer(uint8_t blockNo) { +bool mfIsSectorTrailer(uint16_t blockNo) { return (blockNo == mfSectorTrailer(blockNo)); } // assumes blockno is 0-255.. -uint8_t mfSectorNum(uint8_t blockNo) { +uint8_t mfSectorNum(uint16_t blockNo) { if (blockNo < 32 * 4) - return blockNo / 4; + return (blockNo / 4); else - return 32 + (blockNo - 32 * 4) / 16; + return (32 + (blockNo - 32 * 4) / 16); } diff --git a/client/src/mifare/mifare4.h b/client/src/mifare/mifare4.h index 489add9f3..80d55db7b 100644 --- a/client/src/mifare/mifare4.h +++ b/client/src/mifare/mifare4.h @@ -77,9 +77,9 @@ const char *mfGetAccessConditionsDesc(uint8_t blockn, const uint8_t *data); uint8_t mfNumBlocksPerSector(uint8_t sectorNo); uint8_t mfFirstBlockOfSector(uint8_t sectorNo); uint8_t mfSectorTrailerOfSector(uint8_t sectorNo); -uint8_t mfSectorTrailer(uint8_t blockNo); -bool mfIsSectorTrailer(uint8_t blockNo); -uint8_t mfSectorNum(uint8_t blockNo); +uint8_t mfSectorTrailer(uint16_t blockNo); +bool mfIsSectorTrailer(uint16_t blockNo); +uint8_t mfSectorNum(uint16_t blockNo); #endif // mifare4.h From 7b92c008271f9eca876db16ef18ae6d1eb031aac Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 25 May 2023 07:58:43 +0200 Subject: [PATCH 465/924] hide false positive in CMAKE on MINGW --- client/CMakeLists.txt | 11 +++++++++++ client/experimental_lib/CMakeLists.txt | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index ee1ddcc25..3fd255997 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -586,6 +586,17 @@ if (MINGW) set(CMAKE_C_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_CXX_FLAGS}") + # GCC 10 has issues with false positives on stringop-overflow, + # let's disable them for now (cf https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92955, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94335) + # beware these flags didn't exist for GCC < 7 + if(CMAKE_COMPILER_IS_GNUCXX) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (GCC_VERSION VERSION_GREATER 10.0 OR GCC_VERSION VERSION_EQUAL 10.0) + set(CMAKE_C_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") + endif() + endif(CMAKE_COMPILER_IS_GNUCXX) + # link Winsock2 set(ADDITIONAL_LNK ws2_32 ${ADDITIONAL_LNK}) endif (MINGW) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index bdc122e58..2ac10f871 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -585,6 +585,18 @@ if (MINGW) set(CMAKE_C_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_CXX_FLAGS}") + + # GCC 10 has issues with false positives on stringop-overflow, + # let's disable them for now (cf https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92955, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94335) + # beware these flags didn't exist for GCC < 7 + if(CMAKE_COMPILER_IS_GNUCXX) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (GCC_VERSION VERSION_GREATER 10.0 OR GCC_VERSION VERSION_EQUAL 10.0) + set(CMAKE_C_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") + endif() + endif(CMAKE_COMPILER_IS_GNUCXX) + endif (MINGW) target_include_directories(pm3rrg_rdv4 PRIVATE From c13632a9807a6421296f5e8da3a55f6c6b040c39 Mon Sep 17 00:00:00 2001 From: berlin4apk <83521068+berlin4apk@users.noreply.github.com> Date: Thu, 25 May 2023 20:19:59 +0200 Subject: [PATCH 466/924] New keys --- client/dictionaries/mfc_default_keys.dic | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 7ae6ead7f..1de1ba96a 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -267,12 +267,19 @@ E3429281EFC1 AAFB06045877 # # gym +# # Fysiken A 3E65E4FB65B3 # # Fysiken B 25094DF6F148 # +# gym wistband A form https://mattionline.de/fitnessstudio-armband-reverse-engineering/ / https://mattionline.de/milazycracker/ +# 3E65E4FB65B3 # the same as Fysiken A +# gym wistband B +81CC25EBBB6A +195DC63DB3A3 +# # CleverFit A05DBD98E0FC # From a62811ae696f9e5de160bdf77ba9cd750ff64e59 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 26 May 2023 05:10:37 +0200 Subject: [PATCH 467/924] hf mf hardnested, now indicates if it failed when recovering key --- client/src/cmdhfmfhard.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 4cb7873af..7f7718adc 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -2460,6 +2460,9 @@ int mfnestedhard(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBloc free_bitarray(all_bitflips_bitarray[EVEN_STATE]); free_sum_bitarrays(); free_part_sum_bitarrays(); + + return (key_found) ? PM3_SUCCESS : PM3_EFAILED; } + return PM3_SUCCESS; } From 15c751231f8d13f17fcc2f59a04f013e86dd7c02 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 26 May 2023 05:11:17 +0200 Subject: [PATCH 468/924] adapting default keys array --- client/src/mifare/mifaredefault.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/client/src/mifare/mifaredefault.h b/client/src/mifare/mifaredefault.h index 941abf41c..e3590329d 100644 --- a/client/src/mifare/mifaredefault.h +++ b/client/src/mifare/mifaredefault.h @@ -45,7 +45,10 @@ static const uint64_t g_mifare_default_keys[] = { 0xffffffffffff, // Default key (first key used by program if no user defined key) 0xa0a1a2a3a4a5, // NFCForum MAD key 0xd3f7d3f7d3f7, // NDEF public key - 0x4b791bea7bcc, // MFC EV1 Signature B + 0x4b791bea7bcc, // MFC EV1 Signature 17 B + 0x5C8FF9990DA2, // MFC EV1 Signature 16 A + 0xD01AFEEB890A, // MFC EV1 Signature 16 B + 0x75CCB59C9BED, // MFC EV1 Signature 17 A 0xfc00018778f7, // Public Transport 0x6471a5ef2d1a, // SimonsVoss 0x4E3552426B32, // ID06 @@ -72,6 +75,11 @@ static const uint64_t g_mifare_default_keys[] = { 0x199404281998, // NSP B 0x6A1987C40A21, // SALTO 0x7F33625BC129, // SALTO + 0x484944204953, // HID + 0x204752454154, // HID + 0x3B7E4FD575AD, // HID + 0x11496F97752A, // HID + 0x3E65E4FB65B3, // Gym 0x000000000000, // Blank key 0xb0b1b2b3b4b5, 0xaabbccddeeff, From 71ae06cf8bb263f525d5fb17cca29a3d9eeaade3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 26 May 2023 05:12:01 +0200 Subject: [PATCH 469/924] style --- client/dictionaries/mfc_default_keys.dic | 40 ++++++++++++++---------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 1de1ba96a..63598f78b 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -18,6 +18,19 @@ A5A4A3A2A1A0 # MAD access key B 89ECA97F8C2A # +# Mifare 1k EV1 (S50) hidden blocks, Signature data +# 16 A +5C8FF9990DA2 +# +# 17 A +75CCB59C9BED +# +# 16 B +D01AFEEB890A +# +# 17 B +4B791BEA7BCC +# # B0B1B2B3B4B5 C0C1C2C3C4C5 @@ -111,7 +124,7 @@ F1D83F964314 # Access control system 605F5E5D5C5B # -#NSP Global keys A and B (uk housing access control) +# NSP Global keys A and B (uk housing access control) 199404281970 199404281998 # @@ -263,7 +276,7 @@ E3429281EFC1 460722122510 # # 3dprinter -# EPI Envisionte# 3dprinter +# EPI Envisionte AAFB06045877 # # gym @@ -274,8 +287,10 @@ AAFB06045877 # Fysiken B 25094DF6F148 # -# gym wistband A form https://mattionline.de/fitnessstudio-armband-reverse-engineering/ / https://mattionline.de/milazycracker/ -# 3E65E4FB65B3 # the same as Fysiken A +# +# https://mattionline.de/fitnessstudio-armband-reverse-engineering/ +# https://mattionline.de/milazycracker/ +# gym wistband A, same as Fysiken A # gym wistband B 81CC25EBBB6A 195DC63DB3A3 @@ -287,6 +302,10 @@ A05DBD98E0FC AA4DDA458EBB EAB8066C7479 # +# Nordic Wellness A, same as Fysiken A +# Nordic Wellness B +E5519E1CC92B +# # Hotel KeyCard D3B595E9DD63 AFBECD121004 @@ -633,19 +652,6 @@ A8844B0BCA06 564C505F4D41 BA5B895DA162 # -# Vigik mystery Keys Mifare 1k EV1 (S50) -# 16 A -5C8FF9990DA2 -# -# 17 A -75CCB59C9BED -# -# 16 B -D01AFEEB890A -# -# 17 B -4B791BEA7BCC -# # BTCINO UNDETERMINED SPREAKD 0x01->0x13 key 021209197591 # From c35749dd13d9ca0150321c2f05169b492df80f85 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 26 May 2023 05:20:29 +0200 Subject: [PATCH 470/924] adapting to the new return value from hardnested --- client/src/cmdhfmf.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 335898ef1..553317bcd 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2170,6 +2170,10 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { case PM3_ESTATIC_NONCE: PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); break; + case PM3_EFAILED: { + PrintAndLogEx(FAILED, "\nFailed to recover a key..."); + break; + } default : break; } @@ -2862,7 +2866,7 @@ tryHardnested: // If the nested attack fails then we try the hardnested attack foundkey = 0; isOK = mfnestedhard(mfFirstBlockOfSector(sectorno), keytype, key, mfFirstBlockOfSector(current_sector_i), current_key_type_i, NULL, false, false, slow, 0, &foundkey, NULL); DropField(); - if (isOK) { + if (isOK != PM3_SUCCESS) { switch (isOK) { case PM3_ETIMEOUT: { PrintAndLogEx(ERR, "\nError: No response from Proxmark3"); @@ -2885,6 +2889,10 @@ tryHardnested: // If the nested attack fails then we try the hardnested attack PrintAndLogEx(NORMAL, ""); break; } + case PM3_EFAILED: { + PrintAndLogEx(FAILED, "\nFailed to recover a key..."); + continue; + } default: { break; } From 01333c7a272bfa321d3ee49681ce16fbdeefe9bc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 26 May 2023 05:22:04 +0200 Subject: [PATCH 471/924] simplify logic --- client/src/cmdhfmf.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 553317bcd..7e8aee55c 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2154,30 +2154,27 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { uint64_t foundkey = 0; int16_t isOK = mfnestedhard(blockno, keytype, key, trg_blockno, trg_keytype, known_target_key ? trg_key : NULL, nonce_file_read, nonce_file_write, slow, tests, &foundkey, filename); - + switch (isOK) { + case PM3_ETIMEOUT : + PrintAndLogEx(ERR, "Error: No response from Proxmark3\n"); + break; + case PM3_EOPABORTED: + PrintAndLogEx(WARNING, "Button pressed. Aborted\n"); + break; + case PM3_ESTATIC_NONCE: + PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); + break; + case PM3_EFAILED: { + PrintAndLogEx(FAILED, "\nFailed to recover a key..."); + break; + } + default : + break; + } + if ((tests == 0) && IfPm3Iso14443a()) { DropField(); } - - if (isOK) { - switch (isOK) { - case PM3_ETIMEOUT : - PrintAndLogEx(ERR, "Error: No response from Proxmark3\n"); - break; - case PM3_EOPABORTED: - PrintAndLogEx(WARNING, "Button pressed. Aborted\n"); - break; - case PM3_ESTATIC_NONCE: - PrintAndLogEx(ERR, "Error: Static encrypted nonce detected. Aborted\n"); - break; - case PM3_EFAILED: { - PrintAndLogEx(FAILED, "\nFailed to recover a key..."); - break; - } - default : - break; - } - } return isOK; } From 94e4afaa03b463c63101ff97d211110b7d037bcc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 26 May 2023 05:36:07 +0200 Subject: [PATCH 472/924] fix signature key bug and simplify logic --- client/src/cmdhfmf.c | 116 +++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 59 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 7e8aee55c..aebce5737 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2171,7 +2171,7 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { default : break; } - + if ((tests == 0) && IfPm3Iso14443a()) { DropField(); } @@ -2389,14 +2389,6 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { if (is_ev1) { PrintAndLogEx(INFO, "MIFARE Classic EV1 card detected"); - // Store the keys - e_sector[16].Key[MF_KEY_A] = bytes_to_num((uint8_t *)g_mifare_signature_key_a, sizeof(g_mifare_signature_key_a)); - e_sector[16].foundKey[MF_KEY_A] = 'D'; - - e_sector[17].Key[MF_KEY_A] = bytes_to_num((uint8_t *)g_mifare_signature_key_a, sizeof(g_mifare_signature_key_a)); - e_sector[17].foundKey[MF_KEY_A] = 'D'; - e_sector[17].Key[MF_KEY_B] = bytes_to_num((uint8_t *)g_mifare_signature_key_b, sizeof(g_mifare_signature_key_b)); - e_sector[17].foundKey[MF_KEY_B] = 'D'; // use found key if not supplied if (known_key == false) { @@ -2431,7 +2423,7 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { PrintAndLogEx(INFO, " key supplied .. " _YELLOW_("%s"), known_key ? "True" : "False"); PrintAndLogEx(INFO, " known sector .. " _YELLOW_("%d"), sectorno); PrintAndLogEx(INFO, " keytype ....... " _YELLOW_("%c"), (keytype == MF_KEY_B) ? 'B' : 'A'); - PrintAndLogEx(INFO, " known key ..... " _YELLOW_("%s"), sprint_hex(key, sizeof(key))); + PrintAndLogEx(INFO, " known key ..... " _YELLOW_("%s"), sprint_hex_inrow(key, sizeof(key))); if (has_staticnonce == NONCE_STATIC) PrintAndLogEx(INFO, " card PRNG ..... " _YELLOW_("STATIC")); @@ -2458,10 +2450,10 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { } if (mfCheckKeys(mfFirstBlockOfSector(sectorno), keytype, true, 1, key, &key64) == PM3_SUCCESS) { - PrintAndLogEx(INFO, "target sector %3u key type %c -- using valid key [ " _GREEN_("%s") "] (used for nested / hardnested attack)", + PrintAndLogEx(INFO, "target sector %3u key type %c -- using valid key [ " _GREEN_("%s") " ] (used for nested / hardnested attack)", sectorno, (keytype == MF_KEY_B) ? 'B' : 'A', - sprint_hex(key, sizeof(key)) + sprint_hex_inrow(key, sizeof(key)) ); // Store the key for the nested / hardnested attack (if supplied by the user) @@ -2474,7 +2466,7 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { PrintAndLogEx(FAILED, "Key is wrong. Can't authenticate to sector"_RED_("%3d") " key type "_RED_("%c") " key " _RED_("%s"), sectorno, (keytype == MF_KEY_B) ? 'B' : 'A', - sprint_hex(key, sizeof(key)) + sprint_hex_inrow(key, sizeof(key)) ); PrintAndLogEx(WARNING, "falling back to dictionary"); } @@ -2482,31 +2474,34 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { // Check if the user supplied key is used by other sectors for (int i = 0; i < sector_cnt; i++) { for (int j = MF_KEY_A; j <= MF_KEY_B; j++) { - if (e_sector[i].foundKey[j] == 0) { - if (mfCheckKeys(mfFirstBlockOfSector(i), j, true, 1, key, &key64) == PM3_SUCCESS) { - e_sector[i].Key[j] = bytes_to_num(key, 6); - e_sector[i].foundKey[j] = 'U'; - // If the user supplied secctor / keytype was wrong --> just be nice and correct it ;) - if (known_key == false) { - num_to_bytes(e_sector[i].Key[j], 6, key); - known_key = true; - sectorno = i; - keytype = j; - PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ] (used for nested / hardnested attack)", - i, - (j == MF_KEY_B) ? 'B' : 'A', - sprint_hex_inrow(key, sizeof(key)) - ); - } else { - PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ]", - i, - (j == MF_KEY_B) ? 'B' : 'A', - sprint_hex_inrow(key, sizeof(key)) - ); - } - ++num_found_keys; + if (e_sector[i].foundKey[j]) { + continue; + } + + if (mfCheckKeys(mfFirstBlockOfSector(i), j, true, 1, key, &key64) == PM3_SUCCESS) { + e_sector[i].Key[j] = bytes_to_num(key, 6); + e_sector[i].foundKey[j] = 'U'; + + // If the user supplied secctor / keytype was wrong --> just be nice and correct it ;) + if (known_key == false) { + num_to_bytes(e_sector[i].Key[j], 6, key); + known_key = true; + sectorno = i; + keytype = j; + PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ] (used for nested / hardnested attack)", + i, + (j == MF_KEY_B) ? 'B' : 'A', + sprint_hex_inrow(key, sizeof(key)) + ); + } else { + PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ]", + i, + (j == MF_KEY_B) ? 'B' : 'A', + sprint_hex_inrow(key, sizeof(key)) + ); } + ++num_found_keys; } } } @@ -2551,7 +2546,7 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { PrintAndLogEx(INFO, "." NOLF); // Check all the sectors for (int i = 0; i < sector_cnt; i++) { - for (int j = 0; j < 2; j++) { + for (int j = MF_KEY_A; j <= MF_KEY_B; j++) { // Check if the key is known if (e_sector[i].foundKey[j] == 0) { for (uint32_t k = 0; k < key_cnt; k++) { @@ -2608,28 +2603,30 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { // Analyse the dictionary attack for (int i = 0; i < sector_cnt; i++) { for (int j = MF_KEY_A; j <= MF_KEY_B; j++) { - if (e_sector[i].foundKey[j] == 1) { - e_sector[i].foundKey[j] = 'D'; - num_to_bytes(e_sector[i].Key[j], 6, tmp_key); + if (e_sector[i].foundKey[j] != 1) { + continue; + } - // Store valid credentials for the nested / hardnested attack if none exist - if (known_key == false) { - num_to_bytes(e_sector[i].Key[j], 6, key); - known_key = true; - sectorno = i; - keytype = j; - PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ] (used for nested / hardnested attack)", - i, - (j == MF_KEY_B) ? 'B' : 'A', - sprint_hex_inrow(tmp_key, sizeof(tmp_key)) - ); - } else { - PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ]", - i, - (j == MF_KEY_B) ? 'B' : 'A', - sprint_hex_inrow(tmp_key, sizeof(tmp_key)) - ); - } + e_sector[i].foundKey[j] = 'D'; + num_to_bytes(e_sector[i].Key[j], 6, tmp_key); + + // Store valid credentials for the nested / hardnested attack if none exist + if (known_key == false) { + num_to_bytes(e_sector[i].Key[j], 6, key); + known_key = true; + sectorno = i; + keytype = j; + PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ] (used for nested / hardnested attack)", + i, + (j == MF_KEY_B) ? 'B' : 'A', + sprint_hex_inrow(tmp_key, sizeof(tmp_key)) + ); + } else { + PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ]", + i, + (j == MF_KEY_B) ? 'B' : 'A', + sprint_hex_inrow(tmp_key, sizeof(tmp_key)) + ); } } } @@ -2690,7 +2687,8 @@ noValidKeyFound: // Iterate over each sector and key(A/B) for (current_sector_i = 0; current_sector_i < sector_cnt; current_sector_i++) { - for (current_key_type_i = 0; current_key_type_i < 2; current_key_type_i++) { + + for (current_key_type_i = MF_KEY_A; current_key_type_i <= MF_KEY_B; current_key_type_i++) { // If the key is already known, just skip it if (e_sector[current_sector_i].foundKey[current_key_type_i] == 0) { From 22ae67d2cfc588b4095d329d21f7bb4f10fb7d85 Mon Sep 17 00:00:00 2001 From: PhaseLoop Date: Fri, 26 May 2023 07:20:27 +0000 Subject: [PATCH 473/924] Revert doc autostyle --- doc/commands.json | 100 ++++++++++++++++++---------------------------- doc/commands.md | 5 +-- 2 files changed, 40 insertions(+), 65 deletions(-) diff --git a/doc/commands.json b/doc/commands.json index 633dd198e..a94e5bc6a 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3391,20 +3391,6 @@ ], "usage": "hf jooki sim [-h] [-b ]" }, - "hf ksx6924 balance": { - "command": "hf ksx6924 balance", - "description": "Gets the current purse balance", - "notes": [ - "hf ksx6924 balance" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-k, --keep keep field ON for next command", - "-a, --apdu Show APDU requests and responses" - ], - "usage": "hf ksx6924 balance [-hka]" - }, "hf ksx6924 help": { "command": "hf ksx6924 help", "description": "help This help", @@ -3413,6 +3399,19 @@ "options": [], "usage": "" }, + "hf ksx6924 select": { + "command": "hf ksx6924 select", + "description": "Selects KS X 6924 application, and leaves field up", + "notes": [ + "hf ksx6924 select" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-a, --apdu Show APDU requests and responses" + ], + "usage": "hf ksx6924 select [-ha]" + }, "hf ksx6924 info": { "command": "hf ksx6924 info", "description": "Get info about a KS X 6924 transit card. This application is used by T-Money (South Korea) and Snapper+ (Wellington, New Zealand).", @@ -3427,9 +3426,23 @@ ], "usage": "hf ksx6924 info [-hka]" }, + "hf ksx6924 balance": { + "command": "hf ksx6924 balance", + "description": "Gets the current purse balance", + "notes": [ + "hf ksx6924 balance" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-k, --keep keep field ON for next command", + "-a, --apdu Show APDU requests and responses" + ], + "usage": "hf ksx6924 balance [-hka]" + }, "hf ksx6924 init": { "command": "hf ksx6924 init", - "description": "Perform transaction initialization with Mpda (Money of Purchase Transaction)", + "description": "Perform transaction initialization (mpda)", "notes": [ "hf ksx6924 init 000003e8 -> Mpda" ], @@ -3455,19 +3468,7 @@ ], "usage": "hf ksx6924 prec [-hka] " }, - "hf ksx6924 select": { - "command": "hf ksx6924 select", - "description": "Selects KS X 6924 application, and leaves field up", - "notes": [ - "hf ksx6924 select" - ], - "offline": false, - "options": [ - "-h, --help This help", - "-a, --apdu Show APDU requests and responses" - ], - "usage": "hf ksx6924 select [-ha]" - }, + "hf legic crc": { "command": "hf legic crc", "description": "Calculates the legic crc8/crc16 on the given data", @@ -3970,7 +3971,7 @@ "--1k MIFARE Classic 1k / S50 (def)", "--2k MIFARE Classic/Plus 2k", "--4k MIFARE Classic 4k / S70", - "--emu to emulator memory" + "--emu from emulator memory" ], "usage": "hf mf csave [-h] [-f ] [--mini] [--1k] [--2k] [--4k] [--emu]" }, @@ -4347,27 +4348,6 @@ ], "usage": "hf mf gload [-hv] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu] [--start ] [--end ]" }, - "hf mf gsave": { - "command": "hf mf gsave", - "description": "Save `magic gen4 gtu` card memory into three files (BIN/EML/JSON)or into emulator memory", - "notes": [ - "hf mf gsave", - "hf mf gsave --4k", - "hf mf gsave -p DEADBEEF -f hf-mf-01020304.json" - ], - "offline": false, - "options": [ - "-h, --help This help", - "--mini MIFARE Classic Mini / S20", - "--1k MIFARE Classic 1k / S50 (def)", - "--2k MIFARE Classic/Plus 2k", - "--4k MIFARE Classic 4k / S70", - "-p, --pwd password 4bytes", - "-f, --file filename of dump", - "--emu to emulator memory" - ], - "usage": "hf mf gsave [-h] [--mini] [--1k] [--2k] [--4k] [-p ] [-f ] [--emu]" - }, "hf mf gsetblk": { "command": "hf mf gsetblk", "description": "Set block data on a magic gen4 GTU card", @@ -6196,7 +6176,7 @@ }, "hf mfu esave": { "command": "hf mfu esave", - "description": "Saves emulator memory to a MIFARE Ultralight/NTAG dump file (bin/eml/json) By default number of pages saved depends on defined tag type. You can override this with option --end.", + "description": "Saves emulator memory to a MIFARE Ultralight/NTAG dump file (bin/eml/json) By default number of pages saved depends on defined tag type. You can overrife this with option --end.", "notes": [ "hf mfu esave", "hf mfu esave --end 255 -> saves whole memory", @@ -6212,7 +6192,7 @@ }, "hf mfu eview": { "command": "hf mfu eview", - "description": "Displays emulator memory By default number of pages shown depends on defined tag type. You can override this with option --end.", + "description": "Displays emulator memory By default number of pages shown depends on defined tag type. You can overrife this with option --end.", "notes": [ "hf mfu eview", "hf mfu eview --end 255 -> dumps whole memory" @@ -7819,19 +7799,15 @@ "command": "lf em 4x50 brute", "description": "Tries to bruteforce the password of a EM4x50 card. Function can be stopped by pressing pm3 button.", "notes": [ - "lf em 4x50 brute --mode range --begin 12330000 --end 12340000 -> tries pwds from 0x12330000 to 0x12340000", - "lf em 4x50 brute --mode charset --digits --uppercase -> tries all combinations of ASCII codes for digits and uppercase letters" + "lf em 4x50 brute --first 12330000 --last 12340000 -> tries pwds from 0x12330000 to 0x1234000000" ], "offline": false, "options": [ "-h, --help This help", - "--mode Bruteforce mode (range|charset)", - "--begin Range mode - start of the key range", - "--end Range mode - end of the key range", - "--digits Charset mode - include ASCII codes for digits", - "--uppercase Charset mode - include ASCII codes for uppercase letters" + "--first first password (start), 4 bytes, lsb", + "--last last password (stop), 4 bytes, lsb" ], - "usage": "lf em 4x50 brute [-h] --mode [--begin ] [--end ] [--digits] [--uppercase]" + "usage": "lf em 4x50 brute [-h] --first --last " }, "lf em 4x50 chk": { "command": "lf em 4x50 chk", @@ -11640,8 +11616,8 @@ } }, "metadata": { - "commands_extracted": 733, + "commands_extracted": 732, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-05-08T17:05:11" + "extracted_on": "2022-11-20T20:19:15" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 2cd9fe2b3..4b91901f4 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -370,7 +370,7 @@ Check column "offline" for their availability. |`hf ksx6924 select `|N |`Select application, and leave field up` |`hf ksx6924 info `|N |`Get info about a KS X 6924 (T-Money, Snapper+) transit card` |`hf ksx6924 balance `|N |`Get current purse balance` -|`hf ksx6924 init `|N |`Perform transaction initialization with Mpda` +|`hf ksx6924 init `|N |`Perform transaction initialization with Mpda (Money of Purchase Transaction)` |`hf ksx6924 prec `|N |`Send proprietary get record command (CLA=90, INS=4C)` @@ -512,7 +512,6 @@ Check column "offline" for their availability. |`hf mf gen3freeze `|N |`Perma lock UID changes. irreversible` |`hf mf ggetblk `|N |`Read block from card` |`hf mf gload `|N |`Load dump to card` -|`hf mf gsave `|N |`Save dump from card into file or emulator` |`hf mf gsetblk `|N |`Write block to card` |`hf mf gview `|N |`View card` |`hf mf ndefformat `|N |`Format MIFARE Classic Tag as NFC Tag` @@ -852,7 +851,7 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`lf em 4x50 help `|Y |`This help` -|`lf em 4x50 brute `|N |`Bruteforce attack to find password` +|`lf em 4x50 brute `|N |`Simple bruteforce attack to find password` |`lf em 4x50 chk `|N |`Check passwords from dictionary` |`lf em 4x50 dump `|N |`Dump EM4x50 tag` |`lf em 4x50 info `|N |`Tag information` From d1783ce2a45a2ac1352904701fa313152ab77154 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 08:49:18 +0200 Subject: [PATCH 474/924] text --- client/deps/hardnested/hardnested_bruteforce.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index b5b36595c..7766b28d3 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -182,7 +182,7 @@ crack_states_thread(void *x) { } else { if (!thread_arg->silent) { char progress_text[80]; - snprintf(progress_text, sizeof(progress_text), "Brute force phase: %6.02f%%\t", 100.0 * (float)num_keys_tested / (float)(thread_arg->maximum_states)); + snprintf(progress_text, sizeof(progress_text), "Brute force phase: %6.02f%% ", 100.0 * (float)num_keys_tested / (float)(thread_arg->maximum_states)); float remaining_bruteforce = thread_arg->nonces[thread_arg->best_first_bytes[0]].expected_num_brute_force - (float)num_keys_tested / 2; hardnested_print_progress(thread_arg->num_acquired_nonces, progress_text, remaining_bruteforce, 5000); } From 0f4b787df1fd63321c174ece3b4f96cb3d38e79f Mon Sep 17 00:00:00 2001 From: PhaseLoop Date: Sat, 27 May 2023 07:18:59 +0000 Subject: [PATCH 475/924] replace bzero with memset --- client/src/cmdlfem4x50.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index aeffb9c18..56bf9f6d7 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -369,7 +369,7 @@ int CmdEM4x50Brute(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, true); em4x50_data_t etd; - bzero(&etd, sizeof(etd)); + memset(&etd, 0, sizeof(etd)); int mode_len = 64; char mode[64]; From 5c604de4c18d3c63c141f40a37d8f2b5d33f346c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 10:26:30 +0200 Subject: [PATCH 476/924] adapt hardnested bitflip arrays to load --- client/src/cmdhfmfhard.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 7f7718adc..acbf32ea5 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -34,7 +34,6 @@ #include "commonutil.h" // ARRAYLEN #include "comms.h" - #include "proxmark3.h" #include "ui.h" #include "util_posix.h" @@ -48,7 +47,8 @@ #define NUM_CHECK_BITFLIPS_THREADS (num_CPUs()) #define NUM_REDUCTION_WORKING_THREADS (num_CPUs()) -#define IGNORE_BITFLIP_THRESHOLD 0.99 // ignore bitflip arrays which have nearly only valid states +// ignore bitflip arrays which have nearly only valid states +#define IGNORE_BITFLIP_THRESHOLD 0.9901 #define STATE_FILES_DIRECTORY "hardnested_tables/" #define STATE_FILE_TEMPLATE "bitflip_%d_%03" PRIx16 "_states.bin.bz2" @@ -57,7 +57,11 @@ // #define DEBUG_REDUCTION // possible sum property values -static uint16_t sums[NUM_SUMS] = {0, 32, 56, 64, 80, 96, 104, 112, 120, 128, 136, 144, 152, 160, 176, 192, 200, 224, 256}; +static uint16_t sums[NUM_SUMS] = { + 0, 32, 56, 64, 80, 96, 104, 112, + 120, 128, 136, 144, 152, 160, 176, 192, + 200, 224, 256 +}; // number of possible partial sum property values #define NUM_PART_SUMS 9 @@ -505,8 +509,11 @@ static void free_sum_bitarrays(void) { static char failstr[250] = ""; #endif -static const float p_K0[NUM_SUMS] = { // the probability that a random nonce has a Sum Property K - 0.0290, 0.0083, 0.0006, 0.0339, 0.0048, 0.0934, 0.0119, 0.0489, 0.0602, 0.4180, 0.0602, 0.0489, 0.0119, 0.0934, 0.0048, 0.0339, 0.0006, 0.0083, 0.0290 +// the probability that a random nonce has a Sum Property K +static const float p_K0[NUM_SUMS] = { + 0.0290, 0.0083, 0.0006, 0.0339, 0.0048, 0.0934, 0.0119, 0.0489, + 0.0602, 0.4180, 0.0602, 0.0489, 0.0119, 0.0934, 0.0048, 0.0339, + 0.0006, 0.0083, 0.0290 }; static float my_p_K[NUM_SUMS]; static const float *p_K; @@ -1275,6 +1282,7 @@ static void apply_sum_a0(void) { } static void simulate_MFplus_RNG(uint32_t test_cuid, uint64_t test_key, uint32_t *nt_enc, uint8_t *par_enc) { + struct Crypto1State sim_cs = {0, 0}; // init cryptostate with key: @@ -1285,12 +1293,20 @@ static void simulate_MFplus_RNG(uint32_t test_cuid, uint64_t test_key, uint32_t *par_enc = 0; uint32_t nt = (rand() & 0xff) << 24 | (rand() & 0xff) << 16 | (rand() & 0xff) << 8 | (rand() & 0xff); + for (int8_t byte_pos = 3; byte_pos >= 0; byte_pos--) { + uint8_t nt_byte_dec = (nt >> (8 * byte_pos)) & 0xff; - uint8_t nt_byte_enc = crypto1_byte(&sim_cs, nt_byte_dec ^ (test_cuid >> (8 * byte_pos)), false) ^ nt_byte_dec; // encode the nonce byte + + // encode the nonce byte + uint8_t nt_byte_enc = crypto1_byte(&sim_cs, nt_byte_dec ^ (test_cuid >> (8 * byte_pos)), false) ^ nt_byte_dec; *nt_enc = (*nt_enc << 8) | nt_byte_enc; - uint8_t ks_par = filter(sim_cs.odd); // the keystream bit to encode/decode the parity bit - uint8_t nt_byte_par_enc = ks_par ^ oddparity8(nt_byte_dec); // determine the nt byte's parity and encode it + + // the keystream bit to encode/decode the parity bit + uint8_t ks_par = filter(sim_cs.odd); + + // determine the nt byte's parity and encode it + uint8_t nt_byte_par_enc = ks_par ^ oddparity8(nt_byte_dec); *par_enc = (*par_enc << 1) | nt_byte_par_enc; } } From 71f934dbd766c0f3a18fb2c4d4c8943fd05dc5ef Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 10:28:54 +0200 Subject: [PATCH 477/924] text --- client/src/fileutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index bb9c7635e..d26470ed5 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -805,7 +805,7 @@ int createMfcKeyDump(const char *preferredName, uint8_t sectorsCnt, sector_t *e_ fflush(f); fclose(f); PrintAndLogEx(SUCCESS, "Found keys have been dumped to " _YELLOW_("%s"), fileName); - PrintAndLogEx(INFO, "FYI! --> " _YELLOW_("0xFFFFFFFFFFFF") " <-- has been inserted for unknown keys where " _YELLOW_("res") " is " _YELLOW_("0")); + PrintAndLogEx(INFO, "FYI! --> " _YELLOW_("0xFFFFFFFFFFFF") " <-- has been inserted for unknown keys where " _YELLOW_("res") " is " _RED_("0")); free(fileName); return PM3_SUCCESS; } From 82886e20362732ccda212084d7e9b1c1bc287bb8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 10:30:52 +0200 Subject: [PATCH 478/924] reverting back to threshold 5, HF reading becomes better. Keeping the Simulation threshold --- fpga-xc2s30/fpga_felica.bit | Bin 42172 -> 42179 bytes fpga-xc2s30/fpga_hf.bit | Bin 42168 -> 42175 bytes fpga-xc2s30/fpga_hf_15.bit | Bin 42171 -> 42178 bytes fpga-xc2s30/fpga_lf.bit | Bin 42168 -> 42175 bytes fpga-xc2s30/hi_iso14443a.v | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) diff --git a/fpga-xc2s30/fpga_felica.bit b/fpga-xc2s30/fpga_felica.bit index 83009b499879dedcd6b741fb39cd016f915c9107..30ea16e332b8d28b03a80605bc0531fd5864d0c5 100644 GIT binary patch literal 42179 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 VbcHV;&EOOomiOv8^Q~Kd`@ho-u|5C* literal 42172 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

4u?&%}qr#jTc&F>9hiLT#NQhiOD-%ZGRs!(` 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 z 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 diff --git a/fpga-xc2s30/fpga_lf.bit b/fpga-xc2s30/fpga_lf.bit index 93a26841a35f0e01f50465fe6acfd602abd8e758..f5e5ce630e41b642c066a90aff5e6cfcc201d220 100644 GIT binary patch literal 42175 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 ZMfoGYeNB>b{Cn`F_&uYQw3OfS{{^O35heft literal 42168 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Ξ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 Y@BP;AUzNsNXt>3D&cRAr%74iJ2d|!5u>b%7 diff --git a/fpga-xc2s30/hi_iso14443a.v b/fpga-xc2s30/hi_iso14443a.v index c9bc64f94..d52ab4000 100644 --- a/fpga-xc2s30/hi_iso14443a.v +++ b/fpga-xc2s30/hi_iso14443a.v @@ -222,7 +222,7 @@ reg signed [10:0] rx_mod_falling_edge_max; reg signed [10:0] rx_mod_rising_edge_max; reg curbit; -`define EDGE_DETECT_THRESHOLD 3 +`define EDGE_DETECT_THRESHOLD 5 `define EDGE_DETECT_THRESHOLDHIGH 20 always @(negedge adc_clk) From 328e5461f8896f1a26295dc5fe573cbdc5e81549 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 10:46:42 +0200 Subject: [PATCH 479/924] added "--sk" param to hf mf eview and view commands. This param extracts and saves keys to binary key file --- CHANGELOG.md | 10 +++++--- client/src/cmdhfmf.c | 59 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85593f3b2..0906e8800 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mf eview --sk` - now can extract keys and save to file (@iceman1001) + - Changed `hf mf view --sk` - now can extract keys and save to file (@iceman1001) - Changed `hf mf sim` - reduce 6ms threshold to 4ms for reset to idle #1974 (@net147) - Rebuilt the Spartan-2 `fpga_*.bit` files to include the `hi_iso14443a.v` update (@d18c7db) - Added minor orphaned change from `hi_iso14443a.v` in `fpga-xc3s100e` to `hi_iso14443a.v` in `fpga-xc2s30` (@d18c7db) @@ -22,7 +24,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf mf supercard` - Support editing UID and recovery of keys from second generation card (@AloneLiberty) - Added iClass credit key to default iClass key table and reorganized key order (@GuruSteve) - Changed `hf mf value` - ability to use transfer on different block (@AloneLiberty) - - Change `hf mf dump --ns` - dump command now supports `no save` of MFC card memory (@iceman1001) + - Changed `hf mf dump --ns` - dump command now supports `no save` of MFC card memory (@iceman1001) - Added `hf mf gdmsetcfg` - Supprt Gen4 GDM write configuration block (@iceman1001) - Added `hf mf gdmcfg` - Support Gen4 GDM read configuration block (@iceman1001) - Changed magic note to include a section about GDM tags (@iceman1001) @@ -62,11 +64,11 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added `hf legic info` command for other sources (@0xdeb) - Added `hf legic einfo` - views emulator menory (@0xdeb) - Changed `hf legic view` - now also print the decoded info of the dump file (@0xdeb) - - Now `script run hf_mf_ultimatecard.lua -u` supports 10bytes UID (@alejandro12120) - - Update documentation for installation on macOS with MacPorts (@linuxgemini) + - Changed `script run hf_mf_ultimatecard.lua -u` to support 10bytes UID (@alejandro12120) + - Updated documentation for installation on macOS with MacPorts (@linuxgemini) - Added possible Paxton id to hitag2 tag info output - Changed `hf mf sim` - reduce 50ms threshold to 6ms for reset to idle #1974 (@net147) - - Update `amiibo_tools.lua` with new identifiers and create a python script `update_amiibo_tools_lua.py` to automate the process in the future. (@CorySolovewicz) + - Updated `amiibo_tools.lua` with new identifiers and create a python script `update_amiibo_tools_lua.py` to automate the process in the future. (@CorySolovewicz) ## [Nitride.4.16191][2023-01-29] - Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index aebce5737..7487088dd 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -320,6 +320,52 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { return PM3_SUCCESS; } +// MFC dump , extract and save the keys to key file +static int mf_save_keys_from_arr(uint16_t n, uint8_t *d) { + uint8_t sectors = 0; + switch (n) { + case MIFARE_MINI_MAXBLOCK: + sectors = MIFARE_MINI_MAXSECTOR; + break; + case MIFARE_2K_MAXBLOCK: + sectors = MIFARE_2K_MAXSECTOR; + break; + case MIFARE_4K_MAXBLOCK: + sectors = MIFARE_4K_MAXSECTOR; + break; + case MIFARE_1K_MAXBLOCK: + default: + sectors = MIFARE_1K_MAXSECTOR; + break; + } + + uint16_t keysize = 2 * MIFARE_KEY_SIZE * sectors; + + uint8_t *keys = calloc(keysize, sizeof(uint8_t)); + if (keys == NULL) { + return PM3_EMALLOC; + } + + uint8_t sector = 0; + for (uint16_t i = 0; i < n; i++) { + if (mfIsSectorTrailer(i)) { + // key A offset in ST block + memcpy(keys + (MIFARE_KEY_SIZE * sector), d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); + + // key B offset in ST block + memcpy(keys + (MIFARE_KEY_SIZE * sectors) + (MIFARE_KEY_SIZE * sector), d + (i * MFBLOCK_SIZE) + 10, MIFARE_KEY_SIZE); + + sector++; + } + } + + char fn[FILE_PATH_SIZE] = {0}; + snprintf(fn, sizeof(fn), "hf-mf-%s-keys", sprint_hex_inrow(d, 4)); + saveFile(fn, ".bin", keys, keysize); + free(keys); + return PM3_SUCCESS; +} + /* static void mf_print_values(uint16_t n, uint8_t *d) { @@ -4396,6 +4442,7 @@ static int CmdHF14AMfEView(const char *Cmd) { arg_lit0(NULL, "2k", "MIFARE Classic/Plus 2k"), arg_lit0(NULL, "4k", "MIFARE Classic 4k / S70"), arg_lit0("v", "verbose", "verbose output"), + arg_lit0(NULL, "sk", "Save extracted keys to file"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -4404,6 +4451,7 @@ static int CmdHF14AMfEView(const char *Cmd) { bool m2 = arg_get_lit(ctx, 3); bool m4 = arg_get_lit(ctx, 4); bool verbose = arg_get_lit(ctx, 5); + bool save_keys = arg_get_lit(ctx, 6); CLIParserFree(ctx); // validations @@ -4449,6 +4497,11 @@ static int CmdHF14AMfEView(const char *Cmd) { if (verbose) { mf_print_keys(block_cnt, dump); } + + if (save_keys) { + mf_save_keys_from_arr(block_cnt, dump); + } + free(dump); return PM3_SUCCESS; } @@ -7028,6 +7081,7 @@ static int CmdHF14AMfView(const char *Cmd) { arg_param_begin, arg_str1("f", "file", "", "filename of dump"), arg_lit0("v", "verbose", "verbose output"), + arg_lit0(NULL, "sk", "Save extracted keys to file"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -7035,6 +7089,7 @@ static int CmdHF14AMfView(const char *Cmd) { char filename[FILE_PATH_SIZE]; CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); bool verbose = arg_get_lit(ctx, 2); + bool save_keys = arg_get_lit(ctx, 3); CLIParserFree(ctx); // read dump file @@ -7065,6 +7120,10 @@ static int CmdHF14AMfView(const char *Cmd) { mf_analyse_acl(block_cnt, dump); } + if (save_keys) { + mf_save_keys_from_arr(block_cnt, dump); + } + int sector = DetectHID(dump, 0x4910); if (sector > -1) { // decode it From 0cc7373655f949f5eadfa3d5a562e7cfebd5c120 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 12:10:32 +0200 Subject: [PATCH 480/924] fix resource leaks --- client/src/cmdlfem4x50.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index 017f1c121..07b1f91b0 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -382,6 +382,7 @@ int CmdEM4x50Brute(const char *Cmd) { etd.bruteforce_mode = BRUTEFORCE_MODE_CHARSET; } else { PrintAndLogEx(FAILED, "Unknown bruteforce mode: %s", mode); + CLIParserFree(ctx); return PM3_EINVARG; } @@ -396,11 +397,13 @@ int CmdEM4x50Brute(const char *Cmd) { if (begin_len != 4) { PrintAndLogEx(FAILED, "'begin' parameter must be 4 bytes"); + CLIParserFree(ctx); return PM3_EINVARG; } if (end_len != 4) { PrintAndLogEx(FAILED, "'end' parameter must be 4 bytes"); + CLIParserFree(ctx); return PM3_EINVARG; } @@ -417,6 +420,7 @@ int CmdEM4x50Brute(const char *Cmd) { if (etd.bruteforce_charset == 0) { PrintAndLogEx(FAILED, "Please enable at least one charset when using charset bruteforce mode."); + CLIParserFree(ctx); return PM3_EINVARG; } From 32fcf5e870f1e596092bbfc0c7963a236e7a8379 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 17:00:28 +0200 Subject: [PATCH 481/924] make 16 bytes default cols --- CHANGELOG.md | 1 + client/src/cmdflashmemspiffs.c | 4 ++-- client/src/cmdusart.c | 2 +- doc/uart_notes.md | 2 +- tools/btaddon/requirements.txt | 1 + 5 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 tools/btaddon/requirements.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 0906e8800..118c4b793 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `usart btfactory` - handles the new BT board with version "BT SPP V3.0" (@iceman1001) - Changed `hf mf eview --sk` - now can extract keys and save to file (@iceman1001) - Changed `hf mf view --sk` - now can extract keys and save to file (@iceman1001) - Changed `hf mf sim` - reduce 6ms threshold to 4ms for reset to idle #1974 (@net147) diff --git a/client/src/cmdflashmemspiffs.c b/client/src/cmdflashmemspiffs.c index a1923d588..e84b3e597 100644 --- a/client/src/cmdflashmemspiffs.c +++ b/client/src/cmdflashmemspiffs.c @@ -531,7 +531,7 @@ static int CmdFlashMemSpiFFSView(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_str1("f", "file", "", "SPIFFS file to view"), - arg_int0("c", "cols", "", "column breaks (def 32)"), + arg_int0("c", "cols", "", "column breaks (def 16)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -540,7 +540,7 @@ static int CmdFlashMemSpiFFSView(const char *Cmd) { char fn[32] = {0}; CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)fn, 32, &fnlen); - int breaks = arg_get_int_def(ctx, 2, 32); + int breaks = arg_get_int_def(ctx, 2, 16); CLIParserFree(ctx); uint8_t *dump = NULL; diff --git a/client/src/cmdusart.c b/client/src/cmdusart.c index d67ae9bf1..2b98181d0 100644 --- a/client/src/cmdusart.c +++ b/client/src/cmdusart.c @@ -157,7 +157,7 @@ static int usart_bt_testcomm(uint32_t baudrate, uint8_t parity) { ret = usart_txrx((uint8_t *)string, strlen(string), data, &len, 1000); // such large timeout needed if (ret == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "RX (%3zu):%.*s", len, (int)len, data); - if (strcmp((char *)data, "hc01.comV2.0") == 0) { + if (strcmp((char *)data, "hc01.comV2.0") == 0 || strcmp((char *)data, "BT SPP V3.0") == 0) { PrintAndLogEx(SUCCESS, "Add-on " _GREEN_("found!")); return PM3_SUCCESS; } diff --git a/doc/uart_notes.md b/doc/uart_notes.md index 5c8cb65b6..eeee8a1d0 100644 --- a/doc/uart_notes.md +++ b/doc/uart_notes.md @@ -199,7 +199,7 @@ The ROLE command takes its parameter after an equal sign: |Command |Description |Reply | |-------------------|------------------------------------------------------|--------------| -|`AT+VERSION` |print firmware version |`hc01.comV2.0`| +|`AT+VERSION` |print firmware version |`hc01.comV2.0` or `BT SPP V3.0`| |`AT+BAUD8` |set baudrate to 115200 |`OK115200` | |`AT+PIN1234` |set PINCODE to 1234. (must be numbers) |`OKsetPIN` | |`AT+NAMEPM3_RDV4.0`|set device name (as shown to BT hosts) to `PM3_RDV4.0`|`OKsetname` | diff --git a/tools/btaddon/requirements.txt b/tools/btaddon/requirements.txt new file mode 100644 index 000000000..3452b96e3 --- /dev/null +++ b/tools/btaddon/requirements.txt @@ -0,0 +1 @@ +pyserial==3.5.0 From 1d0da726ecbc73e11d60df028df1984be4c786b4 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 21:10:11 +0200 Subject: [PATCH 482/924] the clocks for usart rxtx wasnt enabled. --- armsrc/appmain.c | 15 ++++++++++--- armsrc/usart.c | 52 ++++++++++++++++++++++++++++------------------ client/src/comms.c | 9 +++++--- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index f68739da2..310aa6a0d 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2051,11 +2051,16 @@ static void PacketReceived(PacketCommandNG *packet) { } PACKED; struct p *payload = (struct p *) &packet->data.asBytes; usart_writebuffer_sync(payload->data, packet->length - sizeof(payload)); + uint16_t available; uint16_t pre_available = 0; uint8_t *dest = BigBuf_malloc(USART_FIFOLEN); uint32_t wait = payload->waittime; + + StartTicks(); + uint32_t ti = GetTickCount(); + while (true) { WaitMS(50); available = usart_rxdata_available(); @@ -2070,12 +2075,15 @@ static void PacketReceived(PacketCommandNG *packet) { if (GetTickCountDelta(ti) > wait) break; } + if (available > 0) { uint16_t len = usart_read_ng(dest, available); reply_ng(CMD_USART_TXRX, PM3_SUCCESS, dest, len); } else { reply_ng(CMD_USART_TXRX, PM3_ENODATA, NULL, 0); } + + StopTicks(); BigBuf_free(); LED_B_OFF(); break; @@ -2718,9 +2726,6 @@ void __attribute__((noreturn)) AppMain(void) { } #endif -#ifdef WITH_FPC_USART - usart_init(USART_BAUD_RATE, USART_PARITY); -#endif #ifdef WITH_FLASH // If flash is not present, BUSY_TIMEOUT kicks in, let's do it after USB @@ -2733,6 +2738,10 @@ void __attribute__((noreturn)) AppMain(void) { rdv40_spiffs_check(); #endif +#ifdef WITH_FPC_USART + usart_init(USART_BAUD_RATE, USART_PARITY); +#endif + // This is made as late as possible to ensure enumeration without timeout // against device such as http://www.hobbytronics.co.uk/usb-host-board-v2 // In other words, keep the interval between usb_enable() and the main loop as short as possible. diff --git a/armsrc/usart.c b/armsrc/usart.c index f92e9c701..915d4a445 100644 --- a/armsrc/usart.c +++ b/armsrc/usart.c @@ -46,8 +46,8 @@ void usart_close(void) { } */ -static uint8_t us_inbuf1[USART_BUFFLEN]; -static uint8_t us_inbuf2[USART_BUFFLEN]; +static uint8_t us_in_a[USART_BUFFLEN]; +static uint8_t us_in_b[USART_BUFFLEN]; static uint8_t *usart_cur_inbuf = NULL; static uint16_t usart_cur_inbuf_off = 0; static uint8_t us_rxfifo[USART_FIFOLEN]; @@ -56,7 +56,9 @@ static size_t us_rxfifo_high = 0; static void usart_fill_rxfifo(void) { - uint16_t rxfifo_free ; + + uint16_t rxfifo_free = 0; + if (pUS1->US_RNCR == 0) { // One buffer got filled, backup buffer being used if (us_rxfifo_low > us_rxfifo_high) @@ -79,19 +81,22 @@ static void usart_fill_rxfifo(void) { pUS1->US_RNCR = USART_BUFFLEN; // Swap current buff - if (usart_cur_inbuf == us_inbuf1) - usart_cur_inbuf = us_inbuf2; + if (usart_cur_inbuf == us_in_a) + usart_cur_inbuf = us_in_b; else - usart_cur_inbuf = us_inbuf1; + usart_cur_inbuf = us_in_a; usart_cur_inbuf_off = 0; } else { // Take only what we have room for available = rxfifo_free; for (uint16_t i = 0; i < available; i++) { + us_rxfifo[us_rxfifo_high++] = usart_cur_inbuf[usart_cur_inbuf_off + i]; - if (us_rxfifo_high == sizeof(us_rxfifo)) + + if (us_rxfifo_high == sizeof(us_rxfifo)) { us_rxfifo_high = 0; + } } usart_cur_inbuf_off += available; return; @@ -101,18 +106,20 @@ static void usart_fill_rxfifo(void) { if (pUS1->US_RCR < USART_BUFFLEN - usart_cur_inbuf_off) { // Current buffer partially filled if (us_rxfifo_low > us_rxfifo_high) - rxfifo_free = us_rxfifo_low - us_rxfifo_high; + rxfifo_free = (us_rxfifo_low - us_rxfifo_high); else - rxfifo_free = sizeof(us_rxfifo) - us_rxfifo_high + us_rxfifo_low; + rxfifo_free = (sizeof(us_rxfifo) - us_rxfifo_high + us_rxfifo_low); - uint16_t available = USART_BUFFLEN - pUS1->US_RCR - usart_cur_inbuf_off; + uint16_t available = (USART_BUFFLEN - pUS1->US_RCR - usart_cur_inbuf_off); if (available > rxfifo_free) available = rxfifo_free; + for (uint16_t i = 0; i < available; i++) { us_rxfifo[us_rxfifo_high++] = usart_cur_inbuf[usart_cur_inbuf_off + i]; - if (us_rxfifo_high == sizeof(us_rxfifo)) + if (us_rxfifo_high == sizeof(us_rxfifo)) { us_rxfifo_high = 0; + } } usart_cur_inbuf_off += available; } @@ -121,9 +128,9 @@ static void usart_fill_rxfifo(void) { uint16_t usart_rxdata_available(void) { usart_fill_rxfifo(); if (us_rxfifo_low <= us_rxfifo_high) - return us_rxfifo_high - us_rxfifo_low; + return (us_rxfifo_high - us_rxfifo_low); else - return sizeof(us_rxfifo) - us_rxfifo_low + us_rxfifo_high; + return (sizeof(us_rxfifo) - us_rxfifo_low + us_rxfifo_high); } uint32_t usart_read_ng(uint8_t *data, size_t len) { @@ -143,9 +150,10 @@ uint32_t usart_read_ng(uint8_t *data, size_t len) { uint32_t maxtry = 10 * (3000000 / USART_BAUD_RATE) + tryconstant; while (len) { - uint32_t available = usart_rxdata_available(); + uint32_t available = usart_rxdata_available(); uint32_t packetSize = MIN(available, len); + if (available > 0) { // Dbprintf_usb("Dbg USART ask %d bytes, available %d bytes, packetsize %d bytes", len, available, packetSize); // highest_observed_try = MAX(highest_observed_try, try); @@ -153,8 +161,9 @@ uint32_t usart_read_ng(uint8_t *data, size_t len) { } len -= packetSize; while (packetSize--) { - if (us_rxfifo_low == sizeof(us_rxfifo)) + if (us_rxfifo_low == sizeof(us_rxfifo)) { us_rxfifo_low = 0; + } data[bytes_rcv++] = us_rxfifo[us_rxfifo_low++]; } if (try++ == maxtry) { @@ -183,10 +192,13 @@ int usart_writebuffer_sync(uint8_t *data, size_t len) { void usart_init(uint32_t baudrate, uint8_t parity) { - if (baudrate != 0) + if (baudrate != 0) { g_usart_baudrate = baudrate; - if ((parity == 'N') || (parity == 'O') || (parity == 'E')) + } + + if ((parity == 'N') || (parity == 'O') || (parity == 'E')) { g_usart_parity = parity; + } // For a nice detailed sample, interrupt driven but still relevant. // See https://www.sparkfun.com/datasheets/DevTools/SAM7/at91sam7%20serial%20communications.pdf @@ -262,11 +274,11 @@ void usart_init(uint32_t baudrate, uint8_t parity) { pUS1->US_TCR = 0; pUS1->US_TNPR = (uint32_t)0; pUS1->US_TNCR = 0; - pUS1->US_RPR = (uint32_t)us_inbuf1; + pUS1->US_RPR = (uint32_t)us_in_a; pUS1->US_RCR = USART_BUFFLEN; - usart_cur_inbuf = us_inbuf1; + usart_cur_inbuf = us_in_a; usart_cur_inbuf_off = 0; - pUS1->US_RNPR = (uint32_t)us_inbuf2; + pUS1->US_RNPR = (uint32_t)us_in_b; pUS1->US_RNCR = USART_BUFFLEN; // Initialize our fifo diff --git a/client/src/comms.c b/client/src/comms.c index a8ed8be4c..64bea9f65 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -30,8 +30,8 @@ #include "util_posix.h" // msclock #include "util_darwin.h" // en/dis-ableNapp(); -//#define COMMS_DEBUG -//#define COMMS_DEBUG_RAW +// #define COMMS_DEBUG +// #define COMMS_DEBUG_RAW // Serial port that we are communicating with the PM3 on. static serial_port sp = NULL; @@ -369,6 +369,7 @@ __attribute__((force_align_arg_pointer)) } res = uart_receive(sp, (uint8_t *)&rx_raw.pre, sizeof(PacketResponseNGPreamble), &rxlen); + if ((res == PM3_SUCCESS) && (rxlen == sizeof(PacketResponseNGPreamble))) { rx.magic = rx_raw.pre.magic; uint16_t length = rx_raw.pre.length; @@ -380,6 +381,7 @@ __attribute__((force_align_arg_pointer)) PrintAndLogEx(WARNING, "Received packet frame with incompatible length: 0x%04x", length); error = true; } + if ((!error) && (length > 0)) { // Get the variable length payload res = uart_receive(sp, (uint8_t *)&rx_raw.data, length, &rxlen); @@ -418,10 +420,10 @@ __attribute__((force_align_arg_pointer)) rx.length = 0; // set received length to 0 else { // old frames can't be empty PrintAndLogEx(WARNING, "Received empty MIX packet frame (length: 0x00)"); - error = true; } } + if (!error) { // Get the postamble res = uart_receive(sp, (uint8_t *)&rx_raw.foopost, sizeof(PacketResponseNGPostamble), &rxlen); if ((res != PM3_SUCCESS) || (rxlen != sizeof(PacketResponseNGPostamble))) { @@ -429,6 +431,7 @@ __attribute__((force_align_arg_pointer)) error = true; } } + if (!error) { // Check CRC, accept MAGIC as placeholder rx.crc = rx_raw.foopost.crc; if (rx.crc != RESPONSENG_POSTAMBLE_MAGIC) { From 62b184ce490dbd37d8f0d2edfe53291afd6d947f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 27 May 2023 21:12:58 +0200 Subject: [PATCH 483/924] adapt usart rx to enable clocks --- armsrc/appmain.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 310aa6a0d..38c680050 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2014,11 +2014,16 @@ static void PacketReceived(PacketCommandNG *packet) { uint32_t waittime; } PACKED; struct p *payload = (struct p *) &packet->data.asBytes; + uint16_t available; uint16_t pre_available = 0; uint8_t *dest = BigBuf_malloc(USART_FIFOLEN); uint32_t wait = payload->waittime; + + StartTicks(); + uint32_t ti = GetTickCount(); + while (true) { WaitMS(50); available = usart_rxdata_available(); @@ -2039,6 +2044,8 @@ static void PacketReceived(PacketCommandNG *packet) { } else { reply_ng(CMD_USART_RX, PM3_ENODATA, NULL, 0); } + + StopTicks(); BigBuf_free(); LED_B_OFF(); break; From c5c0ef36a730f5af0417d3daf13485b08f413f74 Mon Sep 17 00:00:00 2001 From: d18c7db Date: Sat, 27 May 2023 21:47:51 +0200 Subject: [PATCH 484/924] Fix truncated FPGA upload due to incorrect integer size variable --- CHANGELOG.md | 1 + armsrc/fpgaloader.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 118c4b793..8d8885d30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed truncated FPGA upload due to incorrect integer size variable (@d18c7db) - Changed `usart btfactory` - handles the new BT board with version "BT SPP V3.0" (@iceman1001) - Changed `hf mf eview --sk` - now can extract keys and save to file (@iceman1001) - Changed `hf mf view --sk` - now can extract keys and save to file (@iceman1001) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 802c77558..61c2df9d1 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -393,7 +393,7 @@ static int bitparse_find_section(int bitstream_version, char section_name, uint3 while (numbytes < MAX_FPGA_BIT_STREAM_HEADER_SEARCH) { char current_name = get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer); numbytes++; - uint16_t current_length = 0; + uint32_t current_length = 0; if (current_name < 'a' || current_name > 'e') { /* Strange section name, abort */ break; From 336bd06d8844d09ed3dc2c21a11278f6bfe6e22d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 28 May 2023 07:34:27 +0200 Subject: [PATCH 485/924] type fix --- armsrc/fpgaloader.c | 2 +- client/src/cmdusart.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 61c2df9d1..6f8dd7a0b 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -423,7 +423,7 @@ static int bitparse_find_section(int bitstream_version, char section_name, uint3 break; } - for (uint16_t i = 0; i < current_length && numbytes < MAX_FPGA_BIT_STREAM_HEADER_SEARCH; i++) { + for (uint32_t i = 0; i < current_length && numbytes < MAX_FPGA_BIT_STREAM_HEADER_SEARCH; i++) { get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer); numbytes++; } diff --git a/client/src/cmdusart.c b/client/src/cmdusart.c index 2b98181d0..f8538caf3 100644 --- a/client/src/cmdusart.c +++ b/client/src/cmdusart.c @@ -68,15 +68,20 @@ static int usart_txrx(uint8_t *srcdata, size_t srclen, uint8_t *dstdata, size_t struct payload_header header; uint8_t data[PM3_CMD_DATA_SIZE - sizeof(uint32_t)]; } PACKED payload; + payload.header.waittime = waittime; - if (srclen >= sizeof(payload.data)) + + if (srclen >= sizeof(payload.data)) { return PM3_EOVFLOW; + } + memcpy(payload.data, srcdata, srclen); SendCommandNG(CMD_USART_TXRX, (uint8_t *)&payload, srclen + sizeof(payload.header)); PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_USART_TXRX, &resp, waittime + 500)) { + if (WaitForResponseTimeout(CMD_USART_TXRX, &resp, waittime + 500) == false) { return PM3_ETIMEOUT; } + if (resp.status == PM3_SUCCESS) { *dstlen = resp.length; memcpy(dstdata, resp.data.asBytes, resp.length); @@ -154,7 +159,8 @@ static int usart_bt_testcomm(uint32_t baudrate, uint8_t parity) { PrintAndLogEx(SUCCESS, "TX (%3zu):%.*s at %u 8%c1", strlen(string), (int)strlen(string), string, baudrate, parity); - ret = usart_txrx((uint8_t *)string, strlen(string), data, &len, 1000); // such large timeout needed + // 1000, such large timeout needed + ret = usart_txrx((uint8_t *)string, strlen(string), data, &len, 1000); if (ret == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "RX (%3zu):%.*s", len, (int)len, data); if (strcmp((char *)data, "hc01.comV2.0") == 0 || strcmp((char *)data, "BT SPP V3.0") == 0) { From da250f9eed3b2f1a0ed61077823e3f179a3fbd24 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 28 May 2023 08:24:06 +0200 Subject: [PATCH 486/924] adapted to handle the bluetooth identifier on a Proxmark SE device. Full name is identifier is: Proxmark SE(TEST) --- pm3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm3 b/pm3 index 7c1d0e289..d59d10ea6 100755 --- a/pm3 +++ b/pm3 @@ -115,7 +115,7 @@ function get_pm3_list_Linux { if $FINDBTDIRECT; then # check if the MAC of a Proxmark3 was registered in the known devices for MAC in $(dbus-send --system --print-reply --type=method_call --dest='org.bluez' '/' org.freedesktop.DBus.ObjectManager.GetManagedObjects 2>/dev/null|\ - awk '/"Address"/{getline;gsub(/"/,"",$3);a=$3}/Name/{getline;if (/PM3_RDV4/) print a}'); do + awk '/"Address"/{getline;gsub(/"/,"",$3);a=$3}/Name/{getline;if (/PM3_RDV4/ || /Proxmark3 SE/) print a}'); do PM3LIST+=("bt:$MAC") done # we don't probe the device so there is no guarantee the device is actually present From 6d22b606c2c71c555a1bd3f7f50e4233e813ad93 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 28 May 2023 10:26:07 +0200 Subject: [PATCH 487/924] adapt comparison --- client/src/cmdusart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdusart.c b/client/src/cmdusart.c index f8538caf3..0d33ef374 100644 --- a/client/src/cmdusart.c +++ b/client/src/cmdusart.c @@ -163,7 +163,7 @@ static int usart_bt_testcomm(uint32_t baudrate, uint8_t parity) { ret = usart_txrx((uint8_t *)string, strlen(string), data, &len, 1000); if (ret == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "RX (%3zu):%.*s", len, (int)len, data); - if (strcmp((char *)data, "hc01.comV2.0") == 0 || strcmp((char *)data, "BT SPP V3.0") == 0) { + if (str_startswith((char *)data, "hc01.comV2.0") || str_startswith((char *)data, "BT SPP V3.0")) { PrintAndLogEx(SUCCESS, "Add-on " _GREEN_("found!")); return PM3_SUCCESS; } From 2b90683aff8472801c2a5fd33cc18e0355b510cc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 28 May 2023 12:34:29 +0200 Subject: [PATCH 488/924] added debug output for usart comms --- client/src/uart/uart_posix.c | 4 ++++ client/src/uart/uart_win32.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index b2a858e09..58e497d55 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -263,6 +263,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { sp->fd = open(pcPortName, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); if (sp->fd == -1) { + PrintAndLogEx(ERR, "error: UART file descriptor"); uart_close(sp); return INVALID_SERIAL_PORT; } @@ -285,6 +286,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { // Try to retrieve the old (current) terminal info struct if (tcgetattr(sp->fd, &sp->tiOld) == -1) { + PrintAndLogEx(ERR, "error: UART get terminal info attribute"); uart_close(sp); return INVALID_SERIAL_PORT; } @@ -305,6 +307,8 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { // Try to set the new terminal info struct if (tcsetattr(sp->fd, TCSANOW, &sp->tiNew) == -1) { + PrintAndLogEx(ERR, "error: UART set terminal info attribute"); + perror("tcsetattr() error"); uart_close(sp); return INVALID_SERIAL_PORT; } diff --git a/client/src/uart/uart_win32.c b/client/src/uart/uart_win32.c index 9cdcc41d1..699ac4525 100644 --- a/client/src/uart/uart_win32.c +++ b/client/src/uart/uart_win32.c @@ -98,6 +98,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { free(prefix); if (strlen(pcPortName) <= 4) { + PrintAndLogEx(ERR, "error: tcp port name length too short"); free(sp); return INVALID_SERIAL_PORT; } @@ -193,6 +194,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { sp->hPort = CreateFileA(acPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (sp->hPort == INVALID_HANDLE_VALUE) { uart_close(sp); + PrintAndLogEx(ERR, "error: invalid handle"); return INVALID_SERIAL_PORT; } From f17ce1fd682c00bdecd40058ece14762c935decd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 28 May 2023 12:40:57 +0200 Subject: [PATCH 489/924] revert one debug message --- client/src/uart/uart_posix.c | 1 - client/src/uart/uart_win32.c | 1 - 2 files changed, 2 deletions(-) diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index 58e497d55..86d76317b 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -263,7 +263,6 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { sp->fd = open(pcPortName, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); if (sp->fd == -1) { - PrintAndLogEx(ERR, "error: UART file descriptor"); uart_close(sp); return INVALID_SERIAL_PORT; } diff --git a/client/src/uart/uart_win32.c b/client/src/uart/uart_win32.c index 699ac4525..cb8b92a73 100644 --- a/client/src/uart/uart_win32.c +++ b/client/src/uart/uart_win32.c @@ -194,7 +194,6 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { sp->hPort = CreateFileA(acPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (sp->hPort == INVALID_HANDLE_VALUE) { uart_close(sp); - PrintAndLogEx(ERR, "error: invalid handle"); return INVALID_SERIAL_PORT; } From 7368cccdf90b4c68ae598ff27ee2e9db5b71e1a4 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 29 May 2023 06:57:39 +0200 Subject: [PATCH 490/924] Disney MagicBand --- client/resources/aid_desfire.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/client/resources/aid_desfire.json b/client/resources/aid_desfire.json index 45df737e5..f5387ff45 100644 --- a/client/resources/aid_desfire.json +++ b/client/resources/aid_desfire.json @@ -367,5 +367,21 @@ "Name": "University of Ljubljana Student ID", "Description": "", "Type": "student" + }, + { + "AID": "27E178", + "Vendor": "Disney", + "Country": "US", + "Name": "Disney MagicBand", + "Description": "", + "Type": "payment system" + }, + { + "AID": "44434C", + "Vendor": "Disney", + "Country": "US", + "Name": "Disney MagicBand", + "Description": "AID found on MagicBand desfire cards", + "Type": "payment system" } ] From 7c8e9db822280e5b1731ec0af6396361c1dc673b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 30 May 2023 13:46:52 +0200 Subject: [PATCH 491/924] allow user abort when wiping --- client/src/cmdhfmf.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 7487088dd..6d017a849 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -5919,8 +5919,9 @@ int CmdHFMFNDEFRead(const char *Cmd) { CLIParserFree(ctx); uint16_t ndef_aid = NDEF_MFC_AID; - if (aidlen == 2) + if (aidlen == 2){ ndef_aid = (aid[0] << 8) + aid[1]; + } uint8_t ndefkey[6] = {0}; memcpy(ndefkey, g_mifare_ndef_key, 6); @@ -7007,6 +7008,7 @@ static int CmdHF14AMfWipe(const char *Cmd) { PrintAndLogEx(INFO, "Forcing overwrite of sector 0 / block 0 "); else PrintAndLogEx(INFO, "Skipping sector 0 / block 0"); + PrintAndLogEx(NORMAL, ""); uint8_t zeros[MFBLOCK_SIZE] = {0}; @@ -7018,7 +7020,12 @@ static int CmdHF14AMfWipe(const char *Cmd) { for (uint8_t b = 0; b < mfNumBlocksPerSector(s); b++) { - // Skipp write to manufacture block if not enforced + if (kbd_enter_pressed()) { + PrintAndLogEx(WARNING, "\naborted via keyboard!\n"); + goto out; + } + + // Skip write to manufacture block if not enforced if (s == 0 && b == 0 && gen2 == false) { continue; } From 2356dfea73ad3bfca1581ad7f5f32169de8a0297 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 30 May 2023 14:14:21 +0200 Subject: [PATCH 492/924] hf mf restore - now uses the binary key loading fct() --- client/src/cmdhfmf.c | 71 ++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 6d017a849..386482483 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1256,52 +1256,40 @@ static int CmdHF14AMfRestore(const char *Cmd) { free(fptr); } - FILE *f; - if ((f = fopen(keyfilename, "rb")) == NULL) { - PrintAndLogEx(WARNING, "Could not find file " _YELLOW_("%s"), keyfilename); - return PM3_EFILE; - } - - // key arrays - uint8_t keyA[40][6]; - uint8_t keyB[40][6]; - - // read key file - size_t bytes_read; - for (uint8_t s = 0; s < sectors; s++) { - bytes_read = fread(keyA[s], 1, 6, f); - if (bytes_read != 6) { - PrintAndLogEx(ERR, "File reading error " _YELLOW_("%s"), keyfilename); - fclose(f); - return PM3_EFILE; + // + size_t alen = 0, blen = 0; + uint8_t *keyA, *keyB; + if (loadFileBinaryKey(keyfilename, "", (void**)&keyA, (void**)&keyB, &alen, &blen) != PM3_SUCCESS) { + if (keyA) { + free(keyA); } + return PM3_ESOFT; } - for (uint8_t s = 0; s < sectors; s++) { - bytes_read = fread(keyB[s], 1, 6, f); - if (bytes_read != 6) { - PrintAndLogEx(ERR, "File reading error " _YELLOW_("%s"), keyfilename); - fclose(f); - return PM3_EFILE; - } - } - fclose(f); // try reading card uid and create filename if (datafnlen == 0) { char *fptr = GenerateFilename("hf-mf-", "-dump.bin"); - if (fptr == NULL) + if (fptr == NULL) { + if (keyA) { + free(keyA); + } + if (keyB) { + free(keyB); + } return PM3_ESOFT; - + } strcpy(datafilename, fptr); free(fptr); } // read dump file uint8_t *dump = NULL; - bytes_read = 0; + size_t bytes_read = 0; int res = pm3_load_dump(datafilename, (void **)&dump, &bytes_read, (MFBLOCK_SIZE * MIFARE_4K_MAXBLOCK)); if (res != PM3_SUCCESS) { + free(keyA); + free(keyB); return res; } @@ -1326,19 +1314,10 @@ static int CmdHF14AMfRestore(const char *Cmd) { if (mfNumBlocksPerSector(s) - 1 == b) { if (use_keyfile_for_auth == false) { // replace KEY A - bldata[0] = (keyA[s][0]); - bldata[1] = (keyA[s][1]); - bldata[2] = (keyA[s][2]); - bldata[3] = (keyA[s][3]); - bldata[4] = (keyA[s][4]); - bldata[5] = (keyA[s][5]); + memcpy(bldata, keyA + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + // replace KEY B - bldata[10] = (keyB[s][0]); - bldata[11] = (keyB[s][1]); - bldata[12] = (keyB[s][2]); - bldata[13] = (keyB[s][3]); - bldata[14] = (keyB[s][4]); - bldata[15] = (keyB[s][5]); + memcpy(bldata + 10, keyB + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); } // ensure access right isn't messed up. @@ -1372,12 +1351,12 @@ static int CmdHF14AMfRestore(const char *Cmd) { for (int8_t kt = MF_KEY_B; kt > -1; kt--) { if (use_keyfile_for_auth) { if (kt == MF_KEY_A) - memcpy(wdata, keyA[s], 6); + memcpy(wdata, keyA + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); else - memcpy(wdata, keyB[s], 6); + memcpy(wdata, keyB+ (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); } else { // use default key to authenticate for the write command - memcpy(wdata, default_key, 6); + memcpy(wdata, default_key, MIFARE_KEY_SIZE); } PrintAndLogEx(INFO, "block %3d: %s", mfFirstBlockOfSector(s) + b, sprint_hex(bldata, sizeof(bldata))); @@ -1404,6 +1383,8 @@ static int CmdHF14AMfRestore(const char *Cmd) { } // end loop S free(ref_dump); + free(keyA); + free(keyB); PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; } From 1107c214c520e95ffd9a48401773f87f569f78d5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 30 May 2023 16:19:33 +0200 Subject: [PATCH 493/924] hf mf ndefformat now uses the binary key loading --- client/src/cmdhfmf.c | 43 +++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 386482483..afadc9e78 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1266,6 +1266,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { return PM3_ESOFT; } + PrintAndLogEx(INFO, "Using `" _YELLOW_("%s") "`", keyfilename); // try reading card uid and create filename if (datafnlen == 0) { @@ -6116,39 +6117,27 @@ int CmdHFMFNDEFFormat(const char *Cmd) { DropField(); } + // load key file if exist if (strlen(keyFilename)) { - - FILE *f; - if ((f = fopen(keyFilename, "rb")) == NULL) { - // PrintAndLogEx(WARNING, "Could not find file " _YELLOW_("%s"), keyFilename); + // + size_t alen = 0, blen = 0; + uint8_t *tmpA, *tmpB; + if (loadFileBinaryKey(keyFilename, "", (void**)&tmpA, (void**)&tmpB, &alen, &blen) != PM3_SUCCESS) { + if (tmpA) { + free(tmpA); + } goto skipfile; } PrintAndLogEx(INFO, "Using `" _YELLOW_("%s") "`", keyFilename); - - // Read keys A from file - size_t bytes_read; - for (uint8_t i = 0; i < numSectors; i++) { - bytes_read = fread(keyA[i], 1, MFKEY_SIZE, f); - if (bytes_read != MFKEY_SIZE) { - PrintAndLogEx(ERR, "File reading error."); - fclose(f); - return PM3_EFILE; - } + + for (int i=0; i < numSectors; i++) { + memcpy(keyA[i], tmpA + (i *MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + memcpy(keyB[i], tmpB + (i *MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); } - - // Read keys B from file - for (uint8_t i = 0; i < numSectors; i++) { - bytes_read = fread(keyB[i], 1, MFKEY_SIZE, f); - if (bytes_read != MFKEY_SIZE) { - PrintAndLogEx(ERR, "File reading error."); - fclose(f); - return PM3_EFILE; - } - } - - fclose(f); + free(tmpA); + free(tmpB); } skipfile: @@ -6191,7 +6180,6 @@ skipfile: } break; } - } // write to card, try B key first @@ -6206,7 +6194,6 @@ skipfile: } PrintAndLogEx(NORMAL, ""); - return PM3_SUCCESS; } From c59bdec4f20070b2e7ae55c519833e3255615915 Mon Sep 17 00:00:00 2001 From: d18c7db Date: Tue, 30 May 2023 19:47:27 +0200 Subject: [PATCH 494/924] Unified fpga folders --- .gitignore | 12 +- armsrc/Makefile | 3 - armsrc/fpgaloader.c | 20 +- common_arm/Makefile.common | 2 +- common_arm/Makefile.hal | 9 + fpga-xc2s30/Makefile | 60 -- fpga-xc2s30/fpga.ucf | 54 -- fpga-xc2s30/fpga_felica.bit | Bin 42179 -> 0 bytes fpga-xc2s30/fpga_felica.v | 240 ------- fpga-xc2s30/fpga_hf.bit | Bin 42175 -> 0 bytes fpga-xc2s30/fpga_hf.v | 255 -------- fpga-xc2s30/fpga_hf_15.bit | Bin 42178 -> 0 bytes fpga-xc2s30/fpga_hf_15.v | 233 ------- fpga-xc2s30/fpga_lf.bit | Bin 42175 -> 0 bytes fpga-xc2s30/fpga_lf.v | 245 -------- fpga-xc2s30/go.bat | 68 -- fpga-xc2s30/xst_felica.scr | 1 - fpga-xc2s30/xst_hf.scr | 1 - fpga-xc2s30/xst_hf_15.scr | 1 - fpga-xc2s30/xst_lf.scr | 1 - fpga-xc3s100e/.gitignore | 68 -- fpga-xc3s100e/clk_divider.v | 25 - fpga-xc3s100e/compile.sh | 9 - fpga-xc3s100e/define.v | 49 -- fpga-xc3s100e/fpga.ucf | 56 -- fpga-xc3s100e/fpga_hf.bit | Bin 72742 -> 0 bytes fpga-xc3s100e/fpga_hfmod.v | 193 ------ fpga-xc3s100e/fpga_lfmod.v | 236 ------- fpga-xc3s100e/hi_flite.v | 368 ----------- fpga-xc3s100e/hi_get_trace.v | 164 ----- fpga-xc3s100e/hi_iso14443a.v | 584 ------------------ fpga-xc3s100e/hi_reader.v | 335 ---------- fpga-xc3s100e/hi_simulate.v | 152 ----- fpga-xc3s100e/hi_sniffer.v | 50 -- fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.ise | Bin 257463 -> 0 bytes fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl | 479 -------------- fpga-xc3s100e/lf_edge_detect.v | 77 --- fpga-xc3s100e/lo_adc.v | 91 --- fpga-xc3s100e/lo_edge_detect.v | 70 --- fpga-xc3s100e/lo_passthru.v | 29 - fpga-xc3s100e/lo_read.v | 74 --- fpga-xc3s100e/lp20khz_1MSa_iir_filter.v | 81 --- fpga-xc3s100e/min_max_tracker.v | 65 -- fpga-xc3s100e/util.v | 27 - fpga/Makefile | 221 +++++++ {fpga-xc2s30 => fpga}/clk_divider.v | 7 +- fpga/define.v | 155 +++++ .../fpga_icopyx_felica.bit | 0 fpga/fpga_icopyx_hf.bit | Bin 0 -> 72749 bytes fpga/fpga_icopyx_hf.v | 227 +++++++ .../fpga_lf.bit => fpga/fpga_icopyx_hf_15.bit | 0 fpga/fpga_icopyx_lf.bit | 0 fpga/fpga_icopyx_lf.v | 218 +++++++ .../fpga_allinone.v => fpga/fpga_icopyx_top.v | 80 ++- fpga/fpga_pm3_felica.bit | Bin 0 -> 42176 bytes fpga/fpga_pm3_hf.bit | Bin 0 -> 42172 bytes fpga/fpga_pm3_hf_15.bit | Bin 0 -> 42175 bytes fpga/fpga_pm3_lf.bit | Bin 0 -> 42172 bytes fpga/fpga_pm3_top.v | 438 +++++++++++++ {fpga-xc2s30 => fpga}/hi_flite.v | 66 +- {fpga-xc2s30 => fpga}/hi_get_trace.v | 40 +- {fpga-xc2s30 => fpga}/hi_iso14443a.v | 55 +- {fpga-xc2s30 => fpga}/hi_reader.v | 42 +- {fpga-xc2s30 => fpga}/hi_reader_15.v | 43 +- {fpga-xc2s30 => fpga}/hi_simulate.v | 37 +- {fpga-xc2s30 => fpga}/hi_sniffer.v | 49 +- {fpga-xc2s30 => fpga}/lf_edge_detect.v | 49 +- {fpga-xc2s30 => fpga}/lo_adc.v | 50 +- {fpga-xc2s30 => fpga}/lo_edge_detect.v | 56 +- {fpga-xc2s30 => fpga}/lo_passthru.v | 29 +- {fpga-xc2s30 => fpga}/lo_read.v | 36 +- {fpga-xc2s30 => fpga}/lo_simulate.v | 42 +- .../lp20khz_1MSa_iir_filter.v | 7 +- {fpga-xc2s30 => fpga}/min_max_tracker.v | 9 +- fpga/mux16.v | 50 ++ {fpga-xc3s100e => fpga}/mux2_onein.v | 13 +- {fpga-xc3s100e => fpga}/mux2_oneout.v | 13 +- fpga-xc2s30/util.v => fpga/mux8.v | 30 +- {fpga-xc2s30 => fpga}/tests/Makefile | 0 .../tests/plot_edgedetect.py | 0 {fpga-xc2s30 => fpga/tests}/sim.tcl | 0 .../pcf7931_read_1MSA_data.filtered.gold | 0 .../tb_data/pcf7931_read_1MSA_data.high.gold | 0 .../tb_data/pcf7931_read_1MSA_data.highz.gold | 0 .../tests/tb_data/pcf7931_read_1MSA_data.in | 0 .../tb_data/pcf7931_read_1MSA_data.low.gold | 0 .../tb_data/pcf7931_read_1MSA_data.lowz.gold | 0 .../tb_data/pcf7931_read_1MSA_data.max.gold | Bin .../tb_data/pcf7931_read_1MSA_data.min.gold | 0 .../tb_data/pcf7931_read_1MSA_data.state.gold | Bin .../tests/tb_data/pcf7931_read_1MSA_data.time | Bin .../pcf7931_read_1MSA_data.toggle.gold | Bin ...pcf7931_write1byte_1MSA_data.filtered.gold | 0 .../pcf7931_write1byte_1MSA_data.high.gold | 0 .../pcf7931_write1byte_1MSA_data.highz.gold | 0 .../tb_data/pcf7931_write1byte_1MSA_data.in | 0 .../pcf7931_write1byte_1MSA_data.low.gold | 0 .../pcf7931_write1byte_1MSA_data.lowz.gold | 0 .../pcf7931_write1byte_1MSA_data.max.gold | Bin .../pcf7931_write1byte_1MSA_data.min.gold | 0 .../pcf7931_write1byte_1MSA_data.state.gold | Bin .../tb_data/pcf7931_write1byte_1MSA_data.time | Bin .../pcf7931_write1byte_1MSA_data.toggle.gold | Bin .../tests/tb_lf_edge_detect.v | 0 .../tests/tb_lp20khz_1MSa_iir_filter.v | 0 .../tests/tb_min_max_tracker.v | 0 {fpga-xc2s30 => fpga/tests}/testbed_fpga.v | 0 .../tests}/testbed_hi_read_tx.v | 0 .../tests}/testbed_hi_simulate.v | 0 {fpga-xc2s30 => fpga/tests}/testbed_lo_read.v | 0 .../tests}/testbed_lo_simulate.v | 0 fpga/xc2s30-5-vq100.ucf | 45 ++ fpga/xc3s100e-4-vq100.ucf | 48 ++ tools/fpga_compress/fpga_compress.c | 24 +- 114 files changed, 1852 insertions(+), 4814 deletions(-) delete mode 100644 fpga-xc2s30/Makefile delete mode 100644 fpga-xc2s30/fpga.ucf delete mode 100644 fpga-xc2s30/fpga_felica.bit delete mode 100644 fpga-xc2s30/fpga_felica.v delete mode 100644 fpga-xc2s30/fpga_hf.bit delete mode 100644 fpga-xc2s30/fpga_hf.v delete mode 100644 fpga-xc2s30/fpga_hf_15.bit delete mode 100644 fpga-xc2s30/fpga_hf_15.v delete mode 100644 fpga-xc2s30/fpga_lf.bit delete mode 100644 fpga-xc2s30/fpga_lf.v delete mode 100644 fpga-xc2s30/go.bat delete mode 100644 fpga-xc2s30/xst_felica.scr delete mode 100644 fpga-xc2s30/xst_hf.scr delete mode 100644 fpga-xc2s30/xst_hf_15.scr delete mode 100644 fpga-xc2s30/xst_lf.scr delete mode 100644 fpga-xc3s100e/.gitignore delete mode 100644 fpga-xc3s100e/clk_divider.v delete mode 100755 fpga-xc3s100e/compile.sh delete mode 100644 fpga-xc3s100e/define.v delete mode 100644 fpga-xc3s100e/fpga.ucf delete mode 100644 fpga-xc3s100e/fpga_hf.bit delete mode 100644 fpga-xc3s100e/fpga_hfmod.v delete mode 100644 fpga-xc3s100e/fpga_lfmod.v delete mode 100644 fpga-xc3s100e/hi_flite.v delete mode 100644 fpga-xc3s100e/hi_get_trace.v delete mode 100644 fpga-xc3s100e/hi_iso14443a.v delete mode 100644 fpga-xc3s100e/hi_reader.v delete mode 100644 fpga-xc3s100e/hi_simulate.v delete mode 100644 fpga-xc3s100e/hi_sniffer.v delete mode 100644 fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.ise delete mode 100644 fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl delete mode 100644 fpga-xc3s100e/lf_edge_detect.v delete mode 100644 fpga-xc3s100e/lo_adc.v delete mode 100644 fpga-xc3s100e/lo_edge_detect.v delete mode 100644 fpga-xc3s100e/lo_passthru.v delete mode 100644 fpga-xc3s100e/lo_read.v delete mode 100644 fpga-xc3s100e/lp20khz_1MSa_iir_filter.v delete mode 100644 fpga-xc3s100e/min_max_tracker.v delete mode 100644 fpga-xc3s100e/util.v create mode 100644 fpga/Makefile rename {fpga-xc2s30 => fpga}/clk_divider.v (91%) create mode 100644 fpga/define.v rename fpga-xc3s100e/fpga_felica.bit => fpga/fpga_icopyx_felica.bit (100%) create mode 100644 fpga/fpga_icopyx_hf.bit create mode 100644 fpga/fpga_icopyx_hf.v rename fpga-xc3s100e/fpga_lf.bit => fpga/fpga_icopyx_hf_15.bit (100%) create mode 100644 fpga/fpga_icopyx_lf.bit create mode 100644 fpga/fpga_icopyx_lf.v rename fpga-xc3s100e/fpga_allinone.v => fpga/fpga_icopyx_top.v (61%) create mode 100644 fpga/fpga_pm3_felica.bit create mode 100644 fpga/fpga_pm3_hf.bit create mode 100644 fpga/fpga_pm3_hf_15.bit create mode 100644 fpga/fpga_pm3_lf.bit create mode 100644 fpga/fpga_pm3_top.v rename {fpga-xc2s30 => fpga}/hi_flite.v (92%) rename {fpga-xc2s30 => fpga}/hi_get_trace.v (86%) rename {fpga-xc2s30 => fpga}/hi_iso14443a.v (97%) rename {fpga-xc2s30 => fpga}/hi_reader.v (95%) rename {fpga-xc2s30 => fpga}/hi_reader_15.v (96%) rename {fpga-xc2s30 => fpga}/hi_simulate.v (91%) rename {fpga-xc2s30 => fpga}/hi_sniffer.v (69%) rename {fpga-xc2s30 => fpga}/lf_edge_detect.v (72%) rename {fpga-xc2s30 => fpga}/lo_adc.v (74%) rename {fpga-xc2s30 => fpga}/lo_edge_detect.v (67%) rename {fpga-xc2s30 => fpga}/lo_passthru.v (82%) rename {fpga-xc2s30 => fpga}/lo_read.v (80%) rename {fpga-xc2s30 => fpga}/lo_simulate.v (79%) rename {fpga-xc2s30 => fpga}/lp20khz_1MSa_iir_filter.v (96%) rename {fpga-xc2s30 => fpga}/min_max_tracker.v (95%) create mode 100644 fpga/mux16.v rename {fpga-xc3s100e => fpga}/mux2_onein.v (70%) rename {fpga-xc3s100e => fpga}/mux2_oneout.v (68%) rename fpga-xc2s30/util.v => fpga/mux8.v (68%) rename {fpga-xc2s30 => fpga}/tests/Makefile (100%) rename {fpga-xc2s30 => fpga}/tests/plot_edgedetect.py (100%) mode change 100755 => 100644 rename {fpga-xc2s30 => fpga/tests}/sim.tcl (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.high.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.highz.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.in (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.low.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.max.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.min.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.state.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.time (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.in (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.time (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_lf_edge_detect.v (100%) rename {fpga-xc2s30 => fpga}/tests/tb_lp20khz_1MSa_iir_filter.v (100%) rename {fpga-xc2s30 => fpga}/tests/tb_min_max_tracker.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_fpga.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_hi_read_tx.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_hi_simulate.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_lo_read.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_lo_simulate.v (100%) create mode 100644 fpga/xc2s30-5-vq100.ucf create mode 100644 fpga/xc3s100e-4-vq100.ucf diff --git a/.gitignore b/.gitignore index 8469c8449..30cc1020a 100644 --- a/.gitignore +++ b/.gitignore @@ -80,17 +80,7 @@ tools/mfd_aes_brute/mfd_aes_brute tools/mfd_aes_brute/mfd_multi_brute tools/mfd_aes_brute/brute_key -fpga/* -!fpga/tests -!fpga/fpga_lf.bit -!fpga/fpga_hf.bit -!fpga/*.v -!fpga/Makefile -!fpga/fpga.ucf -!fpga/xst_lf.scr -!fpga/xst_hf.scr -!fpga/go.bat -!fpga/sim.tcl +fpga/__build* # offcial dumps folder dumps/* diff --git a/armsrc/Makefile b/armsrc/Makefile index 5203b0292..c481a6f22 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -103,9 +103,6 @@ endif # Generic standalone Mode injection of source code include Standalone/Makefile.inc -#the FPGA bitstream files. Note: order matters! -FPGA_BITSTREAMS = fpga_lf.bit fpga_hf.bit fpga_felica.bit fpga_hf_15.bit - #the lz4 source files required for decompressing the fpga config at run time SRC_LZ4 = lz4.c #additional defines required to compile lz4 diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 6f8dd7a0b..6715aa962 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -404,16 +404,22 @@ static int bitparse_find_section(int bitstream_version, char section_name, uint3 /* Four byte length field */ current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 24; current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 16; - numbytes += 2; - default: /* Fall through, two byte length field */ + current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 8; + current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 0; + numbytes += 4; + if (current_length > 300*1024) { + /* section e should never exceed about 300KB, if the length is too big limit it but still send the bitstream just in case */ + current_length = 300*1024; + } + break; + default: /* Two byte length field */ current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 8; current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 0; numbytes += 2; - } - - if (current_name != 'e' && current_length > 255) { - /* Maybe a parse error */ - break; + if (current_length > 64) { + /* if text field is too long, keep it but truncate it */ + current_length = 64; + } } if (current_name == section_name) { diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 99f4d9ecd..18d931b46 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -44,7 +44,7 @@ OBJDIR = obj INCLUDE = -I../include -I../common_arm -I../common_fpga -I../common -I. # Also search prerequisites in the common directory (for usb.c), the fpga directory (for fpga.bit), and the lz4 directory -VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/lz4 ../fpga-$(PLATFORM_FPGA) ../armsrc/Standalone +VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/lz4 ../fpga ../armsrc/Standalone INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h diff --git a/common_arm/Makefile.hal b/common_arm/Makefile.hal index a65514784..9679382ce 100644 --- a/common_arm/Makefile.hal +++ b/common_arm/Makefile.hal @@ -92,18 +92,26 @@ PLTNAME = Unknown Platform PLATFORM_FPGA = fpga-undefined ifeq ($(PLATFORM),PM3RDV4) + # FPGA bitstream files, the order matters! + FPGA_BITSTREAMS = fpga_pm3_lf.bit fpga_pm3_hf.bit fpga_pm3_felica.bit fpga_pm3_hf_15.bit PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH -DRDV4 PLTNAME = Proxmark3 RDV4 PLATFORM_FPGA = xc2s30 RDV4 = yes else ifeq ($(PLATFORM),PM3OTHER) $(warning PLATFORM=PM3OTHER is deprecated, please use PLATFORM=PM3GENERIC) + # FPGA bitstream files, the order matters! + FPGA_BITSTREAMS = fpga_pm3_lf.bit fpga_pm3_hf.bit fpga_pm3_felica.bit fpga_pm3_hf_15.bit PLTNAME = Proxmark3 generic target PLATFORM_FPGA = xc2s30 else ifeq ($(PLATFORM),PM3GENERIC) + # FPGA bitstream files, the order matters! + FPGA_BITSTREAMS = fpga_pm3_lf.bit fpga_pm3_hf.bit fpga_pm3_felica.bit fpga_pm3_hf_15.bit PLTNAME = Proxmark3 generic target PLATFORM_FPGA = xc2s30 else ifeq ($(PLATFORM),PM3ICOPYX) + # FPGA bitstream files, the order matters - only hf has a bitstream, the other 3 files are 0 bytes + FPGA_BITSTREAMS = fpga_icopyx_lf.bit fpga_icopyx_hf.bit fpga_icopyx_felica.bit fpga_icopyx_hf_15.bit PLATFORM_DEFS = -DWITH_FLASH -DICOPYX -DXC3 PLTNAME = iCopy-X with XC3S100E PLATFORM_FPGA = xc3s100e @@ -246,6 +254,7 @@ export PLATFORM_DEFS export PLATFORM_DEFS_INFO export PLATFORM_DEFS_INFO_STANDALONE export PLATFORM_CHANGED +export FPGA_BITSTREAMS $(info ===================================================================) $(info Version info: $(shell tools/mkversion.sh --short 2>/dev/null || ../tools/mkversion.sh --short 2>/dev/null)) diff --git a/fpga-xc2s30/Makefile b/fpga-xc2s30/Makefile deleted file mode 100644 index 2bf9273ba..000000000 --- a/fpga-xc2s30/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -# -# FPGA Makefile -# -RMDIR = rm -rf -# rmdir only if dir is empty, tolerate failure -RMDIR_SOFT = -rmdir -# -all: fpga_lf.bit fpga_hf.bit fpga_felica.bit fpga_hf_15.bit -clean: - $(Q)$(RM) *.bgn *.drc *.ncd *.ngd *_par.xrpt *-placed.* *-placed_pad.* *_usage.xml xst_hf.srp xst_lf.srp xst_felica.srp xst_hf_15.srp - $(Q)$(RM) *.map *.ngc *.xrpt *.pcf *.rbt *.bld *.mrp *.ngm *.unroutes *_summary.xml netlist.lst - $(Q)$(RMDIR) *_auto_* xst - -#fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_reader.v hi_iso14443a.v hi_sniffer.v hi_flite.v hi_get_trace.v -fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_reader.v hi_iso14443a.v hi_sniffer.v hi_get_trace.v - $(Q)$(RM) $@ - $(info [-] XST $@) - $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_hf.scr - -fpga_felica.ngc: fpga_felica.v fpga.ucf xst_felica.scr util.v hi_simulate.v hi_reader.v hi_sniffer.v hi_flite.v hi_get_trace.v - $(Q)$(RM) $@ - $(info [-] XST $@) - $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_felica.scr - -fpga_hf_15.ngc: fpga_hf_15.v fpga.ucf xst_hf_15.scr util.v hi_simulate.v hi_reader_15.v hi_sniffer.v hi_get_trace.v - $(Q)$(RM) $@ - $(info [-] XST $@) - $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_hf_15.scr - -fpga_lf.ngc: fpga_lf.v fpga.ucf xst_lf.scr util.v clk_divider.v lo_edge_detect.v lo_read.v lo_passthru.v lp20khz_1MSa_iir_filter.v min_max_tracker.v lf_edge_detect.v - $(Q)$(RM) $@ - $(info [-] XST $@) - $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_lf.scr - -%.ngd: %.ngc - $(Q)$(RM) $@ - $(info [-] NGD $@) - $(Q)$(XILINX_TOOLS_PREFIX)ngdbuild -aul -p xc2s30-5-vq100 -nt timestamp -uc fpga.ucf $< $@ - -%.ncd: %.ngd - $(Q)$(RM) $@ - $(info [-] MAP $@) - $(Q)$(XILINX_TOOLS_PREFIX)map -p xc2s30-5-vq100 $< - -%-placed.ncd: %.ncd - $(Q)$(RM) $@ - $(info [-] PAR $@) - $(Q)$(XILINX_TOOLS_PREFIX)par $< $@ - -%.bit: %-placed.ncd - $(Q)$(RM) $@ $*.drc $*.rbt - $(info [=] BITGEN $@) - $(Q)$(XILINX_TOOLS_PREFIX)bitgen $< $@ - -.PHONY: all clean help -help: - @echo Possible targets: - @echo + all - Make fpga.bit, the FPGA bitstream - @echo + clean - Clean intermediate files, does not clean fpga.bit - diff --git a/fpga-xc2s30/fpga.ucf b/fpga-xc2s30/fpga.ucf deleted file mode 100644 index f20e2da02..000000000 --- a/fpga-xc2s30/fpga.ucf +++ /dev/null @@ -1,54 +0,0 @@ -# See the schematic for the pin assignment. - -NET "adc_d<0>" LOC = "P62" ; -NET "adc_d<1>" LOC = "P60" ; -NET "adc_d<2>" LOC = "P58" ; -NET "adc_d<3>" LOC = "P57" ; -NET "adc_d<4>" LOC = "P56" ; -NET "adc_d<5>" LOC = "P55" ; -NET "adc_d<6>" LOC = "P54" ; -NET "adc_d<7>" LOC = "P53" ; -#NET "cross_hi" LOC = "P88" ; -#NET "miso" LOC = "P40" ; -#PACE: Start of Constraints generated by PACE - -#PACE: Start of PACE I/O Pin Assignments -NET "adc_clk" LOC = "P46" ; -NET "adc_noe" LOC = "P47" ; -NET "ck_1356meg" LOC = "P91" ; -NET "ck_1356megb" LOC = "P93" ; -NET "cross_lo" LOC = "P87" ; -NET "dbg" LOC = "P22" ; -NET "mosi" LOC = "P43" ; -NET "ncs" LOC = "P44" ; -NET "pck0" LOC = "P36" ; -NET "pwr_hi" LOC = "P80" ; -NET "pwr_lo" LOC = "P81" ; -NET "pwr_oe1" LOC = "P82" ; -NET "pwr_oe2" LOC = "P83" ; -NET "pwr_oe3" LOC = "P84" ; -NET "pwr_oe4" LOC = "P86" ; -NET "spck" LOC = "P39" ; -NET "ssp_clk" LOC = "P71" ; -NET "ssp_din" LOC = "P32" ; -NET "ssp_dout" LOC = "P34" ; -NET "ssp_frame" LOC = "P31" ; - -#PACE: Start of PACE Area Constraints - -#PACE: Start of PACE Prohibit Constraints - -#PACE: End of Constraints generated by PACE - -# definition of Clock nets: -NET "ck_1356meg" TNM_NET = "clk_net_1356" ; -NET "ck_1356megb" TNM_NET = "clk_net_1356b" ; -NET "pck0" TNM_NET = "clk_net_pck0" ; -NET "spck" TNM_NET = "clk_net_spck" ; - -# Timing specs of clock nets: -TIMEGRP "clk_net_1356_all" = "clk_net_1356" "clk_net_1356b" ; -TIMESPEC "TS_1356MHz" = PERIOD "clk_net_1356_all" 74 ns HIGH 37 ns ; -TIMESPEC "TS_24MHz" = PERIOD "clk_net_pck0" 42 ns HIGH 21 ns ; -TIMESPEC "TS_4MHz" = PERIOD "clk_net_spck" 250 ns HIGH 125 ns ; - diff --git a/fpga-xc2s30/fpga_felica.bit b/fpga-xc2s30/fpga_felica.bit deleted file mode 100644 index 30ea16e332b8d28b03a80605bc0531fd5864d0c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42179 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 VbcHV;&EOOomiOv8^Q~Kd`@ho-u|5C* diff --git a/fpga-xc2s30/fpga_felica.v b/fpga-xc2s30/fpga_felica.v deleted file mode 100644 index 6fb53927c..000000000 --- a/fpga-xc2s30/fpga_felica.v +++ /dev/null @@ -1,240 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- -// -// The FPGA is responsible for interfacing between the A/D, the coil drivers, -// and the ARM. In the low-frequency modes it passes the data straight -// through, so that the ARM gets raw A/D samples over the SSP. In the high- -// frequency modes, the FPGA might perform some demodulation first, to -// reduce the amount of data that we must send to the ARM. -// -// I am not really an FPGA/ASIC designer, so I am sure that a lot of this -// could be improved. -// -// Jonathan Westhues, March 2006 -// -// Added ISO14443-A support -// - - -// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h -// Note: the definitions here are without shifts - -// Commands: -`define FPGA_CMD_SET_CONFREG 1 -`define FPGA_CMD_TRACE_ENABLE 2 - -// Major modes: -`define FPGA_MAJOR_MODE_HF_READER 0 -`define FPGA_MAJOR_MODE_HF_SIMULATOR 1 -`define FPGA_MAJOR_MODE_HF_ISO14443A 2 -`define FPGA_MAJOR_MODE_HF_SNIFF 3 -`define FPGA_MAJOR_MODE_HF_ISO18092 4 -`define FPGA_MAJOR_MODE_HF_GET_TRACE 5 -`define FPGA_MAJOR_MODE_OFF 7 - -// Options for the generic HF reader -`define FPGA_HF_READER_MODE_RECEIVE_IQ 0 -`define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE 1 -`define FPGA_HF_READER_MODE_RECEIVE_PHASE 2 -`define FPGA_HF_READER_MODE_SEND_FULL_MOD 3 -`define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD 4 -`define FPGA_HF_READER_MODE_SNIFF_IQ 5 -`define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE 6 -`define FPGA_HF_READER_MODE_SNIFF_PHASE 7 -`define FPGA_HF_READER_MODE_SEND_JAM 8 - -`define FPGA_HF_READER_SUBCARRIER_848_KHZ 0 -`define FPGA_HF_READER_SUBCARRIER_424_KHZ 1 -`define FPGA_HF_READER_SUBCARRIER_212_KHZ 2 - -// Options for the HF simulated tag, how to modulate -`define FPGA_HF_SIMULATOR_NO_MODULATION 0 -`define FPGA_HF_SIMULATOR_MODULATE_BPSK 1 -`define FPGA_HF_SIMULATOR_MODULATE_212K 2 -`define FPGA_HF_SIMULATOR_MODULATE_424K 4 -`define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT 5 - -// Options for ISO14443A -`define FPGA_HF_ISO14443A_SNIFFER 0 -`define FPGA_HF_ISO14443A_TAGSIM_LISTEN 1 -`define FPGA_HF_ISO14443A_TAGSIM_MOD 2 -`define FPGA_HF_ISO14443A_READER_LISTEN 3 -`define FPGA_HF_ISO14443A_READER_MOD 4 - -//options for ISO18092 / Felica -`define FPGA_HF_ISO18092_FLAG_NOMOD 1 // 0001 disable modulation module -`define FPGA_HF_ISO18092_FLAG_424K 2 // 0010 should enable 414k mode (untested). No autodetect -`define FPGA_HF_ISO18092_FLAG_READER 4 // 0100 enables antenna power, to act as a reader instead of tag - -`include "hi_reader.v" -`include "hi_simulate.v" -//`include "hi_iso14443a.v" -`include "hi_sniffer.v" -`include "util.v" -`include "hi_flite.v" -`include "hi_get_trace.v" - -module fpga_felica( - input spck, output miso, input mosi, input ncs, - input pck0, input ck_1356meg, input ck_1356megb, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, output adc_noe, - output ssp_frame, output ssp_din, input ssp_dout, output ssp_clk, - input cross_hi, input cross_lo, - output dbg -); - -//----------------------------------------------------------------------------- -// The SPI receiver. This sets up the configuration word, which the rest of -// the logic looks at to determine how to connect the A/D and the coil -// drivers (i.e., which section gets it). Also assign some symbolic names -// to the configuration bits, for use below. -//----------------------------------------------------------------------------- - -/* - Attempt to write up how its hooked up. Iceman 2020. - - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() - Send 16 bit command / data pair to FPGA - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data - - shift_reg receive this 16bit frame - - ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- -*/ - -reg [15:0] shift_reg; -reg [8:0] conf_word; -reg trace_enable; - -// We switch modes between transmitting to the 13.56 MHz tag and receiving -// from it, which means that we must make sure that we can do so without -// glitching, or else we will glitch the transmitted carrier. -always @(posedge ncs) -begin - case(shift_reg[15:12]) - `FPGA_CMD_SET_CONFREG: conf_word <= shift_reg[8:0]; - `FPGA_CMD_TRACE_ENABLE: trace_enable <= shift_reg[0]; - endcase -end - -always @(posedge spck) -begin - if(~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -// select module (outputs) based on major mode -wire [2:0] major_mode = conf_word[8:6]; - -// configuring the HF reader -wire [1:0] subcarrier_frequency = conf_word[5:4]; -wire [3:0] minor_mode = conf_word[3:0]; - -//----------------------------------------------------------------------------- -// And then we instantiate the modules corresponding to each of the FPGA's -// major modes, and use muxes to connect the outputs of the active mode to -// the output pins. -//----------------------------------------------------------------------------- - -// 000 - HF reader -hi_reader hr( - ck_1356megb, - hr_pwr_lo, hr_pwr_hi, hr_pwr_oe1, hr_pwr_oe2, hr_pwr_oe3, hr_pwr_oe4, - adc_d, hr_adc_clk, - hr_ssp_frame, hr_ssp_din, ssp_dout, hr_ssp_clk, - hr_dbg, - subcarrier_frequency, minor_mode -); - -// 001 - HF simulated tag -hi_simulate hs( - ck_1356meg, - hs_pwr_lo, hs_pwr_hi, hs_pwr_oe1, hs_pwr_oe2, hs_pwr_oe3, hs_pwr_oe4, - adc_d, hs_adc_clk, - hs_ssp_frame, hs_ssp_din, ssp_dout, hs_ssp_clk, - hs_dbg, - minor_mode -); - -// 011 - HF sniff -hi_sniffer he( - ck_1356megb, - he_pwr_lo, he_pwr_hi, he_pwr_oe1, he_pwr_oe2, he_pwr_oe3, he_pwr_oe4, - adc_d, he_adc_clk, - he_ssp_frame, he_ssp_din, he_ssp_clk -); - -// 100 - HF ISO18092 FeliCa -hi_flite hfl( - ck_1356megb, - hfl_pwr_lo, hfl_pwr_hi, hfl_pwr_oe1, hfl_pwr_oe2, hfl_pwr_oe3, hfl_pwr_oe4, - adc_d, hfl_adc_clk, - hfl_ssp_frame, hfl_ssp_din, ssp_dout, hfl_ssp_clk, - hfl_dbg, - minor_mode -); - -// 101 - HF get trace -hi_get_trace gt( - ck_1356megb, - adc_d, trace_enable, major_mode, - gt_ssp_frame, gt_ssp_din, gt_ssp_clk -); - -// Major modes: -// 000 -- HF reader; subcarrier frequency and modulation depth selectable -// 001 -- HF simulated tag -// 010 -- HF ISO14443-A - removed for space... -// 011 -- HF sniff -// 100 -- HF ISO18092 FeliCa -// 101 -- HF get trace -// 110 -- unused -// 111 -- FPGA_MAJOR_MODE_OFF - -// 000 001 010 011 100 101 110 111 -mux8 mux_ssp_clk (major_mode, ssp_clk, hr_ssp_clk, hs_ssp_clk, 1'b0, he_ssp_clk, hfl_ssp_clk, gt_ssp_clk, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, hr_ssp_din, hs_ssp_din, 1'b0, he_ssp_din, hfl_ssp_din, gt_ssp_din, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, hr_ssp_frame, hs_ssp_frame, 1'b0, he_ssp_frame, hfl_ssp_frame, gt_ssp_frame, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, hr_pwr_oe1, hs_pwr_oe1, 1'b0, he_pwr_oe1, hfl_pwr_oe1, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, hr_pwr_oe2, hs_pwr_oe2, 1'b0, he_pwr_oe2, hfl_pwr_oe2, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, hr_pwr_oe3, hs_pwr_oe3, 1'b0, he_pwr_oe3, hfl_pwr_oe3, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, hr_pwr_oe4, hs_pwr_oe4, 1'b0, he_pwr_oe4, hfl_pwr_oe4, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, hr_pwr_lo, hs_pwr_lo, 1'b0, he_pwr_lo, hfl_pwr_lo, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, hr_pwr_hi, hs_pwr_hi, 1'b0, he_pwr_hi, hfl_pwr_hi, 1'b0, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, hr_adc_clk, hs_adc_clk, 1'b0, he_adc_clk, hfl_adc_clk, 1'b0, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, hr_dbg, hs_dbg, 1'b0, he_dbg, hfl_dbg, 1'b0, 1'b0, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga-xc2s30/fpga_hf.bit b/fpga-xc2s30/fpga_hf.bit deleted file mode 100644 index 72f3d619e974e6aac2968b4524a055684934eb18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42175 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 z 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 ZMfoGYeNB>b{Cn`F_&uYQw3OfS{{^O35heft diff --git a/fpga-xc2s30/fpga_lf.v b/fpga-xc2s30/fpga_lf.v deleted file mode 100644 index bb9116f10..000000000 --- a/fpga-xc2s30/fpga_lf.v +++ /dev/null @@ -1,245 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- -// - - -// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h -// Note: the definitions here are without shifts - -// Commands: -`define FPGA_CMD_SET_CONFREG 1 -`define FPGA_CMD_SET_DIVISOR 2 -`define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD 3 - -// Major modes: -`define FPGA_MAJOR_MODE_LF_READER 0 -`define FPGA_MAJOR_MODE_LF_EDGE_DETECT 1 -`define FPGA_MAJOR_MODE_LF_PASSTHRU 2 -`define FPGA_MAJOR_MODE_LF_ADC 3 - -// Options for LF_READER -`define FPGA_LF_ADC_READER_FIELD 1 - -// Options for LF_EDGE_DETECT -`define FPGA_LF_EDGE_DETECT_READER_FIELD 1 -`define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 2 - -`include "lo_read.v" -`include "lo_passthru.v" -`include "lo_edge_detect.v" -`include "lo_adc.v" -`include "util.v" -`include "clk_divider.v" - -module fpga_lf( - input spck, output miso, input mosi, input ncs, - input pck0, input ck_1356meg, input ck_1356megb, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, output adc_noe, - output ssp_frame, output ssp_din, input ssp_dout, output ssp_clk, - input cross_hi, input cross_lo, - output dbg -); - -//----------------------------------------------------------------------------- -// The SPI receiver. This sets up the configuration word, which the rest of -// the logic looks at to determine how to connect the A/D and the coil -// drivers (i.e., which section gets it). Also assign some symbolic names -// to the configuration bits, for use below. -//----------------------------------------------------------------------------- - -/* - Attempt to write up how its hooked up. Iceman 2020. - - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() - Send 16 bit command / data pair to FPGA - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data - - shift_reg receive this 16bit frame - - LF command - ---------- - shift_reg[15:12] == 4bit command - LF has three commands (FPGA_CMD_SET_CONFREG, FPGA_CMD_SET_DIVISOR, FPGA_CMD_SET_EDGE_DETECT_THRESHOLD) - Current commands uses only 2bits. We have room for up to 4bits of commands total (7). - - LF data - ------- - shift_reg[11:0] == 12bit data - lf data is divided into MAJOR MODES and configuration values. - - The major modes uses 3bits (0,1,2,3,7 | 000, 001, 010, 011, 111) - 000 FPGA_MAJOR_MODE_LF_READER = Act as LF reader (modulate) - 001 FPGA_MAJOR_MODE_LF_EDGE_DETECT = Simulate LF - 010 FPGA_MAJOR_MODE_LF_PASSTHRU = Passthrough mode, CROSS_LO line connected to SSP_DIN. SSP_DOUT logic level controls if we modulate / listening - 011 FPGA_MAJOR_MODE_LF_ADC = refactor hitag2, clear ADC sampling - 111 FPGA_MAJOR_MODE_OFF = turn off sampling. - - Each one of this major modes can have options. Currently these two major modes uses options. - - FPGA_MAJOR_MODE_LF_READER - - FPGA_MAJOR_MODE_LF_EDGE_DETECT - - FPGA_MAJOR_MODE_LF_READER - ------------------------------------- - lf_field = 1bit (FPGA_LF_ADC_READER_FIELD) - - You can send FPGA_CMD_SET_DIVISOR to set with FREQUENCY the fpga should sample at - divisor = 8bits shift_reg[7:0] - - FPGA_MAJOR_MODE_LF_EDGE_DETECT - ------------------------------------------ - lf_ed_toggle_mode = 1bits - lf_ed_threshold = 8bits threshold defaults to 127 - - You can send FPGA_CMD_SET_EDGE_DETECT_THRESHOLD to set a custom threshold - lf_ed_threshold = 8bits threshold value. - - conf_word 12bits - conf_word[8:6] = 3bit major mode. - conf_word[0] = 1bit lf_field - conf_word[1] = 1bit lf_ed_toggle_mode - conf_word[7:0] = 8bit divisor - conf_word[7:0] = 8bit threshold - ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- -*/ - -reg [15:0] shift_reg; -reg [7:0] divisor; -reg [7:0] lf_ed_threshold; -reg [11:0] conf_word; - -wire [2:0] major_mode = conf_word[8:6]; -wire lf_field = conf_word[0]; -wire lf_ed_toggle_mode = conf_word[1]; - -// Handles cmd / data frame from ARM -always @(posedge ncs) -begin - // 4 bit command - case (shift_reg[15:12]) - `FPGA_CMD_SET_CONFREG: - begin - // 12 bit data - conf_word <= shift_reg[11:0]; - if (shift_reg[8:6] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) - begin - lf_ed_threshold <= 127; // default threshold - end - end - - `FPGA_CMD_SET_DIVISOR: - divisor <= shift_reg[7:0]; // 8bits - - `FPGA_CMD_SET_EDGE_DETECT_THRESHOLD: - lf_ed_threshold <= shift_reg[7:0]; // 8 bits - endcase -end - -// Receive 16bits of data from ARM here. -always @(posedge spck) -begin - if (~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -//----------------------------------------------------------------------------- -// And then we instantiate the modules corresponding to each of the FPGA's -// major modes, and use muxes to connect the outputs of the active mode to -// the output pins. -//----------------------------------------------------------------------------- -wire [7:0] pck_cnt; -wire pck_divclk; -clk_divider div_clk(pck0, divisor, pck_cnt, pck_divclk); - -lo_read lr( - pck0, pck_cnt, pck_divclk, - lr_pwr_lo, lr_pwr_hi, lr_pwr_oe1, lr_pwr_oe2, lr_pwr_oe3, lr_pwr_oe4, - adc_d, lr_adc_clk, - lr_ssp_frame, lr_ssp_din, lr_ssp_clk, - lr_dbg, lf_field -); - -lo_passthru lp( - pck_divclk, - lp_pwr_lo, lp_pwr_hi, lp_pwr_oe1, lp_pwr_oe2, lp_pwr_oe3, lp_pwr_oe4, - lp_adc_clk, - lp_ssp_din, ssp_dout, - cross_lo, - lp_dbg -); - -lo_edge_detect le( - pck0, pck_divclk, - le_pwr_lo, le_pwr_hi, le_pwr_oe1, le_pwr_oe2, le_pwr_oe3, le_pwr_oe4, - adc_d, le_adc_clk, - le_ssp_frame, ssp_dout, le_ssp_clk, - cross_lo, - le_dbg, - lf_field, - lf_ed_toggle_mode, lf_ed_threshold -); - -lo_adc la( - pck0, - la_pwr_lo, la_pwr_hi, la_pwr_oe1, la_pwr_oe2, la_pwr_oe3, la_pwr_oe4, - adc_d, la_adc_clk, - la_ssp_frame, la_ssp_din, ssp_dout, la_ssp_clk, - la_dbg, divisor, - lf_field -); - -// Major modes: -// 000 -- LF reader (generic) -// 001 -- LF edge detect (generic) -// 010 -- LF passthrough -// 011 -- LF ADC (read/write) -// 100 -- unused -// 101 -- unused -// 110 -- unused -// 111 -- FPGA_MAJOR_MODE_OFF -// 000 001 010 011 100 101 110 111 -mux8 mux_ssp_clk (major_mode, ssp_clk, lr_ssp_clk, le_ssp_clk, 1'b0, la_ssp_clk, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, lr_ssp_din, 1'b0, lp_ssp_din, la_ssp_din, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, lr_ssp_frame, le_ssp_frame, 1'b0, la_ssp_frame, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, lr_pwr_oe1, le_pwr_oe1, lp_pwr_oe1, la_pwr_oe1, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, lr_pwr_oe2, le_pwr_oe2, lp_pwr_oe2, la_pwr_oe2, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, lr_pwr_oe3, le_pwr_oe3, lp_pwr_oe3, la_pwr_oe3, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, lr_pwr_oe4, le_pwr_oe4, lp_pwr_oe4, la_pwr_oe4, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, lr_pwr_lo, le_pwr_lo, lp_pwr_lo, la_pwr_lo, 1'b0, 1'b0, 1'b1, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, lr_pwr_hi, le_pwr_hi, lp_pwr_hi, la_pwr_hi, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, lr_adc_clk, le_adc_clk, lp_adc_clk, la_adc_clk, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, lr_dbg, le_dbg, lp_dbg, la_dbg, 1'b0, 1'b0, 1'b0, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga-xc2s30/go.bat b/fpga-xc2s30/go.bat deleted file mode 100644 index d9704e08d..000000000 --- a/fpga-xc2s30/go.bat +++ /dev/null @@ -1,68 +0,0 @@ -@echo off - -rmdir/s/q xst - -del fpga_lf.ngc -xst -ifn xst_lf.scr -if errorlevel 0 goto ok1 -goto done -:ok1 - -del fpga_lf.ngd -ngdbuild -aul -p xc2s30-6vq100 -nt timestamp -uc fpga.ucf fpga_lf.ngc fpga_lf.ngd -if errorlevel 0 goto ok2 -goto done -:ok2 - -del fpga_lf.ncd -map -p xc2s30-6vq100 fpga_lf.ngd -if errorlevel 0 goto ok3 -goto done -:ok3 - -del fpga_lf-placed.ncd -par fpga_lf.ncd fpga_lf-placed.ncd -if errorlevel 0 goto ok4 -goto done -:ok4 - -del fpga_lf.bit fpga_lf.drc fpga_lf.rbt -bitgen -b fpga_lf-placed.ncd fpga_lf.bit -if errorlevel 0 goto ok5 -goto done -:ok5 - -del fpga_hf.ngc -xst -ifn xst_hf.scr -if errorlevel 0 goto ok6 -goto done -:ok6 - -del fpga_hf.ngd -ngdbuild -aul -p xc2s30-6vq100 -nt timestamp -uc fpga.ucf fpga_hf.ngc fpga_hf.ngd -if errorlevel 0 goto ok7 -goto done -:ok7 - -del fpga_hf.ncd -map -p xc2s30-6vq100 fpga_hf.ngd -if errorlevel 0 goto ok8 -goto done -:ok8 - -del fpga_hf-placed.ncd -par fpga_hf.ncd fpga_hf-placed.ncd -if errorlevel 0 goto ok9 -goto done -:ok9 - -del fpga_hf.bit fpga_hf.drc fpga_hf.rbt -bitgen -b fpga_hf-placed.ncd fpga_hf.bit -if errorlevel 0 goto ok10 -goto done -:ok10 - -echo okay -perl ..\tools\rbt2c.pl fpga_lf.rbt > ..\armsrc\fpgaimg.c - -:done diff --git a/fpga-xc2s30/xst_felica.scr b/fpga-xc2s30/xst_felica.scr deleted file mode 100644 index b069fab13..000000000 --- a/fpga-xc2s30/xst_felica.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga_felica.v -ifmt Verilog -ofn fpga_felica.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_felica -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga-xc2s30/xst_hf.scr b/fpga-xc2s30/xst_hf.scr deleted file mode 100644 index dd2fdc859..000000000 --- a/fpga-xc2s30/xst_hf.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga_hf.v -ifmt Verilog -ofn fpga_hf.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_hf -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga-xc2s30/xst_hf_15.scr b/fpga-xc2s30/xst_hf_15.scr deleted file mode 100644 index d8bb5ae7c..000000000 --- a/fpga-xc2s30/xst_hf_15.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga_hf_15.v -ifmt Verilog -ofn fpga_hf_15.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_hf_15 -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga-xc2s30/xst_lf.scr b/fpga-xc2s30/xst_lf.scr deleted file mode 100644 index 2d6c7e951..000000000 --- a/fpga-xc2s30/xst_lf.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga_lf.v -ifmt Verilog -ofn fpga_lf.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_lf -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga-xc3s100e/.gitignore b/fpga-xc3s100e/.gitignore deleted file mode 100644 index b21d41545..000000000 --- a/fpga-xc3s100e/.gitignore +++ /dev/null @@ -1,68 +0,0 @@ -# intermediate build files -*.bgn -*.bit -*.bld -*.cmd_log -*.drc -*.ll -*.lso -*.msd -*.msk -*.ncd -*.ngc -*.ngd -*.ngr -*.pad -*.par -*.pcf -*.prj -*.ptwx -*.rbb -*.rbd -*.stx -*.syr -*.twr -*.twx -*.unroutes -*.ut -*.xpi -*.xst -*_bitgen.xwbt -*_envsettings.html -*_map.map -*_map.mrp -*_map.ngm -*_map.xrpt -*_ngdbuild.xrpt -*_pad.csv -*_pad.txt -*_par.xrpt -*_summary.html -*_summary.xml -*_usage.xml -*_xst.xrpt - -# iMPACT generated files -_impactbatch.log -impact.xsl -impact_impact.xwbt -ise_impact.cmd -webtalk_impact.xml - -# Core Generator generated files -xaw2verilog.log - -# project-wide generated files -*.gise -par_usage_statistics.html -usage_statistics_webtalk.html -webtalk.log -webtalk_pn.xml - -# generated folders -iseconfig/ -xlnx_auto_0_xdb/ -xst/ -_ngo/ -_xmsgs/ -fpga_hf_xdb/tmp/ diff --git a/fpga-xc3s100e/clk_divider.v b/fpga-xc3s100e/clk_divider.v deleted file mode 100644 index 9a57879b0..000000000 --- a/fpga-xc3s100e/clk_divider.v +++ /dev/null @@ -1,25 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -module clk_divider(input clk, input [7:0] divisor, output [7:0] div_cnt, output div_clk); - - reg [7:0] div_cnt_ = 0; - reg div_clk_; - assign div_cnt = div_cnt_; - assign div_clk = div_clk_; - - always @(posedge clk) - begin - if(div_cnt == divisor) begin - div_cnt_ <= 8'd0; - div_clk_ = !div_clk_; - end else - div_cnt_ <= div_cnt_ + 1; - end - -endmodule - diff --git a/fpga-xc3s100e/compile.sh b/fpga-xc3s100e/compile.sh deleted file mode 100755 index 741ed0bb8..000000000 --- a/fpga-xc3s100e/compile.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -( - cd iseproj/fpga_hf - xtclsh fpga_hf.tcl run_process - mv fpga_hf.bit ../.. - git checkout fpga_hf.ise - git clean -dfx . -) diff --git a/fpga-xc3s100e/define.v b/fpga-xc3s100e/define.v deleted file mode 100644 index adced9003..000000000 --- a/fpga-xc3s100e/define.v +++ /dev/null @@ -1,49 +0,0 @@ -// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h -// Note: the definitions here are without shifts - -// Commands: -`define FPGA_CMD_SET_CONFREG 1 -`define FPGA_CMD_TRACE_ENABLE 2 - -// Major modes: -`define FPGA_MAJOR_MODE_HF_READER 0 -`define FPGA_MAJOR_MODE_HF_SIMULATOR 1 -`define FPGA_MAJOR_MODE_HF_ISO14443A 2 -`define FPGA_MAJOR_MODE_HF_SNIFF 3 -`define FPGA_MAJOR_MODE_HF_ISO18092 4 -`define FPGA_MAJOR_MODE_HF_GET_TRACE 5 -`define FPGA_MAJOR_MODE_OFF 7 - -// Options for the generic HF reader -`define FPGA_HF_READER_MODE_RECEIVE_IQ 0 -`define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE 1 -`define FPGA_HF_READER_MODE_RECEIVE_PHASE 2 -`define FPGA_HF_READER_MODE_SEND_FULL_MOD 3 -`define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD 4 -`define FPGA_HF_READER_MODE_SNIFF_IQ 5 -`define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE 6 -`define FPGA_HF_READER_MODE_SNIFF_PHASE 7 -`define FPGA_HF_READER_MODE_SEND_JAM 8 - -`define FPGA_HF_READER_SUBCARRIER_848_KHZ 0 -`define FPGA_HF_READER_SUBCARRIER_424_KHZ 1 -`define FPGA_HF_READER_SUBCARRIER_212_KHZ 2 - -// Options for the HF simulated tag, how to modulate -`define FPGA_HF_SIMULATOR_NO_MODULATION 0 -`define FPGA_HF_SIMULATOR_MODULATE_BPSK 1 -`define FPGA_HF_SIMULATOR_MODULATE_212K 2 -`define FPGA_HF_SIMULATOR_MODULATE_424K 4 -`define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT 5 - -// Options for ISO14443A -`define FPGA_HF_ISO14443A_SNIFFER 0 -`define FPGA_HF_ISO14443A_TAGSIM_LISTEN 1 -`define FPGA_HF_ISO14443A_TAGSIM_MOD 2 -`define FPGA_HF_ISO14443A_READER_LISTEN 3 -`define FPGA_HF_ISO14443A_READER_MOD 4 - -//options for ISO18092 / Felica -`define FPGA_HF_ISO18092_FLAG_NOMOD 1 // 0001 disable modulation module -`define FPGA_HF_ISO18092_FLAG_424K 2 // 0010 should enable 414k mode (untested). No autodetect -`define FPGA_HF_ISO18092_FLAG_READER 4 // 0100 enables antenna power, to act as a reader instead of tag diff --git a/fpga-xc3s100e/fpga.ucf b/fpga-xc3s100e/fpga.ucf deleted file mode 100644 index 4cb06a9d6..000000000 --- a/fpga-xc3s100e/fpga.ucf +++ /dev/null @@ -1,56 +0,0 @@ -# See the schematic for the pin assignment. - -#NET "cross_hi" LOC = "P88" ; -#NET "miso" LOC = "P40" ; - -# definition of Clock nets: -NET "ck_1356meg" TNM_NET = "clk_net_1356" ; -NET "ck_1356megb" TNM_NET = "clk_net_1356b" ; -NET "pck0" TNM_NET = "clk_net_pck0" ; -NET "spck" TNM_NET = "clk_net_spck" ; - -# Timing specs of clock nets: -TIMEGRP "clk_net_1356_all" = "clk_net_1356" "clk_net_1356b" ; -TIMESPEC "TS_1356MHz" = PERIOD "clk_net_1356_all" 74 ns HIGH 37 ns ; -TIMESPEC "TS_24MHz" = PERIOD "clk_net_pck0" 42 ns HIGH 21 ns ; -TIMESPEC "TS_4MHz" = PERIOD "clk_net_spck" 250 ns HIGH 125 ns ; -NET "FPGA_SWITCH" CLOCK_DEDICATED_ROUTE = FALSE ; -#PACE: Start of Constraints generated by PACE - -#PACE: Start of PACE I/O Pin Assignments -NET "adc_clk" LOC = "P65" ; -NET "adc_d<0>" LOC = "P79" ; -NET "adc_d<1>" LOC = "P78" ; -NET "adc_d<2>" LOC = "P71" ; -NET "adc_d<3>" LOC = "P70" ; -NET "adc_d<4>" LOC = "P69" ; -NET "adc_d<5>" LOC = "P68" ; -NET "adc_d<6>" LOC = "P67" ; -NET "adc_d<7>" LOC = "P66" ; -NET "adc_noe" LOC = "P62" ; -NET "ck_1356meg" LOC = "p88" ; -NET "ck_1356megb" LOC = "p89" ; -NET "cross_lo" LOC = "P90" ; -NET "dbg" LOC = "P22" ; -NET "FPGA_SWITCH" LOC = "P38" ; -NET "mosi" LOC = "P43" ; -NET "ncs" LOC = "P40" ; -NET "pck0" LOC = "P36" ; -NET "pwr_hi" LOC = "P85" ; -NET "pwr_lo" LOC = "P83" ; -NET "PWR_LO_EN" LOC = "P94" ; -NET "pwr_oe1" LOC = "P84" ; -NET "pwr_oe2" LOC = "P91" ; -NET "pwr_oe3" LOC = "P92" ; -NET "pwr_oe4" LOC = "P86" ; -NET "spck" LOC = "P39" ; -NET "ssp_clk" LOC = "P33" ; -NET "ssp_din" LOC = "P32" ; -NET "ssp_dout" LOC = "P34" ; -NET "ssp_frame" LOC = "P27" ; - -#PACE: Start of PACE Area Constraints - -#PACE: Start of PACE Prohibit Constraints - -#PACE: End of Constraints generated by PACE diff --git a/fpga-xc3s100e/fpga_hf.bit b/fpga-xc3s100e/fpga_hf.bit deleted file mode 100644 index df1fb45f68487469f520ec7b21916ebd11098bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72742 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 diff --git a/fpga-xc3s100e/fpga_hfmod.v b/fpga-xc3s100e/fpga_hfmod.v deleted file mode 100644 index 53040aead..000000000 --- a/fpga-xc3s100e/fpga_hfmod.v +++ /dev/null @@ -1,193 +0,0 @@ -//----------------------------------------------------------------------------- -// The FPGA is responsible for interfacing between the A/D, the coil drivers, -// and the ARM. In the low-frequency modes it passes the data straight -// through, so that the ARM gets raw A/D samples over the SSP. In the high- -// frequency modes, the FPGA might perform some demodulation first, to -// reduce the amount of data that we must send to the ARM. -// -// I am not really an FPGA/ASIC designer, so I am sure that a lot of this -// could be improved. -// -// Jonathan Westhues, March 2006 -// Added ISO14443-A support by Gerhard de Koning Gans, April 2008 -// iZsh , June 2014 -// Piwi, Feb 2019 -//----------------------------------------------------------------------------- - -//For ISE 10.1 PROJ,IDE cannot apply definition to all files -`include "define.v" - - -//For ISE 10.1 PROJ,IDE auto include -//`include "hi_reader.v" -//`include "hi_simulate.v" -//`include "hi_iso14443a.v" -//`include "hi_sniffer.v" -//`include "util.v" -//`include "hi_flite.v" -//`include "hi_get_trace.v" - -module fpga_hfmod( - input spck, output miso, input mosi, input ncs, - input pck0, input ck_1356meg, input ck_1356megb, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, output adc_noe, - output ssp_frame, output ssp_din, input ssp_dout, output ssp_clk, - input cross_hi, input cross_lo, - output dbg -); - -//----------------------------------------------------------------------------- -// The SPI receiver. This sets up the configuration word, which the rest of -// the logic looks at to determine how to connect the A/D and the coil -// drivers (i.e., which section gets it). Also assign some symbolic names -// to the configuration bits, for use below. -//----------------------------------------------------------------------------- - -/* - Attempt to write up how its hooked up. Iceman 2020. - - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() - Send 16 bit command / data pair to FPGA - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data - - shift_reg receive this 16bit frame - - ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- -*/ - -reg [15:0] shift_reg; -reg [8:0] conf_word; -reg trace_enable; - -// We switch modes between transmitting to the 13.56 MHz tag and receiving -// from it, which means that we must make sure that we can do so without -// glitching, or else we will glitch the transmitted carrier. -always @(posedge ncs) -begin - case(shift_reg[15:12]) - `FPGA_CMD_SET_CONFREG: conf_word <= shift_reg[8:0]; - `FPGA_CMD_TRACE_ENABLE: trace_enable <= shift_reg[0]; - endcase -end - -always @(posedge spck) -begin - if(~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -// select module (outputs) based on major mode -wire [2:0] major_mode = conf_word[8:6]; - -// configuring the HF reader -wire [1:0] subcarrier_frequency = conf_word[5:4]; -wire [3:0] minor_mode = conf_word[3:0]; - -//----------------------------------------------------------------------------- -// And then we instantiate the modules corresponding to each of the FPGA's -// major modes, and use muxes to connect the outputs of the active mode to -// the output pins. -//----------------------------------------------------------------------------- - -// 000 - HF reader -hi_reader hr( - ck_1356megb, - hr_pwr_lo, hr_pwr_hi, hr_pwr_oe1, hr_pwr_oe2, hr_pwr_oe3, hr_pwr_oe4, - adc_d, hr_adc_clk, - hr_ssp_frame, hr_ssp_din, ssp_dout, hr_ssp_clk, - hr_dbg, - subcarrier_frequency, minor_mode -); - -// 001 - HF simulated tag -hi_simulate hs( - ck_1356meg, - hs_pwr_lo, hs_pwr_hi, hs_pwr_oe1, hs_pwr_oe2, hs_pwr_oe3, hs_pwr_oe4, - adc_d, hs_adc_clk, - hs_ssp_frame, hs_ssp_din, ssp_dout, hs_ssp_clk, - hs_dbg, - minor_mode -); - -// 010 - HF ISO14443-A -hi_iso14443a hisn( - ck_1356meg, - hisn_pwr_lo, hisn_pwr_hi, hisn_pwr_oe1, hisn_pwr_oe2, hisn_pwr_oe3, hisn_pwr_oe4, - adc_d, hisn_adc_clk, - hisn_ssp_frame, hisn_ssp_din, ssp_dout, hisn_ssp_clk, - hisn_dbg, - minor_mode -); - -// 011 - HF sniff -hi_sniffer he( - ck_1356megb, - he_pwr_lo, he_pwr_hi, he_pwr_oe1, he_pwr_oe2, he_pwr_oe3, he_pwr_oe4, - adc_d, he_adc_clk, - he_ssp_frame, he_ssp_din, he_ssp_clk -); - -// 100 - HF ISO18092 FeliCa - -hi_flite hfl( - ck_1356megb, - hfl_pwr_lo, hfl_pwr_hi, hfl_pwr_oe1, hfl_pwr_oe2, hfl_pwr_oe3, hfl_pwr_oe4, - adc_d, hfl_adc_clk, - hfl_ssp_frame, hfl_ssp_din, ssp_dout, hfl_ssp_clk, - hfl_dbg, - minor_mode -); - - -// 101 - HF get trace -hi_get_trace gt( - ck_1356megb, - adc_d, trace_enable, major_mode, - gt_ssp_frame, gt_ssp_din, gt_ssp_clk -); - -// Major modes: -// 000 -- HF reader; subcarrier frequency and modulation depth selectable -// 001 -- HF simulated tag -// 010 -- HF ISO14443-A -// 011 -- HF sniff -// 100 -- HF ISO18092 FeliCa -// 101 -- HF get trace -// 110 -- unused -// 111 -- FPGA_MAJOR_MODE_OFF - -// 000 001 010 011 100 101 110 111 - -mux8 mux_ssp_clk (major_mode, ssp_clk, hr_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, gt_ssp_clk, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, hr_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, gt_ssp_din, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, hr_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, gt_ssp_frame, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, hr_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, he_pwr_oe1, hfl_pwr_oe1, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, hr_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, he_pwr_oe2, hfl_pwr_oe2, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, hr_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, he_pwr_oe3, hfl_pwr_oe3, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, hr_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, he_pwr_oe4, hfl_pwr_oe4, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, hr_pwr_lo, hs_pwr_lo, hisn_pwr_lo, he_pwr_lo, hfl_pwr_lo, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, hr_pwr_hi, hs_pwr_hi, hisn_pwr_hi, he_pwr_hi, hfl_pwr_hi, 1'b0, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, hr_adc_clk, hs_adc_clk, hisn_adc_clk, he_adc_clk, hfl_adc_clk, 1'b0, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, hr_dbg, hs_dbg, hisn_dbg, he_dbg, hfl_dbg, 1'b0, 1'b0, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga-xc3s100e/fpga_lfmod.v b/fpga-xc3s100e/fpga_lfmod.v deleted file mode 100644 index 5982a74e8..000000000 --- a/fpga-xc3s100e/fpga_lfmod.v +++ /dev/null @@ -1,236 +0,0 @@ -//----------------------------------------------------------------------------- -// Jonathan Westhues, March 2006 -// iZsh , June 2014 -// Piwi, Feb 2019 -// Anon, 2019 -//----------------------------------------------------------------------------- -// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h -// Note: the definitions here are without shifts - -// Commands: -`define FPGA_CMD_SET_CONFREG 1 -`define FPGA_CMD_SET_DIVISOR 2 -`define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD 3 - -// Major modes: -`define FPGA_MAJOR_MODE_LF_READER 0 -`define FPGA_MAJOR_MODE_LF_EDGE_DETECT 1 -`define FPGA_MAJOR_MODE_LF_PASSTHRU 2 -`define FPGA_MAJOR_MODE_LF_ADC 3 - -// Options for LF_READER -`define FPGA_LF_ADC_READER_FIELD 1 - -// Options for LF_EDGE_DETECT -`define FPGA_LF_EDGE_DETECT_READER_FIELD 1 -`define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 2 - -//For ISE 10.1 PROJ,IDE auto include -//`include "lo_read.v" -//`include "lo_passthru.v" -//`include "lo_edge_detect.v" -//`include "lo_adc.v" -//`include "util.v" -//`include "clk_divider.v" - -module fpga_lfmod( - input spck, output miso, input mosi, input ncs, - input pck0, input ck_1356meg, input ck_1356megb, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, output adc_noe, - output ssp_frame, output ssp_din, input ssp_dout, output ssp_clk, - input cross_hi, input cross_lo, - output dbg, - output PWR_LO_EN -); - -//----------------------------------------------------------------------------- -// The SPI receiver. This sets up the configuration word, which the rest of -// the logic looks at to determine how to connect the A/D and the coil -// drivers (i.e., which section gets it). Also assign some symbolic names -// to the configuration bits, for use below. -//----------------------------------------------------------------------------- - -/* - Attempt to write up how its hooked up. Iceman 2020. - - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() - Send 16 bit command / data pair to FPGA - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data - - shift_reg receive this 16bit frame - - LF command - ---------- - shift_reg[15:12] == 4bit command - LF has three commands (FPGA_CMD_SET_CONFREG, FPGA_CMD_SET_DIVISOR, FPGA_CMD_SET_EDGE_DETECT_THRESHOLD) - Current commands uses only 2bits. We have room for up to 4bits of commands total (7). - - LF data - ------- - shift_reg[11:0] == 12bit data - lf data is divided into MAJOR MODES and configuration values. - - The major modes uses 3bits (0,1,2,3,7 | 000, 001, 010, 011, 111) - 000 FPGA_MAJOR_MODE_LF_READER = Act as LF reader (modulate) - 001 FPGA_MAJOR_MODE_LF_EDGE_DETECT = Simulate LF - 010 FPGA_MAJOR_MODE_LF_PASSTHRU = Passthrough mode, CROSS_LO line connected to SSP_DIN. SSP_DOUT logic level controls if we modulate / listening - 011 FPGA_MAJOR_MODE_LF_ADC = refactor hitag2, clear ADC sampling - 111 FPGA_MAJOR_MODE_OFF = turn off sampling. - - Each one of this major modes can have options. Currently these two major modes uses options. - - FPGA_MAJOR_MODE_LF_READER - - FPGA_MAJOR_MODE_LF_EDGE_DETECT - - FPGA_MAJOR_MODE_LF_READER - ------------------------------------- - lf_field = 1bit (FPGA_LF_ADC_READER_FIELD) - - You can send FPGA_CMD_SET_DIVISOR to set with FREQUENCY the fpga should sample at - divisor = 8bits shift_reg[7:0] - - FPGA_MAJOR_MODE_LF_EDGE_DETECT - ------------------------------------------ - lf_ed_toggle_mode = 1bits - lf_ed_threshold = 8bits threshold defaults to 127 - - You can send FPGA_CMD_SET_EDGE_DETECT_THRESHOLD to set a custom threshold - lf_ed_threshold = 8bits threshold value. - - conf_word 12bits - conf_word[7:5] = 3bit major mode. - conf_word[0] = 1bit lf_field - conf_word[1] = 1bit lf_ed_toggle_mode - conf_word[7:0] = 8bit divisor - conf_word[7:0] = 8bit threshold - ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- -*/ - -reg [15:0] shift_reg; -reg [7:0] divisor; -reg [7:0] lf_ed_threshold; -reg [11:0] conf_word; - -wire [2:0] major_mode = conf_word[8:6]; -wire lf_field = conf_word[0]; -wire lf_ed_toggle_mode = conf_word[1]; - -// Handles cmd / data frame from ARM -always @(posedge ncs) -begin - // 4 bit command - case (shift_reg[15:12]) - `FPGA_CMD_SET_CONFREG: - begin - // 12 bit data - conf_word <= shift_reg[11:0]; - if (shift_reg[8:6] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) - begin - lf_ed_threshold <= 127; // default threshold - end - end - - `FPGA_CMD_SET_DIVISOR: - divisor <= shift_reg[7:0]; // 8bits - - `FPGA_CMD_SET_EDGE_DETECT_THRESHOLD: - lf_ed_threshold <= shift_reg[7:0]; // 8 bits - endcase -end - -// Receive 16bits of data from ARM here. -always @(posedge spck) -begin - if (~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -//----------------------------------------------------------------------------- -// And then we instantiate the modules corresponding to each of the FPGA's -// major modes, and use muxes to connect the outputs of the active mode to -// the output pins. -//----------------------------------------------------------------------------- -wire [7:0] pck_cnt; -wire pck_divclk; -clk_divider div_clk(pck0, divisor, pck_cnt, pck_divclk); - -lo_read lr( - pck0, pck_cnt, pck_divclk, - lr_pwr_lo, lr_pwr_hi, lr_pwr_oe1, lr_pwr_oe2, lr_pwr_oe3, lr_pwr_oe4, - adc_d, lr_adc_clk, - lr_ssp_frame, lr_ssp_din, lr_ssp_clk, - lr_dbg, lf_field -); - -lo_passthru lp( - pck_divclk, - lp_pwr_lo, lp_pwr_hi, lp_pwr_oe1, lp_pwr_oe2, lp_pwr_oe3, lp_pwr_oe4, - lp_adc_clk, - lp_ssp_din, ssp_dout, - cross_lo, - lp_dbg -); - -lo_edge_detect le( - pck0, pck_divclk, - le_pwr_lo, le_pwr_hi, le_pwr_oe1, le_pwr_oe2, le_pwr_oe3, le_pwr_oe4, - adc_d, le_adc_clk, - le_ssp_frame, ssp_dout, le_ssp_clk, - cross_lo, - le_dbg, - lf_field, - lf_ed_toggle_mode, lf_ed_threshold -); - -lo_adc la( - pck0, - la_pwr_lo, la_pwr_hi, la_pwr_oe1, la_pwr_oe2, la_pwr_oe3, la_pwr_oe4, - adc_d, la_adc_clk, - la_ssp_frame, la_ssp_din, ssp_dout, la_ssp_clk, - la_dbg, divisor, - lf_field -); - -// Major modes: -// 000 -- LF reader (generic) -// 001 -- LF edge detect (generic) -// 010 -- LF passthrough -// 011 -- LF ADC (read/write) -// 100 -- unused -// 101 -- unused -// 110 -- unused -// 111 -- FPGA_MAJOR_MODE_OFF -// 000 001 010 011 100 101 110 111 -mux8 mux_ssp_clk (major_mode, ssp_clk, lr_ssp_clk, le_ssp_clk, 1'b0, la_ssp_clk, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, lr_ssp_din, 1'b0, lp_ssp_din, la_ssp_din, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, lr_ssp_frame, le_ssp_frame, 1'b0, la_ssp_frame, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, lr_pwr_oe1, le_pwr_oe1, lp_pwr_oe1, la_pwr_oe1, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, lr_pwr_oe2, le_pwr_oe2, lp_pwr_oe2, la_pwr_oe2, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, lr_pwr_oe3, le_pwr_oe3, lp_pwr_oe3, la_pwr_oe3, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, lr_pwr_oe4, le_pwr_oe4, lp_pwr_oe4, la_pwr_oe4, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, lr_pwr_lo, le_pwr_lo, lp_pwr_lo, la_pwr_lo, 1'b0, 1'b0, 1'b1, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, lr_pwr_hi, le_pwr_hi, lp_pwr_hi, la_pwr_hi, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, lr_adc_clk, le_adc_clk, lp_adc_clk, la_adc_clk, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, lr_dbg, le_dbg, lp_dbg, la_dbg, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ant (major_mode, PWR_LO_EN, 1'b1, 1'b1, 1'b1, 1'b1, 1'b0, 1'b0, 1'b0, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga-xc3s100e/hi_flite.v b/fpga-xc3s100e/hi_flite.v deleted file mode 100644 index 6cb87825e..000000000 --- a/fpga-xc3s100e/hi_flite.v +++ /dev/null @@ -1,368 +0,0 @@ -/* - This code demodulates and modulates signal as described in ISO/IEC 18092. - That includes packets used for Felica, NFC Tag 3, etc. (which do overlap) - simple envelope following algorithm is used (modification of fail0verflow LF one) - is used to combat some nasty aliasing effect with testing phone (envelope looked like sine wave) - - Speeds supported: only 212 kbps (fc/64) for now. Todo: 414 kbps - though for reader, the selection has to come from ARM. modulation waits for market sprocket -doesn't really mean anything - - mod_type: bits 210: - bit 2 : reader drive/power on/off - bit 1 : speed bit, 0 : 212, 1 :424 - bit 0 : listen or modulate -*/ - -module hi_flite( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type -); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [3:0] mod_type; - -assign dbg = 0; - -wire power = mod_type[2]; -wire speed = mod_type[1]; -wire disabl = mod_type[0]; - -// Most off, oe4 for modulation; -// Trying reader emulation (would presumably just require switching power on, but I am not sure) -assign pwr_lo = 1'b0; - -// 512x64/fc -wait before ts0, 32768 ticks -// tslot: 256*64/fc -assign adc_clk = ck_1356meg; - -///heuristic values for initial thresholds. seem to work OK -`define imin 70 // (13'd256) -`define imax 180 // (-13'd256) -`define ithrmin 91 // -13'd8 -`define ithrmax 160 // 13'd8 - -`define min_bitdelay_212 8 -//minimum values and corresponding thresholds -reg [8:0] curmin=`imin; -reg [8:0] curminthres=`ithrmin; -reg [8:0] curmaxthres=`ithrmax; -reg [8:0] curmax=`imax; - -//signal state, 1-not modulated, 0 -modulated -reg after_hysteresis = 1'b1; - -//state machine for envelope tracking -reg [1:0] state=1'd0; - -//lower edge detected, trying to detect first bit of SYNC (b24d, 1011001001001101) -reg try_sync=1'b0; - -//detected first sync bit, phase frozen -reg did_sync=0; - -`define bithalf_212 32 // half-bit length for 212 kbit -`define bitmlen_212 63 // bit transition edge - -`define bithalf_424 16 // half-bit length for 212 kbit -`define bitmlen_424 31 // bit transition edge - -wire [7:0] bithalf = speed ? `bithalf_424 : `bithalf_212; -wire [7:0] bitmlen = speed ? `bitmlen_424 : `bitmlen_212; - - -//ssp clock and current values -reg ssp_clk; -reg ssp_frame; -reg curbit = 1'b0; - -reg [7:0] fccount = 8'd0; // in-bit tick counter. Counts carrier cycles from the first lower edge detected, reset on every manchester bit detected - -reg [7:0] tsinceedge = 8'd0;// ticks from last edge, desync if the valye is too large - -reg zero = 1'b0; // Manchester first halfbit low second high corresponds to this value. It has been known to change. SYNC is used to set it - -//ssp counter for transfer and framing -reg [8:0] ssp_cnt = 9'd0; - -always @(posedge adc_clk) - ssp_cnt <= (ssp_cnt + 1); - -//maybe change it so that ARM sends preamble as well. -//then: ready bits sent to ARM, 8 bits sent from ARM (all ones), then preamble (all zeros, presumably) - which starts modulation - -always @(negedge adc_clk) -begin - //count fc/64 - transfer bits to ARM at the rate they are received - if( ((~speed) && (ssp_cnt[5:0] == 6'b000000)) || (speed && (ssp_cnt[4:0] == 5'b00000))) - begin - ssp_clk <= 1'b1; - ssp_din <= curbit; - end - if( ( (~speed) && (ssp_cnt[5:0] == 6'b100000)) ||(speed && ssp_cnt[4:0] == 5'b10000)) - ssp_clk <= 1'b0; - //create frame pulses. TBH, I still don't know what they do exactly, but they are crucial for ARM->FPGA transfer. If the frame is in the beginning of the byte, transfer slows to a crawl for some reason - // took me a day to figure THAT out. - if(( (~speed) && (ssp_cnt[8:0] == 9'd31)) || (speed && ssp_cnt[7:0] == 8'd15)) - begin - ssp_frame <= 1'b1; - end - if(( (~speed) && (ssp_cnt[8:0] == 9'b1011111)) || (speed &&ssp_cnt[7:0] == 8'b101111) ) - begin - ssp_frame <= 1'b0; - end -end - -//send current bit (detected in SNIFF mode or the one being modulated in MOD mode, 0 otherwise) -reg ssp_din; - -//previous signal value, mostly to detect SYNC -reg prv = 1'b1; - -// for simple error correction in mod/demod detection, use maximum of modded/demodded in given interval. Maybe 1 bit is extra? but better safe than sorry. -reg[7:0] mid = 8'd128; - -// set TAGSIM__MODULATE on ARM if we want to write... (frame would get lost if done mid-frame...) -// start sending over 1s on ssp->arm when we start sending preamble -// reg sending = 1'b0; // are we actively modulating? -reg [11:0] bit_counts = 12'd0; // for timeslots. only support ts=0 for now, at 212 speed -512 fullbits from end of frame. One hopes. might remove those? - - -//we need some way to flush bit_counts triggers on mod_type changes don't compile -reg dlay; -always @(negedge adc_clk) // every data ping? -begin - //envelope follow code... - //////////// - if (fccount == bitmlen) - begin - if ((~try_sync) && (adc_d < curminthres) && disabl ) - begin - fccount <= 1; - end - else - begin - fccount <= 0; - end - dlay <= ssp_dout; - if (bit_counts > 768) // should be over ts0 now, without ARM interference... stop counting... - begin - bit_counts <= 0; - end - else - if (power) - bit_counts <= 0; - else - bit_counts <= bit_counts + 1; - end - else - begin - if((~try_sync) && (adc_d < curminthres) && disabl) - begin - fccount <= 1; - end - else - begin - fccount <= fccount + 1; - end - end - - // rising edge - if (adc_d > curmaxthres) - begin - case (state) - 0: begin - curmax <= adc_d > `imax? adc_d : `imax; - state <= 2; - end - 1: begin - curminthres <= ((curmin >> 1) + (curmin >> 2) + (curmin >> 4) + (curmax >> 3) + (curmax >> 4)); //threshold: 0.1875 max + 0.8125 min - curmaxthres <= ((curmax >> 1) + (curmax >> 2) + (curmax >> 4) + (curmin >> 3) + (curmin >> 4)); - curmax <= adc_d > 155 ? adc_d : 155; // to hopefully prevent overflow from spikes going up to 255 - state <= 2; - end - 2: begin - if (adc_d > curmax) - curmax <= adc_d; - end - default: - begin - end - endcase - after_hysteresis <= 1'b1; - if(try_sync) - tsinceedge <= 0; - end - else if (adc_d> 1) + (curmin >> 2) + (curmin >> 4) + (curmax >> 3) + (curmax >> 4)); - curmaxthres <= ( (curmax >> 1) + (curmax >> 2) + (curmax >> 4) + (curmin >> 3) + (curmin >> 4)); - curmin <= adc_d < `imin ? adc_d : `imin; - state <= 1; - end - default: - begin - end - endcase - after_hysteresis <= 0; - if (~try_sync ) //begin modulation, lower edge... - begin - try_sync <= 1; - fccount <= 1; - did_sync <= 0; - curbit <= 0; - mid <= 8'd127; - tsinceedge <= 0; - prv <= 1; - end - else - begin - tsinceedge <= 0; - end - end - else //stable state, low or high - begin - curminthres <= ( (curmin >> 1) + (curmin >> 2) + (curmin >> 4) + (curmax >> 3) + (curmax >> 4)); - curmaxthres <= ( (curmax >> 1) + (curmax >> 2) + (curmax >> 4) + (curmin >> 3) + (curmin >> 4)); - state <= 0; - - if (try_sync ) - begin - if (tsinceedge >= (128)) - begin - //we might need to start counting... assuming ARM wants to reply to the frame. - bit_counts <= 1;// i think? 128 is about 2 bits passed... but 1 also works - try_sync <= 0; - did_sync <= 0;//desync - curmin <= `imin; //reset envelope - curmax <= `imax; - curminthres <= `ithrmin; - curmaxthres <= `ithrmax; - prv <= 1; - tsinceedge <= 0; - after_hysteresis <= 1'b1; - curbit <= 0; - mid <= 8'd128; - end - else - tsinceedge <= (tsinceedge + 1); - end - end - - - if (try_sync && tsinceedge < 128) - begin - //detect bits in their middle ssp sampling is in sync, so it would sample all bits in order - if (fccount == bithalf) - begin - if ((~did_sync) && ((prv == 1 && (mid > 128))||(prv == 0 && (mid <= 128)))) - begin - //sync the Zero, and set curbit roperly - did_sync <= 1'b1; - zero <= ~prv;// 1-prv - curbit <= 1; - end - else - curbit <= (mid > 128) ? (~zero) : zero; - - prv <= (mid > 128) ? 1 : 0; - - if (adc_d > curmaxthres) - mid <= 8'd129; - else if (adc_d < curminthres) - mid <= 8'd127; - else - begin - if (after_hysteresis) - begin - mid <= 8'd129; - end - else - begin - mid <= 8'd127; - end - end - - end - else - begin - if (fccount==bitmlen) - begin - // fccount <= 0; - prv <= (mid > 128) ? 1 : 0; - mid <= 128; - end - else - begin - // minimum-maximum calc - if(adc_d > curmaxthres) - mid <= mid + 1; - else if (adc_d < curminthres) - mid <= mid - 1; - else - begin - if (after_hysteresis) - begin - mid <= mid + 1; - end - else - begin - mid <= mid - 1; - end - end - end - end - end - else - begin - end -// sending <= 0; -end -//put modulation here to maintain the correct clock. Seems that some readers are sensitive to that -reg pwr_hi; -reg pwr_oe1; -reg pwr_oe2; -reg pwr_oe3; -reg pwr_oe4; - -wire mod = ((fccount >= bithalf) ^ dlay) & (~disabl); - -always @(ck_1356meg or ssp_dout or power or disabl or mod) -begin - if (power) - begin - pwr_hi <= ck_1356meg; - pwr_oe1 <= 1'b0;//mod; - pwr_oe2 <= 1'b0;//mod; - pwr_oe3 <= 1'b0;//mod; - pwr_oe4 <= mod;//1'b0; - end - else - begin - pwr_hi <= 1'b0; - pwr_oe1 <= 1'b0; - pwr_oe2 <= 1'b0; - pwr_oe3 <= 1'b0; - pwr_oe4 <= mod; - end -end - -endmodule diff --git a/fpga-xc3s100e/hi_get_trace.v b/fpga-xc3s100e/hi_get_trace.v deleted file mode 100644 index 2b1cf393b..000000000 --- a/fpga-xc3s100e/hi_get_trace.v +++ /dev/null @@ -1,164 +0,0 @@ -//----------------------------------------------------------------------------- -// -// piwi, Feb 2019 -//----------------------------------------------------------------------------- -//For ISE 10.1 PROJ,IDE cannot apply definition to all files -`include "define.v" - -module hi_get_trace( - ck_1356megb, - adc_d, trace_enable, major_mode, - ssp_frame, ssp_din, ssp_clk -); - input ck_1356megb; - input [7:0] adc_d; - input trace_enable; - input [2:0] major_mode; - output ssp_frame, ssp_din, ssp_clk; - -// clock divider -reg [6:0] clock_cnt; -always @(negedge ck_1356megb) -begin - clock_cnt <= clock_cnt + 1; -end - -// sample at 13,56MHz / 8. The highest signal frequency (subcarrier) is 848,5kHz, i.e. in this case we oversample by a factor of 2 -reg [2:0] sample_clock; -always @(negedge ck_1356megb) -begin - if (sample_clock == 3'd7) - sample_clock <= 3'd0; - else - sample_clock <= sample_clock + 1; -end - - -reg [11:0] addr; -reg [11:0] start_addr; -reg [2:0] previous_major_mode; -reg write_enable1; -reg write_enable2; -always @(negedge ck_1356megb) -begin - previous_major_mode <= major_mode; - if (major_mode == `FPGA_MAJOR_MODE_HF_GET_TRACE) - begin - write_enable1 <= 1'b0; - write_enable2 <= 1'b0; - if (previous_major_mode != `FPGA_MAJOR_MODE_HF_GET_TRACE) // just switched into GET_TRACE mode - addr <= start_addr; - if (clock_cnt == 7'd0) - begin - if (addr == 12'd3071) - addr <= 12'd0; - else - addr <= addr + 1; - end - end - else if (major_mode != `FPGA_MAJOR_MODE_OFF) - begin - if (trace_enable) - begin - if (addr[11] == 1'b0) - begin - write_enable1 <= 1'b1; - write_enable2 <= 1'b0; - end - else - begin - write_enable1 <= 1'b0; - write_enable2 <= 1'b1; - end - if (sample_clock == 3'b000) - begin - if (addr == 12'd3071) - begin - addr <= 12'd0; - write_enable1 <= 1'b1; - write_enable2 <= 1'b0; - end - else - begin - addr <= addr + 1; - end - end - end - else - begin - write_enable1 <= 1'b0; - write_enable2 <= 1'b0; - start_addr <= addr; - end - end - else // major_mode == `FPGA_MAJOR_MODE_OFF - begin - write_enable1 <= 1'b0; - write_enable2 <= 1'b0; - if (previous_major_mode != `FPGA_MAJOR_MODE_OFF && previous_major_mode != `FPGA_MAJOR_MODE_HF_GET_TRACE) // just switched off - begin - start_addr <= addr; - end - end -end - - -// (2+1)k RAM -reg [7:0] D_out1, D_out2; -reg [7:0] ram1 [2047:0]; // 2048 u8 -reg [7:0] ram2 [1023:0]; // 1024 u8 - -always @(negedge ck_1356megb) -begin - if (write_enable1) - begin - ram1[addr[10:0]] <= adc_d; - D_out1 <= adc_d; - end - else - D_out1 <= ram1[addr[10:0]]; - if (write_enable2) -begin - ram2[addr[9:0]] <= adc_d; - D_out2 <= adc_d; - end - else - D_out2 <= ram2[addr[9:0]]; -end - - -// SSC communication to ARM -reg ssp_clk; -reg ssp_frame; -reg [7:0] shift_out; - -always @(negedge ck_1356megb) -begin - if (clock_cnt[3:0] == 4'd0) // update shift register every 16 clock cycles - begin - if (clock_cnt[6:4] == 3'd0) // either load new value - begin - if (addr[11] == 1'b0) - shift_out <= D_out1; - else - shift_out <= D_out2; - end - else - begin - // or shift left - shift_out[7:1] <= shift_out[6:0]; - end - end - - ssp_clk <= ~clock_cnt[3]; // ssp_clk frequency = 13,56MHz / 16 = 847,5 kHz - - if (clock_cnt[6:4] == 3'b000) // set ssp_frame for 0...31 - ssp_frame <= 1'b1; - else - ssp_frame <= 1'b0; - -end - -assign ssp_din = shift_out[7]; - -endmodule diff --git a/fpga-xc3s100e/hi_iso14443a.v b/fpga-xc3s100e/hi_iso14443a.v deleted file mode 100644 index 26ab0f9d9..000000000 --- a/fpga-xc3s100e/hi_iso14443a.v +++ /dev/null @@ -1,584 +0,0 @@ -//----------------------------------------------------------------------------- -// ISO14443-A support for the Proxmark III -// Gerhard de Koning Gans, April 2008 -//----------------------------------------------------------------------------- - -module hi_iso14443a( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type -); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [3:0] mod_type; - - -wire adc_clk = ck_1356meg; - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Reader -> PM3: -// detecting and shaping the reader's signal. Reader will modulate the carrier by 100% (signal is either on or off). Use a -// hysteresis (Schmitt Trigger) to avoid false triggers during slowly increasing or decreasing carrier amplitudes -reg after_hysteresis; -reg [11:0] has_been_low_for; - -always @(negedge adc_clk) -begin - if(adc_d >= 16) after_hysteresis <= 1'b1; // U >= 1,14V -> after_hysteresis = 1 - else if(adc_d < 8) after_hysteresis <= 1'b0; // U < 1,04V -> after_hysteresis = 0 - // Note: was >= 3,53V and <= 1,19V. The new trigger values allow more reliable detection of the first bit - // (it might not reach 3,53V due to the high time constant of the high pass filter in the analogue RF part). - // In addition, the new values are more in line with ISO14443-2: "The PICC shall detect the ”End of Pause” after the field exceeds - // 5% of H_INITIAL and before it exceeds 60% of H_INITIAL." Depending on the signal strength, 60% might well be less than 3,53V. - - - // detecting a loss of reader's field (adc_d < 192 for 4096 clock cycles). If this is the case, - // set the detected reader signal (after_hysteresis) to '1' (unmodulated) - if(adc_d >= 192) - begin - has_been_low_for <= 12'd0; - end - else - begin - if(has_been_low_for == 12'd4095) - begin - has_been_low_for <= 12'd0; - after_hysteresis <= 1'b1; - end - else - begin - has_been_low_for <= has_been_low_for + 1; - end - end - -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Reader -> PM3 -// detect when a reader is active (modulating). We assume that the reader is active, if we see the carrier off for at least 8 -// carrier cycles. We assume that the reader is inactive, if the carrier stayed high for at least 256 carrier cycles. -reg deep_modulation; -reg [2:0] deep_counter; -reg [8:0] saw_deep_modulation; - -always @(negedge adc_clk) -begin - if(~(| adc_d[7:0])) // if adc_d == 0 (U <= 0,94V) - begin - if(deep_counter == 3'd7) // adc_d == 0 for 8 adc_clk ticks -> deep_modulation (by reader) - begin - deep_modulation <= 1'b1; - saw_deep_modulation <= 8'd0; - end - else - deep_counter <= deep_counter + 1; - end - else - begin - deep_counter <= 3'd0; - if(saw_deep_modulation == 8'd255) // adc_d != 0 for 256 adc_clk ticks -> deep_modulation is over, probably waiting for tag's response - deep_modulation <= 1'b0; - else - saw_deep_modulation <= saw_deep_modulation + 1; - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tag -> PM3 -// filter the input for a tag's signal. The filter box needs the 4 previous input values and is a gaussian derivative filter -// for noise reduction and edge detection. -// store 4 previous samples: -reg [7:0] input_prev_4, input_prev_3, input_prev_2, input_prev_1; - -always @(negedge adc_clk) -begin - input_prev_4 <= input_prev_3; - input_prev_3 <= input_prev_2; - input_prev_2 <= input_prev_1; - input_prev_1 <= adc_d; -end - -// adc_d_filtered = 2*input_prev4 + 1*input_prev3 + 0*input_prev2 - 1*input_prev1 - 2*input -// = (2*input_prev4 + input_prev3) - (2*input + input_prev1) -wire [8:0] input_prev_4_times_2 = input_prev_4 << 1; -wire [8:0] adc_d_times_2 = adc_d << 1; - -wire [9:0] tmp1 = input_prev_4_times_2 + input_prev_3; -wire [9:0] tmp2 = adc_d_times_2 + input_prev_1; - -// convert intermediate signals to signed and calculate the filter output -wire signed [10:0] adc_d_filtered = {1'b0, tmp1} - {1'b0, tmp2}; - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// internal FPGA timing. Maximum required period is 128 carrier clock cycles for a full 8 Bit transfer to ARM. (i.e. we need a -// 7 bit counter). Adjust its frequency to external reader's clock when simulating a tag or sniffing. -reg pre_after_hysteresis; -reg [3:0] reader_falling_edge_time; -reg [6:0] negedge_cnt; - -always @(negedge adc_clk) -begin - // detect a reader signal's falling edge and remember its timing: - pre_after_hysteresis <= after_hysteresis; - if (pre_after_hysteresis && ~after_hysteresis) - begin - reader_falling_edge_time[3:0] <= negedge_cnt[3:0]; - end - - // adjust internal timer counter if necessary: - if (negedge_cnt[3:0] == 4'd13 && (mod_type == `FPGA_HF_ISO14443A_SNIFFER || mod_type == `FPGA_HF_ISO14443A_TAGSIM_LISTEN) && deep_modulation) - begin - if (reader_falling_edge_time == 4'd1) // reader signal changes right after sampling. Better sample earlier next time. - begin - negedge_cnt <= negedge_cnt + 2; // time warp - end - else if (reader_falling_edge_time == 4'd0) // reader signal changes right before sampling. Better sample later next time. - begin - negedge_cnt <= negedge_cnt; // freeze time - end - else - begin - negedge_cnt <= negedge_cnt + 1; // Continue as usual - end - reader_falling_edge_time[3:0] <= 4'd8; // adjust only once per detected edge - end - else if (negedge_cnt == 7'd127) // normal operation: count from 0 to 127 - begin - negedge_cnt <= 0; - end - else - begin - negedge_cnt <= negedge_cnt + 1; - end -end - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tag -> PM3: -// determine best possible time for starting/resetting the modulation detector. -reg [3:0] mod_detect_reset_time; - -always @(negedge adc_clk) -begin - if (mod_type == `FPGA_HF_ISO14443A_READER_LISTEN) - // (our) reader signal changes at negedge_cnt[3:0]=9, tag response expected to start n*16+4 ticks later, further delayed by - // 3 ticks ADC conversion. The maximum filter output (edge detected) will be detected after subcarrier zero crossing (+7 ticks). - // To allow some timing variances, we want to have the maximum filter outputs well within the detection window, i.e. - // at mod_detect_reset_time+4 and mod_detect_reset_time+12 (-4 ticks). - // 9 + 4 + 3 + 7 - 4 = 19. 19 mod 16 = 3 - begin - mod_detect_reset_time <= 4'd4; - end - else - if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) - begin - // detect a rising edge of reader's signal and sync modulation detector to the tag's answer: - if (~pre_after_hysteresis && after_hysteresis && deep_modulation) - // reader signal rising edge detected at negedge_cnt[3:0]. This signal had been delayed - // 9 ticks by the RF part + 3 ticks by the A/D converter + 1 tick to assign to after_hysteresis. - // Then the same as above. - // - 9 - 3 - 1 + 4 + 3 + 7 - 4 = -3 - begin - mod_detect_reset_time <= negedge_cnt[3:0] - 4'd3; - end - end -end - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tag -> PM3: -// modulation detector. Looks for the steepest falling and rising edges within a 16 clock period. If there is both a significant -// falling and rising edge (in any order), a modulation is detected. -reg signed [10:0] rx_mod_falling_edge_max; -reg signed [10:0] rx_mod_rising_edge_max; -reg curbit; - -`define EDGE_DETECT_THRESHOLD 3 -`define EDGE_DETECT_THRESHOLDHIGH 20 - -always @(negedge adc_clk) -begin - if(negedge_cnt[3:0] == mod_detect_reset_time) - begin - if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) - begin - // detect modulation signal: if modulating, there must have been a falling AND a rising edge - if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLDHIGH) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLDHIGH)) - curbit <= 1'b1; // modulation - else - curbit <= 1'b0; // no modulation - end - else - begin - // detect modulation signal: if modulating, there must have been a falling AND a rising edge - if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLD) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLD)) - curbit <= 1'b1; // modulation - else - curbit <= 1'b0; // no modulation - end - // reset modulation detector - rx_mod_rising_edge_max <= 0; - rx_mod_falling_edge_max <= 0; - end - else // look for steepest edges (slopes) - begin - if (adc_d_filtered > 0) - begin - if (adc_d_filtered > rx_mod_falling_edge_max) - rx_mod_falling_edge_max <= adc_d_filtered; - end - else - begin - if (adc_d_filtered < rx_mod_rising_edge_max) - rx_mod_rising_edge_max <= adc_d_filtered; - end - end - -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tag+Reader -> PM3 -// sample 4 bits reader data and 4 bits tag data for sniffing -reg [3:0] reader_data; -reg [3:0] tag_data; - -always @(negedge adc_clk) -begin - if(negedge_cnt[3:0] == 4'd0) - begin - reader_data[3:0] <= {reader_data[2:0], after_hysteresis}; - tag_data[3:0] <= {tag_data[2:0], curbit}; - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Reader: -// a delay line to ensure that we send the (emulated) tag's answer at the correct time according to ISO14443-3 -reg [31:0] mod_sig_buf; -reg [4:0] mod_sig_ptr; -reg mod_sig; - -always @(negedge adc_clk) -begin - if(negedge_cnt[3:0] == 4'd0) // sample data at rising edge of ssp_clk - ssp_dout changes at the falling edge. - begin - mod_sig_buf[31:2] <= mod_sig_buf[30:1]; // shift - if (~ssp_dout && ~mod_sig_buf[1]) - mod_sig_buf[1] <= 1'b0; // delete the correction bit (a single 1 preceded and succeeded by 0) - else - mod_sig_buf[1] <= mod_sig_buf[0]; - mod_sig_buf[0] <= ssp_dout; // add new data to the delay line - - mod_sig = mod_sig_buf[mod_sig_ptr]; // the delayed signal. - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Reader, internal timing: -// a timer for the 1172 cycles fdt (Frame Delay Time). Start the timer with a rising edge of the reader's signal. -// set fdt_elapsed when we no longer need to delay data. Set fdt_indicator when we can start sending data. -// Note: the FPGA only takes care for the 1172 delay. To achieve an additional 1236-1172=64 ticks delay, the ARM must send -// a correction bit (before the start bit). The correction bit will be coded as 00010000, i.e. it adds 4 bits to the -// transmission stream, causing the required additional delay. -reg [10:0] fdt_counter; -reg fdt_indicator, fdt_elapsed; -reg [3:0] mod_sig_flip; -reg [3:0] sub_carrier_cnt; - -// we want to achieve a delay of 1172. The RF part already has delayed the reader signals's rising edge -// by 9 ticks, the ADC took 3 ticks and there is always a delay of 32 ticks by the mod_sig_buf. Therefore need to -// count to 1172 - 9 - 3 - 32 = 1128 -`define FDT_COUNT 11'd1128 - -// The ARM must not send too early, otherwise the mod_sig_buf will overflow, therefore signal that we are ready -// with fdt_indicator. The mod_sig_buf can buffer 29 excess data bits, i.e. a maximum delay of 29 * 16 = 464 adc_clk ticks. -// fdt_indicator is assigned to sendbit after at least 1 tick, the transfer to ARM needs minimum 8 ticks. Response from -// ARM could appear at ssp_dout 8 ticks later. -// 1128 - 464 - 1 - 8 - 8 = 647 -`define FDT_INDICATOR_COUNT 11'd647 -// Note: worst case, assignment to sendbit takes 15 ticks more, and transfer to ARM needs 7*16 = 112 ticks more. -// When the ARM's response then appears, the fdt_count is already 647 + 15 + 112 = 774, which still allows the ARM a possible -// response window of 1128 - 774 = 354 ticks. - -// reset on a pause in listen mode. I.e. the counter starts when the pause is over: -assign fdt_reset = ~after_hysteresis && mod_type == `FPGA_HF_ISO14443A_TAGSIM_LISTEN; - -always @(negedge adc_clk) -begin - if (fdt_reset) - begin - fdt_counter <= 11'd0; - fdt_elapsed <= 1'b0; - fdt_indicator <= 1'b0; - end - else - begin - if(fdt_counter == `FDT_COUNT) - begin - if(~fdt_elapsed) // just reached fdt. - begin - mod_sig_flip <= negedge_cnt[3:0]; // start modulation at this time - sub_carrier_cnt <= 4'd0; // subcarrier phase in sync with start of modulation - fdt_elapsed <= 1'b1; - end - else - begin - sub_carrier_cnt <= sub_carrier_cnt + 1; - end - end - else - begin - fdt_counter <= fdt_counter + 1; - end - end - - if(fdt_counter == `FDT_INDICATOR_COUNT) fdt_indicator <= 1'b1; -end - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Reader or Tag -// assign a modulation signal to the antenna. This signal is either a delayed signal (to achieve fdt when sending to a reader) -// or undelayed when sending to a tag -reg mod_sig_coil; - -always @(negedge adc_clk) -begin - if (mod_type == `FPGA_HF_ISO14443A_TAGSIM_MOD) // need to take care of proper fdt timing - begin - if(fdt_counter == `FDT_COUNT) - begin - if(fdt_elapsed) - begin - if(negedge_cnt[3:0] == mod_sig_flip) mod_sig_coil <= mod_sig; - end - else - begin - mod_sig_coil <= mod_sig; // just reached fdt. Immediately assign signal to coil - end - end - end - else // other modes: don't delay - begin - mod_sig_coil <= ssp_dout; - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Reader -// determine the required delay in the mod_sig_buf (set mod_sig_ptr). -reg temp_buffer_reset; - -always @(negedge adc_clk) -begin - if(fdt_reset) - begin - mod_sig_ptr <= 5'd0; - temp_buffer_reset = 1'b0; - end - else - begin - if(fdt_counter == `FDT_COUNT && ~fdt_elapsed) // if we just reached fdt - if(~(| mod_sig_ptr[4:0])) - mod_sig_ptr <= 5'd8; // ... but didn't buffer a 1 yet, delay next 1 by n*128 ticks. - else - temp_buffer_reset = 1'b1; // else no need for further delays. - - if(negedge_cnt[3:0] == 4'd0) // at rising edge of ssp_clk - ssp_dout changes at the falling edge. - begin - if((ssp_dout || (| mod_sig_ptr[4:0])) && ~fdt_elapsed) // buffer a 1 (and all subsequent data) until fdt is reached. - if (mod_sig_ptr == 5'd31) - mod_sig_ptr <= 5'd0; // buffer overflow - data loss. - else - mod_sig_ptr <= mod_sig_ptr + 1; // increase buffer (= increase delay by 16 adc_clk ticks). mod_sig_ptr always points ahead of first 1. - else if(fdt_elapsed && ~temp_buffer_reset) - begin - // wait for the next 1 after fdt_elapsed before fixing the delay and starting modulation. This ensures that the response can only happen - // at intervals of 8 * 16 = 128 adc_clk ticks (as defined in ISO14443-3) - if(ssp_dout) - temp_buffer_reset = 1'b1; - if(mod_sig_ptr == 5'd1) - mod_sig_ptr <= 5'd8; // still nothing received, need to go for the next interval - else - mod_sig_ptr <= mod_sig_ptr - 1; // decrease buffer. - end - end - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FPGA -> ARM communication: -// buffer 8 bits data to be sent to ARM. Shift them out bit by bit. -reg [7:0] to_arm; - -always @(negedge adc_clk) -begin - if (negedge_cnt[5:0] == 6'd63) // fill the buffer - begin - if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) - begin - if(deep_modulation) // a reader is sending (or there's no field at all) - begin - to_arm <= {reader_data[3:0], 4'b0000}; // don't send tag data - end - else - begin - to_arm <= {reader_data[3:0], tag_data[3:0]}; - end - end - else - begin - to_arm[7:0] <= {mod_sig_ptr[4:0], mod_sig_flip[3:1]}; // feedback timing information - end - end - - if(negedge_cnt[2:0] == 3'b000 && mod_type == `FPGA_HF_ISO14443A_SNIFFER) // shift at double speed - begin - // Don't shift if we just loaded new data, obviously. - if(negedge_cnt[5:0] != 6'd0) - begin - to_arm[7:1] <= to_arm[6:0]; - end - end - - if(negedge_cnt[3:0] == 4'b0000 && mod_type != `FPGA_HF_ISO14443A_SNIFFER) - begin - // Don't shift if we just loaded new data, obviously. - if(negedge_cnt[6:0] != 7'd0) - begin - to_arm[7:1] <= to_arm[6:0]; - end - end - -end - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FPGA <-> ARM communication: -// generate a ssp clock and ssp frame signal for the synchronous transfer from/to the ARM -reg ssp_clk; -reg ssp_frame; - -always @(negedge adc_clk) -begin - if(mod_type == `FPGA_HF_ISO14443A_SNIFFER) - // FPGA_HF_ISO14443A_SNIFFER mode (ssp_clk = adc_clk / 8, ssp_frame clock = adc_clk / 64)): - begin - if(negedge_cnt[2:0] == 3'd0) - ssp_clk <= 1'b1; - if(negedge_cnt[2:0] == 3'd4) - ssp_clk <= 1'b0; - - if(negedge_cnt[5:0] == 6'd0) // ssp_frame rising edge indicates start of frame - ssp_frame <= 1'b1; - if(negedge_cnt[5:0] == 6'd8) - ssp_frame <= 1'b0; - end - else - // all other modes (ssp_clk = adc_clk / 16, ssp_frame clock = adc_clk / 128): - begin - if(negedge_cnt[3:0] == 4'd0) - ssp_clk <= 1'b1; - if(negedge_cnt[3:0] == 4'd8) - ssp_clk <= 1'b0; - - if(negedge_cnt[6:0] == 7'd7) // ssp_frame rising edge indicates start of frame, sampled on falling edge of ssp_clk - ssp_frame <= 1'b1; - if(negedge_cnt[6:0] == 7'd23) - ssp_frame <= 1'b0; - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FPGA -> ARM communication: -// select the data to be sent to ARM -reg bit_to_arm; -reg sendbit; - -always @(negedge adc_clk) -begin - if(negedge_cnt[3:0] == 4'd0) - begin - // What do we communicate to the ARM - if(mod_type == `FPGA_HF_ISO14443A_TAGSIM_LISTEN) - sendbit = after_hysteresis; - else if(mod_type == `FPGA_HF_ISO14443A_TAGSIM_MOD) - /* if(fdt_counter > 11'd772) sendbit = mod_sig_coil; // huh? - else */ - sendbit = fdt_indicator; - else if (mod_type == `FPGA_HF_ISO14443A_READER_LISTEN) - sendbit = curbit; - else - sendbit = 1'b0; - end - - - if(mod_type == `FPGA_HF_ISO14443A_SNIFFER) - // send sampled reader and tag data: - bit_to_arm = to_arm[7]; - else if (mod_type == `FPGA_HF_ISO14443A_TAGSIM_MOD && fdt_elapsed && temp_buffer_reset) - // send timing information: - bit_to_arm = to_arm[7]; - else - // send data or fdt_indicator - bit_to_arm = sendbit; -end - - - - -assign ssp_din = bit_to_arm; - -// Subcarrier (adc_clk/16, for FPGA_HF_ISO14443A_TAGSIM_MOD only). -wire sub_carrier; -assign sub_carrier = ~sub_carrier_cnt[3]; - -// in FPGA_HF_ISO14443A_READER_MOD: drop carrier for mod_sig_coil==1 (pause); in FPGA_HF_ISO14443A_READER_LISTEN: carrier always on; in other modes: carrier always off -assign pwr_hi = (ck_1356meg & (((mod_type == `FPGA_HF_ISO14443A_READER_MOD) & ~mod_sig_coil) || (mod_type == `FPGA_HF_ISO14443A_READER_LISTEN))); - - -// Enable HF antenna drivers: -assign pwr_oe1 = 1'b0; -assign pwr_oe3 = 1'b0; - -// FPGA_HF_ISO14443A_TAGSIM_MOD: short circuit antenna with different resistances (modulated by sub_carrier modulated by mod_sig_coil) -// for pwr_oe4 = 1 (tristate): antenna load = 10k || 33 = 32,9 Ohms -// for pwr_oe4 = 0 (active): antenna load = 10k || 33 || 33 = 16,5 Ohms -assign pwr_oe4 = mod_sig_coil & sub_carrier & (mod_type == `FPGA_HF_ISO14443A_TAGSIM_MOD); - -// This is all LF, so doesn't matter. -assign pwr_oe2 = 1'b0; -assign pwr_lo = 1'b0; - - -assign dbg = negedge_cnt[3]; - -endmodule diff --git a/fpga-xc3s100e/hi_reader.v b/fpga-xc3s100e/hi_reader.v deleted file mode 100644 index c5ffa7b85..000000000 --- a/fpga-xc3s100e/hi_reader.v +++ /dev/null @@ -1,335 +0,0 @@ -//----------------------------------------------------------------------------- -// -// Jonathan Westhues, April 2006 -//----------------------------------------------------------------------------- - -module hi_reader( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - subcarrier_frequency, minor_mode -); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [1:0] subcarrier_frequency; - input [3:0] minor_mode; - -assign adc_clk = ck_1356meg; // sample frequency is 13,56 MHz - -// When we're a reader, we just need to do the BPSK demod; but when we're an -// eavesdropper, we also need to pick out the commands sent by the reader, -// using AM. Do this the same way that we do it for the simulated tag. -reg after_hysteresis, after_hysteresis_prev, after_hysteresis_prev_prev; -reg [11:0] has_been_low_for; -always @(negedge adc_clk) -begin - if (& adc_d[7:0]) after_hysteresis <= 1'b1; - else if (~(| adc_d[7:0])) after_hysteresis <= 1'b0; - - if (after_hysteresis) - begin - has_been_low_for <= 12'd0; - end - else - begin - if (has_been_low_for == 12'd4095) - begin - has_been_low_for <= 12'd0; - after_hysteresis <= 1'b1; - end - else - has_been_low_for <= has_been_low_for + 1; - end -end - - -// Let us report a correlation every 64 samples. I.e. -// one Q/I pair after 4 subcarrier cycles for the 848kHz subcarrier, -// one Q/I pair after 2 subcarrier cycles for the 424kHz subcarriers, -// one Q/I pair for each subcarrier cyle for the 212kHz subcarrier. -// We need a 6-bit counter for the timing. -reg [5:0] corr_i_cnt; -always @(negedge adc_clk) -begin - corr_i_cnt <= corr_i_cnt + 1; -end - - -// A couple of registers in which to accumulate the correlations. From the 64 samples -// we would add at most 32 times the difference between unmodulated and modulated signal. It should -// be safe to assume that a tag will not be able to modulate the carrier signal by more than 25%. -// 32 * 255 * 0,25 = 2040, which can be held in 11 bits. Add 1 bit for sign. -// Temporary we might need more bits. For the 212kHz subcarrier we could possible add 32 times the -// maximum signal value before a first subtraction would occur. 32 * 255 = 8160 can be held in 13 bits. -// Add one bit for sign -> need 14 bit registers but final result will fit into 12 bits. -reg signed [13:0] corr_i_accum; -reg signed [13:0] corr_q_accum; -// we will report maximum 8 significant bits -reg signed [7:0] corr_i_out; -reg signed [7:0] corr_q_out; - - -// the amplitude of the subcarrier is sqrt(ci^2 + cq^2). -// approximate by amplitude = max(|ci|,|cq|) + 1/2*min(|ci|,|cq|) -reg [13:0] corr_amplitude, abs_ci, abs_cq, max_ci_cq; -reg [12:0] min_ci_cq_2; // min_ci_cq / 2 - -always @(*) -begin - if (corr_i_accum[13] == 1'b0) - abs_ci <= corr_i_accum; - else - abs_ci <= -corr_i_accum; - - if (corr_q_accum[13] == 1'b0) - abs_cq <= corr_q_accum; - else - abs_cq <= -corr_q_accum; - - if (abs_ci > abs_cq) - begin - max_ci_cq <= abs_ci; - min_ci_cq_2 <= abs_cq / 2; - end - else - begin - max_ci_cq <= abs_cq; - min_ci_cq_2 <= abs_ci / 2; - end - - corr_amplitude <= max_ci_cq + min_ci_cq_2; - -end - - -// The subcarrier reference signals -reg subcarrier_I; -reg subcarrier_Q; - -always @(*) -begin - if (subcarrier_frequency == `FPGA_HF_READER_SUBCARRIER_848_KHZ) - begin - subcarrier_I = ~corr_i_cnt[3]; - subcarrier_Q = ~(corr_i_cnt[3] ^ corr_i_cnt[2]); - end - else if (subcarrier_frequency == `FPGA_HF_READER_SUBCARRIER_212_KHZ) - begin - subcarrier_I = ~corr_i_cnt[5]; - subcarrier_Q = ~(corr_i_cnt[5] ^ corr_i_cnt[4]); - end - else - begin // 424 kHz - subcarrier_I = ~corr_i_cnt[4]; - subcarrier_Q = ~(corr_i_cnt[4] ^ corr_i_cnt[3]); - end -end - - -// ADC data appears on the rising edge, so sample it on the falling edge -always @(negedge adc_clk) -begin - // These are the correlators: we correlate against in-phase and quadrature - // versions of our reference signal, and keep the (signed) results or the - // resulting amplitude to send out later over the SSP. - if (corr_i_cnt == 6'd0) - begin - if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_AMPLITUDE) - begin - // send amplitude plus 2 bits reader signal - corr_i_out <= corr_amplitude[13:6]; - corr_q_out <= {corr_amplitude[5:0], after_hysteresis_prev_prev, after_hysteresis_prev}; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ) - begin - - // Send 7 most significant bits of in phase tag signal (signed), plus 1 bit reader signal - if (corr_i_accum[13:11] == 3'b000 || corr_i_accum[13:11] == 3'b111) - corr_i_out <= {corr_i_accum[11:5], after_hysteresis_prev_prev}; - else // truncate to maximum value - if (corr_i_accum[13] == 1'b0) - corr_i_out <= {7'b0111111, after_hysteresis_prev_prev}; - else - corr_i_out <= {7'b1000000, after_hysteresis_prev_prev}; - - // Send 7 most significant bits of quadrature phase tag signal (signed), plus 1 bit reader signal - if (corr_q_accum[13:11] == 3'b000 || corr_q_accum[13:11] == 3'b111) - corr_q_out <= {corr_q_accum[11:5], after_hysteresis_prev}; - else // truncate to maximum value - if (corr_q_accum[13] == 1'b0) - corr_q_out <= {7'b0111111, after_hysteresis_prev}; - else - corr_q_out <= {7'b1000000, after_hysteresis_prev}; - end - else if (minor_mode == `FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE) - begin - // send amplitude - corr_i_out <= {2'b00, corr_amplitude[13:8]}; - corr_q_out <= corr_amplitude[7:0]; - end - else if (minor_mode == `FPGA_HF_READER_MODE_RECEIVE_IQ) - begin - - // Send 8 bits of in phase tag signal - if (corr_i_accum[13:11] == 3'b000 || corr_i_accum[13:11] == 3'b111) - corr_i_out <= corr_i_accum[11:4]; - else // truncate to maximum value - if (corr_i_accum[13] == 1'b0) - corr_i_out <= 8'b01111111; - else - corr_i_out <= 8'b10000000; - - // Send 8 bits of quadrature phase tag signal - if (corr_q_accum[13:11] == 3'b000 || corr_q_accum[13:11] == 3'b111) - corr_q_out <= corr_q_accum[11:4]; - else // truncate to maximum value - if (corr_q_accum[13] == 1'b0) - corr_q_out <= 8'b01111111; - else - corr_q_out <= 8'b10000000; - end - - // for each Q/I pair report two reader signal samples when sniffing. Store the 1st. - after_hysteresis_prev_prev <= after_hysteresis; - - // Initialize next correlation. - // Both I and Q reference signals are high when corr_i_nct == 0. Therefore need to accumulate. - corr_i_accum <= $signed({1'b0, adc_d}); - corr_q_accum <= $signed({1'b0, adc_d}); - end - else - begin - if (subcarrier_I) - corr_i_accum <= corr_i_accum + $signed({1'b0, adc_d}); - else - corr_i_accum <= corr_i_accum - $signed({1'b0, adc_d}); - - if (subcarrier_Q) - corr_q_accum <= corr_q_accum + $signed({1'b0, adc_d}); - else - corr_q_accum <= corr_q_accum - $signed({1'b0, adc_d}); - end - - // for each Q/I pair report two reader signal samples when sniffing. Store the 2nd. - if (corr_i_cnt == 6'd32) - after_hysteresis_prev <= after_hysteresis; - - // Then the result from last time is serialized and send out to the ARM. - // We get one report each cycle, and each report is 16 bits, so the - // ssp_clk should be the adc_clk divided by 64/16 = 4. - // ssp_clk frequency = 13,56MHz / 4 = 3.39MHz - - if (corr_i_cnt[1:0] == 2'b00) - begin - // Don't shift if we just loaded new data, obviously. - if (corr_i_cnt != 6'd0) - begin - corr_i_out[7:0] <= {corr_i_out[6:0], corr_q_out[7]}; - corr_q_out[7:1] <= corr_q_out[6:0]; - end - end - -end - - -// ssp clock and frame signal for communication to and from ARM -// _____ _____ _____ _ -// ssp_clk | |_____| |_____| |_____| -// _____ -// ssp_frame ___| |____________________________ -// ___________ ___________ ___________ _ -// ssp_d_in X___________X___________X___________X_ -// -// corr_i_cnt 0 1 2 3 4 5 6 7 8 9 10 11 12 ... -// - -reg ssp_clk; -reg ssp_frame; - -always @(negedge adc_clk) -begin - if (corr_i_cnt[1:0] == 2'b00) - ssp_clk <= 1'b1; - - if (corr_i_cnt[1:0] == 2'b10) - ssp_clk <= 1'b0; - - // set ssp_frame signal for corr_i_cnt = 1..3 - // (send one frame with 16 Bits) - if (corr_i_cnt == 6'd1) - ssp_frame <= 1'b1; - - if (corr_i_cnt == 6'd3) - ssp_frame <= 1'b0; -end - - -assign ssp_din = corr_i_out[7]; - - -// a jamming signal -reg jam_signal; -reg [3:0] jam_counter; - -always @(negedge adc_clk) -begin - if (corr_i_cnt == 6'd0) - begin - jam_counter <= jam_counter + 1; - jam_signal <= jam_counter[1] ^ jam_counter[3]; - end -end - -// Antenna drivers -reg pwr_hi, pwr_oe4; - -always @(*) -begin - if (minor_mode == `FPGA_HF_READER_MODE_SEND_SHALLOW_MOD) - begin - pwr_hi = ck_1356meg; - pwr_oe4 = ssp_dout; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SEND_FULL_MOD) - begin - pwr_hi = ck_1356meg & ~ssp_dout; - pwr_oe4 = 1'b0; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SEND_JAM) - begin - pwr_hi = ck_1356meg & jam_signal; - pwr_oe4 = 1'b0; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ - || minor_mode == `FPGA_HF_READER_MODE_SNIFF_AMPLITUDE - || minor_mode == `FPGA_HF_READER_MODE_SNIFF_PHASE) - begin // all off - pwr_hi = 1'b0; - pwr_oe4 = 1'b0; - end - else // receiving from tag - begin - pwr_hi = ck_1356meg; - pwr_oe4 = 1'b0; - end -end - -// always on -assign pwr_oe1 = 1'b0; -assign pwr_oe3 = 1'b0; - -// Unused. -assign pwr_lo = 1'b0; -assign pwr_oe2 = 1'b0; - -// Debug Output -assign dbg = corr_i_cnt[3]; - -endmodule diff --git a/fpga-xc3s100e/hi_simulate.v b/fpga-xc3s100e/hi_simulate.v deleted file mode 100644 index cf951279a..000000000 --- a/fpga-xc3s100e/hi_simulate.v +++ /dev/null @@ -1,152 +0,0 @@ -//----------------------------------------------------------------------------- -// Pretend to be an ISO 14443 tag. We will do this by alternately short- -// circuiting and open-circuiting the antenna coil, with the tri-state -// pins. -// -// We communicate over the SSP, as a bitstream (i.e., might as well be -// unframed, though we still generate the word sync signal). The output -// (ARM -> FPGA) tells us whether to modulate or not. The input (FPGA -// -> ARM) is us using the A/D as a fancy comparator; this is with -// (software-added) hysteresis, to undo the high-pass filter. -// -// At this point only Type A is implemented. This means that we are using a -// bit rate of 106 kbit/s, or fc/128. Oversample by 4, which ought to make -// things practical for the ARM (fc/32, 423.8 kbits/s, ~50 kbytes/s) -// -// Jonathan Westhues, October 2006 -//----------------------------------------------------------------------------- - -//For ISE 10.1 PROJ,IDE cannot apply definition to all files -`include "define.v" - - -module hi_simulate( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type -); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [3:0] mod_type; - -// Power amp goes between LOW and tri-state, so pwr_hi (and pwr_lo) can -// always be low. -assign pwr_hi = 1'b0; // HF antenna connected to GND -assign pwr_lo = 1'b0; // LF antenna connected to GND - -// This one is all LF, so doesn't matter -assign pwr_oe2 = 1'b0; - -assign adc_clk = ck_1356meg; -assign dbg = ssp_frame; - -// The comparator with hysteresis on the output from the peak detector. -reg after_hysteresis; -reg [11:0] has_been_low_for; - -always @(negedge adc_clk) -begin - if (& adc_d[7:5]) after_hysteresis <= 1'b1; // if (adc_d >= 224) - else if (~(| adc_d[7:5])) after_hysteresis <= 1'b0; // if (adc_d <= 31) - - if (adc_d >= 224) - begin - has_been_low_for <= 12'd0; - end - else - begin - if (has_been_low_for == 12'd4095) - begin - has_been_low_for <= 12'd0; - after_hysteresis <= 1'b1; - end - else - begin - has_been_low_for <= has_been_low_for + 1; - end - end -end - - -// Divide 13.56 MHz to produce various frequencies for SSP_CLK -// and modulation. -reg [8:0] ssp_clk_divider; - -always @(negedge adc_clk) - ssp_clk_divider <= (ssp_clk_divider + 1); - -reg ssp_clk; - -always @(negedge adc_clk) -begin - if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K_8BIT) - // Get bit every at 53KHz (every 8th carrier bit of 424kHz) - ssp_clk <= ~ssp_clk_divider[7]; - else if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) - // Get next bit at 212kHz - ssp_clk <= ~ssp_clk_divider[5]; - else - // Get next bit at 424kHz - ssp_clk <= ~ssp_clk_divider[4]; -end - - -// Produce the byte framing signal; the phase of this signal -// is arbitrary, because it's just a bit stream in this module. -reg ssp_frame; -always @(negedge adc_clk) -begin - if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) - begin - if (ssp_clk_divider[8:5] == 4'd1) - ssp_frame <= 1'b1; - if (ssp_clk_divider[8:5] == 4'd5) - ssp_frame <= 1'b0; - end - else - begin - if (ssp_clk_divider[7:4] == 4'd1) - ssp_frame <= 1'b1; - if (ssp_clk_divider[7:4] == 4'd5) - ssp_frame <= 1'b0; - end -end - - -// Synchronize up the after-hysteresis signal, to produce DIN. -reg ssp_din; -always @(posedge ssp_clk) - ssp_din = after_hysteresis; - -// Modulating carrier frequency is fc/64 (212kHz) to fc/16 (848kHz). Reuse ssp_clk divider for that. -reg modulating_carrier; -always @(*) - if(mod_type == `FPGA_HF_SIMULATOR_NO_MODULATION) - modulating_carrier <= 1'b0; // no modulation - else if(mod_type == `FPGA_HF_SIMULATOR_MODULATE_BPSK) - modulating_carrier <= ssp_dout ^ ssp_clk_divider[3]; // XOR means BPSK - else if(mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) - modulating_carrier <= ssp_dout & ssp_clk_divider[5]; // switch 212kHz subcarrier on/off - else if(mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K || mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K_8BIT) - modulating_carrier <= ssp_dout & ssp_clk_divider[4]; // switch 424kHz modulation on/off - else - modulating_carrier <= 1'b0; // yet unused - - - -// Load modulation. Toggle only one of these, since we are already producing much deeper -// modulation than a real tag would. -assign pwr_oe1 = 1'b0; // 33 Ohms Load -assign pwr_oe4 = modulating_carrier; // 33 Ohms Load -// This one is always on, so that we can watch the carrier. -assign pwr_oe3 = 1'b0; // 10k Load - -endmodule diff --git a/fpga-xc3s100e/hi_sniffer.v b/fpga-xc3s100e/hi_sniffer.v deleted file mode 100644 index c2dc844a7..000000000 --- a/fpga-xc3s100e/hi_sniffer.v +++ /dev/null @@ -1,50 +0,0 @@ -module hi_sniffer( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_clk -); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - output ssp_frame, ssp_din, ssp_clk; - -// We are only snooping, all off. -assign pwr_hi = 1'b0; -assign pwr_lo = 1'b0; -assign pwr_oe1 = 1'b0; -assign pwr_oe2 = 1'b0; -assign pwr_oe3 = 1'b0; -assign pwr_oe4 = 1'b0; - -reg ssp_frame; -reg [7:0] adc_d_out = 8'd0; -reg [2:0] ssp_cnt = 3'd0; - -assign adc_clk = ck_1356meg; -assign ssp_clk = ~ck_1356meg; - -always @(posedge ssp_clk) -begin - if(ssp_cnt[2:0] == 3'd7) - ssp_cnt[2:0] <= 3'd0; - else - ssp_cnt <= ssp_cnt + 1; - - if(ssp_cnt[2:0] == 3'b000) // set frame length - begin - adc_d_out[7:0] <= adc_d; - ssp_frame <= 1'b1; - end - else - begin - adc_d_out[7:0] <= {1'b0, adc_d_out[7:1]}; - ssp_frame <= 1'b0; - end - -end - -assign ssp_din = adc_d_out[0]; - -endmodule diff --git a/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.ise b/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.ise deleted file mode 100644 index 40e5eeffdff1dad9e67d8e59ede83f95cc6f6c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257463 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 diff --git a/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl b/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl deleted file mode 100644 index 114f0df18..000000000 --- a/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl +++ /dev/null @@ -1,479 +0,0 @@ -# -# Project automation script for fpga_hf -# -# Created for ISE version 10.1 -# -# This file contains several Tcl procedures (procs) that you can use to automate -# your project by running from xtclsh or the Project Navigator Tcl console. -# If you load this file (using the Tcl command: source fpga_hf.tcl, then you can -# run any of the procs included here. -# You may also edit any of these procs to customize them. See comments in each -# proc for more instructions. -# -# This file contains the following procedures: -# -# Top Level procs (meant to be called directly by the user): -# run_process: you can use this top-level procedure to run any processes -# that you choose to by adding and removing comments, or by -# adding new entries. -# rebuild_project: you can alternatively use this top-level procedure -# to recreate your entire project, and the run selected processes. -# -# Lower Level (helper) procs (called under in various cases by the top level procs): -# show_help: print some basic information describing how this script works -# add_source_files: adds the listed source files to your project. -# set_project_props: sets the project properties that were in effect when this -# script was generated. -# create_libraries: creates and adds file to VHDL libraries that were defined when -# this script was generated. -# create_partitions: adds any partitions that were defined when this script was generated. -# set_process_props: set the process properties as they were set for your project -# when this script was generated. -# - -set myProject "fpga_hf.ise" -set myScript "fpga_hf.tcl" - -# -# Main (top-level) routines -# - -# -# run_process -# This procedure is used to run processes on an existing project. You may comment or -# uncomment lines to control which processes are run. This routine is set up to run -# the Implement Design and Generate Programming File processes by default. This proc -# also sets process properties as specified in the "set_process_props" proc. Only -# those properties which have values different from their current settings in the project -# file will be modified in the project. -# -proc run_process {} { - - global myScript - global myProject - - ## put out a 'heartbeat' - so we know something's happening. - puts "\n$myScript: running ($myProject)...\n" - - if { ! [ open_project ] } { - return false - } - - set_process_props - # - # Remove the comment characters (#'s) to enable the following commands - # process run "Synthesize" - # process run "Translate" - # process run "Map" - # process run "Place & Route" - # - puts "Running 'Implement Design'" - if { ! [ process run "Implement Design" ] } { - puts "$myScript: Implementation run failed, check run output for details." - project close - return - } - puts "Running 'Generate Programming File'" - if { ! [ process run "Generate Programming File" ] } { - puts "$myScript: Generate Programming File run failed, check run output for details." - project close - return - } - - puts "Run completed." - project close - -} - -# -# rebuild_project -# -# This procedure renames the project file (if it exists) and recreates the project. -# It then sets project properties and adds project sources as specified by the -# set_project_props and add_source_files support procs. It recreates VHDL libraries -# and partitions as they existed at the time this script was generated. -# -# It then calls run_process to set process properties and run selected processes. -# -proc rebuild_project {} { - - global myScript - global myProject - - ## put out a 'heartbeat' - so we know something's happening. - puts "\n$myScript: rebuilding ($myProject)...\n" - - if { [ file exists $myProject ] } { - puts "$myScript: Removing existing project file." - file delete $myProject - } - - puts "$myScript: Rebuilding project $myProject" - project new $myProject - set_project_props - add_source_files - create_libraries - create_partitions - puts "$myScript: project rebuild completed." - - run_process - -} - -# -# Support Routines -# - -# -# show_help: print information to help users understand the options available when -# running this script. -# -proc show_help {} { - - global myScript - - puts "" - puts "usage: xtclsh $myScript " - puts " or you can run xtclsh and then enter 'source $myScript'." - puts "" - puts "options:" - puts " run_process - set properties and run processes." - puts " rebuild_project - rebuild the project from scratch and run processes." - puts " set_project_props - set project properties (device, speed, etc.)" - puts " add_source_files - add source files" - puts " create_libraries - create vhdl libraries" - puts " create_partitions - create partitions" - puts " set_process_props - set process property values" - puts " show_help - print this message" - puts "" -} - -proc open_project {} { - - global myScript - global myProject - - if { ! [ file exists $myProject ] } { - ## project file isn't there, rebuild it. - puts "Project $myProject not found. Use ${myProject}_rebuild to recreate it." - return false - } - - project open $myProject - - return true - -} -# -# set_project_props -# -# This procedure sets the project properties as they were set in the project -# at the time this script was generated. -# -proc set_project_props {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: Setting project properties..." - - project set family "Spartan3E" - project set device "xc3s100e" - project set package "vq100" - project set speed "-4" - project set top_level_module_type "HDL" - project set synthesis_tool "XST (VHDL/Verilog)" - project set simulator "ISE Simulator (VHDL/Verilog)" - project set "Preferred Language" "Verilog" - project set "Enable Message Filtering" "false" - project set "Display Incremental Messages" "false" - -} - - -# -# add_source_files -# -# This procedure add the source files that were known to the project at the -# time this script was generated. -# -proc add_source_files {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: Adding sources to project..." - - xfile add "../../clk_divider.v" - xfile add "../../define.v" - xfile add "../../fpga.ucf" - xfile add "../../fpga_allinone.v" - xfile add "../../fpga_hfmod.v" - xfile add "../../fpga_lfmod.v" - xfile add "../../hi_flite.v" - xfile add "../../hi_get_trace.v" - xfile add "../../hi_iso14443a.v" - xfile add "../../hi_reader.v" - xfile add "../../hi_simulate.v" - xfile add "../../hi_sniffer.v" - xfile add "../../lf_edge_detect.v" - xfile add "../../lo_adc.v" - xfile add "../../lo_edge_detect.v" - xfile add "../../lo_passthru.v" - xfile add "../../lo_read.v" - xfile add "../../lp20khz_1MSa_iir_filter.v" - xfile add "../../mux2_onein.v" - xfile add "../../mux2_oneout.v" - xfile add "../../util.v" - - # Set the Top Module as well... - project set top "fpga_hf" - - puts "$myScript: project sources reloaded." - -} ; # end add_source_files - -# -# create_libraries -# -# This procedure defines VHDL libraries and associates files with those libraries. -# It is expected to be used when recreating the project. Any libraries defined -# when this script was generated are recreated by this procedure. -# -proc create_libraries {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: Creating libraries..." - - - # must close the project or library definitions aren't saved. - project close - -} ; # end create_libraries - -# -# create_partitions -# -# This procedure creates partitions on instances in your project. -# It is expected to be used when recreating the project. Any partitions -# defined when this script was generated are recreated by this procedure. -# -proc create_partitions {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: Creating Partitions..." - - - # must close the project or partition definitions aren't saved. - project close - -} ; # end create_partitions - -# -# set_process_props -# -# This procedure sets properties as requested during script generation (either -# all of the properties, or only those modified from their defaults). -# -proc set_process_props {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: setting process properties..." - - project set "Compiled Library Directory" "\$XILINX//" - project set "Use SmartGuide" "false" - project set "SmartGuide Filename" "fpga_hf_guide.ncd" - project set "Multiplier Style" "Auto" -process "Synthesize - XST" - project set "Configuration Rate" "Default (1)" -process "Generate Programming File" - project set "Map to Input Functions" "4" -process "Map" - project set "Number of Clock Buffers" "24" -process "Synthesize - XST" - project set "Max Fanout" "500" -process "Synthesize - XST" - project set "Case Implementation Style" "None" -process "Synthesize - XST" - project set "Decoder Extraction" "true" -process "Synthesize - XST" - project set "Priority Encoder Extraction" "Yes" -process "Synthesize - XST" - project set "Mux Extraction" "Yes" -process "Synthesize - XST" - project set "RAM Extraction" "true" -process "Synthesize - XST" - project set "ROM Extraction" "true" -process "Synthesize - XST" - project set "FSM Encoding Algorithm" "Auto" -process "Synthesize - XST" - project set "Logical Shifter Extraction" "true" -process "Synthesize - XST" - project set "Optimization Goal" "Speed" -process "Synthesize - XST" - project set "Optimization Effort" "Normal" -process "Synthesize - XST" - project set "Resource Sharing" "true" -process "Synthesize - XST" - project set "Shift Register Extraction" "true" -process "Synthesize - XST" - project set "XOR Collapsing" "true" -process "Synthesize - XST" - project set "Other Bitgen Command Line Options" "" -process "Generate Programming File" - project set "Show All Models" "false" -process "Generate IBIS Model" - project set "Target UCF File Name" "" -process "Back-annotate Pin Locations" - project set "Ignore User Timing Constraints" "false" -process "Map" - project set "Use RLOC Constraints" "true" -process "Map" - project set "Other Map Command Line Options" "" -process "Map" - project set "Use LOC Constraints" "true" -process "Translate" - project set "Other Ngdbuild Command Line Options" "" -process "Translate" - project set "Ignore User Timing Constraints" "false" -process "Place & Route" - project set "Other Place & Route Command Line Options" "" -process "Place & Route" - project set "UserID Code (8 Digit Hexadecimal)" "0xFFFFFFFF" -process "Generate Programming File" - project set "Reset DCM if SHUTDOWN & AGHIGH performed" "false" -process "Generate Programming File" - project set "Configuration Pin Done" "Pull Up" -process "Generate Programming File" - project set "Create ASCII Configuration File" "false" -process "Generate Programming File" - project set "Create Binary Configuration File" "false" -process "Generate Programming File" - project set "Create Bit File" "true" -process "Generate Programming File" - project set "Enable BitStream Compression" "false" -process "Generate Programming File" - project set "Run Design Rules Checker (DRC)" "true" -process "Generate Programming File" - project set "Enable Cyclic Redundancy Checking (CRC)" "true" -process "Generate Programming File" - project set "Create IEEE 1532 Configuration File" "false" -process "Generate Programming File" - project set "Configuration Pin Program" "Pull Up" -process "Generate Programming File" - project set "JTAG Pin TCK" "Pull Up" -process "Generate Programming File" - project set "JTAG Pin TDI" "Pull Up" -process "Generate Programming File" - project set "JTAG Pin TDO" "Pull Up" -process "Generate Programming File" - project set "JTAG Pin TMS" "Pull Up" -process "Generate Programming File" - project set "Unused IOB Pins" "Pull Down" -process "Generate Programming File" - project set "Security" "Enable Readback and Reconfiguration" -process "Generate Programming File" - project set "FPGA Start-Up Clock" "CCLK" -process "Generate Programming File" - project set "Done (Output Events)" "Default (4)" -process "Generate Programming File" - project set "Drive Done Pin High" "false" -process "Generate Programming File" - project set "Enable Outputs (Output Events)" "Default (5)" -process "Generate Programming File" - project set "Release DLL (Output Events)" "Default (NoWait)" -process "Generate Programming File" - project set "Release Write Enable (Output Events)" "Default (6)" -process "Generate Programming File" - project set "Enable Internal Done Pipe" "false" -process "Generate Programming File" - project set "Allow Logic Optimization Across Hierarchy" "false" -process "Map" - project set "Optimization Strategy (Cover Mode)" "Area" -process "Map" - project set "Disable Register Ordering" "false" -process "Map" - project set "Pack I/O Registers/Latches into IOBs" "Off" -process "Map" - project set "Replicate Logic to Allow Logic Level Reduction" "true" -process "Map" - project set "Generate Detailed MAP Report" "false" -process "Map" - project set "Map Slice Logic into Unused Block RAMs" "false" -process "Map" - project set "Perform Timing-Driven Packing and Placement" "false" -process "Map" - project set "Trim Unconnected Signals" "true" -process "Map" - project set "Create I/O Pads from Ports" "false" -process "Translate" - project set "Macro Search Path" "" -process "Translate" - project set "Netlist Translation Type" "Timestamp" -process "Translate" - project set "User Rules File for Netlister Launcher" "" -process "Translate" - project set "Allow Unexpanded Blocks" "false" -process "Translate" - project set "Allow Unmatched LOC Constraints" "false" -process "Translate" - project set "Starting Placer Cost Table (1-100)" "1" -process "Place & Route" - project set "Placer Effort Level (Overrides Overall Level)" "None" -process "Place & Route" - project set "Router Effort Level (Overrides Overall Level)" "None" -process "Place & Route" - project set "Place And Route Mode" "Normal Place and Route" -process "Place & Route" - project set "Use Bonded I/Os" "false" -process "Place & Route" - project set "Add I/O Buffers" "true" -process "Synthesize - XST" - project set "Global Optimization Goal" "AllClockNets" -process "Synthesize - XST" - project set "Keep Hierarchy" "No" -process "Synthesize - XST" - project set "Register Balancing" "No" -process "Synthesize - XST" - project set "Register Duplication" "true" -process "Synthesize - XST" - project set "Asynchronous To Synchronous" "false" -process "Synthesize - XST" - project set "Automatic BRAM Packing" "false" -process "Synthesize - XST" - project set "BRAM Utilization Ratio" "100" -process "Synthesize - XST" - project set "Bus Delimiter" "<>" -process "Synthesize - XST" - project set "Case" "Maintain" -process "Synthesize - XST" - project set "Cores Search Directories" "" -process "Synthesize - XST" - project set "Cross Clock Analysis" "false" -process "Synthesize - XST" - project set "Equivalent Register Removal" "true" -process "Synthesize - XST" - project set "FSM Style" "LUT" -process "Synthesize - XST" - project set "Generate RTL Schematic" "Yes" -process "Synthesize - XST" - project set "Generics, Parameters" "" -process "Synthesize - XST" - project set "Hierarchy Separator" "/" -process "Synthesize - XST" - project set "HDL INI File" "" -process "Synthesize - XST" - project set "Library Search Order" "" -process "Synthesize - XST" - project set "Netlist Hierarchy" "As Optimized" -process "Synthesize - XST" - project set "Optimize Instantiated Primitives" "false" -process "Synthesize - XST" - project set "Pack I/O Registers into IOBs" "Auto" -process "Synthesize - XST" - project set "Read Cores" "true" -process "Synthesize - XST" - project set "Slice Packing" "true" -process "Synthesize - XST" - project set "Slice Utilization Ratio" "100" -process "Synthesize - XST" - project set "Use Clock Enable" "Yes" -process "Synthesize - XST" - project set "Use Synchronous Reset" "Yes" -process "Synthesize - XST" - project set "Use Synchronous Set" "Yes" -process "Synthesize - XST" - project set "Use Synthesis Constraints File" "true" -process "Synthesize - XST" - project set "Custom Compile File List" "" -process "Synthesize - XST" - project set "Verilog Include Directories" "" -process "Synthesize - XST" - project set "Verilog 2001" "true" -process "Synthesize - XST" - project set "Verilog Macros" "" -process "Synthesize - XST" - project set "Work Directory" "./xst" -process "Synthesize - XST" - project set "Write Timing Constraints" "false" -process "Synthesize - XST" - project set "Other XST Command Line Options" "" -process "Synthesize - XST" - project set "Map Effort Level" "Medium" -process "Map" - project set "Combinatorial Logic Optimization" "false" -process "Map" - project set "Starting Placer Cost Table (1-100)" "1" -process "Map" - project set "Power Reduction" "false" -process "Map" - project set "Register Duplication" "false" -process "Map" - project set "Synthesis Constraints File" "" -process "Synthesize - XST" - project set "Mux Style" "Auto" -process "Synthesize - XST" - project set "RAM Style" "Auto" -process "Synthesize - XST" - project set "Timing Mode" "Non Timing Driven" -process "Map" - project set "Generate Asynchronous Delay Report" "false" -process "Place & Route" - project set "Generate Clock Region Report" "false" -process "Place & Route" - project set "Generate Post-Place & Route Simulation Model" "false" -process "Place & Route" - project set "Generate Post-Place & Route Static Timing Report" "true" -process "Place & Route" - project set "Nodelist File (Unix Only)" "" -process "Place & Route" - project set "Number of PAR Iterations (0-100)" "3" -process "Place & Route" - project set "Save Results in Directory (.dir will be appended)" "" -process "Place & Route" - project set "Number of Results to Save (0-100)" "" -process "Place & Route" - project set "Power Reduction" "false" -process "Place & Route" - project set "Timing Mode" "Performance Evaluation" -process "Place & Route" - project set "Enable Debugging of Serial Mode BitStream" "false" -process "Generate Programming File" - project set "CLB Pack Factor Percentage" "100" -process "Map" - project set "Place & Route Effort Level (Overall)" "Standard" -process "Place & Route" - project set "Move First Flip-Flop Stage" "true" -process "Synthesize - XST" - project set "Move Last Flip-Flop Stage" "true" -process "Synthesize - XST" - project set "ROM Style" "Auto" -process "Synthesize - XST" - project set "Safe Implementation" "No" -process "Synthesize - XST" - project set "Extra Effort" "None" -process "Map" - project set "Power Activity File" "" -process "Map" - project set "Power Activity File" "" -process "Place & Route" - project set "Extra Effort (Highest PAR level only)" "None" -process "Place & Route" - - puts "$myScript: project property values set." - -} ; # end set_process_props - -proc main {} { - - if { [llength $::argv] == 0 } { - show_help - return true - } - - foreach option $::argv { - switch $option { - "show_help" { show_help } - "run_process" { run_process } - "rebuild_project" { rebuild_project } - "set_project_props" { set_project_props } - "add_source_files" { add_source_files } - "create_libraries" { create_libraries } - "create_partitions" { create_partitions } - "set_process_props" { set_process_props } - default { puts "unrecognized option: $option"; show_help } - } - } -} - -if { $tcl_interactive } { - show_help -} else { - if {[catch {main} result]} { - puts "$myScript failed: $result." - } -} - diff --git a/fpga-xc3s100e/lf_edge_detect.v b/fpga-xc3s100e/lf_edge_detect.v deleted file mode 100644 index d086f95fc..000000000 --- a/fpga-xc3s100e/lf_edge_detect.v +++ /dev/null @@ -1,77 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -// input clk is 24MHz -`include "min_max_tracker.v" - -module lf_edge_detect(input clk, input [7:0] adc_d, input [7:0] lf_ed_threshold, - output [7:0] max, output [7:0] min, - output [7:0] high_threshold, output [7:0] highz_threshold, - output [7:0] lowz_threshold, output [7:0] low_threshold, - output edge_state, output edge_toggle); - - min_max_tracker tracker(clk, adc_d, lf_ed_threshold, min, max); - - // auto-tune - assign high_threshold = (max + min) / 2 + (max - min) / 4; - assign highz_threshold = (max + min) / 2 + (max - min) / 8; - assign lowz_threshold = (max + min) / 2 - (max - min) / 8; - assign low_threshold = (max + min) / 2 - (max - min) / 4; - - // heuristic to see if it makes sense to try to detect an edge - wire enabled = - (high_threshold > highz_threshold) - & (highz_threshold > lowz_threshold) - & (lowz_threshold > low_threshold) - & ((high_threshold - highz_threshold) > 8) - & ((highz_threshold - lowz_threshold) > 16) - & ((lowz_threshold - low_threshold) > 8); - - // Toggle the output with hysteresis - // Set to high if the ADC value is above the threshold - // Set to low if the ADC value is below the threshold - reg is_high = 0; - reg is_low = 0; - reg is_zero = 0; - reg trigger_enabled = 1; - reg output_edge = 0; - reg output_state; - - always @(posedge clk) - begin - is_high <= (adc_d >= high_threshold); - is_low <= (adc_d <= low_threshold); - is_zero <= ((adc_d > lowz_threshold) & (adc_d < highz_threshold)); - end - - // all edges detection - always @(posedge clk) - if (enabled) begin - // To enable detecting two consecutive peaks at the same level - // (low or high) we check whether or not we went back near 0 in-between. - // This extra check is necessary to prevent from noise artifacts - // around the threshold values. - if (trigger_enabled & (is_high | is_low)) begin - output_edge <= ~output_edge; - trigger_enabled <= 0; - end else - trigger_enabled <= trigger_enabled | is_zero; - end - - // edge states - always @(posedge clk) - if (enabled) begin - if (is_high) - output_state <= 1'd1; - else if (is_low) - output_state <= 1'd0; - end - - assign edge_state = output_state; - assign edge_toggle = output_edge; - -endmodule diff --git a/fpga-xc3s100e/lo_adc.v b/fpga-xc3s100e/lo_adc.v deleted file mode 100644 index bba090afb..000000000 --- a/fpga-xc3s100e/lo_adc.v +++ /dev/null @@ -1,91 +0,0 @@ -//----------------------------------------------------------------------------- -// The way that we connect things in low-frequency simulation mode. In this -// case just pass everything through to the ARM, which can bit-bang this -// (because it is so slow). -// -// Jonathan Westhues, April 2006 -//----------------------------------------------------------------------------- - -module lo_adc( - pck0, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, divisor, - lf_field -); - input pck0; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [7:0] divisor; - input lf_field; - -reg [7:0] to_arm_shiftreg; -reg [7:0] pck_divider; -reg clk_state; - -// Antenna logic, depending on "lf_field" (in arm defined as FPGA_LF_READER_FIELD) -wire tag_modulation = ssp_dout & !lf_field; -wire reader_modulation = !ssp_dout & lf_field & clk_state; - -// always on (High Frequency outputs, unused) -assign pwr_oe1 = 1'b0; -assign pwr_hi = 1'b0; - -// low frequency outputs -assign pwr_lo = reader_modulation; -assign pwr_oe2 = 1'b0; // 33 Ohms -assign pwr_oe3 = tag_modulation; // base antenna load = 33 Ohms -assign pwr_oe4 = 1'b0; // 10k Ohms - -// Debug Output ADC clock -assign dbg = adc_clk; - -// ADC clock out of phase with antenna driver -assign adc_clk = ~clk_state; - -// serialized SSP data is gated by clk_state to suppress unwanted signal -assign ssp_din = to_arm_shiftreg[7] && !clk_state; - -// SSP clock always runs at 24MHz -assign ssp_clk = pck0; - -// SSP frame is gated by clk_state and goes high when pck_divider=8..15 -assign ssp_frame = (pck_divider[7:3] == 5'd1) && !clk_state; - -// divide 24mhz down to 3mhz -always @(posedge pck0) -begin - if (pck_divider == divisor[7:0]) - begin - pck_divider <= 8'd0; - clk_state = !clk_state; - end - else - begin - pck_divider <= pck_divider + 1; - end -end - -// this task also runs at pck0 frequency (24Mhz) and is used to serialize -// the ADC output which is then clocked into the ARM SSP. -always @(posedge pck0) -begin - if ((pck_divider == 8'd7) && !clk_state) - to_arm_shiftreg <= adc_d; - else begin - to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - // simulation showed a glitch occurring due to the LSB of the shifter - // not being set as we shift bits out - // this ensures the ssp_din remains low after a transfer and suppresses - // the glitch that would occur when the last data shifted out ended in - // a 1 bit and the next data shifted out started with a 0 bit - to_arm_shiftreg[0] <= 1'b0; - end -end - -endmodule diff --git a/fpga-xc3s100e/lo_edge_detect.v b/fpga-xc3s100e/lo_edge_detect.v deleted file mode 100644 index d91bf3845..000000000 --- a/fpga-xc3s100e/lo_edge_detect.v +++ /dev/null @@ -1,70 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -// -// There are two modes: -// - lf_ed_toggle_mode == 0: the output is set low (resp. high) when a low -// (resp. high) edge/peak is detected, with hysteresis -// - lf_ed_toggle_mode == 1: the output is toggling whenever an edge/peak -// is detected. -// That way you can detect two consecutive edges/peaks at the same level (L/H) -// -// Output: -// - ssp_frame (wired to TIOA1 on the arm) for the edge detection/state -// - ssp_clk: cross_lo - -//For ISE 10.1 PROJ,IDE auto include -//`include "lp20khz_1MSa_iir_filter.v" -//`include "lf_edge_detect.v" - -module lo_edge_detect( - input pck0, input pck_divclk, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, - output ssp_frame, input ssp_dout, output ssp_clk, - input cross_lo, - output dbg, - input lf_field, - input lf_ed_toggle_mode, input [7:0] lf_ed_threshold -); - -wire tag_modulation = ssp_dout & !lf_field; -wire reader_modulation = !ssp_dout & lf_field & pck_divclk; - -// No logic, straight through. -assign pwr_oe1 = 1'b0; // not used in LF mode -assign pwr_oe3 = 1'b0; // base antenna load = 33 Ohms -// when modulating, add another 33 Ohms and 10k Ohms in parallel: -assign pwr_oe2 = tag_modulation; -assign pwr_oe4 = tag_modulation; - -assign ssp_clk = cross_lo; -assign pwr_lo = reader_modulation; -assign pwr_hi = 1'b0; - -// filter the ADC values -wire data_rdy; -wire [7:0] adc_filtered; -assign adc_clk = pck0; -lp20khz_1MSa_iir_filter adc_filter(pck0, adc_d, data_rdy, adc_filtered); - -// detect edges -wire [7:0] high_threshold, highz_threshold, lowz_threshold, low_threshold; -wire [7:0] max, min; -wire edge_state, edge_toggle; -lf_edge_detect lf_ed(pck0, adc_filtered, lf_ed_threshold, - max, min, - high_threshold, highz_threshold, lowz_threshold, low_threshold, - edge_state, edge_toggle); - -assign dbg = lf_ed_toggle_mode ? edge_toggle : edge_state; - -assign ssp_frame = lf_ed_toggle_mode ? edge_toggle : edge_state; - -endmodule - diff --git a/fpga-xc3s100e/lo_passthru.v b/fpga-xc3s100e/lo_passthru.v deleted file mode 100644 index f0f2847a0..000000000 --- a/fpga-xc3s100e/lo_passthru.v +++ /dev/null @@ -1,29 +0,0 @@ -//----------------------------------------------------------------------------- -// For reading TI tags, we need to place the FPGA in pass through mode -// and pass everything through to the ARM -//----------------------------------------------------------------------------- -// iZsh , June 2014 - -module lo_passthru( - input pck_divclk, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - output adc_clk, - output ssp_din, input ssp_dout, - input cross_lo, - output dbg -); - -// the antenna is modulated when ssp_dout = 1, when 0 the -// antenna drivers stop modulating and go into listen mode -assign pwr_oe3 = 1'b0; -assign pwr_oe1 = ssp_dout; -assign pwr_oe2 = ssp_dout; -assign pwr_oe4 = ssp_dout; -assign pwr_lo = pck_divclk && ssp_dout; -assign pwr_hi = 1'b0; -assign adc_clk = 1'b0; -assign ssp_din = cross_lo; -assign dbg = cross_lo; - -endmodule diff --git a/fpga-xc3s100e/lo_read.v b/fpga-xc3s100e/lo_read.v deleted file mode 100644 index 8ac58721e..000000000 --- a/fpga-xc3s100e/lo_read.v +++ /dev/null @@ -1,74 +0,0 @@ -//----------------------------------------------------------------------------- -// The way that we connect things in low-frequency read mode. In this case -// we are generating the unmodulated low frequency carrier. -// The A/D samples at that same rate and the result is serialized. -// -// Jonathan Westhues, April 2006 -// iZsh , June 2014 -//----------------------------------------------------------------------------- - -module lo_read( - input pck0, input [7:0] pck_cnt, input pck_divclk, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, - output ssp_frame, output ssp_din, output ssp_clk, - output dbg, - input lf_field -); - -reg [7:0] to_arm_shiftreg; - -// this task also runs at pck0 frequency (24MHz) and is used to serialize -// the ADC output which is then clocked into the ARM SSP. - -// because pck_divclk always transitions when pck_cnt = 0 we use the -// pck_div counter to sync our other signals off it -// we read the ADC value when pck_cnt=7 and shift it out on counts 8..15 -always @(posedge pck0) -begin - if((pck_cnt == 8'd7) && !pck_divclk) - to_arm_shiftreg <= adc_d; - else begin - to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - // simulation showed a glitch occurring due to the LSB of the shifter - // not being set as we shift bits out - // this ensures the ssp_din remains low after a transfer and suppresses - // the glitch that would occur when the last data shifted out ended in - // a 1 bit and the next data shifted out started with a 0 bit - to_arm_shiftreg[0] <= 1'b0; - end -end - -// ADC samples on falling edge of adc_clk, data available on the rising edge - -// example of ssp transfer of binary value 1100101 -// start of transfer is indicated by the rise of the ssp_frame signal -// ssp_din changes on the rising edge of the ssp_clk clock and is clocked into -// the ARM by the falling edge of ssp_clk -// _______________________________ -// ssp_frame__| |__ -// _______ ___ ___ -// ssp_din __| |_______| |___| |______ -// _ _ _ _ _ _ _ _ _ _ -// ssp_clk |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ - -// serialized SSP data is gated by ant_lo to suppress unwanted signal -assign ssp_din = to_arm_shiftreg[7] && !pck_divclk; -// SSP clock always runs at 24MHz -assign ssp_clk = pck0; -// SSP frame is gated by ant_lo and goes high when pck_divider=8..15 -assign ssp_frame = (pck_cnt[7:3] == 5'd1) && !pck_divclk; -// unused signals tied low -assign pwr_hi = 1'b0; -assign pwr_oe1 = 1'b0; -assign pwr_oe2 = 1'b0; -assign pwr_oe3 = 1'b0; -assign pwr_oe4 = 1'b0; -// this is the antenna driver signal -assign pwr_lo = lf_field & pck_divclk; -// ADC clock out of phase with antenna driver -assign adc_clk = ~pck_divclk; -// ADC clock also routed to debug pin -assign dbg = adc_clk; -endmodule diff --git a/fpga-xc3s100e/lp20khz_1MSa_iir_filter.v b/fpga-xc3s100e/lp20khz_1MSa_iir_filter.v deleted file mode 100644 index 2dbfd6945..000000000 --- a/fpga-xc3s100e/lp20khz_1MSa_iir_filter.v +++ /dev/null @@ -1,81 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -// Butterworth low pass IIR filter -// input: 8bit ADC signal, 1MS/s -// output: 8bit value, Fc=20khz -// -// coef: (using http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html) -// Recurrence relation: -// y[n] = ( 1 * x[n- 2]) -// + ( 2 * x[n- 1]) -// + ( 1 * x[n- 0]) - -// + ( -0.8371816513 * y[n- 2]) -// + ( 1.8226949252 * y[n- 1]) -// -// therefore: -// a = [1,2,1] -// b = [-0.8371816513, 1.8226949252] -// b is approximated to b = [-0xd6/0x100, 0x1d3 / 0x100] (for optimization) -// gain = 2.761139367e2 -// -// See details about its design see -// https://fail0verflow.com/blog/2014/proxmark3-fpga-iir-filter.html -module lp20khz_1MSa_iir_filter(input clk, input [7:0] adc_d, output rdy, output [7:0] out); - - // clk is 24MHz, the IIR filter is designed for 1MS/s - // hence we need to divide it by 24 - // using a shift register takes less area than a counter - reg [23:0] cnt = 1; - assign rdy = cnt[0]; - always @(posedge clk) - cnt <= {cnt[22:0], cnt[23]}; - - reg [7:0] x0 = 0; - reg [7:0] x1 = 0; - reg [16:0] y0 = 0; - reg [16:0] y1 = 0; - - always @(posedge clk) - begin - if (rdy) - begin - x0 <= x1; - x1 <= adc_d; - y0 <= y1; - y1 <= - // center the signal: - // input range is [0; 255] - // We want "128" to be at the center of the 17bit register - // (128+z)*gain = 17bit center - // z = (1<<16)/gain - 128 = 109 - // We could use 9bit x registers for that, but that would be - // a waste, let's just add the constant during the computation - // (x0+109) + 2*(x1+109) + (x2+109) = x0 + 2*x1 + x2 + 436 - x0 + {x1, 1'b0} + adc_d + 436 - // we want "- y0 * 0xd6 / 0x100" using only shift and add - // 0xd6 == 0b11010110 - // so *0xd6/0x100 is equivalent to - // ((x << 1) + (x << 2) + (x << 4) + (x << 6) + (x << 7)) >> 8 - // which is also equivalent to - // (x >> 7) + (x >> 6) + (x >> 4) + (x >> 2) + (x >> 1) - - ((y0 >> 7) + (y0 >> 6) + (y0 >> 4) + (y0 >> 2) + (y0 >> 1)) // - y0 * 0xd6 / 0x100 - // we want "+ y1 * 0x1d3 / 0x100" - // 0x1d3 == 0b111010011 - // so this is equivalent to - // ((x << 0) + (x << 1) + (x << 4) + (x << 6) + (x << 7) + (x << 8)) >> 8 - // which is also equivalent to - // (x >> 8) + (x >> 7) + (x >> 4) + (x >> 2) + (x >> 1) + (x >> 0) - + ((y1 >> 8) + (y1 >> 7) + (y1 >> 4) + (y1 >> 2) + (y1 >> 1) + y1); - end - end - - // output: reduce to 8bit - assign out = y1[16:9]; - -endmodule diff --git a/fpga-xc3s100e/min_max_tracker.v b/fpga-xc3s100e/min_max_tracker.v deleted file mode 100644 index 5e8bbedf1..000000000 --- a/fpga-xc3s100e/min_max_tracker.v +++ /dev/null @@ -1,65 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -// track min and max peak values (envelope follower) -// -// NB: the min value (resp. max value) is updated only when the next high peak -// (resp. low peak) is reached/detected, since you can't know it isn't a -// local minima (resp. maxima) until then. -// This also means the peaks are detected with an unpredictable delay. -// This algorithm therefore can't be used directly for realtime peak detections, -// but it can be used as a simple envelope follower. -module min_max_tracker(input clk, input [7:0] adc_d, input [7:0] threshold, - output [7:0] min, output [7:0] max); - - reg [7:0] min_val = 255; - reg [7:0] max_val = 0; - reg [7:0] cur_min_val = 255; - reg [7:0] cur_max_val = 0; - reg [1:0] state = 0; - - always @(posedge clk) - begin - case (state) - 0: // initialize - begin - if (cur_max_val >= ({1'b0, adc_d} + threshold)) - state <= 2; - else if (adc_d >= ({1'b0, cur_min_val} + threshold)) - state <= 1; - if (cur_max_val <= adc_d) - cur_max_val <= adc_d; - else if (adc_d <= cur_min_val) - cur_min_val <= adc_d; - end - 1: // high phase - begin - if (cur_max_val <= adc_d) - cur_max_val <= adc_d; - else if (({1'b0, adc_d} + threshold) <= cur_max_val) begin - state <= 2; - cur_min_val <= adc_d; - max_val <= cur_max_val; - end - end - 2: // low phase - begin - if (adc_d <= cur_min_val) - cur_min_val <= adc_d; - else if (adc_d >= ({1'b0, cur_min_val} + threshold)) begin - state <= 1; - cur_max_val <= adc_d; - min_val <= cur_min_val; - end - end - endcase - end - - assign min = min_val; - assign max = max_val; - -endmodule diff --git a/fpga-xc3s100e/util.v b/fpga-xc3s100e/util.v deleted file mode 100644 index 0842ac64f..000000000 --- a/fpga-xc3s100e/util.v +++ /dev/null @@ -1,27 +0,0 @@ -//----------------------------------------------------------------------------- -// General-purpose miscellany. -// -// Jonathan Westhues, April 2006. -//----------------------------------------------------------------------------- - -module mux8(sel, y, x0, x1, x2, x3, x4, x5, x6, x7); - input [2:0] sel; - input x0, x1, x2, x3, x4, x5, x6, x7; - output y; - reg y; - -always @(x0 or x1 or x2 or x3 or x4 or x5 or x6 or x7 or sel) -begin - case (sel) - 3'b000: y = x0; - 3'b001: y = x1; - 3'b010: y = x2; - 3'b011: y = x3; - 3'b100: y = x4; - 3'b101: y = x5; - 3'b110: y = x6; - 3'b111: y = x7; - endcase -end - -endmodule diff --git a/fpga/Makefile b/fpga/Makefile new file mode 100644 index 000000000..e5bca0dfb --- /dev/null +++ b/fpga/Makefile @@ -0,0 +1,221 @@ +# +# FPGA Makefile for all targets +# +# The top part of this Makefile is used to define custom options for a number of compilation targets +# To define an additional target simply look at the other defined targets and add a new TARGET entry with a unique number and the custom options required + +XILINX_TOOLS_PREFIX= + +# Copy update (only when destination is older or missing) +CP = cp -u + +# Make directory, no error if already existing +MKDIR = mkdir -p + +# Remove recursive, force +RMDIR = rm -rf + +# Path to make +MAKE = make + +# Custom prefix for build directories, each target is built into its own separate directory name formed by combining the PREFIX and TARGET names. +# This way the source is not polluted with build files and the build directories are left behind after compilation so logs and reports can be +# examined or can be easily deleted with "make clean" +PREFIX = __ + +# Options to be passed to XST +XST_OPTS_BASE = run +XST_OPTS_BASE += -ifn xst.prj +XST_OPTS_BASE += -ifmt mixed +XST_OPTS_BASE += -ofmt NGC +XST_OPTS_BASE += -lso xst.lso +XST_OPTS_BASE += -top fpga_top +XST_OPTS_BASE += -resource_sharing yes + +# Optimizations for speed (default) +XST_OPTS_SPEED = -opt_mode Speed +XST_OPTS_SPEED += -opt_level 1 +XST_OPTS_SPEED += -fsm_style lut +XST_OPTS_SPEED += -fsm_encoding auto + +# Optimization for reduced space +XST_OPTS_AREA = -opt_mode area +XST_OPTS_AREA += -opt_level 2 +XST_OPTS_AREA += -fsm_style bram +XST_OPTS_AREA += -fsm_encoding compact + +# Types of selective module compilation: +# WITH_LF Enables selection of LF modules (and disables all HF) + +# To enable these modules WITH_LF _MUST_ be defined +# WITH_LF0 enable LF reader (generic) +# WITH_LF1 enable LF edge detect (generic) +# WITH_LF2 enable LF passthrough +# WITH_LF3 enable LF ADC (read/write) + +# To enable these modules WITH_LF _MUST_NOT_ be defined +# WITH_HF0 enable HF reader (see also WITH_HF_15 below) +# WITH_HF_15 select "iso15 2sc mode" extensions instead of original +# WITH_HF1 enable HF simulated tag +# WITH_HF2 enable HF ISO14443-A +# WITH_HF3 enable sniff +# WITH_HF4 enable HF ISO18092 FeliCa +# WITH_HF5 enable HF get trace + +# RDV40/Generic - Enable LF and all the LF modules +TARGET1_OPTIONS = -define \{WITH_LF WITH_LF0 WITH_LF1 WITH_LF2 WITH_LF3\} +# RDV40/Generic - Enable all HF modules except Felica +TARGET2_OPTIONS = -define \{WITH_HF0 WITH_HF1 WITH_HF2 WITH_HF3 WITH_HF5\} +# RDV40/Generic - Enable all HF modules except Felica and ISO14443, select HF_15 instead of HF +TARGET3_OPTIONS = -define \{WITH_HF0 WITH_HF1 WITH_HF3 WITH_HF5 WITH_HF_15\} +# RDV40/Generic - Enable all HF modules except ISO14443 +TARGET4_OPTIONS = -define \{WITH_HF0 WITH_HF1 WITH_HF3 WITH_HF4 WITH_HF5\} +# ICOPYX +TARGET5_OPTIONS = -define {PM3ICOPYX} -rtlview Yes + +# Here we list the target names +TARGET1_NAME = fpga_pm3_lf +TARGET2_NAME = fpga_pm3_hf +TARGET3_NAME = fpga_pm3_hf_15 +TARGET4_NAME = fpga_pm3_felica +TARGET5_NAME = fpga_icopyx_hf + +# Targets can be compiled for different FPGA flavours +TARGET1_FPGA = xc2s30-5-vq100 +TARGET2_FPGA = $(TARGET1_FPGA) +TARGET3_FPGA = $(TARGET1_FPGA) +TARGET4_FPGA = $(TARGET1_FPGA) +TARGET5_FPGA = xc3s100e-4-vq100 + +# Assemble the final XST options for each target +TARGET1_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_AREA) -p $(TARGET1_FPGA) -ofn $(TARGET1_NAME) $(TARGET1_OPTIONS) +TARGET2_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_AREA) -p $(TARGET2_FPGA) -ofn $(TARGET2_NAME) $(TARGET2_OPTIONS) +TARGET3_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_AREA) -p $(TARGET3_FPGA) -ofn $(TARGET3_NAME) $(TARGET3_OPTIONS) +TARGET4_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_AREA) -p $(TARGET4_FPGA) -ofn $(TARGET4_NAME) $(TARGET4_OPTIONS) +TARGET5_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_SPEED) -p $(TARGET5_FPGA) -ofn $(TARGET5_NAME) $(TARGET5_OPTIONS) + +# these files are common for all targets +TARGET_COMMON_FILES = define.v +TARGET_COMMON_FILES += mux8.v +TARGET_COMMON_FILES += clk_divider.v +TARGET_COMMON_FILES += lp20khz_1MSa_iir_filter.v +TARGET_COMMON_FILES += min_max_tracker.v +TARGET_COMMON_FILES += hi_flite.v +TARGET_COMMON_FILES += hi_get_trace.v +TARGET_COMMON_FILES += hi_iso14443a.v +TARGET_COMMON_FILES += hi_reader.v +TARGET_COMMON_FILES += hi_reader_15.v +TARGET_COMMON_FILES += hi_simulate.v +TARGET_COMMON_FILES += hi_sniffer.v +TARGET_COMMON_FILES += lf_edge_detect.v +TARGET_COMMON_FILES += lo_adc.v +TARGET_COMMON_FILES += lo_edge_detect.v +TARGET_COMMON_FILES += lo_passthru.v +TARGET_COMMON_FILES += lo_read.v + +# Add the files that are unique per target and all the common files +TARGET1_FILES = $(TARGET_COMMON_FILES) fpga_pm3_top.v +TARGET2_FILES = $(TARGET1_FILES) +TARGET3_FILES = $(TARGET1_FILES) +TARGET4_FILES = $(TARGET1_FILES) +TARGET5_FILES = $(TARGET_COMMON_FILES) mux2_onein.v mux2_oneout.v fpga_icopyx_hf.v fpga_icopyx_lf.v fpga_icopyx_top.v + +# List of all valid target FPGA images to build +TARGETS = $(TARGET1_NAME) $(TARGET2_NAME) $(TARGET3_NAME) $(TARGET4_NAME) $(TARGET5_NAME) + +# Verbosity type for ISE tools ise|xflow|silent +VERBOSITY = -intstyle silent +# Echo (Q=) or not echo (Q=@) build commands to the terminal +Q=@ + +# Pass the custom variables to the lower make rules +$(TARGET1_NAME).bit: TARGET_FPGA = $(TARGET1_FPGA) +$(TARGET1_NAME).bit: TARGET_FILES = $(TARGET1_FILES) +$(TARGET1_NAME).bit: TARGET_XST_OPTS = $(TARGET1_XST_OPTS) + +$(TARGET2_NAME).bit: TARGET_FPGA = $(TARGET2_FPGA) +$(TARGET2_NAME).bit: TARGET_FILES = $(TARGET2_FILES) +$(TARGET2_NAME).bit: TARGET_XST_OPTS = $(TARGET2_XST_OPTS) + +$(TARGET3_NAME).bit: TARGET_FPGA = $(TARGET3_FPGA) +$(TARGET3_NAME).bit: TARGET_FILES = $(TARGET3_FILES) +$(TARGET3_NAME).bit: TARGET_XST_OPTS = $(TARGET3_XST_OPTS) + +$(TARGET4_NAME).bit: TARGET_FPGA = $(TARGET4_FPGA) +$(TARGET4_NAME).bit: TARGET_FILES = $(TARGET4_FILES) +$(TARGET4_NAME).bit: TARGET_XST_OPTS = $(TARGET4_XST_OPTS) + +$(TARGET5_NAME).bit: TARGET_FPGA = $(TARGET5_FPGA) +$(TARGET5_NAME).bit: TARGET_FILES = $(TARGET5_FILES) +$(TARGET5_NAME).bit: TARGET_XST_OPTS = $(TARGET5_XST_OPTS) + +$(TARGETS): + $(Q)$(MKDIR) $(PREFIX)build_$@ + $(Q)$(MAKE) -C $(PREFIX)build_$@ -f ../Makefile $(notdir $@).bit + +work: + $(Q)$(RM) xst.prj + $(Q)for item in $(TARGET_FILES); do echo verilog work ../$$item>>xst.prj; done + $(Q)echo work> xst.lso + +%.xst: work + $(Q)$(RM) $@ + $(Q)echo $(TARGET_XST_OPTS)> $@ + +%.ngc: %.xst + $(Q)$(RM) $@ + $(info [-] XST $@) + $(Q)$(XILINX_TOOLS_PREFIX)xst $(VERBOSITY) -ifn $< + +%.ngd: %.ngc + $(Q)$(RM) $@ + $(info [-] NGD $@) + $(Q)$(XILINX_TOOLS_PREFIX)ngdbuild $(VERBOSITY) -quiet -p $(TARGET_FPGA) -nt timestamp -uc ../$(TARGET_FPGA).ucf $< $@ + +%_map.ncd: %.ngd + $(Q)$(RM) $@ + $(info [-] MAP $@) + $(Q)$(XILINX_TOOLS_PREFIX)map $(VERBOSITY) -p $(TARGET_FPGA) -o $*_map $* + +%.ncd: %_map.ncd + $(Q)$(RM) $@ + $(info [-] PAR $@) + $(Q)$(XILINX_TOOLS_PREFIX)par $(VERBOSITY) -w $< $@ + +%.bit: %.ncd + # Hacky hack, make empty files for icopyx + if echo "$@" | grep -qi "icopyx"; then \ + truncate -s0 ../fpga_icopyx_lf.bit; \ + truncate -s0 ../fpga_icopyx_hf_15.bit; \ + truncate -s0 ../fpga_icopyx_felica.bit; \ + fi + $(Q)$(RM) $@ $*.drc $*.rbt + $(info [=] BITGEN $@) + $(Q)$(XILINX_TOOLS_PREFIX)bitgen $(VERBOSITY) -w $* $@ + $(Q)$(CP) $@ .. + +# Build all targets +all: $(TARGETS) + +# ALWAYS have some hardcoded text after $(PREFIX) to avoid rm -rf * or rm -rf /* situations if PREFIX is incorrectly set to empty "" or just "/" +clean: + $(Q)$(RMDIR) $(PREFIX)build_* + $(info [-] Build files deleted) + +.DEFAULT: + @if [ "$@" != "all" ] && [ ! "$(filter $@,$(TARGETS))" ]; then \ + make help; \ + else \ + make all; \ + fi + +.PHONY: all help clean + +help: + @echo "################################################################" + @echo "# Valid targets are: $(TARGETS)" + @echo "# - Builds only one of the above listed targets" + @echo "# all - Builds the FPGA bitstreams for all targets" + @echo "# clean - Keeps .bit files but cleans intermediate build files for all targets" + @echo "################################################################" + diff --git a/fpga-xc2s30/clk_divider.v b/fpga/clk_divider.v similarity index 91% rename from fpga-xc2s30/clk_divider.v rename to fpga/clk_divider.v index fbb3250f1..0bcc2e608 100644 --- a/fpga-xc2s30/clk_divider.v +++ b/fpga/clk_divider.v @@ -14,7 +14,12 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- -module clk_divider(input clk, input [7:0] divisor, output [7:0] div_cnt, output div_clk); +module clk_divider( + input clk, + input [7:0] divisor, + output [7:0] div_cnt, + output div_clk +); reg [7:0] div_cnt_ = 0; reg div_clk_; diff --git a/fpga/define.v b/fpga/define.v new file mode 100644 index 000000000..b7423278b --- /dev/null +++ b/fpga/define.v @@ -0,0 +1,155 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// The FPGA is responsible for interfacing between the A/D, the coil drivers, +// and the ARM. In the low-frequency modes it passes the data straight +// through, so that the ARM gets raw A/D samples over the SSP. In the high- +// frequency modes, the FPGA might perform some demodulation first, to +// reduce the amount of data that we must send to the ARM. +//----------------------------------------------------------------------------- + +/* + Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() + Send 16 bit command / data pair to FPGA with the bit format: + ++------ frame layout circa 2020 ------------------+ +| 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | ++-------------------------------------------------+ +| C C C C M M M M P P P P P P P P | C = FPGA_CMD_SET_CONFREG, M = FPGA_MAJOR_MODE_*, P = FPGA_LF_* or FPGA_HF_* parameter +| C C C C D D D D D D D D | C = FPGA_CMD_SET_DIVISOR, D = divisor +| C C C C T T T T T T T T | C = FPGA_CMD_SET_EDGE_DETECT_THRESHOLD, T = threshold +| C C C C E | C = FPGA_CMD_TRACE_ENABLE, E=0 off, E=1 on ++-------------------------------------------------+ + ++------ frame layout current ---------------------+ +| 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | ++-------------------------------------------------+ +| C C C C M M M P P P P P P | C = FPGA_CMD_SET_CONFREG, M = FPGA_MAJOR_MODE_*, P = FPGA_LF_* or FPGA_HF_* parameter +| C C C C D D D D D D D D | C = FPGA_CMD_SET_DIVISOR, D = divisor +| C C C C T T T T T T T T | C = FPGA_CMD_SET_EDGE_DETECT_THRESHOLD, T = threshold +| C C C C E | C = FPGA_CMD_TRACE_ENABLE, E=0 off, E=1 on ++-------------------------------------------------+ + + shift_reg receive this 16bit frame + + LF command + ---------- + shift_reg[15:12] == 4bit command + LF has three commands (FPGA_CMD_SET_CONFREG, FPGA_CMD_SET_DIVISOR, FPGA_CMD_SET_EDGE_DETECT_THRESHOLD) + Current commands uses only 2bits. We have room for up to 4bits of commands total (7). + + LF data + ------- + shift_reg[11:0] == 12bit data + lf data is divided into MAJOR MODES and configuration values. + + The major modes uses 3bits (0,1,2,3,7 | 000, 001, 010, 011, 111) + 000 FPGA_MAJOR_MODE_LF_READER = Act as LF reader (modulate) + 001 FPGA_MAJOR_MODE_LF_EDGE_DETECT = Simulate LF + 010 FPGA_MAJOR_MODE_LF_PASSTHRU = Passthrough mode, CROSS_LO line connected to SSP_DIN. SSP_DOUT logic level controls if we modulate / listening + 011 FPGA_MAJOR_MODE_LF_ADC = refactor hitag2, clear ADC sampling + 111 FPGA_MAJOR_MODE_OFF = turn off sampling. + + Each one of this major modes can have options. Currently these two major modes uses options. + - FPGA_MAJOR_MODE_LF_READER + - FPGA_MAJOR_MODE_LF_EDGE_DETECT + + FPGA_MAJOR_MODE_LF_READER + ------------------------------------- + lf_field = 1bit (FPGA_LF_ADC_READER_FIELD) + + You can send FPGA_CMD_SET_DIVISOR to set with FREQUENCY the fpga should sample at + divisor = 8bits shift_reg[7:0] + + FPGA_MAJOR_MODE_LF_EDGE_DETECT + ------------------------------------------ + lf_ed_toggle_mode = 1bits + lf_ed_threshold = 8bits threshold defaults to 127 + + You can send FPGA_CMD_SET_EDGE_DETECT_THRESHOLD to set a custom threshold + lf_ed_threshold = 8bits threshold value. + + conf_word 12bits + conf_word[7:5] = 3bit major mode. + conf_word[0] = 1bit lf_field + conf_word[1] = 1bit lf_ed_toggle_mode + conf_word[7:0] = 8bit divisor + conf_word[7:0] = 8bit threshold + +*/ +// Defining commands, modes and options. This must be aligned to the definitions in armsrc/fpgaloader.h +// Note: the definitions here are without shifts + +// Definitions for the FPGA commands. +`define FPGA_CMD_SET_CONFREG 1 +`define FPGA_CMD_SET_DIVISOR 2 +`define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD 3 +`define FPGA_CMD_TRACE_ENABLE 2 + +// Major modes +`define FPGA_MAJOR_MODE_LF_READER 0 +`define FPGA_MAJOR_MODE_LF_EDGE_DETECT 1 +`define FPGA_MAJOR_MODE_LF_PASSTHRU 2 +`define FPGA_MAJOR_MODE_LF_ADC 3 +`define FPGA_MAJOR_MODE_HF_READER 0 +`define FPGA_MAJOR_MODE_HF_SIMULATOR 1 +`define FPGA_MAJOR_MODE_HF_ISO14443A 2 +`define FPGA_MAJOR_MODE_HF_SNIFF 3 +`define FPGA_MAJOR_MODE_HF_ISO18092 4 +`define FPGA_MAJOR_MODE_HF_GET_TRACE 5 +`define FPGA_MAJOR_MODE_OFF 7 + +// Options for LF_READER +`define FPGA_LF_ADC_READER_FIELD 1 + +// Options for LF_EDGE_DETECT +`define FPGA_LF_EDGE_DETECT_READER_FIELD 1 +`define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 2 + +// Options for the generic HF reader +`define FPGA_HF_READER_MODE_RECEIVE_IQ 0 +`define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE 1 +`define FPGA_HF_READER_MODE_RECEIVE_PHASE 2 +`define FPGA_HF_READER_MODE_SEND_FULL_MOD 3 +`define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD 4 +`define FPGA_HF_READER_MODE_SNIFF_IQ 5 +`define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE 6 +`define FPGA_HF_READER_MODE_SNIFF_PHASE 7 +`define FPGA_HF_READER_MODE_SEND_JAM 8 + +`define FPGA_HF_READER_SUBCARRIER_848_KHZ 0 +`define FPGA_HF_READER_SUBCARRIER_424_KHZ 1 +`define FPGA_HF_READER_SUBCARRIER_212_KHZ 2 +`define FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ 3 + +// Options for the HF simulated tag, how to modulate +`define FPGA_HF_SIMULATOR_NO_MODULATION 0 +`define FPGA_HF_SIMULATOR_MODULATE_BPSK 1 +`define FPGA_HF_SIMULATOR_MODULATE_212K 2 +`define FPGA_HF_SIMULATOR_MODULATE_424K 4 +`define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT 5 + +// Options for ISO14443A +`define FPGA_HF_ISO14443A_SNIFFER 0 +`define FPGA_HF_ISO14443A_TAGSIM_LISTEN 1 +`define FPGA_HF_ISO14443A_TAGSIM_MOD 2 +`define FPGA_HF_ISO14443A_READER_LISTEN 3 +`define FPGA_HF_ISO14443A_READER_MOD 4 + +// Options for ISO18092 / Felica +`define FPGA_HF_ISO18092_FLAG_NOMOD 1 // 0001 disable modulation module +`define FPGA_HF_ISO18092_FLAG_424K 2 // 0010 should enable 414k mode (untested). No autodetect +`define FPGA_HF_ISO18092_FLAG_READER 4 // 0100 enables antenna power, to act as a reader instead of tag diff --git a/fpga-xc3s100e/fpga_felica.bit b/fpga/fpga_icopyx_felica.bit similarity index 100% rename from fpga-xc3s100e/fpga_felica.bit rename to fpga/fpga_icopyx_felica.bit diff --git a/fpga/fpga_icopyx_hf.bit b/fpga/fpga_icopyx_hf.bit new file mode 100644 index 0000000000000000000000000000000000000000..b62cdace60a2f3d95eac23c61b26a334a08dc47a GIT binary patch literal 72749 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 literal 0 HcmV?d00001 diff --git a/fpga/fpga_icopyx_hf.v b/fpga/fpga_icopyx_hf.v new file mode 100644 index 000000000..b7730875d --- /dev/null +++ b/fpga/fpga_icopyx_hf.v @@ -0,0 +1,227 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// The FPGA is responsible for interfacing between the A/D, the coil drivers, +// and the ARM. In the low-frequency modes it passes the data straight +// through, so that the ARM gets raw A/D samples over the SSP. In the high- +// frequency modes, the FPGA might perform some demodulation first, to +// reduce the amount of data that we must send to the ARM. +//----------------------------------------------------------------------------- +//`include "define.v" + +//`include "hi_reader.v" +//`include "hi_simulate.v" +//`include "hi_iso14443a.v" +//`include "hi_flite.v" +//`include "hi_sniffer.v" +//`include "hi_get_trace.v" + +module fpga_hf( + input spck, + output miso, + input mosi, + input ncs, + input pck0, + input ck_1356meg, + input ck_1356megb, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + input [7:0] adc_d, + output adc_clk, + output adc_noe, + output ssp_frame, + output ssp_din, + input ssp_dout, + output ssp_clk, + input cross_hi, + input cross_lo, + output debug +); + +//----------------------------------------------------------------------------- +// The SPI receiver. This sets up the configuration word, which the rest of +// the logic looks at to determine how to connect the A/D and the coil +// drivers (i.e., which section gets it). Also assign some symbolic names +// to the configuration bits, for use below. +//----------------------------------------------------------------------------- + +// Receive 16bits of data from ARM here. +reg [15:0] shift_reg; +always @(posedge spck) if (~ncs) shift_reg <= {shift_reg[14:0], mosi}; + +reg [8:0] conf_word; +reg trace_enable; + +// select module (outputs) based on major mode +wire [2:0] major_mode = conf_word[8:6]; +// parameter to be passed to modules +wire [3:0] minor_mode = conf_word[3:0]; + +// configuring the HF reader +wire [1:0] subcarrier_frequency = conf_word[5:4]; + +// We switch modes between transmitting to the 13.56 MHz tag and receiving +// from it, which means that we must make sure that we can do so without +// glitching, or else we will glitch the transmitted carrier. +always @(posedge ncs) +begin + // 4 bit command + case (shift_reg[15:12]) + `FPGA_CMD_SET_CONFREG: conf_word <= shift_reg[8:0]; + `FPGA_CMD_TRACE_ENABLE: trace_enable <= shift_reg[0]; + endcase +end + +//----------------------------------------------------------------------------- +// And then we instantiate the modules corresponding to each of the FPGA's +// major modes, and use muxes to connect the outputs of the active mode to +// the output pins. +//----------------------------------------------------------------------------- + +// 0 - HF reader +hi_reader hr( + .ck_1356meg (ck_1356megb), + .pwr_lo (hr_pwr_lo), + .pwr_hi (hr_pwr_hi), + .pwr_oe1 (hr_pwr_oe1), + .pwr_oe2 (hr_pwr_oe2), + .pwr_oe3 (hr_pwr_oe3), + .pwr_oe4 (hr_pwr_oe4), + .adc_d (adc_d), + .adc_clk (hr_adc_clk), + .ssp_frame (hr_ssp_frame), + .ssp_din (hr_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (hr_ssp_clk), + .debug (hr_debug), + .subcarrier_frequency (subcarrier_frequency), + .minor_mode (minor_mode) +); + +// 1 - HF simulated tag +hi_simulate hs( + .ck_1356meg (ck_1356meg), + .pwr_lo (hs_pwr_lo), + .pwr_hi (hs_pwr_hi), + .pwr_oe1 (hs_pwr_oe1), + .pwr_oe2 (hs_pwr_oe2), + .pwr_oe3 (hs_pwr_oe3), + .pwr_oe4 (hs_pwr_oe4), + .adc_d (adc_d), + .adc_clk (hs_adc_clk), + .ssp_frame (hs_ssp_frame), + .ssp_din (hs_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (hs_ssp_clk), + .debug (hs_debug), + .mod_type (minor_mode) +); + +// 2 - HF ISO14443-A +hi_iso14443a hisn( + .ck_1356meg (ck_1356meg), + .pwr_lo (hisn_pwr_lo), + .pwr_hi (hisn_pwr_hi), + .pwr_oe1 (hisn_pwr_oe1), + .pwr_oe2 (hisn_pwr_oe2), + .pwr_oe3 (hisn_pwr_oe3), + .pwr_oe4 (hisn_pwr_oe4), + .adc_d (adc_d), + .adc_clk (hisn_adc_clk), + .ssp_frame (hisn_ssp_frame), + .ssp_din (hisn_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (hisn_ssp_clk), + .debug (hisn_debug), + .mod_type (minor_mode) +); + +// 3 - HF sniff +hi_sniffer he( + .ck_1356meg (ck_1356megb), + .pwr_lo (he_pwr_lo), + .pwr_hi (he_pwr_hi), + .pwr_oe1 (he_pwr_oe1), + .pwr_oe2 (he_pwr_oe2), + .pwr_oe3 (he_pwr_oe3), + .pwr_oe4 (he_pwr_oe4), + .adc_d (adc_d), + .adc_clk (he_adc_clk), + .ssp_frame (he_ssp_frame), + .ssp_din (he_ssp_din), + .ssp_clk (he_ssp_clk) +); + +// 4 - HF ISO18092 FeliCa +hi_flite hfl( + .ck_1356meg (ck_1356megb), + .pwr_lo (hfl_pwr_lo), + .pwr_hi (hfl_pwr_hi), + .pwr_oe1 (hfl_pwr_oe1), + .pwr_oe2 (hfl_pwr_oe2), + .pwr_oe3 (hfl_pwr_oe3), + .pwr_oe4 (hfl_pwr_oe4), + .adc_d (adc_d), + .adc_clk (hfl_adc_clk), + .ssp_frame (hfl_ssp_frame), + .ssp_din (hfl_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (hfl_ssp_clk), + .debug (hfl_debug), + .mod_type (minor_mode) +); + +// 5 - HF get trace +hi_get_trace gt( + .ck_1356megb (ck_1356megb), + .adc_d (adc_d), + .trace_enable (trace_enable), + .major_mode (major_mode), + .ssp_frame (gt_ssp_frame), + .ssp_din (gt_ssp_din), + .ssp_clk (gt_ssp_clk) +); + +// Major modes: +// x0 = HF reader +// x1 = HF simulated tag +// x2 = HF ISO14443-A +// x3 = HF sniff +// x4 = HF ISO18092 FeliCa +// x5 = HF get trace +// x6 = unused +// x7 = FPGA_MAJOR_MODE_OFF + +mux8 mux_ssp_clk (.sel(major_mode), .y(ssp_clk ), .x0(hr_ssp_clk ), .x1(hs_ssp_clk ), .x2(hisn_ssp_clk ), .x3(he_ssp_clk ), .x4(hfl_ssp_clk ), .x5(gt_ssp_clk ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ssp_din (.sel(major_mode), .y(ssp_din ), .x0(hr_ssp_din ), .x1(hs_ssp_din ), .x2(hisn_ssp_din ), .x3(he_ssp_din ), .x4(hfl_ssp_din ), .x5(gt_ssp_din ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ssp_frame (.sel(major_mode), .y(ssp_frame), .x0(hr_ssp_frame ), .x1(hs_ssp_frame), .x2(hisn_ssp_frame), .x3(he_ssp_frame), .x4(hfl_ssp_frame), .x5(gt_ssp_frame), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe1 (.sel(major_mode), .y(pwr_oe1 ), .x0(hr_pwr_oe1 ), .x1(hs_pwr_oe1 ), .x2(hisn_pwr_oe1 ), .x3(he_pwr_oe1 ), .x4(hfl_pwr_oe1 ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe2 (.sel(major_mode), .y(pwr_oe2 ), .x0(hr_pwr_oe2 ), .x1(hs_pwr_oe2 ), .x2(hisn_pwr_oe2 ), .x3(he_pwr_oe2 ), .x4(hfl_pwr_oe2 ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe3 (.sel(major_mode), .y(pwr_oe3 ), .x0(hr_pwr_oe3 ), .x1(hs_pwr_oe3 ), .x2(hisn_pwr_oe3 ), .x3(he_pwr_oe3 ), .x4(hfl_pwr_oe3 ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe4 (.sel(major_mode), .y(pwr_oe4 ), .x0(hr_pwr_oe4 ), .x1(hs_pwr_oe4 ), .x2(hisn_pwr_oe4 ), .x3(he_pwr_oe4 ), .x4(hfl_pwr_oe4 ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_lo (.sel(major_mode), .y(pwr_lo ), .x0(hr_pwr_lo ), .x1(hs_pwr_lo ), .x2(hisn_pwr_lo ), .x3(he_pwr_lo ), .x4(hfl_pwr_lo ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_hi (.sel(major_mode), .y(pwr_hi ), .x0(hr_pwr_hi ), .x1(hs_pwr_hi ), .x2(hisn_pwr_hi ), .x3(he_pwr_hi ), .x4(hfl_pwr_hi ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_adc_clk (.sel(major_mode), .y(adc_clk ), .x0(hr_adc_clk ), .x1(hs_adc_clk ), .x2(hisn_adc_clk ), .x3(he_adc_clk ), .x4(hfl_adc_clk ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_dbg (.sel(major_mode), .y(debug ), .x0(hr_debug ), .x1(hs_debug ), .x2(hisn_debug ), .x3(he_debug ), .x4(hfl_debug ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); + +// In all modes, let the ADC's outputs be enabled. +assign adc_noe = 1'b0; + +endmodule diff --git a/fpga-xc3s100e/fpga_lf.bit b/fpga/fpga_icopyx_hf_15.bit similarity index 100% rename from fpga-xc3s100e/fpga_lf.bit rename to fpga/fpga_icopyx_hf_15.bit diff --git a/fpga/fpga_icopyx_lf.bit b/fpga/fpga_icopyx_lf.bit new file mode 100644 index 000000000..e69de29bb diff --git a/fpga/fpga_icopyx_lf.v b/fpga/fpga_icopyx_lf.v new file mode 100644 index 000000000..0ca4739b7 --- /dev/null +++ b/fpga/fpga_icopyx_lf.v @@ -0,0 +1,218 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// The FPGA is responsible for interfacing between the A/D, the coil drivers, +// and the ARM. In the low-frequency modes it passes the data straight +// through, so that the ARM gets raw A/D samples over the SSP. In the high- +// frequency modes, the FPGA might perform some demodulation first, to +// reduce the amount of data that we must send to the ARM. +//----------------------------------------------------------------------------- +//`include "define.v" + +//`include "lo_read.v" +//`include "lo_passthru.v" +//`include "lo_edge_detect.v" +//`include "lo_adc.v" +//`include "clk_divider.v" + +module fpga_lf( + input spck, + output miso, + input mosi, + input ncs, + input pck0, + input ck_1356meg, + input ck_1356megb, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + input [7:0] adc_d, + output adc_clk, + output adc_noe, + output ssp_frame, + output ssp_din, + input ssp_dout, + output ssp_clk, + input cross_hi, + input cross_lo, + output debug, + output PWR_LO_EN +); + +//----------------------------------------------------------------------------- +// The SPI receiver. This sets up the configuration word, which the rest of +// the logic looks at to determine how to connect the A/D and the coil +// drivers (i.e., which section gets it). Also assign some symbolic names +// to the configuration bits, for use below. +//----------------------------------------------------------------------------- + +// Receive 16bits of data from ARM here. +reg [15:0] shift_reg; +always @(posedge spck) if (~ncs) shift_reg <= {shift_reg[14:0], mosi}; + +reg [11:0] conf_word; + +// select module (outputs) based on major mode +wire [2:0] major_mode = conf_word[8:6]; +// parameter to be passed to modules +wire lf_field = conf_word[0]; +wire lf_ed_toggle_mode = conf_word[1]; +reg [7:0] lf_ed_threshold; + +wire [7:0] pck_cnt; +wire pck_divclk; +reg [7:0] divisor; +clk_divider div_clk(pck0, divisor, pck_cnt, pck_divclk); + +// We switch modes between transmitting to the 13.56 MHz tag and receiving +// from it, which means that we must make sure that we can do so without +// glitching, or else we will glitch the transmitted carrier. +always @(posedge ncs) +begin + // 4 bit command + case (shift_reg[15:12]) + `FPGA_CMD_SET_CONFREG: + begin + // 12 bit data + conf_word <= shift_reg[11:0]; + if (shift_reg[8:6] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) + begin + lf_ed_threshold <= 127; // default threshold + end + end + + `FPGA_CMD_SET_DIVISOR: + divisor <= shift_reg[7:0]; // 8bits + + `FPGA_CMD_SET_EDGE_DETECT_THRESHOLD: + lf_ed_threshold <= shift_reg[7:0]; // 8 bits + endcase +end + +//----------------------------------------------------------------------------- +// And then we instantiate the modules corresponding to each of the FPGA's +// major modes, and use muxes to connect the outputs of the active mode to +// the output pins. +//----------------------------------------------------------------------------- + +// 0 -- LF reader (generic) +lo_read lr( + .pck0 (pck0), + .pck_cnt (pck_cnt), + .pck_divclk (pck_divclk), + .pwr_lo (lr_pwr_lo), + .pwr_hi (lr_pwr_hi), + .pwr_oe1 (lr_pwr_oe1), + .pwr_oe2 (lr_pwr_oe2), + .pwr_oe3 (lr_pwr_oe3), + .pwr_oe4 (lr_pwr_oe4), + .adc_d (adc_d), + .adc_clk (lr_adc_clk), + .ssp_frame (lr_ssp_frame), + .ssp_din (lr_ssp_din), + .ssp_clk (lr_ssp_clk), + .debug (lr_debug), + .lf_field (lf_field) +); + +// 1 -- LF edge detect (generic) +lo_edge_detect le( + .pck0 (pck0), + .pck_divclk (pck_divclk), + .pwr_lo (le_pwr_lo), + .pwr_hi (le_pwr_hi), + .pwr_oe1 (le_pwr_oe1), + .pwr_oe2 (le_pwr_oe2), + .pwr_oe3 (le_pwr_oe3), + .pwr_oe4 (le_pwr_oe4), + .adc_d (adc_d), + .adc_clk (le_adc_clk), + .ssp_frame (le_ssp_frame), + .ssp_dout (ssp_dout), + .ssp_clk (le_ssp_clk), + .cross_lo (cross_lo), + .debug (le_debug), + .lf_field (lf_field), + .lf_ed_toggle_mode (lf_ed_toggle_mode), + .lf_ed_threshold (lf_ed_threshold) +); + +// 2 -- LF passthrough +lo_passthru lp( + .pck_divclk (pck_divclk), + .pwr_lo (lp_pwr_lo), + .pwr_hi (lp_pwr_hi), + .pwr_oe1 (lp_pwr_oe1), + .pwr_oe2 (lp_pwr_oe2), + .pwr_oe3 (lp_pwr_oe3), + .pwr_oe4 (lp_pwr_oe4), + .adc_clk (lp_adc_clk), + .ssp_din (lp_ssp_din), + .ssp_dout (ssp_dout), + .cross_lo (cross_lo), + .debug (lp_debug) +); + +// 3 -- LF ADC (read/write) +lo_adc la( + .pck0 (pck0), + .pwr_lo (la_pwr_lo ), + .pwr_hi (la_pwr_hi ), + .pwr_oe1 (la_pwr_oe1), + .pwr_oe2 (la_pwr_oe2), + .pwr_oe3 (la_pwr_oe3), + .pwr_oe4 (la_pwr_oe4), + .adc_d (adc_d), + .adc_clk (la_adc_clk), + .ssp_frame (la_ssp_frame), + .ssp_din (la_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (la_ssp_clk), + .debug (la_debug), + .divisor (divisor), + .lf_field (lf_field) +); + +// Major modes: +// x0 = LF reader (generic) +// x1 = LF edge detect (generic) +// x2 = LF passthrough +// x3 = LF ADC (read/write) +// x4 = SPARE +// x5 = SPARE +// x6 = SPARE +// x7 = FPGA_MAJOR_MODE_OFF + +mux8 mux_ssp_clk (.sel(major_mode), .y(ssp_clk ), .x0(lr_ssp_clk ), .x1(le_ssp_clk ), .x2(1'b0 ), .x3(la_ssp_clk ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ssp_din (.sel(major_mode), .y(ssp_din ), .x0(lr_ssp_din ), .x1(1'b0 ), .x2(lp_ssp_din), .x3(la_ssp_din ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ssp_frame (.sel(major_mode), .y(ssp_frame), .x0(lr_ssp_frame), .x1(le_ssp_frame), .x2(1'b0 ), .x3(la_ssp_frame), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe1 (.sel(major_mode), .y(pwr_oe1 ), .x0(lr_pwr_oe1 ), .x1(le_pwr_oe1 ), .x2(lp_pwr_oe1), .x3(la_pwr_oe1 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe2 (.sel(major_mode), .y(pwr_oe2 ), .x0(lr_pwr_oe2 ), .x1(le_pwr_oe2 ), .x2(lp_pwr_oe2), .x3(la_pwr_oe2 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe3 (.sel(major_mode), .y(pwr_oe3 ), .x0(lr_pwr_oe3 ), .x1(le_pwr_oe3 ), .x2(lp_pwr_oe3), .x3(la_pwr_oe3 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe4 (.sel(major_mode), .y(pwr_oe4 ), .x0(lr_pwr_oe4 ), .x1(le_pwr_oe4 ), .x2(lp_pwr_oe4), .x3(la_pwr_oe4 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_lo (.sel(major_mode), .y(pwr_lo ), .x0(lr_pwr_lo ), .x1(le_pwr_lo ), .x2(lp_pwr_lo ), .x3(la_pwr_lo ), .x4(1'b0), .x5(1'b0), .x6(1'b1), .x7(1'b0) ); +mux8 mux_pwr_hi (.sel(major_mode), .y(pwr_hi ), .x0(lr_pwr_hi ), .x1(le_pwr_hi ), .x2(lp_pwr_hi ), .x3(la_pwr_hi ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_adc_clk (.sel(major_mode), .y(adc_clk ), .x0(lr_adc_clk ), .x1(le_adc_clk ), .x2(lp_adc_clk), .x3(la_adc_clk ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_dbg (.sel(major_mode), .y(debug ), .x0(lr_debug ), .x1(le_debug ), .x2(lp_debug ), .x3(la_debug ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ant (.sel(major_mode), .y(PWR_LO_EN), .x0(1'b1 ), .x1(1'b1 ), .x2(1'b1 ), .x3(1'b1 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); + +// In all modes, let the ADC's outputs be enabled. +assign adc_noe = 1'b0; + +endmodule diff --git a/fpga-xc3s100e/fpga_allinone.v b/fpga/fpga_icopyx_top.v similarity index 61% rename from fpga-xc3s100e/fpga_allinone.v rename to fpga/fpga_icopyx_top.v index e766181f2..81aacb73c 100644 --- a/fpga-xc3s100e/fpga_allinone.v +++ b/fpga/fpga_icopyx_top.v @@ -1,37 +1,61 @@ -////////////////////////////////////////////////////////////////////////////////// -// Company: -// Engineer: +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. // -// Create Date: 16:09:14 05/13/2020 -// Design Name: -// Module Name: fpga_all_in_one -// Project Name: -// Target Devices: -// Tool versions: -// Description: +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// Dependencies: +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// Revision: -// Revision 0.01 - File Created -// Additional Comments: +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- // -////////////////////////////////////////////////////////////////////////////////// -module fpga_hf( - input spck, output miso, input mosi, input ncs, - input pck0, input ck_1356meg, input ck_1356megb, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, output adc_noe, - output ssp_frame, output ssp_din, input ssp_dout, output ssp_clk, - input cross_hi, input cross_lo, +// The FPGA is responsible for interfacing between the A/D, the coil drivers, +// and the ARM. In the low-frequency modes it passes the data straight +// through, so that the ARM gets raw A/D samples over the SSP. In the high- +// frequency modes, the FPGA might perform some demodulation first, to +// reduce the amount of data that we must send to the ARM. +//----------------------------------------------------------------------------- +//`include "fpga_lf.v" +//`include "fpga_hf.v" +//`include "mux2_onein.v" +//`include "mux2_oneout.v" +//`include "util.v" + +module fpga_top( + input spck, + output miso, + input mosi, + input ncs, + input pck0, + input ck_1356meg, + input ck_1356megb, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + input [7:0] adc_d, + output adc_clk, + output adc_noe, + output ssp_frame, + output ssp_din, + input ssp_dout, + output ssp_clk, + input cross_hi, + input cross_lo, output dbg, output PWR_LO_EN, input FPGA_SWITCH ); -fpga_hfmod hfmod( +fpga_hf hfmod( hfspck, hfmiso, hfmosi, hfncs, hfpck0, hfck_1356meg, hfck_1356megb, hfpwr_lo, hfpwr_hi, @@ -39,10 +63,10 @@ fpga_hfmod hfmod( adc_d, hfadc_clk, hfadc_noe, hfssp_frame, hfssp_din, hfssp_dout, hfssp_clk, hfcross_hi, hfcross_lo, - hfdbg + hfdebug ); -fpga_lfmod lfmod( +fpga_lf lfmod( lfspck, lfmiso, lfmosi, lfncs, lfpck0, lfck_1356meg, lfck_1356megb, lfpwr_lo, lfpwr_hi, @@ -50,7 +74,7 @@ fpga_lfmod lfmod( adc_d, lfadc_clk, lfadc_noe, lfssp_frame, lfssp_din, lfssp_dout, lfssp_clk, lfcross_hi, lfcross_lo, - lfdbg, + lfdebug, lfPWR_LO_EN ); @@ -75,7 +99,7 @@ mux2_oneout mux_ssp_dout_all (FPGA_SWITCH, ssp_dout, hfss mux2_one mux_ssp_clk_all (FPGA_SWITCH, ssp_clk, hfssp_clk, lfssp_clk); mux2_oneout mux_cross_hi_all (FPGA_SWITCH, cross_hi, hfcross_hi, lfcross_hi); mux2_oneout mux_cross_lo_all (FPGA_SWITCH, cross_lo, hfcross_lo, lfcross_lo); -mux2_one mux_dbg_all (FPGA_SWITCH, dbg, hfdbg, lfdbg); +mux2_one mux_dbg_all (FPGA_SWITCH, dbg, hfdebug, lfdebug); mux2_one mux_PWR_LO_EN_all (FPGA_SWITCH, PWR_LO_EN, 1'b0, lfPWR_LO_EN); endmodule diff --git a/fpga/fpga_pm3_felica.bit b/fpga/fpga_pm3_felica.bit new file mode 100644 index 0000000000000000000000000000000000000000..a903f180ead332a29b109b75c0bc01e7ce0b6c51 GIT binary patch literal 42176 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 tV6_HTYXCJ+!WAe)UwflO3jb27M6&B3H literal 0 HcmV?d00001 diff --git a/fpga/fpga_pm3_hf.bit b/fpga/fpga_pm3_hf.bit new file mode 100644 index 0000000000000000000000000000000000000000..76dcb8d98b9abed252a733ac03141958baf91129 GIT binary patch literal 42172 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 z�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 literal 0 HcmV?d00001 diff --git a/fpga/fpga_pm3_lf.bit b/fpga/fpga_pm3_lf.bit new file mode 100644 index 0000000000000000000000000000000000000000..593a9031f9bc0765bcbf12e5b1b63a0e88037c42 GIT binary patch literal 42172 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
  • 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 From 1292a572cbac59fc86c242b6417af9b90cb9e325 Mon Sep 17 00:00:00 2001 From: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> Date: Wed, 12 Jul 2023 23:32:35 +0300 Subject: [PATCH 642/924] Don't require valid key or proxmark3 for hardnested with --tests Signed-off-by: AloneLiberty <111039319+AloneLiberty@users.noreply.github.com> --- client/src/cmdhfmf.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 3419fc1b7..b48fd3d0a 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2241,28 +2241,29 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { snprintf(filename, FILE_PATH_SIZE, "hf-mf-%s-nonces.bin", uid); } - // detect MFC EV1 Signature - if (g_session.pm3_present && detect_mfc_ev1_signature() && keylen == 0) { - PrintAndLogEx(INFO, "MIFARE Classic EV1 card detected"); - blockno = 69; - keytype = MF_KEY_B; - memcpy(key, g_mifare_signature_key_b, sizeof(g_mifare_signature_key_b)); - } - - if (known_target_key == false && nonce_file_read == false) { - - // check if tag doesn't have static nonce - if (detect_classic_static_nonce() == NONCE_STATIC) { - PrintAndLogEx(WARNING, "Static nonce detected. Quitting..."); - PrintAndLogEx(HINT, "\tTry use `" _YELLOW_("hf mf staticnested") "`"); - return PM3_EOPABORTED; + if (g_session.pm3_present && !tests) { + // detect MFC EV1 Signature + if (detect_mfc_ev1_signature() && keylen == 0) { + PrintAndLogEx(INFO, "MIFARE Classic EV1 card detected"); + blockno = 69; + keytype = MF_KEY_B; + memcpy(key, g_mifare_signature_key_b, sizeof(g_mifare_signature_key_b)); } - uint64_t key64 = 0; - // check if we can authenticate to sector - if (mfCheckKeys(blockno, keytype, true, 1, key, &key64) != PM3_SUCCESS) { - PrintAndLogEx(WARNING, "Key is wrong. Can't authenticate to block: %3d key type: %c", blockno, (keytype == MF_KEY_B) ? 'B' : 'A'); - return PM3_EWRONGANSWER; + if (known_target_key == false && nonce_file_read == false) { + // check if tag doesn't have static nonce + if (detect_classic_static_nonce() == NONCE_STATIC) { + PrintAndLogEx(WARNING, "Static nonce detected. Quitting..."); + PrintAndLogEx(HINT, "\tTry use `" _YELLOW_("hf mf staticnested") "`"); + return PM3_EOPABORTED; + } + + uint64_t key64 = 0; + // check if we can authenticate to sector + if (mfCheckKeys(blockno, keytype, true, 1, key, &key64) != PM3_SUCCESS) { + PrintAndLogEx(WARNING, "Key is wrong. Can't authenticate to block: %3d key type: %c", blockno, (keytype == MF_KEY_B) ? 'B' : 'A'); + return PM3_EWRONGANSWER; + } } } From 82d80cc2507bb3a62e2dab2ace32fdb5b697910f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 14 Jul 2023 11:33:47 +0200 Subject: [PATCH 643/924] better memory clean up, thanks @gentilkiwi --- client/src/cmdhfmf.c | 9 --------- client/src/fileutils.c | 1 + 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index b48fd3d0a..3f704ad62 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -577,9 +577,6 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n size_t alen = 0, blen = 0; uint8_t *keyA, *keyB; if (loadFileBinaryKey(keyfn, "", (void **)&keyA, (void **)&keyB, &alen, &blen) != PM3_SUCCESS) { - if (keyA) { - free(keyA); - } free(fptr); return PM3_ESOFT; } @@ -1339,9 +1336,6 @@ static int CmdHF14AMfRestore(const char *Cmd) { size_t alen = 0, blen = 0; uint8_t *keyA, *keyB; if (loadFileBinaryKey(keyfilename, "", (void **)&keyA, (void **)&keyB, &alen, &blen) != PM3_SUCCESS) { - if (keyA) { - free(keyA); - } return PM3_ESOFT; } @@ -6289,9 +6283,6 @@ int CmdHFMFNDEFFormat(const char *Cmd) { size_t alen = 0, blen = 0; uint8_t *tmpA, *tmpB; if (loadFileBinaryKey(keyFilename, "", (void **)&tmpA, (void **)&tmpB, &alen, &blen) != PM3_SUCCESS) { - if (tmpA) { - free(tmpA); - } goto skipfile; } diff --git a/client/src/fileutils.c b/client/src/fileutils.c index f266da9b2..7ca59ef85 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -1609,6 +1609,7 @@ int loadFileBinaryKey(const char *preferredName, const char *suffix, void **keya if (*keyb == NULL) { PrintAndLogEx(FAILED, "error, cannot allocate memory"); fclose(f); + free(*keya); return PM3_EMALLOC; } From 5022e21db525a6c757089e4bd787992175f0c174 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 14 Jul 2023 18:13:18 +0200 Subject: [PATCH 644/924] added a iso4217 currency table. Borrowed and converted from the Cardpeek project. Thanks to them! --- CHANGELOG.md | 2 + client/CMakeLists.txt | 1 + client/Makefile | 1 + client/experimental_lib/CMakeLists.txt | 1 + client/src/iso4217.c | 35 ++++ client/src/iso4217.h | 222 +++++++++++++++++++++++++ 6 files changed, 262 insertions(+) create mode 100644 client/src/iso4217.c create mode 100644 client/src/iso4217.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 56daf055e..1981a2e8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added ISO4217 currency lookup (@iceman1001) + - Fixed bad free in loadfilebinarykey fct. Thanks to @gentilkiwi - Changed `emv reader -v` - now can decode track1/2 data if found (@iceman1001) - Added `emv reader` - act as a EMV reader (@iceman1001) - Added support for Apple Wallet NFC Passes with the Value Added Services protocol implementation (@gm3197) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 91742b711..385e5b29a 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -349,6 +349,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/fileutils.c ${PM3_ROOT}/client/src/flash.c ${PM3_ROOT}/client/src/graph.c + ${PM3_ROOT}/client/src/iso4217.c ${PM3_ROOT}/client/src/jansson_path.c ${PM3_ROOT}/client/src/preferences.c ${PM3_ROOT}/client/src/pm3.c diff --git a/client/Makefile b/client/Makefile index 8b9e469ba..2e241ee1e 100644 --- a/client/Makefile +++ b/client/Makefile @@ -678,6 +678,7 @@ SRCS = mifare/aiddesfire.c \ generator.c \ graph.c \ jansson_path.c \ + iso4217.c \ iso7816/apduinfo.c \ iso7816/iso7816core.c \ loclass/cipher.c \ diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index ca8243dbb..377a5ea58 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -349,6 +349,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/fileutils.c ${PM3_ROOT}/client/src/flash.c ${PM3_ROOT}/client/src/graph.c + ${PM3_ROOT}/client/src/iso4217.c ${PM3_ROOT}/client/src/jansson_path.c ${PM3_ROOT}/client/src/preferences.c ${PM3_ROOT}/client/src/pm3.c diff --git a/client/src/iso4217.c b/client/src/iso4217.c new file mode 100644 index 000000000..a385f69ec --- /dev/null +++ b/client/src/iso4217.c @@ -0,0 +1,35 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// ISO4217 Currency information lookup +//----------------------------------------------------------------------------- +#include "iso4217.h" +#include +#include +#include "commonutil.h" // ARRAYLEN +#include "ui.h" // PrintAndLogEx + +// get a Currency description based on the currency number string +const char *getCurrencyInfo(const char *cn_str) { + size_t slen = strlen(cn_str); + + // skip last element of AtrTable + for (int i = 0; i < ARRAYLEN(Iso4217Table) - 1; ++i) { + if (strncmp(cn_str, Iso4217Table[i].code, slen) == 0) + return Iso4217Table[i].desc; + } + return Iso4217Table[ARRAYLEN(Iso4217Table) - 1].desc; +} + diff --git a/client/src/iso4217.h b/client/src/iso4217.h new file mode 100644 index 000000000..a35ff8f93 --- /dev/null +++ b/client/src/iso4217.h @@ -0,0 +1,222 @@ +//----------------------------------------------------------------------------- +// Borrowed initially from +// https://github.com/L1L1/cardpeek/blob/master/dot_cardpeek_dir/scripts/lib/currency_codes.lua +// +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +#ifndef ISO4217_H__ + +#define ISO4217_H__ +#include + +typedef struct iso4217_s { + const char *code; + const char *desc; + int digits; +} iso4217_t; + +const char *getCurrencyInfo(const char *cn_str); + +// atr_t array is expected to be NULL terminated +const static iso4217_t Iso4217Table[] = { + {"008","Lek",2}, + {"012","Algerian Dinar",2}, + {"032","Argentine Peso",2}, + {"036","Australian Dollar",2}, + {"044","Bahamian Dollar",2}, + {"048","Bahraini Dinar",3}, + {"050","Taka",2}, + {"051","Armenian Dram",2}, + {"052","Barbados Dollar",2}, + {"060","Bermudian Dollar",2}, + {"064","Ngultrum",2}, + {"068","Boliviano",2}, + {"072","Pula",2}, + {"084","Belize Dollar",2}, + {"090","Solomon Islands Dollar",2}, + {"096","Brunei Dollar",2}, + {"104","Kyat",2}, + {"108","Burundi Franc",0}, + {"116","Riel",2}, + {"124","Canadian Dollar",2}, + {"132","Cabo Verde Escudo",2}, + {"136","Cayman Islands Dollar",2}, + {"144","Sri Lanka Rupee",2}, + {"152","Chilean Peso",0}, + {"156","Yuan Renminbi",2}, + {"170","Colombian Peso",2}, + {"174","Comoro Franc",0}, + {"188","Costa Rican Colon",2}, + {"191","Croatian Kuna",2}, + {"192","Cuban Peso",2}, + {"203","Czech Koruna",2}, + {"208","Danish Krone",2}, + {"214","Dominican Peso",2}, + {"222","El Salvador Colon",2}, + {"230","Ethiopian Birr",2}, + {"232","Nakfa",2}, + {"233","Kroon",2}, + {"238","Falkland Islands Pound",2}, + {"242","Fiji Dollar",2}, + {"262","Djibouti Franc",0}, + {"270","Dalasi",2}, + {"292","Gibraltar Pound",2}, + {"320","Quetzal",2}, + {"324","Guinea Franc",0}, + {"328","Guyana Dollar",2}, + {"332","Gourde",2}, + {"340","Lempira",2}, + {"344","Hong Kong Dollar",2}, + {"348","Forint",2}, + {"352","Iceland Krona",0}, + {"356","Indian Rupee",2}, + {"360","Rupiah",2}, + {"364","Iranian Rial",2}, + {"368","Iraqi Dinar",3}, + {"376","New Israeli Sheqel",2}, + {"388","Jamaican Dollar",2}, + {"392","Yen",0}, + {"398","Tenge",2}, + {"400","Jordanian Dinar",3}, + {"404","Kenyan Shilling",2}, + {"408","North Korean Won",2}, + {"410","Won",0}, + {"414","Kuwaiti Dinar",3}, + {"417","Som",2}, + {"418","Kip",2}, + {"422","Lebanese Pound",2}, + {"426","Loti",2}, + {"428","Latvian Lats",2}, + {"430","Liberian Dollar",2}, + {"434","Libyan Dinar",3}, + {"440","Lithuanian Litas",2}, + {"446","Pataca",2}, + {"454","Kwacha",2}, + {"458","Malaysian Ringgit",2}, + {"462","Rufiyaa",2}, + {"478","Ouguiya",2}, + {"480","Mauritius Rupee",2}, + {"484","Mexican Peso",2}, + {"496","Tugrik",2}, + {"498","Moldovan Leu",2}, + {"504","Moroccan Dirham",2}, + {"512","Rial Omani",3}, + {"516","Namibia Dollar",2}, + {"524","Nepalese Rupee",2}, + {"532","Netherlands Antillean Guilder",2}, + {"533","Aruban Florin",2}, + {"548","Vatu",0}, + {"554","New Zealand Dollar",2}, + {"558","Cordoba Oro",2}, + {"566","Naira",2}, + {"578","Norwegian Krone",2}, + {"586","Pakistan Rupee",2}, + {"590","Balboa",2}, + {"598","Kina",2}, + {"600","Guarani",0}, + {"604","Nuevo Sol",2}, + {"608","Philippine Peso",2}, + {"624","Guinea-Bissau Peso", -1}, + {"634","Qatari Rial",2}, + {"643","Russian Ruble",2}, + {"646","Rwanda Franc",0}, + {"654","Saint Helena Pound",2}, + {"678","Dobra",2}, + {"682","Saudi Riyal",2}, + {"690","Seychelles Rupee",2}, + {"694","Leone",2}, + {"702","Singapore Dollar",2}, + {"704","Dong",0}, + {"706","Somali Shilling",2}, + {"710","Rand",2}, + {"728","South Sudanese Pound",2}, + {"748","Lilangeni",2}, + {"752","Swedish Krona",2}, + {"756","Swiss Franc",2}, + {"760","Syrian Pound",2}, + {"764","Baht",2}, + {"776","Pa\'anga",2}, + {"780","Trinidad and Tobago Dollar",2}, + {"784","UAE Dirham",2}, + {"788","Tunisian Dinar",3}, + {"800","Uganda Shilling",0}, + {"807","Denar",2}, + {"818","Egyptian Pound",2}, + {"826","Pound Sterling",2}, + {"834","Tanzanian Shilling",2}, + {"840","US Dollar",2}, + {"858","Peso Uruguayo",2}, + {"860","Uzbekistan Sum",2}, + {"882","Tala",2}, + {"886","Yemeni Rial",2}, + {"894","Zambian Kwacha",2}, + {"901","New Taiwan Dollar",2}, + {"931","Peso Convertible",2}, + {"932","Zimbabwe Dollar",2}, + {"934","Turkmenistan New Manat",2}, + {"936","Ghana Cedi",2}, + {"937","Bolivar",2}, + {"938","Sudanese Pound",2}, + {"940","Uruguay Peso en Unidades Indexadas (URUIURUI)",0}, + {"941","Serbian Dinar",2}, + {"943","Mozambique Metical",2}, + {"944","Azerbaijanian Manat",2}, + {"946","New Romanian Leu",2}, + {"947","WIR Euro",2}, + {"948","WIR Franc",2}, + {"949","Turkish Lira",2}, + {"950","CFA Franc BEAC",0}, + {"951","East Caribbean Dollar",2}, + {"952","CFA Franc BCEAO",0}, + {"953","CFP Franc",0}, + {"955","Bond Markets Unit European Composite Unit (EURCO)",0}, + {"956","Bond Markets Unit European Monetary Unit (E.M.U.-6)",0}, + {"957","Bond Markets Unit European Unit of Account 9 (E.U.A.-9)",0}, + {"958","Bond Markets Unit European Unit of Account 17 (E.U.A.-17)",0}, + {"959","Gold",0}, + {"960","SDR (Special Drawing Right)",0}, + {"961","Silver",0}, + {"962","Platinum",0}, + {"963","Codes specifically reserved for testing purposes",-1}, + {"964","Palladium",-1}, + {"965","ADB Unit of Account",-1}, + {"967","Zambian Kwacha",2}, + {"968","Surinam Dollar",2}, + {"969","Malagasy Ariary",1}, + {"969","Malagasy Ariary",2}, + {"970","Unidad de Valor Real",2}, + {"971","Afghani",2}, + {"972","Somoni",2}, + {"973","Kwanza",2}, + {"974","Belarussian Ruble",0}, + {"975","Bulgarian Lev",2}, + {"976","Congolese Franc",2}, + {"977","Convertible Mark",2}, + {"978","Euro",2}, + {"979","Mexican Unidad de Inversion (UDI)",2}, + {"980","Hryvnia",2}, + {"981","Lari",2}, + {"984","Mvdol",2}, + {"985","Zloty",2}, + {"986","Brazilian Real",2}, + {"990","Unidad de Fomento",4}, + {"994","Sucre",-1}, + {"997","US Dollar (Next day)",2}, + {"998","US Dollar (Same day)",2}, + {"999","No currency is involved",-1}, + {"NULL", "N/A", -1} +}; + +#endif From 78fe406f508a825e24696e405fea9c8ccbe7034a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 14 Jul 2023 18:16:40 +0200 Subject: [PATCH 645/924] changed emv reader in verbose mode to extract and print transaction logs stored on card --- CHANGELOG.md | 1 + client/src/emv/cmdemv.c | 287 ++++++++++++++++++++++++++++++++++++-- client/src/emv/emv_tags.c | 1 + client/src/emv/emvcore.c | 4 + client/src/emv/emvcore.h | 3 + 5 files changed, 287 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1981a2e8e..463a379a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `emv reader -v` - now tries to print found transactions logs (@iceman1001) - Added ISO4217 currency lookup (@iceman1001) - Fixed bad free in loadfilebinarykey fct. Thanks to @gentilkiwi - Changed `emv reader -v` - now can decode track1/2 data if found (@iceman1001) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index e1518971b..b2459c79c 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -35,6 +35,10 @@ #include "fileutils.h" #include "protocols.h" // ISO7816 APDU return codes #include "commonutil.h" // MemBeToUint2byte +#include // DES +#include "crypto/libpcrypto.h" +#include "iso4217.h" // currency lookup + static int CmdHelp(const char *Cmd); @@ -75,6 +79,193 @@ static void PrintChannel(Iso7816CommandChannel channel) { } } +static int emv_calc_cvv(const uint8_t *pan, size_t panlen, const uint8_t *expiry, const uint8_t *servicecode, const uint8_t *atc) { + + uint8_t key[16] = {0}; + memset(key, 0x30, sizeof(key)); + + uint8_t d[32] = {0}; + uint8_t *pd = d; + + memcpy(pd, pan, panlen); + pd += panlen; + memcpy(pd, expiry, 4); + pd += 4; + + // cvv/cvc + memcpy(pd, servicecode, 3); + pd += 3; + + // atc + memcpy(pd, atc, 4); + + uint8_t encrypted[16] = {0}; + + // zero padding?!? + + mbedtls_des_context ctx; + mbedtls_des_setkey_enc(&ctx, key); + mbedtls_des_crypt_ecb(&ctx, d, encrypted); + mbedtls_des_crypt_ecb(&ctx, d + 6, encrypted + 6); + + // xor + for (size_t i = 16; i < 32; i++) { + d[i] ^= encrypted[i - 16]; + } + + mbedtls_des_free(&ctx); + + PrintAndLogEx(INFO, "key... %s", sprint_hex_inrow(key, sizeof(key))); + PrintAndLogEx(INFO, "d..... %s", sprint_hex_inrow(d, sizeof(d))); + +/* + mbedtls_des3_context ctx3; + mbedtls_des3_init(&ctx3); + mbedtls_des3_set2key_enc(&ctx3, key); + mbedtls_des3_set2key_dec(&ctx3, key); + mbedtls_des3_crypt_ecb(&ctx3, d, encrypted); + mbedtls_des3_free(&ctx3); + + PrintAndLogEx(INFO, "enc... %s", sprint_hex_inrow(encrypted, sizeof(encrypted))); + + memset(encrypted, 0, sizeof(encrypted)); + des3_encrypt(encrypted, d, key, 2); + PrintAndLogEx(INFO, "enc... %s", sprint_hex_inrow(encrypted, sizeof(encrypted))); + */ + return PM3_SUCCESS; +} + +static size_t logtemplate_calculate_len(const struct tlv *tlv, size_t data_len) { + if (!tlv) + return 0; + + const unsigned char *buf = tlv->value; + size_t left = tlv->len; + size_t count = 0; + + while (left) { + struct tlv cur_tlv; + if (!tlv_parse_tl(&buf, &left, &cur_tlv)) + return 0; + + count += cur_tlv.len; + + /* Last tag can be of variable length */ + if (cur_tlv.len == 0 && left == 0) + count = data_len; + } + + return count; +} + +static struct tlvdb *emv_logtemplate_parse(const struct tlv *tlv, const unsigned char *data, size_t data_len) { + if (!tlv) + return NULL; + + const unsigned char *buf = tlv->value; + size_t left = tlv->len; + size_t res_len = logtemplate_calculate_len(tlv, data_len); + size_t pos = 0; + struct tlvdb *db = NULL; + + while (left) { + struct tlv cur_tlv; + if (!tlv_parse_tl(&buf, &left, &cur_tlv) || pos + cur_tlv.len > res_len) { + tlvdb_free(db); + return NULL; + } + + /* Last tag can be of variable length */ + if (cur_tlv.len == 0 && left == 0) + cur_tlv.len = res_len - pos; + + struct tlvdb *tag_db = tlvdb_fixed(cur_tlv.tag, cur_tlv.len, data + pos); + if (!db) + db = tag_db; + else + tlvdb_add(db, tag_db); + + pos += cur_tlv.len; + } + + return db; +} + +static int emv_parse_log(struct tlvdb *ttdb, const uint8_t *d, size_t n) { +/* + The Log Format (9F4F) is a list in tag and length format (i.e., "TL" instead of TLV) See description in Table 33 on page 141. + + In your example, "9F 27 01 9F 02 06 5F 2A 02 9A 03 9F 36 02 9F 52 06 DF 3E 01 9F 21 03 9F 7C 14" means: + + 9F27 01 (Cryptogram Information Data) + 9F02 06 (Amount, Authorised) + 5F2A 02 (Transaction Currency Code) + 9A 03 (Transaction Date) + 9F36 02 (Application Transaction Counter) + 9F52 06 (Terminal Compatibility Indicator) + DF3E 01 + 9F21 03 (Transaction Time) + 9F7C 14 (Visa Customer Exclusive Data) + +*/ + int pos = 0; + struct tlvdb *tp = ttdb; + while (tp) { + const struct tlv *tpitem = tlvdb_get_tlv(tp); + + const char *s = emv_get_tag_name(tpitem); + + switch (tpitem->tag) { + case 0x5F2A: + if (tpitem->len == 2) { + + char tmp[5] = {0}; + snprintf(tmp, sizeof(tmp), "%x%02x", d[pos], d[pos + 1]); + const char *cn = getCurrencyInfo(tmp); + PrintAndLogEx(INFO, "%-30s... " _YELLOW_("%s") " ( %x%02x )", s, cn, d[pos], d[pos + 1]); + } + break; + case 0x9A: + if (tpitem->len == 3) { + PrintAndLogEx(INFO, "%-30s... " _YELLOW_("20%02x-%02x-%02x"), s, d[pos], d[pos + 1], d[pos + 2]); + } + break; + default: + PrintAndLogEx(INFO, "%-30s... " _YELLOW_("%s"), s, sprint_hex_inrow(d + pos, tpitem->len)); + break; + } + + pos += tpitem->len; + + tp = tlvdb_elm_get_next(tp); + } + return PM3_SUCCESS; +} + +static int emv_extract_log_info(uint8_t *response, size_t reslen, uint8_t *lid, uint8_t *lrecs) { + + struct tlvdb *t = tlvdb_parse_multi(response, reslen); + if (t == NULL) { + PrintAndLogEx(INFO, "root null"); + return PM3_EINVARG; + } + + int res = PM3_ESOFT; + struct tlvdb *logs = tlvdb_find_full(t, 0x9F4D); + if (logs != NULL) { + const struct tlv *tlv = tlvdb_get_tlv(logs); + if (tlv->len == 2) { + *lid = tlv->value[0]; + *lrecs = tlv->value[1]; + PrintAndLogEx(DEBUG, "Logs EMV... SFI %u Records # %u", *lid, *lrecs); + res = PM3_SUCCESS; + } + } + + tlvdb_free(t); + return res; +} + static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ if (d == NULL || n < 10) { return PM3_EINVARG; @@ -96,14 +287,26 @@ static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ while (token != NULL) { switch(i) { - case 0: - PrintAndLogEx(INFO, "PAN...................... %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c", - token[1], token[2],token[3], token[4], - token[5], token[6],token[7], token[8], - token[9], token[10],token[11], token[12], - token[13], token[14],token[15], token[16] - ); + case 0: { + size_t a = strlen(token); + if (a == 16) { + PrintAndLogEx(INFO, "PAN...................... %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c", + token[1], token[2],token[3], token[4], + token[5], token[6],token[7], token[8], + token[9], token[10],token[11], token[12], + token[13], token[14],token[15], token[16] + ); + } else if (a == 19) { + PrintAndLogEx(INFO, "PAN...................... %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c", + token[1], token[2],token[3], token[4], + token[5], token[6],token[7], token[8], + token[9], token[10],token[11], token[12], + token[13], token[14],token[15], token[16], + token[17], token[18],token[19] + ); + } break; + } case 1: PrintAndLogEx(INFO, "CardHolder............... %s", token); break; @@ -228,7 +431,12 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen, bool verbose const struct tlv *acc_tlv = tlvdb_get_tlv(acc_full); if (acc_tlv->len == 2) { uint16_t acc = MemBeToUint2byte((const uint8_t *)acc_tlv->value); - PrintAndLogEx(INFO, "Currency Code........ " _YELLOW_("%02X"), acc); + + char tmp[5] = {0}; + snprintf(tmp, sizeof(tmp), "%x%02x", acc_tlv->value[0], acc_tlv->value[1]); + const char *cn = getCurrencyInfo(tmp); + + PrintAndLogEx(INFO, "Currency Code........ " _YELLOW_("%s") " ( %x )", cn, acc); } } @@ -2087,6 +2295,16 @@ static int CmdEMVList(const char *Cmd) { } static int CmdEMVTest(const char *Cmd) { + + uint8_t pan[16] = "4000340099900505"; + uint8_t expiry[4] = "2102"; + uint8_t servicecode[3] = "101"; + uint8_t atc[4] = "1001"; + + emv_calc_cvv(pan, 16, expiry, servicecode, atc); + return PM3_SUCCESS; + + CLIParserContext *ctx; CLIParserInit(&ctx, "emv test", "Executes tests\n", @@ -2462,6 +2680,33 @@ static int CmdEMVReader(const char *Cmd) { // decode application parts emv_parse_card_details(buf, len, verbose); + // transaction log information + uint8_t log_file_id = 0x0B; + uint8_t log_file_records = 31; + struct tlvdb *tlogDB = NULL; + + + // try getting the LOG TEMPLATE. + bool log_found = false; + bool log_template_found = false; + if (emv_extract_log_info(buf, len, &log_file_id, &log_file_records) == PM3_SUCCESS) { + log_found = true; + } + + uint16_t extra_data[] = { 0x9F36, 0x9F13, 0x9F17, 0x9F4D, 0x9F4F }; + for (int i = 0; i < ARRAYLEN(extra_data); i++) { + if (EMVGetData(channel, true, extra_data[i], buf, sizeof(buf), &len, &sw, tlvRoot)) { + continue; + } + // Log template tag + if (extra_data[i] == 0x9F4F ) { + struct tlvdb *ttdb = tlvdb_find_full(tlvRoot, extra_data[i]); + const struct tlv *ttag = tlvdb_get_tlv(ttdb); + tlogDB = emv_logtemplate_parse(ttag, buf, len); + log_template_found = true; + } + } + for (TransactionType_t tt = TT_MSD; tt < TT_END; tt++) { // create transaction parameters @@ -2498,7 +2743,6 @@ static int CmdEMVReader(const char *Cmd) { } const struct tlv *AFL = tlvdb_get(tlvRoot, 0x94, NULL); - if (AFL && AFL->len) { if (AFL->len % 4) { @@ -2524,8 +2768,33 @@ static int CmdEMVReader(const char *Cmd) { } } + // only check for logs file if we found 0x9F4D + if ( verbose && log_found && log_template_found ) { + + for (int i = 1; i <= log_file_records; i++) { + res = EMVReadRecord(channel, true, log_file_id, i, buf, sizeof(buf), &len, &sw, tlvRoot); + if (res) { + continue; + } + + if (sw == 0x6A83) + break; + + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "Transaction log # " _YELLOW_("%u"), i); + PrintAndLogEx(INFO, "---------------------"); + emv_parse_log(tlogDB, buf, len); + PrintAndLogEx(INFO, ""); + } + tlvdb_free(tlogDB); + } + + // free tlv object + tlvdb_free(tlvRoot); + } while (continuous); + DropFieldEx(channel); return PM3_SUCCESS; } diff --git a/client/src/emv/emv_tags.c b/client/src/emv/emv_tags.c index 0d5ddbc31..0ae242905 100644 --- a/client/src/emv/emv_tags.c +++ b/client/src/emv/emv_tags.c @@ -373,6 +373,7 @@ static const struct emv_tag emv_tags[] = { { 0xa5, "File Control Information (FCI) Proprietary Template", EMV_TAG_GENERIC, NULL }, { 0xbf0c, "File Control Information (FCI) Issuer Discretionary Data", EMV_TAG_GENERIC, NULL }, { 0xdf20, "Issuer Proprietary Bitmap (IPB)", EMV_TAG_GENERIC, NULL }, + { 0xdf3e, "?", EMV_TAG_BITMASK, NULL }, { 0xdf4b, "POS Cardholder Interaction Information", EMV_TAG_GENERIC, NULL }, { 0xdf60, "VISA Log Entry", EMV_TAG_GENERIC, NULL }, { 0xdf61, "DS Digest H", EMV_TAG_GENERIC, NULL }, diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 45a415f41..b2aa524ac 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -586,6 +586,10 @@ int EMVReadRecord(Iso7816CommandChannel channel, bool LeaveFieldON, uint8_t SFI, return res; } +int EMVGetData(Iso7816CommandChannel channel, bool LeaveFieldON, uint16_t foo, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv) { + return EMVExchangeEx(channel, false, LeaveFieldON, (sAPDU_t) {0x80, 0xCA, ((foo >> 8) & 0xFF), (foo & 0xFF), 0, NULL}, true, Result, MaxResultLen, ResultLen, sw, tlv); +} + int EMVAC(Iso7816CommandChannel channel, bool LeaveFieldON, uint8_t RefControl, uint8_t *CDOL, size_t CDOLLen, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv) { return EMVExchange(channel, LeaveFieldON, (sAPDU_t) {0x80, 0xae, RefControl, 0x00, CDOLLen, CDOL}, Result, MaxResultLen, ResultLen, sw, tlv); } diff --git a/client/src/emv/emvcore.h b/client/src/emv/emvcore.h index 6cf646c60..6ff2b6ef9 100644 --- a/client/src/emv/emvcore.h +++ b/client/src/emv/emvcore.h @@ -71,6 +71,9 @@ int EMVSelectApplication(struct tlvdb *tlv, uint8_t *AID, size_t *AIDlen); // Get Processing Options int EMVGPO(Iso7816CommandChannel channel, bool LeaveFieldON, uint8_t *PDOL, size_t PDOLLen, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv); int EMVReadRecord(Iso7816CommandChannel channel, bool LeaveFieldON, uint8_t SFI, uint8_t SFIrec, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv); + +// Emv override get data +int EMVGetData(Iso7816CommandChannel channel, bool LeaveFieldON, uint16_t foo, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv); // AC int EMVGenerateChallenge(Iso7816CommandChannel channel, bool LeaveFieldON, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv); int EMVAC(Iso7816CommandChannel channel, bool LeaveFieldON, uint8_t RefControl, uint8_t *CDOL, size_t CDOLLen, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv); From 3c6d1c492fdd978a729e5fd02ad2c3550732b78e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 14 Jul 2023 18:23:36 +0200 Subject: [PATCH 646/924] text --- client/src/emv/cmdemv.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index b2459c79c..e148e19bb 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -2600,8 +2600,10 @@ out: static int CmdEMVReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "emv reader", - "Act as a EMV reader to identify tag. Look for EMV tags until Enter or the pm3 button is pressed", + "Act as a EMV reader to identify tag. Look for EMV tags until Enter or the pm3 button is pressed\n" + "In `verbose` mode it will also try to extract and decode the transaction logs stored on card in either channel.\n", "emv reader\n" + "emv reader -v\n" "emv reader -@ -> Continuous mode\n" ); void *argtable[] = { From 23eca8fecc20e26965689dc520e3099520851d5e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 14 Jul 2023 18:29:50 +0200 Subject: [PATCH 647/924] remove debugging code --- client/src/emv/cmdemv.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index e148e19bb..52c3db0e9 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -2295,16 +2295,6 @@ static int CmdEMVList(const char *Cmd) { } static int CmdEMVTest(const char *Cmd) { - - uint8_t pan[16] = "4000340099900505"; - uint8_t expiry[4] = "2102"; - uint8_t servicecode[3] = "101"; - uint8_t atc[4] = "1001"; - - emv_calc_cvv(pan, 16, expiry, servicecode, atc); - return PM3_SUCCESS; - - CLIParserContext *ctx; CLIParserInit(&ctx, "emv test", "Executes tests\n", From b997a78bca1f88c54b94521484c374d3eb39b45f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 14 Jul 2023 18:30:50 +0200 Subject: [PATCH 648/924] remove debugging code --- client/src/emv/cmdemv.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 52c3db0e9..1f96605e2 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -79,6 +79,7 @@ static void PrintChannel(Iso7816CommandChannel channel) { } } +/* static int emv_calc_cvv(const uint8_t *pan, size_t panlen, const uint8_t *expiry, const uint8_t *servicecode, const uint8_t *atc) { uint8_t key[16] = {0}; @@ -118,7 +119,7 @@ static int emv_calc_cvv(const uint8_t *pan, size_t panlen, const uint8_t *expiry PrintAndLogEx(INFO, "key... %s", sprint_hex_inrow(key, sizeof(key))); PrintAndLogEx(INFO, "d..... %s", sprint_hex_inrow(d, sizeof(d))); -/* + mbedtls_des3_context ctx3; mbedtls_des3_init(&ctx3); mbedtls_des3_set2key_enc(&ctx3, key); @@ -131,9 +132,11 @@ static int emv_calc_cvv(const uint8_t *pan, size_t panlen, const uint8_t *expiry memset(encrypted, 0, sizeof(encrypted)); des3_encrypt(encrypted, d, key, 2); PrintAndLogEx(INFO, "enc... %s", sprint_hex_inrow(encrypted, sizeof(encrypted))); - */ + return PM3_SUCCESS; } +*/ + static size_t logtemplate_calculate_len(const struct tlv *tlv, size_t data_len) { if (!tlv) From 5f8cd5caca3cb1e8006c5aaccf8091a9b24c1bed Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 14 Jul 2023 18:34:14 +0200 Subject: [PATCH 649/924] make style --- client/src/cmdhfmfhard.c | 4 +- client/src/comms.c | 8 +- client/src/emv/cmdemv.c | 88 +++++----- client/src/iso4217.h | 370 +++++++++++++++++++-------------------- client/src/nfc/ndef.c | 2 +- doc/commands.json | 12 +- 6 files changed, 243 insertions(+), 241 deletions(-) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 090dcf531..be7b3a4c3 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -373,8 +373,8 @@ static void init_bitflip_bitarrays(void) { exit(4); } - bytesread = fread(bitset, 1, filesize-sizeof(count), statesfile); - if (bytesread != filesize-sizeof(count)) { + bytesread = fread(bitset, 1, filesize - sizeof(count), statesfile); + if (bytesread != filesize - sizeof(count)) { PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); fclose(statesfile); exit(5); diff --git a/client/src/comms.c b/client/src/comms.c index 1c3d1f686..3b7509a38 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -670,10 +670,10 @@ int TestProxmark(pm3_device_t *dev) { bool is_bt_conn = (memcmp(g_conn.serial_port_name, "bt:", 3) == 0); PrintAndLogEx(INFO, "Communicating with PM3 over %s%s%s", - (g_conn.send_via_fpc_usart) ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"), - (is_tcp_conn) ? " over " _YELLOW_("TCP") : "", - (is_bt_conn) ? " over " _YELLOW_("BT") : "" - ); + (g_conn.send_via_fpc_usart) ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"), + (is_tcp_conn) ? " over " _YELLOW_("TCP") : "", + (is_bt_conn) ? " over " _YELLOW_("BT") : "" + ); if (g_conn.send_via_fpc_usart) { PrintAndLogEx(INFO, "PM3 UART serial baudrate: " _YELLOW_("%u") "\n", g_conn.uart_speed); diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 1f96605e2..8a0b7f82d 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -89,7 +89,7 @@ static int emv_calc_cvv(const uint8_t *pan, size_t panlen, const uint8_t *expiry uint8_t *pd = d; memcpy(pd, pan, panlen); - pd += panlen; + pd += panlen; memcpy(pd, expiry, 4); pd += 4; @@ -129,7 +129,7 @@ static int emv_calc_cvv(const uint8_t *pan, size_t panlen, const uint8_t *expiry PrintAndLogEx(INFO, "enc... %s", sprint_hex_inrow(encrypted, sizeof(encrypted))); - memset(encrypted, 0, sizeof(encrypted)); + memset(encrypted, 0, sizeof(encrypted)); des3_encrypt(encrypted, d, key, 2); PrintAndLogEx(INFO, "enc... %s", sprint_hex_inrow(encrypted, sizeof(encrypted))); @@ -195,23 +195,23 @@ static struct tlvdb *emv_logtemplate_parse(const struct tlv *tlv, const unsigned } static int emv_parse_log(struct tlvdb *ttdb, const uint8_t *d, size_t n) { -/* - The Log Format (9F4F) is a list in tag and length format (i.e., "TL" instead of TLV) See description in Table 33 on page 141. + /* + The Log Format (9F4F) is a list in tag and length format (i.e., "TL" instead of TLV) See description in Table 33 on page 141. - In your example, "9F 27 01 9F 02 06 5F 2A 02 9A 03 9F 36 02 9F 52 06 DF 3E 01 9F 21 03 9F 7C 14" means: + In your example, "9F 27 01 9F 02 06 5F 2A 02 9A 03 9F 36 02 9F 52 06 DF 3E 01 9F 21 03 9F 7C 14" means: - 9F27 01 (Cryptogram Information Data) - 9F02 06 (Amount, Authorised) - 5F2A 02 (Transaction Currency Code) - 9A 03 (Transaction Date) - 9F36 02 (Application Transaction Counter) - 9F52 06 (Terminal Compatibility Indicator) - DF3E 01 - 9F21 03 (Transaction Time) - 9F7C 14 (Visa Customer Exclusive Data) + 9F27 01 (Cryptogram Information Data) + 9F02 06 (Amount, Authorised) + 5F2A 02 (Transaction Currency Code) + 9A 03 (Transaction Date) + 9F36 02 (Application Transaction Counter) + 9F52 06 (Terminal Compatibility Indicator) + DF3E 01 + 9F21 03 (Transaction Time) + 9F7C 14 (Visa Customer Exclusive Data) -*/ - int pos = 0; + */ + int pos = 0; struct tlvdb *tp = ttdb; while (tp) { const struct tlv *tpitem = tlvdb_get_tlv(tp); @@ -237,12 +237,12 @@ static int emv_parse_log(struct tlvdb *ttdb, const uint8_t *d, size_t n) { PrintAndLogEx(INFO, "%-30s... " _YELLOW_("%s"), s, sprint_hex_inrow(d + pos, tpitem->len)); break; } - + pos += tpitem->len; tp = tlvdb_elm_get_next(tp); } - return PM3_SUCCESS; + return PM3_SUCCESS; } static int emv_extract_log_info(uint8_t *response, size_t reslen, uint8_t *lid, uint8_t *lrecs) { @@ -269,7 +269,7 @@ static int emv_extract_log_info(uint8_t *response, size_t reslen, uint8_t *lid, return res; } -static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ +static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose) { if (d == NULL || n < 10) { return PM3_EINVARG; } @@ -283,31 +283,31 @@ static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ } // decoder - char *tmp = str_ndup((const char*)d, n); + char *tmp = str_ndup((const char *)d, n); uint8_t i = 0; char delim[2] = "^"; char *token = strtok(tmp, delim); while (token != NULL) { - switch(i) { + switch (i) { case 0: { size_t a = strlen(token); if (a == 16) { PrintAndLogEx(INFO, "PAN...................... %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c", - token[1], token[2],token[3], token[4], - token[5], token[6],token[7], token[8], - token[9], token[10],token[11], token[12], - token[13], token[14],token[15], token[16] - ); + token[1], token[2], token[3], token[4], + token[5], token[6], token[7], token[8], + token[9], token[10], token[11], token[12], + token[13], token[14], token[15], token[16] + ); } else if (a == 19) { PrintAndLogEx(INFO, "PAN...................... %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c", - token[1], token[2],token[3], token[4], - token[5], token[6],token[7], token[8], - token[9], token[10],token[11], token[12], - token[13], token[14],token[15], token[16], - token[17], token[18],token[19] - ); - } + token[1], token[2], token[3], token[4], + token[5], token[6], token[7], token[8], + token[9], token[10], token[11], token[12], + token[13], token[14], token[15], token[16], + token[17], token[18], token[19] + ); + } break; } case 1: @@ -327,7 +327,7 @@ static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ token += 4; PrintAndLogEx(INFO, "CVV / iCvv............... %.*s", 3, token); - token +=3; + token += 3; PrintAndLogEx(INFO, "Trailing................. %s", token); break; @@ -358,11 +358,11 @@ static int emv_parse_track2(const uint8_t *d, size_t n, bool verbose) { tmp++; PrintAndLogEx(INFO, "PAN...................... %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c", - tmp[0], tmp[1], tmp[2],tmp[3], - tmp[4], tmp[5], tmp[6],tmp[7], - tmp[8], tmp[9], tmp[10],tmp[11], - tmp[12],tmp[13], tmp[14],tmp[15] - ); + tmp[0], tmp[1], tmp[2], tmp[3], + tmp[4], tmp[5], tmp[6], tmp[7], + tmp[8], tmp[9], tmp[10], tmp[11], + tmp[12], tmp[13], tmp[14], tmp[15] + ); tmp += 16; if (tmp[0] == '=' || tmp[0] == 'D') @@ -378,7 +378,7 @@ static int emv_parse_track2(const uint8_t *d, size_t n, bool verbose) { tmp += 4; PrintAndLogEx(INFO, "CVV / iCvv............... %.*s", 3, tmp); - tmp +=3; + tmp += 3; PrintAndLogEx(INFO, "Trailing................. %s", tmp); @@ -2694,7 +2694,7 @@ static int CmdEMVReader(const char *Cmd) { continue; } // Log template tag - if (extra_data[i] == 0x9F4F ) { + if (extra_data[i] == 0x9F4F) { struct tlvdb *ttdb = tlvdb_find_full(tlvRoot, extra_data[i]); const struct tlv *ttag = tlvdb_get_tlv(ttdb); tlogDB = emv_logtemplate_parse(ttag, buf, len); @@ -2764,8 +2764,8 @@ static int CmdEMVReader(const char *Cmd) { } // only check for logs file if we found 0x9F4D - if ( verbose && log_found && log_template_found ) { - + if (verbose && log_found && log_template_found) { + for (int i = 1; i <= log_file_records; i++) { res = EMVReadRecord(channel, true, log_file_id, i, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { @@ -2786,7 +2786,7 @@ static int CmdEMVReader(const char *Cmd) { // free tlv object tlvdb_free(tlvRoot); - + } while (continuous); DropFieldEx(channel); diff --git a/client/src/iso4217.h b/client/src/iso4217.h index a35ff8f93..594a0bb38 100644 --- a/client/src/iso4217.h +++ b/client/src/iso4217.h @@ -31,191 +31,191 @@ const char *getCurrencyInfo(const char *cn_str); // atr_t array is expected to be NULL terminated const static iso4217_t Iso4217Table[] = { - {"008","Lek",2}, - {"012","Algerian Dinar",2}, - {"032","Argentine Peso",2}, - {"036","Australian Dollar",2}, - {"044","Bahamian Dollar",2}, - {"048","Bahraini Dinar",3}, - {"050","Taka",2}, - {"051","Armenian Dram",2}, - {"052","Barbados Dollar",2}, - {"060","Bermudian Dollar",2}, - {"064","Ngultrum",2}, - {"068","Boliviano",2}, - {"072","Pula",2}, - {"084","Belize Dollar",2}, - {"090","Solomon Islands Dollar",2}, - {"096","Brunei Dollar",2}, - {"104","Kyat",2}, - {"108","Burundi Franc",0}, - {"116","Riel",2}, - {"124","Canadian Dollar",2}, - {"132","Cabo Verde Escudo",2}, - {"136","Cayman Islands Dollar",2}, - {"144","Sri Lanka Rupee",2}, - {"152","Chilean Peso",0}, - {"156","Yuan Renminbi",2}, - {"170","Colombian Peso",2}, - {"174","Comoro Franc",0}, - {"188","Costa Rican Colon",2}, - {"191","Croatian Kuna",2}, - {"192","Cuban Peso",2}, - {"203","Czech Koruna",2}, - {"208","Danish Krone",2}, - {"214","Dominican Peso",2}, - {"222","El Salvador Colon",2}, - {"230","Ethiopian Birr",2}, - {"232","Nakfa",2}, - {"233","Kroon",2}, - {"238","Falkland Islands Pound",2}, - {"242","Fiji Dollar",2}, - {"262","Djibouti Franc",0}, - {"270","Dalasi",2}, - {"292","Gibraltar Pound",2}, - {"320","Quetzal",2}, - {"324","Guinea Franc",0}, - {"328","Guyana Dollar",2}, - {"332","Gourde",2}, - {"340","Lempira",2}, - {"344","Hong Kong Dollar",2}, - {"348","Forint",2}, - {"352","Iceland Krona",0}, - {"356","Indian Rupee",2}, - {"360","Rupiah",2}, - {"364","Iranian Rial",2}, - {"368","Iraqi Dinar",3}, - {"376","New Israeli Sheqel",2}, - {"388","Jamaican Dollar",2}, - {"392","Yen",0}, - {"398","Tenge",2}, - {"400","Jordanian Dinar",3}, - {"404","Kenyan Shilling",2}, - {"408","North Korean Won",2}, - {"410","Won",0}, - {"414","Kuwaiti Dinar",3}, - {"417","Som",2}, - {"418","Kip",2}, - {"422","Lebanese Pound",2}, - {"426","Loti",2}, - {"428","Latvian Lats",2}, - {"430","Liberian Dollar",2}, - {"434","Libyan Dinar",3}, - {"440","Lithuanian Litas",2}, - {"446","Pataca",2}, - {"454","Kwacha",2}, - {"458","Malaysian Ringgit",2}, - {"462","Rufiyaa",2}, - {"478","Ouguiya",2}, - {"480","Mauritius Rupee",2}, - {"484","Mexican Peso",2}, - {"496","Tugrik",2}, - {"498","Moldovan Leu",2}, - {"504","Moroccan Dirham",2}, - {"512","Rial Omani",3}, - {"516","Namibia Dollar",2}, - {"524","Nepalese Rupee",2}, - {"532","Netherlands Antillean Guilder",2}, - {"533","Aruban Florin",2}, - {"548","Vatu",0}, - {"554","New Zealand Dollar",2}, - {"558","Cordoba Oro",2}, - {"566","Naira",2}, - {"578","Norwegian Krone",2}, - {"586","Pakistan Rupee",2}, - {"590","Balboa",2}, - {"598","Kina",2}, - {"600","Guarani",0}, - {"604","Nuevo Sol",2}, - {"608","Philippine Peso",2}, - {"624","Guinea-Bissau Peso", -1}, - {"634","Qatari Rial",2}, - {"643","Russian Ruble",2}, - {"646","Rwanda Franc",0}, - {"654","Saint Helena Pound",2}, - {"678","Dobra",2}, - {"682","Saudi Riyal",2}, - {"690","Seychelles Rupee",2}, - {"694","Leone",2}, - {"702","Singapore Dollar",2}, - {"704","Dong",0}, - {"706","Somali Shilling",2}, - {"710","Rand",2}, - {"728","South Sudanese Pound",2}, - {"748","Lilangeni",2}, - {"752","Swedish Krona",2}, - {"756","Swiss Franc",2}, - {"760","Syrian Pound",2}, - {"764","Baht",2}, - {"776","Pa\'anga",2}, - {"780","Trinidad and Tobago Dollar",2}, - {"784","UAE Dirham",2}, - {"788","Tunisian Dinar",3}, - {"800","Uganda Shilling",0}, - {"807","Denar",2}, - {"818","Egyptian Pound",2}, - {"826","Pound Sterling",2}, - {"834","Tanzanian Shilling",2}, - {"840","US Dollar",2}, - {"858","Peso Uruguayo",2}, - {"860","Uzbekistan Sum",2}, - {"882","Tala",2}, - {"886","Yemeni Rial",2}, - {"894","Zambian Kwacha",2}, - {"901","New Taiwan Dollar",2}, - {"931","Peso Convertible",2}, - {"932","Zimbabwe Dollar",2}, - {"934","Turkmenistan New Manat",2}, - {"936","Ghana Cedi",2}, - {"937","Bolivar",2}, - {"938","Sudanese Pound",2}, - {"940","Uruguay Peso en Unidades Indexadas (URUIURUI)",0}, - {"941","Serbian Dinar",2}, - {"943","Mozambique Metical",2}, - {"944","Azerbaijanian Manat",2}, - {"946","New Romanian Leu",2}, - {"947","WIR Euro",2}, - {"948","WIR Franc",2}, - {"949","Turkish Lira",2}, - {"950","CFA Franc BEAC",0}, - {"951","East Caribbean Dollar",2}, - {"952","CFA Franc BCEAO",0}, - {"953","CFP Franc",0}, - {"955","Bond Markets Unit European Composite Unit (EURCO)",0}, - {"956","Bond Markets Unit European Monetary Unit (E.M.U.-6)",0}, - {"957","Bond Markets Unit European Unit of Account 9 (E.U.A.-9)",0}, - {"958","Bond Markets Unit European Unit of Account 17 (E.U.A.-17)",0}, - {"959","Gold",0}, - {"960","SDR (Special Drawing Right)",0}, - {"961","Silver",0}, - {"962","Platinum",0}, - {"963","Codes specifically reserved for testing purposes",-1}, - {"964","Palladium",-1}, - {"965","ADB Unit of Account",-1}, - {"967","Zambian Kwacha",2}, - {"968","Surinam Dollar",2}, - {"969","Malagasy Ariary",1}, - {"969","Malagasy Ariary",2}, - {"970","Unidad de Valor Real",2}, - {"971","Afghani",2}, - {"972","Somoni",2}, - {"973","Kwanza",2}, - {"974","Belarussian Ruble",0}, - {"975","Bulgarian Lev",2}, - {"976","Congolese Franc",2}, - {"977","Convertible Mark",2}, - {"978","Euro",2}, - {"979","Mexican Unidad de Inversion (UDI)",2}, - {"980","Hryvnia",2}, - {"981","Lari",2}, - {"984","Mvdol",2}, - {"985","Zloty",2}, - {"986","Brazilian Real",2}, - {"990","Unidad de Fomento",4}, - {"994","Sucre",-1}, - {"997","US Dollar (Next day)",2}, - {"998","US Dollar (Same day)",2}, - {"999","No currency is involved",-1}, + {"008", "Lek", 2}, + {"012", "Algerian Dinar", 2}, + {"032", "Argentine Peso", 2}, + {"036", "Australian Dollar", 2}, + {"044", "Bahamian Dollar", 2}, + {"048", "Bahraini Dinar", 3}, + {"050", "Taka", 2}, + {"051", "Armenian Dram", 2}, + {"052", "Barbados Dollar", 2}, + {"060", "Bermudian Dollar", 2}, + {"064", "Ngultrum", 2}, + {"068", "Boliviano", 2}, + {"072", "Pula", 2}, + {"084", "Belize Dollar", 2}, + {"090", "Solomon Islands Dollar", 2}, + {"096", "Brunei Dollar", 2}, + {"104", "Kyat", 2}, + {"108", "Burundi Franc", 0}, + {"116", "Riel", 2}, + {"124", "Canadian Dollar", 2}, + {"132", "Cabo Verde Escudo", 2}, + {"136", "Cayman Islands Dollar", 2}, + {"144", "Sri Lanka Rupee", 2}, + {"152", "Chilean Peso", 0}, + {"156", "Yuan Renminbi", 2}, + {"170", "Colombian Peso", 2}, + {"174", "Comoro Franc", 0}, + {"188", "Costa Rican Colon", 2}, + {"191", "Croatian Kuna", 2}, + {"192", "Cuban Peso", 2}, + {"203", "Czech Koruna", 2}, + {"208", "Danish Krone", 2}, + {"214", "Dominican Peso", 2}, + {"222", "El Salvador Colon", 2}, + {"230", "Ethiopian Birr", 2}, + {"232", "Nakfa", 2}, + {"233", "Kroon", 2}, + {"238", "Falkland Islands Pound", 2}, + {"242", "Fiji Dollar", 2}, + {"262", "Djibouti Franc", 0}, + {"270", "Dalasi", 2}, + {"292", "Gibraltar Pound", 2}, + {"320", "Quetzal", 2}, + {"324", "Guinea Franc", 0}, + {"328", "Guyana Dollar", 2}, + {"332", "Gourde", 2}, + {"340", "Lempira", 2}, + {"344", "Hong Kong Dollar", 2}, + {"348", "Forint", 2}, + {"352", "Iceland Krona", 0}, + {"356", "Indian Rupee", 2}, + {"360", "Rupiah", 2}, + {"364", "Iranian Rial", 2}, + {"368", "Iraqi Dinar", 3}, + {"376", "New Israeli Sheqel", 2}, + {"388", "Jamaican Dollar", 2}, + {"392", "Yen", 0}, + {"398", "Tenge", 2}, + {"400", "Jordanian Dinar", 3}, + {"404", "Kenyan Shilling", 2}, + {"408", "North Korean Won", 2}, + {"410", "Won", 0}, + {"414", "Kuwaiti Dinar", 3}, + {"417", "Som", 2}, + {"418", "Kip", 2}, + {"422", "Lebanese Pound", 2}, + {"426", "Loti", 2}, + {"428", "Latvian Lats", 2}, + {"430", "Liberian Dollar", 2}, + {"434", "Libyan Dinar", 3}, + {"440", "Lithuanian Litas", 2}, + {"446", "Pataca", 2}, + {"454", "Kwacha", 2}, + {"458", "Malaysian Ringgit", 2}, + {"462", "Rufiyaa", 2}, + {"478", "Ouguiya", 2}, + {"480", "Mauritius Rupee", 2}, + {"484", "Mexican Peso", 2}, + {"496", "Tugrik", 2}, + {"498", "Moldovan Leu", 2}, + {"504", "Moroccan Dirham", 2}, + {"512", "Rial Omani", 3}, + {"516", "Namibia Dollar", 2}, + {"524", "Nepalese Rupee", 2}, + {"532", "Netherlands Antillean Guilder", 2}, + {"533", "Aruban Florin", 2}, + {"548", "Vatu", 0}, + {"554", "New Zealand Dollar", 2}, + {"558", "Cordoba Oro", 2}, + {"566", "Naira", 2}, + {"578", "Norwegian Krone", 2}, + {"586", "Pakistan Rupee", 2}, + {"590", "Balboa", 2}, + {"598", "Kina", 2}, + {"600", "Guarani", 0}, + {"604", "Nuevo Sol", 2}, + {"608", "Philippine Peso", 2}, + {"624", "Guinea-Bissau Peso", -1}, + {"634", "Qatari Rial", 2}, + {"643", "Russian Ruble", 2}, + {"646", "Rwanda Franc", 0}, + {"654", "Saint Helena Pound", 2}, + {"678", "Dobra", 2}, + {"682", "Saudi Riyal", 2}, + {"690", "Seychelles Rupee", 2}, + {"694", "Leone", 2}, + {"702", "Singapore Dollar", 2}, + {"704", "Dong", 0}, + {"706", "Somali Shilling", 2}, + {"710", "Rand", 2}, + {"728", "South Sudanese Pound", 2}, + {"748", "Lilangeni", 2}, + {"752", "Swedish Krona", 2}, + {"756", "Swiss Franc", 2}, + {"760", "Syrian Pound", 2}, + {"764", "Baht", 2}, + {"776", "Pa\'anga", 2}, + {"780", "Trinidad and Tobago Dollar", 2}, + {"784", "UAE Dirham", 2}, + {"788", "Tunisian Dinar", 3}, + {"800", "Uganda Shilling", 0}, + {"807", "Denar", 2}, + {"818", "Egyptian Pound", 2}, + {"826", "Pound Sterling", 2}, + {"834", "Tanzanian Shilling", 2}, + {"840", "US Dollar", 2}, + {"858", "Peso Uruguayo", 2}, + {"860", "Uzbekistan Sum", 2}, + {"882", "Tala", 2}, + {"886", "Yemeni Rial", 2}, + {"894", "Zambian Kwacha", 2}, + {"901", "New Taiwan Dollar", 2}, + {"931", "Peso Convertible", 2}, + {"932", "Zimbabwe Dollar", 2}, + {"934", "Turkmenistan New Manat", 2}, + {"936", "Ghana Cedi", 2}, + {"937", "Bolivar", 2}, + {"938", "Sudanese Pound", 2}, + {"940", "Uruguay Peso en Unidades Indexadas (URUIURUI)", 0}, + {"941", "Serbian Dinar", 2}, + {"943", "Mozambique Metical", 2}, + {"944", "Azerbaijanian Manat", 2}, + {"946", "New Romanian Leu", 2}, + {"947", "WIR Euro", 2}, + {"948", "WIR Franc", 2}, + {"949", "Turkish Lira", 2}, + {"950", "CFA Franc BEAC", 0}, + {"951", "East Caribbean Dollar", 2}, + {"952", "CFA Franc BCEAO", 0}, + {"953", "CFP Franc", 0}, + {"955", "Bond Markets Unit European Composite Unit (EURCO)", 0}, + {"956", "Bond Markets Unit European Monetary Unit (E.M.U.-6)", 0}, + {"957", "Bond Markets Unit European Unit of Account 9 (E.U.A.-9)", 0}, + {"958", "Bond Markets Unit European Unit of Account 17 (E.U.A.-17)", 0}, + {"959", "Gold", 0}, + {"960", "SDR (Special Drawing Right)", 0}, + {"961", "Silver", 0}, + {"962", "Platinum", 0}, + {"963", "Codes specifically reserved for testing purposes", -1}, + {"964", "Palladium", -1}, + {"965", "ADB Unit of Account", -1}, + {"967", "Zambian Kwacha", 2}, + {"968", "Surinam Dollar", 2}, + {"969", "Malagasy Ariary", 1}, + {"969", "Malagasy Ariary", 2}, + {"970", "Unidad de Valor Real", 2}, + {"971", "Afghani", 2}, + {"972", "Somoni", 2}, + {"973", "Kwanza", 2}, + {"974", "Belarussian Ruble", 0}, + {"975", "Bulgarian Lev", 2}, + {"976", "Congolese Franc", 2}, + {"977", "Convertible Mark", 2}, + {"978", "Euro", 2}, + {"979", "Mexican Unidad de Inversion (UDI)", 2}, + {"980", "Hryvnia", 2}, + {"981", "Lari", 2}, + {"984", "Mvdol", 2}, + {"985", "Zloty", 2}, + {"986", "Brazilian Real", 2}, + {"990", "Unidad de Fomento", 4}, + {"994", "Sucre", -1}, + {"997", "US Dollar (Next day)", 2}, + {"998", "US Dollar (Same day)", 2}, + {"999", "No currency is involved", -1}, {"NULL", "N/A", -1} }; diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index 3e2e1973f..44ef70ee6 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -1050,7 +1050,7 @@ static int ndefDecodePayload(NDEFHeader_t *ndef, bool verbose) { if (str_startswith(begin, NDEF_BLUEAPPL_EP)) { - ndefDecodeMime_bt(ndef); + ndefDecodeMime_bt(ndef); } if (str_startswith(begin, NDEF_BLUEAPPL_SECURE_LE)) { ndefDecodeMime_bt_secure_le_oob(ndef); diff --git a/doc/commands.json b/doc/commands.json index d4cbf628a..40ae8cbc9 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -901,18 +901,20 @@ }, "emv reader": { "command": "emv reader", - "description": "Act as a EMV reader to identify tag. Look for EMV tags until Enter or the pm3 button is pressed", + "description": "Act as a EMV reader to identify tag. Look for EMV tags until Enter or the pm3 button is pressed In `verbose` mode it will also try to extract and decode the transaction logs stored on card in either channel.", "notes": [ "emv reader", + "emv reader -v", "emv reader -@ -> Continuous mode" ], "offline": false, "options": [ "-h, --help This help", "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "-v, --verbose verbose", "-@ continuous reader mode" ], - "usage": "emv reader [-hw@]" + "usage": "emv reader [-hwv@]" }, "emv readrec": { "command": "emv readrec", @@ -2653,8 +2655,8 @@ "hf fido auth --kh 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with 2 parameters, filled 0x00 and key handle", "hf fido auth", "--kh 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f", - "--cp 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f", - "--ap 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with parameters" + "--cpx 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f", + "--apx 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with parameters" ], "offline": false, "options": [ @@ -11687,6 +11689,6 @@ "metadata": { "commands_extracted": 679, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-10T18:33:37" + "extracted_on": "2023-07-14T16:33:40" } } \ No newline at end of file From 6cc59848d55bdcc9017526a948f181ebaf570fd0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 15 Jul 2023 11:51:08 +0200 Subject: [PATCH 650/924] fix bug in return code for hf mf writeblock where it would say it succeeded when it didnt --- armsrc/mifarecmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 145527a7e..ef6b6022f 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -145,7 +145,7 @@ int16_t mifare_cmd_writeblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t write LED_B_OFF(); LED_C_OFF(); - uint8_t retval = PM3_SUCCESS; + int retval = PM3_SUCCESS; if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); From 772b9121f627383d728d6fd967fcd0dda3f8fc93 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 15 Jul 2023 11:51:47 +0200 Subject: [PATCH 651/924] some output can be at debug logging instead --- client/src/cmdhf14a.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 8acf021cc..a8ec8a60d 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -1009,7 +1009,7 @@ static int CmdExchangeAPDU(bool chainingin, uint8_t *datain, int datainlen, bool *dataoutlen += dlen; if (maxdataoutlen && *dataoutlen > maxdataoutlen) { - PrintAndLogEx(ERR, "APDU: Buffer too small(%d), needs %d bytes", *dataoutlen, maxdataoutlen); + PrintAndLogEx(DEBUG, "ERR: APDU: Buffer too small(%d), needs %d bytes", *dataoutlen, maxdataoutlen); return PM3_EAPDU_FAIL; } @@ -1021,19 +1021,19 @@ static int CmdExchangeAPDU(bool chainingin, uint8_t *datain, int datainlen, bool } if (!iLen) { - PrintAndLogEx(ERR, "APDU: No APDU response"); + PrintAndLogEx(DEBUG, "ERR: APDU: No APDU response"); return PM3_EAPDU_FAIL; } // check apdu length if (iLen < 2 && iLen >= 0) { - PrintAndLogEx(ERR, "APDU: Small APDU response, len %d", iLen); + PrintAndLogEx(DEBUG, "ERR: APDU: Small APDU response, len %d", iLen); return PM3_EAPDU_FAIL; } // check block TODO if (iLen == -2) { - PrintAndLogEx(ERR, "APDU: Block type mismatch"); + PrintAndLogEx(DEBUG, "ERR: APDU: Block type mismatch"); return PM3_EAPDU_FAIL; } @@ -1046,11 +1046,11 @@ static int CmdExchangeAPDU(bool chainingin, uint8_t *datain, int datainlen, bool // CRC Check if (iLen == -1) { - PrintAndLogEx(ERR, "APDU: ISO 14443A CRC error"); + PrintAndLogEx(DEBUG, "ERR: APDU: ISO 14443A CRC error"); return PM3_EAPDU_FAIL; } } else { - PrintAndLogEx(ERR, "APDU: Reply timeout"); + PrintAndLogEx(DEBUG, "ERR: APDU: Reply timeout"); return PM3_EAPDU_FAIL; } From 71369a3007bff587f8c0259c3f1ba74910dbfa35 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 15 Jul 2023 11:52:42 +0200 Subject: [PATCH 652/924] text style --- client/src/emv/cmdemv.c | 164 ++++++++++++++++++++-------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 8a0b7f82d..2282698d5 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -1350,13 +1350,14 @@ static int CmdEMVExec(const char *Cmd) { // https://www.openscdp.org/scripts/tutorial/emv/applicationselection.html if (!forceSearch) { // PPSE - PrintAndLogEx(NORMAL, "\n* PPSE."); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "* PPSE."); SetAPDULogging(showAPDU); res = EMVSearchPSE(channel, activateField, true, psenum, decodeTLV, tlvSelect); // check PPSE instead of PSE and vice versa if (res) { - PrintAndLogEx(NORMAL, "Check PPSE instead of PSE and vice versa..."); + PrintAndLogEx(INFO, "Check PPSE instead of PSE and vice versa..."); res = EMVSearchPSE(channel, false, true, psenum == 1 ? 2 : 1, decodeTLV, tlvSelect); } @@ -1369,7 +1370,7 @@ static int CmdEMVExec(const char *Cmd) { // Search if (!AIDlen) { - PrintAndLogEx(NORMAL, "\n* Search AID in list."); + PrintAndLogEx(INFO, "\n* Search AID in list."); SetAPDULogging(false); if (EMVSearch(channel, activateField, true, decodeTLV, tlvSelect, false)) { dreturn(PM3_ERFTRANS); @@ -1391,7 +1392,7 @@ static int CmdEMVExec(const char *Cmd) { } // Select - PrintAndLogEx(NORMAL, "\n* Selecting AID:%s", sprint_hex_inrow(AID, AIDlen)); + PrintAndLogEx(INFO, "\n* Selecting AID:%s", sprint_hex_inrow(AID, AIDlen)); SetAPDULogging(showAPDU); res = EMVSelect(channel, false, true, AID, AIDlen, buf, sizeof(buf), &len, &sw, tlvRoot); @@ -1402,13 +1403,13 @@ static int CmdEMVExec(const char *Cmd) { if (decodeTLV) TLVPrintFromBuffer(buf, len); - PrintAndLogEx(NORMAL, "* Selected."); + PrintAndLogEx(INFO, "* Selected."); - PrintAndLogEx(NORMAL, "\n* Init transaction parameters."); + PrintAndLogEx(INFO, "\n* Init transaction parameters."); InitTransactionParameters(tlvRoot, paramLoadJSON, TrType, GenACGPO); TLVPrintFromTLV(tlvRoot); // TODO delete!!! - PrintAndLogEx(NORMAL, "\n* Calc PDOL."); + PrintAndLogEx(INFO, "\n* Calc PDOL."); pdol_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x9f38, NULL), tlvRoot, 0x83); if (!pdol_data_tlv) { PrintAndLogEx(ERR, "Error: can't create PDOL TLV."); @@ -1421,9 +1422,9 @@ static int CmdEMVExec(const char *Cmd) { PrintAndLogEx(ERR, "Error: can't create PDOL data."); dreturn(PM3_ESOFT); } - PrintAndLogEx(NORMAL, "PDOL data[%zu]: %s", pdol_data_tlv_data_len, sprint_hex(pdol_data_tlv_data, pdol_data_tlv_data_len)); + PrintAndLogEx(INFO, "PDOL data[%zu]: %s", pdol_data_tlv_data_len, sprint_hex(pdol_data_tlv_data, pdol_data_tlv_data_len)); - PrintAndLogEx(NORMAL, "\n* GPO."); + PrintAndLogEx(INFO, "\n* GPO."); res = EMVGPO(channel, true, pdol_data_tlv_data, pdol_data_tlv_data_len, buf, sizeof(buf), &len, &sw, tlvRoot); free(pdol_data_tlv_data); @@ -1446,14 +1447,14 @@ static int CmdEMVExec(const char *Cmd) { tlvdb_add(tlvRoot, pan); const struct tlv *pantlv = tlvdb_get(tlvRoot, 0x5a, NULL); - PrintAndLogEx(NORMAL, "\n* * Extracted PAN from track2: %s", sprint_hex(pantlv->value, pantlv->len)); + PrintAndLogEx(INFO, "\n* * Extracted PAN from track2: %s", sprint_hex(pantlv->value, pantlv->len)); } else { PrintAndLogEx(WARNING, "\n* * WARNING: Can't extract PAN from track2."); } } } - PrintAndLogEx(NORMAL, "\n* Read records from AFL."); + PrintAndLogEx(INFO, "\n* Read records from AFL."); const struct tlv *AFL = tlvdb_get(tlvRoot, 0x94, NULL); if (!AFL || !AFL->len) @@ -1471,14 +1472,14 @@ static int CmdEMVExec(const char *Cmd) { uint8_t SFIend = AFL->value[i * 4 + 2]; uint8_t SFIoffline = AFL->value[i * 4 + 3]; - PrintAndLogEx(NORMAL, "* * SFI[%02x] start:%02x end:%02x offline count:%02x", SFI, SFIstart, SFIend, SFIoffline); + PrintAndLogEx(INFO, "* * SFI[%02x] start:%02x end:%02x offline count:%02x", SFI, SFIstart, SFIend, SFIoffline); if (SFI == 0 || SFI == 31 || SFIstart == 0 || SFIstart > SFIend) { - PrintAndLogEx(NORMAL, "SFI ERROR! Skipped..."); + PrintAndLogEx(WARNING, "SFI ERROR! Skipped..."); continue; } for (int n = SFIstart; n <= SFIend; n++) { - PrintAndLogEx(NORMAL, "* * * SFI[%02x] %d", SFI, n); + PrintAndLogEx(INFO, "* * * SFI[%02x] %d", SFI, n); res = EMVReadRecord(channel, true, SFI, n, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { @@ -1521,7 +1522,7 @@ static int CmdEMVExec(const char *Cmd) { if (ODAiListLen) { struct tlvdb *oda = tlvdb_fixed(0x21, ODAiListLen, ODAiList); // not a standard tag tlvdb_add(tlvRoot, oda); - PrintAndLogEx(NORMAL, "* Input list for Offline Data Authentication added to TLV. len=%zu \n", ODAiListLen); + PrintAndLogEx(INFO, "* Input list for Offline Data Authentication added to TLV. len=%zu \n", ODAiListLen); } // get AIP @@ -1529,20 +1530,20 @@ static int CmdEMVExec(const char *Cmd) { const struct tlv *AIPtlv = tlvdb_get(tlvRoot, 0x82, NULL); if (AIPtlv) { AIP = AIPtlv->value[0] + AIPtlv->value[1] * 0x100; - PrintAndLogEx(NORMAL, "* * AIP=%04x", AIP); + PrintAndLogEx(INFO, "* * AIP=%04x", AIP); } else { PrintAndLogEx(ERR, "Can't find AIP."); } // SDA if (AIP & 0x0040) { - PrintAndLogEx(NORMAL, "\n* SDA"); + PrintAndLogEx(INFO, "\n* SDA"); trSDA(tlvRoot); } // DDA if (AIP & 0x0020) { - PrintAndLogEx(NORMAL, "\n* DDA"); + PrintAndLogEx(INFO, "\n* DDA"); trDDA(channel, decodeTLV, tlvRoot); } @@ -1553,8 +1554,8 @@ static int CmdEMVExec(const char *Cmd) { // 9F26: Application Cryptogram const struct tlv *AC = tlvdb_get(tlvRoot, 0x9F26, NULL); if (AC) { - PrintAndLogEx(NORMAL, "\n--> qVSDC transaction."); - PrintAndLogEx(NORMAL, "* AC path"); + PrintAndLogEx(INFO, "\n--> qVSDC transaction."); + PrintAndLogEx(INFO, "* AC path"); // 9F36: Application Transaction Counter (ATC) const struct tlv *ATC = tlvdb_get(tlvRoot, 0x9F36, NULL); @@ -1564,24 +1565,24 @@ static int CmdEMVExec(const char *Cmd) { const struct tlv *IAD = tlvdb_get(tlvRoot, 0x9F10, NULL); // print AC data - PrintAndLogEx(NORMAL, "ATC: %s", sprint_hex(ATC->value, ATC->len)); - PrintAndLogEx(NORMAL, "AC: %s", sprint_hex(AC->value, AC->len)); + PrintAndLogEx(INFO, "ATC: %s", sprint_hex(ATC->value, ATC->len)); + PrintAndLogEx(INFO, "AC: %s", sprint_hex(AC->value, AC->len)); if (IAD) { - PrintAndLogEx(NORMAL, "IAD: %s", sprint_hex(IAD->value, IAD->len)); + PrintAndLogEx(INFO, "IAD: %s", sprint_hex(IAD->value, IAD->len)); // https://mst-company.ru/blog/ekvajring-emv-tranzaktsiya-emv-transaction-flow-chast-4-pdol-i-beskontaktnye-karty-osobennosti-qvsdc-i-quics if (IAD->value[0] == 0x1f) { - PrintAndLogEx(NORMAL, " Key index: 0x%02x", IAD->value[2]); - PrintAndLogEx(NORMAL, " Crypto ver: 0x%02x(%03d)", IAD->value[1], IAD->value[1]); - PrintAndLogEx(NORMAL, " CVR: %s", sprint_hex(&IAD->value[3], 5)); + PrintAndLogEx(INFO, " Key index: 0x%02x", IAD->value[2]); + PrintAndLogEx(INFO, " Crypto ver: 0x%02x(%03d)", IAD->value[1], IAD->value[1]); + PrintAndLogEx(INFO, " CVR: %s", sprint_hex(&IAD->value[3], 5)); struct tlvdb *cvr = tlvdb_fixed(0x20, 5, &IAD->value[3]); TLVPrintFromTLVLev(cvr, 1); - PrintAndLogEx(NORMAL, " IDD option id: 0x%02x", IAD->value[8]); - PrintAndLogEx(NORMAL, " IDD: %s", sprint_hex(&IAD->value[9], 23)); + PrintAndLogEx(INFO, " IDD option id: 0x%02x", IAD->value[8]); + PrintAndLogEx(INFO, " IDD: %s", sprint_hex(&IAD->value[9], 23)); } else if (IAD->len >= IAD->value[0] + 1) { - PrintAndLogEx(NORMAL, " Key index: 0x%02x", IAD->value[1]); - PrintAndLogEx(NORMAL, " Crypto ver: 0x%02x(%03d)", IAD->value[2], IAD->value[2]); - PrintAndLogEx(NORMAL, " CVR: %s", sprint_hex(&IAD->value[3], IAD->value[0] - 2)); + PrintAndLogEx(INFO, " Key index: 0x%02x", IAD->value[1]); + PrintAndLogEx(INFO, " Crypto ver: 0x%02x(%03d)", IAD->value[2], IAD->value[2]); + PrintAndLogEx(INFO, " CVR: %s", sprint_hex(&IAD->value[3], IAD->value[0] - 2)); struct tlvdb *cvr = tlvdb_fixed(0x20, IAD->value[0] - 2, &IAD->value[3]); TLVPrintFromTLVLev(cvr, 1); if (IAD->len >= 8) { @@ -1607,9 +1608,9 @@ static int CmdEMVExec(const char *Cmd) { if (GetCardPSVendor(AID, AIDlen) == CV_MASTERCARD && (TrType == TT_QVSDCMCHIP || TrType == TT_CDA)) { const struct tlv *CDOL1 = tlvdb_get(tlvRoot, 0x8c, NULL); if (CDOL1 && GetCardPSVendor(AID, AIDlen) == CV_MASTERCARD) { // and m/chip transaction flag - PrintAndLogEx(NORMAL, "\n--> Mastercard M/Chip transaction."); + PrintAndLogEx(INFO, "\n--> Mastercard M/Chip transaction."); - PrintAndLogEx(NORMAL, "* * Generate challenge"); + PrintAndLogEx(INFO, "* * Generate challenge"); res = EMVGenerateChallenge(channel, true, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { PrintAndLogEx(ERR, "Error GetChallenge. APDU error %4x", sw); @@ -1624,23 +1625,22 @@ static int CmdEMVExec(const char *Cmd) { struct tlvdb *ICCDynN = tlvdb_fixed(0x9f4c, len, buf); tlvdb_add(tlvRoot, ICCDynN); if (decodeTLV) { - PrintAndLogEx(NORMAL, "\n* * ICC Dynamic Number:"); + PrintAndLogEx(INFO, "\n* * ICC Dynamic Number:"); TLVPrintFromTLV(ICCDynN); } - PrintAndLogEx(NORMAL, "* * Calc CDOL1"); + PrintAndLogEx(INFO, "* * Calc CDOL1"); struct tlv *cdol_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x8c, NULL), tlvRoot, 0x01); // 0x01 - dummy tag if (!cdol_data_tlv) { PrintAndLogEx(ERR, "Error: can't create CDOL1 TLV."); dreturn(PM3_ESOFT); } - PrintAndLogEx(NORMAL, "CDOL1 data[%zu]: %s", cdol_data_tlv->len, sprint_hex(cdol_data_tlv->value, cdol_data_tlv->len)); + PrintAndLogEx(INFO, "CDOL1 data[%zu]: %s", cdol_data_tlv->len, sprint_hex(cdol_data_tlv->value, cdol_data_tlv->len)); - PrintAndLogEx(NORMAL, "* * AC1"); + PrintAndLogEx(INFO, "* * AC1"); // EMVAC_TC + EMVAC_CDAREQ --- to get SDAD res = EMVAC(channel, true, (TrType == TT_CDA) ? EMVAC_TC + EMVAC_CDAREQ : EMVAC_TC, (uint8_t *)cdol_data_tlv->value, cdol_data_tlv->len, buf, sizeof(buf), &len, &sw, tlvRoot); - if (res) { PrintAndLogEx(ERR, "AC1 error(%d): %4x. Exit...", res, sw); dreturn(PM3_ERFTRANS); @@ -1650,36 +1650,36 @@ static int CmdEMVExec(const char *Cmd) { TLVPrintFromBuffer(buf, len); // CDA - PrintAndLogEx(NORMAL, "\n* CDA:"); + PrintAndLogEx(INFO, "\n* CDA:"); struct tlvdb *ac_tlv = tlvdb_parse_multi(buf, len); if (tlvdb_get(ac_tlv, 0x9f4b, NULL)) { res = trCDA(tlvRoot, ac_tlv, pdol_data_tlv, cdol_data_tlv); if (res) { - PrintAndLogEx(NORMAL, "CDA error (%d)", res); + PrintAndLogEx(WARNING, "CDA error (%d)", res); } } else { - PrintAndLogEx(NORMAL, "\n* Signed Dynamic Application Data (0x9f4b) not present"); + PrintAndLogEx(INFO, "\n* Signed Dynamic Application Data (0x9f4b) not present"); } free(ac_tlv); free(cdol_data_tlv); - PrintAndLogEx(NORMAL, "\n* M/Chip transaction result:"); + PrintAndLogEx(INFO, "\n* M/Chip transaction result:"); // 9F27: Cryptogram Information Data (CID) const struct tlv *CID = tlvdb_get(tlvRoot, 0x9F27, NULL); if (CID) { emv_tag_dump(CID, 1); - PrintAndLogEx(NORMAL, "------------------------------"); + PrintAndLogEx(INFO, "------------------------------"); if (CID->len > 0) { switch (CID->value[0] & EMVAC_AC_MASK) { case EMVAC_AAC: - PrintAndLogEx(NORMAL, "Transaction DECLINED."); + PrintAndLogEx(INFO, "Transaction DECLINED."); break; case EMVAC_TC: - PrintAndLogEx(NORMAL, "Transaction approved OFFLINE."); + PrintAndLogEx(INFO, "Transaction approved OFFLINE."); break; case EMVAC_ARQC: - PrintAndLogEx(NORMAL, "Transaction approved ONLINE."); + PrintAndLogEx(INFO, "Transaction approved ONLINE."); break; default: PrintAndLogEx(WARNING, "Warning: CID transaction code error %2x", CID->value[0] & EMVAC_AC_MASK); @@ -1697,20 +1697,20 @@ static int CmdEMVExec(const char *Cmd) { // MSD if (AIP & 0x8000 && TrType == TT_MSD) { - PrintAndLogEx(NORMAL, "\n--> MSD transaction."); + PrintAndLogEx(INFO, "\n--> MSD transaction."); - PrintAndLogEx(NORMAL, "* MSD dCVV path. Check dCVV"); + PrintAndLogEx(INFO, "* MSD dCVV path. Check dCVV"); const struct tlv *track2 = tlvdb_get(tlvRoot, 0x57, NULL); if (track2) { - PrintAndLogEx(NORMAL, "Track2: %s", sprint_hex(track2->value, track2->len)); + PrintAndLogEx(INFO, "Track2: %s", sprint_hex(track2->value, track2->len)); struct tlvdb *dCVV = GetdCVVRawFromTrack2(track2); - PrintAndLogEx(NORMAL, "dCVV raw data:"); + PrintAndLogEx(INFO, "dCVV raw data:"); TLVPrintFromTLV(dCVV); if (GetCardPSVendor(AID, AIDlen) == CV_MASTERCARD) { - PrintAndLogEx(NORMAL, "\n* Mastercard calculate UDOL"); + PrintAndLogEx(INFO, "\n* Mastercard calculate UDOL"); // UDOL (9F69) const struct tlv *UDOL = tlvdb_get(tlvRoot, 0x9F69, NULL); @@ -1721,7 +1721,7 @@ static int CmdEMVExec(const char *Cmd) { .value = (uint8_t *)"\x9f\x6a\x04", }; if (!UDOL) - PrintAndLogEx(NORMAL, "Use default UDOL."); + PrintAndLogEx(INFO, "Use default UDOL."); struct tlv *udol_data_tlv = dol_process(UDOL ? UDOL : &defUDOL, tlvRoot, 0x01); // 0x01 - dummy tag if (!udol_data_tlv) { @@ -1729,9 +1729,9 @@ static int CmdEMVExec(const char *Cmd) { dreturn(PM3_ESOFT); } - PrintAndLogEx(NORMAL, "UDOL data[%zu]: %s", udol_data_tlv->len, sprint_hex(udol_data_tlv->value, udol_data_tlv->len)); + PrintAndLogEx(INFO, "UDOL data[%zu]: %s", udol_data_tlv->len, sprint_hex(udol_data_tlv->value, udol_data_tlv->len)); - PrintAndLogEx(NORMAL, "\n* Mastercard compute cryptographic checksum(UDOL)"); + PrintAndLogEx(INFO, "\n* Mastercard compute cryptographic checksum(UDOL)"); res = MSCComputeCryptoChecksum(channel, true, (uint8_t *)udol_data_tlv->value, udol_data_tlv->len, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { @@ -1754,18 +1754,18 @@ static int CmdEMVExec(const char *Cmd) { // VSDC if (GetCardPSVendor(AID, AIDlen) == CV_VISA && (TrType == TT_VSDC || TrType == TT_CDA)) { - PrintAndLogEx(NORMAL, "\n--> VSDC transaction."); + PrintAndLogEx(INFO, "\n--> VSDC transaction."); - PrintAndLogEx(NORMAL, "* * Calc CDOL1"); + PrintAndLogEx(INFO, "* * Calc CDOL1"); struct tlv *cdol1_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x8c, NULL), tlvRoot, 0x01); // 0x01 - dummy tag if (!cdol1_data_tlv) { PrintAndLogEx(ERR, "Error: can't create CDOL1 TLV."); dreturn(PM3_ESOFT); } - PrintAndLogEx(NORMAL, "CDOL1 data[%zu]: %s", cdol1_data_tlv->len, sprint_hex(cdol1_data_tlv->value, cdol1_data_tlv->len)); + PrintAndLogEx(INFO, "CDOL1 data[%zu]: %s", cdol1_data_tlv->len, sprint_hex(cdol1_data_tlv->value, cdol1_data_tlv->len)); - PrintAndLogEx(NORMAL, "* * AC1"); + PrintAndLogEx(INFO, "* * AC1"); // EMVAC_TC + EMVAC_CDAREQ --- to get SDAD res = EMVAC(channel, true, (TrType == TT_CDA) ? EMVAC_TC + EMVAC_CDAREQ : EMVAC_TC, (uint8_t *)cdol1_data_tlv->value, cdol1_data_tlv->len, buf, sizeof(buf), &len, &sw, tlvRoot); if (res) { @@ -1791,56 +1791,56 @@ static int CmdEMVExec(const char *Cmd) { uint8_t CryptoVersion = 0; const struct tlv *IAD = tlvdb_get(tlvRoot, 0x9f10, NULL); if (IAD && (IAD->len > 1)) { - PrintAndLogEx(NORMAL, "\n* * Issuer Application Data (IAD):"); + PrintAndLogEx(INFO, "\n* * Issuer Application Data (IAD):"); uint8_t VDDlen = IAD->value[0]; // Visa discretionary data length uint8_t IDDlen = 0; // Issuer discretionary data length - PrintAndLogEx(NORMAL, "IAD length: %zu", IAD->len); - PrintAndLogEx(NORMAL, "VDDlen: %d", VDDlen); + PrintAndLogEx(INFO, "IAD length: %zu", IAD->len); + PrintAndLogEx(INFO, "VDDlen: %d", VDDlen); if (VDDlen < IAD->len - 1) { IDDlen = IAD->value[VDDlen + 1]; } - PrintAndLogEx(NORMAL, "IDDlen: %d", IDDlen); + PrintAndLogEx(INFO, "IDDlen: %d", IDDlen); uint8_t DerivKeyIndex = IAD->value[1]; CryptoVersion = IAD->value[2]; - PrintAndLogEx(NORMAL, "CryptoVersion: %d", CryptoVersion); - PrintAndLogEx(NORMAL, "DerivKeyIndex: %d", DerivKeyIndex); + PrintAndLogEx(INFO, "CryptoVersion: %d", CryptoVersion); + PrintAndLogEx(INFO, "DerivKeyIndex: %d", DerivKeyIndex); // Card Verification Results (CVR) decode if ((VDDlen - 2) > 0) { uint8_t CVRlen = IAD->value[3]; if (CVRlen == (VDDlen - 2 - 1)) { - PrintAndLogEx(NORMAL, "CVR length: %d", CVRlen); - PrintAndLogEx(NORMAL, "CVR: %s", sprint_hex(&IAD->value[4], CVRlen)); + PrintAndLogEx(INFO, "CVR length: %d", CVRlen); + PrintAndLogEx(INFO, "CVR: %s", sprint_hex(&IAD->value[4], CVRlen)); } else { PrintAndLogEx(WARNING, "Wrong CVR length! CVR: %s", sprint_hex(&IAD->value[3], VDDlen - 2)); } } if (IDDlen) { - PrintAndLogEx(NORMAL, "IDD: %s", sprint_hex(&IAD->value[VDDlen + 1], IDDlen)); + PrintAndLogEx(INFO, "IDD: %s", sprint_hex(&IAD->value[VDDlen + 1], IDDlen)); } } else { PrintAndLogEx(WARNING, "Issuer Application Data (IAD) not found."); } - PrintAndLogEx(NORMAL, "\n* * Processing online request"); + PrintAndLogEx(INFO, "\n* * Processing online request"); // authorization response code from acquirer const char HostResponse[] = "00"; // 0x3030 size_t HostResponseLen = sizeof(HostResponse) - 1; - PrintAndLogEx(NORMAL, "Host Response: `%s`", HostResponse); + PrintAndLogEx(INFO, "Host Response: `%s`", HostResponse); tlvdb_change_or_add_node(tlvRoot, 0x8a, HostResponseLen, (const unsigned char *)HostResponse); if (CryptoVersion == 10) { - PrintAndLogEx(NORMAL, "\n* * Generate ARPC"); + PrintAndLogEx(INFO, "\n* * Generate ARPC"); // Application Cryptogram (AC) const struct tlv *AC = tlvdb_get(tlvRoot, 0x9f26, NULL); if (AC && (AC->len > 0)) { - PrintAndLogEx(NORMAL, "AC: %s", sprint_hex(AC->value, AC->len)); + PrintAndLogEx(INFO, "AC: %s", sprint_hex(AC->value, AC->len)); size_t rawARPClen = AC->len; uint8_t rawARPC[rawARPClen]; @@ -1848,10 +1848,10 @@ static int CmdEMVExec(const char *Cmd) { for (int i = 0; (i < HostResponseLen) && (i < rawARPClen); i++) { rawARPC[i] ^= HostResponse[i]; } - PrintAndLogEx(NORMAL, "raw ARPC: %s", sprint_hex(rawARPC, rawARPClen)); + PrintAndLogEx(INFO, "raw ARPC: %s", sprint_hex(rawARPC, rawARPClen)); // here must be calculation of ARPC, but we don't know a bank keys. - PrintAndLogEx(NORMAL, "ARPC: n/a"); + PrintAndLogEx(INFO, "ARPC: n/a"); } else { PrintAndLogEx(WARNING, "Application Cryptogram (AC) not found."); @@ -1861,7 +1861,7 @@ static int CmdEMVExec(const char *Cmd) { // needs to send AC2 command (res == ARQC) if ((CID & EMVAC_AC_MASK) == EMVAC_ARQC) { - PrintAndLogEx(NORMAL, "\n* * Calc CDOL2"); + PrintAndLogEx(INFO, "\n* * Calc CDOL2"); struct tlv *cdol2_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x8d, NULL), tlvRoot, 0x01); // 0x01 - dummy tag if (!cdol2_data_tlv) { PrintAndLogEx(ERR, "Error: can't create CDOL2 TLV."); @@ -1869,15 +1869,15 @@ static int CmdEMVExec(const char *Cmd) { dreturn(PM3_ESOFT); } - PrintAndLogEx(NORMAL, "CDOL2 data[%zu]: %s", cdol2_data_tlv->len, sprint_hex(cdol2_data_tlv->value, cdol2_data_tlv->len)); - //PrintAndLogEx(NORMAL, "* * AC2"); + PrintAndLogEx(INFO, "CDOL2 data[%zu]: %s", cdol2_data_tlv->len, sprint_hex(cdol2_data_tlv->value, cdol2_data_tlv->len)); + //PrintAndLogEx(INFO, "* * AC2"); // here must be AC2, but we don't make external authenticate ( /* // AC2 PRINT_INDENT(level); - if ((CID & EMVAC_AC2_MASK) == EMVAC_AAC2) PrintAndLogEx(NORMAL, "\tAC2: AAC (Transaction declined)"); - if ((CID & EMVAC_AC2_MASK) == EMVAC_TC2) PrintAndLogEx(NORMAL, "\tAC2: TC (Transaction approved)"); - if ((CID & EMVAC_AC2_MASK) == EMVAC_ARQC2) PrintAndLogEx(NORMAL, "\tAC2: not requested (ARQC)"); - if ((CID & EMVAC_AC2_MASK) == EMVAC_AC2_MASK) PrintAndLogEx(NORMAL, "\tAC2: RFU"); + if ((CID & EMVAC_AC2_MASK) == EMVAC_AAC2) PrintAndLogEx(INFO, "\tAC2: AAC (Transaction declined)"); + if ((CID & EMVAC_AC2_MASK) == EMVAC_TC2) PrintAndLogEx(INFO, "\tAC2: TC (Transaction approved)"); + if ((CID & EMVAC_AC2_MASK) == EMVAC_ARQC2) PrintAndLogEx(INFO, "\tAC2: not requested (ARQC)"); + if ((CID & EMVAC_AC2_MASK) == EMVAC_AC2_MASK) PrintAndLogEx(INFO, "\tAC2: RFU"); */ free(cdol2_data_tlv); } @@ -1892,7 +1892,7 @@ static int CmdEMVExec(const char *Cmd) { tlvdb_free(tlvSelect); tlvdb_free(tlvRoot); - PrintAndLogEx(NORMAL, "\n* Transaction completed."); + PrintAndLogEx(SUCCESS, "\n* Transaction completed."); return PM3_SUCCESS; } @@ -2786,7 +2786,7 @@ static int CmdEMVReader(const char *Cmd) { // free tlv object tlvdb_free(tlvRoot); - + PrintAndLogEx(INFO, ""); } while (continuous); DropFieldEx(channel); From 3190cc5a3ddaf4892fc689bc5f53acbbb0ba237a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 15 Jul 2023 14:27:44 +0200 Subject: [PATCH 653/924] text --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 3f704ad62..16e32fd61 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1822,7 +1822,7 @@ jumptoend: static int CmdHF14AMfNestedStatic(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf staticnested", - "Execute Nested attack against MIFARE Classic card with static nonce for key recovery.\n" + "Execute static nested attack against MIFARE Classic card with static nonce for key recovery.\n" "Supply a known key from one block to recover all keys", "hf mf staticnested --mini --blk 0 -a -k FFFFFFFFFFFF\n" "hf mf staticnested --1k --blk 0 -a -k FFFFFFFFFFFF\n" From 1e44a26b5462c68898703157593bca60930bb83c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 15 Jul 2023 15:26:01 +0200 Subject: [PATCH 654/924] text --- client/dictionaries/mfc_default_keys.dic | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index d32346428..345d1a702 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -36,6 +36,9 @@ D01AFEEB890A 2612C6DE84CA 707B11FC1481 # +# QL88 diversifed +03F9067646AE +2352C5B56D85 # B0B1B2B3B4B5 C0C1C2C3C4C5 @@ -935,9 +938,9 @@ FBF225DC5D58 # Data https://pastebin.com/BEm6bdAE # vingcard.txt # Note: most likely diversified +96A301BCE267 4708111C8604 3D50D902EA48 -96A301BCE267 6700F10FEC09 7A09CC1DB70A 560F7CFF2D81 @@ -2053,6 +2056,9 @@ D144BD193063 # Data from "the more the marriott" mifare project (colonelborkmundus) # aka The Horde # +# These keys seem to be from Vingcard / Saflok system which means they are diversified +# and not static default keys. To verify this, the UID from such a card is needed. +# # 20230125-01, Elite Member Marriott Rewards 43012BD9EB87 # 20230125-02, Elite Member Marriott Rewards @@ -2133,7 +2139,6 @@ D23C1CB1216E # 20230413-78, Caesars A1D92F808CAF # 20230413-79, The Cosmopolitan, Vegas -# 96A301BCE267 # 20230413-80, Aria 1153C319B4F8 # 20230413-81, Aria From 83e083100ba9b65874ccff7d386c56d1ecce253d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 15 Jul 2023 16:52:48 +0200 Subject: [PATCH 655/924] Bring LZ4 support for hardnested tables Testing perfs on an old 8-core laptop: BZ2 : 2 Mb, average decompression time: 5514 ms LZ4 -9: 9 Mb, average decompression time: 837 ms RAW : 704 Mb, average decompression time: 368 ms Other LZ4 options don't help: -1 is slower and bigger, --favor-decSpeed does not do anything To enable: apt install liblz4-dev cd client/resources/hardnested_tables for i in *bz2; do bunzip2 $i; lz4 -9 --rm ${i%.bz2}; done --- client/CMakeLists.txt | 18 ++ client/Makefile | 3 + client/experimental_lib/CMakeLists.txt | 18 ++ .../bitflip_0_001_states.bin.bz2 | Bin 2801 -> 0 bytes .../bitflip_0_001_states.bin.lz4 | Bin 0 -> 27811 bytes .../bitflip_0_003_states.bin.bz2 | Bin 1531 -> 0 bytes .../bitflip_0_003_states.bin.lz4 | Bin 0 -> 17673 bytes .../bitflip_0_005_states.bin.bz2 | Bin 4901 -> 0 bytes .../bitflip_0_005_states.bin.lz4 | Bin 0 -> 34843 bytes .../bitflip_0_007_states.bin.bz2 | Bin 1591 -> 0 bytes .../bitflip_0_007_states.bin.lz4 | Bin 0 -> 19198 bytes .../bitflip_0_009_states.bin.bz2 | Bin 1780 -> 0 bytes .../bitflip_0_009_states.bin.lz4 | Bin 0 -> 18034 bytes .../bitflip_0_00b_states.bin.bz2 | Bin 1069 -> 0 bytes .../bitflip_0_00b_states.bin.lz4 | Bin 0 -> 12365 bytes .../bitflip_0_00d_states.bin.bz2 | Bin 2204 -> 0 bytes .../bitflip_0_00d_states.bin.lz4 | Bin 0 -> 22975 bytes .../bitflip_0_00f_states.bin.bz2 | Bin 1214 -> 0 bytes .../bitflip_0_00f_states.bin.lz4 | Bin 0 -> 13684 bytes .../bitflip_0_010_states.bin.bz2 | Bin 1557 -> 0 bytes .../bitflip_0_010_states.bin.lz4 | Bin 0 -> 19000 bytes .../bitflip_0_014_states.bin.bz2 | Bin 3138 -> 0 bytes .../bitflip_0_014_states.bin.lz4 | Bin 0 -> 27232 bytes .../bitflip_0_01c_states.bin.bz2 | Bin 1120 -> 0 bytes .../bitflip_0_01c_states.bin.lz4 | Bin 0 -> 22128 bytes .../bitflip_0_021_states.bin.bz2 | Bin 7328 -> 0 bytes .../bitflip_0_021_states.bin.lz4 | Bin 0 -> 42330 bytes .../bitflip_0_023_states.bin.bz2 | Bin 2080 -> 0 bytes .../bitflip_0_023_states.bin.lz4 | Bin 0 -> 23829 bytes .../bitflip_0_025_states.bin.bz2 | Bin 13155 -> 0 bytes .../bitflip_0_025_states.bin.lz4 | Bin 0 -> 52945 bytes .../bitflip_0_027_states.bin.bz2 | Bin 2632 -> 0 bytes .../bitflip_0_027_states.bin.lz4 | Bin 0 -> 27144 bytes .../bitflip_0_029_states.bin.bz2 | Bin 2402 -> 0 bytes .../bitflip_0_029_states.bin.lz4 | Bin 0 -> 27204 bytes .../bitflip_0_02b_states.bin.bz2 | Bin 1408 -> 0 bytes .../bitflip_0_02b_states.bin.lz4 | Bin 0 -> 15338 bytes .../bitflip_0_02d_states.bin.bz2 | Bin 3826 -> 0 bytes .../bitflip_0_02d_states.bin.lz4 | Bin 0 -> 35762 bytes .../bitflip_0_02f_states.bin.bz2 | Bin 1660 -> 0 bytes .../bitflip_0_02f_states.bin.lz4 | Bin 0 -> 18867 bytes .../bitflip_0_030_states.bin.bz2 | Bin 1119 -> 0 bytes .../bitflip_0_030_states.bin.lz4 | Bin 0 -> 20011 bytes .../bitflip_0_034_states.bin.bz2 | Bin 1317 -> 0 bytes .../bitflip_0_034_states.bin.lz4 | Bin 0 -> 21179 bytes .../bitflip_0_03c_states.bin.bz2 | Bin 924 -> 0 bytes .../bitflip_0_03c_states.bin.lz4 | Bin 0 -> 15502 bytes .../bitflip_0_040_states.bin.bz2 | Bin 413 -> 0 bytes .../bitflip_0_040_states.bin.lz4 | Bin 0 -> 15230 bytes .../bitflip_0_044_states.bin.bz2 | Bin 3460 -> 0 bytes .../bitflip_0_044_states.bin.lz4 | Bin 0 -> 26186 bytes .../bitflip_0_04c_states.bin.bz2 | Bin 1219 -> 0 bytes .../bitflip_0_04c_states.bin.lz4 | Bin 0 -> 21042 bytes .../bitflip_0_051_states.bin.bz2 | Bin 2568 -> 0 bytes .../bitflip_0_051_states.bin.lz4 | Bin 0 -> 28974 bytes .../bitflip_0_053_states.bin.bz2 | Bin 1356 -> 0 bytes .../bitflip_0_053_states.bin.lz4 | Bin 0 -> 16061 bytes .../bitflip_0_055_states.bin.bz2 | Bin 5503 -> 0 bytes .../bitflip_0_055_states.bin.lz4 | Bin 0 -> 35521 bytes .../bitflip_0_057_states.bin.bz2 | Bin 1890 -> 0 bytes .../bitflip_0_057_states.bin.lz4 | Bin 0 -> 21878 bytes .../bitflip_0_059_states.bin.bz2 | Bin 1820 -> 0 bytes .../bitflip_0_059_states.bin.lz4 | Bin 0 -> 18328 bytes .../bitflip_0_05b_states.bin.bz2 | Bin 1077 -> 0 bytes .../bitflip_0_05b_states.bin.lz4 | Bin 0 -> 12349 bytes .../bitflip_0_05d_states.bin.bz2 | Bin 2472 -> 0 bytes .../bitflip_0_05d_states.bin.lz4 | Bin 0 -> 24131 bytes .../bitflip_0_05f_states.bin.bz2 | Bin 1448 -> 0 bytes .../bitflip_0_05f_states.bin.lz4 | Bin 0 -> 15388 bytes .../bitflip_0_064_states.bin.bz2 | Bin 1324 -> 0 bytes .../bitflip_0_064_states.bin.lz4 | Bin 0 -> 21807 bytes .../bitflip_0_06c_states.bin.bz2 | Bin 926 -> 0 bytes .../bitflip_0_06c_states.bin.lz4 | Bin 0 -> 14984 bytes .../bitflip_0_071_states.bin.bz2 | Bin 6959 -> 0 bytes .../bitflip_0_071_states.bin.lz4 | Bin 0 -> 45965 bytes .../bitflip_0_073_states.bin.bz2 | Bin 1861 -> 0 bytes .../bitflip_0_073_states.bin.lz4 | Bin 0 -> 22696 bytes .../bitflip_0_075_states.bin.bz2 | Bin 12922 -> 0 bytes .../bitflip_0_075_states.bin.lz4 | Bin 0 -> 52098 bytes .../bitflip_0_077_states.bin.bz2 | Bin 2916 -> 0 bytes .../bitflip_0_077_states.bin.lz4 | Bin 0 -> 28775 bytes .../bitflip_0_079_states.bin.bz2 | Bin 2400 -> 0 bytes .../bitflip_0_079_states.bin.lz4 | Bin 0 -> 27204 bytes .../bitflip_0_07b_states.bin.bz2 | Bin 1404 -> 0 bytes .../bitflip_0_07b_states.bin.lz4 | Bin 0 -> 15338 bytes .../bitflip_0_07f_states.bin.bz2 | Bin 2054 -> 0 bytes .../bitflip_0_07f_states.bin.lz4 | Bin 0 -> 21315 bytes .../bitflip_0_081_states.bin.bz2 | Bin 5982 -> 0 bytes .../bitflip_0_081_states.bin.lz4 | Bin 0 -> 35433 bytes .../bitflip_0_083_states.bin.bz2 | Bin 2134 -> 0 bytes .../bitflip_0_083_states.bin.lz4 | Bin 0 -> 22127 bytes .../bitflip_0_085_states.bin.bz2 | Bin 2460 -> 0 bytes .../bitflip_0_085_states.bin.lz4 | Bin 0 -> 26212 bytes .../bitflip_0_087_states.bin.bz2 | Bin 1352 -> 0 bytes .../bitflip_0_087_states.bin.lz4 | Bin 0 -> 16061 bytes .../bitflip_0_089_states.bin.bz2 | Bin 2505 -> 0 bytes .../bitflip_0_089_states.bin.lz4 | Bin 0 -> 24763 bytes .../bitflip_0_08b_states.bin.bz2 | Bin 1469 -> 0 bytes .../bitflip_0_08b_states.bin.lz4 | Bin 0 -> 15328 bytes .../bitflip_0_08d_states.bin.bz2 | Bin 1788 -> 0 bytes .../bitflip_0_08d_states.bin.lz4 | Bin 0 -> 18328 bytes .../bitflip_0_08f_states.bin.bz2 | Bin 1080 -> 0 bytes .../bitflip_0_08f_states.bin.lz4 | Bin 0 -> 12349 bytes .../bitflip_0_090_states.bin.bz2 | Bin 1281 -> 0 bytes .../bitflip_0_090_states.bin.lz4 | Bin 0 -> 17300 bytes .../bitflip_0_094_states.bin.bz2 | Bin 6279 -> 0 bytes .../bitflip_0_094_states.bin.lz4 | Bin 0 -> 31544 bytes .../bitflip_0_09c_states.bin.bz2 | Bin 1431 -> 0 bytes .../bitflip_0_09c_states.bin.lz4 | Bin 0 -> 23829 bytes .../bitflip_0_0a1_states.bin.bz2 | Bin 13572 -> 0 bytes .../bitflip_0_0a1_states.bin.lz4 | Bin 0 -> 51284 bytes .../bitflip_0_0a3_states.bin.bz2 | Bin 2973 -> 0 bytes .../bitflip_0_0a3_states.bin.lz4 | Bin 0 -> 31041 bytes .../bitflip_0_0a5_states.bin.bz2 | Bin 6943 -> 0 bytes .../bitflip_0_0a5_states.bin.lz4 | Bin 0 -> 47188 bytes .../bitflip_0_0a7_states.bin.bz2 | Bin 1863 -> 0 bytes .../bitflip_0_0a7_states.bin.lz4 | Bin 0 -> 22696 bytes .../bitflip_0_0a9_states.bin.bz2 | Bin 3825 -> 0 bytes .../bitflip_0_0a9_states.bin.lz4 | Bin 0 -> 35946 bytes .../bitflip_0_0ab_states.bin.bz2 | Bin 1924 -> 0 bytes .../bitflip_0_0ab_states.bin.lz4 | Bin 0 -> 20159 bytes .../bitflip_0_0ad_states.bin.bz2 | Bin 2419 -> 0 bytes .../bitflip_0_0ad_states.bin.lz4 | Bin 0 -> 27204 bytes .../bitflip_0_0af_states.bin.bz2 | Bin 1409 -> 0 bytes .../bitflip_0_0af_states.bin.lz4 | Bin 0 -> 15338 bytes .../bitflip_0_0b0_states.bin.bz2 | Bin 513 -> 0 bytes .../bitflip_0_0b0_states.bin.lz4 | Bin 0 -> 17155 bytes .../bitflip_0_0b4_states.bin.bz2 | Bin 3041 -> 0 bytes .../bitflip_0_0b4_states.bin.lz4 | Bin 0 -> 24777 bytes .../bitflip_0_0bc_states.bin.bz2 | Bin 1129 -> 0 bytes .../bitflip_0_0bc_states.bin.lz4 | Bin 0 -> 18407 bytes .../bitflip_0_0c0_states.bin.bz2 | Bin 415 -> 0 bytes .../bitflip_0_0c0_states.bin.lz4 | Bin 0 -> 15231 bytes .../bitflip_0_0c4_states.bin.bz2 | Bin 5975 -> 0 bytes .../bitflip_0_0c4_states.bin.lz4 | Bin 0 -> 32577 bytes .../bitflip_0_0cc_states.bin.bz2 | Bin 1614 -> 0 bytes .../bitflip_0_0cc_states.bin.lz4 | Bin 0 -> 26454 bytes .../bitflip_0_0d1_states.bin.bz2 | Bin 5983 -> 0 bytes .../bitflip_0_0d1_states.bin.lz4 | Bin 0 -> 37196 bytes .../bitflip_0_0d3_states.bin.bz2 | Bin 2082 -> 0 bytes .../bitflip_0_0d3_states.bin.lz4 | Bin 0 -> 22943 bytes .../bitflip_0_0d5_states.bin.bz2 | Bin 2460 -> 0 bytes .../bitflip_0_0d5_states.bin.lz4 | Bin 0 -> 26212 bytes .../bitflip_0_0d7_states.bin.bz2 | Bin 1352 -> 0 bytes .../bitflip_0_0d7_states.bin.lz4 | Bin 0 -> 16061 bytes .../bitflip_0_0d9_states.bin.bz2 | Bin 2498 -> 0 bytes .../bitflip_0_0d9_states.bin.lz4 | Bin 0 -> 24482 bytes .../bitflip_0_0db_states.bin.bz2 | Bin 1444 -> 0 bytes .../bitflip_0_0db_states.bin.lz4 | Bin 0 -> 15340 bytes .../bitflip_0_0dd_states.bin.bz2 | Bin 1792 -> 0 bytes .../bitflip_0_0dd_states.bin.lz4 | Bin 0 -> 17854 bytes .../bitflip_0_0df_states.bin.bz2 | Bin 1084 -> 0 bytes .../bitflip_0_0df_states.bin.lz4 | Bin 0 -> 12349 bytes .../bitflip_0_0e4_states.bin.bz2 | Bin 2793 -> 0 bytes .../bitflip_0_0e4_states.bin.lz4 | Bin 0 -> 25961 bytes .../bitflip_0_0ec_states.bin.bz2 | Bin 1145 -> 0 bytes .../bitflip_0_0ec_states.bin.lz4 | Bin 0 -> 18459 bytes .../bitflip_0_0f1_states.bin.bz2 | Bin 13180 -> 0 bytes .../bitflip_0_0f1_states.bin.lz4 | Bin 0 -> 50780 bytes .../bitflip_0_0f3_states.bin.bz2 | Bin 3234 -> 0 bytes .../bitflip_0_0f3_states.bin.lz4 | Bin 0 -> 31642 bytes .../bitflip_0_0f5_states.bin.bz2 | Bin 7153 -> 0 bytes .../bitflip_0_0f5_states.bin.lz4 | Bin 0 -> 46378 bytes .../bitflip_0_0f7_states.bin.bz2 | Bin 1983 -> 0 bytes .../bitflip_0_0f7_states.bin.lz4 | Bin 0 -> 23053 bytes .../bitflip_0_0f9_states.bin.bz2 | Bin 3834 -> 0 bytes .../bitflip_0_0f9_states.bin.lz4 | Bin 0 -> 35946 bytes .../bitflip_0_0fb_states.bin.bz2 | Bin 1940 -> 0 bytes .../bitflip_0_0fb_states.bin.lz4 | Bin 0 -> 20159 bytes .../bitflip_0_0fd_states.bin.bz2 | Bin 2702 -> 0 bytes .../bitflip_0_0fd_states.bin.lz4 | Bin 0 -> 27930 bytes .../bitflip_0_0ff_states.bin.bz2 | Bin 1569 -> 0 bytes .../bitflip_0_0ff_states.bin.lz4 | Bin 0 -> 16786 bytes .../bitflip_0_104_states.bin.bz2 | Bin 3524 -> 0 bytes .../bitflip_0_104_states.bin.lz4 | Bin 0 -> 25780 bytes .../bitflip_0_10c_states.bin.bz2 | Bin 1230 -> 0 bytes .../bitflip_0_10c_states.bin.lz4 | Bin 0 -> 21042 bytes .../bitflip_0_111_states.bin.bz2 | Bin 2568 -> 0 bytes .../bitflip_0_111_states.bin.lz4 | Bin 0 -> 28974 bytes .../bitflip_0_113_states.bin.bz2 | Bin 1352 -> 0 bytes .../bitflip_0_113_states.bin.lz4 | Bin 0 -> 16061 bytes .../bitflip_0_115_states.bin.bz2 | Bin 5503 -> 0 bytes .../bitflip_0_115_states.bin.lz4 | Bin 0 -> 35521 bytes .../bitflip_0_117_states.bin.bz2 | Bin 1888 -> 0 bytes .../bitflip_0_117_states.bin.lz4 | Bin 0 -> 21878 bytes .../bitflip_0_119_states.bin.bz2 | Bin 1806 -> 0 bytes .../bitflip_0_119_states.bin.lz4 | Bin 0 -> 18328 bytes .../bitflip_0_11b_states.bin.bz2 | Bin 1077 -> 0 bytes .../bitflip_0_11b_states.bin.lz4 | Bin 0 -> 12349 bytes .../bitflip_0_11d_states.bin.bz2 | Bin 2469 -> 0 bytes .../bitflip_0_11d_states.bin.lz4 | Bin 0 -> 24131 bytes .../bitflip_0_11f_states.bin.bz2 | Bin 1448 -> 0 bytes .../bitflip_0_11f_states.bin.lz4 | Bin 0 -> 15388 bytes .../bitflip_0_124_states.bin.bz2 | Bin 1327 -> 0 bytes .../bitflip_0_124_states.bin.lz4 | Bin 0 -> 21807 bytes .../bitflip_0_12c_states.bin.bz2 | Bin 922 -> 0 bytes .../bitflip_0_12c_states.bin.lz4 | Bin 0 -> 14984 bytes .../bitflip_0_131_states.bin.bz2 | Bin 6964 -> 0 bytes .../bitflip_0_131_states.bin.lz4 | Bin 0 -> 45965 bytes .../bitflip_0_133_states.bin.bz2 | Bin 1861 -> 0 bytes .../bitflip_0_133_states.bin.lz4 | Bin 0 -> 22696 bytes .../bitflip_0_135_states.bin.bz2 | Bin 12922 -> 0 bytes .../bitflip_0_135_states.bin.lz4 | Bin 0 -> 52098 bytes .../bitflip_0_137_states.bin.bz2 | Bin 2914 -> 0 bytes .../bitflip_0_137_states.bin.lz4 | Bin 0 -> 28775 bytes .../bitflip_0_139_states.bin.bz2 | Bin 2400 -> 0 bytes .../bitflip_0_139_states.bin.lz4 | Bin 0 -> 27204 bytes .../bitflip_0_13b_states.bin.bz2 | Bin 1405 -> 0 bytes .../bitflip_0_13b_states.bin.lz4 | Bin 0 -> 15338 bytes .../bitflip_0_13d_states.bin.bz2 | Bin 4000 -> 0 bytes .../bitflip_0_13d_states.bin.lz4 | Bin 0 -> 36355 bytes .../bitflip_0_13f_states.bin.bz2 | Bin 2056 -> 0 bytes .../bitflip_0_13f_states.bin.lz4 | Bin 0 -> 21315 bytes .../bitflip_0_141_states.bin.bz2 | Bin 2798 -> 0 bytes .../bitflip_0_141_states.bin.lz4 | Bin 0 -> 27811 bytes .../bitflip_0_143_states.bin.bz2 | Bin 1533 -> 0 bytes .../bitflip_0_143_states.bin.lz4 | Bin 0 -> 17673 bytes .../bitflip_0_145_states.bin.bz2 | Bin 5397 -> 0 bytes .../bitflip_0_145_states.bin.lz4 | Bin 0 -> 36138 bytes .../bitflip_0_147_states.bin.bz2 | Bin 1057 -> 0 bytes .../bitflip_0_147_states.bin.lz4 | Bin 0 -> 16220 bytes .../bitflip_0_149_states.bin.bz2 | Bin 1763 -> 0 bytes .../bitflip_0_149_states.bin.lz4 | Bin 0 -> 18034 bytes .../bitflip_0_14b_states.bin.bz2 | Bin 1058 -> 0 bytes .../bitflip_0_14b_states.bin.lz4 | Bin 0 -> 12365 bytes .../bitflip_0_14d_states.bin.bz2 | Bin 1196 -> 0 bytes .../bitflip_0_14d_states.bin.lz4 | Bin 0 -> 16299 bytes .../bitflip_0_14f_states.bin.bz2 | Bin 895 -> 0 bytes .../bitflip_0_14f_states.bin.lz4 | Bin 0 -> 12439 bytes .../bitflip_0_150_states.bin.bz2 | Bin 1557 -> 0 bytes .../bitflip_0_150_states.bin.lz4 | Bin 0 -> 19000 bytes .../bitflip_0_154_states.bin.bz2 | Bin 3137 -> 0 bytes .../bitflip_0_154_states.bin.lz4 | Bin 0 -> 27232 bytes .../bitflip_0_15c_states.bin.bz2 | Bin 1122 -> 0 bytes .../bitflip_0_15c_states.bin.lz4 | Bin 0 -> 22128 bytes .../bitflip_0_161_states.bin.bz2 | Bin 7268 -> 0 bytes .../bitflip_0_161_states.bin.lz4 | Bin 0 -> 42238 bytes .../bitflip_0_163_states.bin.bz2 | Bin 2071 -> 0 bytes .../bitflip_0_163_states.bin.lz4 | Bin 0 -> 23829 bytes .../bitflip_0_165_states.bin.bz2 | Bin 12956 -> 0 bytes .../bitflip_0_165_states.bin.lz4 | Bin 0 -> 52098 bytes .../bitflip_0_167_states.bin.bz2 | Bin 2901 -> 0 bytes .../bitflip_0_167_states.bin.lz4 | Bin 0 -> 28775 bytes .../bitflip_0_169_states.bin.bz2 | Bin 2437 -> 0 bytes .../bitflip_0_169_states.bin.lz4 | Bin 0 -> 27204 bytes .../bitflip_0_16b_states.bin.bz2 | Bin 1400 -> 0 bytes .../bitflip_0_16b_states.bin.lz4 | Bin 0 -> 15338 bytes .../bitflip_0_16d_states.bin.bz2 | Bin 3478 -> 0 bytes .../bitflip_0_16d_states.bin.lz4 | Bin 0 -> 32892 bytes .../bitflip_0_16f_states.bin.bz2 | Bin 1526 -> 0 bytes .../bitflip_0_16f_states.bin.lz4 | Bin 0 -> 17556 bytes .../bitflip_0_170_states.bin.bz2 | Bin 1119 -> 0 bytes .../bitflip_0_170_states.bin.lz4 | Bin 0 -> 20011 bytes .../bitflip_0_174_states.bin.bz2 | Bin 1314 -> 0 bytes .../bitflip_0_174_states.bin.lz4 | Bin 0 -> 21179 bytes .../bitflip_0_17c_states.bin.bz2 | Bin 919 -> 0 bytes .../bitflip_0_17c_states.bin.lz4 | Bin 0 -> 15502 bytes .../bitflip_0_184_states.bin.bz2 | Bin 6184 -> 0 bytes .../bitflip_0_184_states.bin.lz4 | Bin 0 -> 32658 bytes .../bitflip_0_18c_states.bin.bz2 | Bin 1614 -> 0 bytes .../bitflip_0_18c_states.bin.lz4 | Bin 0 -> 26454 bytes .../bitflip_0_191_states.bin.bz2 | Bin 5983 -> 0 bytes .../bitflip_0_191_states.bin.lz4 | Bin 0 -> 37196 bytes .../bitflip_0_193_states.bin.bz2 | Bin 2082 -> 0 bytes .../bitflip_0_193_states.bin.lz4 | Bin 0 -> 22943 bytes .../bitflip_0_195_states.bin.bz2 | Bin 2462 -> 0 bytes .../bitflip_0_195_states.bin.lz4 | Bin 0 -> 26212 bytes .../bitflip_0_197_states.bin.bz2 | Bin 1352 -> 0 bytes .../bitflip_0_197_states.bin.lz4 | Bin 0 -> 16061 bytes .../bitflip_0_199_states.bin.bz2 | Bin 2498 -> 0 bytes .../bitflip_0_199_states.bin.lz4 | Bin 0 -> 24482 bytes .../bitflip_0_19b_states.bin.bz2 | Bin 1444 -> 0 bytes .../bitflip_0_19b_states.bin.lz4 | Bin 0 -> 15340 bytes .../bitflip_0_19d_states.bin.bz2 | Bin 1784 -> 0 bytes .../bitflip_0_19d_states.bin.lz4 | Bin 0 -> 17854 bytes .../bitflip_0_19f_states.bin.bz2 | Bin 1084 -> 0 bytes .../bitflip_0_19f_states.bin.lz4 | Bin 0 -> 12349 bytes .../bitflip_0_1a4_states.bin.bz2 | Bin 2795 -> 0 bytes .../bitflip_0_1a4_states.bin.lz4 | Bin 0 -> 25961 bytes .../bitflip_0_1ac_states.bin.bz2 | Bin 1141 -> 0 bytes .../bitflip_0_1ac_states.bin.lz4 | Bin 0 -> 18459 bytes .../bitflip_0_1b1_states.bin.bz2 | Bin 13188 -> 0 bytes .../bitflip_0_1b1_states.bin.lz4 | Bin 0 -> 50808 bytes .../bitflip_0_1b3_states.bin.bz2 | Bin 3233 -> 0 bytes .../bitflip_0_1b3_states.bin.lz4 | Bin 0 -> 31642 bytes .../bitflip_0_1b5_states.bin.bz2 | Bin 7149 -> 0 bytes .../bitflip_0_1b5_states.bin.lz4 | Bin 0 -> 46378 bytes .../bitflip_0_1b7_states.bin.bz2 | Bin 1984 -> 0 bytes .../bitflip_0_1b7_states.bin.lz4 | Bin 0 -> 23053 bytes .../bitflip_0_1b9_states.bin.bz2 | Bin 3840 -> 0 bytes .../bitflip_0_1b9_states.bin.lz4 | Bin 0 -> 35946 bytes .../bitflip_0_1bb_states.bin.bz2 | Bin 1940 -> 0 bytes .../bitflip_0_1bb_states.bin.lz4 | Bin 0 -> 20159 bytes .../bitflip_0_1bd_states.bin.bz2 | Bin 2706 -> 0 bytes .../bitflip_0_1bd_states.bin.lz4 | Bin 0 -> 27930 bytes .../bitflip_0_1bf_states.bin.bz2 | Bin 1567 -> 0 bytes .../bitflip_0_1bf_states.bin.lz4 | Bin 0 -> 16786 bytes .../bitflip_0_1c1_states.bin.bz2 | Bin 5975 -> 0 bytes .../bitflip_0_1c1_states.bin.lz4 | Bin 0 -> 35433 bytes .../bitflip_0_1c3_states.bin.bz2 | Bin 2125 -> 0 bytes .../bitflip_0_1c3_states.bin.lz4 | Bin 0 -> 22127 bytes .../bitflip_0_1c5_states.bin.bz2 | Bin 472 -> 0 bytes .../bitflip_0_1c5_states.bin.lz4 | Bin 0 -> 16936 bytes .../bitflip_0_1c9_states.bin.bz2 | Bin 2501 -> 0 bytes .../bitflip_0_1c9_states.bin.lz4 | Bin 0 -> 24745 bytes .../bitflip_0_1cb_states.bin.bz2 | Bin 1466 -> 0 bytes .../bitflip_0_1cb_states.bin.lz4 | Bin 0 -> 15328 bytes .../bitflip_0_1d0_states.bin.bz2 | Bin 1281 -> 0 bytes .../bitflip_0_1d0_states.bin.lz4 | Bin 0 -> 17300 bytes .../bitflip_0_1d4_states.bin.bz2 | Bin 6278 -> 0 bytes .../bitflip_0_1d4_states.bin.lz4 | Bin 0 -> 31544 bytes .../bitflip_0_1dc_states.bin.bz2 | Bin 1436 -> 0 bytes .../bitflip_0_1dc_states.bin.lz4 | Bin 0 -> 23829 bytes .../bitflip_0_1e1_states.bin.bz2 | Bin 13795 -> 0 bytes .../bitflip_0_1e1_states.bin.lz4 | Bin 0 -> 51276 bytes .../bitflip_0_1e3_states.bin.bz2 | Bin 2971 -> 0 bytes .../bitflip_0_1e3_states.bin.lz4 | Bin 0 -> 31041 bytes .../bitflip_0_1e5_states.bin.bz2 | Bin 6318 -> 0 bytes .../bitflip_0_1e5_states.bin.lz4 | Bin 0 -> 55696 bytes .../bitflip_0_1e7_states.bin.bz2 | Bin 676 -> 0 bytes .../bitflip_0_1e7_states.bin.lz4 | Bin 0 -> 14767 bytes .../bitflip_0_1e9_states.bin.bz2 | Bin 3842 -> 0 bytes .../bitflip_0_1e9_states.bin.lz4 | Bin 0 -> 35946 bytes .../bitflip_0_1eb_states.bin.bz2 | Bin 1928 -> 0 bytes .../bitflip_0_1eb_states.bin.lz4 | Bin 0 -> 20159 bytes .../bitflip_0_1ed_states.bin.bz2 | Bin 724 -> 0 bytes .../bitflip_0_1ed_states.bin.lz4 | Bin 0 -> 15310 bytes .../bitflip_0_1ef_states.bin.bz2 | Bin 414 -> 0 bytes .../bitflip_0_1ef_states.bin.lz4 | Bin 0 -> 9882 bytes .../bitflip_0_1f0_states.bin.bz2 | Bin 511 -> 0 bytes .../bitflip_0_1f0_states.bin.lz4 | Bin 0 -> 17155 bytes .../bitflip_0_1f4_states.bin.bz2 | Bin 3035 -> 0 bytes .../bitflip_0_1f4_states.bin.lz4 | Bin 0 -> 24777 bytes .../bitflip_0_1fc_states.bin.bz2 | Bin 1127 -> 0 bytes .../bitflip_0_1fc_states.bin.lz4 | Bin 0 -> 18407 bytes .../bitflip_0_210_states.bin.bz2 | Bin 1680 -> 0 bytes .../bitflip_0_210_states.bin.lz4 | Bin 0 -> 8655 bytes .../bitflip_0_225_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_0_225_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_0_227_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_0_227_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_0_22d_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_0_22d_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_0_22f_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_0_22f_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_0_240_states.bin.bz2 | Bin 369 -> 0 bytes .../bitflip_0_240_states.bin.lz4 | Bin 0 -> 8357 bytes .../bitflip_0_275_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_0_275_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_0_277_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_0_277_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_0_27f_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_0_27f_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_0_294_states.bin.bz2 | Bin 5424 -> 0 bytes .../bitflip_0_294_states.bin.lz4 | Bin 0 -> 9691 bytes .../bitflip_0_2a1_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_0_2a1_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_0_2a3_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_0_2a3_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_0_2a9_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_0_2a9_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_0_2ab_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_0_2ab_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_0_2c4_states.bin.bz2 | Bin 5424 -> 0 bytes .../bitflip_0_2c4_states.bin.lz4 | Bin 0 -> 9691 bytes .../bitflip_0_2f1_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_0_2f1_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_0_2f3_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_0_2f3_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_0_2f9_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_0_2f9_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_0_2fb_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_0_2fb_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_0_335_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_0_335_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_0_337_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_0_337_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_0_33d_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_0_33d_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_0_33f_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_0_33f_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_0_350_states.bin.bz2 | Bin 1680 -> 0 bytes .../bitflip_0_350_states.bin.lz4 | Bin 0 -> 8655 bytes .../bitflip_0_365_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_0_365_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_0_367_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_0_367_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_0_36d_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_0_36d_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_0_36f_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_0_36f_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_0_384_states.bin.bz2 | Bin 5424 -> 0 bytes .../bitflip_0_384_states.bin.lz4 | Bin 0 -> 9691 bytes .../bitflip_0_3b1_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_0_3b1_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_0_3b3_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_0_3b3_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_0_3b9_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_0_3b9_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_0_3bb_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_0_3bb_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_0_3d4_states.bin.bz2 | Bin 5424 -> 0 bytes .../bitflip_0_3d4_states.bin.lz4 | Bin 0 -> 9691 bytes .../bitflip_0_3e1_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_0_3e1_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_0_3e3_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_0_3e3_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_0_3e9_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_0_3e9_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_0_3eb_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_0_3eb_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_1_002_states.bin.bz2 | Bin 7733 -> 0 bytes .../bitflip_1_002_states.bin.lz4 | Bin 0 -> 41681 bytes .../bitflip_1_008_states.bin.bz2 | Bin 6132 -> 0 bytes .../bitflip_1_008_states.bin.lz4 | Bin 0 -> 31271 bytes .../bitflip_1_00a_states.bin.bz2 | Bin 8688 -> 0 bytes .../bitflip_1_00a_states.bin.lz4 | Bin 0 -> 49879 bytes .../bitflip_1_012_states.bin.bz2 | Bin 2678 -> 0 bytes .../bitflip_1_012_states.bin.lz4 | Bin 0 -> 28218 bytes .../bitflip_1_018_states.bin.bz2 | Bin 1623 -> 0 bytes .../bitflip_1_018_states.bin.lz4 | Bin 0 -> 25258 bytes .../bitflip_1_01a_states.bin.bz2 | Bin 3415 -> 0 bytes .../bitflip_1_01a_states.bin.lz4 | Bin 0 -> 35928 bytes .../bitflip_1_020_states.bin.bz2 | Bin 1536 -> 0 bytes .../bitflip_1_020_states.bin.lz4 | Bin 0 -> 18953 bytes .../bitflip_1_028_states.bin.bz2 | Bin 3493 -> 0 bytes .../bitflip_1_028_states.bin.lz4 | Bin 0 -> 25815 bytes .../bitflip_1_02a_states.bin.bz2 | Bin 6158 -> 0 bytes .../bitflip_1_02a_states.bin.lz4 | Bin 0 -> 41308 bytes .../bitflip_1_02e_states.bin.bz2 | Bin 2012 -> 0 bytes .../bitflip_1_02e_states.bin.lz4 | Bin 0 -> 22053 bytes .../bitflip_1_032_states.bin.bz2 | Bin 3614 -> 0 bytes .../bitflip_1_032_states.bin.lz4 | Bin 0 -> 35067 bytes .../bitflip_1_036_states.bin.bz2 | Bin 1975 -> 0 bytes .../bitflip_1_036_states.bin.lz4 | Bin 0 -> 19614 bytes .../bitflip_1_038_states.bin.bz2 | Bin 1274 -> 0 bytes .../bitflip_1_038_states.bin.lz4 | Bin 0 -> 21459 bytes .../bitflip_1_03a_states.bin.bz2 | Bin 2736 -> 0 bytes .../bitflip_1_03a_states.bin.lz4 | Bin 0 -> 29421 bytes .../bitflip_1_03e_states.bin.bz2 | Bin 1515 -> 0 bytes .../bitflip_1_03e_states.bin.lz4 | Bin 0 -> 16874 bytes .../bitflip_1_040_states.bin.bz2 | Bin 415 -> 0 bytes .../bitflip_1_040_states.bin.lz4 | Bin 0 -> 15231 bytes .../bitflip_1_042_states.bin.bz2 | Bin 7642 -> 0 bytes .../bitflip_1_042_states.bin.lz4 | Bin 0 -> 41483 bytes .../bitflip_1_046_states.bin.bz2 | Bin 2351 -> 0 bytes .../bitflip_1_046_states.bin.lz4 | Bin 0 -> 24386 bytes .../bitflip_1_048_states.bin.bz2 | Bin 4419 -> 0 bytes .../bitflip_1_048_states.bin.lz4 | Bin 0 -> 30085 bytes .../bitflip_1_04a_states.bin.bz2 | Bin 13641 -> 0 bytes .../bitflip_1_04a_states.bin.lz4 | Bin 0 -> 50357 bytes .../bitflip_1_04e_states.bin.bz2 | Bin 2913 -> 0 bytes .../bitflip_1_04e_states.bin.lz4 | Bin 0 -> 28775 bytes .../bitflip_1_052_states.bin.bz2 | Bin 2732 -> 0 bytes .../bitflip_1_052_states.bin.lz4 | Bin 0 -> 28172 bytes .../bitflip_1_056_states.bin.bz2 | Bin 1540 -> 0 bytes .../bitflip_1_056_states.bin.lz4 | Bin 0 -> 16732 bytes .../bitflip_1_058_states.bin.bz2 | Bin 1573 -> 0 bytes .../bitflip_1_058_states.bin.lz4 | Bin 0 -> 24608 bytes .../bitflip_1_05a_states.bin.bz2 | Bin 4469 -> 0 bytes .../bitflip_1_05a_states.bin.lz4 | Bin 0 -> 36991 bytes .../bitflip_1_05e_states.bin.bz2 | Bin 2026 -> 0 bytes .../bitflip_1_05e_states.bin.lz4 | Bin 0 -> 21231 bytes .../bitflip_1_060_states.bin.bz2 | Bin 1534 -> 0 bytes .../bitflip_1_060_states.bin.lz4 | Bin 0 -> 18954 bytes .../bitflip_1_062_states.bin.bz2 | Bin 13374 -> 0 bytes .../bitflip_1_062_states.bin.lz4 | Bin 0 -> 50633 bytes .../bitflip_1_066_states.bin.bz2 | Bin 3290 -> 0 bytes .../bitflip_1_066_states.bin.lz4 | Bin 0 -> 31576 bytes .../bitflip_1_068_states.bin.bz2 | Bin 3548 -> 0 bytes .../bitflip_1_068_states.bin.lz4 | Bin 0 -> 25815 bytes .../bitflip_1_06a_states.bin.bz2 | Bin 7596 -> 0 bytes .../bitflip_1_06a_states.bin.lz4 | Bin 0 -> 43554 bytes .../bitflip_1_06e_states.bin.bz2 | Bin 1976 -> 0 bytes .../bitflip_1_06e_states.bin.lz4 | Bin 0 -> 23053 bytes .../bitflip_1_072_states.bin.bz2 | Bin 4289 -> 0 bytes .../bitflip_1_072_states.bin.lz4 | Bin 0 -> 36987 bytes .../bitflip_1_076_states.bin.bz2 | Bin 2101 -> 0 bytes .../bitflip_1_076_states.bin.lz4 | Bin 0 -> 21096 bytes .../bitflip_1_078_states.bin.bz2 | Bin 1284 -> 0 bytes .../bitflip_1_078_states.bin.lz4 | Bin 0 -> 21459 bytes .../bitflip_1_07a_states.bin.bz2 | Bin 2730 -> 0 bytes .../bitflip_1_07a_states.bin.lz4 | Bin 0 -> 28127 bytes .../bitflip_1_07e_states.bin.bz2 | Bin 1565 -> 0 bytes .../bitflip_1_07e_states.bin.lz4 | Bin 0 -> 16786 bytes .../bitflip_1_080_states.bin.bz2 | Bin 413 -> 0 bytes .../bitflip_1_080_states.bin.lz4 | Bin 0 -> 15230 bytes .../bitflip_1_082_states.bin.bz2 | Bin 10172 -> 0 bytes .../bitflip_1_082_states.bin.lz4 | Bin 0 -> 48522 bytes .../bitflip_1_086_states.bin.bz2 | Bin 2874 -> 0 bytes .../bitflip_1_086_states.bin.lz4 | Bin 0 -> 28568 bytes .../bitflip_1_088_states.bin.bz2 | Bin 3510 -> 0 bytes .../bitflip_1_088_states.bin.lz4 | Bin 0 -> 26100 bytes .../bitflip_1_08a_states.bin.bz2 | Bin 4415 -> 0 bytes .../bitflip_1_08a_states.bin.lz4 | Bin 0 -> 38962 bytes .../bitflip_1_08e_states.bin.bz2 | Bin 1569 -> 0 bytes .../bitflip_1_08e_states.bin.lz4 | Bin 0 -> 17232 bytes .../bitflip_1_092_states.bin.bz2 | Bin 3608 -> 0 bytes .../bitflip_1_092_states.bin.lz4 | Bin 0 -> 35067 bytes .../bitflip_1_096_states.bin.bz2 | Bin 2013 -> 0 bytes .../bitflip_1_096_states.bin.lz4 | Bin 0 -> 19614 bytes .../bitflip_1_098_states.bin.bz2 | Bin 1255 -> 0 bytes .../bitflip_1_098_states.bin.lz4 | Bin 0 -> 20720 bytes .../bitflip_1_09a_states.bin.bz2 | Bin 2287 -> 0 bytes .../bitflip_1_09a_states.bin.lz4 | Bin 0 -> 28859 bytes .../bitflip_1_09e_states.bin.bz2 | Bin 1236 -> 0 bytes .../bitflip_1_09e_states.bin.lz4 | Bin 0 -> 14735 bytes .../bitflip_1_0a0_states.bin.bz2 | Bin 1303 -> 0 bytes .../bitflip_1_0a0_states.bin.lz4 | Bin 0 -> 17302 bytes .../bitflip_1_0a2_states.bin.bz2 | Bin 7248 -> 0 bytes .../bitflip_1_0a2_states.bin.lz4 | Bin 0 -> 41970 bytes .../bitflip_1_0a6_states.bin.bz2 | Bin 2013 -> 0 bytes .../bitflip_1_0a6_states.bin.lz4 | Bin 0 -> 23007 bytes .../bitflip_1_0a8_states.bin.bz2 | Bin 6270 -> 0 bytes .../bitflip_1_0a8_states.bin.lz4 | Bin 0 -> 30841 bytes .../bitflip_1_0aa_states.bin.bz2 | Bin 8940 -> 0 bytes .../bitflip_1_0aa_states.bin.lz4 | Bin 0 -> 48574 bytes .../bitflip_1_0ae_states.bin.bz2 | Bin 2675 -> 0 bytes .../bitflip_1_0ae_states.bin.lz4 | Bin 0 -> 27316 bytes .../bitflip_1_0b2_states.bin.bz2 | Bin 2723 -> 0 bytes .../bitflip_1_0b2_states.bin.lz4 | Bin 0 -> 28229 bytes .../bitflip_1_0b6_states.bin.bz2 | Bin 1541 -> 0 bytes .../bitflip_1_0b6_states.bin.lz4 | Bin 0 -> 16732 bytes .../bitflip_1_0b8_states.bin.bz2 | Bin 1630 -> 0 bytes .../bitflip_1_0b8_states.bin.lz4 | Bin 0 -> 24606 bytes .../bitflip_1_0ba_states.bin.bz2 | Bin 3614 -> 0 bytes .../bitflip_1_0ba_states.bin.lz4 | Bin 0 -> 35489 bytes .../bitflip_1_0be_states.bin.bz2 | Bin 1951 -> 0 bytes .../bitflip_1_0be_states.bin.lz4 | Bin 0 -> 19786 bytes .../bitflip_1_0c0_states.bin.bz2 | Bin 415 -> 0 bytes .../bitflip_1_0c0_states.bin.lz4 | Bin 0 -> 15231 bytes .../bitflip_1_0c2_states.bin.bz2 | Bin 13885 -> 0 bytes .../bitflip_1_0c2_states.bin.lz4 | Bin 0 -> 49914 bytes .../bitflip_1_0c6_states.bin.bz2 | Bin 3025 -> 0 bytes .../bitflip_1_0c6_states.bin.lz4 | Bin 0 -> 30418 bytes .../bitflip_1_0c8_states.bin.bz2 | Bin 3523 -> 0 bytes .../bitflip_1_0c8_states.bin.lz4 | Bin 0 -> 25815 bytes .../bitflip_1_0ca_states.bin.bz2 | Bin 7147 -> 0 bytes .../bitflip_1_0ca_states.bin.lz4 | Bin 0 -> 47118 bytes .../bitflip_1_0ce_states.bin.bz2 | Bin 1663 -> 0 bytes .../bitflip_1_0ce_states.bin.lz4 | Bin 0 -> 21442 bytes .../bitflip_1_0d2_states.bin.bz2 | Bin 4937 -> 0 bytes .../bitflip_1_0d2_states.bin.lz4 | Bin 0 -> 36987 bytes .../bitflip_1_0d6_states.bin.bz2 | Bin 2083 -> 0 bytes .../bitflip_1_0d6_states.bin.lz4 | Bin 0 -> 21096 bytes .../bitflip_1_0d8_states.bin.bz2 | Bin 1270 -> 0 bytes .../bitflip_1_0d8_states.bin.lz4 | Bin 0 -> 20720 bytes .../bitflip_1_0da_states.bin.bz2 | Bin 2316 -> 0 bytes .../bitflip_1_0da_states.bin.lz4 | Bin 0 -> 23063 bytes .../bitflip_1_0de_states.bin.bz2 | Bin 1273 -> 0 bytes .../bitflip_1_0de_states.bin.lz4 | Bin 0 -> 13839 bytes .../bitflip_1_0e0_states.bin.bz2 | Bin 1292 -> 0 bytes .../bitflip_1_0e0_states.bin.lz4 | Bin 0 -> 17302 bytes .../bitflip_1_0e8_states.bin.bz2 | Bin 4522 -> 0 bytes .../bitflip_1_0e8_states.bin.lz4 | Bin 0 -> 29435 bytes .../bitflip_1_0f8_states.bin.bz2 | Bin 1589 -> 0 bytes .../bitflip_1_0f8_states.bin.lz4 | Bin 0 -> 23792 bytes .../bitflip_1_108_states.bin.bz2 | Bin 3508 -> 0 bytes .../bitflip_1_108_states.bin.lz4 | Bin 0 -> 25815 bytes .../bitflip_1_111_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_111_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_113_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_113_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_115_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_115_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_117_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_117_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_118_states.bin.bz2 | Bin 1261 -> 0 bytes .../bitflip_1_118_states.bin.lz4 | Bin 0 -> 20720 bytes .../bitflip_1_11a_states.bin.bz2 | Bin 1788 -> 0 bytes .../bitflip_1_11a_states.bin.lz4 | Bin 0 -> 18328 bytes .../bitflip_1_11b_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_11b_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_120_states.bin.bz2 | Bin 1301 -> 0 bytes .../bitflip_1_120_states.bin.lz4 | Bin 0 -> 17302 bytes .../bitflip_1_122_states.bin.bz2 | Bin 7248 -> 0 bytes .../bitflip_1_122_states.bin.lz4 | Bin 0 -> 41970 bytes .../bitflip_1_128_states.bin.bz2 | Bin 6269 -> 0 bytes .../bitflip_1_128_states.bin.lz4 | Bin 0 -> 30841 bytes .../bitflip_1_131_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_131_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_135_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_135_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_138_states.bin.bz2 | Bin 1656 -> 0 bytes .../bitflip_1_138_states.bin.lz4 | Bin 0 -> 24606 bytes .../bitflip_1_145_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_145_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_147_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_147_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_148_states.bin.bz2 | Bin 3546 -> 0 bytes .../bitflip_1_148_states.bin.lz4 | Bin 0 -> 25815 bytes .../bitflip_1_158_states.bin.bz2 | Bin 1263 -> 0 bytes .../bitflip_1_158_states.bin.lz4 | Bin 0 -> 20720 bytes .../bitflip_1_160_states.bin.bz2 | Bin 1300 -> 0 bytes .../bitflip_1_160_states.bin.lz4 | Bin 0 -> 17302 bytes .../bitflip_1_161_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_161_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_163_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_163_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_165_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_165_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_168_states.bin.bz2 | Bin 4419 -> 0 bytes .../bitflip_1_168_states.bin.lz4 | Bin 0 -> 29435 bytes .../bitflip_1_178_states.bin.bz2 | Bin 1617 -> 0 bytes .../bitflip_1_178_states.bin.lz4 | Bin 0 -> 23792 bytes .../bitflip_1_180_states.bin.bz2 | Bin 415 -> 0 bytes .../bitflip_1_180_states.bin.lz4 | Bin 0 -> 15231 bytes .../bitflip_1_188_states.bin.bz2 | Bin 5993 -> 0 bytes .../bitflip_1_188_states.bin.lz4 | Bin 0 -> 31274 bytes .../bitflip_1_191_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_191_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_198_states.bin.bz2 | Bin 1605 -> 0 bytes .../bitflip_1_198_states.bin.lz4 | Bin 0 -> 25258 bytes .../bitflip_1_199_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_199_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_19d_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_19d_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_19f_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_19f_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1a0_states.bin.bz2 | Bin 1541 -> 0 bytes .../bitflip_1_1a0_states.bin.lz4 | Bin 0 -> 18953 bytes .../bitflip_1_1a8_states.bin.bz2 | Bin 3543 -> 0 bytes .../bitflip_1_1a8_states.bin.lz4 | Bin 0 -> 25815 bytes .../bitflip_1_1b3_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1b3_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1b5_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1b5_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1b7_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1b7_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1b8_states.bin.bz2 | Bin 1284 -> 0 bytes .../bitflip_1_1b8_states.bin.lz4 | Bin 0 -> 21459 bytes .../bitflip_1_1b9_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1b9_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1bd_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1bd_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1c1_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1c1_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1c3_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1c3_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1c8_states.bin.bz2 | Bin 4359 -> 0 bytes .../bitflip_1_1c8_states.bin.lz4 | Bin 0 -> 30085 bytes .../bitflip_1_1c9_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1c9_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1cd_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1cd_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1cf_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1cf_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1d8_states.bin.bz2 | Bin 1561 -> 0 bytes .../bitflip_1_1d8_states.bin.lz4 | Bin 0 -> 24608 bytes .../bitflip_1_1e0_states.bin.bz2 | Bin 1535 -> 0 bytes .../bitflip_1_1e0_states.bin.lz4 | Bin 0 -> 18954 bytes .../bitflip_1_1e1_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1e1_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1e5_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1e5_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1e7_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1e7_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1e8_states.bin.bz2 | Bin 3479 -> 0 bytes .../bitflip_1_1e8_states.bin.lz4 | Bin 0 -> 25815 bytes .../bitflip_1_1e9_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1e9_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1eb_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1eb_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1ed_states.bin.bz2 | Bin 821 -> 0 bytes .../bitflip_1_1ed_states.bin.lz4 | Bin 0 -> 12849 bytes .../bitflip_1_1f8_states.bin.bz2 | Bin 1274 -> 0 bytes .../bitflip_1_1f8_states.bin.lz4 | Bin 0 -> 21459 bytes .../bitflip_1_208_states.bin.bz2 | Bin 5424 -> 0 bytes .../bitflip_1_208_states.bin.lz4 | Bin 0 -> 9691 bytes .../bitflip_1_220_states.bin.bz2 | Bin 1680 -> 0 bytes .../bitflip_1_220_states.bin.lz4 | Bin 0 -> 8655 bytes .../bitflip_1_24a_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_1_24a_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_1_24e_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_1_24e_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_1_25a_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_1_25a_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_1_25e_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_1_25e_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_1_262_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_1_262_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_1_266_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_1_266_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_1_272_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_1_272_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_1_276_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_1_276_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_1_280_states.bin.bz2 | Bin 369 -> 0 bytes .../bitflip_1_280_states.bin.lz4 | Bin 0 -> 8357 bytes .../bitflip_1_2a8_states.bin.bz2 | Bin 5424 -> 0 bytes .../bitflip_1_2a8_states.bin.lz4 | Bin 0 -> 9691 bytes .../bitflip_1_2c2_states.bin.bz2 | Bin 12468 -> 0 bytes .../bitflip_1_2c2_states.bin.lz4 | Bin 0 -> 41275 bytes .../bitflip_1_2c6_states.bin.bz2 | Bin 2268 -> 0 bytes .../bitflip_1_2c6_states.bin.lz4 | Bin 0 -> 26933 bytes .../bitflip_1_2d2_states.bin.bz2 | Bin 4981 -> 0 bytes .../bitflip_1_2d2_states.bin.lz4 | Bin 0 -> 29127 bytes .../bitflip_1_2d6_states.bin.bz2 | Bin 1135 -> 0 bytes .../bitflip_1_2d6_states.bin.lz4 | Bin 0 -> 18288 bytes .../bitflip_1_328_states.bin.bz2 | Bin 5424 -> 0 bytes .../bitflip_1_328_states.bin.lz4 | Bin 0 -> 9691 bytes .../bitflip_1_388_states.bin.bz2 | Bin 5424 -> 0 bytes .../bitflip_1_388_states.bin.lz4 | Bin 0 -> 9691 bytes .../bitflip_1_3a0_states.bin.bz2 | Bin 1680 -> 0 bytes .../bitflip_1_3a0_states.bin.lz4 | Bin 0 -> 8655 bytes client/src/cmdhfmfhard.c | 236 +++++++++++++----- .../Linux-Installation-Instructions.md | 4 +- .../Windows-Installation-Instructions.md | 2 +- .../Windows-WSL2-Installation-Instructions.md | 2 +- docker/debian-bullseye/Dockerfile | 2 +- docker/kali/Dockerfile | 2 +- docker/opensuse-leap/Dockerfile | 2 +- docker/opensuse-tumbleweed/Dockerfile | 2 +- docker/parrot-core-latest/Dockerfile | 2 +- docker/ubuntu-18.04/Dockerfile | 2 +- docker/ubuntu-20.04/Dockerfile | 2 +- docker/ubuntu-22.04/Dockerfile | 2 +- 717 files changed, 220 insertions(+), 79 deletions(-) delete mode 100644 client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_001_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_003_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_003_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_005_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_005_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_007_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_009_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_00b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_00b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_00d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_00f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_010_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_010_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_014_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_014_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_01c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_01c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_021_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_023_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_025_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_027_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_029_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_02b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_02b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_02d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_02f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_030_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_030_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_034_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_034_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_03c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_040_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_040_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_044_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_044_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_04c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_04c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_051_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_053_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_055_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_057_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_057_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_059_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_05b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_05d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_05f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_064_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_064_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_06c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_071_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_071_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_073_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_073_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_075_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_075_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_077_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_079_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_079_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_07b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_07b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_07f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_081_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_083_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_085_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_085_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_087_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_089_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_089_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_08b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_08b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_08d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_08f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_090_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_094_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_094_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_09c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0a1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0a3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0a5_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a7_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0a7_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0a9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0ab_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0ad_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0ad_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0af_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0b0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0b0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0b4_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0b4_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0bc_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0c0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0c0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0c4_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0c4_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0cc_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0d1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0d3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0d5_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0d7_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0d9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0d9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0db_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0dd_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0df_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0e4_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0e4_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0ec_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0ec_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0f1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0f3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f5_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0f5_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f7_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0f7_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0f9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0fb_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0fd_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_0ff_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_0ff_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_104_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_10c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_10c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_111_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_113_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_115_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_115_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_117_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_119_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_119_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_11b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_11d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_11f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_124_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_12c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_12c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_131_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_131_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_133_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_135_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_135_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_137_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_139_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_13b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_13d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_13f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_141_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_143_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_145_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_145_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_147_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_149_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_14b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_14d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_14d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_14f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_150_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_150_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_154_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_154_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_15c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_161_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_161_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_163_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_165_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_167_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_169_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_16b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_16d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_16f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_170_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_174_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_17c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_17c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_184_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_18c_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_191_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_193_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_193_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_195_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_197_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_197_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_199_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_19b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_19b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_19d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_19d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_19f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1a4_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1ac_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1ac_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1b1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1b3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b5_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1b5_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1b7_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1b9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1bb_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1bd_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1bd_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1bf_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1c1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1c1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1c3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1c3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1c5_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1c5_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1c9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1c9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1cb_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1d0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1d4_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1d4_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1dc_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1dc_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1e1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1e3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1e5_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e7_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1e7_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1e9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1eb_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1ed_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1ef_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1f0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1f4_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_1fc_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_210_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_210_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_225_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_227_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_22d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_22f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_22f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_240_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_240_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_275_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_275_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_277_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_27f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_294_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_294_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2a1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2a3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2a9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2ab_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2ab_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2c4_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2c4_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2f1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2f3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2f9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_2fb_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_2fb_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_335_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_335_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_337_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_33d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_33f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_33f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_350_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_350_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_365_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_367_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_36d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_36f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_36f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_384_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_384_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3b1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3b3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3b9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3bb_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3bb_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3d4_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3d4_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3e1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3e3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3e9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_0_3eb_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_0_3eb_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_002_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_002_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_008_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_00a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_012_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_018_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_01a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_01a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_020_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_028_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_028_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_02a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_02e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_032_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_036_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_038_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_03a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_03e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_040_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_042_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_042_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_046_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_046_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_048_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_048_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_04a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_04e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_04e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_052_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_052_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_056_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_056_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_058_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_05a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_05e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_05e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_060_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_062_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_062_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_066_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_068_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_06a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_06e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_072_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_076_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_076_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_078_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_07a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_07e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_07e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_080_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_082_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_082_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_086_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_088_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_088_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_08a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_08e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_092_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_096_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_096_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_098_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_098_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_09a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_09a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_09e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_09e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0a0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0a0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0a2_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0a6_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0a6_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0a8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0a8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0aa_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0aa_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0ae_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0ae_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0b2_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0b2_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0b6_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0b8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0ba_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0ba_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0be_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0c0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0c2_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0c2_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0c6_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0c6_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0c8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0ca_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0ca_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0ce_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0d2_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0d2_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0d6_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0d8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0d8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0da_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0de_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0de_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0e0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0e0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0e8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_0f8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_0f8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_108_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_111_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_111_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_113_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_113_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_115_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_115_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_117_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_117_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_118_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_118_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_11a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_11b_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_120_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_120_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_122_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_128_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_131_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_135_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_135_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_138_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_138_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_145_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_147_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_147_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_148_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_148_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_158_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_160_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_161_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_163_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_163_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_165_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_165_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_168_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_168_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_178_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_178_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_180_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_188_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_188_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_191_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_198_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_198_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_199_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_199_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_19d_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_19d_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_19f_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_19f_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1a0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1a0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1a8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1b3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b5_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1b5_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b7_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1b7_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1b8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1b9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1bd_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1bd_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1c1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1c1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1c3_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1c3_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1c8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1c8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1c9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1c9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1cd_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1cd_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1cf_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1cf_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1d8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1d8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1e0_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1e1_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e5_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1e5_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e7_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1e7_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1e8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1e9_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1eb_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1eb_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1ed_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1ed_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_1f8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_1f8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_208_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_208_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_220_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_24a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_24e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_25a_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_25e_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_25e_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_262_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_262_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_266_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_272_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_276_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_276_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_280_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_280_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2a8_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_2a8_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_2c2_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_2c6_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_2d2_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_2d6_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_2d6_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_328_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_328_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_388_states.bin.lz4 delete mode 100644 client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 create mode 100644 client/resources/hardnested_tables/bitflip_1_3a0_states.bin.lz4 diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 385e5b29a..ce7e36938 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -183,6 +183,13 @@ else(EMBED_BZIP2) find_package (BZip2 REQUIRED) endif(EMBED_BZIP2) +find_path(LZ4_INCLUDE_DIRS lz4frame.h) +find_library(LZ4_LIBRARIES lz4) + +if (LZ4_INCLUDE_DIRS AND LZ4_LIBRARIES) + set(LZ4_FOUND ON) +endif (LZ4_INCLUDE_DIRS AND LZ4_LIBRARIES) + if (NOT SKIPWHEREAMISYSTEM EQUAL 1) find_path(WHEREAMI_INCLUDE_DIRS whereami.h) find_library(WHEREAMI_LIBRARIES whereami) @@ -457,6 +464,11 @@ if (BZIP2_FOUND) set(ADDITIONAL_LNK ${BZIP2_LIBRARIES} ${ADDITIONAL_LNK}) endif (BZIP2_FOUND) +if (LZ4_FOUND) + set(ADDITIONAL_DIRS ${LZ4_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${LZ4_LIBRARIES} ${ADDITIONAL_LNK}) +endif (LZ4_FOUND) + if (WHEREAMI_FOUND) set(ADDITIONAL_DIRS ${WHEREAMI_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) set(ADDITIONAL_LNK ${WHEREAMI_LIBRARIES} ${ADDITIONAL_LNK}) @@ -495,6 +507,12 @@ else (EMBED_BZIP2) message(STATUS "Bzip2 library: system library found") endif (EMBED_BZIP2) +if (LZ4_FOUND) + message(STATUS "LZ4 library: system library found") +else (LZ4_FOUND) + message(SEND_ERROR "LZ4 library: system library not found and no local library implemented") +endif (LZ4_FOUND) + if (SKIPJANSSONSYSTEM EQUAL 1) message(STATUS "Jansson library: local library forced") else (SKIPJANSSONSYSTEM EQUAL 1) diff --git a/client/Makefile b/client/Makefile index 2e241ee1e..bb15a9944 100644 --- a/client/Makefile +++ b/client/Makefile @@ -242,6 +242,9 @@ endif ## BZIP2 LDLIBS += -lbz2 +## LZ4 +LDLIBS += -llz4 + ## Bluez (optional) ifneq ($(SKIPBT),1) BTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags bluez 2>/dev/null) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 377a5ea58..0cd148fa3 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -183,6 +183,13 @@ else(EMBED_BZIP2) find_package (BZip2 REQUIRED) endif(EMBED_BZIP2) +find_path(LZ4_INCLUDE_DIRS lz4frame.h) +find_library(LZ4_LIBRARIES lz4) + +if (LZ4_INCLUDE_DIRS AND LZ4_LIBRARIES) + set(LZ4_FOUND ON) +endif (LZ4_INCLUDE_DIRS AND LZ4_LIBRARIES) + if (NOT SKIPWHEREAMISYSTEM EQUAL 1) find_path(WHEREAMI_INCLUDE_DIRS whereami.h) find_library(WHEREAMI_LIBRARIES whereami) @@ -457,6 +464,11 @@ if (BZIP2_FOUND) set(ADDITIONAL_LNK ${BZIP2_LIBRARIES} ${ADDITIONAL_LNK}) endif (BZIP2_FOUND) +if (LZ4_FOUND) + set(ADDITIONAL_DIRS ${LZ4_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${LZ4_LIBRARIES} ${ADDITIONAL_LNK}) +endif (LZ4_FOUND) + if (WHEREAMI_FOUND) set(ADDITIONAL_DIRS ${WHEREAMI_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) set(ADDITIONAL_LNK ${WHEREAMI_LIBRARIES} ${ADDITIONAL_LNK}) @@ -495,6 +507,12 @@ else (EMBED_BZIP2) message(STATUS "Bzip2 library: system library found") endif (EMBED_BZIP2) +if (LZ4_FOUND) + message(STATUS "LZ4 library: system library found") +else (LZ4_FOUND) + message(SEND_ERROR "LZ4 library: system library not found and no local library implemented") +endif (LZ4_FOUND) + if (SKIPJANSSONSYSTEM EQUAL 1) message(STATUS "Jansson library: local library forced") else (SKIPJANSSONSYSTEM EQUAL 1) diff --git a/client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 deleted file mode 100644 index e65f2247125203d5685229230b8a857e03ce5c57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2801 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 diff --git a/client/resources/hardnested_tables/bitflip_0_001_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_001_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b343718e708a4cce45237838852a4cd4d8181cbe GIT binary patch literal 27811 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 A)&Kwi diff --git a/client/resources/hardnested_tables/bitflip_0_003_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_003_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..61f52563f94e70b098196200eee1c89ef122f432 GIT binary patch literal 17673 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 S{g3=&Qg>PbZ$o@X*#86RrkWZ6 diff --git a/client/resources/hardnested_tables/bitflip_0_005_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_005_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..5e6ab2676e074d45df5ca41d18977aba49f9996a GIT binary patch literal 34843 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 deleted file mode 100644 index 0cfda87cb7ecf925a5280777a88cf09bc69db73c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1591 zcmV-72FUqBT4*^jL0KkKSrk613jk6KfB(S|0TGkknIHVUfEb7xoSev=fE|Dl03HAy z03Zk&2r1wUzW@LL000000000000`qIO&SA6n2e1KLjq{i5MneKKmmstGHB2mG{j_R zVi*%fn1d0Z!T=07$&*Ha(WWCKLlD54G{hK<1`q&Y#!Q+t28}Tp8W@HI(WW58XfS{S z4l-oXpfqWS$k4s)Uo{6AlQ$Tv25*Z$uPq*%< zf*!K&r*g8yIHwmCM+){GE(_RXV=Id%VO$K4c_v6Rfc8& zPAph5qt1>80r;NVE-sg0a3{*}Tp3R)%HqX)j~5cUSRIdb@xAwuzGiqXGdx$FM8S&5 ziz+iFT`6TtC6tn}Ss`b%r5z&*u@zw%WPSBL)btip-Z~C1z;-$-@IOnr-S}Tg(dAVh zmB7lzPb#>qEWbL#p@g_POMzTn7ZsJk#LJ5#jxGy}iziEqESwz%F~>^j94vGkXGcRB zQw&`(aLXeoV#(6P=`i7jFvd(`#xTs7Wth5IIO8rmkEn5U%Q_vLW_0<_s5)H?ju!`u zBPKq>A;;}Jqow9WdJ?C!Jx?;=zZskiOVI4#>0#(FxUjfc44FT~VfkMR((b-jm7Zto zc%P~3sUGVwjQ1C;4mvZ6Sz@?xe;Ma~b>?0R!2HYGIy;@03m+o-j-5VZ-b3<+RaQ!v zsvm@|%Pg{n3?j=Z@g`XlvO6lH;4bTnp*Xl-sbxnNN}kvq%Or5Vb`K&Q*A_0z7Z-8R z=qxau7Ao;aMV4GH3l0v#;KK|ji1~-iKOxaxDtMMzQ!HP|%Em9!%J|L~lyrxXV0SRX z()d}QG1!Omk2vujyZeuE!`3`sK>E%Hurc(rv0aWnqoaY`k1+m$!uJeWk9@CrC*EGA zipl)Xeb|NAuIPFMWXc9Br8+N4yQ{)prHjIGcyq~7E;WnV9aKC6&5TU zD->{HVTl2=LhY^z((Er5ZzN4{ppS3&}a+#HkO9o@a;9=~M@;o1Np~A}yU7p)G zvcZdvoN>jO+567t3^C&N6CNszr($s7SbL16=p7IEVgGKNE-%1;Vf&Ygq1;|)1B{Hp zJ+bTuLx&TGOFJ`*J!1|P!Pz)v(0cBUh9|noe)sTuCr5O|Wn^O_|K>-Llf~IS131b1 zkFEC)1p7|w4n3BArXFLb5c3_E6TsocUuT^XPvMGD>I$l-ESj)o ziJ6pTMv!Jq3`~qgmQxlo%rh!tV=BsG%GAuVF)uTcBn1zug1~lA$FBeY diff --git a/client/resources/hardnested_tables/bitflip_0_007_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_007_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8864efd2dfe3f555eaebf1b3d1ffd7619236192f GIT binary patch literal 19198 zcmeHP4Qy5Q6+icV_4R{$9<&TbTOMCAAe2_<5(G*gQzJr4+s!x`)YeIY3YD_#gH3_E z#EorID4WJODb$a+B^%Ny$+Ec0Tgc)z3VSXlZo;Axx5d>$m4#$TJ^P*ieed~HvP2{g zO?8~0HYT4)A5*Zly!rx#@E$<7oM$Q!*~R_AC{tLZ3ggihl!N9~7BUsd2OJ3>G5}-+ zQ|=)wA@^wq0KPGWnL@IME39&+S%;aXDqOuTV4PVkB3pD(jBjC@EA{MzlJhYtqL{QA zGyq9)KF1UjxsGXuLUFIjx+X>?o3@pUP^HMe)N+?Wf4#*$)_e>s1+LwI)qq}*48qH7 znh2^++Z1B*-{aB-$lK8P6!8B+x&@7I*%VB{l}DKJ*0^|qB_W9!cpaFx(lGMvBqPBe zB|L)07+DyU3q)Gju|Tr_Wp@1XLuG5fnFIv<@|!d@hQtM?N7fol%9tWYn5F@*i1q^d z1YLTL2$r5Ja+6`dnfN1j<>w(e^RBnWHsxb|tdn}HGUYt;qy1o73mGM@&^U_AEPRKW42kPEbFhuw*h!8&E5)eFt9vJ=oNV^GBy zJb*>s1pDV?y#$g9xuyuP{CJ)m#Y`h4|Dy`fe*$9U@}&gwl|OULpATJumUBCmyLf+r6QL;V{xm>VSQyw|05W{C z$KYJ0VBb+23aFt6)vPCo3}~nQH)D%!z^W<5d=V&_l6QvVbEBX^-hnP2!BX#IB8Upy z3}7)@W4A__u4&PgegTqavy-!%9bcIpvEY*?qG>aC27zs8GoH(^Uf1OHFp@%mUuL)Z zIT9#kCkR%lky?^8{9NOk0Qv7m7lh`k;+g;u^n(cS4G1{?YP&VW@i4Fo zRVhZ{7dXZcTgeWv3ZTQX0H{H6LtsY)YvvE=I+6=yzo=lo&raY@Wo~#kFf8ME?ri*S z;-djzACd(&*dj-g{ea1b7(O>C{G^X z3RMAyhKD2!kh-k<}%?D9~e7%~6`%XC1@;$G|sG+>4Z49P!J7yWpCrAX~%B4nTv z170Dc$WSx8!s3L_Ol=>cD?6wWS~uFH>iswX zI!L3&enl0P73q17UDKIKa;l@#rhRaU9f-WCrsOXY1(TG(BX1nmmHpLZPD_ow{;m)>L2(1em_B1NUe&jL<3qDAwb@|M{!kjBL#H z$d`<#444Svm+f|E0EDGoY)C3>`aC=ely@2xylxZ;O zeJStK%G6lxjtk3++&OgrxZVCYV+W~TH8USY@Mn$}9Ci~@{A%1i2?haDmV`8(WBkdO zQqrSWB_*|;Tab{}*^WB6n~k4)PvF2l(JZuGw&R{>AH~+HUVd-KiV;7gfKUxM(lD6GSfmYOzM5=$nCX%0nSPA9$Zwx4hfFlpAAdIUU>XZ#Gv6~uen`tl zxQ3)M@4C8>F%*b>6R&U?)-I;4_b@%bjp-YZvg*%LG(V+V6ZZnF2RgEyN1Zx^Q={Y{ z{Cu6eak!aqF&BQ}TE9U%!r+Zs^g_Sd@m(w!WegX5v7ejxBQF3NEx{YHA!Tlz_(!rdK@h1-|33`@iGCt5K z=4?v8&0oeYzA}yZ=pV4jeuXoqzJfFQ+JYDk++xF^;6oM8v`VB$xm40UTj~w zSV7l&zzrmQ?&Z~3c{Nt9Cam*nth^d4ug1!&v2s6$jOl}xS7YVXSa~&8UX7JkW98LY zX*H@>W98LYePRXEIO6eYtXlQl;i~;fj#p#VX3j|Ry&5a8#>%U)au0~S8Y{2HN~4Tb z<<(eufBk2^f3L+S2=A}|yc#Rth<{b=)mV8oR>@C|89!c)RR%Lge)MXrz#DAuy&5a; ye{(>Mg!jKWT!sJ5VPtQke-Y@_SS9&$k-ZwLk5H9QRgKkg_m8Cs*KO}zJo;a<=7O;R literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 deleted file mode 100644 index 1103e29bc6263b22d3155916d735792bee147b5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1780 zcmV7hs0g5kLS07GMAZ z6j5Dz;0)gY000000000000000<`YInhK553(8y_{Kn5cwKrnz{IfT)Xp`nn%G%^}! z&;f|akPILg4q-H8XlP_GjSPmGGyq~UWCI8W1DH)28X6f4BSRskjQ|*onE=88faViM zMuvt%2++uBqd*2DCO|NNU221_v*WK$MY0bzR=MID@9+C6Li%ig~8iSoX6 z@t2ZLi=ttNd&tbi@(w2+E7ZThf9Q2DH>kZu+`6v>nc%Pf7e#yG!OkGdy#?6CQjaAkj@{cH8F&b{lfpQy60&OOZWGJR+GzPDqj z>{z{PhkN5?!TSr)d8|DLA3*3heen6lA28zMKk`1&^t}M|Uh#jKJ%^FmeM<`YMD-7G zV)vF_MDQ723m)-@MZ<-X`IG(*i0m?1lJ=+G4}^S5@_xnKJJE{|)cBX|bSvD12J?FLF z=y$u0Cm!L)dg>lWbM~JjxbRNl_8&7n2f#mo@IT1^qscvNC#_?PBQa;R=sG$VqQ@DY z=2NQ2ayqA-N@N_tn+8;3-Qo)emcMqU^Z=8IChj{N< zFy~R+u3^F4IL?lxhd|75xWMl^IDYpN`-dGJ4=0)VkIFkQTRxHEKS|L~BR;p^KLOBr zk6Y;<1CEQ>dfZ)D>iokv$7RF3JxphNgNuWOj{~y)VUK}+Ws}i=L+w1zzWxUu#(v|X z#!p9}^fLCZTK(sl{%5TI#a-_MA5-|hi}b&#^c~9m3-maiEPN-u=EFZg^`1<6&Ob5G z{Db>eABpphiu~!-U%~Y~7Cjz^W#Ybd-o6*SzM{URRsQm=zdeo?7so%cn*Q}7s3xUFYs7W z;+$Mk;3e@7m3CRxnfD!6dmR^5n0nak%k=+`XP9;!m)L)j>UB=3>JOdvyB=nJVeVfN z{we(*Li~rC`X4d=$K!o#*nMxbdlUAb_kFHD$I|=DGJVy@^_?9bDaVTF;`X0#%iv6( ziT7Q{6~*+QI{DM#KiYYx-Cu=1CGCDC4~0J($^B>UKI7(mFInzPdzHsRdM*!AT^1~K zc_(4~oleKbN8w^dKjf2uxJE3P65>biSw=Fkl4C5zkJO)tXYwpl62&@-PUTUK#f**x zIxDf4^DwZm>Z`Drr0iTPBu*sDv66l@QTxltvdahX88X8REHPm^7X-zLaSj+*oEA7- z88FON3;(X-j^o7QbaxauGJ%*5rak%hbYQg^Rhs z%$UO?46Y6rigXw-V+)0JVqOBg6BFrG??Ra`B07$zsKC5e8H*|`GGUNBlgZg}WsF#* z#$z(!W3kY2KE*-&RJa#p5#W;WWU^t=c&1YIrwcC-F61(b^$G9=-cgd7D!-teT~u@| zld5=_ILbPTox&-A>{b(jjuNiL{L$v8n##(21BVtpj)Q}PiN(=niH2i3l)Zx)FJSg5 z(SJdPUBibL6NI?P%*JO22M2ML(Q##qqoFdx21X24Oq>~9S!P|zxGu_cEOceZ7Z*oF z%Pg62;;DQi;2yGk1rGI3B6<|;FkzL9W2ky6dMu_{8G6C%F9GIxk62;R(Bir}lc8`~ zVmyn;yw!Ot2dPKGuM}JddE$02S=j6>JxcOjlf_+?b|x(FcPqJfF6VH(Q@n8)%$T|! z1JpX5&a1IJT}jo|)Do%o}wLn|v8jF~7&KdB-XMIjtjfhwIvDbQ9#z_CeTQvrm= zCRK{W=vgXOSgBcXNpO@7913tzlBi$gyOMU<|BGvkNB~WMmb= zmBT8@Wy377MTR2F7ZxTgs^MfTWTs<_A;iGqVv^y4SYcK$RtzzcVSsRCIHw#g7*-f? W!jpp%oH20!_`8xR!i0o~VJztO+gs)U diff --git a/client/resources/hardnested_tables/bitflip_0_009_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_009_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..187763ee6c5b4ee85b5d6b9d1eb9dfe270163b3c GIT binary patch literal 18034 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 diff --git a/client/resources/hardnested_tables/bitflip_0_00b_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_00b_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..085a4301c910cf1e46bbf159689d539319a59de1 GIT binary patch literal 12365 zcmeHNX>3$g6h1R;0c-nCfkL`LhYE<&WhAJ$Qj0&5?oO+!osyWwD zOVjcw3%&Q5vPGl<&Ci(f@F%^l-;HEIMO){S;A~G2qM05JGUHmj!v7BH99pITNAlxMIhr5*lc4RB|t@NCmlFO39hBZ2pd~g zvUspsiL^mEXrEGn#dI_JEHe@?O*z9&kCby;{vvKEt5V)JLg;TYV!|STvn!ni})y2bf|8=Y%7SHj7|4 zAvp}xB(1(oFJb3}*fc$<&Sod)E@=(r#{6ka-^pV2z?A2&q_hiF9IEd9O!HGfye4d? z!*u>(s>2S(i>zTPm%U7HctB`?<~*6Iepe$aGl~Mhy?K9gIn!V`NJ%OYe|v!P_Np0! z4BQ=H%Z`|S(COF=qZAcjZYvjz@>6hoPczNAJXbEX|2v3jqMXX3H+8wV)G;-P6r;0$ z46MD(5A5|uxr(V!`||7PoVpp@3Zwg&7JE3I8fTd{&(meMh`>SL4BJtp$-ZL5dS5@bmKQnzojF0$#_4eQF2Oc zW4UjpL&=7fsN?)$rZ0T}DV;NBxg{$1r=ar)rhpf!w_-CdXKg7|dZu{{TtqJBXEa_p z>dLIsn&mn(v(s><0XX0OO!L=b?g@suODmX-(KKZl!S4#5J{G}0;?krif1GKfhYQnh z^EyuB0A$%;y=kw{08i_(l?np&!$uJNqN?`km!PNbc5urrh=H{!5bq%1!tY`_blNe! z4m}CdK10-nntQ~`Dw!Ts*MBJOVreEyIo_;^My7a){OMDJj_o)OhJjYOLF{2O$}GowrlIuHjEdM(bIaFb3$ptkt9%ifT*@ zc>p3{Qg%)z0>FW_o+eX8U&B5VL%R)WB;J1j<8$r2kL$;*gb_aG$;*KGUT-;0@Hf*P<|LFl)yrNV z%oTQyC`UNo_uw0wkjSjMPooc06?PGq=a~*C(SC$Dl09vmN1(zMSNX0HaCu$6i)ilz zwIqpOG9CaoKn&3mWIMa$1PI!+1OxUioYuoV61BQg2sc!lo>Qsmy|qLWwH!?(9sjSz zCUELJ=^>$kenbC+{}ueT0Kt5+qk9FaP=z#dLZu$s!_a3d(*bWl8;H1xCBcjJY+!I7&Xaq-CZmU($(4$#kj~o0#Zd=dh=LC~(_|#Yo*MM9lyQwL3>&_j8q}de?%RCPi*Tk^?s^!m7kuH@0v0E3-*6Uk<-cGNi@v3G% z8B*h}Xz7n#WbRj(ZFf>9Z6I+9Y63w`z;(K1DHqnDCSV*Xs0jo$fn-DtY63}FNKg|< z5r#-m69{SoK7;5+C#VSoHG!Ze&<#fs32Fk}5>ppIK}{g233z4^)C7W>fM*OrO~4by z|I`R-0-bBLK}|r7FXc}bC_|gSHc99IM+P;4peE2osJiN!z%l1vPK4)%qjygD7XVq} AQ2+n{ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 deleted file mode 100644 index c763016381ad805e6c5bccac58280e495fd192c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2204 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 deleted file mode 100644 index 39e7afc470e0d56ea57eb3b710dfb73e6a1a0452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1214 zcmV;v1VQ^kT4*^jL0KkKSI5G_y0Li8yrh_2FFoB>n zVq!D^0B~d)Gy#)LLrn%jh+zXjXvD;5007{~G-v}Rn1-4RgAl?7fYFJF&;S9!kZ8~b zO)(8L83rMQ4FRJQ5ugA7q^N=*nh0e*G7+?y9--b${aOzT$mn{-22OFI*=_EuaE z1^&lFqw8O6>bZ3>{ED8?nI5wC*?a1IC7d~9lH_nYBdDt)%3~>o4>2&i9`V9Qod1Nl zELc0N8FV_H>5ued@}B|n9gdF9<{TfT!p?`lJ_Yozc|FtiyoZa_GnbX=r{h*12!V&G+r#x53M%e2XG3*)o%d&Wq^-Qp_cV;sygMp3%EVF^g zvxZ|R!z#rwWqnT+?(lfH7mKS0vcC%bDe|8S_a~i`vGbfKC*4aW=uQQY`_2U5WO>iH z74*11)6^5eipChr46tItxiE0cgMek}hvOWcu0zU|QftA1x?98XQ&gTiqT&2}vOQFi07X}=zRxVyA z)c$wod7Vu8j^_pai-({xDL?0M0daL19t>^L|)PE*e1-@4^EqLpqO!DxWUR?av6f9t6fu;e7|DXnV+D-M3T8sg zWf-Ytl(B%uC6+8Os~JdTkjaUL6*DC>5W^zORx+`aGb)*o$%STAEW`|8EXcz%1&jk2 cteIv8VOYjuq{c-vBR~9I$rRy2Lppc^C|HV2bN~PV diff --git a/client/resources/hardnested_tables/bitflip_0_00f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_00f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..65e43f1589b2a903d037bc7ff4eef2e06b04ddcb GIT binary patch literal 13684 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 T0)uZ-uI5}ISJltHcL?!+RbPMp diff --git a/client/resources/hardnested_tables/bitflip_0_014_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_014_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..44acd9e897302c5253bc7a73a58dbd52f9f7d0a5 GIT binary patch literal 27232 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 OcCgvHW&Q6;v-}_0I>G}0 diff --git a/client/resources/hardnested_tables/bitflip_0_01c_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_01c_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..81d4d9de3b52c2819e271a3dc23f22b3c643fc31 GIT binary patch literal 22128 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 deleted file mode 100644 index b2fef5781e88b30b5e63963a650864fae5102c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7328 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 diff --git a/client/resources/hardnested_tables/bitflip_0_021_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_021_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..fd5d540d75780fba33fc7f21383557ef44ac1a24 GIT binary patch literal 42330 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 deleted file mode 100644 index 32c7adfd59bd1b0a0c6ab194de8ccb355f5708ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2080 zcmYk4YfMv%0msWz&=V92c)B$7qPC^wg!UXv)+RiHULM+BlxKTP$L%?NsM)g6@?jl% zQ3P5kXCQsi-Y}fvV<1teUtrOzeVn%Ev>QIQg`34YC?M!{87MNY&#`a&efTH;Z~y%A zKXl@h6s|yd4d`Yb>SCNY`f=;=o`g#Yzt7A}>C4V4QDy%wS~hVVno%vpI}y-u*BB zpTPdF4o3W1^|wi>te>5}QN`S!{0J0Bo_>XhJs|JA&s_EG>A~)Z?_g^3wcjQDfpLn# zs6Sfc*fkTW{qk-WEO}kHfsjI-m}&BToNiYrwTP) zEOmSm7Lj$GKUuwlZ_=HLYorr|39zYq#4pV^A1JBO-m-C$kF@l*WZ&<0OGxEtDiho> z`sweg6q9n&9}-GPB8Onhn_>#fr}CfoJ)xSL;r7zv5r7l;cu$n=y`MMx8`0xW!zG)_`rqRX{MxL9y7S>5<;rQ ziYyW#Wce@hS94wn%AYjSb@7{{bJ1Mf1h9AzHh(nk*kVw-8F*p$6hB>S{SP!|eW>uY zHx#mTT};HIRnoMNn8b0MrARB~+IOuXi_nx^w1mvQV~^ylRXRI<>2%zd+4<%p_SIoa zkDXT~cL&4e|9D@zTMxPrgxciXdfCzS;r`QShvN_GSP~!J`ei|DW#`I>&H zVf(7vtz|w#TlhiEOAo5};k)=xBHOvcYh~Pys{>a88%HqF{U+^5f~_!EUSW%}P=wR~ zK9`<{d6clbxtO1Jtn!RxrqU?0sm8syr{N0&lq>6gpsSBG1cG#^F&IE(g9MCOUgc~s zgCS*Lr>_TbRmuDqW(JEli_O(w>+Brq>+)H$H$>x8YPW3OwlUDQW2P@}@mbyr^Mg384JxBhR79z!m&2mAA<8ryi#~~7JR6H?Ucu9fuZ%dZDcapO-(JdtHF4>g zvcAXh4d@=27b`7xmvL4`Jf06_w}xh%mpQl2Uf#DZZ7G|T5%2Rn0yC=yL#&|#8xs?H zs9#(QMg?c1>mt(B(z{W{jjUvFV3#-wQL9rZe|l@TfqJ6}npXbYvxaSyEiK(U*}Z;F zsEAd%kU)+ZN*UCOu9nYq{0Q;Ty^;JaC&s^uM0A)2h#l~B!l%&Id=jh;SMumD)KbN0mKbJ>^)jRl?vYG#i zXSO#&DQH$udz^xuxSLGxRl0lIq2r4TLnmo<@!(!Xu7Jc;G_MK92@DelK>3tyYLI~1 z_6=)Rd3Q>eiCgxdQB>!TOhCCtql#yLS3jm{F@D$?k`UEVvEwGKCR8p+JNHtv_hI_hPRRuE!7+<3LSKsn-5Wgn!O(~BkS6my+9L zLB?1Vi4{vI58K!p*GMJH@V2TIV3Dv}ASGrWo|4R<8iZApV@g|>Ibj}ymYZvI$~v2O z*G}zNdx=o_OY3%)=U1nRCJk_BFP{e)j8SNc&YE$K1UqE36x-@aJsjtT>kn=RnFahcHlT4nduEf`}XkfJ9; wJR)KzuUPsGvnhomz;xOoGc38X(B%s!u7?K_2l9XiAAUh)FC02N_glU4zrk3WtpET3 diff --git a/client/resources/hardnested_tables/bitflip_0_023_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_023_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..d3fd78ebb4d69f995f7da0f95316af0d8e422988 GIT binary patch literal 23829 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 axWe3ibP!jVmwoxHE^oqx>*J55ulgUpCgN8B literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 deleted file mode 100644 index e21a5ee9374aec68eaef5f2cb0a7cce6e3f82c17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13155 zcmY+~d00~UA20CAa#FFyg@DR(BLys0ry5%fB}FKeMWE7HW6}9lQ!`mjWhS{`xc~uK zsR+teir}vrr*b0&EJd)inW-tQrkZKrrkc6ld!KvnbI)_m`Sbj7o^!sR&*$}hZ(s>m zp^}+U3iH^PZq|&iXkQ3Es&86WX7bGS)7DR$Ic@#SBkR}Cyobp>SS~MnEv|2%Dv$U{ zGI3S(+YRya!!|%X@>#e>1*~alW5cYOMq+4U4J|8wx*;quSeUhbTDEkISf;-d5bH;+ zF@cLiTH=fWI9(QTT3BZJw5cO=>Y8z6>NYzo-mqr7}#Y^fg%bLy8HAWgV{)qWd}PY2d_(l$$&MxDM!l1&nm7(5HX zz7XNybE9dbeplMyyiw(Lfkp>kdIbiY&oZF#Gjs=!d}M`))#1etHBlY}wHxf03dYXx zG&%9q8jrlYc1A9NB(=J z9W<_QJFK6-q_K5*+=gYU{b%KeF7A?Nt~Jji*&}B~C(KHSp}@v#j((m9At$G|1bsRA zd}%>q5MNCpXIW?&D1n^2VU#Ec7FnP+yONJdRdWGCK3P5(jqXT51CiEYWv~!svyMO^ zK#gix%&%nh-ztloP^2E6vl&VdtF=fi3r+&LNPY}4_^68G)(l)qJ1(!LH|8{45EU*YP0=_;PLrxVM8wK~=;_R~rSwexc0tIo7{IxR`2nHjRkhi)1M_f!CsJtQ zDtm0yqKc00(L|uVqYWOq0Rt78CE1vTarrhZnFDFCRJOJG50=3pvswmZS}1miyL1>O z6}B12%n&gKGfR)EWl0DSoZiP}ZWlVqc#(=+2A&P#&`RT!0(MbRWpI`@AU^@eH*088 zn`c-vtj|b5^m1V;ozp&uVF*pIt_qmFQB9x@d30XtzT(N( z*E|~n=%6=)=v}ERcir}e@9lusd+98PhuvZugv6KfA#|g4MfF>uBT`Yu)-U}#YsD*k z8o>B-GC#%%iRzR)bBc^e5fV<+2h@;sp)(6Zu8CNFX)J<`l!W5sZ=)W zXm=k;nodVSKz5^r;xBB^fRcI=B9jQ2KkpdmIpwN*wDt1dfA-u|3f~#_pG(+Oz2HOI zy4k1R9KByPbiS5IH5tPi( zMf(wTOE)Oi<6@<~qfU3e)2$bFNP!TGqBsL=PHZX&Wi14_SmXxtu*4rd3UC%=!Iy5Y zjIFZW76b>=j2?RYh4zV@EK2z%KGQtR-GD1mi9LNfKfs(=( zO42)U%AWY*`3BO^7@j2wF5rv%$51kHA4?z>osQRUSz)bi39U`()sUx`VjXlamW6aG z8g{2f_=28n)|c{DxQ}bG<4pKKU@s!%UHLiU(GSFfA)0bV=N#%b z&#l1OQQb&Bo9DCD5=vH-=E;}W7b2L1*gVCGZ^06Po{{J%F%K@p!m}X|5t0HVsRhPd zrlBH1QRPF=8nS0h3^$56GG-_VSV0{yO#l@v=~wXv%_-swVs0b@U|>Q!YvC|&o1UM0 z%-O1e&tl8jI554YPj2;5houQZJ8}YPa{<{AgMp)h+1&67^k9A^TjjvP`z9XrcIa|b4S!=zjC9L*PoS<0|e>3nNZ5I>q zThIqt_VzO&$Ei=#NCa)NMO^=B!$~`X4ktob5CXlD5*qSz>c+3)oMJ+h2bs6K`5AEl zTN`$zX74h5*@|NolMc&|u4ef2-p(KV$&J`EMU?oX&`8kU{ut?dH)lrx5-KXip{^nM z3eVoW(AXCqS7`sln$5Glh0E-DM_v`^IPcc7+~9-&r9##36SF6CN%Ecm8UL32{t20h zpnj=w(f6*Xz{4}3@`0Lz<-KM_{X_rU^{-y|u)Hh(ZmxKekJ+->`lCuJE7LlwKS9b4 z2bxK$jeQ3(()M_53)?eua(Ste!K&>{LJ#* zzxvdq-$!O1%v1@sPFMTUnUU91km7BiI&%bw;cPR${V3TM&n8;!2wqBa|5lQlO79&B6U z@PseBSD$ZK&{EswkEh!#VuwKs%uR!Jo~br84VOdg5+)j;GXT()a3aIQbBbGV2w|c=Qp68?q~$fV8loy6rgQXnr>7=Pzhl! z($v3BZ^QW$m`$fcp>SGWzM{cc-Gi-lVgY~$7KsI{jAsN(5R;6SQ6~*bmVjDetl1v4;F-yP zzQrF*b;a}#4H%4F+c7|XzRk|Ih1{;ZkU)AjQH zdESSQg-PeYK+coZ-bv3MRW7(<#R}NPQ=Wl+ox6UQs<|1I`IBMyQa;Bfe_D!;^Z~z` z$EL_nwjuQ=|FZLN2)m*GS#?qZ9-qC@=9jg+OpI7wu11D>NV@ufk8a{^z zYbW5LpZ@uGucYnUZ%`Nh$QvQpmwfd%GjGY91${41MNfM6ZhUndVKnLjbI0Ul-Q}pv+xt5&Cst9mnE#dH_8Vyex*E97LO3j zH|Y(U{KOI^U%hR$*35@W8Qj>WPqD__G!NR5KsQluRfs}g&YC#0fD%4(eR5oqG8co(jnB2BPHMPVJFP z^ImkOmTas^SnqA69f;#;bdUhEUdIH44S~v^z;<7=nVZi46)3wwGtsf606|S~hc8;v@KdtInA4t9dJ+0(-`)xwqn6B-HlF5R7!{*8Fzuo_K z&Do@gn>k5)dv1@rem}cr_swm8y}okskK>#E_${#c2MTfILZte7beQ@(R107ZA3WUG zO@;=MzFBjA*~!|<^Ve7Xg#V)j2Pl&dk?{fY6%|h;fHPSh)rS@9zsFUq*D~<40g_b_ zw%6AeS9E{a^~3l<>+3(MnQtAL_rEJ*c8_g~NZNVkKXI>;_TG4YD(SmNC;oHg-|4e! z-(-CZ-ar=C(n~ZJhC(K{WJ-b%F1m{}NUQL7-y|MiZWk+Y)2TK1n3=JWi1ug_a#mb# zYx+!gR4Bkn23ZwTgG}HUAL$B8t>O)e36<#_Q9(ePJ-(4MA|V8e2PFum)Xk+j`(%PK zNOqsxBVlprssaQ{RBZ|uF*SoZGd6{M4tK(S zlw%Ng$XL1-=Iv&Yh)!>sD{ufos}|rvmHy?TrVcumOemgO9ZjT0O?`q6d3&6v#Ycl_ z5R#RT#yZxw`|G(RyJectsF8O|XQLod&KO~oLkGbDyZifb+x1?Nh{Lz+pw7?Nt0wDX1KCh z0uo=Z53dC<$lHB9R|3imk`OAw%_bl!k+qO$bs;cJ3StBb@Kw-cbn{^9^iNA_FE9El ze5;{{(sJhvXO%^ZB}*;TUwv?^Aog~h_xqMVH(5dF|I2P1!4OBMx>DYE%l}%y`}3>M z8}Sp=oA1d<_KXo?zMFC|de+NFM?3AGmK^vY`s+Eryr1_XYER^=dfvM4@Afcj-$G&k zIJNh~H*;E^)DNYK<7HKRV0ej9RxYbW;QfQC>$+>5WkOEHhP|oi1V7?^=oJk>;)!?%b^_HMG1hM3Pd~MoD98E2ALrLv{&fYDtB(ysN4zxo<`3VSX z{|FF^i5F;O9_OJ}Hnc$iEJL~L`Dg)Dx9-NNaix1$=W^HBwK zje8V5f*izYSjPN{uk11$xW4D9l(>jbGE!h6J!kHP|mqjcXi0N1e^CK3ugn zQ>J`~Xh{W)YX{q%RLQB-N@b$VlT42?b z1Il%oal)ZlA@zab>!-~y%$qi?ep+B$)U-P@k4#UUAq7EaUc(c}NMsihIs<|h6-fh% zkn@IXNi$&^&Q|rWAp1sKv&;*+Yd5bWH{_}Ka6NQx6XjW^;vY*SF5bc_QA1VqeI zzFle#x2dZO(lwsbLbSWYlCK=~SV(jM7i@J`@R0+;Zg;v;izZv8|Keubsf4oKEtFLoI#W*xg`Mtcn#+AE0Uio|XJ5!3DZv+Cx}v31m7xTvMs!qT8y= z)x`)CjwXS#$YM`Q|K_;b07MOkK+Nte$)z=A#8=s_h^k3({i^5`bw6kGG9i{5tOiJ<0(1f()G*@y4 zCDFcceZ%4S@YtecL%_S#JXWp95`=)`Lacq7PzbP9&&QBC0+I`@ZgjUPv5eEP>Q=iB z!Wma@XW3XNQ85dU&*VZ`hDs8f=Yq7AUr+xkyHwM(YPnKjpZ@Q$U$RDjqYPE zpwNA~+OHv&PJ>^Rr8n@ioiZA@0?b#JvlYBPw7Dnb%rr)LO|>CeE~7#kbl_xR5D}V< zo`qEi(djjSqv9-aYSbDU%!e4{qV*t;0E1Er&`zex7fcLJmIi?t+xe{6EZG)F_pp+0 zVyZc#c1%J-!x4QIx|gj`D}(3r3^+VmWyaBvVSU_brBKGw263ZM85dP#Y3y*%(1geU zQ>uJ=A<(>#F6a}4MG70>F-@NMGHNfRgdA%OorW}WD6lR{W^{_jz?|u+8ioxud4ljT zUK86t4Gd=-?KMXq{&^O4SQh}Hvf|V86}H(4Y-<+X<6ciXVfLVdi7P`}xOAOyJDy<7 zUyXrolRxPIM>Rt$`4zD74)b^Fdd|gvof{Surleegoo~U#^bfQ6ES#9F0>kI|g#1P! zfAh=P)myV;6QUN==KmU-C70&qDF?tE=JPE*U) z0DAkh83-S%W<*jnBfqRAz=m~DLNFmTwgDvunCJ;1oQm{HI7oX_$@ zVPHInv<=%LYthb>5$suNnk)fFVCyaQV?vs$#ywC(XQns0;!T+@>Zlf?MQLPXmG!p~ zhAEVc*H_S#l29goS_f2(0Xjz4l>T`1g75GSSWc)0ILdQy-0lvXU5%j$>@tyBEhP;n zG6p&@U@b=YB>mR6GcKQT9!6&n&&kWaPe1%u`o!Fa`@h7$8n}FU*R54Qt-Ex4aAXds zYu-QtGNe}+qsN;R=MFvzf6If*YL(Tyemi4M+ef1D5u^b@TU(hDr5XStbaF3(UhI+l*$FkwS*-ql&!g*h=<&9G>&1C2Jw?Onp8zQx&bRxe0Ld<0-)DKNI90C8Vm@6XPS_i38ruvp06)=RHS#9 zz*4$E#%^-K5oYhm#_XWdhjoE3SyJn0G&74|BM{IB%)R5-p((bsvaEtF*hEvhg_5Xo z^aN3_^_z#rqo>?5U&tknvszscfZePTctlFq6YBQrfkrl%8Lp$N`jmPom?tgk+wgPB zh4L$I81lrGNni!`HZLbNzFgV3&3U|$mQOg&#r9XfR>b^Ljt*NfTU3cZ^2WMKxG z@_E&Ro2$ldJcP7O^xe7f=Y_{FUSBsMZy_$Bn?D|AJ}M(^G>XrxGptq|4k-2E@E=th zkMR_b`#V(?(%`%~fBg~rtZieTrhu@R#%I^}Nj>_6lyiX>CUU43fV!i=u9OP zvXCur#{{d>di6k=vK(uj`bbR<-jJhbgV3IGQQz`G!-6IRlvQJSEG31KQ>Bs_TkC*` zuKpM0XK9pd84U}$4D&jzC_Vd^is00GFN6gQ3Z*I7$6PTgzCnY)?g6p5K=x)qwq32G zRZ`#}?!st>041}cOvJC!I{mZNRuIxH;B*~TW2ML~SeCuR*R^N?9C*yb=b*X%38_5x z3+n1)=jk(?_H-jiWuXbZkOcLDtNSO9f4^wdg>-DGyL@bQc~xB!bF;|%MV;lQ?dy{5zLadZ-}>Uoi$vH9 z?4eO0%jO1Sl5KBOE|df`Qv1vK8!ij`SZzuztdGYUsBUU4sTQJftoXdf2&e4=3)=9% zDHEmY%)C^%5r%K^@b53VjEZkanm-4wj8jz-iV;@7KZt9cPKZ98VP#-NB}QAVHNg1< z0`@N#o0m<-fAJw|!^9b$O;Pt(QFB8QzC@e{jea~$&Y81Tk~;BPnKX75_Yn5|D27?% za<%EVd_FTO**a1wk)S4?9tT)2Z`$bft(7Do(2`}<-rQ4i){2lfSC4hFZlm{~1Gqt& zEF}fhRRN8F56IQqx!~1>8v}RS(AHZnrXJV(5k1vQib$G@NkB1;zmWkhgiVnqdick6 z&3$hZ!ItK+weD(d2!8_q9!xzPYvB3d69-SFZY~?isQyFT)_BmYz4m!dl10>FujD^* zE*UChniD`}Wu=mM0ox$W;tNGbH_KPV+|L!WT&92uj|$z@Vm+w)YV4~_<0t$un~#G) zM*U5QQ#A5I#^!^$R^P6H8(;5LgMGUlhyAdFE18N(zHHb1mEyYA-L3oBT$p3Uy1fH0 zKef+U<=}$;f6rXfk%3V11~=YYVcgOCVHN!4z9&1R$AeC+++X(h)?BEu(+)T}(%?$J zATh1HaGDPb`sLU+<;`XP3p4pLy-ZygS2Ve|I5?3)P$0yktwXqsKpYZ<&Hy2u{7kV0 zO}&j3n{A;2oY>0+i5)gQpRW_~O_4H`v3-g&W%<{OLa;bYT9>it$gl~b>ZM+@mUks& z50k@LE{IIXP7GfV*$1-```Jj{E*Q=@#!%CPTL=wDZG9*pg+#LX_03uvC^hC}MMt9L zoP*h$VJ*VyzCC4S+oE_%d}LKuLnTR+b>te4!&p{jN7oOr5n>BJ14JNc6BE>u_$+ zNe78YEk2nZLBWGT1SzwqfFLvZk3%r%_Cx_ot>#IgM`(*qELroDKx$aQNk<8CFmyP| z`+ld(wPp zKQ3a)@&C%-{!w=Vmlr{NxMWF0#1ar`VCZ4<@@1jamjcksiIpdNqI<4KfVc<|ufH&C z_xwCs+`1@O+gBl)6H7&*WlM-+gW;cQsXrVc-j%&iMJA-2^%Q64q}eIa3TX1qU?NlO zLxao<-zc6KobZY4-c#kW6(_IWI8@ln6{!AUKP8~oZhXmDyEZ4__sJ8nlRLMjzJ~p- zw+LD%P6k@(v?VsPwh~Sq;?DgAp>5z#)dU&a=$e{`fy7}X|7c(7aEp(pDY365hTfKO zvpM@(>MGOzxp4E&nZ?`qPhP#c32^P(_`B?j^8w1}SR(wG7gRC)(tGec=!X2HGc{B` zSlHE=aU5}( z%iMcICy0Fq#P>|uCNR@sX=r6QRKu>4??`3UN|KnhxwUOYB#$Nb3`>Fgj2G^g+~3*^ z)Sl|j0n+@NmbC0ffzBUao5z2rC?l5$E2#y_5i&N9%CT{Ny@L+GV9|41-K&CCQaVladHl5bQSlvv$7wbGhV*Tc|US@?aheq z|GEp__x9}HooCyTJ1o!p_aooF?ey*2 z|8}tOKcj^as~`Q~I=kxi^{?+9*0iK%+>8E&RsBDqvzWon#&L?%5rf5$L32JA18~TK zEfTL`mz#%ncieWMl=>bzvqGR=NOiaAF(`yXILHtij*20vZN&h#kOva*WVVc~3eLiX z8$=Lw{%|oITL6RcX z^lWa*_~`^Gwi1YEup*lB7qpqO5kNH?3e56i%Kh8<{v^=T7eUE+m_CXfoP7Hd>yYkM-fcR-7yYoLS% z8KHveu9j711ktHB)hNV{Yr$2Gmf&Kn{ft4-2nkD98hw0_Pc#*~P&u?vw1@#25^=Ly zyX-V2ldTy*yV=D!o{tOb!350veCo-ip+|da?tkacxLkQ@)c7zTLw9y4&CtJ6$8g4< zLS@aYiq?lsgT{x?Sfn;JSY5`hcK@(<@p0bO-pfm-W4_RurH1{y?9!r)4agOL-44Iu z@)X`Hbs?72U4DM*!q@9&evW&y`IoGtAMgB#Xj8nQ$J~9T@ zEG}?CH3eF&r-lDN_Dn{)PzexqgNR&IOU5$AT%Z`?(E9iNU-d+48VoJmSm_jxLLqKO zpR9KA;xtgLHj88~l)10zG>vsZAwvpi$8Q13`q8cv7?g|)lz=to zce!t+d`S6+x0iOGzvNHAn&jgtpD&L5Lo*A^pMEGmR161D-l)4|CQ8uUz0io*AF}7R z`HV~nQsA%tM9T%3+bGY_U%}e=Q!PeMnrF7BW!cLZEi4-yyFF%=BvLGb>hR%g@lGEG}8SW%paL$%Lq_?yw!bmfYI53)|Y%mAZO#qz%mKom?F-8NOg_Zrmo{E_58~jZ{UZQKHg@8?<;lAsH7> z(5<72Y^qAX8G`!ktf<+BzpJ01g3*xun?EmIWW0l>qZ34-IDf1~zfeTN4(r>Yt?oh6 zFz@Te^eRR3bkwpx5*ypFsxv?DKGCwcp_)bAMX0}DRQ0N2fPKW5rCSr8ku3LWLe3k{ zt16aH=$3}vJ2PM%YZ|;* zwz?i`>bD|$2deH-vYn=&)Fw3<5w3$w)h~E*L*sU&EF(32ZU|l3R$yf^Y;Dj6Tkotl>rzIF4OnnQ}v%jPL=gyF(zrB-86*CtWBh_rnS+NPFiA^3a`Q_CBn z5Tdt02XrcDTQ!sEkE}|YH!FSv4V&Vwj%5opb{V-c5oPa)7LFe8ZNC2g{&`#azgZWs zi%La%l0SSpbT0V&=k;^_hGP!ah0gYeE-eMcY9Aj@e@a|7yEOg2e@ycFUd;5AAv?gA zm4zqS?uM=Dn%xx?I`6y;XFSvL(~`pX?{CqP$Ph8_&Dk-G_(xjC=Lbu@h4H1^dw=3Q z8!&;f*e)F6(_klv%Xm^|y(iH8Ql0dk8 z-!TWkhV;GYC;*Iv?=~OzEYg;kAT|rc0I~yGdr~D(Y{T=BldG<;x_bQ9O=IraxBWRU z2la!j-N%yR_pfOqWL&LBw{04- zvX;MsI~A)lblF|o+YY4`=3*09o=1LpxYqo1`TLUtBUd6A-owWqeKX9zf8)@%;qUmW zb%4c;x!`U5mHT&Yl$}gJK@gA|G!0KoFSgcRlw@BGe*{*I;u42(P_xKbK)VCz9gBDT z4CalKP+U0jx0(qt=fRf6Eh`OG9`%lBrWP}Rp{v@18G;0!Jd-(3KLCsbMn&;wb#GHc z)gq+_SJvBJDQ1lGO`CL!W=^uXpsG!kOyG`=HqUz%q*SVe1_At`eN6fCC`CXUec4Rk~Lv_fY)NOpFjN^h-5ID^*bq-{s`n?DyS~%SJ^UxZrhSMh1b7Sx0Pq6Gb2LH{~dbN>tVD~EL-1T3-`uV1Q^`a~K z)z4%u{o%3`E4gOZGR|wXqpe5&oYuT~$FJW!7?s%>qkoRl*(WZqTn<*QfZ!C925E+_ zM|t+q;}0v6*W~tp2AlWZ3eqpTvtV=WkTDyn%r?(@>&os3D`a=%}(n0NV@m8*&^ zjG<2Awcq)t;(8}+7SVt1e^r9?b55VObI0B1Kk3`Y-c>zn`K{Cb!||XeE62K@wTbdl zkE8VGG8Qp30Ld%8eS5|)egKOrT-qgi$+zJ); z0FJKouU*Ynf}A4>r|>!8O3b^1S8B&U>?~Ey4H?nmiu@Y`P6tOeZgh|1mSvxQbe*vu zE%?s@bm4K`x%gifqFdixTHPjiw&F6^JJlsEnX_rp0ejQt6YA?YvLc1|*Q%4S zorc++m}vj}8>KHKD_z~0wMVR#BzIx%ql?2`*WFj9Z!LAM`YN(|=T9OO$8~#A`F*r0 zy?6KWpEze^5MRz7Q45nkGD}bGo!&F8DpG#uM&+q<`V)&DTCu(Cl|s8NsmT9xoo{{* z|J%eZJ(d$Y>qOnZ4}wIaH(9?~1$7Pk)BPhO-|UOC?Y-v;yzaO}cwAGZ@(S;+5MNAsIK@>f^1JEU?)QfN? zfnB4=fE-;KZkh{R3@FG4mNd;sj;s+%Rfck@l7$|VIef8eH=kOS+0{L}#xF)Szo9#; zg~L|)Jz2E=5c^!-$^Mg{Uf&&?YrQhDW_H+Bu8x!PkT8c*i@}k2T{eM)B9P=; z`AUZud#L!A|0dqq6jA^A{GwCu)^U%$JkWBk{$Q6QF}YfHCsEMAYB@C=lrojsEG{x9 zgn0%f$!e>&?2qP}kE|Q38HDJ^!rcol=T0Sbyc&J{X)w$1O?brRJ>*TVE!fQZ~46skGbk( zr5e>0vA>m{va)?;x2w1A)(0Njy46;0sFbUw#Xi5MsFRfPm1^fd)vt7<`glBL>()rA z(Mr8XO;pNClB96*)~$`ITb|eEdX!ey>w-vrH3uP`S+=9ROQiX1r(^~EJyiw$mR7kW zS#4jaoO-1mvD}j_FH%zuJQgXZq#Tv=LS>hfTak|L*DBwkBWrebd~4FytpoI6)tXW3 zx(__2taJFRtj=jNE4PtmHn7$6(qmc`6Tf@6E-M*B$I7BXsOqLANhom5qFeK%pjE(| z0AbYz^>mS&sFi=CJjk{9?TYyr$n$H1ut0YOe@MD2tGuo#t(AKt!xgnE%m&!L?j#wo zM)5RB@>)6TbyR2zdh(3VIE|~!7aIi)|68lE@=m1mlqBK*Aswn*kq5~;v??br>1a%o z+aov*gC@IVxnJ-TWteWQ^afhD=*XT$4--9=<0b76<^)+e#&vGg zah>MjU0RirsWQ{ZYSU4E6Vw5`8Xa0)I?Ugp)wn*b#wW@3py34_d4(XV5k)M_Sg{f0i0@A2$8L6`h6 zbU{#NAXL-nyfJA9ExUNYoID0q#ROcm4>3{ov7?~MUVG%a2$Kzh;)s;QJ}vEQQtH4Z6&nl7B=)7IS&VV2Ox zgM6mXdMH`|?=HA*ycXW81^EEw@OuQ`yUDXaC%FAM59Z0VljLu8bTWMkcaEh`2fz{k zO*#tt{1pLQUqZ5&zqO3EyBL^%$S=H7N}kbCW0N0`f*xOo*$N^f7JuaFqXF1g!d%Hq z$YH&@6eiv%EKmxz)$;C{d@WjtnQBH&PWEG4M>V}cRGrr)8x!vum^N? zg1O|kGCtE0o&xt{dAkI!w)67TT}N8N>?azgVkIq0wxu z2DX5_({!}@(jd<3A=S)VwdlAa{iEYfVw@J3s79E&i`D|9)olJRY(GuZD_jDH6n_QB zhHgNG;#K(n58!_ z`Gw5n*RVz{p#Q6m>JvwotvZ?`GNQVyg-o+kl(2$0V-b#V9gHC$PxL}7h#lZnWBING zA2x#-pO)j`Zl7^n(H3JL(y{0zVfpe4GU~rGtDW?~zjk?}`5|C!b9V!2+pIt_!STXx zo@#VIHIiOhnH{~>GaZ|MU3AvINBD`398sBl;9{+jSqJ2f<=q~mZoTok-UBzbVAUu` zv@N3H?Xb1#=m1Cq6TDNl-7w7A%C^LmdhIILAL^2-wE-iQs+51GDYaQ7EJ;B3sL6bS zf(3Amu2G{Gfh<0c?h>>nDEIT|-})k`1aX!3gI|o64QssNvXrld51(T4Nr2WXpwC9> ze)ywD%|@~GC`?2EMWPA9aSY_&z&!dzFHK;GJa|~K9{j*eRxN)s?-e{Vy2H5vrP2vA zHqpm&c_{GYl3#+KB%$LD`l}#e*XXFDO+1dMi`TPZiCkYpexcwf3peFpD)~)b3)^Oe9Ecla?v|VH}{b9;CA_hVO%Y z#<*|lr32IfPMb4?c-ga3r&9VZ%2PLHC~U-YG<|`YZihWu+<0Vn?1!pJtNqX@CyMKz zpc7p4zE)nkPOG8hBypw8Ti823sQd;UeSf0xx-ZH}L53&6z1yW@Yo5LdLmaE=K$o2C zYy%V*P?+*d=fEL*4f!I=sIIuN*^g>K?ou7qEfIZz?SN-b7yJaV-~mGAK)Y~N&fV%% zQDEuH7_A4!)CE0r0(Fs~47Kc)mG28aoAC|MvRfu5xjbtflF} z)J^aOYDgsA`Z6z2zlldbOm%VsBE;c_(K{vseDe3kJa+i;$#f4nrfkq^(v`GNJ_j0L z&E7l2ZmAjc+qFvfyo!EjKj;ox_RzUH@@ox@J*Nb*uWv%F$BmPN2&jAZ=;+n>46hCZ z)DQq?{?v?QiJbwgW~RCTT~W^%p*Wi2N`zv`#V8}xo=9mfdAkUocpzs1%P0_;zlYh( z;wgZRMM}m2(EJUCdz*?{%|-W>mg=w>meRmH4pu5ZEdtc8)kV{*z0v#6w3?Wl1a7}3 zHlhULK`<;^uP#F_TST3=^#$<^B=zE|aJ~p|uuOpwE4VBUzsJrB24%WQLMu;%mWN`C zNvrAXcd%|uBZkCfFZkriV6mVf0AT>u=_3`D0-Is z-4$3Wi0-`&WWC^ZppOv)^l9EDZ@uVF^`$kxOl48V5>M7bjvK$dJ4GgfN= z7Gexhgnk_=Fh&Ut@c0*{vvzNr&nryBf!aZf2Wy2^fsZ(p;yg4>HtQZh^%*&?8>OQ; z9eOBOPmir2YCXdNb{&&tH#2I_m)K?Shr$l7jT(m z4y0a#;23)dhVGHn5FAbk}N_zL}=W#wB9L1 z1BYYpM>96~gSNkoMVJvjW-L0?6KYHp{&K!p6{TigE_OIjgmpa1gpS0Se)1s@xR_QD zzx}5|4q6gRiHfUrGy*vWUthV`=uPCnqvijANW!rtg#O1U5e?z|YlDFTC~9E9KJm`& zxo`Ac;#romgLZ}YT<3#0*6l=K5s@^xIaoUq>K6OMQ4%Fy(($pNN8cmkfX#sgC_lMb)OpZ>YX zqvKQ>5yygFA>O)wgC0UhhnVagxpjzYjkBTvq`(%6Np;^3)mTVL!0fOq%{s^dLNqK$ z1I|38Nd8T$)4-p#pTS$uc`UP3@(GZ-(w~XFn%*0zcD;ErAWkm0Pr^jaeAmQFD9C0g z+uV&ZTNgyU@IyYfTh1WJoxv>d5n~ViQ_-DRlOnLO{t$gsKMHj3k(d>RC>XQ>2HLO+ z-7PRfj1uOkUm|AtWkv->`7O*)ev8`e*hA0~VwOkJj1F zHDJJM^?|npK3qQ-!YE6ut|O>t4*AOfgs}?u^7a;fzX(tW%eYICl|?kI0!cU|ENJx! zkWiRxA}MY~nxidh_NF+Ncw|n3x3sF^u`I01bTeTNQ%WZA($f$~mWf0tvke$66RRb0*JjjetV7HR#W6}5d3ag%H~#yvCs2p-6Bv4HP_K$8m%Ixz+wYrh)XYA ziv@oDDog?~^^+i`rJXm;gN}Kz3Me;O&F(=_qcb-q-x0w~Srhu^*FwyWDlKRl32K1e zgKMlsTK&zQ0V%9Tw^H%8B^CIhjmGJUBi2#o< zO8}5jFHztH$v)}$wAp@Sf`wo?56pAZ*S>Xx%qQOvFg|RY_p5^^MK&+i(a5U$9XlCm zW32h`4w^7*LP_?4?S8RvHAL@%h&Nr!9!_>6`P;d z@l{YK=mq;rk6D`+J9z+q;Ax zbg7QscpZH#mOgShq))vWo~wZczLa<(jp`GlL zTX`F}zWw|+@oAvochfhk%-5vD+72D(x{owC-$^N%%mz{L#v~fZS^%qeC7c5` z8%4YbR!!A)LAz)mY^4uwXNq(_FAVc24@lg=h?A9LrsaQ; z+49q@qwm}e*1L%pI*kfLl7@Ixbni3w z>#!b`lkbL+nuI>(2KYO-I%WLS^GC;9r-0G*y#F{H&2N-D{|{b3r7S@_HyCz|S)bU7 z$p%QB3&^6;_W{KrJNS88B1W`RjlyEsV+U%FfXas#2IxIee|u4fOURso%CU?EDnV80 z`&Bd&l8uUeIywWI!TDg%Y7@>smA1=KAL{mHRd$p=ZX>~A!9f35BidRG+@_;jyMRv| zu92uo#{blHSVQarI;0xW%CFN;vi^*jyO_fPtKgnoL(8D{G*hv>AvZOI2FQRLlRifU*#Z#;$yoox5Uu%F73YKfZPan2qEz~?6Lf;5>b`gZy zBL?L+IGIJWO!7wpCaSJD57H!~A%9H}5ri(Ziqj-k1~wbcT1XOD-Fq3}Kat|oIGL%z zNt(3!H8}k_Y+j;GIdMdfm(`gVA38@2%Ia}JurWcP+gl6veEjgRDNti!r#4!y6J!yO zI-Iy*sMG`@`Vw4KWu|ph_G02n=8(M8S042K32Nn6Os~!O9&Np%zeiW6TL`Nx8%%DfxZVIn9WfTtuLXe>-(Bfz_x z9MWi)ND@s)-)nIzN|FI8zm`=VhytV?qKJR;h2SO&;Ua-t1K|s^7^X}2h%+Th{49Qx zA5dqIADAPdM!LwY66scXNk*V@TvMz;+FhO9fD&I?RpPkrvr_ED7(u`r)8&`uV3HYK z6jYNpPPwE5#4ne!3%Ud)5Hi;a1}@+&v_}rUu$M6{^g|ubMQkMCA6dqKdk6koelxK9JNW+r;S?1^e3G;66w6zDeZGm4$97F=dI!iq`c^ zzOCx<cYAlgbEKe(Mo z#{H+4GSVozH*)xc%)&+)4B;#Y)sqOL6!sW@hf-QAzJuO!VZx?Fz|9|fO}+Jdt@5m z9!M!`h!dv)Fujx0WPh3mkYKU#JG4>w2ZT^lTD2O(KhbzUgE3h*z+PVkWq(+LAPic3$|Rz~cwqR$ za|B|`Jz6q$2{%I_0e?ioK;}RB&yp~JTb%V`uvsY`mos=nr+XH}Tu^W;cuD=NzON3# zH;B>;=hF^TDM^EcIFpBy2BV04BH1{f0(QGypF@QnJfjiic*Bf&Nj zT)3alCrT|ykwh^$=}($kh)m)R>DrjQ%TX{{glV-Xj2f2~MiISQp`*23==;)N@>!l$R~egNob8A*EL^`Tt#;`o+SYIqwaivY9 zA8SmI(ej9C#-9>TMDes`8zD zml`Y%YU*}T{HlG?p;ZWI9*N$Pw0V1s;4~o!29VVme>eGP@&dpVa37 zZ8(=AVdi6to$mV;5Td^7{UEkH{L{$7n3GxwO`)Y~YCrJUKD2;ci_IMaM*sh*fcnZ_ zQNQi5^k01i6po&A)9Em}r!7hs`w0^Es6O%b;0#!WrM+K4g*}4xw|XgAvEOVW9I~=d z-$ObKSrJei?5kaSo+*Kui*35Oj|MPXo>e-G{Gm&|N}WAGqOiW;ho}~-+a9RX>Z6Md zlfK9U)P=uGDzX~gu%C_#rWmXLxMD0($D0wx99V9h%aw)HtgG7&4L&ff&pY>*aZx-NDzvkvs*@FnQJ=!m8#cO9`K(_LbdD zUnF40$^yKNWiSEWu`S+!(raFihe^;NwU=0kZ%m)K)iO2)EIqm<7_jsSv+8KQ3l0Jh zj(8{7?th&ChZig{sMF>!I)A(t6-oA{KpOo-R3rc*e~4fEeguW2&>W`^KPQsd%8g@OJ0Gm!+oQ}Si>W^23gyM4 zeI<5s|I=a%PX3eH$pz@tbGBerWbL4Sc^BY=0I8AMAxM#|fQz?pN``x(*9J)dUt;ty zj3lPilq#H8wB@wy zPDF|`Hzv=RLYB+)pk3p(8xL3HRInwhCzGx$_&3??RxnYj{9>4IRXT+)1$dCk2T_uV ztpnn#Ox=f_L_B)Dx*S1nWI6S0u%^reC2VeiN7efg-q{0Nw6f~Z{RFTpicAn{YDk^! zhae?r5!^``)pTCJhs6{l%w$rh?q%bIj-F_uf&o)@PK&5PwHi1`m*8ZRmkAAwkEr2y5v{XGQY1FgNNT1C#g;PL~2ZAS<=Mm`= z^)|knNk65lNtHk~o4?1==WuDQCGPcD0Ar;D52T3_m`M^wrj$nV{~w^y4}fw74J*RA zvY2j!4Ot8)jo1~1Df?ds0Nmk58=u> zGv)+a?{o(r;L-VvDtakzN0i&Wo+qeYSkvSiD<3St;VrluCV~3^WVP;Q>JO3rKqc5{ za#^ribNp-M*ZAOpG_xjz741W`FbyehbT*Ih%gT$y*Si-QCT_4fFWv|Kiv_0q_lv(2 z^DneE@lIPB@>qz#NsyV2tk3h=tcje(u=px)!9SjC6nGC9)+i<4f|3#-XpnUb-es%k zEK@)ZI27v=YQ7Lr#O;_?0ygfR{&{OKvzU3j%jjNSdV6K`%R=M2eY5b(-I{k6!f3q^q~*w@3u0&3LhKXC4K*n_DV;k=J2*VI86z^uo4= zE$|7kWMwZxOWw;XTloDP-2po+dc9bsAy6FhUKv<^A@OV`%*2KI<#~KgGx7ZKHSv!5 zX=YPOywq9oR>L`OWu&hYN(+|<(NesFS{?lywot1W?bvjDfOm{4pr6GsPm7sHTnOe$ zhV!x`6Z1q^h%ED7CvySTbW6!!MPmNulraCs))6R%4m@(}2(g=ny{WwWyNn`5ce7VR z7DBh=?Vd*A#>UQLnQjy+M}j6_Uug0;xAvJu#~24MLPC0#(VcjZq7Y%k@-98_dr~&1 z7tsAC!RDUg3u%u_-q2O8R%f0KcDrGp@VL|szzaW^nzAl(m+*5tbePKXP@bnh(7EL& zfIiW{E6*NEdHV9yh@b=FM;h!nc3?{NwLW&xfwI|wdc>1zjz?(v9K#dGbY3lr3h$9} zAJmUpNzNwsnajPw748l?J7Lboe)lpxleN-;$A)t@`h+zFhGp0v5EW#0RPqHZ9evw$lI{Gsj%PVa$%Z3WWPxfGj1Wl zMP$n=qFQC)#pj^QC|jJWwWzdoze%9xW*J zyU3nS`!bB0Y=^lIqBSN zkdfjxqYA~%lN~w}fba0m%`JQjkYX73opAFEr0O4!+qzL4smN@ef$kLRuz3c5_d*)} zn%S*lSnAsuVvk>uqT`W(+W{Qci}TOWf6U$)$9~vDb4BUincE)@E)+kn@Jjd2ctbZB zB_|Q<-?wqbq1y$i1pJxy&ID>dECYselDqgP7^7`?`;0+t;}}-`t(fEM{oPGEI#|O- z4w53IsC@H5<&hPu$-M?uneP%M9-s>YaEiuGK-jO zXHB-VCfiw)?W~byoG5XYW7*Ccmbux^n&e%nBL-S&mp~*5d%8RLcBhhsH(PmkOhMeJWaoy>pg1RWM22mv1q{v4S zh}qd^J%~_t_Sx{Jr$6ZIGdqqrw%RXWPkJ0)`d`{oQt@^kl}_{cP3V*Iz15uANKtc# z9D_t2*}8*N;{7_FKhmQNWh%(093dhxFWcr!D>+16Meoy(0MUPN43iPg3$VjA$zTiX356pfbjs9K<2f(G^ndQYergWe=5{ zBS6IdT3&9U;oYXHAWy7zWm?U5$Ex zqpzQutog`*!Zfw47%U(;+t#5+6p*;DQ*%&g@_1Xhb*8o`a%ZvDT}#iC2?HUFZ(9}g zQ1ZtPii#p#D{wBzHkCh)Tth zyO^;lT&NOst^1q#E_+xi^Eh8_0jF>9V$mE|Km}*-I?5%@vsva4=k%9i^O* zakxw~vQE)9Bp;%h(pH^>1Sthg_cu|&r}B;}dq-7m-vgOG58%%+)jgCrLXqKzPX ztkXG|0glPPqJtR>e6sgIHt^QHU_ylJ;r18OU7;lO<+zZT8j_>WXMhQ)B~Q2U+X ze}PqGc&lsyfZ$#vJ7h&zk3P`d?16$I)6=?v4UYf&kFamja{Kch?buPJa(TX>DCW>X z4pMjCm6ij_=|3-bl7m*ChP9o&)T+g|bMn9|DFl4(JPAZ|l$jq|f7vq}Hg5+P{QLM~ z_(M+m`s7L~Gt92mqfckh>T|0>%Sv5dA*E2*il#qXW#3mA?LWnd4F8T1MeRQC zS8Ts*qdO^zWA9+B&gS5D11`On)u{c_kw z5A|ytbB4U8{RIa(uaELKs}Q|F)~H&K(f3qWWg zYIhcVDu-{I5<1l2uu=OSPJ}sVu7-J@$04eik`joUDpS5nhf~gEa*Qb_ZWLY!Ue?;B z!->NoMPJ8TJof5bt#{7{iVuwvV;6l8Of6jP4=FK%;kP(q;}zODb|o#Lh!EVp1forG z`sX<(VK4Ioh+~bK(=*0t^m1V?V9?4-v#W+p3{Z}$3pwu~*B4Y!Vp2z4BhOy~;m6rI z6r8JijHO$bS~_*lP7be-lCmuvf5PeAN9;%1!+s=;6+W49Hy(MMh9Lg%DM1fz$GY42 zd8rM;HMmb45DFy^-B0j}?a%s@*D(-h!GXtfxw{MUwh5PWI2u@&eRE|-qQ0QY*3pZ^ z7s7Y4g~Fbc9vJb?;}3%?$_BA|W$7z0J^jcA`x2RaUdv9VF`RCu)xiru??xUx=WwFe z8i<{WrtgSJyv>2d)$C!H%A<=sXxBQO;O zXF0$+0|xE76h)oL6)?j)nF84rIAbI`nV9aOolJE z$DOqlLN&a5=_fK#Cg1*Z_EkOq@;jHz5roy9OOXDS%WxFW6A1y*tIU-sZkJu59N4a< zo_;E|@1F@G+!O^DI#v)}55B>%tJOWV!65TIblnb?oA(|x8*zp&+ws-sWV*=)N8PBS zFVyPj%PsKkiEh@>(ZjHhB@Qzlq}cFRey2`2@^}YKN_f7fm+#4Z+!7XyT6dm^oekrR;$cj95yo=sl8m3;5xpM{d0fpWjVnhhm!52 zrxMmZhr-Ej%gKXQb`i;`N`KY2<*+G#qO;BNhaL$;iGN+JVDec4Ni6qPIe8BIe9@M zEd+Y9YjD=G1kbL)A<$8-MtibraI$M~vTJb6Nr>4sIEn~!b`8#z#MO!36T2v7*WhH= z;AGd}q!}nVuPnO;hg3{<4Ni6qPIe7Wb`4H;4USyMkX?iGviFYKX@QCYewSCz&I8hEx$*#famm(-C<&G(WLhEMN;AGd} z+z|}0nZ%Yl$5tt|FeQ(ixHlv#wUW8gF1rRNy9S3^)L%&fXm$+_64E7guCi?e5y@xQ z;HZ;o)4RdAIg=uJf}T{3Mpm==|7^4wx=Qr6kIN3EgVsU;c7U%8N-5+KLTXqeOY#GX~!NG0FuEEK! z!I_7{Igy=vb!>TM-$g)dE@1bT+;n@?ZpAGuu5gWm{kXGSXj5Qow$sM;R!W!;U!Z-n zY=B6(!63T^hyA=!b`1`DGqY=OJhn0YgaiPq%3_<`hOF9p<&NSgy9P(LTyp(&b`4H; z4Ni6q&Q>DZWo0=-?5?(Fnd444sww2a9-g{VrB}_Ly?}k*PI#!rjYp=J*<{z?M9mGT z*wb0=v=B<`la1kQV;Rv^oz6 ztt}D_1{d(kIpc$8=JRMGfUYvKX|7Ry91cT3AN~;&JZSFah0pGrle*Mj;^c(5)a1z) z;T9$#$Hv4z6vQPs-(TKI8@l2zc9rLnA24Y)|iHzo))xt5!VmMX7>OWR)W$^le3*Q zP^D%+2fAE}ejpm3?W`$fJ8MW1aWa(Es@0dWoi*9cnrvrHSuOT(Q?s2l>Y{9C4d-yl z?Xov1Iex4pS6r9mifePneSW15$8dTl9=dA37FUNu>~`RB6z~Pb^=dXzlAX;MTGHp$ zlf>e;*XV88H8}Bt>>3<3VIIzZb`6fsuEEK!!TAduV61LmCS{kLdxjoYx1EpX9;wwo z)|joM1GnkuRuuW6bBS3le(E}w_Vr5Zmp_&`+gX$CtjTuPWY^$i*Wi#fzlvKR8oVBY zd=A>wCE~=50up{C7I>jtsqPmfUYg^Deu+2O#1#u)ARc)d>bM)%dbomhCway_5-ycC zPgf5>k(eO|=Bo+Ri%wf9HK`mwo!i227{fl}{J9_2ZMFG}9Q7ri_otT=b0 ziTy5Y;1R&}6SlmBG(T{qcU<#6=N}Ukb@uobk4;bX^dCOm%&{N#)?jtGry_Km+aC@t zlzS8kuF9pxs9O%m_hwXsy53O19^fo2hqqZuSY6)G4P*fnCr?w|!10S5qaU;UAV{2D zgJX)8^k%;r6;E60YYkWCG5o3-*Fo5Cs_}ZIWGsqk8W!H=|_N;AGd}pkr2& zbwTGHnXJjK!NF)r8g)H-1KeP^vTJa%YjC1maw-h5oP}d{4UTwha#x1jXCAfel60-) z#m&z{={}*$(@b)*QLF44oa`DL9gUwS{yFsmg@&NV!e5_`YrT};*)=!_P<9PYGA6qQ bC(5qD$*#fC|Cg@8+25~*e|FFMbm#v8=uS6Z literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 deleted file mode 100644 index 7b51fd6b164ffc0f88bfd552eb8e808ed6b3a12c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2632 zcmZ{mT}&H?0mn%Q5by~|4CYR=Ncb|?K4IVSFpwZ=l0u3(l{m(5w^`t?gFRxmoje3t z5~l|269L<2Ooc)Tfd*q0pLu~QDY4C+Kb5BK6fFTkK6EUr_?@ictapw)0KWg#>8$@B z@ZQ_)e^pNP%?p1LwSW4DPSI!IMv$JR3k}szQk&-w%y+bj)mMt2rZkH`8dHd!tAbO= z40SJ+nx`G&9-mp7KS^O?dXl1ivf~bMy+ZafM>_fXhs8tQ^8&^wV=IBE0^9FP-( zskv8)CjI8X%bgxa_OYH_iFb8fS8Lb$8EE7YVKb+LiBo?o+nNh5##V!g4)J6nrH?~( zUy8|&8hfifE?N6W$$V4SaDjJ8GBjoB8n>Je&y?;VRy6#>G~~qtjD3YtAkK4wYIFao zXWzy5xAvJ!fB!CVL(ry{#p(`@n%ehSYY8Vou7$=TrC3|nk^r9MFqm;NV+>7AU8VdC zeYWQ43ZYQ(Na%FbX_@=X?u)b6H z1~W(CW_>1nsl27A#6+=kd4+m8JL(vX6hSBSpCcMwlkkqPDZ+bc8E!uReQaO*Z~l)L zPkh3=y!wUoWPm8X_w%OqaAq^qSD=p;&n{{(hL(pnT2FkqsNGPe;Xya6P8K}LPy6u2 zaC4ggGP@JPw)YjI*H&H~p6yhVDo3dABde2xG4=L1{tSErAiF!(`yHPgNgawSOK-SafOM<50XA4u+z#qC8#=O|2l*NcpNjV>vM1m4}EzuS2=(`;y-ixz?V1FP|o=Ay;j!NAtRNKtrsulMGTks1{>LXc+IEaT^aPgv@+ z@3#|=%lLU!)1fpuz0@mf|EgTLCgax+Jqu@|67M;o=~!lKuQ48mE#AcXEt7@XoX@oGws|xbaEtoc}$0=XTyJu3ryF z-$1iw7qIOyVr$Zxz6YC+%(O+tN-`?8UUEm7K40;CUtgqjKUIBv)#O}XX75XF08+qM z(RS+77KQ&~=x|(5oEe8T89Zk8dw9HJBcl(Ux8K^UwONovzoz>;NZl|ts9WLIi zF!zHRR)io9_kD1~(}36pgirg)WMKokVHmB`8zjkz_pvolA4h|0z*BSF{P04AYX0@{o*Cof3hv>WHTv>g)D)mox5z^fGC>KWaPAr}_N z4Zs?(gsvR%m&LLcU*7yI++{>A5>gmP0R}`t{|d~@7vZi_S|47<{Bc55I#aFZ{8C5GRJ|k|4n#l?EZ1&@uGl~WUjWKk8!QhwSL{S81vbEV0$ucCR{kMs zAs6BS3lJWnNfZ-b74lEwxz$0}aiW5~5CK%B=H&5Y&Qv2l>62XU0x?~c1!#*Xr&gZGt_NPp@P)P-O?BMIDL)0c7w7CM39^H5IV{qr)&gH zcDywK#psC%LI7$4XxJbO#&uJ)JpzM+J24JjXBva^tc|DwmLYk!oa+FpQ@*DvsR&Y2 z!I`)GCPf|K76*3M7G7kjEnPge26$5+0EvFHKR!bxILy#!(hzk|0dm*+4b+dpg51_I z5?8)?J!B-Qp!y2D6^naHF%C$goD@*cxCD4U-6ks0%XLm(+GjG!BVuR#>RZb~4G`eJ z9RX)RZ9+|#x|4ziey)-VGH9?XiDJ}RMYp;GCOue?z|oYSL1@xzs0(@e31jTxZ$&8J zT>^Bp4u}Q)0zE{!B*Dan#55RVT>$1+Wed97AU%gTM3_e<(2b9K2(!silNxL;nLExn zQ!7x;9!cxT-}BvUWV#BNw;p0UyS^-SMyg;5OSGNzFQC?%;bUV+^XVrF-^t`6_!)t6Ip{hD*MX(&|QM0`f}I^AApewUV^`!;l$s_u2V6t0ipCs wlqCD*5ua6K0J-VW1>S?~s6VxKncBHG^HsTR=+NVbvR}%~t&JBZ|N9*O14w&%>Hq)$ diff --git a/client/resources/hardnested_tables/bitflip_0_027_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_027_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b1816f47ea5a89ff5a14076ddc4019d70f6b3d80 GIT binary patch literal 27144 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 C#r=H% literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 deleted file mode 100644 index b5555669281a061aa00ffa30d77d5ec7ef037a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2402 zcmaJ?`BPH|0!ArN;SEBTrF+4hjnZh5G`#jg&M7Z)U`XaGyBtiKYZW! z2Ykn|KfNvF9aXTZ6!(vOvKe*y%x^EgsQIEIwL0l!YSL>-Q7Klbw4x#@D(Z67TX&bz zilTl;^xA*qf2ird{{NV)!xTqwR11usi;(q?A9mjQm$SlYk$)Ic&nGPTbzgO)0cd-iQGB$_?hC1TGZ`XUeS$vS`viiEcuQhF<-{-A7S3`MDRgl>!SDU-n%R4Sc_{?R|p5yTd!Ry7rcJ$^QNK2Kr}& zVaEe+!?Liqe&D;Sn+18ICEbkj=ls0)TGK)0%6`9G*kPib*2pam;AWo<*mHG zJkM|Y^sz1v zyIVK6w37z5b*<$ycmoV({Wc33AF?U;HZ#Rwt7y6Ce(G+~#B0*_GuzD0@s+C&HT852HN4G4i-&0mEBxTi%q#radX`{_ub#r z9Oee69qO7$ZU3m_tmy~k)i&zSEkiGd`!HMb(RvSH~d!eWywJlmlukqeh;oz ze(_?!ex70B6r$oeU)s^Ww4{3p(J{aD6(88RaBk`1>qWON)(~|(N7xaXpRMS#<Gv;T8qSa)!hC>7NEgE+mDZ_j8;j))I? zU~BLtqTW*6}vzFRFYw0hh4S`hg0PPPm!uA(#KnfBN;1$742Kb0I1DR_*yE+ zXL|BwaqF`3Opdkh@ra?Pw}bB34LoHp%{J}^HYJ^7gE5Vg3&9Oku9@2Y7c1`rAvj=m z^-36tlGp~6dy5M3Q=J_?`p4x>f)&9j+9SaNpwTMU%Pi&~T+_W2B5Gw2GA5zwWyt92 zSPe_+lYF!zxpzC~=|FIsIT69PzhWCEBW;WVW(@mFR0yAq`{)U_(#)Q|d}sfS{x*g^ z7k4;uo1*>0gr_}+A)rw( z?O2Sh)s`owv(y0_efm_QB%Q8Bnp}(NfKL8ArN)&i=d%=$-=#l+%W)hWg2~e;F{$8U z@V0rlF;T`6%PR3|zq~`OzT!Q4iKra?Y~)Hu>j}I(%UT?Bo{o$X6#v8yG3ECTMzheh z0p3Dps!a@VRj3JItlC|B=i=tBi)taKCZGwJVvqZ@)elpDIf139hSw_t2|t#`t#-dK z1LoO{PCr4|j?7dyApKl;Y}8`)NA$eRz?ZV)G~SbJ=o&11Fug1q8vf7$&LI?ht%?svxL ziCV;25|5SumOiUv3WKgas>_GUpQ70CIl&U#sJQ*!j8bWH`qY*rfLAjQaJ7g(`o)-BsP7cmf-#PtfHEZMB4 zKb(8Wk7Ll9o9j#v>9vVgBJ$g>*1Wl##^AHK?kr2@>mN6C(Suq|7iI9$4u`rgy;zL!?D5nRD_nudW08QwdY|GcULn{VtRXm#*W1&3`tCNU#X7fa9 z6Q|5$t#Z+&^CZPv`RJrO4e5%76Jh~3K%fPOTBz}1J(s}Mb6RYFI>85RZ#~o9rjuih z({;WaJ>d6(1i7errqIk}=^7qnZ=pmZk

    I;EhrlKp<W1i8@zrNPoMc%ATx;)6c=Wcmt&_!FAp=|Gw40*ylSk z{@S&T?BMYk8mEh>&ABjd_Nvl2i2`d6kE*i0hopLC38r{ds#f)@%QK9nM$d%YmW6VN sw9MG(J@QG2CL;Fw4!BcX-Q4+FT9qleD?09__kLe_%Ar3dy^(+9-#zUu3IG5A diff --git a/client/resources/hardnested_tables/bitflip_0_029_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_029_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c5599605a5544e38ef81ef8acd870fcf107c39e6 GIT binary patch literal 27204 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 O{}*yaI8cx`0uTmV1eR3* diff --git a/client/resources/hardnested_tables/bitflip_0_02b_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_02b_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..d0906edb9e6e365542178b40e15a5df4d0031fd4 GIT binary patch literal 15338 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 deleted file mode 100644 index 54170b83b35031af02b477d6a26d694d3528b39f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3826 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 aF7s=|nY_g2^WPuc@(tWNa`m&RWB&_8CrQ5m diff --git a/client/resources/hardnested_tables/bitflip_0_02d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_02d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..3c1e1727b5c496fb033f6aa9b9ec805e7c97fdff GIT binary patch literal 35762 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 deleted file mode 100644 index e20b10f3d944a193fa743956d646b035b01a5634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660 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 diff --git a/client/resources/hardnested_tables/bitflip_0_034_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_034_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..f6270b397614828b9959c302670673a721533649 GIT binary patch literal 21179 zcmeHPeT)@X6+iR7cG#Ua2Npt~Z

    XUAL6wOF$&F$}|eaupn8nt_9oIvY?h_vxx*N z7PxIzEGQk5rTc@7)6Z!qbIZEQN)@N}r z$10&$V#K%o9`Z4JKum5{V>H#DGkaUpw!GiODFvR z&?mmjit8{!*Z{f{=K)uc%4proxCVR2fLupJ5>$6!>IU%iD}Z#58Ha-|kh_~zCc#v{ zTF^Tk35rvIF|T#TSIyXY4i^|chcQqFc^DB5DnSL^W`I^f6anLLHHIeSE2n#mv=|OC z4EVofnuRfep%H%_0FZx(&^AZ@6LIpjvH-$TFn2mrtNtoeSJBu@oljjbsvB8t20@q@ zbbCEuaSlSAm^|Wha%3Q$?gnGSRTRxkNe=g4huI+Hff{W8$n;>nn8(dkhEQVld%|Mc zR~ZrU*@(x|IjvJni?p5twY2*V%x>YFizlm$)i4!0x&crKTUA)VT-F0kPakC}%J_E- zEPuOrGH6p(le=jDEQkHC`|u&EU&Ay_PXpPdvHitEAHXbNKr9@eDNTcr>3G#N?{bjd zB0f)0~9Au+JR%4rcBY%#3^L zSB-VGz-e&y2&ZTUtB=k1ikrOfDzV7+`n?r07)BRuLVGnWa=<@!Ng0Rg}6YO4G0R`;Hj{%%qqbVB1q^uQ=U{@ zT&-vp|5(qodMyWcLRRM!*oR&q?gjiBVw!H~!_Y(hm=KynCZo4Awau;tYyoAj)e8JCxR>dXmtFdy>k{vM zc!DR1WABgL7qEF8ic3LVX~`}KS84o?qoztfF3`4s?|+;5O;9o{?To}Yb9tvQLp=mY z;N(7Sm@L^e0F9&CeHC&4g(2{>!ZLW#p9L*rzA^Utb)!ybdltkA4DI;qBz*ssiUA1r zqOGr2VGT;x0%k-rKb*{($sfQV1hXOcYvIrZvP2~ z6D9uN2DkQ}VYOD`e=n;e5=L4vdSj$y*QDsfFG>}Y7OQ_U4)0Pd8s2meB_kA!QY;P; zf^!DtD2hcyG4Wxfwj?}onua9@bT?D8$t0e>)9?l}E%9cI8%f0&w~FYGAojo^^UpBV z;#vreY;dMe@Iu+FCwY78Of2-GShyGyBJPYQ{JqkJDUg<^men<@fbDA5&NdFX1^ZE^ zuBsFhD3~(81&?=>O$g!7|2S}jQ@AjFWP7dOM#|bUM*6`icq-yVx36GFc_3>_gnFDv zBW1z#M7h-XqcKKD^o zjx7lDYv$VO(N>Re47jSem#rQ@g6c7gFo%-RTZSz{^ZSOoW~xC+=lul%Z{<}N@O;(4 z;ciq|AM9=!{f^TdOy0!m;jVK2iGum4Z=b{8AOScBm>P&x!#1Yh;r7z`5)udW&{7_Z z8{A)@2Dsr-sWeg2R&IMPDKw+Im7g=cAy=dNdkEF*9we(TY-M`uw5wKnCp6E~S)>d~ z-Nai_fDF+jlm|0ewSk-V*`WV43XBhUpYp2V`pp`2cf$WM4Oia zz)V-XD~TG$ltK_HkK2~3sw+8s-jrF1^oM=h14Tohwjo(*3K?g^7wT!-khBd++mPIC z?gUSnoDaXS4auMsB4m5gHY9CB(l#Wk>PXv=G!0MNkhBd+cm>+{<<6?f8>#U=%C-$j z`#9S^&b|VVvu#7ttlf#8z}SYQZAgwzWVRuR^nSTzlC~ik-6-Qhwp}6FjaIu|AsHD2 zz8}DIBs@-t7xLK^lJQ-FT_I^#NX9;5S4iTyqFo^=E7{~@S4e8RLej2~M9E!Qt7un9 z%DXjoh2*I9&=M@|`!)9c8d+I>>llll{*NDL+lHiVNZJ*W@~)lq4eScZ@xHfh8U& tgOvV3hHXgNhGewp)mD#JclBr+lC~jf87P1k+D?!UfIL+}6q literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 deleted file mode 100644 index 1a354ec8a441b7e60d1c5d2e50c2669d27a52b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 924 zcmV;N17rL`T4*^jL0KkKS^H&50{{?Y|Ihksz6}T{7y=8hu#BJp1CT>&00IjT0D%f9 z1E}B!UjP6A`Tzg`06BmHWWWMpFiatUBLE!00Wx3#FqkF~z!88BU;vpg0GLb@2w(`n z2QUCkm;g*B34|~NU;!#oh&0d!fMPNlG8zV$hD|aBB`88BQ^`FVnrZ1YG|`A?(?-%^ z8I<Ji*3uwGKUWrOvGA&M}a1v-+3BNZ?f0g8%w2XJ1Z;XWYpk5N4Z z@0XCT09+#hV!Iv#7-4*c=`Rs=Db(;U7{}5t0w;(%mtgK8!-sJmvll}QaQg#?Lmdl) z9e}$SdV4h&b7+8t!7l>l_ig2+%5$hhY^N%>} zQ|b&S&^_Y}FnEQE{|DASqp3QR$~Z58@G)WblgwU0i_BabW+P7{LmpBayUzd>{_V5JPe zDhvQ$0F)3u1+YUPXapo5Kv;W4<}YdY9|(BLdQZUdp2Ml|j85~10r{Aops(CZg-#WC z%jOrvUlD%t#ojLQbD?(=mw32c3%p!9mtyQVE`q}y3xgLz>Nrk^L;eU11&Ms+U-ZH; zFj!b7BNbfR2Vze-jv3QgFB~0-jR3j98d4SQ8MZi0 z4```k!A1NqsaFaTsqvN+N>(lrR9ImpMl2}C3am+lm4L)bv5Jvkj1hujMkR@fh%6={ zfr&8-5@Hyu5@4{F1|qS9V*;@l5@Cs0m@F(X7!wl}V!&enVqsy7Mii`A7>p@lg0W&^ y!ZBe?U|3*cVv5EIVTD-1STT$i7zP*^Sh0m+hA^bV5}3u0{x0N-aG@dg%9IAJmVe&> diff --git a/client/resources/hardnested_tables/bitflip_0_03c_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_03c_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..f89025de1721dd08cc4d4e0f3269d2f64ecf6811 GIT binary patch literal 15502 zcmeHOeQZ=k5T8fyuGjYZ1}v6RXs>}%jYS~{NQ98HiczU8;s*vRG^8RLL1IKqFtSyH zNU)N|K%+)$jNuOj3GoXNt@sh61pUj4F#!V+(eSARjVR-9_uajFcU&t?3i!vqSTo%zkq^))o==8CqZ+g3~?S{j`rBuQ~-oc>4<;)FAjsh~5qx`=D&2Bzp*?jaXMm=KkJm?AB#!jNX@ zeBB`(TCUTqLXBvkJF?f4UIs&^(oy)TtU~WvR+SaFqdijOc~-^cPyjq564sI&WL40@ z6c$mK|2xyA5M5tKKvK&pG7Kw<9A&D|z1>U+eaCeoo~)q-ypKY>q{IQ!dQHO|rJ;~| zj8U!2s76yj{<>aGUnNju4^!b`sIlKLzt5OhkF8-x@4zuml-DtpPK60q!3-f*!!HLB zK0^+;O~f>Kg4RGza!*KWx6|E+&d3aJIykJrYOrSvibj_iQgjw!<@r!4WDMAxQc2`7 zrb>}Qm#}8#S6Ub-e~}0b9m6z{Co*O+b^%?@cEjYLroKmWT8KVFJOoU%Om8raU7RtO z8GC_g;%7!@^N2-_5P$e`iyY>}xLT%q!QAfU*pnGBLWH-(YvFY8t7@i6G0!c+(9RR^ zR%ix4h{+O2wK>4eEYkpq%CXQcaDwg?;P|Dqf*hWj-tLq<+N3lTpQ!9MqWS$IP;9cu zJXSL!xhn*yGt>FcVMr2 zWzdfSIHl)%Q0__WmZ#VRZFGY)KC8d}Yr!F`whH!qCBo)?e_C$i8(1F%&d1>YVtVZ? zB7iOs&x`(S5k56L{|G!dYeMkhY0dHg_yaS4c!gOf;6)QCU1W z3q2Yu6IAUEhA$P|5B_kL@JAJ&U%#T%4JzS8B>}T0OtDCPBv*Ysq@F- zv6o<%48~~7GEAAa_UK%{0-OPd%CkVq=j1hh=AMN>nDHLM0I|+MOSu@E39yK2w9`&= zOe0_J^&Hb&^wqGsO+!Z~s~y(+tYd4s&yWr%ALoZ2-oPsNw{x+9jafD}^Z$Tg=A^{n_czQ}) zWJ^J^Dy?AE087`HnIdIOU3;0w%zW}0D{PF5~X37RQF#!H~c04c*g06T}Y%zOL= z&2a?AM-L7osVkj3sV&`e3b_+jGP!eev)hHE20^U>PM@DM?S`~x_`*pDhmXyiHgm$M z2QqU`WIBY<{1r#S^w~6jv|UyhMnZ@IuM*CAjW?{ivgup}+;^--xB!H&&m!oK_lb{b zpg7BWBh#8XR?h&@X8VxZ`~|DV>8$4J^bHIQr%pvEuku|fj5Sz_YGFM9FAv13Z~$Uy zAa&3(jbhb~jM>NO^IP{A4u5Arnl49j4@KKqy^TW-fiI3L+i-H(hV#w`#y53U+JlVy zpAS1FJ2G^P#riXG>xv4s+Y%CIzaj8qGbl$~w=kFjoTiOWS61_uEK0R~YA2L=WX2gW}ooGi=^K*W?4%Ix@x zRaMl)R&B1TQ|L!EFOO5oElr-2Rvz+Mu}0;PkLN+H5WfdPg$fgsS~+cAc`VfnRpeUB zs2;?r=Akk(L~GSamdURQJ)1lmlDsPYURo^knKb3qWTr`3zA6_aJy)7c<}_8AzhJV; zQdzcOq()eQml|S2tH7Gpt Cew&K` diff --git a/client/resources/hardnested_tables/bitflip_0_040_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_040_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..016ecfe67461561c6ebaf7087b6c1f051ef62fd9 GIT binary patch literal 15230 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 F{{S7z=AQrn diff --git a/client/resources/hardnested_tables/bitflip_0_04c_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_04c_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0ee52357e10e89099011e21ca1f3769576aa924d GIT binary patch literal 21042 zcmeI4e{7Xk8ONXZ_TJl4Zr`UXZPyj(y+J_KItr|V=rC8^@FqZqgw2K&Q)f4((oGRI z+(meuj>N6FUuIS%6Jw?(YJz5&u%TXwe=HeW_(O@y&^3{aWf6wDn2C(D&w1bbqqi$9 zjU{Sw-lTos`<`>2bI$j9&i8rFx#!&YytQoupFfmdFS4Vz>0e^<#*<|^ldBW;BoS{H zf1YSouJGGL12M+zNaq8Ym(B&UC6%*Dwf4oJO3avVXrsin%S&lSJj&Orct1>t|2SUSD(}YT?b4->;bxByI+XgP95>lha^81NkZ6{ zsFq%*o&hDANLH>|pd)wJYL%uNEPQVk`)15NAQfhqALr?3ln6Br22D0sDl8BDC2-6h zvMdA=vNqG%P*yC$^rS7s^$?Qi#UehZuD88yh_DM~@$X*Jeiwlpy{e5Y=WP7}ip^_D zKHCghbLce5U$+(+nWYX(OX_xy_x&M;do7uZr`-wuQhc`hF;9cd36))x6>~?3*!RmCdc+T!5q?yqeiJX>LYCRCh2h&M zw9P_akS03&ewAkpZNe^%hIN)qdn7b%OtI#aN`uu~ARiiq<`6L4hp?M8NOt=N#D5ia zA|_T;(AJWP1aWI31AY&qwV|Cy+RwlYRQ4Ei7yUb4Hi55dwsj6YJf6;Fy|pD9xPn>$ zsaj{K9z`s*_C?dbqOx$X{unx7U}mKuofGdPBrQ*yKxR|l;wnA1YA_>3UX!tQ0(AYz z_;pFIAB=kNVkFv*$OMh5`(9*W0a-6{J+5-pCVhbtaizZq+5pf=?f_jL5L6HYwirNQ zEkdjYk#_+8LeO((Bx`41qz4=5N{*5nz!F$2k2RvmTCq~CyL`z^ah zy&v3jTps+-Dhk+zS@*o>!T`lExNe2$oQKBLXN>254zS zVWW%udlGeh8~Q;@-!;Ef+0Da23jg>WC|HRY|3UL7m8XnBZSBDLoquxoRgQg8rBJD~ zuDXR4jDZkz?<%(lL#(S1LUR=%U^e(VLH|{xAhn5fE+aKlVTP^>GjyJyZ5L1xje2Qw zIPQY@J}dEgxa)kG^@5t6A@gRvBI^|$Y>&!yjHM!5V2#8ImJRofA`BZoyou-{_5T(n z{a)o9W@cj$ztMw>Kb0&p`uPHbZ`q7XZwR zF~b_X7mM=Y#VWmL2j)yc<$+gG`KpPWLC!2kQ#b1rj6hPSY4Yr}ncNCSik1!$MUD^G z^wZD`g3!;r4n=M*j|PIClpS9-Yzr?uK%3cQ--g%M7;FqsoP&Ipr1rHceKuhSPQ!vj zOay?&yjU52HqHq>Gj@AVDbBG3H=ehExi+4#t%C_Sl$oD_ox#lVD!(}p5+x&Y;|mdG zs?CkV7(m@&YDo{izEfBW1&6c6_)H(uI)3KmWB5@+FnO!tSq4$a%>^lBgtU0}Uo#tZ!5? zUl06Maw5~fd@7F;g- zG}zAc>%t{Zcydf1UI}|cDDM&4jPc@yFzsXr=qHO226O4448VW*uqq6|K=5kAzl+aN zzooL3F87Aj{e4tqWnb6{DiK-#6JawM-C-bfuLe(+3|r+8IB&$W9|Gs6%X0uGP=zBZ zhc9pkeCa0KZ;m1YxAGWb?N%P$%Ht4oaJ#7PRvz8T{cG#%A;F(wBK;O?p7Y%%476BwOe^~UtWhZuFAj1-Iv$y%j;?T^4hIDR`1i9uJ2mh z%A;F(bSsZ;&!gM(c*);eyFHI#kmvS1vgyO^d31Xo-JVCc=kfBMOYq#DN4Mv(va;g# zJc5PW^B5V#P;qlETcF*snFtcM^5~AuOy98?xAN##9*?WIJ&zH&x;>8^*l?$<-Dzuf z9J|xjV-MK5)7G4C7>StD{-A(6ZS785+k=u-I|?}~;7(gJMke?j26x&zIz+c?gx8{lwfZUvL;NB;eN2^|N94f+{&X{d2}m} VWnR0CD~~(Zg|!IRk`MO{z71!dD=Gj0 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 deleted file mode 100644 index 3c889d07cc75ba1944dcf73cce55cd0da73b48dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2568 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 Lc(o)tu)XYm{7RK; diff --git a/client/resources/hardnested_tables/bitflip_0_051_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_051_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ae0d8a050b71752132a01705a60b2ce4f114870d GIT binary patch literal 28974 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 deleted file mode 100644 index 751724d3d866193c6811d7a55f2d58155109fa41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1356 zcmV-S1+)4>T4*^jL0KkKS*>MckN^}4|Np~X9UbwXuQ>>~;~$8Tz#qUJRS|$4T?hbx z062g_?1|tBzW@LL000000005QKmarv4FQ4xXlbTEG&E_D0}wO-aL@n^27^FgfEpTU zkPQtQWB|ks030*`13{qB7$63Qnq&h*MwtLH13(82007WvGzJI(p{AJt(9xzq3_#EU z!$1Hu8Vv!00BC8ZKr}RIkOL4j02GxG0!)dTDY9t?r=%K6yXP=9YzmGekJre6QNjO!Qe3b z4#CyY_uusDb~{E#z-BSPz2W#qFGX@PN5F@W9G;jsDp+KfsFld9j2FJX!!yi%voEf@ z0q+cs(7Ro%&v}j&!}1(B9Y<09?t_JQrXKnE9m}ab)2dzxm&Cd+%01UcW1`2PA8_E8 z0&pfrX?sl1@m_Sv&<90T!e1+d;W{tUW&0eLd;>MB3 zJ>l*ghm2jR-d)CC`D8q6m5T|&#p5p!c83M(FI|4~qU;Xy4&xR%SmZKZAn05UjAH+T zp>XJQP97qj$$U!&OvWDp^BkNn&Yv1`y0WtRix^>+84swuqx{dR_gS4$`JbryU89rC zcZ0F`&JF`Fp?zb3_89vsE*@8j!}GuO!`MYXSGxK~rxiQh73)*>Kc>f1$wDb$Pe1oHhjIwYX6R`G|`Yukz!1o_$UtLcHn7DBJ z#U7yX6RIoK9IEk?10{)mwev0xrTpq-#lkXUEKJ4JFpQ3=)qkq}FO}Yf-Yc+q)$co= z1b8LYaIcKze5OuNyo$Y1h8>1j%PtNKj)BNOsgyA#n=due1Z zC}Bn&33;AJkY$%qPmJa19#ZNu`QEd=JP#W323b8f z&~S7~)qU5_@}Gt6zK8q1XL;ZrGbUUl;futaj#CUdRdVE>PdeW_vDj1B9jhEJ6^2$> zn916*xHudPBABl?2wWt{RK;agVPd70P%M>Ul*$ZK6-y*!Rgr?GNXZseWlUL8)J90e z%4&=mOw3F&OktHWm6lAH!enBsS&@Ze$g->|%*Mrv%Sgr;$}AX6875372BBuDV+=7F zG(m={88WOH85mfm2+XC7rVOF07P3*9lNJ^rv4%4;OfY4cF*2}>VOYVHg3K|IV=EXF z7|bRzOtM(TR!lL4hC*gc%2O;xF^r^TlCvu^V;N&GLoiIj#tE3S48kTbt1^`tj4?|e O{x0N-aG@bu%E=&1w`zX? diff --git a/client/resources/hardnested_tables/bitflip_0_053_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_053_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a1d8359ae4fe59bcb9690720bf9c4d9affad6263 GIT binary patch literal 16061 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 deleted file mode 100644 index 1cf3f2ad935916102ba1f429ad761ae628fdd45e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5503 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 diff --git a/client/resources/hardnested_tables/bitflip_0_055_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_055_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a7e1e35228da266368e48e1c7eadb92563388885 GIT binary patch literal 35521 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 diff --git a/client/resources/hardnested_tables/bitflip_0_057_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_057_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..525db3d7ef091d08359b0e070a268210ddbc355b GIT binary patch literal 21878 zcmeI4e{ft^b;r+JY2~%Nx<`&gP%QZu4vCE|OG(5S$C0%mv^154th8lnjANxSIL30~ zbW)s&1m<%`{Ug6<9p9N_q@BRep64=rtObk`zInBZ+r78@sZSA&~-8| zZ@K-IdeKPcw%JWqV|k|@kOq~=dtXa!UZ|01efV5T-7MP7R>^ojs*>$#>pCelyHu)a z?|)(aUWD9!Yp_ox*Up2#lZO5(o@lb%2-(f`)}&pf(ff6j6(pkbOo&^}0`EID&Mbs_ zoLy0>j%!-2&zd&xC9{>nIMbt21N8>)VaYw9an*d4CS%1nYMcw))%yWsl5w`d=DjNC z`Xd_G91lZ#kF2$!U9Ept7`QDF{zXXlCOqF0${(UP)M1V5CS!Da`N`jCJW;caVmj5r zQ^Li9;|Kf<_9?QBPsebH?-xuMrxlI*Qi($IV11LZ>a1 z`LChQkJ8|2l`e$NjaEeUeup(PHK3RJ{VH>iw%r(Jm^$NOu|3$eC($u_4cd4&LMIh` zUg83j7%ldBjc;I-EX7Z$%nEJZtMN+8X87F*c&o}~tH<|F$jo)}F_o6b%Y8!Wc`D6M zs(kKfLeRrugPAI@_zNdZDtT1&#)Jf)aNO6$AkU(dHkA(ael-mY(U($;30%_l-xEcw zuJp8tdKg__G%*2A62WdlLKjF{D?`+so#%&wcd@@oZz^d^Xz_(P2R(Q_eiPzQUl-qqo)otvWX- zJlq1I1}(@FnEwhV836T7IGXKnHBx=tC|B(XpV%qapv9<1>t%x>_-zzG{uID;FGFS< z)4a&o#YXc`apqQyXZ;bV_a6dx-aiiutyBbeb(K5uK9%cMxnYKR&km}pps>pA{s2-? z3LlxfbhjuXtk8B7BZK0q??47cofjDc;OY8}Xz^a7TGdH4(9iN$=lugJ7eF#kX~f8R zT%9Rm7mr^pc@w`N6k&nl;`yk+Gs(}#Rt3K-@V|=Bf^@s0>1iSGUI`O^pJ@+}7mTM4 zWRz=kC_4*&wsOA+ue-vmwIW3yozG*>NR%sOb9$fg|hA2{C2{Pezu z`G9yG{)oAldg;?b6|-&zv#uER;$^{m4G_RV`ctObW5&`+1}+&@2L(hlp{CmBU5pmr z@I40dEm*+ZOgxiuGmP*y6qwt?2n`z7&ShTiG^a5@;X@_uzHDx?W*fz*uh#pSFbcyF zT92!*F+}9W<+g=WKNcX6SGgtT6XG88LXpnF!zHm#HXv%ddl(UybuDfVvO+n={Zhm3OT-me(ME zac^Q-L;WFb%!hf$e9o=X!I^)}w?8zFOsIwa9Ol85Fwlgk5v^K$&TtUf@>N7oKvceR zTAYOd`6soA!Q$u(IMSnG%q!vXK1B6Ez^nvE2y=zi;kTgxoy%c%X`jjvwQqr&UUYRU z-#r01tkyeSOs@_Af4~2ji>qk5)wNgYaP>ls^IM(SxZ2Pb=Zu<4+3?zpH23O#-lP18&`IDjV9pTevOrVg1LLQcKez#TROt$QP zYaX5(_NbiGW!22$z~Su_nCa2rhgIIH++uSJZcKetGFFp+4^&6TpzsQ|K})ulv z2-{d)7uxvKdA#7|5H!vLlZ$O;WqJ%CnYk>#txVC1+q*vS`hd#pUK=>9!E^eIeuO+V z8(e#&!`7|Edp;XrIruaed==7Vf0DSe0E;}j#K!|6+!UT{Cy$597+a92<%w~qzSs#6 zY+b1%0=AYi&m;2+m#7S!r}DRc7-xjWs}1ZQ;rk%tjp|6UP_<}$GwkHCLou3

    N2!S z+yf)61HeP*%jrFC+zp_lE)f^eJ8W%I+X4+r(V_ItLOQ*si5aZGe*E|skyuZYM1rPi z(oT|t&=cu8{Q!wqq_0?{7)Mm+GFiisV8~Dopr61XDJ8EAVlPpCGzFly>PALhH!)j- zYot|RayLSB>uQE==y0i1oKOHI>6Dv|C(K$f-gIg}KN6ne@0kXaJiz3>&@9NF>YKKy z5f72#37l8Fpix7|+D8_z0E>E$WB`lF&7b!OG5;hQj1E6ulZKmqla(7XdMoTEvKGTj z4%gLFm89s@$pIjREND}SMf@Rq-vj7kEEvXsJvNDwFB|qLd2&Do;c_Plbq6n$psD0r z<FfP!d2gZT71CkBc}JX{I+r|>lwD8qsvb4*Kv5Y7fOH8v zO^cJ8THzL@fP-NO>VvV>1Zkt_&=z%Tv(PzfxkPZuLcNivWR+z3`{?V~Sg|8AEL0D1rB|jy)!^pkVLWb~b$_n$){o(OPd@|E~=lM{4QHt(FQstA)mO@}afoDVE?Obl}8Q^PP zdSg_{%;k62nX;NUUBRHV3(V9tgBWRTUkRVYIuCNivjYSoX zLwF;=#`z)b~qtO5H58Dq}L&07KzPZmV3X0F{DJ2-Ij?f+*6ZGxI~byAl7g zPVAGLKsOCoyd&`yNA_&4dsR!((<%VfuSoRFqm*a>J;oorYW%>yP0tYNDm;9urv;6M&rT0 zm3ux}Rlo{<%kE=w(_m_QG6Ov1vC6nQB~Nau-HV4gFlqNY@qnB3XsgY_bi#~ZKOC!M zDiJq6EDGICe{vJu(aNKh{7o}hzrS8NotaBaY$ZSM_TTmU@BmGJdM?+r%kER!b)=^h zxcUhkhJ7eGDXN5b@0g&uWI#+jJdvs!9+|I9SW;Z8hyw() zVAR2r39RBsg2-ogShBR%}ipLel)zRaf;Qg_uk5Kem4YZ z6v8Cxxj+_g-|sxUlx?iDWkz;qd1pr)CTWMAeN2MMHMrwwwLRh|ZBC5pPNF@{llhB> zN5Zbph4)Qw&-jCF#V53w^2vmkAuU8d=D%v_F_j!U`L92y{{wiYEJy$V diff --git a/client/resources/hardnested_tables/bitflip_0_077_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_077_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..4e9d451b5d965d85118dbc277642ee5edccdf55c GIT binary patch literal 28775 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 diff --git a/client/resources/hardnested_tables/bitflip_0_079_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_079_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..3b71ddcd2e6aa574949dc151c1dadd1ccb5a992d GIT binary patch literal 27204 zcmeI4dwf*YoxsnXS0(1kjs=>y74>jDQg$(u%5bP@4mhJ_)VR>cVAMa`=~*C z_w`YFj7oaS_-fo>Ykk$zD9>6O89aN->8h;%>@7((c<(;tjTp3Ghp+gv+GJJv-~~IB zS5Bu9Mn$ZBz$*^zF*5iIy>-ij6iEUYS{@2Iwlf#~3>$EsZL-eNq*1 zVDOb2&ST(4x@2W2ZF}gfmsV-UuQw`vr^&0jL=|nkl30R)qVsenVKQonQOQ;O*$*gv zZytBn)*6+V&uAkUH?KUSdW>_=zwdzMzL&ip*sYyuREEoDeX;T5qjXl*cZPn7pTr=e zdjFg8Bh$=gW%!+KRMne|`7cIwvx7`N-DLdeA^`0PNJC9F`Zygbjf(%$s9GAOtt~Nr zYJyv<@2xhffu-9~4D}8G$@K$9rE0kEXH=grgPIGB8fGm(X60Y`l=9>(qiSxHXAxGj zrYz3zjSeAdq%?U=7BbAJv*l(Lvq8X&{W&YB){}&+HAW4(gxe{y_?=p4SS4-04bAx3 zWA-#&4A>A;-@{)ZJ8})(-qn7DrJhDlYnPa8pK7jt=DH{TF6c_{Ye9ekn)TrK8rPJE zut1#F%_{}z?-i!AcD~@ED$Dh!)j5tAJ{@HmY9PQrmB`-_`zXyJUSgr~ubU1p&M|7S)h2%f z$n;8#%H649o}Eeth?^Ew&MZrex_7)$CD1TF7ru=qW%3-0Kp=8PRoFbZsL{LN{Ag1u z2>|6yW}S+POhmNL^wF*Kf10_M3&u|M{t6L&&~H)QgC;9p47V9(?)2(|5Dqw4AWuX9YUq)u?AhqJ=zkl+@iXRb7b8RFkI z>bTu3V-ah;!1�)C;ak{>0=^9je(r=p;ooGgcoUtg;QvITVQK5n(}zz6^V{aSUxi zXV1|rjuGNb`W!*vRL8d^h(bgFTnr!h0P&B79@c&hKx-LqtGQYF^#L8QJ)a7o&MKyA zENSCHINFT@Gp{m!f3OA%iRf-JYRpvlZwYu{Ig#=Fjt9Vn40e~J$FmUb1CvJ{{pfrc zqp#B)ndnOGk2K1#iqtKTW@bBS%2~sQJbB%ye-NyS`Wd#vs1^rYA|U-9y3J%>ct3Wz zkjXAWaxWA1%EJr2IF>0rb#b+KX z1J%K8mB|k*0bD57%%I)CNxKeuqn+GA$Kd;RkjTj1kNKr_Kz7#fGNig6obUNp_ zj(%H>I-k}R_A^FZ0bdRIDcWSPQD1n+sG+ov+ba(^TgM2!#OT%4340?0Fw;Rk-_y^{ zFzR#eU*s<%t(__1$*)Bz@cBMG{=AIDtVqY(=A%Z}zSGxjM!kv@N6^pekqaD~sr*`_ zW=N}1Mm@USE!eX5lzm0UY5$ytPzs+9m#0_g&1nr&DE&+Q7X_}%VI+UcdZ$5Dt$=Vt zd(ZtYmWi^vR#!w!vnp|lH)q!vHOYQS@X>p}_Q3;8(TtZ+C>?))y}(q3Cuc(f&@O9N zgF0GuT;1D-HJIC3m6b-Varin#`V=jeJ|7&0b}Izdoc*I#@MX@vY}7h1_R;Yj)3se0 z`RmU{{ij&AUT>mZ!QoRpt(s$0zO9wB^bmD`V`Jwx35i$0l2aiq!W|LARbhVzZFbWc z@|+lSPNLWIh)o4HN3}Y2cRWsoa(!6X>DDeqoJ;kl2v3J_`Jz#$1buJTN-SAMj7xf} zr~_|en*?A~!s6<~uF zZ?t%APbu)>fsfena9UpMgepztD$?RBL@(hvWQjjb^X2@0X#Dj1PAjhx{CEKzc$)Fi zv;^dmSA~cfE*`?R@pnR$NaPPf7w2BbW)~y?qP!)`sx-OsxKS59jFAG7RcFx7d4*_0 zxWc)F`524ua0%59q@%TqQ4B!7ze@-f{ui*@)iG`7i=4gHS(4o#@>ODTy*v#EsKkXj zk^lvLQU2utPe!1E?=_moDunyssmSPb3tFNND{{ITh59%x3Y72zHHW2~k2EHgST)$Q z$O!w>zS{L2ai;{DP;9vf3p0FSH)VOA~xQ? zh}C{>tMR`9p?WiXh6Y%NN%qU_NL;M*1Xv9hFqX`v^u)GN+k6>cEa^X>|7 znC4pw+!c&eD@NTwMEdOG0lbOn=Cv51T0AwY`VPq1KTM|pGy?&`S?HQbzn3;`EQx>A;aUh5{^ zto;K{B%Q_Wa=xHEM*RsnLQ(Z)X(0#Sgiq)pjKOQcmsuNa!ad29dr&`MNo)o@st??h2 zV;)4$?iAZo6dEa_AlF~Te^nG3H4@eVJLW4f9LT`~0z41cVKve$el2ULdKX@Jjm5rF zkY9Slgf9Zupl7jbuozB7csqqb`QEiG^+Hjae$C!N++`lCy7ZF0Y`mx#4}I_dM}iC2IC6edN3)P zvx$YBN842pV0FM&egTM%pU)WeUvf8_1`?7$Ez>IYImm+$kr=S;A`*!MW)?z`d<@(Z zitJP@xN9gfU09OOyXX$C_qB@tcu&-awTF&CHWY#wQZM76Z>u>+5=v**$qJ#9$0AQS ztDrBsgd*37uw)2DXl#B=C~`i=Z8xhrjQX_Jg&{*MY)S$+bjwiW$JV`XVj^nf0FgZ^FM@X>B3{TA=l&Et%=Lt zG$Rawp|@}UQqg7lg&j@Oo+SVF#9RgCdfZXa%`ZZi8vAsQ;*7) zEW21_?GdAvUI}UJ7&PNF<1e4x&_aVhhT2 zPRzKN160?>iwoue{ymypSi@?)ryEP^mzwk-ihsD-H8jcyBUo>->i@*DVgWO>ePc4~ z5DD)!2^iIh&@|wvh?amP-V@)h&IuhH&^7h(6GCkiW`+HoKW!6s{>5wiIwNQ7Wf)K-s#$dxx%&6VjeqtKqb9-?QO4YSSaB0i&OwgXBpGV) z=FUM~6nS%bH#Jc|Dg@ez8Ww$DEP|bYo1iygxW(=B?cL_H9*$@P^WUlcuOyCGM>>lE zW$`~;+oeIL5xD_LE!N^aoI;O-E7@;pbyXqP^O~S1`1}b8h8kaRcN+y!E!#UZEKe8m zEFZyPlPKh2Bu?@08z#T5GTA&utBZJmJy>5)vqEBkSl&MPmwhX zqE5O?k!Cu^gmE%G<4`)QRtsMB$qRPiu4fb#B*Yu_lU^dz6ZB@i>yeQmx>H?-*vLbS zK|V~CAi9c!3rV!`WQnMekAx<_)&3TsTq$0XX9pViL00iSN;B00buT=??Zf5YM77x_ zE_7lfDLUM&-k6J*_nK|jF;VI~I*pQ6RW?I{03`&-qhwz3XY<|8NX^2Kl7shac8fvS z2K4_!zX`Y`x4^O0;&xd}GAU-i1Oi^b`;w%00s#>h^D$siv55u8=7(yc*!Vr@E=Lr$u}>7n9vLi8UoJxj=7CO;*4@5t+c zZw}^*!gfzczQ<&a!-eVjMZ8OJ-cieeh0kRe!FZRb-SwmECtS$!KOJTM%duDI1@)tL_EzATd)`)evW8QKF4aE)r6?hYJA^4QI_ED;9)3 zm49W}b3OEK3wsvaC&WBvVNa7(dXnVf+hd+@?toQ6zZkfW8}LBWN|V2TD7;AgapzG- zI{K?|{NdAz0-gMtR)QQjLV}#!Yp_a3kfX{8fbic{xhwf7?Mgm=9Km&7)m7HsOOmwU z&65LdWBjj?x2a{dQu#qcRbv$cQ`nX*Q6sTNMQKnt4F$eRZ^ES^;TU*IjaR}Ik}euE zz*Swnlk}{UAXp6wkq8?#v}rVd0^cxxCGYw42T zYl*uV>!3vMveNR%a*u!1)Lz<6am53lVu+RLuO3{_av{G~{#sFGMdJE&j=L)c~&}lm+RWABysvA|pMCRz~Gi?paMPa!pEEk34B2+`?yjD|KE(*&ob)${qW(f;P#i^l5Jpk^?X?S| zsK9U>==*Q5=`Mch_RSN6W^dUOA$!OvhhwyTf{NMe zvPXxCMk&dswge(uPke6tFk61|2Z7PT;!%!GZqmf-YmeAtf|Yh^s)g|Af<1of{Nj zX#XKa*J5qdoIV6bZnpi8u#RS{AYoyU$BeoefC_~)l7HN^+}Bo0yF*$ngpN_;KSHKi zN(f1GucSk%-2S>!Z=THE;AD2au;O|)OUbT!4n(O($@NnAVH>t+8#xBG5$z3q@?X?` z-aM5rDy%V-2U`^t*1A(V3r{|UC!bvH(Xr}HaA7@si=sHl=8k}+Ki`O$tM*cqWJrE@*CtiJo1h^<#~AWDLnbqo~^yX zgeRY<6Xda`WYxoyPapSvK*b8j%C7nFP_R}`y&cR z1CH=@9)g1v90nh;uAsB&`0TDqF5Eo$( z6;OaxOI z8Be@=m)0?KzcKpHTeGnJr)9;%GG)WbTnw_AdM+0XWbsFlnR^M-3hC%CGahDtDUWo_ zvoj>{KOyFE;+GB&6DNt&vaIxH_AZ{MqugTgDf8l!`_zQV{z_FegVvrZd?5GL@uRWP zSWJC!K0&}bE4g?l3h*cU7FfnOPr^I|?5>0LtSrHdtgvO17>`h8pL}sL;<&Ngr@U4e zvbq^j@;qEem@=4|J1c^mOqGmqaNtH54kx@aIGFNZm3=GdPec7znc}Ckk0kdKCQL4j zPc+KC!~37LkMKJusIp~bv4!mu$zDg@SMRtzjz4iv6Z0&v;;`bb=)Y6kc)v5JPgySH zu@8`ZZ^nJ0_}>EjPMPgI);yKN2fq7{nEbEU`A^P$mUyY;WXbO;;ynzk>G&UQ$HxEX zcY!@c+-1b!!JJvapKPW4MK82iCL`4jmj5u$gqQyQzwCVzG`HbSHFQ5_c2*6~vYd znLCb^#c?`JN98?--7d>4vc?%xy2@NwxWr>F<_o7VoGVC3Xnb>A07Isb3+lKJ)-rWJEiiy6Q`K^ef4`w%@#4ioHAI*p4E!4 zVK}(1!!XM(i-x`CoI5&CrF{#rhtlv}GWZS`fbl$C&dVK^Ot`qQbTf>d7@e5ojt-77 z#&qC!KWP$!N>E>06$qbFYRe^3EAj}INGwH)sl!T@D$;0F76-_ZzMxq|!eT}X3?@-! zFqq1*mQuvT$(BeSvx6I>0r7+ z(-viu1~M_03{1+&jIoUA!s$saF_kQpSxVtLRxX06bP2^c6NXhRmjf7_DZ>?1$Z=;2 z7Z(x5F<8Q4v605&sgo-sh~iU`E{w3@CkVDnJTg}F)(6`Rb`@N$ibymnkyQV z$jHRNWtLc2%C%)`GOEJLtjLVAGZmH?$c(bAtcw_>mLX-8Ok*snSj=HE%8bb&mPE@a zGc2-1-EWsFHtjbuymIDlySY}c&lx9@SRvAjhRWk-yOvuayh5=#!;_gVN K3K9}X#in3uEs9M5 diff --git a/client/resources/hardnested_tables/bitflip_0_07b_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_07b_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..e8f500c82e9e2769b970061afe4967e14e7d51a3 GIT binary patch literal 15338 zcmeHNdu*Fm6+fTtI$0Wj$9-){)5NA5r7g{~1-7M~JvIs0RyA~DunjgdCLYbUq;#S{ zY4afjs9QtKL$Hi)%a{PMHcO=o(;wbI2D z+=(u6s%Kif6Ky&kMolnPi9|R~@+i|nk$!Gkx`>_X9jFTFBsC#U)SLuugdJZyr!D=x zpQ#KZ*kp66auo*OXU7+E+`68r;2 zpU7?r!&XS2@=~tHEK8Bx+w{%oY6Y0^--hwelu=01Xiba_FIQNy!$8)>R6FAu@lJY~GmtjW8 zc>`88G~-@c?X>6_eY%9S#*sdxavd+yXN{^EM_Kp^ zD7FtU9T34HTT}+|!e)7!=|WM(_?Iv1@*ZI70y6sq^9?EkhR2hMK!FTOlId4aAUOT4 zOpiXvbPTLW<%!>C*1L!)EizwWu@Y@R0kT?gc)>ZGT2(g{=v{>s8{M4mUGfPBVl4!> z4votdMSjc(#Z-$b9EY+HW=X``?P1cbx7lI*`mO=ed+cz46Baaw|05g@>)0`jPu(n%Al%0GQfUx4=GU@Z>Np00&eCscdTpCj%Sw zP*efDO1~NB2%>*h1gou-yP$-6v?XC5sB=*#>K&{+lY3ELWiiY`-H+@8I7UrIYbV@! zr~m#S>==$_ypVF6!a7&;S$Dkv1V%1huyrTf^1>Wti`j4zJAf2?U>jyvehf!qnjU+= zYezldd>Lf=xpCc8L=y|n!=UVPu{#LuvKpVifUM3Y2vP0i>!mD2>Vi58IJ0UcQWqHm zykw`pQ_N*d(Hq9IbM$uPV%r>VKssH9j1@pz_eAQ zSKCwh&i?@3fT}SKu~ysFf$c0-JnskHz&Oa5QD7)=U^HfUB$joQvQ8}Q0+f9(l>O89 zt4agQ_rm>|*X{bN5ur-zg62%^nvb*NSgY9Sisd4VK=sT#Sf-)FYItCj_X9nxvR|W+ zaCS$~^Rx0_6GJ!aF<$mCJXw`wJK~iHb`DMO-*ICr0GUv~+C*5pB~V7ep^}Gdjjis# z1ys6@E2LH3Xn=|D3N=cF9@ynf&0tPg;?VH0xazvxDDcyl$Uw>AbNF~s(Rhzqw>%o_ zrnhq+=6Ib66UO{97#X8U4!Va2mEn^DpOLPw+T8C zE+x|mYzm`+d5PQ@C4aAGrv(G6ZJeS&+HJ}zby>9hEyv~M@LkXyI{`PpHx2LHzW5F? zZ5v^F5D}zu@-+a2C2tbz$ALlCW=Q|P9t zv~m}Dy*1aGZkLtHgg)7C zC(_fH(e-*&KxIeW{ij@;DIMsac+-T5VXO!?bchjliu?{I7PRF@W^Y1ahq47o^{Em> z5D4KRTryWF+UV1DPa8L;-fiN>$Bi1bcz8WtH+;^H5;PpEl8LqJH)2TJu}~KS42lEE z8~y}E$=s=m(ccAiScA)yW)Ay-{+2GLjs4iC2Ih`c!^GVt*0f=15G0<$lCkVrgqz=C z+G0XQk=^--Q+@O{k$Qxj2p8D z5sbcQeD>$`*m;4dk=`U)cM)k0=;+>c`(O{o$xOBe?0+NZ}U<6z1v-Pd($rRviD6@PvVfdUYEgnMhHp2BAPN zR-W^n_lkT4&RnBjRj$D>$?}~V<+iOx^3Kxa9?jq`Y7!@UlB+1coKOd;QvM1@x@Xpo zbf%}&wkE5)%{ZBG7xk*JZIm;U5&lQ&A)-$CvmFQ1ks%GY%yN>|Q-ovkCgO4(577kN z=%RwF)xmCZ+A9=Z5Xj(6~ z>*aRU>Uz0dS1;tgz1*&s+s$EN>R&Ino9B<0+jajv>g9I5+^(0~#s9Ls+%D53*HT_? z*URl@E$3{4Q7^Zv|4;P(WbFOPIPZ2AJ>ja|`;&1IN9OQ?%t7C!_9tU6x9jD0i;s+# f+x2q0#fT_;gTX=O^U}`kUg73`3FY`t_dW10RS9E& literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 deleted file mode 100644 index b56e0f7a0227fced7d53ea61f77645536cc678a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2054 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 deleted file mode 100644 index c5426ace646e99581c9bf3e599aea1c528cad147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5982 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 nCu1T<#&Jbt8vf3JPERN!i0IWH5AwEbTwjmw0z zY>-Ykun1iJiw3v+^P=oMzc3vQ+T4d%$5w?|3ORD1dFZ@BGx24OZR;W1K;N&$R~{rD zJX7YJ8~gF_^rij2;vb8H%EVc@Svve^@i2)dnVQN2J#GJ=G?y_FP;s*IJdV)_wL%ea_i6J7vFsQ zVD7`SBhP!VFP}V~`rZB^{1y3Kdl#GQrF{&6ZhcM58qeHyMYBgl90D z7^+!+e!XtZP{79ZK{~kxdT6bwMH`)(fYptWQN7*96lIs&3h%P|jO%R{MHQE#RDsdhRE#_lGbH<$&EPX0@mkvZx$=dcIAo#iSbf&9GZbhsR7KKrIboA> zPw|o=mcPMAH0|rsf@b#duq_y0JCTgSVV8fum0qGvd4)fxjdcYf4NP36uBrwovtE zB~wcfI90d#fOszb-x;eAP_29%IQ9r?I2ag=1$q-xtQTNJr{_ez-pQX)x(-4^NgG(h z+IxMy4i`#UC1atXax>4wm^22M(GwiRf4-(}EbSNX`w#0nF@Jv_9davb4m}4bM{PHw zEI0SvvzBtep5q0XTO`|k3H`@?`XW}fI-#5ENwd=txHg^;jY*luA=Fpk~owGnL*BRmyn{l4Pu_9rR;Y2l>wvU~4t za8>bmlD@fUq$HlX>ZHa;if=FKZ(fcCh4+i<$G{DQ!ALX2_Qkp#CKBDqHqDW}Wf`*X zatF?yQYYB5JwG0B9bDZyd`Rqg_UL+|ai_&`2AMy#ch|?n+4}u$YtMBa`s4orRf7G` diff --git a/client/resources/hardnested_tables/bitflip_0_081_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_081_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..6cc5d4be6ed7882308c33a9716d549dbf6f8eff1 GIT binary patch literal 35433 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 deleted file mode 100644 index 3421417ed6aa076fbff9b816bde26644e88992f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2134 zcmZXVYfuvh0>^n&o;y(qgzOCuc}0@!;O?e3ld5PH1;H&85<>PyF^}C){gh16g0&R{ zA_*x9AukW97O)DLnvK1=h>szUO+%K$M{N&#_AZ9IN?S}-v_7uY^ZWfi{yzWa|KIwj z_ufLb;5-SQp1C7A&Ybeh65hhcTx@pyYme8;M|ytm)z=#8*9$NfJ! z)Akbp4|AZfop*vzDN+<~bs}$aUkgGBzw>4&FuiK}{RGu}@M{tBDNgJiFmx1j{P0HL zx)LR32D-g(eqF?ltB9XXHJtJhGv=byBYV$O^5XPyV`IG?B^&pxJvVZecvAj{Ki8ib zIq{CUbe?~|I`-1rF#6~lsbx>XL&>z0V)1FZ-gl+nw(3_n*u<%w$yvFtc3peJOaWa( zay82AEdy2|bSXO_$|SAsN_*83V2-r9kIu(D=*ad?+WcD{tEAPnA%Fb-#+|RgJK6`$ z4KBMIo3Yj4e8MGg$_lT&n{^{gai~-+DBl^y2}U^1C&Z)c#+5Q|QW{C!hGTA(lm@z}WB=cboMv|>5eeB|l1 zXWBV)*9CB7`Q^!t;X0(~VtJi7I#RJR@vlpZ2M%Z%(c%)2U5=pR-vG-CMc-$JX){Hy-D=_nW7dxGe+a={K(= zpL(2k}286X3@`^lUEkp`5jp9 z5^Ey|L+7`u{Ggm7G@y>}GeK*d`b^{(LqK~hG3$ri!Yhxh>C?^BFQ(>{R`hcViv^UA zekaalXX$~w`lCvJtnKRORUHo`w~%|uRq?)YeYMth{orkf>3Q~j>{Cx|XsHNYpPihX z{-4&?OXr7~M{Pw9z~%*Ep0vHEe7s$j_bsbymQ;iJdn5JNZC##gu2-UUKV8naoR#}8 zb>Paqx(%N#lnK`r9=;emu-ouFPkLGMqt5Y>aOx?m-&$UH^)pB5v%yw9o44iAKFV4% zC50qMOp^kP3vn<|X~Gq>;-f9|XBvWnONnDs)ke8CYD)=t9S(xB%3(^WZ?xF$BsoY9 zqOK5=YJyydA_xb(gq=iev;9^;j?1-o8zTPIH_M7$i?q7Hh=>5n_O{kD*~cjp_8HVd zz1WfW%hI;qn91l?Xasg*U?0@eYY*AasWZN*9#HrNAsjRG`q0TDcGiR&D=>4vWOEQu zhOE{Px%U|_B%FCYy%dSMIWX!v8$>#o40VZwt1iZmSHdzd}r)z6;+$yClLTIZgjUWv~qtS_X@f&EM0vavjTl4}aizU>fYN#b% z$Jsteb1UUr^ck}?jj&{pYBcIod@^D8T^*;glAZ|9x*Glc{2f1aW{OM4 zBL2*oY9m>ZYG4Z{(CSDYz3THOO8%Okp_#XtPG0WHK-Ui54RT2=;0uDme4h^l9RIIyAp8dLZc+^Or_L| zPK2;-8%xBUJ=ZUo%p`gUikFlnm+@q<4cwx5qE*R z(s`&SArj?O;@PRw0UZ{#^p^?b9(h>Tc!C4iO-QH1)Jv-o6M7x{98il*+6X-Dmo9Lz z31VN->w-?3Gn8YWSR9t)#NY5YNP{{}BtqR7nK?V50s8{Q5=^(MTBjS4{?BGsyf VTtmDX!%{f<9WMwVn*0!nRcSqoOib{s_up`}PcoIcXd5CRS&&}k?(5ww{}Yl59={wN`ew`B@RaBI==gfc+l&_7y&1a{gErT)16 zo%?p>l`U*YaQ>igXY}^Hd(S=h-1BwMJNIa-F6^nlY3t)_uNPT=VA?Tpfn+Wz7ISjx z8^>mf1~RYRZmKnst975uQ3;%LHT33$9tqa?>mvGUftjU}a&BCux~IKZl*~?*D&XDg zHtsdh?KOZ$RkC>=+?@cr>v#fWi6OF^Pa8;HrOvqW(sPHfD9ZbCMdQF-rBQWWYYhIYt)=%6XFa9-9_r^4T$+thqXs|;XpPP-)t>q`T&1j-$GtCUDfhMEk zWc$H`EwV@lM72+5(Amv>>!rqdXj)ynRCfhwnrE=E5$2tzl6I>#0A5nhXcTm5KD9SA zhF3og9L?E5TMZnvwY$$TU}-#IwR1Z_ae_G|{i1g#<~AdxfmwOg82FNSkNCY(R)4IEde^WH1ztsQ6+*e z(H0g18{Hw5S`V{UqZPDGb3-Be8Ku5mIXK2LFO)Ap!Qe>TSF_L`2O zE_v&HJ(PNt+-@DaAV$HpMWuf|9DhNhRmh`bM5VhwrnmtdPXg~@^V$N%#qCHF*kJ*7 zhPzPZgAbY-s4{63Yn?k`k+NM8q}4fsK^4Z0&LKLQ&vy}<@m8A~QU zKT-Jz5C1Z$aiZ6`VkmuDl-Z;h2900{*pstg^-(R@o5G0QENa2awD?rg;BQ zHrl3eAW*rvE7vDzKyR#q4dLPHP@dueQ9pHAIJCs8<89$Eu+_aKjm!s~;b=yOQ;S%{ z#@trXQDL2?qstgkcrh)DxS{WLS&G?@pa~12%bw(+)yq3Nivy}$tUSi5NI=mmfETe7Wtum#Q&&Lx9nh@cz03$e$v(XvzTIP3)17pWvwHq! zIQM|cC7{gF8ZdJXA8ZTX$>S5T_InL8UL4Wl0<%;%hL!9!NiX*FujE>g?y!hKN-HYA z0wUa_Ft-qF2OgR_wy7+?!`qxWmW$X7mSMe6nD1uvP%tYj*6Ci{`4u;ivW8cn|imjce^Jl8{S<3&(5kG>t|E3&3!A)LGj#LoeV)9-U1Gt_Q6r2Q7i zjKK?Bb2t+jHSS>m*s9m)01_yef1b`?$gEY&YRX&W7BmBQm^?CFVHE06dajP9nH4kV zTH_f2WjIw-P?seI*RFlh^bOYNhi_&JQQT}ALSj!S~&tSKWu;d#o|5-ohHPCn; zi+43;-GL=FAF{qLdJN#XqFrTCzsfM^E`^$27`vTsOo~yqS$L!BK#lKrUkIZ#po3vP zt)o?~8s!Gfoq`XZ2RGW1tKF@p$<5G-Za!vPlM7Hav%V>m!!1AoA)$G*k!ZWcIAAcK z=C;_Cpf-PCYJ(5!WR6zvB>vp48=U(mV;?4x@l%_op$9u+J&4@jvBnYaTT(qLw?08T zayH3%9r`*e27BFjcw{ykA|Ua`Y39i0`8sXrr-e_SQ+c0qizF>VD(#@?TD|)y2!XF~ zPAxp{b3Z}|`(v&;_KRp5GY{hi!j~8yyPSD!iI>qzOO4qCb3ULl3jwq+=a zx-QHIY^w|@&{z8WYPb~ zuiPkhh!Cnw*>2~11XhjfSnT?nG`f|w=8$nQn2%9EcDlYchQi*~geNwCSS-`$+)p6y zNvzN<4h2Eac+gA?Ud^>fTjo)SeqN*548zpmTnaMk-9t?G-P30|g?92C3|r7`Qu+KT zW&lCxbCcT_b7KkJfcV(ed=XpZ;>k!#PX(3%U;_pb+!<47GD!Cz13f1C ztwMV|il2tkWa|0|>)t(yeXWQM(GA2ib$R*xrH&mt>&)fOf-&v;-FE%Qb+GbrKfEV* z`1_^+Kj`v1ovm`BqeJCU zR-bY&dS|_Tq9eX}D3rTn0iO!yEQV}k(H13}85+BeXmmq7;%!`SQu*JNlQoKnbS-48 zv}n~U&Ra`^@IR`U3t2=RwXvJHqPbF=ve<7~XV80k1UKk2HX!@%r2shW1IMbao zvK9k_HR5XXJFGdi$gX*~Gqa3sJ|+rOf#-n<74EC(ZBQggoHdNg&tV8nH<;$KVP^l< zhf^N3x#Vwgq_!hr87+PztNTPuWWSF6TN$T)U!t<4R;86S+Y5`{sCl(0SVmFi@}5S} z@?k#+Ez2%D6|{_1Vsh@+aGSR1Lg-gFWzbUItDFN@ZVrL#(~NkhAxl+z9J1Kf%!;!+ zuq>Lgx11KT_!o*y9M%nb!{}YlvO2?EY0al+ux6w5mlMN87N(?_emi^OCb!FLT>bB8 zw5`p%1~UfySr#4095c@}IhYB}8v@e?NEfU__}SYrdLMUzbtVqSULgRPH+48;dmapX z9qmRLvagtuUh6fDCKI)r55Ngxx1-vUswGsOIt4KB5YuJv@%f`dFsQ>p7lA)Hp7fq@ zpIOlw<8(gN9TIp)!4|^1b0!B&ZHhB_Ee}XDoS7nMc2|}B%w0_F9C?=K9+IxlTu+cu7>9e$)ulI%jbRRB7q3FvjWjSk> z;L`&1WTWx7zB2Jf_W@S$&p=^&q5F!;cV6-vcPZ({fb1T)$Eu3};&7_>8{iPjxNT}% zd#YkL1AdkX2=|&pn6vH(CFJqpSR3)sCQGw^N2V(}&MdJk>!CE7Zj=^fNd-O+IZfp^ zK)S)pH6Cp3=2Q*Ay(a9(;u)AffL;?O9sonB_*{(KS@Z|+A`#v=`jy`ci%V6u;AN_8 zYw0UdQ;5fmYt;E6mES~dN-bqv|BdgT&z|%|7^$VEau~EUeWSt%ea^}P$_*pspfV3t z&l@1yC$1|6>UR+NcjHDo?HxZ7A7=*RT6eQ^mxZ!H zO}93YlsqES&8t`r;EdEMcBCr%J7LIOfJf;?meN054aY5|XX(~6^Qfq3=4#Wi1!`q$HD?WKz2=R7x_blcKgs54?(< zmrUxZNs=)57p)ga!r-?oDoDa$-s9h+1qG*E$eDNV4~06EPxjd2U(}9;yoY^?hd3o@ z;AD1gBk^Zhr)9k3Ufw$Kx@|e=bDx8fo3Vn62F8}oL3gTL&op1*1+m!@$HV@7rKPvx zH1wg3K6UV|N8Y`JNU%<2*PzOmom)SV5#eM_CYbygl^s@^;l8Z$ zwGoXPCwk(WRhD+2`22gtDVjC@x-apaITOg=<9qGJN=kR4(Blaj(jTYNJd7ay#!W9-kPwj-0W zjwpV`F*eyjvOeY1-peX~?aOq&hL%}2dx^^5_=ZP)p#rCP;~0xi6I$Je$s?|e-A5wV z4rA_LOlm7jO=F!E)Fh>`rjK5(*9Fe}hrHz11*E*0UQX3*ZSv~^Z=HF=Q`HubJ z%sY&u0t!d)(_7|-U1bTuKYqWpSqSdF9MOf_6B>gHCoWtE6xMz)4IMV)DyvX(h`#6cXT#cF9qz715K*p-u%+A*bc{x zW0k!XuZ|zE*#U5$4srw9lFus6*ixE*J{>F9Qgw0bm%5s?Lp$VO*!SdZfgB?_?JPGa z%{-cOoX=_w0juy~(7^z{nJV~*X6!F?wY`cYrfDqrgsNi~PKKW`Pr2(t$m-Is@DIV< z@W2IOeK@Ih=u-0|5{Z=RsLRZ7->fKtnxGqbAO(bcuN*x6kB0=uDV7C{&%#a3SW zEW(R~2NOhm5dobN zUTi`6JV?tLxyNF)4onwh?GJQw*(*kmjN^fj8-Mi@@YdFdHB;4hW%r>`3Q54G-p?Y1 zf8$~2V;pzKe8&<7R<`IgxsS#6B&^eCs&!ob{P%=FV^5UVZ1M({w-5F6yv0ABA3L;Y`n`>3JESr#% zNTnnq)u|U_5^_`1T)CSGGA#yr7~r!_6}r}IUS!p5kMB&6zkZ}%qkvN`+Z2b~KlBDy zCKTp79bPpk%7Sw3;RJxh0a7-eWC;N#cfn5J%jAqjuc=G165X&tzq!%n&&AYe-@>#w zyXPNowT2LD*PRb)?sM0x99xNxqdE?k#5p`!99o}*mNL8|7F}vXIh2A!upKn$4(+#k zywpyg&xaN8?Q}YYg&72T-|`P=u%1lJ;xjmwN?vHmME@!f$)J>EvgdLqc4Bi zo=hnU3_S~e?tZY7AzskVDf0vt@@GWiIj~Oj8%4ewL1$f|I~!d=dMWjTuz%XGOrF+@RC+{}(}w0sK!vDIu}I{Qv>B`qmVw^>f2t206$7xot( z=MOKHQZOYn66YC-$5R`9kRG&%u)^4R@W3~72XXXK;m?W{iORXRP69(ou#E=Sl zLTgC0i9teypT$KwT>#>RMfDX=iE2!33iPdM|w^VvQ>9dc9fB5|A#emngwl2Vwd}nI~{-LZ!JL>zoZmqR$ zM3wX*uvYc>)Hi|6LrI}Orwpc!ZAXu7MCSqMbAjPmUGsYCevUuJpMNf*I%8M$5>-L1 z_5wxc4r~ezvo8lje(jSzsk0)hr`NJb@3u|kn6{uHGs{;u!n7{^;M$^Zo=-7a<_vYTAC-6(+3Jded&&5`Q z*iH@yKv7+{90Y+-?m%7 z$QfFF8Kuf!oK`3WHK;$JU4Bvt1`b1(A7)8%8B_kEx%uO-L+44rlI>J@o4wz^o}v14 zV0Ko!eqWdzuVN7q`49`4SG15&-&9{;vH=-4ZL*iK=apBL*+vlcjpleCT>XzyqJHq> zAtX?{7Q7$GzCnG)E?+;##@m)J=ziMaY*c)^J#~ZnVEyjTwZ;wjOZvm?Q3La8MPuMf zW*B?pMGoQO-IvpLYp`aG{RN87!S(ovAA?3%(*LWy>E5;u_NFP;Dv5JvQ)geR@-#b9 zsd>={{jCo7TC(ElsmsCkm#G`?lA%{Uw{j9+baPe;XXrE2yI*A9?(u*0fva!qlb6aE zn=+C8&E>e@DaV26AX?7lywaRpLwICDLGh>!Y)EYLbco%MHQi-WQ_6^Yy8s45$>SyMhUg!6>4@S22xe%sEU;+VRDSXL z!D92ONBf=|DjuQo_RP4ui73X$5D93lE~P!$BT`4Dn|t>zH2Re^+Z+JFPPKT zVXT>u6w}LH)Yx3)1~&;$`@|2M8eKJ<{;pF(+2xqZ(J4;f|#X@W3=FwST*DvLVT_&{V3kR+m*IF^F2LNKew zV%2c7mWnIUwbU$%6|oW@yM|zG))Jp|s$xY~Q?jcjzOrH}MqMS*MWYDr+240=_e{?) zVvPFF?!8qref!*VzjMCl`5xzV>PvH*&OYz{1xrQNZ29PY+1XgPy0xJw|c|(_y@k{Xrqc-*js)r^6H@0Uh-ExkLX9zbS2`oAyz*sk2zjD&G_E z)Vtou;o9##Uh4#925~6<S*p_9LdOL-56rr zKbmkXI3@2kp@HDCkb9`r^gTdXdz&exTDaTlE2}dHM(+b+J;WKulx( z-^hq=<wlyq>I+w`X*^1JW5qZ!TVN5a~hjZC%w?aR5Q^qsuQvXS$y zf<4x9*KPNMlebr? zcIYTo*ULs8L;6$)xJIfFWbKm?g0AT!6LgF=0U8rLs+?S6f`hf~wu5GEGgLdr$aaL~8rSp%D>~F4zER zQ7dK`Ay|&dY=KNIfJydX($N}WXP`4= z_5>Z>U8>t{Mox?jMD|4!w18kMqZN3bG}7>(32%t{Dr1{{%{4*IN+Y$FRW@-d zGhC(8bs#dZ7#TfUr#p=)?4TPs=6H$pT;`7p^8Gv*a z{-yqAYd1lpNsx0h59cb9*Ek87*H6fs2FxJ#{j#4jb&$T?{Ne$lUvzl-E1vg^wc z+lvO7Fl%3fy8Jm|*GWQL#bAg{?_hp6*gK4@Y4l5s@DEIHi*|RH_#rrWaIl1_4wF9_ zDi>&QMJ{yRZMwW7Qtoy1x?PvLQy%07#@^s$?@xTW-OU~~9ks*A&3PxztOKb|wLVRZ zCne}J*q(=;S`NuSGISE<$+{0fwcBiV`eeF>Ehzl7drkNvhN3-N5MSD>iG(RR+unud zH~K*l=L8CRwK{|cDi{Y=?FKAJnkhOeB4D|RxJjM*l*J0cUx~5lL1q~H5`_0mczSMR zMi5>`elW&l6xeihh0=G>8!J-#$R z5#Ca{va=&?-h;=a-d+d9yBd!PVyVZ}P~|Z-beNEp?>#)GS|c-l9eGTL82Peeq5To6 zgryqZV_K;8XEA>~QJMXAd4zr- z5V_CV*Q@2H|5^E_(Ug|fs3Chx>Dv0ZisH~KYh`^W3^GwoZb(4+mADH zypl@|kqQ?KQfbO=zsf6Ih3T5b7+bNwx0{qYrl}dGPXz*#rc%3;r$}ki1^`@apF2;ohoc0o z08E?K*0KIQ$YruKE6H4+a~Lv+&aZ!?Gw1_SDLKn6Cz%CCw*3>%1HcG2?&I~HUSC~q zW4#IM>cFrK!9yk!*O^j!3dqg$`;cHbk%v65pbe;T`b{JIRhFdL2=NStCM>GsKJ|vv z6f?kS^z@K(SR%2)qjc#R&(h-`VazfmnYXDNYP{oZ$@(D+UYET<*8(UGg@`mfw7b-b zq$g(51amV^i+Y{d7eJ$;K5uFFIuq`v%%5t4{5T_HmvGNJ$qP-;(8m2j7(I*Go~sIK zFJlR=bE9S+Wa{7O*M}>Z0#xu|?YjzA9gGiG!<92lm`U?4!crZ1T+Cx@{|G6TDC6;$ zM(`4=d>&=}@)RHed!vKoRyme~;QJkJ4m5T-s~FyVwE{&sbB@|g_B-lZ>xCe-1GqJc zNnDc?G1vmRopsg5-4QXC8~Ihak9|npn6Eg)KRbJPz1Jk(`g*^$K9cfV=Vb`Xw|JT9 z@EGBT$K9LZuR86RJ1)HKOAsVaUHrHIU|dvJfo&~s4T(j}}0 z!V{67T$WoG&aaJz-tC7dMI@aoF#d3Tgk6gCjaDfts1)7e2>M!;bu?=7!m$T?eM@~g z4P787B4hj#?9QfkxuBG#6Yybj{BmowEPjEBUPW;7n?rMn4r6J_#k7J^U7Eaa?GR2 z9#s`#Kndax1ge8c6E;X5+MaZzf1W13S`%I&iuh*w!JJ%(n+_EM+?;Suq@}321|PpG z%K_~EeLvn&TUjxKF=$NUr~3#v!sbq;_W>`$s?AO>|MIBAmn_oL4Q&E~L9C#LA176Z zA5vUn}u#}a45fr}CNMjp_^+ZX5I@qd9OSe!Zs`d7T`-rlV&$Umx9qp!6lz@Jr4=k4GmIPwu~ZKA%J`Zv^ybpD~FQv@|-m@8i-~s&Za^jwoaiRL}+F9!P^ipxvLG&f=A4e@IHJ zE8>i!++P3krt}yjN}%j-*;4iLL#X2tA{yauGV;tM3@@J`4j&p+5}&G=83OeGL?T>r z%UM2#*&QkD>)d`|!Vee1k*vllvh8|eoZ10>cq-C|l+<|hZCM*kNwrxW1{s6-#=+^; z#El=oWVyrB}SeqdJ_14#T6m3GHB=NrY`BX!E^~)zr z!N$#G{2lPn+J(6Q{=YCD<5ioXMl-6`3!6>&{7hYB2E{VhVK^}wX%YvdrZh-y9iyFE z8}T$|8F}eeoCsh+)CCC88P3~p!gE(YgTUot-Xj98M;&rd!DAkEFp986>RBlh`2N_4 zm59VDy~9CDKLO-<1SuUlj`IoTVkQX+G)uZa+LXG|#o*r>2wm*xa{fVDPSsZ5WRd4E z(Z+}uR@F$D!PtuvDMR2|$Fi7AqL6B16X#19YP25L>;<%_5DVWAkI{mNbv{UD^fs>>x% zc2KBtp5s5=h~WC`By>sCZF&qA-e93y_bz(BmDpuIWdC-R2|L7xv+dUEw32)JEzD6 zzl;5M>3eA#%}bYR~naz5z=4c{LHR z){45n>T(mzA$5k{5#DRn!zHwKnV@bW=}6KSsT)Zz@Me}=ARiAgi8Jx;snnG>M64#M z;0js2>0CkgCFBoclLEkt7o|Lt-6-YC;~G9ElsAkWados|j4jzIa*^Amk<1)ZW}--AbblTH3h3XX;$dx7`6gvz7>GWsBfjO z{B&CYz{zJmxl_ie~SD zY~8|>XtzWa6eLg}tq{AXXH9~@7er!mWsl`U&C(b<@s{BzaG z724^rEw`CB!{V{GMJWtbg0+2vIR^ZSo;pm z?@{yHwRinzJ=x_i?j+27BVTf5zi2B#6UCqSBn->ctC4cWCt=XKy|)v@Ct<8sXRAs# z@kyBYB#iSg^)d=iFy47;J-+2QykjOGcRj2zAV zb?aGt5+*(gG3@)fq4HqH_A?_#{kx5=Im4?!wuOPr}3}VL0x( zucQ0%Ntm0ph7zBIp%~|W>ta)U62_U&o8pr&S{#Z`!o(+G^h8p85~kqHLVOZNBKLBb z|5RY(lQ8`B$S3@~7`qJOlQ7n@PmvSlZsSt?^J2sACDZe5@z0Azn?6o-+ezY|7qjf| zsmMiwT~6`Oi&gJ`WLswZ^J46qjDKEiz(0w9UX1;1@z0A@_DV|p^I~t5_q?i(u)*>F zYEdOV2@{`$iBH1BCt-5&Nf^>rm3{x^9cb}Mn0@{-W_%JRJ_)neZ^HgRItjCFz6+p) K>u(EhFZf^Dm4ey; literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 deleted file mode 100644 index 5b9302627461b3b91a7215180682458fcea124b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1352 zcmV-O1-JS_T4*^jL0KkKS>h99UbwXuQ`ag;~$8Tz+b=}RS|$4T?hbx z062g_Xo%nm-v9sr000000002s(W5}nXbhNu$k50D4K&CA0APRz28|j9gFs}&21bTJ z0BNQ`00RU7I5cR`G#UdYATl&E00T`j000;u0l}k2fuPVCF#(aGkN_HKkN^O|01gcr zGz|uT$%qV%41fUBOn?9e2mln75duxBO_~!Xpn9GpdXH02N$NBhMn;~YZ8HAJFU_T^{T8x}A>E zk?)y|a4*0=2*vi7BP4t1c!QJA2L($ElJpX}6_JAci}#tIzI!HKs_X~4GCM-;cC$U! zI9CtKaNu7wQ=N z!ghniFtEiQdRGC#9q4fAA(ytiOQFe?W>j`6qZvnHrSuk9a#sr`SQ$*REFG%H++D-( zBN*>G7DsU4u*NxDE>nXp2VsjYtCYi(>XhI6NQV)UO?>*3(#Jo^xYR=cbIn=vC79GlJW;a;B;dbz;rGh4vE9aQ`Rqu zV9A)n^dBk7!uV7Elakbw|GahyFW9C$M*evG~po123(8 z(}49@_Lf{c&m)Jx`5Zk|Q{hMOEG)3WhA{L+>WPO$WrWFOrwbTigA6i^zUnR#91OC= zv57LX8JU(cs=AddlIpGoRmxYa3|^pPfVf#%V(PeDE)E#Ow8sl8hF`F`R|b3krb_yna(oAZ;JXv;Dm|347nm@k4urjji^OG@ zQQ|!(3Bi}LlQ=Vi@gHbj1~H6d%%4Ha_Kz`j8GR2)-kt}Qc!pU#_tbE7N!5Fgo#sES z?7pYM|L1w&9#bYL_BnNRGapIb?^m=`eR)bRvsF|+#3?C(0{1k9NWP>}Fi{2P*8~*HAPXZD z#K?%oMKNC22wWt{RK;agVPd70P%M>Ul*$ZK6-y*!Rgr?GNXZseWlUL8)J90e%4&=m zOw3F&OktHWm6lAH!enBsS&@Ze$g->|%*Mrv%Sgr;$}AX6875372BBuDV+=7FG(m={ z88WOH85mfm2+XC7rVOF07P3*9lNJ^rv4%4;OfY4cF*2}>VOYVHg3K|IV=EXF7|bRz zOtM(TR!lL4hC*gc%2O;xF^r^TlCvu^V;N&GLoiIj#tE3S48kTbt1^`tj4?|e{x0N- KaG@c@CrHHaQe;v9 diff --git a/client/resources/hardnested_tables/bitflip_0_087_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_087_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..859ab9b290b797bd96d41312acde9bb405b9fb0d GIT binary patch literal 16061 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 diff --git a/client/resources/hardnested_tables/bitflip_0_089_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_089_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..046fef513f9a200091e15738ddb0c345b3e3a59b GIT binary patch literal 24763 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 U&vQ;-bUK@>m{5D)+mKmY-l0r6lFK!i{^ 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 V88Llv&UOFgCU}JF)?eIs_TK@fIN1OI literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 deleted file mode 100644 index f7e2d1674d4fce897625e0221dabbd6710bbdf9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1788 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 deleted file mode 100644 index f66b803eb3a6730a605ed054f1187db6273e5ae5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080 zcmb`*`%}^f003}IXPY_n(kW~RQx@Xn7?NH1YNy`J2b1{-M;Xdjz}9U$mr5d<5%bOY zh*Z9vv9+m;#QDB-rpfS;O6su-Jl7JCJYPM%H>7nrBG20k;Sb9F%e^PLEDmq8@Dx&T)c zu;`!3khlM@@oxHP5p(yes5s2ctMz25%tS$BXG~`zt3}(=b?*!2!eBd6i?&n1u==9I z)`h2_M%lZ>U9pq~?uGjvjy?3y>@F3@+`(i0aYY(pb*K zkwEPcv>kCzFe=<}*NfQ{=Y8L5-By3(1~<<(6taG~c6>8=avSwQ7uPpI9p3T_r#t9n zei%L%N`6ECiJdsP1yb5)NIvi{$A3dM7D@2^FUtPh%)bF`*SuoWm3&3fD1KESvgGYZ zSUcT@vG>&0h)Uqbd4GlB^>z5Zgqn#!t_uDlaqAMTejOptIU~skp}5b;FkW78mOmEo zm!p(N6&W}8n`}dz?hm(IQKN;Ad4pLwijvN8o;B%vB{ERH@1idesw_kkGPk|OSUSCY zElPQKALzLtjqZ<(XepoS%E^-Y|UD;TY~ zdndxlQ>YG$gfbtQlI>{h03(zVA==pyGVq_VTidma}@ zPpx}=an89>*ehYKNyqb(8naZTNe<{s`*ZE1gY$1nHey$a#nZR+xy5@Ree#Kk1Sj!o z@2{vOQbZ+S_KTH8C}!CB%9w&WfeoQGzTzMju(~x4es$0oF44{}92K_2So{M0jn{{V zhuw82?Zh^lE^YZi>L51J9@-QvW2V7awZZSendx2|K}4}kbP5i1e9R}MR5gTlnkI}g zRu#a&D&OLlmzT%UM8{O|j0ROYFk3Unrq63-zk?5$>$3*`(9ISD5RQ<)QSKpHHV*j|w!q%v@Q57+@JX98HB W1`D|b-ljPW)_AGgNtFL^CFEbVcL|ID diff --git a/client/resources/hardnested_tables/bitflip_0_08f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_08f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..fb72246273a56827ea242caf7e9595e68b537a89 GIT binary patch literal 12349 zcmeHNYiv|i5T5OWLTT?5sn{2?t*EGdtPLTUsJnuXsMIbd8WTYF2T=_6p;5yROE3H| zM2ZrBs6o(;)<>csJ`$s%pw_72)%r+$VHzY5Q=qjiQ6o5hbMEfl-IiUfRKt&Zf9%dV zXJ*dKoS8XucQ&W0p=4R>yO#!t7Ow3Q5+4PFL-;(%7^ma+xNIEM%I{#&&LvZdTl8=GFsAI+#jCmhf(3wn>_q{2~p&3gk{YSjHsqrT>o}ZK2#k=gl0(^8D!PJc zy2xq^lF|h-kptPx#IJHu4tDl|&nyvq<{Sld)bN%C5D7@dFo4XrD4%KS2f%ojsX%_h zZf`J!bPdl|h}f>futl{TDSb-Ctrb7e7ctER#u}#5@|cbb#4?IvI)Et%>|c$2z&K0p z#h}GlMP6hdDf35}&VwAjK8_SUr%UHULy?n~ABLUhIqqGGkBn|je9FK>6&d7ET^-0}8&msatEe63Xkfb~$W$fEnJ$NR zo0{Q1j&w4G0~5gV5!si-#PGfWDjE0sTnexan0COoMH1?WT*$Ps$AW#-segf{El}a4 zk#Ig!Km>=Mf0+vTCeuZRt@CkwG1DS->e<&YMGVam z#~uTg2`@PS(gd$5OboZxUk(l)SmN0m+I-#C;H&b&G ziVMPhhRxtFrg_lddXdMOX2@QqXI&%!;MpX%Dz`dWm(dhJ&g1T$8BFIRRLYW>q{8Pa zwf;AfrT&$AM!##MA+j*Lk7<=lGYUA)w6#gM-6jGzT&pqV*kcsx zDJP~e)xylSe2mB})o@Aoe2s$u=EjebLfhaX91#aQR0xex2!MM)bJpZfn0`#hZp8dK zO!ab1c|4M`GOSZs%G8PfET#`r5RwK%X1jJ!bl-(D_hSikzD6r@=jpsHiOcwahatuG z=E985D~D9ML|#kU*~i;cLMLe{4OnW?AX9gm)&FezW`@H{Kc8q>qRJrojp3PS5#l2% z8?*w5GQH-~!u1E-fdhOGTTazz+MD8lzv{Ntih|>ZEs^{JdhClwkf$FGbMGa{fuSUf zmymD~cM+ZX)p5OHy$RAjl^Q}lA|(bc1OuC(w3ckAt4ZD(7cY$q z8PJ?FXbmi2YV6}>4+WVX7eP3sz4fdp3e-b}9tRu0vIRv%%>NGK?&~vVPn4ta?auJ~ zVz!6ikr@h#Z}co&q0Dx(a7D)U?ZVv#`X_MRam+b0OLR5UOknJ^2_~ZoK(Oof zr^xb7GE1=dHe=$S1TKLxR5`ok2tb>fxa%=Q9R$DTrW_GA++?wS08q zJ_HqT*WBR}0l+vsH5PkCzpda+gA1LLSEMREj#eh;KwYvMahm;1-@6kEAkW6K3)sO@ zJxmXzAjAj6bgqGM>(6T$ucF(Ew!yFVXABXq=JsmtxEHG9BdvKgw`-990XS=G?xf6a z%9R4Bc=XLZUM|LY-~!9|>~f?owIyk5ZQNE!Q#*9#cC%^V7^7vS{*V!q?`0=!;;n?}4|fcO6!_y0Fu gFW{{2%X+;4uNUAZZwENzUclk7VMKVIU)Ood-vIw%F8}}l literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 deleted file mode 100644 index 7f559b40cffa9346afc8c0b947457dc34d5a1ebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmXAo`%fAN0Dvh9Dnf>Uj923%ZR)KLRZFSLP?Jq^D8_+fJf!(rni81?SP1dAI>$0WUX0qh_2fpO{Ivt+< z?FzfVY##~@{z*J|<_Y|qPA3qWjf6%yf#4?)*jqL49LnmO5f;E=z@16A%jIHi@R&?` zCc&PZ9F`TAmzSAvtn!*^io^#vndHaHS0?z%BU0zF=B#LjbTQ%;M~c~S7WRO4zE@{% z=HQr5?X)Sv#6?0$&#}bAtQkC{gX$SdU92TljLb>u5i7Zza*tIZ)+{*$lrjcJoRX_& zi2*k_#}0Ufsa&*ChN7Jhp*h^SK2f}hDpd;wmjQ7nL~(;iYIjN83I0h|g72V#9Auo&r9MH1XKCUJEd+{xk^KmQbWU6%?04!uj7glK}O*kZbf>2}yh z;H9@RGzsOqIjI9*nB?ddZUH?v?Yux6>#7pG>VFkI{Of+%_Ay{%`z+;bw6+X>o`w_$ zNdA$CEF2SaeZeKY-DLT4y;dU>Ixv!laJ`(?uY$Tkd52}$z*l>jl%`#qPvLC-uIgx? z9o*0LNU7RB8b4BYeVgcpGG?;bOwwf3J?E~Op&md7eBRws!vF8pY; z>SB+Ne-e9hsBLS2bx>7Js3wq%yRDLCd#>EjV@6%)&=f^DMED;j9AP$OD0*#&tg`WU zfO}`Lvq{rL69i(g#xEL8hEd{*64XVyEt@n-AUMM3$#1dJ$f_f@vMdUXx9Y5pQ@8_v$@laQBUrBerHhB&}TmJ>NNegu5mfoo@=d78WJ$%47c+NA*Io zZR-+n^2qnp9662`JfV`Ip=;sjRjd+(GU9{KQ>6Hi~%Z%Pv2*KQkjpdL}e9Xx&q zPqo0cH)vlW+;%Qos6mM5{O|%s>1m{?Q{6h6wqOR=>(+$qeXOINK3;6xiUi-F8QKJ* zgsc>$CY_oDyi>~cOJ>0Vu)o3o^sjgJ@wR^|d!9ob+Z(aL%-*UpZ&NzbmCrCvTW7&_ z4F~UGEGlCUIvUUHUHN(I_Jez8>hEdNM^`BCTY@!z(82p<9P}`_zgtEta=d_;_mElm z%;l61BpWX=tg}K+I3z>% diff --git a/client/resources/hardnested_tables/bitflip_0_090_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_090_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ad7aab465b6a73d3740c40d7f074c1f17426ca37 GIT binary patch literal 17300 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 diff --git a/client/resources/hardnested_tables/bitflip_0_094_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_094_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..eb996434c0f0f360da1f5452687761f41a05602e GIT binary patch literal 31544 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 deleted file mode 100644 index 4b0316dc307db99d1790c4fc1e4b8fd22edb5571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1431 zcmZ9IO>EP40L9ZJ4M}XZ&^YdYQ`MAy(KH^7IZT-Z3`)O3GD=gD{+Srq|7a4sH77d8 zN4{JV*RYjR>H}&ig%;Xqwb`YUCgeCa8k)2*X_LljNj7QK)I&D0j*XA4*X_N-d$*_G z>wfq2TlB%>?Zd}S&hNfA_8k9^{T1W+q+&1|stny$gTWBD7Hfap%Kzx5;q+^J>;_9> zs_FmLcs10#C!2Y5s_t(8pUJt>xvL7zcFO3Iq!Eh7G06Rpifq|6<@Cu^r0u2nYOw$5 z#s1HJ=vV0Qb8%+JVDXsi^YBRZ@Vc~uSyk;GBY77s9U@JVbvl|d3V|J2CLf2Q5Dq;J zAL(4yBIfIzLYt*JZOR{DTi1?)&}z5yEU~g-yi@GB7wL%04qkO9l0kfc4z^%6UWB)m ze1d}z$iX2#=TB>T+Oji?Kt5$@4jv+j_U5yMmK(O<5nCb%r*YS=ZKiQ2uj_CDt4?9- z7i{WS#6wc>u#Tum(^GVQ_M4yIW;bTlIfJsgg?3>}9DlzcPeBB*ZdW%qSXER9j*4TTChG*3t)Asxp%KW&slmsGEEJw+9 z-1Uh*_~_NwT|G*{`Le#Ib^$1B;s~ddM^(MD+p}3OU--qPY>vpax0t`Ms*Cez$z*0; z%*>Zg;P^0xk<~oXX&{Z%)NbQOIHr(4fine=-#}}F-KesPO-$rts5on{e0*^I3e|hEi1luu+os@aWQdQuwex>a~W9bA9D?^-3`u$`N!uLrZMzD7JC_O!4o zM4 zMh<(0UX&sPcSc#Tw71x0#Ims7VH5n>jGm=|;O&WS*ApRCT-G#|0*kmi<)qoDiFBs7 zwx-!08nckE`!9#bDHt=Zq)oQNw!fk(j-@JbZCjt5VK z^>I@+O9ca@rDm6tmqby_?QYXXSw>HR5j@7|u_K;KB-Q6+ee=lznA8VuxOEO7Rh4|O zp@k&0HL9+tl#69A&DVHRj*QRii^YVYq{3#0Ie&wL_xez|aHZoX5CspZ&^2{>G!*Q` zxK6ESElkyg$~S$JT)@tf&P<0UhoMZ8lvfv^3EX1PN@A#xVRTxcF_7DOE(#X0I$h4; z!EiWvQ-^K5;O4af#?MqG3k02JST9R@EEEod6cC^!Qxv$f_y&s#W}SuOO)Bz&Lxj3B z%jd^2t4_8SEF?){M3lrC^pGUM#pJHILpfFnv5|IbaA;?7CVp4>0#ihe-)k=w@OBFg uWrkt*TF(HPy&T2zjfRG?D3Fyt-W}x4D=jgwMO)&%j diff --git a/client/resources/hardnested_tables/bitflip_0_09c_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_09c_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ffe57e55e078c95c76e0e825ae8ac311b6ff028f GIT binary patch literal 23829 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 RTKTs46EDJc<#hG;{tNc=({}&> literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 deleted file mode 100644 index daa61d3b736109c5a4f1239f010d7152d9dc5aba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13572 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..716e2ec82bc6b1a89d1135422d380f407ebfff94 GIT binary patch literal 51284 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7f045d83f18f0932eeead942ef1aaa02f010044c GIT binary patch literal 31041 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 deleted file mode 100644 index 958b8ed3d39035f65d4f5c940e5dd24c7383dfa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6943 zcmYk=Sy&PX*9UOhY;(yJ6~=NV6_X{E#j;mzQE`J56aq?31On7~({x@lttJywQBwqg z%5ni^b3tgzsVuhywN#dtshKt_ZEDgMx17E%zuR+jo^x@|bN;`*R92w>9tt>~lI3vj z@$%DzlPP9mLL8Au2{YrZcJHT|LHzqiR@xgvTMfzW`*?>ySEazu5-fg*?rj|3R3EMs-S5-a^>6mZ$)Lsl%~ZXn9K@JG~2Q_Wd^)OK0ZXdd^J)g#_1LUfo{ zEJ`AdWyMF-udc5OXm0s7Bi);PWAE+ALy@|**ciO)#?{m2ty4}7j1AnVjS_-75?@_P zTSFtlys9Y#E`hr;-X{iu!A16L?8CW|;o+sk7V_y)TJ#n5I*0i1*e4M^N{7>56gUTL z0$mtM<5q)O#2gJs3AQd=(L*Y=jryR7{gmSJcR5KyGX3-0V&>Ob?Go|@Fid~qmkQ65 zXU8wnCBlXdR=Hf%G6|AH+y5&4yL|Zs$=TTjFW3)s-QO8g1}H9tDJZrMW5)v|b{QC& zjN%bhYHHWXfvDVu%J+)oqKLKro?rW$F)!phvMu7k&}~2SBFF@b0DGtx!WR48VpLmn zO`YqVepqgQWNU++|2$nGX*&>vV+RihxZt1b( zL3>`xXKR{XmRk*NxXOPJ{}^-m;+7oz4xNDI<_*~hPPbkycsLnp^qNis@2M~HYrm;u=?!z6DbxX zE`3ELGZJBI$4zYMCXkTFXv7y*6_dz@YcNuKuPwr4bRA>R5_hCx4ZTq!RjM-(Zs*S# zmJQ@&8r@h|5h>#8-W~UuoXqjrJZX06+h#DYnD}|^TqD8NgnuK=+t{^kE`cVi_uqJH zSU?jnQ1!t06%d0-_!HZf0QWhhw}y~>nxK2pYfJHTb(CMxS+y6bnpYx7+!*BHsi~FQ zMh6jDa7d4|Nw}vUz*3zh^Xp4c)m>4yJPb-4k+qXw=7>k{tMxi@4SL%}6QSK!L>#T| z+EPBawSR>VKpty}TAJJxooSa`|1P3g(cE;j8h(|F$HeM#E``hVwyaY7Yvb(aR|Q z<)JaI{SBd^Te;kpmJ?k~s_^Jrj-R#Y7zk%Qxy9%&=Kz^0TnUAWFzHYX5w-($OJf*< zFvtv|tVl*zi7{e|5F@D8_A@{OoiGx_8i?Z5plKW})u&187)~{qot=6S;$Ov_Ceuo@ z$J$fvV#HKL%6aMoIB)S2#7 zfKV<=piw1Sx?hutg7bq@550u>Y)jDa*A||wXs{+ye5ftuz>WL+)=9RMTggHJ4H8>O zp)C#^r;^inKn|mH{EYIc(%f$vL(sx z?Of+q^1rGt`@2ko^PZ+=ee6W&k_Smv^m?)X+p2fZHN#9+o(zL(jO>Twz)+|MU>cp4 z+``&tO9qLiGEDGqhWplOr`n^MdU})$h?g)D)ry?{V(XrO$+<;9Ipj6Ap zdDuHt33$Ri{9F0PNnAX1-6v8g`IcE~V{2{m89yabgMcBb>`^hxAJxo{@pyJn@N$~d zGl`hw*R*Qee(YOxc|I3C(@Q=c;brDFZ&MsJ*C3I$NdM_%`t_C&Gsrnyk=xwqO3$kr zE07l`tKJt?^-aK`Shv$v3kjDbDtzhnV{zB(pD|_oq<(E5QK~zCmxMRmAP3*w#4?v5 zLs3WLmNJ4;UZ8s2sG5U9rpkD4dU%PiwEwr&x4q#;+bM>)i0|`p=Rs}1`D?Sw@3Y8> zOKf2>C!bKTdJvIvDdJP?EaFD!zX|_#hV>s$vc>8Ux4EF~A%5sgOTZlI&2hVQ^H0Es5D6JBL+Z!O^4R z>AXe|$yv~17_Y6L?*#KyKR^zD?D87HNSNnQ<}{e7{q4sS|8~>g77is3+n;tvpciWs zo?cC{RDFH5H>c`_9YYvMzDm#Sf1kYKt9$(8ZYfijymDUFG|oP9!lW-KF7(}ZaEkt{ za>3ut^;KXBd#HszAsQQ!_d445bj28qD;#0p&w#2kK59P37NzNsHlj&d5}B-F(5P_N zj>dkw=KgA<2bs#rk0%N#9BnQrJnA;sN%8Nx&HA1oKCJyYBapbrt}ksUd%Q8k|HSbD^sa-5`1yly8!+%=sQIE1TgmCXPp;zVsQJl$kGo!o^s#^Zq`sx`wpz>pxBn@=G4w&yXPB}D=CK9v!5G@)qjUMCK9$$T<_VzLS zH)}bN)$wNYxjG&>)of9dR*!JD1$$+!R#Y}(;N&6umg~N93LIiUU5cqXa&_kBI??hI zUHngoq#=?j@kH^K$P2^~U#tn17-}3<^{8Pno`5hgzGL>Deh& zDZU?M0?yaU?pNJVv#j=70S1G`kJXO}K{9P>-JgG!b{{K#NNRo#Or}o557ya&B^|V6 zpU)x1qn~{XUjvAhf zZ%!Z#JZgB}x+5<(w_FY0p^|<&;pq7OzG=QqG{0+bq5$gB=v^3M&pvX4|8bl5hY*V5 z%VC#4rE`YiaWJPGBM>%(y3{Wa7nAiT(jMjoZN9f98Gwt;SocQyu88m^3*g?{f#+{yMSnEp_uc!?*DzU(Sc#)y2i~#yMKf4xg7y?RO!@Rb4MMd!3taW+xG@_= zkhh&yFI5c@b)~&n38N7$m(M#j5O=jM3y=RC9hnFCadyvpI6O?}+=!wp`v42Sj>Vi~ zpFD$52~KuRDn4~XUXjQnn*sTb>xtE9n9hcWap?;$d=Ns5I4mBej3~F0 zLaRm~%6M3mIMuPHmcZU?x|9|2sZHmx*T9;<7yQa1%*jI_u>+74@a040tIkXjI`GL2 z3-_Pa!G^$0jfGm{*Av~YQhJwpDc5Evm5Ntz`DJnKdurkgav(t%9^JFNKZy^S&K|lU_~b^1AJS;EEh}683%wRkmp+v z%NhinCe<1B*}`Z6!xO$itMI-$%T^(*Tj;@C>z~WfdHRD5uA(qgB0%SC8WxsPYLw2a zgaMazVuhNdU|g1rOBwYkrw5ckbj$a)9;Euy{Y?@wQ4MuPlf^7Cl}`ebZLv@csN?(a zF{Cn&)f=+yD5CyyI7&5y;mRbPX}As~GQR0DXl)+1~!MI#=CUC3Tsd$~Pkfc-ejfusGDlWj4>Ix1s4X_(MC`}_s8$$D5 z^m>6@NWWX->PBR%ln@jr=*$Ib+FI`Q-Ms1x5+_TGP7&(AGdeJkYQkZ-?H!($B0j+H zwv=pkH4v3y!ve7fnbQm3J*uRFM$c2}KRTaj9tkMh^sv#<|V2 zxKbI7{#=l17{(cBByHLKaWX{qN1fXjS+{`>K?`xVRO+}4Rv1b^z-eP%SyhNVXRr-m zd{ZN#@_lul0K8Swk_7W%q}XUc8YXfBvw^whVN}pLTwEV;KNPH{A2KV1+%S!qS3S^h zZL2x{TXWc!Ap()xVy~N;7YBu471i{8rB6})7pH0ngQo4)_ZOGGc2DkC=O zX=xQ{Fgqo+6Eym&-V(?g3OpJU;SF7Z*kN!pdfQRuNSJ^tMh&9b$`x4btvfvn^7x|Y z!6HTU@#BGSZVU;rX?^`i@#Q-$l4ctw-+S9pD3A$44HZ*!67A&GFYsblKGi`qa|Gw=3%Q=qOvKgKv&B_45mzqvzzGttXRaDWK1Oot zDnv;S`Rz zVdYAzWkh0})v1bQhd)k+d3`Y+NZqsd%0tZqTPvccRV2z<9stD41fgItel8#Q(0AdmvihzVrF?x2XvLn(K>N7m)dZZA zLn*y4Z-bu%xa*cQdg+vYPqpJ-92p}e+MLFh79mQdrHCK<@zpJQJm04XR^73tpM-Xe zGn|KUM1@hMDl|SN%#oO!ku)q$lEb&s#8?uh+C)hM^XOxhPGg{(0N?o(mkE#>rI!Dd zJXHDmrsL<=*Xc;FkZ1KdWmJ+zU6gt1e}>;d-cVqwqW>2}UYh9MI)f_3_|BZ8p^gbv z>~_mceF1CUg`o9*s(tf#YRB8OZP4!sQK84R_!lz$e^sac;7nCJJCiyO`>@_v%Fjpp zrHd@(tTPQ3qtkRy+n7@Y4sawNaNN~xn~%kuV$KeO!Nny5?G~x+HEcYRb1Fwb2dacp#{?Oj1>WVK`aQ<^(r}jD^_id16NW(lDDo(!- zNl=kyU zGTUgH25^QAsINu{y_&!(=w6-k+9Im0cR~u{69xUrF-rx=rLI@A`*J3yz0LWUk6#vF<$wKn zNB3EMcx0D!DJfZ88GC~>E_|4RqKZ9-mFbV_MQ0aRqKSl2!51>BgM*`?hS^f_d1{GB zLyd;hn^c+uUXhQOa%)4nSp5SEtP@+SIw%a%4#E(=vW5MY(M#s~J84tyE`8hPI zw4GWGWIBt5X7YfXqDequM`&YBe?%H|xKOHvmr{=NGlF4_D|&L=R2Hg`tLo>LgR~5G z?F4@1$;>dv)wiT7IVGy;Yjzr#15>AAT#52>L6cXdnM%#zoWbu2a_Z{i=K-V|jP6Gb) zw{dPU{bSv$KhyJ*lwQ+p{*dYOQ{N*cU!=itix0G;Z5I9aRQkAi^}g`toE&N3&sd>B zlQyOA-S~TetUojNpx57@^g2`0>czzE9!=w85<~KQMeh@p{=y`8;K7SlOV%)=PGrnm zn&l6$-(wZC?xvGW=H?Tt=jvXU86oW^CP_(cpJo5{C+ETg^}4_!H#NNQ`!n3Vqk>HNX5%1;~S^uzQIpy{?~~;ZH|qOEgYUA>&wX&dUE;P zLEWP7A4gq}ez^h2e?XldxLNS^pG)j%SoerZSG%)zq%36N`x<(rIt!Gq5giN^-2$Kw z(12K|P>~;XeB|m3+QmMtxij7t*H|YItbP&mG37%B<3qIB*mEtswCx!*^904Fa94fB0%lGp+2j@Dh@p#f_VmNf@l{P%pL>gSv9 zJauD%=YC0CN~A=aBiNEbh~T5%ziyM zpZRX`&8O~F`Y%i7SuD4&`NLEqjqSd55>z?)wy|y1y^kjg`n%swK2J+Zjv1OtQgh}m zx=Wc{(SWq+eNF}7<=nmSp}tK%QpUjx?<5xV`2*CE899E{tXD);V(Lb4oWH7{ z=}(gX{pan{6Q$8CkC|m=r24D0X02yIm3xg3&7)Y7U2JE9rz>~bC^t&nFE6<~m4OZu zlh0^;vySusk@|zIq2bM5)N>2Itv9{Tr>5>FGC#-6*#ydsfvMAtXM{gHWel)orJp?>sYuov;Qzi)Vzk+ zpZwn@ylI3(=vf&*9KZ^+7#)uD$T39}fJYbNd{9+a`VN2$Vh)a(E|amDMo-na;K%*p zv};IbhR|YZhHM?Jt5;zxe>f=N3M8SLgi9|^H$_u9QR(LyK6E{<4EzZ4kYNX*)?8Je z&q!r5D5VGs*tVl)leIVbj|0`zO<>7D45m>Z5uiWcBdrQl1e9_1hrJHq;{wRGN`wwA zDbMi2cU%!isRLRDVCaJi!L=qy09Iaugr7%ZnV|d7{;PL|N~vnNH{fa~$teG7$p;xL z-usP+`(LUhy%~(jD;GLOMsVsU0e9C+a1?OjSV`;I4&Zre4*h`{aEokHUn68mDpkRIswLIa zbRlUy4hrI!Bt4dvD=P;1p5xS<^9=5|t}4~1Bb)60%&=A~mBcLu=fBp!ef&pmcFJAQ z5O(A~BIimk{H|Z;;lQS}AFTgyzVqAn*o%p#hTo}0Px3R01Mfb(`y|KcYzcUaySRT3 z;@H3)LDI^}05KBlXj1g(X?0K>#akG_Y46?gTfq5%^!HDguYUji=l3a^8x-_`VPmu1 z&-Q^Ywjb@MGNMOvDp+?l&r)M3>uYi9|L(lc*LPC?!@nc^@L`5=;Evd+eOUg@B`bVK L+_@>jo3Z}`DCiJi diff --git a/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..bb045bb43b809509cdee554f9df8a10baee0af3e GIT binary patch literal 47188 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

    oE!5$udsaoiC!- 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 deleted file mode 100644 index 5893a49389626f26c5dcca5449c013fdf95c4fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3825 zcmXY!ZA=^Imd7C!!pm$37|e_okpyFd?YUuQxOWw_B!p5(z_WxHY-S?F^^9lS+ubif z_5*730s$Ma=MwyieTDJ{m;hd4++L}v(iXpBkFB=Jz16l=tK~Jl)uxrHST3a@UAo#M zJ?ESckIsklJm>eCs?j=9(njVp{a>Wk==y&8yyJ6KL2F7%e}8}a@syO~DVhBz z&yTED)TX4QoV(S3=u^)hx{HVB|1JI3Sa78O*YJONsv&CtIsVj&0|=hgZ{Yr

    ApL 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..dab0fdca9034fdac7e1d7f6929919d4cd8a52b5e GIT binary patch literal 35946 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 deleted file mode 100644 index 7deaece19bf2f1710c86173a2344ace19972ea04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1924 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≧@GvP}zhFJCoPHO&%)0M~Jrqrbr~Er5}(Z&H!uF z8xj9g(eG*GhwttG2`36z7Z|C3L`Gf-%06ZEi=Tw@KK@I}Y{79Ek5X4O~A#Qc@U9fOB*9#cx*9QiD znWyT~FTY*hA0{h6Syf?}cXKGNaC3n6_0g+?1dqZShOj{uLkeqT&n@ZPNqvLkx%T1c zlbUIr7gPyie~@Gdl3&JCI$qyrCJg#Kdt#^S(ZVfJJL?tmU-OjLqi*3@dn?5&q;nkI za>M4<8@Tnm0b+*>ghOk=-8$;ISQv4_G7C)}2>!yqMb|XkLiP1ad6+dgoyi?eQx}sS zy4?zw&lSqRl)kw_cOzD%JWg6`k6oEBeLgXBI6BOGGA+pJpWUBn7M?93x`N)lFY}lC zd$+AyWv_)J4g0g{Rel)pbL~f)$&+VGb}8-4-JnduI2Td!vxzH06b&RsB#8kgkrYcP z$?yxCu$(5_%&ScD%mudsR(Rth8XvH*^u)zhN!Jokrj*|C$Rr|T)NS*f_LX7w(J3rf zXE!wDygD6I&9>ovKuur>Q@Y%}+iELsqj5^Wq1k8hX#M9_mGaGRoy&ULqv$Mc=PkM! zG;0xCAox@z`hp94Hnva!*g#}tR1tj)Y2&k@OhHux0Y5%1sDjtgwbGhXlG*^FoT5jA zEL@Hcs=zVtT@B(^I`sZu3vo}TlmKM~xHv@-)vMD|qA$aR6NOeyREULVm?R`BxdC|q z6gryRuZATqkcrwSI7X!(V^i&Eryy?u@T892}->kGo~3CT#ybD;=xKUOJ91^ zJYAH^`}}HlDl>Rni61MeSCmS7)W)z*x!!?eRYMQ*zd{lhzf|M|({S}ge5uj{Sx^!J z40G6g_P8F$O$hhiKp#tklJ1{Uy1Azo6!#1cT$5mAfNdZ4c*(8g)-v#lk1F06IiqBh zIXb$S-CSD`lS*kLMX{_*U%=hn7_Up*uXib3Hb0naV}m;%$)iiXL^ zc-O3J^rn?O|LMkDBw=KfE?P>RsX+*RA{Q#ug&BZtBt<3H7%&!#k?&hKuyO!eJhJCZ7NXC`mqSr{h>NPjXUE>%fAk?nwqK?k9>7o*&9*U@OG zSiGtTTlAC3KZbk{aB_lv>OdQZ1g1!B$_WC^{v^ZRG&s8&>fP`ke(5=g zPduda&=^hra!53%4c9HGGam=TnJ;R7kcXrget1(|9r;@`@bJdh&X>NQwX}d!+v{|N zYU=l>jYFczy*QeBye_jiyQp{DFAN?eHy#!(9>(nRzON6rPr27a!q48&xiEGBV16WP zZmzjDjK1stM{B{lIF!x5IY+vupVT^VRkD0YL_#KPhcRJUQ&^as?=e%^c;$H8C229OFOwX+b?g4?EFoNz3QJ)3s8YT=-3|-P0adv z9a-_SnwkW4$y(2u_8Z@f_2j-WBy}Kc2-hi0mofGN8nGyiPW0R%V9c;2H%6<<^rj*X zV6*vQvY+ihNj5tI!xdNc4F#3IC)^O8VDqjHe_K*G#u?Q43d+}G4T`UWh0_HNF}vbo z-X+FmsPoLEh=6S4M1_bD0rx>uv}gobDvE{;b{{~%U4grV1@F}(FUksW=v z(#tCo2JiNEN#$a)mR9Jp^xnOB4F@>7@gypFam?LE%F!3BxSnz^S|&TAIspK%093NY sp@3>3N?)R*OS(vfB^s6nasl#m63gA==;%D&cyV>~Y+}@1WzX7w0fp;Hxc~qF diff --git a/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..171ee031255b5e6ab89955f7986b4b1af9da13ad GIT binary patch literal 27204 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 Po8|^me6AZ`_T~QrlUAK> literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 deleted file mode 100644 index 3e99de95cdec72738ec5d80a2ab21418fae2076e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1409 zcmZvUZBUX20DxttRxr{Ofll2TQ>VV;0FvSSkJ?El&YO#1yS&y0b&-JSul?Hd=lS#86L}%)I4Ob=kjP+4 zNU2UiGkbeGb@%&WVe`JFD3}T64#Qlpfq6uDxT7=NQRkfK;~4Y7bf^D7W*lQ@WwD7j z5Q4^IPE3&Pyx-MXdKP=+2o`~hI@)o=2_uv_X<&tmp3%_)LDYWJXtv^%D=y#^vGCII zlBt^3)|;AR;E^m7tlV%D@hRs2hE8p56(m%6bXQ~iS=tm9%vL}2dv9U6XX#}X&j9#XXh9HrX>i<)m01P?TZ`l3qobDk?m z*i@Qvh?0CgoCFD3CGVUElv335L66Eb$n-FH$!KvwCI0nNmY^{9;jG;kV=(; zQdww7Q4>up+y6xeKEJohBJie40UjY=OgeQXJ_TPUUxM< zf<0zn!Jh@zJ`k-Wo6PI#?H_VmYM?Sy87k-W>O+0i>IvTZ;pJHOo#KUj+$+(WYjAsC zX7}5a)nvpc=N+GPzx!FXEi&cV-XxA1>Ymeee427;qlKaWr{Hb>U~|zjXyKSA0Q00W zVYjH^Dd6c*nIh%}LjVg<0!qA#y>kX^_^#UJI>!jGhj}EOj;Ug@b%u)Cp<3yv(bRNa z5LH^A6R9nu?z07?0r*$UrW7Shkal1mt&!{A#aLopX>xsxMJ*4&*_(T94UmMvLUheT zcp#NYYPjO&7k6?N(zajaA@TU?>LykPFE!K3d!ZOL@P$Yrt>2C12u0{D69z3FVY7_i z^#NsRfpKE#l9kI9n?@Jd{k|^dZZnq)kaEM~R$x}L+R>TgVu8%mHk;)k4)t=aH=JXQ zv)vs@mX&TN$BXl4kec^Y-VT!T{>Og&B;%!sRXpv$K*6r^@tC!tSYt1ei z&2Og@c5@E%2CUjj8{B_!;Iz45b{5PHgck#<&Ji^?6yQCme$l$b)vbn4rMh| zPWZ~2>N}gen@=#=(+_W$HQ-&{Q3!H z^;(Pr-3YLXDeRt_uqxC=6_=YP$dII=KhAqZx%#2soM9cRG50}s9|Fvh+b@@d0x~X_ zY0bo*Acd0jKE6II;nJX^E6K6#UOyMHHDzUQmA&wZuQzs1ggu?kW5g;vH+(1joP)OF zBR3FfgzP=HuGwdKNMn_NZ7i!*VhV4UZ2lEum#1a+n~zd%TzYxjh`V z$h9;e4|xVwJXR^!dguE1ehup3ozZ%~bAJ+kDmhcI@2RBCpYYP-ORw7tw~unFf@0bY z#6RfQcczm$jBho}XgDI^JVca^^+*zQI)fw;)RIyd7?x|YH+?n;P5p@1_XVi{VUr7J z*cg_V#nztK8J(iy^}*YGNtYQ!77lw!H?EW#F%$A2f2mdNTtP2a$BD}#l6p)5J_p3w zA{r>6I%ArGw5X&}ZYJEDiuPJa(J*^zMl4;$A>J`up9&r{73j9#BA}N-Q2{YZp^%1A zpcq*)keE%sTshJXf+Qjql6ZrEF)j#icdPDzI6ycI2|nmf$Y&!#P&ori#2AAmWDHHE z0M9@*;26RPD6q8QMB+#S8BUDGgn$wvRH*frVC#htR!l|-5_-h6A&DnQhGi6{6m0g_ N25Cx)y?QFm{{leGm=pj2 diff --git a/client/resources/hardnested_tables/bitflip_0_0af_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0af_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..cb3b19e4447f979f4da6e1ba29d39cb17edca2f3 GIT binary patch literal 15338 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..4bf9b403e682b7d810d377726cec2c6525826eae GIT binary patch literal 17155 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8de773b3fca79d8ab3cf7d50175b0af5b8d42454 GIT binary patch literal 24777 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 deleted file mode 100644 index 19e1fe89ad8578ad77686020ca213fb0b21ec1d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1129 zcmXxYT}%^q008iV&g<8W3T?0dEHH=AO5s-Tl08&DZ4uZ?gF>O6%Lu)Hw`DF_(kx1F zn^^h*v{#FuxLe|Mb%M%>-udJ-#@>17nCw9_A29KuO`5D(409UrbGp6k_xN*v_}Mnf zwa4b$^CG$b4-mAe8Su&+C5}^#OyQo0@PF%=II$;4XYzyj+}MYjIkR@ih_WR<%A~FuGcGl zCtu0=mS4149(G9319vYCE#*DWEJ1v$Dl_WYXD!&9YA={D9DIL7A*kIiQKSBD>)2YE z+&pd_btPKVJCvQ_L1XxaS<2-pYRCtq3**F420p0LzMOsCH9cx@U;DK%os_0};@W!;VPHGTPG+w+;t}8tjW;VI|_r} zx|#H{>Mmf04VjkZOBZV@*3_AgHm_Us1z#*5j6(uGw(;>BRZ3 zP{Z`!t!F!ip}<57Tfb}#h*HrRICpvELYrl`dO%)FtGEFwTWqH-}O=PN% zKi4Ymjuht_bv?1R3nd$e?!0p`8)rQH0+*!w=~+lYP9SO0)}S)#QG1-lt&r!LNtyH4 z%J4@N$FNQ-Yl1SA1t`Q*Sal_C_Qkv3Y$)v&-DieY&K!zlk7NA=IJO|C056bGGHR4W za*_C8(pM_@?GeQb&c`T^GB9S3ZI^y331EH=SHYcDpsd&4>*!HZFh!^kDIhIKfq8VJ z!s=u$<%VLnQ71UHJJuG==Mt#0Vv3e?6GsXE0&Kbsj-}}X}!SA@|Sny>0>;Xfl6c9a_sD< Y#`sDO0~?~R*`GI`sC)mQ()c+1FCw_aTmS$7 diff --git a/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..60ed5333257ba446924cbe82895667b175040bad GIT binary patch literal 18407 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 JBn46Y{s4xXro{jN diff --git a/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..2d542516abf581ab8171fcecf5bd40d17d1bd607 GIT binary patch literal 15231 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 deleted file mode 100644 index 38fc1e0aeb04221a6f2f8cd7fc34f59a21bdf331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0c9ca6ebd3b62b85fbf99c1cdb80cfc5465a89ec GIT binary patch literal 37196 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 OXZ#6&x8Ag^>3;#3G%1Gw literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 deleted file mode 100644 index cb9afb002e694c10a1d31d3a22625ab80daba6f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2082 zcmX|~%XEsJ(}TRot8z}U)lTnhtGdAK7Q?OO81a3m%F2Jhl&9P5l`26PJHl zvDa>5G2rjx%1#Lud~ggf6L5DC z>vDd${WvQe=*j%s_L<;r`@OZ-yl;dk)8r{=pb?`-IWFt%n~9&!{&2zDh$QZ3{ZMOt zH9LJgH~V5*FmV;0>{=uykm-|<%`?bC_bp;L$m6lF4WKjlB>g+HpovP#@yM$D1#Ln? zIBXL!al$s3XKTRD&-Xjm<)DF4md|f^sJVU*Win-)xayohpaVl}k~zRJPrC+XpvO#T zIo(sy^lLr(fb_JY@cbGB^AnT>QFtXZWhO|v%ZPK0qwmtgK}e&Hr}xZ7m6Kt%IhAP< zrCT)`b)wRS1r)eO&4I?0H8FHS^)=%yhmxj2(wmRD;#8a}ZPqa1_6l6zw{VS0dO}_e z+RQo~36JY6pmGtzQ5;9jiV#u{aO5fgmgEIcoRdwP01iZrC3`&4}b4!m`L$)35;Q&9HA3dt>qgX)=ku80aR z3CULbO2>}y&CVrwE40nDwNIPA8LEF4J-KjlY%SODOl2L|hsMoDf6J8bR{ixjCgLF` z1T$S*UyR~j-rFnu$-Re7Q%d(v?f#>stgtKG72eAAGITq|Lx1jW|5MObY!L2d+N}S&^VxRpgB?yQYFd@BRL_?6v84maXy>he zoVYpri?pm&#haLC@afV@gf`Eu{aWZTJqrFw&CfSA?lK2CS?us6Z~k2E}HSu9nGC}F88llUl%Sj*V0`HZ(D+F z{zLrDqhrwJmyyeNffDx0fj3ir+5V0-UmUGTd8GF@ZA>#HRMOs2SFWz4!^I^-=&Oe9 zw1}I&@}HHdH2ZF2(|h)*uVC12NmCAYGRXu}i+;+C5dEAY{s?j8as)n{Zs5WYSEnF7s2LO5^gaQtK57g(7RitY zqhM9Qo;%kdQB{}A;LWMa4 zPNgT$H=Q_rnv%3B6kZ{!vxqoClEN9EIH9M%<4tT47i!?ks@Ua&q_1 zFCNp|V_UeA6V7gvlO@Ns%nM3cqjFXm@)s2{PCKM9j`mYJWst{#0=U8}M_iz)P-WpU z7|^FX#?8Y-b2HuH0+k&+Vyf)|YJNFzc-SnEl#22!$kW?=Qbx-w=%NPZWd+6f`Fy` zMfLDn-fL;23uKarizA`E706#tZNcL17M2QJ*8;Hf2a^-*^H0{>csD%_xYE9ewF^RC yndE-HRDrCcg!B;YZx$E?NwzG)#Olxrn$(Hivxow>eGI>;yqlQvv%mj0Y4rc(6RM2> diff --git a/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..dcf6b9deb2eb8d00d0c1a047da227ae71b6af4fb GIT binary patch literal 22943 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 deleted file mode 100644 index ae6e859a852ad98d1948f29dfcdd3a1f87f102a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2460 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 NE`SoQn#SkO`Cpxp%0>VH literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 deleted file mode 100644 index 90c5626138b4bc1800acefa498926d675510c665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1352 zcmV-O1-JS_T4*^jL0KkKS*c#7asUt}|Np~X9UbwXuRRF3;~$8Tz#qUJRS|+6T?l}H z062g_Xo=tn-v9sr00000000DV0MHr+fCidm02(yN0MU~K1|R?q02%{8&;Zj+fCEOE z02(r2fW!a+zym;N8UPw;kN{}YAOl8B5Ey^}H~?r313&{!G5`%4WB_Q%f&&l$2LKHL zplASTra%FsOn?m;FhF7e04XXW1gDZSMK%-Kb}RjXh6MlW2`IQ`CB7 z#GkfN0rKS~FJl!~qK`z&9^yUY9-2H6UdlZ2FsBGSfz)902fn_SLUbz(7(50adDuF- zJ;(hzosQ9w@R^KoFLZxc#pW(XNcd3l1Cz}M1xpN)^OCt0k%IUas?7U`vSsQnzl_aQp`j2T|02gP`GE>4(662Xg99Z0eVSW$~_y@egg$nCP+g1Ne>!a3=y} zc9*Km{43~8od9%ITqW|jP7|X1=3lYNej$nUnON>eh*PbKrv_XO!xmjvDTgW5FlFGlGZ$eyi-dSAeMflhF<|KE zccv^Irz4Y*cP@#BIA!&*(6Hp4R|Yt6a_Vs4#!Sv!I4S4@z)WC2Qo{QK0oXV``1gmj zavm{ur+If7dYW@U`3uBA&Px~qYea+T@>7or&8E*4f;x~>-sgN88eF~Z8>m+3B5 z!Jil9<;jkW{I6BzduQQxyHBuP%k>V99x}xTn}mNi}zIUS&N4cY@^N| zB6UT1R#fRF>s8S%M&qm3?n0|bzc(v?~&ex-Yc+vwR_IzfgTBU zTr2b(uaL>g7m-(deF^pp#RQe8IWb&6$m(KJZ>EL+RkTS{UzN3Sp zPOI*|ca-PwerHnAdWYGp1 zsAS5pWMpAtm?JWlGMF-ktXj!NW=vREg2ouk$uPl|WW>tCF@<9WRtqr3MU1RqOk*&Z z$uh}f6!mP?vW-!Gpe;0B^ KI8czOUZrwNNMVuy diff --git a/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..400120c8fe30437f1e8c8ec33ea81abcf10a8ee7 GIT binary patch literal 16061 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 U|IE?+74w}agwN*(zrOFk0OE`y_y7O^ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 deleted file mode 100644 index 353c48c88208403f0cfd3208d24d7edde9bed999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1444 zcmV;V1zY+;T4*^jL0KkKStIjv)&K_ffB*GYLAQzYK^#C45D)+mKmY-l0r6lJKm<@Z z0Dy=9L)qX9UjP6A00000000004rs}VfC-4ejW8g@V3{xo!P2<#9)~)2*9MI zh>7U~L8Uz>qe<#)C~4%$s69N~ET%y=rg1jJv8 zE)=+taVyqPtLy~-l!!45D;82%CIc9zDVAU{OcM(#hDJ)oD8Ry)uohueCKx1-*SYqd zXPEUIaOnOo;CK^;DTk?e7w%qTK2q*So!m~wcO5aAXSmF`anPNXI$_|ulg0KdJ_pP* z*m)T+%3~P7_79x+PeUxi_KTyj?3u;>XX1XRO1qBcTt6}SuNCyC{+>@0#oc@7)UT|5 zqs3n-e52h%-+2|}dx7ztjt_}DoJZ{CxK@Z+x)nCSo&XC{hnuZ?zs5Z@?N*|JH4m2&uP)c{x4F`w0@7d ze8-A-nL9CjDSS(TlZEa+CHu!0Vcj|Grtmnsot=kEhZ)$*k29rv$7XbW3D|V$-I>N8 zQ^C=nFyp(}4@?MEi_X0UUXkwu$na-( zWz(aHV+>`6STSHT46wW-^&f86zyL#w#WkF;+#BGcuV>7YQ9OW-}?4 zSz^q%QIeB_bhmE}0fGmJArm!evZmWLPs9jthV~Rl^2jDqJFTz|58` z7&3HH=~QB~3|3WwWmu_(8I_rgt|})}8G^Vmm@Hrz#bnDcafM?mj7d0UDbp*D{}*yaI8cxy^K;hM{h`wU diff --git a/client/resources/hardnested_tables/bitflip_0_0db_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0db_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..d89176694a8af46986518d0f2970ef9de7e9682a GIT binary patch literal 15340 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 Axc~qF literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 deleted file mode 100644 index 2d2e1970706f031b6d3402a49d506a482bc3fc07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1792 zcmV+b2mkm&T4*^jL0KkKSr+e4tN<5A|NsA0etZ#8Fw_@ea4}E-7hs0g1OO30fCQEx z00I(9kDL#J-0U<$u9@OU)-sq{9yvnVE~^98Nt8(!WUm z(Cl8Pq`f8JyDub}vkyPbz}#p_%=Un?#T{g<$MmL9>!-W?7f zz(0V)?hY<9`$yV86W9l_dxiSR@SbON`4$!L6YvjlV)+X%GIHofYn8J^_zoqosT=BaVV>3UjIy1<;xT1~ zkHlEKkn}vCBNK~*i!4@8F@w-uJe+5>(DWUgN%9`oi=)NhaX9x5JXc`zJRjbB-UpI+ z58Qn0`G>$iX!1V8`W|WPVLfXcSs9ByGojO>_AGIk?qxeL>4PlHA3^RozNh*>#rub~ z=^hD&E6sVhPbWtbd&B1=idZrn4*~c`%=!nsaPb~1CLHWM70ft12N~0`VbEqcTwr*e zIDV%S^Nu=ndA&#IKa_V~wtgY#AND#^%+LG30rZ^@Q1!nM_#AY;6V~GF$7kpn#yhSa zA?ag0TpU~+EO{N*@CR#SkG}sikA0>9c>>k4}je6JXJxBPSv+=6& zc^Lf9+WoK6`JaIBSJu9_6VS)Rd!D8l^^aNR$E@S@9UoBtn#1$Haniq;J1hMkmF!sd zJ%@GZUpnz$6Wm{vuga>wAyzCUk5cwM1I&ICi|SXoU(`RKaPU4=(ef|pU(9_cxcuwh zxV^*XV={lq@w49H`wwZ+{HLhyzLVH_4ukU-ydI@5>{wFboLo}iCGwBByR7WY`>xBy zj+bSadf4vE^#5;ns5_49_8(&Gc23FZ525zEo})jk2O=Ga?jZO`5nLIFkU$89VKE5; zXV4N5Z6Eo4u0Lb&zVghUb#e5aI(yDN3#S*xeFk3wWd29pcpO(3;XZZqr^J5|>QB1A zjXp*3zmY@YPpM@3Pt<)6xcHv4+L-pMj*0AC9+bLRvD3{vkKF8cKaGAvB>ak_^%r8x zEFa`DWri47V#0J>6BZ@JIALONSmAJF!!cMd@OTt>A7RAl;85Vo24FiG1N4|yV#Q*f zM~QICzVfeP6v=c)bHEo8Tx7Cg;JYSL@J<$90(t`OQIeS|zj&P};bfgBiGz%z$W-iB z6B4e);yVt+?o)#X8Cb?Us&`pTvNGtpE|u6kRg1FeS!YR$?~?4qjCdsAE)k0+1h|p@ zYbeH6GE8NdvErVQpXykqC5m~J$CFv!CzgN5*?Lk0|CaITn_fUg9^@e*7dJQtHOWkrTeG6#}* zJFYCTixjxbW?U?HIvh{hs6TR-0`7u5l1sn~h-DSU1(*`xiejO_I2iv_cq!nrvYtbS z7CkP92L}_2rIsccjOA+Fw4Mj;^J_Z85x+&;Nal!GP+z@V(HN`!v;nS zR!p23Tv=vb3b-!nbXe(^99&&GOtQ(B4l0+KL(-J)spL+B$R0)5c%CE3FzM07bnH%x zg3A%;$4peh3Gq-#nEtiE5$o1?1y4-v&G$A*I@2UGOpu`h{eM=xS2R! z1ITteyN=}XaoDkjJ3A#y_+pj*!c?Ows#Ep-swx%50;&Gtm6eRfOp+v@B19~NgmG3S zD7YlNiX`Zi;x#g$mH7BW*YmO~~6Oj20EEHJBv3gBUk ilQ_5ogCT{B7*-f#3QRF6j9JJ3#oUoj6eI<^)9V1_Kwu^S diff --git a/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..9e7ae09257a2360e24323e133171e82dbe75cef2 GIT binary patch literal 17854 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 deleted file mode 100644 index 14ca3fcdae9965c792aaddef798e1defde36cdb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..07135ccf2e2f291985cc0dafbd9b360add6b89b1 GIT binary patch literal 25961 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 deleted file mode 100644 index b263afc60d64c784d8f33710139047f9bba33d80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13180 zcmZYF`B&0;|37})oZMPm2&l}J6d?t{%e-t+6B8jt7U5NyA}}m^O`9{?Hl;}}P>O;; zP2~b2iwlC&UhWH6ia=%4TrDoZpT&-1l5Du>~* zX@{}Fkx;mKASvL&yr5sGc>by>H`;u))UQ#gf*sc3OR^Uh0iSYq$RHw$5*6HQ?jmoaDN$bwlKRT*cK*XyM=1%+826I0!AB%VP_vusZt6? za?Ax0U~9f6bK|#WKK00y)p>=8G*BOR^L$gLjoB2&*wneO$G753XU3|aIjR~Lk>H&(Iiw~$h< zGc{j!%aq0yo9s&EZS_cQu2|dC#1uDhIA%x_fN;t%`2tAYl-wyGSaLVpz2@5hA5hNt zFo0C*B1oF+q~>L>y`LvxoI=J@JraT$b|^%nlfl&5#Ib^KnaV(FyyFE7)Iu3KPW~i< znIAS8O;zL@)S_{-kY+%7n$A_9E2f4|xPRfRL+PB85ecN1HHW-)Ujp?7#TTp8O9{T zr-K&U!7jDTi_Y%8pEPRpap;cnO;fx@`Hb&i-TWzf9SfNN?L+2PtPGcI(U@9g0iQC5 z_hMBhdoTaC5DW0oEDJh>&6J6wI(!{Cr4^td6rDLt2U_dEkDwEGRHot75F`p9R9>_5 z_yZ+!_&HZ$D;wI}I{~Q5$49Uj8Vv$Aqvv^R_Nhq1;4}(~DMk}PuCmQ0Ksn+?q`@qK z6>5h3^tf&`;l5vP5}crc@W@H?M`f+FR;?F4DhgU>$&le{Gab;h@bs&DW_v$;Z=uQa z6}rNf_ZR;qtbKHo`a%sMvW02CooC>3|7drlIn{D~W_)q0AuF{|!Y^#|J#!eMcR-OG ztV+gZRDcI^IC{I>$+zVtMJJ&ZO;n>ziRI1X%f-tPlbl*I1kzwau))|o0f38fs1&9y zf>Fj$D(WTcbmu0D%2z$m7`$nR_l0lY$b%c}22xuIXYJxtR@CJHM01u2AZL1( z_vHCWTQ^5(#%mXn{k-N#LU~@^{L-a$%qT8fD-3Kl+T~GZpV|j%Z7-uiAuE~0;W_F~ zp;_lw(`XwIwsLtgxGi1^)&P44G!5;wiDgOVs%n_R%%(eod2fM# zE~JOfOtwR0%XGnv{Q}vkPRqdQmSv}I$oB2N{!<}foow6w^0hgFxhJ$mx!3x>N2ay7 z>17AK8Yi)p&$q@h^CPs|OG#-j{I83$fs|njQedmsnw#Sp-~GCM7c(73QkyH3R1Lpt zv4kEkS3Te%DLh0P!QMvzY&mih+GvSSfJsF2RLd5ygYgiUiqojaL_{R{b`0~7xpGyF zh65>U?BLTX^p{V!yqNh=U8(+_gQC$XO02aR~J6}JI%0x68>oc`Q6-eRrAp$lXx?`*@DG-5V4IR<6hyk z&4>sROFmesNT`Em=H{TVG&CQA5CbSFhR`ZQZu*o!2;bG3w?G_0g=$QpB^HbT3AbA# zh**Rk4Xx|HW>q{_H&pOI(p+U`N2^My}lQNJ=Z;ZoDZc>`%ezH_fNVg6KVJawAkx4WHMauH9G}a&#W+vtWmXKo( z54K*6b559a$>p(?rY5BTYTq;V z!NAq=sZn_l7@;;df`Q24K_w&IV|8@|8I59I?t%1z1ydEk7-f8zJE~xrM)ZtP@ygt7 zWAMQV0A$bYV3b(=ICvUQ;Oi8COiBwn&ohVL&+#_PIs_g>?qt}cCz~VHK@|kFfq>FM zL55%=fob*#kD3fdD}*&lXc}FNZlXhT29xVLM&wHSutYcPKC%#Sqb&tp-9XtdAm;rP z_@rpJA}ivPW8W*_^^dAN_^qgTaRf26V`h3Q#zxNDJUYp=4Ni1F^-$3oUnqnKCsU?` z+H8Yxr%1$!rj3Ow7@S&;7SA+J!c6x3G1Q^y76%U}^s9Bx#Sp#l+cQu1bKg+kez|ao zEye-ce|mHNx4Jhk{wmVGw;<#e6d_81i8s#bvm>I6d+7iKrY>k`ObG?3>@}q#0|ebG z7m}*2Tsai7iv7ORQ%}grt$iPMRmz|n{4o0D96gCfJ%R!)F`|T0EI>u!HuVo5>)g;v zBS`sm6OiPl%HX|8p^T(W+P(#a@BzAJ*g%CQ+L#^OPA)(E2#QpO!P_f7xb&K|*JyPI z`rwwoTsO`dsE4pw7f6%y;*YP0@YGd4g16U{AMAOy(!=7d#v6@v3tf;z(~M!LJHQ1f z1274{XYhO7lLw_%$U4SPXV91KZVGILR)|5Z0JJp+t@EVrh7yFTIO+!X`io$`1<8N9 zTx3XN2oUV*OTq-LnPdmyurQiTq3AsoCq_@Y@>EOLSK$wy7w#&pU*?hc$+sWNu1ao@ z^S*N+eb4aIGu4~Wo)sH>M|cQSRhKeb^;SV;i(!Pfa;~AKs`7Mq3;3MS**cR^ljg7 zjmh)ki3Ld^jx;YwL;_ES8Bm{BD`;)U`LUTSppIGS5P^9H(k%tLOMl;T>h>vfbnHVf z-p)Kk+~Yl0k9=%zdgV-~R_G_avh>d$=9^j8>rs#7EBV&hEs|+w8^CUk8$lls)QSnV z!D2$hbaap6Ya40hAx^hcx@N}0~e9_9(517;G zD~fW}benzDwBSIer|$rML)ngj3iO?2k|G016NRKQOWn4mIqFPy;&ePrmoW-iowPvn zWnM|Kk2epbjY~Kt1Qfd$`)%{dkSkIg2f5CyQit?e@0)#=nisahln2Kd0{ZTDmk~zV z0~$QeL6?hi-?*;Hh%+n4pIvA=f3C8Km@$!F`623t@q&N=aNqj(MWnQ?u4*DY(YzGX z5-LBWECZY4n*RAZ^y&4ofgN+W&CfR4(kLyY)X(nJYFs9+1m1s`|;i)7>l`}TW0T^HCepA>%IRXcY9jd zlb<)v8nNpZS0QAnvZb0nGIjQHi#qk#_B_lWLzFYdR^9|ZJ$31FOW3ZQ33dD!cH$t? zeMCl+seK-ZYARmnJ15eEKT7xNBW=dKY-81^la|svP|WmCZ4oK4Eyp&``bUgRQ(iXQ zCbHJuFwk?wsNH|aZRQUvSec&S2!(;e&PYz+| z{4;BIe*V7sl<0H)-MFT|n6Dg?r?C$;C-Qu-Y|=m1Hf-9f#UuqqHBl~z1C?ekfF+_; zI?-g`QL*Rd*F938lMX~+6%n9_r6q%;rtpeV9NVlEi}D!iCiGxy9oLAHu=K4v!-2(1 zKT_jM&S?r0G{&~0?I#BnoUJjj>xr2Yb(n*-5F&K1?so8>Ja~^<7P3C2Yx}tlsvYX@xu@mK=)RM;>sNdIaI^B*f+V){%G5=_xZB1lS3zlkG%Ttns-R0(q#EQ zu2{ig+?3w>{c=IpolaF-Ub+A%Qr^FwCNTZIO%VU$;?3uez2aA`{65xXR?K{8`}fuZ z>7{=@AG{>^bLQTYsT=-l4~fn{zx4Z0_xGnGF5d`xzpk^Wc)7a zsHAnyhpL=U_;>D6?% z=)@0WR$EN^GD~(5_YV4>B=QdEsUHtCe~$e1&YkJM>#f;4zP}-Gh&nNpkL864{WfAm zTB0R`%|Yc0qS0|XM3-)J28Rx;T72;L_>YedAq#Krk(qw{vtY%fa`40Yyn69|%DcN+s!5EMD=i`yYvotYETfv(QaRmJ`wyb-|+~#f@*64$sk*5lbe>bX^3!an3BR2B=I}d zoK8a;GQ1QKfzdc6*1Eo*w$<+ZaU=zHT-aGwh}<{|l^xgqg*FW`wxq;8tVdXl@SeJ8 zIaZ$>i&wAX~{rJWysFN>DFhr8E}(w zQ(p>&s%Bv^^@QvCUpO+MmervbBg~38=17xF?0^37O)sH5ef6CL)m#F|-QA?L#Dy_(F1wEXu)v z>Tx0>GCA&CtTFbcpI!tI$pSJP?WA+`2J*4EXha`IJMZi6+V}N6+H>Up6k5v1@@uhM zJ#&8DSZaDDj2uZ6#*{`N#n1dU9!*O1S=i2BMO;CMXZ zGD<$)oqFJi3}cOe`C zBr1wX_MY_k97M!t^h-AE%GT?63P=|jGEI7e#10fM5(x=M6QLDgd)0E1#dPPB0|eY*t}94&K#(Ruv29izO@ghfLnEl@*R@2 zaL;C1`ATZY{>8~$Kuw;(bE&|bn)Lb0>d1KVZPI}AQ_h*8iug7U-q?{#-RSN*s+k2~{fcIImC3{7?;K>PakTsedmzt6J4S zYxTirktF`(>2pmKHGD-wr2B{YZKN%JN4^j;XsLD1!T>k>wbC0u`xM@Mv(c9purbtS z!JM3LzV|J2W4$6zl$3d|f|U_vBMNoCCKG-*BOLFyap~M60Sy~nTox$0y<9R#BwrW2 zCSx2k_ptjNmpKbvT)e3Htg?B->3lN;ZxDkB|g#oIm2Y;s1s z>Fjjo?r@cBYnD59!RS#_k!C8h{C+8lxo z8Ls;}GaTMeb|-G${-V!Tuf#*&2d)Y_Alc{rq~*Id)i&L4yVlto+dcYw>W8Exk9P4x z@vAfI-Y15v)0Tm>jqO3+!=X79QdEGv!KaK$t8on}t#++cHzNaqP}b(Qg-lS5XE_RQ zPQqh+`AHrWSt@n`d!yaY{eX5O-;cl9;Onu8keR_wcGbX54MDw<)tlC3ese$*Qa>UZ zP$=?w3Nl+P8su6Xdem8KcOFD<<Jovxsj`a_&mON9sFTtnVYX4y=zoV`yXUvaE(ZW0H& z5ApKKdc}df=vDHsH)kHb9b5ICb7e+kZxY<-^9lalpVAFe-uDB`wn5=01(8&N1-C3Y zw}^^x@1&J!9VIp_ZsC__b&cOSt6RDeb; z9G}=UFL|MNe+7n-uTHIk*=z+J!?&azfRhu!U{r`k2g?DvEEkFcmrGd9Ui>n2lP?Pp z61g^;8dlKBz=BbaJWH-#qCE6rl$i9agb+L6Mg7vGOOr2+&`%g#BD!dC|*rbXDKtgo|=xLc>}gfV1QewtvU? z-PjsLMCqbA!T((S@k;jQ%bAx4$}ICg+eS~!g2m)bE#OXQT{f-pqQEV#BO3MMS9tBP zP4$eu6V0D8)#`HV+K~Bqxh1j&R)!PfRJz|Y`8jZKUim@3Vg=1W6rpJ+=?)QigIN$Q>b7b`61N!#1-3Rj! z5RrKmW_pAZi8$ma8WBMUUyB1T3qyt_^4~+HM`>aP;&+5;m9&Z3>rl zaqh5jAU%U56eqz@JdD6^`^MN)a>DVtbLWp*$dH`QZzQQBh{*)K4w=X4%i}xEwb=Y- z$!;x{;-=C3+)n|+(b{(3rn6ofS+!K3xptgeD?+%eGd#-eS<`|_sVXgKuqwj$>^Q8E z;9@%4D-QQlK`AEHk+au&8pITgj+B>~Gs;U@-Gep)Lvu|go{O@ zL}m{7>D+@9g&eC#vbiEpB{FStsW_aa9nfWr6F|-AIWHcfK3`40cj@Y})EUSJ{zD7U zahUV*MO($8Rg_NXP)pOy%=;O|<4;9b zB1N3^3GJu6LvhcsHxXmA??3nT`M00&k6t}+&ysznaJO}R=$akN7WscKIsw@eUGdw? zzkLkr8<#ywSmty;?^liSwgigl24J8L;3*OjT3sk@30OuM&Vz)E>imFmN0b4l9fS&7 z|Hp<2O?Y-y;=zTA#7B*jA%o;ZR;z}VImuwClR#!1BbRFlY?RCOBd5>VfTlzi+FXut zCDhkm)9q*#% z`EruLoi$7bb1V&uS#n~DUsw8*E~*ZgTiB15v%K@mb4gXOX^l#MWU_z-R>(4T~t|Q0dw%D1c&@unewJxeX2I+wE5c zq0I5YG{lBWDeuJY405W5pImcR>60iF`WmYe)wn1dfgXO8?I{j;UGhl^G&q_$oy>P_;uH|2YK1zt zuGg#!Px|I*;=HKwM_#G311OP*7!B1HNonrKEBLZd7LozRQJa;xRz5ctO7Lvmo&167 z|6>;boDtR ziiP`Re~L?mU3M(;)t%_o(CRa;Eeq*2Z7+tj>vG=A}hZudO0Vt zX(xf~C1tv0*&@`;IhPwjYTXiWtW$|gw0Md3#pxI}8!=0#E}dy{ENhXfT= zl^I@{1}6qRdXin`L(UlVM4wu=X`o8f<<=uxvH6jhBa@iK^B>SuyU{{KniRVxs*S-o z%0Bx7!5bafd%ZhfVsQ=pJ}SBi!Ilxa^v0g!S&Wr#D55Xx|HI5+GZfvWa7>=M z{R{SgF>`N6(wyTE;h}#Qulz!vGyO~LIo}$d>Ylxe!S9%9i!D&=mDY!g7&?BNnN!q~ zx*L^+MB7%f6dMY5?`l=jCm8Hn^uW5S3SJXiK{(GI>=aooWJ6)}@l#G>X%&Alh{zLj zGmFDZj3fZR43AxP^}j=p|F%>;fAf+b_oe*@pPTBPyQDMIhn(r)g9nR>4zdqGAg3M; z)m{3}wk@!#2}RzJbl0k`;JzV$a2|p=QfX^A(1~bfhW(tp!)7OR4@{p1RUDomQYBQ) z@tXT}?2;e+?xVP99W@S0PI{5zerbTkNIt^VwbJ|{EQ>08&IpkTK2r?Ka*Fx!{`z*> zGM#hViT|t)`&=pmtZ`WtbQ$G+8h$0y3V&d^;;dXeFA-ls#VZJT>YW$s3A zulZh7pFnJ)T;>0lb1U!4-!0D5wAK^3H>ZDR57j81`?J0iEkL2d`i6pnSe4a6U~ucU z3+D}MbOg*!(;4!zE+hkzW_$2fS=BgwIr6vm2-o!7SuB$;G75zZ^p!~VpAN_#`6Pm^ z&vWHOM~ilyieIPG{6Z7b=*0rW?j0~Kn%4xQX+9(c*!NlU$}gR`wT%$@8<&5>3tyyY z!oQTaBj=4`W@ZcNVK@)QE}^eY@(lW1J(cXC2@ELm{1x;ySkiw){MZl8=&M zl)~Bo2Tt3&Hj(J}fcz$L_Q+1k6Jee0LPp&BMbC+hCIQ>Ap6ELvL4TBC37w8C)3IBl z5gR?B)lp1B@ zIXx2RLHbs0!0JtugByEK1TuW!IjFoOT)!o`J_)7l0@2^=bKlY@#9${H-B|@bn4-$o zx7gmF+QR)fwR+>Jh6t_pv#QLdUhu8@5vyYq(1!EA0cQ`|=wJ)cqn4mu5U;=^5Qs`z z#!(W{Z{EItE})9?)?D3n{OYa&$4{6WafPyVv<+FQFCTk;+1FmU4)fP-`p$)`LGth* z9JE?d_8f7=zx7>HJLvSyzn=Xlntkb<>oa#($wl-9{F5cQ6;}dY|G?RH3VSs>^I`q2 z>r>0ODxW}vIaaGR71RG@@#e)v2anZHEB0lPrk~c!RPUfK_l^{=i=FM5J+G@Di0e~< zl!fz`#O)zWWAI7y>vBt*6PDnh=aK5u`5k$E`}y~l_AZRKpt(L(LikU=)b5k}EWh*9 z(Btd$nFD*)j?^;Fth!t{b?4suE58)o6d#N)-WJm}bbLq8@fFbp*U!Er22OJqZ;aje zgg=!Mx;J)bZ((Qb9^ta`fGZm{Xjd(7^C()4qYMzcOCcCj7xmM^-v2R95lvA<491Zp z1K`>A$lRAVmUYD}Pq{GjoqxBlSHQS(9ptW?d-(xB+l?RBwB78uLV15+-MU|1{7oL} z{qSO6rwlgt)8;t%G#^Gz3$p}`TA8<;9M&HHgs%LEC+Jxztu-Fc9e%z?32FMN;k5DU%6tHw;8NuyFHJm)Dy`T1jdXLncVO5c_zrEjN(j^yrM8T5>0&v~jH z<)6f`{OlF2Fse@`fygbOVaBjxrqO|bTaeqs7#X*Yf?W-nG0QBkQ^Rn&W& z8y!T|P48)oeWVc8Fh?0yhC;+Rb!33W`?l*q<#xr=dl~$;Oe|&C2-51=G*ZR=ZQBTx zf#Qr~@Ur20t8?K9ooM1 zw`Yi`?v+*dR&VI-`08!Xqpm||vdJn1IP%@Yl1o>`B++MXcYm9G2~#i zof<-C6OBWo0i_s}gz~upUG1PEHm%*fnEI5^6rB9Nk_GQgqpq&hoDRfndW%2fOAIRv zYicCIrS>L!^)7tYZ}VSP@cdm&jO1e9Q8d3WJ=FE?O}EHFv)a^qho5dKOVX4- zI650(St`x6Rj5K|7W>7VwQ_1&(?BwLHHR%>4d$TD;U)^kXk@3s;C(P;%v6&ngRc;S z7@W=qC9=v>q(|h+p=!$LfJhz1=E%noW`lrW?Z3skWwMTmp#~fy52YWJ6i^R@>{Em? zqRK>^JSdT#D^(zr-=K7m!{7)U;n~?80D;d`BPnKHZbfuxURWP^_4#8NY03I7#zLftWgv85+%pZ>Zi7VYGFMqW z?oA@P#Ei*Y*l^m$TmR>kt`M*f!L7P~;>iD@rXLosgvk$cT|7(pnf&t8tsh7q&*m)Q zd{fNo3L?hE<-1$8?od=qPF_X5QE10gq_S9krLAj~A<;@7)iiOP>_3(Y|Y#yg%_W)qhzbC2ZJU%%15%gmLqwsRU`#sLU!9*rnKs(1XNz*a*Wft z)_2z$MiKt>#&#nzmC3JI=eORz>XwF|D(QW)tjzBX)uQZPktR;R+tPaj@<{!veylkA z$GrgmYSrT%>nVS}R{oK4F?s(Owq%!Dt}Pmky*B+^Qfo<&8kiR_I;CK~-4K{>^{MME zOmZJAeFyAx>VYW*%a+`k@5_S-Nb;^gi4mq(Mc$`4giy3?q;hh(PevPvKN&&KO9K>@ zQ>w0|SHbLZ^Ywz1a`wYdhsB@mM9?%Q2Ske@!22>Lpj-v2hB@Yy^!H!y zZf^g)|IwpEKc$~U-Hdy4BWlJZN?|^HBm?Q(ke5D z)Bae%^GJ@bD-73QiSv@Efd9mz!0n)_43kJpt>6>9jUM4St*typfd_Z<)R^1+&A-J> z;ndW;&0@d-lTL zC_zz&BeBfMc{CyjsHEMQj@$O zt~85C#wDSWG12ND~8-v{^=PcF6v4_DQ-j&qXYUn>)Lm z$ZEjW+sP0Ih%rthLSil`kOiXM2f{UD`J2*%$bQ~-NzUzypR(Ix?k*{?8StRS2)gbq z?coZ>3fi`TM>mJAeE#|B8T=W+iTLX1w-5_f`~SUqIvjKpCDrR$v?6Nat6r^Z1adp7h04~_8*$P@!#2*2bbMuJVmiv zh)6VBba3?@-1o0S|B*J($lpc}V0vX~Zk)6M^;8JzYFK%2)4_=`;-y}J3@1w}d)OWDD0%+9~fPEjP>%P}cJ^ZbpSCGl$Qm3o~d zJCnz;2+%D4$l_xp+j>Z=nBP)Ct2+)>g3-?75fMiZYKup22Dh1}awZ8pe`sqh<(VsJ zH}6)-ew+|m-?Z^fx&{)QTz+s8YUCJAirk_IYE3k368Lp;bt-G*U|N86S+%^1TH7}S z8498S>suq`fHnz2rq!MV@1>-d&1?hLy(_VFf%uIoCF!nM)IzpHpVYW2*~j~WY$k~ z)*riu9$$3+{o(C<_tB!jkS(l=U9sxt&z6^Ox~s9FX;bMx3)vmlug8q-`Q>imE>kvU zjO}-yci1S6HLPmCar5Eh`)9@`uWq}za{q6Klm!!iSrF^;?_v*`|1LBRq&;9Pok{!M zn4OLU8$bkd(&6XI0bz@nwxMRCxV1EMfFCC-8jIG%?hIR7Tf9wOvmbb~dInhsSrJ^bS!?#|Zz+0OhucWtMUjQT$DimD2m5?+{Tqn{7@ z)R5*5B#yeN5-Q=tw8~zn_TMA3pDv#!Mw<%X#auWhTN6#={*l|KYMw<&ANxaBoIkiq zTl`{n46Stj{>z2I^COC`|D>;MS@Kkm%^Fd?s7gN>xB8h3>E9VQq4;k z!IMQX>7IWhyRtfG+A9yz-thOyi&mQ>p05s~kxESTQ#>L^Z{pAhTf=5Jpj=rR0PwlP zrgE8bg2%<3q<2~yxU;Qq<1^PT?StK4oig0hd?vEl`DlOm8~XX@W%rNBPoyt$dkfy5 zN5gXItB;ts!XmZCVgMR7_&wuw`|%W6`?2okC#4S}&GiY*Sw5(IGXz+nNHPD(;hZ5J zTC?rqn|APx{Gs+CNPX4hibJt^t{bwDJ5Yup)y(=*>c~e`_PdLZ3w~YY|LfzK*Y6&# zZ9C(?+xpw3%WJpKv>g2L;tkchqkZTaCcP_EvTm(D|1VISBs%HL4@3I*MUN+1S{|m( zrrg>SobmAC^QYHiPTlxNs||h_lCgu;T=`o1Cb6>0>xogCikA|8|E1(VyfkVk^JFNY zqAJ;o-OcY2Q_yxjfEdwCIRp_5)7Z+yy=%z9u+m0Mi=aTdHu=yzt>xX8bCYVTN1f56 z9kua$blZV*gq)%Lg8uuW?)>Nod@)>ofrg|dr7|7&9_sKDj}}b$9KAHgVR*8E>!D>9 zv_l6%-B#4^Su_Fs;#k?Bi^#*I*2jYRf98|t!! zwcKy2dvJ$dzm>zlY|xojg{Pq9^xR(u+}mG-*zA!;?^KQ)5w)YW(ZeWGCF^f z-c19^%kKaV1xM5FYfjj^)D$(wR-L3+m7{4BAlJmsMexUr&v=w#tueXBKC+Nc{$SQ@ppkUlK;yb)nod z;SWwCLFiDCnq@V2Hyge4tJsneELL(kDC@^t#%Dgm&um>uXp6VQKs&wN>>Bip5$9LN iMQow{qM1bpyA4N1bZl!F_&MmW%`NWUt0EsJ9sYmeP$wb) diff --git a/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..f54d02f01b60a16f526c1c3173d0576cefa56280 GIT binary patch literal 50780 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..f9141026d8223634391d330dd648e03e393d4421 GIT binary patch literal 31642 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..daee6304420f5bb71f8f83bde161fcd5aac784b0 GIT binary patch literal 46378 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 G{r?XGaJUIKtY%*V4-w24Sqlil!jBeZPnMKmK0- zr~dFq8GI5GHDXnf-8PnqzWR14J1INq?>XRCIVr59?87WpQv-{Ym(60Ouz+Rm3D*C{ z|Mk*0ZWMK=e~#;a|M{P~!_lv4 zTOJlCJ*kt0TZe1a4pnqdV96m@+hiM zz?Y9py}+UPr-ix@qq%(CyHWn^i)mGMuJ_&VjoVO&+2Ci)?Le=mO{G^ZBMT>ruF?} zZR0wm*}X*3Dl_lvjhZcY^{BI3tD&8snF)fJ#!6KyZFL>5ZVWTn2w zl)HTYs_V#VVYm_nD=VPEzqPmU*s#M?wYaprgZB`SfADG7&)@Hx_K&+JBp35`PZYm+ zd%S#mZ`^h3!^4UFMeAEGKe_`)c#Ui{BA8j*t3o}x^;m!W)nIni#5Ggrt^3Kn9R#v1 z+4*#3kpA&~dFRp<_W9`6``<)Yrjm=l-f9`tf4?z&`O3`jW{k0fqMI@Lr}xseBVDIx z{#`j+I6B-eQ#y5Vj`cDX($5>O#Z?0xY%#6 zED*6#fImFvGeZ2U={-G(v^VIP6Q60g8Oo;ciYsLru@zOcOE4aaVW1weh){nWFj|9* zh^b#TafLB)(1XlI0GzC8h*zc-98mYA>QIqFGFDs6;r6TQa-$rsS!HZ8$OKKj6J-#L z+W>Nc$c>qb!A3`+-Zq zuz$Pu_1qm{tq@01k9;}iU>Iwl!5SFJ&t8@BF8GSVH%dwCisxjI>(HG0oh(m-on=ba zRcfDZLWW6#CJ`K@OQJStM4;2T+pSS!^ZD!1lC?{Q8YD2^x*$#N9T^DpsxFxk zDrccKec-fe6v9L&DW_PCV;BG^@qV}`a)tzTGC@ESCM&3cBhKc`{4~ym6%S7y(YPSN z1KPlsQAp6nR-BsilQFgeq~>BgA?3u3hZ41gjMZBNHXxC6|N;jkOX&-v#>;s zpoo*L$V}$@^vJjrHgXWEwE|F)kQU1?gOoQgjm6jqBI5`xf`Uef3g~Ed9wSIT=xg&y zBn%RtUgb4%`9{g88X=XVb^Hb=X8+4~NUCIwXkI>OjaF4T$YU?P)~R^~w-&`{e8KJKd6fFrs@&YbG5S;Cf+ zNVPabIc_Q&g=oFEv}w6RhEsm67PI_HME;9_XldAwsn`5b%0DB(?Q82a;1XJdz4IPe zE3HJD%yU~#>EVbr;*KiA9%FgtF=dcChHDyaF7865GT84HHCs5q^h%fp1*$jQZOe0r z`k$p8r&Z^(QvaHf*g_aLLPPYulU^i>8<^kz0!~b??&wRc?c+k_fG!@d=AY}BNs@X6 n8wDB7dQ*}>-La8dDN#>PtkTm%Ga&JadES36ws diff --git a/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c1ff0c76b1c422380b72076af0ff248d9dd53d70 GIT binary patch literal 23053 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 deleted file mode 100644 index 476895cd19fe9e94779382d70fb4e6d41c175619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3834 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..383b8a8f27f8aa4022cbd8ca86e8e22e139b1c53 GIT binary patch literal 35946 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 deleted file mode 100644 index 39a913d6471d13473e8e60d8766208c0fcf912ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1940 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 deleted file mode 100644 index ffc3cf53955d76b67b578c7051d0ac663f04f2b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2702 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 diff --git a/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..86670f0b94be7a81d9985ba72d37880e61ee3f0b GIT binary patch literal 16786 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 deleted file mode 100644 index a5c2ad9bf9770ff9abfbad766017373e701e7c70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3524 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 LggUuzyz>752-^lg diff --git a/client/resources/hardnested_tables/bitflip_0_104_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_104_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a52ca97705a1ff3008c28c6ef96bf96abeb703a2 GIT binary patch literal 25780 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 diff --git a/client/resources/hardnested_tables/bitflip_0_10c_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_10c_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8c633bac5bc8218f3262bccd456e239cdc2cd2cd GIT binary patch literal 21042 zcmeI4e{7Xk8ONXZ{%R?=@6(mG>k9PVARuZT9jrohm>b;~3D7aZW<$W#*^Q~d6k)@O z@H!o-vutBCvzugM%$$jupjjsDqF#xAEE!w)Ly61KHIa;E5r(?xM8@%R-uM3K?Mh2y ziJF`@Y2Ww0=bY!9^L?K4eV%jfIX5wDWozH(4`o)1Z0~9OrAbS5v} zM#{HqtM?w21ahX3)~-R!e4O|9Wbz9nHWQ%;{DF#Z>eD$dlh1iEYVzKzk{-~4_?q)} zkYl0$@D!?8s!|)h4!k2go7YuRU(q1BMy2T!_604XT^DG=G~^_Z6Zsj z8npS88{po`eF>SjsLU{DR9b20Sq-gP|Eip69zW~%LMSWEJcDm8xsmD8c%&xDBDEDwNW zm?hUT7fDGC>R0%lQ15cT0AP!+B`eKWpVU5G1x!Kgn{>r?zmTwUb)In)Z-|6wbH^gwa20Li2m&9bcRrZ@MR1A`z+lst|4q=tGGFv6S zfzM=2{)lwio#ZdgXR9Cc9N3&t*-2S3n?uCDSJu!Ye$a&QqbhaldHD{q%r-3y-a(ap#uhHPUqV|7RgT)EFHj<(^cO*E06N7Tpvwb-3Sz((0|=}< zU_hYi)U&9aoGH3GRIC6Kuk9;-JO>K)`F4wPaTJ^?BR9N75780q++!d$-4a$oYMkQh zLIvH0Nm#3Isgyacvbsm5!7NeP2vd27EsqAhpc_9;XUturR#XviReQccv@=M*KRUU|d;~XZXepBxhN5*fo`Y1D5T#>>T!f z#N!6dEys-Zn>~nWw-3L-oI5G_J6dtSW$aNeSj2l#WeiIiS&SiALg}ptpllhS1rdb} zFY>Q()b%*@gOPcyb6%14iVn70So# zx2QS_7_0nTt9h&#*ctN%@djO}+hp5+CVH*fBl8(~A%sY}MrH6-mB&&9^&lNdwBg4J z$o+QPe;n_-L&gr|&O>fFK(~#xYJjsDo@L!ykS$S^qDA7vt#hy|UX2+m=H}l39W-n1 zg#!%Nc6Gei(FTjTE1~Y;@#BXu zggaDT!i23qbs=P=Y?#cB4;MnZ5R&-kzZOEiqVi|h{f#j>FI7kpm85K-!NiO8jVk8r zhQCTqWD=N9NUp@KEcUw6?fJMreYS4%$_D+U# z>1k~x4^`#!Mw#1PQ<~d-fJS%BK>`NRvFXw#cX;e`c!3{aF*}PRM~S_gB9Hx zY-9R$;gTmj%a}gA7WRfv-XpXb;l&GK+Q|^mPZlE#=F&kKfdBAeX&8Wk;MInI7oVek zTV)Gf?g^{=>#)emzOWNiBC_76!e%nM!$9ah4W20(w#p%JUW;cx1kTTu=KxHg3P)59 zU*Hb-(nYx66h#DXsPtiWe@f?nb`Z ztvtGwN4N55zu|h*tvtGw$LM=%xAN$|ybfnvm48pVFR$H~*OT_;wOe_t-lsEJ-?g}v zN4N6mRvz7+N4MwklE1fhdmh6e&+U0+(}&yh==MCiJ&$hB>H#+MTwx2PLa^6mnL;owjC-jPW}R?zDAuVCO79U||op z5C1_FciP&Wwk~>@J?^x%J8kVwTQeHm5B3x(!QLKXO_(6V{b0}k_Yd~Cl}ESo=vE%f UymlE^9(Sw?YZ0z}oA>_X-?ze2K>z>% literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 deleted file mode 100644 index 8cd2e0ba04289538fd82541fe8ccda473d4fd259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2568 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 LYtFu}t}Oc>T3VES diff --git a/client/resources/hardnested_tables/bitflip_0_111_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_111_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..199eb6377e4fe350b77184168eca251c07c65daa GIT binary patch literal 28974 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 deleted file mode 100644 index c1b73e1cf088cb8bc3ffca8623eeeee29ff0bfc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1352 zcmV-O1-JS_T4*^jL0KkKSu##sT>umc|Np~X9UbwXuQ>>~;~$8Tz#qUJRS|$4T?hbx z062g_{E6TRzW@LL000000005N13+jR02*nK0BF-714c{`7=Qpc0B8*ZKm$!O01X;s z0BFgA0}ucQ01W}4XaH%ZKmnsnfDIWiKw0Hmmh5@d|gO_NAHJs{L+wHr~UK=gs9siCIP9;V7^?Iu&o zeK*sg0X{82_;Pya^~|yO5&XtIgm{r(aUQ6cQ-mIfbr?RN{A=fQCql5ngTP_~@Tge9U8kd!z9TUW(*ok9`jyIXxh7RIte}O)HUE7%zE!mS>pzhF@WJ1Kk-N zp?14jp6eVdhvYbLI*z0Jod*ihg7^1FM)JllzWbh$3>4oKIy?O1mH}L z()L-O;JoRRpbm!33U@EMhos2pPJ!TMV;LWW|Ui$il-07)M3G%a!IX0q>uT`@^)mRb@Ma&iy9~ z;7nhnWBf$z2aqtZ#U7GZ0l^*UaOfeIw!DSVjw{!|kIO?>ZJoaNw}UIb1GNgDwYQi!Q5_!<6cnGVoj(i?E%=!aNo}gS>W_uyk}g z(-scXk;%xrmqf!HGWuBPSaMFQgB&dMRNtYL;&WIn3$kMcgV+-7x0=6#_EhTs*H6hv$Fehpvi$!amBv%M2J}4^UpXm~=*1OqNP;v4$8h!zjz^ zqTwOH%PdP6lPfWqnPV!esZz-jpRrg_V{rtA)bg;fy;>aI&~%`pcDY zXXgDJxiQh7q3pb`zJGhQ+Ij`tz9G@W##uNH3D|op{MRR9;CpYjFR-VA%v?Bq@{de- ziPaVA4pn%`fs(|(V)+*bQvOvkV&NGvmL_8A7)D1_>c7!`r^fF>?-kfQ>i1pG0z4Ax zxL3k*zB4B%UPWG@!w$nNWtRsAM?mB_K2!ECtL0egyyKwc|5L$mU5V(bJ*2W1lrW~<9Ohib;9(YUtt6`JQHc?p<9>$If@V)%K5}3QB2E7ty4GrSzhas8lKSD}oATkOh&7 zVq`>PBABl?2wWt{RK;agVPd70P%M>Ul*$ZK6-y*!Rgr?GNXZseWlUL8)J90e%4&=m zOw3F&OktHWm6lAH!enBsS&@Ze$g->|%*Mrv%Sgr;$}AX6875372BBuDV+=7FG(m={ z88WOH85mfm2+XC7rVOF07P3*9lNJ^rv4%4;OfY4cF*2}>VOYVHg3K|IV=EXF7|bRz zOtM(TR!lL4hC*gc%2O;xF^r^TlCvu^V;N&GLoiIj#tE3S48kTbt1^`tj4?|e{x0N- KaG@Y%oVdDvZEi3C diff --git a/client/resources/hardnested_tables/bitflip_0_113_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_113_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..9b91cc4e26d819dfde2073da18bbe38bcbe12928 GIT binary patch literal 16061 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 diff --git a/client/resources/hardnested_tables/bitflip_0_115_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_115_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..062d0f4b86e489e5c118e5b9ce76f4d626a76fa3 GIT binary patch literal 35521 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 TKN;mMexQ(-;??n+3E%r)X2UIS literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 deleted file mode 100644 index 87f7542d37b95ab83a16069c551561665b434711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 zcmZ9~`%@DK0>JSg5?h=JWsz^V`l*@4~Vmk5ZX2#DDOAttx$Am+89^?tbIjzVp< zJYoWbZ7@JWGKH!Id_-!Kwa!F`TJl0j80<0aoHuuECEC^~RS>W0p~v0*df$KG^UHVd z;dgeTdq{zlTuc8+%{qE`J?4Xwt@r-!+%kE+C#f48-q;SZ;@Y!W+gNYhP20ly|8}-- z&`fPmBKX$!?JWLO9Hxjv9D+?#Y3&>Z%ZacYI5$a=G?j?3a0d$)B%eYyD&ie10nQR| zH~PU12&=w+U#0cz!pE^%Ja5h$&ij&#q?YE;Z=`^LtmMyn&1~Cl-_BlW-kdl-4ws^1$pa9IrimB4O}l zjiL8p319SMTO#N7=f4)0X5dU@$Cpp58!8qUH}gu)Q~LGw_clk8qKqAxJ`@lR&Jv85 z=@kGCWRbyg?;pik@Y08tU#gnCtC^B>R{vtiI zN*!H3ntUhrKHOIEbhu6ZWBHOa|8lxB{Yp1n)%k2fUMqS1eKG2|Jrd|OsWU%6nRuUi zSbMmo#8YbHu096E3=lC3tUC%=w zBrJrU7KIc~OSqlU5Uu^-sOW;T`sbY19h0jT;m^o&Nn2T0QxkA?SKq@Aj~ISv6g#344c4m5nI^{4S?>jA|f+`#sqnhH1E`HoC&}*UTsS#*#htdQ z=tq`p_4SuU-vEn&j^(t*r>X!%cr;o_FZ9#!+Y_eE=t@se*B8&bUtDqGT{yG-X50$h znB0sFjc_=??u)-!68D9W$$OkY-(Nm0j4s|SO^y|T&*Deh7wZE#Udf{}wpLyC-4cFg zvSwzf92-eB7>uvJ&nkHI2wT6^xx3D`gn53cI(=b&XhgZn6u-G$1kOCqPRL4rzl2`v zyBJw+Om0lEJh>h{lX~IYf;VE0%$>RO@5d2O+3Ng|`J@F{%Y5&-<(4G-#TQ?mKTvjP z1Qy_(>l6{mJ(8cn0pv+xX3WgA+=d z#vP92M7B{%tDOts9?-1@RSE{j9Fe6e2|z%EYTOQ0?f3QvMtQU;FF1!yABpov`GiN` z&>(>t(BMogKj+m3m#eMtyOaaXDk34rwrj7Baz79@@`17{jJWUJ%EKj0&s9Q&~q1;uv`TU;v>&CPY%QQ|>TZ zo_w02Dn&wTFGP|3VFsB)6+QW#B|`e|6iW`ju3F;j#Np!R(ch^Fi81mjX^Xt&Y?U?j*$x%tR6 zN)uWv*E*Tyd~40s%_WtFLH9Ar9miv@XqI;9-0Fmxp*CP=#*s?vfrT%)ck zU7r!(G0+96t{1T3D}X|)Hsd?EX#uesxSmhwP)A4+IprC<2jQ;pH5rES-@3S{-np7}Qe*O)o&q`YANcDr3;+NC diff --git a/client/resources/hardnested_tables/bitflip_0_117_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_117_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8a5df1fc346bb866ba3491ba86f7bc16a626da9e GIT binary patch literal 21878 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 deleted file mode 100644 index cce41a523836421c9e48409e39178b3fcae34d8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmbWr`!m}I008hWX}C!)QRE_bUY%atF1a-MvJt5`4E5G2_3auG@jY5&xgcJPM-6M5 zD;kf)p>eLmVMFJ;Gt%(P?& z#Kf5zx=&jP=E=mrM3i@B1)ghx*K*y$hm1#1+czxNnme0pbYr{iQi@mQjB)o@g4!bB z>qQq(2#Yvd!pSlY$JWn|@ShgFU@7#ue!`5kV!eVwoPpWDoL@?Y`POSi7|l-pear!S z-*<6?lk*z3xZp6_)oni}dk)WAOHDh$tZ-;6Dv_6J)$d{oZ6#3q4n~moet|*iY2j7D z7US;9(>H?EbZxUI9^5W;g->&AGY{~Gq!iR1WltsQqwm_d3pd54SK>bORtjo&h~|hb zY*(*4R(%-s{@L)L*e!Zw!W?)*cYrO4gAgHo^CE(Xnth+|`MZC%Fse^A7UFJhB!#g< z>V_-kp)bcC+!lRW6V#E7?{JRQ`1u4J;| z_U7kH$Kf8!Z{sdmSkmtvAJ6ITrwK}<4u|XCw0$ezYpY#Y=NNzL+-I^7S$}a87@M)1 z8lljSm4%>Zi*OlG6DZ(NXoKi#!9X5$-P>8*l`hEtL}zj&M$Gdcf=#ZGOUhX2>Lm{Dq~W7#l|_u-aE(~RMKSXH9Xs>fc~hmdIiAsS7nhN? z%}U|-n8n!rVMB)qC#$ot78Vw&1*5|~k+U6?$B|XcUI`!D5A!^!l3S%PIe`GCE2&qs z@m_X}#Lyd8U)@OAQ>&MQ=gM}Ya6kObWLwMReD*%0|%668^P$R z+gzXC`pimlvKCA?B61RyI;NQ%kUx=RKALjSWX2l}R2`hDyD2eH!1)%)$v{vfg@sbN z5Ivcz(UZY}$uM4%6Yrja5e*Wg-HcnkAQq7}@*UI|Qu27Tya|H9PW=y3O&2{0j>5{E id&eR8iZN7f!}GT5qVv(-=lhR1dZ*>!kizmlmwy3X$@B*R diff --git a/client/resources/hardnested_tables/bitflip_0_11b_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_11b_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..f147874a3ccc8daf672ad1b7e6bf2b9c452a2a7c GIT binary patch literal 12349 zcmeHNYiv|i5T5OWLTT?5DA<-FO9e#fVg)vpE%YC9|4#-W?#CvTuWs_^3A8fzK06K9N6bq8<32tY29o%eW}FUKdI* z5v1t_l#S6grW_He0Qd=0q1?kOd^H^LRWVr-u8wy2^Elk&D=agIX%tiTD&Fn`W!5v8 zJ8T7VnR<#$Vd}Af?c6HetayQ$TLvUq%2XmUgZB}$O)`(kFH#4rKyDwlOJ@VxTRenm z;9R9F|HumDv7I%O1J)o+*jWu=ywURa;~;He>MNCOLq6*98i#TUff4i#;b1nFipDby z5?N$HQo2KWav++@|pU53XGjh1@aqq zd!H$&Yk0Oo#AY3aEUM;k=_(bsTKqtt&NL1fiZA|Egdv>g0VWZdf;DZn;hx)i=Gl2Auv7}M%j3-(c`{vDb&LWL_v z!ih`)5gdO0NELDi({RJq`MB75x1=?Z9H#qbGF9ri#2o?%FIw~@({y#}G50ft4b2(H z9_^M1FF6L%1g}0!FGKTUsb-p{L1!n{IzdCZsSuv^wJg*~OnNRQ3|_2Gs3+dSG%pFo z1>rs&X7D%D1ZeP($a1E^a)9Y=7YP7(Hpo=vRwJ)vGzF0JxTSS4)9nbAvScQyaDU~t z(#*jIaSfodW2WzQIXuH0iW)G#jf+O7a)^&+GtIfaRB`Oo??FtHPcG~btL zw475OOHx)kbSg`kI`N;y^jQi*(%^#Gt{D_9Pvgw}SOT4|-U>f;J#S0m(mmiQNU>{P zVMgbbld4=IuO;p5<6SACleCluEVU@g)RJcPKbxM!aCm9s%Z)Qs86>|hJUuN!d_-i0 zRsa#E%`Pomzug@;z#-VOpGMPx6bC%7+g2(Hjvux}@(bv(KiP>q{jh_N-h~_(Ov2cJ zgp0Tf>(qJ2^*Zz>Nc#-Y5NhofFRNsFKtun*w40?_7|4-UEjcpfOVm*x8*-?V>Ubzi zG94Zg((W|-W}HUG2uW0>3Z2I1tg&@WQ{_#7E5>co>D6h-C+Ol6X7L!)d&yY1M{IL0 zC4w8LDZX^vNwqNDy}O<0*Ok%i&pQHM;Q=~o1GFb+5UP>4cn=lo9;x-n7`+K&u7Hy- zZ!@)qk{Sm?QG@)Ku$)th0P#Zy1)s&JMcC9L)_NcN?Otp*YuUNi4=0ILBh|cSalN@E zlx&EKQ7^dD@2TaZueh8Pm>=`{?@Yy6a+vLbU|#-hN(>AG1Dl|8nQK%Ac zK(*XdElaWCdY?~=@bH${8&Ix!P1$Eyqvk#Vid{O`h8K{TG534iwUH<_NP3R*u%n~eq&Y1XnflHtaRnB*E2B1w1y!UlP<#3llQ1|iS{nV!C6htsdnU-g{T0S~) zAA}0HYo@tG05A^qi^X2irMbK&I>kA8MXJ!_Xku~>)Fpcar`g7I$emCCc{Y|^zz&vb zWqKh6AwD3c{szXaKcTU^if${i0Dg5OV~BV)w^wt=y-*z=Y0ay-U4#4&z%5&ICuMeH zh8xVrf8As@&W01F%f?9JksbTJT#WO;1(x4t6@|LB{_A#ke}UWAviS*NKh7@PwYT6B zlxiTZl6|0E@9S;(aZMJuGM-SrEuCvqlu2bEx}g`#wp-hHuBKf9R%)S>p(MT*Fa2?g z%o`O}&Fh{11{?#tUVzsN@Ol9<(Y&FZ^?CtbFTm>sc)ftaj4#z*FTm>sTwQ2+y#Qkq zuNPp-7S>UVxjt9pI*W0jENS5#iZVGJfqp=-Se` literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 deleted file mode 100644 index 6aa3f463894ee13622fdc39dcea8890d629c9a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2469 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 diff --git a/client/resources/hardnested_tables/bitflip_0_11d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_11d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b03da0135fbd8582d294ba1ac2f7164aae1dc5ab GIT binary patch literal 24131 zcmeI4e{_`9na7`ZGLuXullKw`F#M7rrbHnmA_#1j&A6*AEug6Ncd1zy6-5kIsamUf zj|VFjDXUwpE3(d3QTqp#W92OP<2bg*Q(CmuZBhK$XmzF4RIEx-e%$>$_nk>5X+k+_ zyJwH@oRiEu?|Xkd_j$h0bD#UYcP4)5yv)L-o14EXVrAjp52bxq$9~Jp?6jU_CUxu| zEGL+qt$U|PrD>ByERe|^`?F#KnPuvv%!p_0pPJftiMKeuLT}gmS@G+H2i1IpKd)p+Q5t9?opW#vXF(c&@P2f%EI?>dzU&^ZZKf7!QrS)UH z#SgU6p(ZQU=?z@Qky7t$Gg57b#Wuv7TKDFqjKX=T_H){(L4uZKR?>B@4d43lK}kPf zj!>hFq}Qb>62z+0ZIWJ^)IpTpRGv-586HC`4-$Spp+jk7?2^3B^)87Pq@3orc_!y2 zxNUbK`PC*!G$k7(z1>$~YtPmPc9jl(zmbf6-FPxV6(cc3vKJevv$n>_$f15+g`f3( z$(Ufobkmk7qorzkI?4}5((n)?qc{6?l_rQY7;mOtq5xzKVoP|w#t%~5_>qypb}9uX zaBroLQuAW6UcJedZKj3cM#fnCJ(_(_%LkS8kRD^CawWIMBGCw{(p-bJGg0hadNspH zVm#WhgF-XbDk`X#syEV1-9s**;5$aLS`h6|J;lhVbM>=t21%8l z#8{KjSo&%sGqj9N(USdd?pQmDVOKe=*e&#TFGW#Ld6#N%1~ulp#Yk8CF*2y>t5_Du@L}6%BHDG0zsj%TafiQBW3nzBf}f1 znUtFHf0gtg?33a7Sv;>cV5wYX&NP~4Z-iNjZj;(x=B_j?N#;o8`%h5%oExsf} zJtb`#ErX`S!|vXoRb0M75gRvBdwGbJ<}VbbaO%0Ap3u^EBh%)Au$$)UJGcoaJ0ksPe?q5Opi# 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 S7N^`h<~wr;uRROSv;PZm=g&L< literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 deleted file mode 100644 index 5892009d2624d8eb1f78105f0770f6603a698095..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1448 zcmV;Z1y}k)T4*^jL0KkKS*-CAKL8_H|Nr$@L9>bUK@`9d5D)+mL;!)90r6lFKm-&y z0Dy=91Kr>YKL7v#00000000009MO{#022{`8el<)!7^YGhcslwzy!o#Mwk#{Fie;P zVa*vaFaa?b5vBwfj1wjS7;{EUOaM$q1ZjZ=BLvBSMjX+T695wtff`^zh`};o5rIic z5RFDgnomU3^l3j*JwwT<>VBpuVt6U$si*f;LV8Z&eJ(zs=Reu|k4kr`#bGk)eapFc z2Z7j*50vP~(m3dHtMxyltK40mg7&Z2p40L_(C{x&9;3># zy(#BElKK`udg`m%`rJeLK4+Bjh`t5#od*|-51nKB40#qW75Y9Ff9vOXyOS7U;<$U` z^gYq|A2alKj`e+y$@#mTPrdM};{OGg2ZH>Lr&qOlj?1I5kEv7l36b|NnTq^N9Akxp zqB@|)MU=5j6lGRiI=Y-PW-}P*oke8ItYTuAGF3cDkxLU9PXJ7(aX!Nliz#K3EU}8r zF_pxfS3|LsGQeXMmRV&(p&q5xVUr<&KJu3ngE5sd2MA<8vRPGOWUBBfb_(J^${&h5 z2YSOMTmj@}V&QaHjs?)H%ZrM`BMhmGI2mPwj4Uv?Sz{fMaI3*MJBif071-crCkumt zj9p523B_C&R~ea^oy_QrWn|3koEK#1%ZrT3oktu-XGRDguX*;KXNll(!=d%Or*Sx9 zn0$-4y=%bF;$4XHI|6~9t{g2S-tFY{4!|)%1?_WZHQ^nqQyDv%ftJps=-mh7D$G(T9;#Z09 z2kknX9};#rkIc(2FnlY}zSPIw?4JAo59V}FLE^l}pg(!<1v-bwF=dR(#vX%*yqym7 zxU-4p`}leo`X0macsnO$$L(KY{a^BSd7gH8oenSJ^(^~G#JCwa zUi0E#z;SgQlb-5spe$Q_Za>H@-J}9&^`cooy_d&x;h+B74jVy=6tVt zbUiH0nVFZ7`nB;uV_&>c&mJ36NnaCUK7Fra&K zqN4o)N?z4cmBc-{RFx>=7!DIGqlCCr<0@H(GA1lc z#b!v%GRaJsqmn}u;g&}!Ck4YQ##wPLCRH%FF@=;I6yalwhFNkPM-wZQlPShW2+Fll zg{o5q31%ZQq-6_YH%#ubdNF(l!Xrx{#-_`8xR!i0rqh>`d% Cg`fuj diff --git a/client/resources/hardnested_tables/bitflip_0_11f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_11f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..cfa31da6f4a53f5d6a7bbd8e32e6849fee0422de GIT binary patch literal 15388 zcmeHO4{TNC6+idAS7_<$J%u8a{#jquEx7g1Gr%Y^!eg?947wIs23ui1C)pTMXo5>z z1bbmKxD{xf$)?uHv#`ZP{w*;ZGLU9$#t4B*$flwLoyim^2sA}Mu^ z0rVGO)>4eaWMf4D7wBdx+sKslCetYKF^zwn%zB?ho7PNznY~?2~2Ld?(L82k+3_4}3O(W6S2-X%D zRAAo_{{&_Q4_{@PuDrC^G(uaJVDLE1_@QffpHt{lP(~^6Md%>!w{qE;PzgrwGnyE~ z`80S{1ETS-h@SuW;9 z(q_}=6{}wRG3#kHP1v7W=IaAFQK0iMzt|y&_(G!!1fV?#Q)mpARYG<9nBIVZri=VW zO(q*?ziy&LE+WJ*SsFKTok`@kOu2iQmWniTm#pot*7yYe^$c`Q&a zU=vEYYZRF&3`4{{*Q8&kPkW7Fngt?b@}%O6$w{SZDV~@3Ak{P~UH}##QS?A#i{vd6 zQAElhemNW;F&T|6jNHZaytEnX7P(D<5nUZMxb5laIc?KerA9B<{nl!I*$l76&=_3V zmDY^pp-;F*IyWt~eSq5$=rM%@rA1dT(~iE5tA4>l(VeQSr=cjLmIMgQ8qNX>9*Zul zH4uO*=oBB;wXAR})7uHyYd^q##$w2L!I(%tC_HT8-nf&4=W_;&%HgqonB*sD=tUK- zLAwnB%`E0a5xznunD|fF(eDk;E)1IAbC(QJ{PNL`7B#wT|BO0 z=z9n!CI+QW^9#ry3M$cMAW8gZY{H5Vbz$FyU;q=Avx%nENix3m*o2VTh5oPIfLt<8 zpQhtD(=)4#YG6~lR~qd;rS=u5)4NaBVx9gG9+zZ6oqKgvjDff8=a@P~#;E9WX9lCB z51J9UzL5q|x~91{RWVgUdogL#9B~8F<|M#Z_}G!8S3JVH%~B=@(ulu8VgIRQ!}^T^ zP9dD9PH>GkNd96&iowg%Oivw+EAdRi+}CEFM~*{dVMa#HmZ)?BLoY8bZ#vM&POY`j6|ePCy8n%{55XWeN;rZaVBnn;E) z?aA1gxnrkdH5lqo0MA0IWx7Y6#1hqr*GvIlq#CgZgliUt)p?BC>SEZc<6W_EaZ{Ei-TAZtiR2nPM#y3sIAm!sk0BX#OaYNTDYZKR zT_E{j6b70uBOR~FP)K=bhhv;h%|~QF!D=Q`HTbeDM;~4+fuq%aaIaH?n@QZH({d2Wm;Sx zdxdGgb{6YvFVikK`WMyXPoi;qQbqz4P#o+o-Nb-31~jT#RT(#Vo%Xt~x3FrCQxAVb z+1QbB++lXQ0k;@lleF#u9BD_?jQTUIr_3e%Wu{-A)0FE!UqwuRIBG1d+a?f$WTBDi zO$hRBsR(X&o#}--<3RzL0rR(XrSNlfi`h*8-%(wfw7&bmpu-aNKE$<4U$!B4##EzW zv#@N6&(`J{DOVYM&U45C^}kmG@+A{40Dg zg8avh`PCV&E!| znc4t+tbg7|wcuDfsJih2HjXBhE3Zs1i{vOdYc9bw62+smdc|YEsITt{j^-7Q$)Y-p z#nmewU5R+bW3puo?)m?|c>J%fYag3+?c$b{b?p)suK5Y+>$-;J3%iAmg@Av}Rn6>y zVlr=KONeja19F|u@V4kcYH#NIX6|Y?TW9SJ$U4kP&nDnUof4?kjP!T%Jhnbyf-h>(ivB z?)KY(>q<>eXR7{grmQpKiZWf9GssO#*=4p0Qxo@OOg)-I)}vDBk1lTauiQ-eBkk`i zhOkkY4N7#=W4*TDl!M=C+*GsxNWFt!RZIsA0gm-a9{if}vk^6ycj)UK`ntiO(>wGv zhYEV!>>c`ghrX^?q~5(l-@R_ifO5|}^u20B)ZP5Xp`Ul?o9Z_i-n>KKG=d3vhrZsS zZ)#HN9r_OX`$X^1H%*91Zt@O&pZ9s0&4;T`%KL3oG0__P3fQGMTkB}a{m-WS8- zeKDMD5sByF*p9E(t?aESUv%J$3h#^I_!n*77sLM}UkrPPzQ(P+&zU}n|Ak3J%unIL bJM{e&ggy}EXXnuOUv7>^xR&p}|KPs?A3Dsm literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 deleted file mode 100644 index d3601defe79670a2d8d49849506795807643a4b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1327 zcmYk)?N1YT0KoA=<=WB?EPeV(3fRh1&j#)sFPQiMh()ABpe>vRuy>dY-`$+qM1-`I zt8M8-qCz#OAk-<4c$c^YH+8+E2hN!VA}@&X#WgWYw-_aW%*l}Xa^HX8^X6NAtnCZ5 z>}am-Xx+B^WWvq2=f2upe=qa7M6OhqcrzkO=n<7FL|c4?UHFsfcDtOGZgUe8EVc6>VP8TTG4aPeMq$$%j; z`;Bbc%?44*oAtHigXZIJQ?Egvk>^6ZfG)Q5{16&xVM~dz1B^*P+6U#CBVESz+5U5u zlB7TO8)r|&r@oU@D_8dXy5|Y*?oB!GTh83EoWTmfdZrH}Yap464G=@x46VwGM1>gJ zgbab9$6b0P{<>09`ELK8?1rQ)5-Yj#65oe+Car3g_suV66{DGkzo5LSW*xD?3&-!S zWL7S8$d2q<>!%ifO3{_m3`YtaPi7fAW>4LV;(%GitcuK}zV@?Pz2x`fWoLCGd*v@P z*wsOQmajvSK)K(VTUK6Y^sHT)>!7@n;m3)NP9ufeBaq4T&QBoa5rlDa{9(Sq)T#vt zK{zA4FIweQfe=FQxHG6ta_Z4E-n#>Yn5rHGVF?`J1Hq~Q?|1u2Ksy4V2}lKS7aC{< z(+Z4^^8R4MPOWqrFb8|?vUXyeQFn631(gQ7#iBN;TtoQ-Ge(Qa>Zn$HQbJ)ed35-C zxSS1IP!D82#4hWqeZe#7Wg}(0H^Tp=n3>bfdS85ce`7IFC7>6~!1T{lgi+|k5A^WfZlt-J z3o%YMkBAh5-i6%-fb~cYsHh7(PO$T6jTf}8r2675E0OCw^(traQN=9oLP0Yy;DevWLNBoMCZVOg<)D6htkM||lNh5Y zgJuJT*4nX2Lx6MAleRTMsKAmao6?ea=balXr^9GP5GERv4%d-NM2ZX-SE!^45uZH? zANq*aTT|4dkckR}anzzU{@5xPgB-VyA#T~IEhJ%+Z;|yTQvuRZlVB%{4Q7qcCQiOA zjInSO$|mj3CiPS{maDWXOhkdo-K6OrfMdmp0?pCk?g)a&#hbkkj6?Z{@`EpmMgIZ! C))>kF diff --git a/client/resources/hardnested_tables/bitflip_0_124_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_124_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..5fe6d13ba44bbbf3064adfcde7bb432bfe79cae6 GIT binary patch literal 21807 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 diff --git a/client/resources/hardnested_tables/bitflip_0_12c_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_12c_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..18d8d20f291f40bdf3b6f9c3d5104af159ee78f4 GIT binary patch literal 14984 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 H%MbiNqgbT3 diff --git a/client/resources/hardnested_tables/bitflip_0_131_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_131_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..f3993558a6b4f448496b999921639c13a4134f70 GIT binary patch literal 45965 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 deleted file mode 100644 index 400272bccf895b3c847ba1e1225b2de1852f81c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1861 zcmaizYfKx50mq#{FTvb+`H{0`N)uy)?NhnCOqH96LBjec*#F~S z`b)nLzyHa1fAuDMg4DH;Kh3Wll{|jB^J1}RPtl&6#l@21Jw-*5+igt}NpX=RSJES0 zF1aH4p8!Am#f7^vnQkw@TOXT0v7wmtwF~V3DdoPtp|{_@+Fg!TSA6qhSMzk_;(>5S z(%7A&FwHR>Z?XW|zqeX{Es}NHx#`!lI-G<=sIBK#uJa&Uex#0`?k}wLJkYwD|5+Z5 zD<}@at)(OLnJ(jK?;s?;1rpJAUFE9iy8PGg8$a`eLexJtZ@7@lWzQ4yu;tA8kB1LL ze|qBFIX*n9|FGxWTBB4rz2krMLtz)4BmqkFrKyZjMS4~Ejn?X{Er<^@e9((H95R&W zecu2~@yB0`C#LR8FE)aNHIY%EUQiGN78o4PE9~mE$rnz&axu^QDRsTJeZMQ`P60}= z()GYeYNF`%N2OhJz7cxTH#Yvx9|2-kcH5dl?S;9^fKLB`BvqiWCYANny{i;uv&OR6 z@fvg(INov~XJ1W0@lt%>A`!;5>z>V5@d+<{N%0h#@X>KiPDxC}3r~&>%yDfi#bRA* zqqSkZ&qW|TSgUfdy)>?>9TYdiI{_ zL0Np`@+s>6CCIukB_bnktaZh03I(zLNF=VqM&ojVPN(8(934neQ^__?>osz$x#JJ$ zp=AnVG)vE`L%|Lwoe~r4M*&$y2(!gH_{jE1$@*q{={)MX_UF29JK+Z^yX;Tr6G`UW zTb`Ah(8`fg6XSnujHExfqCPvb5*#@{wmh#{!oJ8^m{{BX&Cj2FTQ;;^P|>q_u558> zE;D-+-y%DiM+;lwPK@E5kZ3)uRPUK+nA zW?&+lat9o3s5_vvI1UCK7CPBr2khvu)cx$R0fBL7U}16ziwSnf@yjGgHe`&j-`)ID zURpI(qhH^wH5CkSjdzGUE@(_^GYmvxqUqmdgjatis)7m z4h;FRGxy5ZdyOwzC-po3F6n-muI#z8T-HU^_oQ|5@U$d~fOi%+9O3aGN++>dfK=i^ zI-nwPI@Gry1_-->7Sdsdg(RXJ+?USlnE`gUNyR{1k2lI`)_|!j@-*iUK;aaNk#>1T z15G0InsoGd>A?dHz5V%z2+jwEMQe;~IlMoDg-#;@kVrHtEA0}yVo(9&Xuk!v824x0 zHWuMQnj>peIL(W;pgf6K^gfLg)74SqeR2Iz8j;DTVn(STBvr3?vUnSV&G=}xoC>tH zfFMFy-&_FdRcL0b-~Sl?2n-Y!cF_%n0NYxn3@FD4kJilx7vqkpV1;I;dD85|?N4 zc3+NDP!x$J>*)j&AVR{76`Nt3I2Osk={MdLtP2Yi7t~?4LBxR)UTM^;f!UT_ER2pD zK|T};-9^$u9CrITRg0ddlSnv7(hL^IY+iU476Yl)?LMDwyjrXd@X#pA-LD1 zRugtO7z|MH`ru(AgJj3!1}7Y5=qTrjrGoB$wh>DWWJ!0-+0JljBD?fhRRcL{2bH89 z!1P{i)@cXK6eh&A!P-GZx;Pq1V+_p^v-+4}r2`S)l&*Hn=EDrDo&=nMdRDE^^arpE z`bK@U>7kM!sg6;uLT$f_uV&};?P~R26Xkp;RU=enZgsioAvp6N@rnB#dHL~spBF^_ E3(l7mCIA2c diff --git a/client/resources/hardnested_tables/bitflip_0_133_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_133_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..03c54fd526a27b5b9d5d6b63c373c429c82fb139 GIT binary patch literal 22696 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 vIla66rGBSeykXeH8;13*Y~y-An9uV);Cw-y;o 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 diff --git a/client/resources/hardnested_tables/bitflip_0_135_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_135_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..84a6ba3af751764cdda710a7c7c8dfbd3dd975c5 GIT binary patch literal 52098 zcmeI54R{sRo$$}xJ9jdQ<$6p>JiK#?M4 zU5B-{){pm5tGm3dyPI8gt+ll2t6gN<-JNa~ZOdD*zU}I^-Nu(%(Mp94)KZJHzyFyV zKtNktw@=^qnfPFG=gyq@pa1vyf1G2VG{1QHs;w)(t<=XKK6rx~*b&FJ3YKge*x{WH*s<$zTe*Q!u9_5O1NFgy9ZR+;eOHkCtW3Em~#Ub!g41z+jEr^>{BM zSk>muHIoN+DC=DQR@THxyB;qo{#WEdJC0+Q+jeMGh`q^sbxB#gKu5~rkwDcax;Wxi|B= zf>ya%fZH`Wj(e?PT#e(bR?a#d=34#EEbr$%^()L58w3&mSE~_nPpI^SIOhKW1FB4c z3-MK2mEzZQ*x2B93Z?_U!7f^E3Al63KKBL6;?D+N7LI7)HIuc{>v_6ahxSZH7?W2S zZqi;~M$nbvz0S=#s?l7$Ppe{lvdlEJT6LJ+2!#NzN(WYl4zl-XHL^>qQE_}dXm~}3 z`J5kC^JlA8)x5(R!}t?<_F6Curs|n?p+l>-zZK-)%O8*~w_JyrLy+)NZh#^&l*@Bd zXR}tLmviH4t)|5>h#0b%A-Un>S_S<271tMNH64KKV-Fzx-8?#dBJbzYq=Q<`;I3aX zQv7|c?Gr@t!>e+FD+8LE#2f14Ht?~B3rr@@g`(VN!Ppb_>Y#p-Fb2%#L__4Wf>Dm; z4RZzHa&1v|tc7I22+o|ENlFzJoH}-|t`$j9S)PT}J!B=yhAJamm|=ca?16xbbvS&y zc2&Xe=6bP;@8FK&V!vNLPSu^3)~jHjPBn_pz?z$)Rb932(-z~Z;`tzwhqzPamKpAW z@}rv=hWnfiLc0*AQBFHATfJO;TGbXHY}eW&u(NZ21T zy0DO-*agKlG|6q{Z^o=$!r!m*_sih)T9~dH+yj)u?;(8e#y)fxD!z9DN=8jsvJJ)8Bg{KYv`)fHOSZvF z!v#qPCZU;^+P#-&GAiG9xnXmtkNRa2bH?Nk0vd45zrw46DLVa;%0A%jR78E{tX zVDi~OFw~C}%zv>~6NN^zwCddq@=nv?%1iwytNT?GcU7a@3XG3(JBjx+!$eiW)Ezu6 zKw3@a|HAf@M6bdna7f{2aEyqjHzvPZ*uTSt&S7Dy$5TtTZ7Lwl{sG!&goB>)5Bo&%C0|{msEg%0>X7USIqZ-ivw+?G#N0+P`9!F$EXITrF=0wrH3gV1F zI7YVf4gq;gKCt}A0bVtN?~3qY6PWRMawOdC@g7&S#fY!!NR*SXeCZW=>whw<7Z`zm zZE{D`SAn(F-3z3xGkwJbM>T16Cxg1R-avfUua*vhuVdSW#*-GMHuYCBN* zM4A%5nWWSvVVXET0CIo|bgCRUM#re(3qcZp5AP6k#_P2@kGWb8fkF^g{v>$K0Sqkh zUQ~dXQoyjDVbZaWw#%W%hUsqjqEpR6p>!&2f)6Fa(ZXrG$h(1gbc;S3%`37Xp=TY) zfr+eYJ~Qtgt{I)-+<-Ef2op9i#xl7m@MPi_!A~4Ba699b0pS`Qw)62@(~&?PK3)

    )MwYu4F|9qo2`{N3j3%b%Y8|s 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 deleted file mode 100644 index 293c1f93f818c8de4363209e0e4828e85cd48c32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2914 zcmZ{l`%fAP0)XjSwd&mZ1epz2YgH^bQD(fm;Du;gt5zkoO2Oem&>0xLP3{MAFF8rn zS}jZXb=-RD0=e?c{GpFTCTu_)yWH z#UD;xEzOUFS6+UUJ>(J1G4smJX6_1LQ-%Y1P#AU?o`l1z2x7%Cq3foS zXjGqbn(Ob8q3dcd9&FBNUvTwA~w z%wAW1boer6Dd&Q;V68PVNm395EaM|b=>?rLrE|s4m4F+1ncv$+z<6!DKyJ2%AbAqd@?C?_sumD7JX55YbN8} zH&yD3X6O3ty56Kc5*|@{KwMG;CW!I_qLa$CKov2fBqf*Z^+{%Q?$pPA(xjx$d8{yD z%cPH>M@&UF1Hf!-^wAN^7}?TXe{@`_=}n1QlyyhpVle%{ zxzzP|rZ=mzv3DQ=tS(A#-V|kFM1c}MrAP|}*i3d2zebnIhsYpfgBT{uU(iz=&%4``lPMZ!KISHxW>*CyxX|njzDkAf;4X;t&fZ1OI?99RUu z8hTx@Y6B2L8C)&0Z?P01MJd=OKsv%(EU*rK$usQYt`s|ez#Yh3LpStAPiD=3dou?xDX0J?&fxNy)RDSyO#((M`J4l z?fm%-mb%8;O67SM5W-H`SZGkIV6GOQmaDpagXdmrOftjg15Z0K$nhmbtp6#rprN7Wim|7>AjCuJLNjVqS9~Wf*P-!ih%n{S~ z2HwiVA0oTgV!Hjha(YWsEIp#{FWL;|oPzFb_mR2=o&L;j6Fyuw%yd~bya(cryF;vd z+uSa5WR~LC&{3`%YJMKMv(FD8{4Q60GVWmlGqx&0tXsBZ*k8JWxEIP4Y#EOvS6TC& zly#6kN)L^Z-9i^Y41hc2UTm28epM^$a$r$nr-e}zqF9g6Zux0e46~4XkBxJ0J3Jq< z`-1rTj#Uw-v3S*uE#e*kR4N|>&G9w}DFt|K&3|o}=>b0_JiZ@+s^LuPp9$rx!Tep4 z(l%=0)$ct6Z+qktc}XHY%*3CS+zi1cEiXvybr`imVC=hPm)H`%7PPpmJXfuWK<6C^ zVu)SMDB|c`mxHagQ)K`@zE##0DRS>TY$y* zLciZaLK-If{5()gu=D2&`u#i}4`pI07IW;rTwJJ=bL-7+a^MV=KJaO(gq2x~`0cJa z#(8n1eh|__rgiT)Z{E8x%b7b?{&tqt=8W z^W$!cjn0)a1I^GR6*s}(F>-FbO3X|^E+4jN;Zb<|WINr?Thniv_^&GImIVy)jJ?S6 z=`aZbT#jkal;@+_1{A|AncPry)9AYy||Cze66RprH-tY zq}%FZhy+A1eI^j{@d6TMKq3X;N_~Qe8=i(Zg9$P>iu)44Rv+{T-vU*wo53s9B0$qg zG3u@e=?2*B%XjFOETN!QOeh#qL;-<>IRL|2`jAD2*r3JS!NRj)L;;6OIgZdGyRDP~ zD?p!a)4wzTc3heWhExJU@XKOR_UAGKq6HG^vo807&%HxfU|UzE{`yHTsbjSQJ|(&{=Q+RMr5<9E)G;^&X2 zf3Vf8AEst&Q}f~mhKz-w%;+Jk`=dS@6DmHb0l9)!n*#Xl{a*)Q!$rUe{LA*={|9^`7BK(- diff --git a/client/resources/hardnested_tables/bitflip_0_137_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_137_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..e5a76bf3394b417fee66e3e14ecfcfdf844ef498 GIT binary patch literal 28775 zcmeI53vgG}oyX7pKSC02?)d{gcm)FZ0AffeC@?XSbvh%0A&K}bK4NjZQjCV$U9>E6 zt(__b6sy~*-P+A;yNZtr9o=2`Va={p#7Bvhsdc;4GTP~swb7v6wZ+HT&-dJa$OGa= z-F9c&`=8;T`@i=*e!uVUaen7_&bj2KH;uo%;~&oHFs60>yKfj5m_={y;oB6<30>KO znf=PHg0X?AoTH05#?%=bo0Dtb+*4koI6yS zV@tJ^M`5Xt-4YaqcQ>s+^l;GR?FDzGSfIytn7EpH+%P6CQHR`h z&RSFMi!S8HXRT?}O+Fpg=#Kx~ZcUx*_7v*(T3Qgb?Lw*wbkya++Fl5VfL++k5;nEY z@jbiOHU=UhQ$0u0i2y7%3n*?fw*l6fLT$1&$3jW45?oA%7FX-}_y)?{8ksTRsmslg zDS>4!^V9;;N-^|3IM^!0-F0AnX@a$<`$it$5OvdDH6_Px(xcZBaveO4T_%A#cYU!H z8rh5lf_H$8z2x3zoO3$+BY2d=ytDZ#h`O2)6_)s$4Py-Z)#G?9dr#1># zvcZ~8w}cC;=B%08pc@XsjRL*cT?E&wtOCB+C(MaEe>hM$(d3fukn^K%97Jt&GwE<+VR>@;%67oT=6=e*5?3MN`{^YDVi+1Hp zCi38MYbxAHxD#tu-6foo>kQRHG#znW;ZBoYFZU`v0S^0>`6#c<>Leorn21ZUW)^CtGt7NTCF<%j5a(*P;nt+MN5_elh%n>X-052ihid zcVI7D6Sg}<8J}uv)~lln1g{BDm$};;_X;ol^M)UdJVrLbxwK2hDyGk}i~r2U2kp z)L8Q*>h0V{UcWVQjb2B`pF?@R%^bOHHf{>kPFL zYcl~||0ykwV;tB8c1=-CyWx6i(iDta&fH|%t@+7YFfh(`1x={l#Zp!|iFj1Kjq{b( zya#v@MKbN!gc>_h4aFH68odJl=Kjsg7;*Dd-cuYw+VrURkC8?_#7@w?PgEy3%%G`y zz~Nq9upseSIMT_qzCa^g#$zIXlv@YADDmh9YgPbziMYIqj!G`3Gn6ok9$dx0+-=fD z`PkrHYfj)vNR{AK2_lqR1uCiq|5Q{VSCydGYrAI7fFt({so`sW0IQE;w0<_-pMdde z^z`0l-aV)zNGt@fdeErbK;4(qlK*@yDR zjhzdK7pj-Z;kKBbvk@BAW~v!I7XTR;dp8sH{!L`==7;pT+thG1%bL3vM@4N$Cav%j zyoj`5dHFi2!dWO{fZ4Q3$PgqgMmARR{g=lD1|w3~zzE@K=yGQ<2E%2R^1JqXmjikK zct3W3oBy>nk(7MRG=xsHA%h-$D+P*{(RI0v7u9%;E|>r!{LuF)FezyO&wD~#eoKx5 zL1olcW4n-PoLOhP^Osul`~kH?oD)Dp$z|4btI^4et*LZw6Ozkh`PxRGo^- ztOuhRes~0qTn|@>KEK~~A5CK#C?$9RsRM>7YXyUMWztnTnb+!vGB+FUn&}f;D{Vsb zppJ(C)A?Rl^KO#Cl&qn@8eMhXAJtK03tV-&ZBoX(w}HI0slrW(;wjShzm`XThsQGa zM!A4dt`z%U0n7Zr{*gOWh_0jbBhy2%c@WG~A5d9yjg%Ij3U|R=?oLo|n`J^mptEsO8SM9=hRQQL)CmHfwfz4WIc~f~qV4&(PUUpR4;Gmb)(c zqF$ByQ!G5ORos-E$uPz3Mt|FX9Upa+_eVZ2C-UqId^SdA6Xv3*z=Clt+LfU2p1GK5?`&YC-L)-iUjQDGaR?mS@4BlLUF?z8R z#U55E_pzPQCD8Kl#Tq%5;M3@L9I7#Mw+E{d{^`78osGw$eE;0!9m>|ofRVIY1NnGq zk(~jpG*b1N4Z!F9Kc`sJ066nu9zoLm%+)rYTjPh2j1(wO)Hf>$ALldH5UR9g>Tyns z{D@K_0cL={1ah+by(4yRo;8bMe@+87Mw^MP zDB>p1`vGZ4mM%&tO;c4jU^T#ViY8q$p-a}uZJJBY9s$dTcj(+wKXs|V@h*e6nnTl; z&Qs9fmU9OLejXX1Ldse932XKvwmk5^3biE)7uziyYZ4RZtm$y~!T3}kz+B@eG#w2% zOgK3r=R-+bK|r@7DGS$IX*r8M&Zauz9NUZ((hmE3A(2N!RQ5CYLP@Uv9ja(QGPO}r*PISc*&Dj9Tg5%eVY z2UZ#Oda*S>x7NJ0(!0H%PfM!HvNh?;i0HnlnXaWp6hYD@e$qDzc;?_H&-c~qL_!Ap z|EuEk@ux-mR`(06c>u_==vl9OAi__W2Z3W0)Cxkhs-R*paP*Gknuc@Da-&-!RMt=D z6aDfdmb_h-%D$Go$|R~m_^lrA*NYOtgB;R3HUEB}^Q<}8JZM01Ut!`wvyJpqY-Vmk zuGisV8aq81RrU1mKfH*4(-XECnO@*EKj_zdn7q;ZH+OB+iOkjmZigu>rTX0p4ToMEn#oyA`DNmCKJ9IazYKRM)e4)g; zjmQoi>MMzJnfW+^@0ZSP;;zm2owPPRZ2OjiWE}Mwa@2z&>D1n(#<~A)~2*;P)teZ%0SW; zl-e*^LX-^3l7HPR)sga(M=4LHGT8~3X;*>dLx7h$l%<>jrSAK(Z3l8SdmmsK6qGzT`>vLn`9)QcUc)N}7Afx9KRyR)bif|8-{)+tG*9dm+ zgqr*KM;vd>*B=Lpw>5s7hj&5S4K`j=Mhs-?EcC`3D->lhBRB>lr}t5-!S7ZYpM;~R zgqr73@*eNCYNDNACM z#`r!sHJNXhSFH4IwV)w)Tr(U$=SvTprA#7y*i@d3H05k9aY!Fbp!C54IY%F%dqWJ{ za>=umVMj5mg_4+z{OByf>o$aKOJrKD%BRuDOGtB^HDCG@+xVd6H~c6eDyb2PDsdUQ z@sYue2a9c|kExO%AtN1_L6yv0%G|{B3blJ24JfU!9p{*@=I(kQGMoqXc+E`Iy3Wf@Y=q{Vh? zJ}#ZkdJD<^C8N|H(M^JA@5-XLTV>4;U-aSmUNZ5eRQ(ks<)m+#i5F<&2-$>3&nFFC z6SYx1i(?p^RM1E))am&b{5crK+<1q7%@Fkr4w(dvAA0uS-p*QQ&E`s_6S{N!49cuI zd!>zA)H20~^?B2+`7ba+aX&(G;ohEbNK9g0#!t{N0y(zH2LfV2uBfyJL@$#lOWe{S z&QES2dy~F1hhmpf1Rd7O!qDhaWRq7lat}U%o`=usH4IdXC4WTgvk&Jc9#cIY`kb$1 zD-#xDqfTXc+tCF`!Lzbb_6{A$W@AnKwUB`3bxEU3+)4epRpshC<|d^Kxpi_+;^Wd9 zoEzd8jSkS9Pi8BFeHplWt4VU)R9-I%$rYFk=#(JI2c+bEb;M=xV;&;2fmu*IyFwu+ zXC}Mpje2KFk(IGHjyjFRQ>&hA$sqRGD0_bzlxOomZ$5u(V2(6s`~tZyEH++NDU`3S zAsRc-m#*lxB5zRcbIEQWjX|*}I4H+WmS{lk^9Pp#9DTg-CcNmHP+3*qsK z&9;#SW2xli>u@l1R;t{>&>ZOF3Zw~yW@_O@S&ToU&;0oS0T}(6&^icNM(zT%KSzOy zbV2+H(_g+JS#n!@T*R*Cm_-fBp>;6dg9q#tNN>=Osfr$^9TPNDGh-Lp1_UXG0!vl zZHQIcArJDwFzE&acUJ`|fHhw68$Lk3VKLqi`8 zallmi#69PAO^^-KJ>W2J*Ao6KIBLRR*|+68}9K&MGxVQq6uNB zEHuXkQdBNUi|gTmWQ@RwT5EGzjQSbL!G=qN`56$yZ7*sl(8&b zO-xr4)73DY|)R$`= zX5;Bdwym5JZtEm{G<4a$$D_=K0X86iYE4-61YT#F-<+Ve(|p#NPp^wQSbcnoRruYc z0-)t3QeuHJ_|GyM*3$5^WOkHsb(5^Qj+{Xm_kwjykVzJP2Cr32wH?|$b_{iu)jmKo zsy6g9n~65fOjI+QG~rgJ={#upDvf28hwJn!lvT~7o?DB1$i6|M;_D+pVrXyrJtS+J z>`C|*WJ3D4)u-~c%85$I6J*&eu`te*Bo<+Spl^*<@k8T!$(A<-eV z;f&vzq69Yp4|7b=wiWzl*~BOOzMK&xuP>44!`Hde>5ZU`>q+Ly1 zBm+Vg&y*eje9o)ruv=@=1AyMsDs)H>02)RiMWBoy=>foGJ5qW8knJ>tnhNRDCA)OV zE?u%qm+Ukt{B^oymoC|{->aR#DLnwF8Of18>5|=HsH97FA0$cGx1H}W7!SLV9soQH z65Xgz4*;eI0Mi42LteCz9snfkQ&3u!#e?(!;D>!NS$Y64Jph;<0MtrpdH|68V0r+s z&Bvg1ez7$@0C>cJe89~iTS@$Th*+La4*;eI0Mi42{*ZWj0C29~heVj39stxnl=O9? z1Y7CrMAO%a>I}Btg_yoh6ob$U0n^us)}*f!b$Wq%`Z`fR$5@fRPBhu`p1w|Wz?}1a zE*JlvzfM%F{{g%uCOrT+VI=?UMEb56zxb6hf1Dk9 hxp#U1Fg*as9>^>w?Eaq}06aE1F37nx(`Bmj{|#%!0_6Yz literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 deleted file mode 100644 index 97761432b480e33fdf4936541ea334c37ef6223a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2400 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 S$)~F(yMYv+9%nt&>;C|TRVgX} literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 deleted file mode 100644 index fb869e7cbc765ec821c8731a591402c6200914b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1405 zcmV-@1%moQT4*^jL0KkKSv223`~Vgo|Nr}wxw`>9)g1v90nh;u5g37$0TDqF5Eo$( z6;K3K)EM9jUjP6A000000000EVKiiDXk;*r42GIC0Aey^0|*8Km`xcP8W{{DLm{S( z02qv!0Kx%)<`YInhK553(8y_{Kn5cwKrnz{IfT)Xp`nn%G%^}!&;f|akPILg4q-H8 zXlP_GjSPmGGyq~UWCI8W0HmaeFqHIaCzQ=ikq=O4G-%PIMi38C>8YABn^WqDC*svX zE692jxT=;E!f?f7-v(niGGgI$A9zX9xMV{3QTxoF5co$ExtCA4J_XWz%%#zZ_Ri-I z0hIg4seNM?OY@(s^}9O{+IC!AGbUU-mB7m>m!jct#!nP^8JDn~Fs`10^D*XU@|gEb z%QG@h1M;3{9w~6(@iKUwJ1Wmce`4wCdOgN35}!U&pWdVsVQX8ChV60nL8_joJ^IBaB$#87!D`AGB}v>UzvR?=uboaSDE6cw2vhB6DCY9 zj88Pmy~F#TwU6*SC#bSzWU+pdlM^L_B{7kgsW_tyhYKj~g@+D~3D``!SY6b`II&pA47wA#FNr&e{)*yD z227pDO5(VkCL{A6!|s=5mRVyAsoiBREL>tSmvaXmPChcrhf3_|99&%;9XQ8K=(x|3 z(~gfLCF?LcF*58OkD1tJCl+>28E|K37G-eZl*;KkbgaiuQ;UqQhDQq}*yt|>hXad= zVT-}*cX$s`oyXx$?hC}rz>h<-iu4$-C!;gy9SPl)*vj)Tzom5jEA=>b7w9{u+;PXu z%d+hD9!U1MJs#D?*?1W~!QIewK2?t6yMe`hhksWgXy=<&bjwW1jSHMm&@IE7= zKFRKt;Jt=k*Y&tpG5Xx%`PtyElj&YaeJ|9$bLbykK8L<>+pGx`{V-Ka^x@GVjF9G6syPcLhESYg}V(4cXIx#yj#~d9T zV~pv*?taoG29%(_wki=mq}7&6q*vt;ERa}>6;pB8wrE-{rXm03#RI#w=%sdNd&I1`3dESCcqoGHT z3l|p=#W7gIVzH6N;;EA>BZ%TtkuHp|;U@^n8CDgQ44EpjGBGe>j8$c#WXQp#Rhlar zl*q`$z-5+LSjx3!YBH+A%B;wYvNIKy7|4vWtgMR|rIsOOl}uwSs#wfnGRlm}A(lkT zC^IawjAb(wOv4#S%q+neV64hm!IlFImRM#|F_dOh%vKpn##J*0SWL*w1%?4(|KjdQ LrwS4Vo9G{a5t@&= diff --git a/client/resources/hardnested_tables/bitflip_0_13b_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_13b_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8bffa0f2eda37eb0bb268ac62b037bab700a5c0e GIT binary patch literal 15338 zcmeHNdyJe_6+hq1ba&bAd}sQC-EMbhELhvxeYPsFEi(v-3N&3yM4<{J5+7Y~x0G15 zw)+{Qq|kNON3@Ft7D+Thmu*sGwp(h4N3@0}EYXA*2^|f8NZRg>wPJv_$KSc%Ja=Ya zSv8t|H<_95yZ7AJIlp@z_e@~<#_D^z4!_z)bl2W;A+g98J$nv6Tbs_Fi_s^TERnaH zy2tT*i~jgTdf1{(Xt)Ev5;kpznF1oR95qLnY&^C$c8^CYK=me5#fGN)-=GTAN;gy4 zE_8`e1JmMNXw&g9YMiNBB+N0AN0=6h407|*MeNkhLW2!ld)nlM4 zk#8}@w81S4Y-&VxKhxEw;woKTyAs~P6fsrJsPZ#44q`+M;gb_+VY3&sFH;VQq|Ey^ zcIJVs78NaSy^ioVuwW>?9DP5O>3cuZQq#Ol#xiwE@Br&RTJpMV*S HIdfJrYq0kN6BBj+*f z`8(?n;J6IZ zuz);TCl@g}7EpGSoif=E4u$hr3{Is%zX#_HBjcb$n)F3oQ`DwK+_$<1^!R*A&n7G#3IGL6SUhfC zHo0K`UY0C>4hXOYWGga#&^f9itCVMy@wxI9#oFCA0S1<=SM{-0PTe!p z(1;voYL{j(I@9qGI}Q4L$lxMVTkzY;^xQEOUc{zfx=X?-Fsy#qrV*D5uPa0o?)KBY zp?_cL)U9A2ql}K<#4qqY2;SCV&(5xbX(qh1*-6ne`cw&NO(1SBT zV|wHXrsH5mB1ilIv))BaNs;*qi>*y!e5?~+eA5Njd0 zb!c3!DDq=QD5g48;W(5BF-ttwVULn-z1f9Jio3{2${`NXL#sHNDJq zBOb3~+Aq?ikOh#`6s0(%t1Bv-*ch6miswqBP9mTg0}?*2%ZV5pT-0mk6}K^UG1mU5 zyDd8f?R^;FS~JrjUSPWSai*V{?R*`*z=3AnpfRw8qhOLBx;1}S(4?3)D`wgYspMMI z*DEJ)plRGjvI$Vm3WLttq*14HLp!c05G+yZh?JH;mKiI01l`O66w}X?h9`XAc|ag3Uc){eXL zPXGO3*fAW|Op^X_^92#j31VCzo0<%K!Q7PH|bb^8o&!?5gju{#XyvKpT^Kvr)Pgs67%^->lhaY3C0oLRLJiHnQ@ zUbd6!;K6_M_oofToyGHIYs%CsHR{d!rz$k{o>KrthSyobNgg&Utcr-=W%}d|Oxr~I zwLOvR{14y_sLE=Hwc4%@Y*(S;`5@?qCP2oF0z-iVqcOw2XxdRqJF&0}Q1<;$_D|iX zDh({(5BFzYkL$07g{r6Z7-dG$7o`8sOe0-{pBc18^X_KpCfZP9x zVDv@fvp=WD&I?41^d|Z80@2cpfx+KTh$ar{rg69yg{)NR~XOi`)^p+G-Y zp7EXci+l~vT$5f^uE8*U6}vRbZC{P#ou$b=n!#PvBu?}sS5baBp$<}&{1uLL@2nl^ zRBx$mO;&fCaWdg9>Q!O;7^fy9{EyT_L|yV1I|imBLmFzG0t#N|33q6xUs z1qD~D@u6H_1bUi$)Xa~2{gcb_+72%FL-Lvm#DaGnPzRRHU{_U9`Tu2hcT2%t(lv9> z?mG7*aO}kBpbw d^>Vv~h{%6~!9nKp($4K(;pTn`h4*b4{ulFrY0Cfr literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 deleted file mode 100644 index 46b67bf8390c313cda54c091e96c87bf6d9ee92f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4000 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 deleted file mode 100644 index 33b2abfc2ddf80b050eaff7da949a19d7e184dc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2056 zcmZXUTTD|40*1i~9WJ&jNI54dAS$i2Cxvq$yJs6f#Za_#0n6=l!>yOoagt58-6;v) zP(*>k8LE_)b^^>GgACXdT6QyC!pfzz(3UWOvg%|uTMD>{vrI)qSrm63H`)LBd-xu{ z{F%SM_*?jlh*2Pl)v&Jzi03}y&kon#3H)bJ)WM>tz)u2h1O*;FbE7f9MR+5w2mIfH zNxZXXZjnx>&IbU8z(c{mIu!8ebU`}3rGO=70aniJm$7iTRr%B17Q0!G|r%iaOE|EmLTC+1U_Dz{9A zZ4qjCNK$M69V4)rp~@?1>{^FTW`_(r8OQLFDe)Rii#&lgqwYRXs9nER8k0bnj!a4z zXF+86#E=`7Fc5K*J&2p%(o0?26Y92$z$}n2J1H^r0?4iR1Xd4yW6549grSIWi9UY{ zDO5UT$vBQlKk=}f1;=~}>-DVoQv*!&z<59KfZ4-&RAQn zMh2zv?IU}?So=IbqtXVj++edB@um8hbn4Q?o@QY)UH3jt`k^c%seiiyb}a5UJY{Yk zbzIdjwHni<>|0wJGWF@`V5NBH;dgnBZxzGT{^Hp7nU9$nndKe^BHUY0^p2YoYL1S< z@G)oBZrl6EHc!GO(vSDt;k3M3O%uVP1Mk537d3T#p?;CVUmf?EcaS}~zN@o8&3OGR zofwUcwp^l8w26CEa#^xrr~G-vXG`PWQF6}%x83dC-r>fuX|cJK1g%TExqp>A-RB)^ z9u#c3cgd^QqF<#^`>&Q_yX}8BPR$KEw&J(5sxo>Y<(1fw&GOuby$(Ax;!rh?tsXpDBK=smWytb^ppT_-9L+zTtKC$|c#2IAL zrFO5GV;&jpn!dU9@OZOEt~6@!O>V~+w8Xt;gse0$qKI|i-?z!0O6_e zWkL!_oY<^lrGXp_t*<}|AIeu2M-rgAjO!M`2m;cAv+6<|^WrMhX0g{UEpBv_K}v1! zq}2m#a7_fAUP3;v%=uP@P3VESCa!hH6Q$=N79C=6=x|6I;S$KC!O6~ISQF9DLQ8mj zEiE`40|Z0Pg4>D9h35W*n_WR(@i?3vsh(Vx(X%67O!9;sMY17-OJINo%pibFw7F-c zNAMJO_(;FQ$W>USfTtlBZoWM!am#>W%%RT-B66d%qr%iFp;N;N)#@Vt{(R0y9aLWg zU~C#@#R)4ez^qOwOc)7gyqLOaEF$1L2#!fWLFkY}FaS5Xal}eVEO{5SBvkb-B`$Ek zR^469x!0L6p*C16J&f@C0t2oWZoC8xf+0JqLR^i$6sU#GhG0E1{Odo+nPkC$RV2U{ zdzu*qVaHj>aH2%}^<<)>ltK(MBqL<39tR{3n54b~D!5fLGfUtFjC?z?k+^83g#$*u zYR2l)3l&H^jSj2q^^|_qT!==zi43zuZ7EUm$Z&zYa(0&QIl3+JPP8pc6i!^JyeyYv zRWRNVE?Ay-k0_N=5UD|MYrlh=eIozs6a4AD1^BmZo zj(Sp7&^=v>pp!oDN;tt)y=${&q0UX+}Bob?d z<>Ba)?G$rMJLX9Vn|KnP%YiVz!`nqKCq;u{DKL=&S%_DeqV zl!oM@w$Sf6#&Y{aq}>iGE{N?E77g_^Sbj=r(mvCnqx8VlN?P1LXSGSueKb9`c>liy CVynLZ diff --git a/client/resources/hardnested_tables/bitflip_0_13f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_13f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..29de4add8d57179c1e1f3770bd2a7e23db2a42b0 GIT binary patch literal 21315 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 AzyJUM literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 deleted file mode 100644 index 3be41189ce654db39049df6172e23ca7bc971cc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2798 zcmXYydr%Vx0>-gG5ZP*h5Oy5|0TUqELUz$M1uV)V6j?zCgk1+}9=mA0b}n={ik$D5 zC`pQhJP4jzl}3T<kNNeUgxngtP_EUd6Lch}8kFcvKNQt><|&_xn%I;jl#TOnV=U$;7Bn|SZ) zvGJbhjyFS=gY-UZrDrlWhgRS;m#3VW1xrdLB1v;vAT1`1QW%ujm$`695Xo9{Zm}b= zHt>DQG$>#({}IZGf+{-K>h6#oV=|B*bD{cXMI$FtE0RXpht!dQOxR2rO2U)S!iVXk zkv$AownQ$hS~_0SQszN<`e#Su2Sm@3k5QzINt zB}Pv$cj0HR54j9=9A9(!NZ1M^+!K1i_x@9fGrm~wuWY?)QIf|1n?{n0;9i+MKmO5d zOS5UNWQh$ei}AKv`_C1)bPRrcF=`VFQz2n-$0*2;V(OnJ6`Dta(<6_5c>L<82Xhrw zVs&Z;c|)xEJSsHYDDs;usqE*Bq|gWkkRSjOA5Z7h0lbn+Dv<&nDQp+0N@Y#m;=OZQD#xZ}FS2Y4=KIS|>Zh?fKBA721K)ys8VyZc*+9VYYf~M(>z@(+ zo$WvM&eVOVmLI$;n&-}lu7*C^vgUfQ?$$fHYA#r+Tbyf%*fzt;=#)kQ7O1;{XV_gF zUo==#S5;ERb_*at;wFY12{i{?Y3m(>I?$%=Y&vvo@iaSVnry&Hs&+~Islqun{{yo3 zKildVn;Ele^L-_0OR(HoGI-b_;fj)A}VE6k&BzgfV~>{beK;%&Yr2< zJH#k>WsVc56rH;HYUr(3_LH4;QI5mR70lK}jzKL?lf44q!KhOc(>w!ET?!op2AmA; zNGxbG82NzRFT_Z9N%WyciCqjzQ(+AxaSN+mIu3)#HiMwK^HR}FYs}Q)MQYTWm*J3T zAgWCXi`=*!BJHFbNA05;H}9UZo;_7hBM31>j>fsN5B(>6Q`=PS3Hw@%1@Z{6LOwx2 zO_pzl2lL{KWcGns^L$cYSJ<35kxwYmYilZ8NuDDK46x>iW&I~0XZ!7UKCdsW`1Ihu zgHpRpGbEnjQ$_iaBO zdZ!T;e01`bb7VH(^4p56hIncItmI|!!KsM; zEHQY4dFm`_?`{Ck)0RSFg(>Si(gk&u(1)JqONYj9 zdmr!IlKlK?AtGPYe^Dd9wQFN-#3KI#q;U)4a#4+q4e+GP)RdDW364O{%&6=fVA9pt z_5^dGM&RI;09VEhT9KoygtSHT74{jycuPW=JP&Z1U5%*dPk+RYa4jbu=2&`;{I-$S zvppO5qSpSZmfDpReRQk0eFf)H>lyj`YTL0)C0@HvN#NeO%=pe+wA14=OT#tRkqsmd zK1*+pT7!M33I=mI4}X0Esj~q;bamgrox20ybiXZBoH_z?iVuuWJ#D-{@vn#n78X0d zD8tb;yurnYnU0f{rIRKhh5@hH*+6W)IP46+KX=RT-5L8pyqnXxBTvwOCFwI)e-}OX zeOlqB@s_n;^nBVfFeG|z3L;9(=lu7%iTpI>R)+K|cLNoenRt1)@&1mAD{H53|G0Yd z+il*Qv!B$*t`1hHOCsjIvTfJ2p3iDe+FF-|j!j)mEBdZ}r0}BR%I?wc#+pUW$RBf| zuM@Y%iU)%`j%b{=od;g5;^N|p1voxp*jJyy({xfpV^YwCXizC&GiE(zZpd4uy7tZo z{REc6ikvTA+1gp7h#~b}w&6N`SjjdPSze@j9F{RbOaQ9;fE?7E^2Sl}=sh$5QI>&| znF%N^mZpMM7{AA0as8%3C0pjgZQ|GRa$^a}N+D`fd3@KekGAR5sFOi;%W9(?7L{1k z9_A8cV0)b~+c7{H#UO~Ggc0p`^SMJtLhmvODJ3Y$kb~_U)hH@yL|vrjbOilg4n+>%TRED2hK4}~hu7ic$Q3$yY~=9T>iGt^Smevf zNWaXSXsI+!mhC@YQcO}Bj*0-JsNX({lHQI$@MyK)?*{R6>uO4DSx*l2(J%KEEcD9h zaG$WIh9|fiw?RTLCH04waOkElCC~<+SxgkNa8o_|RC6429|D5jl`f##K?)1mrRr67 z&*|hg);f~K0Wh%=J|E_H31KdxM-Y+ef5wQrt~TRZB+^g=`Y>z1l&RrEDgG!B6{B8A zKj1-qqcCLzq_DMy^m4C@HMoUQ_4-N%P^nNkQ)zeufqIn~hgFS~u_?IPh#M(f(oJP2 z8*#hDmCXTcdN(}mUvI4PQM3lpdDumIm1S?ZL)jh_^P;Y7n#41V==VI1yDMVDVQousgtb*X#4nEl72&(#S&;!1&gi$K&Ej zVGSY7MqT?GD)%4oRe4LbK#^C6avcby(6N0YmpUq=TgedHG+z@+h)@_CglIP4L`(xi zrXd=k=_R9Y_c``@rb{!EGu3S81w;K3kp{32b-E$#xZuq8ON(kh7GgpQ^nzw>w+65d zG^RxklLSn#i11tWCg%RXe@uGU-$?C=UGdhGNUVGfdW4kBtiN4+i?m4r5VeZ@meg1f zH3c&!%F_x#^ily;-)n{U^MF$UVhIn(ATJTPEYpxnN%uB$!r@$Dc?8vLAB@Yv2CYFb j;3HicRb!)GmdPzoWe4r_;Mx4&>%H{Jg2K+L%me=g2I|1j diff --git a/client/resources/hardnested_tables/bitflip_0_141_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_141_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7df6d080bcd223ff9e22eb137be8eceacfdac4bc GIT binary patch literal 27811 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 deleted file mode 100644 index 99328786c5ff4f95d8ed77c676ed2652d6f20ac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1533 zcmaKs|5uXt0>^14YCh935I)ZtjAJIHK4}e^hhARyvNc1B$p?DOjup+qU7vy>8(DsPK0ByY};`TO%?b;^;{AcI`PaM zGY^v4*^HC9y^djLBm~Mhoz#*}v(F@bT=evcXvj6X0+v_spW!GlLykI| z*)o&}cuaDaEabey$*Ar-6h)h?;1!nUiyIbqVX@QsFAPX>zTe2X-yAr3DKc(YXLXD0 z1If8>!NhDm#w^)Mx2eWK85%aZc?-{<81H2syoLj)Q*aBl_IYN?>Hq! zc5kU!7F9c!xFP3PGKNVtaV~4r@cJt240`hYA4@luS&bS}AcPUib5@fZ;QEZw6ZO~E z2A9Scf@yK9$D2RTnGdU-()sbt{$JS9|9tbSPVUU3@)uqGi`B7m4|mCGb5ena)N3J} z)N&6DZZDe#pv?fvY9WDTFx(zLa%wCRNQy9ku`-&HbCa`5yr!ITs*pc4QKr5Wl|*kO zv_%Rn;?|j2F{i8UCo2taPByz1a{~SAJZf&J<7q-0i`E9Kd>ksRrBRIw+>ilMo}h_o zm4$OagBp#%WzHl_8QVASgk|sq?qVYQ)DvcLP6`t{zu-(dZsgM<#)X?E8{#YHr!qOF;!~81^5oeG%uo8h**}ENms;09e{dpm3&p(UK)Oy;oN3vHX1-B#q&p(>-dxJ; zl;AElfeds!qsJ}-pSPKvmVW!o8JP;xUqE!9NlS0mQzeozeT=bTw8gX^a`Fx~XLhrOH&YYa#ni-$dF=oS zZFOhtz#z4kuwlG?M&ACrYA39)jz|qVq-}|4odS41ZPiG&dell>bB$&Iz>6xZ8WK?! zB%-Z1^IgpmO;>gWdd%BZB#s++N+yExF)D-`ZSGvef@3^{Fl8ApVnFTVB>)4|3FzU& zc0nQ9PSy?R3mc6lsl|c|MfRov>A|-Ugp}g7Nz8~kk(mv{K!d?bg^8(_MJ37*VvH$8 zu_Oe6ydERryT;dR21w*0-zT+UG*ZZvDr-+ey`p|YLnp(_Px6iuU3J9$y*hl&|<1@-L0a!H}e)AB>;y>8ET5x=UddM&Y$DX)A9sY;5eg2BZGPm T0jalk_a^IDmgvBl-|zl6lH;V2 diff --git a/client/resources/hardnested_tables/bitflip_0_143_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_143_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..d6fcf319d006ad23de643a64670324b66c779ad1 GIT binary patch literal 17673 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 deleted file mode 100644 index fab2780c76e4def6fab2111ad3e2d35c4353a87f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1057 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 pZBE|iS3oJtsfGPv#ST*RAf&{|O~1jBWq` literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 deleted file mode 100644 index eda7650e5a575c3a57ae66ad65c9becfbcb4809e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1763 zcmV<91|0c9T4*^jL0KkKSyPR|EdUt+|KI;retZ#8Fw_@ea4}Q>7hs0g5kLS079aou z6j5Dz;0-?j2gyW=lmbBj00000001M5nKWn(8e%duF$@W#OhJgyVE_gkWXYpIXwwmq zp@?8j8e$Aag9rdH<0efS14fvPjSNEqXwwj4G#EeuhZ!A$vWN2a-6GoVW5um~V z3<{D;V2qxl5l>C2so;<^N$PC`^&3&385oZg%|KF8O+si>)Sl8z$pN5fG&BLDN2oLd zCe*<{8WDbf&`PDkky%wBeoU&U{oJ8WmufN$lK{n)5W^NMSz-$^l*nNe!HO6$C5))1 zRamPQ62?-j3`k`$Rs^t0a3%iy9TLi`9Mc{-eQrUZvXUd8E%Zd<;A|f4Jk0ml<3*^Bzb~CSN&)#xm_5!He2_7iKuW z0gtjLnC)Tq6>w#K75Eq6Uv+#}Vt;{UUvzv~>@t1h=zZsBf!SjBt{9uDOAp|ejHyEL zXArnp_y-7~zATng^c};Ico(LTJ)~_Or)&5Y74r%4FOtJt%{o3Sp`Rl9!z`y@@))wh$J#7j zk2lK1;^5-T6_eO7dKXVO8S*+FhO)?wCUzypCKAZAK(i8S2DydoH<(Ol!aEK1H%7?o z7|+!7HPM+ud)7FzGZuV@L#IXXSmQI|%6MVZ23eRs$?}|E%KT6KeIw%bk0iqt>b+bi zqoavFax#fQNH7jDy3{v?j3WwCD09H_S1{o69A{4jhe4R(SwOOnddTJ$T)4>CIu9Vg znN;K%2T5{9xlc=oGa$bAfUKsHHVVq;N!^}ObXPbkGVPa8?z@Gr4WjYd( zdVEgfDZ=Y4+Ed(Ilu|EVFDWyoWcQg*X_)XNn3&2uPScPq@EH_sDx}L%NWQw%O^Tb2|Xju zEMYei<4SrH%5s_xWZp|Afx4oUkD;AS<&MKaapW?X6O_EhE)Nkl5+~xYrIu3q!{%NV zbj&wvKe9cn@*kZ?@Tu2%|zvE+X`>*hIM~lyvn@$K-fBKaEin>!f|QBxCwga2E*0 zlLA~w{3|HNRx(Uwn6dOH+!^@`6vVMl0+Y#9W3t9a0-Y$AfRl#W zPp***6d@c{l}f4LmujO0F<~)fCNQxuv58&rWHP2Qt}Ilnx)NMUE{MuhT^$8FNp#6%!--YWqogdrSy(}iBu)x+QNpezI66xr zt_j65u*q<-M+PIHO8~4?IN%x4Tq?w?DyVQv3```#bd<=rsgYu0Wfm+QDrJ<*BPlK` zDPZETa4}^VE}52KvmuoXCK*<7SVl#XFfwp5WXh)oQHv>XvZ~>cF_lXTDsZtXI58_L zA(kwebgbg6j+Da|5aBW`StA$&D-$fsrVb}evN8(b%Hfq{vf-9kqQenoi;EK$RdBKv zGE*_dkm6u*F-dU2EHJC11#mFNNt|2((8zSB94;7E7;wUqgA$x5mR$eE+>uTcBoyOt Fi$JmJ9lrno diff --git a/client/resources/hardnested_tables/bitflip_0_149_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_149_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..d22b15e0e9f5d369ff9c15610ac9e49a8e258401 GIT binary patch literal 18034 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 ZOpl7>pNi@IRLtWIhGm57s+M8H{smo9gM0u0 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 deleted file mode 100644 index c3c3dfaf3d1ac2f608bfee1a78d9a28f64125595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1058 zcmV+-1l{{WT4*^jL0KkKSuXDDQ2+>;fB*Z{ZIgjF0hB=*0GR*~02l%pK@b5D0RRLT z5SWS?&A8wOzW@LL00001#!Q(p7?=SvV3`0kVHg4!4l-oPh{V7NlLW{CqX@tdz;Tl% zOhzUEOqeD>4H!lMh69Y5GGZ|>0%XB50BFK61TY+A$&(R@fDNkTLP z^qOg-NXj(YX%9)7f#{xz>K;VepQ?AoDnCqDDKUvyT;?g**qRm$RJ==T7{-iR6Xt9a z(y<}x69C+-QKpkhG{VL(W7?%t0Z*5m)UQ+jHXm8_CgJm+2IJz!H?VTK4yUa3pCfAf z-Az8%r0*ZJbQ_nnI-b?k#PS+AIL*ri(8o&YF?bi&y+>K^9iZqvZg(K*VUHljn8A!r z2fVt@4yG~G>{@rUVcNMD1A=ldu=KaCWyEm~HRK$tpy+NkEykM|@)+?8fx)=&zZc}( z{G4lhk&Iuk(9v*soaT*>?9;UFUd8yX<;3SX$0B?UgGXDf&SU9xF=)}@Xz?0&4T|R+ zrWkXau2W5hCKfG*4rR{ZZ!dF0lz2~Y#c&^Ly{$P{Fz^Ns!Eb&JReyH{=UfMsv1u@2 z)^{F}Fm$|ZUjzIe(_z$M=sQgo!v^yUl(xLjD{IbkFR5Sfb`8qoRwECX*uEq4Ud5&P zyeGlnU*zvP*Sy|zyBA{@u*H7%F|^v9&CFQAwP}vC8ybWXxM0CY1Fp5K7{f$uyQUj#xWXc zHji1gf2R@7FxYXfV|$qIdRXsqmhrgI=WIK~s-7xPmHzUo656q0gBA={1}rL4jf$$V z1w_(}6;W9#`f#7BrHcq*Fc#4RLju5PSS%Ak4J=}47Bom;#(}1aj4c{SX)$7HOG>R6 zg^0q8DWNf1RACsYi7^WaXbhF4iy{psEHI{%6Bxk80}{bwNu@MQRf=e=(M*c0WJ?Ih zP{uK0(-6|KF$}1zSgc~qCQA`aSXMDsBN0ms1*E{RU|}&N!xg29Mwm3PQG*hgm{SHJ zS}{;)z^euz(*s5&S}>M|3k+5mB*em4v07+pQet5dj3qQ+Rxwi0#F$}N!7Ny+nqd~0 c156W46-^izU{g#S$VGynhq diff --git a/client/resources/hardnested_tables/bitflip_0_14b_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_14b_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..139d6cbb64100c32f86b1d4745ee9f9f10eeec6e GIT binary patch literal 12365 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 Kg$W2Y=0C9BIS$zX diff --git a/client/resources/hardnested_tables/bitflip_0_14d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_14d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ed8fe08c682fcd4bc8014338ce6fffd4f45ee111 GIT binary patch literal 16299 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 deleted file mode 100644 index f61babefa8e76d23efc26e18d7899761604907df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 895 zcmV-_1AzQOT4*^jL0KkKSHYybmGfB*GYL9>bUK@`9d5Rd>6KmY-l0r6lFKm-su z0Dy=93)tWWUjP6A0000EVK51R6A6UV000S-O#>XlU=si)6A7jO023yf204VlCICz( z6HEXACQUR9a|wV<0GLcBm;eAwnrIm269AY2Fqlm+005aZ&@fU|L?W2UJr7jLjSWD_ znv9t;9+OOZQ`V$Q|6x*>x^|1{TqmS?PoX{)=U(!=g5ekzS66YE#r{{Fc$Y;wJC}^k z^6o_O4vVPlLx&E;e`Z{$l+yW+`1Lxc*j;8FO+BC`p>bCXisQm z7_ukqUL!AkP8LtZ^d5ulJf~GZF^Tq`W-*6|vb|3O)aacP**Grub1Z!c~{LAz_s-9EbN2p)HDf`!%SshaIET4Igbh6~m77QOCeaq=s=q|jGQpSeeCK-lmqK@*+V>9f#t)pm;YHB&Gcv4YlNi9uy>Q^2 zg~Nxk<;yrc!NJOQjNy{##Nfr=^Ll%Z)OAM-wSAAt^_@p!s&JeagXU+xy`{?iOZ0pP zjq#6cerf4FmFGSc%kVvifq55${k{R?Q{H->H-n?#GIqFd9t@swUn*QGaI40?g7}xj zzGatbc9$Hk#N)KMT&~jL(RE!;3zEiixH9E*I8I!@;EzF7h5uFbtULxoD8%HaM4^$D zFf0aCQ>ZMe43or#GM$RQCL<;mEG9-(a3#@lb!IG5a=0!6oD_K#(90$nSSCWBqLj&B zn5zmd;JcP2b_@(DIVz(7@FTGf<&y>@g-fuq%4FeXSuo1NjAb}0BP_DS&Z06$a&S8d zbrYd=6D&t*bpyF4D!3O@gBa~+D92)OQ-sSnP73OdP8SO<7|Dl0!-Qd&<-(}Gyh4}i zs)U(JQFvuiRGzd|7LtKaNS`KCkdbATRAR_W86{$j6nJG*x7GV}Ci7N{#78w;8 zlMDkA%2a6~glb8WGFdXIkXTa|GMX7Cq?sloD%D07sZ1Cpn2gGiv7v!RGLe%JV#5O| zSumMpOEF5xl^Dw-5>{D8MiFBrSzu*~Ws+Hlv4N8)R$!JgLoikt%oZ>VVzOnJGYZC5 VVo8jpGb=y%yOJrwgoJ;AyI>NZi_`!B diff --git a/client/resources/hardnested_tables/bitflip_0_14f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_14f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..3ce07c452106b55d1133b80351508184fae9ef8f GIT binary patch literal 12439 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 WZ`sJNt!FpCiVR8QKOFjP59@!*!%pD< diff --git a/client/resources/hardnested_tables/bitflip_0_150_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_150_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..798da8c6f7fbe3d526f256ee7d09334fbf68d4c1 GIT binary patch literal 19000 zcmeHPPiz!b82@&hPSOP|dBpf9#DfQe#YRo$ z-{1Sq`!iwRc+ceQ;+8R@Pm`aXq1sBiLTO0DI16Yy5fx}4rEcn~P=A_MX*0!St^GC% zDIZY2n~D`G6p0P(=7h#^oM8&AJr-4{JAH~eW8wF%>8)(a+i>??zDSSY_&8Iqy~@-he?@uN{>fBz zC-|GkBU_oeaXRc8vv!s#uHRnmSfU>4fQC8IFkhswx32gC$6b#>jwd(?JE1}s(}OSK zSY*?&9oI$ZZES*3Z;fDxO()F7NdUV^0oElm*^juHD~U-A5aeF19w^d2g^~r={tD#L-(!Ml`?k z?^Io2niym=v4c;CTiBE&h(d3L=ONxp;!?PA4wiTYXCiT?>K{x8>Q%qvje)3h;qW$_ zLcfnMh@OWqOL+2wrbs(oNCKt{uKcA|k+bNlI*alMhKG@N6SK&>M>(F_SxU;#d>>4O zTR|2lF37Dt387!kg#OysVV{O*xR(0?uGs9{dQv?5*)X3pZ0G5tHD!U>dk|u0889Xpu!HG2 zgzow?V6y!TK#&(I-pW71=`|PtaX=6;5K#O?G?O2202uqb3v_4fW{5q;rZ(s+xe0MD z&VZK@@;V6sRtjLwl5;-i?-c+ug@IMV$93bS_(SMBj)-rg3rBp7-5y_OV9s{p3the7 z-javZYaEXNQc0lnSsa0xz7NR5Q}inE;v7=6A4fq`YuAGRuBZBjlaU$phz|h#7{@-Q zT|-QX3x*B-p>q`Qg8U~0-I1^80x25KfGfJmW+ZK^SsP$V0+c{|2Uq93*UmDHBI$Q! zN&g>Go$>{iJ)XD8qku1QE8QOgk76^ObxBRY^7>)dk0@tae~+P@NjZ~prZ(RilrsUk z^`&p)FMZ0HtX=J$SviyAMIdhf9(z*Gq~lC7DyHL1w~SEgIMba+TXmdCfK&&{?~#FW zb2>Mt>zQ;t z6V|=ydZzWR=+pH~x*+raUXZEdOghe_<4m`V7GN&2&;RmH zfw53}%cWAbb6EmX!LhNOGhQUwvb6KVj(0eAFwwwXPppi`GV_QYk=*5)X~HuT4GRoO z9}7cvL|n?8<0`rw6{_oVD5j_cw3=(d$mlY#pH>^SWjO&OqAA^2*Xe7sKN_^Jq8OXW zdwVrAsTC5vW=>3y&SR$kOqa?VW_b58f_fS?3?=p=rs{BBxRR+!ST2nk@rLQnn>(xircv#~ zaEO?0_Nc-WfQEf-(h#*jN7-oBSp0T}8YT3(%X+;^r%tpCUlM2Jjoq!70uyy&y2%Ki zn-tBoBm0Xf4LW}@L2;K*FC47Y410+H8O?5RBOyj_qQA%s^-+{~UAj}TjKsH7-Qprr zW5wdAzt*91Vz$JYLtX@+r9vQ7ZkyjDcq1^EV>Yp=^_D` zP@6m`$?W@K5TLZ6JA8MlkLDy?W&}_E766H^7@Vh#uTBnK(bBac$ z{gV;Rr@VW|`P;)cQOC)j4Q_CrB2ivh9sfDK;@3H=tQVGKSh$ITWy-T^hg1R(qbw5V zBBA~wWy%aT%5Q|l`#ASX-b_DMn0p!w&uG!&gZ99T!uUoSjc2r=**Xi`Eyt8${7wgOac-^S`bEBR7}cda!Y5rAK3YnU??l z zI|A(6L;dXAKUGz6exdGTZy((K-J<{%`}v|`O$p;hCHQ_D-z1Pi`s8gVZj6L27YT~s z*GG89l9F}XWN?1@#rW0Z-~Uqes>i*s)pA?&VvoK0hgZ6u2gCP6auBd_r*NF`%AVv_SY>#hlKl1*^Gi8Dl>jWQTc4Cuu?*oYUzSr1k?)-5O_t7yfhMk z<}QTfLV5s88Y|%4Cki3qpOS z4{Oor60@}If)E14v9RF_Y-=+OX9yt4a;Xx#RAC`dqId43vK!R`S2Wq7!h1ARZ1?~( z-AP;kjd*Pm9>(cV(1G}%jvm*dbkP>L=1eLFs~8L=W6m(_qNEaM(tZYa6Dll4S_RHT zb|f-@KywKg#b87bkExjEXQPsW`odp|mXjCRN^NC6-$vh`a>9}4#hiXKrP;0jZ5D$o z2sa(7|GRPGjdF?k{haui_?VcO{F^a5V`8&or~Vc-9<}8p`mL>p&tp>S26q&wVv~wG zmP#8tdC89ROFJDItXM~mieGEqu_J0QEW}4+=|y=XV-;6=o-u~2^}lumaLLbG7e&1{ zYukm(9QwS`K3C;fddV zc*fhfFs?Qp^?#cly)?;D30mII(mW>}Dbno4aW0eqtdbD8r({KWBXW~zHIs<|j4_>> zpU@jfxiZN)e!gs|Y)xBmwXG+}c;LDg2a2g}SDm|hIWBgI^-8j0*r&r5ww85azTrSn zf+0SD==AyGAu6XH-VkBTx{7g?AD~7o8f?CR~L;w8;{10|6k-Y#~D2>iFQN#U67ck_>7n8dsYEcuCOmdj6 zcN0XEM%Plq7s9d0_FUcFw*k+)LLV_?BaqY$D}Qe6^WwP?r5J2irVRoChdWo~Q7)%a z(fu@Um&Y7|3xu3T1?V$L&`3Pow94Ck?m2C%4~dhf!+Ygx@}`mewOL4}9#N z+&u)t*?s!S@9MVtMwf;=1Ru@cf)wk;gNMdo-rOC&i@2TE?hWlUp zljA9;nX5|2y}GJ3!=5k~!5$4(D6hqt(tF|Y$(#zT|B!FIDL_M;AroSh_5Dt8+kBZHF1%4 zXLe_1WjI zPd;zCw*J$jtyc$YZg1?fJ)D1%e-U)N>%VTgC_0I_^w(2OVgf@nmTf`2$6r5S;{oBz zSubmlwcj9h1FF%#{M+sSD}K^^Uw7cy%d@usfBfL=!95r38~?prHMK{dt@#;R{v(^L zBIFCmX_z_5XyEXySEOvvGYJS#Xd+H%GpTIrihe=lqd-Ue8cUA-aVMC}9e46`^-$`! zL(ZbM?!$ospo|O|)mE7FjRMeEG$ z$jjA2On8VH8&b)_ob&QJHJvQwboF`jzkYOBEYR#; zr~nvfsM?6CWkFqUVGI`61x(JS#<|w2;V;vc=^e93MMRs>N)lwyjLO`Sw)U)w_amna jo0SSLo6_gHksOrTM@x=n7@N-pAJaxsplNB`r>p-2&<<{^ diff --git a/client/resources/hardnested_tables/bitflip_0_154_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_154_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0ec51234e3ef702e8d93e89f2b2ca9466fa9ce36 GIT binary patch literal 27232 zcmeI5dyE}b9mjt&_pz_pIZIvI+uPTrw52WEhcv|!QHKqMQo6O2f^Dg?n5L=FZAuHY zRNRb05RpiHMx)05f&76qMubuuqgP^LL{SqH6w#zaaf#Ye9+C>dtcp;dxz znKV?B2}2c`I9L;t$dn~qPGma&Oe)set)-#_iG*9ErCX{)krcb6JXbIF83_ueE;Gwr zBCXOoRZng<5?Z^fRFl$riTlOWWI64=ZPMUprYLib6yL9>>#~}!*1o{S$tDf$rQH1K zV7^2(iIaete8)&^PcI$oXyJ@RbWk%AeT6&ACJD|lQrK#w)n37cvVO5Q8!6vu($Xp; z-2?8-E;pITNX0&uQS+jkLt352_0OBb(#1U=Ff!F1)kYkHCM|3JfO`{ZS7toRcpKAbe4XZ%AE`tDqG6h3hMQs z)!gixeUU4_F-afIGH%nORUr7~2P z`MpCjGde7b6pGy~D|0CBZ9ljf(9ReNr5HO1u0|N0=Iau~2gOvR0G}8OeqL{qMVG=o z_!5L*aJ`YUXM&WE7}@s)K4%-*2Iq?*7^u>&&GZ8?DcsFD@Kd^nHv9R6lw4|Q3CTyW zqV=DSox9yQO2BTDb{7}}h;`XcZd^x4b_aZ%Z<0wMzRXBLJ2ESAZYeC^X_6_GSni;+ zIe_mv6$QYk7w2*}H$-nYwv(G`fYHZL8bdP#CfGj%Mccy+bqtV4J4&S zMbbJ5MD(2t8|f{52{Psb0ng`+RKyhzRfJ2 z3{uOB83Gn57ahRXbKM>A0O25(n*Kzw$`+`P(x!>Z1Nc)a!3XRJ>f{J^>hx8UnkFW6 z!J}}%k-Hmt%;ej__^_(g<-?potzzZOL$I7_qk-1Gj3}-{6fI~LU#!HP6gix=9#+WEk!F`J7K2i-f`to;T8LP*ggfDJIaK`oBpToz7L^H>QH9vCZE%G|Ata!dHIGd3|rvZq|TbO$wojno5?IO^=c;rUq%N2FkDNk z70$XO#am3e7DL>HK`7e}lU$8LZC}QZG?u`m{i`vTK%k`7D^YXVj`0lYz__MD9@Av1 zwhv|8{Pzer3Yf_a!#oB>k$nczl(`%)D?GNkF7@Z_kXdCG^*H6DxQpR~K7>t-fjGae*Ab5ZKY9vrNV3hOttufU9qDY|Of#%b^-QiUZT4Qf5XV){ zd!-D_d{3|!+zpeI{dlRg{frDHKc=&5;N?wjAf**iUZMsKSFvOOE>xN4!x@(FyZzG2 zxwRP5m*|W(C3Wr(^9c|}T-V;l~FDmo>bn8TO zRQu;o?xN7n2GK8a1*z9)+N2^h#pls1apRz7Jg+mQ=#T~#@TNhgk@Ial!`9^2M%s?Yn6g%x2uX8c#f{FG zXecxfJlLY0^pbe^sN!ZsY*a!`!&$V*IOW8H3AhA^jkHeIi6i> z_EpPKO{3*G%nU~4p>5iv9rZ$MTxZ6`X{E&_jbO3+Quv`s3P`E+E$-RR=kaEZAp*`K z+3imFr=~IKTM!sV3e5`}!be%QV6~hpt`SAV>3pbo08$BgIHAYhn7DO3WzL$N__rlP z4`YoNwb(r|s7hsmNvACw#vAH9p1;7_Rx@Aj`~|Ss#Ms9$CAlMa^9B_S(_y)z`*swP z&|97Q)IL>-BhGYy^^PRKp(Ea~7$++;JNkpRp5;;H;z%y)OqMgjm0$z+nEMZG>gUv^ zUJmjOA?SNDdpbH9!eWH>0=isp(v1hWf2v{x3}3k#8t*dcx{m>*kLq;#=m%+_?wc^XXyA8 zF~0?)9ok@YA|%@|hvi32y6viAXlN)g1WyLI;sA#t?)^B!;dCc_SebP+r^a~&qFL-_ zwBATNcjOsO4pcy~&tisC5ZDwIZ$#2%I;6ep?Bq1)7qGC>%xUe8zLLCKYnMCfk%)87 zH#en1rN@)$Lj<7dQyQvq!`^V2biBSKsBG%L?Erhw)JTE`*WirWgNf2nlX-SxOrPMB#ljQSUy8S@Y{2g`V6TAP&J3c3iu4E5vRVa@Yssw%8bhG zcs#Z6K12FH%#h??zcca=mpzR5Hs^Bix?RD2E_wwilksAB!^|zd8D4BguY9>b_ghBp zC+@nBK!AXHob|bPg=?BNB;lLwn>zc8(Y_LXo3%UQMz`dfMUw~>ncdW$MCE-UtB$3P zq>DDXs+LPI) z{`0GKwY7tA(U?%k3xf_9?4)uY*g2D>adOe{Tw>NsIZwE&Ytp)Iao!Ofh6wp=V-|m? zmGA;Tt_gb&OAq;y5&1$yv`^Y4tf`~{-8Uy_jRh68aL>}K5;Xq01z8%aX#FdpV1toe zC#_wq$qNr_S;`?kEgZ^|u{Un{B1^_#@R-4AI^6}Qx^O1tOU8>&vsHRDbBy>jf)~k! zx}3SMslrVO_B-fU)+A&LVm_MByEr2(L_APt(LC@0sG1mlmV{dY zy4TbXR>DWt6TXfrN5w2)${~V$&E1qD%9!gPrm*{ zChY4^SY%&+QWxp#Prm-NKMQBwTA!~!`T7$n(ri*9Uw?YzA58M~CtrWU>H7MUuRp!T zPw4sj6MFZGD^B|QlYc_bKcVNJ&`UM{9sA%Zi|h$KUw?8>cd>AtKjrd3Ax{Y&+kyKmX;T({0`;Ebz>LncPIxBeuwgHBU?YY|Iq-ZY(J%)zTVk8 ol>7RVuRp25_w}ddwF_T=a+r9nKkwN3)6O++>cX*a-qUyg4?z(t0RR91 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 deleted file mode 100644 index 0180aa9014181cb4afb0745471954ee40853da63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1122 zcmX}ZYfKY&008hS75ciNw7v5GP(dsduuXfH@S#qZO&-O_$$;|syYRSP-J;7r)U0tx zoItNFeO%aNsHfS81cM;Wyt;j0)Xm%I;GyQ9pK{F;?=kDPR_aewb{|0IJ7z8S+6g>E1fQD*mT|mK zp^yze@Xi`7xqsysss;aM?74mYv}vL1_KBsNnyh_l<&@@yEwWaW`^?(2$P0muL0j~~ zw@o59gT1LwO-G=9d9oDJLdc4-?LcDj888uuLjnw|C5P1vI*TUm7#$8T?|GL0EUjJd zSlEBXmmjiV;jFK|I(w;Y>BmlU<>qHFJ-!H~GbT(F(+rcpB4)Yt-O6`;rDNG{CgDXP zOMm~(Vkh7>&TE!-E_lnH?r+3=z@x@->g2vJjXU!|J5d=b4?Z4pDm?jyGL~S8jbiV= zx2cn0>?Q4JeTmkr?kl_jevnTTRcGhydw<@#t@&=XZz!^ClU7d!Ulu-c*bhp-fw9ef z=TR_YuwcRHSo7c8kKMYH92(`X_jb3e{AsXL$qS-g_Q`s2?|N64V$hQqavB{yT(U5n z9Ex~md5QVM`1U}@PcHSSq!mm1{mJmFg9%U~7;Q3R#iz{gCME%=`x!nE0l8ivdCeeX`TyNkZjz-H|B7Bqh2Uq0n&L;KjpoAvLtq|qmGXF>4ZDN z=;UZEMY{<+{!UuUaR~xaX&{8>6F2}2X7XnnqR~SQ~Drnr@^x8La$PTAQ z-`{=Bg0&33NbP7zku9olE@(g+0Yg diff --git a/client/resources/hardnested_tables/bitflip_0_15c_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_15c_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..aea4d7a5f30aa5dd331d4afc8f9024ad794ec8ac GIT binary patch literal 22128 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 OQwi%C`+vH0;Qs)zpnpOD diff --git a/client/resources/hardnested_tables/bitflip_0_161_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_161_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c0d488db2fa09c5fa2fdee9c22226f0636c443b8 GIT binary patch literal 42238 zcmeI550q5Znc%-y_3CwX^{aOqnmjQ^jUgLf4}d$_qk^+ZC$4NVZ~lC!m=OeAL=IuwZnLYo1(SWF~2K8`b?6!Rr@He^#%b zpJ{c1&~YQltQObjj!YbH?26+jrO+ywviK#*cZnB?DbYz;8tLeO5wF`s&iQ?DTyZAn zU74$J^N+@P`f$&sYo|V>|BwW&dKGxN_G2T(cmgvliIb0nKE!bVt;uTzWQRKkm?)iv z+!MqT=4#7=_<+`F#NT70%s3-?ZgHCC#&O6v*^Q>skTX%PiQdXyk)Q8lBqp7^5ID~b z$~4NyaT9>wL9-6Oswk~0T7p6Q(-u2(8nnhg1cb@?YL*ru@JM5k3-QfHN^zVu(l)tJ z5)%e93YCDqW)viAs@~)v%30{!CNju8BUA4RN=(M>HswsOsY-j$55hC+`E{46j&ESb zz}Onk@vA;C&gA+IpmAu*Z_YduX78ex0VC7mcssLs)l{2uP~jpYW``M;cA(l}qGGQR z=rslWKB%AOFzG%9iZlGa#>n_?BNO5{e#A&&K~Txi4jNA1$ouo4(@tspD*C6*Ek@3c zZ?u@$Vk%9{yAh1c?=iAqExo)JK!s*07L>+wJGdLHoyUFgtK2`sNPqkg7x@CF;`mLb z1Rj~4K)AV#IDru}3SkLQTWRtu;|OoZj7&aWnt<^dFeg7p=gyef^SOazG4RxdxzJ$^;oG6Tiyz(3Aw(Zp=foBKP-WY1Z)jE z-aC8u?nveg4Z(epv?ES61wmWk262v~4Gyn&WsO@|opHo#7T^MLkmq#`a zt0I_Ih#c=Sq1Sc#)#yC#<^#y`22J$kwQwHP?g1y>f&dCdGSNt73pAm_jq3q7Ynd{n z^RiMfdnv!~G19iah}TO(9pgj z(ignUh#e-{1}(F@X!;tUF=uB9Y_N>qVs2Ch|CM6_hPXL5`walWTMMd|ny6)GU0T0pWYR0l z;dW-e(#V~?upfW@aSXzT*PH&v90L1cWz;U^pHd$XZD8OiIY=j$u=y_m> z{}HKVtV9)6^WzHrjfyr8IM#977Xx8lmk$K;Cq~*oX(Xc4kE(=4+Uv=$#$=Lp+ zetaw+_6DsDzIcA9QacZ;hHQm0uOMDft(!YoJ#?@hFmgsY*lIO-@_JK!BBzawJP9l= z$Sx&w+{f5l@gEIjl8Gkt!6xJEZE?ImsJ1cEB5PvggFUoVfkA}P8`TMm^MYN-tf^@x zXvut>-k_>>cOngYE&7jp?lrJlv$PakG36;)Q*N8AzQ*3G1G$DK%4d`PlK8j`#{{`a z>}gZs7RiTe@i07DXCY|^o9%R(xe)2=4CpO#I?O|i)sOX!GH_&u3A*rr>RW7%toXFf zMS|h$jNH6}&#@Hw_{ z>BkAfDbctRKc7(bRa8)iS5?Yfihf#xd;>-%{wBJc4*tj*7r!MaWw~uZP*%$Ip;tit zbVRcMBcqw49q6x6`=`1{U#}~U*C`zKbsJJmlgqJFZALD88qES!N>EJl^7!L5(TL+A z6U_%J6YyM$ye|NGR%ozYGX7dFZV96CTw7^X1h^@j13dSk9svFp74`}|UXtu=^#tE=a~IZjXd=xH@|G;k*oPWXrvm?H?o#~ z@;hkM0TCCte+nZz=OgDJ7x@C?-+Vsk_e|sspiCK^iZjKP>s1FlpA2C+;jssd4P$3R&h+(?No*YEmfu&(c5qiQv5AF zj*n*6`ju@b1*CcGA zCW_zt2ZDYqSYxlh$uW0kmAl~K`EmS`k$E(QIAAY-5kv0@Bv1F?;Ijz@HoN~ETI~hK zd5Sz3#Ir80k*nH07exb?e6GP)5AA&j|K~P(kWeZ|8DkZQKEP+-bg$<#*NX9MrXEWC z07zDj_0(=I#rGV8F|7~y_7=4BrGpIE_#{=nwYJH%p8$zs9>LbiL1h4J1R+n)B z6Up!A7H)edKdmE>2LOH%)93HBD)A>e2qRfNy9+A*?I~QfozUv12|+D9&`OmGt{SYM zOxQF^@?>wk7e`D*ZH@IE%9#PgX(oI#5tDn7A39(H{VL;h7I!N-ob4*U*cHTVF7nV@ zOgyQ?`7(0TMkpP~jzDfYOIMQo3h!=&rj^%>oCV9y>_8$u34in&`9>T+XogMv52jj} z5&Xz!J<=WY7f~d=!9&8}P!uOC+IA_7`f0_jlKpzfzD&t+c~HthgFoZ*7?O{OBLmC= z-g}JvMf~f;b(uQN$ow4Dt$S$CMRe|0>f$sLtkGX-}*jh|&A^_0r^bJb!IQ!Qn#<8fR!PaWQ|UXwKB=*^PJe@6RN zZ~uhn1nNe4P4O=95JJ(M z)_Br2lV&t+hotRD^!!f*5%6|T@uUkTYV=U=w$Fx~N`2Y%z)M9SO0>N+v!d}>xn<$L zWaXBjCvOX8dmJ<_npTYYa%ZB|QY!mVc0cwH`EzzFGoZ6pU&N9V&R7j+fQY;g^RcQ6 zZ~=?w@Db}zOT(DDLXEQUi+Z{)>&eK>pd-FCL&w~!K?NUY(!(|30rjZEXn?=Q#k7aN zFqSxsh3gbGag3XnUj?vR`I^vYiz(fqD(X6>?pOjidDtwJbA!@nP59YHMq7y`D#?<( zdxgo14nJT%Dp^DZc~e8cl%>V5X1yb>mBLVRJ`sixuvJmJTY&T)Zrg8lWaJ-5^MAm| zj14gK(FDXi;gK*ycm#2ca*A<>8v(I_#_D`%+#z!=zw!eU;A)93bk&_G&Z&AM5gp0Q z)(-?<0vt2T@m9+z3xj}TrZfrGkP8EJudb{jbNY2LXtdT)-Il7Wmf_6T#H(Nu=06_3 z9jj^q<3;x&j7p?3d(!LIs;zF)po@6d7PhH>#N0P9V`csfYp=-Bm6qh&b-tPNgUci+ z!z^}LY@N@@(fQHuze;@kV`wQ<-fi*UDa+>ZJG6!J>#&>yU(SQS7S*7Ews49#kJ6@B z34`XYIegF6SPaCgZhoPr1l-HqLg>1GDmN~R(ur8s`gRHhe$5;$v4E+`4!F!GtBrc>U}?SoW}wl< zLd3!)@|aK?KcOMFg6>XuZxrMhP;xAp9WHq0>Ll&spT{yTr&P*`Rti zL|KA#EFC3zp_RN9Ap8Ib|Eh5X#p~+yHE6|PVEPq)?SK#CkWO(Ou3>V5H3(F7eB@dX zGstQtE&=6JG*#ydC7<|q-YO&4Ab{i1>|EKRg!qLT;$cWuf_^FXe4&U;Q*Bn54CI7_Rd znL2e!rXQa-b1tG;C=+*lk~;=|j z;r@UgbzedlD>25f(trG~kO6mFSL%scdLNL6Dr$ALq>|$_1yWJXG^|rblh}Y=d@D?o zWz_>#rjGJKtxAA;AgV6iDwQ=qaF&Mbh3+6eWJ&`*a~5ZX~&y@1>J>4AktzS3Yr?YL`sm54)~ zu6FvB^NnnBf(Yhy8wlcFvvz7xUdP<^uGr5}>;~z8BfZ>f9JXOOpOkIfoTBjMe z2Wk%|^lA)5S^=*V`(VtvFfBXnr>9YZy%3HG7GSQnY!?^>Aq4tD&l(qL-E0l-V+`Um zgQ=j(XRy3-|JksTu8xr^4LORplR;im2sGjc$BIVGyIz5wblT2n#c{qWsxF+PUL{&| z&q`AzGcl|NW+eJYH%Zi)sDD^=kW8L(bEp!XZ_x%Br1w&^V%_0-kRO5io7Q+oQwH+)U+p@QzvTu7 zRts2<=?x239A~21rlF({(|I@2_+eV9X5S3o;4xmghBkvb0Y<-h4Ij1=rQ3j3fgUz6 z7Yg_(Tnm?={v8N6+DH3wO{R}0dJ|O|0@@pD?A<_S2O$<|HnMW|Zk6|%O9moQ)uM}D zjn8>yO&jJ*NN0Fe5a|>;O{k344-U0IUbnJ9(zt3}QxkwVRb=i!P--JG_dn4B@U`Oq zEs?o!ek06>Q7qez0dV~FB>vE6=#DZDg4e{|%SQYz=rElb)cr0~X+6`(ocH*}cER>8 zB6F(ZXTse{WG<*q2j%F`zIM{V{gSURo5MK*b+i}=!X*XtlPWGoPmb>`)A$}yiP4F6LVTawnN28Z#TU75BI1{? z&IknVtaPgnpr5h`p^K5seVxx5@BID50B<~$c!`ju9kQ)JnK1v6RPM+s6Se5Wh{|YZ z77;un4>6F2poE^XK4Jx2-=IO9WQ6_d0Y`FSqJd91iq#1i+ND@dU0a`&&W&$Xhf4ev zu+o`2hqBK)4)+@Q!aYX5h*aH){rD0p_1^W$33nU$^4Cq+M-UdfbE>3k@mw-7Ms_&X zU7LOA&@oav4z_;Bj680b`nG7K9mvjGQnI@U4}$NRz1CL~ZbI#Y0;s`#1mOLV%8T3! zcqtl%t0ia&$UltapbJdb4lL_4m3Ke1zs=9hv=NGETD;$TDTvpenp1s9; zd7#CF_bxK>@8IAuZku#~3IE~xeKL#t66YjP-JTmjYeV(%pHMvgMEfMDhrrwid&MsT zNIAP8s6s*p6}JZ)K&{Dl2Hgqbvi4|J&@gYmz~r&c9r$~qTySjljTxp^!29Pj;ILpbOuL8=q*Prh*@{cxbarz|63r2peoI2q_rNY}~ zPvn{t^t3fFwdM6`6lc8#M%B^i8kl#VTftY>6r1%^@{^!XWL=%H|9)9GkHrnXpcXR8 zCRiql=cwx$k+vkutU>80v-X7F`6x`)dvcZ;M!95g25Z?23uSle33tT$_wd?nO5&)a za0G3cQ8NzrJgLD87hY4i{=&#A_|SQpv>#kG+Pi#itan+D0HV}7EOa*Ii~Z5`dc#a5 zM=kA(YjLS>EX1W?|0|UGc~iRpF25(wg3Hb=^y- zYiaO&Av=WQr_mr;YPG|GY0N#SUdDwDI%R@vr8|_=i$S7|>Ur)J8b#_qhzL|c^Z-pA zmOxr9)I#7Kr9U>z7s;m>y<}_oz}Ht1=s56>H2F!>W_cO${<8L&H^Mj?rEK`CbTsOsEB>h z{|r3xLl!Q@hWwmdep`{===%q~g%IBIuvw>w|7n2i*_lC=x2cosOQvVYC`p2V z3cZgb)TN9*5(Y#|O!`)h8K%KXEdEal15O@U+r;r?Fu4f61Ycns5Y=b_oiNMj;=Czz zH#T>XaN@HjoYCOI5_sM+UD)pz_q)zX568d9kb#_T2+5hdTJAkLB#|8oACIqc= zjwxdTC4=B>;=7wG467bLIo=mVm%hhXpOH_(WFuZ9qVrn|^nG(JRNRt8Ywt9Hv>^#d z)^~2B2x11@(T9Aa^L{(QJpkWJtn)XE>{TCHe2#rVN@``Jr8O`9Lx3oENWQ(+JtS0jf1YaphGL5?V95P0Q@fA=KJaPdv_HM z!#vbKM^1;{qS@++u5@`3CQBDn-tE?KJf+2nT31Y1SoPMZR9}fjdUW12JYf~los5TB zRNX%jqi<8wXV1{Ji1?T#vxna`fVU^<=L(g7SBrQq2KL+`l&bo#8U(_p{9h#9x#`NQ zY4d_c4>b{^l_sYuKD;r$DY4em)j%|%lRvu4Uf`1p-{tnh)C1Oqc5GUR?oiQA2ab22 zBJgGfS1+mgKg=BYWjb>x?XIiaIeY<3O}3m=6pe+s)I0b~CDuex^w z+BND6g)-6qr>tL8?;yH=rinHoscH2hl2*%2Bl2VX+6ro}lvXdM)r)EMqWZBIF|Q-7 zUQDYOHBOsWFG^aym{u>cZXc|@9<gN=A8J}yko6$A5q}xv#$?cKwwY8umCo{y2b8zX66bBJm z&kWFESqqpvM*QiUi1{lNi(JKbM*rS3Bb#!l;qhM%D)hEV(;@`pZQ_WYbf3qKps8ysA9B!V@y4# zvcZ0!JWAQ~ajl((%zA3jf6|;)z%~i84dYBXSF0-3o!?siXb)3Lb}5q0(ysMl>3o9m zkgiq&kW`eBZ>wVKf~QX zRWB)!WWH}uccQGL@zhV6>X)6Mw27~^t$c_Y3ATD&fUTcIB2L;H6n;&M1cnt2q)OlW z-XPic_eQ=1dwyXNtP$Ty`RDo|x)UtWz_-caM_ONG zi$n90b!8(Ne#)xsZl0jbj4~~3=wYBB+DLgQ%>P^2)Gh5ha#+x zJ*6rNLH>VlJC9#>{gR8y(6qL0{JnHUoov;tIh$oai5q#_hv|M-|vP(99~E&e5%qayB~i*7Y7lejKZNMF~`6|Eg`Ua(5qo!aRRU*OJy zUEiNeibAVNQ7ETyROZ5F%c&((ox5C5Ae-|6%1dsi?NL=b*ojIbd&w43SA~ilQM_zN zu=Xcl%Wd_)AsE3t6Ft4wJl;f2K;A?7lOEUY)Ueiqse$pH&>~UzbpjTMI;@%!hNr14%ZQ`6I>knD z4Q)^~Izn@Ma@xlrF57~lGu6Zh^5&5<8aAVVG3=+_6Q23Jt3HdCF_-W=PGV0~B>OWz z!Cvl8y1Wl~(YKM}z5b%;anno&SgaKlIo%{4<#O7_1>&_qskV`+8`&M%$g~+VRo}?8 zTe&fgzi+A++Y(YA8V1S6u)bR1=zZhz4#qNqh#jC6qCNRc4T>2s;B}ztQA=Pr6M*rW zwr~lc)N4v?Jjl>3o%Q0;e8J^7#`9byW$1n&sJI2hD};GUxn)QeQdZxnGy^*G^-4C1 z2GSQqH&ftwbyA1cjiqL){i7we>aV42afvF@=Gxedd(uWF%<4#KX@j02lnJr!yJuqX zL2*epqrFpMsg#in-K=&}Vd+i`+wR)&LE-`Ur&|J!|B19HTsK-r5334b%dJ=WFK+c4 zSf>VxOR+6S`0Vt$`);QpG((IJK&5;2M9CmJknnCVUZ&iu)vBU}yml||BkQ^E0AxX? z99zY?dkR|_K9ens-rvFrAaqMhdv@h150W&ciP^kTp@sb%6Rn#I$bP6>WkR&nJDect zZ3B?(_VoNnIQ>EOc+s@!`H`xnsP+E;{`^R^xBShhI@KWhD}*gQIr6FW`D|aRNbq*wV+CeB*7l$&u;Fk?F~iZ1>k~Am^qhNA?o)!nzV6{#1H$WG(!5d~E11JvlNxIWj#t zGCesmJvow$S$c9L+4J<|Nb<7v2v>S?q)maQCr6To^5s;c+nO$&o8qvQoy7o*bE;97%afMJv?OlOvOIoAl(!5%rp$ z97(-ZdU7P8O~RY$$&s}Jzx3otRw(Jok?F~iTBS_oZ+dd%+dedgiomzob&{SO=}|m= z#*c-eSUWvAQY*UClOxlUBXu(X&t=iPb9!=Q@pMnVPPb8?**0oZNl%U>x|lxqx+gt3 zQqvCU$&nA5^tspRbFb6qUJqj!L;li}BiT-z6gr|GdE8fS)#(nINKcMTpL=chDsM6A z$&u;Fk?F~iNg+%6+-n|=Rn~)!c!*8<-0MG>=U%5LNB*uJl#`wuiJM4uN$*m!Mf{~F zM+Q}W$Slt=E8HUaaIM=co~*M^?P+gGPmaV+-bN6vljqAF3?hA?_|u%v^J9BH&s!fT z9?jR6?tFKTQ3;p5Tx+ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 deleted file mode 100644 index b68ad5995eaa9d79fe86283dd62d9cc5fb27860c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmZveZBHAA0f3=NOaTi62Ip?F!VJa~d;;I`VYb9eQxXW_280*;yjqSq-?3Et5}Qq8 zNnlB#CVmmd2HWR}5eR{{UWZm~YKjHcC z==tPVmn86Mxu9A8IK{wAC|`QpxtyLjkoc#JjD+mO^y96|2?-hL3D=n`Svd*+2e>!* zSCy$MFIgv|{>aR@NwkT=Z1(BTVWvp{`0-1kYM!Mx0HD8Qd>BMTRF>7s|8{5D0z4L6 z`mFNS+eSmfiy^-GFZ`T@{nYQpVWEyur0xM#aW`CY@4}4(gV*vZ*(SRavH`FOXzd;G zOL#hd**Rj`dg=%3z08HetH~mb!Bfo?h*&k7-W8!gq~pLB!jQ_PisN_jh04II&U=uJ zRG%FGn`FgzSoshCcAao}V^8~TX6Je3i+2^rCk`#wmZ73Z)sZmt#ymxYau7U>bui7D!X&%ePMH9jbX&BhUEGc5kYzS z-ZbXkJ3f=ryqRb{bsZP>dJ2*W!#<}aq!Ml_hv=|e6^u>FIf&P-h5(Avwfb4Lg#W;) zv11X(9&`36ts!MUm%e|Nre*n&!2mzVj%ud*>~9eeDhlGExr$n?4T%;yy==@$KltgYx>#!v1{LbQ?d4A zMSi#6JQmogZ7Z=(MaquxWjDKf^6iM1G=#w(D24_Qw_4}s@zXAb^+D-l8_ zKaOLNBe}~~$7^7*g*Sv`qR59Z}k6$?IORs4V|!9cTh+aV04*QEn#ly z2EO832^g-NeCEOgnTJ-TWmB~WtN(d*{An=;0vPTwTcCbraK5Qx{me|}Ff`4`TMXHg z7-@nuAPsPPdKed5yX#&lGhT~!Ay~iqQat{Y+^uZ$?^k}kQBl~lw5u3?dvSUv|5ZT{ zr->jIg`y=9#oYQ*Nr&T`&f!?}ar9=lpdCH{ylcZVfH_lvrsm}_QFXov-yWvJ9ZY|W z3nPb*2EUIu3V^MgtcYzxi{t8IR>#VfasjN4ORiQJm*YFo0≺UP@Ku{5axtzJD~e zzDfRi=|BJaMQov7W`46X7Y#Wkmii)HFaECS^O(tvikYW-+{;H_?DO`YUp!y0?bwr-EGL+@HQM}nz%z$U3Sfw26Ff~(kB15n$w(euc&5J za$*Rbnm*Lytz~tOEXw1f@3aP9&LS)MX2VNC6V>FuTaYy;NE~wVYzkD(R|Oxq zi7;Yhx+W26D`>}PKtj0NrE-)+5JFcCj3l1=z0vOC->j>?BY@Qs$~y zTh%+~;L+|c^M<_7hEakNi=s?-xK5|&5R~?J2uNFA&)|cUwixa#L#MKC07wwcEHa9)SRg4+MpwsBrjM40BNPY z;cC3U=M5IiMf9p(3sGL5+B6CKqIT{atX-GX_RF}%Y4wa| zF-ekve#II$CZ?%HO?5HCLF;UGsD@L+oUDeTkjLbtv?jL+pG5UW?kp0UWj;jOYq-N= z>S4VE{YjN1AYS9IMmYfS9I7vtVliFa7s?OHn%2?U>&PI_3QDsG*XMp`QRm&de8kz} zIo)}R#o~&iP|W9SNB>+Z_zl<&j(}^4wuU4SRE1H6LOVBYiwa6%vYoVpAmTJdRwZRb zxc$?gsk5k_rt>PbY+TpHTbE6ztz&Im@P17uU44~j7y1<)wSUc n-}&b~#UF@++YdkLRBdS%7c^^&<4Zjy?@wyaiW>+1Hv<0!T<4z1 diff --git a/client/resources/hardnested_tables/bitflip_0_163_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_163_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..34af1d6f792885318b632d0a06b35ed152e30b0a GIT binary patch literal 23829 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 V2XTdY*_Y4j_9k4oYBs!)`d>;fKkNVi literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 deleted file mode 100644 index 69e051fbf05a89ead34b54cac35931df8479c12a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12956 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 diff --git a/client/resources/hardnested_tables/bitflip_0_165_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_165_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..fc5eab95130277112400fbe7ded21802a815db33 GIT binary patch literal 52098 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 JpSiu}{{z|J{gMCx literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 deleted file mode 100644 index bb2c8cc48e2a75953ff0d0e18b970e7997b0fd52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2901 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 diff --git a/client/resources/hardnested_tables/bitflip_0_167_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_167_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..438806c68115f44652bb57826eea49bafddf674e GIT binary patch literal 28775 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 deleted file mode 100644 index bbec52e26030ba94e8c3dc47586683d466565dd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2437 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 deleted file mode 100644 index 0a34da2f642ae62699e95538d6530b16f252d182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1400 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 deleted file mode 100644 index c6758b6a2deb35274757eb0d16e7ca0c107cdb30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3478 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 diff --git a/client/resources/hardnested_tables/bitflip_0_16d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_16d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7df5b243e9ca4c95f4e04d6517b3c8897e0dc9ad GIT binary patch literal 32892 zcmeI44U|;XeZc>3zV_|T%)7g=E3>c*gDbFPT^8iKfQ(TZ6)9M2K#eDB)QAvR3`s3D zhG)^BqKzgRQIohHlZdezl9~u=;#dzcCRny7p@JV#)25Ol5j5$EIqL22f8Q)DxPl+l zr02XjXLn}ad-vY|{eOSWO&vL>aNe?w7ltA?u08!(v3B!j>&Z&9+w2zMlbZR59Ez zl!^WINxhw#7Pv_V>7=>!%%5U$pXV5tw@s-X)w!bhJOc6_=rdtR2)`E@93KOPBaMNQVpa^(W>O0)+yL9(&8X0VV1vGVjIniNlNgDWKml`Qr zTgS}?f2`>Bfa{GQELqJa6c^)zaBv_QBTY{PJzfx|SpFoSu2vi+maz8yrkpiAeUFg= z_9%zOFu4+flm$9?!%Zpq9fmV$v$dD8>0KtQVJErKMyhpJ!vLj`aZJ`~?Nso4hklyE zep*<`)&kCK_5;@KKqEEnM#eIJ=!HCax{(Rivd5C%)fY&aFxSWsW-Hm8sfCSvP(KFr z@h3^RDD~uF$TovqBN>!y6LfHCh zzR18VJNNu@Dk64=BXdKwBfx;O^a&=Br2UkULG8vDa9y}dFBfK;vECrF%p0Y1U#*v* zB|y($YYDb^?A;wAax9;cR{_FB%4?QS-m{=D$!0)Fa)puXIXbp!HQdEWpXYU(K3kX6 z$3fwPeBtq0Fr9u{Z-9*YtCU}I<-kY-`(t4+=5}~D3$W2&82Rwa$~blxRGk_WBnZcG z>k=O0O77W62ogH#x4M4Auv~cnsMrJ@)4nqPL?lYia3rmRqif}C6DIjyv{QnfY92eD z`^^kd0F;N7cdDiW7~5DjM+sB}f@$nhrKE$MvV|J^5^J(Ne9H@}6#)HI*s96e*Y;-v zn904iIo^TNDz|o5uIGFcju^qp`C$DBfUw^Vb|ly$9~(1MoXnyKz?o;^lSPKrXRCfm zwmF3}7udZqeE*~(=*Ns=2br5qsbe;C8YO*E&H~hlT!!mDwZ@b`pJY&rk?vJNkC^9W z7<}2x&TcYc$RooC8L3*rg6-%KC;1^5>HaJvW2<>EUTbXwc&`g~K-Xjk%E5&BcC$gj z3~a)LQ|I&GDyG>L2w%OA0QF)3fQn9V(u%vM97!93?m>X~f(dJPnWC4?JoE$9@}%|^-_E;3;?kloTAlrsoYu)ER7Pwp{c3VCiqE^?13{~#P5TQZs~4%rF!P3-%~q62V#!mj=ch0}@PEcdLp~-D3T(oW0b@ z5#R*Q-U;7;G}YqhFX_D9$n*yzCPCeKPpZHThECOpZG)L7c{5fftC)}FtE%!K9LhxC zZKM;`kpQBidI7*VZC%B8z+I@{?QUqX3g(Vbo37St3Ic%e++b_-a0atG>WST;dhMrZ zffiFjuEPX$E`heAcQFKJO6B|Tx-ElO9>}$zQCCHJkKsLRiXF4EasY3?1d`GjY>`QF z)-qziaqN_vR{|z)sysgjQHOx(aJ!KOYB)l@ap0>ecilj6QwMIK!SQQ?WvG?Ewx4Fp z_M=7~I2D38tQ6Xf%wyex4Rk(UEMC!Ofa+~E@-bFa+AdU`H3Dp;!CDSDeIC#W#2obdPbWD~pj*s1P(K1jl3(%+WaINZzrGsFKM@`t-0S?$vEgCy* zyZQlbAD9KG%+yotH2^nExq7{k$xhu$O0R#avcr8t^b?w69@bp`UALm}Edq#nJF&=8 za8%E!T5?k$09`=9%KOGtJ7e6UKJD{r zMr#?YoN)^Z;w;oFGOOG$2Ebba`Cdf7wKW@Rf^yQxz=@HG6dtH*7GRlPG#yhha4$cN;rQS3hJ>)V(u`7Tp!>2pUj?rn|(u6m#r|Dd+S5s6a z(5%`=&3nZ_O4jBAy!~3qIu|oB0(j6Q9#14%^wK=%(_gPnd^m6uwic`GUGJ2yXXLzD zk-DA^ALhYuZYD-5%%9}sB-a>hU?*Gyx|AyDwx6p)K_mXnrix8(gi>kHtC$a~&)BQj zn@u?BG@u0S{|KJuIc3;{gi+sxtQzhAD1)qZsQ%5kyB;Rbb*m!Y}SKiush8u zj~SkM4&=V7=1#nsJPb2F0tZ&9Pxmn%9*VH5Pbi6BE6zoYdFrByQW;{xliOJPF;<$- zJtkHkyL7}L03N|ZcPld%W(NyAF3iwT*XR|PWQi%KFsPY1tlP_P?YJ9z)ZSaH433d6 zA7{c#pt*CdvlqjwNmC~9d5d$scc+nKtyb!ERYj}>-krU;Hl=o^#O4mvB42?^VYJAO z9^hj@+%p#k*MX^J>^ij1WCE{-xYEgk2@B0ZC(Z)cO`dB?jUzxryOAR=aR~Ki63d0& zApVQr=KeQ;%~zQV4dgpv^YeUTLw~QLnSgncYl0ABEN^Dp=T~3_&&ovz&qCgiw@d6F zzzz|cHx8U#j4O+S!pdP15~QtN0fuhHy++LCb4;33=MDM47T0A7{~Ma(N>M3zC| z(cgg-wh5t`$#ORv`G&5P(2SSsn38j>YVEy5dGK5yHIN2I%fnYE+9P@&P}hh6VS#Qhz}E}wN2xja2Ei^HJp;L| zD67GBF!FdKC!A4c}$TA@X$MEX5Vje#So6k7*7Nnx_?4zLEP*1C5|^ zGl;kmc+!_*n-M`c5zYSq*yodaVF?ZI9B1n4>Uqi-VoGrH1h^^KCj4lBcLzK_H4@J| z_-J4dVu2w5eP~M^KF&mVH5#UjRcCDq%XIIzs9TwTbtb&Ji#za2!iFsJvOe~b6JM?= z$m*ybYd^M^$57S&YXCe~Z{s=Thv|oh!0HP+tQLH#9ka^n@K3bU-HwxAR+A)fM- zz+JsMP&4?TR!Wr-acja(=kfE2RI1@oRsL(8=O4ZNZau||Qu*=-$EFM(YxJ$K<3x>mbRnPYjpKNkiz$_#$a8e2( z<+aH8E24Hd!Q2y}K>hRoy2!|Ha1mhKPx}J;Z>huEV)dy?QAv{1!RD=9!2{I@C-%@R z)W;I`%DuXph*-veqxO?bdCS0DcU7j9Cwjon&wg*@wk(K1pLLr~a&)pKAA~DSc-uJD zTPwj#iab=shJqnUemN)?iIb0GhA)EW7H3j59g%(k)B|#@<71}EO>OK_-^9YZNay*)VQ4p^vPvBu- zjhexTkl5&0)jmg3g8Y6*wI zA>7ChBA+R(#6%q?ymLvgK5w4)*+Iax8eOEAK;x!XcCs%>c3R}`()b{mslW+D2*V1N zK~Yzsx0->tfZa{=hQ4)iBQO?iO7W)J{iSJ; zDhLk3-qriQj|w&nfC=_s9l=`Ulq@2Law@1kAQ-*|WUF#pVmgN!BY$N#L!mC{smp}| z^@)misPnwg`T=}Z_Tc?~gW@^CI|+wd%ej%YiB_De>GK0pb@Fk@p#gC?9bFv-#3^;m z!Z#+G@>WekOPZZ;ds2Bsx41!qDxVpm->ya6mK@;1C-^ z_vxS!aW)CTFH{ZICo1-wf0INTCI6W{0qLQwF35NjO*Hnl2JrG|AVn<6cq5a*&O+5b z=q~v_)~&bB(Jv1VVq;)1siv^k4#RnsXNM~aahKLbB*3o-cLMn%eIIayf<4G9A%!nF zdvp+U`?NBB6Df66dZy^#Iav54K8F$jta2Op^U;!nHYpspJkW+WW1Yqkd?j{$$D2=>DsIN(JZ-uoT>~zTTMfqU1X#M%6cdk zEt{ObiV-LpuZ8b;e`hXN%|ht0QzaD*ts3{htQ+z7rDuvNS}zQq}qBOHsLAbn5I#=x<|SFi{QN<%?xAT1y4jCeV36PZccpF;%fj4 z_chv_SYT0k)!ktqE7V3|wkv5MHi&LNns!4Rxup)nm52?i?Dl-o_CSZEq6Dl-EF` zYeu_djt5=6yUezSlc+&>#;a7khak<_DBZ)HhzHCUMzPTfGIM+D-X*yk#99ACs-k`L zGxhC|IEt8vHOshDC2usyU#U8`D084_6fA|_J<7X(KxbWw%XJ!i1Wji(WG za?~^Vl48nvak^nLBu4g2mz3=hzN2 z;W4N67P5V`9r~E8OP?w>&hA+CU2>XH0W-X61Fb7&l!(K*29y4UC4xx2z?X+BqB;Z_ zD-X!RmE{4du-``#4I&)d>+BO-{2wOK?u;0Fn+cD5S($?{HLT-PEwcL7a`aTK(dUW? zd%e;((YG1Hlp3mxZ0f>kKskU=B~u2Yrlr1xM~tcj?6VZ5O+mK@Ln5sGgz1%B8miET z*O&2kK$PxMX;-OQu0-h(kuD)he=aKJl^oIBKVpt*B-%+n7rx*aWe+@}cVV3;x>|E( zs?+ksNf6iiIk*+$q`5b-Uv*LXqJE?F^LgMMMCs}=6(w+Sx+>33sngJY=nTl(fG7Dw z7pZqvr!%!lcDoqJ_T{-XnoNF~Vm1s*0<+ar!6kj8rlaqwqAkj!T69*o9_8!d9VS=e&SJK_ z;ijlvM`j3gKF7!$r-{861A5FtzvBB=uZooZ9gH2JSz;0&DXlo1a0hIwZq*UUT_t_+ zt0lo$2(aKI`V6-gXke-BLXIZ)f(CjsQhZ~kGeN!vkZ7q}^~v99oT`&wz`Xac)5$J$ ziM(khs#ZOYp(7o^ZWG#QW_W6qQ|gd9!&Sk&HFqgEQ(^Fym zyOpMYcGdVF!9^}~|H6vYl_ZN(4Y_$+*?->UAC%)70)crk+M%?gm)tiW-yr-X*oe#Y zY8`rCL0qQqMMd9ttXEv7H*uLhF4MY+5k_35kIVFNnSQU9(AZJ_L}mK-k`d^-7`yjioDn!|83Fx$$HERRH}abX z_d|?0F%WrHhoenDP7L6jtgARDE-6fkY+pHuJMXH0zx*W%CH16?t{<)iolr=M(KQ&9 zzemX@PXg?_q*_S5-RJs^Nj;SxBg;FSppdTJ%%Cni`l&CZ{-hRdp?cP4ZN%sfk+ek)F(*ooq5@adz zN9i8|-Pigp+0i{vKcC$K!oj)=KWZnCZ@aOAZFUJpK7jVZ(hcdTOyP(6<56vBpp`Jy zw^%_9!`0mH-9_=In(hbErIOIbKvJ-KTMoPUJ}xR@^yxXgeK|=q?MaJT4$n7oyCxI& zKslFcr4Kl&UHpl<4A+vM_DGX{Wse%wuhPwM0i}0}3O9G4PubtMVY2>P3i~Nm`0EJl z?%Tx=E;WUn$d1gFVf0S2%axi1eTA;OQ2U_|(POw#%ad*WmN4j~{STTQXrQCU>H3M` z!u^^H4|DCJzvjYRmKI$y+imZsg7E?O7rtUVtxWIt$^`{F6Nb}|;v{qzou{q`7?EAD zuiv4fdWg*q)$8ymIH6`ov!==JG$#@$l(>VAuzc>v;H|V4M4O5#0~8 zuAM?XD~ZHuuS4jeYqa2gz^m@-U2Z`YJq46f_Z8MqMxt*Ao`^em->0pgW)>$-q4@fxGso!|E3zKfF7U< z5_RfY1rd&_v6tWcu{V@ne8mE|;_1 zn&z6IJ#B){2iwZ~TDXh zq8JF9w8IG|J`6y`dj--R9|rL54g;VOq{S}}K=MmcxBqbf+CM5kU4p=WkjDW0f~qF1 zQ++xw<6{8gV*u!th>ro#W)oMrIUM0p9|I5{17Hg#J_aB@1|U8L;C=qk-~&$6$HxG~#{k5~01)Bnp?L8z0P!&Z zRCy@+^f{pxzKD+jAT=Hz13(FW-?=+9GQ`IK9FQ4%+tPS^3_yGgz#Oz{d<;N*3;+iv zR1T^Sdru90`yc7V#{k5~0PtJx_jXQSd3 zF4G?ni0Ie2Os^;8$7TAsOdpr&<1&3*rswBr@oD`wF4M=S_45muxJ>{5uuLBx1E9ZL z{u3Vz7#{;LksrXGp}%CL9;Uz2JDhF$abn=GCI;eT0ODf+;$r~xcfKp*V*vOO_6L7{ hQG5)5T1q`&Bt8ZpJp9K1tc*?`;HYEymj#Uv{x7E7V8#Fd literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 deleted file mode 100644 index fe936f3bfe2ff4e117c94e3b1b5b8ee9ac4c2710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1526 zcmZw5{Zo<$0Kjpa#x5jxX28Qv@hwpFIo{mvh%;uICiu*kP=pc+J8^j%xlQUBO!#>RDTzc%z$Nr#l_Z@iDIrF7jpJ~_Q#c%MN9}+7*CO%! zQ67-($gLpaf{xSKz3;0&X!+my@!@kgT*4skC_$WGcX9bc-q`uEFDgI&W>?J2{8^wo$y%|y zG14W8T5k9k*|x-D~TOlR0mF`LF03 zWTI2Si=EUfnq*sK_QRXcbwaj!(_|teFxz?Kv&^M9UDPa|w0NNO7F^0L7Hb^IY2WebHC{{_<2R%01fn(}}qaRj&DUiv@68vER zy3C_WKyIs?vuuM7n09ioz@U$$PiiljFTKvYAbQI&cB@2Yu}dm$e43lg1QY)%XgCKj z&6B4hp*>D@C>wQ@`=jdZr==~;Nq!TR(mS@t6QXy2Q!w^B+d0KM(2IR{$p3mIIxO-f zo*@b0y(e!4+UCmFmSfQy@a+c|{>V#P8n$5D`n>vW8VU!avJFjlse2=H;$-3UCPLeI zm6v*gLV3)$%VAUD*|qkC(dK|j;L_;?#UsTiyOoa!$A9TtCBhH4*ptuL$xNg7PtCgZ zS4dLxq!x2E!uJOk-FOPH#KcAA#IX88AX)kEy z(dNS)#iJ)eDeOa!oxe_a*w_B(%sjsQ%Kf^Zg>Qp@(l%1#c(pJ&D5znYgjHJ;U468d z$~14>A<#a6u5*H`w2aRt7vm0PB;M>}&E=)T51SQD3T@|pS~B)Jg|)v34eOepc-QYn z;%?=W=)LyMnr{VY}^lcmU2)V@^NMo+Cq&3s9BY z4$Yi?TK>^%N=Xy5-P~S%<%}pJTfn@VUImVT>YxRLLAMWd+FP^&M;gdk$p9h1g{Zw6 zs;wFb^L&MAAlDcoD@VQt152v~Gd2lTOV_9|l^ifwZHKXo*nAU}YHgJ`pz`|-pqGPL zEj_C}f(CRtFc_9{Y|ymQ)>I&n*0p&3K{C;*bQhC9L4oQOc#2I(pXD&+PdTltXL zWw2LBm_1=RepI_ofD4QZ0@99aPs&@zjG z2i!0f)b_Q7zedBRo)HzI@~p2qQf5;?fkMH3kd}TVD8VM0&7*W$iH?stF>loDSq`NZ zF{C`i2DvDB3K`Jo)M3G;vf250Rg9~i#}wMOd6ym4w}h={sz)`lU#ITf;Lp#y?hX1~ zg&Euw($I*ndY9%Vu#%S!KI+fV-iHKm|Ln-hg*$d>Jxr0)ZM82+>!Q|HalmXMm#+mt z8;ixS;_A65%(b;LQJ2vZo6T=64ToW32!!{QHj8O{5J+|dh+mq5C$v?k6YO{p;uU2_ z9}j`oNRVjpYz(Mqami+6XrRTx)Klf4D!@}(z^P$Eye}&DC<=S*L>(_ZozK0g?#y>4 z6XGbu36VLWG(#2Hn!)NU>o1$28+s)~!Yv}gKNxdP__01)?M4SRAc|V~3+V~^1m)Y< P^U6zv-8<1EKYsNuFEXhY diff --git a/client/resources/hardnested_tables/bitflip_0_16f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_16f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0ad58f0325a1779a96f7a55f8b4be4a857e0d23f GIT binary patch literal 17556 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 deleted file mode 100644 index 5180aae930ffb5b4c369a91db97c8d3049bd9a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 zcmV-l1fcsuT4*^jL0KkKS#yf?i~?c%?Lpby!~g&wL4W`Nfq(!400`g)-h5D1QdFTR zN(mqo0Ae)LMuh+vjWp4rKn5dCG-yx(h|^6P38^YgKr{?MQc^;mqYz}rzxqldk0P3= zQ&d%;7KJj9Mij!DO2JeHg)}LUriC#?ybO?XRunb}Sf;47ttwyWjUcpBM0AVnk5qb^ zuQXm!k-ku-gs1*W$diOg>_U|ER3x~R2)c?$YN}FN1gu0N)KzGrmmx(hR1rA}DR@Ff zI6;aPEU2*tAjC>d3TY~XN=rhTDy*oqAuxjyCL)D>1x8S03sp>_%8W5hBO*+sRWc-0 zD5JDB!U=&^ocT}#2Ha)Mp87WWhiP!C1hG4tb+<_460c{?4tNZ;+0+y zi}w#_OD0MM3xp`}no81E8B!_9CsLv;ja3mkQl)THi5!&{l`SY(Xctux$mnrOt}<4O1mzZ@ zHC$sx8n5|^3du5>%KtL<006HyDg@5%AOH*i00ayG07ifx_mEP8fj}vf6ClXKnK3d9 zj46{7AjrWrDv9YbW}wh1B}6oU(@(V$M~J}~Sq4U_3o9#3q>BtRFw&;9OIE8fT$+`P zab4bCc&-}vMDOXX61M7@fW&{v&iMUw`^+7{Net*vV&7)?zXm}r+&hKb0)$&A)n)k#V; z1YhcbfJ;>a6;-MdbE*avDqN@)UGcl}c)-6*))`cH=DlBAiV%04ZSt|yqsci_=kjpKqmB`|% lwSf*)oeqGGy79yom<425y7&K5n07;1=F6h$*DSojaP5~31gND0LhqXv$@bKjeJEt!FdAT)U1;(grv?z#7T zpL^cDFYFuX8QpWd=NY0;qDQAmWK4uZ>Sqb)9xhS7LRB7HMI50{zRZTyD?LQ{JcZrF zjy7|R9>;YzQ$}PWTcNwg9-$>;5pjivnSvASf+K)fWeNw2uM*zhgj^AxIVzd<9Jblya2EpJcQSo^4d_Fx}}#; z{-Q6L)K1SPead6#6hqD}XO{!a;yA7e%uYGa)Kdomw9j)bd;_rYe%GiDEUgzg;79*k z^TAI%$Qbv4fMN;3JQb%nD)ggbEdb{*z%HilmvCLoF1rrpyU@vMAT@-t5nTJ(b%-42 zS_U;a3?uwBriyI9+n`nO4T!wNqj^x#{0T+pm`aMo?{#D@GL`Xsf$2W^D{fZ;J@WF7 zXU9z3Mp=P2E{pcy2TDugk=Al~pDFS;*Ekh8P*KrimZN3Q6(I@~e2x)Lac$@QxF2A* zOR*5SjHlBv!!R!8|4iE2gOHGG2hgY+a#ZfnvCAo@RdHQIr;XzlapBGoCE0koXRB*brPB7R2_@!N8(1z&J&SjGNfc2B?N zUu{q9N81&9$g%HV0`Q|Z=FNAI8CZtgTMg1paI~=l>>WuMb^}J)?Ao1b*D8>pzLpXM z?_P`!L5ASLZ`83b5E)X%`8Czs%j`N+hY=O}_=5l@vJ$(iW=^Bw?9|qZx~nHu@jqs| z_X(yUH2}jfVe4aGQ-8^I!PMkWFjYIW;^bVjpl%!9(1#!}X4iGN3bU8#J*a!|k$TAQ zn>a{WG|#)pVBHPS5ZXO8&rBS;NoK-gH;dgYcC*+mnH*Z|7F+-198Xy+b^|$VPU`)C zv+$xl_wPl@VmFK3B8%Oi3kzg!5hoEX?`C;7$fV`n)JY+MY%a+1y&EsyIJ1N@@|%Qv%K4>CSO7fv3$+@6`FJa#xS4 zt#?b7zSw#CYtWo9XTUf7bsrcAI_HOCjNy+5Y3o Fe*nbXXyE_= literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 deleted file mode 100644 index 00e4f95b49ce7a6f56dd375a4aed4e5dab77ec55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1314 zcmYk*?N1YT0KoCq(u1}q(5K_4LqICb(yqN*Skj46R0{I2F({OCQSALH2{C(dBLq={ zmZQZ!MI$Qf3^EV}LBe`_)nvG}*B&xsvZ5{_i^+N>b1WiJ)I~+-e7W!6@cHikvi(zH z*S=!gzCl~`uy`c>P20P*mol$QoLn+c%P>PDyZ)}$oyOM_xS7T$v#lz6qxbaYF z@~d;7e6Zy$FMb|tsyV?~D+`AQp6b-|FtyYo+lJqKg8!7{lOW8W>PT3?3T2@!L_Z#m zKPh-)J;|(;A-V)hj}zT!SI+GDRgK}^R`5er@n6ruszb$LEXLX@8(|&3|k-T z6l`a%$wN8aLd@e&?S#i~c6{&U2xmAP0^1dNtIv#F_p3n& zhdkv7Vp2ygq2l{>AjDR?aXbbooc9N-{k*T&M}u&)KXe^Y1Ik7Cogj{q;RNps+6`Dn z9I#gRWUL8Jv6_=#o0nz&=>|t=(k=CK3ErvHX~s*g_M>&6t}!BQNPd22)G?<6u|Di0 z$oBee@;HbE04hBp*7oX?9yqz_*0ME_fsf@#Jw~0D4ut?Y-C&_Sjx&@AOmxJR9{;pH zI)@8zCKKI{sKu{TOLLf*f_>4;RT6Dkj_aG=stilR;x_$$%vdFHcgyFD1Y}!~Gy#?c zWbV#d)tkM7Nfq<%VMwbzO#oY04XgR$_~jf(G~W*gNg@a#wNo%B*@KfNzFW(HX2RUN zD_>j^u~upf8MD=pv?+bv0}jHV!pT9@`dZ`QZiv=`2ah^lp-1%fXRD@Le4FIQD!B76 zvISUQIB~D!l6<0rK=q3Wa*k;B+&4+Rj>x8Yq2ZB|S;jPc0Fjkp;%K7v>;gT9f^A^P z*kw>)nLd9f9?!pa!Z~_$IBmsfR+{*~i^~+^fCdo8I+KsU;e?!<$Y80~ff+yb2pmh# zYG2A*ICcBv-FJDLkLK;R)b=sqX-W11O`O)=%8|x66QDSHN}z|*XK%FCceg~INXEw8 zOMvaqB@X0defxN;?zT9!#ZqL?h9!7|DFVWT?o~x$c!)en2i!${ka| zy^4o>buYbDY0b4GE!HG!ByB1#LE$r6IzoUrlVabW$Z?Cm1=N^9t@X1(Du@|L)(QB2 z)X7}Z7R439QvJDl;gv7Z5sT vOd6x8TE@yynkY9|C|I;HQV(a;E|UT^$VsC_A`0((`Qw0|bGv^SmVEIaA{P?U diff --git a/client/resources/hardnested_tables/bitflip_0_174_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_174_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..5db556ff5a41114a734b7bba898615aae7e85a6c GIT binary patch literal 21179 zcmeHPeT)@X6+iR7cG#Ua2Npt~ZvqfXB~T<-Wg3NISdgq(*MjY9Sy0Qe*+haB z3*0sJyj=Tc@7;i2MQK93^pB>vK4m zW0laWG2&Z(5BZoqpeLDp&FLJa`jS3*pm`IMcfciwLl6p_R;Fa{{Ncd@-Oe=W0FEXx zXn@Jp7nm{+uu8WvP1`C5^lst&C8nHyJ(5_1m;8;a@+}yvu$_$UBBn;I_sTG>M_DC1 zn9^F`k4x@kYQaJC=>=Kr+#QYE$yAWT?=Us%FGUD3Eq;JU!B9X;WE8VYQ!%btM1V|S zHiw^wn3ih&XOR@2i-yo?LmXTKY5DA7M>GU(vI#Cw7QB4M4^zCH(xBV{N=^LpbkYw1 zed0T;xDF$P4WK)D0dNJWjMlx3Yp{15$aO>{L3J0VZU9fe21xgsaX9D#xqDb;5=`}L z1-&zopg08>^IB(o)r6gAae?7;1OsJ|hY``B5>(J_251#T5ilNCV`xIYa=OPzi{TK% zfd4C|IT#Zd8u8ab0QtuVZFA&55hq_Q3m_~7^Jg)&>aQ?$6^*^r`P2oYx{1|R5QK?A zw>JP5=MdD1$s<0eMh4>PZZI}dMbXTZW6tikqAOb^wIdE8QE2qjj(D=emc zl@Sr2iFhoX(>lepMC*A_OS|vD>=w_vbh64=4O5|Gn*fEdRfPr2Wh2n^^f9KQjDOp} z^7l(8gEmz)xl8uXaX9dr4}09nQ>43 zim|R{I1SDohZplNh)3INJ30gVKGbV$RCNMJ5j^nGa1@o!< zShYXSp{tiNb#DQy+gTN1)X6i(qjzGC3#@AI0J#u`F

    _Wx!UziZe^X(X9~%FUF$p zij?+G@$${F%nKp2J9>fxFP$nNl%{U=hw4B&!$Ee5uK;f93uRqHSWiP=F|azeWv$;d zV(&CwM-IHs{Tl}jkhBr@S^yMDrVfJ_OuXb-hzpe2grKkko(c=gtPva`f`qQK1M6O;@~yCX5qUfC(kP!9nT zIJr+5CQCLAK;x)(e?{DXVF>)JumWE67eULIZ;ZWu&8QRFo&#|LLp%OD1>b+UVgQ1@ zXzOcLScB5_fEm%u4`(yYT;|gr4)4v*)YN}SV1J7o4 zRx&ib0haP)f!_eQb)#tJ3vlQcl?yY z$rAr>hg*A3vsy3lzn9ff2_vl-y*W~{Yf|))7o>_wi`737hj%F!4R1P#k`W3;KHaOcac%f|8Q@s6kCKh^8EL@5S5qBmM{$B3F6i7={%j&u{z;-QbX9ow|jQuE6 zS5=A$6ik`lfyX<`CWP?ke+)RnDO{L7vc1-CA!ThFC;i|QJQZ=G+gGroJdiadLOo8T zk+NX_pIQLwT`*Fiqcws~-zh0e0taP@A+D!Evv9>r>qbC1$6WId*jT6N0FgpeU_Qu- z$dJRvL!%=IF>-eNlF^hg*=4wkXrg3lU7cs5fCJF?Y&I$a5EHK)%hA?BJd?`t*$=C7 zY(|)0H{Vu|wt9qPz*WV)Z1wmdRF7GNIh2In3TzRY-!t4bQ4LBu@2?1WtFO6$=c@(| z_oBjje|O91cbws1>K0aybd~c@6wJqb`yBoj3BWnX)Ih8nb};=Ox0lWrkvO1-=JH_N z;QkUdz>SYerHPWZa@%uRp&8w+{DSFqxf<2q!>C^OAz6KXJJXwIT(#Oesd<6UB4tqO zle`@T$Pi6Ic`%z*8@Oqo3;Iu?z<8hcDX$o=->5-%C;T7NaP?iF^pV0^Kw9@+kbYK> zI)X~907xOsDpXER+c=OedUr@it1_~Y2QjD}r<2)~ABeNRC+#Ey2>hUt`~|k(K4QjkEaa|M+pXZAjXNq+KB?@7hV&00IjT009c9 z1E}B!UjP6A000004qyP8FaVfL69`}kzy~k@Oqc*nCJBTv1YiT0047WTCKCk07y>W> z%m5Q6022vQ5-(z4O4uhu%*yc?K^raP=2L;p-Qyu)d=DMmh`b7qDM=_R5~v z_lW$$`H4@6yyap$67!ZPkYVnN7eS5|1_#IwthPmpuZC8C!l+U=N^G!f&9hi3NEAfn8qr@7A6>AF?tJ!1nw6O9#f&v#|NAo z9SPnT;fZxHoETn%&v?8Cc^!!1cbDXT2l*X?xa>|7g7zOFk9@yTbT3f9GvFRG;}38@ zGJiqkFWNpL=zrnlJ%aNWto#pzJY_ux^Lrh!yOBQ7eeYdPKQJO2n+>@eFb0i!Z9#dSSBMC zT?sqLQxxi0CDeZt7+6wpxGn;oQo4*-m@!xr5U1!;n3dR3`UPAHF7RFjgpQ$r!Aa0n zMga8)?jhh5S2mvFISn4BzCiGvk_j4@6M#A3yZ368-Sk>E}TaF<}6Mc5`RBfMRJ zcoK9f;9Z9X7NC!yj^Z*_Of0+OP diff --git a/client/resources/hardnested_tables/bitflip_0_17c_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_17c_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08843ca7b911d540e5b51814ffcb8c07d8dc816b GIT binary patch literal 15502 zcmeHOeQZ=k5T8fyu19-)Qv^#XwAav5ji59LNQ96R#Tcn=#SaWtXh=mg7Ksrt!N^t( zBEd?Cfkuti7{ebb65@{NI@_hv@n`3X)n@k&#$YQs_AwP6ff@%5^ZSj7_1Ic=^bQ>7L|GkE$#j@-HOvrVHR?(b z;WO-z+el2Mle7kMihDv@yIt-9bVg=-)4^dSR)albP&B&SkfL)aR$d5|LdJkiDV0PX zXQ~h>bO~!#?AF3S`AbA#=oqGnJee_zu?y&`cNiwUn)+VNX)*c?@h~vaGQG((p*>?R zGxj3WL^meD@(I%x4_(Wx|5zX%xfnrld z7OR(@J5bC0LY38tk%%2Zo1%{v=M&D*_YqoPVl)_ z!~-J#A+5_9ruzJ>UT0c@cr}5PpQ6v+`DEAb0%TsKUHo8F?pVeRgwcs#T+XQ>Q3Ssl1KP|WMEvyd$=Tq>1DZO?U z5kMD+=S6?E2%npse-s{^H6i%$jAnTV{DGN2zRI*ZGkAmc`q#Xq06)0y<+N*JJ9VP? zlc{)&2i~7SgrCv8Q;Q*;RT4deY|sjj4ObhAGq5uF3T)z!`9;EDNN3PF^F)J&S=b^&Y|ivCcwExfGiTu!w53(@t|- zBVX?IJkxyiRkONXL&pYIJF&x?-todID(^Ebz<3AvwB&U_nTu|S8b zAG_1Qw%ersT$%LqBKRxTo@K`FhLa->y(BGi8m?&i+gyUh5uRGMmby^!`SUpNKf@UfZGW==Tu zU}nzAOotJgzv4)kKAYx`wkrz5NC+|DRl>QT@rG4bHJ-14`<~Tk7l821IRxE_e(^C4 z6z6zvU|L(p>RBM#Tpv=KzGBrdlhu5kzJY<^)Ts#NRlX~Qu?9;~Eo=nf<$+ig4nQmo zrVd)Bv8+0fG5a}ve&-&?;qNR+)8$C+p=bxIcX7xe@WpXuJ5Da!ao+jJ_@=H(dysKI zmTS;x2i5qCT@-t{2w9;5=cSTLsAEfFTN2|KZA)TvV6`Q2KGgR6Y)Op7VGbR(B))*Z zO4^dxmc-?@B(^^$`-#Z@m>e*Lh%Je2Nu1>n1AMS0u`P-1Ux|Z3V@qQDSK^>Q^x3v0 zu`P)&!ize#B(^27Es4dJ#DT(W7!niET-oiMfHd2DK!9uh|Gd KxK{5j?EM!y;%_1V literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 deleted file mode 100644 index 5da967674a75bdd3793978b52649b9ed0f65156c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6184 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 V@L}uU-)uNix3y_-^yS5|{|9%^aN7U? diff --git a/client/resources/hardnested_tables/bitflip_0_184_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_184_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8369142ee47ddd3ab9f04af1878512dd16039e2c GIT binary patch literal 32658 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 deleted file mode 100644 index 88f05ef653b311820c96a49684ec4709828078dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 zcmZWpU2NOt6_sUKktt${tRH^`1ZS=#+L8!|956rwQaiR|CANsTkt~@RjF|lNuy%Wq zyBEP(I{iepNeK;NLmdYgiJjHTWDyJ5Ck;y%k|v$zVQ8|a4k$3mZGp7N1|bN7EKA*K zuiL%A#R2Za#X0xjO#bwppO6!mu=u6F{Ok?PJbfwC`qs|#g{;kF%9_lbdB$REI{t3@ zzuGpv^Tv-5lQp;b!~ccmjhOG}@7BKgmijFjuzmk|@cZb~sL8mtXYd32j+q=c&A`9` zp6v8VY|to@^xV@2?Uk|Xzx!MJc)suqE>4e6ZojT1mTmVLiKtpf1Y#AXqjrR4bb$t9 zf~jzj!~s#{cq$Qlp12V7DXV=2v)0wzCN>sF(7?hD@(Gf7X{u!`^YzzCn_n{3UIp@+ zOvNp7#KAz#7&hN{VfoPA?_MZUGgQ)J#V{X9Qedy?$_$=5TVohTm(jQPEiE3WT&k)c z;1n2}a*zM=)mu)5va043c(a@3o^ZT3EAH7(3I+uH4cMm_IYl@Ny zki_oVr&}00aT=#C+tuQc%b5FOsc~3ohh8CbkNxQz3~IUcUc@INY=T*Me75J=*|s>V zOY)StjLr*SPmJ3%jipckDkYa<&@`y}IYN;3!Cw7@E(4WO*M*P7AW4x>XOoB|(YObP z!%B4oic=P)icf-ZtMk~g?v9X+x{GDO*tzD--WDy=G8=NQ%XHx}_xk2%kKSMV_zLo? zZu6fHg6Zt9%`v(EA>}*m$kJi}4m`}Wyu=tEgj|GF`sbLf)f#v>mp!#z{1+ZvaoySe zNEbu)6P=HqVW|jCUd;KgIKYOOpn~UBj$ZhRWsPS04~~)@G1Q!*6C{w&q5jf|{r*p% zFWf$CEH1`NTKnE9yQ6ivw+P=lb~`NH8%3Ai(+{C85m%0HYV9Te+Q;DakmOeC^ zE8q$?)W)Y@qBBntb3Kzr_-?8nB<)szF8$yO=}R=lHJ676z`f(P482Sy$G%qIM^6)X z3y;J1dY{F?<|C`KIIn%!mA{++WKCWHw7FjzdpLZ^ z%oZbEMX19mD>mdRM{J(O6-HJy7Y(BZ=!rO~gz%wlxTL=mhoVoi1i( z(RZj38Z8$*R^09(AZXM}=rLy>Ev(`oyp;@UoxAe#=upAg*{bExYFJ`{I1Sf&R>>hQ zsI_QxhD&SWvYvimNeg-t9x6>eZIn>5oGQ5YOQ02B1sY3Uz(Jf_98?)XH9C5DojehS zhs2i!;7y?^VDK?vehZH{O3vQ%t=YzWiC6g=%Op`hHAwH3`ur@Em_;hHxLDzOgBAvZ~)sZN}VSV)=IHW8Vagp~~HLnCfG=ymD1?NV$)3lGHxNGWTnSm{zWP-($d z2-YrX3LPpfrIw0_g8U;f{(va{BM>EEHY%tQfkcHS{;C?FF^; zrJyK~xk>lEJ8$lpGv~+moSC^ZP0zikxas;IePpx94M)3fO`T!x?L8{6Pk^3z~xuq;hktB-!qNbDMYLEH*SYDs>d8Ippj zM2n21cExv|V#>10NbaC7w$bB!cSnt6Z!$Ks4g#Oh0(VH6I}V99BSrVMq#v#|pHoiT zlvCRt^VC6j>E!c6RK0@Tw>KYN` z?~HB9n97XlB_8jgnKaB9Bdx2=5kW4+GvZ2Qa zyr(J2_ENGd#yEx~@0Dd!!(Lw3)9f2iS`U>yad(qh61Bj^M=72cS0LDtr-zG-jnQiU zJS94b2y(}b6!s!!7+JC@whcy3ZP&X0tSabE=pl~7#?FTw3{F&c$|N>wjh*&}k+#FM z@V7)Ykv{iIqQ~Q&JvAv+*NZ%cs>?iDKqK_gdLoFe=$@>qq18zHqS(@tS$7!eaapPq z5DX7iR4xA6$geb4H5KRcXbn#ynwAx%!J#N`(6-v;nd*PDX>bi%okK4%(9}Ne@srHA zcoyf$JeL@la|ZDaBcYe*^b4NZ>wJ^im%EHDq-pclMw)Q228X?*+~-U#lj(E-0Nz@e zc^U+^*K9!AS0J$KXk>QDNp1xUc6w>LbInlaCfeBtQ;B1HTWN7_Kb3wzA~1IhO>~(` z3ggIZ$Hw|-^MKO88PYewdLElP+Z({kvt@b3*h*X6Es8VCv1TvJTZ~ovlugQ)ZE5E# zicM_d{C=GODL6zFt%xQK$7^UrF$!%b7zHrMc0_j^F%9D}vDp%x0rz{oqu7~?%+ZEV z8+$drp4;oK-$supldr$B3D!S2r8mROYFtsrg-4b00G@pjtbWnA{~vm-Nu&F=goF}ZH%zb9ibaMl5)G@ zk3P+K*xT+*mQ$@rTPU4Dz5mF@(QKOqBOSGvSK=b^% zB;-bX85OVaspmJThI~Ct0`-TWj`eFc>I3v|s%S|@(M0QtI$wlyh|8z={JL7aJJi`b zAT&LY->(U2CP|CWigyxZl8C&D`tu0ujiuf`$-v!ovb@zAkb5Z2DlQSLWhpsOJm3SU zq_)sBjx|2_b2z2Vyl$lN8F(E=g3evz*-+CsVC;oT@+o7_rQRh(f_0yVi?@^K^&>tp z@8&!YOeghy1IyO&fQt66rirc-Vz+x+kZ z6hD0hcesh7xpSxZEb6e4^J}*Scln5pZjBLZj&XyH&ZF>OithOAP6A|hyOC?L?)F7| z-b(ZX5y+OLAJU4jjpQV?U|LO)AW?$>w-2M;3)qvWXBQJRiG`y{@d<+FWwoHGW391a zElXZaBB}|LP2CcIBO+OE_G6{506iJv1b$eHpfS9Ui3CPF`}_oqn*}Ar_U4hmhsmBjvO?!__sa?NRJt>aJuuP*f@I2lhA6qR)GNiOBx=7V;axVxQ+izZ$X;~D_G*($3ciJUI-RJt%kP_N5g(z zMSYMwWgGFBe?GgE;vZ1Wagv8^6)f*2 z5ajnMKs1}mJ&Wn%9_(j5jn|EPk4%oHYBY6Y6-_3);jF{Mod)aIkibSS0Zq@4z^vgB zt9mg3!YiskxZlWMml^w)Dl*@W%~U4?CK;Vn7N0|RX2(O%0*hgUf-1uZC5%u&dW&cRRqhRk*;-CeG;2*2%2#upFh zywD`qsfbBMq#fVs0FibgO%X+`Pb#N%g6NN^1hWb*TDj+6{|4e)h<@cW`m1)LXeS4XR)1QT<9#{Yhi5Vk{zC(ZFOQe7hMp zDz0P7CCg|1D$d_8em9TonQzgd_Emg^t^|Kn*?@_fv#cUCM?{jHJo4$ zDlFWDg_{H{-pb!qNh)((GsUoQ6Bcg5!VUBO`hreaxCsk4Vc{k$+|<8f78Y)jDW33Z zS$MT9yjm7sE$jI2zgoteYgo9M;yr+{a1$18!otmjIgYS!!wX99<6Svn;pW}E^(HLb zgdI0w#|-pcOP(uSWs_;19E35Wmy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 deleted file mode 100644 index 7303065d9be963180254f5752241a133eafbb26c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5983 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 diff --git a/client/resources/hardnested_tables/bitflip_0_191_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_191_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..3563685d659b82b46e10231414b94c887a2ea166 GIT binary patch literal 37196 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 z zzkv;#0UYt){*f6QmFXIbnC|{bxTz23CCS?@@Sq8& z@aKFQ=`W<^Yp^*PvQiHUjQT4YEk2(qft!iPyr=6Raj_uUiyQc%x!#YugNQyHVx#bFbM5{DOyuC@#H%N- z{JqAc98Z4M)4gWfzS;ddO!x-=WGT~WXBXqy0HNEc;t;$v=bPqyF-B?5*SxSD{iHeH zH0PV4r8(bek&#PtzGZ3<%UfRGZ$`S=Z5~MSmd7W9;Zny7h@Xjx z&uaW^apZ6-&BX7dW}<9g zDt&VJM14(?H+e~WI><6yKjpR zr_Ku9sU5(S@trY6g)f{GkQbi3{+Dx8Qb;H4#QjVe_e=5`ukZ934erT7UFqzdg92*F z$O_M~W4bpXVshrb4mQKwDl3YTx~qRp{u%U0#v1@0y3a)8fj^cTSq(0T2ecpmFpC6o=QgT*2X<5w{Sa;AW8Cnj_$ZD2&G?IYOO74ozg%UtNU;{iDUG)GA z2T(f(TcPreUdsx8gLJ>IUHc8Il}8)@-&ZT6X)B!DkX9?F)yk%PC|r9~qo(p_TCL26F|AfEi^C~D z^R}-}tCdelpP{r`xkQ^Uus3@$tyZQSeOmQnTCIF?@nc%8T+)~d|5Tk;E2q`UX|;0M z+uG@IH@WaVcJ%Q`aw?HlD-*Y-)yicNIn`%5ZrzerE2q`UZ|mnN(rRUXUnBj63j3v! z^cN~l`|n?AwQ^dmoK`Ep{lX^dY|>w-NPnRs{e=n(*4fXc)yh-5mh`{<>=y#kUwG@F wGBEvxw=?{Ow<$F``6;bdPOFtqmI~fbW}a3npJ}!7Q^TH?!ga?FZ#nn>01v%k?f?J) literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 deleted file mode 100644 index fa5060af8db68f386cced888df79c883b860b2bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2462 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 KI8czbwa_fkiDD%H diff --git a/client/resources/hardnested_tables/bitflip_0_197_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_197_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..de5d1d9cb8d03b2e31bc114022773c09f393a71d GIT binary patch literal 16061 zcmeHOeQZ@{8Gp|0ZMo3PdCEsvp|o5&aL`ijWj4mi*9~EAq?ESs$Hq3+!cd1Rv@xi0 zSaPN_*#aFb`iF@tyEri@Fd9P)b3(7qugzkLF}ej}uA9b0sq2))YBV+0d+X?un#lE8~R$y6#ecth_N zovxJ~7;=eex=62qSdF!`ahAw(Z76#Lze%##DQi$@gLrj9%~%WIDn(AQQ!>ZY04&B- zA!!3mRv2^+x-T+~X_9=IDJJreyNf{=5y50M?&C%UgIYnk3T#?1)m=*t>NZU2R;(;p zY!6NF+wx}q&8DdyQl|NkVw2P*L8f_mBi-r+CR^6&*0_2s7ImD)PGuESW8uv26|5oh zHam}YF*y=trwiLD#qbnUxtX<}ojcGrL7rj98Q>G0g|MW~rYD$YA7fgX>jBB?Q)m^j6BZ*I!rVg&KJ|IPGD6VoE)gQV9e@_D8Qu*_0D`9`eO zVY(9T;f*l;v5F}y>k8(`7noWHu=KF*xUggZudt=)+kK#TW`o-`g)?Ph+sjEZ)nMDS&Y|)2ar{r}NUuBg{;zw=>>SgM60`$)Se}TB&}5M- zE?lrhRJke)5dzc~vmCF&pj`9yEYWsjbjK}wIAdeo3ZNR2A9K>0!!bzhDS(Vk+r=ZL zSUvope}WEXr?<$qrY}(efC_O553)2#h0_IEfiF8>qzary8L($I-Ry z+&+gZB1i0w$sV5F>`abxW@?||sy?8ZER|(IejgS%hPhAq=!krUsSV)kL33KS$)+X_ zM?sWzZD#+OmE=Kofwb;hzEf~3rK-8k2KrP zBqhD{C_&3EDH2vQCoCWu-o}ZNIMnG9rV>5rVIy?VJ(HzI$wKnH>It#9f|hc!q*tXm z%4w^GU6rUv(q>Mh7g#OALcLpmHl1fGUr0_sk94F>xVgY;q6n zEuUs7?B`jae#+ZvtDP#vpk^g4_)eJ&IvKAnA z(jzv3W4g2M7U%6q zPC!!5+Oz=7{4E^@9+{~}tosN7*VovY3JHeZ#BM^EUnxHTX-8v=U&m1bvbfAM;8?VByukn->kzdppu;kIeh~}#|kwNrCK?PrMBys zNso>f!=h{5=*Ek{DRam5L!Hm`^DZa}cjs;P$jeNF@+x-QW5bnkH87lo!6x1OA5?aS zva8kDsWAMDzhia_CzSn_b~Sn?yP?J7Ot)l31P064$6{!H22@7-WtTTDVD@peoaUW> zE;jlmwrynk+^rmY++PCvya&o4B+Z`-qZlV^!+k(Op69uIJokj|YC%dXX+3X^OMcRL!w`)$JdlseGL2V`5a7DmFN+ zc_rd0Za78>8FHPsx!1zqpA1dZY5Wpc@QWoP;GJJQXLPoS#o)#a+YZchCq%2lp9Q8W z*=79NH{GojvCs*2<<*~r$}8i-DSyWMt~VoQfYjy8avIUE-f8R_1^R$zk}1z5Lt?5t zna!DG`q8MlcVE*=PlP^+&4O)c9Z>Zhhu%p_6xAevqai1(tHC&M8I~fDa5Ruud)6?~ zYbvQRPkT*gdL90*3E%Us2}IyYMS<)l54n}@3H)??vAfP%1$5pee%Hve*X|E-_Yc7e z;a(3Lk=Jbk1EL!xi69<$+sm2mM7&fyjMqI6?$KXk$$}t02;zevJ_zE2Al|6Z>-Y(R z`0F5A(J32mQV<_|j~;^^p2b6F7P38J4OMjnzid5hR zYfc4jGcK;|Mnn{!ZPReZEAx2&l5(aE?v<}bIP3Jv^eJ`cydbCeH7Npu*-sj;4>2f0 z`ChG;;C75c$bY2dn`mvxyDvSkjp-TZLx~vnd%M-!;gtMFFBcE>vQy=^yA|9?9L+WT z3&BEHHo(_b`1$ER?i~O99o+v5IdF23>2f>MCA|~P5;}x;lk?4zy7Oy!<8xI6i*J7w zHv?k`-Q!-YPC&<1sr4?Vq4iAiYzYz@3wdu2&IeNai%Cwu>r&v4er8%+WWZJBporT6 z+>avo(THLTs>9kw_=gao>tt zXmgJ(!58qs7x2Dk_5oLdL!bB$G_C6q literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 deleted file mode 100644 index c4f58b53d09f574c5b5a08dd430562f2f7e8d66b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2498 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 a#ubJb!jlY2V-|7$@pmLsg$WB(dYo_pNlzyL diff --git a/client/resources/hardnested_tables/bitflip_0_19d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_19d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..2ea815311f8c75f8bda4b4389d2cc11ff05834cc GIT binary patch literal 17854 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 deleted file mode 100644 index b4a434889f68703025f7cccb7cef90f2e89856ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 deleted file mode 100644 index ca79aa9b070e16f0df927e6d7d8da60d705d57fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2795 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..bdee2aa730bb16d80b0d72301f06dc6161a2136d GIT binary patch literal 18459 zcmeHPeT-aH6+dsj7WZaZu~`~zfDl>{vS2J` z#87%gg`{kYAq9y6vWX4&2Wq3(SlsF~pozLELY7(*2#rxv48;;kMcm~0JNM0-c{APO zx~YiazCZTe``*3ho^$RwzjNMsZ#FgW>ikV#-kL7P!8yaOun4w4n8B=a|prW_@-WVGaXz1^ zTVyv=9=x4klN@A9ix|w>!=@8l(qi1faU6@_^x1HzJi$~%_b3KFiKW|_TE55>i0oln zwvK5zR%lgD*Fu~j&Vp+yE>zKQew8V89TpnJ{l`HNeILY5gfvBFf;0KFl?9h&$Lz8G za|>g6N)@C?i2?<5h&^g8kn#G!z)+}=q+H5DM_*wqOT9j{M~N@+QCbB0%lyCt3meef z0|h3T+LmC6$E?m)a3!^pO$GzKVZTDqdM^|Kd7+4}f&4!)72GE8@;A0{$;)B2HMl%q z?W4_07KHpOK?!QjZB~ji8l_ABMWq8f?c1#u% ztUMaZQNOdAO+U6z{mdJJIUZp8%=%D-bHEH#A2M?Rn=LR;Zy(0(vHYk3$Brdz`qnV@ zDz{ZP(7WWD7N$+unVc?ugPpO;YHB3nWdW0kQ95I@1e5J%8rTOuGB}UJHle?P+JxJ& zl0c6wIi{P(eOicBpNJM^ED9rn=O42Rzuc@*CDZPkdzfB$j_Gm{;L%Z80WA!o@eb3K zBKHECKtaBwM)OB|DO$Z3++grm(0_nw<2v<;+b3Hinjk%FmTqENAv^sO+u3x(NzoCh zDW*138*`afZ(%wtvX`mK)Yx&6AkI}rk4Z9k7qZ*0DVEm*|#J$a--+tHwI zpP+aciyzr}bmv($(@UTR+_`Ox&Gow`bGVk$-MJ!ySwMX;zXLin`ke?i%bUxl7w#Lo zwZX3Ci0XT+gSp`oS2qEtQ1mTRVvrq_bexKAJx+#YcUL>`!faWnx zOccslIF<1(0gwav1Ilq80Yn1<^*~=KSk`7N_*EExHDIM*4Fi@)EAZ?Uu=Fmpf{VaP z>qS;8JJ?*c07SszK4?UN@U#&1#+^XPESNt_A&Ti0K(@ae>~w%F@IAeF1e~ZtJ%r32 z$A&1Lj((t_Mbyx1e*gSNYT9dKvjd>htl}jCUOM2*jmRAg-I*TJ=R73#&m5w+o1em zwc%E#%f71~Vy=Lis!4|?MPb(3&*s6Euxltkaf<2Tn_y_WZLklJj#2VkVZM~T7uVWD zyUz-i%G|H{k8d(o9(W6K=o!jSEJf)B1B_G;*lFhI(i9P%ibuLM#TwT~GfgQm z%^nQH>V1HucK|8yUQIfuf*9o%JT`@KzX}@XATKQ9d9IAO>l=gv?;Fvh*Z&qko{l_y zasV-{eSBfw`Y zMgJ!-SHhF$z@HsYs!!f$Gv}XB(%p3yI89ImtARI9bm& zng_nb^!2wO%JY+8xkxvgAKNgiL+sRpY@UuKoOpnyXLi}xhQF0VOrsi4D?`2^Y*Pu^>API zM4GT?_sYzw;iLJ=tYN3n3G536SM0%C5cg%zfBx~QEB3fzkNdI*IO>W$?gM0M4zBgS z`vAGFi>b6+v8Vd$1y}5;nTsp-s485s#}#|<>00#7zkd4Te#Yf~##KYfc*DIi`*^=H zi`#;>U9rb%#QltGdcQPw#U5Aeam5}$h%5HEVvj5KoV8z@yJC+k_SnQM_Qw@_R2e@D O|KkSXSbFftFa8BzZg!&p literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 deleted file mode 100644 index 860f486bffcd827f7f6660d602e9c3d710fdc917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13188 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 deleted file mode 100644 index 8afe0ffb979e9e9982588f6c9ee65ca488b04014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3233 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 IxY^_X0Y=IQE&u=k diff --git a/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..04723ba94005c8208a49e6f0d167c0752a597eca GIT binary patch literal 46378 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 z z)3%&B?YGAC4Ew0S}N2f1*Si^1MT+k%_(uw zs-(cQ6bnfTOeY1VlLFI8foYD862D3cOjCPVmx+bd@Ucz3a!AK4mc?^<2BWY-F z@vgw6!1UNx3MK`ny@OybW&hCDKPz8enV?gVEO}p(O^kmR~NI6qrs5 zOeY1VRnviQM&!+jT9Uv{A)awEuT{bG;^m083i+6qBXUTJx1YV|WaXq<2d69TJD(|4 zu$9;9O_wv)=tGWI3j2mO&hXv9D7=o68yxeKV;S-yZ8^VJe;*^o z*?auzczZsqs!rvb^I&G0#CX2NOFnwy<9bQ5a+0j99@)e3?j%|HgMIr}lB~Q#9peWM zhndryhfR`|({jvMk{*%*)99b1z_i0&fBbI4q`-7iVA{UNFiBR6sqFK;~^M|mHraQ&yL8RtJJ#cn7kc?dNX8`b+= zG7hvn`Js3t;=oh0L&qCNZgdZ%g51BauS84=OkW>wyL(G{jU*x|5ya%3h)IEIUcH=z ztZQqDb!4azg3oVD3QQ*jrrA|V3QU)i0@Jvz)Py}6dpYLJ&F7N>(@BA8c5J)n8I=^6 zj&}J;f$5~cH19Y_3QQB_pw#g@f3ZPQVA>|AMCTg27yiQkCk3Y04%^)e#i#P`T@(Kw D2#=x8 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 deleted file mode 100644 index 8d541ff7d5bf9730a5de808f688ea99c23acf52b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1984 zcmXZQe@t450l;y*D*k%$$58vo7}j41_(FM)<^ox(_1gLidbS|?SWJb-!`|i6OlYz( z+p|^#3cSO~Z!WC%M{3t z|L=cMOwWFaD-iDKJRR`Gk*^zyrzbuEK>X8LFDN1?$K{cR(?=3vT>j;O55xxDX;R(| z(g!wi7lR^Uu>N}CM6cvR_wM@ z@Lrnm+Y76&nm(@vYj4c4YR`C2y$a*8Y2vIN?S9>01F;iPL(g*E-%mPUIoE{Wbn6JI znX7=uN8A3U3b%yx7BJQc`X_>(+pd<#yGOr|eTUDrfGc$GQ*!y*zR#^Ur?xL0`@_)f zHy3AqxxH(1@72GpN2NC7n*qyi?YD>$(!p3t1*@FIe3F>`xUZE^ct!488Bx;1;}v@{ zBHLoms1QKq(R4L84S^vS=$CQChecFJM=j<)H1+x>dJ3V09~9fe*wpAkk%o-Tzoo3Rq0N)wkluq|(ZO!u3Yi1Y z0shnpp!Swu?h(GQZBMBkyHw@3^yJXEx8cR5;?(qJU(XgRbZrwJE+m&R%D^&k$&U=F z#y@r_@~~?T$qD& zMHM>cRJC5Ax0FvLvhRAM%VP&1#VZ`!X;qefeb_s5@+o%j?Y*J88cLI@zv}X{w~Jq4 z(G|zyw8|hIC8PEhAO_>JGMNf#Ciih$?+8j3GdI?aP0bT)$hmD)OZYn{7wApdzR|v^ zDA`rTk>6Za2 z9TZTOLMj-T(-#`JI2J0SH>NV4xbjdmoKZGVhdYKbBzXUvEvf$=$wAaMdAe>0 z&A{trS0fV6XXy;!I<2NR#$PNw z0Hz`{=hrtcaig$H*89!aKN3F_zB@KK-u^frb?4)`g5t;i(6g#SUHgsj8w!}*f#Wq2 zvM5e_vbxtQ@@h8H(`&D1Dw0NuiRiVx)0wqOWShIQ|Eo6R%FemnTYJEaF1Pb@d+ai~ zw>!Ji`ts(}p6xeN!e?&FLB0K%+xX|5^NEk%6&PS~T%_8wSMWoZrmn87Z4G3!o3X55 z(7*bU_k7G^d3B6NLmmJ?dFhMAi5=N+^H;UVSl)K)`9D5v-johKUo)BGZR!s8;ysT9 zx~K%MNAWk0G3K*sJIMK*-#Y*J7s+;*9p+ek@W*fR|i*FT8~T>tTH!+ zRoWJt0`coL0{)24oJD85MtnW%$UG~NotGwM3Jc&-Hl@MYK>Z14>5D20{zUFRKBH-dd%km8ajTy=)T!04&)JW|N6j{m)_oIFY4`jIS zF##QNY}J{UWe_qSjZNfAc~n@T1Lhd*CS9dX;aEbJP%uVNon9}&RXdbt4I-YT)9a$b!vKt{A})}-z+45L7QN}Jf#ohM1OpyV6xJ&%?e#GX4HJRPZPgs( ztQDjtoynM0otkZ#R-nQ44RzXzpJydqfK}w<21k^(jS)?RLm|AL)OyZN<5?IQ86vZQ z=!jr2=`>K4Ms5UHej>2)+~Zd9hNycSvDewC{Z;t`O<3k$l!(y(SE^vs!ISV!&u}K_M4)_$Oju%OwOj ztiSwc1TsISM78XrTCYN@beETa;fry8v2XJwe^dN`#xKfIp73w3>1qm|(&+_se!6y_ Pvu+-_SvPzk{)>MD3xaID diff --git a/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..864a67df55e298350666235d809940f7b9cc101d GIT binary patch literal 23053 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 deleted file mode 100644 index 42269c116bd60f0272e78bf41208d4fe45285bb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3840 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 deleted file mode 100644 index f1f353e416336decc3c10ac6b97518cb5dfb97d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1940 zcmY+CYfw{(0fhs&q3SJ2f_c~|i;`gEjwCm3CuMk}xI%`=BXF++NRoRa`)iXCXLP{_ zj|4GSBqWh!7g0n&NGeITouSmahCE4Fbrcreu`S6;C(!ATW>En_t3P|rpYP21cjn}u zsQ&{u4`G!f_n-eoLpZ#7@q#@e${6+c*P<>_X~K>z1aiXf35N-UhlERnhuh{8E)wEz z5&mDak1^`j6XK!FixfCVLQzWExk`8z7&6&>YGL|BVXXGItmx~-d zmLtp)v3++Bf6ymG-M82J2E{qlSL15~IdEh&CpHOrwx0ek>uP#*Sn?X8H>Up#d8m|= z(*c#DcA5c)g2DNe=v-yq@w6|RpJ#20vgBuIukOk_{gwBD#`Sa~zH6dE`VxEE@Ppj- zZ2KC$*q7N0htDxC-1e1+GKc$nghv)4!rVw$F#P;n_GjPp)e2ag#&qJzn8|s0ZOqi{ zf_OpRm=#AA)Rr(Pkl?;Cdn_FIDeES4V|Qa#UuQ4U7v4Pj<3+MJ^0!A|Q}Lo8c&h5h zWzt54X`TVSU!Z>Gm{}3tdh}pld+c4ym`D^dkB(K`$Z-ZFu)V#t1GXVXW1T-XQDQU5 zosSYPYD(X#nA)Aj5|Uj(1D#%%#JBS0N;Y#jt9IwLKQ~e1Ti*3B%AdbArH=CTyW{hg z&p#S?-t>>EJ%QzH>#|(N3y#;Y8sg_i~n z%%b+L#b+u6_9QfEJ2GTa9OR{Ju8Ptk-V6OLc$ts6N(A|EHG4^IYGstYCY`C~biJwl z^^HZo+IMdPdsmPuID6*TJ<*XN@qFYY>^Dt$XyNr)*X&%C*5q*Tr#;FA`NWxz(^Yw8 zGMZZ)`nSn!efH9w+I@a%@~pU~DQao@5p8v(AslJUSSfmZdhE2{!SBsjpEIqJL`mQ3 zg_nQOgcLbDdtSx-mwjO&J-Bi6yU8r-sMo*7sM^llO#0*6#Mw-~eB+^vRnLi zu<9v1*dZ)MuNUl)nEPj7wiBTelQq|(F@fRy70)y{wsnP433Dt<9nEy;zD!3)rMDQ%B?FkHJxeo}In2cYYDX>W0W$xdQVP2;p!CZje~)CAxhh z1#gP(6uoYVvxl}-H?2S0(NsHZKN%z$I?`3Y@N@WlUprH ztr#wP+^_ zGBU?OiWmeYeozs|5*YaignAM^WL6xYZ3n6aj#M3nO-|6OMBSZ0e01Wo8E sq-n{d&d&s$y_A$+xXoZ)G1Ojy2e;!r)RHYp?+?DZBJWQ=XFa|5e`M!vy8r+H diff --git a/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..026830879371ea113b6572ad04dba4857aa113bd GIT binary patch literal 20159 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..5195b6cb01e35135f6bab7960250d9c96120135f GIT binary patch literal 27930 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 deleted file mode 100644 index 43164354dedebfbdaf3016b280bf34c44326aa3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1567 zcmWmC{ZkqT0><&>%;8u#6;Onnrg;|4sD^gZN2ImoFYKbf|F-p$igUpfR?qI~$*W`c1KAJnF}CVC$FrWi(twDH+Ga)z zp3+xjxGsd-LYvZy(zd7BA0IH88nwvIue&#!V!pPU|Jq|fSYBT0O3CHd8cQERP}HZ1 zfoL;bf_{2FfrpLQ`$dPHP0Z`bV?#iKbQa%y%7`j>*F&_GUBU{M6wO>>JQk39IiGjb zKA8Mb@SzjcnsgnXi5?AMJJ?U-wq9UUp|NsiSphetvmtMuiWUZ&epccdZfxc@Kjd7k2@sJnozDpQANF}m+0}$ z;wfeyy|F(W8c60*!-@MbvvHM&t`SMd)S|W8P5v6;6#>&v#_|*B28Jei zI=^Pq%DgEySNq3Dy5{~W^{OvuDBD0Z(KYR>fo8&kLaUNZ(pnrdZ0R; zZ?3m@r2kNTJLX-%yiInMQebb&(JNOuee8&QTojrhaYqZVaeLDWIaFE_qa!X1-gv!g z><&o7L>_Pd&`32(HD|Xof+c8YXwNFBXgb^epm21v|G(DN^dw#Tj}D2td1~Wy;ad1E zWtOxzra-gJcyN<&r)|}^bUVE7*0z0}SC$%Gq;4&mB>Y{ek${`>c2 z>mB0R$vv9s9p}kEFaH#L2g#n65B&DpE1mCEx037c79JC;=Zy0m5o!NQ5`y>sUYzk< z5hmI?lQZ{Y$q@FRx7TiPnMix(p2DkGjn* zm_JI5esE^;@vCPRg{Ey7TZ&3Aa&hs*W=}{Euf28jI9(c_gz+rrWy(Up=A+L1 zD7xUIMjdkPv+~yS@iM1wVWG}&0`G~7xbPr!++4@y%^T_jU(HW2{-%+~8bren?di;U z2Lx)(1*}1?th@NS8q}&tFG^7A`GzAz1I8-7^v2nps)v`OAcqal%6+5+-+z`)r^U^< zS?BS=5vGg>LgjrI5gWfOl!@3CEWOa;WH1N$HZ;PFp|``slx`M;(3nV1IZ!wv!EJm; zgBDlfW|XpD0hNUQ+21(~X?BP53j_KG2c*Pp&>~C`Dp1TM$%PvrAF;q>(4c^q2YkyT ziY%{0fwWw>LtPQg!i#*}a^SusisM?l`KStZA}9${7=%U;B618O#XO%wNQQYHl2R!3 zUfk|b8JZ4n4Wh9E*dT@=Ni>cVhTObtW^_hJ*&T39=#)ekC}r45#^dn@heA0)8X(Ui z-)>MDU_%|@kl=(a!c{5QuF9&QNl?zRTSi7_4Jiyrhoy;yny^EK6Np0|0ol$06sdqD zgwUeLxY?Hj@lWb3p4(bm0f%Qm;C0y)&-kJ--}6?LQ!%Z$&>iFBim7L`SHoPq9J;~e ziiKus8~+2bWUFNW diff --git a/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0136c6877eb28676395114bcf0f7be56a95e7348 GIT binary patch literal 16786 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

    3K?F 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..4c8bc7add1cb4680c9582529ca3d212ea9a11a48 GIT binary patch literal 22127 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 Oi@744C`eWki6Q_~$+DjS diff --git a/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7a03cca135e07354574fd92a83184561d037d45d GIT binary patch literal 16936 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 Nsg(4d@$v0k{2y-&WUv4L diff --git a/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..10be732e147a744f91994098b290e9dd8ce29854 GIT binary patch literal 24745 zcmeI43y_r6mB;Vb(>>GE(|zv@4A9Jg^oYnP3^O9bV`o{KtR^IYAc_x+>qwy)MFd}o zNmRa4qYz|SqcN_8a(uA5RUuM|WWh(-?ABJ|;*$h}@6kw>#1O~$h&tlk-??9RPY;<< zR@qHb^>x)ue~r_$qldIqU^ z-QBs|L{(|pRV?DG2|YboWqdW=WK@|^p0$5$?&(q9(&#FAJVs}g&M01_xSMTM#M-q- zba!iIW~r)3MnxOd(cRtcDw!g-Cg_%cztcnjESobazuErz&-)v}owPEk0Q#Gp+$`HD#o!$Y`UI8@Vxl zB$aGe$rW+e;f>|lSd@`5s&YT3b1@l3JHuA-Z@HdTtPKiVb-QOey%>+}yHI_l@ng;L zMwQ&HrJ35ZQ?N7#E&fF{d(;uc<^JR2H8mz7|XLY8iwYS$$Dc< zwrm?M3^Qt^wcn%Jx1_vZNe{`9Mpdri(I_YyPSw>st2e6A{vN*Whw5HN`C22{ekAb>7oW!SSw81}2njXTy z`SaH6%QIS)(+SK@EQF`luH$)+@e{4)sRXhq`=(yyaSLxFpi2oMd%Y@s9gXWYtzbqH zKE`blh6AnGgWQZWs`_lM_fW=0;qcc2E&&n?| zYP{7{fsI)aw);E*qj;M{fuX~Fu4VMrz7>#fpEI7yzp!wwiJranX0j4XG|H$8)(0lQ z_huV^`8=ugH=?r*yz~Bp+v6Dsl2`~Cu~!@>Y3(o?9m$xTwM*Jtxb!1Wl=S3!gswW| zIbsJ*0rB)Mld0#~2)ntLSZlK&V&mM)hsn?_K5)_z=Zc~Fa7E(GlBtD0Qio%faKLuwn~d* zjNjBMO#heCH`uo%PqX$q)ES1fQxX&5tbs82rD@XNZKYMPc~{Uwt^I~kr|mP!cl7r6 z?{M^vvCfD7^d`RH+?VO2qga*#U#5kQeOiryko$uEtwo_~-xQ=j6R_mX17#sCU^eP7 zozq0AmK!zHVp2~5=D$E`UK*`ChXTx0vIRAZU1QYCPa1WcwJVKU3|r5)mLXKF6Nq-Z z7X_L?UJ_m|qQwiX1x4+KX1S||`!Rb_f0PvJ3I&tS6tj23;XOTDuQV;HazZZG^|Z+Q zUZbXnTFUFIN+n&aEv&L#Mm-}2>+>5K-dLXeSd>+z;oWIca*7nXGf%hEkv1k!jRH8? zSwUm%JZ`82$m|6arJ0s0>GJvksUIX_nH*rPW5s~QinR7~G0~_wZEnh+$dtdqs7~wa zRn}~_GSPGQ5Kw}$GxjHBqV#}W#5n@}00aVt+4B@qx;M=XYyW8;JDR z@}i}=FNS_#{6(k|UV-mz(LSa>HQT7~$Sh779{{Bjt?wFk8%mDx^Df78EQuN;`T(m0DqMXyDMkX>`MVOWWNc1vP z`ax>k&NmWG3ZF)tL|q8SU0EINjA*qR!lyVNHU&46J>ur67Z$oXG;&NcKB`Oy6=Jk9 zC(6wDZAS3Ad#$h}%zfwmw88|m9{rHL{BlfD8eY8P7`YaXRwLM8lrJO@Dx-JHP3RcNA7KCWpXUA>K$Pf z)6+4=*JBvXInp3t$$K6FEB2In9SiA*@u5g)hMS+xEin&BE>6Dz?2LbOEANIFzp6jn zCG~_9tbQ?1jE-suD9j3e-^Hd|;XWxl!ww`$yc@N1JOjlrztn+@;v% z#!UrdP5-q*1eW@jCg&rKw8RgWzIq@Fq%ZVtJ2WkFv)E6D81)E@_%4jVkyp7l-ME(; z^$*LOv_z^A@w=Jz3Lhr7r)NqZt8^X4Bmz7=nE2FER#%GxM_;tQ&mPkg$ z8AN#xy<^(_ib^r?@m8J1#!=so)r-c&fLiU@G9Km(51SGP5LJ99#A8e2R5){L0mFC( z+c;c&Q@aPX7zR~9uAIv7Xf>wdtP)dE^t6919I}55_#&>?Yfg~-n}w$hsLuj#*k`|L z9F*o`ZLis=A7S!x8L_ubP?n!gO5N+c_T1u3XFO-r_X{n%@4@I0V;Qj{nW;;3-3FD9 zo1HMwX%Tif|6$&5d>RuVQcMj=WZ+vPG9E8+W#C@F;zqz--o2)YmT5BRE3|^cy$0YV zk19{eocI@A|pr|mcejRJf9%MjxiE#iW$>(_jU<;0Q;Mg*n?%wH8 zyy)Iq;#fL8j(F8a=5l0>2>V;?53$(vKGj}aD&Qi| zMg~r`GeMppXVxVQszDseel8{w{I!|v?22eRfbX=z2OYoNwA}98>d9O5 zPSDqhsNTI1)tzV5N&B@wA7CGYOa^kWtwo#5Mkk(+#ACuN_Q$_@QeSBJD{0=M-W(F70 zZh=B9NHH~ZfWdt$Z*ZS8>i&ZKGZZ8v!~3!`yy#lq@X}~+UgPe8 zaF0@*c`9AYv_g$jK6Tvr;h9E#!(Nq8bM&g&X7lVoGg3w^*kwpQ8}-$^YQz}nx_RgZ zvI=x#PJ!jU-|LtRkoXA_{sa3XVGOtTzA1K-572*1sK$=`;5T_wfjd%T)I;;62=2;z z62?a%Dn?tp1LO}~=Bh6hK-d=s;)orj@&5e{V~eWQOV&YLp{A1{ZGq%zmsopD;GgwZ zajWt7p~mM!&QF1EX%QE92FC7zV$Asxu_UM#Ex+6N_n(f$xV%BjNdBo5?*0 z>mO=%kp_8x-@C``egwAVNOwj9b@R-vsuEoduuq~%rsBW}`&y#i6D^iSh)oiS=tN6} z6!pc|NUlv565!a}vURLqw8sb&fjMqgPJ$1QTD_TjUWnI(=+=lm`iNvZk0Q&&;WFxo zljs_iZQ!*`Z{mp6rHGlpa`_tLi*H{(+$eKBb+EIsu{zEqGU6z)Q6uX0#SH6(UnLhy z4mwAOo4~YHkZ@OR6v$R#oG=2sjyF;;(v0s!LtcgUX++lxJ5<@Jc;7f6B=J{Le4kN! z_fVz{3RPWFaK}OY(lyFCm2QVdpuugLF+Q5hK%_%V8K6iN;IXAX^Y?1Grd* zn=@CQX`E2FG=7XQlfXC+lBY#^PnN1oq#0MU8ZuCUl89DiW(FXz---}&`->ATuLc&E zz!pNED6fKK{AqC$MGlgDFNU|y35%R@=p)>>Q}lMcAj|lNBEr3qrreggJy(!&D<3dX;@S*sBg-;M=1p804l@_4mG z3Eg1En4hJbe>1;|qRbBC-^cE4Fj-ugi;pfXT`MpXzs7r>R0r$=a8S^`o$`<8_1?xM z>!msntV`0L=K9G0tH782xvPeq@whkx);9|VPuq{-3rbBFjNDz?uRI_6XGz>&KhLP^ zZq)vM9JEw&#ZXyNoe#KTm`qtkJnrDr_dk-T^nIAVzXlkD>HBO9$FU+z-{)sca-fGSeIGjLe~z6sp@R;TKkfb+ z|J;2^Vt|zD zBy5V34U9cZpBws3D3S)cfCShjeb;DXM3kfp&gGkRTE!AaWSZ zS*bo^~L&<`zBuakB zrj3e3mt+xzGm&~(e{ctPIGSp|52O=of1P{R}p06>w{JPaYs4MPXKd>{eC^ zP7gHuT2zS3EoiiCQ%;KRd2@}wZM8$B?2aO@x;E13Mb#P-Q~m=p4mc|y54YDx>sWU# zWBnk7MJqifpm*n7f@?n=>uO5WQ z1N#2rL3lhMJRT4p4+xJ3gvSHetu1GZ!{Y(r@c@v(M)dG_z-RnjpK$jPK>D=1kHYkQ z`0GBs=K)>HBuw9jzwQ%T82-AC4S(Io*@N)cePlyz`0GA>&hIw=RsOn9csw9H9#H)G z&A*QGyW#PG;xD>|#{&-GZ@3jViHFAnoR{-S|M*$!@OZ%g&+&kj^PMmhpMQSzxJ~~9 DUzjXq literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 deleted file mode 100644 index e9caa94a63d622ff914f025d06bd0661b2da5c6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466 zcmV;r1x5NoT4*^jL0KkKS(w;RrT{6o|Nr$@L9>bUK@>m{5D)+mKmY-l0r6lFK!i{^ z0Dy=9N7>*DzW@LL00000000000nIToWYL7dF*Lv?0Spm=7!GNPlO~KN35liwFbH6b z2*7hpOqn!cFicG_34lWcU`7L)Vr0pq34&s2fJ_1yBLXlS(-S657)%orOafpK!59&M zDJdc%dVtUr+Mb%4c&C)p)be71iKnJ$YM!J$T2Tu8uwHR8J=N%9zJkXX;b7?%7{z6lSy1@b zOAMI|3G)=VoEeO%kT^pTE9gf9vco1^0pQHV!s%i-7e!`VTvizvWlUkf%PbsWVTHoW z80?FMUDJc2>{nxfn4B&S1~GI~D#Gc;W@cw*bc|(W%l}2d@m>S@zW3gF(w+ypR(~az^?t|o zc6#f(@m{6-)6{-P*m;ZLBjG(|mG39Cehcnc`d4LMr~J5w;QF4i>j=Ho@*NH@CLdzQ z^ceH3UQ6_Q?DW3Zlff~D9!rO~KSS6biT+Q~;yhLTACvQVJ0IQes^b3@mj{`CM`N?p zz7x9X+{c2epiD*m(Qu{2i-}*cLa$fc3E2CO7m4s3aOnEqIp9thrXK?EFW$Vye5Krv zJGh;U?mA;K&uN)(pYB@WigCkddJXv=dQ~zy^`qcdj@fT z6Z@a3(yrsVmk&tvuNCyC;(0tz7j^F+Qoh0Zj}?5S@{e&3dE{4-?T79=93K*QIFHoJ zFJwLS=wEVU^LI~i{Li%MJqMEZPe6R9wiN6i7{!(|D;RnX9@=zxo&}swYxCjgW9fZ| z=<_?Lb;s^s$$rnk?)F~OJ(oup&iGb+!}WdZ<~&ox$=QqGOX6G%oG)$hFW@-44(ZQf zH-W|6?Cd&RIL^jgd7UfWJ2Ru{PQ#~8?9MR%SA(NIVaIo@9*1}OA0h0Hm$3R>kC=J~ zk>b6;^E!Ag>*hWavU==)0eRQ1W#}I0JdXxV#XoRtP2N%QH&?TUXvXvxEY0tdk)}w zRu|r(f#SSO7Gz!n1`@hOWUoq2DcM~Ev2;%E$;BKU+*VBbk|4^gie-T@WhIPEQG~II zVqjQVW&;$#SXops$gG(w63H}>%4$iKg;*F<7BXmL)RQuVSuqwEWiqJ75?H_tFpDx( zmP#3vq{c{QQcS|Jkft#UJzOGHQ~nV;GNNLoVPTRoSg~Ns21;1UV=`G7WXNM7mMobV zq{OkAV=ERcF@|PlGO>k*RfNTrjAXJ_VzGuY!z>uE8HQM7%Ed8)WU@0BQw%X!%$8Fu zV#;Nc3{06=!!x7A#gV zjLgF&GGa`b7|E7OWr~X#F^jO_jAIzE#uhUfCBqjK!ICn{%wn=(V-;jsGczfa!Elk7 zGZ~c2EU{)-qa`O73`R)CNrjdfQ;LO|7BZF$7|OzBOlD+QGZ~7?tBSZ_%w!y5n2DGf zlEs4tP87JRFQ_PoW^Cf7VxV3%dS!Mp%o4_?Wm5p|;90*b4Kxv5hH(8n?tn zkPDfCS^m_S%s+Kf3oayru*6JcAk9dOu?(vrn~Dx}CR3oaKof-uXTS5^_ZQwP3>Rc3W&(Hc>FU{zJ#i~x`IBA_`lB%Rp|g* zDys(vgTpzJRST#MO#UjJ*8haw1NB_szZ31P9P*WLPoRP+TcnI>*fMsq4CLr#rfn^Q zlrE+sk?VOMRp{haKG4Vxrl9P{bfK(rw03A~RxREmcn6Y_`}AJ=vP~8{fsq(8C9jb< zO!;VctY#o<=Yqmqv}|P>C6(;>YS7rqWGhJ6SHWRFx(X&Um5Hpd$;UKavN_~uCVm0* z7h={jjKgFTL;x4)Wh&pul=UvtHDWQ1hMa_L8UZ=&cKh?>AHWCp!rF(clWAfD)1-QB zs${C3$&`neI@5a{Q%HKyf+>ThB?PRXG`K>iuY-WrYY&h?NFup4{r!zOxpt5^Lf^zo z$ST2|#>~|FD2UxU4Ry#;rm^*gr=oW4DQbc;s?3wDG_wB<(^PPp-EE+Tfg)Af2sG!5 zJO=hZwYTSjuxaR6r30<|K$#x`g(mG*^nj6U^OJO`(rN9c929rZ+ia<+3xW3i$6ax){d= zG@BhiCJ#!T-I4_@sSV8Gpaq_WNu^rB@F}WjnrU|t)1ykMbqknjwH=GYzK1Zr91P3b zhPDz{{^u}+e7#JiBDlwt__;x=B+Fr=cCe{VBHv>l>91bvI9xLg^2r5D(4KYFrsdrA za1ID-U}p(%2cXah*P#EP9kQ8L0xZuR?BiKEU~+Pmwm94|wuBw4Gii1MR>)M0zf!2+ z_0K@}W9*cG;Zmti5D4dID%lM^01`xgfUa%e?yMmk&>_Rx2+&g`&oW)-5`cR@(+}h> z*z0d0PzOCR3e{&V6K}SK>hBibn5yW#>4sSya^OXzOf>Q1pLuLv?5beN_ z^y~C#uW?MXKxBtJsrWkNm{PSE&x@?8w5pvC79de5y-yYTo(Ui#ngUMq%+426UD)q3^{X&uB#(RCwahtbNsR$+ zM_31H2O5hkWu_gmjthRlK=F;b%smY)8J)yIV9W3jnC%2~VPygLs-5F}Kv%A!7n$CV z!w&rbNJl+{!mb< zM*Sr5pRfrFK*WXp5P|_rNKVF^QYXpyHeeItWDojpy8^jnoIXv*5vFHW7}db0b}uv9 zeM%!ipur?lvIcAN&kXjAG~Eh$J8k@PDPhHGcQ8=pzFWu7-u>_3%kSie!gam4V{35IxsLd*- zG;eCW5XNnR?2Can8*k8g4D6&$^Ac8k(w#_`-Pg4?1zgwyM9BmUMv6ei z$S(VoNzF20J)`wDb&snKq?JBAqN0Hsf>sVvHBBwcjH3WAJ%o{AA0kP#vdLR-hb@j= z(_}luEm>MD70`U-jjQYqLh91QL7xWm4kVtADHn!FKntY+jKVE-1UDlcI5s?5WSJU9Jc7Bg9Q>=C*xmAI`KU?dw6 z^Y9lqNx4h(t4zN=rCHX+uVSV@9WqwdYZHh;iqOpTE`<2LROW4WUFd}d<2M1B0i*Zn z`rzlt)>;_i1~^S53nr-*+$RPd7N(COs$KfB4e2tb8Vh^HN}w4^$iSqzZFJq{3-y(t z=9Yd84qi~8q#2p6X{S2XLLUd)YxBZ{m(aINb^Q}lU5AnN*d2a2S-Q2gTi4bWhEYHg zEz;;ZyU$eL4@?DNaHzU;NHev;tUB)2sZhY6I{0-0?k&g)iYiUC;0Yz_PDGbAnnxw+ z+Rbb#74-b2^}&?!pTMNvwA+3GnZs~3jvTSueig_2OQ`J?Q~o`IECZrQzVdnB>n4o8 z0YkHNvxPL~JKg!o3wRh21=2hGckS{$2fskKB7!wp<29-+b`>sK7=8o}=O!b;dt;#) z@PVmI>wc!TUsu8OU|FJyMUW3_(UTgSz||YQ82@9YHUJ+^%=?Je7>obo5)ro1aT=RL zlPi>0rdLIBl$=$AYBl9mkXAPmf%RU!m=N`)Js}u-^Z10!S=7#KO*NMrzWi6xqBGLH@Z-Zte`zmy7 z;huK0Th`u$l*63EZ30>pD1mydVE-VSvD*O?d`UBKv!Ube@?g8uYJi2d+ra=wo<(YM zIjLxMAxFBg(_@K)O#b6TdIA+I5JARardw~(-gRm6Qg_E~|0U(6eVNL>t03Zwqlhq_ zoqd`6l(Nh04yI=9$tVXjfow#XFfX|k&%bliRCY;n?WPskeZmLKw^5&iEdgr=9?_AeA*G=WA9f`Nku%|Hya1-np*vY43BT|Hi+!To^j9UW<3Gd-Y_U V5z|-aT=!pYf=9USZ+PN{e*@A&I-URk literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 deleted file mode 100644 index 26a43e303678add8ae61b14c78774bb6217abbba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmXAoYfoAS06?hW z1+?RJoshP(3Y2@LtuC6Z{Zgd50bLVC?3SfV9NCw3S(7HM$+l*j$&&L2PI69<&AqQn zYULQM#9#hyuQ_n$sq+P+1&3qkacvSD&WFQwZq>hYFr#6>RDeo`dJ-uNp~6i>CSS}uwXiGBpVab2R;SPvXP=$u}?C~>SPeGX`G^jj>L%yOoof7dYg6_ zT7D}{5)!|e7um4IDY|;`Hqd|5%JTE5S7qQ;-|Oh1pZAHYM}dv%S>oAfLkavWrIYT* z`$i+;a7@7T29`BegXxQMgOba&p?Ej$dMTw@1J$P`-KG^STj8M)+jnd}fik&!@*@LQ za39kxYE})9*pZU+>v*3oZ6p|tcx77Af9{%5*Kf)WOO}e{X1ewyEC0)|p}(#)lm` zE@qh|QF9(~*{h@LNCu-66(&+isP#x(rZIX!oz$lv~xlK*MYqr?3GgK)`QAA|)ZmO1S2n4_ZWt{cR*gvQJG?<&9vuah*%sOFiNqV8tfPaNtdnmdD}8 z#l>iI!mf-%+r{jla1I;-2U~s5{(NUItNKI9{X*AW-H4q|@2M@ZHbtYoxitBdc@8Wq z=~zE`Nfvw9-F9Zr>W^D@9^OCGbYGb|vP%5G6sZ5B1$ldBCYlGckZ3MH%(%bXI8;8i21!YD}F{q0N$zh+HW} zR0*llN$oLhXeUl-A7|8u<0w-oarYbs?znLl`zc5CV3D=cgon$xcEFRy^X|0E;obpYo;kbioliX+O(p|gWEPpa> zb0^q+=6aH2ZXl5pOvysi(~cb+sE)Iobo4->q?$z-zQSpBKYkump@M1}K>WR&hS0Yx za+b4DrTHG?jQQu$#iuIKuU-Nj?JpH`XhBRl&s39l>+w78!J!(A4nf#`b>|%CbOZ*0H`3rLXCqr6{A*0dpbEV47%exwH)fqP zM4oUK4MV$o1&6r)?{RkSeKbtMDO=G0o2twQ?y1M3mRhOSr!Bm7= z5oxXHfC~L65_@n&8E|I~dRUx{%Fa*bIgd3|Co=U>L!$mpmN?iaUGB(_Zpi!~4iaFpOXr z!7zehOC37lxx(9HwHVd)YKtQcY2*{Qg2srAonguXyNmzaaXrc)L3Z$K*X}q`XXlqP@ z2@p*PATZU2H9&|a7#!=Zj#&*Pb`k_zd*{x$&ZxboqfVT3z%4@pPO%F9>xd`r|`OsAWX(E@h}Jk`hO*l$KzL$KuUO`fk`9T*vVz& zS8?p7Kl+j4=Jsb7-)0JHG|3VlF6LUH-sK4k%wCg}W^^%r zc{aEnH}J7wjKLBhnam3qpu14i$J-gD3M2;mlXw4NjEhWqkIa0vH!L5tmC4bBhFsr% zq&AKk!b(?&sv%6^dL%%hbq7QNv09kdMm8CiTLzmjN4fJG3QoDs+&m{(m@tXh*a83j zl*hQPf}?XUO{9?=?^i_qgr?!A_t#n5eRuF=8yq*!eYN!1On$p0@80a=Pt1H4_b4NF zXYa#XYvp)%n`OdzoXTbOpk zbaz-)pym$i-9k4)f;BGBm!rY{uxt{+BLK3lBC&u4WG`n5bj1q_p_lg6!FM?ndkF$4o0nmhQqe#wY6~BMGSh*c&T<;DXF`!S zI|nDTl{)ddlmL`>?zV{q2pXp~a=C`sTApuZ>%c{`5$QF2mFIdWs|w0O=D{I-J`z5A zPKQ{EQ^P*uAUf42*OJQYoq87Cu3RBcdUTj2^KS_vMe|Imgiir_j3NS=%;sPsOI(dm z$QFslcqBFw7L>5qs1PzkZi7n)jT8O=5iDm1M~U)5xI7guSj3qzl(m+dyf+> zGguuV@E)2SXkKa)9DiC8R^gNKAI`Py4($BhAO7>%i=WzlIMcc3$-(9oHDIiJzH?LL zQU1j=b@##LgqOD%>a;zsp3VUZa{}j_CDydJ^2-**xf7jhGo-FK)bBXYDj?;@N{GGl zg?f#FFEGjT%f|4ywnU47f-D-%fK7PJc|;pYIo0p>&JXtah?AkW0b6p`=#^Z_jfnIHHwiFf=40tXuP!hZg7W2$S*WnraHDC z=s1D9zb*G#ZU-6RGpWCxNj;rBdN?)^8KQF1)I4EDEX9pg)08kL@8(BNFjzty^*8E$ zVuUg3Xy3jDNW~Y@;+d5WLh%@G+EgN#?x#UPP`?;Eh;nSKI8s)1S(o8~sA{GIU4J@K zi|f7J`APk;qNizMS~Wo5nsey)n}7KHt*%x0-ouBiguT`)n%q?jVS*$loN~+iR{CKp zZliMi8{x6Q_)?mkI-3#> zv=B@ZM*z~XMmywZdoA?~rGayr5vozt$k)D*DLH0WfkiI^@kucXo-&zI9_Su7N`$L&mS ztBLMF0duNH9;Zg3UsAAOcejZVveqqF%lbz7NjitvN;H1))pqvy1>b!`5KWFNs4suh z_kzYH_6%YqbHJC-KZAsFG29Vq*L z;*KtI>!ti2JN)>gotp_?Z~M*5UxY88T_WuKmh^HrcIw_Aep(D;783&_$M%};&DC-T z%x~65O@I#$IQE7FEmimD?RJAw%^9;E zgg;E;<7=A91ai$Hz`|Us&M{6%WU#pwJtgm{mhrh@&_pXcG9L0sX7iTOuCe0d8PzKl zU*$S6KwYkPyrMr3<>sXNSuzU;4b`Mo-b6_p?%|>QW<9N>m>R(~CCk}*8+UUJb}nbZ z-G!^4DJHAc8%1`3Jc4{`>e09F;$!91{WAN4qJckqu+qXX5`@6qA z*=afMeoFV)T61p85Er(SRUN8@ecM$lSB^o!NH9xJ_uX;o2RAPtsCDKc46FLUfvWp+ zXwq(7@(hl{b;y)tn2OnACRmzzvHU;+@Vq*YE;_no5=YYN$n3)ig^HJIpg1IhaZ`8v!b#yM` z3zM+8csdc04kxfG2aY8yri2^)P&=wNJ77hS7HP6LTL>L=ulH}G2&7B%gUFu4iy3e3 zk$nWs)n3D@IP68(lG(C6K6gN3|3cdS)xO(H^QFD>G)-zLh=R~>liq>!5tnbb{%jcz z3}FMOMi16@B_;e^{Q2MK3erHJ#B@+r0w@8Lybt{6qfxKD0yI$1sK_wn;Oc#hqQ3k@ zo|{1{!c~AUCJ=}^kl3H~##dbXFbI@ECWAl;bj=%Zy#W?)%TP?^Ok2)3@NB;Y-sK=Z zJx*PHy6a*(?{#j^mVs;)gf{HoRZUGL^y)(x(ZjxFe(r>r&X1$2X6A_+_Wb+Dz8=UR z(l*rNX0-<@i=szv2$0mAHQr)%u6x;dT8lj5Vm@RV0>$QTBm~bKIDx{bQ^YiO5yC4n zG}YUO89t1PsY(z;kF3D~?sTn5+I>KPOgp0Pq4@Cd!TCte8MQWbi#JVQ}l>6g3Z zZlBc59?3wu*H-gjLA?#iA<8tOs|>df;gT(f&8b}!UUULZW*NF1=bP_SpD=&EMud4n zctEB%HZU{qWg}<};eXJ%%gRQ|7{xsDyj*{$mip9Z>lfPFl3w2UfgnA@LEgUq$&PDz zP)*~p+ThPax4&N939*~xn_leHpRYr0+^5Dgj&dRHGIZV4DD*^bgE_rS)gr+WunsL8 zNH?s25e^y55ht5O0Y_BSVqnI&d##l%HG|VQNe@8Iwk2D%j2@iY^wuwt;$2dvhu5tV zWlshQY?vt54mk8;!R%B((JzE(<0L(kkc7*kPP)uSyE~=Vj6|_gNZPQtVucq8&Wjl^ zezFv2?vBFfg2_QOMe@JKs-G9l>CckbWu)p1d0LoZFdID;*yciY9|v9$H(7cY(P;B< z+~gAHPr9|UFenNie!F962C)L|XIjN$36cpub3xJ9M(bzDU6)r{&~iSQFxO9&shxa5 zYrSOoIyS&(3PV#=8SkV^JgkqzouZJ{hvw(TjU{wG)GE$Vh~-(iIzd#{%9D7E(UM9X zw4BmIXQRpKUbR`0$8dl(6c*h(sb&YDy5c3F)k7fm3j+wH`0(_!WJsv-E=TlYZCNBP z3u`0e&irYLG}=O*mPAJr7lm15qtuM(8!c{S$c=4$0yDTk><)&}W)=)AMud>0JmDxH z?t;JB^Ky@O&Io%mons=j4bT+@{Xs&r1;>owh!qlVQ~gm)e$)*$rM$xbz(b1dbJE3xUDnl9&&ujauihxa#tp;AGW$$4ELe;yaRg z1hP`7f`}9L=gR<*mZW26)vJ*CBEe;dzi;!-qc@LlcE>Jk?!H>ikw~wHtc;n*XykBv z{9)v=>mtnG3YQ1kaI%ZLOH{InK%g~~K6!2X_VZW8)*Tn>1X1Zl-tAgGaGxku60>Aq zY-rr>?CR;rdx1_RpV7FRgoUIus6_E|Ct}R zb>P@w<{a|^?Y>bmpz&Hd>MtEX`)u#($Gcig&#NECCNF*a4#N0sER!Gi-*;c?|HGh8G0-MNE#&V39fvAruK|AUq;T&)OMXfk)!9oaa@jQL|_)M=VL6LcCk zLT1r~Rb!0Cx3IJof{)NE8yU%N-X;ynpOfN?#+y+li353ir>G?c)%YFtj@+4fQ_s$vA5;1cMjK`YVQmaTXJpgw5 z=NOuvmR^-;ln-TrHJUDzU#)HuYz7`4Vt-jPH)Xs?3is$pVUMo1(eiQZ_lmlbo$CXm zY!8h1=wwmk9~brz%Tbn~V#i@S22&5Z_KwpAv96TFP6LQ3mVZgA=aK%eEF6BpWpq=k8fYiUgb{C$RwAX<`dDy%f z+C=OzG}fRJBl0iRn2RY~u|Tq;;AG0$P7Tz@eB~ed$u&AW^5{#pENmr@&rsSHbutx?4`5 zRH^!ec?39}83{&Vk@0y1_T`k|b1gFjnyj(%VZqj_P42wnF~)8m=2Jta9V@E$-Q%(c z3)N<*T{%`oVP)oFy^IZxzC9Rb%mmM#)KvwT9A0w7u*VJ~=q!kRZX4w@T{H`Mo6?cj0`1E1g|qB6PMG#u5zS!i#IM!<*JW#Pf@ z6Fk8g8bboO(P%WjLQEpi#buwRo_VtKzl879T@|UW)sAf?EwXJk?o9Ocu6y@CgB_oJ zg&iVHbUq}3w{0WI+vU-14JF&QKDtK{BZa>G-Qkb#-VqpHA4MADM8h7g{|c&<4G^_E zL}-{X4oB0u!!w}qMJSuXGrN4^O5l)pVa4o&4$p%5#lQM5h`$*%C}9aK#vr0ljWsYN z`D;vI&;gtWTWAzSp!sekW)xBaO)r}hA_)3Q-~Q36IS&y!1S$3DQg`S0J#5^~qlB^K zECHTJU6@MMab+srdH)6VNX=blGw1@O1cnF%!=zvdnnjJ(=I(Dn6P9Gg(<~lbjbupO z!Y?draEOIdD@60M;5{jN5qvPe#;P*xOE%n%smeoQr~6 zQ!s7mD%gh_Kn)-HeWU>J5>DFf(M;q&Mo=TV}C0yC%Zy&UFpE@TLSS15v5QI!&Qbt7!W8?`H_V6wl zJ>S>vmGs&QVsr=~0}LmAG&=u`A>#Ctxr^BnsNYKO8AB*;D6hd=Sb_+dK%K}dBC##L z-iXc0uRkjqrRx(Xq%*0mH=Q!6+2AamOU{#}$_dL`&cYT}B)rwpza?FFx1!o=#16TA zVv8X>itT5yt$iUO@7(=DH|~e`)>X|QDkQYv3?(4GSqBXD7_Bp}pzuh^g!u~hWsya*g;JXu#e?=Na`|p4o2cH~#@#^`~ zapHaZA9oZ`3yZ$&JJj&xWBX%z!ApPMj~PVfDXLAP;SOvXbglnjOPsIVl$YX)BDE2G z{q%pX!(&KD8Xv01#hleCE#eQ?wSJf!2+-YSo}grhe|!TPN6bP8w1F8@=D-NOUkq&R z@*nFVtB@xA5epuu^^$CbPW3{}LU2}Cf!fs#-4BlHF5}ep^=lTYq@I<(7?-}A_`#!B z$bb9m_uDoQPvCv~&(P%_didL|4}UPlOGT6N zA1;0ye|$0cWN~L%T{e%es_fzBZJp2g~(RaR+RR>V& zm20}SZ;xM!Yg{XJv2v~jI@em!#vNTX9c=yX$JXDLo^pgwMD||rvwI&f%ZJJpjHghO zN`gLvJ2tR`=;`}>pw58r-86oH=6R)P|LWyGO27JM7W(;rpGVJ$e|+&1u#_bi#rGOz z$KDg33o5?X#L77wD@(l;koS|tLRCoR_%N>|FuthXWpnH`QgYOgo-xvO%wsT%cP8x= z>Mf>*fqjrv$c)AP*94YUguLn$7RnScx{{a_ff=(k5Q02Na+jhe2SdWh`l0=bQ6%rf zHj1v?uH3^E7oWoFub#8K2kqJN-RY`5I49I@7E8M;DjUu>UAw+I?pI`AUVirUPy21v z!HOFuGrCl4&nIif(YDw{c

    &(g^eaCfk1r>=zIHY#? zr<3aS5Yv&-Vmw40Axs72jsx50K0^5~)P(XQIs!n{h>qzy_!!r{67#tk*?e#+{84pf klk5XMrSih!IzC-~V5nT@Zd4He@N?;1?LK=!BqvGxKam@fzyJUM diff --git a/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..5734c0aa7707869e7ae3ea88428529170b68553b GIT binary patch literal 31544 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0226241f927daecd4013a0f8f112b8b2f0fa2845 GIT binary patch literal 23829 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 Rt$bVji5Fpe<9q+P^S|@T%LV`d literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 deleted file mode 100644 index 7e4c4e5a876efa998dba9e5ddc0d52e073236520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13795 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 IQ5QY&p9@bz%m4rY literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 deleted file mode 100644 index 887da78ed508beddae7bfe7f297d5781e24624b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2971 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 deleted file mode 100644 index 43b2cee21b78aa1d46490d5965bce370d876b408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6318 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 diff --git a/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..6f2431a301e998115063217d20972b314e4e8daf GIT binary patch literal 55696 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 X!j$}`$&|9(hRiJrp`5&9@mK!<78&s0 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 deleted file mode 100644 index 64ab8f4cebd1c24d3f9e5bfa4061d15784f3e251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3842 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

    pwY@z`Kz?La@t6@5Is%1bqkdl1_()rvk~0m zzKKGn4zVA1f{zpe>9qP`wZC;K@94POEFW#gw8+z39?tJB3@#A~|Aa{HZYams?DOQ(<(mrtD8*lk0+dX8Tx&@@IM|3_4Mv zSA2OIkDh>Rcq9x$wC5vXc;bO>VHZD~u1lxCY5ah}>R;@aqywcLK?{$55hI%=Bl<1b z7LN2Pp>h@P$fI94vY^Q~XQ1H|9sJ@<#)AaGJWCNC`;rcieJS@C)nQ|$7c)HeB|P?J zg4oq3ND7aA+3m?IHg9ilHYYsx<;L*XmtcPo9{W;7j1nIEvcvUy&LnNISm+TR`?4TB z_9Z;_#r465$G&ug$G%9Wj0|3Q?8_S-fC`U&36Fi58XPSZ9{cj56x|Zxu`dLW@9{XZBGBZ5( zB|P?phRN{Qmvo+ng7Dav@Yt8|*ca)*2#0b{SCz>4deF@>Q fFC0t~9{V!luSfs?IUV~l7@Rbt`1#q+e<}Sh89nOL literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 deleted file mode 100644 index d76993719f09a579fb5c6d66f5c959d14c725613..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1928 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 V?Hf2c_tx-~9S17;Y2oIT{{m1QFI@lt literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 deleted file mode 100644 index 8574c08f7f7377b2817d99a4b2eab74d1bd2793f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 724 zcmV;_0xSJOT4*^jL0KkKSxfJE=VpHfOeg(|PM68xTTnZ(LuoI-jGDa5Wb@k!93#K~DQ zr(%~GSbZ1tUqp6Y-f4>rrc%i~l6=ZcrGz;A5q(z&6kJ9|S>?wG>H3|M7WPU@#&lCvf~7ozk-vUwn4UCdp~e2(GZ zUxUozuT|~`6gY?SaX6Xo7wAK|JD4zV>`1)Cqa{pPEbf^nnpYVyD~PxzM8X+mm1JC2 zF^Pq6vS3*pGBB{NI5Kc?V}pspJ;l;=j9|kPgieA}780k>E`)mp@e9~L(EQ9e50PI| zb|b-6cqMoj0^n28Rwh-9p@Rj63^I{ABEQ&PqAm(L0(Sy*_p(^U`3%9txM7mW$%hh7%^h8 z{P+}9eXx)R-lIsxVt|wFia{p{SW!`c`-%aHg%rhNr5LOVs>Tpef~-o!m`h<*YKX;y z6V-R7AV8R$;j2M-R5rYE<{}*yaI8cyF G?|J0XGCb4( diff --git a/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7f18cb77d521babc89861c2657abaddad18445e3 GIT binary patch literal 15310 zcmeHOU2IfE6h7N_+fv(mDweiX&_#igQ0PW}gb?T^*vJD&Lx2c|qzMLVK#E4I5rM0y zm?#29j3!iS3~3@Z<-sUIl)e}+gxF~O4H}}Li3F&EJfP|EJ9B^bZg)%BShXd0AG&jA z=boAQ=A7@GGc(P*ZBga@8$LWdhiLDCOT8p=u}&h?#5RiZOzp+GIF;~0nuF54G>sEf zz?C!#KhI#wk@HOXXeXUcdx>z2I++Tk2JH_NOvYa-+|OM!0i{NYvYq=qQ&gl?U)&6F zw{lx_6q8l2Z%Ky=?PV%cq4FcgEr#T^+z_c|iY?P$Pg^!IRf?QoySRcWZ$Brv&eVwP zfF$Yi-Zw%fFcnFhsn|Tpx27NY2IAxZ(^QeMT1@}+a6}>K;aEAwP$I?LSW(M1%X)Xt zOPmJi5(9TW7x7aEX4)2=!c;D@*d3P0E*(IFz6r>*yB@7@%iil5zCUG3xYaXLrnOtK z5P5`Yo%h;SfPX~0sNt^7wTcXel8DUpK*zu>ZF@IUi_8j0+nR*vBc_`a7YrV_RLMlE zkT?;EqPJB#;^hIbj+>bmpc6ZSB`kXk^3lkk(T;K*VB5qrW)V}VS=u69niv+zAPXSv zk_$Qwz@S?6n_F){AHymMppQkt=$OKHJEjHs=kzT+R_Sz9LqxVP&BJJ^Mt?eKbi@Nr z4(r4*sp;}^=2@$lpkjzWDQK6Yyk^m~UCO838S-E#$u58P!5;o%8V!sb05$+>oqn^f z7eK=z`JWaAc{9^Om_($N=^n{fLu<|`)qhK#hY3Kw0Ww*eRw`nOp;=?v55bB;rl#OC z${7BkuN{>r*M({H4Z>;IiNT&>>Mmfi`@AahK2uxYO6XI1!@i9MdK%jm<(>OrwTg8TChp#y6U(E5* z?CC@U>I~iVYZjAM6*myu)%9wq^pJ{v3AXSH*y4mrF;tyvsM^tX-bqny>rl1F8Wq~P zC2Il}v{CgCX6RBYI1Yml0R%V8S6m2gr`TaW1(%VC)F)90!X?|-kilSB5aeb@vwNAA zn893OTB;MdPh`6pw;{B=x2@7BhVBz6=57d7WONb*tf><5+9Xlq=~bp#D)|dX8?-2J z4rOLxUGg`T0)1Mb?kPndKX8$h&#^!m97-mxxWe|0N(xJ>9RgU2mA+HtITdx8Y2{~* zOiPE`)W;0B)QXUG*8H6TcOkd1J@ve^GR`p5{yyu@P#y)tr~T?w zf~i5E-H~%lBem{frY`q4eC=j?t^(7RtV))~1q>!xn_7C&=sW5VPrQ4S=}AxZ_oS$P z+@4~Bh_o2x+7urq9(0&ztS;zA)f}r4K}rtTs_-oAV{u@8Vc)s1j;>->K<2qC4IZ#I zAsnjaozW7u^H=FIjaPC21VtjFxJS*YvIB6oxC=Ab{&S-IfL{NA7MSP`3XI9cRi|dj zF?aRgU8bx0H~|{K9bz1i$uf)^%EF7bz>5Owq2NV()g+ssLI{NS5eFFCxhEn^zYQxmmf=_Qjv+I~<%bRS^7P$a3(%{&oNJ)CD2chb22nU<&>#fQ( zDvJdKm%Ho)@|@Y*Btr9rvv2(ROPNC0|$O!Zy;XH2P5t9f%QKAlRb}^ zIvVFG4^d@vKSAKrS!vOUpp*pDnoQj}bp=@o_T;pB+<#dyT)A5F0ei)KQ)~1Dq-K!a z;U=ylyu@`p{692G6PiN!{}HbL|I%cw&_2yt?dW3Y3n&`l4m2;2vHq$JAUo%b$D&A7 z_c7EEc5z(8iLR0Jjc-7`$m1G$!#(-BCqEDKkjh&Ck!&*8jX?jXLZ`84eBG1*9J1!G z{rI5k#~pX)YhtTgANsx8N=#HuJBcz(Vw&!ts8$8p4Q6a8eVgH6_0*s?s~>99g$h&N zq`Ib+!j#v8Busge1U0fxu{20RY?wt#i=cjxGT{{iWx@%>a!%eMnf7h}StfjaZgP3l=6q+L7E=uZ z;mA*1sbO?(>oumvCT)x%Oa_D1KFNc$l4bO5NCdqKCIXuhF_|I+OS+1us?)PgAra<_NzvK0$zX5ABfl>ef literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 deleted file mode 100644 index 7a9012f472da88765c2e52c0bacc57dbcd68cd7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmV;P0b%|^T4*^jL0KkKSyqOJvj7KmfB)zZ2si*32oQh}AP@pD2mk;PK^0K|5kW){ zKp2Do2w1=Z+yDRr01X-%FpQcF8fXkK0MVhN2+5$)rhvl$4H_CSjG7G^XbcKUkrFdg z6CtC`Bo9+*Hm8*I3aiMV8B(XiD!g*+KU28q9p_=xOb(}b;Olf<=gs$n^B=hN2Wk2f zgX-YKxKYWBnN^kyCn0u~F$`76Uc!3}UgCS-C-nar&3(?}gShc{F0jAt-;k#!kK%`XKU$%@7uLgb~`KAe0@(O~i%2MeJ-PKP1l@IG%)=CJEEHEHKKNq{y{Z9++G#77GPfSXp8# z3=w5mkyyw^7zP;a!6+1%)EK?=9~Av zeW`69XgM+VaB@4*vBZKP;Ugi$^3Gp9J;kcTM1PdGC z5rVjvI+>csnd*f&&zKy;Bc|Xp!QG8*oNBx#wMIr|=Sz;&FjH8FM@+S^IJB{iquk0A zQ8Rv;bLHbXrak!i%G9fR)mM`gb{iA2a@7i(7Uy(${0Ik4mr{vMZ4z6VuC^J*Vs}aF ztT~Qg`|$vrmmFpaiO-nQux5rXx_1H0;Px=dIIrGxduf6*>nYQcQ2v zett8(Q;k8U7V8e@IpM#_lmPxpo|$!C8QWo|xJCVtYs>BcQ-ITJiK~dxkc+8#+_iY% zhD4J%&2-nYjAQejyra9+kQAD>%bvN;=KSxR8EH!L8^MYpAb;&LNsa>6l%wsIu)KScodf8D$k2!Xry|fv!CgKh%!CN zI1)kWncb&T@Mpr0+z|XL56lrzFPKvH*_C}7QOPSlg=jLPviB)g2n)h;6(DLqpw;Ue z$Zl8}IG4`i?Uv17lF6`(V?Hw(X0~#LXX_rr8{NJepgB|E>( z)Q5FCV0RzvP6x`O3O37xwcr8fIy}4{MXh!2Xka?yFruF6tn6Mg4$z=;tBLRd*ICQK zBCoodfiLjNLPx!pDE0=9O6^embsvxf{tAI)qo1anr7kpo9+bc8)Q7l zgxaT)k3|fad?{?N(0t4*RJhfn`IuWzt*3FCj~S7~#i{%+k<7(b^M`D+zi;Ias4mH2 z@G=LBk>%BUK*=l*9pG21c?~$}uzaDe8K!8|1Bz8h_qvcBXL>Ia{YP0lOJ+^FoXfOi zUCq%y5XoJla~!kKv`JZR{`S-ul>;Y|OLnU4yaL>JC%?x>On j&Bs>2$8_PWN>J^>OkFs0;iSq9iAL30giqJrKg<6BdfMkd literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 deleted file mode 100644 index 058cbfd8224ddb270471570d8f18cc296e763c80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmZ>Y%CIzaj8qGbeDUz*TSkuqUs7-0T*1)6z{$WE>cDW2frEiT;sUE30|;m^NMR6M zUID>b^L*XrUFw-P`5UM9YYq>;1sn7Z7Kk&gEKp_%Y?R?mBzK9XZFw zPvQ-S4mXxF+BwEG%5crlXV@U}fQOmofDKE6`wDG_7tBlvKr^+OxnhrREkC^AFv}a! zrai6yxcL^^G;fG)Z1^DXh3SQ8>l+@u!#7I!8f_206Te`8;b8M8gAam#I5vnezOi-Y zZ+uevMr_3fgVoGj1_pLa_7mC<#JX7M@G%|QP!Pl2P@unHPh;Q}fdsELtOE=i0YL*%A4cbIngt@=4Iu@=jGhs~jhY3XdR#r? vOoyhkbh8}NY;4uhIv5eg6`{tMnAn==&DxNVAjbYr?@3p|LdA=RFW&+Hc!0T_ diff --git a/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..63b4270d1f5b05949c19c8dab073e076f5f22dff GIT binary patch literal 17155 zcmeHO-Afcv6hFI;YstFDAZlHOT@=)czUZ-t=}R|735*gcijclkh!A>_Z3wc2UVZkZ zpqE~vh%jQFe31GZ3bII|*dPg_I{ogQ-F3IM+AJaBTyU>5bLZUieSdT2j?>%|AH47| zyO-#xKl6!%r$l5*LKNpZil(Thp4cUvyXQExMI=tqC{>RVd(_W9?M6Ss6c)+EJD!ZA{M2*h#`*oOVPOaIu-a@LQ%B=-y{qh3*a0T9F}33Wstfm^EuD zcy;Ye5s#l!0{sT2Cb?v9JIxd|qs@4)VF7a-v1i83Os{ei$sWuECL>AqA|Ql$FdH}# z@$$3y&M6SQ$W%KRNW&C21JFKLKIfNaGs7XHoGiO_tx$y<^Bs_^W~x7m!+nO914XQ7 ze+{G$<1Zp|mHn_0-oIgm*2OU;H#OZ8Jl*Gi{PSrs3<*S_^waP#9G71xL>U9)e{RO!UmEQ>FTShv?5Bb980t~y}6?o!$xE0m#RCK$NLa$d=`+(9+0HP7Ba zgz1>fGMz0Ow7Q&Ig27(EfuNVLF@d!sJ;~h)3q*~v;9Eh1VGtBXuR-(#e%t`=21en> zt?ZuL$bO<8(E_7}+Yk_a&_E}8kOA>=ILQG1gHJj)10s@UuNLQQY^}3asnpTO3V!O0 zK-m#Y)rG!97&n^0sl&L`@w<*`yxEU==vE!5*hSA2Sv$jCy2ZHQai(6d&;{{A@X6lu zmAj!oSg9M%S)#B`2ntOG%6$ypPe6>}yjmo~?!j<*HoIZMw$e1F`9c1X{E&jFTYhNj zq_`8Ia$7HF(kvFL?^+?v+QnFQ<#Q#a z5s4iokvOqLBreA~iYpXXD6UXkp}4|6xF8|xbH^V&cPOqlIqB(0YYI<7is1(CXffe$aY_)+^v_TCdQ0h1M&yUZM30tygHhB8R^I R?|Q|;AuA@KP2QcJ{RS{iO9%h} literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 deleted file mode 100644 index 69262a53fdb8a13e507af155ae5d0056251e95b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3035 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 deleted file mode 100644 index c3d5507871b8e41bbb6254aa53afcc2c63c3235b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1127 zcmXxjUrZBs0KoBs{-f=MuK#~ofX;Ok+Fsyy%N{yVRG?)*(=8Utxd`+QP3FteC?ibf z*8fP0ofD9I&>;9H2qa!jmejB;y`u-1_`nC7g4ZE} z^toN?hX{gRyvBW!MT)NDz(pg7qOG~HYW%`+ulWT}K?;HRh@Zj`gsK#}Y% zH@^E%m3-Ubkwi2#T8&rptK=}HdmJuMywG3!%oF`3R&{=Y3x$`oPr!q??cX3rUKw6* zU^j+uNCqS z8K3Gh`^F?XG>z?_a2`Znp3|Qj(5T|nc#8@V6I%OoK~=Eb{j5m72zF_PJ#>&mf=phs`09GpiT;UWZ@%8R!GIDx9zKo zHPNN=Te4Zm6-;M_CNK23Dz{XP8E2u!$a=J~ls>7P$!EHywMAULezPK*Co)7&`)dC9 zEvwMu(Hd$mt+?vocR%uf&I|&tN)#3N-G*49_v3oIE(a@encluVN4HFvVg^m2zg1^; zP?PNWVYz-Y!N*mhp`Ui7rN+}s(LWr$zg?AdF(Spj%KXfueXS}Q=n8pOg8A15qo|@~ zg9+qaxGA5%4eM3w2UF(k5ZXKK2&^b8R+{_kY9ccgLf?D)lc8?;CQNVlhP^`dYr7({ ztsksOc<tGXflWw7t(9q4OjWHm+emCsBe~ zXuX!RV7fG10Fd!#(`1kz!R#PSk~lGDlvn2=WcyIyRVN7EXARmlw>7CC978(|7Ci;* z29bix5)2JzIiijC>dA-*&@|v9fPrLOo*?GMCLy(|e8QX6qwYQtdMpXpkvK+>qZZtP z5fE)Ex#X1=%;8~boW}s}ZbwmT(kR)KLa=D< z68qmR=hdd2>z&bhvxbcr>?nBJmQqd+G?kgBHJpE(4H1jVs7F82E>9RR@7+SCZGd!i Vrw}$soZMTyY2~89%e!Cr{{uNrzNY{H diff --git a/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..3fd553268765df8b2b7a61e6d22b0b6caa1857be GIT binary patch literal 18407 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 N1v(9kpXaZ)+&Az7G@$?h literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 deleted file mode 100644 index 15195d21385b0eede73fd2ebfdf61354647a4812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12468 zcmY+K3s6&O+UHRO1rj1iLdYnXK#(LLAtqC3aS;wd2+-zsa$5z0Nq0!^?1wb&hX|-# z5=fvWAwghl<%9%tLoN-wwu=`C*a7XCfQjFXJM%5r*o} zyzldW{{P?eW=j+YQ?kVIJh49%ld+|;_k;T57w1%dS$CL+{kCmu+P1@QhhJgQxq!u# z`Z_=KUcUrW!#T2z$TIZV{epL99q#k%3krycARh+({I;Isf=u?#29V3{W3wZ;`Uo_k zIib%l$d6@?GnokNZ71S;{Nq(wx`A!dwq6;cH!3iNSjR6EGFBTLdhE?4=s@vzR59e=8Oo(3jRveUxJP$JSn-Dy(g}id4$k(iz(ospCA&N zt06<>g4J=w-U%4Aa-JMiumUzsfWLl3dxk1(i8%PgoUqz`)?zicx_$6>}L~v0yn{ zRkEm5L56N=$3hYk1uvP)Y=I1T>mZUVu?w&YB@=>lN?dcR1cTGK#}dt60b~_pR1l<4 zNN^aY)yeWq4`#cNTO9Ay~$zi9F zp(@Bl*i0DuE|P2b04eIFvH*o7-#QqQr);{d1o9#u^}Wi0noG*T{EW#r>R;7=@qCP3 z;I2lqKezzT2KiQysJRvy3c13s8@+VHO+?0aKn)Cg#4JTgX}j^7^Y{Fp6UM@b^dj<;gS{zg*2?|isQ^G>eF~zQV4q-tsW;Y z6y`&x(90QWzR)0up)=3qi4nWkVDFXDpWM*p-EBh@=(sJv`zVLA* z+b85k&NaO0<2}khbGVj;%ZFCa*Tn36w3@Itu3pjY+L#c{9-`-a_gd03NqG5!5 zN6>7B?*o~q?DL^*xsW~{Ydq&{q3LwWK_C!nBvCD`qE7at9f#0@GKnKh(aA?9Ob@iu z&zH3|3lPl4-~mXcLWa+E`;*JJ&d2j@*4(^a%JrSx#hVEt%lh1o;`*A9D%k_#E70V)-NJiddO*`pk z_XuTL0v7>fJ=k&nbRzn z5N({7e5}Ra1HMxvn+!N&Uz8x?YL00XOg?YeeuLu+dLB>>eS)4whTnt)W@8kElqf)184jR-?@sd1DOL z&6b-kjsH2J5npW+HVB&}YPPp;wN*oz%x#>)*{|jWyt{k8kZKfY25?5u!0LhwDTKKo zd2E7!B@f{j1t7La_A;2I7Dx#Oyh1%bnD1GsL|3KCj&U6TWN>6p?YA7guU$5JEbjUp zBa!zrI-cyaN(;i|p=#izx?`objd1ZLWLK%s5*$+nts$&eO-UenE((Lg;V=NaTsj%e zBEb=>v;fm zCvuv=%nrN9_$eaQs1Cj$qvR!;7aG^e9h^(beo`Dh+8I7-chac~MFejrz{M&Q zQpmtyFSSZ+7`WN!6lLg_sJ{|ZveYAX_?nd4fiVn{v5w$IC?93a$@I(oh7+i|27V5{HiSjC{3hxBRoUF;Q!O~_2b-{CKd(MFm-n!!9p>iC)mc?y0~|09eZ zyqQ`q$(|9>n(f)sj({lgOjs4zbTEQu$Efng5vEQvH~B5gUh-@3k-vNhRGWnFP^+o+ z!=FU8AOMgU0AVAwDjmU^a=;e|ZTM&+J%wTtlG_PSBiCYfdR#vClHpRSar)ZsL(w~j z_!%aB#&W{xyfvYnr^7HIm1#VL1GhYTS({CNjdh*V9JMC|!F-2;UZF-@YHKY=V!G*q zH7&ByI;0p&N1gBlhL*d#;eyneE+`?WJ`RhD+bDj*+YObFb;EI)g>V7MXwpH;|=G z&MZ;@6e5pD26T-Vz#rxfh0`B`)N$w zu`E(jg2fRNgpH2lPci`RVF zw(oJo&9JjAXLWiW**-!6$hgBkf{M>|I*6HNv2XB+Ep*dhP&}AD?c6#ZJc!U{d)o91 z@#o~RTqkH@#OBa*6hK})R;nK`b(zMI*%E^nwBTAwd90KG1+g(ljJ9j02T7WgToygw zf+G)?$0M*R{Qy%TM(f0AgFvNfZW&9oh|<_s4JnkTu{*8?I!K@KXLjp7^OR=69snRL z;C+E+WyrPx(0<<9%Mot7#ym-BIfdXlH4A|V?y;@oIjhY5SS@stl07}hl>KI;o+b?a z#9Al{2|qHYBITb32*c&uhVlzcNdSj|*xkZ=XZm!SUxpxzLWO#w49L%^u|;z)2M8C< z(%c9IKok>O9NZK^!c=>niaaCXF{3cBhchTO(_)0VAP@bW|XGJpUx1CJCU%h9MGX zl^2Gk_WSrkQ#4dCn=r(R$}gRRWDaH^YdFv_&0|kCOlPcuM`eS|M2;0bn(b3G+jWKl zbk2gaV>qu&z)8v*)3T?cLh{=22DpM6B{_jviR1~L%TX_1^eMxAyVaDCHV5n__w)(TpsDxE~d zp65V{5_>TJW5q}6TUNS)gK z?K@W^H`EJ>nck}868{(Bw<9{2YjjF1oFeQv71plAI(!K|JIlUKSallUe-xve2ARru z1P)+drzbaOAKGbb&gmg72_j^UN6_4EWoi}mrbTEx$=N(Q7d+(VuR%xyE+dJ0DR~A%|3R=Zr>8niJM*pU;KD0ufEe{sTmiMfoWp3YeTeWg@ba~~IwWR^8l#beuPPD$UJWy&&+ z$0{wIR1OOe*bLy&0BXx(F<2cPRs-1!^6I#sCDbHTGpCE^>)Jy&CHiD#{)$aNn2a0` zlUZtgrDM$-hRH_m&=Xdg{(>*GHG>qfjx$G_ulVEb5o)rV`5l?W0(R zz&<&TY1B!fMqg0+UjJF%N8&-IGCIPDE{}|$lM`tHR;NWAJeIA5GXEKT!-+3zPw2+m zVM}4rZD$?*6@gded5KmLSrS}^HYJi27W*!AY_@f7luZZFa{eem#sJvUPS~Zu8UdMU z{9M?i(6u=dW`~!CBg`44T&J}i0Jy3SFVq3|;C%9E6oBt=%UPpX2rAFg5B%>yHtZGf z9e4|p;L4|Kft?zi0;*Jpt38cYSEbL_uK6^Fi;g6RC6TIl&*~BZD*HV)6s#xJs{6M z>QCMmE(R%~rZH_Gq#~A+=Zavv&i0IH@o-RX87H_UsywBdy?~{b2gxL+ae)R)tSH-0 zRLBHYC02zbtjHwIus2jA3}f`vL@oYUs`8qB6$c^k=wVkQn9-+fk6u` zRgT8(ER6Y-0OugM#}TcQ-c%gVU;i~|EOmfoNdR;*GO)qP;5!X7$846}I9?-*S~{s| zLts;Pb1UTN$#Vj@z)uAt0X)?3UFaUTG@axdI29a@ttT;2%u@m+*l0f13EF)pj|7Gq z7JU^sUZ7!eiMZm}#>1NmSzav?$PrOJN=jhI4694045ooLX0kFaq26!?Qel7V<&XuG zqxJ2~V$>rQE-HL1c?ro>z~+epl?^ntv!n%FMwZPjrQp4EM)qlrWan!ut#1wk+H*l$ z(T=jg2r0=HMbeBFkY@|6j4TZt!L@q@dMO6rNV4=rIqp)!hQGH1&f%1B`)K|Vd?+}_ z<730TSJ9Q=M#oTJe}ey#fcp)35@9?U{6v)RrE84SA_kHyP_cwR0O7+PZ)doYBabCA zawcPm;(~~7_`XeJ5#Ge#5$w~0u(#qQg>YlyC_gdHG+a&!g}sodGVs)mY!@++HD3@W zg?>x4HVKdg$qwdBKuv?N;G!X`BYapPfiZ~=wk$0p07n4i4do04vPb(rb@w?tNzT8^ zSH5eA{f}vPJ{`CN`0ZUJG;Gb@8XtdW>kI6aTYX#kegRt!`=Oa({BxjRKtSFW!ntrT zI6Q%1I_$?z2-pG=n*HosS$#y18Q}+I?e*JX*xDTA=jRu&EjtS#O`&6BceVnf0LW{^yBT}oVUg{elRE3pp zq+dul%X#sC;L+dyA9(aD`xD!xim7m^J#Sl&{cm_QWj{$FxJZ!zWZ7joM1%me>|Cuk z_62_-7PMe(`o=d?E5||hhv^T8y26LOY0Vz5u$5IY&pp)PRX3XUoA_RpAGr8JYLykUjIOOiA5EVCJ_BKP zA%VOx>S?a&*deZnX2xkIOdZ>CX7 zAhR5UEhh<>jd|l}sy5q8bs?E&eL49rbhYX+3IG4+Mw+W@|CbwWGQw|qHt3nvQr8;* zcoqFUv_XA^YTQ(>anCT_)+gKv%>}~6mI*kuvX^wV5yHP|Ev&NLCo)*VY|_39la>6Pb-mJ9%l4t*ta%*O2)xMb-pur0 z=+r5s9x3q{ZNKRTwyKkvsLdOppo}m!GP`eR)?;*2zhNUjb80^VhXlC$qpcM$O5ZXq z$C@?1*?}y*T0jH>j0bv-c*d;@xiZx~f?? zE#}t|HX*|yO)+80LD)ECn$Q%-JuPI(^G9;cH%CUT;#|}0*QTCPDc`p>OzAm zZh26%D33nS;m^0}l*V{Ck{M~Rvbehpvm^^u<=9cyhSxB*Sm*@_Wt#Z{f_sEQ@WE}O zs^bzPoVxuwnd80=N;yVE!)PMYNcJqK*i<8ojLh*ctE3!`;wwZlIt_>I43=o-3RQ65 zq$ko7Q!petc{JBnXp#nK7&}U*C0HX}%fjJU3q9~>otN+8GcB=sg<60hXjcE?_t6SM z>Yrk^{}YkflotKi_BPtCevK|hWS)F>ntb80mT!JdU8(Raxwza-*yOp`p0&u(=+NC- zxWJoBf<#7@p$9{(*22x4&Op6JOAJ@!{zw-6@Lp~EIXK)R&Li8%qOe+k{4?m}eB zibJ6{dRa-Iiw*NknW%Gaw-&}l67@>GP6ipX?tXj@BmIV7B$E(fShVsREUF-{RJd=n(5~61aJ>A_`fe$c zO+rqAwSLE#b|sU3Fn<+CD#utWD(aV(Q!`W~;->@{6cR;@5ajk@ucn6JC044MRS5V| z!4$+jjtq9fE+8Zjz(2`en(SMROsG^@D`EGeCR|ryV6Wk z&q0d>v?g-Q`1&AZaK`#IgYvuVTYHNRkMH86=E*boLmY81#fP?_fEHM05`N7piMR^o zS~7eAQ|fGQB1xwGJK+i>7m6-TV^2Nj#l1G=pTn z(EbY8quH<6i}u_3yiK-y9Bn<#zRVXcQcD*uar)GI8LR?b5h=|kw3fpZdySvbbPak5 zu-{L<4-mpTF$zNpA@m1=lpL7ZBN1Q{i?J(Wp`8RXC#yJT>ZoDIm1Xo@#`Iu)jn$v* z#aIYlP-F{Qg=aJJY@XrB`CVD=5!QD>&BvJ`aKvXR0(ElEvIU2iQY$ICW2qIVSr^TjGLvvQ zd?=_G@M>ZG8HQUO!7G3_#%~?wAYc+$ov;ir->aAFT+b?&R?_Dsrdxqb11)(wrzA{K z6SLh~nOw1v0*Zlk?Q?aXEANKJJ-nja!-UNM>QOYXoaw)w8H?JMdHubYf!<_!mKGK4 zbxy0mK8->vRAkwq(B?^lpxG-7h4BsAUO)st?0{!eu*HN8n4C3SX)6xC0zIpPiLpzi z*2Sw~=wvC>hD%#%NqIdOAiPYVQhPdEj+1=b7l0LMw8H8%e<43Gl*)s#uCx#sm4~3(K^UpoCDvgTSgPL z@LMBT?$JKa2u3fDH{H-2CFZ}(GnW%zuqN2KSq&GblJewa7kdOY1BuXLRU!l3ocJ3f z>N_45@{Hc9&^|I$nv?fhAZCUwK3nkGTE<!Sk#!dZISLncvjA#neWgbJ{eF zEUOMegfS$80#*-KjJC>%En`rth&&QL?MxWVmf#4}&hT*{+l%cd;d0=>BNvk($R5Rl zsactTSOyDTDGb4wFpg_6uOl??P2;TnZFDAFiVH~yQxyO%48jO^$Fhp4uvwXn;r%2k z>pJly#d^(Ji6xIv$Ven{e}};EO;&-5uzXD89;LvTkf}0VPZ)ZpSt!(kVK4D^^Tif; zq1ddK+~Z*~S|=WIGc(_6-_PfwC1e^@l%pR8z-?#v!lvScm>H&&!WZz{(Xy`a!Gr}T zr^%@YJK%9af@c)l$;`DnnH>uz35>*Xu$RC!jgaA5HYM-egq9*McX%xf7A-+0V8fY{ ztdPe|i@8JovxsQxHH`=!x9smb!WHEkFbNC$vadOsQUsvKac9>fcv{I|*08`;XvHu= zM6UwOBm}7lZ$GaeJS;Cv7<0rD=3*+rqXt1=x6vGAp9u+wiW?^+s)&VgIE{}Z#lZ7d zm^gFkDl5Dln#TIdvt*+1WI`gyq6bKWAQ^SRmXV*qfk7gY;4bHMzz^7LX+&VDWkn(U zffi-%YyBm|3r*yMZTp(+43_TW^wsxS5}l~@{BM+q3_`I444NUaaTNjfEb1ie&fq6t zj}kPDIY2973uOO|649{I7Ugg(*;m$nn5qhwN4UjXeIPv0oTuRJSiVdgX|<8hD$eHB z^Dl0&Cz_Y(L)(N+S0l=Fg|P8^@{ut{{wcKi zATp5u0zV(ZmGI!$=T(Qoxf5E5cEjy&r&}RQ-z(%^#Y0j^iL;0?VKO+nwPHm zSv^_vKJLnPUkF|WgqI^!II@fuZQaEQOnCe?sFye$@a85eDI_|brqaPP@`|v9h&Cu+ z8QG%L%tb#9?RcDM%jF*BtM$=OQ5;gbkwI+6@xYGgwaA=e&pgj9lD3Qlon1q{ht^HE za*A7SPF-}15p=p*!zp-HqjzeVNvJzZUO`yJ2h|?t>8-caZ+55Ylt&hZjKr1mGcl~8 zov3h~p`FOsVxp`W6|B`r{OjoLO|}mnx71q0RH@9}3aL&eJl~jo2QGnVJUn2lFv25L z!g6uMH-vSSO5Jpfy=0YIo!Y5FE&t;1>)qKC;kTttLmi&6Bm^yy)`_6LPA9nBFw(0| zBfN$5UF`SfOV%2Gn(kzzyW|AHD_qe&*4L21mQh_T36ni!l}U`5JBM8fXS}k+*svtRT+Ra1#%V1y zmG2_QHwg9$5LUa7>{bRZGa1gUp(q<}8-~k!?Js27K&Gyo zFc`8eQ8R7tg>B6ayL*i59?NzR0?Ig29x2!}v)7xS#9jbZY>#_1iO~Ftc=Wdfq;s_% z+UhCawhA88=H196yR3s*9>P3p2G=ojEY7$6@FDUg$6lK0RGb$rg%1uWWK^%fCWwQj zB?_SpQ(~o%LJNB{yb+0a%VFA!PYU4+a0yB{BWbNptkKLsvOV7Y$dJ4-z6jK+R1jG z#Ngn+cLCPpAqeVYA>vRZ;t=c(GliT%pl?RX zeUaeHT4R?1oI)J26qez^!0=(FbuimqRu~l$;UEdZ$_fe7Xmbw%wgwgiR~`?Y=Xp?h z&1HhV-UJ+(b4LwU8oa88gQS_`=$gJEFc$QCZC~JN#_-L@SgCaG3KgWZjM1a`PAs}E z0ajLIxICUy#1V%ullVphEfGF{z{RRyR^AFkC=D~>oL*k|P{Ka_fMz5rhk@>ZXW(|j z(xO{xFW`u{)1uO8m;<5V10_0HYWNzGBce{Wil}z404Cp)jU0HADH~vl0C;>nazr!M zY>Rn66Cmp;`eMC0pl!?f*q^q)xx5v-W&4(ho#8vfQhx6jd9Lz(T>#8;$mh`f0Io5M z9I%DS?(^G13`nr+brCFUP{20gw)5a&eaGEhyRsTm5N+|;sWJsM7q4q_VGD}_cTCf$ z-6w)t`zEof++Ewe2L8;B`ToOxeq2`e;g;Np8kvfb`RvNmvvaA^`ny9L|ALC@x$^w= z#kVz;`&x!Zy9$~Sg*MGSMBN2T#_qRAzkSsI0aZRU-f~h9w^;<*PfQww7U21n{QLJ$ zM0I`fpyy8q5U&rk-G6(gI`fY|e&2TQ(uo+~k5|;hrzIy|)VV$(eyT_O{9xr9VJHQ0 z&32G}zyIr$&yEfHBMGm)SeRQ&t z_qwS5a|7M$DoWh-nrOOmBmG?Iht-JspO-&=v2BI0iBE{44s6RK*ubW%Fj#a;;E3J=6BR zT{yYE&z>w9L`J13zuhC57LBmV=`HW(o8E`?3k2T~e+_vO{4QYg$X~j@^(7bo*=1Rr zyHynFeU-F7cGmvjLF4r4LuKW{g^a8FZp^Np>8-4b;l8A9oS@PMlak`;0LNShtSIJf zgY>tYj}d1L-dIl531q%rBFJsEeXbO1BPI=lRE@V+X>dQtALx~qo67C?vC83@a%}-9 zD<5d5jh>v`FUM$J@tOB5(i8?IQGy%mF2sry;{GtRbKsAH6AZd@u<-MC+F$>WSlERt zLgu)*4>qS?m)}o${Bzn@UGknI)3e>q(duCr*7ae&xjsnTtjX=iok;175-0W(K0Wv` zsx#`|qdL^lgt33qocxN}cDktY=QPLnp#4FVbincSBlgpOfAM4Hk%Q0fe>l3Qr1HV~ z!;Dvy#Nyp!H=bUYdXJ&q6VZAqCOW;n)2~zTecnAdr*n*s_~)4?U;Q*s zd4ugym4A8k+pwB$HKp+3nD1^%*I=Ohc;ekO%fHc|R#hpURQOyyjDg-0g}9@$M_JXl zn}3S^yV7THo6KaSQUjl-&Bq=8?@@8hl1^+&)rp;6M~2sfhZZkk*5{aD)A6G3G-` zVPeBw@&FfWIl+kMx23en%8EoTzP!X!GT^ixTbIyB4@B9tr1pZ8w!04h9(pJJ^MRC@ zBmX36zWp(<%`J}b(QzX@X#0KAOY#S+4*Atcv)6 zS44@AjJN;e8fPPuFFEpkid{a|%_H_LczG84BE7Xe7fYHmoHaln(UD7UPk7G?H@|vy z+wxphHhb~E9^3RO?u+h$U0;TVYWMM8-|YP}=PTZ&)UUodz1{wS9aCdpOH1cj%AKxw z+=D{;!qZCXmjkko$^Y#|{qCO~f06rMj1;uzQa;%3|Dd>++l#D>CcQaR zm+{ZK6@qiiKLVisbI6Cdy6vldpW&pc-p}{2&t_?h2yeSc$w)yt`6k770&~C|`62na zHkL45l$Gc}3(eJ+`M2BXRJlYnlE{!Y`uQA%UA-d;iKC!U|1G0?q?Zz;x_(*sT{Wvl z(%RsQcf_Zd?rRHx?{$|Qy2hfa?L3ZN;jK930>3%ZTI~ECcn0up2%8+%Zd3&N@jIR`!6CcvKHB`EDC8@peQ|{f!UCSNR{kr_)jvCqBbg#yn0viQT+4 z+q>-SPCp`Wwx>tjeAwSlaTKKqgS1h~A>Or=p4rWd#$xRK8uIETxpPD%PLzL6|1x&| zL(i#_kl3dmi!B>#&o9_vy_2MPpZ+jW%v$?#?nY(hS>8VnygPKJuJ0ZH_1hw`1A~2t zNm(_Tl{c;_|KkHh8-p>J_)Yoq@TF{Dj%(QW$D|xd%sZBt82oR z(&-sx^2+G7{TV~i0q^dA39ddY{|^iY_#N0SAu9m4$0L= zf6%`3EtcGPnr=xO7TV98_`_NHaj@)92Pjd41Aq7?{`i4^$xA;x6#MZWq&9-&nVGV9 zS+{Z&7qVlr2ZJr*x_cKG+)q=t=NsmdcEyKTXoUm)`8p*c@4imOppd&~+XZd+5=T12 z3s2z0Nr@+LNl3i4cTiN=lS}WhW9QpW#A3UBi38;W*z#_2hqXZ@HzNWUYu zBneF7&qcYSUS+VS*;16-GTt({L$3U`04KNYS|dGOsVw;BGxI(6^=mz;|qr8 z?iZeDPxt?oPd$?l>5^H;)qSFn$%ypK@#f3vL)1Rl{&Qg$HO7_rXQM4Y~w+@b@ zYq&UY`?Op#Fpirw${Ta$I|WG!_;5(~Sa)t>k*G|nRJt#Byxci!D02{Y+yBvOY}DG9 z-&)^-tucs;SbEh}`n7Jr(kuJCe|0dbZ6Jy7p10m9FK_Ng_s7kin>XJ@%k8zs+I#V| zcmabUKa!^WA-6rZ@L^k&Kp>G%otEH!P&{mN-izuLi)LDF?a_{V#0wwyFKa3wJnDD1 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_0_225_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_225_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 zcmeHQO>A7(dHwF2``)~nxpVIuj)ofkh%=NednEJcNg{=DOw%uNinxhV6Kxj;TA;IF z1GQBvp_U5=rHSiC3!x|)Ewa!eD8@ihc##DcS-86gbdyyfpc^fxplS$kKr)elva&SO zb00}jk|mi+Q6K?63F7;^@BVz>`OZ04q(<`S_v*`+{q zee$Z|d!z-KROA~gR>YwseM6X(M!Y&1>mA2kZ@jURh*#17DZQ05B>$q(PlPO<&l#J0 z!)$v+ow~lxnnW~RD?#G*{$^j&?=Nij+lwKch!^Wrh$t76f0G&uR^(5#7h5DSjU^02 zIr-02TUevnLH{!%vqZzCi2Uo6zd_*|$#KfJs9-5i!e62=CQSlw1)4Ag3bCRyx+xHz zvB|+^hy1Qk9Ty#?6QQke(@W@t?s+EmWTS1pNWJG~JW}Y8L;w=uQ*L4fy)|=6cLg53 ziN%Y?3dv7!vW%4-Ll^Tu+W6uZn-?~Ju^CdSax0|9azsRbNM4J)&TdK!)k*$5e{^Hh zBT_^i3ey15tPT{(kOCwuq1+{s=P0CNxP*XXE~4b6)VS57KwiypjxwpIv4UK%hKPA16Bn$9 zM?>Bm>9k-dS3vN_=$gAJFSTxOv}Srh#=E3%>xd>!VYv~>CCYUKMn5DYA4sDZGY@ir zVVXl!jv!a%l$0RVB>KJ(b;_kQzp=4-h~_pnHqHmWb&+s$wxok|0!2*x%{zC{US-70Byk=SpIPgQ^fcZXW~q^N2y&q(RwFeTg{RfO2)r8>0jZej;-3(M$b>#LMPl#k`FdX79Hb%>599 zWd(Qk^5EhiqUJ@U56iBsWOY}S*VRrW3aQHP6kicBxMnKtCUQtJF%qNLvM*x{roH^9 zWB^UTP4!4NsoJhni26(-OtF9%R4Agumv;u0f*P0Ya1r^J33{#JRY6VMOotW9Ln7Jr z@DepHrdVD=0H;{QaavvTKmdqTxwi5xVA}&4kQI9V2@_lBVsDLSwAcQn~B9;O}Cr>@e1twH|H;i>NN0pr>4| z82cv4*9KzwiwpR@ypH4g^7@7Kh>nO(Q2;}o-MXpngR3WjeJtlC6_LVdkup8<-rc;l zxlBqSpbE&r6jZl_+QnH3I2rSkQe8jK!skI2P zF?O<|;-ayIT4O~bok)*zc`y1d>5e}Ya*j0UF8UXfCe9ZDV9X{!q*2GMOqVYCg^nWwUjpTwO;*QJ2O}%qWj^$GugR?My>bP$`g`Oei~1 zUry=JI)+aue`J{^@B#{^5qndzws{@Ugx-;nD9Df|-Kcg3sXVOKUT$2bctN-3OfS}G za}-izXb$yo@+`7&+`RJ|LW35co-j03YQ!|PFcU-IaI=7#!r`QDP2o_=dcr&4*s!nd zQ4N`**6-q=sfBy5>t-IqLzOco8*Z#q_-*h~5aq)(?`j6K_W@1h3R)y)Oz$=1P8!uY zp*z6NRLR(5G>gd}142rRPC`({L&{FMn^VJhab~B8Tf?YejQ+N60%WbKxlyi_+@xC{ zHbt0!Qe{CzyVq~TPyt0UDI=iST0o!ONM9G-x z3SqWggcn0B@6ab$&_kPGX!K;Eb4GU~L+uH~xILM-6-8}hD+SYQS3H-G(QjvU*ad@Q zR1?2pOs5KTFM?vme{AeG{tN@1X{=lLGdffO*aw5brt2G^ISvdBE`ospiaI>q@H}!o zj&p!z^sjLIOWmv>mt(=XDCo?Dod|A&_ zG1lx3vv&m$GmHU;k%*Bo^!pb2{~JskldQjEwoXF2*Cf-Vm7D>xEeDkzFmhcCy^0oIRbX zbH}N(+QRxsmwKmF4@{Y*1Nd|+kFr63g;?Kt`SwgmV;CA2wM>G-O54)Qt=87N;P~9p z+cOUAp-=eFTJ>-g4@6~-(Cx^9DlHYq9^L3Wa*_dHN zONjE;ezNbNuia$-+K1Ww?)Lh)-&ptPHPMM+EngX6O9iM@{p+WlIxVl$+!K~#$XO0p zSwpXsvUFoH&T(KB0%s2$huQk3TQP!j{w>`>^Yf+BXU^$@KvJp5<)h<3*+dNgK=`&X{T*x zFs3=oOP9Kj!8j}6eHg<-Tm@r6i;3vjdw+ptY%uXT4*3+nnmqj~1n?5Z&Y?tQ2kpF)iZ)p3DruU5po^;3DvWgA@QHapB(k0k6sr_5T+T26F-(|jPa7JIE{ z6Bx4=vlg?~fW6l4_d$7w$U8*dAwF9#_n$oN@7&mHvDey1$dhO6wb*O1*J7`=`;Fld z_FC+<*lRthl25y4uf^X(d>SsEeUH5sdoA`_?6ufy?f!%t|KtPzfve#m-#a@fO7JDuBTKrR{2N2AMP1tL(*Lnzs1D&wfVz0$si@g?mE%sXMwGJei zyN%duvDbPLybK2Hwb*O1*J7{5UW>gJd#xAIPWD>twO#}-?6vqaAAU1GMTh@I5C4mv zXEPb^5P65lJ4D_g@(z)Ah`d95woZQa3GWbjhxk=gJns&BE%sXMwb*O1*J7{5Uh8>E z`Q$V9TI{u+#KiNj*=w=aVz0$si@g?mE%sW^*UHDAve#m-^*AEF?uxw@doA`_?6ufy zvDad+^>u3b=yUd3?6n@n!`Gj)*J7{5UW>gJdoA`_?6tmLFZWxp*J7`=kA{PsvDad+ z#a@fO7JDuBTI{tBqL_Pa*lV%Z+QY)Zj_kGAYq8g2uf<-Ay%u||gK6eYEB0FKwO#}- z{7E(ZNj3aQHK>?h8VWZIT`g$}4c%KP(^cip@c&FvIBjS&Ha3_vc4Qvc$BZ5Qz$D_B zNod||{ZJW_#-#lzZ66fZa>jn7j4jQW-WA_;1~qN3C@YP=N zSL@7L%v#h2*6M9T$!;v}8tUwyZr{=LzOjRvv3IALwV1Vjt63{pqP<`L{pWxCpZ^PA CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_0_227_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_227_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_0_22d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_22d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_0_22f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_22f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 zcmeI4PiP!<6vy9hW@odTo&9|$T@tc?lAUa7jizZ9nqtsMgGID0Eh&aZsnIQ{6jY2N zc+l1Xizfr=$zH@%yjk=jh(T$3RS&uKB;=sSLV_(*wDsqkO`2cZK`0XHBeP!0+W0H1Z(Y>LY1ad#cZ*Gs~a@zuD{o14 zeo_EA{lyPy)Wqae7y#;Q`1#1G#|w)1)a!hruQ-$im8{gfZ%BWsIMNbMdc%6vML;L8 z?rA1+2u-KROFp6u=R_~C&9t%;%;KWIkoA)kvqzI?^vOK`@gKD-J_;pW?%fNrH3D@0bc2b8*_T47t~orP;fyFGlZ~G0{P!z${DH0k;BytIC3|KkN5;* zdJ>o|&0wX%unhJ0V7~M^rnt~ib)p`t#HTSw(QGJu?(xRKDsJuKDs*sGoyNRVk6S~# zH9e%Mlf8PN!UfC`G4sA8g$W%!%o#tyYX`StWsi^J<|FfXYajEf81pV@oB>sMOR$91 z;Q-XV1gbUp^<_QCh3R8%VLKLjy(`h<+WrzNoP%lW z24UzS8u&r462bv94r=kXKN4~p%dL=WF#`gF+eq7(0np(Pbm%c&D(a!vuvqLuRKAi_ z^lQDMb!~(*%VW*wP0X{*6?XOH4o-oEWdxE!ExPc zV7YO)8gtvo>`dB*hp;?ekCz8$K|7PA-G0vY{Ox`b)jnpaapwv9xT@`DaT+%}Odrl> zS<;cJ{d=!iY{xvhJ#^Xt*8d;D&|e2cDWa77Xf2`?=_&U&ghVN#6j6$i&nesZ!B%>T z^c3kS(o?qc%d+$o=_%4vq^C$vXbUc@D8Y%CIzaj8qGb{2#f!mZ4-zEaMdh76t|u76umv4h9B>1B`b{7!=r87!LRbHLEpx zdP=2y@Cub+)cDM@xItA)H7I;u!;}J+#SC610m^%X`kMlkmupRo6m(MwR|(@X)i~+4 zs4vu2zA3O}@r5b1LQ~z7R!kG>QP6kw3T_bU(b853v`bm+DyeZ~v8t5D>xQYE7rYDt zLwZytR3*F&ybM6Js)Wjt2b^w-E25pmhTrK6!`#njEP=zvH>z|w<` zfiD6plzIZI7M;=oqQC-?SfGksB5_omySq;rsxM&F-DOBAmREbB*^`)q6@o2koE(P#XojW(md4C J*tQ|90ssyfbqxRj diff --git a/client/resources/hardnested_tables/bitflip_0_240_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_240_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..e835ce4179c307e40e9ceb5e2d400f569a1b826c GIT binary patch literal 8357 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_0_275_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_275_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_0_277_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_277_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 deleted file mode 100644 index b6c1eb54c9a47adde8f344c3c51fa06cddd1c782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1135 zcmYL{Z%k8H7{<>zx3{<4)_aQudL%pNmAXuJlKBCWeP|3g z;vk$`NED|Ar!LjFtQ#A{LEQb~LS~&u;|vnFbcSu+vgn;_93s=sKO1qNtDp9MdXx8; zC(oPbS^rvxZ*5@vs@Cl%Hcv#r#@zm;r%!J$mM_tL-6x$#)4;Y`0~&x65G-F0_Jbi) zyaE27TgO*8Vk<{-qP5?TIBTyQreJUF)YQ%k%ama5=s`sv4ITg%-)Q58Rkn_cGa*bn1daHzPmgmqIJ#v?YY(+&+`tQGWSeWO zdW#egLJHbtW8)_DgOfV;=soOfAO+T$>y(Bhu8Mc@Gy|EG*_zQG4#fTDKQJZ7Jz&nt zKVfxfLGP#Ssggl=#I0dmWxo0soTm|S5;5#RtTiFOCBa?xu~mF8F>@b*wAe>To0>ID zngjTG)hJ`tO<=EjPQ5ig+&aT8M7`)dE{dK8i}7M->rcE+!Uep^-+{jiWCy${0E~Uy z7*-_evv|3y_N#*W`5e415WnhIKTNuZC7Pgq?Odo{YlyVRE2iytxXF@V-K32wN`6`Z zZ-g7n2CXmdrym4TZX!YE@803#uS+ymAb@@|BLB_51G@O@LQ0B1M49Nna5tYSj(gDq zNQyX+7QPfd@nnIN41B^b(r~GPEAH|$p1@QUHL5@avSQk&?t$}YR)~1mS$#_GD9%*H zyM<8mnKsjkX1Ou1pjAqgcmf1tOMRWV&(C7+udLa!l1eL3oCL2qAbzB0cbrSNLGnsA zz(x*@BSYcPgoT}=`-zgTJ4B-r#l&O<`e8FsT-vEpNb<-_w>fa^lDHAe5m9lbUGU{J zQu69mvU<+?tO!td-=M8VDf*aH+Smv%9LUSlPlFD=6)|Sm7%rnMY}c~hD#bI~cuKbM yq?CJhtAP65h{epMM&USMEUYYNF$V`pBbvxclPu2&Ubk@ez4D8LgVzqeN&f>&!H^vQ diff --git a/client/resources/hardnested_tables/bitflip_0_27f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_27f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 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 PB=Gkpjy`|=@F4sbDYe8t literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 deleted file mode 100644 index 15195d21385b0eede73fd2ebfdf61354647a4812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12468 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 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 PB=Gkpjy`|=@F4sbDYe8t literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 deleted file mode 100644 index 15195d21385b0eede73fd2ebfdf61354647a4812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12468 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 zcmeI4PiP!<6vy9hW@odTo&9|$T@tc?lAUa7jizZ9nqtsMgGID0Eh&aZsnIQ{6jY2N zc+l1Xizfr=$zH@%yjk=jh(T$3RS&uKB;=sSLV_(*wDsqkO`2cZK`0XHBeP!0+W0H1Z(Y>LY1ad#cZ*Gs~a@zuD{o14 zeo_EA{lyPy)Wqae7y#;Q`1#1G#|w)1)a!hruQ-$im8{gfZ%BWsIMNbMdc%6vML;L8 z?rA1+2u-KROFp6u=R_~C&9t%;%;KWIkoA)kvqzI?^vOK`@gKD-J_;pW?%fNrH3D@0bc2b8*_T47t~orP;fyFGlZ~G0{P!z${DH0k;BytIC3|KkN5;* zdJ>o|&0wX%unhJ0V7~M^rnt~ib)p`t#HTSw(QGJu?(xRKDsJuKDs*sGoyNRVk6S~# zH9e%Mlf8PN!UfC`G4sA8g$W%!%o#tyYX`StWsi^J<|FfXYajEf81pV@oB>sMOR$91 z;Q-XV1gbUp^<_QCh3R8%VLKLjy(`h<+WrzNoP%lW z24UzS8u&r462bv94r=kXKN4~p%dL=WF#`gF+eq7(0np(Pbm%c&D(a!vuvqLuRKAi_ z^lQDMb!~(*%VW*wP0X{*6?XOH4o-oEWdxE!ExPc zV7YO)8gtvo>`dB*hp;?ekCz8$K|7PA-G0vY{Ox`b)jnpaapwv9xT@`DaT+%}Odrl> zS<;cJ{d=!iY{xvhJ#^Xt*8d;D&|e2cDWa77Xf2`?=_&U&ghVN#6j6$i&nesZ!B%>T z^c3kS(o?qc%d+$o=_%4vq^C$vXbUc@D8 zyzldW{{P?eW=j+YQ?kVIJh49%ld+|;_k;T57w1%dS$CL+{kCmu+P1@QhhJgQxq!u# z`Z_=KUcUrW!#T2z$TIZV{epL99q#k%3krycARh+({I;Isf=u?#29V3{W3wZ;`Uo_k zIib%l$d6@?GnokNZ71S;{Nq(wx`A!dwq6;cH!3iNSjR6EGFBTLdhE?4=s@vzR59e=8Oo(3jRveUxJP$JSn-Dy(g}id4$k(iz(ospCA&N zt06<>g4J=w-U%4Aa-JMiumUzsfWLl3dxk1(i8%PgoUqz`)?zicx_$6>}L~v0yn{ zRkEm5L56N=$3hYk1uvP)Y=I1T>mZUVu?w&YB@=>lN?dcR1cTGK#}dt60b~_pR1l<4 zNN^aY)yeWq4`#cNTO9Ay~$zi9F zp(@Bl*i0DuE|P2b04eIFvH*o7-#QqQr);{d1o9#u^}Wi0noG*T{EW#r>R;7=@qCP3 z;I2lqKezzT2KiQysJRvy3c13s8@+VHO+?0aKn)Cg#4JTgX}j^7^Y{Fp6UM@b^dj<;gS{zg*2?|isQ^G>eF~zQV4q-tsW;Y z6y`&x(90QWzR)0up)=3qi4nWkVDFXDpWM*p-EBh@=(sJv`zVLA* z+b85k&NaO0<2}khbGVj;%ZFCa*Tn36w3@Itu3pjY+L#c{9-`-a_gd03NqG5!5 zN6>7B?*o~q?DL^*xsW~{Ydq&{q3LwWK_C!nBvCD`qE7at9f#0@GKnKh(aA?9Ob@iu z&zH3|3lPl4-~mXcLWa+E`;*JJ&d2j@*4(^a%JrSx#hVEt%lh1o;`*A9D%k_#E70V)-NJiddO*`pk z_XuTL0v7>fJ=k&nbRzn z5N({7e5}Ra1HMxvn+!N&Uz8x?YL00XOg?YeeuLu+dLB>>eS)4whTnt)W@8kElqf)184jR-?@sd1DOL z&6b-kjsH2J5npW+HVB&}YPPp;wN*oz%x#>)*{|jWyt{k8kZKfY25?5u!0LhwDTKKo zd2E7!B@f{j1t7La_A;2I7Dx#Oyh1%bnD1GsL|3KCj&U6TWN>6p?YA7guU$5JEbjUp zBa!zrI-cyaN(;i|p=#izx?`objd1ZLWLK%s5*$+nts$&eO-UenE((Lg;V=NaTsj%e zBEb=>v;fm zCvuv=%nrN9_$eaQs1Cj$qvR!;7aG^e9h^(beo`Dh+8I7-chac~MFejrz{M&Q zQpmtyFSSZ+7`WN!6lLg_sJ{|ZveYAX_?nd4fiVn{v5w$IC?93a$@I(oh7+i|27V5{HiSjC{3hxBRoUF;Q!O~_2b-{CKd(MFm-n!!9p>iC)mc?y0~|09eZ zyqQ`q$(|9>n(f)sj({lgOjs4zbTEQu$Efng5vEQvH~B5gUh-@3k-vNhRGWnFP^+o+ z!=FU8AOMgU0AVAwDjmU^a=;e|ZTM&+J%wTtlG_PSBiCYfdR#vClHpRSar)ZsL(w~j z_!%aB#&W{xyfvYnr^7HIm1#VL1GhYTS({CNjdh*V9JMC|!F-2;UZF-@YHKY=V!G*q zH7&ByI;0p&N1gBlhL*d#;eyneE+`?WJ`RhD+bDj*+YObFb;EI)g>V7MXwpH;|=G z&MZ;@6e5pD26T-Vz#rxfh0`B`)N$w zu`E(jg2fRNgpH2lPci`RVF zw(oJo&9JjAXLWiW**-!6$hgBkf{M>|I*6HNv2XB+Ep*dhP&}AD?c6#ZJc!U{d)o91 z@#o~RTqkH@#OBa*6hK})R;nK`b(zMI*%E^nwBTAwd90KG1+g(ljJ9j02T7WgToygw zf+G)?$0M*R{Qy%TM(f0AgFvNfZW&9oh|<_s4JnkTu{*8?I!K@KXLjp7^OR=69snRL z;C+E+WyrPx(0<<9%Mot7#ym-BIfdXlH4A|V?y;@oIjhY5SS@stl07}hl>KI;o+b?a z#9Al{2|qHYBITb32*c&uhVlzcNdSj|*xkZ=XZm!SUxpxzLWO#w49L%^u|;z)2M8C< z(%c9IKok>O9NZK^!c=>niaaCXF{3cBhchTO(_)0VAP@bW|XGJpUx1CJCU%h9MGX zl^2Gk_WSrkQ#4dCn=r(R$}gRRWDaH^YdFv_&0|kCOlPcuM`eS|M2;0bn(b3G+jWKl zbk2gaV>qu&z)8v*)3T?cLh{=22DpM6B{_jviR1~L%TX_1^eMxAyVaDCHV5n__w)(TpsDxE~d zp65V{5_>TJW5q}6TUNS)gK z?K@W^H`EJ>nck}868{(Bw<9{2YjjF1oFeQv71plAI(!K|JIlUKSallUe-xve2ARru z1P)+drzbaOAKGbb&gmg72_j^UN6_4EWoi}mrbTEx$=N(Q7d+(VuR%xyE+dJ0DR~A%|3R=Zr>8niJM*pU;KD0ufEe{sTmiMfoWp3YeTeWg@ba~~IwWR^8l#beuPPD$UJWy&&+ z$0{wIR1OOe*bLy&0BXx(F<2cPRs-1!^6I#sCDbHTGpCE^>)Jy&CHiD#{)$aNn2a0` zlUZtgrDM$-hRH_m&=Xdg{(>*GHG>qfjx$G_ulVEb5o)rV`5l?W0(R zz&<&TY1B!fMqg0+UjJF%N8&-IGCIPDE{}|$lM`tHR;NWAJeIA5GXEKT!-+3zPw2+m zVM}4rZD$?*6@gded5KmLSrS}^HYJi27W*!AY_@f7luZZFa{eem#sJvUPS~Zu8UdMU z{9M?i(6u=dW`~!CBg`44T&J}i0Jy3SFVq3|;C%9E6oBt=%UPpX2rAFg5B%>yHtZGf z9e4|p;L4|Kft?zi0;*Jpt38cYSEbL_uK6^Fi;g6RC6TIl&*~BZD*HV)6s#xJs{6M z>QCMmE(R%~rZH_Gq#~A+=Zavv&i0IH@o-RX87H_UsywBdy?~{b2gxL+ae)R)tSH-0 zRLBHYC02zbtjHwIus2jA3}f`vL@oYUs`8qB6$c^k=wVkQn9-+fk6u` zRgT8(ER6Y-0OugM#}TcQ-c%gVU;i~|EOmfoNdR;*GO)qP;5!X7$846}I9?-*S~{s| zLts;Pb1UTN$#Vj@z)uAt0X)?3UFaUTG@axdI29a@ttT;2%u@m+*l0f13EF)pj|7Gq z7JU^sUZ7!eiMZm}#>1NmSzav?$PrOJN=jhI4694045ooLX0kFaq26!?Qel7V<&XuG zqxJ2~V$>rQE-HL1c?ro>z~+epl?^ntv!n%FMwZPjrQp4EM)qlrWan!ut#1wk+H*l$ z(T=jg2r0=HMbeBFkY@|6j4TZt!L@q@dMO6rNV4=rIqp)!hQGH1&f%1B`)K|Vd?+}_ z<730TSJ9Q=M#oTJe}ey#fcp)35@9?U{6v)RrE84SA_kHyP_cwR0O7+PZ)doYBabCA zawcPm;(~~7_`XeJ5#Ge#5$w~0u(#qQg>YlyC_gdHG+a&!g}sodGVs)mY!@++HD3@W zg?>x4HVKdg$qwdBKuv?N;G!X`BYapPfiZ~=wk$0p07n4i4do04vPb(rb@w?tNzT8^ zSH5eA{f}vPJ{`CN`0ZUJG;Gb@8XtdW>kI6aTYX#kegRt!`=Oa({BxjRKtSFW!ntrT zI6Q%1I_$?z2-pG=n*HosS$#y18Q}+I?e*JX*xDTA=jRu&EjtS#O`&6BceVnf0LW{^yBT}oVUg{elRE3pp zq+dul%X#sC;L+dyA9(aD`xD!xim7m^J#Sl&{cm_QWj{$FxJZ!zWZ7joM1%me>|Cuk z_62_-7PMe(`o=d?E5||hhv^T8y26LOY0Vz5u$5IY&pp)PRX3XUoA_RpAGr8JYLykUjIOOiA5EVCJ_BKP zA%VOx>S?a&*deZnX2xkIOdZ>CX7 zAhR5UEhh<>jd|l}sy5q8bs?E&eL49rbhYX+3IG4+Mw+W@|CbwWGQw|qHt3nvQr8;* zcoqFUv_XA^YTQ(>anCT_)+gKv%>}~6mI*kuvX^wV5yHP|Ev&NLCo)*VY|_39la>6Pb-mJ9%l4t*ta%*O2)xMb-pur0 z=+r5s9x3q{ZNKRTwyKkvsLdOppo}m!GP`eR)?;*2zhNUjb80^VhXlC$qpcM$O5ZXq z$C@?1*?}y*T0jH>j0bv-c*d;@xiZx~f?? zE#}t|HX*|yO)+80LD)ECn$Q%-JuPI(^G9;cH%CUT;#|}0*QTCPDc`p>OzAm zZh26%D33nS;m^0}l*V{Ck{M~Rvbehpvm^^u<=9cyhSxB*Sm*@_Wt#Z{f_sEQ@WE}O zs^bzPoVxuwnd80=N;yVE!)PMYNcJqK*i<8ojLh*ctE3!`;wwZlIt_>I43=o-3RQ65 zq$ko7Q!petc{JBnXp#nK7&}U*C0HX}%fjJU3q9~>otN+8GcB=sg<60hXjcE?_t6SM z>Yrk^{}YkflotKi_BPtCevK|hWS)F>ntb80mT!JdU8(Raxwza-*yOp`p0&u(=+NC- zxWJoBf<#7@p$9{(*22x4&Op6JOAJ@!{zw-6@Lp~EIXK)R&Li8%qOe+k{4?m}eB zibJ6{dRa-Iiw*NknW%Gaw-&}l67@>GP6ipX?tXj@BmIV7B$E(fShVsREUF-{RJd=n(5~61aJ>A_`fe$c zO+rqAwSLE#b|sU3Fn<+CD#utWD(aV(Q!`W~;->@{6cR;@5ajk@ucn6JC044MRS5V| z!4$+jjtq9fE+8Zjz(2`en(SMROsG^@D`EGeCR|ryV6Wk z&q0d>v?g-Q`1&AZaK`#IgYvuVTYHNRkMH86=E*boLmY81#fP?_fEHM05`N7piMR^o zS~7eAQ|fGQB1xwGJK+i>7m6-TV^2Nj#l1G=pTn z(EbY8quH<6i}u_3yiK-y9Bn<#zRVXcQcD*uar)GI8LR?b5h=|kw3fpZdySvbbPak5 zu-{L<4-mpTF$zNpA@m1=lpL7ZBN1Q{i?J(Wp`8RXC#yJT>ZoDIm1Xo@#`Iu)jn$v* z#aIYlP-F{Qg=aJJY@XrB`CVD=5!QD>&BvJ`aKvXR0(ElEvIU2iQY$ICW2qIVSr^TjGLvvQ zd?=_G@M>ZG8HQUO!7G3_#%~?wAYc+$ov;ir->aAFT+b?&R?_Dsrdxqb11)(wrzA{K z6SLh~nOw1v0*Zlk?Q?aXEANKJJ-nja!-UNM>QOYXoaw)w8H?JMdHubYf!<_!mKGK4 zbxy0mK8->vRAkwq(B?^lpxG-7h4BsAUO)st?0{!eu*HN8n4C3SX)6xC0zIpPiLpzi z*2Sw~=wvC>hD%#%NqIdOAiPYVQhPdEj+1=b7l0LMw8H8%e<43Gl*)s#uCx#sm4~3(K^UpoCDvgTSgPL z@LMBT?$JKa2u3fDH{H-2CFZ}(GnW%zuqN2KSq&GblJewa7kdOY1BuXLRU!l3ocJ3f z>N_45@{Hc9&^|I$nv?fhAZCUwK3nkGTE<!Sk#!dZISLncvjA#neWgbJ{eF zEUOMegfS$80#*-KjJC>%En`rth&&QL?MxWVmf#4}&hT*{+l%cd;d0=>BNvk($R5Rl zsactTSOyDTDGb4wFpg_6uOl??P2;TnZFDAFiVH~yQxyO%48jO^$Fhp4uvwXn;r%2k z>pJly#d^(Ji6xIv$Ven{e}};EO;&-5uzXD89;LvTkf}0VPZ)ZpSt!(kVK4D^^Tif; zq1ddK+~Z*~S|=WIGc(_6-_PfwC1e^@l%pR8z-?#v!lvScm>H&&!WZz{(Xy`a!Gr}T zr^%@YJK%9af@c)l$;`DnnH>uz35>*Xu$RC!jgaA5HYM-egq9*McX%xf7A-+0V8fY{ ztdPe|i@8JovxsQxHH`=!x9smb!WHEkFbNC$vadOsQUsvKac9>fcv{I|*08`;XvHu= zM6UwOBm}7lZ$GaeJS;Cv7<0rD=3*+rqXt1=x6vGAp9u+wiW?^+s)&VgIE{}Z#lZ7d zm^gFkDl5Dln#TIdvt*+1WI`gyq6bKWAQ^SRmXV*qfk7gY;4bHMzz^7LX+&VDWkn(U zffi-%YyBm|3r*yMZTp(+43_TW^wsxS5}l~@{BM+q3_`I444NUaaTNjfEb1ie&fq6t zj}kPDIY2973uOO|649{I7Ugg(*;m$nn5qhwN4UjXeIPv0oTuRJSiVdgX|<8hD$eHB z^Dl0&Cz_Y(L)(N+S0l=Fg|P8^@{ut{{wcKi zATp5u0zV(ZmGI!$=T(Qoxf5E5cEjy&r&}RQ-z(%^#Y0j^iL;0?VKO+nwPHm zSv^_vKJLnPUkF|WgqI^!II@fuZQaEQOnCe?sFye$@a85eDI_|brqaPP@`|v9h&Cu+ z8QG%L%tb#9?RcDM%jF*BtM$=OQ5;gbkwI+6@xYGgwaA=e&pgj9lD3Qlon1q{ht^HE za*A7SPF-}15p=p*!zp-HqjzeVNvJzZUO`yJ2h|?t>8-caZ+55Ylt&hZjKr1mGcl~8 zov3h~p`FOsVxp`W6|B`r{OjoLO|}mnx71q0RH@9}3aL&eJl~jo2QGnVJUn2lFv25L z!g6uMH-vSSO5Jpfy=0YIo!Y5FE&t;1>)qKC;kTttLmi&6Bm^yy)`_6LPA9nBFw(0| zBfN$5UF`SfOV%2Gn(kzzyW|AHD_qe&*4L21mQh_T36ni!l}U`5JBM8fXS}k+*svtRT+Ra1#%V1y zmG2_QHwg9$5LUa7>{bRZGa1gUp(q<}8-~k!?Js27K&Gyo zFc`8eQ8R7tg>B6ayL*i59?NzR0?Ig29x2!}v)7xS#9jbZY>#_1iO~Ftc=Wdfq;s_% z+UhCawhA88=H196yR3s*9>P3p2G=ojEY7$6@FDUg$6lK0RGb$rg%1uWWK^%fCWwQj zB?_SpQ(~o%LJNB{yb+0a%VFA!PYU4+a0yB{BWbNptkKLsvOV7Y$dJ4-z6jK+R1jG z#Ngn+cLCPpAqeVYA>vRZ;t=c(GliT%pl?RX zeUaeHT4R?1oI)J26qez^!0=(FbuimqRu~l$;UEdZ$_fe7Xmbw%wgwgiR~`?Y=Xp?h z&1HhV-UJ+(b4LwU8oa88gQS_`=$gJEFc$QCZC~JN#_-L@SgCaG3KgWZjM1a`PAs}E z0ajLIxICUy#1V%ullVphEfGF{z{RRyR^AFkC=D~>oL*k|P{Ka_fMz5rhk@>ZXW(|j z(xO{xFW`u{)1uO8m;<5V10_0HYWNzGBce{Wil}z404Cp)jU0HADH~vl0C;>nazr!M zY>Rn66Cmp;`eMC0pl!?f*q^q)xx5v-W&4(ho#8vfQhx6jd9Lz(T>#8;$mh`f0Io5M z9I%DS?(^G13`nr+brCFUP{20gw)5a&eaGEhyRsTm5N+|;sWJsM7q4q_VGD}_cTCf$ z-6w)t`zEof++Ewe2L8;B`ToOxeq2`e;g;Np8kvfb`RvNmvvaA^`ny9L|ALC@x$^w= z#kVz;`&x!Zy9$~Sg*MGSMBN2T#_qRAzkSsI0aZRU-f~h9w^;<*PfQww7U21n{QLJ$ zM0I`fpyy8q5U&rk-G6(gI`fY|e&2TQ(uo+~k5|;hrzIy|)VV$(eyT_O{9xr9VJHQ0 z&32G}zyIr$&yEfHBMGm)SeRQ&t z_qwS5a|7M$DoWh-nrOOmBmG?Iht-JspO-&=v2BI0iBE{44s6RK*ubW%Fj#a;;E3J=6BR zT{yYE&z>w9L`J13zuhC57LBmV=`HW(o8E`?3k2T~e+_vO{4QYg$X~j@^(7bo*=1Rr zyHynFeU-F7cGmvjLF4r4LuKW{g^a8FZp^Np>8-4b;l8A9oS@PMlak`;0LNShtSIJf zgY>tYj}d1L-dIl531q%rBFJsEeXbO1BPI=lRE@V+X>dQtALx~qo67C?vC83@a%}-9 zD<5d5jh>v`FUM$J@tOB5(i8?IQGy%mF2sry;{GtRbKsAH6AZd@u<-MC+F$>WSlERt zLgu)*4>qS?m)}o${Bzn@UGknI)3e>q(duCr*7ae&xjsnTtjX=iok;175-0W(K0Wv` zsx#`|qdL^lgt33qocxN}cDktY=QPLnp#4FVbincSBlgpOfAM4Hk%Q0fe>l3Qr1HV~ z!;Dvy#Nyp!H=bUYdXJ&q6VZAqCOW;n)2~zTecnAdr*n*s_~)4?U;Q*s zd4ugym4A8k+pwB$HKp+3nD1^%*I=Ohc;ekO%fHc|R#hpURQOyyjDg-0g}9@$M_JXl zn}3S^yV7THo6KaSQUjl-&Bq=8?@@8hl1^+&)rp;6M~2sfhZZkk*5{aD)A6G3G-` zVPeBw@&FfWIl+kMx23en%8EoTzP!X!GT^ixTbIyB4@B9tr1pZ8w!04h9(pJJ^MRC@ zBmX36zWp(<%`J}b(QzX@X#0KAOY#S+4*Atcv)6 zS44@AjJN;e8fPPuFFEpkid{a|%_H_LczG84BE7Xe7fYHmoHaln(UD7UPk7G?H@|vy z+wxphHhb~E9^3RO?u+h$U0;TVYWMM8-|YP}=PTZ&)UUodz1{wS9aCdpOH1cj%AKxw z+=D{;!qZCXmjkko$^Y#|{qCO~f06rMj1;uzQa;%3|Dd>++l#D>CcQaR zm+{ZK6@qiiKLVisbI6Cdy6vldpW&pc-p}{2&t_?h2yeSc$w)yt`6k770&~C|`62na zHkL45l$Gc}3(eJ+`M2BXRJlYnlE{!Y`uQA%UA-d;iKC!U|1G0?q?Zz;x_(*sT{Wvl z(%RsQcf_Zd?rRHx?{$|Qy2hfa?L3ZN;jK930>3%ZTI~ECcn0up2%8+%Zd3&N@jIR`!6CcvKHB`EDC8@peQ|{f!UCSNR{kr_)jvCqBbg#yn0viQT+4 z+q>-SPCp`Wwx>tjeAwSlaTKKqgS1h~A>Or=p4rWd#$xRK8uIETxpPD%PLzL6|1x&| zL(i#_kl3dmi!B>#&o9_vy_2MPpZ+jW%v$?#?nY(hS>8VnygPKJuJ0ZH_1hw`1A~2t zNm(_Tl{c;_|KkHh8-p>J_)Yoq@TF{Dj%(QW$D|xd%sZBt82oR z(&-sx^2+G7{TV~i0q^dA39ddY{|^iY_#N0SAu9m4$0L= zf6%`3EtcGPnr=xO7TV98_`_NHaj@)92Pjd41Aq7?{`i4^$xA;x6#MZWq&9-&nVGV9 zS+{Z&7qVlr2ZJr*x_cKG+)q=t=NsmdcEyKTXoUm)`8p*c@4imOppd&~+XZd+5=T12 z3s2z0Nr@+LNl3i4cTiN=lS}WhW9QpW#A3UBi38;W*z#_2hqXZ@HzNWUYu zBneF7&qcYSUS+VS*;16-GTt({L$3U`04KNYS|dGOsVw;BGxI(6^=mz;|qr8 z?iZeDPxt?oPd$?l>5^H;)qSFn$%ypK@#f3vL)1Rl{&Qg$HO7_rXQM4Y~w+@b@ zYq&UY`?Op#Fpirw${Ta$I|WG!_;5(~Sa)t>k*G|nRJt#Byxci!D02{Y+yBvOY}DG9 z-&)^-tucs;SbEh}`n7Jr(kuJCe|0dbZ6Jy7p10m9FK_Ng_s7kin>XJ@%k8zs+I#V| zcmabUKa!^WA-6rZ@L^k&Kp>G%otEH!P&{mN-izuLi)LDF?a_{V#0wwyFKa3wJnDD1 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_0_335_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_335_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_0_337_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_337_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_0_33d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_33d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_0_33f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_33f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 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 N1v(9kpXaZ)+&Az7G@$?h literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 deleted file mode 100644 index 15195d21385b0eede73fd2ebfdf61354647a4812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12468 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_0_365_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_365_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_0_367_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_367_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_0_36d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_36d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_0_36f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_36f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 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 PB=Gkpjy`|=@F4sbDYe8t literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 deleted file mode 100644 index 15195d21385b0eede73fd2ebfdf61354647a4812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12468 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 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 PB=Gkpjy`|=@F4sbDYe8t literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 deleted file mode 100644 index 15195d21385b0eede73fd2ebfdf61354647a4812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12468 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 deleted file mode 100644 index 89d88b572a733280b375bc66523de7d8ea338bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6132 zcmZA5c~sMfmIv^#RyLI-A<0lHTOgYxA@Lz&tpo^ULCH#zxYB# zE?Fquf-e#v*n)3wA8(D!yYpt{-Onn}de9nB5-9vQJQ}newC4Dld(dk~?0~8=Cbzd2 z1nMS(P^{b}4xppCKuKAk*hn2HsvLSF3#~WX%Rv&wnJP#p-9Xby`*SV!50qs&u`BXQiTIxXWaG#xR+blxDRk%lAfs z0rHJb5R|Jr53rhFUic4`e1JB=CeZ8V2N5QiEt)0rA80P@xuVXRogonnPN6V&VSjXg ztX$((`3;Vm%@?TxY&16a!TQyLF?;eqHY$$qq4nNMUw+96o}pMDOb{kudl%3AK@#j! z56nu%{jjpf`4jxk`G|NRAojso7_PWAL%^YP*H6cBIG1X}Ma}t*(SpoEi{dnVX8_Zh#u7@iRQZdgvSsKbfDk*gOq*$PX%`do3M~>3_V) z<(4de_}z7T`!ny9o8XO$uOq8(h$K7$TY|R=#1cL~naGBI3aM5znA(yFH)Hl|pbn6B z=~|wzXY~B@*W5ZDzZQ~@r|NEbMllR0mf%C}-&gs3jbIZ6K|m+7#Ju!Q2+0H}wXE6< zMgnUxMO;%H0X1}yXRI<=1%zqBZsvQYMilWrr@TKd*Ta`ejb^6aXp0{hFnWfBcCnFy z7yArGx}1_SNhHjk;Fcllf%8xW!71Pxy|>if)_6dor?WYs4!oQ{J`g|*sDZn%How7O zk~0RHbs=eRxLP2_%PAQ?Otp~<7AJ{V&WznaqB4zjmb**oPZB8$9TY1=CB#|!xuy)6 zTLVm!Bn|DURwf~L@2%_Rn{Op0htv}=hCm{^OOVt?*9z@le*Xt*4~gr#Bp1&7wBft^ z5C8ec&&|Jmck2S{$h{dkSGTkA6t0vt!dP=%-VW() zf6|lM++FD4>zR)f$aM%(e*CZoJrTJl<%S_5ck~7`gh(<06bHm2Q&aHqV*JO{gcL47 zAYwvHIRMu*CypvM5obs1@+lQiyl)sfiyI;a{Stb-s`AUXVsfR*3 zJm8(#C9C1f5#`ay4Z_x}QN4xlK42frCV-wUTuuMt@TD|cfaLUrWLh5H)Ax~BvZH8X z8}Z<+Z%C|KxNMN;W#oN;@c9Pzp`oMmA*X33G*M%6FNd~b*{J7q%eJ0dFBCj>y3ROq zy8~Y>TvZbS;E-cGe+HT8k`PamT zi15@OI2Xb<_15sZ*C81w-T*LSk9LXJUf0<~b_&G~4y3lbnX<5Eo-G%H#lrSQx%x}y z4el0$29Uw1UF;{@T@N@_?c}BM9iX)-96wbOZp3ooDhvpU(8#F5^re_W)(I5nLJXeY z8vX)RHJ;+hczr$Zmt+5EU6C9MdnO(__Sps~eSAcs)FQ=Cc>J@_nJ&11(iy)jU7d^{ zBhEkliTOCk&zHcGQ$pO}STwnDv_G2R;an>@Wp}vjL)615tY4%0W5mFy0)TSNy+Nf8 zLOWEz<)>A!=`o`IX4MWu$=TQ)4X^lDkgac9C!yDYi<#R6M@QlGE)TM6WTGX1#Dfy!Xk+xEVbtCuV0UKZ zU=n|&WQm)~6_6NFdmbnMmQ;nzdA^q+4wwj@G5O7tdFT@lPwVq@{8KN!@jhDq`_ngn z`DN*a=hd#shiQEuoc`qRd0940toPiOW2vXXTPS1!1t!QCVi3H_V|r$LoDHr}P%TbN z+thv^ zQG)jejSRAgPvxDZv;F;6eG&dSO2(;nhX>#w+XWs4&xw9o1B zmnCDHcxH)PORitNzVq&bqsCL-*G#w5IDXI+eg0$@d^fxyZLPVn{(gJwnz5w&iNL{? z`&sn=EbL<{yQqgLyh2N(NDIsKx76qnt{DOm9#3@OCLs(QQXb2z1Rq;JK4aK89KBs^ z{9sAv*utf^$2$tSY-)y&l~yo5B3Ru13sP&o18I5n8?p|5;6GQJlAK? zGv{{|T*P-;@tT_EP7BpFwWX%uX0h_rTTzRb;k>BJ`SDu(ACg{b-hG<_+W6i~S)ecw zF%pyrO1y!;_7N>M7t|e|of4MCrB+&s$d&D-+gUnROUZE%iqjjb9HrH~A)KM~hLf3KGt_ zQIHLIHK8tlYtuuJErl5hA1LqRBw=&0dNQ$S{b~!vg4!KJTd@|PO3vHes8OnvjAwaz zcaD&GcGsoN_tkDz%u#E{}EU)?X#Vz*sU| zrN3d9u}YUSJmeYje5LHYnX<}1I{XR`H&FK#VEb6Z5D`v>E~@nQXRM_FdIBjb%|mUa z$Ih%}3NpOCL3C%LAz}JxtB^&fRnE4I(-V6fEv8cOK(Ev-5!7Pr zYGlh6ZcIR`NMI7;nR27@KqpzOTkkv?mvXyQ15?tP znAE>!{L{QTHx?Ju|&34GgjY4+$a5RQLwE%|UjME4U zAdprdItb7Z7H*w!6FfqU7B8$bdL~FhkIYgR5f>w`5W;Q6D12S+7@Dg^pi!f0_L>PN zo#PE5#Be~ShD(ZpoRmxQ9A5c^eXg|5$=6G|Yhxrm6&M2!>Ltl3K6fnyxEM`Pn?;iq z%+6dqfhZArFkZL`tmkTKBS%;~CQ}t2B0nd?%a=Mw3a$5IZ?IO}0wh5r4MqDa0bBG%G*wN3AO!qDWGA|)ieQ2U%snBK77qo7I39O3 z4r7rc*$>E9Y3^}&2i*PMOesN&18!|#kurk0+qR9ZoXYdA?oJ)8GdTzG`-D^W#h28M zm9*OXWdqt}c^q$$xIoeq_GTJSfu-jp;7djq^RbnQPnW z0QmSa-F@I2?l1Z-u1r!_urndIrtK<=yLf9!xpJu~HS>SL|#emD!8(VwEacTNkYYPgc3o?Go9&xWA<&$u=PzYb>T zJEgWQmyP2B1Y1e4-=Td%*c*3Ypi27GC)ks;=t9ko3T*eHn$Wfd`EX66>OxYyX z%YxRh;Hclq*VprUuaLr5+Y25(CmhX8jb=TYL_jc;2s3s|L(P5GYrAuivl&> z(;=QV4w4g9fjlq}qtk{zaByGGM&=#Z9#A3l>IVTb}?3UH?O>K@Ea-Y7GP|_L$h@4E7mg5;B^4-~AWM?(4 z84-&|-3_ijj-%09qbr7LYFw6i`%NZKVd1l8xpwhbMI53NNvOWkCQn=jLsK?%4`QGM zZ*W>xs&;5OxG@w`UFjA3XHl z!X(3NW{%Ci`J~G76919zjV@r|-*^s-PCH{FTqZnB>o=S^bFjfYpy}sa8Wn%jP!CX# zp2*aN@I8B&z|HJU3@%=^m5+exLNEk{**gaEOtR_R7DQHN>6)WiV(BEOvr-g|)bL(K z#fUf!U`bpD1evJP?`o3reG?h8)jJ?gVD^f>MLc@mx~00bSJ5`Vd;4-r0M&0rrIH;s zlxMCY+eQ#2$By`HaANK?=!!>6lTXtP) zc+Vy`^p@v_Kaet8mo~HmKfP4@7TPcnjOM~EyI*j9JTV2(wIiUxTs!SNJO0tobfv4)vDk2pS~amKijxr$TlL@mXb z(!=SqQ9ehDE3b0(F*oRfXTcBY z5j1xKt#usAUN2r7MM75fnB%zc%J~Q6zPV*BreFT)<^hw>U)K=3x??~cyp7#2gWqn2 z!zyY&jsH^uVW`vb0dwNR(l56ZX*M{}v~@=jn+DQQ)}ty+x@bb48h=xzaJR{wT}ep`VjmfA)n@xVZ?=4 zuCj4uK9HJwnOf?gYW94vSi%x+IR0W74MPjbx0A66?%!+aFos+xo~i)6dY`2+QNFHj z|EH)Ljn`nT#RI(A15LM@cs(=6a<7pX=4q;wD{pV!Pj-SlPOdCC^EG~I4ODG z27$M*s^nq!-;!mUf$w?q`{VdZ$nhkEFeAgP*r=!@sS{wj0Lse>M9>ZvxeM~*^wWs$ zCe*xdPib|(=RcpL|cvkZEn##+FwnwE^KW(#4@5|3$_M%Y%X+0I2O&njTQ7$ z-r51L>s)hV?q!yH)Wj}g3}Q5@1T>|+bzb=(Q&|P{hfr6^1Xtss4X1v1ob0=}+;VV) zTH%NWmoV-_%gPEKK@sfg_~t>+=^wR^1~<-smA;epwT%i8Nfd2q4em&zdAFQUSn~yE zb=Tj|9=QnnLb=iP`vY?yxc*`+P0pfyQFnrP;%nIYUt$QiMAi5MZ^~RVK;7k2b9eqY z_4#LEA02*u7nrEcN2D8Mj?H4?Lb7mBw2$$AX$0y!y2Yj%cVWtPPh_EiOVw=9*>+?1 z?V}z^xh0lh4u#ErpdilVE#>@zTKVe1OY7XR{4KkFd$#G#&!V`G7jH!N@_x7NYUuL_ z0gqI*49hfxfSL?PxNeOh+7#JqBFXwOPQ}o$%(_3h!Yudw`NEIjJTJUsICgZwv@hjQ zJe_qRaZhPgI8moD5CL@c_m;r#AaXAWv2c-pu@KV! zz|lipGEV(P2JC0JzW)AX+oA1)jIemzXxsLps%M+DcOH3wy7f1vUp)P>-dyb6ephcm zY!X=hgtaY1&IwQ33cH$rlTMh5x(z7(Gl9GUVMc@Ms#(Z0M yRf>HXYxsIhJmDP)d|q6B-n*Fs*ESh8JJrEo5TB*e4*dKswV|}2vb!~*ANpT6>vaYI diff --git a/client/resources/hardnested_tables/bitflip_1_008_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_008_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..9230a93a45fd7470b742964627542f3d1fa743b9 GIT binary patch literal 31271 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 deleted file mode 100644 index 38af88dffe626c1b4415b38407451f87793ea280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8688 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 deleted file mode 100644 index 492261923c4d616d11d5ac062798b52ba6eff1ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 deleted file mode 100644 index c0a5923785f3eabbbbfee990284b0948b5d123ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1623 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 IzxOBq3wtNyR{#J2 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 deleted file mode 100644 index 333dab4c5991cf7676aa290c4561dd90ce101966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmZY8drT7t90%}&_L}Rp!@jOu4Njo6w57(DK!TYMT3Q~Zh&{M+5_CNt3Djii%>Gd0 zOzCSBi-S@SiHj&Lwnx>IVB(AqI6;9wwu-o9S+an-#W}MuB=eDF8~-eG@t^M>zrVh} z&!}Q zQTgmSwgOAN%p@~y?iy(L269zZvm=utDkQ>YVhvN{&xtGR_jLDwn^Lx2&e64Sl%S7n zX72J3f9ASonnBC_oqJ(smlQcxv5MaPttI%1f1+Y3{+dseJ=f3yE-CyAzRj#yUcM3$ z<=DPidA*DqkKmr@X*M0_q&Wmkz!D#gAWhqi>t#$WL=uByj?OlHOb)rc@x?nWKYlS5 z{#vGf(Pleb)IM*OQ+AqcuVzq^OU`Y~$7#?DD0ffNoi2~4|3xQTS=tv5zu_{ug)`hxs1s19` zu2};m$3YImtQwQNyLU-=`Idan)Wxiz=mv9rUaH4#JLFEdf5CZ=^%nBr25*;Ur=A@~Jwmry6v2lQI)Qut2Re zX2L0hug{TW`$OeY7H6Z|m_js61u2753@!CKDJ4@RmR!*FHFsHK2`78%5^h>h_)g{& znj52=si4Q)dq!MStnHDhV<$~=Y&M%Vc*d|;VV~7pc{YCTXH`Mo!lC?MkKQc3eCx*C zN1vnv>Dds#q9Fh>@Y7h!pQ~U11k&B?3!P(ua;x#ZG!$z_l~!erCu}npZcHQo7Oz*V zBZ!YL*}D3l|DfqT|M9R=p>EFOu_F@^TL~6MeF>R@hv(IBxlwkC8Wde05G*3lLO4cA zt{De&OKFResvJsJIHN%-R{fx1zWGkMKA;1a>D;TR-izvWS~*WDMTw;9&Ut%=fXULr zF1zp_NW4{e8(Rk$v6K^LOzpfj&csCa}`zAL`-U-9ez6Tf`5L`&eyBtg_) zCknjm6W?YiwbnXrt!X{eb5qLCPrXJ~^DmCv1|3A^az>uZ7~+AT9|g&S0;VM*tXSlV z?mT7B3iX)xrJ4OSfjOpl9IoGwcaj#8kRk!G=)9N35+vmiS`PY^2w_JkGJM`QRR^{Q zeXU{A!I#jDrrb$0nMV|)<+KR>?rATNqYj$J+&z+h3tHZ5?;6!4jT94|!DPyQi#L6e z-5O=03*%~YWK@%Aj8~UV??1B*ePG{sMz+m@IlQ1XOgY0f3f1=E;EMzEk`<#dkiBj7 EAEV|+qyPW_ diff --git a/client/resources/hardnested_tables/bitflip_1_020_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_020_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7b0d648cb37407765180e0eb54bcf64e19c40ee8 GIT binary patch literal 18953 zcmeHP&1+m$6hHHPc^${e9H9Z@klG=MWU7s}i;9baPY9Z%jka_bqz)RjNgJEC#F%Q~ zB2v+vu3QEbDK1=;ni^Die}F4j($xq>LaB9-v=lA9{?5H`rc=^(lF34>=PllQypMa& z=kK0(?zu1Q9qXQ$S-Lhtv`|f+r+rteSE&|KT*GNVJBcVq{Wa>M&Jy+2s%6?rFljLnEBf7>?6Sfwd>15^b(NOOI4z;u7s)%6!iz^96@gW(s!~Dun0v z;?&v|++1cVpj~^7DT_mmDY8?pCAm7suGbpg-o~c59e3a7Dm{kdQ%pVf3RAc2^763# zld0@Zu$#vt+nBm=y2Ev5?F>^~zkRo3fx4*!EM|noY@WiNI_HZVcRmR^p5`Rn1Qt4( z9zK9$o=wM2Tom>WsvuZs1$0PgCt(VnNXav`UlgYdeiTDVZiE~ zIlRjz*XQjEq-R0QGM+r$WN8bzBw+f*y??Ql8 zz8|8(tsu1%XXMtN0?`LkqQCKN*ylhRu4R6JDz-Yco)Qg0{^I6`G3Eg%p;08lVR0fq8vP_Xk40*UG#R|kl%8sd|V?L2+5CND614}IYW2CZid(sY$^l3 zky{Yw>4lk30Td;lW^3s1-KLi{oK9fQShUg+L3aooLm)*vQs9biMKj{I<+Kk(N&=KXdk0tN zz1Ge#4a4d0Ma`%F$rTUe8w{Xe8F4G7HzR;zGnI}-O^EX5Q8$2Su(bZ6LW3m@mNZz} z;OBw{OMq_u+H3!7PlF|E@Ak2*!P2U1lLkwgS&}@MW|nTtNor>4&iPf%EXkLprpE7+ z)VKyq8Z512YEFYC4VE-mlIdR!mew#Ct-+E8OOSw0!>zrNMyKJ#Wg44K!)eWu)+}kw z62dL5S#lMaKtyCK?_IU0HA`A_`EM6pYGz3@OPX2ofh;P-S{7vKlz;nE{%%@Z3%q3^ zfEIYK_j5smB@LD|SZa3xffjgUh}Qydw>(H!!|7@`T@B|${#AQj4VNy8(E@MShJNj} z|Fx%?CCw~pX2}mQnpx6c2Q+?Cp}!8070~s?xcch=SzIlf{yM-fC;vbG`$U7K|7Ngs Pd>{Vpv=q?eqzmQI%1|NzX~Blpi%Nh_DXA~f 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 Q$K%sckFqjDs^9VcA5+vH@c;k- diff --git a/client/resources/hardnested_tables/bitflip_1_028_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_028_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..e0e9538cab661161322b4540cdd06d7e0012c145 GIT binary patch literal 25815 zcmeI4X>458701sTzZs9?nYqSsiDMExNfTp&vyiZd*8LZo!t+UKR)_77XzZv(lod$8MfPmqPS zd)T(fv_U&V5*bP4WnzCP<#=3>cK%w9x7~vUSuor^m=_a?wRYY7?&1El1O-X-%Czp` zRykrgC+UnxUXC56I>ma71lb@IQ<7|$m#|4D4kq+PpOFMjBqIsZL0yqPiXy?2`l`;* zU0tillpq%+Y2Z#11&=4CE}fRJl*ojVqiqRKrY!g12(w*++%7S#RF%-$w|O|(LXZ(%anA zDA>hkyU$4KRud(c7-?Ch59~TOkkCl0{hg6Ke0kqUTf2$cIw>1*Z{q$%BU9`fT8Qfw z6V-jy$W&`@fWWJabm~*RZlGCiFvk_V)=0rU=U>jq312dD)JA=mHEEehZ*-A?fKzz? zs*cOrf5$Y~545G_jy7#!oe5NAdrjfU4*KlQl|pz?Pg_eEUW)r{%6`j4Cd+F^m*82` z9GJ)`Q`X*UsKBSEb8tygi{j>J5sGtDq2ghf0ofGgO2MI`iBfQ-`F!Ql>*WDidn3%T zHf^FAyi8LoMF$CGO-f5;TzxGy!jpgUW(tFX{V~TW>dLojr7kW19onR|PFm}twF=Ah z-FDdaY|K^tYTtDTv2V#%Il5bd*1?j@>K>Ho^+PQa0CqvL^=B&xDSBhWt`%Wg+5v2+ zh>PT0MRP6MB5~B)YfWM9LMk6gfrL@qL|07*SaXaFJj{Kjk-qEbIbnvRjdBg92=Jut zN}eIVg*a*+I|Hk z>E)i;@MAi6xOjV>7UluIYg7!hTM9d=qPW=xEjfqwsE&TK*4`eAeuVRuK3i^sl8X@~ zqsg75Z9tO4=GqZNMWG^U38O;nSs)YhgeEsbFK`WeD`?pW{uC|G(Ql6%7e$&u;JKru zOCNybAtT2gLvwK}zhrcs@T%+Yqa+N+m)WlMZW)r*OH6E<{pI%+VA|XEkC-tv6Az z4<&~jlNM+eNW3@N=1w$KY9FuaTXXKruy1b`#T?7bTd-jK!kuei5wzR`~|Q z6U@L;NPz@q1Tz|?RWdq^3r%Uo3drAp&6&Zw6KieGI>d3QvpEqRL0@IW8)DXhab>@~ z4oOXm(eWsKUXBhyN?Rcf{jZx{W1WW`=Du;(g1Fi9biG(!7XKZRaW}zjXY@oWaJ@h1zL}T zctE|IX?+h(BW}581IPwzshNoV7KfI%6i#}ru5!bwxIxJfC`o~m94M(G9DMar{w+|Y z2#S@uG}J2fwY;a>aAoZTtWSZ#5bl3W#U2G!#omQ#?nL;Q?&t+5JJp(Yo0n&dH0;Zv zjM7+DXR*-NLo%~!u~01_GxK{i0@Y6i)3s`aNuy?9L|hDM0;)=Qax){wGfH7d1;nTu zYUJsJc3Lz8ZK;gI_d+A@y_k0Wnc8J3e=INU4Vy60E0aI5dnWI#RMA6& zQ*LD|wAVxnM?{}9(tDp0_r{opQn`HS>;4!gw0lTDp-64Cco?GCaA>B^sX&WqJeF=p zS*xRi?Uk$f2ohAU@1+?geCFrn$&D07bb+Nt%VrGmlGqSW>8WMG#>PT`1xBQaWTp_r zO7Ovkt}`%=M!w9mGl0xuL|w7Uc3s2JmP~#N@Lvoxb|dV2olTYS3;1{n3%V%BB%fEk z-%YdUSM~nImq01gwWO0Y31}Vz9O+o^GoI#t_l+SWFgHl*7co`#MAu8yhAneJhH9?` zwF+N@4EiC+h^WHksPNzbh0hcyl*NbJ`Q{(t&)gK1(2Y`W!?6dmYKve%;9S zKO-z6ps}1#*Es)Nh@o*#C(@|~aY_(qf~)YvX&QapYIZk7WlZ^ayb2WY);8B-}HmUs{&+tOpW|_hy0ta=Qg9!i| zF|=VlTGtwRG>Bd_8C zJGW>IE0ZpzTJ6A!4Bn(<_Kd5ox%-N;busb)PQy=d8t^C&T$I8a*hw(7DLG<1Sfrh& z_MI5^u+7H{xGeuc*}vv&vtx(j)1g+U#xft#QLMafPO(GmylXR##7| z%T@Ro8%${{1l(~y#&k`MFA_DYFS64)4H2tm(L`K|icdl?e$WETx9J3i44Tptt8@ji zk=Vr;d6{Q(jU11crK=^!HJN#*u^1ZAsV;)$2s=gr8fM7&$LxWX}?)syC%1o~TUX^OAIQPUG{|%(FSxyEV$G4cXl~ z#)ivi9S79~G7od7%~64j`l}$}fIvnT(>+eP4wwt~>6xjF@u_(I_^cY<%06AKsW9`< z4jxNnrm(Qafs7YiaM7IPK6<$zCgs5Y(_>m#8V^_DvL9peNg~nY?D7mRQhqfHPPK3t zGbp(cw+L}ABK){oU8LV?RKf_Cj&vM*jqV%Mksw@(tP!V>PaKXgAm`OGm3FSIOzcO9 zN6ttE%aW5vGAq#|XR!nTYT^jC#LRybOqHNsS1La$FVZkD3ElMBON!LQE4F3)lOlxM zxky98`cE8jf7%lw?cMTRM|pKG7yT-R-a4NJ@mUaEj`Ud&p9N8)<+C7bd=_M6q047M zT(**F!GfjFg7_?mbL$WO=d&O#Mtz&GgxJ$(LGZ187UXb#S>>}JD3!62sGDOO^uPJB zmCu5df0F2baK%EW|G}02!ByA71sQ!(iO+)gEJ&2pP3?X!h%WZ~ zEXe=sfGnQ{@mUZ(j>MmcRdrB~^e1A~p7wAjTN88f=FK5x5<7VPiCF$bEX~gQ6S4e> zSZD-)BG%1p;r1tDap2cV7~xOEs9zgilm%IPzH45% KcC5T+%YOlrZ%8u$ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 deleted file mode 100644 index 18c04fa4739a7f9220c05a5b4791308e8a916bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6158 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 diff --git a/client/resources/hardnested_tables/bitflip_1_02a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_02a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a1347c78835cdaee13e355497f25ca5f5c0109f4 GIT binary patch literal 41308 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 ZvR&eXIdO2?`D6guyT#}APd<42{|EWNQ8@qr literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 deleted file mode 100644 index 2ecb621b35216213e87ace8d2da09f65d36e9910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2012 zcmZ9L|5HNe5O~>ADFgyZ-XwXrE!je%ri1~xqI^m6dK{3v_t5rkH;B6l zsK~d322!GgK(eDyi!Fj_ft>bW2b!;tQ z(GdY}Kf)|Qe)~^OFyg?Uwzk}{B-)ul5-sArrq~FY<2`5Dep-b2M{wtvh}fMZN9RIp zWyJpz17rSAJ&tJ8b{}bIhhwLs*2I)anGrGzbKkq5G(tx$m2zEgC=W1B{WV ze<3H5b9)jq(3BU9`!wfN-FrZSmj5(e{Eg`EYT^-ixz#5GTC=Wd#w66dZ1HdC0!w2% zmC~2R5@uwjhV_kcmcH)G_?r?JYfLGd@8b%JOY0|eS-#4f^yL4D?5j!R6=N3{H*Sb-fUDH{HXAm0D`VE& zV@nNJ0LFK?*r`v}30Lyxcqgl&W5SdgXfTTo5bMC`m6_vtj#+6*7R6*3Q)#=vD+|!( z;ht4!cToo8x-O~Jdh%IRx7%OOC;C^@*CiAn{*IiP6cv+YSQHr3SH^yr3Km|+HSYD~ z{`!hvZ5YolK7|GkJ?NhX*Tx#ER?%go_62?G@RQ@EB5dZNCg&b>ftfP6zi5`zHn&NB zK2Yk#grje>j+4cnrHz7S&?Gt76>8SZew@=|YxSDiPCS;ITz6`O$ zr+tNS)1%V-lb?jJ*$>%abIzzY=fm>jfrT&%ul0(L{Y1FMreI_GN)EMld27qIn~Eroxyi9IWxI43s?x ze@~_QUS$6~Gq0RQfpH>Io``~dErWW<{7jnZ_J^vAz7Sq+Srw51@z3|42$RWMf93RL zNp2lCzy8IyK9C%-$_RZ}$AwiNZ%|Vpx)1;n7h`$Ye@8=&f;f z@Vv%rlM8j6NY-NpV0w_C(J#lRE6hBsfx`|=lm^=qW@$Ovw9Td0<}GYaE1Tv#fkQ#7 z*av@qTOj_p@YcaqRyg$zV@w57hVs#){lE}o>DuaC%_VEK6FB;D?evk*E(f-AQuRyoxeth$q=ns>qyZzED zg>YK1s41^Mti4(vp89EU1btdDY<^JBJ=$N#YD{C?%5Cyjk`_)4b+%gguuaYuvaK@n zV*zv$&(bT_-p=_=juqIgRAA|mV)EH*_c1qv1g)Yx|DOyEK;3p=24=U^!k^7t!2%NvsZ?vU&g-4 zn_{0x5T#yVs}btwxS0IrPA>68C|+7=h#H;fRl+FrHQ>WLHj1Yytd&Vycrbs#-AT~u zK>zBw)k^0ZM=bSK+dS_O~rN+JPO z{7!_!26B1IQjg1~JdbWe*-|_m)|GM+5Sh1dSKtD9`?$9?p}QLAC16&b8CSaADs^R@ z2^ddyK&_I?AXOndU~=I}~ zM^klJ0;*016H(7wF*^w0daVKBj^i>NO2ZK(MK7l@OA-Ml4BNN}49LoK5CB8-YBW+w zumhedbuSX12+7ng+)`bQ#(dzhEznQnkTfkY#7v7`3hH{{QU6QVn?(&v~7%{XO zM-Z3URiEO}XmvHCyJnayfHU|D{A_T3lmO>dU8oKL?5-(DW4Fqcy@?2no7k%Ba+bqs z0uTezgVN9xkAQyH01BEd{h`^sgXIFECm3SVL4$9JKdFSIN`l5mS@>L}fL3@``HvBS z!N&JY;eH)m9qiKB?SJd7xbXDCeo^)pSx1g+Q Xq}$xb=WRVdmR6#T-uCY=FYo&wFg1+% diff --git a/client/resources/hardnested_tables/bitflip_1_02e_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_02e_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..16254a7e45a0b2cd889d9733998873cec9fd47af GIT binary patch literal 22053 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 deleted file mode 100644 index 083f1f0a58e4f2902e760bbeb89947f979a759e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3614 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 MJ1za)*Z(g5e})KgDF6Tf diff --git a/client/resources/hardnested_tables/bitflip_1_032_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_032_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b3f9ccbfa70b4a081fd7f718e711d7974e484bce GIT binary patch literal 35067 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 deleted file mode 100644 index 7fa414bd8b7405f400b7b4a1ef837582843f6607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1975 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 deleted file mode 100644 index 15f739f1b73f21f7825dee226ce83821a7c83b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmYk4?@tqV0EgQ`D{U{7aLr z_?T!px`8^ny6+xm=s&ys_q;tFirpzIEi)JmW#bcLW3^=lLuh5T0`lJQf8eFm$Z@zC zKVXa?-)#BGW4*+kK)~^nsq27DqPv;A=fIX9)#J=aiDmT%CsVDcr*sC`{O$X0ji9BA zl#b6X-Tr>5;cDma+`tpl0IWZzmDuPGx^rWUnq99SjHS$^Un@7UnqFh&_c-H`N}|Rk z1nD+2ugZZEWCMy;=xi4bBuQiCnZq}I`?<@ebPi98LlgfB#XxqfFj#Gi@DApUQ<=?l zOj+!xh3G;^LSesC9l`1s9fRggh4ipV6QhmJL$jI2i8hlcwN)t_b9k0A75fH4eFIN- z6;In14)3tN7J_LQuqIrB%u+dt$ptg@dGp-Yjt9wp&&)#G+;*dI@tM-o^7fOpo8R3m z=axa?<%d7K+qUMjEUInyEno8$Yrr%@%YT`&KG{o;@^wIR+_5wu>&RAIBpc0~Cfa2S z!3(3$tFEe@h#9*2Tncc;GG#eUWg#7odI^GN@_^2?dgGy-28J>otB|t0Kop_(>9J`* z0vN?e0!BCCc@&TVpzyRb&fRS`+^>}G$_-h+*cjn@5q2^s-FI>~s?rZ_nf=duewiw% z(7}R-${yuS$IITW)cU5Tq>D8SNC# z>MTrl+tCU5CAhgN)?*H~7xq{MiKU#gYg%GOK`k_wJJmuB);LdtbJdUEI4+%Ps{E(= zy81^CKXYsJp!0k@H1*qD(L2X7Ol}%Y}^p0jtip7Pm%#&hrWLOq<&RnhJdvgRdRL(??M| z!sJ)^nA-)|-BckxO44VV!e8kxt8?cZvHWZk^UCwA`tjtlc_y=ar+Sy>ah}24s6%1d zgiC2OyKB{yEhq+1>+a=3Rro#US)xoGImp5~M$*VGJdYrsUeHo?8Y{_r8CV~V9|}hR zeZNZ0ASB|?>4{2xt7 zgxwmB;vAzeqReR-m;^#g(xjzq9%sOyrH5UVtrHs5F{Ms*h7%T~b0uz70R*IzjC>Mo zC4rnIq9qm#!i1%k=CMQW29oH)>J#=dRR^p>p_NQ-++8Wkf^LKtFgi)otPVE-Nps^c zp6qo27SNQ%?#2*Wlv!~_rT@;2`i3Hj0a0|Rg>f`Alr@I^QhTx4!|6nTZ|*#@l9>ya zTfs1Z5f|Z&mTEHFhzlA{C;ch~kiDS{J&dfM eHuhFPfl&cFXz>PRfaCqI&eT!7)p%{>Z0&yx&jaWH diff --git a/client/resources/hardnested_tables/bitflip_1_038_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_038_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7bb6d96485e24b1699a8061d2a6223bf272906d1 GIT binary patch literal 21459 zcmeHPX>4586+Um~&3G~yzhe?RnK-s*zSOi4hN6;^BKMkwNZl;_q7x_F> z$kHmN*N!D;AZk7+zmjRGtu$2$xR~i8efk}!d&Bnj3(H9@+X)fic9e57=ArKL zfMVQ5adg;ir@r)TR0Y9|`O^BJiTY73UoU#zsI!uaR_1#?px8V&mT}5goEekMm(c_ z>~A4@VtbhC@f;`-Pk}v`p|7V^X1}yd`*T@N_XVaAW4ywYT!%t{E-G6%Kez#nHltAr zkc?r%82lvxZGfS$9W+G50Eh^HZM`&nH*=+kVerDG0#I~G~5AnDH;xChH~C2J2P~61_tXI zDL$Y8a#^fsLzUZ@=50zIR9Vc2qSj}I$XgC^{&ToEzhE;Zg&LAopn!3`X!%@8xS&MI ze=F=z8o+#zlK2y-0OKuWdhp&}U;!lYCSYYBVKU+Zm4?yLYlNymF=9S+g;iI;ebpIo zzpN}6I09Z4HN`+v0D$;D$N@FuU1jE!RK;q9j&n^>5M2;N3EDb^kIPN8R_XdJYC{o# z8fpXrp_I6yVC`Bfz3TuN)rc9T`XYxQs2-@XoX2!+H<~`9HrDil=h4s90$o>gph^d` zlBQ*Lp@Dc&Cc(5&FfWL0jO!6=8k(0eg>3%MFvw|>ouC=?_d@3ZHjrCU;OZWs&iA$k z`TN-1tDrkqYc5HyhAw(DnEK}GL^$m=r49qJ(S<0|_CG-PYrzdDo~lHhO7lH!T6Mup zM!_$gI^9zBrt0A;i@^fzmV3}oYes)P3#0?Zu_r(W<^Y3U>$(Eez0PE6y{laYCG9A_ z`8;G%w#=f%D$(jGd_9iLeh)(hIsH*!4R6JdC(-v~BRjFg|nI361}-_V_B4>Uh~MnrOc@&Skq;biWYjGALBhq=4CoAa;Swhlg1e z4JwYI>z2^69DtBMV)_aeT!WN0Nt}Sa?v2AR6k`pz$ebF+f@%iBu6coLXIM^cx9*Y0vZegYX2@e3;}Fo0COF*Hi1Hf38&=PYZ$A^^y~;Q zjwJW`Z00lt=EvYxC&-3ntoRL>+dAGG^_jA;f>l7st#6qC28>t1z>3k1!%&)OrNGNY zF5?LRf>NKcNrI4CfT-y7k3z&Fk_$Z~oY&ti8jSTx1=z}sWu<`GPpO(|Y-cZcg|w{G zQhVJAor9jjVbIlh)x3&nt-iP!jzn1kMuBbW*veX{L6LRgfbaGz)!-cqHN2MRfCXFg zj#3Ac*j@1g-3d19U}K-{VR~p!XwzUgq3dg23r#3%qeG)i$1Ipoj60t9n8{}GS|z3qJfKvm^+)Nnrs-W{6pkV{k zYk)Jb;^IyP91OjBXcu=XGwcPM;o{B`Gs63~B<_5h=~MWEPsTHj@q8S?OprySlKL0I zlgTrYO!p&nBXH@IOykG}xS{?`A@4RZoE z9z-s|E|~7w$L69gHd_#5oPekGP;vZq(@LGw0XA(qm(l(|F_!;Fs~aY?>Ke|w(Z5&N zI1V%{6#N-`&HE73jR**OY!9^-ya?=iAF(J1*GeL{vw6IPc&7c}`WnOr`@!|6uyoZG z1=e0~Fg=4+O&)Tf1*KG!&0Ar~>$00JyIF+nAY#uKPZD{$?54|Z>IV^*-5hP>#br0k zYjc;~wD{2cD|~Y?ha7rrm)&&PO@L#&M%^yE*(*|T*-a6b-IUT7beG+-B)$@ zRejv=BI4rC$@;49vYV%Ax6#-ie_VFcWjDj6v~K5d*-d=;wHH1#yS!ZZtC|Lw|CR+-NaVVi5wOh zd-=Y>?cKx|40mS8of+!W=K?HNn= uACcUDL~{QT2?ugd%YQ_2*-e+-blJ@j3$PlGlbGG?Uv0-DT={KZ9{3-kGjGKJ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 deleted file mode 100644 index 61ef022680304d5eff1863b388b5631e1da6bb29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2736 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 F>c2w&vupqW diff --git a/client/resources/hardnested_tables/bitflip_1_03a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_03a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0f3512d2132780e04976bfa5fba9468ba4b71cdb GIT binary patch literal 29421 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 deleted file mode 100644 index 7dd251575056ef45d9a285da96701d14f2424500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1515 zcma)wTTD|206@zSm~dxtrKL3lM4+|w26}HbfrLj;2SRT^tkB-20s3@?4=HSksD&X| zEbTyS3p7EAIv>KHSsz-BIl}c4_UkL4L})2ye_|>lAxVeniImELzht zzM#dGdx!zr+2+Mr5h6~alvcT+tn`{Rxdgg4SDN*Nxe@%QETj6*0sYQ zfGp#%Ot+js2vqK0so)Nsn+R0g>EFiB^ga62J+_GrFj(rstpZH8&VH?Ln8>XTWCQZV z=Gf#_Bjfjt;niUJt$KOMGkJldVtINrz<*5KZk@sR2d~Y(g>pjFIdxZpn(27eqUhyQ z-Q4Mi!xJr^K$!KX{6VPg;znena#b_UG}~vO&M6C!*Cw*B5#@i`(|`7?4rI}iKW6uo zi0>B{Z6r9bk2MY9QP0k%Oveq0~M_#gnMJd1u0b>f;n318fTmzXBr4cp>C5yyxvOX-{&nyJx3md`igRdT}9ot z!gu&G*5wLAmC30IQ^Xradi6!M!?sTM`^ul>s`--3+XsVq@!I&gU#7UtT0eo1=%U%6 zT>3`$+eVh>94R)ae8*ilkFGsE;X%1$s+9y;M}7KEc$gDGP29wrmpgph=8q3-(|yo; z-ez^60YA4jx|wjjPgn6Fi8fp2d=IhgzV%nZ%E0nj&C8*1es9ea)Sfe*TgZ-i>}31Y zD%_hAqq1ep%>MF03Y#d9A3`=y|9TSYXmVhF0_;yivk0Mj{hMA?rczsHK{Mu0#Y7!> zzTQW1dQjB9O9DZ~lv)V02oxN(QsXWzt(9m}<{)>Q1BJUHy&h4gJ$cfT9X+HA(DrTm z7vKT>@#$KGXPt#sz@rSfPLGt(v{?}fE+`Y%6Lbz#qM;U-b7>cN1z;L)@X`{} zkwo_EtAhzk#CNdpFu2kz{ec($5~K`LZBwQ>L{%dR~j;p-^wK(*L}EESm2*L zVYstpG?e~OScuH#7ZMMsSn8P+Ln-anaE>4$F zi-cpy5dp-G6q5FPKnc%F)OD39bsCsyVOnP?3Rry`B#T{TY91z35WsSnf|RzEbAa1r zLN{>4o=A3sN5(k7QHKkV=%s9s$03o$?k*7l)a+ECLZR45b_k?oFM}c$+d+Upf_QGd zCa=keVO|nqmWn_rPg>Vji(#pQUNs~Zdl}Rs^TmuBpJ_zs@TT&5%vD~n2XVnt*uwN^ zU9guTQ5#{{S%vAeBaShX2SVB5BBBCPfo6Ds0DJdhpj)rVs8dV2j$<0K(ZyoH911G# zLbRAP9Fp{SjAFC8$Jx@~sR7O60lJ>MySUKfq!JjP-_)KYqhND8{}z_)9#Rc%77zBp!kW^alj#%e;C_W&x>;7Vemopzj` bSeH5j2%rnRDpJB$+EiQ3^}T~f&+qvg==-~f diff --git a/client/resources/hardnested_tables/bitflip_1_03e_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_03e_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7d66dd7eb9bb109464bffbe3e4f91fb6034bb271 GIT binary patch literal 16874 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 CPwQ;} literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 deleted file mode 100644 index 87d8693df1453a2c5d4ad7917b0252b1228fc130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu?@T4*^jL0KkKSrY>VjQ{`uTtU$Q5C8xGkN_1x06+)`zybU@P@w<-2mk;k zr9=UsDJdzFBhkJj5>Nb)Njk|DRCP%wVM!)ZNveQVsU*@sNzy?i=P4xAl4?mcNhYL| zAQ>g1StYbfB(W@#(pX7s2^F$SB(g-Ox^<-DnKVkB0KpQ#d8(4)N-ki1q_mG*lO{}> znocUN$udsKJgO_oOo?_0IFJuX1e4l9B*_Gm`5=;FK_tLQ&calH;wqIAxss_Rpou|= zP?da1l9Dha#F52-;GMdSn562J%$Y$aOhyZ{900e*lssKPn01fVxP#_ur zAQ}J@QmAOjpeZR+Pf&iN+7PO_B%KK)$t2Q%jFMQ8DS3z_w32d3G?HYJX(YfcNs?(M zq|#)WOrWKtu_RoLEVS8Bygcr81o<;wte>sdNqKl46xfFcj!efMlvwBZ^fd$V5XFN>%MlqN4(srbSp&3SyrH+>uTc JBn46Y{s4xXro{jN diff --git a/client/resources/hardnested_tables/bitflip_1_040_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_040_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..2d542516abf581ab8171fcecf5bd40d17d1bd607 GIT binary patch literal 15231 zcmeHOu}T9$5S@felpqX(g{a?O>5>@jzu9(QS%<64jVwf!8~pIMiW9MwwLhMfOK@*PwBvw+2}n%t?Z zWNUp{3L8!Mp${2ki+C#UB3wP3CDfXk&`h|$48q+x0ot&(&qQqiT2G;waNh+`7;EFs z3DA1V-;<3dY6H-E3eAN3uH*q)xX0OP<&Wb6Knu{S4&Y21C^TSV>j7GT7N89m&jV-| zk1iq*h3GM&$3-&TokKrDFZ)|hxf({5-=4Pk+r6nAoMHyqklGf7derX8@ zXaQP)Hb^DBor?g_0<-`vKs(AseW%_j3ha>RbTeDi?1d3e+o#kOKMv|ckn%yw2W5;X bV-y6U=1RD^=6Y71mQKu6dict9bc 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 diff --git a/client/resources/hardnested_tables/bitflip_1_042_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_042_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ad1bd544cf04cbe72db5592ba6f3235d1d1d5e2a GIT binary patch literal 41483 zcmeI54Uinwb*N9z^z_co_Vm@?N~_(KcBGYr{#LtdfkBVQbK8K0kmQx2u%iIU5CjsK zMIu543YOI_5Rol->lmEKgo-B*6J8kvau5-sC~I7=UZ4zE%ELHdW530*4aAm#0&FCH z`hDm2%xd&UA}pu;Qax4D&UD|t_uTV;&pG$DJ9TN>iZ#35`dg88e|X2!vS%oEq}ypp)1 z^q~w*9B%e!+MImo6e7v25I5qnOdPLv9dS2vT{30yd~vtSyghX50pV`I%;wv8+@s%Z zM!Z=ja_S&Da%TqE0nB|h>pq{!kCMVneMsB|jOHjP!B+9BGI8g23ECLXWj0*?7bC^k zciR*PC2^Pu@MbMSTIR)Zs54mrBIYRoMuOO%v1jO|7QZBU@qzjzBmS1W&M8w2suq)u zeULG;tMg&5Yfs55_%pSGl9;kSl)r_6jgj0(n8K;Oaa?f%uEzVB)#pu=n**G{UR4y1 z8`L}TT8p5pk+%3JKs3SIn#ot10|lwMi3{=7MoMu^gZ2rt<5=2*kS^O=>8-mUSyT0L zd~LPJZy(J#^Nn=g6-dTJt|GF_dpHZ_nR|0VI)lATJ98P$Hks-eV?w!CN1p3fecDdp z`bJRU(7MTl&U_PQ@1nbYBa`BIJ#%~0M1={3s2SXJ8!;3aay!a20V=n>IEI>&JNUL+ z5ij1kNw@TTJ^1ScriY>Kpl!-U7ZRNcw6l2r0ww#e5@@&uR@>tkN>77t^4oZVr!v~W z)Bk*$B&|TM{k*}QoT<7O&}S1MFIC*adznEf2r%!udDPYh{(iW z=L;zF78Yv=nD zLLuru1`pwCKzbP<;$I_#gW!)Q*P3d6bfK?V5vH8Aifeyq zK*+yC)dYI$SB0?0yB{g`a(<|iIDej6amJos5Dz0|t$_5y$f1+71~sERs`|=ZGLT1H zOOo|wqSD+2s@X#64N6j|>V;KMIRWcSAPz8mxc3cvB{0!PRn4Oz$1sJD%>h0*!D<{- z(6~ijq-K(-SfvB;9s<8TL6xiUuVi{Gy7$j`Y^ZNJEIqb>^H83cHRbjRt}FSzvjh1< zg*}v3za+jd=2fvqcPF;8rEsm}!NEbYf(^;TV2zX3aq17GFcL4*U=zQ}5Wbqq%DlkY_nFo|nb zt}Adj>@!=v%z64B8h4_a2RXf_-c+XcyHnM1gvz4}8Tbk%e4gaI!187&6HP{P!KB@v)qRPzF0uSdv z{yzcan0T6zy#S`BeJ>7?bOJIS74DP&nh7sB(+mfcn#;Li-U*niNv&^>UQ@vtjzCs_zAS{0-L*Is8X7~i#OL_|BMXkFbVQ77C zS_8{s*ucYc#h%KiPo4eP(B|0Po-xa|I5n61!wh)~omBQS&?QLAF1}lDo!_~x-Lh3( z9dWwALMZY5U|rePQ?;`cUy?_gV%%_NIS7IhUOd~cq94V9)rOea%L?FJS|WS};7>d@ z`BP>bZwP3rc3xdE)zo{m1G;}!nfwq9y~C=$19t~97VKYeG);gNRAv++vuupT729S#{*KS?!rksryb4sb@5p%VY5 zFiR!I^kw0pVh&!i$_P5Xpo8tNYw>85T_w6XKf*tOaUB&*GttOswP!GK;^vg&H@bFL zi#|43%G|&Y`s4Y5x&eo{KGKxKy|6^`pW$2RELF_uN8KOL*x>raw<(n>^sau%%t8M&e)luVOtbZ*>`a_&==PiwsL0NoLNl6nfYXjSJiac70C-kM5d9Dq za#*S-eKzHM)>CCO2Tm#iQKGckJ4u`7U0GePvR>c3JncIR$DNWSy)HiR2M%i zGF|k;k5SMu_hwMRn;ZXNO>#hefnoaj*Sv`Kuo_ly5=Q!u6*F=CSw#5~U|q-0gg$G7 z=zy1h0#;a_ugXje?r6Ux9^4$V=&Qcdq*Qx{A@S>FN)Q6rJI3D|o4nAk({KJjocyzk zQD#L#2t1U_gT6M&`PHmmsKPv4q)#FNU}Pm=tp)OXcz7Fs_hIMJlARwl(uL)6_SHa^ zXTfrAj#rkB$I1-q@?aAU)y2@LK}MqnK*?mdTH^7^tHA;@&cvPE(uI~}c-)W5M*isR znic{>PlAVEn{d2x!ABZ(rP`H)t6GMKQ$?4utaQ~*DKmba1tlzWa5-D|Q9lQX#smAq zU^r>YFsSU@B`^yU9|Qj$>8HBeF$0IFWS-K`d#bapYSB4*7Z$Ep#4_>EFkKab3_g71 z=weCo9Xi>}>A^V?D4q^FmXU)9DA94Gu>u-$s1}&b4e_(eyLo&HZK8}jOc+3;7*Q5H zS#V%7ct)IuXwzf;npc$n{*+5E)R+ylH#&9hIc_0z-4D5i*=`Uq^J!;mC@EAq&t(|4iYP(~aDUat^Tw0Hc0h7T4<2UiE680La@H!~8OD0g{(V^bHfZ-b7=NDj)I} z;kW?3@P1z3bg=P|kt^x0eE|&aF#Hx1eGzJOa=oN}X=QQ|#~x`ygt(v|OwZOPZGOB4#7?#RzQ+f_I3 z<6Ju%x_lDJSj68!#Ywz2Kl}y1^aX&VTW1$YzuUMn3k)j;G|a?xu>CrByJ5ySq+9H0 z-L?DFa?nCoPsZa-^sNCfekrQ@m&$VLXgu;942XK?*IFI#2UZ$#gvm;1p8o@;ojT82QdV#~|2uTdp5= z`PELyV(Pi}Pd+jQZaE_0;w=aJgoC(l)1LU>!A|kcIp-N zSMBEpOFFc6ef8Gh`AyT9n*4lhrevk*x#>alZ7|dC!%FgVi0RFiG$7f2!dJSIhm(^qI6lF4$s>}HWNBnw0M^nru!e@n#MdT@ z%3mc|kzg6)c^Ig9@Lvypg=3;0x5B9B<3g&5#zfo+%D(1kaQth&2FJm{9xiXp2GMH% zbOf>{h+ti}r7)~g&=Q26bud)nWjC2{ei3QvWqr36;-e&-TVZ82kZ-F@j*9;kXQ3GM z6(PB@Pb-95q>MPm$bAdxg61|1H-*QHk^8p*@>2~`5dWjjD+Ulaa9mFyaBv#{m0}+p zsqP^HX1_gM^FWzw0dc+~r}2Fa#D$(U9MX1;M$Y9?hVg;86U_Jwl~*C2!P2E3izXx} z9&nUiQHIcn+)Aa>wUGUFyssD4{Q+6(r$qs9|A47C}ca*qX0q_oU>X^3L6~$;V zc-$?#q{~APsFof{`|KucNe`N0-}^=8FfjjiWDX?-ehJGBE2fSemWy(Okb)-13d!Z% zt*(k{Jt(KaA6PEIJ4!*_tIWwCDU{S3ZQ@3v1FcrFiZ+gqh`6!B`4~LdexZ@~7Bcj^ zaQI*l;^bdAnFloWTT1w`TLe*o%7dT4oF$J=v-i;{H)8U~r zR&_ymvP!e8qDk2f#srQXIAdmY$H`RM6wAM(z?mxUDf6MhHZ&z6*U69qiRjZ?HX)`JY$U!JW0tRWkuAsD znWY`-w=C3iK}BvC-=_r8vV=d}+~nP|lFOtAit%ie37X@6wYtd7Zym6UR6qzNK*uYe zA#O5*`G)GI)Z=%Nu0KaosUu58v}I5-@;|M70dVws62b#9bjd6d2a5#&4yT%4W^jnZ z2gc3-dn&{F@$%AyZ&$hurp3zP<^5(3?9ftR1)s!V?o!{D1+&%J=nldTEQuqhBdCru z(Ng>oekS_$xA6I7t91{)VdN|K;D5f0>%kyjMbUoa3Z22%joi7@guQ25ZY-(k*nu;! zG3O3%oTn}fOzqyeR9c2Q?rzQ}g`M0#G;Nfe~xgfJqYj16B1<^l>Lbr5(Uj z6x9toG#T0om9HTpINGh=%z6sK(X10RJqp2(Gc6i)XWAqW=4ART_hFW~_naEY?FI2Y zxt-3sLC8UOZ0Y+XO7DlU4kk+Lfy8F`yD?eX3$V~;#2NF;>KH_BiwWH`3Kil9Dgix7 z%FX)PIJ;#Pa~n}~$ncr){?;IbQU3eAP_;3ID&640f3W_TOyen@?1Y_xF&?^ zI>pjYwad4FS@WnR`UQ@1mV6TwWK41Afc7^{_3=S>oR~Eq&jA-5=rRtn_Wy{W6ihk? z&RVvBVIb038kIQXY?xut$bWkiP|y@d)1UHv8e{?Pd$4%EyD*HX1$Znj0c&Dzs@Ibk zA8`F_goS=Qm}D~g4`wo6)-lis!1OlIVxeB*E0cN~klsPc*8J=_o%Miyx8U} z;(E?vOOL6>%)=Q`lYyLPq9y%vhXw?SEHiT6r9ih~L`BLFTn;jZcq+HAK|Oxh$ggdr z;n?~SQF>2BY1{)!fFm*)P&kgSOeVs&^+Yxl{*fY*dd!Mpzl?`9@4DY!txHsZoF3fMmwxkTykG)n@w zqtRD{wAO3euUv9iK2^aZVo=3vR*zMhrYL4>In^@k9Y~*vh&>@#_=B4jEB13eVZl}t zjyc=TT<=zjEwCb5Y6XJ6dF}3IL2QRDl zsX+(WUbEy4ku)AYB$FEbc^0i6qPurYRGqv-m%ViNXYN}!QzO!ZPdasI0PhWtHcm;WBcINL;zFk%v5%kSNte|C4!2UAtS=K>x;O`&7AiUbd9 z3>&ZD(3o2!>or2Ix%VWtc@KCxv>q_%gq+w&{}Le|F901bY8T4%2*WE+11%ad3y)BW=VMsk5%PB$#=FQ-QW z5+l(##N+wT5#3OODA1s@=vVp1Qu_HglMl7Nu++oyzrEL@GPJ?m2MFuF*$bMH- zW)yPgDK!E5n6bF4lIABW5fCMSAAcgCUe^Ya+jj!@pb9QZVvPRB%=81|XC~it$-kzR zW)~K=s+Gj;Sc4EYqy;E;=t5PUZsZ#D$O$QLv!S?XMKgky`OXR>|7*Idf!w4(b~BX? z-ltU4y^fF`8jmAQ`=za}T%qweTi$j;<8j!d$~wl?#33HD{l6n9gOb07x3bf@{g5d; zP5iwLM$8q40s4rzTNDj^pqSf+g)slEkmxrMYzq8s@I<#jnWt(zK2foMJTbRNR`LYw zeMe6cXd6qt+YOWw5WphhC%4eKPv;*f%4Vv6hnE_FlkcxP-WVHW51-QD*j2Y*(GXv& z95ucsMKuWva0_%1T|_@<29chE9_4S%oKUVnm}e~4*4ztu8l1SGLO6GP3)6ju7z_>O z@Q`)l>ZNc!Tu3w~LNZbc$4b{9wrWfWxM3?WvU48L2y}om)`C8je>7pcYKE~UI-^?) zgB7^w4217H{X|*7ksvkSy{oVnUa^(I-TK%}T^E?>3C-{h0?Q_ttt3z36yXRa#fRvc zhFn^SMRau9B-~a;D?m91d#7r=mF{g4ct%%JAPl=2*b_F@suru`mZ+4wn#?~7=yQ8e zoa%4ZmJvT8z0E`CEvL;dG`^?0Qr(`TmFis?UzM2Q$+Scjqo!0T!)du~@Na)m-NBeW zMjisqi5oW;54l&dcQugiOANZTRNdHTpf3#p3SQ@71;aM8`T?r^s)=GlaX$NhmAU!s zXMj!EGeG)%De_}M(N5GH9{DsVu)Me}sB(!&{fV#k%injm`*qCp@1)xAGS(ae$Efu4 zqx-1zYf3Bq(n`Oy(l4#_JC+BUR{GVpKHP|jOe_6r4qaO5mn9a0GZm$kepx)sw9*e> zHi6cde=^~$Gm1Z&6+>G%5@i9B%3NaO*cO!Y|Q$!iI;5lVH{t85HKzWw_UiY!2_RsH!i9Qhx;=Qs^V zrW=n*I5eiqGhf!DCaPL2UlI)K4@`y%*yymWCac-XPZi6oB8d-jI&3tF*yU3_cWe+Y zHC49rM&v`Z{9KJQCfXrGn~6V65z3&cemSQpV)^#0AmTY8kQ}^gq6f8L>ORf4?jTiP z-#9@gJ<8~2I1({C2$^Sj{xO~>)3TE1HC;^($eGR)ciXT(DGiUjQjR={=0HgVtWHup zRrg}PY~c1juONALRokr?Wm%+EL$#DR86IZ+Ya^G94yr2(A)1UT1G z0Q5U^BzW4V(-m{?OjN5@f6JBB)lig>(K7+cTKS{c@<31lb_}{Abt0lhHWWq zNe(LXwq^n$AOhw#hoee*EOiJ$^%}m}OgeenNg$KdOJdeu3@SR%SmsW8Bm0>ot;6oD zuz7ky0K0eZFKj~m9;gH<9|awk0K+Ofv!yP+@<7lun0vp>J)MOj4~ycC5lRTew5=G)d4$B>E$be=$;?~#B4Fy3`4oNiSj|VdX*tNoPE4|UXVqKFRPRuMb529@r0?gL`B$*F8|sJ&PX_C z3A|RBR0dhjof61@RoONC0ozZFh}3cB-?ehFUTk^HJukO39jvxQcpqi750sFHN0MzX zICuA;8&B-Em#*DmOW^ucLQ$+!ItgwB*2aQMzvNo|5Y@I>)D_D*W6R~LU*wr1YAd5L z+S7x|74Q=ENMpfRQd|jHE=D%4Q*8Xys;G@xR`~{cq9X3!i*B_6wJvF6TH1EW-d@UkaLY|&IB1!4wv2>{2{QQ-qaMCTa&obw+Z&Gpg9@257 zDz#-`%Ir^QB_-8W<1jF6eXc1|$WDD0Rfz0`;qg;Pl&Y=zJO0YbW9dibmCTo2^*gkL zw}kI-EQTt;I>EgFv&I%7C?b>3P1Ju(VSq)}OzW=ZD3{YV*q+SFpmem&JR_A&=;tBj zpID3XS80bB4qIb+?`U@S1rost-QWoVJo!v*WK?Y9?&ii4O8`-CCn^ z;IeD*G*`(Ix*z4pqC%u*ce*KYJVB&xM16-&7ktjo^X&fS-XOY~bn^0~X0V4HIZUsw zq1?q(eXP*GXHPRYv}Kn~lwCfZ39-0CQ_xwU6%&Lt`!|X%r3`cH9<9TQF1NrRL$%{; z!~^gfabj}1gD5Enj2=`$r7nZbGI_Q(K8LZ$O&uDT`RDnU9_9|^_PfA^Wxid-K)zw3 zU6dpug}RgD5xd7i>s^U|dP|yJ*%CzGq!#nw_I^q-51waeqHniog>sgo484mMvzsF+ z(L9yz;O6>4hFv?Kt$LP1xMBOw7NXjQ0^H- z{~K;d&n-;PEo?Mk>A8h$kgn)r?${fo({l?^!Rfh$>Z4xI*$30pa|_dR3m?#^AobSv z2}^*^Ywa|3d;lc1cu+za|^YitiC2q&n=|TB0aZ|Y86&hR08YS(beQ7 zZms-C&n-N%wk|!lFg>?0J-0ADx3FG_o1R;ko?Cd-cZek0B2L%~jG`odm7ZJJ_#Tn; z+`{zS!t~t2^xQ&Tm(1rnO8t*~JF(pt636Meg@uD}DNfHV)Z+5=4aMY9b*pHWAY1x| z;u9TeOy5wPxU994{nIxTr*9}u-%!l9+M$8kVF>9Piqkg~AADEJ@CRMs>*n6{+`{zS zLc4D_J-0ADw=g}oP*rJK>6gBtm{XG|rvBZ&p*TIa@OSqL72RByo?B>-`YD7x-u)c4 zQhzP;{CPV!+De}J1@VGva;S&sxoDxonI4?DkvL0vO@D8=4 z1gJN8aU&O2*>g!$X?}@PY0ePQ_cErhQ4ybt7+wZ#UmMkU`V5Dd*n)CSa%ntxhNDfo zy{aC$q%Zhe%;BJ`l?t_&``I@@Z{Emz;+yqlZcBNV7g+k#V)a6r-~VuAdTwEQZeerjvy{ZqV)S>?CP- zCfim7W5VkeO~MViZCb4$6-?E{k3v@~d6HLKSlu1F>vn+ztDT(=wutpnyX?%Kzw>c^ z&YW}R?0@Z8HL_1FQmV@tn=dhLE&u#veoNk#yboBcO{|_R3`TeBJcGg7(%lU+URo&K z&R{T#&oT0(j1Aok>BS@K^#5QvYTx^v^Hd_ViwU5+ZegUTw%{DBbB@19=ur4@o(*_+ z*DXPT^W-sLb3Oaut;1N~TFVz3mA4-;#)e(5AKSG$t_)!g$JxmfkN+V)(2?rl*qdIw zGz|Xwm)p{tb4g>5E38kXIcNkL`)D}m!kwpLDuBS%Qlms&?-w0O0YWu?ZG%CGf_~@_ zCIS#6s;UtivBC1Fdm|5p;uRdK6VCufHiX;VTVsRJWDs*RIenPXQ2~%%l$^}?^?JRB zKwR~472>_dMBHr9pOPbPls7yMDg^*dbnJ^G8W>UX!E`>Sr@yP7EWX`3eEJ+Vc|!zU43XNff5#dt z2_R)lHA2mqXHMZ;LTmF{i8jm8lOU$uc6ueaP!WzfxJXkR()zVa`pf$3dzPPGZ}-#( z1B3Gqd@I@)AN*bD5|(IxJ1{Z-b!+?f_|lGsu@0Bet`?sNU++jf9mkAkj1=illIlUO zNNtn2sp2Flm$+8dHbf4EXcdw1mu31p%OeXHlFc`U*D3(7Hk#(ZX$TBC`;w-@?>@p0 zpzJ$WwDfL~_;G8fm|?Yrtvwbd?q|Ndgp>GqlTGrV>^|p#WKXIk)wJ~S=$$lIZv}WF zNVibGH2gTvwT%&NE6_KTBso7o69Y4CpRJCo&@@wIL=ypuvhlQO$nUR_F6NH~bzLHj z(SsUaEP76ulZ);5gICrx{tFfjy&J{O79^}{lpsD*Y#Y>+&&(t zl`szlLdo|xJtNLfbbtToH(0dx*ttXd`|f$Y1Uu)y!oG(*!u+mIU%~lf?|#cJKYXee z9c_6v+;MU;xqG8`c+-!*-@XLJ1EIrWqJ^Pjx-8EcoIY=4r7!V|Uv5^I}loVyg3 z!7VX3B0kNr>+FNY(}cO}=snHn4?XZIioCtOFT9$5DE|RlYraWUtg!Uz`Y_?Ai(}h^ zKXW0)*Y(c}A@tHbk05D0g7EalVKk8za60y(t)!%J?p&@{C@M+xeq^F6-^8tCpw7P3 zUc6~_Vq15vwh3+Oih)}mR@S|ABQ2}cSuR)bjI{At#Rz|DdA0hTN;XZur8c*xp{_VI z^=&@cYd50?Hki_7i{N|ek=xJz4bYZ%Zsq9qS&>MDoG?D_-SG3|XG5R3(gioq`*^Oz zq+&N*Pg_6#vG@BIXVG`!a2%n#{y@p}ErD0RDXsQ`<-KJse~FCPDtm0R*F5U8mggf& z$7jEJ|F8F_-<+D8n|r;kq<(9I1Ry-@`vzvKfkTdhmGh1N(l0bBwii|YE$hqXj%x(- z9`&P+!XGs^*xx-F+Fl5K^+x3zcZi?f9)f=|J^u69!qt`ur=a|gL^KvCNZjq61`RuJ z#}!ik$L9l8P0y%)ng00Aum1V8c|iQj-dCd0op-Pc@CCc3L1Mx-O3)hVl)A~rE)TiE z6odxA7SD6;&(1la8C5u(L z-U73%hSD|ENeI5XpLFL#u+9S}P3a*b^QD}YLlb=dhkK7Se%g27!I7&RLcwy`3QoEa zN~=?e%G(FGR?YCWX8nbJQr{XIFyn1#KZW6=AdbOtHbnS|IJ4T>fKY4)7YO=B40Ojrv5n*#O6@kVPS56?3Rs|G5 z4XHBw`j({#elTTwIjqrH2u&<@Y6ewoGKC||igHA&jQ|4Bi^`?Se2_G1N^*ShVvkJ# z4K=h(!OJ~9qnV5#9==a)x>uwbOA_Q1qR&c`SRtgt)jXt?KkVzX*j!Uewy0$aU5+m0 zstC0KK%EhfFqT5;*=h{Y$B*#6K|_8Krk^(3*Bu8MkeJTKuP)NtV@7Cw@x4*C2&G8c z(Hv0W=#cc1kV2GFkTw!9qI0|&7k~u+azm|1;L7=0EkR$v&E@6`sDTh=(p+LHcpgDT z5txcLC;**DAx-mmXf$4{c2W-2{-o1TdZ$hhbA7l2X_MGHMNlb-5a|+aM4CLK*G37i zo`-`ml1I@r2?N4Gdw&n9#whXp2dS)EQhUY~&<~ai!EFuG|<}%=WIg-YbWao^j#}0~C=*c5BgI8%YKYvi0CBrnyRc z8jU7tk3s~+j~0R{Ya=_3bs7WXNGpk6*Z91FSQ-k(5%OX#OSO3)8Y+10P%z^3j-s6n zkY?I+MO@c!(i5}Y;n+5oir-k&@>N;8z>Q}7^skzWtXR-5ANbSa=~5XUaO=|2l@_ap zcE{|CHRR60*}Uq-tnZCb{kJyRhN|epFU3~vih1U`IXg2td$RwRQp diff --git a/client/resources/hardnested_tables/bitflip_1_046_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_046_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..d6bf3244556bd63dd6322fa6fd011c1ad92832ca GIT binary patch literal 24386 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 GZv8u;xz%d` literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 deleted file mode 100644 index b31851187c14f4aa24da5418dd70af61e1c18302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13641 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 diff --git a/client/resources/hardnested_tables/bitflip_1_04a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_04a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..557f84698d53d7ef081b6b5fb3a6f7fc4bacefef GIT binary patch literal 50357 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 Qj_(qUsrm6waw?nu2kM^3G5`Po diff --git a/client/resources/hardnested_tables/bitflip_1_052_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_052_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b5c4b3812dd4bea90bac978dfbace2c385b19048 GIT binary patch literal 28172 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 bOW~=6w3+DlC7w#S3TL8l5w55H*irpoIWI=s literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 deleted file mode 100644 index ca2fe1a7a020fe5c20f77e1a395d16e40e0ce975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1573 zcmZ9L?N1x`0e~G0Huha0#=hgmc&TmP3@38eMVm*U5O+Wfo@p>P*UB5dAFD<`Ou9`L zN;0zA#z*kstVsaXt!TxoW2gmow-4SlTKl*oRa+@W>LglK+tKxdmH7k7SZLnp_`K&| zc%H}d+UQTo3$NBYUj0d%y-;@Vv+?}>=1nfPgvr!}GM_pS56EOwg|cF)^q;c-W9LT2 zsTuvUChCtW&W&c_cTQtB&YdR6Sa`#KqvD*r{^f4t&*e6Fba&wgFIJEh zqZJ{Rf^kE79dU#$2|XNI&6e`G+is}xf1`v5h8UQs_adt@5=$C=1HGSr!K2BfuT z8iVPWtZRQ#J20=tt&N9gVA-&thKkCcLS;iLY>khr$)2xl-ezStY=dAA9i}35D71H> zt#C$0tYii@4PE2u>VNsi%*wB-5Ig_0cmLwSWo#QlQB$~FO}mN55&TL+K`u$9+${>t z9_ZNRND^$9cbNwdW%)H*Cl&8o%7NS+Nc->V#jMw%&@Q!i1#;!zVEsl!60fhB%N2M# z`$)dm-rKIc-Cl4g`zy(b;BqDMrB|U)?RtAUb0tdu7**YOT%$QWThNAl%WPSDAl=nS zf{%zbKits%w?qD*rYs*j>M*irW5bumhUH&x2?xKtbNEvF_hsUgkUL*WU#(eqtX!<( z4tlcJyPiOMDL0Oqro<7n{PkUL8~Y_Sr(H6;H2kgUfZ0kdKByL$F&u41YUGF~Lu3G; zCo;%`g5#zBSi+EVLW@qkC`5KQm*0%m3P~H3b2kU6sQ%lOOP}t>n_5c^kCm}&nd6ra z&l=tjzGXQorR`IZX}K;;*<8qdka9JNQ%P!_Y5y#EP5GCjx4!URY54ph@<{nf{#mL2 zdNRB9`S{($cQyHkm#e=yI`jPApI^Gb(8Rd??uA|O)EBqJ2Wmaf0=H9_F8SiUbKKw1 zTAEr)k<2tEvJ)zhBwZ#T0-MbW zJR}tX1QBh<=3r`ehYXcTEV14dq6R$62$Ko8wE+f@v_A~e`*eoeA*W&Hl`Ewd=DiYa z&=C|?C5EPfusQXyKK-6B~e9gsqM?0L=brh0I-e@}a)x0yoJ#iYqkSw8-)W0FX$@abq} z1Ekwlt)zNObn60^q^Mr;1(8J6Hp^PbRZCA2R-=jyh@{h(CP*8O8#O+H)XK}|{9L?| z7ltfK~KtDz$YhG8d+YP)`{1PIB9(?LpzE>CpIwZcIp)8%&0uU ziSn28pxn)G2Qcdc|Xxiu@@9f4a_ Y+nO=Z^6CEf;@7wAy4utCw0_zD0K{~8y#N3J diff --git a/client/resources/hardnested_tables/bitflip_1_058_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_058_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..88aee3f164be3bc12efa079a1cc6ed35565e312b GIT binary patch literal 24608 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 deleted file mode 100644 index 2771dced1a435e55080a106988b46d78dd04d33f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4469 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 diff --git a/client/resources/hardnested_tables/bitflip_1_05a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_05a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..18eedc09b9634f01be7172c894e73bc61467ea68 GIT binary patch literal 36991 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 hB??rN+@`9bGoE#t0he*w5~SL*-( literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 deleted file mode 100644 index edc274c4bbbbb3830da0840d9bbadeb5297d5d5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1534 zcmY+DZ%iA98O9IeGv~9L@W*!?7Fi7bQ|^3S4n!t4r2&jFU<|Pj8y|>JpCJ=v`@p1C zi@GtLjqQK~9R@o!Q4=`@Gjq7qL_$i{CbKV)7^F$S5~|sU-2au;JPmL&i|_=pOSPsZRG5`Tb+!P87Gp1gp;&My}qy)-TUswCO)2U~!;cL!V5d6XyZL|aLxFi%7rs;5oEm0wd9r4GI|GkP}5~H#TPGI*fOcNnNM6^ zD635RgywL&!$#??x_Efis4FJv@oa~+i}v`2alUbw*TGtfVqF@dN`@2NHv6+Ak0D~Ww3yISO@EhQlg9pC2fI-=nOQQlZsTP%mYl_tSAX!=kMs84T~>W{ zqZNQS0O(8uK!f;c{!4BYc%O>_G&c>`4!)us9J0-;hW?~BOqJ!E=9G$|tg<${-C@2Q zlW=)$gl6N^{26?$9-4`tS8rQPNLmk5RtAM^K3CFF*Mydea!fb!3)Y=-XM&lFvV!bt z9n-@79|3>At8ia6K019j)Gt05_3X8N2g)82`cJj^mZHNxaZ;0ku7r*6J}IX3#X4xS zl~G0YAdA6KlgRE$Y8@;lEFL~dVJa0;+i_Q%epJLOZtzPM4H&c4nFZuEI6iS|bMq&v zk935dSeb1N%o=`4uh|x?SK0iDIq~Kx%}%@Vh7-O= zt=K;(uN~S+>_pesx}?j7r~2^8;jQee-PR}Px-#Fs<(y+BM@3i*SY8^!n*R7g`RnrY zMQ=;MJvB563QwC*If+>qc0l&MneX3HU4St$C4)KFC3vRK=X*jM)B6(IEiuPgthrxw zL7Y0IS?f*V-;fmohO_=dvRw?tETWV*wJQ1+8<5>wb>y5OXMu-x&b&T`jbfjVO6ni& z+kZQTmL_h2eR%&qAHF3r_bSGJBMz@>D*PuN`yBNV&79Vr=@Mh(9Xh+dYItk+XFZru z!)NFrXa@lLbR>w`kyRqHDXs`*ME#$AyoZjSvD8y3K6_D7F(@k(ZadUv4}Mbt*I`ZhAVn F{{lcKP-*}G diff --git a/client/resources/hardnested_tables/bitflip_1_060_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_060_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c440016cf23f99c71624edb9ef92ba445d68954c GIT binary patch literal 18954 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 diff --git a/client/resources/hardnested_tables/bitflip_1_062_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_062_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..de48057f69f1ea736a134507ed258c20b83c46d1 GIT binary patch literal 50633 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 Ov8z`G|0VA`Q~od9;nB1J literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 deleted file mode 100644 index e599d531831036cfff71c167f4e616f70a2fb1c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3290 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 E0pAkN8~^|S diff --git a/client/resources/hardnested_tables/bitflip_1_066_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_066_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..dfd8b4e9e77619edbc87415377f37a02340b6095 GIT binary patch literal 31576 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 deleted file mode 100644 index d52f1573d6d267762a2b234a99f07f885130ae00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3548 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 G|M>qwo+Oe0 diff --git a/client/resources/hardnested_tables/bitflip_1_068_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_068_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8ed807ea3cbd066d121bd52f86e42e412e3593cd GIT binary patch literal 25815 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 La1A~Ei*^46AE$FG literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 deleted file mode 100644 index 05cdc35567db4620c2bc20ecb115b9f5bbc1a92d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7596 zcmXY#`Ck%<`nE00rox(137K}2M4$x0DW}a;OoWnEATwEq#pau4ol0w(EJ}e&Spu3& zMUb@wp;I<3E|8*@ATVij=49Js%Zz#2mzlR8-hbhF?$7-^*R_!;SdGkJK*)@D`I;9I z(u{+g5H&wP_G@B_k{Yogj!KylF=cVYq3CA!={F* zNsE`68XEE=B4RCbrY4(eDG_nhjfavVPBj@eG#@$@Te~5@A;RR6xRJ;E3A@e6yKJI#Ro#~f3lZz&i@BcHYILH;i-uQA} zIEPQYf*bZ*T3w7;YBhGovpno9NB-L6P;O^WeIk1c1XkzHU2&vXn05w6V6wyLAiNF* z4y63_bO`7iVtSXAS$Y@b(=U**2rQ{biw+EC>SxA{!kY3YOd<&rc*@U};6hZc;ob_I zZ6;||9=7MpcFh0UhjQh?F(SRGV9Nd(_85H>5BUQDvkv{9< z(@DK*dmhN?a&qw2Q?r(4c4F{YoK6Qf9xu}3+;CeqUsc@bUuim*!ml-f%nhyPLm1ju zR%l&-x$(weF|*Fr)X{8(lBZhMWCSet^;sH&ZQgRtZTg!c5EDSA#MI2JUkC z+``#=8@mA}pY%60s;4hjL#9ekF|EpzQ4ag2m$~Uj3w~l&^JrLOl*v>4ltF9it{*(f zhSaDR7i*(7ikf*+2=$bQ$1G@CIJexAaz44{t-z6*Ht%mR?)iwD-^IW2k5cGAK6bI? z+{p(gKmVVwg7aJ9CJ%4E@uve1X0(S0U{e=aFfK+wt>4T{RBN;fmL0#BmbjC&?(srL z88hn%T4z+4xeFM07(`zixFO6W^{k@Vs~AMJ#ff4Nh&Cx;-Ae;n$fl#I)tL#TR{U3M zNf!Mx4nW(e@!I+i_)a}FN7V`%QKVo&9HV9O&y5d{?kDFK)0#IMi(PU5Q`3+A`r^TN z))!ZE971N$JcL`#;`T8zpRn%@?p8V9y?wcVzp~O44EkdpixMZyYor;ak*C)2eYfLb_tFxitr zauXktI*{}0F8gEy3^=X%hVq&Le%OJB*4dXiFSde{J+P_Ge!A*mUSeVZHrc*xztV~; z19Neo7q7qj>HQk>%0Gra{N0}3USC8$v8rNIMQcC4@Ag{J&Dpwypn1IcpGQABP9}X& z?QasOPx)qIp_PHcydI`%;=t?I>Fxu!-Ts>^m;Y7?{C>Rn@!H!tdfx@z$N2}#N$Wzi zd|bc^1w;t*GFZ3{x>J!0prCUT4|5@;6d1+0%uR9SMNqBJeF%Cy3*5mWij!$9O0T6a zJ9Wy4ltXf+XqkXkIe##03b=s|F+hx=ciRv3!%_C);pjN6V1!`S4G_*?4DJ#>Xjyu` zW$+4xCXfP8^~Kp^=-Or_s}}bSz$hVY)PI zm(SNBV(U^uay;CP>ZpP?@R6KMJbVaCGol8>@!+t_mH5UQ$H4bxyxG);ZcFh6)l4|h zO}$exq5xfN4kNYAkLQMVOk3uA9_;Uxg?O9{d1?$K6YbiQN_jwnFS*|&G;(5uS}V=s zkw&LDS!y=AdngX&8;b1}d6+CzxUo@bJYy=g;qmzNkA=kMs2^P+Saosja%Y+CYP>4hb93`lrl8>Yh}jRKsoUFP8n;AU$oRl8{* z5>+?SP#TrwPbs_9T4p6|h8VNEvc?q2T`|#k7ek1AqUgz8L;IzftMMWwWB^z~S-=b@ zAZSj8MCg{7`q8(j-vFgn+yg*)yQ`~OJYABIDY1zWU8F8*NKS834)WM;#55v@45OXj zys9lV;k@H?3Xju5^&&M-pT$s3L#g=imyHND42FVugKN}VZndn4-_2vr4{+?_D8P#E z+Vx}!s=d_93YMB>#(0{2-ZavF11(Y+x*tD(M100wf*JU^qh*(+AJ7pVC?0FsijfP# z3s&FCydrwM!Z8Fx7XGmuT|TPnEPtfZgTGBZJL}o5t=0WwyKiRns)C{Q~1O>MS>sFNm55$=Vs(B}b?X8kDJD%AB+4|6CW?<~rx`K%?rZ9LS7^Q221RObVl^ zs&HJ8st!)ZA8A$I$XQx&1K2D=OlKeKh}6#wyfnIv;IPnkNqG;XR=~6OOS6k+FMTq> z!b&#=oUf2YGdgmjQGS^-093D0&kZ8563X70BLQvkS(p`zUl_Od$Q$aTS_#wXEu=9@ z^QL=xi@b~CD%3OMnizQ$knKytfHZl+os+X)uc;j)_2}~Q(X`q7o-g`?eHn0dwE4Lg zOb-V1fA7(rZ^dIoVtOihUeg%1({GU8ess>dsBLZB3ugVqz0OMLjeS}FEj#!7S;|Wx z(3TuP)17>yK^g@c5z1PFA*RNU*M!|NUR9vLXsGI%h+gh`w6jb*D~})|TL!RO-0`QW zeu=pb*)TC`kl6tM>S$5+HjtmE>e zq2>PV8=tP+2SQ@TIe=s4h1JjN=PX+CDo~l_@j^Yk@xyNpub*+J)605aq_*k4^k%1n z%kJ*(9%NM}Zs#Pd`}N`H`W5z-9oA9j~HIzG*odw*M^-;Uoh|L6HwJj%SjYHnXlJdMstzW$(Kd{|Ys zX!OImcHifrxBC}@ipR&_=IH&SH-B5ZWW2z46S8jm>^+rNPyRCHpIB-`?S~}`sE{QS z8ncRpL|s_S&Uu0|uv7`~i#n&z)iZ<-w0hL2ppZOxeXdZ84l{u)ZWtAU2YX?dL{1b4 zjzEcV7!1K?(-@Z+kVa$d2t!&1Xt^mG9Ybg~1s9HQ=@kplM3X{bUe8M~wh=8eV&ScqvhVY%mLGFg z7;dgeP0ukHa*qdAa)3zwoGKum99?j8AESIF#BC_ey$4(y2nd4IF+|+MEi>-79HqaT z+;Tx+Am6K#RRc0CmIEE^K1y32Ax?qo-kg7|b=tBqvZ~tDi#n~M>?OcZAWdYxBT3X- zdz3wd?itJ#qR`Z)uLD84F!m)0n@`TBbS4cFm6@^VhEbz2@odD?WDnka%J>@KH1HB| zi((boa57G!YV4qz1`A`%t9|ms9E?Rv$0{Kd+{xrq*X92@iYNt(~q;M?6s} z@}N*(KccOid?_zK1iFlp!45xtn3HciYNngVH@s06{FN{gND0f)`~fV4y}ob{{9O0V zsI3bRrmi=Kj=f#I*81_>9Xq*h-EnH=ErZ<%gkNYJ(!WPf2wxuT|B(6uJ@jHx>^kbp zJaR$r=bSgZz2|n3KB|_tKeP#k0HA&j*6G!!h_SSTEsKt|dgyDFTZ9z@Sk9e`9e+Of zz2f@nl@m3gmHQ6tLDhfY>&HJsw%od&I|MNgy{aEPz&V{5Jfhn`+qT+R(do-@C524~VXg zj_dRZ^I&ff^B&a4KRaD&c-`l*7jpJo8VeQLo{#<1wfO`XbimsDiycYV@eyz_-v53x z*3J~Mz3^133)I~!#hSW3deFX1!;7Ohp^CQSlaHTUDj#Wl4>rDEz z3_p!%tbVZ&gdd!kR((92$n9pv!w5(nKc2~C9T&JH)&4}^l0i8f)fxhsdOT9#jB)97 z#nP^B9<#mrK6G^1=Zu9}6Z(g)V`SxO0u2Svex=TB@xS`8#Xe@8cjEvy8gvY>fCg#3 zSy8b+`wj0PuItHx+!HGk%{7-%o!)ry8)a~f-pxH4q@4w+EK<$$;!8w0E7{VqfOtnW&E zbR^Iti!w0syO=B~!)Q&EpuZe_n|JR6QcK-7^@am-!>B2f~R zH+dMW5}MU?Bv+`G!WCGWivU*B86bo(p5Zn~qG5ck70OfbQ-Pk=kv4F)kops?Nu~kc zVbX9Kx)8!EL1FYv`WM=BdhLW{UuPHy&S-4r{UiZ`T17Ifje}&#@hO8GJW?j2JHfV2 zFOpR&-x@;(Bi+cKR4RFi(di8P1CY7}GpwdOV$3pZgLHDQ`m1zXt&}A20Nelu3XJx# z9fc&vOl8k~G)zYkO58TM&I-`RqcBAAgm)`WbYgJtRgBsPlXKEw?+`H8!i{tHj_dDYd0 z)nz9r4_BeGMwz}LI!(pxHKN>0B%q#757=NrBMCwUMI<7?V!-k2emRjI1moxW8~~ih zAk+hdl!Z%mO9FK65UJ}c&Kx;FfR3it(4FSvJ&IZ+o7d1aGx;p3t~{2vfqDF)E0KjI zfmDnBLMG#X(cAf?5g3T^>_lpEcfh^7I@Hg)Ie+J41e%l7FXN_oOM9LSVd#CU3ps%C zYn4S(Q6FuZx%tY!BY)8T_B8!_0;=5iNDt~$nQQF?uI3UOHHZ$Z9y*(-Ul2Tj9s;v5 z(6!1pEyu@&MjgFCKmYL$%U3-rm5B=CQMWLq+7qi*4KR>uO`vO99t_>x1wO&S%zyfb z?pZD4DLQ+~i`YAI`I&e?kdx(_dpWtBR|UjadR6JGX-!YcFL~mgxakw8o-swNqjKz* z?{@){JCK6pG$D5*Wk_i}7O4%+X$oNt7CK=QUDXG=_b3d$ydWnkZt`4;@d;JEAA!5MjS|r2*n;3 zmrNOkYzRfi$2MjxCP^|kOr5NR8cmZnSnwh{tYoq(1Asyg;bjo)^oA5xtx?Bip;8Ew zs=ip1p@iwRhXsJ?YboZ)%ngH+6q)!K63Hl^J~pR;D_BEpAmOsA^2s^6+9QIsnQx~~ zU+2uAt_$Im*C%FBe=KaKyqZ$E{V^~ai#>e3r1{`ogm!k`oc(6C>=;(f$YC;5_9UIe z`8U&7#(MTCl)<{E>gaE_ezO(iM@1pb%F|X3KiqG6sM&_o6uH$lJRq#AyUY|!%$u_i z%EQ!n1U*ijsr$m*op1%QN7TA%z8xoUmd?yJ<{E9h&7>zSCirRHU5xS9C7#elzA=9C zgfVfx%o(TK5OmEbmbr#70` zqg!=aekSMWtU3E&i$i)00nhL&a*zILc&=Y8f?Al-P%hr-g=-w5R|Us+(ps`sO2|xp z+P|B`TT8!5%g&+}efs}~E1LElD${+RAMox-XSI@*_twAqGDPGWpH zQMKymLF__DujRZPEO^rS9EG%=#v>B-P>-1BWHfcbb@rzO7m{H2;A68)v2#QUg$dU(gR%+sZOjJRxf;eG_ zj|sNd2ByDH+6>)HMPzY{5#$aGZ53bv%OEjT{Y5(z2)JwsUvyA)vqwrAmuIbp2vI#@piZCGg-q$WGpymqu=vYNjuJb!4J(82rF?$Iwk){S3F*Kz z@)452#ls_Ri7zHu>2=kyNAma%dVfef-Nw&D%Y~dMC-10{02<(95HuG?qP1&KIq$Is zJ(GK#nl|7H1GOS!@s;Q^Bn~jB^QNMI?i9LLrF_u_-c+g@gKUFq87<{)l*dYL5zrJM z=~L5`PM%Vo$0zQn)0Vh=ZLkEmn3k8uGwTFy`J6sl42RQ2d-gA4$w(Cp0LF{2hmKtpnT5H29okLJ$t{xt8*!CqDO@dItagoQ09_t_VB4t-rt7`iat*Q84Mx!>@ zB|XY^p&ohXD=6W(I(mA8_euRV&$f$fEuS>+D-8iO&(fp-eA!YIJ`+z=fB@71}ca< z#3X@GZ`*>AAHox@Lnx% z?=MpG7r3*g-W%4|T_hV@y2R7A$R1t|aW62QttzTkZynY6Ua!o%^D_U#?DN(!@(T8c zr4@D82-?b%1R7IKWAN1Q;DPA}?tFjiAY%QQ?czI?qh6!vXXKfJ`u|=zIj?E`hJXIO za%lhA)!P>7R;gaT7JU5l`{^#g{@v?tJ8oO&e!BU`bi*s??t&`Fn`5v{sIpIZ^j`S_ zW=Mg&-!uE6?YjRRXZ+wF>t|KYb|)STg6qy5jX5;@L#y;}9f){8p6&f^S4n>0PWwjETX+{Q_mi4|i;6O3s)5bA&&f-`cK)u}g1i8QU- zsCC_?)tv=*WhP1~?kH`Y*JwF0>=w$=9<|7h=C>K%FM0Cr81Y(U_Ztk+Y$jzN5<+Y^SHlcr9U7s!W;AYWPH*sMhluUo0$pCK4xt5*s_9HG2qeZRrqI&> z`EUnnaLd%Zd@Dtgfv)M4<$d+M-7GQ!@tgiTW5i&=L!Sfm5ETJkW^QB`)re5(r`3f; z3o^TM>X2gS{e^L>0Y(SgBZecQa3fzm4UNv1*zu*3S+u%tHyL=WJ?6LE&z84_Gt53r z@xk}QsK4Kod2g@Z{^`nk>FF!)uKy(5d5%kYUB(|E&`x{*Sb4QRb#$Wt{lX{jiXQ#@ z<@dvukI5G{LxeW(#Z=nxgFhE4*H$?GTDx7jsM(s(H9iu2HNgFNwWaOJW9{l!703P{ zKmRyQZCq5~fBk*v$s29u@@KKLbxoSNJ`6h`76e0Y9uE8ij8{rbo2 z2S49D^KqJIi|5%2)xe&Ucjw&U?@QIypFA-B?z-gauN`Jd*{Aq*E$XYg|ATtQ{IBs} z+h#F_!#Nnw+u#eC(U@IyjnXgVo&ook@IyR#5$VALEU&fyS~SKktcNF+>2N9b44Q4K zM3pzPF;J?lxBx!6blf*g1{rPOexWQZCQhu6ft+c0qf z`dYZH=iw03p7}pa{QG}yKKXorU;pcWtAQ#er#>tQ0cS2g7VPjCTwPY z#SF!=OWgn-IT~q8BhMYm8bE(Z&XmylrWsES^!&jpO3lQkUm8WYi8@rCVgKYc4KHPy z>~_nfZB*jZSX&J%Gg;8X$?~iz~(3 z_-0Fh7D~l3;Kg@*!_Y)184_S>Ih281l22dK3~ggFV+rK6RHQzOXIBqx?9uq{LTu7p zO^Fy3AfgrMyEwWb4S`7o^ra&3=n`)eS4SFXi%Zi&h0YSrQPzsdkEqAxP+A?xsMaZW z5si=#O~{j7bb6#mQ%>Ml`K-3PES;vmEqaFUqBhEAr2jfew0Q_X=YunuGzkS`>pepf zIVoDm4xq4PKwOxfJwO99-JFdb>ZEdgvLs`t;!5 zZFF8HYX^snm!ZYLu)oILj$&-uY7nF+9(=VT@SGV2xZU;Z!n(B`q3Dv51N2ha8?NE^b?ZBW_#m{eTZYexl bKu8CEM=&zo)_q9Q2a8An|Fko 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 deleted file mode 100644 index f1087952d9fb6fd1c4a10a676f346e18b3cdd1b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1976 zcmZvZTTohw0fu!=NK_V46wm1}nnbzD8Q~muI?%y2QKM0*t``(K)NnhP%ye2HFHB;h zD*-PsC?W{E>E^1t8m9t%(N0$7b_9--ZIao}w%cyOOJa613E4VvlWMlx%VYnSZ|0l% zp8lF&oD;&QWQ-2kp^s-cjXJi~A6O)wcjQ{TP z|M(v$9@T%Ogb~HD^OkqtJ3m9AFy0|}{;#ALo_qJ-NqbXc#;K}?xr^tke*WIq?N_R| za&mt7@*U1m)9acEkBHTN-Ja8&EX};!07P}G(H1#s^9bgN%{!m1zP&Yn=W-2Nd^_7o zt%vK2luV!fjB+He0Ib*=S}N$i)otb~86>!i6}*aN?!2YSPuv5fep{#B3UEe7g{phi z__LQ6WfcjG+c0w>Xxgv-dLr$Y^^El{;cr$RUE8mox;MFE;Lg#_GFHFKxT1VBBSy!y zkW4%S1^g~AJQ+_6eQD#fCw65cUOqvq4Qcw1jsB6&$UQuEUiigli}fAUhu$WJrwHMow{?$_UR&C5_{G3 zI(wq(iSOEM>EXJCf@{E77FD5BY$#F#DQhl;{)Y2x84vc?QoizG%%Sy-F$13NcZBv< zoL}{I92xt=)|0>O^{dXd_tisgaqV}MXOdJgSgzs)CmTjXzEE^1sL@~PeJo$Dg_JuQ z)vNbSxsSLvuXlc-n%!$(RzZxW#60Uw+4E(bN`E%pheOESKOzyYRLi!~kp#|m2#}i} zzAoIVSdJbk7qUgg*%N!W!Vz>-MAyCK7TkV#=VF!vtc#!CW33L2T%u*~e_voa_`dx* z89e?htB}?dZ=q{O_uNFp)6~%G+4zP-Q6!4s^UD_sp8i6Kt0sf z`kqqfZtr@{>s+F0+UCLk!8oQL+$+rrhc^~(yi8dmh9!0Ie(&O2-1==5jfUJK67zDu zSr~jJ(=s2F*7TXay_`4O*P5JLnGI8lZ2kKBiiOxZ+ue?R5U%hX8C0`Xa~q!vmWoNa zW)9IDEiT}uDgu+D5(Ys`1f~;y3k3B4tkf=!<(v_n7fQlpyV(hSPBue=xGxb zF4&dc#4nDiYjSwDxl6Dz|KS`;Yo~&%+O+=0$7{jgn=!n!wcuONhcR2 zE;la*O~J5aa$C)clgQyLBH-c003T0j$+w9?aAKaOf?c}i0^VxS;cj47$N|G@WRotF z%k)!hL{?Twl;!9< zPPg5{cA$_}W(eX$L7T}FhCm*wf$lQIK2+&hpZBYzanz&y;gCTjV{g+6i8-*koBM40XHExAn#cCQJ|imGKbTh#+OJa zy;fOL2w#0-(@}(}`}*XxQJ~Amn09?_m;mK|A`<0@^zQ2YU&aelH75&xJuUbb0FhJ) diff --git a/client/resources/hardnested_tables/bitflip_1_06e_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_06e_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..6adc3eead5fa3153b2f08147331e417dbabd1eae GIT binary patch literal 23053 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 deleted file mode 100644 index 138c17c0f691eb84a5ab05462b1596a3c31e76de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4289 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 diff --git a/client/resources/hardnested_tables/bitflip_1_072_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_072_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8b29914469bd4a509cfb4a606d5f9b5656637913 GIT binary patch literal 36987 zcmeI53v`s_nSj54=AX%AGV_0dB;-cOAVfk#AQnQxQe?ca#Vb*ksukNPqCkyc(Ry3t zW0gv)w6&*NwOX_5Y1LM`c8gu0U7emiu2gNotyr{P(9>3IMblDSDw2Pn_xopZfpD?f zJ>9eaoRiGVfBC-m{=VP)zW+DwQKwa1xNPI1FDZ5FOK-oXdi_UU_8qly-`;(DmEuz( zl2K*733YT&PmMZy=9a9Qv~TaRDwZ0qB1YBrW|cOoSv$&^G;@nlj#iHE|EZ#v?`vy~ zDpA4h+@ze=NJ4o=aY=>Fs#JyqyCy0_J`|10cX#@L@x6x_-}U`{T)j=Jv_GP{x2HIjQE_g_ zsp!~!d)GJs5_LbXysS()Ih9qM=f74Sqm?F-rD_78rvR>5tJLZgaGFRur4nwH(pg9D z72KlN#t{uhK4y;@cIzXYg?crGdsXO-rgf2md(-yfz`O+~y#CAU`UtXHBw8V4i_>>$lPpQ)N;r0(R>S?Vsa%T7#&POe zPkGQN4T{Y=8@-o-AbOO$>ij=4!EVnawJ8RSRJB&cH*u&Q=&HG$YZ`rj8l>OFCkBo! zhGc#zr%wSzpI2I|w93j^ULZeZo>sMtRsMDg@|UU-F9C%n zHV7BAYL}~CVb)r$s>kH%lJfmpC|csZT4{;oe;-UBA4sV>jxbfZ-wtsBECWhaGDs{^ zrQDP{xrbL)!S8rRjqT|%BJ8u(gq|MZvnrbC`!K+$R=$X+^Pkz%DMv(SlJ6_Hidukw zkyQk!6^Tvi=~0mtT<3cb?=-C{o9q3A8sRPD=2($-2d<*2|nGi)qzN zE`dP9n!TMMUUjZ#BD{fb9I7OQL^I%21Ud@0L@XKP*k&eL4tcpI=KD*TdoNs`rne@` zICHJnjjlK)0&oP0RLvqX+Zn%MI)id^>O2`7d3WbB!sC1qg`2Kh6!*t=p%;6h;*}z} zS~X8%R!|rYbrb#`z!Qpo6@i!`Nc+Cgs+ED`+?#;<0y#>)k~^kDN3e6CPL+>tryjGq z>IMXL$m zF1Qv%)c3bT*jBFtu#k8Ax=IH3{muXtf0f%^jtH0wo0#01JM?$G+o(R&({por_{}O~l{CeWM}k^*TFg7IRdH z9AwnFS~azD82VoFHJ$r<1%v^UrCr`urFW~x?FV@7hcaLZ$p0L%mMaKG5=cu zIsBNA_Ib;CELC|75Pzjj=`NjdN>V$@wW=7$xc34Acd90@Q|WFH$!)j{69Z&-HhZ}^ zO5rJt+U9l4gLaJs^wf_;?$GF?x9Hp`@F?YAW?P<<6NH_O{#fkDzXRx)xWd9TRBH9? z^}4%gjF8ZSOr^}=u11cIldI9OjNDhwku)RT$rUvavIXCy)sBT&Eab1sZx?ry;Uv}w zhXA(q40V0#OJ{0zQkl2&I9;V;Nfm+r9V+l~?V{zP6-Z14TH!EktXWv5MxfmsEvmId zLO;$pkMoZ~l?JUknW2OkTxPgrX&_rJr=Js_R)c9Q)(KUiJ78#wY7;$a;VYbpYcq;D z#6+Z4iv$Urqna5NVZXQw+O1`n7*K%6BKa|(+Imd z!NX|v1b1au52YPHWt2K34FHM}jjSl$6!;}K`tn6I1s!`yMu4Q^EimAS)NrIp$n*u_ zP`ujPDabNR0^H-s6`(NVKk`?5hE@h4JzK1yk#YBb#q_e{%TlEZ3PttSp=i zsUtu{8DTT}G8+&#HSi84Hb1P@eE&AVoMBHFnhY?ffH|M3qw^q{jNqlY5YB7{x`c?2 zAP8O}KsfiDr@O_{@0bQ+6>>?zOfJ%n+8P6VKSevy>#}5;FUB|rlA*N%nb6_rZuD7y( zZWxX2yb@=z^^<l7ue!Tj{q_+XdB?f9KL`yDlB8-44M0jLt;U|^rIJrVlZ~SP=MQV zuM4M7hUHp5i0o~8P8jL?2xi28X%H$iJaw#fRZpWdrGC4&RYIy;wc09Uj%3Wb!%%R9 zR;NxUy37Z?-Tuw)8Xr2QaU5cFy8R!*iqm1mQOUGI($u_IqMAu?C{v?cd-j=-TaX)@p`r`7lUUn4xN5FLo_d<+fMT#x0;_1}Wz1A2pyb%*~(AmM_GvB;ZrUTP8mkD&%7 z5!&0_*=M>N&h&C;!j%&2d^(j84{q->rBSi8rKq4Kj!062@KDj z>6wosVjJP$H?&E~eX1f25UpIy4WFDzBq<9Rku#?O{q?7E<_c`tudI1@cN9VIBE875 z79Q8my2=@c!d`&^h&9gKvMiR&NOYPdZdHjJaqu``=V4)K!P4V$;|na0A#B0Qzu?xu zu*q9Q4Vl~>jeF!yC04PqE7d+un`0&u07x9N_4yJnhh=DN6CY-3r=hA)e98)mBg`+3 z(L2Z6aAnFq99+!poM6{RdbC6!mOz2WSEZmF-z`y5A=r;JVDO=uLjZ&8O5g=L91L1? zF=(F#NDmM}90NkPi0k;H`w2pq4@*#n%Yn}yVZwBbQ!^(iWzr{k<~6=ldmG?7$JW+D z+cloT)wx7Rgp#V1!DC{>{{eBaD-{GU$q=rv!W5swr(H6aUk5~Ug&@9|vcwq{&;pBZ zO6B&tJDvo{bK^P1GS^)efe&%u&#LJ<_bzz<1h8i@fCOX3UKO!T6a+`Yexh1mJ%qcliB;#a(NFq0vX=9Hv5E?GAT1t2|l7sbFU?&f#r-)NyGvgN#J4LU6 z1%HwSp>oiAmKP?{R?pf6(^Mq(DYK9OVHU{vqY#GQ+Snw*l}X>fNu*<^HYc+lRFC6m z2x{iGfk77l_-IJ|EkKJkxw3wDvZGRTVN6IX_^q zINBWE#l#WhU^SB?n#mH9nkabKm5fn)gMp$ey|a_7m4M!oaI}!nZD&jtF~)0#5b!cs z#6XBX3NcXM;ssOCvcRsWhT~8Ao${4hEr!bmz7BldhCZOPrD_-;>=$Y^*_d}G{}nnUhBW+&+C4FoDb2dHc_R z*Rq69D1k!gdj*_o=%=-y{uz{LE~EaKOHhf+IV4tqe^qR(&2WV0YY$x++@Rn~5ef*2lG= z!b=4&`1F-}aowykrgkBv{I&10ZUZeY^`FIA`g`nBiVTa2!tdFB#!7hB|4jhu_8?g3 z(aXwhC`ib#!P`(C2vb?!oYr8$M%HO{^7TX=4U7VVmRxNIns0eKzmf}1K(?L}c^L_Y z;?p_=0=sUE!4R9BX+*(Fv4KzP+~tV02geqHX(zPuxtF+5b=QNH!i zstSoN--m#~)b!EX96vS?b~r9N6Y)R7y~Im*Es$8xsADie{aGPEbqe-Cb^kMiR&oSo zkj&L>*tM@BTwh;>ss{#TjJ5dD%Vc?;z|7~IR^FFdQ*eqk(<*Vkm;@r9i?!;KSWnjA zvC33V-XK*RH7lRROzW5lkG8bVy4FY&naWhwiL37Z&>wCSh-HK$nw8rYap}mmEO1SE zJ(#RRxF54r62HG-fc>?!Zj?KD-4Li(XFwW%l~%t-1)r<;)U%MJf-rsz7#hn%2&Z}U*%_OL(Oqup>znYthC3eCiFTxwb3cRz!I}V5xhnk3rHe(C7l%=|h zyv`>P(|MkH5)e_%>uz*=Kr{9;)$9*h%5(LkHDkO5QaHi z_wCadOH^H`R4ualUxJNa=XDdwltY;jKwJe%89(lk0LiEmv?+sqFg`}Q^Kd)*9IyA9wgk{JSz zMjR*3;Jz;J{8GL0*%{}b=$MrWXn9(XrxHs6nuwHh9oum9R$rPR?A0_4+7@d*ch@Q z5+~byqPYH3P`^XO#yU4r4+xAA^ij=&0%L710?hXk6Q?@I3Wvpz<5FZ{l;v-N^~Uft zE8Mm(QXffV)}}pn;pY$qxoKe5W5}SA<-1TqR*C5-_87Tr z{};m1L0E6ZfX}5)klU~jKXyevu`!7S&<_rt*f0u6No?$l%#%O?=k7sdabCi?e(+ag zZy+YY6Dn%FS~016gx$P`%xJI*Il467BCA8IAT@{%1)rUw;lo5c`*IuOk^5Ci<$CC7 ziz{h#j7ZFN2+Q5THO@vFLnl1U zC%|ehf2HEeFGZ7WvICzH#G6N$7KrUQ9FWe%1Y@rCa!;Rr&I7qc7W zD?POcTH!tO>a{`${)|N$p-rA--SqvCmOI=wrh1KYh+Y2j&*k|I!AM{7{|#t6R7~Ni z8C*iRHDf?n@tjuLKdP_(6ql+KzHPtS2Mj8T5hyQAW(WaNq8U^^S({3no?2bsn~iul zshld3>SltlKAOl~47k)mh)T1nmWxUMd!=!f*(?pHo|LL;TXBkx_DCieH6C%EMiw#c zb;8QSl~i)#8T(5rvYtg+6Wn>wvdZ9)BZ;pnLmVm)wxgi}Is-25C!ueD0V|+=A@U%2 z5Z~I#WxPq`aXW<|YAagZdaqEQ1m>L!wYdZ1_bpW7P?eJPFluGYEj5sS;=a8t2&gj| z=`zuv@PdS~@Y+F80@?av26YsCA3YiUSu(Ju?*k8#uC}5)fh|y)k5X0v#b0H92IFJweWgI?BXz!N9(AhA#^s)AMdhO zF9x}&CyT}FOIZ#u;_&YnMAT-;JLWMAL!BsVunA11xvz`^$G$lP)cqJ>+uuD;t2tbW z;dOgXO_oMr|3jyg5Z139#h^E7b84&Jc`D5M%q__H>3OTh9ACuK74p49FR|2je<1@K z@WZP;=>HQOznd)W0|8Q!*L{lVopqRe{`x&i!NAE?$>LYJv&2pe?cNG^RuO~2taeF3V9s0o7bHdelK9jiUKpSM76R?l z>hHU>*##&aShOWCYBdcQtC;z0xeW)9>8m|h%R~#tnu0U_7A6Y%cOqXh# zZ+{eLOo>SiZhVpT0+taBkaH8PRgQF77G>%=Z~T z3nT5TE)coaE;$y*{6e+~%~1EeAVFf&G%Zr5NJ;PoQFxVlQqPMcSW>plK(KrsmM@P6 z!sA!duA*}b97*n9009!_0{qBh+AJ6^1;Yi*gMBjxW@KYA$iT3+-GnLk%gjn~i&m4( zLOqsYe|wqPTR;pNky;ol%f!jJ5@;#qfnbd|Y%kUq)0cY1%D!kEjU>q`8b`kDE>kIy zmGXMTqpy=kBqm#-ZKA}HB&>?0NjE}vw0X4GNRXuTvJvC+*%{qYIUPnkAQvW1K_;MB zke2b(ab#-cD^Sg_*%?$)Qnlr~0gnVkkg5IXXb1~;FT=zP=r_R-S^hHsp4+5(m-Og_ z*9XXx@59(67O)Tk-4F<4XMn7PK+lfJcb0%TO-NLj7DnBc^OIID=q{mS4lhkUCS`2P z8rls-gN)1)GBOvU4TCc>3%THs8JTXJrbE8O>n@_WA@uB2!(^7P%^7Yyt?IgK3uD zlY}ZGuB6$DRqGl+Oku2UUdsD(V*Xf9NJ{v~^Dnt?HrvdLdiILma;~*wLO!=miG=oaUJq@;yuI>c*&sUGQMszGW z8(VkT9Ikl`QEBkh$y67XBZrWJnx$HHP9Ti9q$BE08Nt|tdsCVqNR$!dX$i(LXNb%- zO%Qi2L-IM+Dk~Iq&ACGFH@R*#{)hAJ9|a2TC2Ct~VdWxeRf*>!bWVy~Du)G$T_7~w zD><7Qz7Vx}^eEJJjCA zfzjZ{0SRw_^Dr$pDEbp9uC&}d0m{;H^8`svByPSWO5ao0&30xTy6Z-@5ROHmPOV(A zClB0^DJq0zsHU4orhBT~<}aLY4{E)c{jB4)xNx7LW2}RIjvbK2#P&jN>M!lWc?Pl^ z(1G(HGzz*7t|qH(~b;v0&JJL+}%J z-%Jj>Z}P!H*nLCn70o!ZTC%>2s+|K5Gf)2=R324Owg3i5n4|ATS^5k}Lhc`Y@K4`?Agrr{eukg;Ywv5i6|m;$Dttan?)5 zm9!h3TWWoSJkJqbrE`zRc(#!|>_xY7rhzNIVe`V|N#pa#7B9BnhU#HTd+Gsc+>^?| zex1>zCZC$aa4ax?y6p%%qm$;tt~!O1{;6Zh^vWY1JW%6*I%)iPBL9Tu)Q7#?Jybeo zQ07%rSE0r8Nhm%7%y$J@+d<6qNm}QYkn>+Y-qz05`Lf(Kq#lDdYEUk*P1Jo|OyuLq zh)YH`Xr2BZC_tU7Xqw~E(C8~<`fc+};?Lj>ezu9)BboUZHBr-nBM<8i)$nx4ChF{0 zNVW;)_z47cNRG7OMm988sOsJMNqTgsd)zU}KC5jWv%E6YO$tWD#xY+koABT zYZANvk?*Yj4H6rpsxee|^#@klqt<$u9_v(z?UcgP{!MpTBXENXe!tg_RLTdvQf^C! z+uk8oY1hwxUx(~|sDE~~lUF9*_4qVTYA8XUbe0@z&FuT7oxlyL$$ePiGE~pI@ z37K+W7Zf}cVF88&)LC!c?ZfaOcy8`{ASAWSMCA9>8=tQj)w}gV1{V;$OAhX2D_49G*DY zo|CxQc1h6{ru|ARegziaZnjevbJzTJHV4XnRm|T9xH(XAE06Edbc@};)V7kqsBm*2 zq8px}eZQLnvExRe7vTb(yWo(~Ng5@dD^Vh+v(^b7P0?{*|~(Es8G1=54~2m&?>SER$}q8V%zNN@Z0`KFP3L66eA;hoJrrw zfK7j_33{T4!)@V~KgyW{A$XuH-0~;f^5-BeOrNrTes#FzPq^g|1{jAGZuwJq1jH^Q z@_woCMptII&jGQ8l!wDDf5I()>~B_tTmBsBPbE+@&o{G#TmH~N5pMZI z3`RppxaCi{j+xYzoi;(`71;3OgVK!fq!D$!6nCr@aXkI=qkY z2nKc(NPtZTP|6_!8IR=JnUukkJRuJ&%IN5fqe;*!sOKP65v*E&_xt&Mf4^^j|LyO9 ze1t7RP73GlkWRTjx7~?S>4ToUJ@faGter%V;+EJXh_tVU#3qIE!`f-2FD|S-$h)uRz|t4@C8W;&=_u*&%E5ynstbon ztHEh8=~w=ml&dY!2TfmNURx{pLlb^^C3;JJDkVdkI?2T6onSdi&(=7Z;9LsVZ8_Ygj^(^8r^Rq@gg%h196uK&2{AZr8@~NxbWJ^dpn+!H!d}Y3chy%g++6+6 zEcf(~8Ro!`3W4dvSc0!@XXU$n?J>tE62HR3yV1nC_EjRBq&!*l-y%_XXGj`cx}CTi zpQXj~RK^uts#*RLTY06bq0>B;}mU52G{ zt3tH8;807*uL{Tj2*4(@_JMVi!lB$){-rv0n~L5UnU2e%(M4$*G$g;*1a362cGjC3 z5>Bqaj_9!{tII}iRe8|_K<9SgIX;J)H7v6D1%Ol002$RFe~WqM#C8dJrBNby!8sJl zxHk7m`4Jv$P2=fUPZ4JEqtt*Is}QnN;T1F0?)6wl&OYnCiKLb7%v9{1cyrktXr0Tx zzyH_t*4gUwA1^ms^RoZE;(0e(MW*eTK2mSkmbU!wZg#$EelmKApkj=vK3dWs499cb z7h|L}-%Qr^VK}yrjSZJ8Vw`}QkvUcI{M6^Ai8lMxv6tmoGS+biQDB1*c+wV(4gQqI zjJ#E0tYD_Zq#TtO1WA881o1Ukhlroa(5PczZ~{%@@yXPik4lgK{Ec}uMk0EMeJCiM zmp7EMPw&}BzwuYTjY#nBm1J5rMl<$qb3R7&Ze!H+*YFL(`4uXLU5=4gpffwiEl))8tyx0l!d~#MP861Bb@9}R4y4it zU2y4Y=_f1~*LT4E!Kjq$7V)i9XPc#+*gYs zd=EP>AqbrF<#;kiv7%CMmn1$7H^f*m8e5De>0qx6z-UaqL)tOMEi6~3`6)=Mn_8%K zjZy0SeF0%@VYk0|x$N$y!?&F~9x=ZEv5RP-jIU>NhBn`Gu552X)4oRGX4mrM)2d?+ zm7d3qk_hrrqj1rXd!2f2;^~%hi|@A@Eq0@Q8{2LB6pudKJ@nwk<9AJU0q^^s2d#ZC zaxYD^NZ_4Aw{kRN)$iY{-u`Xj=R)H$rM~%6>bq=o&VAcy&YozAPdN7aQvWVMG(Y0+ zjPJl(xzrAa-^YT^_3s#4T}KM|XYu4ct826Qk|Kgt8nJ-ARhJN3FMi3TW++(HwAak~ zM!`CZ^{lqO{@&B)FKqZvx!IZBYcm`E`j*fhro*OIHZ{~WV7~3rsa(Ofa@+r^cFh2< z2Xgz{!dcWt$i0wO|MhVV=_9xBHM`tyOyNox1L$wyC1(r{DHyVUMS#l@DP7aCQh|l2 zJ?-GJB_TW$(Cb&4OrwRd18Q+ZbYLV(S>_lnfDI;K2+yR`xh{aGa~AN?bT!~QeIYQH zVMUYWR^w?~yI*#Z&716rlt}~#pcW{dS;0%w~A3fh>^1n+94h7hL_ z*J!&LGe2~xxqVR?Zu|$s>|9c1!iNJld#C!{ljLBThYp!cS7DQfr^sRAa<7aY`JP>g zQsfl9n4uQ!GXSD6M~1tKA{M0&^?#ozspM2l7oDNahK9u_*NKAfAy^I#kh?LQ3F-MB z-qgMO0ADXvD>pE0lwE(wBQx1Vj+t6(>{1kjcG-$sz5v@|_SnlIEWB{C2_KKfv+|%B{M5_)xBWQDP^FOnPo0v4%g~CReHIzFkV<^xo2^x;pO7% zSA~l+!T~3wFJ4`!C@qqN`_4wO!uevpQRlV=YbgX_M09`-Lm;n*;)DnkEE|xH5Be!4 zEr_9PMDB^gYB%o*^H50|s$kA844LcjT}UnXAS=J-MH2 z8O{V4IgH|7lrAmMG@SCy>oF}w1{;~k*@`y?Wy!3WFiO=qG>Z=3PG`(g^Z6w_8T4fb zqqZ_0u8>C@9yv$>XZ`Z??(0U|Bs9Qt^3owwxtA4^ m4M^mE@olSjEHQ{yW)+W!Zt{iN0a diff --git a/client/resources/hardnested_tables/bitflip_1_076_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_076_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08f0dfa3a83e4fd9546f2c426596745d4cdf6faa GIT binary patch literal 21096 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 deleted file mode 100644 index 2c6f9cd4dee91d031c692d7eb4a2cc7151aeb11c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1284 zcmYk3TTD}T0LELOK+74}EB^;?Yw3};|HwJUhpt9YSnCEyxtHUDjPqy7+@88+0W?$E z(~E66qE$K%&TI%90_(#$Z%u|v&*?>%_<&)_d@!aEv$+iK(+#J|c-)uo>3jG+{J!Q7 zj=w`5Jc@T8jV{;kSNIdBMjlix`lHj8WtECDMdj@L%*@V8g~GpCb@8noivNeWxpH_9 zF$HkH6!BdCBoVqP?JdXl>|LQa+@qc*n8e)WkC;8gVPz0IyLZK+PO!%@m9;MPwdW!= zm27H`e0s9|*ME$yiyOtOe*{|6mZe_QuDc!%-UpF-`3u_}^PqYE>=LZmvhJ)tbACWh z+wQEB5fg;npbgAHZ^MauFQqcQ1zAJez|`ikw#_Q1s2v)VK{Tr)M?ByKcb^Zi(R|8djMtqtA4+Vk3*{ku)O zqrWRt5Tb&^RC{Z;G5qceBW1W^Y!|}5Dop|z@}bLp?x5#228DbA^=)*{^&MrlU{=Ee2uP$sM2l1E+w z2tp2t%U#1;I2%l z2?_$8>N)+JU1AwFm&;asX1u3*Xg^dk>FaG%BC5q0A5oFGH9k1-y_|N((YCxSR+o@W z=klpwrt#|Qim4IRNb*BzKssWi+<~|U;ttIdvfp7uIXczr^jdD6*gpHq*vBUtclrC4 z_E+C{b_#R398Y|sHOx!bzB3v9@|*14+6uSq95P|#&_+qRLtcn_t#%-EJlC{J2Qps! zp{1?RqV|(mkA(Ov)=6^AxHu52U^IS-{gNYMX|g z_bob0%N(jY*%IRwZ$b0ZpW)e~?1?av&s{fLIgK(STy2hK5L|Q9>H6J^s#pGjDcw zXS>~`o1nSxkA3s*yC3JC^E)5+ynEO0-jdyM+p*$xM7QnOaE_!T9>tP$ok&^ADPoTj z3(IRL=q4`EB|()gYjLAor^H9>oCMH*6h&z)Di1XwnjkbS`DUjwRrD4kCsk77r zB2bkwqZ#soB5HVRnc^dv@61D+%}l9LE>eI>hw)qf!<76Qn?yfT>y26<2bIoqOj-G5 zI2~yLVa?t8rxUeD*|cYI$L|i2hqR)|X*Tfzri94dX!K8}9u(?z3jN}CZCFjlnF_XC z3g8=HQU?gEhn|?07QV>X)Y{U zfw~(5N^l<~(P6)x`udNeDhOuGmv#hw#MIIbHe$%6&a~+3OkNDg!|l^yXXx*%U}*;k zQ4ZZ{tD>+8T>31Vq|dbAD&^Ff%A7>@F}2$Y%L2Uk30h!)n9e<^wK8ZeaffqxTh5Olzpl>e$WL(d*3OxMahnU8nfFPFPeh0es`Onk^;ov#G z3(u&Z_<4w)#9^jpJO@g|(_qgH=<6BuE?=@t`*9?v2LjWIF1~nwFKmp^1(DM1J za6yTZ|A(+cX#w*=O6o_T0*tqi8Nhpcfd!Dn?*S|O2$PW%s5Fd@UXxS>ijnZ4E3CQ# z?yJs#`;oF>;23yW(G&ws0RWOmAqUh<_C?I8s*2SJ9p{S`LG(coRcPxJ-in%Nt?Kn% z)P^DeHPi|OLMd^@!P-G9y;}ho)rdva`XVPFr~#<4T)}ipKbk(PHr5P*=ka&c0^Qnh zpjrn@(xzi+sfBn=F2%H3FfWL0n(I+(8rnB7g>3%E1juQV1E3l74?*VvHjrCW;QAh+ z&i8i)#Ru5jub{hJYpzRgg)VxFn1+|@L^$iUWljRI@zp5O_8&v{gWv`fPgSBxrTHgq zT6e)r#=$S0I^A9OrtaZ$7K0@km;2C9C*01sJO`u$#fc|D2j&2S-srjs)cuypGjt32SO8&@nR0Mk0 z-pllZ_izuGj(>%zSfduQpGaYi%T|bTM??|On5vnK);f~`;9LP|0s(dQf|?S!a-QO| zF&b-XMx*x)&;}1215vNx zG9Q^>RWztLgRVP5%klz*^f#t|!Gdd$(j}>Lu-8LL7=}u$0T)?N!+7@1^i~21h(^52 zG<4}zSZVA-{(K)dwIv1W$dw8dgT;%S#*1h$2B`g|;xGiTO#sYI(ApFV5hh%aV{c%r z=F+nxz&MpY;4aN zc!jKN*HU|Z3pxiqg~OmP;8pt;ra^si7aWPQ1dIaP)Uiccs6ml+;ehYHo7Lc*2{pWt z=YR#<_J&dilh|ML0{tmA+hJp$8(@0)aA?zDIHBv?UJXqsYoilWOve(KP>eg1_gKtk z?VyrgwV>-Uhw+*0=KgS|rYnF9UIte%dmA&M{6VINFmMCMmz6_^G_|S7+f4g0f%I;r z{#01ZY?=|QZ2Ullm8iCmY3xm=Lr}mO0+k7F3Zm@6oI2{PGGqbk22wUD>SS}z9_Y^;2AmpT78b*p*9D!I z0S!BuUImSA+nGxRKCvoTNOn-+jczY(}m@Fm{%mjHv zDw*FQJefNa$@CyXHv*R~$TUt~fEyagm5N@>w<(?XgL&M`W@!h^Ep;H*ag#lN7-E6$7U~LjC1g`9xBefZrZGKdVx)s&Sk3qPfh3l(dx^yT6In2 z-PGTkY#av~Rtx@2zvg|I>2?GJ1Ga}o3tj|vLyuY%gli>{Z?Jiyig>1D;QBVi2FJkl zr?GU^6$RE_uQ5G~RZS6cpjFjWl+9aV$?LM4F1uNQ>=?XjmPor*^-5e4ryX>Zj%Wg{b3%bj0THk?B z%I>SW`>H9U*QQd+n3xa=mr{Mrj2n%&+_%ZZcq z+Z5d1O}BSbapCrE>KCnNU?$w&O}BT`TFR+^+}=&Mce8pZ!|mO4dpGs_jN7~E_HJS; z=xh!PO}~8K>Gp2o3x+#0JpUdE& zmOGiQCxZ{Ulj%6Aj^k|?>t7+c>}DbI)9$Of`>Ou`@gI>~cGG1yU3N1v?9=|3!|dkB ORy!);daQMD*?$3ltZfef literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 deleted file mode 100644 index ea2f8386bd115eac8c22c27af9eeeeda6c9bc7f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2730 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 f#nZ7$x9KgIVS+wZFz diff --git a/client/resources/hardnested_tables/bitflip_1_07a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_07a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ddd8741b028f63304b81ef5d28f0bbdcb58cbd24 GIT binary patch literal 28127 zcmeI4d6d=FeZaqOotZc9{qC>~4$J_9FfuR<3;`6P!o!9}1;iyplp4na78FM?Xj~&d zlc1zXX>3$fQl`fmHHx7}h+teErw6s7fi75#sH84T8ws=;6;y6N-}`%SHU?QdZS2YK z_s7g{z4yDX_rCb?Q!8dK*zi)5$eqt!wompP*zr{xk&9RDTeXk>sc5x~cyoWP#Nt^Q zv1;FVDJhOf)YqH7oIJu>U&@U{to>-vo&&tHa@=WBdi=_9z6@VE?rh=F;ApXUzMhqv ztYqTVdRk(9ImyhGh>@tZ%c2pHB@ynGj@WacR!ZU(65lGGdv&vsl;;u$hx z$5(l?cufo-Bz|(c!M!yM9=G;0rr2gAV|&%^Ik2}RT`fr<$Vm(ovQj$S+N?0!xO7&A zzqy}t@oYLiHB4J2ah31J(fU-{Oe}L5e_Xl*z{KXOxi)&nJEDr=ak@@l)lV51)F^1R{yd z=finMYOUp+_~G$^oLIrx~ea zl&npgGAZ?n!DD!T=sk=7Hpy2PL%@wj##;L@V^_A4ByH_9h*;`~V_yJ|@}#09Ojpfx zJvS&VuiydzD|EVXCL;XXYveeDNX9A1X9*0dIM1Ok74>|w)c9pkH#*tOklsehW_f-T zf>kns^2hJT&E!T;8Js*l7?DA*Lu{Bhy&5)N>t5w%68OeIfFXQ8S^4{M9ujM>hnvjUa>9-YjHu$;^ z$`}^ZYPT@h^fr>aXLm#QO?f7{8%k$R_L}CN2>I+Yn8&X5YT-q!Ce<*DOL!Ww<5k`- zhad>yWdl`%xuJw?k@ySH3+UbOiIGJSle@Va@&hjO z7kXR8>=Yd-fy!iE=*G{~ zoAnY?)s1>SyohZ!a;wT$(hl;r#sgd*QY!sa>1HROdcayOzeTopo9akudS}n!dIQiD zjymRk88qrtZ9yQnexdP8K;qtdFPB72J;*CBTxI0;*Ogs>Qf#Y?oUjEkE@zM;=0?=3 zcj=@b7#XJgsa5drg(Y5TQhtnJV_AN@&@>kfRKj`4O4%G(fe6L`0}81K$D% zj7A1t-phN++XiPZc3z5lT>$Ur8QE!nz?5&~r4pi*p9~JXnyB}XbU!oG8OS1p86qrF z8d;<@{!0D}YrkitM&)>$S)$+dgAa&3M;Q=iWt5RRFjMJs((EJ_L4L%0Q7H%F2#%^b z92yT`*~O?gs0@3#y$F72{Ng5F<-ttb!0T@sX>_w7h-x}e(Nq&(fL45ilGmPuVw|rs zXzgEuPLXMe!|vk01w8Nu878`Ev4gRMDMuLbR~wmOt)97|JN@CUf7V-91y-OuZv_VO zzZ(PQt-zo02B@4`!#wLuGxJLFETwaBpvA>7%u(nglN*K!RT4EYLU&+qRrp=4^v!?h z{((r(!Qk{ne!x$Re@bsm#t)5*W1^_NnIX`V=>2*1?$!47HY4XTLzz9r$Q3|0a-Anv z8ozOfX^EnV--K#$#!lGzT~6ILP(@1m;yXW{k{ONZeA0VAIRx87U;I$~-OMRf%g_5{_0gO24!Ha=ivu07GnTHc$>#oBdxgJYbL zCtp=!T8kn_?Hf8y>v5`gX3F>vtK^{;6*!`;Y0rlQ-amT#@za5g`d8>t1wHyg54pMZ znn)0dBpCgmvD}SI6bWqc z_O{2jwUfv?PZ0V2cRKWt?=D64;WjsbA$bfmnjz~NtGIk6F#BzzTl>jjIKIM@;fl%* zPp|;Z7CW@wT1IV0)xvm2pM7ZL7xrC*Vs~JBUf}LljB~E=mO3(x25K}2+iBm!eDMl5 z>0qVOCxjHNI5g-l0*%u>SB*U0prq6$BzS z?&%!(9IV(~AkdUn9*-Pl<|Z>{>#q}D4l322~e+8ZCTd z6Vy<$p_{1-@Msr6%iTJ##p;(r5#b>gFZm9qJcMFP)45Mve0xbUCqwrfSP)GSLjz_O zPUJq#82NO%rU0K!Pj9ur-xpZNcrMY^mnB}RQFBi8PLY0}1?<=y9yFm%8~NlO z{=cQnLB*<_!B4-RCbEW8iAlVBEmVbY#A3vrezcwk5@C=cOkqDzNZz8~;lIAc%_sy) z&CH85xUK}N4^6h$0I-@ESbR9%Iqows2LX%#Zv_JAf@YPNT$~}=Vm|qqQqZb-_Kt&g ztC23C3;d+Ue7xN-8L=sWZ=% zshDbd!G zMiy*fTzkBctN9!ixW?HQCn)~~i@5olyipO;Tnhkk^n2)1!kxt`B0q3GAqu)#95KSJ zt^|c>JcEzFi)iNJL(+|X0XUi;#s$n%)RenPn83od8TMOF6!r4^h(Zla#0y*w)~BOX z%MsBkCP6yvTq9>+6P)VX&}|7a&^V_sU?E)b)n(r>%XuLzi8`Tv%V00cbhUk_6&f8Q zIBqv`;p>VNcKI8;-TNm-UP5*JXP7zBgwbwX&kY1s zoS;_NDo?f|FPku(+l*hiIPgUX#32vn+{f!`IH%Ytn4=Q*3m7Q%3*zEFqd zT!V`wkbC)Q?jYctR*+Q^#l%GphxrOUCa-(&+J6uk^0CHX`JBXB4>L}5a@s(sjwo39S^5;3C7Qfy;Wk5DB2NwLnqT!IMEB{KuOG zcIsp>BuG-^U835J2()^F6JP|E8*?jzIIB|?SV>_3SJlmHAr*+Y3_)TDKDKDZ^}JBx z>~WoGAvFd;JP5vBO$Hf@3?FQyew4{=>4Al5++3;l+wrar>o`<>!}Xr5il1JZFAy}F zMh*6(Jv@Jr@mJvs(u^AK?UiAuqot@{TW*sbl>rLqKyH(hNvP#Agle@4{dhI(#B*aSiYRM&_*@FwchcaeoaSzZL)0*K3DH|*%G^*D0sOMr3 z)`E!fdlWG-FZRI+5<3D;s;|lQ8e{yvlT=K}vfkarXKiVYPpDgn9LhUH4qfCoxvIV( zc%*@XE6xmg9x+0&M{7BxHLYQoVNZ8TYn)@o@61%hx=d?2I$cUL&H})43{_iB)8u%H zG~TqBC;&?NyVX1%%6SYaBr^=EJbrs3aQ%?xeXTd&f*|`^UCbUM@9|0}7voB9DkcR+bWal96HQzib4rU}X|BWD z6nQDK2^VqQ@8vLjG691+6(-G65yJ#_s*8OAZ?l2~##J@$oR8$%@mS7FjepNIE)9rO z8u^*gIS*0vTKhgluSC2>-33mn0e(eBfss#%35Ud)#IcT|S8a|$j%UmP^@tJXkIWz_ zSNoAlctz5Qoy^y&6OU+7jPNI46eCwg@Nz16F+KSV(2$?#IHeW=o(s3QIOal_^cm$` zh_CqvkV%E+ETvwvq_TL?iusCB8sTw%AAT&O{sYXrsE|FT?gI)26*5YG&&nIuo-!kGUgOw)#(h< zWaMiaNe%V{M)n}B%0McK2WvYk~!zrXHpF%T6nmS zTX>-jHLlwP$eIxp65mpT@6|>RuMv>s6CCx z*OEl7|PMq`3#;OlUM*(uNZk=4o> zf)dwHLdJT+K3E0G^KGOZm_CC%>4#NX0hcNyf5-2Wm>p~}F>q?I*C>i1)qj2N@|#%DHS=~}@8k1CxqA3+;1z8h3fE4KK&jE^&)0$6IyHCqJ?HMIc z<(d(awjbdCmWyZATyXR@&NS?$exPw?`}%=n&)6}1fGs(~@=ET@z|Krr_ik1y zak0u}Z8bI5x- z39HveQn6r4?wwCF=}jc_Rn_6DW6HjoH<{c|%kiE7`N}m%lXrR7!R4LkKx^8STLTYT zQ?BM+Xhd7eB^e9{CWti7xkk@*miz>E0^_*I$hV!SQtp%mC!??(I!r@RH`ieT(%yqr z<@6|&Y-B7F*{)=Zr9$pIb(rcP)-ZdPX^3aE_l+cb3&?_ELB(+ew&q2q9nbW?+Tc3k za=v$_sz5i5y`o5R@;>CIT3&|zpQLlqeA^BMZ&xO(rWx*!)xs46rm(8`t3po@sY-kX z9;C_Qy3!G6FC*i)#(GWBtTwLwzIOmMp`DFh59D=a9D_BPhKUS1V-jy|P;>NoEiNQN zT`q>HCr0UPXYJybFzn-?JO=E+bse~BDS>DZi;NGu(v3O|w(;q95FY3{q18X)lo_=* z?%K3*K6Z8vuwGI|98*gyr(e37=yvece8$?#fj8*Mjl!g1TaKA!cpZ5DOb(|Bo7Cht1CZ-CBa; z1>|0TfXr-vJ~JE5|6mD?M1$3&|JSM6*TU57*w!olQKx3PI}*lUL;gRD&I*NLvgclA z{c{P^psjoD^-)igwQdPk>=u)Io~ya9ahD2kgc<Z7`haaqP4WYFPv(;B-)Nql22e?Fp^D?yoIIw_m#2b0 zGfSr$|Arb5Y@wUp+6(Md=G1bbHW2A}q_oWGYMsHN)bCNy1k$5ein8K$kk{7jovhek zHMOY)^`@w9nnG)`iD8nzFjRep;h>_a*Q_9e-2bB(KRNnVc6u!DPTiQ@_%co ziCarjT&lC`vY;>jniE|!C>4lw8eUfachC{Y%VyypE2O&PQG;fo-=nfi`S08%Tt=6W znjT9YyuHJ{hKy+$8lwgC6D{+xmXJlNN7yU$_anLaUZJ<$qTldu**bcJ=NSJxRBI2Y z4WY4gIMt@oe>$q%))u^mw&3&*x*Zhz(48Y}3s!nr8nr&lKm=p9V4$kQ%>c8wQ|E7& zwg#!CKLWA+P0rGF>>U<`+Cpe(B6Jk_B=h}o#2L->H& zTD2{%7D{ZuLo%=${up69aZeU@VZcd2wM#Cm3s&*NT zuI(7t+(d3;DxXp=1WU(t6I*c^s-2r={2c#-&S6W25el6{Oa|N6FnQJGC9aXvBY|!C z0$bOTr)#ae!^Sm}y*tJXjq1X}jcZ@#jcaqx!1|y@or^Vpyt~%q6`J<5(W$mwYo5Fq zc(8ESTDWVC?o+sHE!?%1U*^f`6zz!W5$;+G=+OD^B_yojuC;L2TDWU1+_e_&S_^lr zk&1`A)>w!3g-V6tt~F{a8fj1$Il9G?;jT3k?pg~LZR*<6aMzkdwB&fM3)_2kNN2)b zYvHan_xm~FuCy-cz`1E!?$s(2w4PyVhvU z)@h3=_;rzR*IKx1O&v+NYweIf%=l`!Ywd@}{!@W&ph&oD?HGS$Kistz z?ph0Xt?`3+;jXns+BHAgA4m>&trhAI;jXm;CHVhk-L-ZTKNQ9x9CwX000000001U0GI(V011Eqm;fBWCICzT0$>0p00%G$fD-@! zm;ecY0n7qm1i%0$00LkDB`O#prbbN+n3(`F4FC*)Qc@_?6HOHGntDX>CzRTmqewk8 zn*e51@yC3GLvVP;j623awZ@G@bRdxsM)D~ldPyu`}rWk(qt zcn1{3$;EI}iIT9zMi>q!&N4Wd@V|=w>-#69{%h_%2zya_Q{POPFuE~4NtJu&?tW~4 zx!QOvnO+Vl!wc*a(y#9JGvZUtF&S5cU;2L|9+F)W#6JPQbLL;g(>?R#SoEug z4~_d5^nUl^eh0|U3VIBgJ|$d7sLIZsm(1hoeorTvJQtA5iNk|9vx7cGC+aVm7{+lS z!k5%lIExgqD&bPaSX>n06Wj+$j>=$MGRr1Rr(+yUR!Yf%WK3jb;W(oVhYKk3Lc@ng z95Oh>;^D<{k0N9^x-#LMamEa@qd3bQ8Q8~4x?Cp|!IOquOl6XB8E`R~af~rsFmT5P zR~f@44S?LEHkr?9T?){7YAhF9UO4G7*30#;&d|T$4djVDP(YE!zTv=gzeH($yBhc3lvza zs$pSdVn?8!80_LP*@aQgo{hhGCXjoCAX+hB&fWWrksl7{+mo z!-4H8UtpL8jH<%MCO=}9Wsot!*|48zHK3|wCk z@SfLh%cYYHnDDL!Sxmhvg~J&<6WX0P#pYwlo=mcP!^tbuOfhF_^Pg)k%=RSyhp^#%EMpVeWIlrRKNe0e$@CsZKY(Dx#U4qM zE8$r97Z;@{0wWYxIhVxRBBRC-vJ0C8_6~qjViyx2@TU_W59Z(5{)cIOY3&|_|A(yO z(DOY*C(7b+mKc6690#bE)XKU~k?}s4o9chkeQL2_!xw~c@GoNe7tp@5*pCKGdmgjU zKOy?Z2gdVWv5ztEF`m=uI~|W%^(TSuU+Osd-W2?Yq3$xzLia9*xzgcbpBYba>=T3- zrZ_lbBZZRV3HsmcWOmG%Q`XGv@)=n&S8uq!)t|`9T{{>t=cwsQf z^pr2mi9!AZs+<(1KRs0lU!j3hEmW#Q{FM*TWmK_YGYm0Uj99Xq0mVY$GYZVbiIiqa z)V)R#{_Jn8~tOv0;`>vdqIKF=Uv`GGbz~te9lRAi`q_nOMUHD$526 zxZtJ2n5<&swCrTTl~Wj5jIm(g>~tg^Dj48t*Hg_z8%GRrZ8GK^%hV=QA9FtWuk$j7aTA z9AGfA#wQFU%%#P|;c;b_Si>1*Ok!avn4=>UV#LV8n1)6%Wa6g+z|J!$=Lonm7-Y)C z#ume%3!fM%KGC-i6e~hW?m~l}kD|RpwlMyUxVidMkrkfKAl`Knme*JuZ=iIip+&&i6 znRrgp^Y}f!zwi6;>+gmOt8%_vf1qg@(dxT%gv6pnJr{AWY`uW{hO*WRar!KiC32zc z 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 afra3}0*(m<2NpD5O$R4%5iX|2_J09aPGAK9 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 deleted file mode 100644 index 54b71e2cef53a5594ccb5dbe9a8589c3607d7cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmZ>Y%CIzaj8qGbl$~w=kFjoTiOWS61_uEK0R~YA2L=WX2gW}ooGi=^K*W?4%Ix@x zRaMl)R&B1TQ|L!EFOO5oElr-2Rvz+Mu}0;PkLN+H5WfdPg$fgsS~+cAc`VfnRpeUB zs2;?r=Akk(L~GSamdURQJ)1lmlDsPYURo^knKb3qWTr`3zA6_aJy)7c<}_8AzhJV; zQdzcOq()eQml|S2tH7Gpt Cew&K` diff --git a/client/resources/hardnested_tables/bitflip_1_080_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_080_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..016ecfe67461561c6ebaf7087b6c1f051ef62fd9 GIT binary patch literal 15230 zcmeHOy-EW?5dI>U8026OEYcZ-C>B0}O5bPcFu z6HPehUStKk(#5f4IMDBoV8y))YI@JD%dk&hP|ttn?OL+rTyMYS{hS*J(&7KZkDFrL z{eKP9MXschlRc1j(vcJFNVD3JZgp>r?9Zah#~9U0*oHg%jpSQF^JfF|UA3fLSuOVZ zx)e5=@Ixo*6`Oc0?$&nb1tQzYN0tH3{0dw$DUu2--lQnQ-3+P#kOHuSw7b z%0G~eCTc^_1`5rD`@ZA}TDr%@Y2}aO0zpgAst)i>8!0qkV(ST7f|j6-7tbST=Z`Kj z5XI;*qsNP85=<=5GLD9&CERBg15tsVRv;Tq)J7*^$|oetNW!ToS-FW z3EC)?@OCZ&K}*mQv;=K`Eb2S)PEllsM3%wPQsKAQ$8$XWErDl WAZn(Bn{TeCNyG-m}660&Dr+CFs+)s)nU`}pn4&?)U{V_2} zyiZ0{xc|nK3j|93SUsuv=Ve(h>{ZP5`=3Jvckr*`9x?t}1M?g==hTR%AOT(nrjb*s zdX|+nHH@emjfONB5>7XFY{y^?McHhgJ_cpuwvFF2EfWQXsz*AraxQz73Cl2m=CFGW^&j~ zJD_YwSD6STNsM6FK;_mixvS_wqKl3!N`8OCkXrKWU&(&MGSkIKi*yr7x7t5DaDP9t zYc>NYwbOq|j;G0sQOkadZkHEr0k?WhMZ1OM4A~SI81P-=56x$Zzy4~s#-cF)62G5r zo3rzU**|PPin9{6i{s;iuY}LOOS-#DC4ctp(633qT?_!!`&WA7#*ZfMzna>?gHlP= zQ5p)#dwojyCkYb(nVLuC_mUJ?t?cx$gpO@#Nbc$Dn^;xCFTwW+jFV%M8^4qltt77u zVw20&Mm2>cW#Pt^4qyZa9 z6@nfapX{-QQpqtB^pj^H`WXRmC$NBM5YUNj!m(nj7XHjr)sA`~H7)LcnmDwFSF2wFYusUXF9XkGmjsWM&c(H!DdvdzN zPxs^!*pZQbsmntEYJM-Lpr9bN```v1ZHhxQfc>qNxEO&03*0RL3esiSPIM1}&&C_& zdLR{Vz)euu2if+)0_vB3-eesyFOw%RpzxGjlb2C6>ZGU*8i^As!U+a$8<;#5oKp|* zB_skMm_dLbZX(~t7d9?$j6lKnP@JL>z4PPBvBF%r*hK+5?xV?XMJhT)fQ~^AM>x$e8`(wZ3n@CO=M) zi`tQ_z^;7YRM|!QMUBWD8?$ijP(BC0l)D=j%@i@KSt6Fc8eOhizia_-jg?KGsi;N> z7d_L4_pJ`f$H0LYn;Hh=&dsO)Q2b%Mcd_Zo2p$wgdl9(L^Owx$=Ja`91<*&jf6Hq+ zzO?Y^iyfa+tlR02|4`RIeDwyNy>0i}MXN;gwQ-ILeXx0)um48Ws~x;MP2jPP%pQ&T z6gr*7`uXCmZ;qh;X?rNbzlpApKfd$4%RDw7e?fERL*~%-`m9HZ_|7*PZg!U#p^IK! zUm^L1dHBjXO(WZR(N^+nJpt@_^=8&_G^=`k`+nBdrv-QWt&bmXkIAodtEYa3kDNzWZ#Xz=iNm zRfmAb%BnS`6 z$^158^a{B|Esc()umFjOf}gU%(-W`HAC11e6l_>sClom0@@-za;H*AOf!#@;h8I9L z#Y+n|#Y2_DPlk`}-MqDFa7EV_T>){>aW&g{ZBzH_tGn)e5v+N#$lLm44&I~`+(6C3 z(Wfm#@B0+WmCF+hf#^&Phtzq)6%MKVMHrxJ>2KYZC9`Lxrw)y{Kg`F<(@DEJo}Me8 z9ai9SgVm>`eB7Ni@fSKCK78m6Rb$(U*#QnHNOp_4e#-L}5P%MUvhiptS|x|$FE!r0 zcccJ5lE=nR9ch`Hu6iCVCwQ@1ONVT{dUkrQlx<{lM~Z3K#Dxw~J&clYNn@vXm2wZAQW}npPet&ti_&U`5Vlyt^N>vlGgW=GHB})3RMt_ty7mvR@_tA&S zpN|yiC&$mO0j8|*CNMVXTm6Oe5wq#XrA^UYlFR1o$JRRStFrzER>-|$7yFlnpVx4d z&l|UVoF4s;ta8cM*a$+KE=+CJDQaG zkAow>8rc+O*`*0aWr~x6)+SVaqV!I^DbO|Xqu$ypDd8vTnEp3D_+Yj{+48y^6$R}a zHLvvBM+0d?4ghCJ;XzWk;yO!HMjoKQFJr#jV@5<1+BAW%DcQ-y5>#JIGBL~O$ddUV_hF|qVeJ7_^+`BVsj z!!=I!_>cEds{Op(`&fMi6bSbH6cdOrD*V|1e)m9=Cxg?}inrtisfk)Ck1awwG)g`u zrk7MV7DWQ7D)t%(4-kT9H;kE?5{)5 z5)>19=d_5$(V;_#?`N%nfS#zDJ>8G4{Z~+&Uy#~_6*DH#Q!`?rcDRx!CzC$l$sxIM zlCX(P1)U&LnC>!-cUgB?d#K>ZGIAYT6M30OsTvFCLIQ0Z0(WRIlu6NO2l(_bE>4iTM(Qc6}gqn%RpprYeRU)Jj4wq(@+VJAi`LZCjG+zkf z>RD>EX=(%lNZqwl-XL5wgr?I-RdS_h1Oj@Zg7*0L$naTAi0>!pT^vYt+B{AgIq$zE z16@vKP*drCIaR{s{Z3Umo`A+Mxlp#frLa@tUP!8)>IT)ciNuGkJ|R*D%0n)Lc3x&g z)bq5%`WeFklf{0Z;_a8b0#fwXbAQ~5eevTR#~YtFp^H(+QGT;O&Y{L61CKKvb#PuZ zC;fFIYifJ-FSjfT`dIwSYs~B>m2yPHmus!Dm^=*kcI^9UxDelZZ&9O{^y`m_Z0)R? zk9*%DeR2ie0;46*#c9$xT*KPX;~8imb>K7GyaRPRb6Kq#RFt01$t{80 z&0wNpIcQ~N5E$1^LZ$GDC61w=nN83sJ_HB9@*P~L-TNJZ)yw89f4<^dhv+eINdVW% zts1xW3Dpv{{!HUqSOs)Tt<{sDytQ@hxE&G%q*~Y?T$QopVGr+ho@3}_@MJuaz`!FY zMhFha*IMD@^}31>eioIZK2tay&L@cQ0+ZQWG$ESfOAaWfDS22O5oFATJ8Bm$UtTLs z^5UtPTQ9>|L}tlhN{?m0T)t26DLH}y=Akd{H4^C3l?isWHZr#;?f5@>HLs2wzmaZ@ zzhr*$S|}QwrgZQ7;_}kbXMg@u)AeoC7xa+luh!ESw>1vphw>mw)T3p#BGh?ZoQlV* zhdyAgshc}@X3L>}{%pL&?>&Ebs}*Scm~y-y+4*jv?F6w7%9a7BsLc8>8#htXgcDOy zs0xOo2IjuyuCGec zuDYh4M7}w`qjlMi0Xd~gUhHy0h@rdIg19OR+K;nh6<`+hWah$xL^%1@9ft+FL{Zq% z&Z#S0n++vTtx~mZQeu#HeJ-EhZIfiIMJPvT#*|6X=sA?{SV0sv3&m1+#WFjrP*-`{ zXnTEB`U5YBHwl;aWX8!o$|`%Ja~;;K#rMcFi#WU74ox@(F10rg5Q`n=#5(Ekb0*Y-}4!ccomEo(1?Mll_|&`>+L3^;A}( zPZS}Fo2rR?mK9V>k%=2X-${Mh(%WyuhlL@wcX21SJAyDC;wnPw7z-3p&XQqIBi+a{w)9b zHa|L#Oikba`;D5{MN3_0e^-4W(>6BbW}n~{(kJ$~pv2uI^}jw&OF`* zp2k(_eBl}j?I%^|IFH+&OUziMYL)7<)AoR(hJl0?D#Mp60GEJzy9vR z50*clUd^(fN};IgT7O^bh2vF-uCOcCcli91A?uXAtUA-sak!;enT5#S8ctjJXogd~75Lo4#};z{}? zrYl<~M-;dtIXR2G^XXpP%OgjWg}5h$IN*F^W@XC~)*HJzVSab=JDL)Li!PCnMbt`3FM_hE$o!!x=~n)* zT6?vwFUboF*%KP#UK#m5&NH>m z!OIP1pA&+g!sqqZSPAv8D&x4N3s&GhCvA-T?SXRMG}AYV;?;%byH}o`X7}KPfT!=Y z=wO_89r7sj!mi5AfXFm8o%P|F8dQk0Qn81pnBex+7sLvdE@XU#i8qaq47)|eIixMi=ZnNSB3JFCMvjM@G@RvVf-4V@ zwb^hKb;?aCwx_C}uNBMN>^<%Z79~7XcAyN@ByEJJu`)|pnXgmV_VtU~cZ$OtB6>^{ zqlVdrsL$lL=xayy-Whrk#K16>pB!d8q!0vcq&nFKOO$CHQpTjEdyIIR3u)iL)Da1l z3bh&|Jm^kPb@zn%j}f(_Or8Yq-kxZ;B!En50$&SnrB&3@Z4@L=7}Q{rgB=14DvSfT z>g!Q%-OHymxKqnwbSZE`-Ef<|@y`uAOd>WOP?y?q5>}vtsId6_tZR)szXf^UiG zjsc`p2!g)K8tZ3h!}x{aDYtFNsXPuW7lZPh5w^Sxln)^Mgv$iJPXgmxx{#|&Sq-{6 zpFr)S=4Nm3XE@b-zArs$JXp(>2Y$ z%$uXDyQ?m13uyx}nzoLmlrtSyOS84@%h&sMETkRcDwmH!R&Aw`I?q7gmlOP#--jTFxfj0!5`-Pcxfi@^p z;Yoq(Jn_SwHtvAk3SjUYJ@p_*{wTzwXy;E=H(T4;!$3DMtb-9)oE*MJ&V{miggQLb z!K)?-HPR?fxJV43O+D)OISL0w0|SnB4xd+bIg?T-9LRjD8$I&XPmI^vQMueRK^?>k z>S)iswj`_M z)G5jSH{4PqMcq61=Jw2rtj;SZX1GMUeo&$|y6u#Or1g0bQ?zQmJu)NAgBZj(>FNRV#)!*ZTp}mEdtx)R zu9+bXTI6Y8uUzck?zjRwmSt)x-Xk@# zmVr3Q#rgc@mm2W<8#j0yb^F=F+8YOTX%~c2Mi(iiTPd2cCT+y`m`27r75~YQ`-NF! zl7f9%dYls)v`7MhhRvuTw!jb|uuI`)klzc(Q9zt(pnrE%y+JDO9Fv`eq_(G#ACtFl zd3U{aCN7Wm*WiQCw&9N%@5cRcrTw!{@6G)XI?J=JeAoQ@S=AyU&{m9+ZF+a4SN7=-8nyYqv0L2zaa z5HbIs2KnO4@YA!SGxVx4V6PNfm^$zIX3FPPCS#Z$9{tnb2KhzM$(O6|SgxL%Sm!46 zK~53~tc@kLsTd{tb|h6aA~~>(FbNxtkE+s7b_^>GL)!XndrSryrVNkB%eM`7xFWz97%- zfW>A6=_Ead<a>Okk+tMP zOVh&gl0>Iye5F&oM-b;-B5f*{ypJ(o0XlS?(&`Oda*ADjkgv6v$l<3*m27PYw4w^0 zni>v8r2L0Da$rI|dr&l@UIQGw+Mo-Nw6mhr1{mCi6;I-*$S%5z^az9YlShm`P zR;;#|J!jkOm6N!R7t3uCqtZw{Qzbx4A_qYF&d#@yYJWu8-_-bUXX&-(pO}Ii!v@>R zQ3~_0>x+ihR;H$@f;m?mVzF8o`vCgAlecG7MxW8^C{E$8*@W#HymC{0sbvin+ZQwU zYx*BMR@As%pE>gHwg?psFXcZg*m8?K0(D}isgi`!^)B})!4;(`V!ZlIhir$>w|CmV zt(K45mcBXo-W8n&{y(R;<}NORMqT`&c;yy}P^bHp{^;3-s3pNup78bl^sF06Pp|B6 z4yc=4Aiqn5(3)@B|5$RweAl%u9r%9tM@2j*LGyIzWj(Hce#R{edH=Bb{5QcTuZ}|h zYTHbmB@eR44f7U}S7v0KTotXDTPH*b8F zb=#0k2VM;|sF=BQ#RVua;tGnfbO0V7Ak@x11%JLpfTypHGHx7-bI zp#8o@t?)!}fYnY^W;XFL-Z30J(#(DO7_Hv#_RZca7v5bhUlL64<%@h?FWNZ4-?Z-| zj%qRI6}SZWkeKQ$4D*(zW%S`T?b9>Sd;@1uV0~M&(n~wWW1(R%`1P#e2f)2sf#Z4b zF-fj;7tCpzNT0TbSBL&uSpRy(Z#qK6{j7OO*LyX*a$xEk4hkYNZKJ!k(^a#=-CqZv zi9mpaZ6Mb;G-B&CH7~zG`#RcwY(1oU>TfZueKEZ7lIy&VFkZl_drIeQ2Hq_(0{aDa zzh}it`sSRXKjx3d=1MF)X~D2_y-vGup_wDDesO(c+o(iO$}F4eW+7M-VuPI(O3Y0k zsOoPhmWCWQLGcm8$F^2IdUB4E)4XD%L|Y77@BZXm`Fu5+@3+`C$C31rzD=*(x^?Rc zQj|ns%c@)?A!H@5q4AFy>k~B#sXTP2O?CKs1%0GP>GZ~5NIn*ACU~h^8-^^?9L<7R zN=VNUr539G2MtQ;G?46X?D<;;Wq7|TW0HquZ*AjER}Jm3ezG?sx1xiZ(Y=mUpPEHS z?h0c0Of4f8)@!srhaK{Rh?qRalyuGO^Ex`Ti3g-V!~@ax9Y>t7NBarj*K=ZtvAAYa zuv(3~A+s&6Z*IJ|xMfS%ptX5xzuDt_QHGm!|M-1MW7Crlk5*}#ui7tG%reHZ#|I?OcTb0Nyki{AGcJRNsNcYkQ$ zHupi}cKCQrps>WEo6TmaITXerNT|Hbewpg=*Wnas=Ih~10-yX_=yFU=YNR10?LT-tF zIz%?SBQL7zfViG}zzLBtloqkD7>9`88KR(D8)P%#b(1`m-Ym_u0&#xowG zhQC?POTCNOW{mLYoOdVq;ZiIKCoTTMWheRxL^)Tagv)dDGEnm59C96AF4M9BgxRyL zEWWgxAu1E5*`p@wviDF3v3tB`c|b8dEyqgN$)msL#(()& z;n!H@KG8aS!kMw|ZC`!mdpjO>#C^m4UE9uSyEy-o8rr*~};*7d^8 za6ABr&3yBrUQ!%IsKzQCZ4<~tbqk|Kd-r}wY8B(Ak$a20Q6bu!R}t*_TwvgmX^W~} zO~oq6=W+kt-cCf@?C-9fIMFq?ZC}BoSO4GMj-NaB`5(`gc0Kr`;YO6K_{PfnZ@;a3 z#aBwW(;vJ;>KbOZ{!+lj3st(c3+;t_Kb76ubp9J>1u#+c4Razkz--NWR$9LPi8kUj zx^`fw%En2PG$E>2ogS-48ZiG0-`b3EAVfPIq@yq(A>5ueM_idwJ1HY%uxSc8B*Aw< z7V^fCx-Kfx*tY)rK+WqYhNWYh%U}M0+B1y`Bk~|jVr`68usSOc7PxdjZ)X8OB`AZ1|)pv+QQa6K5;{PUJKy@CUgzU5cG(JC&-H zAKG1O2a{-P5xOLXQjF{NLPUxxK?6BO&=WAArceAYa-)f8L-n-G#s7ocmM!R*BD`4M zPRZbqZLZIef2C1#u^Dz4c@;O598j6%fHZ)s9A3M$5pq&Su9t?Q4t*5%a@UZNHmVCW zQCKi4(cI2xF5}^F=^<*G0~HYFsB9auJrDTh6b+O5UT;M4t2?$<2`)3}i;O`$ej74( z)feqvQLYKT^c2*~$1YnsSCu?+hlOw5{%>4^SKB9G+t8u(n#Sw|ekkP$iuSC}*%E9jY!d>BFiJlB!JbIMa+8#EUomq{C zaSu`}^8%;(Pwh_A-sqvwByHLuH!VHz@`l>7opq&4p1VKT^6cU7TYj(Dc_X#@WrY_R z#*d{1zr7OQ{UTTS=I!zA`@@UhU6Q}tFclD$-&s6YBBpfznuYS6dsXtz18GREnNK|I zx4Xe-K)uS6BLG^a@()LvRE6Z7=9FhN;aYlzh(&DWwj;<>`{l`qvMDGfNET>UxR(7F zxM>tA0tIacNRyB0|j*83Ackl)sYPdskQRD1*&^dN#-4+no ztNUv32OpTN@$&d?5}8DAl#LT&t=Si9wh`L;if&kl=_z;KrL`t~l*mZ9X3%Fa)MuZiMDagqlhT z%r7ti=TDJ+AW2Q#FfNn|TXhsQ4|5Q;p%&Fx^Z*aAO8+(JyxOlU@Z&eV<}z|2}fY7`){yz47)8jb-*F!;BGN(w)uR( zhO6tSQ#M5TE31-_yq%w8wh1LtY>}8Z?Kon<{jnRo)HG){7^4S2fvM$r#e5rdeXrEIS_f z&iBFfEC!-g;bHH14y>}Z{fDG^AqiY{3`I_0ilF}`Y0!pN?G%7xkG8K!#)?!JSr1Qs za5QmqaZ@vLej_w?Rs$jA<4-tj(q{2Ek7^CDcM8 z8!Yd)5QyumDIXh~jR)0rBB);NuCOAB?KGI69vvw`dwH)RR#sLjLg_F~P@6=dx2fxT z*sSj2piCRm;Taf^sG42&P`0qT6rXk|{C>Ed6iA+G&G+A*2u*&C#8oFS7o(Qw3DD|! zbRf54R9-CGk`hmKV{GoYsv92c5QabBa47A*sw|gIOue7EX+>S;lT58@yS8L1bNKX4 zNGdzzGLe-;^IYDAWIM!?fiVeBkOZ~*!2yP$0L@|7?dqs}+Tgw|9XjmAN$io|uPBdx zR1fLDGIWm zH6o?i#T$lza0RoqyhLOO0%K#5y|^JAO=%qGXf65n_odkB$Q6i;({5)e;)dOmW{KYU zD&$Cip*r0CD68Z+|=_ZoEb U=Hb5<|1FGO?!G*+2;uwx03G0Gt^fc4 diff --git a/client/resources/hardnested_tables/bitflip_1_082_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_082_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..3ebd8d8d5d76b2c33775da43a63da29462ab8925 GIT binary patch literal 48522 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 bH|-^y0>Sy73d{d_o}e^V{9Up8`quvg7Rt0s literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 deleted file mode 100644 index 30d232f69b44a50cda0e6ef35ffd2620b54e94c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2874 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 D7&Z6h diff --git a/client/resources/hardnested_tables/bitflip_1_086_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_086_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..56a80b7e39d455387a506988f8016e372c344dce GIT binary patch literal 28568 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 diff --git a/client/resources/hardnested_tables/bitflip_1_088_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_088_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..1dde249a5df18eaa9631a9914a536b26fb52b25f GIT binary patch literal 26100 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 deleted file mode 100644 index b708bd851f5a361fb3c55758049634652d5ef935..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4415 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 Kt?J#w?f+kzimiMA diff --git a/client/resources/hardnested_tables/bitflip_1_08a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_08a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..2a3ee14937a5e508de15e0fc69ad559cb37f0f4c GIT binary patch literal 38962 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 H^XL69b7QA% literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 deleted file mode 100644 index 79c5eec835299b6f639828cc891fcf7dc186bb0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1569 zcmV++2HyEXT4*^jL0KkKS&_YsJpeUz|Np_+ftx8i0iV#BfDs89z#F;ML7gy_P#+~2 z5D)=V%9!8_e*gdg00000000002Lnws&}e9AWM~FJ8X5yl82|thG&D3aGy@Q-#6ptZFR)*AT&6iHWy-$smqV3O#dgUxC>QByMylA*zy?lmFp*o=GvOZOQgR0?ORGzBtRu^jY&I5&$1~Vy^c?n)* zP7)Zs^YR$7;QU5Qsfw_>iwVGCF^auY0gsUXCkv1+rYnJi7^1}LP6PPNaA2-XRxnP5 zfyp^5fI6R@_S~J0rv@;_63WIdPg7-&vn(~XJHtyA8cgFjIs_4mj&&UgN9j5 zS!H7@GGoMw_YXqoat@{(7#&!{9g2r*7-#V~Cl0F&87v+H(>ZXtACTyooeoRnUJLXK zq0v6l$?+lH?sDPLaCe4Wu)eXu+RV;Q)$uRXJC}cB?Jf_Ua^du@_a!t6k1=?4v9TIuMW0b({7`=nIxh{#&z|6*C!vlh(bphHa%1m9s zh9)q$NOCIbJj`&hhn-GS$WDg{%gUeD{mbKe=incS;yc&Ao(qM^k?@S1k2yTy;}~A3 z!;}~qPOk-KSj^}SgASzXT#s~h916wA>cbWs3gB`ua6^TaS!X8-I+F#^O1E<0SFA$*5|JQb5K5S>rf=s#Nf>A~2$hp?Vy!togL9mA2z`A);{Ld&YV*NCx)-+u=M?H=1b0pNZW z!8(soGCB@N;AIX<$e!Bn9I16Kf!IA`wb6P*mDP1Cfb2uezH!v#$=W;--oNqrne~_Q z4@mDLxbH4cNct1zPa*ERhjH9^#pOqs@H(fcWbi-0o|^F|kn+Bv@SaDVkDJHK=4W|4 zhCzp%a2zYrR!&OgdW!1cxmh@LaJr6^a5}Qb4>_F&Me~^aukm=Evh7|EP1>CYLFi8s z=wbI=9JW~Pc+Ll7E`gV0qn2k3$I9gLI=C~d8P(C+<$ag@9qOqsqZK|y0xLw4pNB%E zF4VzPBk5ENCKbVOMM5%as#3ASlr32WD=bpO5SdvhjI5|zl%(BBKOfZ?0$*9b+h|Ij)6~LxgWrG?FnHCwDF{K%mWXdwsjAUfgrew1S z*#=ny7_$_{GZ1BlVJyj3G8vUJu*)i}%EKmPGbpPWGYn#8C0UkcWtcMsOko+3W(HwW T%##cl|M7PuQ-ui$8`#s(+fm=B diff --git a/client/resources/hardnested_tables/bitflip_1_08e_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_08e_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8cbee39dfb6bbd8506004b029d611dfc5f5ddcb6 GIT binary patch literal 17232 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 deleted file mode 100644 index 917b8cc2f2aa99f9d5c773b442269cb003fda5d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3608 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 diff --git a/client/resources/hardnested_tables/bitflip_1_092_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_092_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..bf6423f2f37fec3ec8c16a4079d7f82beabb0503 GIT binary patch literal 35067 zcmeI53v^V~xq$bXIWw6|X7&z{zz`rAg+K}fqCA4~8m(5A0#e^vw9^(ar9@F_eW0>^ zpj1JvdRw)%rdM0NR=rsjdjYME>#BYDqAvBS)f&CErmfht)uM*F@AsdXgaA>|YVW

    )Ce$gVD}W_K3~R+Y1~-=M~Jb>)?xQ4^Uo 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 diff --git a/client/resources/hardnested_tables/bitflip_1_096_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_096_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ac2ec4cd59fb2b9affe51964e6cc467e50a27696 GIT binary patch literal 19614 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 Sk|f-^%ttxG^9ut6hF~X3yXGI3MSn zIdcmCbmR~49*j|eMeqVO5npRMj^7r(Q>)(|KYcRdk6^^c_@cMJArccKwy(3@TY@_} zBK{AefA5^;o8sl-h=`36kiJ0K@RFDx|6W8yj9mN{if%gE3G&xvjQGw^VNU$WCJDIC zO#J_qZO%yB$9NyjTFHMIIl4S_cA?}tKdtq({MUx>4TTKxKLqr#!D+kwJXo&EKT7&X z0N=gZ6UniM_tYtJOWcUpUv7O;(R~Ef9FvAkq>WB=L_)aVZug};rFP!iDW8_e9ce)~ zRL_}b_peISv@V({U%(AV+6VT4=L1}hO>1fe@Z|~WlR-QO|>90sy{MWQvbKA<3{f`E`an-yv^>vM@aFaMn`9Yjl62DrleWpKiqfoe& z_Ap1G>&t2bS5yICxT9kD)(zMp@8~o%t)Vyet~8unmU(_|=B{S{UGkf6+YE7R!>XO= z_md!z{qpmHI|bqJrCZ32%+u1P;m6w|N1qdjm$e_oaYponzN2R|)*P{mCK=+)8ps|E3T@7x1HpDy(P9c^EE zGa5d(?@~~BVp#3E^}eUKomPhO<_^a1--S-3hF#h<#{wKE|YUG%U zi`pLb#U-<7o*hqX>6s08PJP=(oxYZrNBzq&);(^XW|dc)Qf$6o_2YZq3&>b^A`hgF zk5n!~V<2>{(JTZK=4>R1&B{F6tRb83%riPmogM|)IfO(Fq@M17vK=a0jNb19uvQb{ zGN(Kq?Yol;KmY9Y<-uq(YUWtS&DE$GOB$MXo$)4L3hFoDPA;k!gDLqrA3%K zuy0;-B&0DcmmfRy#j9^+V?54_ zE2`Ywf_>p3@aK=Y*T4sZQ$r06A0CRn8nz&k7nXv+v!RA%YKajwq9!Ym;`!Gv$vq567pvw?m3qGna#m zUsAbbX@bC&yCkn#RiNx3>ESdHsHgfl zb-=}wNF6O5V2a&XmJ;fMNDRbb6$#)u=}d1@Ql*=fgpqCxGu1%=Y!o@|0I^<(oj}K{ zQP5=&yG%O9eqW-JfiW-?>!QI19nF|!tkOGeTIsaZ2jH__rw=^;WdIkEv1Td2-%(%9 zN3EofGl{r!09!rUPZ-Q#J%+k5(2a_4zxl*S9W;)+V=yLMBvogXsVX(wBH4~i&|Lvx z5~G0WEzjt08WAstn+GS>2jemp-TnS!D&9<^>A0arX)Y@1cQ7CdDW0uMtji)eUV=ue zgHdHkC;2hrQ>(tBHxzlcj#Q9l2qfHGKh8tkg0ygF_Ri#it!dQ>6NnPD;~;FH{yC<* zD=CL&P#8YHBV9>9Bf->)g(w;-UaWa&6EChBkTb*hi0teRg7fn*mO*|_gv^2 z*(i1?Azoa<60BnZCAkgFE;WuGXAxvA$V1#o=n|yMfjE9&_QtM%pDFwG z5wkpeutZrow!3ZW^u?^@gcG+a3!NF1g&uuduQd{8j-ZtcXxG@xiAvLjY1mNe(i@~4 z7^ai~c5+;~xz{)b?3xi!JX#8W2g6I9tI3N(ff|&ap!T!|N~HMFFM1J$z?Zg(4;* J@^Z%Xe*q-8`6>Va diff --git a/client/resources/hardnested_tables/bitflip_1_09a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_09a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0377fddff88c0a463bd3f47952acd8061a5c3098 GIT binary patch literal 28859 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..1feeb89e271c920f518817aed454e10d83cc6eec GIT binary patch literal 17302 zcmeHOO=uNY6h1SV_jpN@cM1tKKBNwf7`u=vmLdr9z=c1UR-2ve;(-y9X#9z_sXxe| zqBhGeN*6+0xRKJX1Zkl#be&}v#g$O{>rY}y7iq1>@7z1SH%(HLXI8;8iceq_DHJ(bh^c3GY70dr;+WoJ3clqexWN&vXNtCRjR+6y z!MVr`?*7D7M#u6GQ%U4!rY@0Ft}DGd#%|bYJpLvpm0qS|!gr~H<7TGS@{p-pckS9( z{$yJ3POv-edXghd35oKO7xqTK*#)B#TLEw!fxXtNs4}{;qbOfrv8;^14uJ^{Y zbB4$hPNN}c_aNsG*Z%`fFCD;*F*v0M{lBBi9CS}TMyErZvKGR zJQ@KodO0qPa8iIsp*pn&MaIzd(DUpH%!zDT+(MH;BU;WljgkVSD?*w?pI&&o!ZfLO zM)`WQ4jAZ%nmd?2)N5nVac$=H6M5+d=XqV^5Yv5qNVoG$Kl(ETzXBh3fq1{+Zl;by z{Vk9BRlQ96KLYC4adoK5X+;BTADY6!VdmfrjprcOe#kWnt9|W5N49a&hHF6zr^n7G z=hXa&G>ttsHgE?2%dcLOzZNlOt9R_b0C5FlrR4;N(#|EpS%-NPj4uhQdvZ|Stx(;_ z^zN_|wMnQBEFY?;V8z&5^gC#a4zI$<<3}^7evx@l(+<3fh($7!d(OU%Y|S;KZ?W-98m^b-iRUL;{F0OIiO*#y37SK1E;jb7-lH?iCK!ho$(pKt zr;q<8y=(blh2#ep4n{CUj9@g+g^gfn9eug~p%}q%9HH?y$OwkiXE2Oly!83O2!_pI zyf7Cwf?)*12!;`i|6L+6f?)&$Q)aeAg2hCe!LS(&S1R&5TVu^zV}bKYERxw02@GR1 z7!DnC-oY?}VFbenhP{LFqOS|t42I2M7{PFr)d+?W413AbVIaS=mptty&t<%iYy`sy zh7k-S7`8-WUy#(CduB@{b1gFGw=I!m2C*3oX9!y&!B>p-nQA>t p7{M@tVFaTd4)acoV9Ybge=iup$n3Eq2*$m=PFlit?ZB7cKLv<0;PU_g literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 deleted file mode 100644 index 8aa9c25424b23905035281b997996390c11fdba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7248 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..0150dbd78e71d2576f1388e78a98061cd4c28ce2 GIT binary patch literal 41970 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 O)ujoyIa)g=R{jTN+*{26 diff --git a/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b120016e21be975fbe9b69faa53bd6ef539fbc5e GIT binary patch literal 23007 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 WzVT>QbnV;3rjqxoy5IbGhW9^y`RADc diff --git a/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..592af17d4163684fcbc25bf007aa6f7e47396bc8 GIT binary patch literal 30841 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 K4*Z>V`F{ZjJA%6a diff --git a/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..21b477241bc893d63de9b52f3e079eee560ab3b0 GIT binary patch literal 48574 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..ab5ece8cbd5d9ea0ef3d1345403e641463f1d427 GIT binary patch literal 27316 zcmeI43y@aTeZbHCUhd=D`(GZ~WgqY%N`PhAZwrY*T=p|zM$NLYU{Z@KvIe5!vOLyR`-R7m5DF@kR6B-M&_>DXGU)~!i9rLqB1XF8F`>F>9ddBWXwGOFAp2*nbhcpLuoT^$>CBXo~f$U zi=+hRGTCm1i1DnoMZ8TL-WadN{a5p@m@+eYUsAj8h>2OdPE4|?w&9RT^@>SQ%dXej zzoOA?LV+j56lA%vt0`z_b4QU0Vtg9WOJ56R#SFD}4xQwTC#JBFPV8ba8Efk$h>fKE zAbC;#b&xF4H=mavF^bANZCcMcWXhr$Q3NIGhE+u#0;hxrNw=e&O^*4a6Lj3yyJ?4W(E=Se!=na}#&**DZ1K!qC4;T;^#IcOWn}Go; z=AZEJm%bU?*SLKE=%IiD`yE9s=UUuEy-OW?0K>88(Xd7-4;`^%O6+zCJcttC4dLv) z%BlUX(n6lu9Z>WR3cMkvVFdld=n!qXTCTEJKn@vl!EbUKWF@I1DwSm)u_*6_Q%}9fYeQ5 zs%?uOC`GHp1U4b1=X=eVVZENOqW*>+K~D)^*A`RjM>R;i|s_Vl?aX1KR7Q$G~^8)ndVM z0XT***g7Xn7r=`GwK}0GsPtPgFJEs+H&Zy42cSAH>D<*h}1y zz-Zp2>$!g4>6?lX^r4#fTwbeeCM4N@=^8TvY%Esrf+o}g&gATPXV|AW;T^}*(IC%w zq9pZJP#Stn0&jDjbS8_D!M7x+1jek6RU5oPe%Dax9tyTuTLy^WnkYfT!NgNa0c5fl zv+$}j3svYLb*I}yP<*1~;uyYjunb+Q+%Y6Lg#@c5IHE-EQ9uqIfWPz%tqf996l|mu*i%HWmCz%jrlepC-gi{_lzT z>l>6k-DV^Y$8y`?H*ZzqSjamI0CdcVGp^29uA(#@Dq&hptBO=!RgeXNNX@2}W>#t4 z@pSqo1><76ly!dqqvPx0$3iGx3;fPtrMOFSHyD}Y$vP(+PWVSc7i(dBF_i{822`cH z7DzC;hAJx4U8(AHDZ+j|kfp%7^80Dju{pteuL|kuGIh@WcPBT>_C%E%oakUMwkq&| zCba@e*3gg}K>ZT5cQr8X1Lz8{cqEi}>q+h_SAYzN6fTr5gRpw@+=y5M{=HmngF6SM z``mYr2^Sz`A<=MTE@8(|+vyF6PK0Qk5N#az&J1B-TnUP3J*4*}Cms`riD`rfP(3h6 z&sFr8sP`4!wJQ4*@3hlZkdjU>lPV%5b~tFGfKP##wH~k4@bsew3Q`7W6uzN*LU!fi z6Oo*Sc_TYQy&MyIIf&Sw*zJ@8E6@IbK8%jYWy4(mKv||1(v)$Ptilkf8r`TIgQN9Y z8ePKrF~qwefvP$@toS}Hg1R%Wrhv+6AS$pMw5sksf8MRrIx*#hT&45q#jm97)~GkS#;c-+LMfU9p#@n*@(A0 z@xoV0!ka%-R27r{ZTVsc@I&|-@H+#z_W|cDMKW~-LouM`c$hyf^p_SL^S0g#1qv5K zp|`gqtEv=LV(vtY?r2oi8ZTY#x^`6PvfoyjDS6H7YxJ^uY`yhiAEKoAsz(rnh(4#h{v=*b$hUG<4#sCJ?t^$yDEG56e z6x)F%)2_4jZATte(jJtc%qi(koI+k^9u^NWpZ-9s>X!g$uY3@9PT?3#SzVnP$e6v^ z55`F_7KTrHPQK0n06kKp;>PC9p#W_6I-FCSonK6?Bq zWP*2iqoW^Z27TYZBzZKSb> zwJh?YmRDs7=l{?dt80M{F>mTn+NTfgxZ-!>8^@c{fgwa2p;%g1f&l-^kTKh%AwaOC zMh6H&y8JOo%o9*TeHpw&pJax43cym&=B2_(!XOHNL&tLzd>KMP>pRdnEnG?AG@_%> zHy;fn>M=J33w{N#+&N|X`QnHP@yvc|1g5#xSFzA-+TcZxk=14brND>I1tM8 zIqg2FB2zR=_V#OPP6i3Pszwbj)83oz8LJE*=YSXo5HNU{Gc)7eqwzdK$r)s_E1eTi zt^e5rZukfrhHq1^3`yF0lyJ>`oi=FsN=Egxy+<$8TvpCe{!Pt?kd*w-(EqCFbws$` zaaU6xL+6KJYGb$go!=9)r3trJ6_6(cQd`74exlp^IBqXSGIYZx2tyzp=3QUsgw@U@ zm6n6>-3whf-ah53M^KQbo(ptfJY!)`OpoA zsRqh}&slrHF8l!Vl_+a1=jHu)!FMZxQ*DmgGw0EfqhU5)0$H6ndGsE4sU)SVi(G#v z{&4W`Vs7O(PpE6>2HYB40?` zU8VTCq$ph0u*m+SwtriwYed4@UIr-cL$v|6+~RkZ^@e&r{9_~#{q1++PUe$`(z;sx z)4-IVxDer#sl%#w{h$ryuK@0#xX@3;K^>DYuq>h*ZqZhln2bY3@47Jv9Vb0qIUg&%9IOy(k%iNc$zkai_GFpncbq zl{6arV!PmRP=;g;UZ=Nko_60+-rErxxFev9`Pu3f3@gSvC|xhLr%Nw%@#|hHBcOFJ zD19r{Om0u8bkV&=i>TLHVI-Mqfu<> zLWaPPM&vuMBE?%Ht%DTX6Qc5B@K!xai}^23;9$HuzZ3^%<}fj@V5Iv3@z+L@Us~=5 zS4uWMh*Hi9&Bk^$1H_*{L&Kx!`xCN3esBd5`DgqN3_;^-q0c%K(qk$HYKY1fsCt0LJ&P?3x{*Ss7ePMbRL_)QbF!7WT`nOc?tbJRumkXYA8zV@A>_-Nj z9AXiVKVGIEB62l#JGcxA+xYKNflb-9(rN1b%v}092(}`bbK0fHTgP>kT2Z8rl)yXg zmGLeWbKMmoJAv>y9>V3Dw3mPF>zc-j@{>cQA)W0v z!w8zWheAw$X*HuX^{?5gV?!lSW!fbJxU@&2C5S(#-W%zBYhPpZ-mFs?;QJL0C19s-#JRI8Osg9?_EOKLbU>cPS zgwJ%PKE#dn{?gGByxHi6GP_nu6I-JkjGoeTF@WP5Skd!O z?MPdgO&CD*^irM6BZ6*73hjm1X(e99(b(xtF?V6u&KNtb?LT&UEQEX|k}<#E*lF5P z)B;5Pu*wso0J6FaC{%Hl)Qb6$qV<^Lvb~r~1nsVTJv;~u&_3S`bpwY!{abBhEb}4E zCW@JDf9jj5vS@5YI#=#@jAiyp=R!1J8`PH&qoe*)>&5)TGg>XzhP0q%e(*{@3$+ln zQGkLt`G3?3f?R9uC_lhKNi*KadW}~CgUWb-Io-`|B{U>&cvNix!`*qWZ9{uB-K=57JsyA^R%)GMhAc(( z<7ddGsL=kf_7k2Xg9$?91Gf_Uw8PWQk->{EU^$(&Z-+O(<2ka|SGjR|+o8(pX%lSvsvHV9m@tZb8s@==AAj%^<+*$H$cx*po;7EZOZ=wz-0 z59Jq5{Wq=C|xPCUCf?s zPBs>e)x7UsE!DvE7BjA4& znYZPHc?zCS@Xg~;lqsAoXwVZSI25Rrr?b+E03h_Yg=)L524RBZ+vDl5U=}M3!<{+w zO!7P0L&Y8{)Aj&!2G-7X+bI?^W9Swwrj|3g;Z_zap*YBuCpTk7SBInvA4a>UpvX=A z@16?YvkV~2X`%=vP_ER?v_(6oT#yp&oKowB5=A?wqMcJ1h-l{&E;X|8n3xG3|8{#pJ?Y)v~w!jITZ#TXY(KJoQif%okCtZqMcKYGS8nr)2U_12LyR4 z-VyDbigr##JEx+ZQ_;?;{yx1F?VS2}pJ0l1PQ4or$45wsFcA~&oML5tv~w!jITh`k zQU^TRImJ|@esv<+ITh`kigr%1{9zVpV#4!i=T!7*!RXV1EXZI@U-W6g=+lC?u#zeN zvDh)urv;-=3r3$7%;)bE*~!qVsP6?nKoO$|t35FW2NE;F}WHI>0tQ+aM6d4NZE+qoOKaU9*r ztV~pRhEjZiThr9UR4#?CJFab80bzM@dvCLs-4*KE?5y?7vV3XJf8f6J`T2X`kDva5 zw;!gLz<>H%)-q09b*%n#qH1ZyMO1s9QCyK$nMP7 zYmx0GD}k^NqT;pof#G-g%)<42O&_hJo|AgvC`Sv`WTwA@70w9rl`N;-*s6zKi}(h! z?-Hf1Cr3~{r#xL*9z-5B8C~vj!ktzLCQj#HYSbt!@#wR|n`_cV^+#;b)%&k2zN;U5 zKfbw+RNB7&BJyRjz$zMjQ1~A{QkSAU*Emfe5F3r7T}&8eODoS4@{&cHmYk? zIx?jspfkd0L#RDZvKk? zm-1f|!ro<&2Nn;Ly-zDHm~B1RXF@j(Vb_n2>ZDXum_s?&>nTi?H`dnBnd z{VNAo;aG#K#if69zQN(+bz*u7rD62gfBW9Tf`T3M#kHm2g2)prtsci$%s3p*%ZInP z7$*bbyvc~&aJxRt+kR}<5L{*xo9bfA_ zgp|S{ecMsrS1}WP`&&>rDBG(A1dt^w$pDuzU8tN^Dv4_Df2yQr z&h7ny15KI5D$L)c(=|t5-FX#)A-bfaH`2!%+U{_*EDEQa!^xjsbX>gO#vgH=ayb?g zT9cxl(Lxq|7gCl6p`pW{@tfAe_8#|me4ZuACDI`gFDpIPr3Ml1*vvlQVu}i;hBGfF zuKe`H6H6OLekr@e_N7tdH`^UbD_B!EUe zkjitWI80#H&|3HCuZnf=T6}`X8ZXNz_W3-vv!pzG!@0M~Ek+m`1Qb$v6lS$#2!yPd z^`Bf1=TcrZl)V4u#OzD-7^85pp(?m=l(~<5C9|=acqcR`jSfAp$kX_V7VsTY>Z*ec{b>C+Xx*fsl+RUt_JvDXu$G$O8$e3O}{7cs4)gR641niAiteEgq z(D&2z*$0l@6In$?D{dkTmjZNRk&7;!b@P;}0sx~YIaBN%)aY45XqY(3#Rkd%xZosQ z9!=e3=NGSTeMbjeY*NAY4z3H8TG>YS!3<*g7B?kP0q^p_pC}Bellv5zH~Tx+{cjim zCbHO7gwR+tuj!0VgN>a+vo+R4`;346Ud_1obO<4?7hf2>sI_`$c{6i+B-FC1Y`Jz& z<8!tIZ9L!rS9x5v5eS6{-dP`++a_3Z%JwncXs>n&LA`53KmGhSQq10lH zhwGL4nU$1+C^c9)qOW9849;Y_VmU0Bs+=&!dRwPP;9Yb1Q>Ft`bb6k$sBqg=O1Y(D zT!!B2SVpmc%$SoT^BJU)SYHpVGi$4p1KI>Z5on&^y3`Sg-y-*A*D$O0AtLcN}Ma}+g-7#9V{6*UzT}f zS^8XNt=i_2M>!_gZb}+}@J&jUyd{YAfPOZLxW!^R&*h{sLRbJDwCRaz?lgiyW)&!K z^pqWfVYw#A2~Sc%d6V>*@J$+1l%5Wbgx_p?HYD8QbHVIEYm9~89g6^CNrN*b1Km&8 z$e$-SYLqIZD+d<2Wj%SPd{&awo!rQLD;mZZVRPCPEQfiW5AxhxCryp;6+u+O^|L6I zh4^wZN#=P1i7HV7Ro;3l?-6F356)@v+<9u6 zx(q2`8xW}h75Uf(6Hq21HZ^r(JUQsDWU;x^lsZs}I(cn|X+MWUCU(c140NG(70=Zr zgrvc5Nq9zVfR`h%$`oG6;zA%r&=1;rIMAq96XXV@0VfG`g6LUI%T!59K_V|((OJ?@ zJs>Xb&SxCF&gNo9u7aYY=5YAj0Iw0B8rIzy&MxEe6qta;s~Izq2#*oNw9$U^x$k8m zK3Qi7s-!A?ETXPzy5nqYj-gAUze+Fvv-e?~`BF+(0lNz}AjV4h0F9VAp=G8hXiYm@ zqI`TlQ!s!W0*;%Ci$qain;=p&RQ3tjNz^7s?Hc*@7}Xl%2i!$u3yFrtx@ z=tl@^tDxA$%RXb6MA#wQk*z$b7c!f2O4T9@FHcVqG}3uSSYQ!Nw6**EEOt&AB!U^!*cQXIKwuRO zrkwHW>7{A_kxdKaJeUm{0gJ)v2mNU*s1iVpRR_*)E5XT%A{MqksG-daHgDs z$SA~&#&JnJ_KX^{D8pn#0gWlnQRBEWXVf8z31>uMW<>Ew5@WFM{JvY&D{X@$Gf8IN z`=jdBefQmazkR#668q1rK7Y~LgBFO~@ziO%m)I> zeT;;L}x926}-z)*MhH_vgFXME@ zMgp5j%!#KfWkkDVSkM?FndKSn70YHM#d1vEizjYYaN<|{`6N^4q&(FiK_M9cPpiU_ zx`la-k>qriJCWtKdCj!iUjV^1CQLRmVJ0V;0y9>9S)bSy3VpkgYP*FM4OS4vzGoz7 zpEWXku-_sk91e&eBJPl7>A}HqP-oZ~tVX%7Eoc zsR&YlF|JOL&G%cpb`E2&H*%=8KVa~hB0d(-!P?p8$YfSAV-+|4U|(Sp7L{YZsuB`XE5C?;OmRd8y#kJ5;ta@5UFN#dSO$eB8fiWNj31}O{kXIeYp;ZsuEVGV zcPn{=mB#G*N*j6s9M?97WOr+qn*6*mtXh})MW8!RyMyY~cc2?&OzXSKGjfo=a1Wyb zMZ+tMby63~-B@>l_h(8(at*!{5fIZ>1#_K$EYsN4K?9VCk50Fo$4@8CM~rW`G8cT% z>Ee+pxApCzOosCk&w-5#lZZmhK0$Y7s~b#y{LyqWCMRDvvefz+S(3>~&=QA#YE8Is zaj-$mX3>!nhzpdAFEwEZLH27lQnnb;X;v9cDQmY`7$R#&K@nR3sG49~h8LRCFie7~GGp@bK#@Q4 zZD2rQWWUNH=rVv5duo zgV0E;W5G&#v`%H>*E-qxdKL#jnb*xSeZLNR!2MhURAEjq(g@Ee4?3P^FjfLTXI1Bf z9w>l;RNSG|G!~e@5itj`O)qt4#b28+HJ`3LIKz&o`)0QyX3@dQ7c?0kgYZcM< z5ai=zh{MBM0n0br639>L?^xbk2h>s{SKnCQ-j+-=<2WPXN+YLQt9QJ!+m$Xt%tY(v z7u7)(s8ksn$#*3~sybkbGkJBrk;6wb(`wU}gmV7OPIMvt&t0m>(2Ipsu>^;vmH{mI z)DoIh32p6s$Mr3J087;vz*o;mL;V@VzuR?$#v-Q@hv0kA2c$@ zPBQW+UFJN%_hZ_?br@v&c@fQ!Bxc{zaXPPQ!EtF5{y>=z38}X8gAJJ=WWL~^gHO~H zs=9iW<<)|Y5uii9(fRIfH#1FxBuhTWtO`{>OB2hiS@nWRuVKhG%bF6iLF)^cCg+Rb z1i=)wyN%=;&Q%DEk&RuCmvv*w#sKpxpP&+8p;Nj&=<06m54)_vP9rP7z$(D$Dyxtj zRMh_6yZ>$ve4 zfag1XHFP+)?j2QD1MSXCn8C)h8k&pxs%Y%2{p&!=RG-IHXCZsu%ua=c7|mk(-nwd2 zy$ze{QC7z>SThIgoLXnMLMhiYe^M2J#YXJDTnzP55bjW`hNU5j0HZGx`Pe3Zel##AMbrtf7mfIGY~?-G#JT$H%7 zSFuk3;a{h3@o~25hP*0Ddy9gwu_Oqrc?iUm=|x2ky`7@>@oS;KDte=gb)K@GRM#-W zJVsU1R!9uvZts1*b09Ln4Lquw;s>!;>O$WC4CyWdQdyJG$U*#5f*9_&)M03{Mc!3k zFZ3GCQ(MG|I>@(D9;@;VJaVoh!lU{Z3!=`1F4%TBVG3 ze@)d|=M@BbxC`$LErSB6wj&bPd4X)eEIo<-e9eS4pij+F2Ua>??RLYgzkOPRpwTA8 zgwC-QE+VpR{aGCE6`b-WR;L3oq4zkfbrchq2EN_Mw*jT-*x{5X&vZ~M)b*qMK(Ai^ zf$#n@_?oY!09##AOVJm&9_`91YI~TorOt@_vV)#F8Dqht>L9+0i@P4zNDaamn$h8z(B&AK zRTSOeL4!*H!e=-)^4uY6Ex zM-L}Hs?zN<3WTi-ct5PdsTcw&5%9`g!DbJ0GQ)&}maCaWc!oEFW&liMd+t$Bhpttu zkf!RdJ0+Wf$6lUEFBl^8CN$fQTKfv4-Hq`|1T8#9OZ5zNk{2q{FNI(qnSA-+AWY+i zKZ2DSoF?*<2Eq!E_t4_t`&qL&H3+CCFyKWXX*r$X)dpLsq70i<-3Z*8A7RnxXnzuG z#+ycZQ90>RCSNwmgd?CjA_W_4<+ZNJC&cCL@FE8H@FGsM#D$gBJmu9M5l^AE7C`sX zdvF<>1D=Jaexq^Dr`_TlR@3y8UU81I*k@>*19*MLIX%rW^m95A>LNE?LC$=q17RB9K)LE>MpLt=MgwfbPJ&D6he8Ok zd9WIx&Sv#$`wexRgBAMcsq#SLRrmEDzg|Ieer7hcD{gU}XQJ zOUj{Fq=UApRC<#O5%U;f4r`8YS4-Bv0=1U#W_)LOqq&Vegg5t&)x4Uzvc(XmO8K&Q z5kq8?@GiJ)buI8g?-+;Y)fOQ7j&at0PajXjtsae~UQJ-|Q6OWvecH%R0f#UEKhD3v z$Wy1eUlv5|7VzN0W-thSg*yRqBLR89_@gF#5oGNt;JLu$kIyQ!2itEX5bTYBzNO{9 zq1rTQHMU%nI&D*oOoICoXMu4zZ|@=>wL?AFli#YqI@`8@jNf(|oDYn=_cGLn6T2B4 zmyA;u=^(;DU&>fq?gIS5% zt1CSw`!nQz%|_OuFiD=f6n5y<>WkhKv}GxMo%|6zs@cy{wv5ObmMbXB#q|dC$3`LU zcy@n)1epv+jbly1^2KgdQk}(=R0M63&J!(HFJyU=Ig>uDI`futG`jY4q|2~R1b(9@ zrSlJAKAO#(32_EFRswog+DzTQ7Q~{iRR!@-U!w}cZ_>^r_(4h?s9RiApGBeX z{6y+U($m}G0){EF2J5Qxikk8W zxr;@Uzv>9BL(Nnnp@Gf9^ohKeCR8S{4?V}7RG@+aUA%)3V?1Cw^z66U^o$d$)!b@ePO=t-sk@9)0N<$J)?P*SZh&LuuTEemY`9zw1)Wh&$ zj8l(f+{D|Ux%Mx#094!PK5G)gu`!#r`+1~1txUy?;Fu8x7OQAMA;S=W z;9m*Y2KcnE-vC95eV9EX4lHg$KEZOFTc^c*+$!`p7Fd8XY=;chtZ7pH3@$?oyIWPo@hA zrJ{dE5YwVyt;x@XDji1Br5dVyure6#nF^^8g|1-jAVtwVh#lPB@EA_c{OvP6t*NldjVWiBiVvg!!779xDJw#h~AqHeI zPDQiUn^J;mxn}`2r_IcPzDyyv`xKD1J!1;rt0EM`Al&}BLb2d-2)-Ga=#0b)tDwh- zqf{agm$t2lOIH*o*;4%}>*`MuxcXC=#AG6yp{nJbFi8$FOht-&l%K}pAh_}q3mt~) zDcabM^3$QP=58t7-sPvph3bCKGA)U$R>$G#U=canxXVex&+4Hy<-F zZlaaxA7xNap$A5ZN@X~``yPk=-!7F! zLE2sfX-5%CCP|n@aoQhwTjQT)oL0Dv0DBdgv>%hPA!|%9J=CmuHep(HbFG&DbWg;i zZr4`)T2uHLzvgVBmGrRpfD4qhrbVeUNwiGXy{~Fu5Xdw}?zYh+kQd3bK1~(>wXR(z z{cU<2p(W4bwN^8uBM+kGz;tMRc3HOw5KLMf6z(I@b2ukJOgM@Bsw*!%&O+}eKiro= zw)R{=dBw=r^y$wiE09v~SX!^WD5+Vhr1k1=FUoLA_vK90t324XAH|Je?LfcamvZWO z?XLio+n2IZAAhS?@{_Ev?oQduq$saV^xi?l;Crynjl@Z@W6v(apiEc^J^q5q`(ypS2%vYXOOrDkav*U}}z`!vu zhN~uqgGi0`Ap0>8Euwz`%k~Q1LYW)(HIzbPeG!dc>K#KNUNen+Z zi%KF}Yg+6?_HG6nEn;3_WW{P~h+j70Ww)BJ9d}YU5AH$0A1~Dnx0dRLeG7QO!F|2c zVrQ!&SR3T$5e8mDs*yt6qLC^cOIXhhy<)>{T0i9DN2t#58K?64uOCuBbJ^z> z-SZCkqxZ6is7cgZiFimuw<;nEgh5)-*X&WkUnrFk#Yg!+dOjjQ5vWl!dU&Bcb{+ZR zHwG6giQ+Y;^J|gOwd_PoKsS#`*5wseyJ8&0QPgaKY_J}Ddr~RUQ1Ww-wA~8ln@*tN&j{5Q~qM<)OP literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 deleted file mode 100644 index 34fd067ec122fd5cfed8dd889b55754c1a5cd948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1541 zcmV+g2KxCzT4*^jL0KkKS;ZEfwg3PGfBn^2gO~xHiyFe4fPes)09XJS;D7)LD1ZnU z1Uv4D;0u2M0DS-e000000000Sz?hm0CQO+!FqkHqWMW_lU^#&?G#E^oGGt*eO*F{F zz!1Q50%B+|nKER^!eE+dk%@pIfaV0m&|xxU$&rM?G}9v!07C$jsh}D(85uOt10Wgz z8Z-a^q@;y3)XHptjWT4Oqtj8EPf?~#3{OIBN2&M^;gljy_*AdzrBec*f{>V%?io~J zFhkV1%)^EjUsC-FTu}I)N`7SgXGT5qIDSTFA0s$3-(Yd@9fwKK`3IrW^fQJdxsQzS zcRZbs3&?OjM@|mxXZ?)hKIO+5aP^(brTfmu1I=Q}$(CNFmlGKIN1#*Y3)XS#RpC8P z-1*LqNrPASHpBVX`w;X2+7~tW2 z$E@rh2*b13aeMkUcuzQ>3;?8FXFr&58nPs_nzr`-{8wI`WG4PGo(-TJ>!SY zUgCdc^*H*UobY4j3>duK8G)X+sN&L&PS6^u{l`%KRc2i#!14(jk-*O_)*Ct{3o zGL~dx3D~;^S#&y3@?kK^@h9mLs%20Y?kQxcWh{(~0R5s&t{8Y!c``k0UT40U94p{g zne0bJcN5e9NzB3ra#ly^c1mdrKJF9`kg_ttQjJ$>;C(1aPaa>sL z7qm>ShorpKSiFPM@M9)%*&*0hg)mrR$%4a!!nzdcGL+)Jk&(pnUqbiS=TA}k*U)+s z-dDUwntmmIBZ_du#K?CsJxPh}KZ^Qa$n2hi!u`T|tLb~J_>T$kD~Q7@ioIyRJMVs{ z`#9<9CEX@hw86y0KI7E`)deNWi#@J~T^8F4spXBKd0=o95BVi)%jFrSeYDPmR8QpH$bne)DLILAk%;Xbx@ zF*7b1c3C@<1G6(bGqUM%bYkeshfXZ9#&F8B9Uadh(Kxy|osq?yG2GyBl*Gk2?6|uJ zXAaD=Vc2Cm851XhoKbNy$&&II;$pJADTRrN#LBoZa4Rn9jw6F4;bk63UBt+~_vvHo zGP4gN;<%F*E*x=>uT!r?mLHL3FtdG6VRuH(~F}gOQ%86I!npfaI&YR zRI*MM7-ZpGPAtYISteHjWVkZR6B8w1##}~Kk;Rrr7-KA~Ws#E%usuh(yv$rCcswh> zOjm;8ipEUN#p`;F^ep*GP4sh%OK1w$(e>b4#FLg6yX%?ld`aO zNjn8m*+&&{sl$tkrNZKqi87UnQI(Z(Qw4#+ICF}Q3Y?)k7{h@$%0?1hI3tl$D%6U} zFdSSi6>cj?<1CSJoMeX=7X^k6IF1Tf#8|}^SyaiDD-4zyDvYpB99#j05yi&@xG<%{ r!7#$CFqp!t7>vPYM+O1I6>*hugBVO;mKX(x|BJaIoG3_Qi%(ksu|MG7 diff --git a/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..5f3d72c5e5a21e4dbcfa2d1aa76513eabb4eb4fd GIT binary patch literal 16732 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 LgzL!Wc_05bPHV4% literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 deleted file mode 100644 index f638e4e1bc1b2cff3d02a10b5594d2fc107d141b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1630 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 R$})Z)fS2NR!es|8_+LHOHwpj% literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 deleted file mode 100644 index 91e544e4c3ff6c63ff616062f8a7d8c18a0622d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1951 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 deleted file mode 100644 index 87d8693df1453a2c5d4ad7917b0252b1228fc130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu?@T4*^jL0KkKSrY>VjQ{`uTtU$Q5C8xGkN_1x06+)`zybU@P@w<-2mk;k zr9=UsDJdzFBhkJj5>Nb)Njk|DRCP%wVM!)ZNveQVsU*@sNzy?i=P4xAl4?mcNhYL| zAQ>g1StYbfB(W@#(pX7s2^F$SB(g-Ox^<-DnKVkB0KpQ#d8(4)N-ki1q_mG*lO{}> znocUN$udsKJgO_oOo?_0IFJuX1e4l9B*_Gm`5=;FK_tLQ&calH;wqIAxss_Rpou|= zP?da1l9Dha#F52-;GMdSn562J%$Y$aOhyZ{900e*lssKPn01fVxP#_ur zAQ}J@QmAOjpeZR+Pf&iN+7PO_B%KK)$t2Q%jFMQ8DS3z_w32d3G?HYJX(YfcNs?(M zq|#)WOrWKtu_RoLEVS8Bygcr81o<;wte>sdNqKl46xfFcj!efMlvwBZ^fd$V5XFN>%MlqN4(srbSp&3SyrH+>uTc JBn46Y{s4xXro{jN diff --git a/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..2d542516abf581ab8171fcecf5bd40d17d1bd607 GIT binary patch literal 15231 zcmeHOu}T9$5S@felpqX(g{a?O>5>@jzu9(QS%<64jVwf!8~pIMiW9MwwLhMfOK@*PwBvw+2}n%t?Z zWNUp{3L8!Mp${2ki+C#UB3wP3CDfXk&`h|$48q+x0ot&(&qQqiT2G;waNh+`7;EFs z3DA1V-;<3dY6H-E3eAN3uH*q)xX0OP<&Wb6Knu{S4&Y21C^TSV>j7GT7N89m&jV-| zk1iq*h3GM&$3-&TokKrDFZ)|hxf({5-=4Pk+r6nAoMHyqklGf7derX8@ zXaQP)Hb^DBor?g_0<-`vKs(AseW%_j3ha>RbTeDi?1d3e+o#kOKMv|ckn%yw2W5;X bV-y6U=1RD^=6Y71mQKDF&;9qF^FHT&&-3+ozHU5|w;HvH z0n1=Kz4NJT?#Yi|E;uPpm$cM5^RK(OEZ*qiQg&>Pi_0;W;;)bU*gxJALO<}6P3q8E z9i%lh)f4KMSR6kg38SW0P)g@F`)wr1aDJN-Etol}J{PxRF3LQYuP-HeAJ9|!uPa?#U>dJ@$%l-w zVW^8cKCvV|kr%}}ay{(J2>f%Jf`XAVeBdct=m=!7IEF8FvoHr@N;^UUUNlx=HCrnL zej+Um46io#4|#Q*)JqCCF_Ij~wzQ9RnRS$zAU{y?L)WC$R07NW?dCR^iMxO!Wt1c7 z3Nnov9fS-*<3^LrgIpRfF9^>Cx0*Pb!5c73*rZDTyizLqpQF$WxbdY<4Q9C31al{iig{>@osO-r z>iq+9=@sTNo3pIj-Qcfu(4fT)6%9Jy$6H;j8_yClLi`+Ih;mS4oj!gfb&B#Npjll$ z7U%?fXSfd#>m}q=zv^ZOm6x#b#7c`ero4eh%>^28@MaQ1m}Hdb>39sq8m|su(+DH@ zX5_}}7GI~*A4iE&;EXj@q2Hy~_LL#h)3!)9zxDf4f0XQj<}0HaIyIA+uc~e*sbWNq z0#bf^0=Dv7{`N@)@(LdD zef8Ebs(cwSFv8A^hm$})XH98tx@kWx; znlEo|&HbNbam(MwNgUi)!N{)jazOt1j-;&$h!->#8WXq^fJ=qf~ZVPSgB2(BTGFYgg zHMf=u(NRIEu^AMEC@gBNYeJX2TMS2T9PkP37gq6;S&$^a z%~BQg>!w0)Oh}aU44xW({4-dFs}sXWdURhqtk%Xz?RL{}GHB^pFf>X-#EgbHl{ECw ze5}DgYLpp7=ZH`uZ2kCcc<8C8{z#llA5)pwk3Mc-m^{A>z6db<7P{U zBlEaYeM4mOZ>#oJ>qhJSy~dBXxuFGdXfJ-!Y}*nw_~ryPO?r zvmjcunk(*y1%Gh zdeNHsGkZq!{8^Li0h}AL$b4z{R)uaxkg;X?H*-eMZW_yYn)o{Mjfvq&L;}0Nee-Sn z$H2q?n3ydeA85~o&om765tIA2k#);Nmj!%(=C47h)I zvRPZKmGIHHKoglYh9ud!rf^TRnuRG~)`uNE^(r83`wcfvfRsmIxO0`@6CqfTa30l^ zh;|GEY^WN-tAh{}jsD)2I=${lYcSz``I0O~79|U&y^*hj4j`p>mm=$9M$_RYb-n@& zF&5A~m--fXL}QzWpd`B{0&?LvSfpkHgMA#nL_bhFo}YmvG8>XQpw>#T(by_L_rbcv(HL%4IKKgd%#|C6 z38b_54E@Xb+xbELL{0s89>T#W_wUW&8po95Ku;fz%cvcKniSO|1`n?iu5pwr%YZ=Y zEC>!Xk2ctEEs#r;7CWYoA;4KhF}gHixd9u5Z&vC`Y?wYISQI5P`)j2~gOLzVx=i|Keqx>>VyI?7-0;ALTFqm9}TPYf>mS>kY z@5Rd7boE?dLJL?N>;VNQaim$r0MvvWqg81!GBA@-C_qKc5r;HaK5n%2>ib9i8pmj^ zIE9f8FE$+G0g5y|3F)V&i$SuCBu=iRGGisC`eo_1^6ccd5WvFF8t{+Ki2am>hDXE> zh0>V5rckHcwF*jHWbKmuH4m$92th-udUBjPl|q2kD)LfQK_EVa#O>&~8_2=*He;i@ z+JF(+93eygAsuvv%A^T*FG-$hfaF+)3IwnOWOz~oO;t$-CM=U3G%jEj8}z<=EBxo% zlCOJG(;vD&t*5f;YSD?NK%0!>FKX~Qk$@ywQ+qHnS8)CQ$ap86h>1oIGkF6vD^`Rx zvdkDJz12xFATdrMa4S^)cwQhR%-}voXNGZHQvrRRKOID-ij-DfU!AnaLeh_B_+F%f z`!i?(fvus+M)hQ0HnCuUF6!R&B&ehQjd*aX`lg7VQ0rsH;F0a#_sWKMMZa3Xa3 zJd+~z>(2Uj4rGs#249vxj1JkRPJ4c5D_u5F%{Q^Qay|{}JRqYM0;@RE9E>7F3*>5% z{3sF=!r+`+DZ}HanSp01Jh`Ld`HeSnlq%4`S!yAux}OI- zHiF*rdtm6b+qKu;8WI`qK#7Am=bKi~5Oo3;fLbOYNL-q_m0AHnp)K{-Aj<<|iAoYo z$rY+E5H3NB`#&C0ItNC7!r$3y86W)I-nLoP(atEX*(U1CgLH6D$NtHX84!$E>^kyR zj#k$gSK~f*G5eeA`x(%4H?>B4h?G+TM2$I%PJv{gAgHQvW_3cPtAg1%&afRsHxS7X zRPMSoDGCZ7`3M%n`)yALM^Z#1nq4U7*LVr7Y`lY$3_o2HwkyG`?%!`1H%8sCs|y4n z7ithY`p3zF6UGGSJk&Lk?1HH20o<84qTimXnL%>AjaE}Eq8;m+t zhIzMo`wsK7zs4CqEsK44bygS+6>(9O{_KJ2hJMG@Z_E!5`@|ip-RmR$Sm~;h)M)_d zI5RV;flJICulK#%xX+VZn=_mx|aS2-@<& z)O6cHX9UIqBMG$!Vt;uK_L4Kut#30xYreN|tDjl2d4Df=&b%aDA(l=~kD8Vg3L0b~ z6L%JkFaIvDsq4|I)h|~b{HLZRCJU8^nVcCI=csl>09QCura1D>f5KsVmdzqtF#l{7 z#6ACIeEGWeXIG#HdNsz|V&mEG40|4oy)Ali=-eOJ2lRtW8HXVc?jYX$@z2`FSDF;r z@0Z-p&yX^Z+Q@R#y(|6}XuN-*Rdwa#2vxg!N?Z;|06<1qUD6%(zC%Aog_N~~w@7BjX z*T9|6F4>uD_r;v#59J+R{pQVuH{7e_7{<^aw-2vxxU=V%dm9$}W|l<$Hjc8`ncZ~2 z3hx*ftS98l(C(0oOD^`u6ZEFj$wv;1YDPN>}n)M`bX$RPVmByxW9{ zidgSm-c#W?B`M#*v~*OA$AsQEzAMn0{9L7-99^14jVNw<81$s0effM_t1JU%2=J$v z{mL{|M$$-I9%+<5J`WMaIc_ZF;!S~00Y=+TQhE|o(L#+0#sCBMyl@gn!Daa6*dT*Y zl{(k7E4<7JA&o|v=zQ56j$c`4nBH+Fh!8~;yGej-uNz|)YGYCTW{l! zEjZQ|lfqzBnH^_Z3o#M&)mEzkXX&%n_3w(%Gu7CPP>UU=w2UyL)4M27JeK0>Cw!75 zDY+Q)#Z)`fKr(>wiZ-m8-iom@>6t-9#U+^*p_nZZZY8zO5o zV~$bXCh#-N`#M4yyh&E90wNFWMQil#wt%B0#HUNFteJ%G3!VJm7wu~}-MA+!c!<{R zkNhpjV%4opcXF`&Xyy=mtNoX4$!wuzgwa z#CGN0+qYj%zPfem)%kT_Lch4JmwZaaW?;Us%^+yDH@A?ZgCMjCo#=7H6Ev1X{2Q{Mn>-HzCWEET|6K>X zM*z4awqk=#-WxIzyssoPu(F<(s*3M9pDZsb%a$CO_psWrs6NUlb;98CqQn~Mg5l2E z6hip17s5am3I^eDO68JLeH3&H1=I$;kEVrU^=&BsZe5Tqo!zpyh>-}is!Cd1wQ5Z` zN`aR_j@ibv!w40%fucfzn94jRF+9wftB;w7GT|Fg6?Uq~IMyMAKSi3V1UP*BtE(NYueF{8p z280AP6v9-hNYoV_cq~)jY8%mO`5-`q>C=LlGEX+i^99%@pG34g^kj{)k4!1BM= z2n{}=tZTm7Qfe*4_X(k?bV+lDGn*D>aVTcJ3X`2-QGvZ_<)lrLspZrv)+L{T@X(VD z-z7p97iIgKeYd4kU;5mKH)7$sgB!0j_og*&NiWjf-|(V$0b51pmUDlt_0$Ia8@=r) zWlqwj`97&%)pKrO>SC9o)aYt)`r&V+}hwAR_iP4)d^mP#%I%qs;+q(U0{v% z1dMhI{+Me?&zrf@v;f~N$qrYcP!-qo&~M2jedHsm!Pk(Ag*Rs=z8zC?lhktc0%J4B zsxSpkK=i8GyHE=eot5QE##sYHFsIoa2(khO2XG+@9B(PdbIglJ_1BCLcnK%oxg1Q_ zJgmPC3UK;WG{rYMs$L~RzD-4`9iA8&Q<|3!0xfv%Y)-Xnhf{A1sVnUNmesNW46f zO!XWIfi24_V1bG|SWGoN9K!%CY9VVP)U53DfhF_#a6@t*n8(L()9(s+5+c4KeyCzd zhovFslmJahaz=Zg?{fb*2Wjh#!bwo%>i$AU-S)pDRZM zlPbIpCJu?0Mi)FD4C21Drlo;9!Y00>xnIi}erS&Teap``|122o^E_*au_T#Hh7caJ zgT#%|_Ddtj2zm!~^NYs+QYVnAx<*UiCb7^-v(VHsrfVXv17kHh@@0650vlpjpbG1& z#FF~$X!BQX#+F|Iy3=oVYq$+bWs=*;7IV8C^zHQSnaUdjlSnu=< zbriSOI}*IbzQBUegM5AiM@6EKqk`21`3fS*2tz3*6hR=-U@ONX(Pjck$?#2e1b#3% zR3}Hf`YG@#QKH0)O~QMVy(bw;CkU-Tw+^72yG&3kKs}~J%E)0|dOxg5z+?c90+SIo zbUL~3bl4DcAid>&8X2CM*p%)WI(&Aay3x_d3=eHttXEJrl?dUqjR3`SC14ru z>*vth$T)Y~05f>34MJojz&Y+fq9Y_1U!j)y!Mu$@UO8X`gQ}s`n-U#u)wdT`@#-PL z8gzy9;Nt&$uRYum?#U#TL-AOv2}Uf?n7r81_{!kB@cMG^9*K_S>|XjaTjlY(`us2J z{;#oqIrZ%Fzj%as(t^}nAA32$?!`7;=cqjsEAWg86V+noj|jSM)T zY)?k9d$~k55oquZ98PC=)5043l8!a*^&@O&ebcJn zYAE#rT=;W`7oJ^63k+ZcM_S(ns{YBzbLDpGq7QqPKmlnI529P*VH1 zFH2_ASZR%z;4fh&j{vDNtyt|d_n;?;sz38x_ln``V|A9lcB+gJbGQu)tZceDLmrs{j@$R3Jk~3@5w|sFc`&x@3{J>JcMzQ)a=DAoi!a#(s z@t)z;lA3OV6aj0(IBnnI3NxFh!lnA1GHuV=QtFyi)Z%cN)@WK1crGb4R;#mwfi&*6s%ny1O6v4xY`#T-p_@-U7}&wVZ0(x<|gv_egOI zXG5+?M2;rzUU4I{`LJ_y=NDn;Ut9S#)7PNby0=#j9Js=HUjEvEu&Rum_ya_0X4yZd z98-4VHO;uh8?>=o>!B{WH=w()_C2bat&WdWP3u#o%QH00AUd?rTM1syw>UV&3!y64Mm<$ zD<|i{qp&{7{Tz^q?aIJFRjy)?xn5penFe!*vB}T@ zFh4qjVGUnkX%AEb`6@|0qZwhVi=lDHpySdQ%Oq}-?`fK2a-5S-4mOX|yqD(DMQIWM zf;DxBNu`aw?6I7imJMX>*|5yyt*zEPBur5%*u-gcayY_hnjixa)q0nTqBRFH3VQ=Niy7IxSy;ppd`}_|JN4&&c)U^1}k4fX_3$UkhErB zbFY37WM1_7OGMq@OKIlw6SuSX{|@0#ogBP-b5G`v`CojxZ!aJ04zNdvTK@h|_3w0s zV?A8I_rLVQk8aXI;M&@c zRMb`yzkmtFakDT(G$=`hQdcVhA&o%}Q-*^E)dnyqALDOf){ZqSsEVAd?#=)y3_&6F z=qQ%6l0se?OQaSL^Te>y;sL;Hj8ZXpxwxt6n<}?dUTCzj94O8;)uo9r{NufBomGQAo}pr}=#ojELHw z_hNZeAE-Gy5~|YJR?Bk-rzP)7x$P95qS#Z>#S*Y3!Bt`rfYCwuef`X1DK-pVP zH(Nx?F-KRF9er(+A9GtmTICwQk<~yR0t_*k*!>($F2_LX)dG`~1z8Z4##oR&_glY2 zerj8Mj_a`tI=_dZP`$oOR7NXh!|*x0s3>+G*yzVb5ve?L_>IRZrbMYyI{XLpjV0xc z~{X_?pr_Zwb-836#j7*p=pa_TV|U`x9J!Mzj#pnvCoMf2et`z zfW&osBWz=S@53i-W3$y)J)@%?O|3%#)BWo@pH+JAM~ksWlEdU`hCks4eyuD34Oh(L`f1f7Fonfo$ku3v z0ayYaDrccjP1jPl%)j;oF9$DR;L-Irl8fX_Vw3{I#^!l~aT#9fHo~w)Bwhhr{WY$v zvvCiFt6CC>fMOI*s6_3Ew*L;F zd=&d+V)}t`U_=30rpS1Lxx^7R&|Bl05*>xhGydKz)H_~ZF}8z9FlJB!LY191-NmU# z$u=)f(4~OHH0GLd`t%ibxr_`!x1Jjw^YI&OCCMt88St%3WuQ?*iyD8&u$On(V4M2pM_(MkPY zYQKYILWHf$#4jc(r;7hI)?LL3UO|^9)M`O`81;w$afMwu}lkJD~@p!60so- zK^SW(S84fhc>BehzrC1r=H*4S{kv>i<{r{z#k$$TnsU?fGgIf!W_F%a|M>mgb0UF3 zu=L^3)(fZi{<*rLPrX08<=dvrq0MbAl^Ksj&!%RCDcJFtah(4p(agKJr2{pq7KKCG zO7EH=^@YD?=l-^CbIkzyZKhA}Xe1(2c{^;Tadv-U5pa3U%`K&aDSM_H*Zq6*tMp>g zLos`5zIFwxUk%w&&jnjtJFi~;_l;RmVS~%Li^>eUmp%QV+hH z9C1$mynfyCb8*|h{Q){_$`%{1fo7j64*c`u+1J@kqAM@9uLIV_nI5cj79Dsqv_JpJ zvwO?#1!O)|`J2!^eRbyx3m>kFo__iNX>Wd3(*KWpHRov&7w&YOU$K1M+B?7N9y~ep z_6?V={^`lH*;6ZI`R#dvUm_cR*>U*NJ=xZ;+#B`$*I)N68~UMX{Z;E9gLekB_SL^k z{L?gc;O`#~{y9SpBlZS;ipq;g@(Qt7!6A8^bozg8L><+}3LI=~lPi~k0G!ENEy@BB zL6Rs{NHtO`$)bz|@~wf`0x8cNEE);E8=psn5*IT`GTL~0qB;=SQ5>== z))y=kcEA=UPBsFqB04j-fsCe)Mq_@0!+TC1mn-Jc#_^)lp+i}IOxPS7RsU1W-Tcv* zn7){piO{DN=c`tbt;&~SPE=AQ(XSa7g240OETRvlLu<4O+l&cF8mQIiXkZf28KChb zi=KTwFQ`B}1X)>z>8L=ri8v~egk@t4(z$tvTXnmbU>Qm+#G>^5qDI~p_+rPI$^by$ zN9FjR^Xu*DC1n-|*fgVX5>I~0)wa}o=Lt~*dq%GEK*H_c;G|ExO{Y;Jry+Wg?D!bc zpHFJGL(l^X!ibud+T_83YdN`0n>Zu!jLpn?n550ICuHFHYJ~u1APndo{TDHp1j=2N zp35w|Sw^P)tMw{it*I|lD0@x`7#x`!_Oe}_5lLUdpMvW_El<^Z_^x6n=L&H|9 z0&;7|qKG|bRks*Tn<0a@a;6L<=8(66fn|-uFbW2m%d9{Tn6TU`MN)lKXuo{J-^rhX z?)Tcnm+qt)&Mw;LdFkS^p+;_&r-A14W8hzE=eF`nyh4UmsWOy*Pq*Dk{Bcbs2>BE1 zh0pnC$jxtQ%UIbeFl+n&_H}Of_+`!Vf9#*{#T4E-SNLVkt3R$@{r=Oy`{oa;9)~)% z7qlI5cOG`{IXxNh3GB;d_eJ~LzRrf>h|Cvh&F!vblL0=7{3;|Rh>mFF>1+Oq6dG@c zkj8FES4*8-5q7xSdv%_7A6{4)DnEjb@<^(th3!qh_I{pxb9vb1X36!YqSC@ZmacsL zhxuVTvuY$t8$Ub&TCNLzvvN&FUFx*=Or{h<;Y0931|yfl22?mg&)b!D zuM318Yr3^!EGKVKaGV}i@#5Q%YPnD+*tnmh;^7=Hl`L>0*>pM-FPo#OL$i!%mL25} zn0w_hwS!zqzT~Ud#>4Pxv0J&Nz-whPnC<0e@rovEB#2SwxK)~L<5vrU6_w!021J{3 zJP#kEzgm2R%HX_s@bw%z+k~Wn+*=|Rw@p;LlIJOIH7BVgkg=TND`Gu18D12{P0cXqUxHG zN^06DwnSv|9yCQ!nf)vUF}*j3-D;<@oN857v@6yPL+_9dadoC*dQ$tFRhm*P4S%eQ z+H5$!#BVf}-_ZoeKU^8NM1x{LBlLuInVTwo!rHc%Y2%F{QN(`VEAq&4kB0{tU^?t= z;Qmlv*$odr&xJNaP){6fp5O4fbd&cQQQ^Xzgq{}zCHnm?hnuf9D)jX5plQN^1`4iX zUE0H@V_)7^xDTM!19_~{&^ddT{LStBuX%1o@j_VbTo;%5iM13>rDK%rUO!PgZ_`3eh$%UYsjqDSi7}%=Zjxdi$e+#E zs{BbJpN%=)L1avS7duBiZ%ziKUghubS=s*@C!9aln5I9{IJ&8}V57@|5bu?m74o>$ zc^gM&Hqeuf_M97Ki>W;3$@G1YuLHKKT4A9Y0?l9&1Jj;tCkqOg9`gu4yU_>@5njx& znat}UzotJn%r~dNb9aWBm(XbuHV)K?q%QwyB_QM4IS2ubYr%tud{m|VSF_LGO`ip2suHH31J%nE>x9A8Nv*9a4fee2FC&Ybyk;^432`y z(S-j}7Vo0!B6bE16)k##`^7D83-$i)8sPH7*!_?H+PAha79Jj%5-+ij7Iq(aa2r!j z98O}FF;jDswk$0B$Pk|_5XJ4%qMpz+9%+7t7$$cQIHv5#um9cK@N9L>DP;Nv5La6J zUb9J=|Hr|iUqcEg9S%|ey?~Fj7U0}UH;~a>BGI$20sTrsu;*fwKVuri_La2SYc$g z^3m;Xt-=!&e^{NwH9(CjsNw~pwyYo z|IYsL{@LptolTv#L&I;4O<^Arf?wt~ikPq{2%B^2)DJOt|NZ!3_SyD|pohBm$8Bi_ znYSG#49Cf;FU&j6L6VqcPtPTj=^xYkhmWw`cArX;>-4<_l-L!6;Z35~&i!_plKvl* z;3Nm%C~HV05iE8zoZUrIq!N)dMVDjD?g@09V6<`so<=`jGgFp&GJqQKQ-#11GEHcu zqJ6FDKv=&bU|B_IQDTvNb3jiRKh0m?Q+3H(DfLOmznS;*_c6bNqt`1-WrgBPiz*9W zKL2#&^X#A34{rC2{;<^`6b%m=`wGsFuU~bKzb-mD>W@0xB%9V>oR}Pf<`eKllGIyq z<;Jfalamu#!~h@2OYfBLTmR~xe=ZCZshI#rbYM#XqZxDP9=;Cjlx+NC~if64}BLSAw`Z;>Kc+1ZO8JG9O3vbn-j22u}4r$n!y#t05rwJ zV`G@H{QkWuHy3bHApR#kiBMND55=hjr%9?KmuPIPr#F3)r_&Zmm}!wiftAsO8wIF)M}lwHIb$(!X7>$Qhn$OpAqov*dX+EqSOQM>U6UW>|!Ywn0Zy zW&VIq7BDPLIo^7tvcO9fqL_z?_P;^HA|q^znpHt%f2kK~_BH6n*nugJP|u4#$NjhN zP$_3^KyV7Xd{?aY;{O(x-7V5t+OuFWCw%EGM^`NW^vA6YnXA^vUOJh*M>^WcQEZ$1 zO|^~X*uUt>ApzaWo!WkUUmSJAnfi;Ng;jAY_bU!n?Zov>>`b%?0yK z#@)WtTg^|YTMCy4&M0!*a2!Q`hZIAXk_GHhl1j=|!DEIXUl9z6n9#-uc1s~a{j#TF zpMu%pc>Qkpf%tQE-HNR6ikXIYZ66?a*Npyn>hCo_4oqX5pRTQb|M+sYV$bV~&EqO| z4I%{-+qo;m*=QSYEr<@Nwt8^+Sl9HvZ=8JFI0I$o%c!_sGc5?o=8}d1g&qs6`b|dj z=W7+@aMG`8_)dm_WXd(bSmO=3=uAK+$#f$TgWNgQ)9E7hw!AFfO6ds7Jl^_WzhP@l zF#8PZYZ?wTCv0L;h7F~QdWck5d9$uuqRBOYSeDi{W#?svn56HMK&=LTs7z4MvBP_F z83W zeazH@8S2YAsd6v3*-kp*TYu8I{tX=qXVE+oPs$NJGI}MpJceF#M3D0?r0>3^RZ;Wg zznXhvvrWf)chAHQ?2-w0{L>eEb1P?5+M7oMy3dF%Wn1re{{39VkB)gh&Nz{>EhT+Q z#k;J$Y>jekh_|Aj`G{6u_#b9#LhsDr|GwQebTNPJjC44zKi?$kFV~y{~@B}&7t&n#?EKuqx0@Rxv@5nhCTev zl8%FjlgumMT|Q{I{<39%7HDUGX7+>KU;i2~Gw<(`^zh{AyG^{d1`HoP;6sK4Wn_W# z%YIyk5@O!ovG(@fTD#-k*1V>Zu|@X2b+MPxJ8gZ3=r?MrXV*F9H=g?a8TZGfjz7-D z%$~#k^Jh!=0fFM?($PC9+p-T%{JGxk739FdUFW~qdI0m{-GSNJbDu9xSstu?#RWYP zzBKEpda3sNyWhmzJ-w;JJV@r_De{VZIU0ua4Ur29@|m1A<`CZ+lGrx%b$Qaaf1vgu zuKEFO?2PY~c~VZDD5=_P(c2ur4Fg|ga1(j`HFhEQMgcZ7cs#$Iv33DwhT$1fnYnop zP2ONx;(f8Fqv|hX8f?JR>*B>k0)E-Dh60>CyTpQ z2V2EV63K!vlLsGcb&DMdhN=GdKj<=LkFi$;G0`&^0!*4tq1P_FB003GAtmHYUrkI~ zL>8C5=VXrM_ozR9`t8d4FaNIk^5WUMn-2 ztftG@Nzwrom^1(=I24dEe#q_jVarvALiSGp%NnI`@#rLV5fdv49886IoW#sBCSc!;g zqH$F4eXwH}Q39r=o!t(*+yWsZk+^zWXZ_Bd!@H&Xd^;~A?8_=5Bf#z7sxK_=qNns` zRvidh!DJrK{%2y%-DGCa8_y|dW zA%T!LhLO(k`9e{k1s@_Jt=9sLTHv8zC1}mDXhi`Ne^msFc2E%zqQNA@0O7p<+UHI( zAt6Ga@3nouGrwPQ?>!%Tuf4wa+H39Y9=@dYyww|@{wI;YeeVzcMv_fQvU#&B-y0el z<}XP^l4Mt_oPW$QL;O`l4j1vo?Uc_Ovuo4f@aD~f!=YR}JiKeuF~@{*&hYTikUk-u z(kzk8A0Ce6Xg`$MgM4WkEQ%M25hqEu%3PV5YzpP@p`jL$Gettl`FeZ$u1%f#qBy=Nu!@b^It5Xb}QY5+a#MQQQNwUiA7xyY>=H|_`$=8ZZ z9~{10CMFeyBNR_^rBK{f@%j~*jYhmK6FH-BI^zbbQk1+K%FJDxB%gD|Ym`za&$>s` zr=#!$H;Et1#KF5IXw@5xh|A9!DJP!W@5~z>u1FDhV#za>P#WeXNvNY)1UBpyh7}|p zIC!SP=UMTAz1xVtzNjP1m4nzm=h!#tGry`B7J$iAyu3H!6yrKm;mLmSj1;e-^KnKB zN9s7{CrQ<5;%f3DL;H}43Uh#!PGiMo%YfcV)>u^KjkG2|1*{3PlLT->;Yxj(3(3Vs zD#@!x+VqyRnJ^d^NGpwXlz1ri3Vh`Xu(nO08$h3YYalrjxr)qoZO>u&rX-VtEsQ+3 zjHlL{_^@&Ga=Z3B*N=T3oyGNaAVZ%no6zYtVg6QHTWDm8h11z-qSAy?R1bE#0FQ^A zX@I!SL}j||Op=LE;2!?t=9j8}8t~0C1>_JYc0;;_W=jbc$*&8l@IlG&-Xib_ou$t7h!eN z&@1E6BQ<^-8iL=(GeT$Q%%PzzD_vRUR?o}NTvlilpOHtoUS6n&@=b_#QxRPWH$^g~ z6gl4ULd&*AddnrZaUFs8&NWgUq{Tb}@*X2|I#LQ&zYJ2lO|%MXxp^}plK`|Hy3OG;jQBy&!ieRavEr96@0^}%g@0>stEk{(ldx^zPs25Ams(B7KeszD#P``3nuyi zEtL7EypU_B#~Mkz?I{M~`cm>s1@}dCK|LToVxmUKSkd0b0lz9P2bPdIs)T_qzHhCG z>J_pkI18ojfj?>E@dxjuqi!SDXoqxARJ}2CGb{z68HY52i^{GVGw3j!r)ny0(wB`q z$`b{!^XQ*z!Sh+$tWB?FQQu{Zx_E9U>UvDh+q~$Lmvq2k)u(LJu-tK zg6U|gvJ2h#>p^5+j*e9E<}Wm|Vl7C#mR1S?F^AuSHO+w4!34rg6KDeo!}{@PPLb1= zBsAQQ4BcGt9R zb}G`_4ZPRniO27_=Cv(A=;Va_JpTV@%NzqmnqHg|-jxmrPh-|GL*|`@kbi77U}X0&Jx$^1e>AcK*TBER z$Vf7sSG$5n#+F~k@9lvUP3$Z)*U6C}W+Ed>rqc+@dk#DVv%U)J9R~fNOyqPZF5;F+ zUZfryIB$SVR(Hc!$0#0xm^*N?b?sn^-FTEeXTadiB^=uRiFwoCHo-;GZa5>5_wt6? zhbF%wzAt7QBa=z>G>|V{CdF_$uCFV9V&b-DuA#Fg0Su;8@-qTj10L+qIFMBUnrUgD zE*#{~0#4wJD`=x``?#2OxKt^V`OoX zbb;N4&{Ju=2V$<&2N0o}xT?UY_6C|hE-TXH(Oz))IYza}y$V6U06}T%E2rcrqMS0WVgOx6x#u)iahK+Tk?t==YQY93Z?0 zURNz1ba*4TgYzlKDz97d+yks<^BqUW1M6*z%-!J7mAuv6fLmG=tne6_;UPxX`eP%P zB}qQ_G09!$*x5t1;D;Y}KX9~>5U4$$xj{P8jmJqh-o zGV%z6$ssQHp22Tkj*}ydEQcS9j5Y>vbTQ+)AG8JB<`+%mlAl=3%#Hd2e3B&fFz^Nh zkJj37%+52>B6X%Z0JV-WOfho)40!rTI|r#UDRO7*6;CWjgtU$n&NA}D-87=+Zc8_h zBMw^7`3)25XI(X548;#%)j8O8o*F?CA}9 zfO+at9=pWOGFD<#RZ6&8JOvYc1y+w?rpR2}U5x&~3#ENnu5qUhM@tZkGmYG^rzoFx zp{`t0ZzrAAcE0jv72rp`;;Nmn2K~%@dGMy>6%6AH;7slUk#^dr-pLZgz=F^Tx2P`z zR4BC6+D}D{N9QVG9+@ohsH%URuLyjH26z>J)dB&j({*qoq4EK5O>mc|tn1_ZhHS$?Ln7|&k zP#fJ67;Zp9>#Hl(Qe9tj){Weq+^aNtwe;3P5GmIz*sInn^c*{XY?V6nm}%s$_nGL< zbK$@}`XbzxI^6uK=&1N?!-rOj*7=bGyzO$(Gto+X|KYusE%X(vz11)mSimsJsWhha z|G9~;y2L~uf%I20=uvNXq`-xF2t#)l&%up1(D86nF}~pN;bF9oRKe?Ykg2-M$bIy& z&5W4jHzqE%tI+o6x`UoF7BTtDAZ$o`x^0vpm30{vILYw_Z>y!-VB{a{l)f9L*ZYI1 zTlgTqZ>Im)j>P^~rz3+?QYD3ooP`kMHH{>586m0Ub%Q);s+K6Ti3KQ}nzK>3lEj@BBT&{-q%DOqv{}e3pdx|V?L$g;<+PrV5iQkQ2*6m&-8*Ag)_@MlUt)xHg81%NK0^4C}_Fj zU!WKow96XrTK^KKKb;zFD2kK%XlfVc^!*`w26m%0!0*904^ZF$LQXc(lFHe`Ef8_$>s4JA>5|fO6GY1V_PG@EO zmPV!z-U|WdLY2GPsT}MDY}7lE6o^nOK3l6(+sq7^*mOEqGz38I(0k%s{CjAE=|yfmsNYM~aH_?0>@ z{AeJkK4d$RX@>90Mqd65pIdQAwj(RBcKcFVsR2zqKp(#`4|mMc;6TAf64lqL#wb-y9ti5eXFmWh`BPeumHoTLbN z|6;=NX*35md@nXl=&5x<5IPJPmDb3UXIjVjiO&{1>!M&Mau-_iqi1)RSlQ59zy<5n zK**Hzc}8X(zesk|7Iet3Q{IV6xSGy!0MQOW4WLemO*i~|ZK!4xW&6T3r_t9UG&nrH zPswA0qJ4TM{Z{Yw?ND~5>-}eaN8=k8{>~$y02m#LWewV-vrpTOVVY{fUpVtLqGqDj zb|3FWT;TsBy$`0J#eC}Q@7ckW46COB%>ol&RA;u-mD5nn<+V@@6Oufa)+_~Ub$l|& z2DrzH*e9PoPUto>TW zoyPoDUKSMRL*8*%Fa?OS}W?ro-@bZ*zxYfjX)}Rd5tD%$bqmA6N z6PVEpi;4Bci&4eAxr%Wd!I*9U1wD_Xc0}W)joSR;WQR8Qwxj*1VELHdmg3_khiU)c z86&#-Bd1|fb!vmhY7Ez0)1htf;bgSTiQxEx8R-=Df-8*t)fBh{Z7_KmpWjn1fFLu^ z-p@702!hm$QF~9J(s!EpGFUVK@)f+)ulxZrY!HJH^rON&KHE@>1Txl|IMSy;Y^%b2 zS@Nsm$cNltg;G_$hZn56f+p@Q&OO%M@lGRu!nI@R@DybK1U?6JSjn2=$VdFjM_{2P zAYY~bcH^qk=Pp9IYG9h{&}Tb$RictVq**#0b#LE&Mk);tC*w`@wRfTx7*G7X4mg1q z?|&R203G~Vqy7EJ3VOjCS>#raGV+IN-)6zMUiHWzRC|b~$4gP>sGuXgZ4V+G&89kW zQZatSmn|kN@XEIlgu;YCpo|9NnJ0+O7ba^L3*dR36qZ&KI93-oAKWeGl}Y2gk%xhQ zfvTPG5j&rJnAgxuKLo~BCC`@S>4hziV}U+Y^Nd5;ZmJD+=x6RLjAcf%1A;Ru$3m{y4T zaH?6Osj#j353FTG7oB3FhF#pWGr(ZCZFKh!h(#z@#TX`HrNkl5W_%a%$uf%?4{b{$ z(1qt{yPKhIWH{*c0&d8GiWIM0wb53jfwr#XUmN15P7**{WI`TC(=F?Wb33|V_-S7k48hCh?jRy)@@e$NYW*f|LurH_ zat%S~X^f&DI;mR|F3>O>nwTJYEXP9DtHI5$ac^KZ8yYV&ttmrl?7g65%O}(%?T&M4 z03_F9;&x@|u2ldF@@)hNC`+kzNG2G0vBStyT`(Z8R1!~JlZxP;HPaq!Uy(;(Q?NRj ze;TvAnUEr0Z)?B`W09%4v|eK5tJvBD%?5Hhx-O?4tu6{xcGmb}pAmtJCOxfgD>zc` zItpO_4e)fG87Vd~D3E|uh`XNGdzBrmI>8vGHb$w^+`<%bI)L(Q8ZIxjn|M62(kTqX zYRR9XZ7TEO5Sps&bbG=>Pi@rg5@@MYnsG>A&F& z&6uf*LG^VrRk;uqw-zaTOvMLGPZwMno_5ga_Yb(U6*uCkF$NjgA^2Uw z7XM}zzUwJK%pT8~KlG3n-nhFs z@=f=qTF0{nXTjS83NUQMJFv~P_iiK*ICBNmY%=nk(%}m zAUloC>;WT6oPIe@&*OSBJ15(l%^gmsh zLHYJcJ(8-b*zoHa{q=AEE2ui=ZYCgM9qpvLnE3FtR1v>}Pds6H2Rh=_KgLDbLtg{< zu4$iFT0`})3i2D}YA%=tr3h<9r!M0eMp%nbM+_zE=ilC`NyyY>REtLrupcTOZKMkm z*z>q`F(!H=T|wAYlG#BB9rMgbW}mUwp|;9a=HL?fA>q@xfbc$;9c_9PpdI~mQRchF z_L-YEOTJjiyAMv~Yh?+IFY-njNLUHv2zqH^EfKW?DhX3ZZ&_o)dQf_lIwQD3QBEgx z8&ubBu~F)Ytd=hb?j@icqV0%2v33*6CR#WP^|Zzxfqf?Ck_XYcQS>!L^!GiA7r zw>y7`{@lty%6{0O`cr0rt=ElB_gV$X2uj#_Z<2{Ffz?|XjRvIs{@dJ;$?R=RwxH5^1f*o|)CguAVm>R(o8l=9D-|<;si|;=N7r5XDZ$EZCP{KKGwgeF`ZMX(K1TTWx~=66M^>7}(p=VK+_q-$NGA=^bm*QG6*GJ}2e z1_7s|6y=at^h1En*2U)upk;3?J8qak1G9cVv23*00`w@s*_T1W`xOH9@R+Rla-|8C z^V7KYyELwC!o_tO*r+byH9$WXdBuf|G`@B6LYXVY;-_tPm5LOTk<^QNOSie^>U=3e zlAL-#Z$h)wqYaBOBUUHBI!hb1^Lq&7UV(6JL^`GgQ6FgOWgb$Ba3_{?9m1BA>B< zbRG2L8<;!o!O_K(eG*Rl{7NOrZANbSvI*xO3r3)VQ%iTb7a9zM+F^^@*}FDvQ>iX*EQ&@cYN6#Nb=q1Gk|7 zJ@iREYinKHhseLTG#Ex$^Z5^w3d2o&{%}&08()bHhC914Sm!be*sg4i1$yI2F(||l zACuMX-nRg+e_w^t@WTE0b)ggOh{s_VYn1|4(`AdfDEJv4u5 zPAZkLzJErm|f=j`qT^D zFFyyx#6*kdysQ%#2Oyuvd){HB7oAfF|IdMG`;O68 zjl45yMDrZWYy5coZs1bg{7O=x1)v)Fvii9{r>U*FvaIpGU#tPRr}tZN{mFo?wnp{6 z{%XhEtcwsXz52R7NzX3>#8XC|Nr8BI5zQmwCqwid&BX!XYsg| zwOb%}jxPsYfc?VHjGT71kw2yD7nLG98jV5zW*4h|+|abyhZB6f*E1yPa_o^QT7R1) zkkQ7O&e8=r)dbH$Qwa3cJpoon9k|yRlR>vf-0K|6<+AcV5M-I~v{~>;GSAvFg-QSJ z3AW($Vhtri@5&{-!zeL(`1-Fv)jTBBHQ>lmH((a(iAKC+o)=w2dJQ_R(Bbs~)9NMq z9Bz7!`F5IOBWv2>S>A7eezeHCGr{;TSZGjNE4Tos4cS#`hIj|PdEo3}IBWFjv$^KL zR}FmPo1y^^9)Ay3R{&gRv5wl|1=sQ#U6eaC1EnuF3z1cmQ_q~{IA5hy^H$TemR=tJ z91{n6I0{&ge!)cl0yLUpbyA1w1z81td!XHY0K6@TirN!Pgu2d0kUu`Gj?XfZxl}{& zsE)VY!LALZENy`PM*JiG^Bxt@nQs@U^K9ArRwltNtsj!JXXxQ`YXaD{#+vn*ALeSX9~3M$7K zbhXH-3nI`MOoMs7#)yF(OPK%TwN(2^5R7Mj$h3#fI@7%R2lQJyi`^H{p9mwOR{j9y zp9((Q>*4z(S*fgA`)lS32pP?&*M+?luVBc=^LJuaz6n5ERcY@H=?7tZAUCUbC{q#g z3XLBmpr1R_HSxKQx8fXM7v|4F?|icup9eDq5iGb2M%&7S2=<8%vT|C0f7AlDE`^GG zf6WSN9$iGFmc^48nQc|Rxe(+5_rGHW)oS2Zm?AjG(dzGQ5%qc+1JRF~XgUIcO4={S z-9$}@sCxVA!lmv#i88r}Skx!#YD=Xpx>UNCY4~o!aUkWJ%ULS~>q>nhO{l1XSuuW2 znv$94Mg?X#bbx=%3ab=p(k8oa2j_&U{~Ber-|{Lvd0=E;)7>#5?8RDRo#s>gl7e0j9PV+tS-bYs9k5OVj8Qp5t=*LiO{4l&ac?=6tm!NZZ{M)KFM zyUCT6ZgoZe@6Kbn`S%&tha;8emdtySxES|pQ#e$>OK<}d+5dse?>`kk`rujg77 zt?Cv^BY=HC7(a>-sW%ge_yyVwjjYckyGWmYD4arY_p8V{ZCPOSem`R;S*MxCku!63%wyRV0FY#6{>k2A$< zM*(B7+!`dZ zj#^5xku^2`bIkSH(>gEWJ%;f(9RN6(T8_o)-?^HU_D-B`QlucraD!@flP3z8dBm#~c&fiFr;95^c62~vB5_};XyFEQTJwPK`4=M(<3 zs`mIpt9l(+rfz<((Y|rvbG%sr5M65Caj@L|@0^Pl$5_5IgU>m9^8L-`?mxC_jO(T3 zrJXmJyMN2q-(>E7vHzd(H$a^(86G@yf9}vwg!d1#uln7Y`;<~r)7knE6E3(S?}ZOR zqc@knA86=bzyYOAHiN$fUc3@Y_*dw{Vbs!VGm{M;9|9_zAv_eqZVS#XD|yE61kk{&_{Qk6B=qWShWrzlU`H z@565gP4)MqJ4p4f%ToP62UBFJ{)b*)$x{7Ytc;xlV;izm|18yCr$qMevefI?JKM-o z{j*g6EY)AKRR1j1KTGu|HuZko%Tuyce`3a2s{fB{U?5BN-?uW5rTW_?*nuq7KTGwO z?kv@xARdw6{VT-Y%u>Ps<5d4_(coZ<1~0wdqQOf9YTr({{G}m+s4S(rtm`;qR}EhN zk6bmNB3V}S7PFNDjcXjR>rb|FkgXh~n*?Pm2milp66D5_>x*CcFiUaB{P&F`XywQe9XmY^BA9GE` zA;swHvvfb9Nb6jKJtn$GlacT6NYA=gvtcj;`Hc?C0Lg9Dfrv38sk?K?4D)U=_nw|mDmYsT2TNiW-}no)YFx} z?x0_nHJ`MLxy_^rH3ji`B~8$u(Pa+PlIm{)MqxsUr$1PzCl8AiTf39DZcHN8Q0q+s|^qZ%6%1VoK0tI85p>*OR;PxBqxz5 z_fZm|78m6to@~ff$cZ|Q)WktEa>FzhJlPn7%`qynq!=Z-Fgo|@LZHca&U{0$1$m8H zbkS90i9h}{D9JUs#{*Qg&gSHiPM2qhwM5v_9UnqXC%h~91|&(eY^e%5eEwCFgmwH1 zv5>pY&@nN_+|ykCcDh=gj4K{>j)^bOBtWu)pz%d?$i6J`IZZ)$Hqa~MX`X8SIjXZk z+zOIZ&!;Mg&4A)78)#*zc`(i3GLJ1M=?k`uoMR}|hVrCw^^?CGAEHp(W*g=pbUS?? zP_L~yM)`FhL$Rh6+bbF0BG3+>Y9jTRT}nq05#<2#4OeY1r)KV4a#hF&(6kYT^JB2I zN9!{VU9}zFP_Ri{r3fOCo)Jp@*hH?h!U9g$tz$t5oO{=`lva!_*^peGJFqYNC~C<@ zGii>L{>g$g=Sz3uICyn8;{2Ik!*?&tCA09BQtZ-m3|nX+;d8HB)g5h^6UZ?~46yynGyYF&yX7V@`$;hS@e^Q@v=hr9| zSlYP-4%OnaZU%Hf%2psfD6pS3C%0T&ivN6ilC-9!8f+$0TrK3q>G-Ou&4$7JD*dGB z>U~Jn%ZBW*x{{+Dv{$gLG-#~%gR%v@~VSgj1>DMW|5?>?=v z@4*hVO4+Zdm7xK(cNAqY(MdH$t>hwVrU|X&JQFBtB^SEW2zb+Si{;oJ)WLyu7VIw6 z=~p}bh-{+-m!IPYKes=?`e$%WwX_JSl7OjZBt~2Gvv9)q6a_33~Vca*osV) z-J$};5F3rW48?Y&2~b;2IQx%*y*@2yFYF9nV~FA>P)TF0^tr2&W!tqE~^W@ELG*Csh>NP3Qya z?gtp;^`k`;ud)T$Lv6F~Y#OL{%2 zpkYoJwK;6Aw9Lp!x1;Rn^2Ou>HTbn|&K6bxSU*oZtanBWE9?dy8^>K=Cv(;PX-RedJhCg#-wB+sH)S9!d7R2fo9~MBCXo-lbeda#RS{F}(Sj zU8zNxm=O4oe;)o^ErC}Cc*G{~qEI5P=a!rJ&$yN^zb1(no{N+pXvc97D87C%t;_=X_Zazphs~XfFXnmO8EF;I^z5W&8<^@((d=}%DpZlw zJ(6M{xhyll#mZK1ClzuIne!DrE-lmO>blwGpNyWa$L|?C`NZWgC z6G?%vDCaAr6&%#cz{yMt(mhn#2Oo>61gKSTJgeEV`<<>3Hmmcq|GxQ}U0qOHd5E(W zO!y#PB%8}LJ_G;Q(hdk(u?H&z;mv8GIw;G|RgisIPzzAGC^bQhl-GX?s~?Hvz;OSO z=PIyUO1k+QE?8~_(}{C5r*eOms2!y+z%DRqp?j_LGS`qCPG5FV0*U$qXbt}1gQyT^ zha~9UHnxPsANfY0y8fGLCX>&4oPZ+VqEhQS%17jKH^V^xnNB|lf5e=F%xzmSTzCPE z`JCD@gf%<+0A*!M^RlxK_SS-=RR#CM$Vh+4zqwoYt<;pD5BGipJ&CWjfv4(xLL_9nDAUpd2 zOS>*R`ye~}AUpdYJNp19T;pij*$3I#2ie&NHnz{w&CIJ+DzdW=va=7evkxkGi`m%+ z8jj7*KFH2K$j&|>6%tvvn8?a@0xM4w^4A?jva=7^Ey(VKbTWw;IMqa3SYXGsX4$_j z`EDBdW?h7&mF(<;?Cb;bE7;^m(^n*?OK7C+X#zlY_Ca>`L2c_TIAp(bd0GBtJ@G=) zAlP>_JNsY*xo)7Sjg1$xvk$Vf56G&`&OXqr{Os(5?Cb-QJ4sls#|x$4Nm|Q6>`?(B zZ7hywXCGu|A7p1A9B}x2cJ=|)BR2CeJNqEbH)fOH?CgW=?1RZ1iIAOrkez*yoqbT- zj+A+~mSgPQjkK1yo}GPQt7WsZ4_H07TN7kwA0)|)?CgUiX+vQ=U`sD2Qd+m1D$qMA zg3Hc6(46(`>;q1u;UKo`>;qdVI>v}1qq6jtFRtl#Z4o?Zf`4k!I@tz^)+xamU za}%gSCW&_@3j*nRa0}UVNRSex9-M5QGD#I)CX7u zR&Xg^JDragIT!(xaW5c*dc>s^D3=R%BaBq>zoZut!+j?-XQ}?2a@13Y?c8LN_t3k zPEWA9kJF(l!i?x2bgu(@=CIx$WWOIiAMEB6e#kLRqN8=L42|2zryaBZ zo4I@JE@`fA|GEP&*yq6V9k@{0*#{(Pa}aWN_Ca>`!B^QFH#_^_zx;v8+1Ur#sma;O zK~$Hm9Qf%8;qLI)pasqv&yp?2_;0@#$v?i2B%bNwQCg4 z+35F_Y^e4B$|gbC*$3I#2ie&Nk+Xop$aQx2-t6py?CgUL+1UqC^9dNAUY3p?sjV8Z qQdA;3e{**BL3Z{*cJ={lm)Y3|+1UsGrO!Ut-6x}eA35yXXah zR6V?<6yjpX%qV~#gDtsi8wv!lQtaMI^bX~~FYGaD8tpI5YIPTb-KMMVDkj-G+DmiS z`xm}XpY*l;{ckkrn}k$P^q4oF@S>kgOg%U|b@tT56KAKYcxQPx=XkuEkLo8bG)`7u zx;-h8oquU^?&CgQ`J{{|e}h-UyVl9;>Gkq>pS*GD)9G^F%rAby_jjD!D+kIZWns+6(j5{wset^Hv@AFv#yeedd>cU=Pv~^6R)(MeIiq}pBwnA zT-f{u?;X{2_d_z*n3_j+iapQQjOE3K9GoTQHsi$}NBIYe==|(oj(&V+e=C;%>7(Xp zTEf`4ZE?%*pPY^@EK6nFZ2RQ9OEod2B2t-=4V+V~zxdVP1qaXP;80s?E=2`s5Tob{ zehrthTA6g)4#)Iau@C_mah)O=1>@H5tO4)Z!XMB*zU_tSx~RK*Rrn7u&_2+%HggO# z9tD+fN7LhkW|*MrSCeA{p4JEQ5oJo+Yl=a{6s;iFKl0j^Z&1A?Au&#*WcU^XX~}f0 z>cLMiHCtENq?lvnck^8CBM8dLAKmS4`d%$^{}Z^Y*3ub`LXSti^!;lO5au7`qw^GE+DRGP2c-~2*;c?1w#>filQURf{3i~Ryg#q3cu2Vj!r(fe8IPI4 zFud{LsK5H%<-(Fj7XxFF;C?2Bd}e!QyR+`%GrjDHL}@T+8<=83Z0D#%L-mpIbomx{Qe+rK zpQ}To&kBoB>)Tt|pIZOTbCAhaZuWeCZf7-?QS#vm2#XJ%1nDvlwiaM9CuHnYd9S`g z#u_cAHVShGfJxh@ob$tt>Vm85>J>|Ay1y)-OCcGn5llB`(#W`it3RKH38~Q9^x??G z%0D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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 deleted file mode 100644 index 6548e5270c3e85ef190a45a504ea181390f5e11a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3523 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 bD@lyuL0m06^8X&Z%xjw&6{b(ky!ZbA%ZmH1 diff --git a/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a9f7fd04544fbf4736fd9f5f122428deadfe581b GIT binary patch literal 47118 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 bTNq-Tr~gr|=DqGHnX{&ff9L$>isSw-$iq75 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 deleted file mode 100644 index 26fc3dcd4eb5a2050245bb37d385960bb2675764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1663 zcmZ9M{ZAYB0f!+?O-xP<*BI_9ry0U_V*8Zd9ltP^WJ?GxFE{hzm)=#7*?0H#+WzEZ zEN|omFgRdNEyge0ZJ;JGpad+{b|=lvgl79}#|BqvT2<;MGzHR4bV4*uTdiS*+$`$I7DJRs3B{0*ho4wGvVHomY#xtd>>O-|iBvB116{c()%`Jc?B30DM>co< zGkcJ`|1p2Q=gm@=HQM2@Y`s7I+>UmBZ22CIW#-0#kA*0dw&sS12U{vSt01KZ76^5f zCJEP8h!;P6_tAp+A3wj-C;v=(cHA?5;kEBPsaSrn)TR2T(9HflvGGmQvtRsas^M>) zhVO7dF#N5qi4*C;QEA?BS>cW>*an(AZ=Kq{b0BEe);;M-HTlfbJ8tFnn6`P}q22Ky zrGNdK{i)6*j9MU(#&XjP*;(^+X?bMUPynY5OApc?0VB8Wl<4X^1_>Ht&~bcluX>gNTz69qKq*YwumzJ6Act z{aMFCtk%OXkKRjPwv!(ne`jFZf*>3Uw!yr5GJL;mE}4R;QmT zqO)dwwwQBDwM1`{vv?~vLY_}pUDL$CVjInDjBoH_JDlinJ4s6W*@cyg<=7722(Kt4 z#vJgB@rhVGjGNJmch&AEX9l9j?n~Rhd3^L<`ugxTeEs&( zPrpBZDVk7I+@oi%fzw}npcq_R2sCV7Gj4vMy%gC!^?W=N4V&5z73NgI!t=F%Gucv< z#KSZu(l}ET83uq+08A8Gqy*rEoC1M|_>JDBrTMk*iA_d0pn4#|VjWdl!>wVFi@ z85*9H5!Rf~uIJ+1!h}wXlVgrFzci`u@fE4K{bh$E4MJfwk);xhBM*@-QbZGLIs$kx zD%|R_W2HP?^pcAPm{^j~uqxcEGwxZWGDXviAF&@$V6jBq45>k4u{G4>?+JTI8Fc)ysMT57Na4}w;+wUKSVH8+{GFs1aQT` zeq#*?O2`zG$Gs{Z0KjpKq!npV^caWuJL)#jP6P}Yv^8v9Rk@pzJkEPi0qDp4f;$VD zYx)@4D!od_X)o+T{F6xNw43qku&eQ^lgU}!r6Xf!=V7lt z8BM&!ypVJxQlI0^HTdYG$sx1)NTnUx%PN~TTD%Zdr|zr7u6=u6V;Pf|%lcE*{{tf` B!W{qr diff --git a/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..45d798574bd6734165ab8bc87e5b3f03af4e98fe GIT binary patch literal 21442 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

    ;GQH1uwn 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 DWJ`(3 diff --git a/client/resources/hardnested_tables/bitflip_1_178_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_178_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..05128e5d52f1e6d83ab6810594ec956025fd23fc GIT binary patch literal 23792 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 m$h(vR)(%+P?`v4$(zWwx1uKqXBm!m-d literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 deleted file mode 100644 index 87d8693df1453a2c5d4ad7917b0252b1228fc130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu?@T4*^jL0KkKSrY>VjQ{`uTtU$Q5C8xGkN_1x06+)`zybU@P@w<-2mk;k zr9=UsDJdzFBhkJj5>Nb)Njk|DRCP%wVM!)ZNveQVsU*@sNzy?i=P4xAl4?mcNhYL| zAQ>g1StYbfB(W@#(pX7s2^F$SB(g-Ox^<-DnKVkB0KpQ#d8(4)N-ki1q_mG*lO{}> znocUN$udsKJgO_oOo?_0IFJuX1e4l9B*_Gm`5=;FK_tLQ&calH;wqIAxss_Rpou|= zP?da1l9Dha#F52-;GMdSn562J%$Y$aOhyZ{900e*lssKPn01fVxP#_ur zAQ}J@QmAOjpeZR+Pf&iN+7PO_B%KK)$t2Q%jFMQ8DS3z_w32d3G?HYJX(YfcNs?(M zq|#)WOrWKtu_RoLEVS8Bygcr81o<;wte>sdNqKl46xfFcj!efMlvwBZ^fd$V5XFN>%MlqN4(srbSp&3SyrH+>uTc JBn46Y{s4xXro{jN diff --git a/client/resources/hardnested_tables/bitflip_1_180_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_180_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..2d542516abf581ab8171fcecf5bd40d17d1bd607 GIT binary patch literal 15231 zcmeHOu}T9$5S@felpqX(g{a?O>5>@jzu9(QS%<64jVwf!8~pIMiW9MwwLhMfOK@*PwBvw+2}n%t?Z zWNUp{3L8!Mp${2ki+C#UB3wP3CDfXk&`h|$48q+x0ot&(&qQqiT2G;waNh+`7;EFs z3DA1V-;<3dY6H-E3eAN3uH*q)xX0OP<&Wb6Knu{S4&Y21C^TSV>j7GT7N89m&jV-| zk1iq*h3GM&$3-&TokKrDFZ)|hxf({5-=4Pk+r6nAoMHyqklGf7derX8@ zXaQP)Hb^DBor?g_0<-`vKs(AseW%_j3ha>RbTeDi?1d3e+o#kOKMv|ckn%yw2W5;X bV-y6U=1RD^=6Y71mQKQlf)av-Kp>&i0$IogBr$Zfl^#wX!8b z2ueZ{lGIU_BxXY(!i;sSMYfWFBU^0ibY>KxMQ^9IR=c=f=g!yr={(Q*{6Ek0`=0`_ zVh1%}gyV`jA}W_Rd^vc0{pELB2rI8Fd=Zid35VDsUyTOH=G&;;4eJn0LV90AA2!_J z;TOfF+nbCDJqh@*yznL?BqA&?thpjt*)kbuXmld!3r-6FST-k1|G%ZgW-#_IUr&WV zAPELuenp1+{_eu%UCy(;_uS7IjNN>if)6%|nn0NsR%-{Qs1ywq;OqDr-nKYv37151 z=rTXV$@(K%(}HDdn+#aUS0+?_1vlPwr6Z%SM-0@$2Y^Jg(=apL3sR}AR+TxDNTa(% zWkHZKLL#()1}_y&wd#c9KDzrY;kb-1w4xGmsq+`(BVj=l3ZTvS-0fso!4z${GXMg9 zAz)6^pkyc-7gucc3%^h*u4{x+lTcJh5k!rmi)nKrS-*py@le%C37U`#5oe+n828Ut zR2LE)_Km{FzNO58kG{b2V_2p3N14nThEuC_#|WC1Fz<+TDo;q?US@5g_W9`3#b&ce z?jPzW==+Hwy@)~?d#gm6gP$J-NtHZw@b%r{k?hSMMd6C`b~bV`+Ce2z;@!Z=6@oga zg5fpV;iN2N)P!j8T*7}SyISS~##RHfxhV9pp^!~(By!%Mpl*$k=4l67p z0lT1f*++2_b8?ccGMX2O>q-qtD?MrBcT0=0kJZF$gq0R=!lv$3ck4x}4%E>;d0zkq z&s#epHN;`#2b%h6`fHi-w^!<~%n}@~3H$v+r=Jfteiy$2t0+u6@%T}Vde!4)jrS}H zqm!;_%wA7pl8Y&av!5;#_}}mhLCiC_7g}$od!y9!118p`4nnCt6fPejX4%R{l0hMJ zUE_g4M+&+2y?3|aV12R10P@~C##kUN|^Fe z%nIEzsUVxfhedI{j%tiB(b39ZC1j>m#jVyQ3c(#Ev}y9eYe&SM6(w7irYDTMn&A#{ zZzX3pI{w81y!$RGpE*$>%TdB_I(_eukbx8BjxN@{_T&NOXGv@+9gR-s=yYzrm#X2L zb*hD|(jO0Va^<84VPiYfRlM~!H*o;}3(C5UI1P*s@oksWC8{!s#Jw+HesX~Hd>zZ# zf4kGSx$2lHBZ0Zsr9G5xgLC;C7VwT6E>me+eAy6RT!xGXOi4_;0GpR~og36bAq{cypxL{r`mqp_C z^IqUQYq{UvF#0Euvzg?Y*N<*LIONMxpO0o7Ia+rb#v7SH-t>wIAb8B-=HAx%oQ1{I zrbjz3A5I^HT5LVLBYD6nY_LPzq_PoAo*F@ADRySvT%u1g%`|V+4dCn|HviR`RJ+=; zBch&vepP@OTp8d}EV4hG4E^%#<=vmY{cPAIs5Fu&!Npo7mctGN4mcBPIz=T)!tY-#OZ(N4)?7{`l^R~?GSre@s8;!-^Sd`AWQt1Qt6yWigU z$!mWmO_#_oqPlP;wdC1!inJN46A7>KCnd9q*?qySLMN;_vM}m2emp0sl$4kgi9?m5 zcF2Z}=Y;LaPJ8fETo*Y@lcGU7xwLDRMBuNqOLHpaKq4P~82`}r0A#^`{x2v-?up z8uaAYFbMM%8yu#fiT(XC7=U9=(T2!?*bd-OG{9U4g=xxYvoItXDG2~hemgqVLM1fg zeIgMm1HpA&V2+`n2i4-3BF;<6P(P6~9u+FPg5~{>P7odCVEp9K5yS}!`^1S$b8uR-n<6o4dVju`%aD)xb^ z16rPkBjteBqO%;pBnnql5ycU-p2ty1YUmI@dXZ@}V3d*UKF_j6=<6W1h+9BFXJb|} zqI(g6c)p@oC|5V9Z%Q|(#5FdNqgsPARQagbmaIy)?QA^~`_P1Nb?(xOeMp)=I3q7d z3ILO)9KoB$i)eD0VGZ&g&m^Igvn7t!SzKY#+`;F%tKV3T?wNpn1WshZ{IguZA29da z4V}30_~9PmY12ceQ&bbTB1IlPEDx^E8tYR0t9L(*j>Jzu??xHE4@~2$m+Q_r6LS!E zC^d#|9MLkhl^hRqQpPh;!!W9hCrcZlDBJLp1|??-)O&?#tmH zk?=xZ;RXO#0ZapvbF%7(^?Q4MK>a2W?vhAp@*0@b;-is}1a(&=Afke@V8Y;K?VI!6 z0_KGdlyFFXSP|{26!FYBhl*U94jb4&W`>AkFhjh3lc9@EDgwF4qVF?)?n(%xbRIM6 z5{_@7cCA{s*O;qQGRVJaa&k@AUh8QUoA#)Q+fBrkw371(!{nG$Rg0XP8Ji%3WD0W9 ze^Q#>gmYh)Hrp5IuGMG-_)323}l_;QXVU>I-iEn9ke z&2Z@D;oPSy4GFPu$Vfx%D+S>i8d4$Q+as&5J%T_y8%;%=GziC(Ut~16^TO~A30OuE z1OkUZcnxuys76ZcLKgs|08tGZolPQbk^md&@}&*1_;5*DKh6^6CNN*a&xh$d=b;QD zpgkK(rYq0)(d*Cu3+_3}3Fz4x$XtA6UO+eQ*7X|4bzlWTM~Y$9wpny$vosMYY8Rr> zeBt6;qGEt`fY0bQ`dsV1C=6xC@F8_7($UqogF zBtp4su57NhhJ@lvwTX(Qym1pq877;HKtLwBW-TlvXvBsEDyUsdWSDfCa-z}$RwQ;# z#L!}r<4cTlwIr08Y@4G^#30ljUw|B+gU$y#fDyEzIJdDW65!#iO!5)TJ!XBsH@a_` zO2x9J|04|b=U6|Z64k=|x1(3ASWP(@YmSw+`e#s9ofJl+%DSj*olEK!G?T4L61ptiBw<1I2V!3eMc44D;Y>?F|3(GQkEFO<%RhwCq_M})qL;{8vs}m^lP%QzF z+oweqX)R4MO>GmAd7t!U-yeK1O_>ZlvHZ-vLk?&E)X97rY*{TRt}Ed9p~6ltyaN&U zytATg(wj;!2buI2%!-Kr>lE zyUZlwpsaX$o0bZASWoZmzn6oHN&7diZob1eE|tIt?Tksn!BT{$9LJgJlP%%WN3P3+ zs&-xn&{07}nuj`YeARF%hqb<4bvZ5fk62j4$AmOb%h40q3U+M`aux}m_?L#Z#+{pP zE<^}}xvMvj(~WC=$0{@0=lnKt$G!}1N3Qhy>|Ir@)SQ@zr~kyADK&To3Zcym3Hj~F zWbp+PYGyjj@!xDIMp3bhiMBIvO)y&UyIg2!(!Dd=Wr6Df#{ z$0eq+Yi5~G#+wsP&{Y$Jm$U8Y*tK@pwyYyNxmcB2Z733$dSLHl3S#J^HJqL2r`Odd z;$Bm{!QYF`VIDNjqy|q9%>}FiT5Vs5UwZ)~cJ!D$qKK6A5b+nclB2EaEdmlq-)`Io z?K{XR*Y>LNKWAmxPjTmMlM&p@>TR#lJ%?G z-Y&AKMpa9I<>t0sm$r*=Nkniwu>A+qepJG2q;DH6$i)esVrRO?U-=4+_&;C$xq$eP zH#xPTGuWn|{D`f=TZC?tT1Pv)BdZkdr$$ZfVCpG_9`PoJ;IU6{Dty&k-aripZc zuEK4Jpd03+jRNw;SC)trSgFU&jcYBzpl^Uw_G!;DGOJQR24Mj06z%X-4fNQIaQs!N z3>asl^(WIb4A*r^ZAAaCPN}CRIskra_0A{x&p3gjW@p1BkpVAzL>@4H4CU8HpKS!R42yFOV|QFIf&N6~&O zZ?*Ur?rIIS3nvdw!0KNh>#rgvOxrTXzdCvpyfb?v^y0^3S6=~Z?f2Qny1iTXKL2AC zrk@P;pWX36Qa54;FeEEBwHYORt<At*c?pkIyfaqX`-(N^Tp79iQcQP83w7Dh)jkz?p`>akOAeh$6>EJt&rH2dgxx=9tZ<)sR`(zX4) z!O)A}p}(0te*RWR1$`PlIVHZlldh~&&L63+*tz}j!67M9wpW%@^+t*+>iCu}*W@(g zy%NFB-a1(q3O&^%HR0lmCg}C;vES}(# zx^MzAD#aF8hggcOC}%C(OyiyrCEppPO*SM$F1U#g+OaU#0-$RBKI4hopxUAx^s|D6 zt9Ma*W&(jzw!Mc^hCjyJPIX7TO-vU%_T-~`33~~fm+z=-9n28*-_DwnI_cyb5|VuB zet#cTFKui$B3BPl=Z3Nh#GEa$hiVnRGpB)*Whx>a)*z)q2v{t|{V#4_Z4dICr|-(Px#kn6?&`vcZ?y9Y+`0)3mMB})#B2q67V`7^Wj!sP~ zb$KiEN;oa{k|`%4DV6TJ`cP(3=7!AEGolaEKd5=IgCBpZ>3z;A1LsmvvRz5^d&AGM z-c5w73KqnS83_Ol`k?nuB6c;W1$OlW>!aq2cWgX_Gsyr?U1KA6icBJ^+P6gPPY3fm z7dG%cb0W{EavQ-ww`xX*O^$cs-&(GnNnSjVNyCre{d_yFU(j+(;1Cb$ng#P6ve9QgLL^4U$o z??3#s>gIcc`%iP8pX=XS1r@d20M=RWhccO-+}ozNi`;$ZjtU>5Mzm+-yFi?*8&{g| z5aF7)4^N<+^aVi)C+N$!Qz}XZh<*TbZwU>$a?l*oATvH&QpS3vx(t$tu;J@KmGPn#daWJY5qbyUrh;RkoN>f8cr)- zCF`>1e)|2?^<;yOvD)|1GuH>7C%FYMMjw6Hv@4&?r)2b)TawT-%fW#}r&o&XXdLz3 zyq917X5*9X_@)9aYmvR4jNAewFE76yIeE)Fd42EKZxFABzOFlPnfVz^?QB?3ecTwW z=lyru7RAEG;gQqqJAw8Paj=B1`Z z!&-7pv33C0tIXa6JKu7aP`?wp?&J+svi}9`=JT$ke>`@Q`ek0(8ADA6%MyUDIMmlU^8NflSHRd}4yeY>5A(1?h$0-wLkmm|3lSJ!1& zxs+wD&hL3>l=ABZweOD1-|`o}s}8Z(7-FiJLLKb<@@_GeA9YDpch@PjFQ*=m{r&Qx zzg?ZqCTp*&cKPnV#sAJr9~(^#{Cc;H9AI2j%{dQz@geWzr2B_IWQ||j7pM~(f?J}e zKuRDt!+D|W8z=wX(?47O!F%V@)|sws$-c7ft)rn2N$-|a|Ek<1+55(p&fuc$)=cit Pe=!ioTN;0Rz%2P+De^o? diff --git a/client/resources/hardnested_tables/bitflip_1_188_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_188_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..01dacce880823f2ab841c5c8cc195577f0c52153 GIT binary patch literal 31274 zcmeI5Ymi(;701t=S7v8tZf}w$nO#CMgph1tHwoDUqK5LKJc3CONPqxA7mOG%K*$5a z^4LaFs~}&5Dv3~*DJ?0~fFDFQAnKHbj}k4ck`hqS#gd1b#H0v1T(=t-;FA-P33AFn zx0CKxSw6s*eMN~X(%Ri2Ez&Au`zm4*DP<}$b|B$nUS^9}an5Z_Es$(p#tn4HAp?CG zX&WdCmyPKVV`Zt4s1#+yRDIjruOt=e`87sT&aE$4kpgalg z4t`*4^p$2wAJ|t-6*3ajvt*7gS^chLwn!9j7gLrrXPtYNlO4vU+%XKZ;Q&{O4jQOP zo{JONW+ZlFOpBOo87iWgMvDDo_*j)DlSG|H(zdxLYbtWQk^GIE9?w;G@ZP;(B=;F( zv&)UNUZf}7dOwAXk+OT(NCi%~tdaIMW81s9;98DtG@4~(lG~+M@w(2~^w~zT+SO@ynI;1$qLDprAwqDv$~Nmtoi=u%?VqOhz?4KKwItf47!B2FVfe?8S~0~9+GTf97LSJ`GX-ig~YQanKswh z7#F_hFI((!C7h|B8g*cm7E~gUkIe z`rYNmwl*=$FO6-1XEvgPw7b+)w_Hdo)Zo?%JUYb4&mI6lhoMWK^vrz8R41c8V1H0r zhjCLV#7tyZ^y{*7l44#OJSj_au_CeB2Ibd9#wtd&yC~1KE8 z)5e|;k@?N2Kr{VqR|0ncpMI!b3e`ZU0iRtk!#!oB2kKrj@)MBI!I+(}wnOolC{Ohj z8(Ha2VA__sq@KI@#ZUgnTk1d1H{5hmG8a zkg~Kt{&e2Mhw@>F<0vlZQWBm~+8erlIHO?aRse zMI^2B^ps!6dzIk9DDNEYlNtMYTya=;cW16xmZHrS6Rfz<;@i!GKb|nKRcDoHPO=Pg z0?dV%b%1YdO2lLYQxV+sTm|Vo|`f!mi6y+e@4}g(0~gnWCa5d0iT!}TpyD4xgcH)GRbBsM1R;VKa5MJ;1fL~1Kn4c>jkOlq?m94uYSXRRkj9lif zfj{rZ$QwJM)ySegbqIE1Nza0&6tZ4yk^^U$#DK6#T%8BjE0pHVUZLSR!?GGKs*&E=_^BzKSGs%qot=C_ytSOTv-kB1H65>zbuI{e#isvntZ zs;T+LE(Vz}3Sigft2Q^y4-D(>i6v z4!j^2c(?fF8YK>2y6QZ{x`_Z{DkRMx89;16z6^DcbCyBqX=u8a)ns`|U6yF^R^|nb zc@&e*q@S6M(C)OjLl*;rCSpyWs_3Xh*tt;9=ucO}O5t zk%zjUTNJ%u2)3h=Ww*LM^UVqxAAJ3VS)K+ZpMZkVnpbvcN<~LHp6<(LL+Kz|zt-Qz z@rnXdg}qpX24iopu@&BV73nn8S_7WSZ@wqx9 z1p>CMfDP7BuY%lj5g>AS5gq`1p!HxXGx&3c{a9u&pRI^bL9l6wis0p4H9E)?qPb>; zq{ckD7_OC?ZMu{Q|1|)SOjJuuCQTV20n>a%(wNT-LyV4ZA>lc25B|qI4JpsQMg#3f zx)}IQ43qk8=B0srg1@Z?^3#p%*Z?m8({KPUJ1#c%FPv(DRquY-E-wSQVXxnt`CO{m z$88ynW%2&S(Q(_cb?jQW^LAfEk`)|?${6E1U2P7+Ma=X1YvD=)AFE4BFqO!r2lT1; zd$Mj7|A`-S4v7F8j6mHUUJ+ZN@m{>vNt{GjY1P8B(>M~-KeGo9o&8mBEO`}m6?*%ohw{05A)Omsc zR8t#{5Vj?J)ED8rnd946t~p?zNjR z=MN%Yy!!A;%4V3?<9SkBD6nnJlOVi-g1c)d81~!pr$dZ=0%N8+(A%_qQ|{3(#TtFz z%BfRnJ8C7Vp$+RyGW)|!t7NJV70?ON;j1+sIm*ag{eB?{D`Zs@`qsX)8L_mZ0%hpe ztT<`{GZ|!suPhTuMy#LogV+2q@Cf-~H$sN2G0}7+(}vmTKs7o+NXU{ymK?I=AuH*e z#t$J&#$vwrvt$|1B8z%2OTdmx{woggEjZ{#jy19rLV09NEjKCR#RxpT%hm-|l7e^N zW#7E2?yik&BQLx4YCqwIPo9Y1)8(5pd}bqkfvUPEh8E@fg?^%0nxPbL{g%Nl|wPMt{kr8+LfRFg6NJ2#ZEv(Afh_$JanR-^P(x`OU0< zePgGw%MN1jJ88$nwrN(xTzy)Y-(lnzd?wD9Z3MXmfHxfH-}~A){{;=vGqiY%@%^S6 zZvJkPV`sb;F~(|TX8m)fTBrl00#il;#QghpJe|_W*Q7dBO_I5YG-rmXklxsAR}G}b zE(bgd_|xT<9#*wx&EP$Whvs6A^cm)oJ};_&YOUwr`jJd|^x|YF99Vj@_Xw zSEwb2T5@=LS9p3?Bl!%qAcd|5IXB~3nmHz^Aqa4uy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_191_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_191_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_198_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_198_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..1b64ec6b54b42048dfe9aac557a931d14b067eb9 GIT binary patch literal 25258 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 diff --git a/client/resources/hardnested_tables/bitflip_1_199_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_199_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_19d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_19d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_19f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_19f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..18008b8bb157da4af25f77192cbcee0bd41f5db6 GIT binary patch literal 18953 zcmeHP-D@0G6hAvort7-9M`*yfq;^Rn+1AFk4;3FOju13S8@2crid{6-CQaJ3CB{?> zgGfc+^vTD7BEbhAq^1TH<`3{8^htb*P$ZPvE)qh~((CWsJGQdt0&9It6JQUzyoo!@PM4rnRB3KOQe)u#k2-bQKCW^6 z;c0)Ei{pOVW7VeLbHaet zS#x-oqfEE6FOZ%FF)MiTe4VAuWnz!%7yJI@MwYYan!14ZVGNJM??$HJcRM*8+nFZii$=xyVM69A$EDuJ zg1^L6#M8In8QVZ0fB>Kn6$BJY>p{WHJ`5zPdR!GCzN(2&IySTP$%ecjI(QspCmt{) z9}JIx0$La^{;9M6XzgWq9Td<#Q3>}zPf zea%Cht=JcadcnOF2dOtW><6ThKn0r)YFT}&_bF~!yxn%ZG-6z~H5X9e9Ma14PI>`8ztxE;-i+m@0(5Ge^z0_`na zU36Nzz%&4-zaKT9x+hm1khd5>!7{=|Om9U1#nE^&7S$ojTPN)RqQTPUhYAgrG+5GL zsm0F)4VD1i`nA{m*PaGT#@y>;S%al@*(ME^G_xdmFwHF8k(1QS(%ti`npu)BOHGYG zAgOT;mNZz}#MGPyOByU`uq4yJ8Z2#KGFpQr4VEAQorc?ZC5=wQiObYBorcqzC9PS~ znk9r=TC-#;FoB53R^GpAPivO6=GZ4kx0BnR%gs;x153m=MgRZ+ literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 deleted file mode 100644 index 034c96abd830555113bf0df7fc5f848cf7fbae90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3543 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 HJNN$pIaCu7 diff --git a/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..483e921ffcf196e93f917ffc780610520cb23ea1 GIT binary patch literal 25815 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 AKL7v# diff --git a/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..77cf4f142cc85110fde93fec0c80f6cdcaeecde1 GIT binary patch literal 21459 zcmeHPeT-Dq6+dt0&FnDDzO%wE49o7$WXs1!wn%AF(qf&UQvQ&Y*2NM6aia*^R_aFq zE!pbr7g4gJqJgcNbeqPuNlU{Y2E~s$8k05=6%#{h{1_A43^5f+YYeH#>F?Y(A3M9V zESs>2P44?+-@NjQ$u#G7qveyqN*+dyx;-!KPeK|c-Anzy} z@AqM|0{JVLyoEuIxIYqM^3mlqlytC($dwr4&iD-CEO~LG?SIDU{Fcv|;y+;%>t$;Gt`^8%rSmLPT3!gJ zBTXQzu~YxFqxK-1)->+;-6rygRunnKCc2&}CUQ3#{fDUwg?gPtzqoxntR}-uIa@CB zNv4pcHB58Cn6xx40^AgFuO_Vzu?NiEw05#V-;bF&tp z?#h5-+(U76*lVZ0{A;KRf*JFr%|Q<_HMN3`7&5Li&HFl&mjd!|`&QT)`uj0h+6F?D zLwDM$C~N?iZeSDlnPyzAoH|{algKWnR$F0SfET|-3k(p^xyQ9u3av#>RGA{X@n!*2 z76UY6wze-@Kdp_rwK}HTilMrm!ZUg+b4_2#5XxT;8EcjpwV_T zN&%8FOc;azO+Xu9C~OA}5itlN0wDRTfLRfPs_YDXa|A~R!H!>|w{?)vvfvN}Cm>RE z1N~8a${l5-7+;ZMv0xg3g_2$xrtioZHce?1eFO76UO~gpfi6YE@k}x2t+6vhhZkY6 zp3&k13LuxIiZ)dFDbs>&$zv*ug;3PSOp&~m5a(Y{RiGF#AG*S-E8xEB z47guW77QE#FH4$YpeX=A{4nHzn(>|rbIPh>HA2VvK}irj5JVZ;I)!4TiPkD#51=*_ z0jQy7AP`E4D+<m3fKiQ@Rjw~`9D-U8HI~bnZs|qS=hViUKJYyHky@Zz>kd@y zU{2Ds%`G$$FUcgB77OMDv5j**VNFBp3Z{_F{~iH3ZL$Y6gZ@6~JirEWs|sA(Bh>k! z_8`BH%|i;h%e3aQ*V@hW z=%=^`Ovir2l&?|?*^i{K%4I7=*;%0oXiQX1MstnH0B|mcG=YE`dqEAcOfgH*$rz0# zRin}U4rqf1j)17Qw^}7M{^Q!?t5B*l6}xDn1J*cK>|)9NLZB<4P$iQBW+Q^w3o;)c zVO2D!IE}8`Ld)_Zg!E6Q|H6W6kkTQEv#{5FaTtbDtN|C9Q^ROtEu$t z2ry125BY57wFKrWaH|_+!!lO=2Fz^(ABy@+Sy;guAmlc;O#%bPt72f)SjS-~&9qwJ zCyNGSebUFUm0K%H0kfY{HPhJ6UhoQO z*`%fR`UP|jdJ2a@-^Z)gHB1}z#a(bD$`UXNY*WWp(LxQ1tP2Nxcip50?{ui)^*jeG z*oJqMI+(=Xsu$=@u-OC~`#e0vfrFtTDfK7A zVrJ8bU}fc(N~}b+nM^|kru|UB2?CW7ZVIC8!kpS_tTJQ)>j>?v2zYdiiKue>{Lpxu zGs4VWay86B3+G<(VNqaT%2DQ@2TN;~j>4%3MAgpbp6$?|DGWF@z|75tF|P?aF9jO5 zFuevi11m1>RKUT|tA}=Rr!vD{uo*7yEHfj#e?j8Tx0(J0U-02X#xb6cBbW)Yh*VN< zAUv5m6Up>2LN@}J&dW58UVs}K$Q1Hk#J4G(FM@g8!Den7%;P2S6L9hu-b~(Di7ZA! z3@&cQ0{F~-Xy(SuY_01j>nsqz0{3qhh>JjU_k8pKY#@trUMs}eOncxW?t@>wcA5It z%aX^CORx*3`wz3ZriaZA#29DcX+2b&c-^#G=ky|*4xP(b|DPDo|D)CIlUj9+)kS@S)l5-L#xIQM*mS z?cH>HHx(Cd@1}mydKPBF?cH>HH?5@{`^W9wbbB|;hcevWO}BSbzt6b6n{MwWwt`OP zu+aF+_bqPkCca>}GehpoP`^fB|5s;*Tz1oCH){{~xxJfXmrx?B+}=&QiPW7;cPG=4 zpm!(Jt&wmi)5V=kKgULWWM|#U^il5AolJKp)7{B*b|=%_$#fhlSL297zV2kYJDG0J xSi1j+8)J09U$x9aG={{fYbZZ7}; literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 KE&cJ~e(Hb3NM_mq diff --git a/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b77d70585853d835f9556c7048fd9a0b267b7f90 GIT binary patch literal 24608 zcmeI4e~ev4701tgzxH+a?VT;%ZeN#n-%EecDqFe~N=PX9BtWX!t`$pdwAu}}p-L+# zrX{%TPEZ6Ytq6^&gkoc?t&tKEkV*r(CW;!?@`te+17Ss=My)on3R+TeMcg~%AGc%SHS6}~VW4FlloePeO>vfTwyWjQaWm0dG%-5gU zOotR^h^a_prY!MNF;<*&8%n)aX6V0lg`$?$>G$iyeDc!z|nnt20 zjg9ss_4Z3<5ohLTvoZB0Gn{8~Cn~*fp9Rb?G+bqM6x7 z3U?GFiu)*z78ptQ6dsh4lx2yL{8vn$G;`HHzPp!<7ge3Fr( z`(`pA*JPxX?pvpG{T&?JI8HG#&AIJ*nR7>tO|LMLb#60NzGLiEB$c_8@Hs;396p>} z>UJ3^^YcX`XSoj;sW^9^k@FE@;Wc_iqsb$nl;<#vPwAzNAn-}rehjI&viOV+SiAJi zI5$z7ryQN|i-@CRyQ`Z8RQQ(SstiKw0d z`}x%Qi$~=~x;#!xj3eC>uc$X2Q2`0A;Pgy%nDcs$FQu^-hV2_2HSFvQI_xZC-H5`j zqB8_O1BK+>%L*HxJ86x>?~I*wmT%Z**CP;rKx2)a_&gW>llDOnn{tuX`$SbucP4Ox zY7QaGsG=G48JqRh>-5^6RUub%C}IXPxprQF{b zq;o$t@}8JpY4cViPtg3_Ug{Q%`~oMDqA1$Jxx=PnazOSg%<`2%2y7ZuI)0E0zv>$3 zWTp2qg?o*3)2stC?;bu<9r~`MJCu_J+*}FCF5>ttBi3I&=D+)Dc*%hqV#%6=Y9NEt z7%>iPVA29*suKYiRn9p)VWv!HGZAnzy2_!euB07@Rj+h8W9u2|+Jhje5bmi-jEnGk z(^|;ez^$aGD z`{giOcaEN#>A9PWa4SqVEdBa1Wd+}_PmlYs*1Of@uhB~zj64il47C_dj%6)U;HTEQ zCBV7ex0naPWgy7qw69@95lrUO(0C>S6Yab)OwxG~9;(iV=kwg=`lYIp>81U$%RSC4 z1CQ+E^u2RjyBz9w{BISH)H$Xa(tg5F=%AcHrH*>6p)lbq?x}J6$Krby8$|x9k=`~V zKSYeZCt#wowHSHG{np4M8qK7&9Y3dWxo=2r@U8jvV_uats1sFg7*u82*gPFqz1EcB zUW-|E0ia<&leuCQ;Ei@yrQWinhx@C`>pM2%5fwiY?j-bOpE9(+ODkl!A1T#GdPMv$8bU22v-rJ$}7j};gNYHu+asjUWwW{U*&-f zF%d;solG@FNmJ@$94@0qjvTrj`?mG<127~awP2XRHSCdc+NV86;o%q7EZ&*s5GS#

    vG2tmGP8|s zz+1eb2_oE_P1HR}+q2P-?Tr(&oJ&_FuSIzn@%^4k?I0u|Y~_gQ>m&kIuo|2*p9x;Q zc(ui~pUukPs?_((xD3w!%g9am#$1n)&oJj(=W(Q{qXg#v_`o-I z)IOe--By}W_pCteI-xaALQL(J^|B2Z;n<@($te=w!LE z6PUO4>%HpXhQji7k1!|L1d2y+pMh26FULKtWgE}br6?jO0Zdm(XotEw*VHY3kL zhyGBt{&7itW&ZmZ#+h;7QwgzuQvIF!OLXzTAhCy_D6#K-TZz4r`O1_zXbW;58LHF$Q0C~Wgz*?^p}%a5lFuJQx{0ShvD`95%nhF=Y{fH z--OGrCs&m4-^A-@2I}yc>6{esj?kEQlmEZFI^L7={XVJF1qW5iTgayiMcdZfL85~c z<|+Gp!e`%0#Jy*HOd{e|Inmh3oYUg-uTJRRD04B!o&oQVp7)G(5*%|GR4IZ^MbJK< zr?5(%l(zYWAbhW7s13$_?h2m~AUg)7YoAT!$2bxZ`g*Ut8 zCApwcC1m=2t~q4-{XLD4>6c>2^lSJ@J|WW|GW}z*wU&_ShX9c8Nrz1TJGJE@WcvL* zS+c3g{rr&WuSF@2A=4i+{UOu;1VL%{JGPZ4WctH)9+GomJI`CPohM}a$KJYGyUQCg z{YrO2rr+3>@`{)bF|*wa72{cyeMcyhOa!=C=Ir@#6X0-Nc=o_;n0ggyOX zPygVS)v%{O?CC$nhZ{qtKVKHHIP6A2R(R)6WyzmRtb$I>Os~!rOaJ>+3ngp8l|>KkVs$t6tF= eGW{XbA2R){3S4-5kAl#%RR25SbKRjYJn~=AVr#_! literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 deleted file mode 100644 index d701fc28569656e2e6c0dc994a11fe21af1282cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1535 zcmZ9LeM}n#7{-s5cE{0e?dX-WK?V9DcdhOqETX{;+R~MyAT4b<7KV3SmvpEJ8jZ$@ z7P#YU-K0>kESo8m5;!U;%Sfgn3wNUvnrL9MWQjAOi%SSGk@yieTr$zWjBoP1dEYHfuc&_pjcmB z1+16({xjyx5`l66a1yoZdRbri+;4lB!oB@jG!irfJW48>G|FQjPjVf-#+M|^$prR5 zNKvUCxJRWryu46Bo($a38J;9Kp_H{3v7REDF18N3skrme zuIp1$_r9%Xe$*B*4RjT~JJrrgA#O46`jr8`di8R6G+xK7IDV|-4q*`kT2*1U&wBmi zt@_c>yXaJc5z2}lDTWP_j!W>dqsm2Mv0A9GhJ{K+DC6_{+MiMTQ+T9a&F!AlmHSuI zliOhAgB_$40Dj496uy)CUE#;sen0)$~Qd^optcvC?b2n**5=VGa`A8+t$dpN8zi=aB zY|2HdNwTZ67ZLWxuqAlg&2J^=HlE7_kIUXUE`EM{Z}j=96#Ga1eYY^0!O&;1VLgbR z-tUtx_v7@yUXAUG9ajr6%r|8tQ>yr+;<|4-c(Ja&JR+3kWnXYRj@im;T5^~RC1czq z<%!nUq27MGmW(TgE=Q;1VsNv`)qU4xR}vH@@I6^<|LsyrYlN9l`;dQXqAZMGblBm* zSe~0WgQRHE1Cs zbcmk@I)TYR6mSNHpmN_qwa@Q}75cx|m@YmewvMZn{#AAP>UuqKIVufg)neLIW$bly z@dP*=|4_4Tx5CQ?2yY}+po5_j?h3OiU$nJ<`a85Y>E#Fc3%LhY|4l%vf@OQM8&u%d zN^}0d39w|2e-moU{n$SbKW)1yAF{vrYV;?>CRr(!(O;q@*A}gqXkGQ=c#RQ1OvevaJC- zCBm**B{L#+l0K9Bgy7oJg?$i`jpsrEY781~WtfLf%kqxY>6H?38mVa$^<^h}VN%zf zM1MCH2?$EFEXzD5!$UM-TiFE_t>_ zdq;H6X_>Ef&3*t4u$J|qaSS%pI%LW>78Sa1F-H?NFLo#gJ&O%R!f{4Q6c@nopu<`M kJ;9bIIxv9@-3p|7ak>GSmlYIvpQi4I8kAb#7x=;Q-?`;f+W-In diff --git a/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c6e2f9438534ae43958a6a4e58cd9a8dfddedb1c GIT binary patch literal 18954 zcmeHP&2Lmy6hHHrd5pu%921&YCq*W0O$VWTEHExec#B5cLRI3fF*?yIv{0sn)LN9} z#Tbn4bmg*%#t;`SOf5EQ^8Nr;tc)AL5YrgM#xzQla`~Nm-%N)ToK9y!#Pb&KzP$T& zK7aST`|*;UL+v9I3x5p|%@z;-OqW+GD~6L4u(`bA(LQ5LhPv6bQLac`Tq)5WV*_YCle1)Dsx|^xP++b>#TUH92 zKbT7P0k;_x*}>F?$Gx^QV{H6|b&4 ziVcdlI}*W10Z))ihxx}fggd=7Pf%h6aTSnFjv0rsHFTgbWMbO~BTmF6}iH45H;t5c`#;|53X zABWf~P-!Rncv_fy!`8ZmMn^f^G!nCQrcR|`QPg>|rp|;Ayu?9roXgb1#nd<&1xYZ& zDGvLOf}}4&>^w(<-Kd0|vLp5;a<0XO_qXl$7u)u!8l?-3MR(B&Y}s-dra-a(7E>sk z-~0N2V}fb8hr{9hJez!y!@L+#(n;Y3koU5v6l$D?BwoXlP(0~s{?2r)+Vne47_d5P z4sUaq>2mf3($gSj5hc&nS=wwS@|b?K^{+LuoCVj^9O}au9*5rzPr&b<;$ZYZJ}Q9o zBM=p`yx2~xksEUsM86Uf{grFO90X~2m-rs4*lyK&Rx}9ti}Q;{#ra`E<~m2Ep2mW| z#8gD-+whESAP_(RPzVbG3Z=E6U}hcx5>-8}3J_n^#3vn_8Tx2lUJxEW4zgnp7!(iK z&-6S@w|Ng3Y25>0FmN&(DDa@zU)!vbJoru%O50gMnVJRZmM!H3{?2o~SM5DxnqTx(zF zAn;i53Qc0lnIi$c$HwL7kDS91vaRDycg;dbgnDyYl9jU(NsBau2 z;ue4(Bkg2*wwEcg#;~Cq21fxe(0@kI9RkM?NdDd!xct>mNZy$D~nk4 zY`Dg#v)H<4$?lcYU}+sY_cU12UGnnI%09S37s9r{UyKPxX9>o`#e2LUQS8ICnzo|9G5N zgCz}?G+1&tsKJs3OByWcuLFPs`s)Dw_lX-6R__<_=L!9Fz<=>H+^H9>775p-Evc0| DKT<(7 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..42fb9d45d1b25c09b945821e8a57e22ee10f7a2c GIT binary patch literal 25815 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 zcmeHNZ-`V?6hE^wvu(Nij+(BME<1~m3F*3uyR3vYLB@i+>k=VSX+jo4xGJHTS@Vc2 z`;ZI$F%b-j+#*yqvr<3Ad=N8A*^dPUeX#$v?pmu-=IM9tdo%Oi{+StbGJ<MV`$LbdlJ^aZJLK30%$+Sx%axs}cMeWHnMf9fvHS-t^o0I9j z=>6P9@npI!HkT>3m)!|yl`Wj2UIyg{Ox622qZAZ9!VT2O6g>d8k%LTCBD?rf%`B$L zn@s7XcIjbC{KYgy`N({3avY|}FHDt{+S<(hRp608+uL9zw`t`7lOvm%W}|jXwySn; zX1Zw|Q~kY=t%GTy)`|SYl)_&>y9>Z-hV12uWo4$@xg#FXh?J0{!XTe$nIcj@=5;$1Jus)i}>q-(g#Lz%r}cX z$J8aVK}QZG=s)GN$G|Em(q}rwTBa3V(fnRwas$P1b|up!k=;yd!}TalHCn>3x~3SS zdlZFML~?U^0!B0dV^ULV3DQCUM_QoGb0V_~O%$D8U}{8vUF0#gIXRu`g?8<_?} z1lx)X9wN>a_Nw}?aGOlU6!xLIwU9z{-HK=WFo`@BwDe8BR4{ilG_3?MMgR>~$W@*9 z7wlsicV;aVYn3&~U@wJ!Ewv6gTA zn%!y}oqmWLJ8P`?dk--#V#|Mv>~b@Yoq)dWoQgXN1dF+f>d|x$x5XBtpToN&H9*Wc zScB*iQ~>Sbosi;S4u+<)YXA{wQYnYD3A6@}-tl2=5-Mt>#^8(F6ojKQobhexd|@mC zb2l*G@v{lDrTTNb1C%f2`)*^}rs(R)2SZJb&neJy3)6hlO;J3YM()-*;bxTJFdh*3 zi0L@I$uw<-<*dRV?D=C<86RQvrEQvE4iRaDW%V*W;#H0L3%h7V10~Zoz?1I|*RAD#O`TT8`B zH5i_NcF${?k_Y{ROlxujHXG~*o5Qe5pz28s@|EAZklkr2LD&M0fnv`I{3Kpus#ARh zR_6*+O%2+-s!uWc1+(=A0F;g{|MN`WDPoUu2)R*nqUAGjra3y*fYoefdI*Yw{|2+w zAcfEIX6o-eISVmX+ils$AIDeDg9i)FLX-_yQ`rHxQ41C=v-#k5XQf) zf#b+19TlkXoC6Gh-&7p6E^`}UGW$fZCBjxxfJeCLO(0~8T7B>Jw|ZEJIq?AF8NizH zB*UJ0F)ZU&16sruvSW&HGro^k8O z>4!7x`EDO_#=#uyn~0uqMjY$LVOVlCK(GVE8;jTiloiyY$RC(f0F8(8A%;r__~>y5 zj&Yq2*Z{y?SgBf6t>N8jeTXo;lcFDCII<*}&Q!uatASFf2;6D(EfZ$AxiAAr0S{1l zC%f^Lz>TNPF?y#C0RT$?{yiv}kCPeTrBczZ5?;7M4~ccF_*AsnSOmOoH6(C8=gegA zihd0zEsrT=Lq?tBiYzD9;aqTuNvAKZ$jb^D%M5^fX92_=%W)2XWYv(UQEtWLKpx*; zvfnog8j3;^;p)RQw^l6jY8Oce7Wa|N{d5=9omD%cy%mal<9S{ zwia|nnLbn}b70IFuSUpw^SFL9m0K5jpOVIK2?EpUs+<2FaL{Jgx$1%?kOc2 z8Lm%%fg91pD`OpdiiF^&p{B%{avuH>qTDA~jHTSvJ_UJPO}FESg*XLq;XjU3p4IsN ze-NkOeZf6;5K7Izf_M>1CL5vP`p~?A^w~F%Y{-d=Mf(OqFg>Qye6rzay0ywyHjnE&y1)8q ztg39qBZGxEH}1Z1jrvx^mZ!=nE_FDU?Nnios;WvE`2o)J63Wi^UU#<#FDhpQFq2A7e@K)%=O&Bit@==SJ^j`w zE@Zq9HHIn;>BlHiM6!gF%>s=lM-iYWQSgG7muosT@*(tLqk`dBdgua;ArT6u#{aaU? zzBzO*hPcM@Tix-nce&%ZnW{cC;g!}x+T5qI*znm+D@EyXuQ*sCH#;QuXpo+q*&Yv-|oRzx>$*(cA0T ziEZKeM{S<>&HWdC`)l)n(BHXoy1j`RG+3W!nPWC~Oyp25CkL164Jyp~`pd_2r=qD> z{dsi+Frf)>;5C@F#$bPe_~MH2@WneraYwntytMKsN0tqX-hY)#{@TqB!rVZxFkr^ zg2)lR1mo8@G>&XktFIuCIl!%i#W_U3;0ozwwScg1nV{9sbe4YB+VHY1@dgvsh737e{wKi^s=5RjK z3gFM&hBO8Xcz#{T0(d!8Nw_aJ44WPJ9ZU6^FoQUfz8#MPx@TBNK^X=3oP}s52omuZ zF^CLn<_lzkBQe4mQV&}+1O>CyT9jYsyQ)Xov<0ImeTnUf3+;UhVG1^|*Nh@cP35k+ z?u0BheG1;hIx!$7Qpvm$!EB>xu07GF8)Chv&*HGyFq)5Qu^KYxsg(E12q#+YjFZ!B k5&T4_#yFtJ#()eMjBHbx<{*dTyWZVTI&(vj2T?TrA6B~l761SM diff --git a/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..87fbc9d30c636c2c71a18e91a94affe398201b1e GIT binary patch literal 21459 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 PB=Gkpjy`|=@F4sbDYe8t literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 deleted file mode 100644 index fe85775bfe7cdafa269bb9b1c2202af269e763c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmWO5e^8o-83*w9ec=Ve8^|jPD%aUJ78UUa%3)KRHojOO_%ld&K{=}?!<3NQW_r0* zW4gTA}og^VM8$|r|q6R(OnWR~`{MaGgcHl}b^VXfZWHZ*Jjcv2EG1<81`Q!QL zd-ptdpQplTE-R5Y<{WH1O#7h;Xu0$8z$+6;(&;#z4$uJ`fC5R0VTJKeW)uJbu2`3K zTGh+I%^Gve6K1p60$B#=m5-=SW3m+O0Iyv4Qhjp&M!!1MH{fek)$UqQmRG_574GLU z9NKv(Wa9L217-3uD7%qH!Ol|RsA8%+i1?7p@}DH}eU2&n!LOg*O-|D)%)a_FyC;-2 ztl#h|`MiS>F7}Y9(@0pXXHKc`64oeh(ilQgriHbcA#bo8}3Q33qDP=yD(kJnc{gUN3gp*s`(fOMkjF|?GFPfB5DfmV16UWA+Q06)>7 zC!GP3=AG8o;(=Uyj~*?u=b#1hVu7_qNq;bjZ-+j^E>Z!$M-Ms+Xy60`zlu_iD+apo zSuS71Cl@Qu4J!1gKTp(O1rH%{qKihmM*YY4Kn# z4U%m{gjx-7utT~7PiR=Cg^KnR;U<`(?yy$jPLJMsUQB(#Gcgj!%!~br6b)!)R@mB- z)8f!9xJCILR4W_!gHnEjSKYpcsG$J?rp3h;ad0!6(35eZV^SM{Uv7%M)#E{-;>8dW z;iXP%E6O$9Lvf9Dk>xOahqc%$E{W{H%K9(0>J6Lr5q1tO6zQVK_FdTIu02u<{3paY z^U*Wr4}%bZCIcu6pb!dR0FXioo+m^C9|NOMZw5`}7NnZP0$DgZqQYZisvd!q(JM`u z96VZkV97msqjEiUa{t8lGgBb$FyOMZo z)EsQ$K9$$7qcS)`nbpH&3=AWc3IkS(PlFb@0ec^B))aXX7(FsJX!S^0PtigR5k`oE zxDh6e6NEWC|KD;MesdXm2n7%uuhX73grJgA-B$OsT%VlCF~}f;{ET2tJ{U-l`i5!%*f1sTvwU9z)KQ&*YS>}lYH=IDLV618g; zifLJE415lD)#vDtp`Io@h+sz8DYH7I3_O~Vcvx=ThElIXygOXbtrXD5`%#zT(wtsL zuI;dTjPgbr)<^>R(}s6*IORbQlc1MosNxKc}Xct+CW!$B71VldVm?N)S#y4b8Xl{?R>8 zUtmz9tqAZ4h^COOGG>Hs_NGNyVdeq{{FZFzI5T+i38IiNLZNi3fccdR1$0(NXTpsnsm+>nEI}GLbbrs?7fum3)(2ciCq2>N>jB8@jv`&T0js z<2B(o$3*$U$gz?pA=3jGuLR2f>_h?54v-{3q9mBmcL6Y5LI+YsF{kY4fLC?aI#SaM z4UQhTTU)MsbL0!KQZY703U+O@to@H@FUdIa_Q;0|Lwj!*{7h9EzwZwo7F0!M5gN8+ z@k^GKUsKx0@wE=Yd3{~(?aW+v@z$Qsw_;_7+HcJmr%Re{bObjy?j1XpS?^lBaL-*R ze(|^Z=Y5Rf{A+s~u76|<&QF()=e2c_!|v?9p(`Kcelp_d`nhA@=aOkv>6X7>M%ej* ze)9eF5f?cu{X8|W&{x!a6sQ>Q)+x~E9I?dj8w6uN4$Czf zaBAX=yTZs+nnx<(sf1m5Dz?Ve)3QA z9gfIx6YKM=QE+!)8i=$)j+nVLqr!NCPC(xqj!Tb!gsQ!2LaokO*UED}n2-;LXgCc2 z3Be!7%PaySAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wVBF N1v(9kpXaZ)+&Az7G@$?h literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 deleted file mode 100644 index 15195d21385b0eede73fd2ebfdf61354647a4812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12468 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_1_24a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_24a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_1_24e_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_24e_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 zcmaJ@|5K9rzV{obJXj&}fSit{fXM^u6N59ZvssFu5Efsa2azd#9+&1KKh;jn^u?_J zQ9*6dpe4^~6BLC<-6cn7+Ge)^>s(~!-a)V2)9mctv2J_Dx}81dDYv$^F8c@E`}yJX z!{Mx8 zEr<{DKmmn{kT)JuWmHfmAx%);=q_r>7(pR!Kz*npBP$5);%Bpzt>nD>BG~&$zGFPf z>XXr__w=WTig{EYVRPts9!w(NJq0in+lry zQ31(r9ep-seHKd2?7fpyKR!QsCunL}9}4;`rz(C@y--E&a8P)LvZy85^|H}+`B^aU zZSM(rPsN{7je13mD$$p<4HCKN4&v|@aDTE`v3V?5O|miz_0X@W`m#D8CJ!LtfKNvo zU({*@6+;f~Gr!q=A$UT9z%!9yZQ~q+?MwS6ZhDU~^V4Ar)0Q*Z=fY}I>~ZioDrlOr z>l-dUGBW`rRa0~xAlSYXwVc3piYi)iMp{+6(HS`U{q*Yet@F%ROkhi0?<^nr2zknz zJc87PEGN;e1{3;3{uAn)1}L}nnqRb(j$J9wbjT;)ya8m-P1h5}(@p4Fh-vi|R<#6*4of`yRZIwSq|4v(B13sOr zZq(p6d#tg;Er$W?8r0KJ?>WHlApKKIB2GvE;*YAI3ep((;v+x%64QJXXNP)mom`a8 zB-BCLCO&i5$38B+pr}4o^57V+lCl8MV108u_@?5s*vsn1_1je-=@*(ujbrJEe&PjM zqix#ru=Dvb2;Bxr&qms5gl|(=RaT6o8ZIjKmoBL28gS#xFFxJxx3iso@SI zk>Be{m!oE0_J3B&H-}<%A^Y>3_lvFk24BUNoPRPuLJ$0Y?`wkI08g6j*(<6T!|qo4 zaaKDL#fGZ8YK21L)6jZzR@B@_n0-6kUeIEao2Nz@{;NFb94hifF+EUZ%e+83Z2bx- zl+j*D3tu#?FP537(s|1(RcriM6f=Y@-8{QB)vAiY?FuEx(2eSagjWbs!um=rsTW&- zQp&Vh6Pfq*;+PEC56aU%Llb8bXmXYfu14mJyN)8uxX;z9! z#NnK7C~7j0>;!K18UmPGw^F#~zYmZIUC=xg#AGPnngV-GU}$^+q!C`3%4?VcL%n7% zO5m){80u}v1t_f5OaT9M zE-E?i?5TsN*waZ_FYzXC8$cq9MGMY$h$W+We(&Jqyw5#R;gyl>z1VQptvn;YcM$5M zg|Z=X2uaTHa$h<-yPPkwHUnVeoIoX)0weL|A2@C*nA%Y*HPFs zLgxY1uuwRD0`g9V-6tev9$1Koe9op>PG0PR>et>Al66{&${{tsM?a=LW0*$_eA6(= zKy)h-A*;xl<~K;PM(*Jkt?z&bEw6UzY4zr|{{)aZl0Bw(S&w>ESMS5P1n?3g9r5#o{+^)Izkol~7t%LN87z@>7hUxp9%#$<79CTfE1$fT< zK5$O;mh>7u8m|JjN$*Ho#7&Ctm8M-2KE`|Epp>HVnO50q_E#d+#rL`Xe ztnihh@X@u-pMg#0yR5(qBwzcZ=I*+|kDuW6o>BB$VHwz@&B64QjGaF)#6e8)4!R+) zlvfshUNn&v6E)qmltApzh74pDeSP_^&pf?|9>{tb>>;gR$$CwSUdX{&1fK3ehesJW zIg=HGuaK-)N!F*0ZAraQ=>Gb&!{3?}n^m+^76y{l|L_AZ-@c}FDm=vDd|Ba8&O)%u z8AdlbkRvjTTr2YuG8AraN`#J%52^QQ3X_IVMYwE*%HgB!a-0(Fa>uTbI7m`&O>z@c zLA)D*7x&6C4Hf8fp4NZOHA0L96)T5xLOxONbw$GBQKkWwi^0*syi{3u3K2Wp()!15 zQ7vCD4B$GXM)H9;3nUGrLqr!D$n(A9fA-*c2c)>`EZTP;?7imHE1C<71WnwV|EA0d zhexuJ8lLnl_xZ1B)m{;PT}bABVLM^M&!LNqQrj98KW_8=?45C@51z; z#Y}s~H}^w-29a6d;dek{deXn@UsaqRsPc=fC!5UKicq3WUPU^Bz-!$l3{ zHF3Skw=Qd$3K@dJ;B|`H?w|Blau*e`6jj5p&VmdH)TiPUO^_y)AgTmI^2v$(8cAL( zMkG9LCFoH1noyi215|z-KcR|*hg|zLi$&(Xfns$HuTl$;0s=&wb%Dn+j2r>d6Oxt_ zFO;g&v@0H4>=tanrx*H9DQb{)p@wG_AwwK{0zG*Jq}h9M96#+7kO;;x&P$Nc73x7o zcTpG(F+AB>B1$AYj4ByE_7tHe#(bA=Q9&SYPTSI5z%zRY-RMvuEB%cmdPP%&P^ekh zwOSU{0i>WLD^ac)3TV^%0%{5LG&jzaf{oXJiW|~1tw^jc-;KuRvQmPafTwPzVw@j-~&+tn@l`+vV#(#WK6TQeC4=w*){|$-!>LG7^h+3)Bo&Wy@&nL4)34 z^>w8BCXxw&GnHS!ShNt#(c}#ReYnPr40<#ARCnZcWpg)S7TuQ!Voj>+Co^ zB-d*QJ=ux|g@u9SFj@=psrMlCBNr#U0~I^+L1e^Iu=V_jIemukHKANf<|S>2cazo)EG4L6Cf z{-k~R<>af9tG_jUofH&(y;jaO(1<3X(7_+?a`@*OWY$%_fw21yy5`7E@3|e;NZX=3 zbcAUm_hnPz7fkCH0fpF5P95C4HYjH|5LeZ?{uz03`Ji+|++L2{00(m=QvZgM)umXE zpWZ#V_X+TfI`Jhp036hanl0A1_K`jL9sYib0hC_eW*2Q7 z&wI182wDDk_rO_L;uKZ8wy(OjS`q>Od?mfqRNRG%^$Dw!^?vArT@3NP&W zp|%#qV)&EV`WF-Nji=}_fGeupb?Mu#Ii}8(x;~{ zaC`$!T>V>d!-L{->H4EOMHEW`0|(bx)sYWI_`Bsjv>x?G<&qKOw45zyirU$3czu<4 zP23%Mw$JiUme{C2eVobjM>f7uUl?@##P?$>V#7#KR6visUHbWpA37-8Xb<=GVDD@i znORn6Sts{i=EnKmyLZC}v*NO1;IU)$%S;>hruRL^A9_8U>%ZpjsxcYf})0o{oMP=!68x;;;Bm2%vT~AwCSTD(DWo%EoX0h50J~ ztwwWzccJ&-oDjlY3&nIYWJ>gb)?~N(HORu@aC~9JgkiBIGOJq>QT&S1#vh%Aw<+&k zYiNz8L!+r>MB3ENS+^OfvY!6u*nn-8$GuC8V!70i%nla7d}qT&KN8B~N<`dIDo7##l1pS&vr74b6y z|C6d64e@XGNke+kksaWW_|nFL=e#PIR$P-3G5yAy0N(XCZ&vPUF#CF9Jq>-f!g*%` z1VIT8?~+MJ+XX;2H7%1vsFDc#T;TKyVbi|d68F}2;Hk?->9QEZOrBVd~p0=>4!rTj|($@ zrf-s+OI-YP2`cDhiqPYel#Y5vjoMP{idiP%>m2q|s}GkQhJa;g9QCz107 z+<8{WMqz&7y!m`!E7++RnE1Y!VVo=6Coj7;$+#4Z4Ar!_SGu8zXy?OA!HcAy3cqEO z$#(w(q+=9{Pys13;vA~C7=rz`YUI*K^6{jR<#;LpTHZ&E?(b$HC+{B<9g*bIsc?d0v-g)~ zJE~Z?D;{2=!pma+d8%rC6UO3I!Q#@BSF)bWP;1$ZCKkhDYtf6)sJo4fs(rkdgQ|&y zW?SsMc!rm|TA)a8hKhyOJfjYk;{*>|8>Sb4Jhc^zfsMU2GDX4EPw=55l99#UPqu33@M$f>Io{_;ZGrVDf(_`{ZVWdHeq9R1IxAUrEIc) zs94~r%*}MrtO=fdY4iw_DulyJJN$IA^Q!%ALB4f?E%Yx4H7UO3gxX>s$Bjx@ZOb1w zg|XN$`&u9*Zl!DV5XQpdgwdqjUrtN~sC04xR#$JBHaT*5SJ{HPj(1uyZx?ammlt$y*r+SWGtSa^{L>Co w;BbQx*p+lXQSPwGJ6rZQCCW$d*d|Ba35(BHe_(zptyQ_Ag8u*cU-)1DiU0rr diff --git a/client/resources/hardnested_tables/bitflip_1_25a_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_25a_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_1_25e_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_25e_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_1_262_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_262_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_1_266_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_266_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_1_272_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_272_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_1_276_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_276_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 zcmeI4PiP!<6vy9hW@odTo&9|$T@tc?lAUa7jizZ9nqtsMgGID0Eh&aZsnIQ{6jY2N zc+l1Xizfr=$zH@%yjk=jh(T$3RS&uKB;=sSLV_(*wDsqkO`2cZK`0XHBeP!0+W0H1Z(Y>LY1ad#cZ*Gs~a@zuD{o14 zeo_EA{lyPy)Wqae7y#;Q`1#1G#|w)1)a!hruQ-$im8{gfZ%BWsIMNbMdc%6vML;L8 z?rA1+2u-KROFp6u=R_~C&9t%;%;KWIkoA)kvqzI?^vOK`@gKD-J_;pW?%fNrH3D@0bc2b8*_T47t~orP;fyFGlZ~G0{P!z${DH0k;BytIC3|KkN5;* zdJ>o|&0wX%unhJ0V7~M^rnt~ib)p`t#HTSw(QGJu?(xRKDsJuKDs*sGoyNRVk6S~# zH9e%Mlf8PN!UfC`G4sA8g$W%!%o#tyYX`StWsi^J<|FfXYajEf81pV@oB>sMOR$91 z;Q-XV1gbUp^<_QCh3R8%VLKLjy(`h<+WrzNoP%lW z24UzS8u&r462bv94r=kXKN4~p%dL=WF#`gF+eq7(0np(Pbm%c&D(a!vuvqLuRKAi_ z^lQDMb!~(*%VW*wP0X{*6?XOH4o-oEWdxE!ExPc zV7YO)8gtvo>`dB*hp;?ekCz8$K|7PA-G0vY{Ox`b)jnpaapwv9xT@`DaT+%}Odrl> zS<;cJ{d=!iY{xvhJ#^Xt*8d;D&|e2cDWa77Xf2`?=_&U&ghVN#6j6$i&nesZ!B%>T z^c3kS(o?qc%d+$o=_%4vq^C$vXbUc@D8Y%CIzaj8qGb{2#f!mZ4-zEaMdh76t|u76umv4h9B>1B`b{7!=r87!LRbHLEpx zdP=2y@Cub+)cDM@xItA)H7I;u!;}J+#SC610m^%X`kMlkmupRo6m(MwR|(@X)i~+4 zs4vu2zA3O}@r5b1LQ~z7R!kG>QP6kw3T_bU(b853v`bm+DyeZ~v8t5D>xQYE7rYDt zLwZytR3*F&ybM6Js)Wjt2b^w-E25pmhTrK6!`#njEP=zvH>z|w<` zfiD6plzIZI7M;=oqQC-?SfGksB5_omySq;rsxM&F-DOBAmREbB*^`)q6@o2koE(P#XojW(md4C J*tQ|90ssyfbqxRj diff --git a/client/resources/hardnested_tables/bitflip_1_280_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_280_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..e835ce4179c307e40e9ceb5e2d400f569a1b826c GIT binary patch literal 8357 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 PB=Gkpjy`|=@F4sbDYe8t literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 deleted file mode 100644 index 15195d21385b0eede73fd2ebfdf61354647a4812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12468 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 GUjI)zux=Cp diff --git a/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a5259b6246dee7b88830b44cd7b0da33f3ee17f4 GIT binary patch literal 41275 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 CoB>Gy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 deleted file mode 100644 index 18a6d49871207a91671b9bbecd09e0a98f45fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ`*TWl2989tY}cy~s#fwgx>XuWG%umP{uClwDHpb&6$0gAMf11sZ zGaAjD(VTzI|9#*8{j>j9r(Suv>-ENCum1*V2o+yG`}M~9jSp^A7Onrh(PeKBA>92E za*+@hf^8}Ef5$7=8c|dosDMJ}_kIC{6RxJ1Effl5FnD|E&g+xfGsrL6j|C(cl znRxE+gqC}G05NAu-@C>|-g0vl(VvIQ$ zvXNX5InP~#67WOo!3#0oRc=DCf63$>4gStbLWkpswahrdUl30lSUx5}G6#9rdUo#H z$dV(axK}*+r6U&O1-D)%NMKv&1$qvPX6`QL2QgP8ANK~Ox9t{bF6LvpfLj#te2n}s z>%~#l!d@JoDW6<2=qg!^=SFBLzKFSl1$=^~N+cQV;pIJT=-;J;R5{KEmxVa5t)=B(YdQ*QlQ?LIyWsP-#$d1%Xv+8Et-w z7A-NYb)HH=g3M4fh8NIeZh$vqk+;Y-4N9Tc*3rA#)ojh0{QjJ{2Yggd7QN8wIhca%K-1>@!Vxf_#hR9 zI>`r7kkB@!SVFrq!4H(ux>#@M2+lOL!wQ9+^LRc4<~OvM6s;6<*QOnOE>Am3 z0U_qG?As``w8I8wTKs8o$#!GYv7u>dw#1{ zHS|`^cWYH{23Zxb508-N=sD*3RA7FQM0^OrBx{K8^(zE1cj&?p3+TKBee3;RDMUB3{ckbk5ARp&7z|p^ND-^pI=1a8p*IVw?)x&nJk;g?<{sSJkb}lYK<2|)f(`X@zhHgR0V2I zxmz9?+A_tJ@KajaCxvp63=D_L899V2sZ(ue9KD61PtHdgc>jWdA^FD>|7sXfWuAe% zO5g}C3gE}^VuT&fm8??JOgy)blJ^arDQfVN+Au0P;tpAp>-daP!kLCqbE-`-{R6u4 zC7p|-j}h;Zl_azgK8~MGRLP5C|LBf2EK?O*-^j5{aF*xIxzMT-+ybteGxY>mOTn#M z)@7eqofr>>b>J-xthr+57*&8jn=S9EnqL|ELkdkI8xGv~*Lb7YQ60mNtV+0Q;(3SM zp`z8ipA1^f4OF%6TY)74rK}NJjCic6khXlqvaHlSnXmn5(l_)c2KL-7Qo!GKbYB40V`fKYXed<4D*;Ks1hx4&ERe3ZaX32)R{ z+9E1m&wW?9-HhY|W%ZIgx@4fL$rS<0vPTr$`~bx8K?Fxe2>g}z1rS#?9>q$bJg>YW zugh1<2@Q5YFIM-G+2LE5zXond{DBlK;=3_jHeTl}LH7VpthIZ1$N;g2#v|;eyWDZqCB~w($Oow8)1Y1VMssD%5oy zTn_Obq5Mvn`q3bKF@PZ{2ae~KHa)E#gQpE^SxeQX&l(MF05rEw#QC^XE$uzQ2l{zE1bbMVCzY8wR1DJMp|Nwt_A&jS*Uz%ytKOz;^0t0V z+)zvif45+J3I<`jmMPi3MEIc+C3{v3y${}1kk+2YaMY_U*r-qgA7%)2!2wbmFxNFq zEWz9)fNz(3Ydw|r5WZOo3C^hkRP|L$U0jMdch%b(_;ui^j$CHxFhn-uzx#Ri@YLqt G%zpu4Rqjmy diff --git a/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..08c31153365ebdaf62319aaec612c7c2448f20a8 GIT binary patch literal 26933 zcmeH~-)|gO701t=Upu=qbI%@s`XOqQtX_Pwc&;}?J6IYbVs7bX&JOnkN zE7AuGNExIGDuK}Qg7U@|gj6+=@C%|yAnhN3kYCWI5|aG@5-*fZLo`*>_VOJ&DV?Dp zK!A8SE7>z==l(e7d(P+FS!a4>{0r@$Pk)iS#6l5Q#fsa>x;k}VMGmZfi6 zxSQafRYi!zFIqLdnSC|Hzjr>KxgIpt)BV)+w+uqA()3hXr(-Fk8E+W)HP_$jQMsCl z)GT)>Bnz9l+$0-U2cgbma6-qqs{$r(394MtJ-0%Rj%|E#GV`&Pl5>x)E3AJPC*DVx zeDftHcQu>qu5r(^;9bOt1tq=Ha4Uf9@yOPPX>7~M+}fvGAvWA!GfgVNmzaB0vWC?} z_P9es)+oWJviCA^i^`B#`L(n=s<_8<+*aefSlLkP~@P`|=GhjBlTnM<6w4R}Aot5ljYT?fx?_!Bzku#|fM z8L<%3uwJwDWoYev0s$@Jda#-*Xc=VjgpXD@sVI0FjFg+?Z;-zu^3iCM!tGFRBlkU; ztU+53A&tVbWoUw^6ots&Fh8d-^$5dA9VQJSyHyVAf21I7 zHH;~2Qn*SHsw7qoDt?`? zWvR5eC+r2jH4zdt364Nctz%SEMXbLNBVH4M)o;{GI)&th(*7KXddV86e>);iu-9S_jTOYYlbGTa&qDvh8pu4Q{9+v zLE$SrV65=4?l$;iq;;pkt;KyDW8w3>{hX(`%9zFVVCLSek1lMK}`j1{+@ zo=0h;s&_TIfneV_m~Q#Bua8bm{+QdOfc&8}p@aSY;56phRze8W_vkX&1J|1+>v%R4 z#j|$-Ee1YMpcj4W5GQ-rxmSX^bYBh2VHYQ&U!yL`?OIVQD?-oDh<7$Dl@*ht?%hha zUWdc>ooeJbh=OZ&*v1x4ghU;^-2x&PEHop>%~&~Ivd}1Y8nc(s4kd25)1J5WXpmUp zhKg3Pfp;>zX1NI5&MNN>-OdGx8H zT1jpv@!!6ni`^-NJ8Qhnw8sp%zF6j#hi1Jn!<~x($2#J{$bC9~2tpn@W(=KsVi%ou zc|TVxX8^$+CmlFh-(3$*?&cKcO>TY#kS>qwCS-gO8951>Y-1L8Eo*+pWaMe1oZlUAOpv4OLhHy zfHS?_;djv@mYK{4VBNd)U%{H`O?Yt;J#%rmg8EJV%(T8&)0^P4f``!meS9+A@-_M+ zy>a{th;D3)sAM8oc1(+Tn%F5eV3XbhCnpAhPo|ilaji z5k%g5O_WpQZ{OAg5jjQVMN3|^WukO?y;j{L{5AOX7OMFS? literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 deleted file mode 100644 index fa1be58fd4b26d23f8c0a258942ba3c6ae602cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 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 diff --git a/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..b315cfd6097ff70103efe6f78b2789a1d8e17d90 GIT binary patch literal 29127 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 diff --git a/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..c7380444ac75b1e664e239b7bc16c474037613bd GIT binary patch literal 18288 zcmeI4PiP!<6vy9hW@odTo&9|$T@tc?lAUa7jizZ9nqtsMgGID0Eh&aZsnIQ{6jY2N zc+l1Xizfr=$zH@%yjk=jh(T$3RS&uKB;=sSLV_(*wDsqkO`2cZK`0XHBeP!0+W0H1Z(Y>LY1ad#cZ*Gs~a@zuD{o14 zeo_EA{lyPy)Wqae7y#;Q`1#1G#|w)1)a!hruQ-$im8{gfZ%BWsIMNbMdc%6vML;L8 z?rA1+2u-KROFp6u=R_~C&9t%;%;KWIkoA)kvqzI?^vOK`@gKD-J_;pW?%fNrH3D@0bc2b8*_T47t~orP;fyFGlZ~G0{P!z${DH0k;BytIC3|KkN5;* zdJ>o|&0wX%unhJ0V7~M^rnt~ib)p`t#HTSw(QGJu?(xRKDsJuKDs*sGoyNRVk6S~# zH9e%Mlf8PN!UfC`G4sA8g$W%!%o#tyYX`StWsi^J<|FfXYajEf81pV@oB>sMOR$91 z;Q-XV1gbUp^<_QCh3R8%VLKLjy(`h<+WrzNoP%lW z24UzS8u&r462bv94r=kXKN4~p%dL=WF#`gF+eq7(0np(Pbm%c&D(a!vuvqLuRKAi_ z^lQDMb!~(*%VW*wP0X{*6?XOH4o-oEWdxE!ExPc zV7YO)8gtvo>`dB*hp;?ekCz8$K|7PA-G0vY{Ox`b)jnpaapwv9xT@`DaT+%}Odrl> zS<;cJ{d=!iY{xvhJ#^Xt*8d;D&|e2cDWa77Xf2`?=_&U&ghVN#6j6$i&nesZ!B%>T z^c3kS(o?qc%d+$o=_%4vq^C$vXbUc@D8zuv!=X+RE#eo85?cVBI?<$SF>+g{-Klt}sm%73ti=)6WRXF-maaio7u&51eXNlAmWM^>4-Mz< z4htL6cU1%L_fw)Tox9BCCSRw{rB(@M@fF)8pFWY?>Ii5x60Mm1obNx_&G$3qM1$tXS)i{~`;IVi#6$NV}0 z3h+c(>a^fXQ;R`~qteMM{Xeiakt$#iq8^H@vooK<&c;dueOp(H1^ zy|=EHH;0%+dxNY&65bd*z@LY8Yl%C=dQg}O*dB5!1vC@ql@^iCx&b!yRuxFxyw~0> z2cfs#Q$@5$6EvT&d)gf-3MJ=EDg!j?0(f!|^x#BdQ#%SzTEk@yiuO@XByi+d&5EMG zq~3B(@6_kAwJD-wiqpDxS?kDEC{GA2E*V#pB$venRT+wvl$Vx4N`5=w^b2o(QN;FT zbn<8Qa^4K=E<#4Lr?Q`rUI^3erM7q3;WTPIB=Y+8X-Tb=eN#d|_>*3O_$@Fg0KCVq zvZGD9j}7R4c*^Rq6(LJTOv+TX!*$6!Djc%g%SFCjC1T?hxaYPgdD0wpOpkaE_z`#p z{JYsh=yniHLG-Kch1kH&8epCJ27AcRmiftNfbD&NCNfT)NWeH_lFPd>MWD=(a=Ft1 zZ}j!F9n7w@0*}~9ZR&(*RI1w470H@mCMdXc>5@9W4{omlNyxlmmLxk z`qSCN>}Zs($&-cxb&&pm=!Vf6(6y!jWH)>cQK#0*>@_?;om{R4(?G6LWwall#JSDm z#dop~A@=jc{51ZINjYw>0P9#4%*+c!DCLWzCbQ&0w@k8Q`ZhkH({glIj2?cN?~sCW zB-)>M-;+YAk0$Ey<`#o2Rh`@v;LQLEbpl7Bgo8&{&XOJw9z~kInl)vA zrefW)=TRli$!><_6O%%1tBntx)QMh4^2!`3r=ZG*?{(k8n-)j6GVHv&OUqcBT~|qb z+&Amgv)uw?m+OkCA?`*APqA}GcdzmyY|32vcu3Ka%C&V$Ff`nqnGt0griBESb zsT!g_?QQ|rg|*}$p>z8`%(;o2X386Xp|Dyc2Fvj#CC+jj#;a^K`G#*m``%7&b(dW) zHZ^%q0!|gMiNxmHbvFT+K*D%5%dyw3NKwpJqRnViyKa&)!e5Aqtl6*fi>?+Mo~pK0 z+vYjslk7??upy6Ut=EJ+5io&#RCbd|eWsg4ud`wOg_6dt^v}F!^aG?9CR?4hfqack zw8_CHtLY)5uyZalE?PxnPcd4f(A!QO9MB@jtqcaK>&iU>GwSm1MTP^u+UTX zJ;xxc65gZe!yKfv^#S&GqlJ!#=DRy>*1F_&@I3o3pG^a=mwJUOHSm%xziB7G#c-0% z8Rxs}m7Uhz#5VIn%&r*pyr2%H(o1^I^QX>x?~?oHtu=j^Bg^qjIE{Qqn6csC(?PQc zp2uLSfXm)@Nw-m{$C9BsOCF_Z$+)DMY6^nJVCq3#Sx@5v>-ev4F8<)pCcc-Hh=6oZ zmL_=!P-B$UyeXj%Pa4uTd7F82k;EQ35~9||vlgR!i;|s53dgu*M&}(Z;Vff4rB+Dt zm0A?FhD+9JMp?EwjEqfz;539|8O2|Y2g+Cjn9-7&zOawYMD}eW_AH6ZE)fkr;=cqd z(0x#nDqORhhqLDWzL#=-r-Y~*UT3g4r2h`GEaxSDBPvhGIEh)s65 zI+`>WZ5$xE%0UM&Ul}DfdYgRYag{aOxW=23(Np`F4nR?ei>F*OcXXFW;BC_3MzQ}jh;Xoa;2lnK_7na&Qa`MblRdLMKz1;rP0^EADM6TH)6-_89Rz&417YT z(c3~-b;f86O}}(EuXC(T&!f5Ybmrp58S}YLH{AHV8oPufeqFR9~ne+MwYCBy_4pRBO0Mbu-) zsKouI6*y=GyoM9(7^1LFUqoCCg3D00HPLOz(})U6ayYDZ(k+MeA{UE26??1mKJvTH zhwzI|hw(o4UhhUrF58}>IFTR%@8RJLHd{n58APw<04cFE=IIoQLaB0uXkOC5bRQr( zXhhBGUR%BU8dVZIOR&{5pQgJ%(kl8EvCF)L_;@zap|Wvds7iNfo%2#ZNE#tvp)I}h zVNs0b2s=qm@f(z|C$*1F{5JBA_s()caFidaT-c@N&{Mnc{26qkOy^UDSe}eG$&vg8 z#P!9L01v~kzlln2cY$dEerN zjhCG-6PSz7V={NbcQRJ2ZO1ODlis&9FqeSqY@Y1`WgLU+MhC4@LT@2~s2BGN&c-L` zC6RS(%@+0`RZ>!fgz*HmTFrM$@tT#Ed>OviQT->XB3UkuDpge=Ag|DCH&?Ly-P?Le zEb$^SfXCy>UUwm0fwC7@e#_c%(8$%S3G6^wiPUV_6vlZ- z6PXQ`dfQ~=6~LK1mR&&us<{$GZ*OeI9H(r1Pk7JGdkI0wqnNg)t#slK@rgv5tu?Bd zMy_QiohFd(r|>0sskgmI6fhq+J3gS)a@(Px zXd4I+|A}d0DMq>b!aM|Sq51Z2IJ5kQ2|bMe^u2`iZ7+3ukeZ z&zm4m$MbnBO0%-3tYnm2s#!%?mqas|mO@qXgWh9`qfPgDW8D!0Y#!u^J@2}4C$Wp` z&n~xCojklo-gz}6paUPo%4sS#Hns#$suO;F7aHR{N#u`)VnvPe!Lkr9uV}+srzZBy7T`3`$}snAmhSAcI|Pq z^Hxgi?YPDX@^j)NK}{h}P@7$g0`-QLT-IZe6cAI|N!$EDckEm?-u4kMo$@Z_U5NC3 zJlaF!oK0$HJwcHlp;QLJ`{-9}Km0uDv}#juB=(N?R$QZ^AcbQ8B^tBIIU|a(K*5NU z+*8>NvN7GH#i=TfI1TkAIJ7?)PN45+uNbz|*%rfjlg_Th32KU>QR(V9L%ZCpj^8q66hvOOgdkzl8rRFxFN z-!_LpeiU{r#LlzX(d=kb(~?JJ45S_eLLl!IWWA1sKYmJ;@bF#PZLDetz*CkhfE5}? zj*zpw{sQ56SC1T}RUl?k`$W6QLpmpa$}z5M=?7>e-IOh$rX*qt_<6Qkp-D3uo9)n= z;v>g3E=bI2QFB@a46=_jWrv3&E|N{`S9*a&SEA3?^#20f_TacYIkm=y3NK)}2Us+6 zp@9+M1LP>o99l+K6HPEM4(iSFcs?C8W)+JqBXQ;URJB@|Y8l}(7=3Y}9|4mgFtlQ2 zc($k_bCjr5T^cheJDRNKD?JLk)XH1x80%zqMh!z zG%ndJ6RhQIjmw}=;^J8=t=LdU>!jvTF0;)g`Xfs1PLI+u#og)t0r-vK2BAk~Q^>$o ztQ~loS!OXxNCsIrJS2LeJ+5UfOD*zR(u}DTvZ;+~(vqzeRJ0h*aYD^8qy>pKg<4Ie zYu4k6SU$lch}&{NP}3LUkIB~06$>XLV%oafZ~U?x)iPWm|6`0>5gw>`5c6gv0v(nV zhQ&l+B1vIkDVGXgK97sT^zwQ-Ad!J`8G?8Mv_0xKYX5(R@3oSB700)#1f!)_iY*pD zv-)0taoC06r;OL|#>$-sACI*DZEU!<_9ORSKmW|3e|y+a>;K1x!JqCFU$h@t?ejM| z4PxDOgsi!qtvbwF*j*jFw#xqbgR;_2uI~NgSt{s$PDy*mYyC=4=Nqb^8g_ZE2y&3{ zJXM~Dn}_OfIRvpMXmVV*?2GVbuVWSx^cOq29zp(RH_x3<^zGz9UmuYcK0P=;pXH2r z{!W&NAg#>O8We#qOG`OtGX_(T(15i3!&Oh+mHDeFn_nMF%Wz!FNgEq6=q5^Telynn zB-`^g;%x7Z|Hs2KGxQ2^F8=eGJ%VQ`@`6*%Vx+Jr^zzw>hT25kJpF@sf_5kC7m-N* zJ|-qrW;f`3v;HqNGvkcrQJ}R#xG4A$uy1I7P40eq_wRvU|DJI8FO{C_*FF1xb&N+R&f=|78;{QhCPBqts5@S|#)YEt@TF5dNdu53-aUCtb^N=Grb zJ4LO9b5+)aDB9NcTP=U6E-#|j*?x|(jO^!Xu5WCPg34JXcR=rF`DXPC5p{9B4ba93 zkzYD0dM8Qc#%EW*v;%K4hTi{i@y*-4A052@cso5m-#1ryd;cVDY|O56`~9nL$ElRV zp0@~hCARNZ0vmPnGy6X{O|$)KK%C8q`f6O7@F!epjr8zzi{kKyzJqu7sqF5C>$3CL zQpIKcUpG))=hflrvj4e}?A=bQ)TsiVqYBT-7E^8X| z9$k2c`%|Y*_w(K???O!0ivMa-hwBYhtg3TwE79TtHVgd7xMs9EK_{H|B(Q+M&AANN4xTbY~`}uEaSO1gqsYiiT zV@L1|`@>nqmrk2c?$}R5jsMMjEeC6`D$l#xHOk!B3!v=d$CK5^scnUm1XN&$`q;UB z6#KaFZd7{?ez?|P59Y)@yYYp@+&*%H++e-<*TlR{vE;UA-B7u%apq^BUY zy@gk!?w_o`^w=YBdG=w9T^saxFATb#UYDP7&fm=Xww}GoXdiubZ~s0~qx=bUHmBod znP}?<_Hsb>5&OY>Wwz_p*)vtE9qWDhU;L|RA2Pn04Nv>7O-k>t9{3%!{v7}Msx=*n z+IMNnwRX1eYx(&yQ^O$kwCGXb&>xO{kb-TS8+mK|FIj});EkNGbdBd6*f;L25!L~r zx?@gS=$TfOm(F;kW+bi@l#jB8=@!p&VQp?axwR74a|cJwD8)>RZRJkkT1}1FeSUcr@($(w7&ET0us)2icHLkb1HxwbSEK&l!R7mPTg2H3j_nk|f0hLSo2 z_NVCvCdw+niL}vj>_Cw%c)8Lc$oVm`XBI#Dl`EQX2jQgoK1pj&JsCmvnS<(%$af%)Ix$-}m0? zh4-4ho$sD313wnuevQFsd$h|d!7>zr1_FgRfy`q@a;QWhX+Szy%bvh!n0>Sc1$1j* z$6poc;E8JtU8yXHi*2)uI9wZ6e8$LGe_afmxB1l_a=$cC_6^Wec^gOK!4`%B;!? zr~G`jPZ_}si`%GN$E6XA7KDcTCbA(PgEzRWTD#C+@}Wlo%RIK;=^yl-1rSH}gOY6b zknDthQd#J84F7yGg~k_$SjLd6U=&JwjaPGYK%nh z#B2S7VYL#J!WN^S)tLhXgf4q%kOgbH9d*>1XGN8Yd8sQOquWQ^rOzv`vd9MXCep1^ zdGtV68ZJ4$N62oV)(+;<2I>Wjf|&>UN;MJQ#d^R0Y!a{c`~6#SWSy8w(>apG*AcL0 z9<^|oG8rl(h%X0E11X3E`g19wk}u-7DeLUGBa+dtf~Z~!i}a_d-qMSM`}Eryw_j|u zE<@C%i0e@i={;tP5jGLfD8y~547ad2Xy-JHnXOuXKX1!F8ZSEs41!|^qK9TI(~P^j zMs=Un>+=XZ(#ng5sWJcyC$MxVX5LAuQ%apuP6z|WKTV3Ao|xI4M7A@G&^m?F$@f-S#7bGb=70Hv?go~1-soQ%%o_9P|OjwSD_ zh(_KKOs-Sc@>=g8z$>a-i)vUIae7@h>Ia&`O7HXqtnH3ESfo1Rl%-4+&^3Wcbq@19 zb$ZM&Wux;c<>`|Q8%TiH^iFW8cQA}OzOGr;%~dy5bwl6SNvyT(Zb9vGGOT99gl9$U z*#)uHMW*2p*N%r+P+Hocuet>A4P$)77=&TIGR+wtD(kZ8n>@=It2r8qF>gqo)}@=) zjjd(&H1~hv@|)tNtZ>zHeBDcAel!~WCdhevE?DL5cXIBDUB1JBb7D2wE6sp6-SRJj zS+_V4yD}|y_N`+EZp)JC649#bLKl|-JG}kpr#{~5_War68}tI+GBG{r9UOU*j6H!? z?(O>6wZz|mYw5dWJ0F$KoT9cY9k$HAo28?kW12=;#~%)9S(?6Wn#(2+b+M$O z*-zIF1z)4!s3dsQPb(_0D&!a!D{Lw@(%~E(HkBrz;@m>sUSb%gr0Ig|_XM^~>AySy zPrwuK1Uvyxz!UHUJONL@6YvB)0Z+ga@B};oPrwuK1Uvyxz!UHUJONL@6YvB)0Z-t6 PB=Gkpjy`|=@F4sbDYe8t literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 deleted file mode 100644 index b01f02208ef4ca4c78fc6566fd6e0c556e11ab30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5424 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 PB=Gkpjy`|=@F4sbDYe8t literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 deleted file mode 100644 index fe85775bfe7cdafa269bb9b1c2202af269e763c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmWO5e^8o-83*w9ec=Ve8^|jPD%aUJ78UUa%3)KRHojOO_%ld&K{=}?!<3NQW_r0* zW4gTA}og^VM8$|r|q6R(OnWR~`{MaGgcHl}b^VXfZWHZ*Jjcv2EG1<81`Q!QL zd-ptdpQplTE-R5Y<{WH1O#7h;Xu0$8z$+6;(&;#z4$uJ`fC5R0VTJKeW)uJbu2`3K zTGh+I%^Gve6K1p60$B#=m5-=SW3m+O0Iyv4Qhjp&M!!1MH{fek)$UqQmRG_574GLU z9NKv(Wa9L217-3uD7%qH!Ol|RsA8%+i1?7p@}DH}eU2&n!LOg*O-|D)%)a_FyC;-2 ztl#h|`MiS>F7}Y9(@0pXXHKc`64oeh(ilQgriHbcA#bo8}3Q33qDP=yD(kJnc{gUN3gp*s`(fOMkjF|?GFPfB5DfmV16UWA+Q06)>7 zC!GP3=AG8o;(=Uyj~*?u=b#1hVu7_qNq;bjZ-+j^E>Z!$M-Ms+Xy60`zlu_iD+apo zSuS71Cl@Qu4J!1gKTp(O1rH%{qKihmM*YY4Kn# z4U%m{gjx-7utT~7PiR=Cg^KnR;U<`(?yy$jPLJMsUQB(#Gcgj!%!~br6b)!)R@mB- z)8f!9xJCILR4W_!gHnEjSKYpcsG$J?rp3h;ad0!6(35eZV^SM{Uv7%M)#E{-;>8dW z;iXP%E6O$9Lvf9Dk>xOahqc%$E{W{H%K9(0>J6Lr5q1tO6zQVK_FdTIu02u<{3paY z^U*Wr4}%bZCIcu6pb!dR0FXioo+m^C9|NOMZw5`}7NnZP0$DgZqQYZisvd!q(JM`u z96VZkV97msqjEiUa{t8lGgBb$FyOMZo z)EsQ$K9$$7qcS)`nbpH&3=AWc3IkS(PlFb@0ec^B))aXX7(FsJX!S^0PtigR5k`oE zxDh6e6NEWC|KD;MesdXm2n7%uuhX73grJgA-B$OsT%VlCF~}f;{ET2tJ{U-l`i5!%*f1sTvwU9z)KQ&*YS>}lYH=IDLV618g; zifLJE415lD)#vDtp`Io@h+sz8DYH7I3_O~Vcvx=ThElIXygOXbtrXD5`%#zT(wtsL zuI;dTjPgbr)<^>R(}s6*IORbQlc1MosNxKc}Xct+CW!$B71VldVm?N)S#y4b8Xl{?R>8 zUtmz9tqAZ4h^COOGG>Hs_NGNyVdeq{{FZFzI5T+i38IiNLZNi3fccdR1$0(NXTpsnsm+>nEI}GLbbrs?7fum3)(2ciCq2>N>jB8@jv`&T0js z<2B(o$3*$U$gz?pA=3jGuLR2f>_h?54v-{3q9mBmcL6Y5LI+YsF{kY4fLC?aI#SaM z4UQhTTU)MsbL0!KQZY703U+O@to@H@FUdIa_Q;0|Lwj!*{7h9EzwZwo7F0!M5gN8+ z@k^GKUsKx0@wE=Yd3{~(?aW+v@z$Qsw_;_7+HcJmr%Re{bObjy?j1XpS?^lBaL-*R ze(|^Z=Y5Rf{A+s~u76|<&QF()=e2c_!|v?9p(`Kcelp_d`nhA@=aOkv>6X7>M%ej* ze)9eF5f?cu{X8|W&{x!a6sQ>Q)+x~E9I?dj8w6uN4$Czf zaBAX=yTZs+nnx<(sf1m5Dz?Ve)3QA z9gfIx6YKM=QE+!)8i=$)j+nVLqr!NCPC(xqj!Tb!gsQ!2LaokO*UED}n2-;LXgCc2 z3Be!7%PaySAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wN#+A|L`HAOa#F0wVBF N1v(9kpXaZ)+&Az7G@$?h literal 0 HcmV?d00001 diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index be7b3a4c3..9c487a50d 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -30,6 +30,7 @@ #include #include #include // MingW +#include #include #include "commonutil.h" // ARRAYLEN @@ -51,8 +52,9 @@ #define IGNORE_BITFLIP_THRESHOLD 0.9901 #define STATE_FILES_DIRECTORY "hardnested_tables/" -#define STATE_FILE_TEMPLATE "bitflip_%d_%03" PRIx16 "_states.bin.bz2" #define STATE_FILE_TEMPLATE_RAW "bitflip_%d_%03" PRIx16 "_states.bin" +#define STATE_FILE_TEMPLATE_LZ4 "bitflip_%d_%03" PRIx16 "_states.bin.lz4" +#define STATE_FILE_TEMPLATE_BZ2 "bitflip_%d_%03" PRIx16 "_states.bin.bz2" #define DEBUG_KEY_ELIMINATION // #define DEBUG_REDUCTION @@ -135,7 +137,7 @@ static void print_progress_header(void) { void hardnested_print_progress(uint32_t nonces, const char *activity, float brute_force, uint64_t min_diff_print_time) { static uint64_t last_print_time = 0; - if (msclock() - last_print_time > min_diff_print_time) { + if (msclock() - last_print_time >= min_diff_print_time) { last_print_time = msclock(); uint64_t total_time = msclock() - start_time; float brute_force_time = brute_force / brute_force_per_second; @@ -256,34 +258,42 @@ static void init_bitflip_bitarrays(void) { #if defined (DEBUG_REDUCTION) uint8_t line = 0; #endif + uint64_t init_bitflip_bitarrays_starttime = msclock(); - bz_stream compressed_stream; - - char state_files_path[strlen(get_my_executable_directory()) + strlen(STATE_FILES_DIRECTORY) + strlen(STATE_FILE_TEMPLATE) + 1]; - char state_file_name[strlen(STATE_FILE_TEMPLATE) + 1]; - char state_file_raw_name[strlen(STATE_FILE_TEMPLATE_RAW) + 1]; - + char state_file_name[MAX(strlen(STATE_FILE_TEMPLATE_RAW), MAX(strlen(STATE_FILE_TEMPLATE_LZ4), strlen(STATE_FILE_TEMPLATE_BZ2))) + 1]; + char state_files_path[strlen(get_my_executable_directory()) + strlen(STATE_FILES_DIRECTORY) + sizeof(state_file_name)]; + uint16_t nraw = 0, nlz4 = 0, nbz2 = 0; for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { num_effective_bitflips[odd_even] = 0; for (uint16_t bitflip = 0x001; bitflip < 0x400; bitflip++) { bool open_uncompressed = false; + bool open_lz4compressed = false; + bool open_bz2compressed = false; bitflip_bitarrays[odd_even][bitflip] = NULL; count_bitflip_bitarrays[odd_even][bitflip] = 1 << 24; - snprintf(state_file_name, sizeof(state_file_name), STATE_FILE_TEMPLATE, odd_even, bitflip); + char *path; + snprintf(state_file_name, sizeof(state_file_name), STATE_FILE_TEMPLATE_RAW, odd_even, bitflip); strncpy(state_files_path, STATE_FILES_DIRECTORY, sizeof(state_files_path) - 1); strncat(state_files_path, state_file_name, sizeof(state_files_path) - (strlen(STATE_FILES_DIRECTORY) + 1)); - - char *path; - if (searchFile(&path, RESOURCES_SUBDIR, state_files_path, "", true) != PM3_SUCCESS) { - snprintf(state_file_raw_name, sizeof(state_file_raw_name), STATE_FILE_TEMPLATE_RAW, odd_even, bitflip); + if (searchFile(&path, RESOURCES_SUBDIR, state_files_path, "", true) == PM3_SUCCESS) { + open_uncompressed = true; + } else { + snprintf(state_file_name, sizeof(state_file_name), STATE_FILE_TEMPLATE_LZ4, odd_even, bitflip); strncpy(state_files_path, STATE_FILES_DIRECTORY, sizeof(state_files_path) - 1); - strncat(state_files_path, state_file_raw_name, sizeof(state_files_path) - (strlen(STATE_FILES_DIRECTORY) + 1)); + strncat(state_files_path, state_file_name, sizeof(state_files_path) - (strlen(STATE_FILES_DIRECTORY) + 1)); if (searchFile(&path, RESOURCES_SUBDIR, state_files_path, "", true) == PM3_SUCCESS) { - open_uncompressed = true; + open_lz4compressed = true; } else { - continue; + snprintf(state_file_name, sizeof(state_file_name), STATE_FILE_TEMPLATE_BZ2, odd_even, bitflip); + strncpy(state_files_path, STATE_FILES_DIRECTORY, sizeof(state_files_path) - 1); + strncat(state_files_path, state_file_name, sizeof(state_files_path) - (strlen(STATE_FILES_DIRECTORY) + 1)); + if (searchFile(&path, RESOURCES_SUBDIR, state_files_path, "", true) == PM3_SUCCESS) { + open_bz2compressed = true; + } else { + continue; + } } } @@ -291,7 +301,138 @@ static void init_bitflip_bitarrays(void) { free(path); if (statesfile == NULL) { continue; - } else if (!open_uncompressed) { + } else if (open_uncompressed) { + fseek(statesfile, 0, SEEK_END); + int fsize = ftell(statesfile); + if (fsize == -1) { + PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); + fclose(statesfile); + exit(5); + } + uint32_t filesize = (uint32_t)fsize; + rewind(statesfile); + + uint32_t count = 0; + size_t bytesread = fread(&count, 1, sizeof(count), statesfile); + if (bytesread != 4) { + PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); + fclose(statesfile); + exit(5); + } + + if ((float)count / (1 << 24) < IGNORE_BITFLIP_THRESHOLD) { + uint32_t *bitset = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1 << 19)); + if (bitset == NULL) { + PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); + fclose(statesfile); + exit(4); + } + + bytesread = fread(bitset, 1, filesize - sizeof(count), statesfile); + if (bytesread != filesize - sizeof(count)) { + PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); + fclose(statesfile); + exit(5); + } + + effective_bitflip[odd_even][num_effective_bitflips[odd_even]++] = bitflip; + bitflip_bitarrays[odd_even][bitflip] = bitset; + count_bitflip_bitarrays[odd_even][bitflip] = count; +#if defined (DEBUG_REDUCTION) + PrintAndLogEx(INFO, "(%03" PRIx16 " %s:%5.1f%%) ", bitflip, odd_even ? "odd " : "even", (float)count / (1 << 24) * 100.0); + line++; + if (line == 8) { + PrintAndLogEx(NORMAL, ""); + line = 0; + } +#endif + } + nraw++; + } else if (open_lz4compressed) { + + fseek(statesfile, 0, SEEK_END); + int fsize = ftell(statesfile); + if (fsize == -1) { + PrintAndLogEx(ERR, "File read error with %s (1). Aborting...\n", state_file_name); + fclose(statesfile); + exit(5); + } + uint32_t filesize = (uint32_t)fsize; + rewind(statesfile); + char *compressed_data = malloc(filesize); + if (compressed_data == NULL) { + PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); + fclose(statesfile); + exit(4); + } + size_t bytesread = fread(compressed_data, 1, filesize, statesfile); + if (bytesread != filesize) { + PrintAndLogEx(ERR, "File read error with %s (2). Aborting...\n", state_file_name); + free(compressed_data); + fclose(statesfile); + exit(5); + } + char *uncompressed_data = malloc((sizeof(uint32_t) * (1 << 19)) + sizeof(uint32_t)); + if (uncompressed_data == NULL) { + PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); + free(compressed_data); + fclose(statesfile); + exit(4); + } + LZ4F_decompressionContext_t ctx; + LZ4F_errorCode_t result = LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION); + if (LZ4F_isError(result)) { + PrintAndLogEx(ERR, "File read error with %s (3) Failed to create decompression context: %s. Aborting...\n", state_file_name, LZ4F_getErrorName(result)); + free(compressed_data); + free(uncompressed_data); + fclose(statesfile); + exit(5); + } + size_t expected_output_size = (sizeof(uint32_t) * (1 << 19)) + sizeof(uint32_t); + size_t consumed_input_size = filesize; + size_t generated_output_size = expected_output_size; + result = LZ4F_decompress(ctx, uncompressed_data, &generated_output_size, compressed_data, &consumed_input_size, NULL); + LZ4F_freeDecompressionContext(ctx); + free(compressed_data); + if (LZ4F_isError(result)) { + PrintAndLogEx(ERR, "File read error with %s (3) %s. Aborting...\n", state_file_name, LZ4F_getErrorName(result)); + free(uncompressed_data); + fclose(statesfile); + exit(5); + } + if (generated_output_size != expected_output_size) { + PrintAndLogEx(ERR, "File read error with %s (3) got %lu instead of %lu bytes. Aborting...\n", state_file_name, generated_output_size, expected_output_size); + free(uncompressed_data); + fclose(statesfile); + exit(5); + } + uint32_t count = ((uint32_t *)uncompressed_data)[0]; + if ((float)count / (1 << 24) < IGNORE_BITFLIP_THRESHOLD) { + uint32_t *bitset = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1 << 19)); + if (bitset == NULL) { + PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); + free(uncompressed_data); + fclose(statesfile); + exit(4); + } + memcpy(bitset, uncompressed_data + 1, sizeof(uint32_t) * (1 << 19)); + effective_bitflip[odd_even][num_effective_bitflips[odd_even]++] = bitflip; + bitflip_bitarrays[odd_even][bitflip] = bitset; + count_bitflip_bitarrays[odd_even][bitflip] = count; +#if defined (DEBUG_REDUCTION) + PrintAndLogEx(INFO, "(%03" PRIx16 " %s:%5.1f%%) ", bitflip, odd_even ? "odd " : "even", (float)count / (1 << 24) * 100.0); + line++; + if (line == 8) { + PrintAndLogEx(NORMAL, ""); + line = 0; + } +#endif + } + free(uncompressed_data); + nlz4++; + continue; + } else if (open_bz2compressed) { + bz_stream compressed_stream; fseek(statesfile, 0, SEEK_END); int fsize = ftell(statesfile); if (fsize == -1) { @@ -346,57 +487,16 @@ static void init_bitflip_bitarrays(void) { #endif } BZ2_bzDecompressEnd(&compressed_stream); - } else { - fseek(statesfile, 0, SEEK_END); - int fsize = ftell(statesfile); - if (fsize == -1) { - PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); - fclose(statesfile); - exit(5); - } - uint32_t filesize = (uint32_t)fsize; - rewind(statesfile); - - uint32_t count = 0; - size_t bytesread = fread(&count, 1, sizeof(count), statesfile); - if (bytesread != 4) { - PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); - fclose(statesfile); - exit(5); - } - - if ((float)count / (1 << 24) < IGNORE_BITFLIP_THRESHOLD) { - uint32_t *bitset = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1 << 19)); - if (bitset == NULL) { - PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); - fclose(statesfile); - exit(4); - } - - bytesread = fread(bitset, 1, filesize - sizeof(count), statesfile); - if (bytesread != filesize - sizeof(count)) { - PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); - fclose(statesfile); - exit(5); - } - - effective_bitflip[odd_even][num_effective_bitflips[odd_even]++] = bitflip; - bitflip_bitarrays[odd_even][bitflip] = bitset; - count_bitflip_bitarrays[odd_even][bitflip] = count; -#if defined (DEBUG_REDUCTION) - PrintAndLogEx(INFO, "(%03" PRIx16 " %s:%5.1f%%) ", bitflip, odd_even ? "odd " : "even", (float)count / (1 << 24) * 100.0); - line++; - if (line == 8) { - PrintAndLogEx(NORMAL, ""); - line = 0; - } -#endif - } + nbz2++; } } effective_bitflip[odd_even][num_effective_bitflips[odd_even]] = 0x400; // EndOfList marker } - + { + char progress_text[80]; + snprintf(progress_text, sizeof(progress_text), "Loaded %u RAW / %u LZ4 / %u BZ2 in %"PRIu64" ms", nraw, nlz4, nbz2, msclock() - init_bitflip_bitarrays_starttime); + hardnested_print_progress(0, progress_text, (float)(1LL << 47), 0); + } uint16_t i = 0; uint16_t j = 0; num_all_effective_bitflips = 0; @@ -431,9 +531,11 @@ static void init_bitflip_bitarrays(void) { PrintAndLogEx(INFO, "%03x ", all_effective_bitflip[i]); } #endif - char progress_text[80]; - snprintf(progress_text, sizeof(progress_text), "Using %d precalculated bitflip state tables", num_all_effective_bitflips); - hardnested_print_progress(0, progress_text, (float)(1LL << 47), 0); + { + char progress_text[80]; + snprintf(progress_text, sizeof(progress_text), "Using %d precalculated bitflip state tables", num_all_effective_bitflips); + hardnested_print_progress(0, progress_text, (float)(1LL << 47), 0); + } } static void free_bitflip_bitarrays(void) { diff --git a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md index e7fe580cd..455ad6254 100644 --- a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md @@ -50,7 +50,7 @@ Install the requirements ```sh sudo apt-get install --no-install-recommends git ca-certificates build-essential pkg-config \ -libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev +libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev libssl-dev ``` If you don't need the native Bluetooth support in the client, you can skip the installation of `libbluetooth-dev`. @@ -91,7 +91,7 @@ If you don't need support for Python3 scripts in the Proxmark3 client, you can s ^[Top](#top) ```sh -sudo zypper install git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel cross-arm-none-gcc9 cross-arm-none-newlib-devel python3-devel libqt5-qtbase-devel libopenssl-devel +sudo zypper install git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel liblz4-devel cross-arm-none-gcc9 cross-arm-none-newlib-devel python3-devel libqt5-qtbase-devel libopenssl-devel ``` Note that Bluez is not available on openSUSE so the native Bluetooth support won't be available in the client. diff --git a/doc/md/Installation_Instructions/Windows-Installation-Instructions.md b/doc/md/Installation_Instructions/Windows-Installation-Instructions.md index 6ac9e53b3..bc29aba6a 100644 --- a/doc/md/Installation_Instructions/Windows-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Windows-Installation-Instructions.md @@ -168,7 +168,7 @@ Install dependencies: ```sh sudo apt-get install --no-install-recommends git ca-certificates build-essential pkg-config \ -libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libpython3-dev qtbase5-dev libssl-dev +libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libpython3-dev qtbase5-dev libssl-dev ``` _note_ If you don't need the graphical components of the Proxmark3 client, you can skip the installation of `qtbase5-dev`. diff --git a/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md b/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md index 9519b4849..21cb8048c 100644 --- a/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md @@ -108,7 +108,7 @@ then, install proxmark dependencies: sudo apt-get install --no-install-recommends \ git ca-certificates build-essential pkg-config \ libreadline-dev gcc-arm-none-eabi libnewlib-dev \ - libbz2-dev libpython3-dev qtbase5-dev libssl-dev + libbz2-dev liblz4-dev libpython3-dev qtbase5-dev libssl-dev ``` _note_ diff --git a/docker/debian-bullseye/Dockerfile b/docker/debian-bullseye/Dockerfile index ff456b558..46cac1b2d 100644 --- a/docker/debian-bullseye/Dockerfile +++ b/docker/debian-bullseye/Dockerfile @@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ apt-get upgrade -y && \ apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean RUN apt-get install -y python3-minimal && \ diff --git a/docker/kali/Dockerfile b/docker/kali/Dockerfile index 79d4bb9a6..0cf70c603 100644 --- a/docker/kali/Dockerfile +++ b/docker/kali/Dockerfile @@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ apt-get upgrade -y && \ apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean RUN apt-get install -y python3-minimal && \ diff --git a/docker/opensuse-leap/Dockerfile b/docker/opensuse-leap/Dockerfile index 1af777d23..7e82c5f61 100644 --- a/docker/opensuse-leap/Dockerfile +++ b/docker/opensuse-leap/Dockerfile @@ -2,7 +2,7 @@ FROM opensuse/leap ENV LANG C # libqt5-qtbase-devel skipped -RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel bluez-devel python3-devel libopenssl-devel +RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel liblz4-devel bluez-devel python3-devel libopenssl-devel RUN zypper addrepo https://download.opensuse.org/repositories/home:wkazubski/15.4/home:wkazubski.repo && \ zypper --gpg-auto-import-keys refresh && \ diff --git a/docker/opensuse-tumbleweed/Dockerfile b/docker/opensuse-tumbleweed/Dockerfile index 169d087c3..04aaff64c 100644 --- a/docker/opensuse-tumbleweed/Dockerfile +++ b/docker/opensuse-tumbleweed/Dockerfile @@ -2,7 +2,7 @@ FROM opensuse/tumbleweed ENV LANG C # libqt5-qtbase-devel skipped -RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel bluez-devel python3-devel libopenssl-devel cross-arm-none-gcc12 cross-arm-none-newlib-devel +RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-devel-base-devel_basis gcc-c++ readline-devel libbz2-devel liblz4-devel bluez-devel python3-devel libopenssl-devel cross-arm-none-gcc12 cross-arm-none-newlib-devel #RUN zypper addrepo https://download.opensuse.org/repositories/home:wkazubski/openSUSE_Tumbleweed/home:wkazubski.repo && \ # zypper --gpg-auto-import-keys refresh && \ diff --git a/docker/parrot-core-latest/Dockerfile b/docker/parrot-core-latest/Dockerfile index a33af1d4c..557ca4d17 100644 --- a/docker/parrot-core-latest/Dockerfile +++ b/docker/parrot-core-latest/Dockerfile @@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ apt-get upgrade -y && \ apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean RUN apt-get install -y python3-minimal && \ diff --git a/docker/ubuntu-18.04/Dockerfile b/docker/ubuntu-18.04/Dockerfile index 29c958a4d..f2747bc33 100644 --- a/docker/ubuntu-18.04/Dockerfile +++ b/docker/ubuntu-18.04/Dockerfile @@ -7,7 +7,7 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ apt-get upgrade -y && \ apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libssl-dev sudo && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libbluetooth-dev libssl-dev sudo && \ apt-get clean RUN apt-get install -y python3-minimal && \ diff --git a/docker/ubuntu-20.04/Dockerfile b/docker/ubuntu-20.04/Dockerfile index 72f6ec6cf..8a1cf03ef 100644 --- a/docker/ubuntu-20.04/Dockerfile +++ b/docker/ubuntu-20.04/Dockerfile @@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ apt-get upgrade -y && \ apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean RUN apt-get install -y python3-minimal && \ diff --git a/docker/ubuntu-22.04/Dockerfile b/docker/ubuntu-22.04/Dockerfile index 9d867e785..e2d93c665 100644 --- a/docker/ubuntu-22.04/Dockerfile +++ b/docker/ubuntu-22.04/Dockerfile @@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ apt-get upgrade -y && \ apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ apt-get clean RUN apt-get install -y python3-minimal && \ From 16812fe32b321e50437583873d21cf6ccd9cb2a1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 15 Jul 2023 23:15:25 +0200 Subject: [PATCH 656/924] add LZ4 to the lin & win CI --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/ubuntu.yml | 6 +++--- .github/workflows/windows.yml | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 0ec56e054..e035578b4 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,7 @@ jobs: run: sudo apt-get update - name: Install dependencies - run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.2-dev liblua5.2-0 lua5.2 sed libssl-dev + run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.2-dev liblua5.2-0 lua5.2 sed libssl-dev - name: Install Python dependencies run: | diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index acce10e3a..9887be49f 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -26,7 +26,7 @@ jobs: run: sudo apt-get update - name: Install dependencies - run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.2-dev liblua5.2-0 lua5.2 sed libssl-dev + run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.2-dev liblua5.2-0 lua5.2 sed libssl-dev - name: Install Python dependencies run: | @@ -58,7 +58,7 @@ jobs: run: sudo apt-get update - name: Install dependencies - run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.2-dev liblua5.2-0 lua5.2 sed libssl-dev + run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.2-dev liblua5.2-0 lua5.2 sed libssl-dev - name: Install Python dependencies run: | @@ -91,7 +91,7 @@ jobs: run: sudo apt-get update - name: Install dependencies - run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.2-dev liblua5.2-0 lua5.2 sed libssl-dev + run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.2-dev liblua5.2-0 lua5.2 sed libssl-dev - name: Install Python dependencies run: | diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 77c3dc70c..3c093f96b 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -110,6 +110,7 @@ jobs: gcc-arm-none-eabi libnewlib-dev libbz2-dev + liblz4-dev qtbase5-dev cmake libpython3-dev From 8c4404134da3749269ec8ffd6cb4963328d7d6a7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 15 Jul 2023 23:20:15 +0200 Subject: [PATCH 657/924] fix test and add changelog --- CHANGELOG.md | 1 + tools/pm3_tests.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 463a379a6..0c84a9e65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added support for LZ4 compressed hadnested tables (@doegox) - Changed `emv reader -v` - now tries to print found transactions logs (@iceman1001) - Added ISO4217 currency lookup (@iceman1001) - Fixed bad free in loadfilebinarykey fct. Thanks to @gentilkiwi diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 3a69dd5bc..ad50121f5 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -235,7 +235,7 @@ fi while true; do if $TESTALL || $TESTCOMMON; then echo -e "\n${C_BLUE}Testing common:${C_NC}" - if ! CheckFileExist "hardnested tables exists" "$RESOURCEPATH/hardnested_tables/bitflip_0_001_states.bin.bz2"; then break; fi + if ! CheckFileExist "hardnested tables exists" "$RESOURCEPATH/hardnested_tables/bitflip_0_001_states.bin.lz4"; then break; fi if ! CheckFileExist "simmodule fw file exists" "$RESOURCEPATH/sim013.bin"; then break; fi if ! CheckFileExist "iCLASS dictionary exists" "$DICPATH/iclass_default_keys.dic"; then break; fi if ! CheckFileExist "MFC dictionary exists" "$DICPATH/mfc_default_keys.dic"; then break; fi From b36d5fa04da2ef81763c9a8d808a640d5370fe4f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 16 Jul 2023 09:45:35 +0200 Subject: [PATCH 658/924] fix wrong memcpy offset --- client/src/cmdhfmfhard.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 9c487a50d..e6581d830 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -359,7 +359,7 @@ static void init_bitflip_bitarrays(void) { } uint32_t filesize = (uint32_t)fsize; rewind(statesfile); - char *compressed_data = malloc(filesize); + char *compressed_data = calloc(filesize, sizeof(uint8_t)); if (compressed_data == NULL) { PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); fclose(statesfile); @@ -372,50 +372,53 @@ static void init_bitflip_bitarrays(void) { fclose(statesfile); exit(5); } - char *uncompressed_data = malloc((sizeof(uint32_t) * (1 << 19)) + sizeof(uint32_t)); + fclose(statesfile); + + char *uncompressed_data = calloc((sizeof(uint32_t) * (1 << 19)) + sizeof(uint32_t), sizeof(uint8_t)); if (uncompressed_data == NULL) { - PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); + PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); free(compressed_data); - fclose(statesfile); exit(4); } + LZ4F_decompressionContext_t ctx; LZ4F_errorCode_t result = LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION); if (LZ4F_isError(result)) { PrintAndLogEx(ERR, "File read error with %s (3) Failed to create decompression context: %s. Aborting...\n", state_file_name, LZ4F_getErrorName(result)); free(compressed_data); free(uncompressed_data); - fclose(statesfile); exit(5); } + size_t expected_output_size = (sizeof(uint32_t) * (1 << 19)) + sizeof(uint32_t); size_t consumed_input_size = filesize; size_t generated_output_size = expected_output_size; result = LZ4F_decompress(ctx, uncompressed_data, &generated_output_size, compressed_data, &consumed_input_size, NULL); + LZ4F_freeDecompressionContext(ctx); free(compressed_data); + if (LZ4F_isError(result)) { PrintAndLogEx(ERR, "File read error with %s (3) %s. Aborting...\n", state_file_name, LZ4F_getErrorName(result)); free(uncompressed_data); - fclose(statesfile); exit(5); } if (generated_output_size != expected_output_size) { PrintAndLogEx(ERR, "File read error with %s (3) got %lu instead of %lu bytes. Aborting...\n", state_file_name, generated_output_size, expected_output_size); free(uncompressed_data); - fclose(statesfile); exit(5); } + uint32_t count = ((uint32_t *)uncompressed_data)[0]; + if ((float)count / (1 << 24) < IGNORE_BITFLIP_THRESHOLD) { uint32_t *bitset = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1 << 19)); if (bitset == NULL) { PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); free(uncompressed_data); - fclose(statesfile); exit(4); } - memcpy(bitset, uncompressed_data + 1, sizeof(uint32_t) * (1 << 19)); + memcpy(bitset, uncompressed_data + sizeof(uint32_t), sizeof(uint32_t) * (1 << 19)); effective_bitflip[odd_even][num_effective_bitflips[odd_even]++] = bitflip; bitflip_bitarrays[odd_even][bitflip] = bitset; count_bitflip_bitarrays[odd_even][bitflip] = count; @@ -432,7 +435,7 @@ static void init_bitflip_bitarrays(void) { nlz4++; continue; } else if (open_bz2compressed) { - bz_stream compressed_stream; + fseek(statesfile, 0, SEEK_END); int fsize = ftell(statesfile); if (fsize == -1) { @@ -447,11 +450,12 @@ static void init_bitflip_bitarrays(void) { if (bytesread != filesize) { PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); fclose(statesfile); - //BZ2_bzDecompressEnd(&compressed_stream); exit(5); } fclose(statesfile); + uint32_t count = 0; + bz_stream compressed_stream; init_bunzip2(&compressed_stream, input_buffer, filesize, (char *)&count, sizeof(count)); int res = BZ2_bzDecompress(&compressed_stream); if (res != BZ_OK) { From 0094318515d7769d12ffb77e3c60681b01a3b28c Mon Sep 17 00:00:00 2001 From: kormax Date: Sun, 16 Jul 2023 14:46:30 +0300 Subject: [PATCH 659/924] Make ISO14443-A polling method more flexible --- armsrc/iso14443a.c | 138 +++++++++++++++++++++++----------- armsrc/iso14443a.h | 19 +++++ client/resources/ecplist.json | 2 +- 3 files changed, 116 insertions(+), 43 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 5416f2917..26a743114 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -142,6 +142,66 @@ Default HF 14a config is set to: */ static hf14a_config hf14aconfig = { 0, 0, 0, 0, 0 } ; + +// Polling frames and configurations + +/*static iso14a_polling_frame REQA_FRAME = { + { 0x26 }, 1, 7, 0 +};*/ + +static const iso14a_polling_frame WUPA_FRAME = { + { 0x52 }, 1, 7, 0, +}; + +static const iso14a_polling_frame MAGWUPA1_FRAME = { + { 0x7A }, 1, 7, 0 +}; + +static const iso14a_polling_frame MAGWUPA2_FRAME = { + { 0x7B }, 1, 7, 0 +}; + +static const iso14a_polling_frame MAGWUPA3_FRAME = { + { 0x7C }, 1, 7, 0 +}; + +static const iso14a_polling_frame MAGWUPA4_FRAME = { + { 0x7D }, 1, 7, 0 +}; + +static const iso14a_polling_frame ECP_FRAME = { + .frame={ 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, + .frame_length=15, + .last_byte_bits=8, + .extra_delay=0 +}; + +static iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { + .frames={ WUPA_FRAME }, + .frame_count=1, + .extra_timeout=0, +}; + +static iso14a_polling_parameters MAGSAFE_POLLING_PARAMETERS = { + .frames={ WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count=5, + .extra_timeout=0 +}; + +// Extra 100ms give enough time for Apple devices to proccess field info and make a decision +static iso14a_polling_parameters ECP_POLLING_PARAMETERS = { + .frames={ WUPA_FRAME, ECP_FRAME }, + .frame_count=2, + .extra_timeout=100 +}; + +static iso14a_polling_parameters FULL_POLLING_PARAMETERS = { + .frames={ WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count=6, + .extra_timeout=100 +}; + + void printHf14aConfig(void) { DbpString(_CYAN_("HF 14a config")); Dbprintf(" [a] Anticol override.... %s%s%s", @@ -2508,57 +2568,34 @@ static void iso14a_set_ATS_times(const uint8_t *ats) { } } -static int GetATQA(uint8_t *resp, uint8_t *resp_par, bool use_ecp, bool use_magsafe) { -#define ECP_DELAY 10 -#define ECP_RETRY_TIMEOUT 100 -#define WUPA_RETRY_TIMEOUT 10 // 10ms - - - // 0x26 - REQA - // 0x52 - WAKE-UP - // 0x7A - MAGESAFE WAKE UP - uint8_t wupa[] = { ISO14443A_CMD_WUPA }; - - // if magsafe, set it outofbounds - if (use_magsafe) { - wupa[0] = MAGSAFE_CMD_WUPA_4; - } - - if (use_ecp) { - // In case a device was already selected, we send a S-BLOCK deselect to bring it into an idle state so it can be selected again - uint8_t deselect_cmd[] = {0xc2, 0xe0, 0xb4}; - ReaderTransmit(deselect_cmd, sizeof(deselect_cmd), NULL); - // Read response if present - (void) ReaderReceive(resp, resp_par); - } +static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters parameters) { + #define WUPA_RETRY_TIMEOUT 10 uint32_t save_iso14a_timeout = iso14a_get_timeout(); iso14a_set_timeout(1236 / 128 + 1); // response to WUPA is expected at exactly 1236/fc. No need to wait longer. bool first_try = true; - uint32_t retry_timeout = use_ecp ? ECP_RETRY_TIMEOUT : WUPA_RETRY_TIMEOUT; + uint32_t retry_timeout = WUPA_RETRY_TIMEOUT * parameters.frame_count + parameters.extra_timeout; uint32_t start_time; int len; - // we may need several tries if we did send an unknown command or a wrong authentication before... + uint8_t current_frame = 0; + do { - if (use_ecp && !first_try) { - uint8_t ecp[] = { 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}; - ReaderTransmit(ecp, sizeof(ecp), NULL); - SpinDelay(ECP_DELAY); + iso14a_polling_frame frame_parameters = parameters.frames[current_frame]; + + if (frame_parameters.last_byte_bits == 8) { + ReaderTransmit(frame_parameters.frame, frame_parameters.frame_length, NULL); + + } else { + ReaderTransmitBitsPar(frame_parameters.frame, frame_parameters.last_byte_bits, NULL, NULL); } - if (use_magsafe) { - if (wupa[0] == MAGSAFE_CMD_WUPA_4) { - wupa[0] = MAGSAFE_CMD_WUPA_1; - } else { - wupa[0]++; - } + if (frame_parameters.extra_delay) { + SpinDelay(frame_parameters.extra_delay); } - - // Broadcast for a card, WUPA (0x52) will force response from all cards in the field - ReaderTransmitBitsPar(wupa, 7, NULL, NULL); + // Receive the ATQA len = ReaderReceive(resp, resp_par); @@ -2568,16 +2605,33 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, bool use_ecp, bool use_mags } first_try = false; + + // Go over frame configurations + current_frame = current_frame < (parameters.frame_count - 1) ? current_frame + 1 : 0; } while (len == 0 && GetTickCountDelta(start_time) <= retry_timeout); iso14a_set_timeout(save_iso14a_timeout); return len; } + int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats) { return iso14443a_select_cardEx(uid_ptr, p_card, cuid_ptr, anticollision, num_cascades, no_rats, false, false); } + +// This method is temporary. Main intention is to move "special" polling frame configuration to the client +iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe) { + if (use_ecp && use_magsafe) { + return FULL_POLLING_PARAMETERS; + } else if (use_ecp) { + return ECP_POLLING_PARAMETERS; + } else if (use_magsafe) { + return MAGSAFE_POLLING_PARAMETERS; + } + return WUPA_POLLING_PARAMETERS; +} + // performs iso14443a anticollision (optional) and card select procedure // fills the uid and cuid pointer unless NULL // fills the card info record unless NULL @@ -2599,7 +2653,7 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint p_card->ats_len = 0; } - if (GetATQA(resp, resp_par, use_ecp, use_magsafe) == false) { + if (GetATQA(resp, resp_par, iso14a_get_polling_parameters(use_ecp, use_magsafe)) == false) { return 0; } @@ -2624,11 +2678,11 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint memcpy(p_card->uid, resp, 4); // select again? - if (GetATQA(resp, resp_par, false, false) == false) { + if (GetATQA(resp, resp_par, WUPA_POLLING_PARAMETERS) == false) { return 0; } - if (GetATQA(resp, resp_par, false, false) == false) { + if (GetATQA(resp, resp_par, WUPA_POLLING_PARAMETERS) == false) { return 0; } @@ -2827,7 +2881,7 @@ int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades) { uint8_t sak = 0x04; // cascade uid int cascade_level = 0; - if (!GetATQA(resp, resp_par, false, false)) { + if (!GetATQA(resp, resp_par, WUPA_POLLING_PARAMETERS)) { return 0; } diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index 104d6b680..186bebfb4 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -108,6 +108,24 @@ typedef enum { RESP_INDEX_PACK, } resp_index_t; +// Defines a frame that will be used in a polling sequence +// ECP Frames are up to (7 + 16) bytes long, this config should cover future and other cases +typedef struct { + uint8_t frame[32]; + uint8_t frame_length; + uint8_t last_byte_bits; + uint16_t extra_delay; +} iso14a_polling_frame; + +// Defines polling sequence configuration +// 4 magsafe, 1 wupa, 1 reqa, 1 ecp, 1 extra +typedef struct { + iso14a_polling_frame frames[8]; + uint8_t frame_count; + uint16_t extra_timeout; +} iso14a_polling_parameters; + + #ifndef AddCrc14A # define AddCrc14A(data, len) compute_crc(CRC_14443_A, (data), (len), (data)+(len), (data)+(len)+1) #endif @@ -148,6 +166,7 @@ void ReaderTransmitBitsPar(uint8_t *frame, uint16_t bits, uint8_t *par, uint32_t void ReaderTransmitPar(uint8_t *frame, uint16_t len, uint8_t *par, uint32_t *timing); uint16_t ReaderReceive(uint8_t *receivedAnswer, uint8_t *par); +iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe); void iso14443a_setup(uint8_t fpga_minor_mode); int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, bool send_chaining, void *data, uint8_t *res); int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats); diff --git a/client/resources/ecplist.json b/client/resources/ecplist.json index 3902e2f2d..991f79f2b 100644 --- a/client/resources/ecplist.json +++ b/client/resources/ecplist.json @@ -58,7 +58,7 @@ }, { - "value": "6a02c3020602ffff", + "value": "6a02c3020002ffff", "name": "Access: Hotel: Hilton", "description": "TCI might be a wildcard before a reservation is made" }, From ad5b58436f163c4fd7d13043a87ecd7a9c0ddbb2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 16 Jul 2023 15:22:24 +0200 Subject: [PATCH 660/924] text --- client/src/cmdhftexkom.c | 98 ++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 44 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 2b54480ca..4164060f7 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -253,7 +253,7 @@ static bool TexcomTK13Decode(uint32_t *implengths, uint32_t implengthslen, char return false; if (verbose) - PrintAndLogEx(INFO, "raw bit string [%zu]: %s", strlen(bitstring), bitstring); + PrintAndLogEx(INFO, "raw bit string [%3zu]... %s", strlen(bitstring), bitstring); // add trailing impulse (some tags just ignore it) if (strlen(bitstring) % 2 != 0) { @@ -280,7 +280,7 @@ static bool TexcomTK13Decode(uint32_t *implengths, uint32_t implengthslen, char return false; if (verbose) - PrintAndLogEx(INFO, "bit string [%zu]: %s", strlen(cbitstring), cbitstring); + PrintAndLogEx(INFO, "bit string [%3zu].... %s", strlen(cbitstring), cbitstring); return ((strlen(cbitstring) == 64) && (strncmp(cbitstring, "1111111111111111", 16) == 0)); } @@ -324,8 +324,8 @@ static bool TexcomTK15Decode(uint32_t *implengths, uint32_t implengthslen, char return false; if (verbose) { - PrintAndLogEx(INFO, "raw bit string [%zu]: %s", strlen(bitstring), bitstring); - PrintAndLogEx(INFO, "bit string [%zu]: %s", strlen(cbitstring), cbitstring); + PrintAndLogEx(INFO, "raw bit string [%3zu]... %s", strlen(bitstring), bitstring); + PrintAndLogEx(INFO, "bit string [%3zu]....... %s", strlen(cbitstring), cbitstring); } return ((strlen(cbitstring) == 64) && (strncmp(cbitstring, "1111111111111111", 16) == 0)); @@ -420,7 +420,7 @@ static bool TexcomGeneralDecode(uint32_t *implengths, uint32_t implengthslen, ch } } if (verbose) - PrintAndLogEx(INFO, "General raw bit string [%zu]: %s", strlen(bitstring), bitstring); + PrintAndLogEx(INFO, "General raw bit string [%zu]... %s", strlen(bitstring), bitstring); return (!biterror && strlen(bitstring) > 0); } @@ -588,30 +588,38 @@ int read_texkom_uid(bool loop, bool verbose) { } bool crc = (TexcomTK13CRC(&card.tcode[3]) == card.tcode[7]); + bool printed = false; if (card.tcode[2] == 0x63) { - PrintAndLogEx(INFO, "TYPE..... TK13"); + PrintAndLogEx(INFO, "TYPE..... " _YELLOW_("TK13")); PrintAndLogEx(INFO, "UID...... " _GREEN_("%s"), sprint_hex(&card.tcode[3], 4)); if (verbose) { PrintAndLogEx(INFO, "CRC...... %s", (crc) ? _GREEN_("ok") : _RED_("fail")); } + printed = true; } else if (card.tcode[2] == 0xCA) { - PrintAndLogEx(INFO, "TYPE..... TK17"); + PrintAndLogEx(INFO, "TYPE..... " _YELLOW_("TK17")); PrintAndLogEx(INFO, "UID...... " _GREEN_("%s"), sprint_hex(&card.tcode[3], 4)); if (verbose) { PrintAndLogEx(INFO, "CRC...... %s", (crc) ? _GREEN_("ok") : _RED_("fail")); } + printed = true; } else if (card.tcode[2] == 0xFF && card.tcode[3] == 0xFF) { - PrintAndLogEx(INFO, "TYPE..... MMBIT"); + PrintAndLogEx(INFO, "TYPE..... " _YELLOW_("MMBIT")); PrintAndLogEx(INFO, "UID...... " _GREEN_("%s"), sprint_hex(&card.tcode[4], 3)); - crc = (MMBITCRC(&card.tcode[4]) == card.tcode[7] >> 4); if (verbose) { + crc = (MMBITCRC(&card.tcode[4]) == card.tcode[7] >> 4); PrintAndLogEx(INFO, "CRC...... %s", (crc) ? _GREEN_("ok") : _RED_("fail")); } + printed = true; } + if (verbose) { - PrintAndLogEx(INFO, "Raw... %s", sprint_hex(card.tcode, 8)); - PrintAndLogEx(INFO, "Raw Reversed... %s", sprint_hex(card.rtcode, 8)); + PrintAndLogEx(INFO, "Raw....... " _YELLOW_("%s"), sprint_hex(card.tcode, 8)); + PrintAndLogEx(INFO, "Raw rev... " _YELLOW_("%s"), sprint_hex(card.rtcode, 8)); + } + if (printed && loop) { + PrintAndLogEx(NORMAL, ""); } } @@ -753,82 +761,84 @@ static int CmdHFTexkomReader(const char *Cmd) { TexcomReverseCode(tcode, 8, rtcode); if (verbose) { - PrintAndLogEx(INFO, "Hex code: %s", sprint_hex(tcode, 8)); - PrintAndLogEx(INFO, "Hex code reversed: %s", sprint_hex(rtcode, 8)); + PrintAndLogEx(INFO, "Hex code............ %s", sprint_hex(tcode, 8)); + PrintAndLogEx(INFO, "Hex code rev........ %s", sprint_hex(rtcode, 8)); } if (tcode[0] == 0xff && tcode[1] == 0xff) { // decoding code if (verbose == false) { - PrintAndLogEx(INFO, "Texkom: %s", sprint_hex(tcode, 8)); - PrintAndLogEx(INFO, "Texkom duplicator: %s", sprint_hex(rtcode, 8)); + PrintAndLogEx(SUCCESS, "Texkom.............. %s", sprint_hex(tcode, 8)); + PrintAndLogEx(SUCCESS, "Texkom duplicator... %s", sprint_hex(rtcode, 8)); } if (codefound == TexkomModTK13) - PrintAndLogEx(INFO, "modulation: TK13"); + PrintAndLogEx(SUCCESS, "Modulation.......... " _YELLOW_("TK13")); else if (codefound == TexkomModTK15) - PrintAndLogEx(INFO, "modulation: TK15"); + PrintAndLogEx(SUCCESS, "Modulation.......... " _YELLOW_("TK15")); else if (codefound == TexkomModTK17) - PrintAndLogEx(INFO, "modulation: TK17"); + PrintAndLogEx(SUCCESS, "Modulation.......... " _YELLOW_("TK17")); else - PrintAndLogEx(INFO, "modulation: unknown"); + PrintAndLogEx(INFO, "Modulation.......... " _YELLOW_("unknown")); if (tcode[2] == 0x63) { // TK13 and TK15. differs only by timings. TK15 has impulse 0 and 1 lengths very close to each other. if (codefound == TexkomModTK13) - PrintAndLogEx(INFO, "type : TK13"); + PrintAndLogEx(SUCCESS, "Type................ " _YELLOW_("TK13")); else if (codefound == TexkomModTK15) - PrintAndLogEx(INFO, "type : TK15"); + PrintAndLogEx(SUCCESS, "Type................ " _YELLOW_("TK15")); else - PrintAndLogEx(WARNING, " mod type: WRONG"); - - PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); + PrintAndLogEx(WARNING, "Type................ " _RED_("fail")); + PrintAndLogEx(SUCCESS, "UID................. " _YELLOW_("%s"), sprint_hex(&tcode[3], 4)); + PrintAndLogEx(INFO, "CRC................ " NOLF); if (TexcomTK13CRC(&tcode[3]) == tcode[7]) - PrintAndLogEx(INFO, "crc : OK"); + PrintAndLogEx(NORMAL, "( " _GREEN_("ok") " )"); else - PrintAndLogEx(WARNING, "crc : WRONG"); + PrintAndLogEx(NORMAL, "( " _RED_("fail") " )"); } else if (tcode[2] == 0xFF && tcode[3] == 0xFF) { // MMBIT if (codefound != TexkomModTK13 && codefound != TexkomModTK15) { - PrintAndLogEx(WARNING, " mod type: WRONG"); + PrintAndLogEx(WARNING, "Mod type............ " _RED_("fail")); } - PrintAndLogEx(INFO, "type : MMBIT"); - PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[4], 3)); - + PrintAndLogEx(SUCCESS, "Type................ " _YELLOW_("MMBIT")); + PrintAndLogEx(SUCCESS, "UID................. " _YELLOW_("%s"), sprint_hex(&tcode[4], 3)); + PrintAndLogEx(INFO, "CRC................ " NOLF); if (MMBITCRC(&tcode[4]) == tcode[7] >> 4) - PrintAndLogEx(INFO, "crc : OK"); + PrintAndLogEx(NORMAL, "( " _GREEN_("ok") " )"); else - PrintAndLogEx(WARNING, "crc : WRONG"); + PrintAndLogEx(NORMAL, "( " _RED_("fail") " )"); + + } else if (tcode[2] == 0xCA) { // TK17 if (codefound != TexkomModTK17) { - PrintAndLogEx(WARNING, " mod type: WRONG"); + PrintAndLogEx(WARNING, "Mod type............ " _RED_("fail")); } - PrintAndLogEx(INFO, "type : TK17"); - PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); - + PrintAndLogEx(SUCCESS, "Type............... " _YELLOW_("TK17")); + PrintAndLogEx(SUCCESS, "UID................ " _YELLOW_("%s"), sprint_hex(&tcode[3], 4)); + PrintAndLogEx(INFO, "CRC................ " NOLF); if (TexcomTK17CRC(&tcode[3]) == tcode[7]) - PrintAndLogEx(INFO, "crc : OK"); + PrintAndLogEx(NORMAL, "( " _GREEN_("ok") " )"); else - PrintAndLogEx(WARNING, "crc : WRONG"); + PrintAndLogEx(NORMAL, "( " _RED_("fail") " )"); } else { - PrintAndLogEx(INFO, "type : unknown"); - PrintAndLogEx(INFO, "uid : %s (maybe)", sprint_hex(&tcode[3], 4)); + PrintAndLogEx(INFO, "Type............... unknown"); + PrintAndLogEx(INFO, "UID................ %s (maybe)", sprint_hex(&tcode[3], 4)); } } else { - PrintAndLogEx(ERR, "Code have no preamble FFFF: %s", sprint_hex(tcode, 8)); + PrintAndLogEx(ERR, "Code have no preamble FFFF... %s", sprint_hex(tcode, 8)); } } else { if (strlen(genbitstring) > 0) - PrintAndLogEx(INFO, "General decoding bitstring: %s", genbitstring); + PrintAndLogEx(INFO, "General decoding bitstring... %s", genbitstring); if (strlen(bitstring) > 0) - PrintAndLogEx(INFO, "last raw bit string [%zu]: %s", strlen(bitstring), bitstring); + PrintAndLogEx(INFO, "last raw bit string [%zu].... %s", strlen(bitstring), bitstring); if (strlen(cbitstring) > 0) - PrintAndLogEx(INFO, "last bit string [%zu]: %s", strlen(cbitstring), cbitstring); + PrintAndLogEx(INFO, "last bit string [%zu]........ %s", strlen(cbitstring), cbitstring); PrintAndLogEx(ERR, "Texkom card is not found"); } From 8fc05ad2a5bc01cf5bd00000fff297c19405f65d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 16 Jul 2023 15:30:43 +0200 Subject: [PATCH 661/924] style --- armsrc/iso14443a.c | 66 +++++++++++++++++++++++----------------------- armsrc/iso14443a.h | 6 ++--- doc/commands.json | 4 +-- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 26a743114..da1bfbc2f 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -143,62 +143,62 @@ Default HF 14a config is set to: static hf14a_config hf14aconfig = { 0, 0, 0, 0, 0 } ; -// Polling frames and configurations +// Polling frames and configurations -/*static iso14a_polling_frame REQA_FRAME = { - { 0x26 }, 1, 7, 0 +/*static iso14a_polling_frame REQA_FRAME = { + { 0x26 }, 1, 7, 0 };*/ -static const iso14a_polling_frame WUPA_FRAME = { +static const iso14a_polling_frame WUPA_FRAME = { { 0x52 }, 1, 7, 0, }; -static const iso14a_polling_frame MAGWUPA1_FRAME = { - { 0x7A }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA1_FRAME = { + { 0x7A }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA2_FRAME = { - { 0x7B }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA2_FRAME = { + { 0x7B }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA3_FRAME = { - { 0x7C }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA3_FRAME = { + { 0x7C }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA4_FRAME = { - { 0x7D }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA4_FRAME = { + { 0x7D }, 1, 7, 0 }; -static const iso14a_polling_frame ECP_FRAME = { - .frame={ 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, - .frame_length=15, - .last_byte_bits=8, - .extra_delay=0 +static const iso14a_polling_frame ECP_FRAME = { + .frame = { 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, + .frame_length = 15, + .last_byte_bits = 8, + .extra_delay = 0 }; static iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME }, - .frame_count=1, - .extra_timeout=0, + .frames = { WUPA_FRAME }, + .frame_count = 1, + .extra_timeout = 0, }; static iso14a_polling_parameters MAGSAFE_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count=5, - .extra_timeout=0 + .frames = { WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count = 5, + .extra_timeout = 0 }; // Extra 100ms give enough time for Apple devices to proccess field info and make a decision static iso14a_polling_parameters ECP_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, ECP_FRAME }, - .frame_count=2, - .extra_timeout=100 + .frames = { WUPA_FRAME, ECP_FRAME }, + .frame_count = 2, + .extra_timeout = 100 }; static iso14a_polling_parameters FULL_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count=6, - .extra_timeout=100 + .frames = { WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count = 6, + .extra_timeout = 100 }; @@ -2570,7 +2570,7 @@ static void iso14a_set_ATS_times(const uint8_t *ats) { static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters parameters) { - #define WUPA_RETRY_TIMEOUT 10 +#define WUPA_RETRY_TIMEOUT 10 uint32_t save_iso14a_timeout = iso14a_get_timeout(); iso14a_set_timeout(1236 / 128 + 1); // response to WUPA is expected at exactly 1236/fc. No need to wait longer. @@ -2587,7 +2587,7 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters p if (frame_parameters.last_byte_bits == 8) { ReaderTransmit(frame_parameters.frame, frame_parameters.frame_length, NULL); - + } else { ReaderTransmitBitsPar(frame_parameters.frame, frame_parameters.last_byte_bits, NULL, NULL); } @@ -2595,7 +2595,7 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters p if (frame_parameters.extra_delay) { SpinDelay(frame_parameters.extra_delay); } - + // Receive the ATQA len = ReaderReceive(resp, resp_par); @@ -2628,7 +2628,7 @@ iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_m return ECP_POLLING_PARAMETERS; } else if (use_magsafe) { return MAGSAFE_POLLING_PARAMETERS; - } + } return WUPA_POLLING_PARAMETERS; } diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index 186bebfb4..80a223379 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -120,9 +120,9 @@ typedef struct { // Defines polling sequence configuration // 4 magsafe, 1 wupa, 1 reqa, 1 ecp, 1 extra typedef struct { - iso14a_polling_frame frames[8]; - uint8_t frame_count; - uint16_t extra_timeout; + iso14a_polling_frame frames[8]; + uint8_t frame_count; + uint16_t extra_timeout; } iso14a_polling_parameters; diff --git a/doc/commands.json b/doc/commands.json index 40ae8cbc9..775087e22 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -4806,7 +4806,7 @@ }, "hf mf staticnested": { "command": "hf mf staticnested", - "description": "Execute Nested attack against MIFARE Classic card with static nonce for key recovery. Supply a known key from one block to recover all keys", + "description": "Execute static nested attack against MIFARE Classic card with static nonce for key recovery. Supply a known key from one block to recover all keys", "notes": [ "hf mf staticnested --mini --blk 0 -a -k FFFFFFFFFFFF", "hf mf staticnested --1k --blk 0 -a -k FFFFFFFFFFFF", @@ -11689,6 +11689,6 @@ "metadata": { "commands_extracted": 679, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-14T16:33:40" + "extracted_on": "2023-07-16T13:30:30" } } \ No newline at end of file From c4f1b0768dd290026b91dfb4d9a77242fabd48a5 Mon Sep 17 00:00:00 2001 From: kormax Date: Sun, 16 Jul 2023 16:49:31 +0300 Subject: [PATCH 662/924] Pass polling config via pointer instead of by-value, thus saving RAM --- armsrc/iso14443a.c | 100 ++++++++++++++++++++++----------------------- armsrc/iso14443a.h | 8 ++-- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index da1bfbc2f..8cab781e4 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -143,62 +143,62 @@ Default HF 14a config is set to: static hf14a_config hf14aconfig = { 0, 0, 0, 0, 0 } ; -// Polling frames and configurations +// Polling frames and configurations -/*static iso14a_polling_frame REQA_FRAME = { - { 0x26 }, 1, 7, 0 +/*static iso14a_polling_frame REQA_FRAME = { + { 0x26 }, 1, 7, 0 };*/ -static const iso14a_polling_frame WUPA_FRAME = { +static const iso14a_polling_frame WUPA_FRAME = { { 0x52 }, 1, 7, 0, }; -static const iso14a_polling_frame MAGWUPA1_FRAME = { - { 0x7A }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA1_FRAME = { + { 0x7A }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA2_FRAME = { - { 0x7B }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA2_FRAME = { + { 0x7B }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA3_FRAME = { - { 0x7C }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA3_FRAME = { + { 0x7C }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA4_FRAME = { - { 0x7D }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA4_FRAME = { + { 0x7D }, 1, 7, 0 }; -static const iso14a_polling_frame ECP_FRAME = { - .frame = { 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, - .frame_length = 15, - .last_byte_bits = 8, - .extra_delay = 0 +static const iso14a_polling_frame ECP_FRAME = { + .frame={ 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, + .frame_length=15, + .last_byte_bits=8, + .extra_delay=0 }; static iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { - .frames = { WUPA_FRAME }, - .frame_count = 1, - .extra_timeout = 0, + .frames={ WUPA_FRAME }, + .frame_count=1, + .extra_timeout=0, }; static iso14a_polling_parameters MAGSAFE_POLLING_PARAMETERS = { - .frames = { WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count = 5, - .extra_timeout = 0 + .frames={ WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count=5, + .extra_timeout=0 }; // Extra 100ms give enough time for Apple devices to proccess field info and make a decision static iso14a_polling_parameters ECP_POLLING_PARAMETERS = { - .frames = { WUPA_FRAME, ECP_FRAME }, - .frame_count = 2, - .extra_timeout = 100 + .frames={ WUPA_FRAME, ECP_FRAME }, + .frame_count=2, + .extra_timeout=100 }; static iso14a_polling_parameters FULL_POLLING_PARAMETERS = { - .frames = { WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count = 6, - .extra_timeout = 100 + .frames={ WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count=6, + .extra_timeout=100 }; @@ -2569,33 +2569,32 @@ static void iso14a_set_ATS_times(const uint8_t *ats) { } -static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters parameters) { -#define WUPA_RETRY_TIMEOUT 10 +static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters *polling_parameters) { + #define WUPA_RETRY_TIMEOUT 10 uint32_t save_iso14a_timeout = iso14a_get_timeout(); iso14a_set_timeout(1236 / 128 + 1); // response to WUPA is expected at exactly 1236/fc. No need to wait longer. bool first_try = true; - uint32_t retry_timeout = WUPA_RETRY_TIMEOUT * parameters.frame_count + parameters.extra_timeout; + uint32_t retry_timeout = WUPA_RETRY_TIMEOUT * polling_parameters->frame_count + polling_parameters->extra_timeout; uint32_t start_time; int len; uint8_t current_frame = 0; do { - iso14a_polling_frame frame_parameters = parameters.frames[current_frame]; - - if (frame_parameters.last_byte_bits == 8) { - ReaderTransmit(frame_parameters.frame, frame_parameters.frame_length, NULL); + iso14a_polling_frame *frame_parameters = &polling_parameters->frames[current_frame]; + if (frame_parameters->last_byte_bits == 8) { + ReaderTransmit(frame_parameters->frame, frame_parameters->frame_length, NULL); } else { - ReaderTransmitBitsPar(frame_parameters.frame, frame_parameters.last_byte_bits, NULL, NULL); + ReaderTransmitBitsPar(frame_parameters->frame, frame_parameters->last_byte_bits, NULL, NULL); } - if (frame_parameters.extra_delay) { - SpinDelay(frame_parameters.extra_delay); + if (frame_parameters->extra_delay) { + SpinDelay(frame_parameters->extra_delay); } - + // Receive the ATQA len = ReaderReceive(resp, resp_par); @@ -2606,8 +2605,8 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters p first_try = false; - // Go over frame configurations - current_frame = current_frame < (parameters.frame_count - 1) ? current_frame + 1 : 0; + // Go over frame configurations, loop back when we reach the end + current_frame = current_frame < (polling_parameters->frame_count - 1) ? current_frame + 1 : 0; } while (len == 0 && GetTickCountDelta(start_time) <= retry_timeout); iso14a_set_timeout(save_iso14a_timeout); @@ -2616,7 +2615,7 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters p int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats) { - return iso14443a_select_cardEx(uid_ptr, p_card, cuid_ptr, anticollision, num_cascades, no_rats, false, false); + return iso14443a_select_cardEx(uid_ptr, p_card, cuid_ptr, anticollision, num_cascades, no_rats, &WUPA_POLLING_PARAMETERS); } @@ -2628,7 +2627,7 @@ iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_m return ECP_POLLING_PARAMETERS; } else if (use_magsafe) { return MAGSAFE_POLLING_PARAMETERS; - } + } return WUPA_POLLING_PARAMETERS; } @@ -2638,7 +2637,7 @@ iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_m // if anticollision is false, then the UID must be provided in uid_ptr[] // and num_cascades must be set (1: 4 Byte UID, 2: 7 Byte UID, 3: 10 Byte UID) // requests ATS unless no_rats is true -int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats, bool use_ecp, bool use_magsafe) { +int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats, iso14a_polling_parameters *polling_parameters) { uint8_t resp[MAX_FRAME_SIZE] = {0}; // theoretically. A usual RATS will be much smaller uint8_t resp_par[MAX_PARITY_SIZE] = {0}; @@ -2653,7 +2652,7 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint p_card->ats_len = 0; } - if (GetATQA(resp, resp_par, iso14a_get_polling_parameters(use_ecp, use_magsafe)) == false) { + if (GetATQA(resp, resp_par, polling_parameters) == false) { return 0; } @@ -2678,11 +2677,11 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint memcpy(p_card->uid, resp, 4); // select again? - if (GetATQA(resp, resp_par, WUPA_POLLING_PARAMETERS) == false) { + if (GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS) == false) { return 0; } - if (GetATQA(resp, resp_par, WUPA_POLLING_PARAMETERS) == false) { + if (GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS) == false) { return 0; } @@ -2881,7 +2880,7 @@ int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades) { uint8_t sak = 0x04; // cascade uid int cascade_level = 0; - if (!GetATQA(resp, resp_par, WUPA_POLLING_PARAMETERS)) { + if (!GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS)) { return 0; } @@ -3089,7 +3088,8 @@ void ReaderIso14443a(PacketCommandNG *c) { // if failed selecting, turn off antenna and quite. if (!(param & ISO14A_NO_SELECT)) { iso14a_card_select_t *card = (iso14a_card_select_t *)buf; - arg0 = iso14443a_select_cardEx(NULL, card, NULL, true, 0, (param & ISO14A_NO_RATS), (param & ISO14A_USE_ECP), (param & ISO14A_USE_MAGSAFE)); + iso14a_polling_parameters polling_parameters = iso14a_get_polling_parameters(param & ISO14A_USE_ECP, param & ISO14A_USE_MAGSAFE); + arg0 = iso14443a_select_cardEx(NULL, card, NULL, true, 0, (param & ISO14A_NO_RATS), &polling_parameters); FpgaDisableTracing(); reply_mix(CMD_ACK, arg0, card->uidlen, 0, buf, sizeof(iso14a_card_select_t)); diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index 80a223379..98793a02f 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -120,9 +120,9 @@ typedef struct { // Defines polling sequence configuration // 4 magsafe, 1 wupa, 1 reqa, 1 ecp, 1 extra typedef struct { - iso14a_polling_frame frames[8]; - uint8_t frame_count; - uint16_t extra_timeout; + iso14a_polling_frame frames[8]; + uint8_t frame_count; + uint16_t extra_timeout; } iso14a_polling_parameters; @@ -170,7 +170,7 @@ iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_m void iso14443a_setup(uint8_t fpga_minor_mode); int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, bool send_chaining, void *data, uint8_t *res); int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats); -int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats, bool use_ecp, bool use_magsafe); +int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats, iso14a_polling_parameters *polling_parameters); int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades); void iso14a_set_trigger(bool enable); From 45ca9ab4d6e7f492ea8d0880231e80a8a33fa6e0 Mon Sep 17 00:00:00 2001 From: kormax Date: Sun, 16 Jul 2023 16:56:07 +0300 Subject: [PATCH 663/924] Reduce struct memory footprint by reducing array sizes --- armsrc/iso14443a.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index 98793a02f..abe04ac46 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -109,18 +109,18 @@ typedef enum { } resp_index_t; // Defines a frame that will be used in a polling sequence -// ECP Frames are up to (7 + 16) bytes long, this config should cover future and other cases +// ECP Frames are up to (7 + 16) bytes long, 24 bytes should cover future and other cases typedef struct { - uint8_t frame[32]; + uint8_t frame[24]; uint8_t frame_length; uint8_t last_byte_bits; uint16_t extra_delay; } iso14a_polling_frame; // Defines polling sequence configuration -// 4 magsafe, 1 wupa, 1 reqa, 1 ecp, 1 extra +// 6 would be enough for 4 magsafe, 1 wupa, 1 ecp, typedef struct { - iso14a_polling_frame frames[8]; + iso14a_polling_frame frames[6]; uint8_t frame_count; uint16_t extra_timeout; } iso14a_polling_parameters; From a9cba025144419b8bf7b1ac784888ceca43b0722 Mon Sep 17 00:00:00 2001 From: kormax Date: Sun, 16 Jul 2023 17:39:32 +0300 Subject: [PATCH 664/924] Move custom polling frame generation logic to client --- armsrc/iso14443a.c | 65 ++++----------------------------- armsrc/iso14443a.h | 19 ---------- client/src/cmdhf14a.c | 83 +++++++++++++++++++++++++++++++++++++++---- client/src/cmdhf14a.h | 1 + include/mifare.h | 20 ++++++++++- 5 files changed, 102 insertions(+), 86 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 8cab781e4..3619155da 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -145,61 +145,16 @@ static hf14a_config hf14aconfig = { 0, 0, 0, 0, 0 } ; // Polling frames and configurations -/*static iso14a_polling_frame REQA_FRAME = { - { 0x26 }, 1, 7, 0 -};*/ - static const iso14a_polling_frame WUPA_FRAME = { { 0x52 }, 1, 7, 0, }; -static const iso14a_polling_frame MAGWUPA1_FRAME = { - { 0x7A }, 1, 7, 0 -}; - -static const iso14a_polling_frame MAGWUPA2_FRAME = { - { 0x7B }, 1, 7, 0 -}; - -static const iso14a_polling_frame MAGWUPA3_FRAME = { - { 0x7C }, 1, 7, 0 -}; - -static const iso14a_polling_frame MAGWUPA4_FRAME = { - { 0x7D }, 1, 7, 0 -}; - -static const iso14a_polling_frame ECP_FRAME = { - .frame={ 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, - .frame_length=15, - .last_byte_bits=8, - .extra_delay=0 -}; - static iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { .frames={ WUPA_FRAME }, .frame_count=1, .extra_timeout=0, }; -static iso14a_polling_parameters MAGSAFE_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count=5, - .extra_timeout=0 -}; - -// Extra 100ms give enough time for Apple devices to proccess field info and make a decision -static iso14a_polling_parameters ECP_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, ECP_FRAME }, - .frame_count=2, - .extra_timeout=100 -}; - -static iso14a_polling_parameters FULL_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count=6, - .extra_timeout=100 -}; void printHf14aConfig(void) { @@ -2619,18 +2574,6 @@ int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32 } -// This method is temporary. Main intention is to move "special" polling frame configuration to the client -iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe) { - if (use_ecp && use_magsafe) { - return FULL_POLLING_PARAMETERS; - } else if (use_ecp) { - return ECP_POLLING_PARAMETERS; - } else if (use_magsafe) { - return MAGSAFE_POLLING_PARAMETERS; - } - return WUPA_POLLING_PARAMETERS; -} - // performs iso14443a anticollision (optional) and card select procedure // fills the uid and cuid pointer unless NULL // fills the card info record unless NULL @@ -3088,8 +3031,12 @@ void ReaderIso14443a(PacketCommandNG *c) { // if failed selecting, turn off antenna and quite. if (!(param & ISO14A_NO_SELECT)) { iso14a_card_select_t *card = (iso14a_card_select_t *)buf; - iso14a_polling_parameters polling_parameters = iso14a_get_polling_parameters(param & ISO14A_USE_ECP, param & ISO14A_USE_MAGSAFE); - arg0 = iso14443a_select_cardEx(NULL, card, NULL, true, 0, (param & ISO14A_NO_RATS), &polling_parameters); + + arg0 = iso14443a_select_cardEx( + NULL, card, NULL, true, 0, (param & ISO14A_NO_RATS), + (param & ISO14A_USE_CUSTOM_POLLING) ? (iso14a_polling_parameters *)cmd : &WUPA_POLLING_PARAMETER + ); + // This can be improved by adding a cmd parser pointer and moving it by struct length to allow combining data with polling params FpgaDisableTracing(); reply_mix(CMD_ACK, arg0, card->uidlen, 0, buf, sizeof(iso14a_card_select_t)); diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index abe04ac46..817ee7df4 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -108,24 +108,6 @@ typedef enum { RESP_INDEX_PACK, } resp_index_t; -// Defines a frame that will be used in a polling sequence -// ECP Frames are up to (7 + 16) bytes long, 24 bytes should cover future and other cases -typedef struct { - uint8_t frame[24]; - uint8_t frame_length; - uint8_t last_byte_bits; - uint16_t extra_delay; -} iso14a_polling_frame; - -// Defines polling sequence configuration -// 6 would be enough for 4 magsafe, 1 wupa, 1 ecp, -typedef struct { - iso14a_polling_frame frames[6]; - uint8_t frame_count; - uint16_t extra_timeout; -} iso14a_polling_parameters; - - #ifndef AddCrc14A # define AddCrc14A(data, len) compute_crc(CRC_14443_A, (data), (len), (data)+(len), (data)+(len)+1) #endif @@ -166,7 +148,6 @@ void ReaderTransmitBitsPar(uint8_t *frame, uint16_t bits, uint8_t *par, uint32_t void ReaderTransmitPar(uint8_t *frame, uint16_t len, uint8_t *par, uint32_t *timing); uint16_t ReaderReceive(uint8_t *receivedAnswer, uint8_t *par); -iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe); void iso14443a_setup(uint8_t fpga_minor_mode); int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, bool send_chaining, void *data, uint8_t *res); int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats); diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index a8ec8a60d..61423cc48 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -434,6 +434,71 @@ int Hf14443_4aGetCardData(iso14a_card_select_t *card) { return 0; } +iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe) { + + iso14a_polling_frame WUPA_FRAME = { + { 0x52 }, 1, 7, 0, + }; + + iso14a_polling_frame MAGWUPA1_FRAME = { + { 0x7A }, 1, 7, 0 + }; + + iso14a_polling_frame MAGWUPA2_FRAME = { + { 0x7B }, 1, 7, 0 + }; + + iso14a_polling_frame MAGWUPA3_FRAME = { + { 0x7C }, 1, 7, 0 + }; + + iso14a_polling_frame MAGWUPA4_FRAME = { + { 0x7D }, 1, 7, 0 + }; + + iso14a_polling_frame ECP_FRAME = { + .frame={ 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, + .frame_length=15, + .last_byte_bits=8, + .extra_delay=0 + }; + + iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { + .frames={ WUPA_FRAME }, + .frame_count=1, + .extra_timeout=0, + }; + + iso14a_polling_parameters MAGSAFE_POLLING_PARAMETERS = { + .frames={ WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count=5, + .extra_timeout=0 + }; + + // Extra 100ms give enough time for Apple devices to proccess field info and make a decision + iso14a_polling_parameters ECP_POLLING_PARAMETERS = { + .frames={ WUPA_FRAME, ECP_FRAME }, + .frame_count=2, + .extra_timeout=100 + }; + + iso14a_polling_parameters FULL_POLLING_PARAMETERS = { + .frames={ WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count=6, + .extra_timeout=100 + }; + + if (use_ecp && use_magsafe) { + return FULL_POLLING_PARAMETERS; + } else if (use_ecp) { + return ECP_POLLING_PARAMETERS; + } else if (use_magsafe) { + return MAGSAFE_POLLING_PARAMETERS; + } + return WUPA_POLLING_PARAMETERS; +} + + static int CmdHF14AReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf 14a reader", @@ -473,12 +538,10 @@ static int CmdHF14AReader(const char *Cmd) { cm |= ISO14A_NO_RATS; } - if (arg_get_lit(ctx, 5)) { - cm |= ISO14A_USE_ECP; - } - - if (arg_get_lit(ctx, 6)) { - cm |= ISO14A_USE_MAGSAFE; + iso14a_polling_parameters polling_parameters; + if (arg_get_lit(ctx, 5) || arg_get_lit(ctx, 6)) { + cm |= ISO14A_USE_CUSTOM_POLLING; + polling_parameters = iso14a_get_polling_parameters(arg_get_lit(ctx, 5), arg_get_lit(ctx, 6)); } bool continuous = arg_get_lit(ctx, 7); @@ -494,7 +557,13 @@ static int CmdHF14AReader(const char *Cmd) { } do { clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, NULL, 0); + + if (cm & ISO14A_USE_CUSTOM_POLLING) { + SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, (uint8_t *)&polling_parameters, sizeof(polling_parameters)); + } else { + SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, NULL, 0); + } + if (ISO14A_CONNECT & cm) { PacketResponseNG resp; diff --git a/client/src/cmdhf14a.h b/client/src/cmdhf14a.h index a811db66b..ff6d80318 100644 --- a/client/src/cmdhf14a.h +++ b/client/src/cmdhf14a.h @@ -52,6 +52,7 @@ int Hf14443_4aGetCardData(iso14a_card_select_t *card); int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen); int ExchangeRAW14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, bool silentMode); +iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe); int SelectCard14443A_4(bool disconnect, bool verbose, iso14a_card_select_t *card); bool Get_apdu_in_framing(void); diff --git a/include/mifare.h b/include/mifare.h index e66df50aa..cf3b51511 100644 --- a/include/mifare.h +++ b/include/mifare.h @@ -75,9 +75,27 @@ typedef enum ISO14A_COMMAND { ISO14A_NO_RATS = (1 << 9), ISO14A_SEND_CHAINING = (1 << 10), ISO14A_USE_ECP = (1 << 11), - ISO14A_USE_MAGSAFE = (1 << 12) + ISO14A_USE_MAGSAFE = (1 << 12), + ISO14A_USE_CUSTOM_POLLING = (1 << 13) } iso14a_command_t; +// Defines a frame that will be used in a polling sequence +// ECP Frames are up to (7 + 16) bytes long, 24 bytes should cover future and other cases +typedef struct { + uint8_t frame[24]; + uint8_t frame_length; + uint8_t last_byte_bits; + uint16_t extra_delay; +} iso14a_polling_frame; + +// Defines polling sequence configuration +// 6 would be enough for 4 magsafe, 1 wupa, 1 ecp, +typedef struct { + iso14a_polling_frame frames[6]; + uint8_t frame_count; + uint16_t extra_timeout; +} iso14a_polling_parameters; + typedef struct { uint8_t *response; uint8_t *modulation; From a54097e19cddf6ceee9dc9deccacb02d432cfd1e Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sun, 16 Jul 2023 17:25:43 +0200 Subject: [PATCH 665/924] fix archlinux and fedora dockers --- docker/archlinux/Dockerfile | 3 +-- docker/archlinux/README.md | 6 ++++++ docker/archlinux/run_tests.sh | 5 +++++ docker/fedora-36/Dockerfile | 2 +- docker/fedora-36/docker_rm.sh | 1 + docker/fedora-37/Dockerfile | 2 +- docker/fedora-37/docker_rm.sh | 1 + 7 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docker/archlinux/Dockerfile b/docker/archlinux/Dockerfile index 93584c098..18f573cb2 100644 --- a/docker/archlinux/Dockerfile +++ b/docker/archlinux/Dockerfile @@ -5,10 +5,9 @@ RUN pacman -Syu --noconfirm RUN pacman-db-upgrade # qt5-base skipped # bluez skipped, can't be installed in docker -RUN pacman -S --noconfirm sudo git base-devel cmake libusb readline bzip2 arm-none-eabi-gcc arm-none-eabi-newlib python --needed +RUN pacman -S --noconfirm sudo git base-devel cmake libusb readline bzip2 lz4 arm-none-eabi-gcc arm-none-eabi-newlib python --needed RUN pacman -S --noconfirm python-pip -RUN python3 -m pip install ansicolors sslcrypto # OpenCL for hitag2crack RUN pacman -S --noconfirm ocl-icd diff --git a/docker/archlinux/README.md b/docker/archlinux/README.md index 872d46cb4..7c699e524 100644 --- a/docker/archlinux/README.md +++ b/docker/archlinux/README.md @@ -47,5 +47,11 @@ Or if you want to run single test, ``` make clean; make -j + +python3 -m venv /tmp/venv +source /tmp/venv/bin/activate +python3 -m pip install --use-pep517 pyaes +python3 -m pip install ansicolors sslcrypto tools/pm3_tests.sh --long +deactivate ``` diff --git a/docker/archlinux/run_tests.sh b/docker/archlinux/run_tests.sh index 53eeda9a3..67715f92f 100755 --- a/docker/archlinux/run_tests.sh +++ b/docker/archlinux/run_tests.sh @@ -39,4 +39,9 @@ pacman -Ss '^gcc$' # sudo pacman -S testing/gcc # sudo pacman -S gcc +python3 -m venv /tmp/venv +source /tmp/venv/bin/activate +python3 -m pip install --use-pep517 pyaes +python3 -m pip install ansicolors sslcrypto tools/release_tests.sh +deactivate diff --git a/docker/fedora-36/Dockerfile b/docker/fedora-36/Dockerfile index 007af68c3..3cb7b93c6 100644 --- a/docker/fedora-36/Dockerfile +++ b/docker/fedora-36/Dockerfile @@ -2,7 +2,7 @@ FROM fedora:36 ENV LANG C # qt5-qtbase-devel skipped -RUN dnf install -y passwd sudo git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel bzip2-devel bluez-libs-devel python3-devel openssl-devel libatomic findutils +RUN dnf install -y passwd sudo git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel bzip2-devel lz4-devel bluez-libs-devel python3-devel openssl-devel libatomic findutils RUN yum -y update RUN yum -y install cmake python-pip diff --git a/docker/fedora-36/docker_rm.sh b/docker/fedora-36/docker_rm.sh index ea2b28809..bcdd1d060 100644 --- a/docker/fedora-36/docker_rm.sh +++ b/docker/fedora-36/docker_rm.sh @@ -1,4 +1,5 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-fedora-36:1.0) docker image rm pm3-fedora-36:1.0 docker image rm fedora:36 diff --git a/docker/fedora-37/Dockerfile b/docker/fedora-37/Dockerfile index 930767853..122834560 100644 --- a/docker/fedora-37/Dockerfile +++ b/docker/fedora-37/Dockerfile @@ -2,7 +2,7 @@ FROM fedora:37 ENV LANG C # qt5-qtbase-devel skipped -RUN dnf install -y passwd sudo git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel bzip2-devel bluez-libs-devel python3-devel openssl-devel libatomic findutils +RUN dnf install -y passwd sudo git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel bzip2-devel lz4-devel bluez-libs-devel python3-devel openssl-devel libatomic findutils RUN yum -y update RUN yum -y install cmake python-pip diff --git a/docker/fedora-37/docker_rm.sh b/docker/fedora-37/docker_rm.sh index a9359d0fd..896b5ac82 100644 --- a/docker/fedora-37/docker_rm.sh +++ b/docker/fedora-37/docker_rm.sh @@ -1,4 +1,5 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-fedora-37:1.0) docker image rm pm3-fedora-37:1.0 docker image rm fedora:37 From 7f5e1c9657874b9de7fcad3d1ce87d60adc38cd8 Mon Sep 17 00:00:00 2001 From: kormax Date: Sun, 16 Jul 2023 19:27:38 +0300 Subject: [PATCH 666/924] Move custom polling frame generation logic to client --- armsrc/iso14443a.c | 12 +--- client/src/cmdhf14a.c | 151 ++++++++++++++++++++++-------------------- client/src/cmdhf14a.h | 1 + client/src/cmdhfvas.c | 28 ++++++-- include/mifare.h | 1 - 5 files changed, 105 insertions(+), 88 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 3619155da..4bb51f69b 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -144,19 +144,13 @@ static hf14a_config hf14aconfig = { 0, 0, 0, 0, 0 } ; // Polling frames and configurations - -static const iso14a_polling_frame WUPA_FRAME = { - { 0x52 }, 1, 7, 0, -}; - static iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME }, + .frames={ {{ 0x52 }, 1, 7, 0} }, .frame_count=1, .extra_timeout=0, }; - void printHf14aConfig(void) { DbpString(_CYAN_("HF 14a config")); Dbprintf(" [a] Anticol override.... %s%s%s", @@ -3034,9 +3028,9 @@ void ReaderIso14443a(PacketCommandNG *c) { arg0 = iso14443a_select_cardEx( NULL, card, NULL, true, 0, (param & ISO14A_NO_RATS), - (param & ISO14A_USE_CUSTOM_POLLING) ? (iso14a_polling_parameters *)cmd : &WUPA_POLLING_PARAMETER + (param & ISO14A_USE_CUSTOM_POLLING) ? (iso14a_polling_parameters *)cmd : &WUPA_POLLING_PARAMETERS ); - // This can be improved by adding a cmd parser pointer and moving it by struct length to allow combining data with polling params + // TODO: Improve by adding a cmd parser pointer and moving it by struct length to allow combining data with polling params FpgaDisableTracing(); reply_mix(CMD_ACK, arg0, card->uidlen, 0, buf, sizeof(iso14a_card_select_t)); diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 61423cc48..bf1ded102 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -54,6 +54,35 @@ void Set_apdu_in_framing(bool v) { static int CmdHelp(const char *Cmd); static int waitCmd(bool i_select, uint32_t timeout, bool verbose); + +static const iso14a_polling_frame WUPA_FRAME = { + { 0x52 }, 1, 7, 0, +}; + +static const iso14a_polling_frame MAGWUPA1_FRAME = { + { 0x7A }, 1, 7, 0 +}; + +static const iso14a_polling_frame MAGWUPA2_FRAME = { + { 0x7B }, 1, 7, 0 +}; + +static const iso14a_polling_frame MAGWUPA3_FRAME = { + { 0x7C }, 1, 7, 0 +}; + +static const iso14a_polling_frame MAGWUPA4_FRAME = { + { 0x7D }, 1, 7, 0 +}; + +static const iso14a_polling_frame ECP_FRAME = { + .frame={ 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, + .frame_length=15, + .last_byte_bits=8, + .extra_delay=0 +}; + + static const manufactureName_t manufactureMapping[] = { // ID, "Vendor Country" { 0x01, "Motorola UK" }, @@ -435,67 +464,37 @@ int Hf14443_4aGetCardData(iso14a_card_select_t *card) { } iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe) { + // Extra 100ms give enough time for Apple (ECP) devices to proccess field info and make a decision + + if (use_ecp && use_magsafe) { + iso14a_polling_parameters full_polling_parameters = { + .frames={ WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count=6, + .extra_timeout=100 + }; + return full_polling_parameters; + } else if (use_ecp) { + iso14a_polling_parameters ecp_polling_parameters = { + .frames={ WUPA_FRAME, ECP_FRAME }, + .frame_count=2, + .extra_timeout=100 + }; + return ecp_polling_parameters; + } else if (use_magsafe) { + iso14a_polling_parameters magsafe_polling_parameters = { + .frames={ WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count=5, + .extra_timeout=0 + }; + return magsafe_polling_parameters; + } - iso14a_polling_frame WUPA_FRAME = { - { 0x52 }, 1, 7, 0, - }; - - iso14a_polling_frame MAGWUPA1_FRAME = { - { 0x7A }, 1, 7, 0 - }; - - iso14a_polling_frame MAGWUPA2_FRAME = { - { 0x7B }, 1, 7, 0 - }; - - iso14a_polling_frame MAGWUPA3_FRAME = { - { 0x7C }, 1, 7, 0 - }; - - iso14a_polling_frame MAGWUPA4_FRAME = { - { 0x7D }, 1, 7, 0 - }; - - iso14a_polling_frame ECP_FRAME = { - .frame={ 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, - .frame_length=15, - .last_byte_bits=8, - .extra_delay=0 - }; - - iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { + iso14a_polling_parameters wupa_polling_parameters = { .frames={ WUPA_FRAME }, .frame_count=1, .extra_timeout=0, }; - - iso14a_polling_parameters MAGSAFE_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count=5, - .extra_timeout=0 - }; - - // Extra 100ms give enough time for Apple devices to proccess field info and make a decision - iso14a_polling_parameters ECP_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, ECP_FRAME }, - .frame_count=2, - .extra_timeout=100 - }; - - iso14a_polling_parameters FULL_POLLING_PARAMETERS = { - .frames={ WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count=6, - .extra_timeout=100 - }; - - if (use_ecp && use_magsafe) { - return FULL_POLLING_PARAMETERS; - } else if (use_ecp) { - return ECP_POLLING_PARAMETERS; - } else if (use_magsafe) { - return MAGSAFE_POLLING_PARAMETERS; - } - return WUPA_POLLING_PARAMETERS; + return wupa_polling_parameters; } @@ -538,10 +537,14 @@ static int CmdHF14AReader(const char *Cmd) { cm |= ISO14A_NO_RATS; } - iso14a_polling_parameters polling_parameters; - if (arg_get_lit(ctx, 5) || arg_get_lit(ctx, 6)) { + bool use_ecp = arg_get_lit(ctx, 5); + bool use_magsafe = arg_get_lit(ctx, 6); + + iso14a_polling_parameters * polling_parameters = NULL; + iso14a_polling_parameters parameters = iso14a_get_polling_parameters(use_ecp, use_magsafe); + if (use_ecp || use_magsafe) { cm |= ISO14A_USE_CUSTOM_POLLING; - polling_parameters = iso14a_get_polling_parameters(arg_get_lit(ctx, 5), arg_get_lit(ctx, 6)); + polling_parameters = ¶meters; } bool continuous = arg_get_lit(ctx, 7); @@ -559,7 +562,7 @@ static int CmdHF14AReader(const char *Cmd) { clearCommandBuffer(); if (cm & ISO14A_USE_CUSTOM_POLLING) { - SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, (uint8_t *)&polling_parameters, sizeof(polling_parameters)); + SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, (uint8_t *)polling_parameters, sizeof(iso14a_polling_parameters)); } else { SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, NULL, 0); } @@ -900,7 +903,6 @@ int CmdHF14ASniff(const char *Cmd) { } int ExchangeRAW14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, bool silentMode) { - uint16_t cmdc = 0; *dataoutlen = 0; @@ -962,8 +964,7 @@ int ExchangeRAW14a(uint8_t *datain, int datainlen, bool activateField, bool leav return 0; } -int SelectCard14443A_4(bool disconnect, bool verbose, iso14a_card_select_t *card) { - +int SelectCard14443A_4_WithParameters(bool disconnect, bool verbose, iso14a_card_select_t *card, iso14a_polling_parameters *polling_parameters) { // global vars should be prefixed with g_ gs_frame_len = 0; gs_frames_num = 0; @@ -976,7 +977,12 @@ int SelectCard14443A_4(bool disconnect, bool verbose, iso14a_card_select_t *card // Anticollision + SELECT card PacketResponseNG resp; - SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0, NULL, 0); + if (polling_parameters != NULL) { + SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT | ISO14A_USE_CUSTOM_POLLING, 0, 0, (uint8_t *)polling_parameters, sizeof(iso14a_polling_parameters)); + } else { + SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0, NULL, 0); + } + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { PrintAndLogEx(WARNING, "Command execute timeout"); return PM3_ETIMEOUT; @@ -1042,6 +1048,10 @@ int SelectCard14443A_4(bool disconnect, bool verbose, iso14a_card_select_t *card return PM3_SUCCESS; } +int SelectCard14443A_4(bool disconnect, bool verbose, iso14a_card_select_t *card) { + return SelectCard14443A_4_WithParameters(disconnect, verbose, card, NULL); +} + static int CmdExchangeAPDU(bool chainingin, uint8_t *datain, int datainlen, bool activateField, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, bool *chainingout) { *chainingout = false; @@ -1423,14 +1433,13 @@ static int CmdHF14ACmdRaw(const char *Cmd) { flags |= ISO14A_NO_RATS; } - if (use_ecp) { - flags |= ISO14A_USE_ECP; + // TODO: allow to use reader command with both data and polling configuration + if (use_ecp | use_magsafe) { + PrintAndLogEx(WARNING, "ECP and Magsafe not supported with this command at this moment. Instead use 'hf 14a reader -sk --ecp/--mag'"); + // flags |= ISO14A_USE_MAGSAFE; + // flags |= ISO14A_USE_ECP; } - - if (use_magsafe) { - flags |= ISO14A_USE_MAGSAFE; - } - + // Max buffer is PM3_CMD_DATA_SIZE datalen = (datalen > PM3_CMD_DATA_SIZE) ? PM3_CMD_DATA_SIZE : datalen; diff --git a/client/src/cmdhf14a.h b/client/src/cmdhf14a.h index ff6d80318..8d0c1d8bc 100644 --- a/client/src/cmdhf14a.h +++ b/client/src/cmdhf14a.h @@ -54,6 +54,7 @@ int ExchangeRAW14a(uint8_t *datain, int datainlen, bool activateField, bool leav iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe); int SelectCard14443A_4(bool disconnect, bool verbose, iso14a_card_select_t *card); +int SelectCard14443A_4_WithParameters(bool disconnect, bool verbose, iso14a_card_select_t *card, iso14a_polling_parameters *polling_parameters); bool Get_apdu_in_framing(void); void Set_apdu_in_framing(bool v); diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index 2bb5c8341..1a0dca54e 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -41,7 +41,20 @@ #include "mbedtls/ecc_point_compression.h" #include "mbedtls/gcm.h" -uint8_t ecpData[] = { 0x6a, 0x01, 0x00, 0x00, 0x04 }; +static const iso14a_polling_frame WUPA_FRAME = { + .frame={ 0x52 }, + .frame_length=1, + .last_byte_bits=7, + .extra_delay=0, +}; + +static const iso14a_polling_frame ECP_VAS_ONLY_FRAME = { + .frame={0x6a, 0x01, 0x00, 0x00, 0x02, 0xe4, 0xd2}, + .frame_length=7, + .last_byte_bits=8, + .extra_delay=0, +}; + uint8_t aid[] = { 0x4f, 0x53, 0x45, 0x2e, 0x56, 0x41, 0x53, 0x2e, 0x30, 0x31 }; uint8_t getVasUrlOnlyP2 = 0x00; uint8_t getVasFullReqP2 = 0x01; @@ -336,12 +349,13 @@ static int DecryptVASCryptogram(uint8_t *pidHash, uint8_t *cryptogram, size_t cr static int VASReader(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t *cryptogram, size_t *cryptogramLen, bool verbose) { clearCommandBuffer(); - uint16_t flags = ISO14A_RAW | ISO14A_CONNECT | ISO14A_NO_SELECT | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT; - SendCommandMIX(CMD_HF_ISO14443A_READER, flags, sizeof(ecpData), 0, ecpData, sizeof(ecpData)); + iso14a_polling_parameters polling_parameters = { + .frames={ WUPA_FRAME, ECP_VAS_ONLY_FRAME }, + .frame_count=2, + .extra_timeout=250 + }; - msleep(160); - - if (SelectCard14443A_4(false, false, NULL) != PM3_SUCCESS) { + if (SelectCard14443A_4_WithParameters(false, false, NULL, &polling_parameters) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "No card in field"); return PM3_ECARDEXCHANGE; } @@ -349,7 +363,7 @@ static int VASReader(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t * uint16_t status = 0; size_t resLen = 0; uint8_t selectResponse[APDU_RES_LEN] = {0}; - Iso7816Select(CC_CONTACTLESS, true, true, aid, sizeof(aid), selectResponse, APDU_RES_LEN, &resLen, &status); + Iso7816Select(CC_CONTACTLESS, false, true, aid, sizeof(aid), selectResponse, APDU_RES_LEN, &resLen, &status); if (status != 0x9000) { PrintAndLogEx(FAILED, "Card doesn't support VAS"); diff --git a/include/mifare.h b/include/mifare.h index cf3b51511..3bb8c9ba8 100644 --- a/include/mifare.h +++ b/include/mifare.h @@ -155,5 +155,4 @@ typedef struct { } state; } PACKED nonces_t; - #endif // _MIFARE_H_ From aca547aa4f956d6fde848cdf318572ab829850f7 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 17 Jul 2023 03:10:11 +0200 Subject: [PATCH 667/924] update docker stuff --- docker/archlinux/docker_rm.sh | 4 +-- docker/build-all.sh | 2 +- .../Dockerfile | 0 .../README.md | 2 +- .../docker_build.sh | 0 docker/debian-11-bullseye/docker_rm.sh | 4 +++ .../docker_run.sh | 0 .../run_tests.sh | 2 +- docker/debian-12-bookworm/Dockerfile | 26 +++++++++++++++++++ docker/debian-12-bookworm/README.md | 26 +++++++++++++++++++ docker/debian-12-bookworm/docker_build.sh | 3 +++ docker/debian-12-bookworm/docker_rm.sh | 4 +++ docker/debian-12-bookworm/docker_run.sh | 3 +++ docker/debian-12-bookworm/run_tests.sh | 11 ++++++++ docker/debian-13-trixie/Dockerfile | 26 +++++++++++++++++++ docker/debian-13-trixie/README.md | 26 +++++++++++++++++++ docker/debian-13-trixie/docker_build.sh | 3 +++ docker/debian-13-trixie/docker_rm.sh | 4 +++ docker/debian-13-trixie/docker_run.sh | 3 +++ docker/debian-13-trixie/run_tests.sh | 11 ++++++++ docker/debian-bullseye/docker_rm.sh | 4 --- docker/fedora-36/docker_rm.sh | 1 - docker/fedora-37/docker_rm.sh | 1 - docker/homebrew/docker_rm.sh | 2 +- docker/kali/docker_rm.sh | 2 +- docker/opensuse-leap/docker_rm.sh | 2 +- docker/opensuse-tumbleweed/docker_rm.sh | 2 +- docker/parrot-core-latest/docker_rm.sh | 2 +- docker/ubuntu-18.04/docker_rm.sh | 2 +- docker/ubuntu-20.04/docker_rm.sh | 2 +- docker/ubuntu-22.04/docker_rm.sh | 2 +- 31 files changed, 162 insertions(+), 20 deletions(-) rename docker/{debian-bullseye => debian-11-bullseye}/Dockerfile (100%) rename docker/{debian-bullseye => debian-11-bullseye}/README.md (91%) rename docker/{debian-bullseye => debian-11-bullseye}/docker_build.sh (100%) create mode 100644 docker/debian-11-bullseye/docker_rm.sh rename docker/{debian-bullseye => debian-11-bullseye}/docker_run.sh (100%) rename docker/{debian-bullseye => debian-11-bullseye}/run_tests.sh (80%) create mode 100644 docker/debian-12-bookworm/Dockerfile create mode 100644 docker/debian-12-bookworm/README.md create mode 100755 docker/debian-12-bookworm/docker_build.sh create mode 100644 docker/debian-12-bookworm/docker_rm.sh create mode 100755 docker/debian-12-bookworm/docker_run.sh create mode 100755 docker/debian-12-bookworm/run_tests.sh create mode 100644 docker/debian-13-trixie/Dockerfile create mode 100644 docker/debian-13-trixie/README.md create mode 100755 docker/debian-13-trixie/docker_build.sh create mode 100644 docker/debian-13-trixie/docker_rm.sh create mode 100755 docker/debian-13-trixie/docker_run.sh create mode 100755 docker/debian-13-trixie/run_tests.sh delete mode 100644 docker/debian-bullseye/docker_rm.sh diff --git a/docker/archlinux/docker_rm.sh b/docker/archlinux/docker_rm.sh index b4d9e7738..0c2d24f4e 100644 --- a/docker/archlinux/docker_rm.sh +++ b/docker/archlinux/docker_rm.sh @@ -1,6 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-arch:1.0) docker image rm pm3-arch:1.0 -docker image rm archlinux:base -# old ref: -docker image rm archlinux/base diff --git a/docker/build-all.sh b/docker/build-all.sh index aba45382f..ed56a0972 100755 --- a/docker/build-all.sh +++ b/docker/build-all.sh @@ -1,5 +1,5 @@ #!/bin/bash -for os in archlinux debian-buster fedora-36 fedora-37 homebrew kali opensuse-leap opensuse-tumbleweed parrot-core-latest ubuntu-18.04 ubuntu-20.04 ubuntu-22.04; do +for os in archlinux debian-12-bookworm fedora-36 fedora-37 homebrew kali opensuse-leap opensuse-tumbleweed parrot-core-latest ubuntu-20.04 ubuntu-22.04; do ( cd $os && ./docker_build.sh ) done diff --git a/docker/debian-bullseye/Dockerfile b/docker/debian-11-bullseye/Dockerfile similarity index 100% rename from docker/debian-bullseye/Dockerfile rename to docker/debian-11-bullseye/Dockerfile diff --git a/docker/debian-bullseye/README.md b/docker/debian-11-bullseye/README.md similarity index 91% rename from docker/debian-bullseye/README.md rename to docker/debian-11-bullseye/README.md index e86881019..3a7775b7c 100644 --- a/docker/debian-bullseye/README.md +++ b/docker/debian-11-bullseye/README.md @@ -9,7 +9,7 @@ If all tests OK, the script will finish with PASS. The script is to be run in proxmark root folder inside the docker env. ``` -docker/debian-bullseye/run_tests.sh; +docker/debian-11-bullseye/run_tests.sh; ``` Or if you want to run single test, diff --git a/docker/debian-bullseye/docker_build.sh b/docker/debian-11-bullseye/docker_build.sh similarity index 100% rename from docker/debian-bullseye/docker_build.sh rename to docker/debian-11-bullseye/docker_build.sh diff --git a/docker/debian-11-bullseye/docker_rm.sh b/docker/debian-11-bullseye/docker_rm.sh new file mode 100644 index 000000000..b8ce5b834 --- /dev/null +++ b/docker/debian-11-bullseye/docker_rm.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker rm $(docker ps -aq --filter ancestor=pm3-debian-bullseye:1.0) +docker image rm pm3-debian-bullseye:1.0 diff --git a/docker/debian-bullseye/docker_run.sh b/docker/debian-11-bullseye/docker_run.sh similarity index 100% rename from docker/debian-bullseye/docker_run.sh rename to docker/debian-11-bullseye/docker_run.sh diff --git a/docker/debian-bullseye/run_tests.sh b/docker/debian-11-bullseye/run_tests.sh similarity index 80% rename from docker/debian-bullseye/run_tests.sh rename to docker/debian-11-bullseye/run_tests.sh index 25e6d2a21..9c7128942 100755 --- a/docker/debian-bullseye/run_tests.sh +++ b/docker/debian-11-bullseye/run_tests.sh @@ -2,7 +2,7 @@ # Iceman 2022 # # This script is to be run from proxmark root folder inside the docker env -# docker/debian-bullseye/run_tests.sh; +# docker/debian-11-bullseye/run_tests.sh; sudo apt update && sudo apt upgrade -y tools/release_tests.sh diff --git a/docker/debian-12-bookworm/Dockerfile b/docker/debian-12-bookworm/Dockerfile new file mode 100644 index 000000000..92527289c --- /dev/null +++ b/docker/debian-12-bookworm/Dockerfile @@ -0,0 +1,26 @@ +FROM debian:bookworm-slim + +ENV LANG C +ENV DEBIAN_FRONTEND noninteractive +# qtbase5-dev skipped +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get dist-upgrade -y && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ + apt-get clean + +RUN apt-get install -y --no-install-recommends python3-minimal python3-pip python3-venv && \ + apt-get clean + +RUN apt-get install -y opencl-dev && \ + apt-get clean + +# Create rrg user +RUN useradd -ms /bin/bash rrg +RUN passwd -d rrg +RUN printf 'rrg ALL=(ALL) ALL\n' | tee -a /etc/sudoers + +USER rrg +WORKDIR "/home/rrg" + +CMD ["/bin/bash"] diff --git a/docker/debian-12-bookworm/README.md b/docker/debian-12-bookworm/README.md new file mode 100644 index 000000000..67c0f6a8b --- /dev/null +++ b/docker/debian-12-bookworm/README.md @@ -0,0 +1,26 @@ +# Notes on run_tests.sh script +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. + +If all tests OK, the script will finish with PASS. + + +# Notes to run tests +The script is to be run in proxmark root folder inside the docker env. + +``` +docker/debian-12-bookworm/run_tests.sh; +``` + +Or if you want to run single test, + +``` +sudo apt update +make clean; make -j +python3 -m venv /tmp/venv +source /tmp/venv/bin/activate +python3 -m pip install --use-pep517 pyaes +python3 -m pip install ansicolors sslcrypto +tools/pm3_tests.sh --long +deactivate +``` diff --git a/docker/debian-12-bookworm/docker_build.sh b/docker/debian-12-bookworm/docker_build.sh new file mode 100755 index 000000000..0059348cf --- /dev/null +++ b/docker/debian-12-bookworm/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-debian-bookworm:1.0" . diff --git a/docker/debian-12-bookworm/docker_rm.sh b/docker/debian-12-bookworm/docker_rm.sh new file mode 100644 index 000000000..5818564e0 --- /dev/null +++ b/docker/debian-12-bookworm/docker_rm.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker rm $(docker ps -aq --filter ancestor=pm3-debian-bookworm:1.0) +docker image rm pm3-debian-bookworm:1.0 diff --git a/docker/debian-12-bookworm/docker_run.sh b/docker/debian-12-bookworm/docker_run.sh new file mode 100755 index 000000000..ae264581a --- /dev/null +++ b/docker/debian-12-bookworm/docker_run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -w /home/rrg/proxmark3 -it pm3-debian-bookworm:1.0 diff --git a/docker/debian-12-bookworm/run_tests.sh b/docker/debian-12-bookworm/run_tests.sh new file mode 100755 index 000000000..06837fc99 --- /dev/null +++ b/docker/debian-12-bookworm/run_tests.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# This script is to be run from proxmark root folder inside the docker env +# docker/debian-12-bookworm/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +python3 -m venv /tmp/venv +source /tmp/venv/bin/activate +python3 -m pip install --use-pep517 pyaes +python3 -m pip install ansicolors sslcrypto +tools/release_tests.sh +deactivate diff --git a/docker/debian-13-trixie/Dockerfile b/docker/debian-13-trixie/Dockerfile new file mode 100644 index 000000000..c64707ceb --- /dev/null +++ b/docker/debian-13-trixie/Dockerfile @@ -0,0 +1,26 @@ +FROM debian:trixie-slim + +ENV LANG C +ENV DEBIAN_FRONTEND noninteractive +# qtbase5-dev skipped +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get dist-upgrade -y && \ + apt-get install -y --no-install-recommends git ca-certificates build-essential cmake pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev libssl-dev sudo && \ + apt-get clean + +RUN apt-get install -y --no-install-recommends python3-minimal python3-pip python3-venv && \ + apt-get clean + +RUN apt-get install -y opencl-dev && \ + apt-get clean + +# Create rrg user +RUN useradd -ms /bin/bash rrg +RUN passwd -d rrg +RUN printf 'rrg ALL=(ALL) ALL\n' | tee -a /etc/sudoers + +USER rrg +WORKDIR "/home/rrg" + +CMD ["/bin/bash"] diff --git a/docker/debian-13-trixie/README.md b/docker/debian-13-trixie/README.md new file mode 100644 index 000000000..53d448546 --- /dev/null +++ b/docker/debian-13-trixie/README.md @@ -0,0 +1,26 @@ +# Notes on run_tests.sh script +This script runs a bunch of different builds with make and cmake together +with the different combos of RDV4, GENERIC, BTADDON combos. + +If all tests OK, the script will finish with PASS. + + +# Notes to run tests +The script is to be run in proxmark root folder inside the docker env. + +``` +docker/debian-13-trixie/run_tests.sh; +``` + +Or if you want to run single test, + +``` +sudo apt update +make clean; make -j +python3 -m venv /tmp/venv +source /tmp/venv/bin/activate +python3 -m pip install --use-pep517 pyaes +python3 -m pip install ansicolors sslcrypto +tools/pm3_tests.sh --long +deactivate +``` diff --git a/docker/debian-13-trixie/docker_build.sh b/docker/debian-13-trixie/docker_build.sh new file mode 100755 index 000000000..22a5bdbc3 --- /dev/null +++ b/docker/debian-13-trixie/docker_build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t "pm3-debian-trixie:1.0" . diff --git a/docker/debian-13-trixie/docker_rm.sh b/docker/debian-13-trixie/docker_rm.sh new file mode 100644 index 000000000..0afb68014 --- /dev/null +++ b/docker/debian-13-trixie/docker_rm.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker rm $(docker ps -aq --filter ancestor=pm3-debian-trixie:1.0) +docker image rm pm3-debian-trixie:1.0 diff --git a/docker/debian-13-trixie/docker_run.sh b/docker/debian-13-trixie/docker_run.sh new file mode 100755 index 000000000..bc81286fc --- /dev/null +++ b/docker/debian-13-trixie/docker_run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run --volume=$(pwd)/../..:/home/rrg/proxmark3 -w /home/rrg/proxmark3 -it pm3-debian-trixie:1.0 diff --git a/docker/debian-13-trixie/run_tests.sh b/docker/debian-13-trixie/run_tests.sh new file mode 100755 index 000000000..dc76107e4 --- /dev/null +++ b/docker/debian-13-trixie/run_tests.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# This script is to be run from proxmark root folder inside the docker env +# docker/debian-13-trixie/run_tests.sh; + +sudo apt update && sudo apt upgrade -y +python3 -m venv /tmp/venv +source /tmp/venv/bin/activate +python3 -m pip install --use-pep517 pyaes +python3 -m pip install ansicolors sslcrypto +tools/release_tests.sh +deactivate diff --git a/docker/debian-bullseye/docker_rm.sh b/docker/debian-bullseye/docker_rm.sh deleted file mode 100644 index d9609e2dd..000000000 --- a/docker/debian-bullseye/docker_rm.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -docker image rm pm3-debian-bullseye:1.0 -docker image rm bullseye-slim diff --git a/docker/fedora-36/docker_rm.sh b/docker/fedora-36/docker_rm.sh index bcdd1d060..a14c31e80 100644 --- a/docker/fedora-36/docker_rm.sh +++ b/docker/fedora-36/docker_rm.sh @@ -2,4 +2,3 @@ docker rm $(docker ps -aq --filter ancestor=pm3-fedora-36:1.0) docker image rm pm3-fedora-36:1.0 -docker image rm fedora:36 diff --git a/docker/fedora-37/docker_rm.sh b/docker/fedora-37/docker_rm.sh index 896b5ac82..6f0bd7e56 100644 --- a/docker/fedora-37/docker_rm.sh +++ b/docker/fedora-37/docker_rm.sh @@ -2,4 +2,3 @@ docker rm $(docker ps -aq --filter ancestor=pm3-fedora-37:1.0) docker image rm pm3-fedora-37:1.0 -docker image rm fedora:37 diff --git a/docker/homebrew/docker_rm.sh b/docker/homebrew/docker_rm.sh index 717156495..aa782d4a3 100644 --- a/docker/homebrew/docker_rm.sh +++ b/docker/homebrew/docker_rm.sh @@ -1,4 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-brew:1.0) docker image rm pm3-brew:1.0 -docker image rm homebrew/brew diff --git a/docker/kali/docker_rm.sh b/docker/kali/docker_rm.sh index 4cc73265d..fee4f07cf 100644 --- a/docker/kali/docker_rm.sh +++ b/docker/kali/docker_rm.sh @@ -1,4 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-kali:1.0) docker image rm pm3-kali:1.0 -#docker image rm kalilinux/kali-rolling diff --git a/docker/opensuse-leap/docker_rm.sh b/docker/opensuse-leap/docker_rm.sh index 9f120b8e1..12302b6f7 100644 --- a/docker/opensuse-leap/docker_rm.sh +++ b/docker/opensuse-leap/docker_rm.sh @@ -1,4 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-suse-leap:1.0) docker image rm pm3-suse-leap:1.0 -docker image rm opensuse/leap diff --git a/docker/opensuse-tumbleweed/docker_rm.sh b/docker/opensuse-tumbleweed/docker_rm.sh index f4d019f2b..c4b1b1d53 100644 --- a/docker/opensuse-tumbleweed/docker_rm.sh +++ b/docker/opensuse-tumbleweed/docker_rm.sh @@ -1,4 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-suse-tumbleweed:1.0) docker image rm pm3-suse-tumbleweed:1.0 -docker image rm opensuse/tumbleweed diff --git a/docker/parrot-core-latest/docker_rm.sh b/docker/parrot-core-latest/docker_rm.sh index 4874bdec5..9bf1605e5 100644 --- a/docker/parrot-core-latest/docker_rm.sh +++ b/docker/parrot-core-latest/docker_rm.sh @@ -1,4 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-parrotsec-core-latest:1.0) docker image rm pm3-parrotsec-core-latest:1.0 -docker image rm parrotsec/core:latest diff --git a/docker/ubuntu-18.04/docker_rm.sh b/docker/ubuntu-18.04/docker_rm.sh index c566f0e8d..20dcb80b2 100644 --- a/docker/ubuntu-18.04/docker_rm.sh +++ b/docker/ubuntu-18.04/docker_rm.sh @@ -1,4 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-ubuntu-18.04:1.0) docker image rm pm3-ubuntu-18.04:1.0 -docker image rm ubuntu:18.04 diff --git a/docker/ubuntu-20.04/docker_rm.sh b/docker/ubuntu-20.04/docker_rm.sh index 37b6fd8b2..d71954339 100644 --- a/docker/ubuntu-20.04/docker_rm.sh +++ b/docker/ubuntu-20.04/docker_rm.sh @@ -1,4 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-ubuntu-20.04:1.0) docker image rm pm3-ubuntu-20.04:1.0 -docker image rm ubuntu:20.04 diff --git a/docker/ubuntu-22.04/docker_rm.sh b/docker/ubuntu-22.04/docker_rm.sh index e6a5f0302..d1b82948b 100644 --- a/docker/ubuntu-22.04/docker_rm.sh +++ b/docker/ubuntu-22.04/docker_rm.sh @@ -1,4 +1,4 @@ #!/bin/bash +docker rm $(docker ps -aq --filter ancestor=pm3-ubuntu-22.04:1.0) docker image rm pm3-ubuntu-22.04:1.0 -docker image rm ubuntu:22.04 From 9b2fb950ef5f34c75967131fb8a281701f303d8f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 17 Jul 2023 03:31:11 +0200 Subject: [PATCH 668/924] fix docker/homebrew --- docker/homebrew/Dockerfile | 2 +- docker/homebrew/docker_run.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/homebrew/Dockerfile b/docker/homebrew/Dockerfile index 57e12dd87..fba5e84a7 100644 --- a/docker/homebrew/Dockerfile +++ b/docker/homebrew/Dockerfile @@ -4,6 +4,6 @@ ENV LANG C USER linuxbrew WORKDIR "/home/linuxbrew" -RUN brew install cmake pkg-config bzip2 && rm -rf ~/.cache/Homebrew +RUN brew install cmake pkg-config bzip2 lz4 && rm -rf ~/.cache/Homebrew CMD ["/bin/bash"] diff --git a/docker/homebrew/docker_run.sh b/docker/homebrew/docker_run.sh index 16c744594..efde1649b 100755 --- a/docker/homebrew/docker_run.sh +++ b/docker/homebrew/docker_run.sh @@ -1,4 +1,4 @@ #!/bin/bash -docker run --volume=$(pwd)/../..:/home/linuxbrew/proxmark3 -w /home/rrg/proxmark3 -it pm3-brew:1.0 +docker run --volume=$(pwd)/../..:/home/linuxbrew/proxmark3 -w /home/linuxbrew/proxmark3 -it pm3-brew:1.0 # if needed, run brew as user linuxbrew From 5b656ad4b01e330be07d9b6cec0b01a993145335 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 17 Jul 2023 03:32:07 +0200 Subject: [PATCH 669/924] Add CMP0114 policy to cmake CMake Warning (dev) at /home/linuxbrew/.linuxbrew/Cellar/cmake/3.26.4/share/cmake/Modules/ExternalProject.cmake:2271 (message): Policy CMP0114 is not set: ExternalProject step targets fully adopt their steps. Run "cmake --help-policy CMP0114" for policy details. Use the cmake_policy command to set the policy and suppress this warning. ExternalProject target 'bzip2' would depend on the targets for step(s) 'configure;build;install' under policy CMP0114, but this is being left out for compatibility since the policy is not set. Call Stack (most recent call first): CMakeLists.txt:178 (ExternalProject_Add_StepTargets) This warning is for project developers. Use -Wno-dev to suppress it. --- client/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index ce7e36938..9ea004590 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -162,6 +162,7 @@ if (NOT SKIPJANSSONSYSTEM EQUAL 1) endif (NOT SKIPJANSSONSYSTEM EQUAL 1) if(EMBED_BZIP2) + cmake_policy(SET CMP0114 NEW) set(BZIP2_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2) # Specify SOURCE_DIR will cause some errors ExternalProject_Add(bzip2 From 03ae05a345e99f4eff1101188454adc734f9ba70 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 17 Jul 2023 04:24:37 +0200 Subject: [PATCH 670/924] cmake: allow to embed LZ4 --- client/CMakeLists.txt | 55 ++++++++++++++++++++----- client/experimental_lib/CMakeLists.txt | 56 +++++++++++++++++++++----- 2 files changed, 89 insertions(+), 22 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 9ea004590..be4e00a93 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -96,11 +96,12 @@ if (CMAKE_TOOLCHAIN_FILE) endif (ANDROID) set(EMBED_READLINE ON) set(EMBED_BZIP2 ON) + set(EMBED_LZ4 ON) endif (CMAKE_TOOLCHAIN_FILE) -if (EMBED_READLINE OR EMBED_BZIP2) +if (EMBED_READLINE OR EMBED_BZIP2 OR EMBED_LZ4) include(ExternalProject) -endif (EMBED_READLINE OR EMBED_BZIP2) +endif (EMBED_READLINE OR EMBED_BZIP2 OR EMBED_LZ4) if (NOT SKIPREADLINE EQUAL 1) if (APPLE) @@ -184,8 +185,29 @@ else(EMBED_BZIP2) find_package (BZip2 REQUIRED) endif(EMBED_BZIP2) -find_path(LZ4_INCLUDE_DIRS lz4frame.h) -find_library(LZ4_LIBRARIES lz4) +if(EMBED_LZ4) + cmake_policy(SET CMP0114 NEW) + set(LZ4_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/deps/lz4/src/lz4) + # Specify SOURCE_DIR will cause some errors + ExternalProject_Add(lz4 + GIT_REPOSITORY https://android.googlesource.com/platform/external/lz4 + GIT_TAG platform-tools-30.0.2 + PREFIX deps/lz4 + # SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/lz4 + CONFIGURE_COMMAND mkdir -p ${LZ4_BUILD_DIR} && git archive --format tar HEAD | tar -C ${LZ4_BUILD_DIR} -x + BUILD_IN_SOURCE ON + BUILD_COMMAND make -C ${LZ4_BUILD_DIR}/lib -j4 CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} liblz4.a + INSTALL_COMMAND "" + LOG_DOWNLOAD ON + ) + ExternalProject_Add_StepTargets(lz4 configure build install) + set(LZ4_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/deps/lz4/src/lz4/lib) + set(LZ4_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/deps/lz4/src/lz4/lib/liblz4.a) + set(LZ4_FOUND ON) +else(EMBED_LZ4) + find_path(LZ4_INCLUDE_DIRS lz4frame.h) + find_library(LZ4_LIBRARIES lz4) +endif(EMBED_LZ4) if (LZ4_INCLUDE_DIRS AND LZ4_LIBRARIES) set(LZ4_FOUND ON) @@ -502,16 +524,24 @@ else (SKIPBT EQUAL 1) endif (BLUEZ_FOUND) endif(SKIPBT EQUAL 1) -if (EMBED_BZIP2) - message(STATUS "Bzip2 library: embedded") -else (EMBED_BZIP2) - message(STATUS "Bzip2 library: system library found") -endif (EMBED_BZIP2) +if (BZIP2_FOUND) + if (EMBED_BZIP2) + message(STATUS "Bzip2 library: embedded") + else (EMBED_BZIP2) + message(STATUS "Bzip2 library: system library found") + endif (EMBED_BZIP2) +else (BZIP2_FOUND) + message(SEND_ERROR "Bzip2 library: Bzip2 not found") +endif (BZIP2_FOUND) if (LZ4_FOUND) - message(STATUS "LZ4 library: system library found") + if (EMBED_LZ4) + message(STATUS "LZ4 library: embedded") + else (EMBED_LZ4) + message(STATUS "LZ4 library: system library found") + endif (EMBED_LZ4) else (LZ4_FOUND) - message(SEND_ERROR "LZ4 library: system library not found and no local library implemented") + message(SEND_ERROR "LZ4 library: LZ4 not found") endif (LZ4_FOUND) if (SKIPJANSSONSYSTEM EQUAL 1) @@ -612,6 +642,9 @@ endif (EMBED_READLINE) if (EMBED_BZIP2) add_dependencies(proxmark3 bzip2) endif (EMBED_BZIP2) +if (EMBED_LZ4) + add_dependencies(proxmark3 lz4) +endif (EMBED_LZ4) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 0cd148fa3..cec361446 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -97,11 +97,12 @@ if (CMAKE_TOOLCHAIN_FILE) endif (ANDROID) set(EMBED_READLINE ON) set(EMBED_BZIP2 ON) + set(EMBED_LZ4 ON) endif (CMAKE_TOOLCHAIN_FILE) -if (EMBED_READLINE OR EMBED_BZIP2) +if (EMBED_READLINE OR EMBED_BZIP2 OR EMBED_LZ4) include(ExternalProject) -endif (EMBED_READLINE OR EMBED_BZIP2) +endif (EMBED_READLINE OR EMBED_BZIP2 OR EMBED_LZ4) if (NOT SKIPREADLINE EQUAL 1) if (APPLE) @@ -163,6 +164,7 @@ if (NOT SKIPJANSSONSYSTEM EQUAL 1) endif (NOT SKIPJANSSONSYSTEM EQUAL 1) if(EMBED_BZIP2) + cmake_policy(SET CMP0114 NEW) set(BZIP2_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2) ExternalProject_Add(bzip2 GIT_REPOSITORY https://android.googlesource.com/platform/external/bzip2 @@ -183,8 +185,29 @@ else(EMBED_BZIP2) find_package (BZip2 REQUIRED) endif(EMBED_BZIP2) -find_path(LZ4_INCLUDE_DIRS lz4frame.h) -find_library(LZ4_LIBRARIES lz4) +if(EMBED_LZ4) + cmake_policy(SET CMP0114 NEW) + set(LZ4_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/deps/lz4/src/lz4) + # Specify SOURCE_DIR will cause some errors + ExternalProject_Add(lz4 + GIT_REPOSITORY https://android.googlesource.com/platform/external/lz4 + GIT_TAG platform-tools-30.0.2 + PREFIX deps/lz4 + # SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/lz4 + CONFIGURE_COMMAND mkdir -p ${LZ4_BUILD_DIR} && git archive --format tar HEAD | tar -C ${LZ4_BUILD_DIR} -x + BUILD_IN_SOURCE ON + BUILD_COMMAND make -C ${LZ4_BUILD_DIR}/lib -j4 CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} liblz4.a + INSTALL_COMMAND "" + LOG_DOWNLOAD ON + ) + ExternalProject_Add_StepTargets(lz4 configure build install) + set(LZ4_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/deps/lz4/src/lz4/lib) + set(LZ4_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/deps/lz4/src/lz4/lib/liblz4.a) + set(LZ4_FOUND ON) +else(EMBED_LZ4) + find_path(LZ4_INCLUDE_DIRS lz4frame.h) + find_library(LZ4_LIBRARIES lz4) +endif(EMBED_LZ4) if (LZ4_INCLUDE_DIRS AND LZ4_LIBRARIES) set(LZ4_FOUND ON) @@ -501,16 +524,24 @@ else (SKIPBT EQUAL 1) endif (BLUEZ_FOUND) endif(SKIPBT EQUAL 1) -if (EMBED_BZIP2) - message(STATUS "Bzip2 library: embedded") -else (EMBED_BZIP2) - message(STATUS "Bzip2 library: system library found") -endif (EMBED_BZIP2) +if (BZIP2_FOUND) + if (EMBED_BZIP2) + message(STATUS "Bzip2 library: embedded") + else (EMBED_BZIP2) + message(STATUS "Bzip2 library: system library found") + endif (EMBED_BZIP2) +else (BZIP2_FOUND) + message(SEND_ERROR "Bzip2 library: Bzip2 not found") +endif (BZIP2_FOUND) if (LZ4_FOUND) - message(STATUS "LZ4 library: system library found") + if (EMBED_LZ4) + message(STATUS "LZ4 library: embedded") + else (EMBED_LZ4) + message(STATUS "LZ4 library: system library found") + endif (EMBED_LZ4) else (LZ4_FOUND) - message(SEND_ERROR "LZ4 library: system library not found and no local library implemented") + message(SEND_ERROR "LZ4 library: LZ4 not found") endif (LZ4_FOUND) if (SKIPJANSSONSYSTEM EQUAL 1) @@ -611,6 +642,9 @@ endif (EMBED_READLINE) if (EMBED_BZIP2) add_dependencies(pm3rrg_rdv4 bzip2) endif (EMBED_BZIP2) +if (EMBED_LZ4) + add_dependencies(pm3rrg_rdv4 lz4) +endif (EMBED_LZ4) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) From 662ce8403e82d7c5ace687e4fd0a24cc9de01c24 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 17 Jul 2023 04:56:18 +0200 Subject: [PATCH 671/924] lz4 missing in some docs --- doc/md/Development/Makefile-vs-CMake.md | 3 ++- .../Linux-Installation-Instructions.md | 4 ++-- .../Mac-OS-X-MacPorts-Installation-Instructions.md | 2 +- docker/homebrew/README.md | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/md/Development/Makefile-vs-CMake.md b/doc/md/Development/Makefile-vs-CMake.md index c54e911ff..934e4b138 100644 --- a/doc/md/Development/Makefile-vs-CMake.md +++ b/doc/md/Development/Makefile-vs-CMake.md @@ -58,7 +58,8 @@ At the moment both are maintained because they don't perfectly overlap yet. | `SKIPLUASYSTEM` | yes | **no** | | | lualibs/pm3_cmd.lua | yes | add_custom_command **but unused** | | | lualibs/mfc_default_keys.lua | yes | add_custom_command **but unused** | | -| dep lz4 | | | (in_common) not yet used, future. See `get_lz4.sh` for upstream fetch & patch | +| dep lz4 | sys | sys | + in_common only used by FW. See `get_lz4.sh` for upstream fetch & patch | +| lz4 detection | **none** | find, Cross:gitclone | | | dep libm | sys | sys | | | libm detection | **none** | **none** (1) | (1) cf https://cmake.org/pipermail/cmake/2019-March/069168.html ? | | dep mbedtls | in_common | in_common | no sys lib: missing support for CMAC in def conf (btw no .pc available) | diff --git a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md index 455ad6254..3172fdecc 100644 --- a/doc/md/Installation_Instructions/Linux-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Linux-Installation-Instructions.md @@ -65,7 +65,7 @@ If you get some (non blocking) error at runtime such as _Gtk-Message: Failed to ^[Top](#top) ```sh -sudo pacman -Syu git base-devel readline bzip2 arm-none-eabi-gcc arm-none-eabi-newlib qt5-base bluez python --needed +sudo pacman -Syu git base-devel readline bzip2 lz4 arm-none-eabi-gcc arm-none-eabi-newlib qt5-base bluez python --needed ``` If you don't need the native Bluetooth support in the client, you can skip the installation of `bluez`. @@ -78,7 +78,7 @@ If you don't need support for Python3 scripts in the Proxmark3 client, you can s ^[Top](#top) ```sh -sudo dnf install git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel bzip2-devel qt5-qtbase-devel bluez-libs-devel python3-devel libatomic openssl-devel +sudo dnf install git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel bzip2-devel lz4-devel qt5-qtbase-devel bluez-libs-devel python3-devel libatomic openssl-devel ``` If you don't need the native Bluetooth support in the client, you can skip the installation of `bluez-libs-devel`. diff --git a/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md b/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md index 3ea25c20d..2f05f3b98 100644 --- a/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md @@ -61,7 +61,7 @@ These instructions will show how to setup the environment on OSX to the point wh 2. Install dependencies: ```bash - sudo port install readline jansson lua52 python311 bzip2 openssl11 arm-none-eabi-gcc arm-none-eabi-binutils coreutils qt5 qt5-qtbase pkgconfig + sudo port install readline jansson lua52 python311 bzip2 lz4 openssl11 arm-none-eabi-gcc arm-none-eabi-binutils coreutils qt5 qt5-qtbase pkgconfig ``` 3. Clamp Python version for pkg-config diff --git a/docker/homebrew/README.md b/docker/homebrew/README.md index 07c92e573..549896b33 100644 --- a/docker/homebrew/README.md +++ b/docker/homebrew/README.md @@ -21,6 +21,6 @@ make -j fpga_compress cd client mkdir build cd build -cmake -DEMBED_BZIP2=1 .. +cmake -DEMBED_BZIP2=1 -DEMBED_LZ4=1 .. make -j ``` From 24938e3ed543dfdee18dd8cbc72b01c290f3c0f6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 17 Jul 2023 11:21:29 +0200 Subject: [PATCH 672/924] remove some redundant code and fixed CID# 416023 with resource leak --- client/src/cmdhfmfhard.c | 44 +++++++++++++++------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index e6581d830..d66b3eb43 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -301,16 +301,19 @@ static void init_bitflip_bitarrays(void) { free(path); if (statesfile == NULL) { continue; - } else if (open_uncompressed) { - fseek(statesfile, 0, SEEK_END); - int fsize = ftell(statesfile); - if (fsize == -1) { - PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); - fclose(statesfile); - exit(5); - } - uint32_t filesize = (uint32_t)fsize; - rewind(statesfile); + } + + fseek(statesfile, 0, SEEK_END); + int fsize = ftell(statesfile); + if (fsize == -1) { + PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); + fclose(statesfile); + exit(5); + } + uint32_t filesize = (uint32_t)fsize; + rewind(statesfile); + + if (open_uncompressed) { uint32_t count = 0; size_t bytesread = fread(&count, 1, sizeof(count), statesfile); @@ -347,18 +350,12 @@ static void init_bitflip_bitarrays(void) { } #endif } + fclose(statesfile); nraw++; + continue; + } else if (open_lz4compressed) { - fseek(statesfile, 0, SEEK_END); - int fsize = ftell(statesfile); - if (fsize == -1) { - PrintAndLogEx(ERR, "File read error with %s (1). Aborting...\n", state_file_name); - fclose(statesfile); - exit(5); - } - uint32_t filesize = (uint32_t)fsize; - rewind(statesfile); char *compressed_data = calloc(filesize, sizeof(uint8_t)); if (compressed_data == NULL) { PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); @@ -436,15 +433,6 @@ static void init_bitflip_bitarrays(void) { continue; } else if (open_bz2compressed) { - fseek(statesfile, 0, SEEK_END); - int fsize = ftell(statesfile); - if (fsize == -1) { - PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); - fclose(statesfile); - exit(5); - } - uint32_t filesize = (uint32_t)fsize; - rewind(statesfile); char input_buffer[filesize]; size_t bytesread = fread(input_buffer, 1, filesize, statesfile); if (bytesread != filesize) { From 73eb8d0de06bd3f28e4277e21cb1780786698cf8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 17 Jul 2023 17:30:15 +0200 Subject: [PATCH 673/924] fix lf cotag reader , make the grid command use the new syntax --- client/src/cmdlfcotag.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/cmdlfcotag.c b/client/src/cmdlfcotag.c index 7c4bf1541..4a3a5f6e6 100644 --- a/client/src/cmdlfcotag.c +++ b/client/src/cmdlfcotag.c @@ -75,11 +75,13 @@ static int CmdCOTAGDemod(const char *Cmd) { void *argtable[] = { arg_param_begin, + arg_lit0("v", "verbose", "verbose output"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + bool verbose = arg_get_lit(ctx, 1); CLIParserFree(ctx); - return demodCOTAG(true); + return demodCOTAG(verbose); } // When reading a COTAG. @@ -152,7 +154,7 @@ static int CmdCOTAGReader(const char *Cmd) { case 0: case 2: { CmdPlot(""); - CmdGrid("384"); + CmdGrid("-x 384"); getSamples(0, false); break; } From 230f1c654b6e0130ab775b244f1d8cb32ccffcc3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 17 Jul 2023 17:43:23 +0200 Subject: [PATCH 674/924] hf legic einfo, now accepts card size params --- CHANGELOG.md | 2 ++ client/src/cmdhflegic.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c84a9e65..7f6503e33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf legic einfo` - now accepts the three different cardsizes as params (@iceman1001) + - Fix `lf cotag reader -1` - now doesn't fail (@iceman1001) - Added support for LZ4 compressed hadnested tables (@doegox) - Changed `emv reader -v` - now tries to print found transactions logs (@iceman1001) - Added ISO4217 currency lookup (@iceman1001) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index b842ddf54..c8eb513ac 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -1226,15 +1226,36 @@ static int CmdLegicEInfo(const char *Cmd) { CLIParserInit(&ctx, "hf legic einfo", "It decodes and displays emulator memory", "hf legic einfo\n" + "hf legic eview --22\n" ); void *argtable[] = { arg_param_begin, + arg_lit0(NULL, "22", "LEGIC Prime MIM22"), + arg_lit0(NULL, "256", "LEGIC Prime MIM256 (def)"), + arg_lit0(NULL, "1024", "LEGIC Prime MIM1024"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + bool m1 = arg_get_lit(ctx, 1); + bool m2 = arg_get_lit(ctx, 2); + bool m3 = arg_get_lit(ctx, 3); CLIParserFree(ctx); + // validations + if (m1 + m2 + m3 > 1) { + PrintAndLogEx(WARNING, "Only specify one LEGIC Prime Type"); + return PM3_EINVARG; + } else if (m1 + m2 + m3 == 0) { + m2 = true; + } + size_t card_size = LEGIC_PRIME_MIM256; + if (m1) + card_size = LEGIC_PRIME_MIM22; + else if (m2) + card_size = LEGIC_PRIME_MIM256; + else if (m3) + card_size = LEGIC_PRIME_MIM1024; uint8_t *dump = calloc(card_size, sizeof(uint8_t)); if (dump == NULL) { From 134f09be5eb2fbbe76a3cc07890a866f9f2773c7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 17 Jul 2023 17:46:27 +0200 Subject: [PATCH 675/924] style --- armsrc/iso14443a.c | 18 ++++++------ client/src/cmdhf14a.c | 64 +++++++++++++++++++++---------------------- client/src/cmdhfvas.c | 24 ++++++++-------- doc/commands.json | 17 ++++++++---- include/mifare.h | 6 ++-- 5 files changed, 67 insertions(+), 62 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 4bb51f69b..62baab9fc 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -143,11 +143,11 @@ Default HF 14a config is set to: static hf14a_config hf14aconfig = { 0, 0, 0, 0, 0 } ; -// Polling frames and configurations +// Polling frames and configurations static iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { - .frames={ {{ 0x52 }, 1, 7, 0} }, - .frame_count=1, - .extra_timeout=0, + .frames = { {{ 0x52 }, 1, 7, 0} }, + .frame_count = 1, + .extra_timeout = 0, }; @@ -2519,7 +2519,7 @@ static void iso14a_set_ATS_times(const uint8_t *ats) { static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters *polling_parameters) { - #define WUPA_RETRY_TIMEOUT 10 +#define WUPA_RETRY_TIMEOUT 10 uint32_t save_iso14a_timeout = iso14a_get_timeout(); iso14a_set_timeout(1236 / 128 + 1); // response to WUPA is expected at exactly 1236/fc. No need to wait longer. @@ -2543,7 +2543,7 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters * if (frame_parameters->extra_delay) { SpinDelay(frame_parameters->extra_delay); } - + // Receive the ATQA len = ReaderReceive(resp, resp_par); @@ -3027,9 +3027,9 @@ void ReaderIso14443a(PacketCommandNG *c) { iso14a_card_select_t *card = (iso14a_card_select_t *)buf; arg0 = iso14443a_select_cardEx( - NULL, card, NULL, true, 0, (param & ISO14A_NO_RATS), - (param & ISO14A_USE_CUSTOM_POLLING) ? (iso14a_polling_parameters *)cmd : &WUPA_POLLING_PARAMETERS - ); + NULL, card, NULL, true, 0, (param & ISO14A_NO_RATS), + (param & ISO14A_USE_CUSTOM_POLLING) ? (iso14a_polling_parameters *)cmd : &WUPA_POLLING_PARAMETERS + ); // TODO: Improve by adding a cmd parser pointer and moving it by struct length to allow combining data with polling params FpgaDisableTracing(); diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index bf1ded102..21ad70be7 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -55,31 +55,31 @@ static int CmdHelp(const char *Cmd); static int waitCmd(bool i_select, uint32_t timeout, bool verbose); -static const iso14a_polling_frame WUPA_FRAME = { +static const iso14a_polling_frame WUPA_FRAME = { { 0x52 }, 1, 7, 0, }; -static const iso14a_polling_frame MAGWUPA1_FRAME = { - { 0x7A }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA1_FRAME = { + { 0x7A }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA2_FRAME = { - { 0x7B }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA2_FRAME = { + { 0x7B }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA3_FRAME = { - { 0x7C }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA3_FRAME = { + { 0x7C }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA4_FRAME = { - { 0x7D }, 1, 7, 0 +static const iso14a_polling_frame MAGWUPA4_FRAME = { + { 0x7D }, 1, 7, 0 }; -static const iso14a_polling_frame ECP_FRAME = { - .frame={ 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, - .frame_length=15, - .last_byte_bits=8, - .extra_delay=0 +static const iso14a_polling_frame ECP_FRAME = { + .frame = { 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, + .frame_length = 15, + .last_byte_bits = 8, + .extra_delay = 0 }; @@ -465,34 +465,34 @@ int Hf14443_4aGetCardData(iso14a_card_select_t *card) { iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe) { // Extra 100ms give enough time for Apple (ECP) devices to proccess field info and make a decision - + if (use_ecp && use_magsafe) { iso14a_polling_parameters full_polling_parameters = { - .frames={ WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count=6, - .extra_timeout=100 + .frames = { WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count = 6, + .extra_timeout = 100 }; return full_polling_parameters; } else if (use_ecp) { iso14a_polling_parameters ecp_polling_parameters = { - .frames={ WUPA_FRAME, ECP_FRAME }, - .frame_count=2, - .extra_timeout=100 + .frames = { WUPA_FRAME, ECP_FRAME }, + .frame_count = 2, + .extra_timeout = 100 }; return ecp_polling_parameters; } else if (use_magsafe) { iso14a_polling_parameters magsafe_polling_parameters = { - .frames={ WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, - .frame_count=5, - .extra_timeout=0 + .frames = { WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, + .frame_count = 5, + .extra_timeout = 0 }; return magsafe_polling_parameters; - } + } iso14a_polling_parameters wupa_polling_parameters = { - .frames={ WUPA_FRAME }, - .frame_count=1, - .extra_timeout=0, + .frames = { WUPA_FRAME }, + .frame_count = 1, + .extra_timeout = 0, }; return wupa_polling_parameters; } @@ -540,7 +540,7 @@ static int CmdHF14AReader(const char *Cmd) { bool use_ecp = arg_get_lit(ctx, 5); bool use_magsafe = arg_get_lit(ctx, 6); - iso14a_polling_parameters * polling_parameters = NULL; + iso14a_polling_parameters *polling_parameters = NULL; iso14a_polling_parameters parameters = iso14a_get_polling_parameters(use_ecp, use_magsafe); if (use_ecp || use_magsafe) { cm |= ISO14A_USE_CUSTOM_POLLING; @@ -566,7 +566,7 @@ static int CmdHF14AReader(const char *Cmd) { } else { SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, NULL, 0); } - + if (ISO14A_CONNECT & cm) { PacketResponseNG resp; @@ -982,7 +982,7 @@ int SelectCard14443A_4_WithParameters(bool disconnect, bool verbose, iso14a_card } else { SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0, NULL, 0); } - + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { PrintAndLogEx(WARNING, "Command execute timeout"); return PM3_ETIMEOUT; @@ -1439,7 +1439,7 @@ static int CmdHF14ACmdRaw(const char *Cmd) { // flags |= ISO14A_USE_MAGSAFE; // flags |= ISO14A_USE_ECP; } - + // Max buffer is PM3_CMD_DATA_SIZE datalen = (datalen > PM3_CMD_DATA_SIZE) ? PM3_CMD_DATA_SIZE : datalen; diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index 1a0dca54e..ac0365cdf 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -41,18 +41,18 @@ #include "mbedtls/ecc_point_compression.h" #include "mbedtls/gcm.h" -static const iso14a_polling_frame WUPA_FRAME = { - .frame={ 0x52 }, - .frame_length=1, - .last_byte_bits=7, - .extra_delay=0, +static const iso14a_polling_frame WUPA_FRAME = { + .frame = { 0x52 }, + .frame_length = 1, + .last_byte_bits = 7, + .extra_delay = 0, }; static const iso14a_polling_frame ECP_VAS_ONLY_FRAME = { - .frame={0x6a, 0x01, 0x00, 0x00, 0x02, 0xe4, 0xd2}, - .frame_length=7, - .last_byte_bits=8, - .extra_delay=0, + .frame = {0x6a, 0x01, 0x00, 0x00, 0x02, 0xe4, 0xd2}, + .frame_length = 7, + .last_byte_bits = 8, + .extra_delay = 0, }; uint8_t aid[] = { 0x4f, 0x53, 0x45, 0x2e, 0x56, 0x41, 0x53, 0x2e, 0x30, 0x31 }; @@ -350,9 +350,9 @@ static int VASReader(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t * clearCommandBuffer(); iso14a_polling_parameters polling_parameters = { - .frames={ WUPA_FRAME, ECP_VAS_ONLY_FRAME }, - .frame_count=2, - .extra_timeout=250 + .frames = { WUPA_FRAME, ECP_VAS_ONLY_FRAME }, + .frame_count = 2, + .extra_timeout = 250 }; if (SelectCard14443A_4_WithParameters(false, false, NULL, &polling_parameters) != PM3_SUCCESS) { diff --git a/doc/commands.json b/doc/commands.json index 775087e22..5686c7542 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3534,13 +3534,17 @@ "command": "hf legic einfo", "description": "It decodes and displays emulator memory", "notes": [ - "hf legic einfo" + "hf legic einfo", + "hf legic eview --22" ], "offline": false, "options": [ - "-h, --help This help" + "-h, --help This help", + "--22 LEGIC Prime MIM22", + "--256 LEGIC Prime MIM256 (def)", + "--1024 LEGIC Prime MIM1024" ], - "usage": "hf legic einfo [-h]" + "usage": "hf legic einfo [-h] [--22] [--256] [--1024]" }, "hf legic eload": { "command": "hf legic eload", @@ -7631,9 +7635,10 @@ ], "offline": true, "options": [ - "-h, --help This help" + "-h, --help This help", + "-v, --verbose verbose output" ], - "usage": "lf cotag demod [-h]" + "usage": "lf cotag demod [-hv]" }, "lf cotag reader": { "command": "lf cotag reader", @@ -11689,6 +11694,6 @@ "metadata": { "commands_extracted": 679, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-16T13:30:30" + "extracted_on": "2023-07-17T15:46:12" } } \ No newline at end of file diff --git a/include/mifare.h b/include/mifare.h index 3bb8c9ba8..863734cb5 100644 --- a/include/mifare.h +++ b/include/mifare.h @@ -91,9 +91,9 @@ typedef struct { // Defines polling sequence configuration // 6 would be enough for 4 magsafe, 1 wupa, 1 ecp, typedef struct { - iso14a_polling_frame frames[6]; - uint8_t frame_count; - uint16_t extra_timeout; + iso14a_polling_frame frames[6]; + uint8_t frame_count; + uint16_t extra_timeout; } iso14a_polling_parameters; typedef struct { From c70e5beeac7229605690230985e029031ae37a59 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 17 Jul 2023 19:31:37 +0200 Subject: [PATCH 676/924] changed legic sim to have a different loop and exit message. Added some colors in output and the return codes on deviceside for legisim now uses the same PM3_E* styled --- CHANGELOG.md | 1 + armsrc/legicrfsim.c | 61 ++++++++++++++++++----------------------- client/src/cmdhflegic.c | 15 +++++----- 3 files changed, 36 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f6503e33..5711c1090 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf legic sim` - loop and return codes on deviceside updated to DEFINES (@iceman1001) - Changed `hf legic einfo` - now accepts the three different cardsizes as params (@iceman1001) - Fix `lf cotag reader -1` - now doesn't fail (@iceman1001) - Added support for LZ4 compressed hadnested tables (@doegox) diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index 58ca40320..f1bc40968 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -96,13 +96,13 @@ static int8_t rx_bit(void) { uint32_t bit_start = last_frame_end; // wait for pause to end - if (!wait_for(RWD_PULSE, bit_start + RWD_TIME_1 * 3 / 2)) { - return -1; + if (wait_for(RWD_PULSE, bit_start + RWD_TIME_1 * 3 / 2) == false) { + return PM3_ERFTRANS; } // wait for next pause - if (!wait_for(RWD_PAUSE, bit_start + RWD_TIME_1 * 3 / 2)) { - return -1; + if (wait_for(RWD_PAUSE, bit_start + RWD_TIME_1 * 3 / 2) == false) { + return PM3_ERFTRANS; } // update bit and frame end @@ -110,7 +110,7 @@ static int8_t rx_bit(void) { // check for code violation (bit to short) if (last_frame_end - bit_start < RWD_TIME_PAUSE) { - return -1; + return PM3_ERFTRANS; } // apply threshold (average of RWD_TIME_0 and ) @@ -235,7 +235,7 @@ static int32_t rx_frame(uint8_t *len) { // check for code violation if (i > RWD_CMD_TIMEOUT) { - return -1; + return PM3_ETIMEOUT; } } @@ -251,7 +251,7 @@ static int32_t rx_frame(uint8_t *len) { // check for code violation and to short / long frame if ((bit < 0) && ((*len < RWD_MIN_FRAME_LEN) || (*len > RWD_MAX_FRAME_LEN))) { - return -1; + return PM3_ERFTRANS; } // check for code violation caused by end of frame @@ -353,7 +353,7 @@ static int32_t setup_phase(legic_card_select_t *p_card) { // wait for iv int32_t iv = rx_frame(&len); if ((len != 7) || (iv < 0)) { - return -1; + return PM3_ERFTRANS; } // configure prng @@ -375,19 +375,19 @@ static int32_t setup_phase(legic_card_select_t *p_card) { // wait for ack int32_t ack = rx_frame(&len); if ((len != 6) || (ack < 0)) { - return -1; + return PM3_ERFTRANS; } // validate data switch (p_card->tagtype) { case 0: - if (ack != 0x19) return -1; + if (ack != 0x19) return PM3_ERFTRANS; break; case 1: - if (ack != 0x39) return -1; + if (ack != 0x39) return PM3_ERFTRANS; break; case 2: - if (ack != 0x39) return -1; + if (ack != 0x39) return PM3_ERFTRANS; break; } @@ -399,7 +399,7 @@ static int32_t setup_phase(legic_card_select_t *p_card) { // the gap by one period. last_frame_end += TAG_BIT_PERIOD; - return 0; + return PM3_SUCCESS; } static uint8_t calc_crc4(uint16_t cmd, uint8_t cmd_sz, uint8_t value) { @@ -414,7 +414,7 @@ static int32_t connected_phase(legic_card_select_t *p_card) { // wait for command int32_t cmd = rx_frame(&len); if (cmd < 0) { - return -1; + return PM3_ETIMEOUT; } // check if command is LEGIC_READ @@ -425,8 +425,7 @@ static int32_t connected_phase(legic_card_select_t *p_card) { // transmit data tx_frame((crc << 8) | byte, 12); - - return 0; + return PM3_SUCCESS; } // check if command is LEGIC_WRITE @@ -441,7 +440,7 @@ static int32_t connected_phase(legic_card_select_t *p_card) { uint8_t calc_crc = calc_crc4(addr << 1, p_card->cmdsize, byte); if (calc_crc != crc) { Dbprintf("!!! crc mismatch: %x != %x !!!", calc_crc, crc); - return -1; + return PM3_ECRC; } // store data @@ -449,11 +448,10 @@ static int32_t connected_phase(legic_card_select_t *p_card) { // transmit ack tx_ack(); - - return 0; + return PM3_SUCCESS; } - return -1; + return PM3_ERFTRANS; } //----------------------------------------------------------------------------- @@ -474,35 +472,30 @@ void LegicRfSimulate(uint8_t tagtype, bool send_reply) { goto OUT; } - uint16_t counter = 0; LED_A_ON(); - Dbprintf("Legic Prime, simulating uid: %02X%02X%02X%02X", legic_mem[0], legic_mem[1], legic_mem[2], legic_mem[3]); + Dbprintf("Legic Prime, simulating uid... " _YELLOW_("%02X%02X%02X%02X"), legic_mem[0], legic_mem[1], legic_mem[2], legic_mem[3]); while (BUTTON_PRESS() == false) { + WDT_HIT(); - if (counter >= 2000) { - if (data_available()) { - res = PM3_EOPABORTED; - break; - } - counter = 0; + if (data_available()) { + res = PM3_EOPABORTED; + goto OUT; } - counter++; - // wait for carrier, restart after timeout if (wait_for(RWD_PULSE, GetCountSspClk() + TAG_BIT_PERIOD) == false) { continue; } // wait for connection, restart on error - if (setup_phase(&card)) { + if (setup_phase(&card) != PM3_SUCCESS) { continue; } // connection is established, process commands until one fails - while (connected_phase(&card) == false) { + while (connected_phase(&card) != PM3_SUCCESS) { WDT_HIT(); } } @@ -510,11 +503,11 @@ void LegicRfSimulate(uint8_t tagtype, bool send_reply) { OUT: if (g_dbglevel >= DBG_ERROR) { - Dbprintf("Emulator stopped. Tracing: %d trace length: %d ", get_tracing(), BigBuf_get_traceLen()); + Dbprintf("Emulator stopped. Trace length... " _YELLOW_("%d"), BigBuf_get_traceLen()); } if (res == PM3_EOPABORTED) - DbpString("aborted by user"); + DbpString("Aborted by user"); switch_off(); StopTicks(); diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index c8eb513ac..a0b703453 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -536,20 +536,21 @@ static int CmdLegicSim(const char *Cmd) { SendCommandNG(CMD_HF_LEGIC_SIMULATE, (uint8_t *)&payload, sizeof(payload)); PacketResponseNG resp; - PrintAndLogEx(INFO, "Press pm3-button to abort simulation"); - bool keypress = kbd_enter_pressed(); - while (keypress == false) { - keypress = kbd_enter_pressed(); + PrintAndLogEx(INFO, "Press " _GREEN_("") " or pm3-button to abort simulation"); + for (;;) { + if (kbd_enter_pressed()) { + SendCommandNG(CMD_BREAK_LOOP, NULL, 0); + PrintAndLogEx(DEBUG, "User aborted"); + break; + } if (WaitForResponseTimeout(CMD_HF_LEGIC_SIMULATE, &resp, 1500)) { break; } - } - if (keypress) - SendCommandNG(CMD_BREAK_LOOP, NULL, 0); PrintAndLogEx(INFO, "Done"); + PrintAndLogEx(HINT, "Try `" _YELLOW_("hf legic list") "` to view trace log"); return PM3_SUCCESS; } From d08c6f404b6f27c65283a9630e50203b996d4d13 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 17 Jul 2023 22:54:43 +0200 Subject: [PATCH 677/924] first cleanup of hf_legic lua script. All io.open calls is problematic.\nfixed some colors in the help texts. makes it a bit easier to read\nfix loading files using the searchfile call\nstill problematic with save file calls since it should honor the user defined preference paths. --- client/luascripts/hf_legic.lua | 301 +++++++++++++++++++-------------- client/src/scripting.c | 3 +- 2 files changed, 175 insertions(+), 129 deletions(-) diff --git a/client/luascripts/hf_legic.lua b/client/luascripts/hf_legic.lua index cbec05f9f..663d02e36 100644 --- a/client/luascripts/hf_legic.lua +++ b/client/luascripts/hf_legic.lua @@ -96,10 +96,63 @@ Known issues; needs to be fixed: * last byte in last segment is handled incorrectly when it is the last bytes on the card itself (MIM256: => byte 256) --]] + +--- +-- requirements +local utils = require('utils') +local getopt = require('getopt') +local ansicolors = require('ansicolors') + +--- +-- global variables / defines +local bxor = bit32.bxor +local bbit = bit32.extract +local input = utils.input +local confirm = utils.confirm + +--- +-- init ansicolor-values & ansicolors switch +local colored_output = true +local acoff = "" +local acgreen= "" +local accyan = "" +local acred = "" +local acyellow = "" +local acblue = "" +local acmagenta = "" + +local acy = ansicolors.yellow +local acr = ansicolors.reset + +--- Helper --- +--- +-- default colors (change to whatever you want) +function load_colors(onoff) + if (onoff) then + -- colors + acgreen = ansicolors.green + accyan = ansicolors.cyan + acred = ansicolors.red + acyellow= ansicolors.yellow + acblue = ansicolors.blue + acmagenta= ansicolors.magenta + acoff = ansicolors.reset + else + -- 'no color' + acgreen = "" + accyan = "" + acred = "" + acyellow= "" + acblue = "" + acmagenta= "" + acoff = "" + end +end + + example = "script run hf_legic" author = "Mosci, uhei" -version = "1.0.4" - +version = "1.0.5" desc = [[ @@ -109,23 +162,23 @@ it's kinda interactive with following commands in three categories: Data I/O Segment Manipulation Token-Data ----------------- -------------------- ----------------- - rt => read Tag as => add Segment mt => make Token - wt => write Tag es => edit Segment Header et => edit Token data - ed => edit Segment Data tk => toggle KGH-Flag - File I/O rs => remove Segment - ----------------- cc => check Segment-CRC - lf => load bin File ck => check KGH - sf => save eml/bin File ds => dump Segments - xf => xor to File + ]]..acy..[[rt]]..acr..[[ => read Tag ]]..acy..[[as]]..acr..[[ => add Segment ]]..acy..[[mt]]..acr..[[ => make Token + ]]..acy..[[wt]]..acr..[[ => write Tag ]]..acy..[[es]]..acr..[[ => edit Segment Header ]]..acy..[[et]]..acr..[[ => edit Token data + ]]..acy..[[ed]]..acr..[[ => edit Segment Data ]]..acy..[[tk]]..acr..[[ => toggle KGH-Flag + File I/O ]]..acy..[[rs]]..acr..[[ => remove Segment + ----------------- ]]..acy..[[cc]]..acr..[[ => check Segment-CRC + ]]..acy..[[lf]]..acr..[[ => load bin File ]]..acy..[[ck]]..acr..[[ => check KGH + ]]..acy..[[sf]]..acr..[[ => save eml/bin File ]]..acy..[[ds]]..acr..[[ => dump Segments + ]]..acy..[[xf]]..acr..[[ => xor to File (partially) known Segments Virtual Tags Script Output --------------------------- ------------------------------- ------------------------ - dlc => dump Legic-Cash ct => copy mainTag to backupTag tac => toggle ansicolors - elc => edit Legic-Cash tc => copy backupTag to mainTag - d3p => dump 3rd-Party-Cash tt => switch mainTag & backupTag - e3p => edit 3rd-Party-Cash di => dump mainTag - do => dump backupTag + ]]..acy..[[dlc]]..acr..[[ => dump Legic-Cash ]]..acy..[[ct]]..acr..[[ => copy mainTag to backupTag ]]..acy..[[tac]]..acr..[[ => toggle ansicolors + ]]..acy..[[elc]]..acr..[[ => edit Legic-Cash ]]..acy..[[tc]]..acr..[[ => copy backupTag to mainTag + ]]..acy..[[d3p]]..acr..[[ => dump 3rd-Party-Cash ]]..acy..[[tt]]..acr..[[ => switch mainTag & backupTag + ]]..acy..[[e3p]]..acr..[[ => edit 3rd-Party-Cash ]]..acy..[[di]]..acr..[[ => dump mainTag + ]]..acy..[[do]]..acr..[[ => dump backupTag @@ -169,55 +222,6 @@ tac: 'toggle ansicolors'- switch on and off the colored text-output of this scri ]] currentTag="inTAG" ---- --- requirements -local utils = require('utils') -local getopt = require('getopt') -local ansicolors = require('ansicolors') - ---- --- global variables / defines -local bxor = bit32.bxor -local bbit = bit32.extract -local input = utils.input -local confirm = utils.confirm - ---- --- init ansicolor-values & ansicolors switch -local colored_output = true -local acoff = "" -local acgreen= "" -local accyan = "" -local acred = "" -local acyellow = "" -local acblue = "" -local acmagenta = "" - ---- Helper --- ---- --- default colors (change to whatever you want) -function load_colors(onoff) - if (onoff) then - -- colors - acgreen = ansicolors.green - accyan = ansicolors.cyan - acred = ansicolors.red - acyellow= ansicolors.yellow - acblue = ansicolors.blue - acmagenta= ansicolors.magenta - acoff = ansicolors.reset - else - -- 'no color' - acgreen = "" - accyan = "" - acred = "" - acyellow= "" - acblue = "" - acmagenta= "" - acoff = "" - end -end - --- -- curency-codes for Legic-Cash-Segments (ISO 4217) local currency = { @@ -237,7 +241,11 @@ end --- -- Usage help function help() - print(desc) + -- the proxmark3 client can't handle such long strings + -- by breaking up at specific points it still looks good. + print(string.sub(desc, 0, 1961)) + print(string.sub(desc, 1962, 3925)) + print(string.sub(desc, 3926, #desc)) print("Version: "..version) print("Example usage: "..example) end @@ -305,18 +313,6 @@ function xorBytes(inBytes, crc) end end ---- --- check availability of file -function file_check(file_name) - local file_found = io.open(file_name, "r") - if file_found == nil then - return false - else - file_found:close() - return true - end -end - --- -- split csv-string into table local function split(str, sep) @@ -330,6 +326,23 @@ local function split(str, sep) return fields end +--- +-- check availability of file +function file_check(file_name) + + local arr = split(file_name, ".") + local path = core.search_file(arr[1], "."..arr[2]) + if (path == nil) then return false end + + local file_found = io.open(path, "r") + if file_found == nil then + return false, "" + else + file_found:close() + return true, path + end +end + --- -- put a string into a bytes-table function str2bytes(s) @@ -358,8 +371,13 @@ end function getInputBytes(infile) local line local bytes = {} - local fhi,err = io.open(infile,"rb") - if err then oops("failed to read from file ".. infile); return false; end + + local arr = split(infile, ".") + local path = core.search_file(arr[1], "."..arr[2]) + if (path == nil) then oops("failed to read from file ".. infile); return false; end + + local fhi,err = io.open(path,"rb") + if err then oops("failed to read from file ".. path); return false; end file_data = fhi:read("*a"); for i = 1, #file_data do @@ -367,7 +385,7 @@ function getInputBytes(infile) end fhi:close() if (bytes[7]=='00') then return false end - print(#bytes .. " bytes from "..infile.." loaded") + print(#bytes .. " bytes from "..path.." loaded") return bytes end @@ -613,12 +631,13 @@ local function readFile(filename) print(accyan) local bytes = {} local tag = {} - if file_check(filename) == false then + + local res, path = file_check(filename) + if not res then return oops("input file: "..acyellow..filename..acoff.." not found") end - bytes = getInputBytes(filename) - + bytes = getInputBytes(path) if bytes == false then return oops('couldnt get input bytes') end -- make plain bytes @@ -640,12 +659,14 @@ local function save_BIN(data, filename) local fn = filename..ext -- Make sure we don't overwrite a file - while file_check(fn) do + local res, path = file_check(fn) + while res == false do fn = filename..ext:gsub(ext, "-"..tostring(counter)..ext) counter = counter + 1 + res, path = file_check(fn) end - outfile = io.open(fn, 'wb') + outfile = io.open(path, 'wb') local i = 1 while data[i] do @@ -660,17 +681,19 @@ end -- write bytes to file function writeFile(bytes, filename) local emlext = ".eml" + local res, path if (filename ~= 'MyLegicClone') then - if (file_check(filename..emlext)) then - local answer = confirm("\nthe output-file "..filename..emlext.." already exists!\nthis will delete the previous content!\ncontinue?") + res, path = file_check(filename..emlext) + if res then + local answer = confirm("\nthe output-file "..path.." already exists!\nthis will delete the previous content!\ncontinue?") if not answer then return print("user abort") end end end local line local bcnt = 0 - local fho, err = io.open(filename..emlext, "w") + local fho, err = io.open(path, "w") if err then - return oops("OOps ... failed to open output-file ".. filename..emlext) + return oops("OOps ... failed to open output-file ".. path) end bytes = xorBytes(bytes, bytes[5]) @@ -692,11 +715,10 @@ function writeFile(bytes, filename) end fho:close() - -- save binary - local fn_bin, fn_bin_num = save_BIN(bytes, filename) - print("\nwrote "..acyellow..(#bytes * 3)..acoff.." bytes to " ..acyellow..filename..emlext..acoff) + -- save binary + local fn_bin, fn_bin_num = save_BIN(bytes, filename) if fn_bin and fn_bin_num then print("\nwrote "..acyellow..fn_bin_num..acoff.." bytes to BINARY file "..acyellow..fn_bin..acoff) end @@ -731,10 +753,16 @@ function readFromPM3() infile=getRandomTempName() core.console("hf legic dump -f "..infile) tag=readFile(infile..".bin") - os.remove(infile) - os.remove(infile..".bin") - os.remove(infile..".eml") - os.remove(infile..".json") + + res, path = file_check(infile..".bin") + if not res then return nil end + os.remove(path) + + res, path = file_check(infile..".eml") + os.remove(path) + + res, path = file_check(infile..".json") + os.remove(path) return tag end @@ -758,16 +786,20 @@ end --- -- save mapping to file local function saveTagMap(map, filename) + + local res, path + if #filename > 0 then - if file_check(filename) then - local answer = confirm("\nthe output-file "..acyellow..filename..acoff.." alredy exists!\nthis will delete the previous content!\ncontinue?") + res, path = file_check(filename) + if res then + local answer = confirm("\nthe output-file "..acyellow..path..acoff.." alredy exists!\nthis will delete the previous content!\ncontinue?") if not answer then return print("user abort") end end end local line - local fho,err = io.open(filename, "w") - if err then oops("OOps ... failed to open output-file "..acyellow..filename..acoff) end + local fho,err = io.open(path, "w") + if err then oops("OOps ... failed to open output-file "..acyellow..path..acoff) end -- write line to new file for k, v in pairs(map) do @@ -842,10 +874,13 @@ function loadTagMap(filename) local line, fields local temp={} local offset=0 - if not file_check(filename) then - return oops("input file: "..acyellow..filename..acoff.." not found") - else - local fhi,err = io.open(filename) + + local res, path = file_check(filename) + if not res then + return oops("input file: "..acyellow..filename..acoff.." not found") + else + + local fhi,err = io.open(path) while true do line = fhi:read() if line == nil then @@ -971,6 +1006,7 @@ Mappings: im = insert am = add rm = remove CRC8: ac8 = add sc8 = show rc8 = remove : q = exit h = Help ]] + --if(#tagMap.mappings==0) then oops("no mappings in tagMap"); return tagMap end print("tagMap edit-mode submenu") repeat @@ -2293,25 +2329,25 @@ function modifyHelp() Data I/O Segment Manipulation Token-Data ----------------- -------------------- --------------------- - rt => read Tag as => add Segment mt => make Token - wt => write Tag es => edit Segment Header et => edit Token data - ed => edit Segment Data tk => toggle KGH-Flag - File I/O rs => remove Segment - ----------------- cc => check Segment-CRC - lf => load bin File ck => check KGH - sf => save eml/bin File ds => dump Segments - xf => xor to File + ]]..acy..[[rt]]..acr..[[ => read Tag ]]..acy..[[as]]..acr..[[ => add Segment ]]..acy..[[mt]]..acr..[[ => make Token + ]]..acy..[[wt]]..acr..[[ => write Tag ]]..acy..[[es]]..acr..[[ => edit Segment Header ]]..acy..[[et]]..acr..[[ => edit Token data + ]]..acy..[[ed]]..acr..[[ => edit Segment Data ]]..acy..[[tk]]..acr..[[ => toggle KGH-Flag + File I/O ]]..acy..[[rs]]..acr..[[ => remove Segment + ----------------- ]]..acy..[[cc]]..acr..[[ => check Segment-CRC + ]]..acy..[[lf]]..acr..[[ => load bin File ]]..acy..[[ck]]..acr..[[ => check KGH + ]]..acy..[[sf]]..acr..[[ => save eml/bin File ]]..acy..[[ds]]..acr..[[ => dump Segments + ]]..acy..[[xf]]..acr..[[ => xor to File Virtual Tags tagMap (partial) known Segments -------------------------------- --------------------- --------------------------- - ct => copy mainTag to backupTag mm => make (new) Map dlc => dump Legic-Cash - tc => copy backupTag to mainTag em => edit Map submenu elc => edit Legic-Cash - tt => switch mainTag & backupTag lm => load map from file d3p => dump 3rd-Party-Cash - di => dump mainTag sm => save map to file e3p => edit 3rd-Party-Cash - do => dump backupTag + ]]..acy..[[xf]]..acr..[[ => copy mainTag to backupTag ]]..acy..[[mm]]..acr..[[ => make (new) Map ]]..acy..[[dlc]]..acr..[[ => dump Legic-Cash + ]]..acy..[[xf]]..acr..[[ => copy backupTag to mainTag ]]..acy..[[em]]..acr..[[ => edit Map submenu ]]..acy..[[elc]]..acr..[[ => edit Legic-Cash + ]]..acy..[[xf]]..acr..[[ => switch mainTag & backupTag ]]..acy..[[lm]]..acr..[[ => load map from file ]]..acy..[[d3p]]..acr..[[ => dump 3rd-Party-Cash + ]]..acy..[[xf]]..acr..[[ => dump mainTag ]]..acy..[[sm]]..acr..[[ => save map to file ]]..acy..[[e3p]]..acr..[[ => edit 3rd-Party-Cash + ]]..acy..[[xf]]..acr..[[ => dump backupTag - h => this help q => quit + ]]..acy..[[h]]..acr..[[ => this help ]]..acy..[[q]]..acr..[[ => quit ]] return t end @@ -2325,8 +2361,10 @@ function modifyMode() --- -- helptext ["h"] = function(x) - print(" Version: "..version); - print(modifyHelp().."\n".."tags im Memory: "..(istable(inTAG) and ((currentTag=='inTAG') and acgreen.."*mainTAG"..acoff or "mainTAG") or "").." "..(istable(backupTAG) and ((currentTag=='backupTAG') and acgreen.."*backupTAG"..acoff or "backupTAG") or "")) + print(" Version: "..acgreen..version..acr); + print(modifyHelp()) + print("\n".."tags im Memory: "..(istable(inTAG) and ((currentTag=='inTAG') and acgreen.."*mainTAG"..acoff or "mainTAG") or "").." "..(istable(backupTAG) and ((currentTag=='backupTAG') and acgreen.."*backupTAG"..acoff or "backupTAG") or "")) + print("") end, --- -- read real Tag with PM3 into virtual 'mainTAG' @@ -2375,8 +2413,9 @@ function modifyMode() end inTAG=readFile(filename) -- check for existing tagMap - if (file_check(filename..".map")) then - if(confirm(accyan.."Mapping-File for "..acoff..filename..accyan.." found - load it also?"..acoff)) then + local res, path = file_check(filename..".map") + if res then + if(confirm(accyan.."Mapping-File for "..acoff..path..accyan.." found - load it also?"..acoff)) then tagMap=loadTagMap(filename..".map") end end @@ -2388,7 +2427,7 @@ function modifyMode() outfile = input("enter filename:", "hf-legic-"..inTAG.MCD..inTAG.MSN0..inTAG.MSN1..inTAG.MSN2) bytes = tagToBytes(inTAG) --bytes=xorBytes(bytes, inTAG.MCC) - if (bytes) then + if (bytes) then writeFile(bytes, outfile) end end @@ -2743,10 +2782,13 @@ end function main(args) -- set init colors/switch (can be toggled with 'tac' => 'toggle ansicolors') load_colors(colored_output) - if (#args == 0 ) then modifyMode() end + if (#args == 0 ) then modifyMode() end --- variables - local inTAG, backupTAG, outTAG, outfile, interactive, crc, ofs, cfs, dfs - -- just a spacer for better readability + local inTAG, backupTAG, outTAG, outfile, interactive, crc + local ofs=false + local cfs=false + local dfs=false + -- just a spacer for better readability print() --- parse arguments for o, a in getopt.getopt(args, 'hrmi:do:c:') do @@ -2755,7 +2797,7 @@ function main(args) -- read tag from PM3 if o == "r" then inTAG=readFromPM3() end -- input file - if o == "i" then inTAG=readFile(a) end + if o == "i" then inTAG=readFile(a) end -- dump virtual-Tag if o == "d" then dfs=true end -- interacive modifying @@ -2793,7 +2835,10 @@ function main(args) -- write to outfile if (bytes) then - writeFile(bytes, outfile) + + if (outfile) then + writeFile(bytes, outfile) + end --- read real tag into virtual tag -- inTAG=readFromPM3() end --- or simply use the bytes that where wriiten diff --git a/client/src/scripting.c b/client/src/scripting.c index c96d593df..613562978 100644 --- a/client/src/scripting.c +++ b/client/src/scripting.c @@ -1269,8 +1269,9 @@ static int l_searchfile(lua_State *L) { size_t size; // data const char *filename = luaL_checklstring(L, 1, &size); - if (size == 0) + if (size == 0) { return returnToLuaWithError(L, "Must specify filename"); + } const char *suffix = luaL_checklstring(L, 2, &size); char *path; From 0d682da6765d0e1e13a702e6391aaf6a6110c8af Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 19 Jul 2023 10:09:18 +0200 Subject: [PATCH 678/924] more fixes for hf_legic. missing zero padding, removed tab, more colors --- client/luascripts/hf_legic.lua | 131 +++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 56 deletions(-) diff --git a/client/luascripts/hf_legic.lua b/client/luascripts/hf_legic.lua index 663d02e36..052f7ab06 100644 --- a/client/luascripts/hf_legic.lua +++ b/client/luascripts/hf_legic.lua @@ -122,6 +122,7 @@ local acblue = "" local acmagenta = "" local acy = ansicolors.yellow +local acc = ansicolors.cyan local acr = ansicolors.reset --- Helper --- @@ -137,6 +138,10 @@ function load_colors(onoff) acblue = ansicolors.blue acmagenta= ansicolors.magenta acoff = ansicolors.reset + + acy = ansicolors.yellow + acc = ansicolors.cyan + acr = ansicolors.reset else -- 'no color' acgreen = "" @@ -146,6 +151,10 @@ function load_colors(onoff) acblue = "" acmagenta= "" acoff = "" + + acy = "" + acc = "" + acr = "" end end @@ -156,68 +165,66 @@ version = "1.0.5" desc = [[ -This script helps you to read, create and modify Legic Prime Tags (MIM22, MIM256, MIM1024) +This script helps you to read, create and modify Legic Prime Tags ( MIM22, MIM256, MIM1024 ) The virtual tag (and therefore the file to be saved) is always a MIM1024 tag. it's kinda interactive with following commands in three categories: Data I/O Segment Manipulation Token-Data ----------------- -------------------- ----------------- - ]]..acy..[[rt]]..acr..[[ => read Tag ]]..acy..[[as]]..acr..[[ => add Segment ]]..acy..[[mt]]..acr..[[ => make Token - ]]..acy..[[wt]]..acr..[[ => write Tag ]]..acy..[[es]]..acr..[[ => edit Segment Header ]]..acy..[[et]]..acr..[[ => edit Token data + ]]..acy..[[rt]]..acr..[[ -> read Tag ]]..acy..[[as]]..acr..[[ -> add Segment ]]..acy..[[mt]]..acr..[[ -> make Token + ]]..acy..[[wt]]..acr..[[ -> write Tag ]]..acy..[[es]]..acr..[[ -> edit Segment Header ]]..acy..[[et]]..acr..[[ -> edit Token data ]]..acy..[[ed]]..acr..[[ => edit Segment Data ]]..acy..[[tk]]..acr..[[ => toggle KGH-Flag File I/O ]]..acy..[[rs]]..acr..[[ => remove Segment - ----------------- ]]..acy..[[cc]]..acr..[[ => check Segment-CRC - ]]..acy..[[lf]]..acr..[[ => load bin File ]]..acy..[[ck]]..acr..[[ => check KGH - ]]..acy..[[sf]]..acr..[[ => save eml/bin File ]]..acy..[[ds]]..acr..[[ => dump Segments - ]]..acy..[[xf]]..acr..[[ => xor to File + ----------------- ]]..acy..[[cc]]..acr..[[ -> check Segment-CRC + ]]..acy..[[lf]]..acr..[[ -> load bin File ]]..acy..[[ck]]..acr..[[ -> check KGH + ]]..acy..[[sf]]..acr..[[ -> save eml/bin File ]]..acy..[[ds]]..acr..[[ -> dump Segments + ]]..acy..[[xf]]..acr..[[ -> xor to File (partially) known Segments Virtual Tags Script Output --------------------------- ------------------------------- ------------------------ - ]]..acy..[[dlc]]..acr..[[ => dump Legic-Cash ]]..acy..[[ct]]..acr..[[ => copy mainTag to backupTag ]]..acy..[[tac]]..acr..[[ => toggle ansicolors - ]]..acy..[[elc]]..acr..[[ => edit Legic-Cash ]]..acy..[[tc]]..acr..[[ => copy backupTag to mainTag - ]]..acy..[[d3p]]..acr..[[ => dump 3rd-Party-Cash ]]..acy..[[tt]]..acr..[[ => switch mainTag & backupTag - ]]..acy..[[e3p]]..acr..[[ => edit 3rd-Party-Cash ]]..acy..[[di]]..acr..[[ => dump mainTag + ]]..acy..[[dlc]]..acr..[[ -> dump Legic-Cash ]]..acy..[[ct]]..acr..[[ -> copy mainTag to backupTag ]]..acy..[[tac]]..acr..[[ -> toggle ansicolors + ]]..acy..[[elc]]..acr..[[ -> edit Legic-Cash ]]..acy..[[tc]]..acr..[[ -> copy backupTag to mainTag + ]]..acy..[[d3p]]..acr..[[ -> dump 3rd-Party-Cash ]]..acy..[[tt]]..acr..[[ -> switch mainTag & backupTag + ]]..acy..[[e3p]]..acr..[[ -> edit 3rd-Party-Cash ]]..acy..[[di]]..acr..[[ -> dump mainTag ]]..acy..[[do]]..acr..[[ => dump backupTag - - - rt: 'read tag' - reads a tag placed near to the PM3 - wt: 'write tag' - writes the content of the 'virtual inTag' to a tag placed near to th PM3 + rt: 'read tag' - reads a tag placed near to the PM3 + wt: 'write tag' - writes the content of the 'virtual inTag' to a tag placed near to th PM3 without the need of changing anything - MCD,MSN,MCC will be read from the tag before and applied to the output. - lf: 'load file' - load a (xored) binary file (*.bin) from the local Filesystem into the 'virtual inTag' - sf: 'save file' - saves the 'virtual inTag' to the local Filesystem as eml and bin (xored with Tag-MCC) - xf: 'xor file' - saves the 'virtual inTag' to the local Filesystem (xored with chosen MCC - use '00' for plain values) + lf: 'load file' - load a (xored) binary file (*.bin) from the local Filesystem into the 'virtual inTag' + sf: 'save file' - saves the 'virtual inTag' to the local Filesystem as eml and bin (xored with Tag-MCC) + xf: 'xor file' - saves the 'virtual inTag' to the local Filesystem (xored with chosen MCC - use '00' for plain values) - ct: 'copy tag' - copy the 'virtual Tag' to a second 'virtual TAG' - not useful yet, but inernally needed - tc: 'copy tag' - copy the 'second virtual Tag' to 'virtual TAG' - not useful yet, but inernally needed - tt: 'toggle tag' - copy mainTag to BackupTag and backupTag to mainTag + ct: 'copy tag' - copy the 'virtual Tag' to a second 'virtual TAG' - not useful yet, but inernally needed + tc: 'copy tag' - copy the 'second virtual Tag' to 'virtual TAG' - not useful yet, but inernally needed + tt: 'toggle tag' - copy mainTag to BackupTag and backupTag to mainTag - di: 'dump mainTag' - shows the current content of the 'virtual Tag' - do: 'dump backupTag' - shows the current content of the 'virtual outTag' - ds: 'dump Segments' - will show the content of a selected Segment - as: 'add Segment' - will add a 'empty' Segment to the inTag - es: 'edit Segment' - edit the Segment-Header of a selected Segment (len, WRP, WRC, RD, valid) + di: 'dump mainTag' - shows the current content of the 'virtual Tag' + do: 'dump backupTag' - shows the current content of the 'virtual outTag' + ds: 'dump Segments' - will show the content of a selected Segment + as: 'add Segment' - will add a 'empty' Segment to the inTag + es: 'edit Segment' - edit the Segment-Header of a selected Segment (len, WRP, WRC, RD, valid) all other Segment-Header-Values are either calculated or not needed to edit (yet) - ed: 'edit data' - edit the Data of a Segment (ADF-Aera / Stamp & Payload specific Data) - et: 'edit Token' - edit Data of a Token (CDF-Area / SAM, SAM64, SAM63, IAM, GAM specific Data) - mt: 'make Token' - create a Token 'from scratch' (guided) - rs: 'remove segment' - removes a Segment (except Segment 00, but this can be set to valid=0 for Master-Token) - cc: 'check Segment-CRC'- checks & calculates (if check failed) the Segment-CRC of all Segments - ck: 'check KGH-CRC' - checks the and calculates a 'Kaba Group Header' if one was detected + ed: 'edit data' - edit the Data of a Segment (ADF-Aera / Stamp & Payload specific Data) + et: 'edit Token' - edit Data of a Token (CDF-Area / SAM, SAM64, SAM63, IAM, GAM specific Data) + mt: 'make Token' - create a Token 'from scratch' (guided) + rs: 'remove segment' - removes a Segment (except Segment 00, but this can be set to valid=0 for Master-Token) + cc: 'check Segment-CRC' - checks & calculates (if check failed) the Segment-CRC of all Segments + ck: 'check KGH-CRC' - checks the and calculates a 'Kaba Group Header' if one was detected 'Kaba Group Header CRC calculation' - tk: 'toggle KGH' - toggle the (script-internal) flag for kgh-calculation for a segment - xc: 'etra c' - show string that was used to calculate the kgh-crc of a segment + tk: 'toggle KGH' - toggle the (script-internal) flag for kgh-calculation for a segment + xc: 'etra c' - show string that was used to calculate the kgh-crc of a segment -dlc: 'dump Legic-Cash' - show balance and checksums of a Legic-Cash Segment -elc: 'edit Legic-Cash' - edit values of a Legic-Cash Segment +dlc: 'dump Legic-Cash' - show balance and checksums of a Legic-Cash Segment +elc: 'edit Legic-Cash' - edit values of a Legic-Cash Segment -d3p: 'dump 3rd Party' - show balance, history and checksums of a (yet) unknown 3rd-Party Cash Segment -e3p: 'edit 3rd Party' - edit Data in 3rd-Party Cash Segment +d3p: 'dump 3rd Party' - show balance, history and checksums of a (yet) unknown 3rd-Party Cash Segment +e3p: 'edit 3rd Party' - edit Data in 3rd-Party Cash Segment -tac: 'toggle ansicolors'- switch on and off the colored text-output of this script +tac: 'toggle ansicolors' - switch on and off the colored text-output of this script default can be changed by setting the variable 'colored_output' to false ]] currentTag="inTAG" @@ -361,7 +368,7 @@ end function bytesToTable(bytes, bstart, bend) local t={} for i=0, (bend-bstart) do - t[i]=bytes[bstart+i] + t[i]=padString(bytes[bstart+i]) end return t end @@ -942,20 +949,21 @@ function dumpTagMap(tag, tagMap) end if (isPosCrc8(tagMap, v['start'])>0) then if ( checkMapCrc8(tagMap, bytes, isPosCrc8(tagMap, v['start']) ) ) then - io.write("("..("%04d"):format(v['start']).."-"..("%04d"):format(v['end'])..") "..acgreen..v['name']..acoff..":") + io.write("("..("%04d"):format(v['start']).."-"..("%04d"):format(v['end'])..") "..acgreen..v['name']..acoff) else - io.write("("..("%04d"):format(v['start']).."-"..("%04d"):format(v['end'])..") "..acred..v['name']..acoff..":") + io.write("("..("%04d"):format(v['start']).."-"..("%04d"):format(v['end'])..") "..acred..v['name']..acoff) end else - io.write("("..("%04d"):format(v['start']).."-"..("%04d"):format(v['end'])..") "..((v['highlight']) and acmagenta or acyellow)..v['name']..acoff..":") - end - temp="" - for i=((string.len(v['name']))/10), 2 do - temp=temp.."\t" + io.write("("..("%04d"):format(v['start']).."-"..("%04d"):format(v['end'])..") "..((v['highlight']) and acmagenta or acyellow)..v['name']..acoff) end + + temp = "" + while (#v['name'] + temp:len()) < 20 do temp = temp.." " end + for i=v['start'], v['end'] do temp=temp..bytes[i].." " end + print(temp) lastend=v['end'] end @@ -1001,10 +1009,21 @@ end -- edit existing Map function editTagMap(tag, tagMap) local t = [[ - Data: dm = show dr = dump raw -Mappings: im = insert am = add rm = remove - CRC8: ac8 = add sc8 = show rc8 = remove - : q = exit h = Help +]]..acc..[[Data]]..acr..[[ + + ]]..acy..[[dm]]..acr..[[ - show ]]..acy..[[dr]]..acr..[[ - dump raw + +]]..acc..[[Mappings]]..acr..[[ + + ]]..acy..[[im]]..acr..[[ - insert ]]..acy..[[am]]..acr..[[ - add + ]]..acy..[[rm]]..acr..[[ - remove ]]..acy..[[mas]]..acr..[[ - map all segments + +]]..acc..[[CRC8]]..acr..[[ + + ]]..acy..[[ac8]]..acr..[[ - add ]]..acy..[[sc8]]..acr..[[ - show + ]]..acy..[[rc8]]..acr..[[ - remove + + ]]..acy..[[q]]..acr..[[ - exit ]]..acy..[[h]]..acr..[[ - Help ]] --if(#tagMap.mappings==0) then oops("no mappings in tagMap"); return tagMap end @@ -2341,11 +2360,11 @@ function modifyHelp() Virtual Tags tagMap (partial) known Segments -------------------------------- --------------------- --------------------------- - ]]..acy..[[xf]]..acr..[[ => copy mainTag to backupTag ]]..acy..[[mm]]..acr..[[ => make (new) Map ]]..acy..[[dlc]]..acr..[[ => dump Legic-Cash - ]]..acy..[[xf]]..acr..[[ => copy backupTag to mainTag ]]..acy..[[em]]..acr..[[ => edit Map submenu ]]..acy..[[elc]]..acr..[[ => edit Legic-Cash - ]]..acy..[[xf]]..acr..[[ => switch mainTag & backupTag ]]..acy..[[lm]]..acr..[[ => load map from file ]]..acy..[[d3p]]..acr..[[ => dump 3rd-Party-Cash - ]]..acy..[[xf]]..acr..[[ => dump mainTag ]]..acy..[[sm]]..acr..[[ => save map to file ]]..acy..[[e3p]]..acr..[[ => edit 3rd-Party-Cash - ]]..acy..[[xf]]..acr..[[ => dump backupTag + ]]..acy..[[ct]]..acr..[[ => copy mainTag to backupTag ]]..acy..[[mm]]..acr..[[ => make (new) Map ]]..acy..[[dlc]]..acr..[[ => dump Legic-Cash + ]]..acy..[[tc]]..acr..[[ => copy backupTag to mainTag ]]..acy..[[em]]..acr..[[ => edit Map submenu ]]..acy..[[elc]]..acr..[[ => edit Legic-Cash + ]]..acy..[[tt]]..acr..[[ => switch mainTag & backupTag ]]..acy..[[lm]]..acr..[[ => load map from file ]]..acy..[[d3p]]..acr..[[ => dump 3rd-Party-Cash + ]]..acy..[[di]]..acr..[[ => dump mainTag ]]..acy..[[sm]]..acr..[[ => save map to file ]]..acy..[[e3p]]..acr..[[ => edit 3rd-Party-Cash + ]]..acy..[[do]]..acr..[[ => dump backupTag ]]..acy..[[h]]..acr..[[ => this help ]]..acy..[[q]]..acr..[[ => quit ]] From b314d1ef1c8ae7a5d69dbbab9247af6bcd7864a3 Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:15:07 +0200 Subject: [PATCH 679/924] Add MIFARE Plus commands in trace list --- CHANGELOG.md | 1 + client/src/cmdhflist.c | 224 +++++++++++++++++++++++++++++++++++++++++ client/src/cmdhflist.h | 2 + client/src/cmdhfmfp.c | 2 +- client/src/cmdtrace.c | 19 ++-- doc/commands.json | 11 +- include/protocols.h | 53 ++++++++++ 7 files changed, 300 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5711c1090..292bd4c12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `hf mfp list` - interprets MIFARE Plus commands in traces (@DidierA) - Changed `hf legic sim` - loop and return codes on deviceside updated to DEFINES (@iceman1001) - Changed `hf legic einfo` - now accepts the three different cardsizes as params (@iceman1001) - Fix `lf cotag reader -1` - now doesn't fail (@iceman1001) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 5ddd3f1fa..eea8378ae 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -1196,6 +1196,230 @@ void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { } } } +// codes for which no data is interpreted, returns the message to print. +const char *mfpGetAnnotationForCode(uint8_t code) { + struct mfp_code_msg { + uint8_t code; + const char *annotation; + } messages[] = { + { MFP_GETVERSION, "GET VERSION"}, + { MFP_ADDITIONALFRAME, "NEXT FRAME"}, + { MFP_AUTHENTICATENONFIRST, "FOLLOWING AUTH"}, + { MFP_AUTHENTICATECONTINUE, "SECOND AUTH STEP"}, + { MFP_RESETAUTH, "RESET AUTH"}, + { MFP_COMMITPERSO, "COMMIT PERSO"}, + { MFP_VCSUPPORTLASTISOL3, "CHECK VIRTUAL CARD"}, + { MFP_ISOSELECT, "SELECT VIRTUAL CARD"}, + { MFP_SETCONFIGSL1, "SET CONFIG SL1"}, + { MFP_MF_PERSONALIZEUIDUSAGE, "PERSONALIZE UID USAGE"}, + { MFP_READ_SIG, "READ SIGNATURE"}, + { MFDES_PREPARE_PC, "PREPARE PROXIMITY CHECK"}, + { MFDES_PROXIMITY_CHECK, "PROXIMITY CHECK"}, + { MFDES_VERIFY_PC, "VERIFY PROXIMITY CHECK"}, + { 0, NULL} + } ; + + for (struct mfp_code_msg *p=messages ; p->annotation != NULL ; p++) { + if (p->code == code) { + return p->annotation ; + } + } + return NULL ; +} + +// MIFARE Plus +void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { + + // If we are in Mifare Classic Authenticated mode, all the work has already be done elsewhere + if ((MifareAuthState != masNone) && (MifareAuthState != masError)) { + return ; + } + + // it's basically a ISO14443a tag, so try annotation from there + if (applyIso14443a(exp, size, cmd, cmdsize, false) == PM3_SUCCESS) { + return ; + } + + // ok this part is copy paste from annotateMfDesfire, it seems to work for MIFARE Plus also + if (((cmd[0] & 0xC0) == 0x00) && (cmdsize > 2)) { + + // PCB [CID] [NAD] [INF] CRC CRC + int pos = 1; + if ((cmd[0] & 0x08) == 0x08) // cid byte following + pos++; + + if ((cmd[0] & 0x04) == 0x04) // nad byte following + pos++; + + for (uint8_t i = 0; i < 2; i++, pos++) { + bool found_annotation = true; + + uint8_t *data = cmd + pos + 1; + // if the byte prior to the command is 90 the command is wrapped, so data starts 3 bytes later + if (i > 0 && cmd[pos - 1] == 0x90) { + data += 3; + } + uint8_t data_size = 0; + if (cmdsize > (data - cmd)) { + data_size = cmdsize - (data - cmd); + } + + // Messages for commands that do not need args are treated first + const char *annotation = mfpGetAnnotationForCode(cmd[pos]) ; + if (annotation != NULL) { + snprintf(exp, size, "%s", annotation) ; + break ; + } + + switch (cmd[pos]) { + case MFP_AUTHENTICATEFIRST: + case MFP_AUTHENTICATEFIRST_VARIANT: + if (data_size > 1) { + // key : uint16_t uKeyNum = 0x4000 + sectorNum * 2 + (keyB ? 1 : 0); + uint16_t uKeyNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "FIRST AUTH (Keynr 0x%04X: %c sector %d)", uKeyNum, uKeyNum & 0x0001 ? 'B' : 'A', (uKeyNum - 0x4000)/2 ); + } else { + snprintf(exp, size, "FIRST AUTH") ; + } + break; + + case MFP_WRITEPERSO: + if (data_size > 1) { + uint16_t uKeyNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "WRITE PERSO (Keynr 0x%04X)", uKeyNum); + } else { + snprintf(exp, size, "WRITE PERSO"); + } + break; + + case MFP_READENCRYPTEDNOMAC_MACED: + case MFP_READENCRYPTEDMAC_MACED: + case MFP_READENCRYPTEDNOMAC_UNMACED: + case MFP_READENCRYPTEDMAC_UNMACED: + if (data_size > 2) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + uint8_t uQty = data[2] ; + if (uQty != 1) { + snprintf(exp, size, "READ ENCRYPTED(%u-%u)", uBlockNum, uBlockNum+uQty-1); + } else { + snprintf(exp, size, "READ ENCRYPTED(%u)", uBlockNum); + } + } else { + snprintf(exp, size, "READ ENCRYPTED ?"); + } + break; + + case MFP_READPLAINNOMAC_MACED: + case MFP_READPLAINMAC_MACED: + case MFP_READPLAINNOMAC_UNMACED: + case MFP_READPLAINMAC_UNMACED: + if (data_size > 2) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + uint8_t uQty = data[2] ; + if (uQty != 1) { + snprintf(exp, size, "READ PLAIN(%u-%u)", uBlockNum, uBlockNum+uQty-1); + } else { + snprintf(exp, size, "READ PLAIN(%u)", uBlockNum); + } + } else { + snprintf(exp, size, "READ PLAIN ?"); + } + break; + + case MFP_WRITEPLAINNOMAC : + case MFP_WRITEPLAINMAC : + if (data_size > 1) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "WRITE PLAIN(%u)", uBlockNum); + } else { + snprintf(exp, size, "WRITE PLAIN ?"); + } + break; + + case MFP_WRITEENCRYPTEDNOMAC: + case MFP_WRITEENCRYPTEDMAC : + if (data_size > 1) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "WRITE ENCRYPTED(%u)", uBlockNum); + } else { + snprintf(exp, size, "WRITE ENCRYPTED ?"); + } + break; + + case MFP_INCREMENTNOMAC : + case MFP_INCREMENTMAC : + if (data_size > 1) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "INCREMENT(%u)", uBlockNum); + } else { + snprintf(exp, size, "INCREMENT ?"); + } + break; + + case MFP_DECREMENTNOMAC : + case MFP_DECREMENTMAC : + if (data_size > 1) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "DECREMENT(%u)", uBlockNum); + } else { + snprintf(exp, size, "DECREMENT ?"); + } + break; + + case MFP_TRANSFERNOMAC : + case MFP_TRANSFERMAC : + if (data_size > 1) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "TRANSFER(%u)", uBlockNum); + } else { + snprintf(exp, size, "TRANSFER ?"); + } + break; + + case MFP_INCREMENTTRANSFERNOMAC: + case MFP_INCREMENTTRANSFERMAC : + if (data_size > 1) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "INCREMENT, TRANSFER(%u)", uBlockNum); + } else { + snprintf(exp, size, "INCREMENT, TRANSFER ?"); + } + break; + + case MFP_DECREMENTTRANSFERNOMAC: + case MFP_DECREMENTTRANSFERMAC : + if (data_size > 1) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "DECREMENT, TRANSFER(%u)", uBlockNum); + } else { + snprintf(exp, size, "DECREMENT, TRANSFER ?"); + } + break; + + case MFP_RESTORENOMAC : + case MFP_RESTOREMAC : + if (data_size > 1) { + uint16_t uBlockNum = MemLeToUint2byte(data) ; + snprintf(exp, size, "RESTORE(%u)", uBlockNum); + } else { + snprintf(exp, size, "RESTORE ?"); + } + break; + + default: + found_annotation = false; + break; + } + if (found_annotation) { + break; + } + } + } else { + // anything else + snprintf(exp, size, "?"); + } +} + /** 06 00 = INITIATE diff --git a/client/src/cmdhflist.h b/client/src/cmdhflist.h index 6499938eb..7c7e09ffb 100644 --- a/client/src/cmdhflist.h +++ b/client/src/cmdhflist.h @@ -56,6 +56,8 @@ void annotateIso7816(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); void annotateIso14443b(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); void annotateIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool is_response); void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); +const char *mfpGetAnnotationForCode(uint8_t code); +void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); void annotateMifare(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, const uint8_t *parity, uint8_t paritysize, bool isResponse); void annotateLTO(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 52f3da57e..e8e2c7226 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1811,7 +1811,7 @@ static int CmdHFMFPNDEFWrite(const char *Cmd) { } static int CmdHFMFPList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf mf", "mf"); + return CmdTraceListAlias(Cmd, "hf mfp", "mfp"); } static command_t CommandTable[] = { diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 326a646b9..0d47d2d7c 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -533,6 +533,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr crcStatus = !felica_CRC_check(frame + 2, data_len - 4); break; case PROTO_MIFARE: + case PROTO_MFPLUS: crcStatus = mifare_CRC_check(hdr->isResponse, frame, data_len); break; case ISO_14443A: @@ -603,7 +604,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr && protocol != FELICA && protocol != LTO && protocol != PROTO_CRYPTORF - && (hdr->isResponse || protocol == ISO_14443A || protocol == PROTO_MIFARE || protocol == SEOS) + && (hdr->isResponse || protocol == ISO_14443A || protocol == PROTO_MIFARE || protocol == PROTO_MFPLUS || protocol == SEOS) && (oddparity8(frame[j]) != ((parityBits >> (7 - (j & 0x0007))) & 0x01))) { snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x! ", frame[j]); @@ -701,6 +702,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr // mark short bytes (less than 8 Bit + Parity) if (protocol == ISO_14443A || protocol == PROTO_MIFARE || + protocol == PROTO_MFPLUS || protocol == THINFILM) { // approximated with 128 * (9 * data_len); @@ -747,6 +749,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr annotateIso14443a(explanation, sizeof(explanation), frame, data_len, hdr->isResponse); break; case PROTO_MIFARE: + case PROTO_MFPLUS: annotateMifare(explanation, sizeof(explanation), frame, data_len, parityBytes, TRACELOG_PARITY_LEN(hdr), hdr->isResponse); break; case PROTO_HITAG1: @@ -766,7 +769,6 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } if (hdr->isResponse == false) { - switch (protocol) { case LEGIC: annotateLegic(explanation, sizeof(explanation), frame, data_len); @@ -774,6 +776,9 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr case MFDES: annotateMfDesfire(explanation, sizeof(explanation), frame, data_len); break; + case PROTO_MFPLUS: + annotateMfPlus(explanation, sizeof(explanation), frame, data_len); + break; case ISO_14443B: annotateIso14443b(explanation, sizeof(explanation), frame, data_len); break; @@ -901,7 +906,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } } - if (protocol == PROTO_MIFARE) { + if (protocol == PROTO_MIFARE || protocol == PROTO_MFPLUS) { uint8_t mfData[32] = {0}; size_t mfDataLen = 0; if (DecodeMifareData(frame, data_len, parityBytes, hdr->isResponse, mfData, &mfDataLen, mfDicKeys, mfDicKeysCount)) { @@ -1200,6 +1205,7 @@ int CmdTraceList(const char *Cmd) { "trace list -t seos -> interpret as " _YELLOW_("SEOS") "\n" "trace list -t thinfilm -> interpret as " _YELLOW_("Thinfilm") "\n" "trace list -t topaz -> interpret as " _YELLOW_("Topaz") "\n" + "trace list -t mfp -> interpret as " _YELLOW_("MIFARE Plus") "\n" "\n" "trace list -t mf -f mfc_default_keys.dic -> use default dictionary file\n" "trace list -t 14a --frame -> show frame delay times\n" @@ -1266,6 +1272,7 @@ int CmdTraceList(const char *Cmd) { else if (strcmp(type, "seos") == 0) protocol = SEOS; else if (strcmp(type, "thinfilm") == 0) protocol = THINFILM; else if (strcmp(type, "topaz") == 0) protocol = TOPAZ; + else if (strcmp(type, "mfp") == 0) protocol = PROTO_MFPLUS; else if (strcmp(type, "") == 0) protocol = -1; else { PrintAndLogEx(FAILED, "Unknown protocol \"%s\"", type); @@ -1304,7 +1311,7 @@ int CmdTraceList(const char *Cmd) { PrintAndLogEx(INFO, _YELLOW_("start") " = start of start frame " _YELLOW_("end") " = end of frame. " _YELLOW_("src") " = source of transfer"); } - if (protocol == ISO_14443A || protocol == PROTO_MIFARE || protocol == MFDES || protocol == TOPAZ || protocol == LTO) { + if (protocol == ISO_14443A || protocol == PROTO_MIFARE || protocol == MFDES || protocol == PROTO_MFPLUS || protocol == TOPAZ || protocol == LTO) { if (use_us) PrintAndLogEx(INFO, _YELLOW_("ISO14443A") " - all times are in microseconds"); else @@ -1354,7 +1361,7 @@ int CmdTraceList(const char *Cmd) { uint32_t dicKeysCount = 0; bool dictionaryLoad = false; - if (protocol == PROTO_MIFARE) { + if (protocol == PROTO_MIFARE || protocol == PROTO_MFPLUS) { if (diclen > 0) { uint8_t *keyBlock = NULL; int res = loadFileDICTIONARY_safe(dictionary, (void **) &keyBlock, 6, &dicKeysCount); @@ -1387,7 +1394,7 @@ int CmdTraceList(const char *Cmd) { PrintAndLogEx(NORMAL, "------------+------------+-----+-------------------------------------------------------------------------+-----+--------------------"); // clean authentication data used with the mifare classic decrypt fct - if (protocol == ISO_14443A || protocol == PROTO_MIFARE) + if (protocol == ISO_14443A || protocol == PROTO_MIFARE || protocol == PROTO_MFPLUS) ClearAuthData(); uint32_t previous_EOT = 0; diff --git a/doc/commands.json b/doc/commands.json index 5686c7542..0618f5152 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -6159,10 +6159,10 @@ }, "hf mfp list": { "command": "hf mfp list", - "description": "Alias of `trace list -t mf` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t mfp` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ - "hf mf list --frame -> show frame delay times", - "hf mf list -1 -> use trace buffer" + "hf mfp list --frame -> show frame delay times", + "hf mfp list -1 -> use trace buffer" ], "offline": true, "options": [ @@ -6176,7 +6176,7 @@ "or to import into Wireshark using encapsulation type \"ISO 14443\"", "-f, --file filename of dictionary" ], - "usage": "hf mf list [-h1crux] [--frame] [-f ]" + "usage": "hf mfp list [-h1crux] [--frame] [-f ]" }, "hf mfp mad": { "command": "hf mfp mad", @@ -11488,6 +11488,7 @@ "trace list -t seos -> interpret as SEOS", "trace list -t thinfilm -> interpret as Thinfilm", "trace list -t topaz -> interpret as Topaz", + "trace list -t mfp -> interpret as MIFARE Plus", "", "trace list -t mf -f mfc_default_keys.dic -> use default dictionary file", "trace list -t 14a --frame -> show frame delay times", @@ -11694,6 +11695,6 @@ "metadata": { "commands_extracted": 679, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-17T15:46:12" + "extracted_on": "2023-07-19T19:11:10" } } \ No newline at end of file diff --git a/include/protocols.h b/include/protocols.h index 721dccaf5..772105c9d 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -428,6 +428,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define PROTO_HITAGS 14 #define PROTO_CRYPTORF 15 #define SEOS 16 +#define PROTO_MFPLUS 17 // Picopass fuses #define FUSE_FPERS 0x80 @@ -620,6 +621,58 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MFDES_E_FILE_NOT_FOUND 0xF0 #define MFDES_E_FILE_INTEGRITY 0xF1 +// MIFARE PLus EV2 Command set +// source: https://www.nxp.com/docs/en/data-sheet/MF1P(H)x2.pdf in Look-Up Tables + +#define MFP_READ_SIG 0x3C // same as DESFIRE +#define MFP_WRITEPERSO 0xA8 +#define MFP_COMMITPERSO 0xAA + +#define MFP_AUTHENTICATEFIRST 0x70 +#define MFP_AUTHENTICATEFIRST_VARIANT 0x73 +#define MFP_AUTHENTICATENONFIRST 0x76 +#define MFP_AUTHENTICATECONTINUE 0x72 +#define MFP_AUTHENTICATESECTORSWITCH 0x7A +#define MFP_RESETAUTH 0x78 + +#define MFP_VCSUPPORTLASTISOL3 0x4B +#define MFP_ISOSELECT 0xA4 + +#define MFP_GETVERSION 0x60 // same as DESFIRE +#define MFP_ADDITIONALFRAME 0xAF +#define MFP_SETCONFIGSL1 0x44 +#define MFP_MF_PERSONALIZEUIDUSAGE 0x40 + +// read commands +#define MFP_READENCRYPTEDNOMAC_MACED 0X30 +#define MFP_READENCRYPTEDMAC_MACED 0x31 +#define MFP_READPLAINNOMAC_MACED 0x32 +#define MFP_READPLAINMAC_MACED 0x33 +#define MFP_READENCRYPTEDNOMAC_UNMACED 0x34 +#define MFP_READENCRYPTEDMAC_UNMACED 0X35 +#define MFP_READPLAINNOMAC_UNMACED 0x36 +#define MFP_READPLAINMAC_UNMACED 0x37 + +// write commands +#define MFP_WRITEENCRYPTEDNOMAC 0xA0 +#define MFP_WRITEENCRYPTEDMAC 0xA1 +#define MFP_WRITEPLAINNOMAC 0xA2 +#define MFP_WRITEPLAINMAC 0xA3 + +// value commands +#define MFP_INCREMENTNOMAC 0xB0 +#define MFP_INCREMENTMAC 0xB1 +#define MFP_DECREMENTNOMAC 0xB2 +#define MFP_DECREMENTMAC 0xB3 +#define MFP_TRANSFERNOMAC 0xB4 +#define MFP_TRANSFERMAC 0xB5 +#define MFP_INCREMENTTRANSFERNOMAC 0xB6 +#define MFP_INCREMENTTRANSFERMAC 0xB7 +#define MFP_DECREMENTTRANSFERNOMAC 0xB8 +#define MFP_DECREMENTTRANSFERMAC 0xB9 +#define MFP_RESTORENOMAC 0xC2 +#define MFP_RESTOREMAC 0xC3 + // LEGIC Commands #define LEGIC_MIM_22 0x0D From 8543db11b59f34ca120a1e6eea7f5b43adee8dac Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:46:20 +0200 Subject: [PATCH 680/924] Avoid useless loop by moving check to the default case --- client/src/cmdhflist.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index eea8378ae..64f885713 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -1264,13 +1264,6 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { data_size = cmdsize - (data - cmd); } - // Messages for commands that do not need args are treated first - const char *annotation = mfpGetAnnotationForCode(cmd[pos]) ; - if (annotation != NULL) { - snprintf(exp, size, "%s", annotation) ; - break ; - } - switch (cmd[pos]) { case MFP_AUTHENTICATEFIRST: case MFP_AUTHENTICATEFIRST_VARIANT: @@ -1407,7 +1400,13 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { break; default: - found_annotation = false; + // Messages for commands that do not need args are treated here + const char *annotation = mfpGetAnnotationForCode(cmd[pos]) ; + if (annotation != NULL) { + snprintf(exp, size, "%s", annotation) ; + } else { + found_annotation = false; + } break; } if (found_annotation) { From e056459c038fdc3de96369fb9ad0a6b6114542c7 Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Thu, 20 Jul 2023 02:19:02 +0200 Subject: [PATCH 681/924] trace list: add CID info in RATS and PPSS --- client/src/cmdhflist.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 64f885713..8bcb7fef9 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -273,11 +273,13 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i MifareAuthState = masNone; break; case ISO14443A_CMD_RATS: - snprintf(exp, size, "RATS"); + snprintf(exp, size, "RATS - FSDI=0x%x, CID=0x%x", (cmd[1] & 0xF0) >> 4, (cmd[1] & 0x0F) ); break; + /* Actually, PPSS is Dx case ISO14443A_CMD_PPS: snprintf(exp, size, "PPS"); break; + */ case ISO14443A_CMD_OPTS: snprintf(exp, size, "OPTIONAL TIMESLOT"); break; @@ -423,10 +425,14 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i snprintf(exp, size, "FAST WRITE (" _MAGENTA_("%d-%d") ")", cmd[1], cmd[2]); else snprintf(exp, size, "?"); - break; + default: - return PM3_ESOFT; + if ( (cmd[0] & 0xF0) == 0xD0 && ( cmdsize == 4 || cmdsize == 5 )) { + snprintf(exp, size, "PPSS - CID=0x%x", cmd[0] & 0x0F) ; + } else { + return PM3_ESOFT; + } } } else { if (gs_mfuc_state == 1) { From 87d43b87d1d74f70ece380844d53362f6f875bfa Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 20 Jul 2023 09:39:12 +0200 Subject: [PATCH 682/924] fix workflows/uniq.yaml Lines containing # were entirely ignored but some contain a key, e.g. in iclass_default_keys.dic --- .github/workflows/uniq.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/uniq.yaml b/.github/workflows/uniq.yaml index 89f845483..a770a4fde 100644 --- a/.github/workflows/uniq.yaml +++ b/.github/workflows/uniq.yaml @@ -18,6 +18,5 @@ jobs: - name: check unique keys in dic files shell: bash run: | - find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " - if [[ $(find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | grep -v '#' | sort | uniq -i -d -c | sort -n -r " | grep -v "./" | wc -l) -gt 0 ]]; then exit 1; fi - + find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | sed 's/ *#.*//;/^$/d' | sort | uniq -i -d -c | sort -n -r " + if [[ $(find . -type f -name "*.dic" | xargs -I {} sh -c "echo {} && cat {} | sed 's/ *#.*//;/^$/d' | sort | uniq -i -d -c | sort -n -r " | grep -v '^\./' | wc -l) -gt 0 ]]; then exit 1; fi From 89cbe3c7df34f7a98828c56d2f6d1dea2a1d5d07 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 20 Jul 2023 10:54:37 +0200 Subject: [PATCH 683/924] should fix macos compilation error introduced by 8543db11b59f34ca120a1e6eea7f5b43adee8dac --- client/src/cmdhflist.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 64f885713..5d8a9d343 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -1399,7 +1399,7 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { } break; - default: + default: { // Messages for commands that do not need args are treated here const char *annotation = mfpGetAnnotationForCode(cmd[pos]) ; if (annotation != NULL) { @@ -1408,6 +1408,7 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { found_annotation = false; } break; + } } if (found_annotation) { break; From c5cfe593f5a681416de997a0b76631b059493932 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 20 Jul 2023 21:04:00 +0200 Subject: [PATCH 684/924] fix exec mode on source file --- client/src/cmdlfhid.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 client/src/cmdlfhid.c diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c old mode 100755 new mode 100644 From 216ad5740b9d8319a7d43823feb590d657151f60 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 20 Jul 2023 21:12:21 +0200 Subject: [PATCH 685/924] fix `lf hitag eload` segmentation fault --- include/pm3_cmd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 0983ee2e1..13dca3b6c 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -271,7 +271,7 @@ typedef struct { typedef struct { uint8_t type; uint16_t len; - uint8_t *data; + uint8_t data[]; } PACKED lf_hitag_t; typedef struct { From 173379b9991220646577d821ddf492904fdecea9 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 20 Jul 2023 22:35:42 +0200 Subject: [PATCH 686/924] Rewrote completely cmds & options `lf hitag read/dump/wrbl/ta` for more coherence with other pm3 cmds. Still there remain strange things but it should be a step in the right direction... --- armsrc/hitag2.c | 4 +- client/src/cmdlfhitag.c | 557 +++++++++++++++++++++++++++------------- 2 files changed, 387 insertions(+), 174 deletions(-) diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index 90a667105..7206b735c 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -281,7 +281,7 @@ static void hitag2_handle_reader_command(uint8_t *rx, const size_t rxlen, uint8_ } break; - // Received RWD authentication challenge and respnse + // Received RWD authentication challenge and response case 64: { // Store the authentication attempt if (auth_table_len < (AUTH_TABLE_LENGTH - 8)) { @@ -891,7 +891,7 @@ static bool hitag2_test_auth_attempts(uint8_t *rx, const size_t rxlen, uint8_t * if (bCrypto) { Dbprintf("auth: %02x%02x%02x%02x%02x%02x%02x%02x Failed, removed entry!", NrAr[0], NrAr[1], NrAr[2], NrAr[3], NrAr[4], NrAr[5], NrAr[6], NrAr[7]); - // Removing failed entry from authentiations table + // Removing failed entry from authentications table memcpy(auth_table + auth_table_pos, auth_table + auth_table_pos + 8, 8); auth_table_len -= 8; diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 8cd28b842..74c77b8f9 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -224,11 +224,11 @@ static int CmdLFHitagEload(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_str1("f", "file", "", "Specfiy dump filename"), - arg_lit0("1", NULL, "Card type Hitag1"), - arg_lit0("2", NULL, "Card type Hitag2"), - arg_lit0("s", NULL, "Card type HitagS"), - arg_lit0("m", NULL, "Card type HitagM"), + arg_str1("f", "file", "", "Specify dump filename"), + arg_lit0("1", NULL, "Card type Hitag 1"), + arg_lit0("2", NULL, "Card type Hitag 2"), + arg_lit0("s", NULL, "Card type Hitag S"), + arg_lit0("m", NULL, "Card type Hitag M"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -243,9 +243,12 @@ static int CmdLFHitagEload(const char *Cmd) { bool use_htm = arg_get_lit(ctx, 5); CLIParserFree(ctx); - uint8_t n = (use_ht1 + use_ht2 + use_hts + use_htm); - if (n != 1) { - PrintAndLogEx(ERR, "error, only specify one Hitag type"); + if ((use_ht1 + use_ht2 + use_hts + use_htm) > 1) { + PrintAndLogEx(ERR, "error, specify only one Hitag type"); + return PM3_EINVARG; + } + if ((use_ht1 + use_ht2 + use_hts + use_htm) == 0) { + PrintAndLogEx(ERR, "error, specify one Hitag type"); return PM3_EINVARG; } @@ -288,16 +291,16 @@ static int CmdLFHitagEload(const char *Cmd) { static int CmdLFHitagSim(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf hitag sim", - "Simulate Hitag2 / HitagS transponder\n" + "Simulate Hitag transponder\n" "You need to `lf hitag eload` first", "lf hitag sim -2" ); void *argtable[] = { arg_param_begin, - arg_lit0("1", NULL, "simulate Hitag1"), - arg_lit0("2", NULL, "simulate Hitag2"), - arg_lit0("s", NULL, "simulate HitagS"), + arg_lit0("1", "ht1", "simulate Hitag 1"), + arg_lit0("2", "ht2", "simulate Hitag 2"), + arg_lit0("s", "hts", "simulate Hitag S"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -305,10 +308,15 @@ static int CmdLFHitagSim(const char *Cmd) { bool use_ht1 = arg_get_lit(ctx, 1); bool use_ht2 = arg_get_lit(ctx, 2); bool use_hts = arg_get_lit(ctx, 3); + bool use_htm = false; // not implemented yet CLIParserFree(ctx); - if ((use_ht1 + use_ht2 + use_hts) > 1) { - PrintAndLogEx(ERR, "error, Only specify one Hitag type"); + if ((use_ht1 + use_ht2 + use_hts + use_htm) > 1) { + PrintAndLogEx(ERR, "error, specify only one Hitag type"); + return PM3_EINVARG; + } + if ((use_ht1 + use_ht2 + use_hts + use_htm) == 0) { + PrintAndLogEx(ERR, "error, specify one Hitag type"); return PM3_EINVARG; } @@ -523,67 +531,85 @@ static int CmdLFHitagInfo(const char *Cmd) { return PM3_SUCCESS; } -// TODO: iceman -// Hitag2 reader, problem is that this command mixes up stuff. So 26 give uid. 21 etc will also give you a memory dump !? -// static int CmdLFHitagReader(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "lf hitag reader", - "Act like a Hitag Reader", - "Hitag S\n" - " lf hitag reader --01 --nrar 0102030411223344\n" - " lf hitag reader --02 -k 4F4E4D494B52\n" - "Hitag 2\n" - " lf hitag reader --21 -k 4D494B52\n" - " lf hitag reader --22 --nrar 0102030411223344\n" - " lf hitag reader --23 -k 4F4E4D494B52\n" - " lf hitag reader --26\n" + CLIParserInit(&ctx, "lf hitag read", + "Read Hitag memory\n" + "Crypto mode key format: ISK high + ISK low", + "Hitag S, plain mode\n" + " lf hitag read --hts\n" + "Hitag S, challenge mode\n" + " lf hitag read --hts --nrar 0102030411223344\n" + "Hitag S, crypto mode => use default key 4F4E4D494B52 (ONMIKR)\n" + " lf hitag read --hts --crypto\n" + "Hitag S, long key = crypto mode\n" + " lf hitag read --hts -k 4F4E4D494B52\n\n" + + "Hitag 2, password mode => use default key 4D494B52 (MIKR)\n" + " lf hitag read --ht2 --pwd\n" + "Hitag 2, providing a short key = password mode\n" + " lf hitag read --ht2 -k 4D494B52\n" + "Hitag 2, challenge mode\n" + " lf hitag read --ht2 --nrar 0102030411223344\n" + "Hitag 2, crypto mode => use default key 4F4E4D494B52 (ONMIKR)\n" + " lf hitag read --ht2 --crypto\n" + "Hitag 2, providing a long key = crypto mode\n" + " lf hitag read --ht2 -k 4F4E4D494B52\n" ); void *argtable[] = { arg_param_begin, - arg_lit0(NULL, "01", "HitagS, read all pages, challenge mode"), - arg_lit0(NULL, "02", "HitagS, read all pages, crypto mode. Set key=0 for no auth"), - arg_lit0(NULL, "21", "Hitag2, read all pages, password mode. def 4D494B52 (MIKR)"), - arg_lit0(NULL, "22", "Hitag2, read all pages, challenge mode"), - arg_lit0(NULL, "23", "Hitag2, read all pages, crypto mode. Key ISK high + ISK low. def 4F4E4D494B52 (ONMIKR)"), - arg_lit0(NULL, "25", "Hitag2, test recorded authentications (replay?)"), - arg_lit0(NULL, "26", "Hitag2, read UID"), + arg_lit0(NULL, "hts", "Hitag S"), + arg_lit0(NULL, "ht2", "Hitag 2"), + arg_lit0(NULL, "pwd", "password mode"), + arg_str0(NULL, "nrar", "", "nonce / answer writer, 8 hex bytes"), + arg_lit0(NULL, "crypto", "crypto mode"), arg_str0("k", "key", "", "key, 4 or 6 hex bytes"), - arg_str0(NULL, "nrar", "", "nonce / answer reader, 8 hex bytes"), +// currently pm3 fw reads all the memory anyway +// arg_int1("p", "page", "", "page address to write to"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); - // Hitag S - bool s01 = arg_get_lit(ctx, 1); - bool s02 = arg_get_lit(ctx, 2); + bool use_ht1 = false; // not yet implemented + bool use_hts = arg_get_lit(ctx, 1); + bool use_ht2 = arg_get_lit(ctx, 2); + bool use_htm = false; // not yet implemented - // Hitag 2 - bool h21 = arg_get_lit(ctx, 3); - bool h22 = arg_get_lit(ctx, 4); - bool h23 = arg_get_lit(ctx, 5); - bool h25 = arg_get_lit(ctx, 6); - bool h26 = arg_get_lit(ctx, 7); - - uint8_t key[6]; - int keylen = 0; - int res = CLIParamHexToBuf(arg_get_str(ctx, 8), key, sizeof(key), &keylen); + bool use_plain = false; + bool use_pwd = arg_get_lit(ctx, 3); + uint8_t nrar[8]; + int nalen = 0; + int res = CLIParamHexToBuf(arg_get_str(ctx, 4), nrar, sizeof(nrar), &nalen); if (res != 0) { CLIParserFree(ctx); return PM3_EINVARG; } + bool use_nrar = nalen > 0; + bool use_crypto = arg_get_lit(ctx, 5); - uint8_t nrar[8]; - int nalen = 0; - res = CLIParamHexToBuf(arg_get_str(ctx, 9), nrar, sizeof(nrar), &nalen); - CLIParserFree(ctx); + uint8_t key[6]; + int keylen = 0; + res = CLIParamHexToBuf(arg_get_str(ctx, 6), key, sizeof(key), &keylen); if (res != 0) { + CLIParserFree(ctx); + return PM3_EINVARG; + } +// uint32_t page = arg_get_u32_def(ctx, 6, 0); + + CLIParserFree(ctx); + + // sanity checks + if ((use_ht1 + use_ht2 + use_hts + use_htm) > 1) { + PrintAndLogEx(ERR, "error, specify only one Hitag type"); + return PM3_EINVARG; + } + if ((use_ht1 + use_ht2 + use_hts + use_htm) == 0) { + PrintAndLogEx(ERR, "error, specify one Hitag type"); return PM3_EINVARG; } - // sanity checks if (keylen != 0 && keylen != 4 && keylen != 6) { PrintAndLogEx(WARNING, "Wrong KEY len expected 0, 4 or 6, got %d", keylen); return PM3_EINVARG; @@ -594,48 +620,73 @@ static int CmdLFHitagReader(const char *Cmd) { return PM3_EINVARG; } - uint8_t foo = (s01 + s02 + h21 + h22 + h23 + h25 + h26); + // complete options + if (keylen == 4) { + use_pwd = true; + } + if (keylen == 6) { + use_crypto = true; + } + if ((keylen == 0) && use_pwd) { + memcpy(key, "MIKR", 4); + keylen = 4; + } + if ((keylen == 0) && use_crypto) { + memcpy(key, "ONMIKR", 6); + keylen = 6; + } + + // check coherence + uint8_t foo = (use_plain + use_pwd + use_nrar + use_crypto); if (foo > 1) { - PrintAndLogEx(WARNING, "Only specify one HITAG reader cmd"); + PrintAndLogEx(WARNING, "Specify only one authentication mode"); return PM3_EINVARG; } else if (foo == 0) { - PrintAndLogEx(WARNING, "Specify one HITAG reader cms"); + if (use_hts) { + use_plain = true; + } else { + PrintAndLogEx(WARNING, "Specify one authentication mode"); + return PM3_EINVARG; + } + } + + if (use_hts && use_pwd) { // not sure for the other types... + PrintAndLogEx(WARNING, "Chosen Hitag type does not have Password mode"); + return PM3_EINVARG; + } + + if (use_ht2 && use_plain) { // not sure for the other types... + PrintAndLogEx(WARNING, "Chosen Hitag type does not have Plain mode"); return PM3_EINVARG; } hitag_function htf; hitag_data htd; memset(&htd, 0, sizeof(htd)); - - - uint16_t cmd = CMD_LF_HITAG_READER; - if (s01) { + uint16_t cmd; + if (use_hts && use_nrar) { cmd = CMD_LF_HITAGS_READ; htf = RHTSF_CHALLENGE; memcpy(htd.auth.NrAr, nrar, sizeof(htd.auth.NrAr)); - } - if (s02) { + } else if (use_hts && use_crypto) { cmd = CMD_LF_HITAGS_READ; htf = RHTSF_KEY; memcpy(htd.crypto.key, key, sizeof(htd.crypto.key)); - } - if (h21) { + } else if (use_ht2 && use_pwd) { + cmd = CMD_LF_HITAG_READER; htf = RHT2F_PASSWORD; memcpy(htd.pwd.password, key, sizeof(htd.pwd.password)); - } - if (h22) { + } else if (use_ht2 && use_nrar) { + cmd = CMD_LF_HITAG_READER; htf = RHT2F_AUTHENTICATE; memcpy(htd.auth.NrAr, nrar, sizeof(htd.auth.NrAr)); - } - if (h23) { + } else if (use_ht2 && use_crypto) { htf = RHT2F_CRYPTO; + cmd = CMD_LF_HITAG_READER; memcpy(htd.crypto.key, key, sizeof(htd.crypto.key)); - } - if (h25) { - htf = RHT2F_TEST_AUTH_ATTEMPTS; - } - if (h26) { - htf = RHT2F_UID_ONLY; + } else { + PrintAndLogEx(WARNING, "Sorry, not yet implemented"); + return PM3_ENOTIMPL; } clearCommandBuffer(); @@ -653,21 +704,13 @@ static int CmdLFHitagReader(const char *Cmd) { uint32_t id = bytes_to_num(resp.data.asBytes, 4); uint8_t *data = resp.data.asBytes; PrintAndLogEx(SUCCESS, " UID: " _YELLOW_("%08x"), id); - - if (htf != RHT2F_UID_ONLY) { - - // block3, 1 byte - printHitag2Configuration(data[4 * 3]); - - // print data - print_hex_break(data, 48, 4); - - printHitag2PaxtonDowngrade(data); - } + printHitag2Configuration(data[4 * 3]); + print_hex_break(data, 48, 4); + printHitag2PaxtonDowngrade(data); return PM3_SUCCESS; } -static int CmdLFHitagCheckChallenges(const char *Cmd) { +static int CmdLFHitagSCheckChallenges(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf hitag cc", @@ -708,92 +751,169 @@ static int CmdLFHitagCheckChallenges(const char *Cmd) { return PM3_SUCCESS; } +static int CmdLFHitag2CheckChallenges(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "lf hitag ta", + "Test recorded authentications (replay?)", + "lf hitag ta" + ); + + clearCommandBuffer(); + SendCommandMIX(CMD_LF_HITAG_READER, RHT2F_TEST_AUTH_ATTEMPTS, 0, 0, NULL, 0); + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_ACK, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply."); + return PM3_ETIMEOUT; + } + if (resp.oldarg[0] == false) { + PrintAndLogEx(DEBUG, "DEBUG: Error - hitag failed"); + return PM3_ESOFT; + } + + // FIXME: doegox: not sure what this fct does and what it returns... + return PM3_SUCCESS; +} + + static int CmdLFHitagWriter(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "lf hitag writer", - "Act like a Hitag writer" - "In password mode the default key is 4D494B52 (MIKR)\n" - "In crypto mode the default key is 4F4E4D494B52 (ONMIKR) format: ISK high + ISK low.", - "Hitag S\n" - " lf hitag writer --03 --nrar 0102030411223344 -p 3 -d 01020304\n" - " lf hitag writer --04 -k 4F4E4D494B52 -p 3 -d 01020304\n" - "Hitag 2\n" - " lf hitag writer --24 -k 4F4E4D494B52 -p 3 -d 01020304\n" - " lf hitag writer --27 -k 4D494B52 -p 3 -d 01020304\n" + CLIParserInit(&ctx, "lf hitag wrbl", + "Write a page in Hitag memory\n" + "Crypto mode key format: ISK high + ISK low", + "Hitag S, plain mode\n" + " lf hitag wrbl --hts -p 6 -d 01020304\n" + "Hitag S, challenge mode\n" + " lf hitag wrbl --hts --nrar 0102030411223344 -p 6 -d 01020304\n" + "Hitag S, crypto mode => use default key 4F4E4D494B52 (ONMIKR)\n" + " lf hitag wrbl --hts --crypto -p 6 -d 01020304\n" + "Hitag S, long key = crypto mode\n" + " lf hitag wrbl --hts -k 4F4E4D494B52 -p 6 -d 01020304\n\n" + + "Hitag 2, password mode => use default key 4D494B52 (MIKR)\n" + " lf hitag wrbl --ht2 --pwd -p 6 -d 01020304\n" + "Hitag 2, providing a short key = password mode\n" + " lf hitag wrbl --ht2 -k 4D494B52 -p 6 -d 01020304\n" + "Hitag 2, challenge mode\n" + " lf hitag wrbl --ht2 --nrar 0102030411223344 -p 6 -d 01020304\n" + "Hitag 2, crypto mode => use default key 4F4E4D494B52 (ONMIKR)\n" + " lf hitag wrbl --ht2 --crypto -p 6 -d 01020304\n" + "Hitag 2, providing a long key = crypto mode\n" + " lf hitag wrbl --ht2 -k 4F4E4D494B52 -p 6 -d 01020304\n" ); void *argtable[] = { arg_param_begin, - arg_lit0(NULL, "03", "HitagS, write page, challenge mode"), - arg_lit0(NULL, "04", "HitagS, write page, crypto mode. Set key=0 for no auth"), - arg_lit0(NULL, "24", "Hitag2, write page, crypto mode."), - arg_lit0(NULL, "27", "Hitag2, write page, password mode"), - arg_int1("p", "page", "", "page address to write to"), - arg_str0("d", "data", "", "data, 4 hex bytes"), - arg_str0("k", "key", "", "key, 4 or 6 hex bytes"), + arg_lit0(NULL, "hts", "Hitag S"), + arg_lit0(NULL, "ht2", "Hitag 2"), + arg_lit0(NULL, "pwd", "password mode"), arg_str0(NULL, "nrar", "", "nonce / answer writer, 8 hex bytes"), + arg_lit0(NULL, "crypto", "crypto mode"), + arg_str0("k", "key", "", "key, 4 or 6 hex bytes"), + arg_int1("p", "page", "", "page address to write to"), + arg_str1("d", "data", "", "data, 4 hex bytes"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); - // Hitag S - bool s03 = arg_get_lit(ctx, 1); - bool s04 = arg_get_lit(ctx, 2); + bool use_ht1 = false; // not yet implemented + bool use_hts = arg_get_lit(ctx, 1); + bool use_ht2 = arg_get_lit(ctx, 2); + bool use_htm = false; // not yet implemented - // Hitag 2 - bool h24 = arg_get_lit(ctx, 3); - bool h27 = arg_get_lit(ctx, 4); - - uint32_t page = arg_get_u32_def(ctx, 5, 0); - - uint8_t data[4]; - int dlen = 0; - int res = CLIParamHexToBuf(arg_get_str(ctx, 6), data, sizeof(data), &dlen); + bool use_plain = false; + bool use_pwd = arg_get_lit(ctx, 3); + uint8_t nrar[8]; + int nalen = 0; + int res = CLIParamHexToBuf(arg_get_str(ctx, 4), nrar, sizeof(nrar), &nalen); if (res != 0) { CLIParserFree(ctx); return PM3_EINVARG; } + bool use_nrar = nalen > 0; + bool use_crypto = arg_get_lit(ctx, 5); uint8_t key[6]; int keylen = 0; - res = CLIParamHexToBuf(arg_get_str(ctx, 7), key, sizeof(key), &keylen); + res = CLIParamHexToBuf(arg_get_str(ctx, 6), key, sizeof(key), &keylen); if (res != 0) { CLIParserFree(ctx); return PM3_EINVARG; } - uint8_t nrar[8]; - int nalen = 0; - res = CLIParamHexToBuf(arg_get_str(ctx, 8), nrar, sizeof(nrar), &nalen); + uint32_t page = arg_get_u32_def(ctx, 7, 0); + + uint8_t data[4]; + int dlen = 0; + res = CLIParamHexToBuf(arg_get_str(ctx, 8), data, sizeof(data), &dlen); + if (res != 0) { + CLIParserFree(ctx); + return PM3_EINVARG; + } CLIParserFree(ctx); - if (res != 0) { + // sanity checks + if ((use_ht1 + use_ht2 + use_hts + use_htm) > 1) { + PrintAndLogEx(ERR, "error, specify only one Hitag type"); + return PM3_EINVARG; + } + if ((use_ht1 + use_ht2 + use_hts + use_htm) == 0) { + PrintAndLogEx(ERR, "error, specify one Hitag type"); + return PM3_EINVARG; + } + + if (keylen != 0 && keylen != 4 && keylen != 6) { + PrintAndLogEx(WARNING, "Wrong KEY len expected 0, 4 or 6, got %d", keylen); return PM3_EINVARG; } - // sanity checks if (dlen != sizeof(data)) { PrintAndLogEx(WARNING, "Wrong DATA len expected 4, got %d", dlen); return PM3_EINVARG; } - if (keylen != 0 && keylen != 6 && keylen != 4) { - PrintAndLogEx(WARNING, "Wrong KEY len expected 0, 4 or 6, got %d", keylen); - return PM3_EINVARG; - } - if (nalen != 0 && nalen != 8) { PrintAndLogEx(WARNING, "Wrong NR/AR len expected 0 or 8, got %d", nalen); return PM3_EINVARG; } - uint8_t foo = (s03 + s04 + h24 + h27); + // complete options + if (keylen == 4) { + use_pwd = true; + } + if (keylen == 6) { + use_crypto = true; + } + if ((keylen == 0) && use_pwd) { + memcpy(key, "MIKR", 4); + keylen = 4; + } + if ((keylen == 0) && use_crypto) { + memcpy(key, "ONMIKR", 6); + keylen = 6; + } + + // check coherence + uint8_t foo = (use_plain + use_pwd + use_nrar + use_crypto); if (foo > 1) { - PrintAndLogEx(WARNING, "Only specify one HITAG write cmd"); + PrintAndLogEx(WARNING, "Specify only one authentication mode"); return PM3_EINVARG; } else if (foo == 0) { - PrintAndLogEx(WARNING, "Specify one HITAG write cmd"); + if (use_hts) { + use_plain = true; + } else { + PrintAndLogEx(WARNING, "Specify one authentication mode"); + return PM3_EINVARG; + } + } + + if (use_hts && use_pwd) { // not sure for the other types... + PrintAndLogEx(WARNING, "Chosen Hitag type does not have Password mode"); + return PM3_EINVARG; + } + + if (use_ht2 && use_plain) { // not sure for the other types... + PrintAndLogEx(WARNING, "Chosen Hitag type does not have Plain mode"); return PM3_EINVARG; } @@ -801,29 +921,33 @@ static int CmdLFHitagWriter(const char *Cmd) { hitag_data htd; memset(&htd, 0, sizeof(htd)); - if (s03) { + if (use_hts && use_nrar) { htf = WHTSF_CHALLENGE; memcpy(htd.auth.NrAr, nrar, sizeof(htd.auth.NrAr)); memcpy(htd.auth.data, data, sizeof(data)); - } - if (s04) { + PrintAndLogEx(INFO, "Authenticating to Hitag S in Challenge mode"); + } else if (use_hts && use_crypto) { htf = WHTSF_KEY; memcpy(htd.crypto.key, key, sizeof(htd.crypto.key)); memcpy(htd.crypto.data, data, sizeof(data)); - } - if (h24) { - htf = WHT2F_CRYPTO; - memcpy(htd.crypto.key, key, sizeof(htd.crypto.key)); - memcpy(htd.crypto.data, data, sizeof(data)); - } - if (h27) { + PrintAndLogEx(INFO, "Authenticating to Hitag S in Crypto mode"); + } else if (use_ht2 && use_pwd) { htf = WHT2F_PASSWORD; memcpy(htd.pwd.password, key, sizeof(htd.pwd.password)); memcpy(htd.crypto.data, data, sizeof(data)); + PrintAndLogEx(INFO, "Authenticating to Hitag 2 in Password mode"); + } else if (use_ht2 && use_crypto) { + htf = WHT2F_CRYPTO; + memcpy(htd.crypto.key, key, sizeof(htd.crypto.key)); + memcpy(htd.crypto.data, data, sizeof(data)); + PrintAndLogEx(INFO, "Authenticating to Hitag 2 in Crypto mode"); + } else { + PrintAndLogEx(WARNING, "Sorry, not yet implemented"); + return PM3_ENOTIMPL; } - + uint16_t cmd = CMD_LF_HITAGS_WRITE; clearCommandBuffer(); - SendCommandMIX(CMD_LF_HITAGS_WRITE, htf, 0, page, &htd, sizeof(htd)); + SendCommandMIX(cmd, htf, 0, page, &htd, sizeof(htd)); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 4000) == false) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); @@ -841,56 +965,132 @@ static int CmdLFHitag2Dump(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf hitag dump", - "Read all card memory and save to file" - "In password mode the default key is 4D494B52 (MIKR)\n" - "In crypto mode the default key is 4F4E4D494B52 (ONMIKR) format: ISK high + ISK low.", - "lf hitag dump -k 4F4E4D494B52\n" - "lf hitag dump -k 4D494B52\n" + "Read all Hitag 2 card memory and save to file\n" + "Crypto mode key format: ISK high + ISK low", + "Password mode => use default key 4D494B52 (MIKR)\n" + " lf hitag dump --pwd\n" + "Short key = password mode\n" + " lf hitag dump -k 4D494B52\n" + "Challenge mode\n" + " lf hitag dump --nrar 0102030411223344\n" + "Crypto mode => use default key 4F4E4D494B52 (ONMIKR)\n" + " lf hitag dump --crypto\n" + "Long key = crypto mode\n" + " lf hitag dump -k 4F4E4D494B52\n" ); void *argtable[] = { arg_param_begin, - arg_str0("f", "file", "", "specify file name"), - arg_str0("k", "key", "", "key, 4 or 6 hex bytes"), + arg_lit0(NULL, "pwd", "password mode"), arg_str0(NULL, "nrar", "", "nonce / answer reader, 8 hex bytes"), + arg_lit0(NULL, "crypto", "crypto mode"), + arg_str0("k", "key", "", "key, 4 or 6 hex bytes"), + arg_str0("f", "file", "", "specify file name"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); - int fnlen = 0; - char filename[FILE_PATH_SIZE] = {0}; - CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); + bool use_ht1 = false; // not yet implemented + bool use_hts = false; // not yet implemented + bool use_ht2 = true; + bool use_htm = false; // not yet implemented + + bool use_plain = false; + bool use_pwd = arg_get_lit(ctx, 1); + uint8_t nrar[8]; + int nalen = 0; + int res = CLIParamHexToBuf(arg_get_str(ctx, 2), nrar, sizeof(nrar), &nalen); + if (res != 0) { + CLIParserFree(ctx); + return PM3_EINVARG; + } + bool use_nrar = nalen > 0; + bool use_crypto = arg_get_lit(ctx, 3); uint8_t key[6]; int keylen = 0; - int res = CLIParamHexToBuf(arg_get_str(ctx, 2), key, sizeof(key), &keylen); + res = CLIParamHexToBuf(arg_get_str(ctx, 4), key, sizeof(key), &keylen); if (res != 0) { CLIParserFree(ctx); return PM3_EINVARG; } - uint8_t nrar[8]; - int nalen = 0; - res = CLIParamHexToBuf(arg_get_str(ctx, 3), nrar, sizeof(nrar), &nalen); + int fnlen = 0; + char filename[FILE_PATH_SIZE] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 5), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); + CLIParserFree(ctx); - if (res != 0) { + + // sanity checks + if ((use_ht1 + use_ht2 + use_hts + use_htm) > 1) { + PrintAndLogEx(ERR, "error, specify only one Hitag type"); + return PM3_EINVARG; + } + if ((use_ht1 + use_ht2 + use_hts + use_htm) == 0) { + PrintAndLogEx(ERR, "error, specify one Hitag type"); + return PM3_EINVARG; + } + + if (keylen != 0 && keylen != 4 && keylen != 6) { + PrintAndLogEx(WARNING, "Wrong KEY len expected 0, 4 or 6, got %d", keylen); + return PM3_EINVARG; + } + + // complete options + if (keylen == 4) { + use_pwd = true; + } + if (keylen == 6) { + use_crypto = true; + } + if ((keylen == 0) && use_pwd) { + memcpy(key, "MIKR", 4); + keylen = 4; + } + if ((keylen == 0) && use_crypto) { + memcpy(key, "ONMIKR", 6); + keylen = 6; + } + + // check coherence + uint8_t foo = (use_plain + use_pwd + use_nrar + use_crypto); + if (foo > 1) { + PrintAndLogEx(WARNING, "Specify only one authentication mode"); + return PM3_EINVARG; + } else if (foo == 0) { + if (use_hts) { + use_plain = true; + } else { + PrintAndLogEx(WARNING, "Specify one authentication mode"); + return PM3_EINVARG; + } + } + + if (use_hts && use_pwd) { // not sure for the other types... + PrintAndLogEx(WARNING, "Chosen Hitag type does not have Password mode"); + return PM3_EINVARG; + } + + if (use_ht2 && use_plain) { // not sure for the other types... + PrintAndLogEx(WARNING, "Chosen Hitag type does not have Plain mode"); return PM3_EINVARG; } hitag_function htf; hitag_data htd; memset(&htd, 0, sizeof(htd)); - - if (keylen == 6) { - htf = RHT2F_CRYPTO; - memcpy(htd.crypto.key, key, sizeof(htd.crypto.key)); - PrintAndLogEx(INFO, "Authenticating in crypto mode"); - } else { + if (use_ht2 && use_pwd) { htf = RHT2F_PASSWORD; memcpy(htd.pwd.password, key, sizeof(htd.pwd.password)); - PrintAndLogEx(INFO, "Authenticating in password mode"); + PrintAndLogEx(INFO, "Authenticating to Hitag 2 in Password mode"); + } else if (use_ht2 && use_crypto) { + htf = RHT2F_CRYPTO; + memcpy(htd.crypto.key, key, sizeof(htd.crypto.key)); + PrintAndLogEx(INFO, "Authenticating to Hitag 2 in Crypto mode"); + } else { + PrintAndLogEx(WARNING, "Sorry, not yet implemented"); + return PM3_ENOTIMPL; } - uint16_t cmd = CMD_LF_HITAG_READER; clearCommandBuffer(); SendCommandMIX(cmd, htf, 0, 0, &htd, sizeof(htd)); @@ -909,7 +1109,8 @@ static int CmdLFHitag2Dump(const char *Cmd) { if (data == NULL) return PM3_ESOFT; - PrintAndLogEx(SUCCESS, "Dumping tag memory..."); + uint32_t id = bytes_to_num(resp.data.asBytes, 4); + PrintAndLogEx(SUCCESS, " UID: " _YELLOW_("%08x"), id); if (fnlen < 1) { char *fptr = filename; @@ -917,8 +1118,16 @@ static int CmdLFHitag2Dump(const char *Cmd) { FillFileNameByUID(fptr, data, "-dump", 4); } + // block3, 1 byte + printHitag2Configuration(data[4 * 3]); + + // print data print_hex_break(data, 48, 4); + printHitag2PaxtonDowngrade(data); + + PrintAndLogEx(SUCCESS, "Dumping tag memory..."); + pm3_save_dump(filename, data, 48, jsfHitag, 4); return PM3_SUCCESS; } @@ -982,16 +1191,20 @@ void annotateHitagS(char *exp, size_t size, const uint8_t *cmd, uint8_t cmdsize, } static command_t CommandTable[] = { + {"-----------", CmdHelp, IfPm3Hitag, "------------------------ " _CYAN_("General") " ------------------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, - {"eload", CmdLFHitagEload, IfPm3Hitag, "Load Hitag dump file into emulator memory"}, {"list", CmdLFHitagList, AlwaysAvailable, "List Hitag trace history"}, - {"info", CmdLFHitagInfo, IfPm3Hitag, "Hitag2 tag information"}, - {"reader", CmdLFHitagReader, IfPm3Hitag, "Act like a Hitag reader"}, - {"sim", CmdLFHitagSim, IfPm3Hitag, "Simulate Hitag transponder"}, + {"-----------", CmdHelp, IfPm3Hitag, "----------------------- " _CYAN_("operations") " -----------------------"}, + {"info", CmdLFHitagInfo, IfPm3Hitag, "Hitag 2 tag information"}, + {"dump", CmdLFHitag2Dump, IfPm3Hitag, "Dump Hitag 2 tag"}, + {"read", CmdLFHitagReader, IfPm3Hitag, "Read Hitag memory"}, + {"wrbl", CmdLFHitagWriter, IfPm3Hitag, "Write a block (page) in Hitag memory"}, {"sniff", CmdLFHitagSniff, IfPm3Hitag, "Eavesdrop Hitag communication"}, - {"writer", CmdLFHitagWriter, IfPm3Hitag, "Act like a Hitag writer"}, - {"dump", CmdLFHitag2Dump, IfPm3Hitag, "Dump Hitag2 tag"}, - {"cc", CmdLFHitagCheckChallenges, IfPm3Hitag, "Test all challenges"}, + {"cc", CmdLFHitagSCheckChallenges, IfPm3Hitag, "Hitag S: test all provided challenges"}, + {"ta", CmdLFHitag2CheckChallenges, IfPm3Hitag, "Hitag 2: test all recorded authentications"}, + {"-----------", CmdHelp, IfPm3Hitag, "----------------------- " _CYAN_("simulation") " -----------------------"}, + {"eload", CmdLFHitagEload, IfPm3Hitag, "Load Hitag dump file into emulator memory"}, + {"sim", CmdLFHitagSim, IfPm3Hitag, "Simulate Hitag transponder"}, { NULL, NULL, 0, NULL } }; From dac7721cffe572361c4e6402e74f6f57e8ae785d Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 21 Jul 2023 01:31:09 +0200 Subject: [PATCH 687/924] hitag: coherence in hitag type options --- client/src/cmdlfhitag.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 74c77b8f9..9fd87b485 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -225,10 +225,10 @@ static int CmdLFHitagEload(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_str1("f", "file", "", "Specify dump filename"), - arg_lit0("1", NULL, "Card type Hitag 1"), - arg_lit0("2", NULL, "Card type Hitag 2"), - arg_lit0("s", NULL, "Card type Hitag S"), - arg_lit0("m", NULL, "Card type Hitag M"), + arg_lit0("1", "ht1", "Card type Hitag 1"), + arg_lit0("2", "ht2", "Card type Hitag 2"), + arg_lit0("s", "hts", "Card type Hitag S"), + arg_lit0("m", "htm", "Card type Hitag μ"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -560,8 +560,8 @@ static int CmdLFHitagReader(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0(NULL, "hts", "Hitag S"), - arg_lit0(NULL, "ht2", "Hitag 2"), + arg_lit0("s", "hts", "Hitag S"), + arg_lit0("2", "ht2", "Hitag 2"), arg_lit0(NULL, "pwd", "password mode"), arg_str0(NULL, "nrar", "", "nonce / answer writer, 8 hex bytes"), arg_lit0(NULL, "crypto", "crypto mode"), @@ -803,8 +803,8 @@ static int CmdLFHitagWriter(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0(NULL, "hts", "Hitag S"), - arg_lit0(NULL, "ht2", "Hitag 2"), + arg_lit0("s", "hts", "Hitag S"), + arg_lit0("2", "ht2", "Hitag 2"), arg_lit0(NULL, "pwd", "password mode"), arg_str0(NULL, "nrar", "", "nonce / answer writer, 8 hex bytes"), arg_lit0(NULL, "crypto", "crypto mode"), From a556434f3f0dd39e21c509c328424d8149b5fe8a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 06:21:59 +0200 Subject: [PATCH 688/924] style --- client/src/cmdhfmf.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 970c63004..06b7c8a18 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -7034,8 +7034,14 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { // --------------- CHANGE UID ---------------- uint8_t aCHANGE[] = {0x00, 0xa6, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00}; memcpy(aCHANGE + 5, uid, uidlen); - res = ExchangeAPDU14a(aCHANGE, sizeof(aCHANGE), activate_field, keep_field_on, response, sizeof(response), - &resplen); + res = ExchangeAPDU14a( + aCHANGE, sizeof(aCHANGE), + activate_field, + keep_field_on, + response, sizeof(response), + &resplen + ); + if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Super card UID change [ " _RED_("fail") " ]"); DropField(); @@ -7054,8 +7060,14 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { // --------------- RESET CARD ---------------- uint8_t aRESET[] = {0x00, 0xa6, 0xc0, 0x00}; - res = ExchangeAPDU14a(aRESET, sizeof(aRESET), activate_field, keep_field_on, response, sizeof(response), - &resplen); + res = ExchangeAPDU14a( + aRESET, sizeof(aRESET), + activate_field, + keep_field_on, + response, sizeof(response), + &resplen + ); + if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Super card reset [ " _RED_("fail") " ]"); DropField(); @@ -7144,7 +7156,12 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { uint64_t key64 = -1; if (mfkey32_moebius(&data, &key64)) { - PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%012" PRIX64) " ]", sprint_hex_inrow(outA, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%012" PRIX64) " ]", + sprint_hex_inrow(outA, 4), + data.sector, + (data.keytype == 0x60) ? 'A' : 'B', + key64 + ); } else { PrintAndLogEx(FAILED, "failed to recover any key"); } From 154d454f231bfe4293778a476f4c920ecb62e7e7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 06:23:53 +0200 Subject: [PATCH 689/924] style --- client/src/cmdhf14a.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 21ad70be7..e6e0a20e8 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -605,7 +605,7 @@ static int CmdHF14AReader(const char *Cmd) { } else { PrintAndLogEx(SUCCESS, "ATQA: %02X %02X", card.atqa[1], card.atqa[0]); } - + PrintAndLogEx(NORMAL, ""); } DropField(); res = PM3_ESOFT; @@ -623,6 +623,7 @@ static int CmdHF14AReader(const char *Cmd) { PrintAndLogEx(SUCCESS, " ATS: [%d] " _GREEN_("%s"), card.ats_len, sprint_hex(card.ats, card.ats_len)); } } + PrintAndLogEx(NORMAL, ""); } if (!disconnectAfter) { if (!silent) PrintAndLogEx(SUCCESS, "Card is selected. You can now start sending commands"); @@ -903,6 +904,7 @@ int CmdHF14ASniff(const char *Cmd) { } int ExchangeRAW14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, bool silentMode) { + uint16_t cmdc = 0; *dataoutlen = 0; From 09bd5c7bcdea6642196a34ff0c5ff911712a6247 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 06:27:02 +0200 Subject: [PATCH 690/924] prep for a asn1 selftest check --- client/src/cmddata.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 032d31f85..2492161cf 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -2911,14 +2911,19 @@ static int CmdAsn1Decoder(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_str1("d", NULL, "", "ASN1 encoded byte array"), + arg_str0("d", NULL, "", "ASN1 encoded byte array"), + arg_lit0("t", "test", "perform selftest"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); int dlen = 2048; uint8_t data[2048]; CLIGetHexWithReturn(ctx, 1, data, &dlen); + bool selftest = arg_get_lit(ctx, 2); CLIParserFree(ctx); + if (selftest) { +// return asn1_selftest(); + } // print ASN1 decoded array in TLV view PrintAndLogEx(INFO, "---------------- " _CYAN_("ASN1 TLV") " -----------------"); From ba6d48dec8a2677b9d6b367c75ffec9134247474 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 06:27:41 +0200 Subject: [PATCH 691/924] include --- client/src/cmdlfcotag.h | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdlfcotag.h b/client/src/cmdlfcotag.h index 9577dabdb..11f0b28ce 100644 --- a/client/src/cmdlfcotag.h +++ b/client/src/cmdlfcotag.h @@ -20,6 +20,7 @@ #define CMDLFCOTAG_H__ #include "common.h" +#include #ifndef COTAG_BITS #define COTAG_BITS 264 From 89e6f88522d359d61bab90cbb6381634b1a527c2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 06:40:26 +0200 Subject: [PATCH 692/924] add asn1 selftest batch --- client/src/cmddata.c | 2 +- client/src/crypto/asn1utils.c | 151 +++++++++++++++++++++++++++++++++- client/src/crypto/asn1utils.h | 1 + 3 files changed, 150 insertions(+), 4 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 2492161cf..78f31c988 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -2922,7 +2922,7 @@ static int CmdAsn1Decoder(const char *Cmd) { bool selftest = arg_get_lit(ctx, 2); CLIParserFree(ctx); if (selftest) { -// return asn1_selftest(); + return asn1_selftest(); } // print ASN1 decoded array in TLV view diff --git a/client/src/crypto/asn1utils.c b/client/src/crypto/asn1utils.c index 4618c5028..34b9a8e80 100644 --- a/client/src/crypto/asn1utils.c +++ b/client/src/crypto/asn1utils.c @@ -20,8 +20,9 @@ #include #include #include -#include // memcpy -#include "ui.h" // Print... +#include // memcpy +#include "ui.h" // Print... +#include "commonutil.h" // ARRAYLEN #include "emv/tlv.h" #include "asn1dump.h" #include "util.h" @@ -103,8 +104,152 @@ int asn1_print(uint8_t *asn1buf, size_t asn1buflen, const char *indent) { PrintAndLogEx(ERR, "Can't parse data as TLV tree"); return PM3_ESOFT; } - return PM3_SUCCESS; } +typedef struct { + const char *hex; + const char *expected; + const char *desc; +} asn1_test; + +int asn1_selftest(void) { + + PrintAndLogEx(INFO, "to be implemented. Feel free to contribute!"); + + /* + + ICEMAN: + Problem to be solved, how to extract data back from our asn1 decoder to compare with the expected text found in the following test cases. + Thanks @Mistial for the suggestion and links. + + These test cases are from the project lapo-luchini's asn1js (ISC license which is like MIT license) + https://github.com/lapo-luchini/asn1js/blob/trunk/test.js + + + const asn1_test tests[] = { + // RSA Laboratories technical notes from https://luca.ntop.org/Teaching/Appunti/asn1.html + {"0304066E5DC0", "(18 bit)\n011011100101110111", "ntop, bit string: DER encoding"}, + {"0304066E5DE0", "(18 bit)\n011011100101110111", "ntop, bit string: padded with `100000`"}, + {"038104066E5DC0", "(18 bit)\n011011100101110111", "ntop, bit string: long form of length octets"}, + {"23090303006E5D030206C0", "(18 bit)\n011011100101110111", "ntop, bit string (constructed encoding): `0110111001011101` + `11`"}, + {"160D7465737431407273612E636F6D", "test1@rsa.com", "ntop, ia5string: DER encoding"}, + {"16810D7465737431407273612E636F6D", "test1@rsa.com", "ntop, ia5string: long form of length octets"}, + {"36131605746573743116014016077273612E636F6D", "test1@rsa.com", "ntop, ia5string: constructed encoding: `test1` + `@` + `rsa.com`"}, + {"020100", "0", "ntop, integer: 0"}, + {"02017F", "127", "ntop, integer: 127"}, + {"02020080", "128", "ntop, integer: 128"}, + {"02020100", "256", "ntop, integer: 256"}, + {"020180", "-128", "ntop, integer: -128"}, + {"0202FF7F", "-129", "ntop, integer: -129"}, + {"0500", "", "ntop, null: DER"}, + {"058100", "", "ntop, null: long form of length octets"}, + {"06062A864886F70D", "1.2.840.113549", "ntop, object identifier"}, + {"04080123456789ABCDEF", "(8 byte)\n0123456789ABCDEF", "ntop, octet string: DER encoding"}, + {"0481080123456789ABCDEF", "(8 byte)\n0123456789ABCDEF", "ntop, octet string: long form of length octets"}, + {"240C040401234567040489ABCDEF", "(8 byte)\n0123456789ABCDEF", "ntop, octet string (constructed encoding): 01…67 + 89…ef"}, + {"130B5465737420557365722031", "Test User 1", "ntop, printable string: DER encoding"}, + {"13810B5465737420557365722031", "Test User 1", "ntop, printable string: long form of length octets"}, + {"330F130554657374201306557365722031", "Test User 1", "ntop, printable string: constructed encoding: `Test ` + `User 1`"}, + {"140F636CC26573207075626C6971756573", "clés publiques", "ntop, t61string: DER encoding"}, + {"14810F636CC26573207075626C6971756573", "clés publiques", "ntop, t61string: long form of length octets"}, + {"34151405636CC2657314012014097075626C6971756573", "clés publiques", "ntop, t61string: constructed encoding: `clés` + ` ` + `publiques`"}, + {"170D3931303530363233343534305A", "1991-05-06 23:45:40 UTC", "ntop, utc time: UTC"}, + {"17113931303530363136343534302D30373030", "1991-05-06 16:45:40 UTC-07:00", "ntop, utc time: PDT"}, + // inspired by http://luca.ntop.org/Teaching/Appunti/asn1.html + {"0304086E5DC0", "Exception:\nInvalid BitString with unusedBits=8", "bit string: invalid unusedBits"}, + // http://msdn.microsoft.com/en-us/library/windows/desktop/aa379076(v=vs.85).aspx + {"30820319308202820201003023310F300D0603550403130654657374434E3110300E060355040A1307546573744F726730819F300D06092A864886F70D010101050003818D00308189028181008FE2412A08E851A88CB3E853E7D54950B3278A2BCBEAB54273EA0257CC6533EE882061A11756C12418E3A808D3BED931F3370B94B8CC43080B7024F79CB18D5DD66D82D0540984F89F970175059C89D4D5C91EC913D72A6B309119D6D442E0C49D7C9271E1B22F5C8DEEF0F1171ED25F315BB19CBC2055BF3A37424575DC90650203010001A08201B4301A060A2B0601040182370D0203310C160A362E302E353336312E323042060A2B0601040182370D0201313430321E260043006500720074006900660069006300610074006500540065006D0070006C0061007400651E080055007300650072305706092B0601040182371514314A30480201090C237669636833642E6A646F6D6373632E6E74746573742E6D6963726F736F66742E636F6D0C154A444F4D4353435C61646D696E6973747261746F720C07636572747265713074060A2B0601040182370D0202316630640201011E5C004D006900630072006F0073006F0066007400200045006E00680061006E006300650064002000430072007900700074006F0067007200610070006800690063002000500072006F00760069006400650072002000760031002E003003010030818206092A864886F70D01090E31753073301706092B0601040182371402040A1E08005500730065007230290603551D2504223020060A2B0601040182370A030406082B0601050507030406082B06010505070302300E0603551D0F0101FF0404030205A0301D0603551D0E041604143C0F73DAF8EF41D83AEABE922A5D2C966A7B9454300D06092A864886F70D01010505000381810047EB995ADF9E700DFBA73132C15F5C24C2E0BFC624AF15660EB86A2EAB2BC4971FE3CBDC63A525ECC7B428616636A1311BBFDDD0FCBF1794901DE55EC7115EC9559FEBA33E14C799A6CBBAA1460F39D444C4C84B760E205D6DA9349ED4D58742EB2426511490B40F065E5288327A9520A0FDF7E57D60DD72689BF57B058F6D1E", + "(3 elem)", "PKCS#10 request"}, + // Int10 + {"02102FA176B36EE9F049F444B40099661945", "(126 bit)\n63312083136615639753586560173617846597", "Big integer (126 bit)"}, + {"028181008953097086EE6147C5F4D5FFAF1B498A3D11EC5518E964DC52126B2614F743883F64CA51377ABB530DFD20464A48BD67CD27E7B29AEC685C5D10825E605C056E4AB8EEA460FA27E55AA62C498B02D7247A249838A12ECDF37C6011CF4F0EDEA9CEE687C1CB4A51C6AE62B2EFDB000723A01C99D6C23F834880BA8B42D5414E6F", + "(1024 bit)\n96432446964907009840023644401994013457468837455140331578268642517697945390319089463541388080569398374873228752921897678940332050406994011437231634303608704223145390228074087922901239478374991949372306413157758278029522534299413919735715864599284769202556071242381348472464716517735026291259010477833523908207", + "Big integer (1024 bit)"}, + {"02820201009BA9ABBF614A97AF2F97669A745FD0D996FDCFE2E466EF1F1F4733C244A3DF9ADE1FB554DD157C6935116FBBC80C8E6A181ED88FD916BC1048365CF063B3905A5C2437D7A3D6CB0971B9F1017284B07DDB4D80CDFCD36FC9F8DAB60E82D24585A81B68A83DE8F4446CBDA1C2CB03BE8C3E130084DF4A48C0E3220AE8E937A7184CB1090D23567F044DD9178418A5C8DA409473EBCE0E573C03813A9D0AA1574369AC576D799078E5B5B43BD8BC4C8D28A1A7A3A7BA024E25D12AAEEDAE0322B86B200F302854957FE0EECE0A669DD1402D6E22AF9D1AC10519D26FC0F29FF87BB30242FB50A91D2D930F23ABC6C10F92FFD0A215F55309711CFF451384E6265EF8E0881C0AFC16B6A87306B8F0638402A0C65AECE774DF70AEA38325EAD6C7978793A7C68A8A33976037103E973E6E2915D6A10FD1882C129F6FAAA4C642EB41A2E39543D301856D8EBB3BF32336C7FE3BE0A1250748ABC98974FF088F80BFC09665F3EEEC4B68BD9D88C331B340F1E8CFF638BB9CE4D17FD4E5589B7CFAD4F30E9B7591E4BA522E197ED1F5CD5A19FCBA06F6FB52A84B9904DDF8F9B48B50A34E6289F08724FA8342C187FAD52D292A5A717A646AD72760630DDBCE49F58D1F90893217F87343B8D25A938661D6E1750AEA796676884F71EB0425D60A5A7A93E5B94B17400FB1B6B9F5DE4FDCE0B3AC3B117060844A436E9920C029710AC065", + "(4096 bit)\n635048724432704421127930570668665246853305382538324205739741643121831497295424070220821366244137115920753022123888627038218427491681054376713237422498116573180444839575827154645186734602336866679804832661256616738257119870932328599495025506292424741581222812593482590762754785441060866630543522468678295806775919446210955958208696766307578451905771148370694894591388931494246786732600822191966681852303750991082312180670980233382216493445574638820565887523903118457551295241540793541306271618874366356869335229283992012581380459991160410157116077111142487644315609688092841697874946124416376553323373756926990721842430477982958383467149331238064901788481621489266725616974850293388387825359434286033332681714766010619113405542747712973535303497912234899589502990216128180823653963322406352206636893824027962569732222882297210841939793442415179615290739900774082858983244011679281115202763730964934473392333219986431517733237277686866318351054204026883453068392486990840498271719737813876367239342153571643327128417739316281558041652406500713712661305061745568036561978158652008943224271511931676512028205883718704503533046383542018858616087454820845906934069146870330990447993387221061968484774662499598623702280426558025111180066917", + "Big integer (4096 bit)"}, + {"0202007F", "127", "Padded 127"}, + {"0202FF7F", "-129", "Negative 129"}, + {"0202FC18", "-1000", "Negative 1000 (2)"}, + {"0204FFFFFC18", "-1000", "Negative 1000 (4)"}, + {"0208FFFFFFFFFFFFFC18", "-1000", "Negative 1000 (8)"}, + {"0210FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC18", "-1000", "Negative 1000 (16)"}, + {"0203800001", "-8388607", "Negative 8388607"}, + {"02020000", "0", "Zero (2)"}, + {"0204FFFFFFFF", "-1", "Negative 1 (4)"}, + // OID + {"060C69C7C79AB78084C289F9870D", "2.25.84478768945400492475277", "Big OID arc"}, + {"06146982968D8D889BCCA8C7B3BDD4C080AAAED78A1B", "2.25.184830721219540099336690027854602552603", "Bigger OID arc"}, + {"060488378952", "2.999.1234", "OID arc > 2.47"}, + {"060782A384F3CAC00A", "2.9999999999930", "OID with Int10 corner case (1)"}, + {"060881E3AFEAA69A800A", "2.999999999999930", "OID with Int10 corner case (2)"}, + {"06092A864886F70D010105", "1.2.840.113549.1.1.5\nsha1WithRSAEncryption\nPKCS #1", "known OID from Peter Gutmann list"}, + // OID corner case from https://misc.daniel-marschall.de/asn.1/oid-sizecheck/oid_size_test.txt + {"060A81FFFFFFFFFFFFFFFF7F", "2.18446744073709551535", "OID root 64 bit - 1"}, + {"060A82808080808080808000", "2.18446744073709551536", "OID root 64 bit"}, + {"060A82808080808080808001", "2.18446744073709551537", "OID root 64 bit + 1"}, + {"0620FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F", "2.26959946667150639794667015087019630673637144422540572481103610249135", "OID derLen20c"}, + {"0621818080808080808080808080808080808080808080808080808080808080808000", "2.26959946667150639794667015087019630673637144422540572481103610249136", "OID derLen21c"}, + // relative OID + {"0D0A0102030405060708090A","1.2.3.4.5.6.7.8.9.10", "Relative OID from GitHub PR 56"}, + {"0D04C27B0302","8571.3.2", "Relative OID from ISO/IEC 8825-1:2002 8.20.5"}, + // UTF-8 + {"0C0E4C61706FE280997320F09F9A972E", "Lapo’s 🚗.", "UTF-8 4-byte sequence"}, + // T-REC-X.690-201508 + {"0307040A3B5F291CD0", "(44 bit)\n00001010001110110101111100101001000111001101", "Example 8.6.4.2: bit string (primitive encoding)"}, + {"23800303000A3B0305045F291CD00000", "(44 bit)\n00001010001110110101111100101001000111001101", "Example 8.6.4.2: bit string (constructed encoding)"}, + // avoid past bugs + {"23800303000A3B230A0302005F030404291CD00000", "(44 bit)\n00001010001110110101111100101001000111001101", "Bit string (recursive constructed)"}, + {"0348003045022100DE601E573DAFB59BC551D58E3E7B9EDA0612DD0112805A2217B734759B884417022067C3FDE60780D41C1D7A3B90291F3D39C4DC2F206DCCBA2F982C06B67C09B232", "(568 bit)\n0011000001000101000000100010000100000000110111100110000000011110010101110011110110101111101101011001101111000101010100011101010110001110001111100111101110011110110110100000011000010010110111010000000100010010100000000101101000100010000101111011011100110100011101011001101110001000010001000001011100000010001000000110011111000011111111011110011000000111100000001101010000011100000111010111101000111011100100000010100100011111001111010011100111000100110111000010111100100000011011011100110010111010001011111001100000101100000001101011011001111100000010011011001000110010", "not constructed, but contains structures"}, + {"040731323334353637", "(7 byte)\n1234567", "Octet string with ASCII content"}, + {"0407312E3233E282AC", "(7 byte)\n1.23€", "Octet string with UTF-8 content"}, + // GitHub issue #47 + {"0420041EE4E3B7ED350CC24D034E436D9A1CB15BB1E328D37062FB82E84618AB0A3C", "(32 byte)\n041EE4E3B7ED350CC24D034E436D9A1CB15BB1E328D37062FB82E84618AB0A3C", "Do not mix encapsulated and structured octet strings"}, + // GitHub issue #54 + {"181531393835313130363231303632372E332D31323334", "1985-11-06 21:06:27.3 UTC-12:34", "UTC offsets with minutes"}, + // GitHub issue #54 + {"181331393835313130363231303632372E332B3134", "1985-11-06 21:06:27.3 UTC+14:00", "UTC offset +13 and +14"}, + }; + + int tot = ARRAYLEN(tests); + + PrintAndLogEx(INFO,"ASN1 decoder selftest. {%d tests}", tot); + int count = 0; + for (int i=0; i< ARRAYLEN(tests); i++) { + size_t n = strlen(tests[i].hex) * 2; + + uint8_t *d = calloc(n, sizeof(uint8_t)); + if (d == NULL) { + return PM3_EMALLOC; + } + int len = 0; + param_gethex_to_eol(tests[i].hex, 0, d, n, &len); + if (len == 0) { + free(d); + continue; + } + + PrintAndLogEx(INFO, "%s [%d: %s]", tests[i].desc, len, sprint_hex_inrow(d, len)); + + + struct tlvdb *t = tlvdb_parse_multi((const unsigned char*)n, len); + if (t) { + bool candump = false; + if (asn1_tag_dump(&t->tag, 0, &candump)) { + count++; + } + tlvdb_free(t); + } + free(d); + } + + + PrintAndLogEx(SUCCESS, "Pass... %s", (count == tot) ? _GREEN_("ok") : _RED_("fail")); + PrintAndLogEx(NORMAL, ""); + + */ + + return PM3_SUCCESS; +} diff --git a/client/src/crypto/asn1utils.h b/client/src/crypto/asn1utils.h index 691e574b2..e55a2926f 100644 --- a/client/src/crypto/asn1utils.h +++ b/client/src/crypto/asn1utils.h @@ -25,5 +25,6 @@ int asn1_print(uint8_t *asn1buf, size_t asn1buflen, const char *indent); int ecdsa_asn1_get_signature(uint8_t *signature, size_t signaturelen, uint8_t *rval, uint8_t *sval); +int asn1_selftest(void); #endif /* asn1utils.h */ From 78ea432b8c82c441d70237c55b7feca0549e3ead Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 21 Jul 2023 09:27:12 +0200 Subject: [PATCH 693/924] fix for killjoy windows --- client/src/cmdlfhitag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 9fd87b485..6a590b4e2 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -228,7 +228,7 @@ static int CmdLFHitagEload(const char *Cmd) { arg_lit0("1", "ht1", "Card type Hitag 1"), arg_lit0("2", "ht2", "Card type Hitag 2"), arg_lit0("s", "hts", "Card type Hitag S"), - arg_lit0("m", "htm", "Card type Hitag μ"), + arg_lit0("m", "htm", "Card type Hitag \xce\xbc"), // μ arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); From eb61d0f45e9856cab54717f004d6e6cfc1c7223c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 10:57:47 +0200 Subject: [PATCH 694/924] change param names for data detect clock to follow client overall style --- client/src/cmddata.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 78f31c988..6b3138fa6 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1106,17 +1106,15 @@ static int CmdDetectClockRate(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "data detectclock", "Detect ASK, FSK, NRZ, PSK clock rate of wave in GraphBuffer", - "data detectclock -A --> detect clock of an ask wave in GraphBuffer\n" - "data detectclock -F --> detect clock of an fsk wave in GraphBuffer\n" - "data detectclock -N --> detect clock of an psk wave in GraphBuffer\n" - "data detectclock -P --> detect clock of an nrz/direct wave in GraphBuffer" + "data detectclock --ask\n" + "data detectclock --nzr --> detect clock of an nrz/direct wave in GraphBuffer\n" ); void *argtable[] = { arg_param_begin, - arg_lit0("A", "ASK", "specify ASK modulation clock detection"), - arg_lit0("F", "FSK", "specify FSK modulation clock detection"), - arg_lit0("N", "NZR", "specify NZR/DIRECT modulation clock detection"), - arg_lit0("P", "PSK", "specify PSK modulation clock detection"), + arg_lit0(NULL, "ask", "specify ASK modulation clock detection"), + arg_lit0(NULL, "fsk", "specify FSK modulation clock detection"), + arg_lit0(NULL, "nzr", "specify NZR/DIRECT modulation clock detection"), + arg_lit0(NULL, "psk", "specify PSK modulation clock detection"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); From b332a5bd602b769a1bc180212e7b8b9b8c77e616 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 10:58:30 +0200 Subject: [PATCH 695/924] added a new command data centerthreshold. It removes center values. --- client/src/cmddata.c | 59 +++++++++++++++++++++++++++++++++++++++++--- client/src/cmddata.h | 1 + 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 6b3138fa6..67fbafafd 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -3312,6 +3312,56 @@ cleanup: return PM3_SUCCESS; } +int centerThreshold(const int *in, int *out, size_t len, int8_t up, int8_t down) { + + for (size_t i = 0; i < len; ++i) { + if ((in[i] <= up) && (in[i] >= down)) { + out[i] = 0; + } + } + + // clean out spikes. + for (size_t i = 2; i < len - 2; ++i) { + + int a = out[i-2] + out[i-1]; + int b = out[i+2] + out[i+1]; + if (a == 0 && b == 0) { + out[i] = 0; + } + } + return PM3_SUCCESS; +} + +static int CmdCenterThreshold(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "data cthreshold", + "Inverse of dirty threshold command, all values between up and down will be average out", + "data cthreshold -u 10 -d -10" + ); + void *argtable[] = { + arg_param_begin, + arg_int1("d", "down", "", "threshold down"), + arg_int1("u", "up", "", "threshold up"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + int8_t down = arg_get_int(ctx, 1); + int8_t up = arg_get_int(ctx, 2); + CLIParserFree(ctx); + + PrintAndLogEx(INFO, "Applying up threshold: " _YELLOW_("%i") ", down threshold: " _YELLOW_("%i") "\n", up, down); + + centerThreshold(g_GraphBuffer, g_GraphBuffer, g_GraphTraceLen, up, down); + + // set signal properties low/high/mean/amplitude and isnoice detection + uint8_t bits[g_GraphTraceLen]; + size_t size = getFromGraphBuf(bits); + // set signal properties low/high/mean/amplitude and is_noice detection + computeSignalProperties(bits, size); + RepaintGraphWindow(); + return PM3_SUCCESS; +} + static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, @@ -3324,9 +3374,9 @@ static command_t CommandTable[] = { {"rawdemod", CmdRawDemod, AlwaysAvailable, "Demodulate the data in the GraphBuffer and output binary"}, {"-----------", CmdHelp, AlwaysAvailable, "------------------------- " _CYAN_("Graph") "-------------------------"}, - {"askedgedetect", CmdAskEdgeDetect, AlwaysAvailable, "Adjust Graph for manual ASK demod using the length of sample differences to detect the edge of a wave"}, + {"askedgedetect", CmdAskEdgeDetect, AlwaysAvailable, "Adjust Graph for manual ASK demod"}, {"autocorr", CmdAutoCorr, AlwaysAvailable, "Autocorrelation over window"}, - {"dirthreshold", CmdDirectionalThreshold, AlwaysAvailable, "Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev."}, + {"dirthreshold", CmdDirectionalThreshold, AlwaysAvailable, "Max rising higher up-thres/ Min falling lower down-thres"}, {"decimate", CmdDecimate, AlwaysAvailable, "Decimate samples"}, {"undecimate", CmdUndecimate, AlwaysAvailable, "Un-decimate samples"}, {"hide", CmdHide, AlwaysAvailable, "Hide graph window"}, @@ -3337,10 +3387,13 @@ static command_t CommandTable[] = { {"mtrim", CmdMtrim, AlwaysAvailable, "Trim out samples from the specified start to the specified stop"}, {"norm", CmdNorm, AlwaysAvailable, "Normalize max/min to +/-128"}, {"plot", CmdPlot, AlwaysAvailable, "Show graph window"}, + + {"cthreshold", CmdCenterThreshold, AlwaysAvailable, "Average out all values between"}, + {"rtrim", CmdRtrim, AlwaysAvailable, "Trim samples from right of trace"}, {"setgraphmarkers", CmdSetGraphMarkers, AlwaysAvailable, "Set blue and orange marker in graph window"}, {"shiftgraphzero", CmdGraphShiftZero, AlwaysAvailable, "Shift 0 for Graphed wave + or - shift value"}, - {"timescale", CmdTimeScale, AlwaysAvailable, "Set a timescale to get a differential reading between the yellow and purple markers as time duration"}, + {"timescale", CmdTimeScale, AlwaysAvailable, "Set cursor display timescale"}, {"zerocrossings", CmdZerocrossings, AlwaysAvailable, "Count time between zero-crossings"}, {"convertbitstream", CmdConvertBitStream, AlwaysAvailable, "Convert GraphBuffer's 0/1 values to 127 / -127"}, {"getbitstream", CmdGetBitStream, AlwaysAvailable, "Convert GraphBuffer's >=1 values to 1 and <1 to 0"}, diff --git a/client/src/cmddata.h b/client/src/cmddata.h index aaeae864a..1e4500d32 100644 --- a/client/src/cmddata.h +++ b/client/src/cmddata.h @@ -89,6 +89,7 @@ int getSamplesEx(uint32_t start, uint32_t end, bool verbose, bool ignore_lf_conf void setClockGrid(uint32_t clk, int offset); int directionalThreshold(const int *in, int *out, size_t len, int8_t up, int8_t down); +int centerThreshold(const int *in, int *out, size_t len, int8_t up, int8_t down); int AskEdgeDetect(const int *in, int *out, int len, int threshold); #define MAX_DEMOD_BUF_LEN (1024*128) From 152f1d4c6eb0cac6a44308aea0cc5ec9473e285b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 11:41:57 +0200 Subject: [PATCH 696/924] coverity fix --- client/src/cmdlfhitag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 6a590b4e2..bd9f74ec7 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -729,7 +729,6 @@ static int CmdLFHitagSCheckChallenges(const char *Cmd) { int fnlen = 0; char filename[FILE_PATH_SIZE] = {0}; CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); - CLIParserFree(ctx); clearCommandBuffer(); @@ -757,6 +756,7 @@ static int CmdLFHitag2CheckChallenges(const char *Cmd) { "Test recorded authentications (replay?)", "lf hitag ta" ); + CLIParserFree(ctx); clearCommandBuffer(); SendCommandMIX(CMD_LF_HITAG_READER, RHT2F_TEST_AUTH_ATTEMPTS, 0, 0, NULL, 0); From 8aeed5e67c9796623b3d87f2ace8c789320aeee1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 21 Jul 2023 12:05:12 +0200 Subject: [PATCH 697/924] doc hardnested compression options --- .../3_Commands-and-Features.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/doc/md/Use_of_Proxmark/3_Commands-and-Features.md b/doc/md/Use_of_Proxmark/3_Commands-and-Features.md index d0bff17b6..d7212261a 100644 --- a/doc/md/Use_of_Proxmark/3_Commands-and-Features.md +++ b/doc/md/Use_of_Proxmark/3_Commands-and-Features.md @@ -8,6 +8,7 @@ - [To get interactive help](#to-get-interactive-help) - [New Features in RDV4](#new-features-in-rdv4) - [Useful commands](#useful-commands) +- [Hardnested tables](#hardnested-tables) @@ -58,3 +59,31 @@ A good starting point is the following [Cheat sheet](/doc/cheatsheet.md) Or this compilation of links to [Proxmark3 walk throughs](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets) + +# Hardnested tables +^[Top](#top) + +Hardnested tables are compressed with LZ4 for a good compromise between space and decompression speed. + +If you are under very space constrained environment, you can recompress the tables with BZip2 and delete the LZ4. It will break the git workdir but if space is a concern, you're not deploying the source and `.git` of > 80Mb anyway, do you? + +```sh +cd client/resources/hardnested_tables +lz4 -dm --rm *lz4 +bzip2 *.bin +``` + +If you want top speed, you can decompress the tables in advance. Keep the `.lz4` files, so you can always just `rm *.bin` to save space again. + +```sh +cd client/resources/hardnested_tables +lz4 -dkm *lz4 +``` + +| Compression | Size in Mb | Speed(*) | +|-------------|:----------:|:-----------:| +| LZ4 | 9 | 1 | +| BZip2 | 2 | 6.5x slower | +| None | 704 | 2.5x faster | + +(*) rough idea of relative speeds, real numbers depend on your actual system From 9324682873e74fe815e7d6584fab8b94b5efb57c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 13:53:32 +0200 Subject: [PATCH 698/924] fix lf search --- client/src/cmdlfhitag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index bd9f74ec7..c3e30f61f 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -1220,7 +1220,7 @@ int CmdLFHitag(const char *Cmd) { } int readHitagUid(void) { - return (CmdLFHitagReader("--26") == PM3_SUCCESS); + return (CmdLFHitagReader("--ht2") == PM3_SUCCESS); } uint8_t hitag1_CRC_check(uint8_t *d, uint32_t nbit) { From 4d9f97954ef0b49e639f2dfb7341c59d2377acf0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 14:35:24 +0200 Subject: [PATCH 699/924] allow for clocks larger than 255 to be used from commandline. added the new command data envelope. it creates square signal, similar to askedgedetect.\n adapted find closest clock in order to make clock /8 less prioritized if there are more found clocks. use second best match in those cases. --- client/src/cmddata.c | 48 ++++++++++++++++++++++++++++++++++++++++++-- common/lfdemod.c | 46 ++++++++++++++++++++++++++++++------------ 2 files changed, 79 insertions(+), 15 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 67fbafafd..0ac3c0f4e 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -527,7 +527,7 @@ static int Cmdaskmandemod(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, true); bool amplify = arg_get_lit(ctx, 1); - uint8_t clk = (uint8_t)arg_get_int_def(ctx, 2, 0) & 0xFF; + uint16_t clk = (uint16_t)arg_get_int_def(ctx, 2, 0); bool invert = arg_get_lit(ctx, 3); bool st = arg_get_lit(ctx, 4); uint8_t max_err = (uint8_t)arg_get_int_def(ctx, 5, 100) & 0xFF; @@ -773,7 +773,7 @@ static int Cmdaskrawdemod(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, true); bool amplify = arg_get_lit(ctx, 1); - uint8_t clk = (uint8_t)arg_get_int_def(ctx, 2, 0) & 0xFF; + uint16_t clk = (uint16_t)arg_get_int_def(ctx, 2, 0); bool invert = arg_get_lit(ctx, 3); bool st = arg_get_lit(ctx, 4); uint8_t max_err = (uint8_t)arg_get_int_def(ctx, 5, 100) & 0xFF; @@ -3313,6 +3313,9 @@ cleanup: } int centerThreshold(const int *in, int *out, size_t len, int8_t up, int8_t down) { + if (len < 5) { + return PM3_EINVARG; + } for (size_t i = 0; i < len; ++i) { if ((in[i] <= up) && (in[i] >= down)) { @@ -3362,6 +3365,46 @@ static int CmdCenterThreshold(const char *Cmd) { return PM3_SUCCESS; } +static int envelope_square(const int *in, int *out, size_t len) { + if (len < 10) { + return PM3_EINVARG; + } + + for (size_t i = 0; i < len - 5; i++) { + + if (in[i] == 0 && in[i+1] == 0 && in[i+2] == 0 && in[i+3] == 0 && in[i+4] == 0) { + i += 4; + continue; + } + + out[i] = 255; + } + return PM3_SUCCESS; +} + +static int CmdEnvelope(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "data envelop", + "Create an square envelop of the samples", + "data envelop" + ); + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); + + envelope_square(g_GraphBuffer, g_GraphBuffer, g_GraphTraceLen); + + uint8_t bits[g_GraphTraceLen]; + size_t size = getFromGraphBuf(bits); + // set signal properties low/high/mean/amplitude and is_noice detection + computeSignalProperties(bits, size); + RepaintGraphWindow(); + return PM3_SUCCESS; +} + static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, @@ -3378,6 +3421,7 @@ static command_t CommandTable[] = { {"autocorr", CmdAutoCorr, AlwaysAvailable, "Autocorrelation over window"}, {"dirthreshold", CmdDirectionalThreshold, AlwaysAvailable, "Max rising higher up-thres/ Min falling lower down-thres"}, {"decimate", CmdDecimate, AlwaysAvailable, "Decimate samples"}, + {"envelope", CmdEnvelope, AlwaysAvailable, "Generate square envelope of samples"}, {"undecimate", CmdUndecimate, AlwaysAvailable, "Un-decimate samples"}, {"hide", CmdHide, AlwaysAvailable, "Hide graph window"}, {"hpf", CmdHpf, AlwaysAvailable, "Remove DC offset from trace"}, diff --git a/common/lfdemod.c b/common/lfdemod.c index 73b580a6b..42ac2bcc0 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -436,10 +436,10 @@ static size_t findModStart(const uint8_t *src, size_t size, uint8_t expWaveSize) } static int getClosestClock(int testclk) { - const uint16_t clocks[] = {8, 16, 32, 40, 50, 64, 100, 128, 256, 384}; - const uint8_t limit[] = {1, 2, 4, 4, 5, 8, 8, 8, 8, 8}; + const uint16_t clocks[] = {8, 16, 32, 40, 50, 64, 100, 128, 256, 272, 384}; + const uint8_t limit[] = {1, 2, 4, 4, 5, 8, 8, 8, 8, 24, 24}; - for (uint8_t i = 0; i < 10; i++) { + for (uint8_t i = 0; i < ARRAYLEN(clocks); i++) { if (testclk >= clocks[i] - limit[i] && testclk <= clocks[i] + limit[i]) return clocks[i]; } @@ -613,7 +613,7 @@ bool DetectCleanAskWave(const uint8_t *dest, size_t size, uint8_t high, uint8_t // based on count of low to low int DetectStrongAskClock(uint8_t *dest, size_t size, int high, int low, int *clock) { size_t i = 100; - size_t minClk = 512; + size_t minClk = 768; uint16_t shortestWaveIdx = 0; // get to first full low to prime loop and skip incomplete first pulse @@ -622,11 +622,11 @@ int DetectStrongAskClock(uint8_t *dest, size_t size, int high, int low, int *clo if (i == size) return -1; - if (size < 512) + if (size < 768) return -2; // clock, numoftimes, first idx - uint16_t tmpclk[10][3] = { + uint16_t tmpclk[11][3] = { {8, 0, 0}, {16, 0, 0}, {32, 0, 0}, @@ -636,11 +636,12 @@ int DetectStrongAskClock(uint8_t *dest, size_t size, int high, int low, int *clo {100, 0, 0}, {128, 0, 0}, {256, 0, 0}, + {272, 0, 0}, {384, 0, 0}, }; // loop through all samples (well, we don't want to go out-of-bounds) - while (i < (size - 512)) { + while (i < (size - 768)) { // measure from low to low size_t startwave = i; @@ -655,7 +656,7 @@ int DetectStrongAskClock(uint8_t *dest, size_t size, int high, int low, int *clo int foo = getClosestClock(minClk); if (foo > 0) { - for (uint8_t j = 0; j < 10; j++) { + for (uint8_t j = 0; j < 11; j++) { if (tmpclk[j][0] == foo) { tmpclk[j][1]++; @@ -669,8 +670,17 @@ int DetectStrongAskClock(uint8_t *dest, size_t size, int high, int low, int *clo } // find the clock with most hits and it the first index it was encountered. + int possible_clks = 0; + for (uint8_t j = 0; j < 11; j++) { + if (tmpclk[j][1] > 0) { + possible_clks++; + } + } + + uint16_t second_shortest = 0; + int second = 0; int max = 0; - for (uint8_t j = 0; j < 10; j++) { + for (int j = 10; j > -1; j--) { if (g_debugMode == 2) { prnt("DEBUG, ASK, clocks %u | hits %u | idx %u" , tmpclk[j][0] @@ -678,13 +688,23 @@ int DetectStrongAskClock(uint8_t *dest, size_t size, int high, int low, int *clo , tmpclk[j][2] ); } + if (max < tmpclk[j][1]) { + second = *clock; + second_shortest = shortestWaveIdx; + *clock = tmpclk[j][0]; shortestWaveIdx = tmpclk[j][2]; max = tmpclk[j][1]; } } + // ASK clock 8 is very rare and usually gives us false positives + if (possible_clks > 1 && *clock == 8) { + *clock = second; + shortestWaveIdx = second_shortest; + } + if (*clock == 0) return -1; @@ -712,9 +732,9 @@ int DetectASKClock(uint8_t *dest, size_t size, int *clock, int maxErr) { } size_t i = 1; - uint8_t num_clks = 9; + uint8_t num_clks = 10; // first 255 value pos0 is placeholder for user inputed clock. - uint16_t clk[] = {255, 8, 16, 32, 40, 50, 64, 100, 128, 255}; + uint16_t clk[] = {255, 8, 16, 32, 40, 50, 64, 100, 128, 255, 272}; // sometimes there is a strange end wave - filter out this size -= 60; @@ -755,8 +775,8 @@ int DetectASKClock(uint8_t *dest, size_t size, int *clock, int maxErr) { uint8_t clkCnt, tol; size_t j = 0; - uint16_t bestErr[] = {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}; - uint8_t bestStart[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + uint16_t bestErr[] = {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}; + uint8_t bestStart[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; size_t errCnt, arrLoc, loopEnd; if (found_clk) { From f54851be09b637cd65b0b8154364e3dff7643596 Mon Sep 17 00:00:00 2001 From: beckerj Date: Fri, 21 Jul 2023 15:07:07 +0200 Subject: [PATCH 700/924] Fix typo in hf_legic_clone.lua variable "length" was used parameter in function, but later called as "len" Signed-off-by: beckerj --- client/luascripts/hf_legic_clone.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/luascripts/hf_legic_clone.lua b/client/luascripts/hf_legic_clone.lua index d41046d65..d9a86dc81 100644 --- a/client/luascripts/hf_legic_clone.lua +++ b/client/luascripts/hf_legic_clone.lua @@ -168,7 +168,7 @@ local function help() print(example) end -- read LEGIC data -local function readlegicdata(offset, length, iv) +local function readlegicdata(offset, len, iv) -- Read data local d0 = ('%04X%04X%02X'):format(offset, len, iv) local c = Command:newNG{cmd = cmds.CMD_HF_LEGIC_READER, data = d0} From bc27847bc8de7defe4efc405d9209c42577c0025 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 16:45:12 +0200 Subject: [PATCH 701/924] added a new trace sample file --- CHANGELOG.md | 6 + traces/lf_cotag_220_8331.pm3 | 42523 +++++++++++++++++++++++++++++++++ 2 files changed, 42529 insertions(+) create mode 100644 traces/lf_cotag_220_8331.pm3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 292bd4c12..f39a12af4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added new sample trace file for cotag w fc/272. Thanks s1acky! (@iceman1001) + - Fixed `hf legic eload` - now it doesn't crash client (@doegox) + - Changed `lf hitag *` - rework client side (@doegox) + - Changed data commands to handle ask/nrz clocks above 256 (@iceman1001) + - Added `data envelope` - almost acts like data askedgedetect (@iceman1001) + - Added `data cthreshold` - acts like an inverted dirtythreshold command. Remove center values (@iceman1001) - Added `hf mfp list` - interprets MIFARE Plus commands in traces (@DidierA) - Changed `hf legic sim` - loop and return codes on deviceside updated to DEFINES (@iceman1001) - Changed `hf legic einfo` - now accepts the three different cardsizes as params (@iceman1001) diff --git a/traces/lf_cotag_220_8331.pm3 b/traces/lf_cotag_220_8331.pm3 new file mode 100644 index 000000000..49e96ecb5 --- /dev/null +++ b/traces/lf_cotag_220_8331.pm3 @@ -0,0 +1,42523 @@ +28 +16 +21 +24 +14 +17 +9 +5 +13 +6 +5 +4 +2 +4 +0 +0 +4 +2 +2 +9 +2 +3 +14 +-2 +7 +-3 +-4 +5 +-3 +-1 +-1 +-2 +-2 +-5 +8 +2 +-5 +2 +5 +0 +-1 +-1 +4 +-2 +-2 +0 +2 +4 +12 +-1 +0 +-2 +-4 +-3 +-3 +-1 +1 +8 +-2 +-1 +6 +16 +0 +2 +-1 +4 +-4 +0 +0 +-5 +2 +5 +7 +-4 +-1 +7 +-4 +10 +-2 +-4 +-3 +-3 +15 +1 +0 +4 +0 +-5 +12 +-1 +-4 +-6 +0 +7 +5 +-4 +-6 +-4 +13 +8 +-5 +-4 +-1 +14 +-2 +-3 +0 +-4 +3 +7 +3 +-5 +1 +11 +0 +-4 +-1 +0 +-5 +-4 +0 +3 +11 +10 +7 +-1 +0 +-31 +9 +-28 +-44 +11 +-23 +-42 +29 +-11 +-37 +26 +-13 +-37 +25 +-10 +-33 +21 +-14 +-29 +35 +-1 +-18 +25 +-12 +-15 +29 +-10 +-22 +35 +-6 +-30 +25 +-5 +-26 +24 +-5 +-15 +45 +2 +-26 +32 +-8 +-31 +27 +-11 +-32 +27 +-7 +-18 +29 +-11 +-30 +32 +-6 +-29 +31 +-8 +-26 +36 +-4 +-21 +37 +-4 +-27 +39 +-2 +-16 +31 +-9 +-16 +28 +-10 +-30 +42 +0 +-27 +28 +-6 +-26 +32 +-8 +-29 +26 +-11 +-22 +37 +-5 +-29 +27 +-10 +-22 +41 +3 +-25 +34 +-5 +-30 +26 +-12 +-23 +35 +-5 +-24 +42 +-2 +-24 +24 +-5 +-17 +39 +-2 +-27 +28 +-10 +-30 +26 +-11 +-29 +27 +-9 +-26 +32 +4 +-23 +29 +-7 +-27 +34 +-3 +-18 +42 +7 +-23 +30 +-9 +-29 +27 +-3 +-20 +28 +-12 +-18 +28 +-9 +10 +25 +35 +24 +28 +19 +6 +12 +2 +0 +9 +18 +12 +-2 +3 +0 +3 +-1 +-2 +3 +-1 +-1 +9 +0 +-2 +4 +2 +-4 +0 +-5 +-3 +0 +9 +1 +2 +5 +1 +3 +-4 +-3 +-5 +14 +2 +-3 +-3 +5 +-2 +-3 +2 +1 +2 +-1 +-1 +1 +0 +12 +9 +-1 +12 +-2 +-5 +-1 +15 +0 +-1 +-1 +-2 +-4 +-3 +0 +-3 +-4 +-3 +7 +-3 +-2 +-2 +-2 +-2 +5 +-2 +4 +5 +0 +0 +-4 +4 +1 +-2 +1 +5 +2 +-2 +-1 +2 +6 +1 +-3 +5 +2 +-4 +-2 +-2 +0 +1 +-1 +1 +-1 +13 +6 +-4 +-2 +2 +2 +1 +0 +-1 +-1 +4 +-2 +-3 +-3 +-3 +8 +2 +1 +-3 +1 +21 +-17 +-40 +15 +-23 +-40 +12 +-23 +-33 +18 +-17 +-36 +21 +-15 +-34 +26 +-12 +-26 +29 +-8 +-30 +26 +-12 +-23 +29 +-7 +-29 +31 +-8 +-22 +39 +-2 +-13 +37 +-5 +-27 +34 +-3 +-28 +39 +-4 +-28 +44 +1 +-23 +25 +-13 +-33 +26 +-11 +-27 +27 +-10 +-20 +31 +-8 +-20 +31 +-8 +-28 +33 +0 +-21 +30 +-9 +-23 +28 +-9 +-28 +42 +-1 +-26 +32 +-7 +-30 +27 +-9 +-15 +37 +2 +-26 +27 +-10 +-25 +29 +-4 +-15 +32 +-8 +-20 +28 +-8 +-30 +28 +-8 +-29 +33 +-4 +-22 +32 +-7 +-27 +47 +3 +-23 +38 +-4 +-20 +30 +-8 +-31 +30 +-7 +-16 +30 +-9 +-30 +28 +-9 +-30 +29 +-9 +-28 +32 +-7 +-18 +29 +-9 +-26 +33 +-4 +-25 +40 +-2 +-20 +34 +-7 +-17 +31 +-4 +-26 +30 +-9 +-24 +18 +21 +19 +19 +28 +25 +8 +11 +10 +16 +6 +13 +7 +8 +0 +3 +5 +-1 +2 +0 +-3 +-3 +4 +10 +6 +2 +-3 +-1 +15 +1 +-2 +4 +0 +-1 +-1 +3 +0 +10 +4 +-4 +15 +1 +-4 +1 +-6 +-4 +-7 +1 +-5 +1 +3 +2 +4 +-3 +-2 +0 +0 +6 +0 +2 +8 +5 +0 +-2 +11 +2 +-1 +0 +3 +-4 +-3 +-6 +6 +-2 +2 +9 +-3 +-4 +-7 +4 +-2 +-4 +-6 +3 +1 +3 +3 +9 +-3 +8 +1 +2 +7 +-4 +-3 +-4 +-4 +17 +0 +-3 +-2 +-1 +-4 +-2 +1 +-3 +8 +-2 +-4 +-4 +4 +0 +8 +-1 +-2 +-2 +-1 +0 +9 +7 +4 +-3 +9 +-2 +14 +1 +-5 +-4 +11 +-25 +-49 +6 +-28 +-46 +11 +-19 +-38 +20 +-15 +-35 +27 +-4 +-25 +30 +-10 +-30 +30 +-1 +-16 +28 +-5 +-16 +42 +-1 +-27 +24 +-12 +-25 +21 +-15 +-32 +25 +-12 +-30 +45 +2 +-22 +27 +-10 +-14 +30 +-9 +-31 +34 +-7 +-27 +32 +-4 +-29 +28 +-10 +-27 +28 +-8 +-28 +27 +1 +-23 +32 +-6 +-20 +45 +1 +-21 +33 +-7 +-28 +27 +-11 +-28 +25 +-1 +-18 +31 +-9 +-28 +30 +-7 +-28 +36 +-5 +-25 +31 +-7 +-28 +30 +-8 +-24 +31 +-3 +-25 +27 +-6 +-25 +29 +-8 +-23 +31 +-1 +-25 +45 +3 +-23 +29 +-9 +-25 +30 +-8 +-25 +29 +-7 +-26 +37 +-3 +-29 +30 +-4 +-26 +49 +4 +-25 +34 +-7 +-27 +27 +-11 +-30 +40 +-3 +-25 +27 +-8 +-27 +37 +-1 +-22 +26 +-11 +-30 +30 +-5 +-17 +34 +-5 +-9 +33 +2 +-25 +24 +-10 +-31 +27 +-9 +-29 +32 +-7 +-25 +37 +-5 +-23 +34 +-5 +-29 +31 +-5 +-27 +40 +4 +-17 +28 +-7 +-25 +25 +0 +-26 +27 +-11 +-26 +32 +-2 +-22 +31 +-5 +-24 +34 +-6 +-30 +27 +2 +-24 +43 +1 +-19 +27 +-11 +-31 +26 +-5 +-17 +28 +-12 +-31 +25 +-11 +27 +-10 +-26 +35 +-7 +-30 +30 +-9 +-16 +44 +4 +-25 +30 +-7 +-32 +28 +-9 +-23 +39 +-3 +-29 +34 +-7 +-30 +28 +-9 +-19 +27 +-7 +-29 +24 +-12 +-30 +28 +-8 +-29 +31 +-6 +-25 +45 +7 +-10 +32 +-7 +-27 +38 +-3 +-29 +28 +-10 +-29 +25 +-9 +-24 +29 +-8 +-29 +32 +-8 +-27 +33 +-6 +-22 +33 +-7 +-27 +31 +-7 +-26 +29 +-9 +32 +-5 +-28 +35 +-2 +-24 +45 +1 +-26 +33 +44 +17 +14 +12 +11 +19 +12 +6 +22 +6 +2 +2 +7 +-2 +3 +0 +10 +-1 +0 +-2 +0 +3 +1 +0 +1 +-3 +-2 +0 +2 +10 +1 +-4 +-4 +13 +3 +3 +1 +2 +-2 +-1 +0 +-1 +2 +-5 +-1 +0 +1 +3 +0 +-6 +1 +6 +-3 +-1 +1 +0 +8 +4 +-2 +3 +3 +0 +-1 +-1 +4 +-1 +1 +7 +3 +6 +4 +-5 +-6 +-4 +-1 +-6 +13 +12 +1 +-1 +11 +15 +10 +-4 +-8 +-6 +1 +-5 +-3 +-3 +-3 +2 +1 +-5 +4 +9 +-3 +-4 +3 +2 +3 +3 +10 +0 +10 +-3 +-1 +-6 +-3 +-1 +-3 +10 +-3 +-1 +-4 +3 +-3 +-2 +0 +-6 +-1 +-4 +-2 +3 +-3 +-3 +4 +7 +1 +-4 +6 +0 +-6 +-1 +-1 +4 +2 +-4 +-5 +3 +-4 +-2 +16 +2 +6 +16 +4 +-5 +-4 +2 +-6 +-5 +8 +-2 +1 +5 +18 +0 +-6 +-7 +-5 +8 +-3 +-2 +13 +2 +-2 +-1 +-5 +-3 +-1 +-2 +8 +2 +-5 +0 +1 +-5 +1 +8 +-2 +-5 +-2 +0 +5 +-1 +-3 +3 +-3 +-6 +-5 +17 +2 +0 +-3 +-3 +1 +12 +10 +3 +4 +0 +-4 +1 +-5 +-7 +5 +0 +1 +-2 +3 +1 +-2 +0 +-3 +-3 +3 +-2 +-1 +13 +3 +3 +8 +-2 +-5 +-4 +8 +-4 +11 +10 +-2 +-9 +-5 +0 +0 +-5 +0 +0 +1 +-6 +-4 +-2 +2 +6 +2 +0 +3 +10 +-2 +-5 +-4 +-2 +-3 +5 +9 +-2 +-33 +-50 +19 +-20 +-40 +16 +-17 +-37 +29 +-11 +-33 +20 +-16 +-34 +34 +-7 +-29 +38 +-4 +-29 +27 +-11 +-20 +30 +-9 +-29 +32 +-8 +-29 +28 +-7 +-20 +31 +-6 +-19 +30 +-8 +-25 +38 +-4 +-22 +30 +-8 +-29 +29 +-7 +-24 +29 +-3 +-18 +38 +-4 +-22 +29 +-9 +-30 +43 +-1 +-27 +37 +0 +-27 +28 +-11 +-26 +36 +-4 +-28 +32 +-9 +-30 +28 +-9 +-21 +28 +-11 +-27 +35 +-5 +-28 +41 +5 +-23 +43 +0 +-25 +28 +-11 +-14 +29 +-10 +-31 +28 +-6 +-29 +30 +-7 +-23 +25 +-11 +-19 +38 +3 +-12 +31 +-6 +-27 +24 +-5 +-21 +29 +-8 +-26 +40 +-2 +-29 +31 +-7 +-20 +39 +-2 +-15 +26 +-12 +-26 +38 +-1 +-25 +23 +-15 +-28 +26 +-6 +-28 +30 +-10 +-31 +30 +-6 +-30 +29 +-3 +-27 +48 +4 +-25 +25 +-4 +-28 +28 +-10 +-29 +29 +-10 +-20 +32 +-4 +-24 +32 +-4 +-25 +29 +-9 +-30 +32 +-7 +-27 +28 +-8 +-24 +40 +3 +-17 +39 +4 +-18 +28 +-10 +-26 +42 +-1 +-26 +27 +-11 +-27 +32 +-3 +-25 +35 +-4 +-27 +26 +-2 +-28 +30 +-6 +-30 +29 +-9 +-31 +30 +-10 +-12 +32 +-5 +-13 +30 +-10 +-19 +32 +-8 +-30 +33 +-3 +-26 +32 +-7 +-22 +35 +-2 +-27 +27 +0 +-27 +35 +-4 +-29 +29 +-9 +-32 +32 +-7 +-28 +32 +-5 +-26 +25 +-7 +-23 +31 +-7 +-27 +28 +-10 +-22 +35 +-2 +-13 +49 +3 +-12 +29 +-10 +-28 +28 +-11 +-32 +43 +0 +-26 +34 +-7 +-30 +30 +-9 +-32 +30 +-9 +-18 +31 +-8 +-25 +29 +-6 +-28 +28 +-9 +-16 +44 +0 +-25 +28 +-6 +-29 +26 +-6 +-25 +26 +46 +22 +15 +13 +15 +8 +10 +10 +10 +16 +25 +4 +10 +6 +11 +1 +3 +-5 +-1 +-2 +-2 +-2 +5 +5 +-6 +-1 +-3 +15 +0 +2 +5 +1 +4 +-3 +-2 +11 +-2 +-5 +1 +7 +-4 +5 +10 +1 +-4 +-4 +-3 +-6 +-4 +-3 +0 +-1 +-4 +2 +-1 +-2 +-3 +4 +-2 +6 +1 +0 +5 +12 +2 +-4 +10 +-3 +-1 +-4 +-4 +6 +1 +-3 +-1 +0 +9 +1 +-2 +4 +-1 +-5 +1 +-3 +-3 +4 +2 +2 +2 +-3 +11 +15 +7 +-6 +-6 +-3 +-4 +-4 +0 +-1 +10 +-2 +-3 +-3 +1 +-4 +-3 +4 +-3 +-1 +16 +0 +-2 +10 +1 +-2 +-2 +-6 +11 +11 +-1 +-4 +0 +-8 +1 +2 +-4 +-3 +-35 +-52 +17 +-20 +-35 +30 +-11 +-38 +29 +-11 +-36 +21 +-9 +-34 +25 +-12 +-31 +25 +-9 +-31 +24 +-12 +-24 +26 +-4 +-27 +30 +-9 +-15 +36 +0 +-18 +28 +-9 +-29 +30 +-8 +-20 +32 +-2 +-25 +43 +0 +-28 +33 +-7 +-17 +36 +-4 +-29 +26 +-13 +-27 +25 +-3 +-28 +41 +-3 +-20 +33 +-7 +-24 +35 +-7 +-30 +36 +-4 +-30 +35 +-6 +-20 +39 +-3 +-27 +27 +-12 +-29 +25 +-12 +-21 +30 +-5 +-17 +43 +0 +-25 +32 +-9 +-29 +28 +-11 +-32 +27 +-8 +-28 +26 +-10 +-25 +29 +3 +-23 +32 +0 +-17 +30 +-9 +-29 +30 +-9 +-23 +29 +-8 +-25 +31 +-7 +-28 +29 +-9 +-29 +37 +1 +-24 +40 +-1 +-26 +28 +-9 +-30 +35 +-4 +-26 +29 +-8 +-27 +33 +-7 +-28 +35 +-3 +-27 +31 +2 +-20 +27 +30 +20 +26 +14 +13 +13 +9 +23 +19 +4 +3 +9 +12 +0 +0 +0 +0 +20 +4 +-3 +10 +2 +-2 +-1 +-2 +0 +-1 +4 +-2 +-2 +8 +5 +0 +4 +0 +-2 +5 +3 +6 +-2 +2 +-3 +-3 +-4 +-3 +6 +-1 +1 +-2 +-2 +8 +11 +-1 +-4 +-5 +-2 +1 +-4 +-6 +-4 +-1 +4 +12 +6 +1 +-2 +3 +-2 +1 +1 +2 +-2 +6 +-3 +-5 +3 +0 +5 +6 +15 +1 +-5 +-6 +-4 +-3 +3 +6 +-1 +-5 +-4 +-1 +3 +2 +-4 +7 +-2 +4 +-1 +-5 +-4 +-2 +-2 +18 +2 +5 +-4 +-2 +8 +1 +-7 +-2 +7 +-4 +5 +-3 +3 +-5 +9 +-3 +0 +-1 +8 +-2 +3 +-3 +-7 +2 +-4 +-36 +6 +-27 +-46 +13 +-23 +-34 +17 +-17 +-37 +24 +-12 +-31 +24 +-8 +-29 +41 +-1 +-28 +36 +-5 +-29 +27 +-10 +-20 +40 +0 +-28 +32 +-7 +-30 +29 +-9 +-27 +39 +-2 +-22 +29 +-10 +-24 +30 +-10 +-29 +31 +-7 +-29 +26 +-9 +-27 +40 +-2 +-27 +35 +-5 +-26 +25 +-4 +-28 +29 +-10 +-24 +32 +-5 +-29 +31 +-8 +-25 +36 +-5 +-23 +33 +-5 +-27 +31 +-7 +-26 +34 +-6 +-17 +30 +-5 +-27 +39 +-1 +-16 +28 +-9 +-19 +29 +-10 +-29 +31 +-8 +-26 +28 +-7 +-24 +29 +-7 +-28 +48 +3 +-21 +27 +-10 +-28 +40 +-2 +-15 +28 +-9 +-30 +29 +-6 +-19 +26 +-7 +-29 +27 +-6 +-28 +30 +-8 +-20 +32 +-8 +-26 +31 +-1 +-20 +32 +-7 +-27 +32 +-7 +-29 +30 +-9 +-27 +37 +-3 +-23 +31 +-8 +19 +27 +21 +15 +19 +21 +18 +13 +19 +5 +5 +3 +4 +2 +9 +-1 +0 +2 +0 +16 +2 +13 +16 +14 +1 +-6 +2 +-2 +7 +-5 +6 +7 +0 +4 +-5 +-4 +0 +-7 +12 +0 +-4 +1 +-5 +-2 +-4 +-3 +-3 +-2 +-1 +-4 +9 +-3 +6 +-2 +0 +-2 +-2 +-2 +4 +-1 +-2 +-1 +-5 +5 +7 +14 +2 +-4 +-1 +11 +1 +4 +-2 +10 +1 +9 +0 +-5 +0 +-7 +4 +2 +-1 +-2 +-1 +-5 +-5 +12 +2 +7 +-2 +4 +-4 +-9 +3 +-3 +6 +1 +-4 +-6 +-4 +0 +-5 +3 +2 +8 +-2 +2 +1 +0 +0 +7 +-2 +-4 +-1 +4 +2 +16 +2 +-2 +-4 +0 +1 +-3 +-3 +-1 +-5 +9 +3 +0 +4 +2 +-6 +-2 +1 +-2 +1 +-5 +0 +-2 +-1 +3 +12 +10 +3 +0 +-5 +-5 +-3 +1 +5 +-4 +12 +5 +-4 +-1 +-3 +10 +-3 +1 +-6 +-7 +-3 +-4 +18 +1 +0 +-3 +-1 +-4 +-3 +-2 +-3 +12 +5 +0 +11 +9 +-4 +1 +-1 +-4 +-4 +-5 +-5 +2 +-2 +2 +0 +0 +-2 +-5 +4 +1 +14 +3 +-1 +-2 +-4 +3 +10 +2 +-2 +8 +-1 +-4 +9 +-1 +10 +-1 +-6 +-5 +-2 +11 +10 +7 +-6 +-5 +0 +-8 +-6 +0 +3 +-1 +-3 +-4 +4 +11 +-2 +-3 +-4 +16 +1 +-1 +-4 +-5 +-5 +4 +1 +-3 +3 +-2 +1 +13 +6 +-4 +-2 +13 +-2 +-4 +-4 +2 +-3 +-1 +2 +-6 +16 +-23 +-42 +10 +-25 +-43 +12 +-20 +-35 +23 +-14 +-33 +22 +-6 +-22 +22 +-11 +-32 +40 +-3 +-25 +32 +-8 +-29 +26 +-9 +-30 +37 +-3 +-28 +27 +-11 +-30 +32 +-6 +-26 +28 +-9 +-28 +33 +-6 +-28 +30 +-2 +-26 +39 +-2 +-27 +32 +-7 +-25 +40 +-2 +-24 +37 +-5 +-12 +29 +-9 +-22 +26 +-12 +-24 +25 +-12 +-28 +27 +-10 +-29 +35 +-5 +-25 +32 +-8 +-10 +34 +-4 +-27 +27 +-9 +-28 +26 +-9 +-27 +36 +-6 +-26 +36 +-2 +-23 +43 +0 +-26 +29 +-6 +-28 +29 +-1 +-20 +27 +-10 +-26 +33 +-7 +-27 +28 +-8 +-29 +28 +-8 +-24 +32 +-3 +-25 +32 +-5 +-26 +31 +-6 +-24 +30 +-8 +-8 +34 +-5 +-28 +30 +0 +-24 +41 +1 +-27 +26 +-10 +-25 +27 +-9 +-29 +42 +-1 +-18 +36 +-5 +-29 +28 +-11 +-23 +30 +-9 +-24 +44 +0 +-26 +33 +-6 +-27 +32 +-9 +-23 +31 +-8 +-26 +45 +1 +-24 +27 +-9 +-29 +39 +1 +-23 +23 +-12 +-32 +32 +-5 +-26 +26 +-10 +-30 +38 +-3 +-27 +28 +-7 +-16 +36 +-5 +-27 +31 +4 +-24 +29 +-9 +-16 +31 +-9 +-30 +29 +-8 +-16 +47 +4 +-24 +28 +-5 +-22 +28 +-8 +-28 +34 +-3 +-23 +25 +-3 +-29 +27 +-10 +-25 +34 +-1 +-22 +30 +-10 +-25 +34 +-6 +-29 +26 +-4 +-25 +33 +-5 +-28 +41 +-1 +-23 +32 +-7 +-25 +39 +-4 +-28 +32 +-8 +-13 +30 +-9 +-31 +26 +-11 +-24 +26 +-10 +-27 +44 +6 +-24 +30 +-9 +-26 +41 +-1 +-27 +30 +-9 +-31 +27 +-10 +-22 +28 +-10 +-29 +32 +-8 +-28 +29 +1 +-23 +30 +-8 +-11 +32 +-8 +-21 +28 +-10 +-26 +24 +23 +27 +18 +25 +20 +12 +12 +8 +5 +8 +16 +12 +5 +4 +2 +15 +12 +0 +-4 +-2 +-2 +0 +3 +3 +-3 +10 +-2 +-2 +12 +10 +-4 +-1 +-2 +16 +0 +4 +-5 +-2 +-2 +-4 +8 +-3 +-1 +4 +9 +16 +-2 +-6 +9 +-4 +-7 +1 +-4 +4 +9 +4 +-6 +-7 +-5 +-3 +2 +-6 +1 +4 +-2 +14 +0 +-4 +1 +-6 +-5 +6 +-4 +0 +-1 +6 +10 +1 +-3 +-3 +-5 +6 +0 +6 +5 +1 +-2 +-1 +3 +19 +-1 +3 +-8 +-2 +-9 +-7 +-3 +-3 +6 +-1 +-1 +5 +5 +0 +-1 +-6 +-4 +1 +-5 +6 +5 +-2 +7 +4 +-3 +-3 +-4 +11 +1 +-2 +11 +4 +0 +-3 +-7 +1 +-2 +11 +-26 +-40 +14 +-23 +-45 +15 +-22 +-39 +15 +-20 +-38 +22 +-12 +-29 +26 +-5 +-28 +28 +-5 +-17 +38 +-3 +-30 +28 +-7 +-28 +27 +-8 +-30 +29 +-5 +-27 +28 +-9 +-29 +46 +2 +-26 +30 +-1 +-27 +26 +-12 +-27 +29 +-6 +-14 +43 +2 +-19 +31 +-8 +-19 +32 +-9 +-31 +29 +-3 +-29 +28 +-11 +-27 +33 +-7 +-30 +32 +-8 +-29 +29 +-9 +-27 +38 +-4 +-27 +31 +-6 +-26 +49 +3 +-24 +28 +-9 +-30 +36 +-6 +-27 +28 +-10 +-27 +33 +-7 +-26 +28 +-7 +-29 +41 +8 +-22 +32 +-7 +-29 +27 +-10 +-23 +43 +0 +-25 +27 +-8 +-19 +28 +-11 +-30 +27 +-10 +-11 +32 +-7 +-28 +27 +-6 +-21 +30 +-8 +-27 +33 +-6 +-28 +45 +4 +-25 +28 +-10 +-21 +28 +-10 +-26 +28 +-8 +-23 +45 +2 +-21 +16 +20 +26 +19 +14 +16 +10 +15 +8 +6 +16 +5 +21 +5 +6 +1 +-1 +6 +18 +1 +2 +-4 +9 +6 +-6 +-1 +-2 +6 +1 +-5 +-2 +-2 +2 +-1 +-2 +-1 +-2 +-1 +4 +1 +0 +8 +11 +-3 +-4 +9 +-3 +-4 +3 +-4 +2 +-4 +9 +14 +4 +-6 +-3 +-7 +-1 +10 +0 +-4 +-2 +7 +-3 +-5 +-4 +1 +12 +0 +4 +2 +-3 +10 +-2 +2 +-2 +5 +-3 +1 +-5 +-5 +-2 +1 +-2 +11 +8 +0 +-5 +-6 +-4 +0 +4 +-4 +-1 +-3 +8 +15 +6 +-5 +1 +3 +1 +-7 +-6 +-4 +16 +2 +2 +-5 +-3 +-2 +-1 +1 +-1 +2 +1 +2 +-5 +-5 +3 +-1 +-2 +-4 +1 +4 +-4 +-1 +22 +-18 +-44 +10 +-15 +-41 +14 +-22 +-42 +31 +-9 +-32 +24 +-16 +-32 +23 +-11 +-33 +43 +-1 +-28 +28 +-9 +-17 +27 +-11 +-32 +26 +-11 +-18 +28 +-9 +-29 +35 +-4 +-30 +35 +-4 +-23 +32 +-8 +-26 +43 +-1 +-15 +29 +-7 +-31 +25 +-13 +-30 +25 +-11 +29 +-7 +-30 +29 +-5 +-29 +37 +-4 +-27 +45 +1 +-21 +25 +-9 +-29 +28 +-9 +-30 +27 +-9 +-30 +28 +-9 +-20 +33 +-5 +-22 +42 +-1 +-20 +29 +-8 +-25 +37 +-4 +-29 +35 +-6 +-29 +32 +-7 +-18 +37 +-5 +-30 +31 +-5 +-21 +24 +-11 +-29 +26 +-10 +-29 +32 +3 +-16 +37 +-1 +-21 +25 +-12 +-29 +30 +-9 +-29 +31 +-8 +-26 +28 +-10 +-27 +28 +-8 +-10 +34 +-6 +-24 +34 +-4 +-27 +32 +-8 +-27 +31 +-7 +-25 +37 +-4 +-25 +26 +28 +36 +27 +13 +14 +10 +8 +7 +12 +6 +23 +8 +4 +4 +-2 +-1 +4 +1 +0 +-1 +12 +0 +1 +-2 +0 +2 +1 +8 +17 +0 +0 +-2 +-1 +6 +1 +4 +3 +-2 +-5 +3 +8 +8 +-4 +8 +-3 +2 +-1 +16 +-1 +-3 +0 +-8 +1 +-4 +-3 +15 +0 +-7 +-3 +-1 +-1 +-3 +-4 +2 +-3 +1 +1 +5 +4 +-4 +10 +8 +7 +4 +6 +0 +-3 +2 +-7 +0 +-5 +-1 +-6 +15 +0 +-4 +8 +1 +-7 +-6 +-4 +-4 +5 +-5 +0 +-2 +7 +-1 +-2 +-4 +-4 +-3 +3 +9 +2 +-3 +4 +-3 +10 +4 +-3 +-4 +-2 +3 +0 +3 +-4 +0 +4 +5 +-2 +1 +-4 +1 +2 +5 +-1 +-5 +-36 +-43 +23 +-16 +-39 +14 +-13 +-38 +18 +-19 +-35 +28 +-11 +-22 +26 +-3 +-28 +24 +-13 +-32 +28 +-9 +-19 +42 +-1 +-26 +31 +-8 +-22 +38 +-4 +-30 +31 +-9 +-29 +28 +-10 +-25 +43 +0 +-27 +25 +-12 +-29 +24 +-13 +-30 +31 +-7 +-28 +42 +-1 +-25 +32 +-7 +-25 +26 +-11 +-29 +36 +-2 +-23 +31 +2 +-24 +27 +4 +-24 +34 +-5 +-16 +42 +1 +-26 +26 +-12 +-31 +41 +-1 +-28 +26 +-9 +-31 +31 +-8 +-26 +44 +-1 +-27 +33 +-2 +-24 +31 +-2 +-26 +29 +-7 +-22 +25 +-10 +-24 +25 +-12 +-30 +30 +-6 +-24 +28 +-9 +-20 +29 +-6 +-23 +30 +-8 +-28 +33 +-6 +-18 +29 +-9 +-22 +30 +-8 +-27 +34 +-5 +-26 +35 +-6 +-21 +29 +-8 +-29 +32 +5 +-21 +45 +2 +-27 +31 +-9 +-30 +30 +32 +23 +24 +21 +12 +8 +9 +8 +2 +14 +12 +22 +7 +-2 +1 +5 +9 +2 +14 +3 +-2 +7 +-2 +-3 +0 +11 +0 +5 +-3 +-7 +-1 +4 +8 +-4 +-4 +-2 +-1 +3 +-4 +-4 +-2 +9 +0 +-4 +8 +-2 +-1 +-5 +-3 +-2 +0 +4 +10 +-2 +-2 +13 +1 +3 +-4 +1 +12 +2 +7 +-6 +5 +-1 +-3 +-2 +15 +-1 +-2 +2 +0 +0 +-2 +-4 +4 +-5 +-3 +-4 +1 +16 +0 +0 +-3 +3 +9 +-6 +-2 +1 +-2 +3 +1 +13 +2 +-6 +1 +-4 +10 +-5 +-6 +-3 +3 +-5 +-8 +-4 +8 +0 +-7 +-6 +3 +17 +0 +-5 +-2 +13 +-2 +-1 +0 +13 +-1 +-5 +5 +-3 +8 +4 +1 +-4 +-37 +-46 +7 +-27 +-33 +16 +-21 +-40 +23 +-12 +-31 +23 +-14 +-35 +25 +-11 +-31 +30 +-5 +-27 +27 +-10 +-22 +31 +-8 +-28 +40 +-2 +-19 +29 +-10 +-30 +32 +-8 +-26 +39 +-2 +-20 +27 +-11 +-29 +30 +-5 +-29 +36 +-4 +-26 +28 +-7 +-29 +31 +-7 +-28 +38 +-2 +-26 +43 +-1 +-25 +37 +-1 +-27 +26 +-13 +-31 +32 +-4 +-12 +33 +-3 +-22 +25 +-10 +-20 +41 +2 +-22 +24 +-13 +-28 +29 +-7 +-29 +28 +-8 +-15 +29 +-10 +-28 +34 +-6 +-21 +27 +-11 +-26 +28 +-9 +-26 +26 +-10 +-27 +32 +-5 +-27 +30 +-7 +-27 +44 +2 +-24 +29 +-4 +-17 +52 +6 +-18 +26 +-13 +-31 +34 +-7 +-27 +32 +-9 +-19 +33 +-7 +-28 +27 +-6 +-25 +46 +2 +-24 +27 +-4 +-28 +26 +-10 +-28 +30 +-10 +-31 +23 +26 +23 +19 +20 +15 +12 +14 +10 +7 +22 +25 +8 +14 +3 +4 +3 +2 +4 +-1 +-3 +2 +1 +-4 +-2 +-2 +7 +-2 +0 +-1 +15 +2 +-3 +0 +14 +-2 +2 +-6 +-3 +-3 +-3 +6 +-3 +5 +1 +2 +4 +0 +-2 +-4 +-2 +8 +-2 +-5 +-1 +2 +-1 +0 +4 +0 +3 +3 +-1 +-4 +-7 +-4 +13 +6 +0 +-2 +3 +-2 +-3 +0 +2 +10 +-3 +-2 +1 +1 +-4 +3 +-3 +4 +4 +3 +13 +1 +14 +-1 +0 +-4 +-9 +-2 +-2 +-2 +-1 +-4 +13 +15 +-1 +-5 +-2 +3 +-3 +-4 +-2 +0 +2 +1 +1 +-4 +-4 +0 +-4 +12 +2 +-2 +3 +12 +0 +-4 +-1 +7 +-5 +5 +0 +1 +0 +-2 +9 +18 +-1 +-2 +-6 +-2 +-7 +-7 +-1 +6 +7 +-3 +1 +1 +-7 +-6 +0 +0 +-1 +-2 +5 +10 +-3 +16 +0 +-1 +-5 +-8 +-3 +0 +0 +2 +-1 +2 +-4 +-3 +-4 +2 +-1 +3 +7 +3 +-1 +16 +2 +-3 +5 +-2 +-5 +2 +7 +-3 +-5 +0 +-5 +-2 +1 +-3 +-2 +-2 +10 +6 +2 +-1 +0 +-2 +-1 +-2 +-1 +-1 +-2 +2 +7 +11 +3 +5 +0 +-5 +0 +0 +-4 +-4 +-2 +-6 +4 +3 +-2 +-2 +8 +3 +-3 +2 +4 +1 +-2 +-4 +4 +-2 +0 +-2 +-2 +-1 +7 +0 +12 +-1 +-1 +-3 +1 +7 +5 +9 +4 +0 +0 +-2 +-3 +-3 +-6 +10 +5 +-1 +7 +1 +-2 +-5 +-3 +-36 +-51 +23 +-17 +-38 +20 +-12 +-34 +15 +-21 +-37 +22 +-14 +-31 +39 +-4 +-16 +36 +-6 +-29 +26 +-12 +-32 +26 +-10 +-27 +29 +-10 +-25 +46 +3 +-26 +28 +-12 +-27 +26 +-11 +26 +-11 +-32 +29 +-9 +-29 +32 +-7 +-27 +28 +-7 +-23 +27 +-5 +-27 +38 +2 +-23 +39 +-2 +-27 +28 +-9 +-30 +32 +-5 +-28 +30 +-2 +-26 +29 +-7 +-29 +32 +-7 +-28 +34 +-5 +-28 +32 +-5 +-21 +36 +-1 +-27 +29 +-8 +-26 +28 +-8 +-21 +35 +-6 +-28 +30 +-7 +-28 +26 +-11 +-26 +28 +-5 +-25 +40 +0 +-19 +30 +-8 +-27 +32 +-7 +-26 +35 +-4 +-20 +30 +3 +-22 +32 +-6 +-28 +37 +-3 +-24 +33 +-6 +-18 +29 +-7 +-28 +31 +-7 +-27 +29 +-10 +-25 +31 +-1 +-12 +31 +-8 +-29 +31 +-8 +-30 +30 +-8 +-29 +29 +-8 +-22 +49 +4 +-22 +26 +-11 +-24 +33 +-7 +-22 +37 +-4 +-29 +38 +-4 +-27 +36 +-5 +-26 +29 +-10 +-28 +34 +-6 +-29 +31 +-9 +-27 +33 +-4 +-29 +36 +-6 +-16 +28 +-9 +-28 +26 +1 +-23 +26 +-10 +-24 +31 +-9 +-29 +31 +-7 +-27 +38 +2 +-16 +33 +-6 +-26 +29 +-9 +-29 +44 +4 +-26 +31 +-4 +-20 +29 +-7 +-26 +38 +-4 +-28 +24 +-12 +-25 +33 +-3 +-26 +29 +-5 +-20 +33 +-8 +-20 +34 +-5 +-29 +26 +-9 +-30 +26 +-11 +-26 +28 +-10 +-24 +39 +-3 +-23 +30 +-9 +-29 +32 +0 +-9 +31 +-6 +-29 +28 +-10 +-27 +30 +-2 +-24 +31 +-6 +-16 +46 +1 +-27 +28 +-10 +-24 +25 +-12 +-30 +38 +-1 +-26 +34 +-2 +-25 +44 +4 +-23 +24 +-12 +-29 +38 +-1 +-25 +31 +35 +16 +13 +14 +10 +12 +13 +6 +4 +7 +13 +7 +3 +1 +1 +5 +11 +3 +-2 +16 +15 +-1 +-4 +-1 +-3 +-2 +-2 +0 +2 +-3 +5 +1 +-1 +2 +-4 +-1 +-2 +3 +10 +3 +-4 +0 +6 +1 +-1 +-3 +6 +11 +-2 +-5 +1 +1 +-3 +-1 +-1 +2 +14 +1 +-6 +0 +-1 +-4 +-4 +-1 +4 +1 +-4 +-2 +4 +1 +2 +1 +-1 +-1 +5 +12 +-3 +4 +9 +14 +-2 +-4 +9 +10 +-5 +-7 +-7 +-5 +-5 +5 +-5 +1 +4 +5 +1 +-2 +-3 +3 +-5 +-2 +-5 +2 +3 +11 +0 +-4 +-2 +-7 +-3 +1 +-2 +6 +4 +6 +4 +1 +14 +-3 +4 +-5 +-4 +8 +12 +7 +-7 +-7 +-6 +-6 +-39 +-53 +11 +-23 +-42 +31 +-10 +-22 +19 +-16 +-35 +23 +-12 +-34 +29 +-10 +-26 +26 +-12 +-25 +27 +-7 +-30 +35 +-6 +-16 +44 +0 +-25 +24 +-14 +-33 +25 +-7 +-27 +35 +-6 +-26 +32 +-6 +28 +-10 +-31 +44 +0 +-26 +22 +-14 +-33 +34 +-7 +-23 +26 +-7 +-22 +25 +-1 +-25 +29 +-8 +-16 +41 +-2 +-16 +34 +-7 +-31 +24 +-14 +-21 +30 +-5 +-20 +41 +-3 +-27 +29 +-9 +-29 +46 +1 +-25 +26 +-11 +-27 +44 +0 +-28 +28 +-7 +-32 +28 +-3 +-29 +34 +-5 +-16 +43 +3 +-24 +22 +-7 +-26 +27 +-10 +-33 +36 +0 +-16 +30 +-10 +-32 +25 +-11 +-25 +27 +-10 +-29 +35 +-4 +-28 +28 +-10 +-25 +28 +-9 +-29 +29 +-9 +-28 +46 +3 +-22 +34 +-6 +-23 +44 +0 +-18 +26 +-13 +-16 +28 +-8 +6 +18 +17 +19 +11 +18 +11 +8 +7 +10 +6 +21 +9 +6 +2 +3 +2 +9 +18 +4 +3 +-1 +0 +4 +2 +4 +10 +11 +12 +-3 +-7 +-6 +-8 +0 +-2 +6 +-5 +-6 +14 +15 +7 +-5 +-3 +-6 +-4 +2 +10 +-3 +0 +-5 +-4 +-4 +-5 +-2 +-2 +-3 +2 +1 +9 +0 +-2 +-4 +-3 +9 +-1 +-1 +-2 +7 +-3 +-4 +3 +1 +-3 +7 +-2 +-4 +2 +-1 +-1 +13 +9 +-3 +5 +0 +-3 +-3 +-3 +2 +-3 +3 +9 +3 +13 +0 +-3 +7 +-5 +-5 +12 +-3 +-4 +7 +-5 +-6 +-5 +-3 +-5 +10 +-3 +14 +-1 +-6 +1 +0 +-6 +-5 +2 +-3 +-1 +-5 +4 +5 +0 +2 +0 +0 +-2 +-3 +17 +-21 +-47 +11 +-25 +-44 +13 +-21 +-41 +20 +-16 +-34 +26 +-10 +-32 +25 +-13 +-27 +29 +-9 +-26 +35 +-4 +-27 +28 +-8 +-15 +37 +-1 +-9 +30 +-9 +-29 +33 +1 +-25 +32 +-8 +-24 +26 +-10 +-28 +28 +-4 +-29 +31 +-9 +-28 +28 +-4 +-24 +31 +-4 +-18 +27 +-10 +-27 +36 +-5 +-24 +26 +-6 +-24 +32 +-6 +31 +-7 +-29 +27 +-9 +-30 +32 +-5 +-26 +29 +-8 +-25 +31 +-7 +-26 +29 +-4 +-21 +33 +-6 +-25 +31 +0 +-24 +27 +-5 +-28 +30 +-1 +-12 +34 +-7 +-28 +31 +-7 +-29 +31 +-1 +-21 +29 +-9 +-24 +32 +-7 +-28 +30 +-6 +-26 +28 +-6 +-26 +34 +-2 +-25 +45 +7 +-20 +33 +-6 +-29 +30 +-8 +-17 +31 +-6 +-31 +29 +-11 +-26 +37 +-4 +-29 +30 +-1 +-25 +26 +-8 +-29 +26 +48 +23 +21 +16 +14 +12 +9 +7 +5 +7 +5 +6 +2 +6 +4 +3 +5 +4 +6 +4 +3 +0 +-1 +1 +4 +5 +2 +1 +3 +-1 +-2 +5 +7 +9 +7 +9 +11 +8 +11 +3 +7 +-2 +-3 +-8 +-7 +2 +-4 +1 +-5 +-7 +-1 +-3 +-1 +-5 +-5 +1 +-4 +13 +-1 +-3 +11 +9 +12 +-1 +3 +3 +7 +3 +-3 +0 +-2 +-7 +-7 +1 +-7 +-2 +-2 +-4 +-4 +4 +4 +-1 +-6 +8 +-3 +10 +-1 +-4 +-4 +1 +-4 +-1 +3 +-3 +7 +7 +0 +-3 +0 +4 +-6 +-6 +5 +12 +0 +-3 +-3 +0 +-3 +-2 +2 +5 +1 +6 +-3 +-3 +-6 +-5 +-3 +-1 +-2 +-1 +3 +5 +1 +5 +11 +9 +-29 +-49 +8 +-26 +-42 +28 +-12 +-27 +21 +-16 +-33 +37 +-6 +-32 +31 +-9 +-31 +20 +-14 +-24 +35 +-6 +-21 +28 +-12 +-30 +36 +-2 +-27 +26 +-11 +-29 +27 +-12 +-15 +30 +-10 +-31 +25 +-11 +-31 +35 +-5 +-22 +28 +-9 +-28 +31 +-9 +-23 +31 +-6 +-27 +34 +-4 +-22 +46 +4 +-24 +30 +-8 +-31 +27 +-9 +-30 +49 +3 +-23 +28 +-7 +-27 +25 +-12 +-30 +37 +-3 +-25 +33 +-6 +-20 +33 +-5 +-26 +28 +-5 +-25 +30 +-3 +-27 +29 +-9 +-28 +34 +1 +-18 +30 +-7 +-14 +29 +-9 +-30 +37 +-5 +-26 +32 +1 +-18 +31 +-7 +-21 +26 +-12 +-31 +43 +-1 +-27 +27 +-6 +-28 +28 +-10 +-28 +34 +-1 +-25 +27 +-8 +-28 +27 +-6 +-24 +38 +-3 +-27 +31 +-2 +-24 +33 +-7 +-25 +30 +-1 +-25 +40 +29 +24 +16 +15 +16 +11 +7 +9 +6 +5 +7 +8 +18 +16 +3 +14 +-1 +0 +0 +6 +10 +0 +0 +8 +1 +-4 +-6 +-4 +-7 +0 +-1 +8 +3 +8 +-2 +-1 +-2 +7 +-4 +3 +-2 +-4 +-2 +16 +0 +0 +-2 +-3 +-4 +1 +-3 +-3 +-4 +5 +3 +3 +9 +0 +1 +-3 +-2 +-1 +-4 +1 +-4 +1 +9 +-1 +-1 +7 +-4 +0 +3 +-5 +-3 +10 +-1 +9 +6 +3 +-1 +-1 +3 +7 +14 +6 +-2 +-6 +-4 +5 +4 +-5 +0 +5 +-6 +0 +1 +-2 +-5 +0 +-2 +6 +3 +6 +-4 +11 +-3 +-2 +-8 +1 +-4 +5 +17 +6 +9 +-4 +-6 +-6 +-6 +-6 +0 +1 +-4 +-1 +0 +7 +1 +-6 +-1 +-3 +-4 +-1 +0 +1 +1 +2 +-2 +-1 +-1 +-1 +-4 +3 +6 +12 +0 +-1 +2 +-3 +5 +7 +11 +0 +-4 +-1 +4 +4 +-3 +2 +-2 +-5 +16 +1 +-1 +2 +-6 +-5 +-4 +1 +3 +7 +7 +0 +-5 +4 +1 +-6 +-4 +-2 +3 +4 +0 +-2 +1 +0 +-4 +0 +2 +-2 +-1 +1 +-2 +5 +15 +7 +-5 +1 +-4 +14 +-1 +-5 +-6 +0 +8 +15 +5 +1 +-4 +-7 +-6 +0 +0 +-4 +2 +1 +6 +-4 +-7 +-3 +-3 +2 +4 +-2 +-2 +-3 +12 +2 +2 +-3 +-4 +1 +-2 +12 +-2 +-3 +-6 +6 +6 +-1 +8 +3 +14 +10 +0 +-4 +-6 +1 +-3 +-2 +-8 +8 +-4 +14 +-2 +9 +3 +8 +-30 +-51 +17 +-21 +-43 +11 +-24 +-42 +24 +-10 +-31 +25 +-15 +-30 +21 +-14 +-35 +32 +-9 +-30 +24 +-9 +-31 +31 +-9 +-29 +32 +-7 +-25 +31 +-8 +-28 +31 +-7 +-22 +29 +-7 +-14 +52 +6 +-21 +30 +-9 +-22 +30 +-9 +-29 +27 +-4 +-28 +28 +-10 +-29 +38 +-5 +-27 +28 +-9 +-28 +41 +-1 +-27 +27 +-1 +-21 +31 +-9 +-25 +34 +-5 +-24 +25 +-13 +-30 +29 +-7 +-25 +32 +-7 +-27 +32 +4 +-23 +31 +-8 +-27 +35 +-6 +-28 +40 +-3 +-27 +31 +-7 +-25 +32 +-6 +-23 +26 +-7 +-29 +30 +-8 +-28 +37 +-2 +-28 +31 +-8 +-25 +28 +5 +-23 +38 +-4 +-28 +31 +-6 +-27 +39 +-3 +-27 +31 +-8 +-23 +37 +-4 +-24 +32 +-4 +-28 +28 +-11 +-30 +32 +-7 +-22 +29 +-10 +-26 +37 +4 +-23 +35 +38 +19 +14 +19 +14 +29 +10 +14 +7 +2 +2 +18 +5 +6 +1 +6 +0 +-2 +2 +11 +2 +12 +2 +3 +-3 +-4 +-3 +-2 +-3 +-2 +-2 +1 +8 +-2 +-4 +-3 +-2 +5 +8 +-2 +-5 +-4 +1 +4 +-1 +9 +6 +-3 +-3 +-3 +2 +7 +1 +-2 +4 +9 +-4 +-2 +-1 +5 +3 +-4 +-4 +3 +1 +3 +13 +11 +-5 +-5 +-4 +-1 +-4 +-7 +8 +0 +-3 +-1 +-1 +0 +-5 +8 +12 +3 +-3 +0 +-3 +-4 +1 +6 +4 +-1 +0 +0 +-4 +-2 +3 +-2 +1 +7 +2 +-2 +4 +0 +-4 +5 +-3 +0 +-5 +-2 +-2 +10 +2 +5 +8 +-3 +-1 +2 +5 +-4 +9 +5 +4 +-3 +0 +-1 +-2 +6 +-31 +-50 +12 +-24 +-35 +18 +-18 +-38 +27 +-12 +-36 +21 +-15 +-30 +22 +-6 +-28 +23 +-14 +-31 +27 +-10 +-25 +32 +-2 +-26 +28 +-1 +-22 +33 +-5 +-24 +26 +-11 +-28 +30 +-8 +-23 +40 +-1 +-19 +33 +-7 +-27 +32 +-6 +-26 +28 +-9 +-24 +43 +0 +-11 +30 +-9 +-25 +27 +-11 +-29 +29 +-10 +-28 +44 +5 +-25 +35 +-3 +-9 +30 +-9 +-30 +30 +-10 +-26 +28 +-6 +-27 +27 +-11 +-29 +27 +-4 +-11 +34 +-7 +-17 +40 +-2 +-28 +28 +-8 +-30 +27 +-7 +-28 +44 +1 +-26 +26 +-10 +-30 +32 +-9 +-28 +33 +-6 +-27 +28 +-9 +-29 +35 +3 +-22 +27 +-2 +-26 +33 +-5 +-21 +27 +-11 +-30 +42 +1 +-26 +30 +-2 +-27 +30 +-9 +-26 +28 +-3 +-26 +34 +-5 +-21 +29 +-9 +-16 +45 +1 +-28 +22 +25 +21 +15 +21 +11 +10 +8 +26 +9 +12 +11 +0 +19 +3 +-3 +-6 +7 +-1 +-2 +-1 +-1 +2 +11 +16 +16 +11 +-5 +-6 +0 +-3 +7 +7 +-5 +3 +-4 +-4 +11 +-1 +0 +2 +-6 +-6 +-6 +-5 +-4 +-3 +0 +-2 +-2 +-4 +10 +4 +-4 +-2 +1 +15 +-2 +2 +-1 +6 +-3 +4 +6 +-5 +-5 +2 +-1 +-3 +2 +5 +3 +-2 +1 +-3 +-1 +-3 +-4 +-1 +4 +-5 +0 +5 +-1 +-5 +4 +6 +1 +10 +-2 +-1 +3 +-2 +4 +3 +-2 +4 +-4 +-5 +2 +4 +6 +-4 +3 +-4 +-6 +3 +-1 +-1 +-1 +-4 +-4 +-4 +11 +3 +1 +-2 +1 +3 +-3 +5 +1 +7 +-2 +1 +11 +-1 +-3 +1 +-34 +-49 +15 +-20 +-43 +20 +-14 +-37 +25 +-9 +-27 +26 +-13 +-33 +34 +-6 +-31 +27 +-9 +-30 +22 +-9 +-19 +32 +-7 +-30 +26 +-11 +-27 +29 +-8 +-28 +39 +0 +-25 +26 +-9 +-28 +30 +-8 +29 +-9 +-30 +31 +-9 +-26 +28 +3 +-24 +28 +2 +-24 +30 +-8 +-30 +30 +-9 +-24 +29 +-9 +-28 +29 +-9 +-25 +29 +-6 +-27 +31 +-4 +-25 +29 +-3 +-23 +43 +5 +-18 +47 +3 +-26 +27 +-8 +-30 +28 +-9 +-25 +45 +3 +-25 +25 +-13 +-32 +34 +-7 +-26 +31 +-8 +-28 +37 +2 +-24 +28 +-8 +-26 +28 +-10 +-28 +29 +-9 +-27 +47 +3 +-25 +33 +-6 +-27 +33 +-7 +-30 +28 +-8 +-27 +28 +-1 +-16 +28 +-7 +-23 +28 +-9 +-22 +31 +-8 +-21 +36 +-1 +-17 +35 +-5 +-30 +37 +-5 +-29 +26 +-8 +-28 +32 +-8 +-24 +38 +-4 +-26 +28 +-11 +-22 +26 +-3 +-22 +27 +-11 +-23 +29 +-8 +-28 +45 +6 +-22 +34 +-6 +-28 +32 +-9 +-29 +41 +6 +-23 +32 +-7 +-26 +36 +-3 +-28 +26 +-8 +-30 +33 +-5 +-26 +25 +-9 +-29 +31 +-6 +-28 +39 +-2 +-26 +28 +-11 +-28 +26 +-6 +-27 +29 +-7 +-15 +30 +-9 +-29 +35 +-2 +-26 +47 +2 +-22 +30 +-9 +-29 +30 +-10 +-26 +28 +-10 +-28 +31 +-7 +-27 +31 +-2 +-26 +42 +5 +-13 +29 +-10 +-28 +31 +-9 +-25 +30 +-8 +-11 +32 +-8 +-24 +28 +-8 +-19 +28 +-10 +-27 +29 +-5 +-25 +27 +-9 +-25 +30 +-7 +-27 +36 +-5 +-27 +44 +1 +-23 +37 +-3 +-26 +30 +-8 +-25 +29 +-11 +-28 +25 +-11 +-27 +32 +-6 +-28 +31 +-5 +-15 +46 +2 +-21 +34 +29 +17 +18 +10 +10 +21 +13 +13 +16 +4 +19 +23 +4 +1 +-3 +16 +1 +-1 +-3 +8 +-4 +-5 +-5 +-3 +-1 +4 +2 +4 +22 +2 +12 +-1 +0 +-9 +-7 +2 +7 +-1 +-3 +-1 +5 +-3 +-6 +-4 +-5 +14 +0 +-3 +-1 +-2 +-3 +-3 +2 +-4 +0 +-1 +-3 +2 +16 +-1 +3 +-5 +-3 +-4 +-1 +9 +7 +-3 +-1 +1 +-1 +-2 +1 +0 +3 +-1 +-2 +0 +4 +-6 +-2 +4 +8 +6 +7 +-1 +-4 +-4 +5 +14 +1 +-3 +-6 +-4 +-2 +10 +10 +-4 +5 +-1 +5 +4 +4 +-6 +-1 +1 +-4 +-6 +-3 +12 +0 +3 +-1 +-3 +-5 +-1 +-2 +-5 +-3 +-3 +-2 +9 +3 +-4 +2 +-1 +4 +9 +-6 +-3 +-2 +-2 +7 +9 +-2 +-1 +3 +0 +1 +12 +0 +-4 +-3 +-1 +-4 +1 +1 +2 +-2 +0 +15 +5 +11 +8 +6 +11 +-4 +-7 +-4 +2 +-5 +-6 +-6 +10 +8 +1 +-3 +-2 +5 +-5 +5 +2 +-6 +3 +5 +0 +-3 +-1 +-6 +-1 +-5 +-3 +-2 +-1 +0 +-5 +-1 +4 +4 +-3 +0 +2 +-2 +0 +3 +1 +-2 +-3 +14 +12 +13 +6 +-6 +14 +-2 +-1 +0 +3 +4 +-7 +1 +-6 +-1 +-1 +-6 +9 +14 +-1 +-6 +-4 +0 +0 +1 +-1 +-2 +6 +-5 +-6 +-1 +5 +-5 +-4 +3 +-2 +-2 +-1 +3 +0 +3 +0 +-5 +5 +8 +-3 +10 +-4 +-2 +3 +-5 +11 +0 +-6 +0 +-2 +-4 +4 +-27 +-44 +9 +-25 +-42 +14 +-20 +-36 +22 +-14 +-34 +23 +-7 +-31 +33 +-6 +-25 +23 +-3 +-27 +34 +-4 +-26 +37 +-5 +-29 +33 +-6 +-29 +32 +-7 +-28 +26 +-12 +-29 +28 +-8 +-26 +36 +-5 +-28 +36 +-3 +-26 +47 +8 +-22 +34 +2 +-26 +22 +-10 +-25 +30 +-8 +-25 +25 +-12 +-31 +35 +-5 +-19 +41 +-2 +-24 +24 +-11 +-31 +44 +4 +-19 +25 +-12 +-29 +35 +-6 +-26 +26 +-10 +-31 +27 +-10 +-24 +35 +-5 +-26 +31 +-8 +-25 +40 +-2 +-28 +31 +-8 +-26 +33 +-5 +-25 +46 +1 +-26 +31 +-9 +-30 +33 +-6 +-29 +28 +-10 +-29 +27 +-11 +-25 +26 +-10 +-29 +38 +3 +-14 +30 +-3 +-26 +32 +-8 +-29 +33 +-4 +-28 +30 +-7 +-21 +30 +1 +-25 +30 +-7 +-23 +33 +2 +-25 +38 +-4 +-24 +34 +23 +17 +14 +13 +27 +15 +9 +8 +8 +8 +22 +9 +3 +10 +3 +-2 +0 +16 +1 +-1 +-2 +-1 +6 +12 +3 +0 +-1 +14 +4 +-5 +-3 +-3 +1 +2 +-5 +12 +11 +0 +6 +12 +6 +-3 +-1 +-7 +-4 +-10 +-6 +-1 +-3 +-3 +0 +-2 +-3 +-1 +2 +3 +4 +19 +1 +3 +11 +4 +-6 +-1 +4 +-2 +-6 +1 +-3 +-8 +1 +-2 +0 +-1 +13 +-2 +3 +-1 +-4 +2 +1 +15 +0 +-4 +4 +-4 +-8 +-6 +2 +-2 +-1 +-6 +1 +18 +1 +-1 +-4 +-1 +9 +6 +3 +-3 +-5 +-1 +-4 +1 +7 +-2 +4 +-4 +3 +-2 +0 +-2 +11 +19 +2 +-8 +2 +-3 +0 +-4 +-6 +-8 +-3 +18 +2 +10 +-26 +-50 +13 +-25 +-38 +14 +-22 +-32 +19 +-18 +-35 +17 +-11 +-24 +25 +-14 +-30 +26 +-11 +-32 +36 +-5 +-28 +26 +-7 +-29 +28 +-8 +-25 +28 +-9 +-29 +39 +-4 +-26 +28 +-9 +-19 +31 +-5 +-28 +34 +-5 +-23 +31 +-9 +-23 +41 +-1 +-26 +27 +-10 +-28 +28 +-3 +-27 +28 +-4 +-27 +28 +-9 +-22 +31 +-7 +-27 +30 +-7 +-24 +31 +-8 +-26 +46 +3 +-25 +29 +-10 +-29 +30 +-7 +-28 +31 +-7 +-27 +41 +3 +-20 +28 +-10 +-28 +41 +0 +-24 +29 +-9 +-28 +40 +0 +-23 +37 +-4 +-24 +28 +-10 +-29 +32 +-8 +-28 +28 +-7 +-25 +28 +-8 +-18 +30 +1 +-24 +32 +-5 +-25 +32 +-8 +-24 +28 +-9 +-28 +27 +-7 +-28 +32 +-8 +-14 +39 +8 +-22 +34 +-6 +-27 +28 +-1 +-9 +30 +-10 +-27 +27 +40 +18 +21 +28 +11 +8 +12 +4 +11 +2 +13 +3 +16 +6 +12 +3 +-2 +0 +-2 +-1 +-4 +-4 +-1 +-1 +5 +2 +-4 +13 +8 +-1 +2 +-3 +5 +0 +3 +-4 +0 +-4 +-1 +3 +-3 +4 +-1 +-4 +-2 +16 +4 +0 +8 +0 +-6 +-4 +-3 +-3 +-1 +0 +15 +12 +13 +1 +-3 +-2 +-4 +-2 +4 +2 +-3 +3 +6 +-5 +1 +-2 +-3 +-4 +-2 +-4 +-2 +-4 +11 +-1 +-3 +-2 +-3 +0 +11 +14 +2 +3 +1 +4 +-4 +12 +9 +-5 +-6 +6 +-5 +-7 +-4 +-6 +2 +-1 +-3 +4 +-3 +-4 +4 +10 +-3 +-4 +-5 +5 +5 +-4 +3 +0 +3 +-5 +6 +-2 +1 +-2 +6 +10 +1 +-6 +-3 +-2 +-36 +-51 +9 +-25 +-33 +19 +-18 +-36 +23 +-15 +-33 +31 +-9 +-30 +27 +-11 +-27 +23 +-13 +-25 +26 +-11 +-24 +30 +-8 +-27 +47 +3 +-22 +30 +-6 +-30 +27 +-8 +-29 +38 +0 +-25 +30 +-9 +-28 +28 +-10 +-26 +30 +-9 +-24 +26 +-9 +-26 +30 +-3 +-12 +47 +3 +-26 +27 +-9 +-23 +27 +-10 +-27 +39 +-3 +-24 +29 +-8 +-31 +32 +-8 +-21 +36 +-4 +-23 +32 +-8 +-26 +26 +-9 +-28 +30 +-9 +-26 +46 +2 +-26 +39 +-4 +-16 +39 +3 +-27 +25 +-14 +-33 +36 +-5 +-30 +29 +-6 +-26 +31 +-8 +-27 +27 +-8 +-28 +36 +-4 +-29 +28 +-9 +-22 +46 +3 +-20 +27 +-11 +-29 +34 +-3 +-21 +31 +-8 +-30 +25 +-8 +-28 +27 +-10 +-27 +29 +-7 +-27 +29 +-5 +-25 +33 +-6 +-12 +32 +-8 +-16 +29 +24 +17 +18 +24 +13 +16 +10 +12 +7 +12 +5 +12 +12 +19 +14 +12 +-2 +-5 +-3 +-5 +-3 +8 +3 +-7 +5 +-3 +-1 +11 +-1 +-4 +-1 +-2 +0 +-5 +-3 +-4 +5 +12 +8 +-1 +-4 +2 +1 +-1 +-2 +-4 +2 +2 +14 +11 +11 +0 +-4 +0 +-7 +-1 +-2 +-4 +-3 +-3 +-2 +-1 +-1 +7 +-1 +14 +3 +0 +-4 +3 +4 +4 +-4 +4 +-4 +-4 +5 +-5 +5 +-4 +-3 +11 +5 +-6 +1 +1 +-4 +-2 +-4 +-1 +12 +-2 +-1 +-7 +-3 +11 +16 +1 +-3 +15 +-1 +-6 +-7 +0 +2 +1 +-6 +-1 +-6 +-6 +-6 +0 +5 +11 +4 +8 +12 +13 +12 +-2 +-9 +-8 +-6 +-6 +-5 +-7 +6 +3 +-33 +-51 +11 +-25 +-44 +20 +-18 +-38 +29 +-11 +-34 +30 +-9 +-29 +23 +-12 +-30 +25 +-8 +-14 +30 +-9 +-16 +26 +-9 +-32 +29 +-10 +-18 +37 +-4 +-28 +29 +-6 +-29 +25 +-11 +-31 +30 +-7 +-28 +32 +-3 +-21 +33 +-7 +-17 +36 +-5 +-26 +26 +-1 +-25 +32 +-7 +-28 +34 +-7 +-23 +29 +-9 +-27 +30 +-8 +-22 +29 +-9 +-28 +39 +-3 +-23 +31 +-1 +-17 +38 +-4 +-27 +31 +-6 +-30 +33 +-4 +-27 +30 +-7 +-29 +36 +-2 +-26 +34 +-6 +-28 +33 +-7 +-16 +30 +-5 +-29 +26 +-6 +-20 +38 +-3 +-28 +33 +-4 +-27 +38 +6 +-24 +30 +-10 +-27 +30 +-8 +-31 +33 +-3 +-14 +44 +1 +-28 +30 +-10 +-32 +30 +0 +-28 +31 +-10 +-31 +34 +-4 +-24 +31 +-4 +-26 +30 +-6 +-28 +26 +-11 +-28 +27 +26 +19 +34 +16 +15 +11 +15 +14 +8 +7 +5 +4 +7 +9 +2 +2 +0 +4 +3 +5 +1 +-1 +-2 +2 +1 +11 +4 +2 +-3 +5 +15 +8 +0 +-2 +5 +-5 +5 +-3 +1 +6 +8 +-6 +-1 +-6 +-6 +-3 +-1 +-3 +2 +9 +4 +-4 +0 +2 +-1 +-2 +-1 +2 +6 +-2 +-5 +-3 +5 +5 +-1 +-1 +7 +-1 +-7 +-6 +3 +-1 +-1 +-1 +5 +6 +-2 +-1 +3 +-3 +4 +-3 +-1 +-1 +5 +0 +-1 +1 +-3 +-1 +1 +-3 +7 +14 +14 +-2 +11 +-3 +-6 +-5 +-5 +-2 +-5 +-2 +4 +-4 +2 +-1 +-2 +16 +1 +-3 +0 +-4 +-3 +-1 +5 +-4 +0 +2 +-1 +15 +11 +12 +-1 +4 +8 +4 +-32 +-51 +16 +-23 +-43 +11 +-21 +-38 +14 +-20 +-35 +19 +-13 +-33 +22 +-14 +-32 +39 +-3 +-28 +39 +-3 +-29 +25 +-12 +-31 +29 +-9 +-20 +29 +0 +-24 +42 +0 +-17 +27 +-9 +-30 +38 +-4 +-16 +34 +-6 +-28 +45 +0 +-27 +25 +-10 +-32 +34 +-6 +-30 +27 +-6 +-28 +26 +-7 +-23 +26 +-10 +-31 +34 +-6 +-10 +31 +-6 +-30 +39 +-3 +-25 +28 +-10 +-22 +31 +-8 +-28 +45 +1 +-20 +41 +-2 +-18 +35 +-5 +-20 +33 +-8 +-31 +25 +-7 +-31 +31 +-9 +-27 +33 +-3 +-29 +32 +-9 +-28 +28 +-9 +-28 +32 +-3 +-27 +32 +-5 +-29 +25 +-10 +-28 +29 +-8 +-24 +32 +-7 +-24 +31 +-7 +-18 +35 +-1 +-20 +29 +-9 +-29 +29 +-8 +-28 +37 +-4 +-27 +36 +-2 +-25 +33 +-4 +-19 +29 +-2 +-24 +28 +26 +33 +20 +15 +16 +9 +17 +12 +5 +4 +9 +12 +3 +2 +2 +0 +1 +2 +5 +-1 +6 +5 +1 +1 +7 +0 +5 +2 +4 +-2 +-1 +2 +-1 +4 +-2 +9 +3 +-3 +-4 +-2 +9 +7 +-1 +6 +-1 +-3 +7 +10 +-4 +0 +-3 +0 +9 +0 +-5 +-8 +1 +-5 +-1 +-2 +-2 +7 +-3 +-3 +4 +-5 +3 +-1 +0 +7 +1 +-2 +5 +-2 +0 +1 +2 +4 +1 +-4 +-2 +5 +-3 +2 +-3 +0 +-2 +0 +-2 +-1 +-2 +7 +-1 +-1 +2 +2 +-2 +4 +-1 +6 +0 +5 +1 +-3 +2 +0 +-4 +4 +4 +3 +-2 +5 +-1 +-4 +-6 +3 +4 +7 +5 +0 +-1 +10 +4 +5 +-3 +0 +-3 +-3 +-36 +2 +-29 +-48 +14 +-23 +-41 +17 +-15 +-37 +21 +-9 +-13 +27 +-10 +-33 +25 +-9 +-28 +32 +-7 +-19 +27 +-12 +-22 +40 +1 +-21 +39 +-4 +-29 +25 +-11 +-32 +28 +-7 +-30 +27 +-11 +-26 +33 +-8 +-27 +31 +-7 +-26 +33 +1 +-24 +28 +-1 +-24 +44 +0 +-24 +28 +-7 +-26 +31 +-9 +-29 +44 +1 +-25 +28 +0 +-27 +31 +-8 +-26 +33 +-8 +-29 +42 +1 +-27 +28 +-12 +-31 +27 +-9 +-18 +32 +-7 +-16 +30 +-9 +-16 +32 +-3 +-25 +27 +0 +-27 +27 +-5 +-22 +32 +-7 +-25 +33 +-5 +-28 +29 +-7 +-29 +33 +-8 +-26 +29 +-9 +-16 +30 +-10 +-28 +38 +-4 +-24 +27 +-12 +-28 +29 +-6 +-25 +32 +-1 +-24 +28 +-9 +-28 +31 +-2 +-24 +31 +-7 +-27 +29 +-3 +-24 +39 +-2 +-24 +42 +-1 +17 +20 +28 +21 +23 +20 +9 +6 +13 +10 +7 +2 +0 +-1 +6 +9 +1 +13 +4 +-2 +0 +5 +-4 +-3 +0 +8 +5 +0 +-2 +-1 +1 +2 +-2 +5 +3 +-1 +-2 +8 +2 +-2 +6 +1 +6 +-4 +11 +-2 +-2 +-2 +6 +-1 +9 +-4 +0 +-4 +0 +-2 +-3 +0 +-3 +-3 +5 +-3 +17 +0 +1 +-4 +-2 +-5 +16 +0 +0 +-1 +-4 +-1 +5 +14 +-3 +-4 +-5 +-1 +-1 +-5 +2 +0 +-4 +16 +2 +0 +-4 +-3 +5 +-2 +-4 +-3 +-5 +-6 +-4 +-1 +9 +9 +16 +-1 +3 +-5 +-2 +-1 +11 +-1 +-2 +0 +-3 +0 +-4 +-2 +2 +0 +-2 +-1 +2 +8 +0 +4 +8 +8 +-2 +5 +19 +-1 +9 +-28 +-49 +4 +-26 +-30 +15 +-21 +-39 +21 +-14 +-30 +26 +-4 +-31 +21 +-15 +-34 +24 +-12 +-24 +28 +-10 +-27 +33 +-6 +-18 +30 +-8 +-27 +33 +-8 +-26 +27 +-10 +-14 +35 +-7 +-26 +36 +-5 +-29 +29 +-11 +-27 +33 +-8 +-28 +29 +-9 +-25 +28 +-10 +-28 +29 +-8 +-26 +33 +-5 +-27 +34 +-5 +-26 +28 +-4 +-26 +33 +-6 +-26 +29 +-7 +-26 +42 +1 +-24 +31 +-5 +-24 +33 +-5 +-19 +45 +1 +-26 +37 +-4 +-28 +29 +-9 +-29 +29 +-9 +-18 +38 +-1 +-17 +42 +2 +-27 +23 +-14 +-32 +27 +-9 +-20 +33 +-5 +-29 +27 +-8 +-26 +26 +-11 +-27 +30 +-7 +-22 +39 +6 +-23 +28 +1 +-24 +31 +-7 +-24 +38 +-1 +-26 +27 +-10 +-32 +26 +-13 +-28 +33 +-1 +-22 +48 +3 +-24 +28 +-10 +-18 +20 +16 +27 +21 +32 +16 +9 +6 +4 +10 +7 +5 +3 +6 +15 +14 +7 +2 +3 +-3 +-2 +-1 +-4 +2 +2 +-4 +13 +-1 +3 +-3 +3 +-4 +1 +1 +2 +-3 +-3 +-2 +-2 +5 +11 +6 +-1 +9 +3 +-4 +-2 +-4 +9 +11 +2 +13 +8 +-2 +-4 +-7 +-3 +-2 +-1 +3 +1 +-6 +0 +2 +20 +0 +-1 +-2 +-4 +-4 +-5 +-6 +0 +2 +1 +-5 +1 +-3 +1 +-3 +11 +8 +-2 +6 +7 +-1 +-4 +-4 +5 +6 +12 +2 +-7 +7 +5 +0 +11 +-5 +-6 +-2 +-6 +-5 +8 +-2 +-4 +-1 +-1 +4 +3 +-7 +8 +0 +-6 +-2 +-4 +-8 +-6 +-4 +-3 +15 +17 +-1 +-1 +4 +15 +13 +1 +-6 +8 +-29 +-45 +9 +-24 +-47 +14 +-22 +-42 +17 +-14 +-33 +19 +-6 +-30 +28 +-7 +-32 +25 +-12 +-22 +26 +-10 +-32 +42 +-1 +-27 +27 +-10 +-31 +36 +1 +-27 +27 +-10 +-28 +26 +-12 +-21 +35 +-5 +-28 +36 +-3 +-25 +28 +0 +-22 +46 +1 +-27 +26 +2 +-26 +34 +-7 +-30 +30 +-7 +-17 +30 +-10 +-31 +28 +-10 +-30 +27 +-10 +-29 +28 +-8 +-26 +32 +-7 +-21 +29 +-7 +-25 +39 +-2 +-25 +39 +-3 +-24 +29 +-9 +-28 +30 +-6 +-29 +41 +-2 +-23 +28 +-7 +-27 +27 +-7 +-24 +31 +-6 +-27 +44 +4 +-12 +34 +-7 +-29 +27 +-9 +-29 +38 +-3 +-21 +40 +-1 +-26 +30 +-2 +-27 +25 +-2 +-26 +44 +1 +-26 +28 +-10 +-32 +26 +-11 +-29 +27 +-5 +-15 +46 +2 +-13 +30 +-11 +-30 +24 +-11 +-31 +18 +23 +22 +26 +17 +13 +14 +24 +9 +5 +8 +5 +1 +15 +21 +4 +-1 +1 +-1 +3 +5 +0 +1 +-4 +0 +5 +3 +17 +1 +10 +11 +-5 +6 +-6 +3 +-5 +-2 +0 +-2 +1 +3 +-2 +1 +-6 +-5 +0 +4 +2 +-3 +-2 +-1 +-3 +1 +4 +-2 +-4 +13 +9 +-2 +-5 +5 +-2 +-2 +-2 +-1 +3 +10 +-2 +-5 +-3 +3 +1 +3 +5 +-1 +1 +10 +16 +-1 +-4 +-5 +-3 +0 +5 +-2 +9 +-4 +-4 +12 +-3 +-5 +4 +-1 +-5 +6 +8 +-3 +-6 +-7 +10 +-2 +-6 +-6 +-4 +0 +15 +1 +10 +3 +3 +-1 +-4 +-5 +1 +-2 +-1 +8 +5 +1 +-5 +-5 +-3 +-2 +7 +5 +-4 +-2 +-3 +14 +-24 +-47 +12 +-23 +-45 +15 +-22 +-39 +16 +-19 +-25 +23 +-13 +-34 +32 +-7 +-31 +24 +-11 +-28 +31 +-7 +-26 +28 +-6 +-9 +31 +-6 +-21 +27 +-11 +-17 +37 +-3 +-23 +34 +-8 +-30 +37 +-4 +-25 +27 +-11 +-31 +38 +-3 +-27 +31 +0 +-26 +41 +-1 +-25 +25 +-11 +-29 +23 +-11 +-15 +32 +-8 +-26 +36 +-4 +-16 +30 +-3 +-19 +24 +-4 +-24 +28 +-10 +-31 +27 +-10 +-29 +37 +-3 +-22 +41 +-1 +-21 +26 +-13 +-20 +26 +-9 +-30 +33 +-7 +-27 +40 +2 +-12 +31 +-9 +-26 +25 +-7 +-17 +27 +-11 +-26 +36 +-5 +-27 +26 +-11 +-19 +32 +-7 +-22 +42 +0 +-27 +30 +-8 +-15 +32 +-9 +-23 +47 +3 +-24 +23 +-3 +-28 +28 +-10 +-25 +29 +-8 +-28 +46 +2 +-26 +32 +-7 +-25 +29 +-10 +-32 +30 +-9 +-21 +30 +-9 +-31 +33 +-8 +-27 +31 +-7 +-30 +45 +5 +-13 +42 +1 +-26 +21 +-15 +-25 +24 +-10 +-32 +25 +-11 +-29 +28 +-9 +-30 +35 +-4 +-26 +32 +-1 +-22 +28 +-11 +-28 +33 +-5 +-26 +29 +-7 +-29 +32 +-2 +-24 +46 +4 +-21 +30 +-9 +-24 +27 +-9 +-22 +31 +-3 +-28 +28 +2 +-24 +29 +-9 +-24 +37 +-4 +-24 +37 +-3 +-26 +33 +-8 +-29 +32 +-7 +-27 +37 +-3 +-26 +35 +-6 +-22 +41 +-3 +-25 +35 +-5 +-18 +32 +-9 +-30 +27 +-1 +-28 +29 +-7 +-28 +42 +-1 +-26 +37 +-6 +-25 +36 +-1 +-29 +28 +-11 +-30 +40 +-2 +-30 +25 +-12 +-28 +32 +-8 +-21 +30 +-4 +-21 +25 +-7 +-24 +27 +-1 +-26 +39 +4 +-23 +27 +-11 +-30 +24 +-12 +-26 +30 +-9 +-25 +46 +2 +-21 +15 +27 +28 +19 +16 +20 +15 +12 +12 +11 +4 +2 +8 +5 +5 +1 +2 +-2 +5 +7 +10 +11 +2 +-4 +-4 +-4 +4 +1 +-2 +-1 +0 +-2 +8 +1 +15 +0 +1 +5 +-4 +3 +16 +0 +-2 +-5 +12 +13 +10 +-7 +-5 +-5 +-4 +8 +1 +-4 +-5 +-1 +-5 +-1 +-2 +-5 +18 +0 +-2 +2 +-5 +-8 +11 +-3 +0 +-3 +-2 +-4 +3 +9 +1 +-2 +3 +0 +-2 +-5 +-2 +-3 +-4 +-1 +0 +9 +1 +-1 +6 +-1 +2 +-6 +-2 +-1 +5 +-1 +14 +4 +-4 +-5 +1 +3 +-5 +-5 +2 +4 +2 +2 +-5 +-2 +5 +0 +-2 +2 +10 +2 +-1 +-3 +0 +0 +2 +0 +2 +-3 +13 +-1 +0 +-2 +5 +11 +-2 +-7 +6 +15 +15 +-3 +-5 +-2 +-5 +-4 +-4 +-5 +-1 +-3 +-2 +14 +2 +-5 +-4 +4 +4 +-5 +2 +8 +4 +-4 +-5 +-2 +9 +-4 +-2 +3 +7 +0 +-4 +-4 +-1 +-2 +-2 +-2 +9 +-2 +-5 +0 +3 +-3 +-1 +0 +3 +-3 +12 +6 +-4 +-3 +-2 +3 +4 +6 +3 +-3 +-3 +3 +-3 +5 +0 +13 +10 +-2 +-5 +-4 +6 +-3 +0 +-4 +6 +-4 +-1 +6 +1 +-4 +13 +0 +-4 +-3 +-5 +2 +2 +-3 +-1 +-1 +9 +11 +11 +2 +-3 +-4 +-6 +2 +-3 +-2 +-2 +-1 +-6 +0 +2 +6 +4 +3 +14 +11 +3 +-1 +-4 +-5 +4 +15 +-1 +-6 +-6 +-8 +0 +0 +-2 +6 +-2 +1 +13 +-25 +-48 +8 +-27 +-46 +18 +-19 +-36 +18 +-16 +-37 +30 +-6 +-29 +24 +-13 +-31 +26 +-11 +-27 +29 +-4 +-27 +30 +-8 +-23 +34 +0 +-27 +29 +-9 +-30 +28 +-9 +-26 +46 +2 +-11 +45 +1 +-28 +29 +-11 +-27 +26 +-9 +-23 +30 +-10 +-18 +34 +-7 +-23 +40 +-4 +-28 +25 +-12 +-31 +31 +-9 +-20 +27 +-8 +-27 +34 +-1 +-25 +27 +-10 +-21 +30 +-10 +-30 +29 +-6 +-18 +33 +-6 +-23 +43 +2 +-26 +27 +-11 +-31 +38 +-3 +-25 +27 +-11 +-25 +27 +-7 +-29 +31 +-3 +-14 +34 +-5 +-26 +30 +-10 +-30 +29 +-8 +-23 +29 +-10 +-24 +30 +-6 +-24 +30 +-8 +-26 +32 +1 +-23 +31 +-7 +-27 +43 +5 +-24 +37 +-4 +-28 +28 +-6 +-15 +35 +-6 +-30 +38 +-3 +-29 +33 +-8 +-27 +28 +-8 +-26 +17 +22 +26 +16 +19 +22 +28 +22 +9 +4 +11 +9 +2 +-1 +0 +4 +4 +1 +2 +5 +2 +0 +4 +0 +5 +-2 +0 +13 +5 +-3 +4 +-1 +3 +-3 +-4 +1 +0 +-5 +2 +0 +-2 +1 +5 +7 +1 +3 +12 +-1 +-3 +1 +-3 +10 +3 +-1 +-5 +2 +0 +8 +-2 +6 +-3 +-4 +-3 +-4 +12 +-1 +3 +4 +0 +-2 +15 +0 +-1 +2 +-5 +6 +-4 +14 +-1 +-6 +3 +10 +10 +-5 +-4 +-6 +-5 +-7 +-1 +-4 +1 +-5 +-1 +2 +0 +-2 +-2 +-2 +-1 +9 +-1 +-3 +-1 +0 +-2 +3 +-5 +0 +1 +-1 +2 +-3 +2 +2 +-2 +7 +3 +-2 +1 +-1 +-2 +1 +9 +9 +1 +12 +6 +13 +-24 +6 +-29 +-51 +9 +-27 +-44 +13 +-16 +-26 +20 +-18 +-36 +25 +-11 +-32 +25 +-13 +-30 +27 +-10 +-22 +30 +-9 +-26 +27 +-10 +-30 +39 +-3 +-12 +33 +-6 +-30 +29 +-6 +-22 +38 +0 +-25 +33 +-8 +-25 +33 +-4 +-26 +26 +-11 +-16 +28 +-9 +-20 +30 +-10 +-29 +36 +-5 +-16 +29 +-10 +-31 +47 +3 +-22 +30 +-4 +-26 +33 +-1 +-28 +27 +-12 +-29 +29 +-3 +-27 +39 +0 +-23 +27 +-10 +-31 +27 +-11 +-30 +33 +-6 +-24 +39 +1 +-16 +34 +-6 +-26 +33 +-5 +-25 +25 +-12 +-30 +29 +-8 +-26 +30 +-8 +-21 +42 +-1 +-26 +40 +-1 +-25 +30 +-8 +-25 +27 +-11 +-27 +41 +0 +-20 +26 +-6 +-19 +27 +-11 +-31 +29 +4 +-25 +31 +-9 +-30 +33 +-7 +-29 +27 +-11 +-19 +29 +-9 +-22 +29 +-8 +27 +23 +28 +17 +25 +25 +28 +7 +3 +18 +11 +0 +8 +-2 +9 +0 +3 +4 +-2 +-2 +2 +-3 +0 +-3 +5 +-2 +1 +0 +-1 +-1 +2 +-3 +3 +0 +0 +8 +0 +-2 +4 +-1 +-1 +18 +3 +-2 +-5 +-3 +-2 +1 +-2 +-2 +2 +0 +6 +9 +-3 +0 +-1 +10 +10 +7 +0 +-5 +-4 +2 +-3 +-1 +-6 +-3 +7 +1 +5 +10 +0 +-1 +-3 +-4 +8 +-4 +8 +6 +-4 +-4 +11 +-1 +-5 +-3 +-2 +-8 +5 +7 +0 +9 +-1 +-8 +-5 +3 +2 +-4 +-2 +-6 +0 +-4 +-2 +2 +-2 +-1 +1 +-4 +15 +10 +-2 +-3 +1 +13 +3 +-3 +-1 +3 +12 +-1 +4 +-2 +-3 +1 +-3 +-4 +-4 +-2 +7 +-21 +-45 +12 +-25 +-44 +20 +-18 +-37 +21 +-16 +-28 +27 +-13 +-32 +28 +-10 +-31 +27 +-11 +-28 +25 +-7 +-30 +31 +-7 +-25 +27 +-9 +-28 +33 +-7 +-24 +29 +-7 +-11 +33 +-7 +-27 +28 +-10 +-25 +29 +-6 +-23 +29 +-7 +-8 +34 +-4 +-27 +30 +-7 +-25 +30 +-8 +-20 +32 +-6 +-24 +39 +0 +-23 +39 +0 +-27 +27 +-6 +-29 +27 +-8 +-23 +28 +-6 +-28 +32 +-6 +-24 +28 +-8 +-29 +33 +-4 +-24 +28 +-7 +-25 +28 +-8 +-27 +40 +-2 +-23 +30 +-5 +-29 +28 +-11 +-28 +32 +-3 +-25 +30 +-7 +-18 +46 +7 +-23 +27 +-6 +-24 +43 +1 +-25 +26 +-10 +-31 +32 +-6 +-29 +31 +3 +-24 +37 +-4 +-26 +25 +-6 +-9 +29 +-8 +-31 +28 +-9 +-29 +31 +-7 +-30 +28 +-8 +-22 +33 +-6 +-23 +21 +23 +24 +35 +20 +20 +11 +14 +11 +4 +15 +6 +8 +0 +2 +4 +8 +3 +0 +0 +10 +-3 +-3 +9 +3 +-2 +4 +-2 +15 +16 +15 +8 +1 +-3 +-6 +-5 +-5 +-3 +11 +-2 +8 +-4 +14 +0 +-1 +-7 +-2 +-6 +-4 +5 +10 +-5 +5 +-5 +-6 +-2 +10 +-1 +2 +1 +3 +-5 +-4 +-1 +-2 +-3 +-1 +-1 +-1 +-1 +0 +2 +3 +15 +2 +-2 +-2 +-1 +-2 +-1 +-1 +-1 +10 +1 +-3 +0 +4 +8 +-4 +-6 +-4 +3 +-4 +-3 +4 +13 +2 +-5 +-2 +-4 +-4 +-3 +-5 +-3 +6 +-2 +-1 +6 +2 +-1 +-1 +-2 +2 +-4 +1 +7 +4 +8 +5 +8 +1 +7 +-4 +-5 +-5 +5 +2 +9 +20 +-17 +-44 +9 +-27 +-44 +17 +-21 +-32 +15 +-17 +-31 +22 +-9 +-32 +18 +-16 +-29 +30 +-11 +-30 +35 +-5 +-26 +43 +-1 +-24 +25 +-12 +-28 +25 +-11 +-24 +34 +-6 +-26 +34 +0 +-23 +34 +-2 +-23 +27 +-10 +-27 +26 +-10 +-27 +33 +-8 +-29 +29 +5 +-22 +27 +-11 +-21 +41 +-1 +-20 +32 +-6 +-20 +37 +-5 +-27 +32 +-9 +-21 +24 +-13 +-30 +28 +-11 +-28 +35 +-4 +-29 +27 +-8 +-24 +33 +-2 +-23 +34 +-2 +-27 +31 +-7 +-29 +30 +-4 +-27 +29 +-4 +-19 +31 +-9 +-26 +30 +-5 +-28 +35 +-3 +-27 +33 +-3 +-28 +28 +-8 +-28 +35 +3 +-12 +31 +-9 +-27 +31 +-7 +-29 +33 +-4 +32 +-7 +-30 +30 +-6 +-29 +28 +-6 +-27 +31 +-8 +-26 +43 +-1 +-27 +34 +-5 +-30 +28 +-9 +-29 +20 +34 +31 +19 +17 +10 +9 +14 +9 +7 +11 +4 +4 +17 +5 +7 +0 +3 +1 +0 +6 +1 +4 +1 +-1 +15 +15 +15 +0 +-1 +-6 +-5 +-2 +12 +-4 +-3 +5 +13 +12 +3 +0 +-5 +-8 +-6 +-10 +-1 +2 +0 +11 +8 +-3 +4 +12 +-1 +-3 +2 +2 +-5 +-7 +-5 +-5 +-6 +5 +-3 +-7 +6 +0 +9 +5 +2 +4 +-2 +-6 +6 +11 +2 +-7 +-2 +-4 +-4 +-2 +11 +1 +5 +2 +-4 +-5 +-5 +-1 +11 +10 +-2 +-6 +-1 +-4 +0 +-4 +-5 +-4 +3 +14 +-1 +0 +-2 +2 +-4 +1 +2 +-1 +-2 +-2 +3 +-3 +-2 +-3 +5 +4 +2 +1 +8 +-4 +3 +1 +14 +2 +-5 +6 +9 +-4 +-37 +-54 +13 +-24 +-38 +20 +-15 +-37 +20 +-16 +-37 +19 +-16 +-27 +24 +-12 +-26 +26 +-7 +-29 +28 +-10 +29 +-9 +-26 +27 +-4 +-24 +26 +-10 +-18 +30 +-9 +-28 +32 +-8 +-28 +28 +-9 +-28 +38 +-4 +-23 +28 +-10 +-27 +49 +4 +-24 +34 +-6 +-14 +31 +-8 +-29 +34 +-2 +-29 +28 +-10 +-29 +36 +-4 +-22 +26 +-10 +-30 +28 +-8 +-28 +46 +1 +-22 +31 +-6 +-26 +35 +-7 +-29 +30 +-8 +-24 +33 +-2 +-15 +38 +-4 +-30 +32 +-9 +-29 +24 +-12 +-26 +29 +-8 +-17 +36 +-1 +-23 +36 +-6 +-24 +26 +-10 +-30 +33 +-7 +-30 +35 +-1 +-14 +31 +-8 +-30 +39 +-2 +-24 +32 +-8 +-30 +26 +-10 +-24 +42 +-2 +-25 +28 +-9 +-18 +36 +-6 +-28 +30 +-9 +-30 +30 +3 +-23 +28 +-7 +-23 +26 +24 +21 +19 +22 +15 +12 +13 +10 +10 +10 +9 +3 +9 +0 +-1 +0 +7 +5 +0 +-1 +-1 +3 +0 +-1 +4 +2 +4 +0 +2 +1 +-1 +1 +-1 +-1 +0 +1 +13 +16 +11 +-1 +-3 +-5 +-4 +10 +9 +-3 +0 +-1 +11 +-1 +-2 +-6 +-4 +-3 +-7 +-5 +-2 +8 +12 +7 +-4 +3 +-5 +0 +14 +1 +-2 +2 +-3 +4 +2 +-6 +-5 +-5 +3 +-4 +-4 +-2 +18 +1 +14 +0 +-4 +11 +13 +6 +-7 +-5 +-7 +-2 +1 +-5 +-6 +4 +-4 +-3 +-5 +-1 +-2 +-3 +-4 +3 +1 +1 +16 +3 +2 +-4 +-3 +3 +-3 +-1 +13 +5 +0 +4 +16 +2 +-2 +-4 +-7 +-5 +-4 +-4 +-5 +-3 +2 +4 +-32 +5 +-28 +-36 +32 +-10 +-37 +24 +-14 +-38 +20 +-17 +-37 +34 +-5 +-31 +29 +-11 +-27 +26 +-13 +-28 +33 +-8 +-30 +33 +-9 +-32 +26 +-8 +-29 +30 +-10 +-16 +36 +-1 +-28 +45 +0 +-27 +31 +-6 +-29 +26 +-13 +-31 +27 +-4 +-23 +32 +-7 +-29 +29 +-6 +-23 +35 +-6 +-17 +31 +-7 +-28 +31 +-9 +-25 +25 +-12 +-27 +34 +-2 +-19 +33 +-4 +-22 +31 +-9 +-30 +31 +4 +-24 +32 +-8 +-25 +25 +-10 +-25 +41 +-3 +-27 +27 +-10 +-17 +35 +-7 +-13 +31 +-9 +-28 +37 +-5 +-23 +35 +-6 +-29 +31 +-5 +-24 +25 +-11 +-32 +28 +-8 +-29 +28 +-9 +-28 +29 +-8 +-23 +41 +-1 +-23 +31 +-9 +-28 +35 +3 +-12 +41 +0 +-27 +27 +-8 +-28 +24 +-13 +-29 +27 +-8 +-28 +34 +-4 +-25 +33 +-5 +15 +33 +29 +32 +16 +13 +18 +7 +16 +6 +9 +9 +15 +1 +4 +10 +4 +-3 +-4 +1 +2 +-2 +7 +-1 +-3 +-3 +-2 +5 +2 +9 +-1 +-2 +-1 +-2 +-3 +-3 +0 +-1 +2 +4 +3 +10 +-1 +5 +0 +5 +16 +1 +4 +-4 +0 +-6 +-2 +-6 +-1 +1 +-3 +5 +4 +2 +1 +0 +3 +4 +4 +1 +-3 +-2 +7 +3 +-5 +3 +-3 +-3 +-4 +-5 +-2 +-4 +6 +8 +2 +0 +0 +4 +-2 +-1 +-1 +-2 +2 +-2 +1 +3 +-3 +-1 +2 +7 +11 +4 +2 +-4 +-3 +3 +13 +2 +-1 +14 +0 +1 +-4 +-3 +-4 +2 +-4 +8 +-3 +0 +-3 +1 +15 +5 +-4 +-2 +-8 +2 +-2 +3 +-5 +-4 +25 +-14 +-42 +21 +-16 +-38 +10 +-25 +-45 +22 +-17 +-38 +19 +-17 +-37 +30 +-6 +-31 +24 +-12 +-33 +35 +-5 +-29 +26 +-11 +-26 +25 +-11 +-22 +34 +-6 +-28 +30 +-9 +-28 +33 +-6 +-20 +31 +-7 +-28 +34 +-6 +-23 +31 +-8 +-27 +31 +-7 +-26 +40 +-2 +-22 +41 +2 +-22 +32 +-9 +-30 +27 +-7 +-27 +30 +-8 +-23 +35 +-2 +-24 +32 +-8 +-25 +29 +-9 +-28 +32 +-8 +-24 +35 +-3 +-24 +43 +-1 +-24 +36 +-3 +-29 +29 +-10 +-29 +42 +2 +-23 +28 +-7 +-26 +30 +-6 +-30 +29 +-8 +-27 +29 +-8 +-26 +27 +-11 +-23 +33 +-4 +-23 +45 +0 +-26 +44 +3 +-26 +24 +-11 +-23 +32 +-5 +-20 +29 +-11 +-19 +37 +-5 +-29 +30 +-9 +-28 +22 +-14 +-29 +30 +2 +-23 +25 +-11 +-24 +31 +-8 +-19 +24 +24 +20 +16 +16 +18 +17 +14 +11 +6 +7 +16 +7 +4 +3 +5 +6 +0 +10 +21 +5 +-2 +-3 +16 +3 +2 +-3 +-2 +-2 +5 +0 +-2 +9 +-3 +-1 +1 +-4 +-4 +0 +6 +2 +1 +-4 +0 +-4 +5 +0 +-2 +-2 +3 +0 +11 +10 +-3 +0 +-6 +6 +14 +-4 +1 +-1 +2 +-6 +5 +7 +15 +6 +-2 +-7 +-1 +-8 +9 +-3 +8 +12 +5 +-10 +-2 +-1 +-8 +11 +-1 +-6 +-3 +-3 +-7 +-5 +-3 +7 +-5 +-4 +-1 +2 +-2 +0 +1 +-2 +4 +8 +0 +4 +9 +-3 +11 +12 +0 +-4 +-2 +-6 +-2 +2 +7 +8 +-2 +0 +4 +-5 +-5 +9 +1 +-2 +8 +-3 +-6 +-7 +-4 +-5 +4 +9 +-25 +-47 +18 +-21 +-44 +13 +-22 +-42 +22 +-13 +-33 +25 +-12 +-30 +24 +-12 +-31 +34 +-6 +-24 +26 +-12 +-29 +38 +5 +-23 +27 +-11 +-19 +40 +-2 +-21 +36 +-1 +-25 +24 +-9 +-29 +30 +-10 +-19 +40 +-2 +-22 +32 +-9 +-32 +24 +-12 +-32 +43 +-1 +-24 +42 +3 +-15 +28 +-12 +-27 +38 +-4 +-28 +28 +-12 +-31 +24 +-5 +-20 +42 +0 +-25 +41 +2 +-28 +29 +-11 +-32 +26 +-11 +-32 +35 +-3 +-25 +32 +-4 +-28 +22 +-12 +-28 +29 +-8 +-27 +30 +-6 +-26 +25 +-9 +-25 +34 +-6 +-25 +30 +-8 +-20 +42 +-1 +-19 +30 +-6 +-29 +30 +-7 +-17 +35 +-5 +-21 +29 +-10 +-29 +32 +-7 +-23 +38 +-4 +-27 +30 +-7 +-22 +28 +-9 +-22 +31 +-5 +-26 +44 +1 +-25 +27 +-8 +-30 +31 +-8 +-28 +17 +26 +24 +22 +16 +16 +19 +13 +14 +13 +25 +10 +4 +13 +1 +-2 +11 +5 +-3 +10 +2 +-3 +0 +14 +-2 +15 +0 +1 +-5 +-1 +-2 +-5 +-5 +0 +-2 +-7 +12 +3 +-3 +-2 +-2 +-1 +2 +-1 +-1 +-2 +-3 +1 +-3 +-2 +2 +1 +3 +-3 +0 +6 +8 +-2 +-2 +5 +3 +17 +-1 +-4 +-1 +7 +11 +1 +-2 +1 +-5 +4 +-3 +-2 +4 +-3 +2 +2 +-2 +6 +-3 +4 +-2 +-2 +1 +-3 +-5 +-3 +1 +-2 +4 +15 +2 +-2 +-4 +-3 +-2 +3 +-1 +-1 +16 +9 +-2 +-3 +-3 +-7 +-4 +6 +-3 +9 +13 +13 +-2 +-4 +10 +13 +5 +-6 +-3 +-1 +-4 +4 +-5 +9 +13 +-5 +-4 +14 +-25 +8 +-29 +-52 +9 +-26 +-44 +11 +-24 +-40 +16 +-19 +-30 +21 +-15 +-33 +34 +-4 +-27 +33 +-6 +-18 +30 +-9 +-27 +25 +-4 +-24 +32 +-7 +-23 +28 +-11 +-29 +34 +-3 +-23 +36 +-5 +-27 +26 +-9 +-28 +33 +-8 +-20 +27 +-10 +-29 +29 +-9 +-27 +28 +-6 +-23 +39 +-3 +-20 +31 +-8 +-22 +41 +3 +-17 +33 +-5 +-28 +28 +-11 +-29 +30 +-6 +-19 +51 +5 +-22 +31 +-7 +-16 +28 +-11 +-32 +35 +-6 +-22 +25 +-12 +-29 +23 +-1 +-26 +28 +-10 +-27 +34 +-6 +-21 +32 +-9 +-29 +26 +-8 +-14 +29 +-7 +-29 +33 +-6 +-24 +34 +-4 +-27 +29 +-8 +-25 +29 +-9 +-9 +32 +-3 +-28 +29 +-8 +-28 +34 +-5 +-28 +28 +-10 +-24 +27 +-8 +-19 +30 +-7 +-27 +30 +4 +-23 +33 +-7 +-27 +34 +1 +26 +25 +17 +21 +20 +13 +16 +11 +11 +7 +13 +6 +16 +6 +-1 +-2 +2 +-2 +5 +1 +-1 +0 +1 +0 +4 +6 +5 +6 +14 +8 +-4 +-4 +11 +9 +-5 +-4 +-6 +-5 +0 +-1 +7 +-3 +-3 +-3 +-1 +-3 +1 +-2 +-4 +1 +4 +5 +-2 +9 +-2 +3 +5 +8 +-4 +-4 +-5 +1 +9 +-4 +-3 +-2 +7 +-2 +6 +13 +-1 +-4 +1 +-2 +-6 +19 +1 +6 +-1 +-5 +-2 +3 +10 +1 +-2 +-4 +-4 +-2 +6 +9 +2 +0 +-4 +-3 +0 +-3 +5 +-3 +-4 +2 +-3 +15 +0 +0 +-5 +-1 +0 +3 +-4 +-2 +-4 +4 +-6 +1 +-2 +4 +2 +6 +-1 +-2 +-4 +-1 +14 +5 +-5 +0 +-3 +-3 +12 +-25 +-49 +11 +-23 +-41 +17 +-19 +-39 +20 +-17 +-34 +22 +-14 +-32 +25 +-10 +-30 +37 +-1 +-24 +42 +2 +-25 +39 +-2 +-28 +24 +-9 +-31 +30 +-7 +-29 +28 +-11 +-28 +32 +-8 +-27 +32 +-6 +-27 +37 +-4 +-17 +45 +3 +-25 +26 +-9 +-29 +27 +-6 +-29 +34 +-1 +-18 +37 +-6 +-26 +30 +-9 +-25 +33 +-6 +-26 +28 +-2 +-17 +29 +-10 +-24 +29 +-2 +-25 +26 +-9 +-30 +29 +-9 +-17 +50 +3 +-25 +26 +-5 +-30 +31 +-9 +-31 +44 +1 +-25 +30 +-8 +-30 +26 +-7 +-30 +26 +-4 +-15 +43 +3 +-27 +24 +-15 +-26 +25 +-10 +-25 +36 +-5 +-26 +29 +1 +-26 +31 +-8 +-25 +43 +0 +-28 +30 +-10 +-29 +43 +0 +-28 +27 +-11 +-27 +26 +-9 +-26 +30 +-10 +-28 +28 +-8 +-30 +28 +-7 +-21 +26 +29 +28 +22 +19 +15 +13 +14 +16 +9 +3 +3 +11 +7 +19 +9 +5 +4 +3 +-1 +1 +4 +-4 +-2 +2 +5 +10 +8 +8 +-3 +1 +-6 +-2 +0 +-5 +0 +-1 +-4 +13 +-1 +3 +8 +-4 +5 +0 +2 +3 +-3 +-5 +0 +11 +12 +-5 +-3 +-5 +-4 +-6 +-3 +1 +6 +2 +-3 +2 +5 +5 +8 +-1 +3 +1 +-5 +-2 +-4 +-6 +3 +4 +-1 +9 +-3 +2 +-2 +1 +-2 +-4 +4 +-3 +-3 +5 +0 +1 +7 +-5 +11 +-2 +-2 +-3 +-5 +-2 +12 +1 +2 +1 +-2 +-7 +-4 +-4 +-1 +-3 +-3 +16 +1 +0 +12 +1 +2 +-6 +3 +-1 +-2 +4 +-2 +-5 +0 +1 +-1 +-4 +4 +0 +0 +25 +-15 +-44 +4 +-29 +-46 +15 +-16 +-25 +19 +-17 +-26 +37 +-4 +-31 +20 +-10 +-31 +24 +-13 +-30 +28 +-11 +-26 +27 +-10 +-30 +31 +0 +-25 +30 +-7 +-28 +33 +-4 +-27 +27 +-10 +-27 +28 +-4 +-25 +47 +3 +-25 +33 +-7 +-29 +33 +-6 +-30 +28 +-8 +-20 +27 +-2 +-23 +45 +0 +-23 +26 +-10 +-31 +26 +-5 +-22 +30 +-5 +-25 +31 +0 +-23 +27 +-10 +-18 +34 +-7 +-29 +29 +-8 +-23 +31 +2 +-23 +29 +-7 +-26 +40 +-3 +-25 +27 +-10 +-13 +31 +-8 +-29 +33 +-5 +-15 +28 +-11 +-31 +26 +-11 +-30 +35 +-6 +-20 +46 +4 +-24 +28 +-2 +-23 +24 +-10 +-18 +29 +-10 +-30 +30 +-9 +-16 +45 +0 +-24 +40 +-2 +-30 +26 +-10 +-32 +30 +-9 +-23 +26 +-12 +-23 +26 +-5 +-21 +26 +-11 +-28 +32 +32 +22 +18 +18 +13 +12 +11 +17 +9 +5 +8 +18 +15 +1 +1 +0 +5 +2 +2 +12 +12 +-2 +-3 +1 +-1 +-1 +2 +16 +0 +2 +-3 +-5 +5 +-5 +0 +-3 +-2 +-1 +-3 +0 +-4 +-3 +-1 +1 +-1 +0 +-3 +0 +0 +8 +7 +-2 +15 +18 +-1 +-1 +-3 +-5 +-1 +-2 +4 +1 +-4 +1 +4 +6 +6 +1 +0 +-4 +4 +-6 +-5 +4 +0 +-5 +-4 +5 +9 +-5 +-5 +-4 +3 +4 +0 +-1 +2 +-4 +2 +0 +10 +0 +3 +-5 +-3 +12 +6 +-5 +-3 +16 +-1 +-1 +1 +0 +-3 +-6 +1 +-5 +3 +-4 +3 +-1 +-1 +2 +9 +3 +10 +0 +-2 +-6 +-1 +0 +-1 +-4 +2 +-6 +-1 +-33 +13 +-25 +-42 +9 +-25 +-43 +20 +-11 +-34 +24 +-14 +-34 +21 +-13 +-19 +27 +-11 +-24 +28 +-10 +-29 +26 +-11 +-29 +33 +-7 +-27 +31 +-5 +-26 +30 +-8 +-26 +30 +-6 +-25 +42 +-1 +-18 +30 +-7 +-26 +31 +0 +-21 +26 +-10 +-24 +31 +-9 +-28 +29 +-8 +-27 +34 +-6 +-24 +30 +-1 +-24 +34 +-6 +-22 +46 +3 +-26 +28 +-11 +-22 +30 +-7 +-30 +28 +-7 +-26 +29 +4 +-23 +30 +-9 +-27 +30 +-7 +-28 +37 +2 +-22 +36 +-2 +-23 +27 +-12 +-31 +27 +-9 +-27 +28 +-9 +-27 +32 +1 +-24 +33 +-5 +-20 +29 +-9 +-24 +40 +0 +-18 +29 +-10 +-29 +30 +-5 +-16 +29 +-9 +-30 +26 +-10 +-25 +42 +-1 +-23 +31 +-9 +-25 +31 +-2 +-26 +33 +-7 +-19 +29 +-6 +-29 +33 +-6 +-18 +32 +-7 +14 +22 +19 +32 +32 +15 +20 +9 +6 +5 +23 +5 +1 +4 +20 +3 +1 +-5 +-3 +1 +-3 +6 +-2 +0 +2 +0 +1 +-1 +-2 +3 +-2 +-2 +10 +6 +-4 +-2 +-1 +-2 +6 +0 +-1 +13 +2 +-4 +0 +-1 +0 +0 +8 +-1 +-4 +3 +-4 +-5 +1 +13 +9 +10 +10 +-4 +-2 +0 +7 +7 +-6 +-4 +-4 +-5 +-3 +-3 +-3 +-5 +16 +1 +0 +9 +1 +11 +5 +-6 +-1 +11 +-5 +-4 +5 +-6 +-7 +-3 +-1 +-5 +1 +-3 +0 +10 +6 +6 +-4 +-6 +-6 +1 +0 +-1 +-4 +-4 +0 +-3 +-2 +2 +2 +-3 +1 +-3 +3 +-2 +0 +-2 +13 +3 +1 +-4 +6 +3 +10 +4 +-6 +-5 +-6 +-2 +11 +-26 +-48 +21 +-16 +-41 +10 +-17 +-31 +32 +-9 +-33 +18 +-17 +-32 +22 +-14 +-30 +28 +-11 +-31 +29 +-9 +-30 +29 +-7 +-24 +32 +-8 +-19 +30 +-7 +-15 +50 +4 +-24 +23 +-13 +-32 +42 +1 +-27 +25 +-11 +-32 +27 +-11 +-28 +33 +-5 +-29 +39 +-3 +-23 +37 +-4 +-29 +31 +-6 +-25 +44 +1 +-21 +25 +-9 +-27 +30 +-5 +-30 +27 +-11 +-26 +34 +3 +-19 +37 +-4 +-24 +23 +-11 +-22 +39 +-3 +-22 +26 +-3 +-26 +25 +-12 +-25 +34 +-3 +-29 +41 +-2 +-27 +24 +-11 +-30 +29 +-6 +-28 +36 +-4 +-27 +30 +-8 +-21 +27 +-9 +-27 +41 +0 +-24 +29 +-6 +-28 +29 +-6 +-28 +30 +-8 +-19 +31 +-9 +-27 +30 +-5 +-26 +36 +-4 +-26 +31 +-4 +-13 +31 +-5 +-28 +39 +-2 +-24 +25 +-9 +-27 +21 +29 +24 +22 +19 +18 +19 +11 +27 +11 +7 +2 +2 +2 +2 +2 +1 +6 +-1 +9 +11 +1 +12 +9 +3 +3 +-2 +-2 +-3 +-4 +9 +-2 +-4 +-4 +15 +4 +-4 +11 +11 +-3 +-7 +-1 +-3 +1 +3 +12 +1 +0 +-4 +-4 +-5 +2 +-5 +-2 +-3 +17 +0 +5 +-2 +-5 +-4 +1 +4 +12 +-2 +-5 +-4 +-4 +6 +5 +11 +-2 +-3 +-8 +2 +-4 +-4 +0 +-3 +17 +1 +-3 +-2 +3 +1 +2 +-2 +-1 +-2 +3 +1 +11 +1 +-3 +0 +-3 +11 +-2 +-7 +1 +0 +-3 +-1 +14 +0 +-2 +-5 +-4 +-3 +2 +7 +3 +-2 +-1 +-4 +-2 +-3 +0 +3 +5 +-4 +-1 +-2 +-4 +8 +6 +3 +2 +16 +-22 +-45 +11 +-24 +-45 +14 +-22 +-39 +15 +-13 +-32 +28 +-11 +-33 +24 +-11 +-30 +28 +-8 +-28 +28 +-9 +-19 +27 +0 +-26 +29 +-1 +-11 +40 +-2 +-29 +32 +-9 +-21 +37 +-5 +-29 +26 +-12 +-28 +29 +-6 +-29 +31 +-7 +-24 +43 +4 +-26 +27 +-5 +-14 +27 +-10 +-32 +36 +0 +-25 +31 +-9 +-28 +39 +-2 +-26 +25 +-12 +-29 +26 +-11 +-24 +44 +2 +-22 +27 +-12 +-30 +29 +-9 +-29 +32 +-7 +-25 +28 +-9 +-29 +32 +-6 +-18 +34 +-3 +-27 +41 +2 +-24 +31 +-8 +-28 +27 +-10 +-29 +33 +-7 +-26 +34 +1 +-13 +33 +-7 +-26 +32 +-8 +-30 +26 +-9 +-29 +27 +-5 +-27 +34 +-3 +-23 +28 +-9 +-17 +33 +-5 +-18 +32 +-3 +-25 +27 +-12 +-30 +29 +-9 +-24 +31 +-7 +-20 +29 +-9 +-28 +24 +24 +25 +22 +17 +23 +21 +19 +7 +9 +6 +16 +4 +16 +11 +3 +1 +-1 +6 +8 +-2 +0 +5 +14 +0 +12 +12 +0 +0 +-5 +-5 +-5 +2 +-1 +3 +8 +-2 +-6 +-5 +-2 +-1 +-6 +-6 +-2 +0 +-2 +-2 +2 +6 +3 +5 +2 +5 +-2 +8 +4 +10 +15 +-1 +-6 +-5 +4 +-6 +1 +4 +6 +-3 +2 +-2 +4 +-2 +3 +-2 +4 +-5 +-7 +-1 +-1 +-1 +1 +3 +-5 +-1 +-3 +3 +-2 +-2 +4 +6 +1 +10 +-1 +15 +1 +-6 +6 +5 +-5 +0 +-5 +-5 +-1 +-7 +-3 +1 +1 +9 +0 +2 +12 +18 +-1 +-6 +0 +-7 +1 +-5 +-4 +-5 +11 +8 +2 +-5 +2 +9 +-2 +-2 +-6 +7 +-28 +-50 +12 +-24 +-44 +9 +-24 +-38 +22 +-16 +-31 +38 +-3 +-27 +23 +-13 +-33 +27 +-9 +-21 +29 +0 +-26 +22 +-11 +-32 +27 +-9 +-28 +30 +-6 +-12 +31 +-8 +-29 +26 +-7 +-24 +38 +-4 +-28 +32 +-6 +-15 +29 +-9 +-30 +31 +-3 +-26 +43 +1 +-24 +27 +-11 +-30 +29 +-11 +-29 +36 +-4 +-26 +29 +0 +-25 +36 +-5 +-24 +30 +-9 +-22 +36 +-3 +-23 +27 +-9 +-26 +29 +-9 +-30 +28 +-10 +-27 +37 +0 +-24 +32 +-7 +-19 +32 +-7 +-27 +32 +-5 +-24 +33 +-6 +-20 +38 +-4 +-28 +48 +3 +-23 +43 +-1 +-27 +34 +-7 +-27 +27 +-12 +-33 +27 +-10 +-32 +34 +-7 +-22 +26 +-12 +-27 +31 +-7 +-21 +29 +-5 +-29 +45 +1 +-26 +34 +-4 +-29 +29 +-10 +-25 +35 +-3 +-26 +26 +-11 +-29 +18 +33 +27 +25 +28 +14 +20 +15 +11 +9 +2 +3 +9 +14 +0 +12 +12 +-2 +-1 +1 +10 +5 +2 +-3 +-7 +-6 +16 +2 +1 +-2 +-4 +1 +-4 +-4 +-3 +4 +-2 +1 +-2 +-1 +4 +12 +17 +14 +12 +10 +-6 +2 +-3 +-8 +-3 +-8 +-5 +-4 +-3 +-3 +-3 +-4 +3 +5 +-4 +11 +2 +-2 +-3 +-1 +-1 +-5 +-4 +9 +-2 +-5 +13 +-1 +3 +0 +10 +4 +1 +-6 +-5 +-3 +-1 +-3 +-1 +0 +2 +1 +-3 +7 +-1 +2 +-1 +-3 +5 +-1 +6 +8 +0 +-4 +-5 +-1 +5 +9 +4 +5 +0 +13 +-2 +-3 +-3 +-3 +-1 +-6 +-2 +0 +-5 +8 +-5 +4 +-4 +-3 +13 +-3 +-4 +3 +-1 +0 +-34 +15 +-24 +-45 +7 +-27 +-33 +22 +-17 +-39 +16 +-14 +-35 +23 +-7 +-23 +36 +-3 +-27 +27 +-12 +-14 +28 +-11 +-32 +34 +-6 +-30 +27 +-9 +-29 +28 +-1 +-13 +28 +-9 +-19 +33 +-8 +-27 +24 +-7 +-28 +30 +-2 +-25 +28 +-7 +-24 +30 +-7 +-25 +45 +3 +-14 +37 +-3 +-26 +30 +-9 +-31 +43 +-1 +-28 +29 +-9 +-26 +32 +-9 +-27 +38 +-3 +-23 +28 +-9 +-28 +26 +-12 +-28 +42 +-2 +-24 +41 +-1 +-29 +29 +-7 +-16 +43 +-1 +-29 +38 +-3 +-30 +24 +-13 +-29 +33 +-7 +-30 +32 +-6 +-26 +30 +-2 +-13 +41 +-2 +-30 +26 +-10 +-29 +26 +-12 +-31 +29 +-9 +-25 +26 +-7 +-28 +28 +-10 +-23 +32 +-6 +-28 +30 +-8 +-25 +30 +-5 +-27 +31 +-4 +-20 +36 +-3 +-27 +46 +2 +-23 +32 +-5 +12 +25 +32 +21 +17 +13 +10 +15 +6 +4 +9 +11 +4 +8 +3 +3 +16 +2 +5 +8 +-4 +-2 +-2 +1 +-2 +-3 +0 +5 +3 +2 +6 +8 +0 +-4 +-4 +2 +13 +13 +-3 +-5 +-4 +10 +-3 +5 +-1 +1 +-4 +9 +5 +-3 +-7 +-6 +-7 +1 +-2 +-1 +4 +-2 +7 +-2 +-1 +0 +11 +6 +-1 +-4 +-3 +0 +-5 +-4 +1 +18 +0 +-3 +-4 +11 +9 +5 +1 +-4 +10 +0 +-7 +1 +4 +8 +-3 +-6 +8 +-4 +-9 +-7 +5 +-3 +0 +-2 +-5 +-3 +1 +-1 +0 +0 +-2 +3 +2 +15 +15 +-1 +-5 +13 +-3 +-2 +-5 +-6 +-5 +-5 +2 +-4 +-1 +-3 +-3 +14 +-1 +1 +-2 +3 +2 +-3 +21 +-18 +-39 +6 +-28 +-44 +11 +-21 +-39 +16 +-10 +-33 +25 +-3 +-30 +27 +-11 +-31 +42 +0 +-28 +26 +-1 +-27 +26 +-10 +-31 +27 +-11 +-30 +44 +6 +-13 +37 +-5 +-24 +30 +-8 +-26 +42 +-2 +-28 +28 +-10 +-33 +28 +-11 +-18 +26 +-12 +-32 +28 +-8 +-28 +26 +-8 +-27 +30 +1 +-22 +38 +-4 +-28 +30 +-9 +-26 +42 +6 +-22 +44 +0 +-23 +27 +-10 +-31 +31 +-9 +-27 +28 +-9 +-29 +42 +-1 +-25 +44 +1 +-25 +23 +-15 +-28 +44 +0 +-28 +26 +-12 +-27 +35 +0 +-16 +27 +-12 +-32 +36 +-3 +-26 +28 +-9 +-25 +28 +-9 +-24 +41 +0 +-25 +29 +-10 +-14 +33 +-9 +-27 +26 +-12 +-32 +37 +-4 +-23 +26 +-6 +-27 +34 +-6 +-19 +27 +-5 +-27 +28 +-9 +-26 +28 +-9 +-27 +30 +-9 +-24 +40 +-2 +-26 +31 +-6 +-16 +40 +-2 +-23 +37 +-5 +-29 +26 +-10 +-31 +30 +-10 +-24 +30 +-8 +-15 +46 +3 +-26 +27 +1 +-26 +25 +-9 +-29 +23 +-10 +-27 +35 +-2 +-24 +28 +-6 +-23 +32 +-4 +-23 +28 +-7 +-24 +42 +0 +-24 +29 +-8 +-23 +31 +-10 +-28 +27 +-8 +-22 +35 +-6 +-29 +39 +-3 +-24 +43 +-1 +-28 +28 +-9 +-32 +27 +-11 +-26 +27 +-8 +-27 +37 +-2 +-25 +34 +-6 +-28 +29 +-9 +-28 +30 +-6 +-19 +34 +-7 +-27 +34 +-6 +-27 +35 +-5 +-24 +30 +-9 +-23 +29 +-10 +-21 +27 +-8 +-28 +40 +-1 +-25 +30 +-6 +-25 +31 +-7 +-25 +36 +-2 +-25 +29 +-7 +-20 +30 +-4 +-28 +28 +-11 +-27 +33 +-6 +-26 +30 +-8 +-22 +35 +-6 +-26 +31 +-6 +-25 +30 +-9 +-24 +38 +-3 +-25 +19 +28 +26 +24 +17 +13 +19 +10 +9 +10 +13 +10 +4 +10 +16 +11 +1 +2 +6 +-3 +-4 +-1 +6 +5 +-2 +0 +3 +1 +4 +-1 +-1 +11 +1 +-2 +-1 +1 +-4 +8 +2 +-4 +-4 +0 +0 +-2 +0 +3 +-2 +1 +5 +6 +-2 +-1 +14 +4 +-5 +-4 +4 +6 +-1 +-1 +-3 +-2 +13 +3 +-5 +-5 +-4 +-2 +-2 +-4 +-4 +15 +0 +0 +5 +1 +-2 +7 +-3 +3 +-1 +2 +-2 +3 +-2 +0 +7 +3 +-4 +-4 +1 +-4 +0 +-4 +-3 +1 +-1 +3 +7 +17 +15 +-1 +-5 +-7 +-7 +-3 +10 +1 +0 +-3 +-2 +3 +1 +-3 +-4 +7 +4 +-3 +-3 +-1 +12 +1 +-4 +-1 +-2 +-3 +0 +5 +21 +-19 +-45 +5 +-30 +-46 +17 +-17 +-38 +21 +-15 +-33 +23 +-9 +-31 +38 +-5 +-27 +28 +-11 +-27 +26 +-11 +-30 +35 +-6 +-28 +29 +-10 +-25 +44 +1 +-27 +28 +-10 +-29 +28 +-9 +-23 +31 +-8 +-29 +36 +-1 +-24 +36 +-5 +-21 +28 +-11 +-27 +27 +-10 +-28 +45 +2 +-23 +28 +-2 +-26 +26 +-9 +-29 +30 +-8 +-26 +30 +-4 +-26 +33 +-7 +-17 +32 +-7 +-26 +32 +-6 +-27 +29 +-1 +-24 +29 +-9 +-25 +35 +-5 +-27 +32 +-3 +-21 +33 +-5 +-28 +36 +-4 +-24 +29 +-6 +-25 +33 +-6 +-27 +41 +-1 +-26 +32 +-7 +-27 +28 +-4 +-20 +37 +-5 +-25 +35 +-1 +-24 +26 +-12 +-23 +28 +-8 +-29 +32 +-7 +-27 +29 +-2 +-27 +33 +3 +-22 +29 +-8 +-21 +28 +-11 +-30 +28 +-9 +-19 +36 +2 +-24 +21 +22 +20 +27 +34 +24 +10 +13 +6 +9 +5 +5 +6 +5 +1 +14 +4 +0 +-1 +4 +7 +6 +2 +-2 +-2 +14 +8 +2 +-1 +-2 +-4 +-2 +11 +4 +-4 +-5 +-4 +2 +-3 +7 +-4 +-4 +2 +1 +-4 +-3 +2 +5 +-4 +-2 +11 +9 +-3 +3 +-5 +-2 +-5 +-1 +-4 +-1 +-1 +2 +0 +1 +0 +4 +-1 +-1 +-2 +2 +12 +15 +9 +7 +-3 +10 +-1 +5 +-3 +-3 +-10 +3 +-3 +5 +10 +1 +-6 +-5 +12 +2 +-1 +-8 +-6 +-2 +-5 +-1 +11 +8 +16 +-1 +-3 +-8 +-4 +12 +-4 +-3 +-5 +-2 +-2 +-3 +-6 +-1 +4 +12 +10 +-5 +-5 +-4 +-4 +0 +0 +1 +-6 +3 +14 +15 +0 +7 +-29 +8 +-27 +-49 +3 +-18 +-41 +19 +-15 +-37 +19 +-16 +-26 +30 +-10 +-31 +26 +-3 +-29 +32 +-9 +-31 +30 +-10 +-32 +22 +-14 +-30 +28 +-9 +-25 +37 +-4 +-26 +30 +-5 +-28 +34 +-6 +-28 +28 +-7 +-28 +30 +-3 +-26 +30 +-7 +-27 +30 +-8 +-25 +30 +-2 +-22 +31 +-6 +-17 +29 +-9 +-25 +32 +-4 +-26 +32 +-4 +-10 +32 +-8 +-28 +36 +-4 +-27 +37 +-5 +-27 +31 +-8 +-26 +32 +-5 +-27 +36 +-5 +-16 +42 +1 +-25 +41 +1 +-17 +36 +-6 +-18 +36 +-6 +-32 +23 +-8 +-27 +27 +-11 +-32 +35 +-7 +-27 +39 +-3 +-28 +31 +-9 +-32 +27 +-10 +-32 +28 +3 +-23 +29 +-5 +-29 +41 +4 +-20 +27 +-11 +-25 +26 +-11 +-26 +39 +-3 +-26 +29 +-6 +-26 +36 +-2 +-15 +38 +-4 +-25 +31 +-5 +8 +18 +16 +19 +13 +12 +9 +23 +19 +4 +15 +2 +5 +-2 +-2 +17 +9 +-2 +4 +-1 +-6 +2 +1 +0 +0 +-2 +1 +9 +1 +-3 +-2 +9 +1 +6 +-3 +-1 +-3 +-2 +12 +-1 +2 +0 +-4 +1 +2 +0 +5 +12 +7 +-4 +-4 +-4 +-1 +0 +-2 +3 +7 +-4 +-1 +-2 +13 +9 +4 +1 +-3 +-3 +-6 +-4 +1 +11 +-4 +-5 +-3 +-4 +-5 +15 +1 +1 +1 +-7 +-3 +3 +-3 +4 +1 +1 +-6 +10 +2 +2 +-1 +11 +3 +5 +18 +-1 +-2 +-4 +-1 +-6 +8 +-5 +-8 +-5 +6 +5 +-6 +-5 +-4 +11 +-3 +-5 +-3 +5 +-2 +3 +-6 +11 +-2 +-4 +-4 +0 +0 +14 +-2 +6 +2 +3 +-3 +5 +-2 +0 +1 +3 +4 +-4 +15 +-1 +-5 +-7 +-3 +4 +-4 +12 +9 +-5 +-7 +-5 +-6 +-3 +11 +-3 +-3 +-1 +10 +-2 +-3 +-4 +-3 +1 +9 +-4 +-3 +6 +-4 +4 +0 +-3 +0 +4 +-4 +3 +4 +-1 +1 +-3 +1 +2 +-3 +-1 +2 +-1 +2 +5 +-1 +1 +1 +11 +5 +-3 +0 +-1 +0 +-1 +0 +-3 +-4 +-2 +-2 +5 +0 +13 +3 +13 +-3 +-3 +-4 +-3 +-4 +-5 +-1 +-2 +5 +16 +-2 +-4 +-6 +-2 +-4 +2 +-1 +5 +-2 +-2 +2 +-3 +12 +2 +4 +1 +0 +-3 +3 +-3 +-2 +9 +-3 +0 +3 +1 +12 +12 +9 +-3 +-4 +-4 +-3 +-5 +-4 +0 +-5 +-4 +0 +-3 +0 +14 +12 +-25 +-48 +12 +-24 +-44 +24 +-12 +-38 +17 +-17 +-37 +22 +-14 +-31 +23 +-12 +-25 +33 +-7 +-27 +36 +-4 +-26 +29 +-6 +-30 +33 +-5 +-25 +27 +-11 +-29 +27 +-11 +-16 +36 +-1 +-21 +43 +-1 +-28 +35 +-6 +-21 +33 +-7 +-29 +24 +-4 +-29 +35 +-7 +-28 +29 +-8 +-23 +26 +-12 +-28 +37 +-3 +-26 +32 +-6 +-16 +46 +2 +-18 +29 +-7 +-31 +27 +-10 +-26 +32 +-8 +-29 +37 +-4 +-26 +26 +-10 +-30 +29 +-8 +-20 +35 +-5 +-27 +27 +-5 +-27 +33 +-6 +-27 +30 +-8 +-29 +28 +-8 +-25 +46 +4 +-16 +45 +2 +-24 +36 +-5 +-30 +26 +-11 +-21 +25 +-8 +-28 +29 +-8 +-28 +37 +-3 +-29 +30 +-7 +-17 +30 +-8 +-24 +27 +-10 +-30 +31 +-5 +-29 +30 +-7 +-28 +31 +-8 +-23 +27 +-7 +-27 +25 +27 +25 +21 +21 +13 +17 +26 +12 +11 +26 +8 +8 +5 +10 +4 +-3 +-2 +4 +3 +0 +-1 +-4 +17 +3 +2 +7 +14 +6 +-6 +-6 +4 +6 +3 +0 +-5 +9 +-4 +0 +-2 +-2 +2 +7 +-3 +-5 +1 +4 +10 +5 +-5 +-5 +-5 +-4 +-3 +9 +-3 +-4 +1 +-2 +-4 +-5 +-3 +5 +-3 +-1 +0 +11 +0 +-2 +4 +1 +16 +2 +-5 +-4 +-2 +6 +8 +1 +6 +-4 +-8 +-8 +12 +-1 +-6 +-8 +4 +9 +0 +-2 +1 +-6 +-2 +-4 +-3 +-4 +-2 +-4 +4 +11 +1 +2 +15 +2 +4 +-4 +1 +-5 +-5 +-5 +-2 +1 +10 +8 +6 +-1 +1 +11 +13 +1 +4 +2 +-4 +-4 +-2 +-6 +-8 +6 +-25 +-44 +20 +-20 +-43 +14 +-22 +-42 +19 +-13 +-35 +31 +-9 +-32 +22 +-5 +-29 +28 +-11 +-21 +35 +-7 +-31 +27 +-10 +-25 +27 +-11 +-30 +28 +-8 +-26 +27 +-11 +-28 +35 +-5 +-27 +30 +1 +-20 +27 +-9 +-22 +37 +-4 +-25 +32 +-7 +-16 +40 +-3 +-27 +38 +-2 +-29 +27 +-10 +-25 +25 +-4 +-19 +42 +0 +-22 +48 +3 +-25 +23 +-15 +-25 +28 +1 +-27 +30 +-8 +-23 +27 +-12 +-25 +25 +-13 +-32 +38 +-3 +-20 +26 +-10 +-31 +28 +-7 +-30 +34 +-4 +-22 +28 +-8 +-29 +37 +0 +-25 +29 +1 +-21 +28 +-10 +-28 +32 +-7 +-27 +31 +-2 +-24 +28 +-9 +-24 +35 +-5 +-26 +30 +-7 +-28 +33 +-7 +-27 +30 +-6 +-18 +43 +-1 +-23 +40 +0 +-25 +33 +-7 +-19 +29 +-5 +-27 +29 +-10 +-30 +34 +-2 +-27 +30 +-9 +-25 +25 +-7 +-29 +33 +-7 +-21 +31 +-8 +-29 +31 +-7 +-18 +32 +-8 +-29 +29 +-8 +-24 +34 +-4 +-27 +30 +-9 +-25 +46 +2 +-16 +28 +-8 +-26 +25 +-9 +-13 +34 +-7 +-27 +26 +-7 +-28 +40 +4 +-14 +37 +-3 +-17 +29 +-11 +-32 +26 +-11 +-26 +37 +-5 +-26 +29 +-5 +-29 +25 +-11 +-30 +28 +-5 +-21 +30 +-9 +-28 +39 +-1 +-27 +28 +-8 +-17 +48 +4 +-26 +30 +-8 +-30 +28 +-7 +-21 +31 +-9 +-27 +33 +-7 +-29 +29 +-8 +-23 +41 +5 +-23 +26 +-13 +-17 +28 +-11 +-30 +30 +-4 +-17 +27 +-10 +-29 +35 +1 +-18 +31 +-6 +-22 +27 +-8 +-27 +32 +-2 +-25 +42 +-1 +-27 +43 +-1 +-26 +29 +-11 +-26 +23 +-11 +-29 +35 +-5 +-28 +30 +-7 +-25 +26 +-10 +-30 +17 +24 +29 +23 +35 +16 +11 +9 +15 +8 +11 +9 +3 +11 +4 +15 +4 +2 +-2 +-1 +-2 +-2 +-4 +5 +-3 +9 +0 +-2 +-2 +0 +-2 +0 +0 +19 +3 +0 +-3 +-1 +0 +6 +-4 +1 +15 +2 +2 +-3 +-1 +-3 +10 +-3 +-2 +-3 +2 +0 +7 +6 +2 +6 +0 +-5 +-7 +-2 +-1 +17 +1 +0 +12 +9 +-5 +-5 +-6 +-2 +-6 +-3 +-4 +-3 +0 +-3 +8 +10 +-3 +3 +-2 +4 +-4 +-4 +-4 +6 +3 +0 +1 +-1 +-1 +1 +1 +-3 +1 +-2 +4 +-3 +1 +3 +-2 +16 +13 +-3 +-2 +-4 +-2 +0 +14 +0 +-4 +-3 +-2 +-8 +-1 +0 +-4 +4 +-4 +-2 +-4 +1 +2 +6 +0 +0 +1 +-2 +7 +5 +3 +10 +-2 +-4 +4 +-3 +0 +1 +5 +-2 +11 +4 +-3 +-1 +-7 +14 +1 +11 +4 +9 +2 +-7 +-2 +-5 +3 +-1 +-1 +-8 +-2 +-3 +-6 +0 +-4 +-3 +2 +-5 +6 +2 +-2 +1 +-2 +3 +-3 +-3 +0 +13 +2 +-2 +4 +-3 +10 +3 +9 +-3 +7 +14 +13 +14 +-5 +-10 +-6 +-8 +-6 +4 +-6 +-9 +-8 +-1 +7 +1 +2 +6 +6 +5 +10 +-3 +-2 +4 +-7 +-5 +0 +1 +-3 +2 +-1 +-1 +-1 +1 +6 +8 +0 +-4 +5 +8 +-1 +-4 +10 +-3 +0 +-4 +-6 +4 +-2 +-5 +-4 +11 +3 +9 +-3 +-3 +-1 +-5 +-6 +-4 +-1 +1 +10 +-3 +-4 +-2 +5 +-4 +0 +1 +-32 +14 +-23 +-42 +9 +-23 +-38 +14 +-21 +-30 +21 +-7 +-31 +30 +-7 +-31 +34 +-7 +-27 +31 +-7 +-29 +26 +-9 +-25 +27 +-10 +-29 +36 +1 +-26 +36 +-6 +-27 +34 +-5 +-30 +35 +-4 +-29 +32 +-5 +-27 +29 +-10 +-27 +26 +-11 +-28 +30 +-7 +-27 +29 +-8 +-23 +36 +-5 +-27 +32 +-6 +-16 +31 +-8 +-28 +29 +-8 +-25 +31 +-7 +-23 +28 +-7 +-25 +41 +4 +-22 +28 +-8 +-29 +30 +-6 +-19 +35 +4 +-23 +30 +-8 +-28 +33 +-6 +-24 +39 +-3 +-23 +32 +-7 +-25 +44 +1 +-17 +25 +-11 +-29 +33 +-6 +-29 +30 +-8 +-26 +27 +-8 +-22 +27 +-9 +-24 +40 +-1 +-24 +49 +4 +-24 +23 +-13 +-20 +49 +4 +-27 +27 +-11 +-20 +32 +-8 +-28 +22 +-15 +-20 +28 +-9 +-31 +27 +-11 +-30 +33 +-5 +20 +24 +19 +17 +20 +13 +11 +14 +6 +8 +4 +23 +8 +17 +2 +5 +-1 +8 +0 +13 +2 +-1 +14 +1 +3 +-1 +16 +0 +-4 +2 +-2 +3 +-5 +-2 +12 +3 +3 +13 +1 +9 +-3 +-7 +-11 +-4 +-7 +-6 +2 +0 +10 +-2 +-5 +-3 +6 +-5 +-1 +-1 +-2 +-4 +-2 +7 +5 +5 +-2 +-2 +-5 +2 +-5 +13 +1 +-2 +6 +-4 +9 +1 +-6 +-1 +-5 +1 +0 +-3 +0 +0 +7 +1 +5 +6 +-3 +2 +-4 +-4 +-1 +-2 +6 +1 +2 +-3 +-5 +4 +-1 +-4 +6 +-2 +-1 +-2 +-1 +-1 +2 +5 +0 +-2 +4 +3 +14 +4 +1 +2 +-5 +-4 +-5 +-1 +7 +-2 +-2 +4 +3 +-1 +0 +1 +-31 +14 +-23 +-33 +11 +-24 +-43 +24 +-16 +-37 +21 +-13 +-36 +25 +-11 +-29 +45 +1 +-27 +28 +-11 +-32 +23 +-13 +-22 +24 +-12 +-30 +37 +-1 +-26 +28 +-8 +-29 +26 +-5 +-27 +32 +-1 +-26 +29 +-8 +-26 +52 +6 +-18 +27 +-10 +-30 +33 +-8 +-17 +30 +-9 +-31 +26 +-9 +-29 +37 +-4 +-27 +41 +-2 +-19 +36 +-5 +-19 +26 +-12 +-32 +27 +-8 +-18 +32 +-9 +-21 +27 +-9 +-27 +27 +-5 +-19 +30 +-7 +-26 +37 +-5 +-28 +26 +-10 +-27 +27 +-8 +-23 +31 +-8 +-17 +43 +0 +-23 +40 +4 +-23 +35 +-7 +-29 +37 +-2 +-29 +29 +-10 +-23 +28 +-10 +-32 +27 +-10 +-30 +28 +-10 +-22 +31 +-8 +-26 +34 +-6 +-25 +45 +3 +-20 +30 +-5 +-23 +35 +-7 +-21 +29 +-7 +-29 +25 +-10 +-30 +29 +-8 +-27 +29 +-9 +-28 +29 +-7 +-26 +31 +-5 +-26 +32 +-6 +-26 +32 +-7 +-25 +30 +-5 +-22 +32 +-4 +-25 +34 +-5 +-25 +38 +-4 +-19 +44 +1 +-25 +33 +-8 +-26 +32 +-1 +-18 +41 +-3 +-25 +24 +-13 +-24 +30 +-6 +-29 +28 +-6 +-30 +29 +-1 +-27 +41 +-1 +-19 +30 +-10 +-30 +25 +-12 +-18 +43 +6 +-24 +35 +-4 +-30 +24 +-13 +-31 +26 +-7 +-28 +27 +-8 +-29 +30 +-6 +-25 +50 +4 +-23 +26 +-11 +-29 +27 +-10 +-23 +43 +0 +-27 +29 +-9 +-29 +32 +-5 +-23 +29 +-4 +-25 +35 +-5 +-19 +42 +-1 +-14 +28 +-10 +-23 +32 +-9 +-30 +26 +-10 +-19 +44 +-1 +-23 +25 +-11 +-17 +42 +-1 +-28 +22 +-13 +-27 +32 +-9 +-29 +25 +-8 +-30 +31 +-7 +-28 +27 +-10 +-24 +36 +-5 +-12 +33 +-5 +13 +22 +32 +17 +14 +13 +11 +12 +7 +11 +21 +6 +1 +1 +15 +11 +3 +1 +13 +6 +13 +5 +-6 +0 +3 +-8 +0 +9 +6 +8 +14 +-2 +-5 +7 +-4 +-7 +-8 +-7 +-3 +-5 +-1 +8 +7 +6 +14 +-3 +-1 +0 +-8 +-7 +2 +6 +1 +-6 +0 +-5 +-1 +-3 +2 +1 +-5 +3 +12 +-1 +7 +2 +5 +-6 +-2 +0 +-3 +9 +5 +-6 +-5 +0 +9 +6 +2 +-1 +-6 +-2 +-4 +-6 +-5 +0 +-5 +-4 +-4 +2 +1 +3 +12 +0 +-2 +-5 +10 +5 +-4 +-3 +2 +7 +0 +-3 +-1 +-3 +3 +10 +12 +15 +13 +1 +-8 +-10 +-10 +0 +-7 +-5 +-2 +-2 +-2 +-1 +11 +4 +-4 +-3 +0 +3 +-1 +4 +-3 +-3 +12 +3 +-3 +-3 +0 +-3 +-3 +8 +-4 +-1 +7 +1 +-1 +-4 +5 +9 +-3 +1 +10 +-2 +-2 +-2 +-4 +-3 +3 +-4 +-2 +2 +2 +3 +-2 +10 +8 +11 +-5 +-5 +-4 +-1 +1 +-4 +-6 +2 +1 +1 +-4 +2 +-3 +-3 +-4 +-2 +4 +-3 +2 +1 +0 +9 +-2 +-4 +-4 +2 +1 +16 +3 +-2 +-1 +1 +-3 +0 +-4 +-4 +15 +4 +-4 +0 +-3 +5 +-2 +0 +5 +-4 +5 +1 +3 +2 +2 +-4 +-2 +8 +-1 +-4 +-1 +-3 +-4 +3 +1 +2 +2 +4 +11 +5 +-4 +2 +0 +-3 +0 +1 +-2 +0 +4 +3 +4 +-5 +-4 +-3 +-3 +3 +10 +14 +1 +-1 +3 +-2 +-6 +-7 +15 +-22 +-47 +6 +-25 +-46 +10 +-21 +-40 +24 +-13 +-26 +22 +-14 +-28 +23 +-14 +-19 +47 +3 +-26 +29 +-7 +-26 +22 +-7 +-22 +25 +-12 +-28 +41 +-1 +-27 +31 +-4 +-29 +27 +-11 +-31 +37 +-5 +-28 +29 +0 +-25 +29 +-8 +-30 +25 +-11 +-27 +30 +-5 +-23 +37 +-1 +-23 +39 +-3 +-19 +30 +-4 +-11 +30 +-10 +-29 +28 +-6 +-27 +45 +0 +-9 +29 +-9 +-27 +22 +-10 +-28 +25 +-11 +-30 +40 +-2 +-27 +27 +-10 +-27 +45 +0 +-23 +29 +-5 +-30 +29 +-11 +-25 +35 +-6 +-26 +29 +-10 +-27 +29 +-5 +-25 +26 +-11 +-28 +30 +-5 +-23 +47 +2 +-25 +31 +-3 +-23 +27 +-9 +-23 +28 +-8 +-27 +30 +-7 +-29 +31 +-4 +-21 +42 +-1 +-25 +30 +3 +-22 +26 +-11 +-26 +31 +-8 +-28 +33 +-8 +-23 +36 +23 +24 +29 +22 +22 +11 +17 +8 +7 +0 +1 +7 +1 +4 +4 +18 +8 +11 +7 +-3 +-5 +-1 +2 +-2 +-1 +-3 +-1 +2 +1 +-2 +1 +-1 +14 +10 +-1 +-2 +10 +4 +-5 +-3 +1 +13 +10 +-4 +-3 +-6 +7 +-6 +-3 +2 +-5 +6 +0 +8 +-1 +-5 +-3 +0 +-2 +-4 +-3 +-3 +-3 +2 +1 +-1 +2 +0 +1 +-2 +-1 +3 +7 +-2 +3 +-1 +7 +1 +-2 +0 +1 +-1 +-5 +-2 +19 +2 +1 +-1 +3 +-3 +3 +5 +4 +-4 +-5 +-1 +-3 +-3 +0 +-2 +-4 +0 +-2 +1 +-1 +-2 +3 +-2 +9 +5 +1 +4 +-3 +-2 +7 +3 +4 +5 +3 +-1 +-2 +-4 +2 +2 +-1 +2 +-2 +8 +-27 +-48 +8 +-27 +-40 +29 +-12 +-34 +23 +-15 +-33 +19 +-16 +-32 +39 +-3 +-28 +24 +-12 +-30 +26 +-10 +-31 +34 +-2 +-18 +27 +-11 +-31 +25 +-11 +-29 +39 +-2 +-22 +32 +-6 +-28 +28 +-9 +-29 +45 +2 +-22 +34 +-5 +-21 +30 +-9 +-15 +28 +-6 +-21 +40 +-2 +-21 +23 +-10 +-31 +28 +-6 +-30 +28 +-9 +-27 +40 +-2 +-25 +30 +-8 +-25 +41 +0 +-25 +25 +-13 +-29 +31 +-7 +-24 +32 +-7 +-28 +28 +-9 +-19 +32 +-7 +-27 +27 +-9 +-24 +39 +2 +-24 +27 +-7 +-28 +31 +-4 +-13 +32 +-7 +-27 +28 +-5 +-27 +28 +-5 +-26 +29 +-9 +-24 +46 +2 +-24 +28 +-9 +-29 +36 +-4 +-27 +29 +-9 +-29 +32 +-6 +-25 +36 +0 +-17 +28 +-9 +-24 +33 +-7 +-15 +33 +-7 +-22 +26 +-1 +-26 +25 +19 +25 +19 +15 +14 +11 +17 +22 +24 +22 +5 +-1 +0 +6 +-1 +-2 +1 +1 +0 +1 +0 +3 +-1 +-1 +3 +-2 +6 +0 +-2 +-1 +0 +2 +2 +5 +0 +-2 +5 +-2 +-1 +-2 +-2 +1 +2 +-2 +6 +3 +0 +-2 +8 +1 +1 +7 +5 +-3 +1 +-1 +-3 +1 +-1 +-1 +-2 +-3 +-2 +-2 +3 +0 +8 +-1 +4 +11 +3 +-4 +-3 +3 +5 +0 +-3 +-1 +-3 +0 +5 +-3 +-2 +-2 +0 +-1 +0 +-3 +-1 +-3 +1 +1 +9 +3 +-1 +-1 +1 +3 +5 +-2 +9 +14 +12 +-2 +-2 +9 +1 +-5 +-6 +-4 +-5 +15 +0 +-5 +1 +-2 +-4 +-3 +4 +16 +1 +10 +8 +5 +-7 +-5 +-2 +-34 +6 +-22 +-45 +11 +-23 +-43 +18 +-18 +-23 +31 +-6 +-33 +17 +-18 +-36 +21 +-13 +-32 +29 +-10 +-29 +30 +-8 +-16 +29 +0 +-24 +37 +-4 +-28 +29 +-10 +-23 +30 +-9 +-28 +29 +-10 +-27 +30 +-7 +-28 +30 +-7 +-19 +32 +0 +-22 +28 +-10 +-24 +44 +5 +-19 +35 +-3 +-22 +34 +-7 +-19 +29 +-11 +-30 +27 +-8 +-30 +35 +-6 +-27 +27 +-9 +-29 +30 +-8 +-26 +37 +4 +-23 +28 +-10 +-20 +37 +-3 +-19 +34 +-7 +-24 +24 +-4 +-23 +38 +-4 +-28 +26 +-7 +-27 +26 +-2 +-17 +41 +-2 +-27 +29 +-9 +-23 +26 +-9 +-17 +42 +-2 +-26 +30 +-6 +-30 +25 +-13 +-30 +28 +-9 +-21 +35 +-6 +-21 +28 +-9 +-30 +27 +-10 +-10 +31 +-6 +-25 +28 +-7 +-23 +27 +-8 +-18 +30 +-8 +-28 +33 +2 +25 +26 +21 +14 +16 +21 +15 +10 +13 +7 +9 +9 +10 +2 +6 +16 +4 +0 +6 +1 +6 +2 +-2 +7 +-1 +-3 +-2 +-1 +3 +-6 +-1 +-1 +12 +15 +15 +-1 +-3 +-3 +-4 +-5 +9 +0 +-5 +-2 +-4 +-3 +-3 +-2 +-4 +13 +-2 +10 +7 +-2 +0 +-4 +-5 +-2 +13 +1 +-4 +-1 +-4 +0 +-1 +-3 +-5 +-2 +0 +5 +1 +15 +0 +-1 +-5 +-2 +2 +0 +-1 +-3 +0 +-1 +-2 +-1 +5 +8 +8 +-4 +-4 +5 +-2 +6 +-1 +-4 +-5 +6 +-3 +-3 +4 +11 +-4 +3 +-3 +2 +9 +2 +-4 +-3 +-2 +-2 +-4 +7 +-2 +-3 +-2 +11 +-2 +8 +2 +-1 +1 +-2 +-6 +-3 +0 +6 +2 +-3 +10 +-26 +-37 +15 +-23 +-41 +12 +-21 +-35 +17 +-18 +-31 +20 +-14 +-24 +23 +-12 +-29 +35 +3 +-25 +31 +-6 +-24 +33 +0 +-17 +26 +-13 +-29 +37 +-5 +-29 +29 +-2 +-26 +26 +-7 +-30 +31 +-8 +-28 +42 +0 +-14 +32 +-7 +-22 +27 +-10 +-17 +26 +-12 +-26 +43 +0 +-26 +37 +-5 +-26 +27 +-9 +-31 +31 +-9 +-29 +27 +-8 +-22 +32 +-7 +-19 +28 +-10 +-26 +27 +-9 +-22 +43 +1 +-25 +31 +-5 +-8 +30 +-6 +-31 +28 +-9 +-27 +25 +-12 +-24 +31 +-4 +-25 +32 +-4 +-24 +28 +-8 +-27 +44 +1 +-27 +31 +-8 +-25 +26 +-11 +-27 +25 +-11 +-29 +31 +-1 +-23 +34 +-7 +-25 +30 +-7 +-27 +46 +2 +-25 +33 +-4 +-27 +31 +-7 +-25 +37 +-2 +-26 +27 +-9 +-29 +30 +-8 +-28 +35 +-6 +-22 +21 +21 +24 +21 +17 +15 +13 +11 +11 +9 +7 +16 +5 +8 +5 +3 +6 +9 +3 +3 +-2 +0 +8 +0 +0 +5 +3 +20 +3 +-3 +3 +-2 +12 +3 +0 +1 +-4 +-4 +-5 +-1 +12 +-1 +1 +12 +-2 +8 +2 +1 +8 +1 +0 +-2 +-7 +-1 +-3 +-1 +3 +5 +7 +-3 +-4 +2 +0 +-1 +-2 +-5 +-6 +-5 +0 +4 +1 +-5 +-5 +7 +7 +-3 +4 +0 +11 +7 +-5 +0 +-5 +-4 +5 +-2 +-1 +-2 +-1 +0 +5 +3 +-2 +-1 +3 +4 +1 +-3 +-2 +-1 +-3 +12 +1 +5 +-4 +1 +2 +-1 +0 +17 +0 +-2 +5 +-1 +-5 +-6 +-1 +12 +15 +15 +-4 +-4 +-5 +9 +-3 +-6 +-7 +-2 +-35 +12 +-22 +-44 +7 +-26 +-41 +14 +-21 +-38 +35 +-4 +-31 +26 +-3 +-28 +23 +-14 +-32 +26 +-11 +-31 +37 +-4 +-16 +32 +-7 +-30 +37 +0 +-23 +41 +-2 +-27 +28 +-11 +-30 +25 +-8 +-23 +30 +-9 +-27 +29 +-11 +-29 +34 +-4 +-26 +29 +-3 +-15 +35 +0 +-23 +40 +-3 +-28 +27 +-8 +-31 +25 +-10 +-30 +27 +-8 +-28 +39 +-3 +-27 +42 +4 +-25 +30 +-7 +-21 +28 +-10 +-26 +30 +-9 +-22 +31 +-8 +-28 +48 +3 +-24 +35 +-6 +-30 +31 +-10 +-22 +27 +-9 +-29 +38 +-1 +-25 +35 +-6 +-28 +43 +-1 +-28 +27 +-9 +-31 +26 +-6 +-24 +29 +-8 +-24 +26 +-8 +-28 +33 +-6 +-27 +41 +-2 +-25 +37 +-3 +-28 +36 +0 +-26 +31 +3 +-25 +27 +-3 +-12 +37 +-3 +-28 +45 +0 +-28 +24 +-8 +-32 +23 +-11 +-30 +38 +1 +-25 +39 +-4 +-29 +40 +3 +-27 +25 +-13 +-19 +27 +-12 +-20 +25 +-11 +-27 +30 +-9 +-28 +37 +-6 +-27 +36 +5 +-25 +29 +-10 +-31 +31 +-7 +-25 +41 +0 +-28 +39 +-3 +-30 +33 +-9 +-24 +25 +-11 +-13 +29 +-10 +-30 +40 +-1 +-29 +25 +-11 +-22 +25 +-11 +-30 +41 +-1 +-26 +32 +1 +-26 +32 +-9 +-24 +30 +-9 +-31 +30 +-8 +-28 +30 +-7 +-28 +32 +-8 +-27 +28 +-9 +-28 +29 +-6 +-25 +41 +1 +-11 +33 +-8 +-24 +31 +-7 +-27 +28 +-7 +-28 +28 +-8 +-28 +31 +-7 +-20 +42 +1 +-24 +36 +-6 +-27 +28 +-9 +-29 +32 +-7 +-23 +30 +-8 +-19 +46 +1 +-25 +27 +-10 +-30 +35 +-6 +-22 +30 +-8 +-28 +27 +-9 +-24 +28 +-7 +-27 +31 +-5 +-27 +32 +-6 +13 +23 +22 +38 +19 +18 +11 +8 +24 +26 +6 +5 +1 +5 +5 +7 +-1 +3 +2 +11 +14 +6 +-1 +-3 +5 +8 +-3 +-5 +-4 +-3 +1 +-2 +4 +-3 +4 +8 +0 +-3 +-3 +-3 +-5 +8 +17 +-1 +-5 +-1 +-1 +3 +-4 +-7 +11 +7 +-6 +-4 +0 +5 +4 +-3 +0 +13 +-1 +2 +15 +13 +7 +6 +-9 +-4 +-8 +-8 +0 +-4 +-2 +-7 +-1 +7 +-3 +7 +-4 +-6 +1 +-3 +-1 +-3 +-3 +0 +-1 +-2 +13 +5 +4 +-2 +3 +7 +-5 +11 +-1 +2 +2 +-1 +-8 +-2 +-5 +-2 +-4 +6 +8 +-3 +-1 +4 +5 +-5 +3 +5 +-5 +-1 +10 +-4 +1 +5 +-1 +-2 +11 +-3 +1 +-1 +-2 +2 +-22 +6 +-28 +-41 +9 +-25 +-42 +19 +-15 +-27 +22 +-15 +-36 +37 +-4 +-29 +30 +-8 +-32 +27 +-12 +-32 +31 +-6 +-28 +26 +-12 +-30 +44 +1 +-22 +30 +-9 +-19 +27 +-5 +-28 +28 +-8 +-21 +41 +-1 +-27 +31 +-9 +-29 +31 +-6 +-29 +30 +-9 +-28 +29 +-9 +-20 +28 +-7 +-27 +31 +-7 +-28 +35 +-6 +-24 +29 +-9 +-29 +30 +-4 +-26 +30 +-7 +-27 +42 +-1 +-23 +34 +4 +-15 +28 +-8 +-27 +28 +-9 +-28 +27 +-9 +-28 +31 +-4 +-26 +32 +-2 +-24 +46 +4 +-23 +31 +-8 +-29 +29 +-8 +-29 +28 +-9 +-29 +29 +-5 +-26 +30 +-6 +-22 +36 +5 +-22 +41 +-1 +-27 +27 +-10 +-29 +35 +0 +-23 +27 +-9 +-29 +32 +-1 +-24 +35 +-5 +-25 +32 +-2 +-14 +49 +4 +-24 +29 +-11 +-28 +34 +-5 +16 +18 +16 +14 +10 +11 +9 +9 +12 +13 +3 +11 +2 +3 +6 +9 +2 +0 +9 +4 +1 +0 +-1 +8 +9 +2 +-3 +1 +10 +2 +-4 +5 +0 +3 +-4 +-3 +10 +9 +-3 +-3 +-4 +-2 +-4 +1 +-4 +-2 +17 +0 +-4 +-4 +-6 +14 +1 +-3 +2 +0 +9 +10 +-4 +0 +3 +11 +-2 +-6 +-6 +-2 +10 +2 +-4 +-4 +-1 +0 +-5 +-1 +-1 +-2 +9 +11 +5 +-3 +6 +-2 +0 +1 +0 +-8 +8 +7 +-2 +-2 +13 +-1 +-4 +-7 +-6 +-5 +0 +-4 +-1 +-1 +4 +-1 +-4 +-4 +-3 +-3 +-2 +1 +14 +12 +2 +-3 +7 +-2 +4 +-5 +-4 +3 +3 +0 +-2 +-2 +-4 +-2 +6 +12 +9 +3 +-2 +-3 +6 +6 +2 +8 +-4 +4 +-6 +-7 +-7 +-5 +-4 +0 +-3 +3 +0 +3 +1 +-1 +-1 +-2 +7 +2 +6 +0 +3 +10 +-4 +2 +1 +-1 +5 +-3 +-4 +0 +-2 +-4 +-5 +-2 +-1 +-3 +0 +3 +6 +11 +8 +16 +-1 +-3 +-4 +-3 +0 +1 +-7 +6 +-3 +-4 +6 +-3 +0 +-4 +3 +1 +0 +-4 +5 +-3 +1 +0 +4 +1 +-1 +5 +8 +6 +12 +2 +-7 +-1 +0 +9 +11 +7 +-4 +-8 +-4 +-2 +-7 +-4 +13 +0 +-4 +0 +1 +3 +-6 +0 +2 +0 +3 +-3 +1 +-1 +-4 +-1 +-4 +-2 +2 +1 +-3 +8 +-3 +-3 +-1 +-5 +0 +17 +5 +15 +-1 +-1 +-3 +-2 +1 +-3 +-5 +2 +-34 +-50 +12 +-24 +-42 +21 +-17 +-39 +18 +-17 +-28 +20 +-15 +-33 +32 +-8 +-27 +32 +-8 +-28 +33 +-3 +-26 +31 +-9 +-22 +44 +1 +-27 +38 +-3 +-25 +26 +-9 +-25 +37 +-6 +-27 +28 +-10 +-24 +28 +-10 +-27 +27 +-3 +-19 +32 +-6 +-25 +26 +-11 +-27 +35 +-6 +-26 +31 +-5 +-21 +42 +-2 +-21 +39 +-3 +-27 +42 +5 +-25 +30 +-9 +-29 +25 +-10 +-18 +25 +-9 +-28 +24 +-12 +-31 +27 +-9 +-28 +29 +-5 +-19 +29 +-4 +-27 +31 +-6 +-28 +30 +-6 +-25 +39 +1 +-21 +42 +1 +-26 +44 +1 +-26 +39 +1 +-28 +25 +-11 +-31 +24 +-11 +-32 +27 +-9 +-25 +29 +-8 +-27 +42 +-1 +-26 +28 +-6 +-29 +28 +-9 +-27 +45 +2 +-23 +40 +-1 +-27 +28 +-5 +-25 +30 +-7 +-29 +29 +-5 +-18 +29 +-9 +-25 +32 +-4 +-23 +33 +-7 +-28 +32 +-7 +-28 +32 +-3 +-22 +27 +-9 +-29 +35 +0 +-25 +28 +-8 +-29 +44 +1 +-16 +34 +-4 +-28 +30 +-9 +-29 +42 +2 +-27 +30 +-10 +-17 +30 +0 +-27 +26 +-11 +-13 +29 +-10 +-30 +25 +-13 +-21 +27 +-7 +-30 +27 +-10 +-26 +29 +-8 +-25 +29 +-10 +-24 +31 +-1 +-11 +33 +-7 +-24 +32 +-5 +-18 +39 +-3 +-28 +28 +-5 +-21 +26 +-9 +-27 +38 +-2 +-19 +47 +1 +-26 +26 +-5 +-26 +36 +-6 +-29 +27 +-1 +-28 +25 +-12 +-30 +30 +3 +-25 +31 +-5 +-26 +36 +-5 +-29 +32 +-6 +-28 +34 +-5 +-29 +30 +-6 +-27 +27 +-10 +-27 +33 +-3 +-27 +38 +-3 +-27 +37 +-3 +-23 +25 +-10 +-30 +28 +-9 +-27 +38 +0 +-24 +28 +-10 +-25 +39 +-1 +-25 +34 +29 +27 +20 +13 +10 +13 +18 +20 +5 +7 +11 +2 +2 +5 +2 +-2 +2 +-2 +-2 +-2 +9 +0 +0 +0 +8 +5 +6 +-2 +0 +2 +-2 +4 +-2 +0 +-3 +1 +1 +6 +-2 +8 +-1 +4 +2 +1 +4 +-2 +1 +11 +-2 +-3 +-4 +-3 +-3 +-1 +-1 +10 +-2 +8 +-2 +-1 +-2 +5 +12 +16 +3 +-5 +-1 +-5 +3 +-1 +8 +15 +-4 +0 +2 +-5 +-5 +-4 +-4 +-4 +2 +4 +-3 +-5 +0 +-3 +-6 +0 +6 +-2 +7 +2 +11 +2 +0 +8 +4 +1 +0 +-9 +-6 +0 +-5 +-5 +-3 +-5 +-3 +15 +18 +0 +-3 +3 +-5 +9 +12 +0 +-6 +-6 +14 +-3 +-7 +-4 +-5 +-6 +-4 +-4 +-2 +1 +-4 +-2 +-1 +5 +0 +8 +9 +0 +-6 +3 +-3 +-3 +-3 +12 +0 +5 +-2 +-2 +0 +2 +-1 +3 +6 +-1 +-5 +1 +0 +-1 +1 +4 +2 +-1 +5 +-3 +-5 +18 +2 +3 +-5 +-1 +-2 +9 +-4 +1 +-5 +10 +-2 +11 +-3 +5 +-3 +-3 +-4 +13 +16 +1 +-5 +-5 +-4 +-1 +-5 +-2 +6 +0 +0 +3 +7 +0 +-5 +-1 +-5 +-3 +3 +-1 +1 +12 +-2 +-6 +-4 +1 +9 +6 +14 +2 +0 +-1 +-7 +-6 +-4 +-7 +4 +-2 +3 +-1 +-5 +-3 +0 +3 +-5 +-5 +-3 +1 +2 +5 +3 +-2 +3 +1 +5 +-1 +-1 +1 +6 +-2 +-1 +13 +8 +1 +-1 +5 +2 +-4 +2 +0 +-7 +2 +-5 +3 +-33 +-33 +12 +-24 +-38 +14 +-13 +-23 +18 +-15 +-37 +18 +-9 +-27 +28 +-5 +-24 +23 +-10 +-27 +26 +-12 +-30 +39 +-2 +-18 +30 +-5 +-29 +33 +-7 +-29 +27 +-8 +-28 +35 +0 +-22 +32 +-7 +-23 +26 +-12 +-26 +25 +-9 +-26 +28 +-3 +-15 +38 +-2 +-18 +30 +-10 +-21 +30 +-9 +-23 +30 +-8 +-16 +32 +-8 +-29 +26 +-10 +-25 +24 +-4 +-9 +31 +-8 +-30 +29 +-9 +-27 +30 +-9 +-16 +35 +2 +-15 +37 +-5 +-22 +25 +-12 +-32 +26 +-7 +-14 +31 +-5 +-26 +32 +-9 +-26 +31 +-8 +-29 +31 +1 +-24 +33 +-7 +-26 +29 +-8 +-18 +27 +-9 +-27 +31 +-5 +-25 +32 +-5 +-25 +34 +-7 +-23 +31 +0 +-24 +36 +6 +-22 +25 +-3 +-27 +30 +-10 +-27 +23 +-11 +-22 +27 +-10 +-22 +33 +-6 +-27 +30 +26 +18 +19 +30 +30 +20 +23 +11 +4 +5 +24 +6 +0 +-1 +1 +3 +-1 +-1 +-2 +4 +0 +4 +-4 +17 +1 +2 +-3 +3 +5 +7 +0 +-2 +1 +1 +-4 +2 +-2 +-4 +1 +-4 +1 +-3 +-3 +0 +4 +1 +0 +-3 +-1 +-1 +4 +0 +-3 +-1 +-1 +-1 +-1 +9 +4 +-3 +6 +5 +3 +5 +-3 +8 +10 +1 +-5 +-3 +-6 +1 +-5 +-1 +0 +10 +10 +-3 +-1 +4 +-3 +1 +5 +-3 +-4 +4 +-4 +-3 +-1 +7 +-4 +1 +-4 +9 +0 +-4 +-3 +-2 +2 +0 +9 +-2 +7 +2 +-4 +-5 +12 +1 +-2 +-4 +11 +2 +-5 +-5 +-6 +16 +0 +-1 +3 +4 +-5 +-1 +6 +-5 +4 +5 +-1 +-1 +-36 +-50 +12 +-24 +-41 +21 +-18 +-34 +20 +-16 +-21 +26 +-11 +-33 +25 +-9 +-30 +42 +-1 +-28 +30 +-5 +-28 +29 +-10 +-17 +28 +-11 +-30 +33 +-7 +-18 +34 +-4 +-15 +37 +-6 +-27 +25 +-12 +-32 +34 +-7 +-22 +27 +-10 +-28 +28 +-10 +-30 +30 +-8 +-21 +50 +4 +-22 +36 +-3 +-28 +24 +-14 +-30 +25 +-11 +-31 +35 +0 +-24 +29 +-3 +-26 +29 +-7 +-21 +27 +-9 +-30 +28 +-7 +-25 +30 +-8 +-25 +30 +-1 +-16 +28 +-8 +-25 +47 +3 +-23 +29 +-9 +-25 +34 +-7 +-16 +34 +-4 +-25 +29 +-11 +-29 +37 +-4 +-28 +25 +-12 +-27 +32 +-7 +-23 +31 +-8 +-23 +27 +-7 +-29 +36 +2 +-21 +26 +-10 +-30 +31 +-8 +-27 +30 +-7 +-28 +36 +7 +-20 +40 +0 +-26 +47 +2 +-25 +27 +-6 +-29 +26 +20 +16 +18 +30 +16 +8 +10 +6 +6 +6 +13 +5 +5 +8 +9 +17 +1 +-1 +-3 +-2 +-1 +7 +1 +-3 +2 +2 +5 +8 +2 +-2 +0 +-3 +-1 +-2 +0 +9 +-3 +-3 +6 +4 +-2 +-4 +12 +11 +10 +17 +-1 +-2 +-1 +-7 +-7 +-4 +2 +-4 +1 +-3 +1 +7 +1 +9 +-4 +5 +0 +-2 +-3 +6 +4 +14 +12 +1 +-7 +0 +-6 +-4 +0 +-8 +2 +-2 +10 +3 +-2 +-3 +5 +-4 +-2 +9 +-1 +-1 +-1 +-8 +-5 +2 +5 +6 +-5 +-1 +-1 +12 +6 +-6 +0 +-1 +-4 +0 +-5 +-4 +-5 +4 +1 +7 +-3 +-5 +-5 +-3 +-3 +2 +16 +-1 +0 +-2 +-4 +0 +3 +3 +-1 +3 +6 +1 +-32 +-49 +5 +-25 +-42 +16 +-19 +-25 +20 +-13 +-19 +33 +-7 +-30 +27 +-8 +-22 +24 +-14 +-21 +43 +0 +-17 +29 +-11 +-31 +24 +-3 +-27 +29 +-11 +-25 +25 +-12 +-30 +30 +-10 +-28 +26 +-9 +-12 +32 +-7 +-24 +34 +-6 +-23 +35 +-6 +-19 +32 +-7 +-26 +29 +-3 +-20 +25 +-8 +-30 +37 +1 +-24 +27 +-9 +-26 +29 +-9 +-28 +26 +-5 +-27 +34 +-3 +-20 +31 +-8 +-28 +38 +3 +-17 +26 +-11 +-29 +38 +-2 +-16 +30 +-6 +-29 +30 +-1 +-17 +28 +-7 +-27 +32 +-8 +-29 +36 +-2 +-26 +30 +-10 +-28 +42 +0 +-18 +31 +-8 +-30 +30 +-7 +-27 +27 +-10 +-29 +30 +-8 +-27 +36 +-6 +-27 +29 +-8 +-25 +37 +5 +-22 +30 +-7 +-23 +40 +4 +-23 +31 +-8 +-31 +43 +-1 +-25 +40 +2 +-27 +25 +29 +24 +16 +11 +16 +23 +8 +3 +22 +6 +8 +-2 +8 +10 +13 +-3 +-6 +2 +0 +-1 +-4 +1 +2 +-2 +6 +1 +-1 +-2 +6 +10 +-3 +-4 +-3 +4 +0 +1 +-5 +1 +-1 +-2 +2 +16 +1 +1 +0 +16 +1 +-1 +-3 +-7 +-3 +6 +-3 +1 +-4 +-4 +-6 +1 +-2 +-3 +-3 +-2 +-4 +4 +-3 +3 +-4 +4 +-1 +7 +2 +14 +1 +-3 +-3 +2 +7 +0 +-4 +-3 +-1 +6 +5 +-3 +-3 +6 +-4 +-3 +-2 +2 +6 +-2 +-4 +7 +4 +5 +0 +-4 +10 +16 +1 +-5 +-7 +-5 +14 +0 +-4 +-4 +-5 +-4 +1 +5 +1 +0 +2 +-5 +-4 +-1 +-5 +-2 +-1 +0 +3 +-2 +3 +4 +17 +7 +-28 +-46 +10 +-25 +-42 +20 +-18 +-35 +18 +-17 +-33 +23 +-10 +-23 +35 +-6 +-20 +37 +-5 +-25 +30 +0 +-27 +22 +-10 +-32 +27 +-10 +-30 +32 +-8 +-27 +25 +-9 +-21 +28 +-10 +-25 +30 +-8 +-29 +32 +-8 +-27 +46 +3 +-18 +28 +-11 +-31 +30 +0 +-25 +27 +-8 +-28 +41 +0 +-21 +35 +-6 +-29 +27 +-3 +-28 +35 +-6 +-28 +26 +-2 +-27 +31 +-8 +-27 +30 +-7 +-27 +38 +-4 +-26 +36 +2 +-13 +28 +-10 +-28 +28 +0 +-21 +32 +-5 +-27 +29 +-9 +-24 +50 +4 +-22 +31 +-5 +-28 +30 +-10 +-30 +38 +3 +-26 +24 +-14 +-32 +31 +-8 +-26 +31 +-9 +-24 +25 +-11 +-27 +41 +1 +-17 +29 +-2 +-10 +29 +-10 +-27 +23 +-11 +-24 +30 +-9 +-20 +44 +0 +-26 +27 +-9 +-22 +30 +-9 +-28 +26 +28 +21 +17 +27 +17 +12 +20 +9 +7 +8 +10 +20 +3 +0 +0 +16 +14 +0 +-3 +-2 +6 +-4 +8 +-3 +4 +-3 +-2 +15 +-2 +8 +-2 +-3 +6 +4 +-5 +11 +-4 +-3 +-5 +-4 +3 +6 +2 +10 +13 +4 +2 +-9 +-5 +-4 +-4 +-8 +-7 +-1 +-5 +-4 +-6 +11 +2 +5 +8 +9 +-4 +1 +-4 +3 +-5 +-5 +-8 +-3 +4 +1 +3 +-2 +-2 +-2 +-3 +6 +14 +-1 +-4 +10 +1 +5 +4 +7 +-3 +-3 +-3 +14 +-2 +-1 +6 +2 +-2 +11 +-4 +-3 +12 +-4 +-7 +3 +4 +4 +-6 +-5 +-3 +-3 +-6 +-7 +-6 +16 +1 +11 +-2 +-7 +-3 +0 +-1 +-2 +3 +5 +2 +-4 +0 +-4 +-3 +-2 +-36 +5 +-23 +-43 +10 +-15 +-33 +27 +-7 +-33 +19 +-13 +-35 +27 +-10 +-29 +38 +-2 +-25 +27 +-7 +-25 +24 +-7 +-25 +31 +-9 +-20 +25 +-12 +-25 +25 +-6 +-19 +32 +-6 +-29 +35 +-1 +-17 +26 +-11 +-23 +32 +-7 +-23 +49 +5 +-17 +43 +-1 +-29 +21 +-9 +-32 +23 +-13 +-33 +25 +-6 +-30 +31 +-9 +-25 +25 +-11 +-29 +34 +-3 +-25 +30 +-3 +-27 +39 +-2 +-23 +28 +-9 +-28 +30 +-2 +-26 +29 +-6 +-26 +49 +4 +-24 +31 +-3 +-27 +40 +-2 +-16 +32 +-8 +-30 +26 +-12 +-21 +30 +-9 +-31 +28 +-9 +-21 +29 +2 +-24 +35 +-6 +-17 +37 +-5 +-25 +35 +-4 +-27 +24 +-12 +-31 +24 +-11 +-11 +31 +-8 +-25 +26 +-3 +-21 +30 +-5 +-29 +34 +-2 +-24 +27 +3 +-24 +27 +-10 +-28 +23 +-6 +-28 +48 +3 +-20 +37 +-4 +-28 +29 +-9 +-30 +24 +-11 +-14 +34 +0 +-17 +43 +1 +-24 +36 +-5 +-28 +37 +-4 +-29 +29 +-8 +-24 +33 +-7 +-31 +23 +-14 +-27 +26 +-11 +-14 +29 +0 +-26 +28 +-7 +-30 +27 +-7 +-16 +29 +-9 +-30 +26 +-11 +-25 +27 +-2 +-24 +42 +0 +-9 +30 +-8 +-27 +25 +-12 +-25 +28 +-6 +-12 +32 +-7 +-24 +37 +0 +-27 +30 +-4 +-10 +29 +-9 +-32 +27 +-9 +-31 +25 +-5 +-27 +27 +-11 +-25 +36 +-1 +-22 +41 +-2 +-13 +29 +-10 +-28 +25 +-12 +-30 +35 +2 +-25 +30 +-9 +-26 +32 +-5 +-23 +35 +-1 +-23 +41 +0 +-27 +36 +-5 +-29 +35 +-2 +-27 +29 +-11 +-23 +28 +-7 +-13 +28 +-11 +-15 +29 +-10 +-31 +42 +-1 +-27 +23 +-13 +-31 +29 +-10 +-28 +27 +-2 +14 +19 +19 +28 +15 +28 +20 +7 +8 +4 +4 +7 +10 +6 +6 +-1 +1 +-1 +14 +8 +0 +13 +-1 +-1 +13 +8 +-5 +-4 +-6 +-3 +-4 +2 +-1 +-3 +-5 +2 +9 +1 +-3 +13 +0 +-3 +-3 +-1 +-4 +1 +14 +6 +4 +-6 +17 +0 +-3 +12 +-4 +-5 +5 +-2 +-5 +-6 +10 +-1 +-6 +-3 +-4 +-6 +10 +-2 +-6 +-1 +-2 +-2 +-3 +-1 +5 +0 +1 +0 +8 +3 +7 +7 +-3 +-4 +-4 +-1 +-2 +16 +0 +-5 +-2 +7 +-4 +8 +4 +14 +-1 +-4 +-8 +-8 +-6 +-5 +9 +-1 +0 +6 +8 +-5 +-3 +-2 +0 +-1 +17 +1 +-2 +-3 +0 +-6 +1 +4 +12 +9 +-4 +11 +-2 +-4 +-7 +-3 +2 +10 +1 +7 +-5 +-3 +-3 +0 +10 +13 +-1 +-5 +-2 +0 +1 +-4 +6 +-5 +-4 +-6 +-1 +3 +2 +0 +-2 +-1 +4 +13 +11 +0 +-6 +-1 +0 +-5 +-4 +-2 +0 +0 +13 +9 +-4 +-6 +-1 +-5 +-3 +-2 +3 +-1 +-2 +0 +5 +0 +-3 +1 +-1 +-5 +-3 +3 +-2 +3 +0 +-2 +4 +-1 +-1 +-2 +8 +7 +-2 +-1 +2 +-2 +-2 +-1 +-2 +5 +0 +1 +-1 +1 +3 +-2 +4 +10 +9 +-2 +3 +0 +-3 +13 +14 +0 +-7 +-5 +-5 +-6 +4 +9 +0 +-3 +-5 +-4 +-4 +-3 +-3 +4 +6 +-2 +-1 +-2 +-3 +-1 +-1 +-1 +2 +2 +3 +-3 +-1 +0 +0 +6 +10 +-2 +5 +12 +16 +1 +-31 +3 +-31 +-42 +14 +-22 +-39 +18 +-18 +-37 +17 +-16 +-36 +24 +-13 +-29 +25 +-11 +-30 +32 +-8 +-23 +27 +-5 +-25 +39 +-2 +-19 +27 +-10 +-30 +41 +-2 +-26 +28 +-10 +-30 +26 +-10 +-24 +34 +-5 +-27 +41 +5 +-21 +26 +-9 +-26 +27 +-11 +-27 +32 +-5 +-22 +40 +-2 +-19 +29 +0 +-26 +31 +-9 +-27 +28 +-9 +-27 +28 +-4 +-13 +43 +1 +-12 +30 +-10 +-21 +25 +-12 +-32 +26 +-6 +-25 +30 +-1 +-26 +30 +-5 +-28 +28 +-9 +-16 +35 +-5 +-22 +28 +-9 +-21 +27 +-6 +-27 +37 +-4 +-27 +32 +-8 +-22 +32 +-7 +-29 +28 +-7 +-28 +28 +-2 +-20 +28 +-6 +-25 +32 +-7 +-19 +37 +-5 +-28 +29 +-9 +-13 +33 +-5 +-26 +27 +-10 +-29 +37 +-4 +-25 +45 +3 +-13 +33 +-8 +-23 +33 +-7 +10 +22 +13 +13 +20 +22 +13 +8 +12 +12 +7 +0 +15 +6 +-1 +-2 +8 +1 +-2 +5 +-1 +1 +1 +0 +1 +-1 +3 +-2 +-3 +9 +-2 +1 +-4 +6 +-2 +4 +6 +3 +-3 +-3 +3 +-1 +1 +-3 +5 +-3 +4 +-3 +4 +3 +-4 +4 +-2 +10 +3 +-3 +6 +1 +-6 +-4 +-4 +13 +20 +2 +-7 +-7 +-4 +4 +5 +-1 +11 +-2 +-6 +11 +0 +14 +-3 +-6 +3 +-1 +-4 +4 +-4 +2 +7 +-4 +4 +-5 +-5 +-6 +-3 +2 +-3 +-3 +-4 +-5 +17 +2 +8 +4 +-6 +0 +1 +-4 +-3 +4 +-2 +-4 +-3 +-2 +4 +10 +3 +2 +3 +0 +11 +1 +5 +-6 +12 +-2 +9 +9 +-2 +-4 +-6 +-4 +13 +-22 +-40 +4 +-31 +-48 +10 +-25 +-43 +15 +-21 +-32 +26 +-11 +-27 +26 +-12 +-29 +28 +-8 +-23 +27 +-11 +-31 +31 +-6 +-26 +33 +-3 +-25 +28 +-7 +-28 +34 +-5 +-26 +27 +-4 +-16 +31 +-9 +-26 +36 +-3 +-23 +37 +-4 +-22 +44 +0 +-26 +27 +-9 +-24 +38 +-3 +-29 +36 +-6 +-25 +25 +-12 +-13 +30 +-9 +-30 +27 +-10 +-29 +31 +-5 +-27 +30 +-1 +-25 +46 +2 +-25 +30 +-8 +-23 +32 +-8 +-14 +31 +-8 +-23 +30 +-10 +-28 +28 +-10 +-30 +32 +-7 +-28 +31 +-5 +-25 +34 +-6 +-26 +31 +-7 +-19 +30 +-10 +-29 +43 +3 +-21 +38 +2 +-15 +28 +-1 +-27 +28 +-11 +-32 +42 +0 +-27 +23 +-15 +-27 +24 +-3 +-22 +26 +-11 +-20 +27 +-8 +-25 +44 +0 +-22 +26 +-9 +-30 +31 +-1 +-12 +21 +20 +21 +16 +15 +11 +25 +12 +9 +10 +10 +5 +6 +20 +19 +14 +-2 +-1 +-5 +-3 +4 +14 +0 +-4 +7 +1 +-2 +-3 +-1 +0 +-2 +-2 +-1 +5 +2 +-2 +3 +-1 +0 +-2 +4 +9 +3 +-4 +10 +14 +8 +-4 +9 +-1 +3 +-6 +0 +13 +-3 +-5 +-5 +1 +5 +-1 +-5 +-4 +-4 +-2 +-1 +0 +20 +1 +4 +3 +-6 +-6 +5 +-2 +-4 +8 +2 +13 +-3 +2 +-3 +-3 +-4 +-4 +-5 +-2 +6 +-3 +-1 +-5 +1 +2 +5 +4 +-2 +1 +-3 +-4 +-1 +-5 +-2 +0 +2 +5 +1 +1 +-3 +7 +3 +7 +17 +1 +-5 +6 +-1 +-2 +-1 +9 +-3 +-4 +-6 +-4 +-5 +2 +-2 +-2 +11 +1 +24 +-17 +-45 +6 +-23 +-42 +11 +-17 +-40 +15 +-21 +-38 +19 +-16 +-33 +23 +-13 +-30 +26 +-8 +-28 +27 +-10 +-27 +28 +-8 +-27 +39 +-3 +-25 +31 +-3 +-25 +31 +-4 +-25 +47 +3 +-22 +29 +-10 +-29 +33 +-7 +-26 +32 +-8 +-27 +36 +-5 +-25 +40 +-3 +-29 +38 +-2 +-28 +27 +-10 +-28 +29 +-10 +-28 +29 +-8 +-22 +29 +-4 +-13 +41 +-2 +-25 +27 +-9 +-12 +31 +-5 +-29 +34 +-2 +-28 +24 +-8 +-19 +29 +-10 +-15 +36 +-3 +-25 +24 +-10 +-31 +27 +-6 +-28 +30 +-3 +-27 +27 +-11 +-24 +29 +-7 +-26 +34 +-6 +-19 +34 +-5 +-19 +41 +-2 +-26 +26 +-11 +-25 +32 +-6 +-28 +29 +-8 +-20 +36 +-6 +-29 +36 +-4 +-15 +36 +-7 +-29 +27 +-10 +-27 +27 +-8 +-28 +28 +-7 +-26 +29 +-8 +-18 +23 +37 +23 +24 +16 +13 +29 +14 +9 +8 +13 +4 +8 +8 +11 +2 +14 +8 +13 +3 +2 +1 +0 +-4 +12 +4 +-7 +-2 +-1 +-4 +0 +1 +12 +3 +0 +5 +-4 +-4 +-4 +2 +-1 +11 +10 +12 +-5 +-2 +9 +12 +6 +-6 +-10 +-2 +-8 +-9 +-9 +7 +-1 +-4 +0 +2 +-4 +-2 +5 +7 +-4 +-2 +12 +3 +-5 +-4 +11 +1 +-4 +2 +-4 +0 +-2 +0 +4 +-3 +-4 +14 +13 +13 +-3 +13 +-4 +-5 +1 +-7 +-5 +-2 +-4 +-6 +-3 +-2 +10 +9 +-4 +-4 +3 +5 +16 +1 +5 +-5 +-3 +9 +-1 +-2 +-4 +-4 +-5 +-1 +-2 +0 +-2 +-5 +-3 +2 +-3 +0 +-2 +-2 +-2 +6 +-3 +-2 +9 +-25 +-44 +7 +-27 +-43 +16 +-14 +-29 +30 +-11 +-24 +21 +-14 +-29 +26 +-13 +-30 +35 +-3 +-29 +27 +-11 +-28 +34 +-1 +-27 +30 +-7 +-22 +32 +-5 +-27 +42 +3 +-21 +25 +-12 +-32 +28 +-9 +-22 +30 +-8 +-24 +29 +-10 +-26 +31 +-7 +-10 +33 +-8 +-26 +38 +-3 +-27 +34 +-5 +-28 +25 +-10 +-30 +28 +-7 +-27 +27 +-8 +-27 +29 +-9 +-26 +32 +-6 +-23 +34 +-4 +-21 +29 +-7 +-24 +31 +-6 +-25 +31 +5 +-22 +32 +-7 +-24 +30 +-7 +-28 +30 +-4 +-25 +31 +-6 +-18 +31 +-6 +-24 +27 +-7 +-11 +34 +-7 +-28 +27 +2 +-23 +33 +1 +-23 +42 +-1 +-25 +29 +-10 +-29 +23 +-10 +-19 +31 +-8 +-22 +27 +-10 +-29 +33 +-7 +-24 +35 +-5 +-18 +32 +-8 +-28 +36 +-4 +-22 +30 +-8 +-28 +21 +30 +22 +27 +16 +14 +21 +15 +12 +9 +4 +6 +5 +9 +16 +5 +3 +1 +3 +4 +-1 +2 +1 +7 +-1 +2 +4 +1 +-3 +0 +-1 +-1 +0 +6 +2 +1 +-2 +-1 +8 +1 +7 +3 +1 +-2 +12 +7 +15 +-3 +-4 +-6 +1 +5 +7 +11 +-2 +4 +13 +-3 +-8 +-5 +-8 +9 +3 +0 +7 +-4 +-5 +-2 +0 +-5 +-8 +-1 +-5 +3 +12 +4 +3 +-5 +0 +-3 +-5 +8 +11 +-3 +6 +-5 +-5 +-1 +-7 +15 +-1 +2 +-5 +-2 +-6 +-5 +-1 +3 +-4 +-4 +-4 +4 +1 +2 +1 +3 +-4 +-2 +8 +-2 +-3 +0 +2 +-1 +16 +1 +0 +-5 +1 +-1 +5 +1 +1 +-3 +4 +-2 +-2 +8 +20 +-19 +-47 +17 +-22 +-45 +24 +-15 +-41 +17 +-17 +-37 +17 +-18 +-37 +31 +-10 +-27 +24 +-11 +-30 +25 +-11 +-24 +25 +-2 +-25 +29 +-9 +-28 +34 +-1 +-24 +29 +-5 +-25 +37 +0 +-23 +32 +-8 +-15 +38 +-4 +-29 +41 +-2 +-12 +28 +-11 +-32 +25 +-8 +-23 +29 +-6 +-14 +30 +-9 +-30 +28 +-10 +-28 +28 +-10 +-29 +29 +-7 +-27 +35 +-5 +-21 +35 +-5 +-26 +28 +-6 +-27 +35 +-3 +-24 +29 +-2 +-26 +35 +-1 +-24 +27 +-11 +-23 +26 +-10 +-16 +52 +6 +-22 +31 +-9 +-30 +26 +-7 +-20 +26 +-11 +-26 +27 +-11 +-26 +28 +-8 +-10 +33 +-7 +-25 +37 +0 +-25 +27 +-11 +-29 +38 +0 +-25 +30 +-10 +-23 +35 +-4 +-25 +29 +-11 +-20 +41 +-1 +-25 +27 +-7 +-27 +25 +-8 +-29 +37 +-5 +-27 +18 +20 +21 +25 +16 +15 +13 +9 +16 +13 +8 +6 +8 +5 +2 +3 +0 +14 +10 +8 +13 +24 +2 +-4 +-4 +-3 +-4 +-5 +0 +5 +4 +-2 +-2 +3 +-3 +0 +12 +3 +-5 +-4 +8 +-3 +-5 +2 +-3 +-5 +5 +4 +2 +-5 +12 +-2 +-4 +-2 +2 +-2 +-2 +13 +-2 +0 +-5 +-4 +5 +-4 +-4 +2 +-3 +1 +-4 +-2 +0 +1 +1 +-1 +0 +1 +0 +10 +-1 +7 +2 +13 +9 +1 +1 +-5 +6 +-1 +-3 +5 +-4 +1 +-1 +0 +-3 +-4 +-3 +-2 +6 +2 +-4 +-3 +-1 +18 +1 +0 +-1 +3 +-6 +-4 +-4 +-2 +2 +4 +3 +-5 +2 +3 +-3 +-1 +-1 +-1 +-3 +0 +1 +9 +4 +14 +13 +-24 +-41 +5 +-30 +-34 +23 +-16 +-39 +14 +-21 +-36 +21 +-5 +-30 +32 +-9 +-31 +30 +-2 +-29 +25 +-12 +-30 +26 +-11 +-27 +35 +-6 +-28 +29 +-8 +-17 +32 +-6 +-19 +37 +-4 +-27 +26 +-12 +-19 +31 +-8 +-27 +30 +-9 +-14 +42 +-1 +-25 +44 +0 +-16 +30 +-7 +-28 +30 +-11 +-31 +28 +-11 +-28 +23 +-13 +-26 +27 +0 +-14 +32 +-9 +-29 +28 +-5 +-26 +36 +-2 +-27 +25 +-12 +-29 +37 +-4 +-25 +29 +1 +-25 +31 +-7 +-25 +49 +4 +-25 +30 +-5 +-27 +33 +-1 +-16 +45 +0 +-28 +28 +-10 +-29 +23 +-13 +-27 +36 +-4 +-24 +24 +-12 +-30 +36 +-5 +-26 +30 +-5 +-20 +27 +-11 +-20 +33 +-6 +-22 +36 +-5 +-28 +31 +-9 +-29 +31 +-2 +-27 +30 +1 +-24 +30 +-9 +-27 +31 +-8 +-28 +23 +20 +39 +21 +18 +16 +11 +7 +10 +8 +5 +6 +3 +7 +19 +15 +-1 +5 +7 +-1 +7 +-2 +-3 +-3 +-1 +7 +1 +0 +-6 +2 +-2 +-1 +2 +1 +-2 +0 +0 +9 +-1 +-1 +-3 +-1 +7 +7 +13 +4 +6 +2 +9 +-2 +-5 +-4 +-6 +7 +17 +1 +4 +-4 +-7 +-8 +-6 +-2 +-6 +8 +0 +-2 +3 +-2 +-4 +-1 +9 +11 +-2 +-1 +10 +1 +-3 +-5 +2 +-4 +4 +6 +-1 +3 +-6 +-4 +-2 +2 +5 +-2 +0 +5 +-4 +-2 +-1 +9 +1 +0 +-1 +3 +7 +6 +-4 +-3 +1 +-1 +-2 +-3 +-2 +3 +-2 +0 +1 +-1 +5 +2 +4 +-1 +3 +-4 +-3 +-3 +-2 +5 +15 +4 +-3 +-3 +12 +-25 +-47 +18 +-15 +-40 +20 +-18 +-28 +27 +-13 +-34 +33 +-8 +-35 +26 +-13 +-32 +22 +-12 +-31 +23 +-14 +-30 +26 +-11 +-17 +29 +-11 +-29 +38 +-3 +-27 +27 +-10 +-19 +44 +1 +-26 +29 +-9 +-17 +39 +-3 +-24 +30 +-10 +-22 +25 +-12 +-32 +25 +-11 +-14 +28 +-10 +-29 +46 +1 +-25 +30 +-3 +-28 +47 +2 +-15 +40 +-3 +-31 +25 +-14 +-31 +24 +-12 +-20 +28 +-3 +-27 +29 +-7 +-29 +31 +-4 +-25 +26 +-11 +-29 +29 +-4 +-17 +26 +-7 +-25 +36 +-5 +-27 +28 +-10 +-17 +29 +-4 +-15 +32 +-5 +-29 +33 +-3 +-24 +27 +-5 +-25 +27 +-6 +-28 +39 +-2 +-23 +28 +-3 +-25 +29 +-8 +-25 +27 +-11 +-29 +38 +-3 +-25 +40 +-1 +-15 +36 +-5 +-29 +25 +-13 +-27 +28 +-9 +-29 +29 +-9 +-19 +23 +28 +19 +19 +21 +18 +14 +30 +13 +7 +14 +4 +2 +2 +3 +19 +5 +10 +-2 +11 +2 +6 +-3 +-3 +1 +1 +-2 +13 +2 +-3 +-3 +-4 +4 +7 +-4 +0 +5 +0 +-6 +-4 +2 +0 +-6 +8 +2 +0 +-2 +-2 +6 +-2 +13 +1 +8 +12 +2 +-1 +-6 +-4 +3 +-4 +-5 +2 +3 +15 +0 +-5 +-1 +-5 +4 +6 +-5 +4 +-3 +6 +-1 +4 +0 +1 +-4 +-5 +-5 +-5 +0 +-2 +0 +6 +-3 +15 +-1 +0 +-5 +-5 +-4 +13 +-1 +1 +13 +14 +5 +-6 +-3 +-6 +-5 +15 +-1 +-4 +-4 +-5 +11 +-1 +11 +-3 +-5 +-1 +-2 +-1 +-4 +0 +-5 +-1 +-4 +-6 +-2 +0 +11 +12 +-2 +13 +-22 +5 +-30 +-49 +17 +-20 +-30 +18 +-16 +-38 +16 +-19 +-34 +22 +-11 +-26 +36 +-2 +-26 +27 +-11 +-18 +25 +-13 +-28 +28 +-3 +-22 +27 +-10 +-23 +27 +-11 +-29 +41 +-1 +-26 +30 +-9 +-26 +27 +-9 +-18 +30 +-7 +-27 +34 +-4 +-27 +35 +-6 +-27 +28 +-8 +-26 +33 +-6 +-26 +27 +-5 +-24 +35 +-2 +-23 +35 +-2 +-25 +33 +-8 +-28 +38 +0 +-19 +32 +-8 +-14 +36 +-1 +-14 +29 +-12 +-32 +23 +-13 +-27 +32 +-7 +-28 +31 +-8 +-29 +28 +-9 +-24 +28 +-4 +-12 +30 +-8 +-15 +35 +-5 +-24 +25 +-9 +-23 +32 +-7 +-27 +46 +4 +-21 +28 +-9 +-31 +45 +1 +-27 +29 +-8 +-22 +26 +-13 +-31 +28 +-10 +-23 +37 +-5 +-26 +31 +-8 +-29 +28 +-7 +-26 +27 +-2 +-24 +37 +-4 +-27 +44 +2 +29 +22 +21 +18 +12 +23 +15 +20 +14 +2 +0 +3 +2 +-1 +5 +6 +5 +-2 +0 +6 +4 +14 +13 +-2 +-4 +5 +4 +-3 +13 +-1 +-7 +-4 +-7 +-2 +5 +4 +3 +8 +-2 +2 +-5 +-1 +-4 +1 +13 +-1 +3 +-4 +-3 +-4 +-4 +-4 +-3 +-2 +0 +-1 +-2 +-2 +13 +14 +6 +-4 +-4 +12 +-2 +3 +-1 +2 +-2 +-6 +7 +-4 +10 +16 +10 +0 +2 +-9 +-7 +-5 +4 +12 +-3 +-6 +3 +5 +12 +-2 +-6 +2 +14 +-3 +-1 +-3 +-6 +-4 +0 +-3 +-2 +0 +-7 +-5 +11 +4 +-2 +-5 +-5 +-7 +11 +0 +-1 +-4 +-3 +4 +10 +-3 +-4 +1 +-4 +10 +1 +-2 +7 +4 +13 +13 +0 +8 +10 +-23 +-39 +3 +-32 +-49 +12 +-22 +-41 +23 +-16 +-28 +22 +-15 +-36 +25 +-6 +-24 +22 +-5 +-30 +25 +-10 +-29 +26 +-11 +-21 +28 +-10 +-29 +34 +-4 +-15 +47 +2 +-24 +26 +-1 +-27 +25 +-13 +-31 +30 +-8 +-20 +34 +-7 +-28 +31 +-5 +-27 +29 +-9 +-29 +43 +1 +-20 +26 +-3 +-24 +34 +-6 +-30 +37 +4 +-24 +27 +-5 +-16 +44 +0 +-26 +25 +-9 +-31 +32 +-3 +-22 +35 +-3 +-21 +24 +-15 +-27 +26 +-11 +-28 +30 +-9 +-29 +25 +-10 +-29 +29 +-9 +-26 +31 +-7 +-16 +38 +1 +-18 +27 +-10 +-28 +37 +-3 +-19 +31 +-8 +-30 +27 +-11 +-27 +29 +-6 +-27 +30 +-9 +-25 +39 +1 +-23 +32 +-6 +-19 +26 +-10 +-29 +32 +-6 +-20 +34 +-5 +-24 +30 +-9 +-27 +38 +-1 +-17 +33 +-6 +-25 +18 +23 +19 +23 +16 +17 +11 +10 +21 +20 +12 +10 +2 +3 +7 +19 +4 +13 +12 +3 +8 +12 +-4 +-7 +-6 +1 +-3 +-2 +-2 +-2 +1 +-5 +-4 +3 +-2 +-1 +-3 +3 +5 +6 +2 +-1 +-2 +0 +9 +0 +12 +-2 +0 +-6 +-5 +4 +-4 +-4 +3 +7 +9 +8 +-5 +-6 +-3 +-2 +13 +1 +-4 +-6 +-4 +-2 +4 +-2 +2 +0 +6 +-1 +8 +0 +-5 +14 +-1 +1 +-8 +17 +0 +-1 +-7 +-2 +2 +2 +-3 +5 +-1 +-3 +-4 +-3 +0 +-2 +-1 +7 +-4 +2 +6 +-6 +-2 +-3 +2 +-6 +-2 +4 +0 +5 +-4 +-3 +5 +-2 +-4 +11 +8 +12 +7 +-6 +-7 +-5 +-5 +-4 +4 +-4 +7 +9 +9 +-28 +-50 +7 +-23 +-42 +10 +-23 +-26 +22 +-16 +-18 +24 +-14 +-33 +25 +-12 +-30 +21 +-13 +-33 +37 +0 +-26 +24 +-9 +-28 +34 +-1 +-26 +25 +-11 +-17 +50 +4 +-21 +33 +-7 +-31 +26 +-6 +-29 +25 +-11 +-30 +39 +-4 +-22 +30 +-8 +-18 +32 +-7 +-26 +26 +-11 +-27 +29 +-7 +-14 +44 +1 +-20 +30 +-11 +-30 +27 +-10 +-27 +27 +-8 +-24 +28 +-6 +-23 +28 +-9 +-26 +30 +-6 +-19 +34 +-4 +-27 +29 +-5 +-27 +33 +-5 +-25 +31 +-7 +-21 +39 +-4 +-24 +35 +-4 +-24 +28 +-8 +-29 +29 +-4 +-24 +29 +-6 +-18 +28 +-3 +-28 +32 +-7 +-16 +31 +-2 +-26 +28 +-9 +-25 +27 +-10 +-25 +35 +-6 +-25 +31 +-5 +-15 +49 +4 +-25 +35 +-6 +-30 +27 +-11 +-27 +39 +-2 +-16 +36 +-2 +-29 +19 +25 +21 +15 +12 +17 +8 +8 +8 +10 +5 +5 +5 +7 +2 +7 +5 +6 +2 +3 +7 +2 +8 +-1 +2 +15 +8 +11 +-2 +-8 +1 +-2 +-5 +-5 +-4 +4 +-3 +5 +-3 +-3 +0 +6 +-4 +0 +-2 +0 +9 +-1 +-2 +-5 +16 +3 +-4 +-3 +2 +1 +-2 +2 +0 +-2 +11 +19 +0 +6 +-6 +3 +13 +17 +-3 +-7 +1 +6 +8 +-3 +-10 +-4 +-7 +-8 +5 +-5 +0 +-4 +-8 +-3 +-6 +-1 +-2 +1 +1 +2 +-3 +-3 +2 +10 +-2 +-1 +1 +6 +-4 +14 +0 +10 +8 +-4 +-5 +5 +-4 +4 +11 +12 +-4 +5 +-3 +-2 +-4 +-7 +9 +-4 +-7 +-7 +-4 +-4 +-1 +-2 +-1 +9 +-3 +10 +-26 +16 +-22 +-46 +11 +-23 +-30 +17 +-18 +-39 +16 +-11 +-22 +21 +-16 +-34 +19 +-14 +-33 +26 +-9 +-21 +26 +-6 +-17 +38 +-4 +-25 +32 +-4 +-27 +26 +-8 +-24 +25 +-10 +-23 +27 +-11 +-25 +35 +-6 +-26 +36 +-4 +-27 +41 +0 +-22 +27 +-3 +-23 +27 +-10 +-22 +31 +-1 +-26 +45 +1 +-22 +32 +-7 +-31 +23 +-9 +-25 +39 +-3 +-28 +32 +2 +-26 +29 +-3 +-22 +30 +-7 +-31 +27 +-6 +-27 +26 +-11 +-25 +32 +-8 +-28 +30 +-6 +-28 +28 +-8 +-28 +30 +-5 +-20 +44 +0 +-24 +29 +-4 +-28 +33 +-4 +-26 +29 +-7 +-24 +30 +-4 +-27 +32 +-6 +-24 +27 +-10 +-25 +30 +-6 +-21 +33 +-4 +-26 +31 +-6 +-26 +40 +-2 +-24 +31 +-2 +-23 +41 +-2 +-24 +28 +-8 +-26 +25 +-13 +-30 +30 +-8 +13 +25 +27 +32 +16 +12 +23 +21 +9 +5 +2 +19 +12 +5 +-1 +0 +8 +-1 +6 +24 +2 +0 +-7 +1 +1 +-4 +5 +2 +1 +-5 +3 +12 +-2 +11 +-2 +-3 +5 +3 +0 +-3 +3 +-2 +-8 +3 +-2 +0 +7 +-3 +-4 +11 +7 +-5 +-5 +-6 +-5 +-1 +-4 +2 +-2 +-1 +0 +-3 +-2 +-2 +1 +1 +1 +4 +-4 +14 +-1 +-2 +-2 +-2 +-2 +-2 +-2 +-1 +-1 +8 +1 +2 +1 +0 +14 +4 +2 +3 +-7 +-6 +2 +3 +-2 +-2 +2 +-2 +6 +-3 +-3 +6 +-2 +4 +1 +-3 +-2 +2 +-4 +8 +-1 +-3 +0 +1 +0 +4 +-1 +-1 +-2 +19 +2 +3 +3 +5 +3 +1 +4 +3 +-6 +-3 +-35 +9 +-25 +-47 +9 +-25 +-33 +16 +-19 +-33 +19 +-15 +-28 +38 +-5 +-29 +31 +-7 +-29 +27 +-6 +-24 +36 +-3 +-28 +30 +-10 +-32 +26 +-11 +-30 +39 +-4 +-21 +28 +-10 +-31 +43 +3 +-25 +25 +-7 +-30 +25 +-12 +-21 +28 +-8 +-28 +34 +-6 +-27 +37 +-4 +-24 +28 +-11 +-19 +32 +-7 +-20 +33 +-4 +-21 +45 +2 +-27 +34 +-6 +-27 +42 +1 +-28 +26 +-12 +-28 +30 +-6 +-27 +27 +-12 +-26 +25 +-11 +-30 +33 +-7 +-28 +33 +-4 +-27 +31 +-3 +-26 +29 +-8 +-19 +36 +-3 +-18 +43 +2 +-26 +29 +-10 +-30 +36 +-3 +-28 +31 +2 +-24 +32 +-8 +-31 +26 +-11 +-29 +30 +-1 +-21 +38 +-4 +-24 +49 +4 +-20 +29 +-10 +-28 +29 +-10 +-31 +25 +-13 +-24 +28 +-6 +-26 +32 +-4 +-18 +44 +2 +10 +20 +25 +15 +10 +10 +27 +10 +3 +6 +2 +9 +2 +5 +6 +1 +5 +1 +2 +8 +1 +13 +-1 +-2 +2 +-2 +1 +-1 +-4 +2 +10 +0 +16 +1 +-1 +5 +-4 +-2 +-4 +-7 +-4 +-5 +-3 +1 +3 +1 +-1 +4 +4 +3 +4 +6 +11 +0 +-4 +1 +-1 +-2 +0 +-2 +0 +7 +-5 +2 +-4 +-3 +2 +-3 +0 +-2 +-2 +-1 +2 +0 +5 +17 +9 +-3 +-6 +4 +0 +5 +0 +-5 +-7 +6 +0 +12 +-3 +-6 +9 +-1 +-6 +-1 +-4 +1 +-2 +1 +-2 +3 +-4 +-4 +8 +-1 +-3 +3 +5 +3 +-5 +2 +0 +0 +-1 +3 +3 +8 +12 +-3 +-2 +-4 +2 +1 +-8 +-5 +-1 +-3 +-1 +7 +-28 +23 +-14 +-39 +10 +-25 +-46 +17 +-20 +-36 +24 +-15 +-36 +22 +-14 +-30 +29 +-9 +-27 +27 +-11 +-19 +27 +-8 +-26 +29 +-3 +-27 +28 +-4 +-29 +47 +2 +-23 +43 +0 +-27 +31 +-9 +-23 +38 +-3 +-27 +24 +-9 +-30 +27 +-10 +-29 +35 +-4 +-27 +26 +-9 +-30 +33 +-6 +-27 +28 +-7 +-26 +35 +-1 +-26 +29 +-9 +-23 +29 +-9 +-27 +32 +-7 +-19 +33 +-5 +-28 +33 +-6 +-25 +28 +-8 +-12 +40 +-2 +-25 +32 +-8 +-29 +30 +-8 +-23 +28 +-9 +-28 +42 +6 +-23 +29 +-8 +-28 +28 +2 +-25 +38 +-4 +-23 +47 +3 +-26 +24 +-14 +-26 +31 +-7 +-29 +28 +-9 +-12 +30 +-9 +-30 +37 +-4 +-29 +41 +1 +-27 +35 +-6 +-28 +37 +3 +-25 +24 +-6 +-29 +23 +-4 +-26 +26 +-11 +-29 +40 +1 +18 +23 +13 +13 +13 +33 +13 +7 +9 +5 +11 +3 +0 +12 +7 +0 +8 +26 +4 +-2 +-5 +6 +-1 +0 +4 +-3 +-2 +2 +-3 +-3 +4 +3 +-4 +7 +-1 +-3 +-1 +-3 +-3 +-1 +-2 +7 +9 +-3 +6 +-2 +-2 +-3 +-2 +4 +13 +5 +2 +5 +2 +-4 +-5 +-1 +-1 +-4 +8 +9 +4 +1 +-6 +0 +-2 +-1 +10 +15 +-2 +-2 +10 +5 +-1 +-2 +-9 +-4 +1 +-6 +-5 +-3 +-4 +13 +11 +-1 +-1 +3 +10 +2 +-4 +-3 +-1 +-4 +-3 +8 +-5 +-1 +11 +10 +12 +-5 +-4 +-7 +-7 +12 +13 +2 +-4 +-4 +3 +-5 +5 +-3 +2 +5 +-6 +-8 +4 +-5 +-6 +1 +2 +1 +2 +0 +11 +-3 +6 +-26 +-49 +5 +-27 +-37 +32 +-10 +-36 +31 +-11 +-27 +16 +-19 +-39 +23 +-13 +-20 +29 +-11 +-20 +42 +2 +-23 +20 +-16 +-34 +32 +2 +-25 +28 +-10 +-29 +26 +-13 +-16 +27 +-10 +-31 +42 +0 +-27 +27 +-10 +-29 +27 +-11 +-30 +32 +-7 +-29 +31 +-8 +-28 +34 +-5 +-28 +30 +-8 +-25 +29 +-7 +-27 +42 +-1 +-17 +28 +-7 +-22 +29 +-2 +-17 +32 +-8 +-25 +28 +-10 +-26 +29 +-7 +-28 +30 +-1 +-23 +28 +-9 +-12 +36 +-5 +-26 +28 +-6 +-27 +33 +-5 +-9 +34 +-4 +-27 +31 +-9 +-21 +33 +-7 +-29 +33 +-5 +-29 +30 +-9 +-29 +32 +-3 +-28 +33 +-7 +-27 +35 +-4 +-27 +29 +-7 +-11 +33 +-5 +-26 +32 +-7 +-26 +38 +-1 +-27 +25 +-12 +-16 +32 +-8 +-28 +44 +0 +-25 +26 +-11 +-20 +18 +19 +19 +32 +21 +18 +11 +5 +20 +18 +4 +7 +3 +2 +4 +0 +1 +7 +4 +10 +2 +-1 +0 +4 +-2 +3 +2 +-3 +2 +-1 +-1 +0 +1 +17 +12 +-1 +4 +-2 +-5 +11 +6 +-5 +2 +19 +-1 +-1 +-2 +5 +-2 +-5 +-3 +7 +8 +-5 +-4 +2 +-4 +-1 +-4 +9 +7 +-5 +3 +3 +1 +6 +8 +2 +-4 +-5 +-10 +-5 +-2 +-6 +2 +-2 +5 +17 +0 +0 +0 +-3 +-3 +-4 +-6 +1 +-5 +-4 +-2 +-4 +-1 +3 +-2 +0 +0 +4 +0 +12 +0 +-2 +-2 +3 +-1 +-1 +-3 +9 +-3 +12 +14 +11 +-4 +-5 +-1 +-3 +15 +0 +0 +-6 +10 +-3 +-4 +6 +-3 +-3 +-3 +0 +-1 +0 +-34 +9 +-26 +-45 +7 +-25 +-43 +33 +-9 +-34 +21 +-13 +-36 +22 +-14 +-29 +30 +-7 +-29 +37 +3 +-13 +26 +-9 +-26 +24 +-13 +-28 +28 +-7 +-24 +32 +-8 +-17 +34 +-6 +-29 +28 +-6 +-26 +27 +-8 +-28 +27 +-8 +-11 +31 +-5 +-22 +26 +-11 +-26 +32 +-5 +-22 +32 +-7 +-23 +28 +-10 +-23 +31 +-7 +-25 +30 +-7 +-27 +35 +-5 +-17 +46 +2 +-25 +28 +-11 +-21 +31 +-8 +-28 +36 +-5 +-14 +31 +-4 +-28 +26 +-11 +-27 +32 +-8 +-24 +27 +-11 +-29 +28 +-7 +-21 +30 +-9 +-25 +32 +-1 +-18 +30 +-7 +-24 +28 +-9 +-28 +51 +5 +-22 +28 +-9 +-29 +30 +1 +-23 +27 +-10 +-30 +31 +-9 +-26 +30 +-5 +-23 +34 +-5 +-26 +33 +2 +-25 +27 +-11 +-28 +28 +-9 +-14 +35 +-4 +-26 +28 +1 +25 +23 +20 +17 +15 +14 +11 +10 +30 +10 +12 +4 +1 +21 +4 +2 +3 +-2 +2 +8 +2 +1 +-4 +-5 +-3 +-1 +-4 +0 +-3 +8 +0 +1 +12 +0 +-2 +-3 +6 +1 +3 +-5 +3 +1 +-2 +13 +3 +-2 +2 +14 +0 +-6 +-4 +1 +-4 +-3 +-1 +-3 +2 +0 +5 +-4 +-4 +2 +-4 +3 +5 +6 +0 +-1 +-4 +-4 +-3 +0 +8 +0 +7 +-2 +-4 +-1 +-1 +-1 +0 +-3 +11 +1 +15 +3 +-1 +-1 +-4 +-5 +6 +1 +-3 +0 +0 +-3 +-2 +7 +1 +1 +-3 +-1 +1 +-6 +-2 +15 +11 +-2 +-2 +-3 +-3 +0 +-3 +2 +6 +-2 +2 +0 +-6 +-3 +-1 +-1 +15 +10 +-3 +3 +14 +10 +8 +-28 +-41 +8 +-28 +-32 +14 +-20 +-40 +16 +-17 +-36 +20 +-6 +-31 +33 +-8 +-30 +24 +-13 +-30 +26 +-8 +-20 +39 +-3 +-26 +31 +-7 +-30 +30 +-6 +-29 +26 +-10 +-25 +39 +-3 +-26 +27 +-9 +-25 +26 +-9 +-28 +28 +-9 +-19 +32 +-7 +-19 +39 +-4 +-26 +41 +-1 +-21 +28 +-8 +-29 +32 +0 +-25 +26 +-11 +-27 +26 +-10 +-19 +38 +-1 +-10 +44 +0 +-27 +33 +-4 +-26 +26 +-10 +-32 +25 +-2 +-26 +30 +-9 +-31 +32 +-8 +-22 +26 +-11 +-26 +30 +-10 +-22 +32 +-5 +-23 +31 +-1 +-10 +32 +0 +-17 +45 +0 +-26 +25 +-12 +-19 +28 +-12 +-30 +22 +-13 +-32 +33 +-6 +-29 +29 +-9 +-29 +30 +5 +-22 +28 +-3 +-25 +29 +-9 +-22 +27 +-9 +-23 +29 +-6 +-24 +31 +-5 +-26 +36 +-5 +-26 +27 +30 +25 +20 +15 +14 +11 +8 +14 +26 +9 +22 +5 +1 +14 +9 +0 +0 +4 +-3 +-4 +-1 +2 +6 +-4 +5 +6 +-2 +13 +1 +3 +-4 +-4 +-1 +-6 +2 +2 +-1 +-2 +17 +1 +3 +-1 +-2 +6 +-5 +-1 +-4 +0 +-3 +10 +9 +-2 +15 +-2 +13 +-4 +-9 +12 +-2 +-5 +3 +6 +-6 +-3 +-5 +-4 +-1 +7 +1 +-7 +-3 +1 +-3 +-4 +-2 +-1 +-2 +7 +0 +5 +-2 +1 +6 +-4 +13 +11 +7 +-3 +-7 +-1 +-4 +4 +-4 +-4 +2 +-7 +-2 +-1 +3 +-1 +5 +8 +11 +-4 +-2 +1 +15 +0 +1 +0 +2 +13 +0 +-5 +15 +-2 +-2 +3 +-8 +9 +7 +-1 +-9 +-7 +-3 +-4 +-6 +8 +-28 +-41 +17 +-22 +-44 +11 +-23 +-41 +18 +-15 +-27 +39 +-4 +-32 +26 +-12 +-22 +36 +-5 +-32 +34 +-6 +-31 +22 +-13 +-32 +40 +0 +-22 +37 +-5 +-28 +27 +-12 +-26 +22 +-14 +-30 +24 +-13 +-30 +38 +-3 +-27 +36 +-3 +-25 +30 +-8 +-26 +27 +-2 +-12 +36 +-4 +-29 +33 +-6 +-26 +31 +-7 +-24 +45 +5 +-13 +36 +-5 +-28 +26 +-12 +-18 +32 +-8 +-32 +25 +-13 +-29 +27 +-9 +-29 +43 +1 +-18 +31 +-7 +-29 +28 +-10 +-25 +27 +-1 +-27 +36 +-6 +-27 +33 +-6 +-21 +29 +-10 +-30 +32 +-6 +-24 +31 +-2 +-23 +34 +-2 +-26 +32 +-8 +-26 +26 +-10 +-24 +38 +-1 +-19 +31 +-3 +-25 +32 +-5 +-24 +29 +-8 +-31 +27 +-7 +-17 +38 +-1 +-28 +26 +-12 +-28 +29 +-4 +-27 +40 +2 +-22 +21 +23 +20 +25 +19 +24 +10 +9 +10 +7 +6 +9 +2 +4 +3 +5 +0 +2 +1 +3 +6 +3 +-1 +7 +17 +16 +4 +-2 +-3 +-1 +4 +12 +15 +6 +-7 +5 +-4 +3 +-2 +-4 +-8 +-6 +-6 +-4 +5 +3 +2 +-1 +-2 +4 +-4 +-5 +5 +2 +-7 +-4 +-4 +10 +-1 +4 +-2 +-3 +2 +0 +0 +1 +0 +1 +10 +6 +4 +-5 +-6 +-4 +1 +11 +4 +-3 +-3 +-2 +0 +14 +1 +-3 +-2 +2 +3 +3 +-2 +-4 +0 +-4 +-4 +-2 +6 +-2 +10 +0 +-3 +-6 +-4 +-1 +5 +-2 +-3 +-3 +5 +1 +-2 +5 +8 +2 +-3 +0 +8 +-3 +-4 +1 +10 +1 +-4 +-1 +-2 +0 +5 +-2 +-4 +-3 +10 +-26 +-48 +13 +-23 +-40 +14 +-21 +-39 +26 +-13 +-34 +26 +-12 +-31 +32 +-8 +-28 +27 +-11 +-28 +27 +-9 +-27 +29 +1 +-17 +38 +0 +-23 +28 +-10 +-29 +26 +-10 +-24 +42 +4 +-21 +35 +-4 +-26 +44 +0 +-26 +35 +-4 +-14 +26 +-12 +-20 +34 +-8 +-32 +23 +-13 +-21 +34 +-7 +-30 +32 +-8 +-31 +28 +-8 +-29 +30 +-8 +-30 +28 +-2 +-20 +26 +-9 +-29 +33 +-7 +-27 +29 +-6 +-23 +31 +-4 +-17 +30 +-8 +-28 +37 +-3 +-13 +42 +-1 +-26 +24 +-11 +-25 +29 +-3 +-20 +27 +-11 +-28 +34 +-5 +-29 +27 +-10 +-29 +44 +1 +-23 +30 +-10 +-25 +30 +-3 +-19 +28 +-10 +-23 +27 +-10 +-27 +46 +2 +-18 +37 +-1 +-28 +26 +-13 +-31 +31 +-8 +-30 +27 +-10 +-24 +26 +2 +-24 +36 +-3 +-19 +35 +30 +37 +27 +19 +27 +18 +5 +8 +0 +-3 +14 +13 +-1 +-3 +-3 +9 +-2 +2 +7 +4 +-3 +-3 +0 +-3 +5 +-3 +-4 +5 +2 +4 +1 +9 +3 +-4 +11 +8 +-4 +-3 +-6 +-5 +4 +8 +-3 +-4 +2 +16 +1 +-4 +-2 +-2 +-8 +-4 +4 +-4 +-2 +-1 +-1 +3 +-2 +5 +-2 +1 +-3 +4 +-1 +-2 +1 +-3 +7 +2 +6 +-3 +5 +4 +2 +12 +5 +-5 +-6 +8 +17 +-2 +-1 +-4 +2 +-5 +-7 +-6 +-3 +-4 +-2 +1 +8 +0 +-1 +5 +-5 +-1 +14 +1 +-2 +-5 +-5 +-3 +-2 +6 +-1 +5 +1 +-3 +7 +-4 +-3 +-1 +5 +6 +-2 +13 +4 +0 +6 +10 +5 +-6 +1 +9 +5 +-31 +10 +-27 +-43 +6 +-28 +-33 +33 +-8 +-35 +12 +-18 +-26 +23 +-16 +-23 +22 +-15 +-34 +34 +-6 +-27 +26 +-9 +-32 +25 +-9 +-22 +31 +-6 +-28 +26 +-3 +-23 +29 +-9 +-22 +31 +-10 +-29 +33 +-1 +-21 +32 +-8 +-29 +26 +-8 +-29 +39 +4 +-23 +30 +-3 +-29 +29 +-8 +-22 +29 +-10 +-27 +42 +1 +-8 +29 +-9 +-23 +27 +-11 +-27 +36 +-3 +-26 +27 +-11 +-24 +32 +-6 +-29 +31 +-7 +-18 +30 +-8 +-24 +30 +-9 +-26 +28 +-9 +-25 +31 +-9 +-24 +31 +-6 +-21 +29 +-5 +-14 +37 +6 +-23 +28 +-8 +-25 +29 +-9 +-31 +26 +0 +-23 +34 +-5 +-18 +32 +-6 +-28 +35 +-4 +-29 +33 +4 +-23 +27 +-9 +-31 +28 +-4 +-23 +41 +0 +-27 +28 +-7 +-30 +35 +-5 +-25 +30 +-10 +-14 +34 +-5 +9 +20 +20 +23 +21 +19 +24 +24 +12 +7 +0 +8 +3 +0 +-3 +0 +4 +6 +-1 +3 +-1 +-1 +-1 +15 +9 +2 +6 +-3 +-7 +10 +5 +-4 +3 +-4 +-4 +6 +6 +-1 +-4 +0 +-4 +-4 +-4 +-2 +-1 +0 +0 +15 +-2 +4 +8 +8 +-2 +-8 +2 +-6 +-7 +13 +-1 +-4 +-2 +-3 +-2 +9 +-3 +4 +-2 +12 +5 +7 +8 +5 +-6 +8 +0 +10 +12 +10 +-7 +-8 +-8 +-4 +-6 +-3 +-7 +-8 +-1 +-4 +11 +15 +4 +11 +11 +4 +-5 +-9 +-7 +-6 +-4 +-3 +-6 +-1 +3 +1 +3 +9 +13 +-2 +-6 +1 +-7 +-6 +-1 +-3 +1 +3 +-2 +1 +3 +3 +2 +-3 +-2 +-1 +1 +11 +2 +0 +11 +-26 +-41 +11 +-21 +-42 +12 +-17 +-39 +19 +-18 +-34 +31 +-9 +-33 +38 +-4 +-24 +30 +-4 +-26 +31 +-10 +-31 +26 +-8 +-28 +27 +-9 +-29 +24 +-9 +-25 +27 +-11 +-28 +33 +-6 +-28 +31 +-4 +-12 +32 +-5 +-28 +26 +-11 +-28 +29 +-8 +-27 +31 +0 +-22 +34 +-5 +-27 +48 +3 +-21 +27 +-11 +-22 +45 +0 +-26 +27 +-11 +-22 +45 +0 +-24 +43 +2 +-27 +27 +-11 +-28 +32 +-7 +-31 +24 +-9 +-30 +41 +-2 +-25 +28 +-11 +-22 +47 +3 +-25 +35 +-7 +-23 +26 +-10 +-32 +26 +-7 +-30 +23 +-13 +-24 +34 +-7 +-26 +31 +-1 +-20 +28 +-11 +-22 +36 +-1 +-23 +30 +-5 +-21 +32 +-7 +-22 +25 +-13 +-19 +30 +-3 +-26 +29 +-10 +-29 +29 +-6 +-29 +35 +-5 +-17 +50 +5 +-22 +23 +-13 +-28 +28 +21 +32 +34 +14 +8 +8 +9 +5 +21 +5 +9 +-1 +8 +1 +11 +-1 +3 +1 +9 +-2 +-2 +3 +-3 +-3 +-1 +12 +2 +-3 +-3 +-5 +1 +13 +6 +1 +9 +1 +7 +-4 +12 +8 +13 +-1 +8 +-2 +-2 +-7 +5 +-2 +5 +-5 +-6 +-5 +-3 +-5 +-6 +-5 +-4 +-2 +-1 +-5 +-1 +2 +3 +6 +1 +0 +-4 +-4 +9 +1 +5 +-1 +5 +-6 +-1 +-3 +9 +2 +-5 +-1 +9 +8 +17 +0 +2 +-3 +10 +11 +7 +9 +-6 +-7 +-10 +-5 +-6 +-1 +-6 +10 +0 +7 +-5 +-4 +-2 +9 +-5 +-5 +-2 +3 +-1 +1 +16 +-2 +-1 +-2 +1 +-7 +-2 +11 +7 +-3 +0 +0 +-3 +-7 +0 +0 +-2 +13 +-25 +-48 +7 +-28 +-46 +12 +-19 +-34 +32 +-10 +-34 +19 +-16 +-34 +23 +-13 +-29 +28 +-11 +-30 +38 +-4 +-26 +31 +-8 +-29 +26 +-9 +-26 +35 +-6 +-24 +30 +-9 +-25 +31 +-6 +-27 +46 +2 +-24 +42 +-1 +-27 +41 +2 +-19 +22 +-14 +-34 +35 +-4 +-28 +24 +-11 +-24 +25 +-12 +-28 +34 +-2 +-25 +29 +-4 +-21 +32 +-7 +-27 +27 +-9 +-29 +34 +-3 +-27 +30 +-7 +-22 +44 +6 +-18 +27 +-10 +-30 +47 +3 +-22 +43 +-1 +-29 +25 +-12 +-26 +28 +-7 +-31 +25 +-11 +-27 +27 +-9 +-19 +30 +-6 +-27 +28 +3 +-23 +30 +-8 +-21 +43 +-1 +-27 +26 +-6 +-26 +31 +-9 +-26 +26 +-9 +-27 +25 +-12 +-29 +30 +-4 +-27 +41 +0 +-24 +39 +0 +-12 +38 +-2 +-25 +37 +0 +-29 +25 +-11 +-31 +21 +21 +18 +19 +19 +13 +15 +8 +16 +14 +10 +5 +3 +17 +4 +2 +3 +4 +8 +10 +-1 +3 +-4 +7 +2 +8 +1 +-3 +1 +-4 +11 +15 +14 +5 +-8 +-8 +-3 +-5 +-4 +-5 +2 +5 +-2 +-3 +-3 +-4 +-6 +-3 +-1 +4 +5 +1 +16 +1 +-3 +-3 +-3 +3 +-5 +8 +3 +-5 +-4 +-2 +-2 +12 +7 +-1 +2 +5 +-1 +6 +2 +-4 +-1 +-4 +-2 +-1 +1 +-4 +3 +1 +3 +2 +7 +8 +-5 +-3 +0 +-4 +2 +-5 +-4 +-1 +-3 +-3 +-1 +6 +6 +-1 +2 +8 +16 +5 +-6 +5 +-3 +-4 +-6 +-4 +3 +3 +9 +-1 +-4 +-2 +-3 +9 +-1 +-4 +11 +1 +3 +-4 +-6 +-2 +0 +-4 +13 +-23 +-46 +21 +-18 +-42 +17 +-19 +-41 +21 +-17 +-37 +35 +-6 +-32 +21 +-16 +-30 +20 +-14 +-28 +24 +-13 +-27 +29 +-5 +-26 +38 +-3 +-8 +32 +-8 +-26 +32 +-8 +-26 +26 +-10 +-22 +32 +-8 +-27 +37 +-4 +-27 +30 +-8 +-28 +32 +-7 +-26 +28 +-10 +-23 +38 +4 +-23 +30 +-8 +-30 +36 +-4 +-27 +27 +-4 +-25 +38 +-3 +-27 +32 +-7 +-28 +33 +-6 +-27 +29 +-8 +-27 +38 +-2 +-22 +33 +-6 +-19 +43 +0 +-25 +25 +-12 +-31 +30 +-6 +-29 +40 +-3 +-24 +35 +-3 +-28 +28 +-2 +-19 +25 +-11 +-28 +35 +0 +-25 +28 +-9 +-30 +27 +-11 +-29 +33 +-6 +-27 +28 +-10 +-14 +35 +-3 +-15 +30 +-9 +-27 +25 +-9 +-29 +27 +-7 +-25 +34 +-2 +-25 +37 +-3 +-26 +33 +-5 +-25 +35 +-6 +-18 +28 +22 +21 +31 +17 +16 +14 +14 +6 +7 +12 +4 +14 +4 +14 +2 +0 +4 +-1 +8 +-2 +7 +7 +-1 +3 +-2 +-2 +-2 +-3 +1 +4 +2 +4 +2 +8 +-2 +9 +6 +19 +1 +-6 +-7 +2 +-2 +-5 +-1 +-4 +0 +-2 +-2 +15 +2 +-2 +-4 +6 +0 +-2 +0 +6 +-1 +6 +-2 +-2 +-3 +-1 +1 +-1 +-3 +0 +8 +12 +2 +-4 +-2 +-6 +-3 +3 +-2 +2 +0 +14 +2 +-4 +2 +13 +-1 +-6 +-5 +-6 +1 +-4 +2 +3 +2 +-6 +1 +15 +7 +-4 +1 +-2 +-5 +-1 +-4 +6 +-3 +-4 +-4 +-4 +-2 +-1 +1 +3 +14 +2 +-2 +-3 +-3 +3 +3 +-3 +-2 +0 +16 +0 +-4 +1 +9 +12 +-25 +-49 +6 +-29 +-45 +20 +-15 +-37 +26 +-12 +-35 +22 +-13 +-32 +29 +-8 +-27 +32 +-5 +-27 +33 +-7 +-23 +25 +-12 +-32 +27 +-9 +-16 +29 +-9 +-30 +29 +-8 +-27 +30 +-7 +-28 +29 +-1 +-25 +34 +-2 +-20 +40 +-3 +-27 +27 +-7 +-30 +38 +-4 +-18 +32 +-7 +-25 +30 +-9 +-29 +47 +3 +-24 +29 +-9 +-23 +29 +-9 +-31 +32 +-7 +-26 +29 +-9 +-28 +29 +-7 +-23 +30 +-5 +-28 +29 +-9 +-27 +31 +-1 +-21 +30 +-4 +-26 +48 +4 +-16 +28 +-11 +-26 +27 +-8 +-29 +31 +-8 +-23 +45 +1 +-23 +29 +-5 +-27 +25 +-2 +-13 +35 +-7 +-22 +27 +-2 +-27 +29 +-9 +-31 +32 +-7 +-22 +38 +3 +-25 +24 +-11 +-25 +32 +-8 +-23 +29 +-8 +-29 +27 +-10 +-15 +32 +-7 +-13 +29 +-10 +-21 +19 +33 +27 +22 +29 +13 +9 +12 +15 +2 +7 +2 +6 +5 +3 +1 +3 +2 +3 +14 +6 +1 +2 +0 +2 +7 +16 +12 +0 +2 +-5 +-3 +-1 +-3 +1 +4 +-2 +1 +3 +-6 +-1 +-5 +5 +1 +-1 +1 +1 +1 +10 +-3 +-4 +-1 +-8 +0 +-1 +-5 +2 +1 +-3 +0 +1 +0 +1 +4 +9 +-2 +1 +-2 +10 +2 +-4 +-2 +-4 +-4 +6 +14 +1 +-1 +1 +4 +0 +-5 +-4 +-2 +3 +-1 +-3 +2 +-4 +10 +-3 +-3 +5 +-1 +-3 +-1 +0 +0 +-3 +-2 +6 +-3 +4 +4 +-1 +4 +5 +4 +-4 +-3 +0 +0 +5 +-3 +-4 +-3 +-2 +7 +9 +9 +-4 +8 +18 +2 +7 +1 +11 +-4 +4 +-31 +-49 +7 +-29 +-45 +7 +-25 +-42 +19 +-17 +-26 +24 +-11 +-27 +25 +-6 +-28 +26 +-10 +-18 +34 +-6 +-28 +36 +-3 +-19 +26 +-10 +-23 +29 +-9 +-26 +35 +-7 +-26 +28 +-9 +-30 +30 +-3 +-18 +30 +-8 +-22 +28 +-11 +-26 +26 +-2 +-23 +28 +-7 +-28 +34 +-3 +-28 +41 +1 +-26 +30 +-7 +-29 +32 +-4 +-24 +30 +-5 +-20 +29 +-8 +-24 +35 +-5 +-29 +29 +-6 +-15 +29 +0 +-24 +38 +-4 +-22 +25 +-12 +-32 +43 +3 +-25 +28 +-7 +-19 +32 +-8 +-22 +38 +-3 +-28 +30 +-6 +-27 +25 +-1 +-27 +31 +-9 +-26 +30 +-4 +-14 +29 +-8 +-29 +40 +-1 +-25 +38 +-4 +-18 +39 +-2 +-30 +22 +-13 +-31 +41 +2 +-27 +25 +-12 +-27 +42 +3 +-24 +24 +-9 +-22 +24 +-13 +-29 +25 +-8 +-19 +32 +34 +19 +16 +24 +16 +11 +8 +16 +6 +4 +5 +4 +5 +7 +7 +2 +1 +3 +5 +5 +7 +3 +-1 +10 +7 +-3 +-4 +-1 +-2 +-4 +-3 +5 +3 +8 +2 +-3 +-2 +1 +-3 +4 +-3 +-3 +-2 +-1 +2 +3 +4 +3 +8 +11 +-2 +0 +-4 +11 +7 +11 +1 +-5 +-2 +-3 +5 +-5 +-1 +-6 +-4 +0 +6 +-3 +-4 +0 +3 +-3 +2 +-1 +-2 +1 +1 +-4 +1 +2 +0 +3 +8 +-1 +-2 +-4 +14 +-1 +3 +3 +-2 +7 +8 +-2 +-6 +-5 +3 +-2 +-5 +7 +16 +7 +5 +-5 +-5 +-1 +-2 +-6 +10 +8 +1 +11 +1 +-5 +-5 +-6 +3 +-7 +-5 +-4 +3 +-6 +-5 +3 +0 +2 +-2 +24 +-16 +-45 +7 +-29 +-44 +11 +-22 +-36 +15 +-19 +-18 +25 +-14 +-35 +22 +-14 +-27 +47 +3 +-27 +38 +-4 +-30 +30 +-7 +-30 +36 +-6 +-25 +23 +-13 +-32 +46 +1 +-27 +24 +-12 +-25 +26 +-4 +-20 +29 +-3 +-14 +35 +-7 +-22 +27 +-9 +-30 +26 +-7 +-29 +36 +-3 +-26 +32 +-9 +-30 +25 +-11 +-30 +29 +-8 +-23 +31 +-5 +-25 +42 +-1 +-21 +32 +-8 +-28 +33 +-8 +-29 +28 +-9 +-29 +34 +0 +-25 +42 +0 +-17 +35 +-5 +-29 +26 +-11 +-18 +36 +2 +-22 +24 +-11 +-31 +27 +-10 +-28 +30 +-8 +-28 +30 +-9 +-28 +34 +4 +-14 +38 +-4 +-25 +26 +-7 +-23 +29 +-10 +-29 +28 +-5 +-26 +29 +-7 +-14 +36 +-5 +-19 +33 +-8 +-25 +45 +2 +-26 +29 +-10 +-27 +25 +-6 +-21 +34 +-6 +-26 +22 +25 +33 +21 +18 +13 +26 +11 +20 +23 +15 +0 +-3 +7 +1 +-4 +-1 +1 +10 +18 +0 +4 +-5 +11 +15 +-2 +0 +-8 +-7 +-5 +-2 +-6 +5 +-1 +6 +-2 +-6 +-3 +10 +-1 +-2 +-2 +-2 +10 +-2 +0 +0 +-1 +6 +-1 +-3 +-3 +-3 +2 +-2 +0 +9 +1 +-1 +10 +1 +-3 +-2 +-5 +-4 +-1 +-3 +5 +1 +5 +-1 +1 +-1 +-1 +13 +22 +1 +-4 +-9 +-3 +-4 +1 +-1 +3 +0 +2 +4 +16 +9 +0 +-1 +-5 +-4 +-3 +-3 +3 +5 +-1 +-2 +1 +4 +-3 +5 +-1 +-5 +1 +2 +0 +2 +2 +-4 +-1 +-3 +11 +14 +2 +-5 +-5 +-4 +-3 +-4 +2 +2 +11 +10 +0 +-8 +-5 +7 +-29 +-48 +18 +-20 +-29 +14 +-22 +-41 +14 +-18 +-37 +28 +-11 +-31 +31 +-9 +-23 +26 +-12 +-31 +37 +-5 +-29 +29 +-10 +-29 +38 +1 +-13 +27 +-7 +-30 +25 +-12 +-30 +30 +-7 +-28 +42 +1 +-24 +33 +-6 +-30 +47 +2 +-21 +42 +-1 +-13 +27 +-13 +-31 +23 +-12 +-33 +37 +-3 +-16 +42 +0 +-29 +23 +-11 +-32 +30 +-7 +-30 +25 +-9 +-26 +33 +-2 +-27 +38 +-4 +-27 +30 +-7 +-30 +28 +-10 +-27 +29 +-9 +-28 +39 +-1 +-18 +31 +-6 +-29 +28 +-2 +-21 +35 +-5 +-26 +26 +-7 +-28 +26 +-3 +-18 +32 +-6 +-18 +28 +-5 +-16 +30 +-10 +-27 +29 +-1 +-27 +33 +-7 +-29 +28 +-9 +-21 +32 +-8 +-28 +30 +-7 +-26 +46 +2 +-23 +34 +-6 +-21 +39 +0 +-27 +27 +-9 +-29 +30 +-10 +-29 +22 +40 +32 +17 +11 +8 +20 +10 +7 +7 +5 +5 +13 +11 +2 +2 +5 +1 +-1 +0 +15 +8 +14 +5 +-4 +-2 +-4 +-1 +2 +-3 +-3 +6 +10 +-2 +-4 +-1 +-2 +4 +-1 +0 +9 +-2 +-1 +1 +5 +-1 +-2 +2 +0 +-6 +-6 +-1 +5 +17 +2 +-2 +5 +5 +-1 +-2 +-3 +-4 +-3 +-1 +0 +-1 +8 +15 +8 +-5 +2 +-5 +-3 +-4 +9 +11 +0 +-4 +-4 +-6 +1 +1 +-5 +-3 +4 +16 +0 +0 +3 +-6 +-1 +9 +-4 +-5 +-4 +-4 +-1 +3 +9 +-2 +1 +-4 +-2 +16 +0 +-2 +-1 +-6 +-5 +-3 +-2 +2 +4 +5 +19 +1 +-3 +2 +-2 +-2 +-5 +9 +2 +4 +-4 +13 +0 +-4 +12 +-25 +-48 +5 +-28 +-46 +11 +-23 +-40 +23 +-13 +-33 +25 +-13 +-26 +33 +-6 +-30 +23 +-13 +-31 +29 +-8 +-29 +28 +-9 +-29 +31 +-6 +-20 +39 +-2 +-17 +28 +-8 +-14 +33 +-6 +-30 +33 +-7 +-29 +32 +-7 +-24 +28 +-8 +-25 +27 +-9 +-29 +34 +-4 +-27 +30 +-7 +-28 +47 +3 +-24 +28 +-9 +-31 +28 +-10 +-25 +32 +-6 +-22 +30 +-9 +-28 +28 +-9 +-28 +37 +-2 +-19 +32 +3 +-23 +31 +-7 +-23 +30 +-2 +-26 +28 +-9 +-22 +30 +-4 +-28 +32 +-5 +-26 +40 +-1 +-25 +29 +-2 +-24 +29 +-7 +-26 +41 +-3 +-22 +33 +-7 +-21 +31 +-9 +-20 +27 +-9 +-30 +28 +-8 +-18 +30 +-1 +-26 +28 +-7 +-26 +32 +-7 +-28 +34 +-6 +-23 +37 +-2 +-8 +34 +-7 +-15 +37 +-4 +-30 +32 +-9 +-25 +20 +17 +17 +31 +18 +11 +11 +9 +6 +11 +7 +7 +4 +7 +3 +10 +8 +3 +5 +11 +8 +-1 +5 +2 +-7 +-1 +-4 +4 +13 +0 +9 +15 +15 +-4 +-4 +-7 +-6 +-5 +-5 +7 +-4 +2 +1 +-1 +14 +1 +-4 +11 +-5 +-3 +-4 +-6 +-5 +2 +11 +9 +-2 +-5 +-1 +-4 +4 +-4 +0 +11 +9 +0 +-4 +3 +9 +5 +-1 +-6 +4 +-3 +-7 +-4 +0 +-7 +10 +2 +-4 +-4 +-1 +15 +-1 +-4 +5 +1 +0 +3 +-4 +-6 +-7 +0 +3 +-2 +6 +11 +0 +-5 +-2 +1 +-3 +7 +-4 +-2 +-1 +0 +-3 +-1 +11 +-1 +-3 +4 +-1 +-1 +-1 +1 +0 +4 +-3 +4 +-5 +-5 +-3 +1 +-5 +-3 +11 +-25 +-36 +19 +-18 +-37 +15 +-17 +-38 +29 +-9 +-30 +37 +-5 +-33 +23 +-15 +-32 +28 +-11 +-33 +25 +-13 +-29 +29 +-10 +-21 +27 +-11 +-28 +35 +-5 +-29 +30 +-8 +-27 +32 +-1 +-19 +29 +-1 +-12 +29 +-10 +-30 +31 +-6 +-14 +30 +-9 +-30 +36 +-6 +-25 +29 +-8 +-29 +28 +-10 +-25 +38 +-1 +-25 +35 +-1 +-24 +34 +-6 +-29 +30 +-4 +-23 +25 +-11 +-28 +35 +0 +-16 +46 +2 +-23 +29 +-11 +-32 +24 +-9 +-28 +45 +2 +-24 +28 +-8 +-26 +29 +-10 +-21 +24 +-11 +-27 +31 +-4 +-24 +27 +-8 +-17 +30 +-4 +-12 +30 +-9 +-30 +29 +-7 +-28 +30 +-8 +-15 +43 +-1 +-26 +33 +-6 +-30 +37 +-5 +-19 +34 +-6 +-28 +25 +-13 +-29 +29 +-9 +-27 +32 +-8 +-27 +44 +4 +-21 +29 +-10 +-29 +19 +19 +25 +35 +25 +15 +16 +13 +7 +10 +5 +3 +2 +2 +5 +4 +-2 +-2 +5 +4 +5 +1 +-1 +1 +10 +2 +-3 +-1 +-1 +1 +1 +5 +2 +1 +1 +-1 +-2 +9 +-2 +2 +-1 +1 +3 +6 +4 +1 +20 +1 +-6 +1 +-5 +-4 +4 +5 +-1 +2 +0 +-3 +-3 +8 +8 +10 +-3 +-6 +-1 +1 +-4 +-2 +-2 +-5 +2 +-2 +0 +-2 +-2 +9 +-3 +1 +-2 +1 +-2 +-2 +-1 +-1 +13 +11 +1 +4 +-4 +5 +0 +-5 +-6 +1 +-1 +-3 +12 +2 +-3 +1 +-4 +-1 +-2 +-4 +3 +13 +1 +0 +-2 +4 +6 +-4 +-4 +1 +0 +-4 +1 +2 +-4 +-3 +2 +-2 +15 +1 +0 +-2 +0 +19 +-21 +14 +-23 +-40 +22 +-13 +-32 +23 +-17 +-40 +16 +-20 +-32 +27 +-10 +-34 +18 +-17 +-28 +25 +-9 +-18 +24 +-13 +-29 +25 +-7 +-29 +31 +-8 +-27 +25 +-11 +-25 +36 +1 +-24 +42 +0 +-26 +26 +-10 +-28 +32 +-8 +-29 +43 +8 +-22 +30 +-10 +-23 +26 +-2 +-21 +43 +-1 +-28 +29 +-9 +-33 +30 +-3 +-22 +25 +-9 +-25 +31 +-9 +-30 +28 +-9 +-29 +29 +-8 +-13 +35 +-5 +-26 +46 +5 +-24 +24 +-11 +-16 +30 +-8 +-27 +41 +1 +-27 +28 +-6 +-28 +25 +-11 +-30 +31 +-8 +-29 +47 +3 +-25 +29 +-10 +-30 +29 +-8 +-30 +29 +-9 +-19 +33 +-6 +-15 +33 +-7 +-24 +28 +-10 +-23 +29 +-10 +-27 +28 +-6 +-27 +31 +-5 +-26 +46 +3 +-24 +38 +-5 +-27 +29 +-9 +-29 +41 +-2 +-25 +30 +1 +13 +21 +18 +22 +28 +14 +16 +6 +9 +9 +8 +13 +3 +0 +0 +10 +-1 +9 +3 +4 +-3 +1 +-2 +-3 +11 +10 +-1 +0 +3 +11 +-4 +-3 +6 +-2 +4 +-5 +-5 +-2 +-5 +1 +-2 +-2 +-1 +0 +-4 +-1 +-2 +0 +5 +7 +0 +5 +-3 +1 +-3 +1 +-1 +2 +-2 +-3 +11 +21 +1 +12 +7 +-6 +-4 +-2 +-6 +-5 +-3 +2 +-6 +-5 +-4 +-3 +1 +6 +2 +14 +11 +11 +7 +-1 +-8 +-2 +-1 +-4 +3 +-2 +-3 +-5 +1 +-3 +0 +-1 +5 +-3 +0 +-2 +0 +3 +-2 +-2 +-2 +2 +5 +1 +-2 +1 +3 +8 +-2 +12 +2 +-2 +4 +-3 +-6 +2 +8 +10 +-4 +-1 +0 +-5 +-3 +0 +13 +-23 +-48 +6 +-18 +-41 +17 +-19 +-37 +18 +-18 +-32 +37 +-5 +-31 +24 +-13 +-32 +24 +-13 +-32 +32 +-9 +-15 +33 +0 +-26 +28 +-10 +-29 +24 +-12 +-29 +32 +-6 +-27 +38 +-1 +-25 +32 +-8 +-26 +31 +-5 +-23 +30 +-8 +-27 +32 +-6 +-13 +33 +-7 +-26 +26 +-9 +-28 +29 +-3 +-24 +35 +-3 +-27 +31 +-3 +-25 +30 +-5 +-17 +40 +-2 +-23 +31 +-6 +-23 +26 +-10 +-23 +25 +-9 +-25 +40 +-3 +-27 +41 +-1 +-29 +33 +-7 +-27 +27 +-10 +-21 +39 +-3 +-22 +26 +-7 +-30 +25 +-10 +-19 +37 +-4 +-26 +34 +-3 +-23 +43 +9 +-23 +32 +-7 +-17 +28 +-6 +-23 +31 +-10 +-28 +23 +-13 +-30 +26 +-10 +-30 +26 +-10 +-28 +36 +-3 +-27 +26 +-10 +-25 +32 +-7 +-8 +32 +-6 +-28 +31 +-9 +-11 +24 +31 +28 +17 +23 +14 +23 +17 +10 +13 +4 +17 +7 +-1 +2 +4 +-3 +6 +-1 +5 +4 +-3 +-2 +3 +-4 +-2 +4 +5 +8 +-1 +-3 +0 +13 +0 +0 +6 +9 +-4 +-4 +5 +-5 +-3 +-1 +-2 +1 +6 +-1 +-1 +-5 +-3 +-5 +-5 +-4 +-1 +3 +10 +3 +2 +5 +-4 +3 +2 +1 +-1 +11 +13 +7 +-5 +-8 +-1 +-3 +-6 +-4 +0 +7 +-4 +0 +0 +-4 +15 +3 +0 +5 +17 +-1 +2 +-3 +-6 +-4 +-5 +-6 +-5 +-5 +0 +2 +-1 +-1 +-2 +0 +6 +-1 +13 +0 +12 +4 +10 +0 +-1 +-1 +-5 +-3 +0 +-5 +-7 +-1 +1 +1 +-3 +0 +1 +0 +1 +-2 +1 +-1 +-1 +1 +-4 +11 +-20 +-45 +18 +-20 +-43 +12 +-20 +-41 +17 +-14 +-33 +22 +-12 +-32 +31 +-9 +-27 +37 +-2 +-19 +26 +-13 +-32 +29 +-9 +-27 +26 +-8 +-25 +29 +-6 +-25 +26 +-9 +-17 +33 +-6 +-17 +28 +-8 +-18 +35 +3 +-15 +43 +-1 +-27 +25 +-12 +-28 +28 +-11 +-30 +32 +-5 +-29 +32 +-7 +-28 +46 +2 +-26 +37 +-4 +-29 +25 +-11 +-26 +37 +-5 +-28 +27 +1 +-25 +29 +-8 +-28 +35 +-4 +-26 +28 +-1 +-25 +28 +-6 +-25 +45 +1 +-25 +32 +-8 +-27 +34 +-6 +-28 +26 +-11 +-31 +26 +-7 +-18 +32 +0 +-18 +27 +-11 +-27 +38 +-3 +-28 +26 +-12 +-23 +28 +-2 +-26 +31 +-7 +-27 +42 +3 +-24 +29 +-4 +-24 +28 +-10 +-29 +31 +-4 +-26 +26 +-5 +-27 +40 +-3 +-17 +35 +-4 +-17 +30 +-7 +-22 +16 +20 +23 +16 +24 +13 +17 +8 +9 +25 +8 +4 +6 +6 +6 +1 +0 +-4 +11 +4 +-1 +0 +-2 +-1 +0 +8 +5 +6 +9 +-2 +15 +5 +-4 +1 +3 +-1 +-2 +13 +-2 +-3 +-6 +1 +13 +1 +11 +9 +5 +-4 +-8 +-6 +0 +-6 +5 +-4 +-7 +-5 +0 +-3 +2 +4 +-4 +-4 +-3 +-2 +1 +4 +0 +1 +0 +0 +-1 +-2 +-5 +8 +0 +3 +4 +15 +-2 +-3 +-4 +-4 +-4 +0 +-2 +1 +4 +0 +7 +-1 +5 +3 +-3 +-2 +2 +5 +0 +-2 +-5 +-3 +-3 +-2 +1 +-1 +2 +7 +-5 +12 +19 +1 +0 +-7 +-4 +2 +0 +2 +12 +-2 +-4 +6 +-1 +5 +0 +-5 +-6 +-5 +12 +7 +-29 +14 +-25 +-46 +6 +-22 +-41 +13 +-16 +-37 +33 +-7 +-33 +36 +-6 +-26 +33 +-8 +-33 +26 +-12 +-29 +24 +-13 +-26 +46 +1 +-27 +37 +-4 +-30 +32 +-6 +-21 +22 +-12 +-27 +27 +-9 +-16 +30 +-10 +-32 +27 +-11 +-30 +34 +-6 +-26 +27 +-9 +-24 +32 +-6 +-24 +30 +-8 +-28 +38 +-2 +-27 +31 +-7 +-28 +37 +-3 +-28 +27 +-10 +-26 +30 +-7 +-28 +29 +-6 +-25 +28 +-6 +-27 +33 +-5 +-27 +32 +-6 +-15 +35 +-6 +-27 +30 +5 +-23 +39 +-3 +-19 +27 +-9 +-26 +30 +-9 +-28 +27 +-9 +-26 +32 +-7 +-27 +29 +-7 +-27 +34 +-6 +-12 +40 +-1 +-22 +32 +-7 +-28 +28 +-9 +-24 +28 +-9 +-23 +31 +-5 +-10 +33 +-7 +-27 +33 +1 +-20 +31 +-8 +-29 +32 +-7 +-25 +29 +-5 +-27 +30 +-8 +16 +40 +23 +15 +13 +24 +18 +6 +13 +14 +5 +15 +22 +6 +7 +-4 +-3 +1 +-1 +-2 +2 +4 +7 +-5 +-3 +-1 +0 +-1 +8 +1 +-5 +-2 +11 +15 +1 +5 +-5 +-2 +3 +-3 +-6 +0 +-6 +13 +4 +3 +-2 +-2 +-4 +7 +-1 +6 +-4 +-2 +-7 +-2 +3 +-3 +-4 +17 +1 +-5 +11 +1 +2 +-1 +4 +-4 +-3 +8 +12 +1 +1 +-1 +-5 +5 +-2 +-4 +-3 +0 +-4 +-1 +6 +-2 +-1 +-5 +-4 +-2 +5 +10 +11 +10 +-6 +-5 +8 +-2 +-6 +-6 +3 +-4 +2 +-2 +-1 +6 +6 +-3 +-6 +7 +6 +0 +3 +0 +4 +0 +-7 +1 +-6 +1 +2 +-5 +-2 +8 +5 +15 +13 +0 +-4 +-5 +8 +-28 +-50 +8 +-23 +-41 +14 +-22 +-42 +19 +-4 +-30 +20 +-8 +-22 +29 +-9 +-31 +31 +-7 +-32 +25 +-12 +-32 +25 +-9 +-29 +34 +-5 +-14 +29 +-7 +-27 +49 +3 +-24 +41 +-2 +-26 +33 +-8 +-29 +25 +-3 +-29 +23 +-12 +-31 +29 +-7 +-29 +45 +0 +-26 +30 +-9 +-29 +34 +-2 +-22 +26 +-12 +-26 +29 +-9 +-20 +30 +-7 +-26 +28 +-10 +-23 +42 +-1 +-26 +34 +-6 +-11 +28 +-10 +-26 +30 +-10 +-29 +44 +1 +-23 +45 +0 +-27 +40 +-2 +-30 +25 +-5 +-29 +21 +-15 +-31 +25 +-7 +-21 +33 +-5 +-27 +42 +1 +-19 +29 +-6 +-30 +37 +-6 +-29 +23 +-13 +-29 +32 +-7 +-21 +28 +-9 +-26 +27 +-2 +-12 +44 +0 +-25 +32 +-6 +-12 +30 +-7 +-30 +37 +-3 +-26 +25 +-10 +-29 +26 +-9 +-30 +20 +25 +20 +18 +15 +18 +26 +20 +7 +13 +9 +0 +3 +7 +10 +2 +16 +5 +-1 +-2 +14 +3 +6 +-3 +2 +-4 +-5 +-1 +0 +-4 +0 +-3 +3 +14 +7 +-3 +12 +4 +-7 +-1 +-5 +5 +1 +12 +1 +-5 +-6 +3 +-2 +0 +6 +1 +-1 +-3 +-3 +13 +0 +-5 +2 +-3 +-5 +-3 +0 +-5 +-2 +15 +3 +-3 +-5 +-2 +4 +0 +10 +-2 +-4 +12 +12 +1 +0 +-3 +-4 +1 +-4 +-3 +11 +1 +6 +-1 +-3 +-1 +-3 +16 +-1 +-4 +-1 +1 +1 +3 +0 +-2 +-6 +-1 +1 +-1 +-3 +4 +-3 +-3 +-4 +4 +-2 +1 +2 +-3 +-1 +-2 +-1 +4 +0 +0 +20 +3 +5 +-4 +11 +0 +-3 +-4 +10 +-23 +-41 +15 +-24 +-45 +11 +-23 +-42 +23 +-16 +-31 +26 +-10 +-32 +22 +-15 +-25 +23 +-12 +-28 +40 +-2 +-20 +26 +-5 +-23 +25 +-13 +-28 +25 +-11 +-18 +48 +3 +-23 +27 +-11 +-29 +27 +-9 +-29 +26 +-9 +-29 +44 +2 +-16 +27 +-8 +-30 +29 +-8 +-28 +31 +-8 +-27 +34 +-7 +-23 +28 +-8 +-28 +33 +-5 +-18 +32 +-7 +-27 +30 +2 +-25 +40 +-2 +-27 +28 +-10 +-29 +27 +-9 +-28 +30 +-6 +-26 +32 +1 +-12 +30 +-10 +-27 +36 +-4 +-23 +33 +-7 +-24 +29 +-9 +-29 +36 +-4 +-13 +33 +-5 +-26 +41 +0 +-25 +27 +-11 +-30 +29 +-4 +-26 +28 +-6 +-16 +35 +-6 +-29 +33 +-6 +-19 +40 +-3 +-26 +33 +-6 +-28 +32 +-5 +-29 +30 +-9 +-27 +34 +-7 +-27 +30 +-9 +-22 +32 +-9 +-26 +29 +25 +30 +18 +14 +13 +14 +17 +11 +5 +5 +6 +4 +4 +7 +4 +3 +4 +4 +9 +0 +1 +0 +4 +11 +14 +0 +0 +4 +4 +-4 +-4 +10 +11 +1 +7 +-3 +7 +-4 +14 +-2 +1 +-1 +1 +-6 +-4 +0 +-3 +-5 +0 +7 +-5 +-7 +7 +2 +-3 +10 +0 +11 +-1 +-3 +-4 +0 +0 +5 +6 +-6 +-2 +-7 +-3 +-4 +-3 +-4 +9 +11 +-3 +-5 +-4 +-4 +-4 +-2 +1 +0 +-2 +-1 +16 +0 +-2 +4 +14 +5 +-5 +-2 +1 +-4 +-3 +-2 +-2 +-4 +6 +-1 +2 +2 +-2 +-4 +-2 +5 +-1 +12 +1 +-3 +2 +0 +-1 +0 +11 +-3 +-3 +-5 +0 +3 +4 +-5 +4 +-2 +9 +0 +12 +25 +-16 +-37 +6 +-29 +-43 +11 +-24 +-43 +18 +-17 +-37 +35 +-2 +-31 +23 +-12 +-30 +21 +-15 +-29 +29 +-10 +-22 +29 +-9 +-15 +40 +-3 +-27 +32 +-4 +-29 +26 +-10 +-30 +23 +-12 +-24 +37 +-5 +-15 +32 +-8 +-28 +30 +-2 +-26 +32 +-6 +-27 +45 +0 +-15 +33 +1 +-26 +39 +-4 +-29 +32 +-7 +-26 +34 +-7 +-23 +24 +-12 +-31 +30 +-7 +-24 +39 +-3 +-16 +30 +-10 +-23 +26 +-10 +-30 +27 +-10 +-24 +38 +-3 +-28 +41 +-2 +-14 +26 +-11 +-29 +30 +-9 +-22 +30 +-8 +-27 +26 +-1 +-24 +30 +-2 +-19 +35 +-7 +-27 +40 +-2 +-29 +26 +-11 +-30 +25 +-11 +-30 +41 +-2 +-27 +26 +-9 +-25 +35 +-6 +-27 +34 +3 +-11 +29 +-7 +-26 +27 +-1 +-15 +32 +-8 +-28 +26 +-4 +-19 +30 +-8 +-21 +19 +19 +26 +19 +17 +12 +10 +18 +18 +26 +8 +13 +9 +-1 +3 +-2 +-2 +-1 +19 +2 +1 +9 +-1 +7 +-1 +-2 +-7 +0 +3 +-3 +-5 +2 +1 +-2 +2 +-1 +-4 +10 +-3 +-3 +-2 +-2 +-5 +6 +15 +7 +-3 +1 +13 +3 +2 +3 +-3 +9 +9 +-4 +2 +-1 +-5 +1 +12 +-2 +-5 +1 +-7 +-2 +-1 +-5 +-3 +2 +-7 +-1 +1 +-4 +-2 +-3 +1 +15 +3 +1 +-5 +-1 +-5 +-2 +0 +2 +-3 +5 +9 +2 +-3 +-4 +-3 +-1 +-4 +-1 +5 +17 +1 +-3 +5 +15 +2 +-1 +4 +-3 +-1 +-3 +-6 +14 +4 +14 +-1 +-6 +2 +-5 +1 +-2 +-7 +-1 +-1 +1 +-5 +-2 +-5 +-2 +-2 +10 +-24 +20 +-19 +-44 +9 +-25 +-40 +23 +-16 +-32 +24 +-14 +-36 +24 +-13 +-33 +26 +-5 +-22 +33 +-5 +-25 +23 +-11 +-32 +26 +-7 +-19 +38 +-3 +-24 +27 +-10 +-31 +34 +-2 +-25 +27 +-10 +-24 +25 +-10 +-28 +31 +-2 +-20 +34 +-5 +-28 +43 +1 +-26 +25 +-11 +-17 +39 +-4 +-20 +25 +-10 +-29 +27 +-10 +-16 +41 +-1 +-28 +43 +-1 +-27 +24 +-4 +-13 +27 +-12 +-27 +24 +-10 +-23 +26 +-10 +-30 +32 +-7 +-24 +32 +-4 +-27 +44 +1 +-19 +33 +-8 +-28 +35 +-2 +-28 +29 +-10 +-17 +30 +-8 +-28 +35 +-6 +-29 +27 +-7 +-30 +27 +-11 +-27 +29 +-9 +-28 +32 +-5 +-26 +26 +-5 +-12 +42 +5 +-15 +31 +-7 +-31 +29 +-7 +-29 +37 +-3 +-14 +31 +-9 +-26 +29 +-8 +-10 +30 +-9 +-30 +29 +1 +15 +30 +17 +22 +13 +13 +6 +19 +14 +13 +11 +10 +4 +1 +14 +3 +-2 +6 +12 +6 +-1 +-4 +-2 +-3 +-4 +-2 +0 +-3 +5 +18 +4 +0 +6 +5 +5 +-5 +1 +-6 +-5 +1 +-2 +5 +9 +13 +6 +-3 +2 +9 +-3 +-7 +-6 +7 +-2 +-6 +-5 +-5 +-3 +-4 +4 +-3 +-2 +5 +1 +18 +-1 +-1 +-8 +-5 +-5 +8 +1 +-1 +10 +1 +-1 +-3 +13 +5 +-6 +-5 +-7 +0 +-4 +6 +4 +13 +2 +-6 +-4 +-1 +-5 +4 +-4 +10 +-2 +-4 +0 +-3 +-5 +2 +-3 +3 +-3 +2 +-2 +0 +-4 +-2 +-3 +0 +0 +1 +-2 +6 +-2 +-1 +0 +-2 +13 +5 +-2 +1 +1 +5 +-1 +6 +12 +5 +-30 +12 +-24 +-47 +18 +-18 +-36 +16 +-20 +-26 +28 +-12 +-34 +24 +-11 +-25 +26 +-12 +-34 +27 +-12 +-32 +33 +-6 +-25 +30 +-9 +-28 +29 +-9 +-26 +32 +-7 +-29 +27 +-9 +-29 +35 +-5 +-27 +29 +-8 +-25 +36 +-4 +-25 +31 +-8 +-27 +42 +4 +-21 +32 +-3 +-23 +28 +-9 +-28 +28 +-9 +-27 +46 +5 +-24 +29 +-1 +-23 +30 +-1 +-27 +36 +3 +-26 +27 +-11 +-22 +40 +-2 +-30 +25 +-13 +-27 +47 +2 +-23 +24 +-14 +-31 +40 +-3 +-28 +24 +-11 +-30 +35 +-5 +-29 +31 +-7 +-28 +28 +-8 +-21 +36 +-5 +-27 +28 +-7 +-29 +32 +-6 +-26 +34 +-6 +-26 +30 +-7 +-19 +39 +-2 +-26 +27 +-10 +-29 +28 +-1 +-21 +25 +-8 +-26 +33 +-6 +-14 +37 +-5 +-26 +24 +-10 +-25 +36 +0 +-24 +28 +-9 +17 +41 +27 +15 +12 +11 +10 +7 +7 +7 +7 +5 +13 +6 +14 +6 +14 +2 +-2 +-2 +3 +-1 +7 +-3 +-3 +-3 +-3 +14 +13 +17 +5 +1 +-6 +-7 +-6 +-2 +-3 +1 +1 +1 +12 +2 +-6 +1 +15 +1 +2 +-8 +0 +5 +10 +10 +-5 +3 +-6 +-8 +-4 +-3 +-3 +-8 +-5 +12 +3 +-5 +-5 +-5 +6 +0 +1 +5 +-5 +5 +14 +4 +0 +5 +-3 +-1 +-5 +-4 +5 +-3 +-2 +-4 +7 +2 +-4 +-1 +6 +-2 +-5 +-3 +-4 +-2 +-1 +7 +-2 +15 +13 +2 +-1 +-3 +-4 +-3 +-5 +5 +-3 +-2 +1 +-4 +-4 +2 +5 +9 +-3 +4 +-4 +3 +-4 +4 +6 +7 +1 +-4 +-2 +1 +1 +0 +9 +-27 +-48 +8 +-26 +-44 +15 +-10 +-33 +23 +-13 +-31 +22 +-15 +-29 +29 +-10 +-19 +41 +1 +-19 +26 +-13 +-28 +27 +-10 +-31 +30 +-10 +-30 +28 +-3 +-16 +27 +-12 +-30 +32 +-7 +-18 +28 +-10 +-26 +38 +-2 +-27 +27 +-9 +-25 +43 +5 +-22 +29 +-9 +-27 +25 +-12 +-31 +40 +0 +-19 +32 +-5 +-30 +24 +-12 +-23 +42 +3 +-23 +29 +-9 +-28 +23 +-11 +-30 +33 +-4 +-27 +26 +-10 +-26 +31 +-5 +-27 +33 +-5 +-26 +30 +-8 +-25 +32 +-6 +-27 +32 +-7 +-26 +31 +-7 +-18 +32 +-7 +-20 +34 +-2 +-15 +52 +6 +-23 +30 +-10 +-31 +33 +-8 +-20 +29 +-7 +-27 +25 +-8 +-28 +25 +-10 +-29 +32 +-4 +-25 +28 +-3 +-16 +36 +-1 +-26 +28 +0 +-24 +29 +-7 +-28 +31 +-7 +-28 +30 +-7 +-14 +31 +22 +20 +20 +17 +15 +12 +17 +12 +11 +5 +5 +11 +13 +17 +15 +9 +6 +-2 +-4 +0 +4 +-2 +3 +-3 +-2 +3 +8 +6 +-1 +8 +4 +-3 +0 +-5 +9 +9 +-1 +-5 +-3 +-4 +4 +-4 +1 +-1 +-2 +-1 +-1 +-3 +5 +-3 +15 +3 +-3 +9 +12 +11 +0 +-11 +-9 +-4 +-5 +2 +-4 +-3 +7 +14 +3 +5 +1 +-7 +-5 +0 +-4 +-1 +-1 +-7 +-5 +0 +2 +-2 +-1 +10 +-2 +4 +-1 +3 +-5 +11 +7 +-2 +-2 +-4 +3 +5 +11 +-2 +16 +-1 +-4 +-5 +-6 +-6 +-2 +-3 +0 +-2 +-4 +8 +1 +10 +-2 +-2 +1 +3 +-4 +-4 +13 +2 +-3 +2 +3 +3 +4 +2 +2 +5 +14 +-25 +12 +-25 +-47 +5 +-29 +-39 +18 +-19 +-35 +20 +-17 +-36 +24 +-14 +-28 +23 +-12 +-31 +33 +-7 +-23 +30 +-8 +-30 +44 +0 +-27 +37 +-2 +-26 +27 +-11 +-29 +28 +-8 +-28 +29 +-9 +-29 +36 +-3 +-22 +42 +1 +-26 +31 +3 +-26 +25 +-11 +-30 +27 +-10 +-25 +30 +-10 +-27 +32 +-1 +-26 +33 +-7 +-25 +28 +-9 +-29 +38 +-3 +-19 +34 +-5 +-27 +29 +-10 +-28 +30 +-6 +-26 +44 +0 +-23 +25 +-11 +-31 +37 +-4 +-27 +28 +-9 +-16 +29 +-10 +-27 +31 +-8 +-24 +44 +3 +-23 +24 +-1 +-27 +32 +-7 +-27 +31 +-7 +-25 +32 +-2 +-26 +29 +-9 +-29 +45 +1 +-24 +32 +-4 +-27 +32 +-6 +-29 +31 +-2 +-27 +26 +-10 +-28 +40 +4 +-25 +33 +-8 +-31 +29 +-9 +-29 +30 +-10 +-27 +31 +-5 +23 +27 +38 +20 +19 +19 +12 +11 +7 +5 +19 +7 +2 +1 +1 +4 +1 +0 +-1 +-2 +5 +18 +2 +5 +-3 +15 +12 +1 +0 +-3 +-7 +-2 +-1 +0 +-4 +1 +0 +7 +5 +0 +-4 +-1 +1 +-2 +2 +-1 +15 +1 +10 +-3 +4 +-4 +1 +-5 +-3 +-5 +-6 +-4 +-1 +2 +-1 +1 +-2 +2 +3 +-2 +-3 +4 +-5 +1 +1 +4 +0 +-5 +11 +8 +0 +-1 +1 +-3 +-6 +-4 +-4 +7 +7 +-1 +0 +-2 +8 +-1 +-1 +-1 +-2 +9 +2 +1 +-3 +16 +-1 +1 +-2 +8 +12 +17 +-3 +-6 +-7 +-6 +0 +-7 +-4 +-5 +-4 +5 +-2 +-1 +2 +-1 +-6 +13 +-1 +-3 +-4 +8 +12 +2 +-3 +2 +10 +-26 +-46 +10 +-26 +-42 +13 +-20 +-40 +31 +-9 +-18 +25 +-13 +-26 +30 +-9 +-29 +29 +-5 +-31 +38 +-4 +-28 +24 +-12 +-33 +29 +-8 +-27 +26 +-9 +-24 +39 +-2 +-24 +34 +-6 +-29 +34 +-7 +-21 +26 +-11 +-24 +26 +-12 +-11 +30 +-6 +-20 +28 +-11 +-28 +28 +0 +-18 +39 +-3 +-23 +29 +-10 +-20 +30 +-9 +-31 +36 +-4 +-30 +30 +-8 +-27 +39 +-3 +-28 +36 +-6 +-29 +23 +-7 +-29 +33 +-4 +-14 +31 +-7 +-15 +28 +-6 +-14 +32 +-3 +-28 +29 +-10 +-29 +37 +-4 +-22 +27 +-12 +-17 +30 +-8 +-31 +29 +-10 +-30 +25 +-11 +-16 +33 +-5 +-28 +30 +5 +-24 +31 +-8 +-25 +30 +-7 +-28 +30 +-3 +-26 +35 +-5 +-22 +39 +-3 +-24 +26 +-7 +-18 +39 +-3 +-26 +31 +-9 +-29 +40 +0 +-27 +18 +26 +27 +39 +17 +13 +6 +7 +21 +17 +7 +1 +3 +1 +10 +-1 +-3 +1 +-2 +0 +-4 +1 +-1 +-1 +0 +3 +12 +-1 +-4 +3 +-4 +1 +4 +1 +-1 +0 +-3 +14 +15 +2 +-5 +8 +1 +-4 +2 +1 +2 +12 +6 +11 +7 +0 +-8 +-4 +10 +4 +-3 +-7 +2 +8 +-6 +-5 +0 +-7 +4 +4 +-3 +1 +-3 +-5 +-4 +1 +7 +-5 +-1 +-4 +3 +-1 +18 +1 +-3 +11 +0 +-3 +11 +-1 +-5 +-1 +4 +-4 +-2 +-1 +-1 +7 +7 +9 +-2 +-7 +-7 +-9 +0 +-4 +-4 +0 +-3 +0 +-2 +-4 +-2 +15 +1 +-2 +-2 +13 +1 +1 +-1 +0 +-4 +-2 +-2 +-4 +6 +5 +7 +5 +-3 +-1 +8 +-27 +-45 +17 +-21 +-42 +14 +-20 +-39 +21 +-18 +-32 +26 +-12 +-20 +37 +-6 +-23 +24 +-13 +-29 +25 +-12 +-31 +26 +-10 +-18 +38 +-5 +-20 +24 +-13 +-31 +28 +-11 +-28 +30 +-7 +-29 +27 +1 +-23 +31 +-1 +-22 +38 +1 +-19 +26 +-9 +-28 +31 +-9 +-20 +30 +-8 +-20 +27 +-9 +-26 +26 +-11 +-27 +43 +1 +-25 +37 +-5 +-28 +26 +-12 +-30 +25 +-9 +-15 +37 +-5 +-27 +40 +1 +-25 +28 +-8 +-27 +32 +-6 +-29 +33 +-3 +-26 +31 +-3 +-24 +31 +-8 +-29 +27 +5 +-23 +28 +-1 +-9 +30 +-9 +-28 +35 +-4 +-28 +25 +-8 +-27 +31 +-6 +-28 +30 +-7 +-24 +42 +-1 +-26 +28 +-5 +-26 +26 +-11 +-28 +30 +-7 +-15 +43 +0 +-22 +29 +-9 +-30 +36 +-6 +-28 +47 +3 +-24 +33 +-9 +-30 +15 +18 +19 +19 +15 +20 +26 +30 +12 +15 +1 +14 +9 +1 +0 +1 +3 +-3 +-2 +16 +1 +-2 +-5 +4 +3 +5 +-4 +-3 +-4 +-4 +3 +-3 +14 +2 +-4 +-3 +0 +-2 +-4 +4 +-3 +-2 +4 +11 +7 +-3 +-4 +2 +-2 +1 +6 +0 +-1 +-3 +4 +10 +-3 +-1 +-2 +2 +-4 +-2 +4 +-3 +1 +-1 +-3 +-3 +4 +13 +18 +2 +0 +-2 +3 +-4 +6 +-4 +0 +0 +6 +-4 +-1 +0 +1 +3 +-1 +1 +11 +-3 +-2 +2 +9 +1 +2 +6 +9 +2 +-3 +-6 +-8 +9 +15 +-3 +0 +-4 +-5 +0 +-9 +-6 +1 +-7 +-1 +-2 +0 +-2 +-5 +11 +0 +-4 +-2 +-2 +-2 +-2 +5 +13 +0 +-3 +7 +-28 +-43 +12 +-25 +-43 +18 +-19 +-38 +18 +-16 +-34 +21 +-12 +-32 +27 +-6 +-27 +28 +-10 +-25 +37 +-5 +-26 +28 +-7 +-30 +27 +-10 +-29 +32 +-6 +-16 +30 +-7 +-28 +26 +-10 +-29 +35 +0 +-9 +44 +0 +-26 +30 +-6 +-27 +28 +-10 +-30 +26 +-2 +-19 +32 +-6 +-21 +29 +-9 +-21 +30 +-9 +-16 +43 +-1 +-26 +28 +-10 +-25 +30 +-10 +-27 +27 +-8 +-27 +30 +-9 +-25 +26 +-3 +-22 +48 +3 +-24 +31 +-7 +-31 +31 +-8 +-25 +40 +-2 +-27 +31 +-9 +-28 +25 +-11 +-30 +29 +-10 +-26 +32 +-1 +-24 +39 +0 +-22 +33 +-6 +-28 +34 +-7 +-25 +31 +-8 +-28 +30 +2 +-23 +32 +0 +-20 +33 +-2 +-27 +27 +-8 +-29 +29 +-10 +-29 +33 +-5 +-24 +31 +2 +-23 +38 +-3 +-23 +31 +-6 +-29 +18 +31 +26 +19 +15 +18 +20 +9 +8 +8 +7 +19 +10 +2 +8 +13 +3 +-2 +7 +-3 +0 +4 +0 +1 +-4 +-2 +-1 +6 +3 +-2 +-2 +-2 +9 +-1 +9 +2 +0 +-3 +-4 +-2 +11 +4 +10 +-4 +3 +-3 +-3 +3 +-1 +-4 +-2 +2 +-3 +-1 +0 +0 +-2 +4 +1 +1 +0 +-2 +4 +-1 +-2 +4 +-2 +2 +13 +17 +8 +6 +-3 +10 +-6 +2 +-4 +-7 +-6 +-2 +-1 +-3 +2 +5 +-3 +-5 +16 +1 +1 +12 +0 +-5 +1 +12 +-5 +7 +4 +-7 +-9 +-6 +-6 +2 +-3 +-1 +3 +-4 +-7 +-5 +1 +1 +-2 +-1 +-2 +2 +-2 +-3 +-1 +10 +-1 +0 +-2 +1 +-3 +2 +-2 +-1 +9 +0 +15 +-23 +-44 +11 +-26 +-41 +14 +-19 +-30 +17 +-18 +-33 +34 +-6 +-25 +24 +-8 +-29 +25 +-12 +-30 +32 +-8 +-25 +43 +0 +-24 +26 +-13 +-18 +30 +-6 +-26 +30 +-1 +-26 +26 +-10 +-28 +28 +-2 +-26 +39 +-1 +-25 +32 +-6 +-13 +27 +-7 +-28 +27 +-10 +-30 +30 +-4 +-23 +32 +-7 +-28 +30 +-7 +-27 +33 +-8 +-28 +43 +5 +-13 +39 +-4 +-29 +31 +-8 +-24 +25 +-13 +-30 +24 +-8 +-30 +29 +-5 +-27 +34 +-3 +-27 +31 +-6 +-27 +27 +-6 +-28 +29 +-8 +-25 +30 +-8 +-23 +31 +-7 +-18 +32 +1 +-10 +44 +-1 +-24 +29 +-8 +-29 +33 +-7 +-28 +41 +4 +-18 +25 +-6 +-23 +35 +-1 +-16 +36 +-7 +-29 +23 +-11 +-32 +28 +-10 +-27 +33 +0 +-26 +28 +-7 +-27 +26 +-9 +-28 +27 +-8 +-27 +21 +25 +24 +17 +17 +16 +23 +17 +16 +13 +10 +13 +8 +1 +1 +8 +3 +3 +9 +9 +3 +3 +16 +1 +-2 +1 +-3 +-3 +0 +-1 +-5 +3 +15 +-1 +-1 +-3 +6 +-3 +-1 +4 +-1 +5 +5 +-5 +-6 +-6 +-4 +-6 +0 +-5 +-1 +1 +0 +3 +6 +0 +-3 +0 +11 +10 +17 +1 +-1 +-2 +-6 +-7 +-5 +2 +-3 +-1 +-2 +-2 +-1 +0 +-1 +5 +-4 +1 +1 +0 +0 +-2 +1 +5 +-1 +-2 +-1 +2 +5 +-2 +2 +2 +-3 +-3 +3 +-3 +-2 +4 +6 +0 +-1 +1 +-1 +-2 +5 +3 +-2 +1 +8 +2 +7 +-1 +-5 +-1 +6 +-1 +-5 +-1 +15 +2 +-3 +1 +-3 +-5 +-4 +4 +0 +-2 +-33 +6 +-28 +-39 +19 +-19 +-40 +17 +-20 +-38 +35 +-6 +-32 +27 +-12 +-23 +26 +-10 +-28 +31 +-9 +-20 +27 +-11 +-30 +27 +-12 +-29 +29 +-7 +-29 +31 +-8 +-23 +41 +-1 +-21 +36 +-6 +-9 +31 +-7 +-19 +40 +-4 +-21 +34 +-5 +-29 +26 +-12 +-30 +35 +-5 +-28 +29 +-8 +-28 +29 +-8 +-27 +29 +-8 +-16 +30 +-10 +-29 +31 +-8 +-28 +28 +-1 +-25 +31 +-7 +-14 +41 +-1 +-20 +34 +-7 +-29 +26 +-11 +-25 +26 +-9 +-16 +38 +-4 +-28 +29 +-10 +-19 +32 +-7 +-26 +31 +-9 +-28 +30 +-5 +-27 +27 +-11 +-22 +38 +-3 +-27 +29 +-10 +-24 +41 +-1 +-27 +49 +3 +-25 +26 +-10 +-23 +32 +-8 +-31 +36 +-4 +-26 +27 +-10 +-28 +24 +-12 +-26 +41 +-2 +-25 +34 +-6 +-26 +33 +-6 +-23 +29 +-4 +14 +20 +29 +20 +10 +12 +11 +21 +15 +17 +12 +7 +1 +5 +2 +4 +-3 +7 +-2 +3 +6 +-2 +-3 +1 +2 +14 +18 +1 +-3 +4 +-2 +-4 +12 +14 +11 +0 +-5 +-8 +-3 +0 +0 +-4 +-7 +-1 +9 +0 +-3 +-5 +-4 +-1 +-5 +0 +18 +2 +5 +1 +7 +-4 +11 +-3 +-3 +-6 +-7 +-2 +-1 +-4 +-4 +14 +-2 +0 +1 +10 +3 +-2 +-4 +0 +2 +15 +-1 +-3 +-1 +1 +-4 +9 +3 +3 +6 +6 +5 +-6 +4 +-7 +1 +-7 +-7 +-3 +-3 +2 +0 +-3 +6 +2 +1 +-5 +1 +-4 +-3 +13 +15 +12 +-5 +-1 +-4 +0 +-6 +-6 +-1 +-4 +3 +-5 +-1 +-1 +2 +-4 +-3 +-2 +-1 +-2 +15 +-22 +-44 +9 +-21 +-37 +12 +-22 +-40 +19 +-17 +-34 +21 +-11 +-31 +45 +0 +-15 +28 +-10 +-31 +25 +-13 +-31 +31 +-6 +-29 +27 +-11 +-27 +29 +-7 +-29 +35 +-5 +-25 +31 +-1 +-22 +34 +-6 +-27 +41 +-1 +-14 +32 +-8 +-18 +43 +4 +-17 +24 +-11 +-28 +26 +-11 +-32 +28 +-9 +-22 +41 +-1 +-18 +35 +-7 +-28 +26 +-11 +-23 +40 +-3 +-19 +30 +-9 +-27 +28 +-12 +-29 +37 +-3 +-29 +26 +-11 +-30 +34 +-6 +-16 +28 +-10 +-28 +27 +-11 +-29 +31 +-8 +-22 +34 +-4 +-27 +32 +-7 +-27 +33 +-5 +-26 +39 +-2 +-24 +42 +2 +-26 +28 +-10 +-29 +30 +2 +-20 +41 +-2 +-28 +25 +-12 +-28 +26 +-6 +-23 +35 +-5 +-25 +35 +-4 +-22 +33 +-5 +-27 +33 +-7 +-15 +43 +0 +-24 +34 +-7 +-29 +15 +27 +21 +17 +22 +11 +18 +7 +10 +9 +7 +2 +11 +15 +11 +11 +11 +7 +-3 +-4 +-4 +-5 +0 +-3 +-3 +-1 +8 +1 +16 +1 +-1 +-4 +0 +-3 +-2 +-2 +1 +-3 +9 +2 +-2 +-3 +-5 +-2 +0 +8 +1 +-2 +1 +5 +-4 +12 +1 +0 +6 +-3 +-4 +-3 +-1 +-1 +2 +2 +6 +-2 +-3 +4 +0 +-1 +8 +-1 +3 +-2 +3 +17 +-1 +-1 +2 +-7 +1 +-3 +0 +-1 +1 +-2 +13 +-1 +-2 +8 +10 +-3 +-6 +-3 +-6 +1 +-1 +-1 +-1 +-5 +-7 +0 +5 +0 +-5 +1 +-4 +-2 +2 +5 +-2 +1 +2 +-2 +-1 +5 +-2 +-1 +-1 +1 +-1 +2 +-2 +18 +4 +13 +6 +9 +11 +-2 +-35 +1 +-32 +-42 +24 +-12 +-39 +17 +-17 +-38 +16 +-19 +-24 +28 +-12 +-32 +35 +-6 +-29 +27 +-13 +-30 +26 +-11 +-30 +29 +-10 +-17 +44 +3 +-26 +22 +-10 +-30 +26 +-11 +-28 +36 +-6 +-23 +28 +-5 +-22 +47 +2 +-25 +27 +-8 +-23 +25 +-11 +-29 +33 +0 +-24 +25 +-4 +-27 +43 +0 +-27 +26 +-8 +-28 +25 +-5 +-19 +39 +1 +-12 +29 +-8 +-29 +30 +-9 +-31 +26 +0 +-26 +26 +-8 +-27 +38 +0 +-25 +35 +-7 +-29 +36 +-3 +-15 +30 +-9 +-29 +28 +-10 +-29 +34 +-7 +-29 +32 +-7 +-28 +30 +-9 +-25 +29 +-7 +-22 +32 +-6 +-25 +29 +-6 +-28 +29 +-7 +-17 +38 +-1 +-26 +38 +-2 +-23 +24 +-12 +-27 +29 +-9 +-27 +35 +-6 +-26 +45 +1 +-25 +35 +-4 +-29 +29 +-11 +-29 +33 +-6 +10 +38 +23 +17 +16 +15 +10 +21 +16 +23 +11 +9 +-1 +4 +5 +2 +-2 +9 +0 +-4 +5 +3 +-3 +-5 +-4 +-2 +9 +-2 +3 +-1 +-1 +-2 +4 +7 +-1 +-3 +-3 +3 +12 +-2 +9 +-1 +4 +-3 +-3 +5 +-4 +-1 +5 +0 +-4 +13 +-2 +-5 +-5 +-3 +-1 +7 +0 +-1 +12 +3 +13 +1 +9 +5 +-4 +-10 +2 +-2 +-3 +-5 +11 +0 +-5 +-6 +4 +-5 +-2 +8 +-3 +15 +0 +2 +-6 +-3 +-5 +-3 +-4 +-4 +3 +2 +-6 +10 +2 +5 +6 +2 +-5 +-3 +2 +-5 +-4 +-3 +5 +8 +-5 +6 +-3 +-1 +5 +0 +-2 +-6 +4 +0 +1 +0 +8 +-2 +-3 +15 +1 +-3 +-3 +-3 +14 +0 +10 +-27 +-50 +6 +-26 +-38 +14 +-21 +-39 +28 +-6 +-30 +28 +-10 +-34 +28 +-10 +-31 +36 +1 +-25 +22 +-16 +-29 +22 +-9 +-30 +27 +-9 +-29 +28 +-4 +-27 +35 +-5 +-20 +30 +-7 +-25 +28 +-9 +-24 +29 +-8 +-25 +47 +2 +-23 +29 +1 +-17 +35 +-5 +-24 +42 +-1 +-27 +26 +-13 +-30 +26 +-10 +-24 +40 +-3 +-27 +33 +-6 +-26 +30 +-2 +-28 +27 +-6 +-22 +33 +0 +-25 +33 +-4 +-28 +24 +-11 +-26 +30 +-5 +-24 +31 +-6 +-20 +28 +-10 +-27 +43 +1 +-24 +44 +1 +-25 +42 +-2 +-26 +29 +-10 +-29 +24 +-14 +-27 +32 +-8 +-28 +29 +-9 +-28 +28 +-9 +-26 +34 +-7 +-24 +37 +-4 +-27 +34 +-3 +-14 +30 +-8 +-22 +39 +-4 +-27 +26 +-9 +-22 +30 +-10 +-29 +34 +0 +-19 +27 +-11 +-29 +17 +40 +23 +23 +15 +30 +14 +10 +22 +17 +7 +3 +3 +3 +0 +7 +16 +1 +-2 +6 +-4 +8 +-3 +-1 +-2 +-3 +2 +6 +7 +3 +5 +-3 +8 +-3 +-3 +0 +-4 +-2 +0 +5 +-3 +-3 +-4 +13 +0 +0 +-2 +-3 +7 +17 +-1 +15 +-2 +0 +-8 +-7 +-6 +-1 +9 +-3 +-4 +7 +-3 +-2 +-5 +6 +6 +1 +4 +-5 +-3 +-3 +-1 +13 +-1 +1 +-3 +3 +-2 +-5 +-3 +0 +-3 +1 +-4 +-1 +1 +-2 +4 +14 +8 +-4 +-5 +-2 +1 +1 +3 +11 +11 +3 +2 +-6 +-4 +-4 +-2 +2 +-5 +-3 +-2 +-1 +-2 +0 +-1 +3 +9 +2 +-3 +-5 +11 +1 +-3 +1 +-2 +7 +7 +4 +0 +-4 +9 +-27 +-47 +18 +-20 +-43 +19 +-18 +-35 +23 +-16 +-28 +20 +-14 +-34 +30 +-9 +-31 +28 +-9 +-31 +29 +-10 +-19 +37 +-4 +-27 +26 +-11 +-25 +26 +-7 +-29 +43 +5 +-19 +27 +-10 +-28 +26 +-12 +-27 +28 +1 +-20 +27 +-11 +-24 +26 +-7 +-25 +38 +-4 +-27 +30 +-1 +-26 +31 +-7 +-27 +32 +-6 +-27 +38 +-2 +-22 +49 +4 +-17 +26 +-11 +-19 +27 +-11 +-28 +32 +-6 +-27 +24 +-10 +-16 +39 +-3 +-28 +47 +3 +-25 +29 +-6 +-27 +22 +-10 +-31 +36 +-6 +-26 +23 +-12 +-31 +26 +-4 +-11 +35 +-5 +-29 +28 +-5 +-25 +42 +5 +-24 +25 +-9 +-23 +25 +-10 +-28 +28 +-9 +-25 +30 +-7 +-27 +28 +1 +-23 +37 +-4 +-23 +27 +-8 +-29 +30 +-8 +-13 +31 +-8 +-27 +28 +-9 +-27 +42 +0 +-14 +36 +29 +21 +18 +17 +13 +21 +10 +8 +8 +5 +7 +7 +13 +2 +6 +-1 +0 +3 +18 +14 +3 +-5 +-3 +-3 +-4 +7 +-2 +7 +0 +-5 +-3 +-2 +-1 +1 +4 +2 +-2 +-6 +0 +0 +3 +-3 +1 +17 +2 +7 +1 +-3 +-5 +3 +-4 +16 +1 +2 +-6 +-5 +-5 +10 +13 +-2 +-6 +-2 +2 +-4 +-1 +1 +0 +-1 +-2 +13 +-1 +-3 +-7 +-7 +7 +1 +-5 +14 +11 +2 +-2 +-6 +-4 +2 +-1 +-3 +-1 +0 +11 +-2 +-1 +-5 +-3 +-2 +-4 +-1 +1 +-3 +1 +16 +1 +11 +11 +8 +-5 +-3 +5 +-1 +-2 +-6 +-8 +-5 +0 +-4 +12 +0 +-3 +-1 +-2 +-5 +-2 +0 +14 +8 +0 +-5 +-2 +9 +-27 +-50 +12 +-24 +-41 +12 +-23 +-38 +21 +-11 +-17 +24 +-13 +-33 +29 +-8 +-28 +40 +-1 +-29 +26 +-11 +-32 +27 +-7 +-27 +36 +-6 +-29 +27 +-6 +-25 +26 +-9 +-28 +30 +-2 +-26 +29 +-7 +-19 +34 +-6 +-26 +32 +-8 +-27 +30 +-8 +-27 +45 +3 +-20 +49 +4 +-21 +23 +-7 +-29 +28 +-11 +-27 +38 +-4 +-16 +30 +-9 +-25 +40 +-3 +-25 +25 +-12 +-32 +26 +-11 +-22 +32 +-8 +-17 +42 +-2 +-13 +27 +-11 +-32 +25 +-13 +-30 +26 +-7 +-22 +30 +-3 +-24 +34 +-1 +-27 +43 +7 +-22 +34 +-6 +-22 +32 +-10 +-18 +32 +-8 +-29 +37 +2 +-24 +27 +-11 +-33 +26 +-9 +-28 +26 +-10 +-28 +32 +-7 +-23 +42 +0 +-27 +26 +-12 +-31 +35 +1 +-24 +27 +-9 +-29 +27 +-9 +-28 +27 +-8 +-26 +23 +44 +27 +22 +16 +13 +12 +16 +26 +12 +11 +1 +15 +12 +18 +0 +-2 +4 +2 +5 +-4 +-2 +-2 +-1 +-4 +0 +9 +-2 +3 +1 +-3 +8 +-1 +-5 +-1 +-2 +1 +-5 +1 +7 +-3 +10 +-2 +-3 +-2 +-1 +9 +8 +-2 +-4 +5 +2 +-4 +-2 +-2 +-4 +-4 +13 +8 +-2 +-3 +16 +1 +-4 +-3 +-3 +2 +-5 +13 +-1 +-3 +1 +-4 +-5 +-1 +2 +6 +11 +-2 +-1 +-3 +7 +1 +1 +2 +-5 +-4 +7 +0 +0 +6 +-1 +-1 +5 +-2 +1 +0 +-1 +-7 +13 +0 +5 +-3 +-7 +-5 +-2 +16 +1 +-4 +12 +4 +-1 +-6 +4 +6 +-4 +8 +3 +-7 +-6 +4 +-2 +-6 +-4 +0 +8 +9 +-5 +13 +-24 +-47 +7 +-29 +-47 +14 +-17 +-38 +22 +-9 +-31 +26 +-7 +-32 +23 +-13 +-30 +36 +-4 +-28 +33 +4 +-25 +32 +-8 +-24 +25 +-11 +-29 +26 +-11 +-30 +26 +-12 +-25 +29 +-6 +-26 +32 +-7 +-27 +34 +-6 +-26 +34 +-4 +-14 +44 +0 +-25 +26 +-8 +-31 +29 +-9 +-28 +29 +-5 +-27 +30 +-7 +-29 +31 +-5 +-27 +30 +-4 +-17 +38 +-4 +-23 +29 +-9 +-22 +31 +-4 +-27 +46 +2 +-26 +28 +-11 +-29 +28 +-10 +-25 +34 +-7 +-26 +36 +-5 +-25 +28 +-2 +-26 +32 +-6 +-18 +28 +-11 +-25 +33 +-5 +-28 +33 +-3 +-23 +27 +-9 +-24 +27 +2 +-25 +34 +-3 +-26 +27 +-11 +-23 +32 +-5 +-28 +29 +-10 +-28 +29 +-7 +-25 +32 +3 +-23 +31 +-6 +-24 +34 +-7 +-26 +31 +-2 +-26 +33 +-5 +-25 +20 +31 +41 +23 +16 +12 +17 +14 +23 +8 +14 +7 +12 +11 +-2 +8 +8 +-3 +2 +0 +0 +6 +-2 +-7 +-4 +4 +-2 +-1 +14 +-1 +1 +-4 +3 +-3 +10 +4 +-2 +0 +-4 +-4 +4 +12 +-1 +5 +-4 +-3 +5 +7 +5 +3 +-6 +4 +-6 +-4 +-5 +-5 +-3 +-2 +-1 +2 +-2 +-3 +-3 +-5 +7 +8 +5 +2 +-2 +4 +-3 +-2 +-4 +9 +-1 +0 +2 +2 +-2 +1 +2 +-2 +18 +2 +9 +5 +-4 +1 +-2 +4 +-2 +-5 +-7 +-6 +2 +2 +-5 +2 +2 +10 +-2 +1 +-2 +2 +-4 +-5 +1 +0 +5 +0 +8 +4 +1 +-4 +6 +2 +0 +-4 +-3 +0 +5 +-2 +-5 +-3 +-3 +7 +-2 +-3 +7 +-28 +-41 +7 +-28 +-46 +25 +-13 +-38 +19 +-12 +-33 +21 +-9 +-25 +35 +-8 +-31 +32 +-7 +-30 +29 +-11 +-30 +26 +-12 +-31 +33 +-6 +-16 +29 +-1 +-20 +36 +-6 +-28 +26 +-10 +-23 +37 +-5 +-21 +31 +-7 +-29 +30 +-9 +-28 +36 +-1 +-24 +46 +2 +-26 +26 +-7 +-16 +27 +-11 +-30 +24 +-12 +-29 +30 +-8 +-24 +29 +-8 +-27 +46 +2 +-18 +32 +-7 +-21 +27 +-4 +-20 +28 +-8 +-22 +41 +-1 +-18 +32 +-8 +-31 +30 +-10 +-27 +29 +-10 +-30 +36 +-6 +-27 +40 +0 +-21 +27 +-10 +-29 +23 +-4 +-26 +38 +-1 +-26 +35 +-5 +-28 +30 +-9 +-21 +27 +-11 +-29 +37 +-5 +-15 +28 +-9 +-24 +26 +-9 +-19 +33 +-1 +-27 +36 +-6 +-27 +31 +-8 +-29 +26 +-9 +-25 +31 +-2 +-25 +36 +-5 +-20 +19 +24 +22 +20 +24 +25 +11 +19 +8 +20 +8 +7 +3 +6 +4 +4 +1 +0 +-1 +0 +6 +5 +-1 +15 +4 +-2 +2 +1 +-3 +11 +11 +-3 +-1 +2 +9 +-1 +-6 +-3 +-4 +-2 +2 +-4 +2 +11 +0 +-2 +2 +-3 +-5 +-5 +-4 +-2 +5 +1 +10 +-2 +5 +6 +2 +5 +0 +0 +-5 +-5 +-6 +1 +-1 +3 +-4 +4 +-1 +12 +5 +-5 +-4 +-5 +-2 +14 +4 +12 +7 +2 +7 +3 +-8 +-6 +-2 +-1 +-4 +-2 +7 +-5 +-3 +-5 +-5 +-2 +13 +1 +4 +-1 +-5 +11 +6 +8 +6 +-6 +2 +-3 +6 +-2 +3 +1 +2 +0 +-3 +-6 +-5 +7 +-3 +-5 +12 +0 +2 +-4 +-9 +7 +-4 +-6 +8 +-27 +-50 +8 +-24 +-43 +22 +-11 +-36 +23 +-16 +-34 +21 +-13 +-35 +27 +-5 +-28 +29 +-8 +-28 +29 +-10 +-29 +33 +-6 +-26 +32 +-8 +-24 +26 +-11 +-27 +33 +-3 +-24 +27 +-7 +-26 +29 +-9 +-24 +29 +-8 +-10 +35 +-6 +-22 +36 +-4 +-28 +29 +-9 +-28 +44 +7 +-21 +28 +-11 +-27 +46 +3 +-19 +29 +-11 +-26 +28 +-8 +-17 +27 +-10 +-29 +30 +-9 +-24 +40 +-3 +-23 +29 +-10 +-29 +30 +-8 +-28 +40 +0 +-15 +29 +-11 +-31 +35 +-2 +-29 +38 +-4 +-25 +23 +-11 +-29 +27 +-10 +-28 +33 +-6 +-15 +38 +-4 +-27 +28 +-9 +-30 +30 +-7 +-29 +27 +-9 +-23 +40 +-1 +-21 +40 +5 +-24 +26 +-9 +-27 +38 +-4 +-26 +25 +-12 +-28 +27 +-10 +-24 +31 +-4 +-24 +29 +-8 +-26 +31 +1 +-24 +36 +24 +24 +19 +18 +16 +12 +14 +15 +12 +12 +11 +24 +5 +6 +-1 +-1 +15 +2 +-2 +8 +-1 +-6 +4 +0 +-3 +0 +-1 +0 +6 +-4 +-3 +1 +6 +1 +-1 +1 +3 +-3 +-4 +3 +5 +5 +1 +6 +6 +-5 +-3 +3 +5 +-4 +6 +6 +-1 +10 +-3 +-1 +-6 +-2 +-2 +-5 +0 +5 +-4 +-1 +5 +10 +7 +-1 +2 +-4 +-3 +13 +-1 +1 +-2 +-3 +-3 +-6 +-3 +1 +7 +-2 +3 +-4 +-4 +-5 +-2 +-4 +4 +-3 +-3 +-4 +0 +-2 +3 +9 +1 +10 +3 +1 +4 +14 +1 +-3 +0 +-4 +-3 +1 +0 +17 +0 +-5 +-4 +-2 +-3 +3 +-1 +-4 +3 +-4 +4 +-4 +9 +2 +-2 +-4 +17 +13 +-23 +-47 +5 +-29 +-43 +12 +-22 +-40 +21 +-11 +-20 +22 +-8 +-29 +23 +-10 +-30 +24 +-12 +-19 +28 +-11 +-18 +29 +-9 +-28 +29 +-6 +-27 +30 +-8 +-24 +32 +-7 +-27 +33 +-5 +-27 +31 +-8 +-27 +34 +-4 +-27 +46 +2 +-21 +42 +-1 +-27 +26 +-7 +-23 +26 +-11 +-25 +38 +-1 +-27 +27 +-10 +-29 +30 +-9 +-24 +29 +-8 +-17 +38 +-1 +-23 +26 +-10 +-18 +45 +1 +-27 +42 +-1 +-14 +28 +-7 +-23 +33 +-5 +-27 +32 +-6 +-25 +32 +-6 +-18 +41 +0 +-29 +22 +-14 +-29 +30 +-10 +-32 +26 +-9 +-25 +28 +-11 +-31 +29 +-6 +-23 +33 +-6 +-28 +27 +-11 +-29 +33 +-3 +-24 +33 +-6 +-26 +31 +-5 +-13 +37 +-4 +-28 +28 +-10 +-27 +27 +-5 +-23 +31 +1 +-24 +29 +-5 +-14 +39 +-4 +-29 +17 +21 +18 +29 +22 +15 +10 +12 +11 +7 +3 +11 +15 +6 +9 +3 +1 +3 +3 +3 +3 +5 +2 +-1 +0 +0 +5 +1 +0 +6 +5 +-1 +1 +3 +3 +5 +4 +2 +-1 +-3 +11 +-2 +-3 +1 +7 +-3 +6 +0 +-4 +-1 +-6 +3 +2 +-2 +-3 +5 +14 +9 +2 +-4 +6 +12 +-1 +-9 +-1 +2 +-4 +-1 +-2 +8 +-1 +-5 +5 +-5 +-4 +-2 +-5 +-4 +5 +4 +-4 +-4 +2 +-3 +-4 +-2 +-4 +1 +-1 +6 +-4 +-4 +-4 +15 +0 +2 +-3 +-2 +-3 +8 +1 +-2 +0 +15 +2 +-3 +-1 +1 +2 +12 +-3 +-6 +-5 +-3 +7 +0 +4 +16 +14 +0 +-3 +-7 +-4 +1 +-4 +-2 +-4 +1 +16 +-22 +-46 +22 +-16 +-31 +24 +-16 +-41 +15 +-21 +-40 +16 +-18 +-36 +39 +-4 +-28 +26 +-12 +-31 +23 +-13 +-31 +44 +1 +-26 +37 +-1 +-23 +27 +-10 +-28 +26 +-12 +-27 +26 +-4 +-24 +45 +2 +-25 +29 +-4 +-27 +26 +-11 +-12 +29 +-10 +-29 +26 +-10 +-30 +38 +4 +-14 +38 +-5 +-27 +26 +-10 +-27 +29 +-10 +-31 +33 +-4 +-23 +26 +-11 +-27 +32 +2 +-15 +31 +-9 +-20 +28 +-9 +-29 +32 +-4 +-27 +37 +-4 +-28 +26 +-10 +-25 +31 +-6 +-24 +27 +-4 +-27 +29 +-7 +-20 +33 +-7 +-25 +35 +-4 +-26 +27 +-6 +-21 +36 +-2 +-26 +27 +-10 +-19 +31 +-7 +-26 +44 +0 +-26 +28 +-10 +-27 +28 +-3 +-26 +31 +-8 +-25 +30 +-6 +-22 +31 +-7 +-28 +33 +-7 +-22 +27 +-6 +-26 +34 +-6 +-25 +22 +28 +28 +21 +26 +37 +16 +11 +5 +6 +16 +3 +3 +2 +8 +11 +1 +12 +-1 +-2 +2 +3 +2 +7 +3 +0 +4 +1 +1 +-4 +-3 +14 +3 +-3 +9 +14 +-3 +-1 +0 +6 +-7 +3 +-5 +2 +-5 +-5 +-6 +-5 +-4 +4 +2 +-2 +-2 +-3 +1 +5 +-2 +-1 +-2 +-3 +4 +1 +4 +4 +5 +-3 +7 +3 +-4 +1 +-2 +11 +10 +-1 +-3 +-1 +-1 +0 +-4 +-1 +-5 +-1 +-2 +3 +-1 +-1 +-2 +-1 +-2 +10 +3 +-1 +11 +1 +6 +-4 +-3 +-3 +-3 +-3 +0 +-2 +-3 +-1 +6 +3 +-3 +-3 +4 +-1 +6 +-1 +-4 +-4 +0 +3 +10 +1 +0 +11 +2 +-2 +-2 +-2 +1 +1 +2 +-5 +10 +-26 +-46 +16 +-20 +-43 +11 +-20 +-38 +19 +-18 +-28 +28 +-10 +-33 +28 +-10 +-27 +30 +-5 +-16 +35 +-7 +-29 +30 +-8 +-30 +29 +0 +-24 +42 +0 +-24 +29 +-6 +-30 +28 +-9 +-29 +34 +-7 +-25 +29 +-10 +-29 +34 +-4 +-26 +34 +-6 +-29 +38 +-2 +-27 +36 +-4 +-29 +40 +-3 +-14 +32 +-5 +-27 +26 +-10 +-31 +26 +-9 +-29 +29 +-9 +-27 +31 +-6 +-27 +28 +-6 +-27 +30 +-7 +-18 +49 +4 +-24 +26 +-8 +-29 +26 +-10 +-20 +28 +0 +-22 +36 +-6 +-28 +32 +-5 +-28 +35 +1 +-19 +26 +-10 +-29 +27 +-6 +-26 +29 +-7 +-21 +41 +-2 +-26 +35 +-4 +-25 +27 +-11 +-17 +39 +-1 +-28 +27 +-12 +-16 +33 +-7 +-24 +36 +-2 +-26 +40 +6 +-25 +24 +-14 +-18 +27 +-11 +-27 +30 +-10 +-30 +23 +20 +21 +21 +18 +11 +21 +13 +7 +7 +14 +5 +19 +24 +4 +8 +-3 +-2 +-2 +-4 +-2 +2 +-2 +0 +0 +12 +12 +-1 +-2 +-3 +1 +-5 +0 +-1 +2 +5 +-5 +-5 +-4 +0 +-2 +1 +1 +8 +16 +6 +-2 +-4 +1 +7 +14 +-2 +-4 +-2 +2 +-2 +2 +14 +1 +-4 +-6 +-4 +-1 +-3 +3 +1 +-2 +3 +-3 +1 +-4 +-4 +-3 +4 +-1 +0 +-3 +0 +5 +1 +-2 +12 +9 +7 +-4 +0 +1 +1 +1 +4 +6 +18 +0 +4 +-3 +-6 +0 +-2 +-1 +13 +-3 +-2 +-7 +-5 +2 +7 +-6 +-2 +-3 +-5 +1 +-4 +-4 +0 +-4 +1 +-2 +-3 +-2 +2 +5 +-1 +4 +10 +-3 +1 +1 +15 +-24 +15 +-22 +-46 +10 +-25 +-45 +13 +-9 +-34 +19 +-10 +-32 +22 +-14 +-32 +27 +-6 +-29 +31 +-7 +-27 +27 +-10 +-29 +34 +1 +-25 +30 +-9 +-30 +33 +-4 +-27 +31 +-8 +-29 +32 +-8 +-24 +32 +-7 +-27 +46 +2 +-24 +29 +-9 +-31 +32 +-2 +-11 +34 +-2 +-20 +26 +-12 +-31 +25 +-10 +-30 +28 +-9 +-25 +28 +-6 +-21 +39 +-3 +-24 +32 +-7 +-25 +37 +-5 +-27 +27 +-8 +-29 +30 +-4 +-13 +40 +2 +-23 +31 +-10 +-30 +29 +-5 +-28 +27 +-6 +-28 +27 +-5 +-16 +31 +-9 +-25 +32 +-7 +-20 +37 +-4 +-21 +28 +-10 +-30 +30 +-6 +-28 +27 +-10 +-16 +41 +-3 +-26 +28 +-8 +-26 +39 +-4 +-20 +27 +-8 +-29 +31 +-9 +-28 +30 +-9 +-29 +32 +-5 +-24 +40 +-2 +-25 +28 +-7 +-28 +28 +-7 +18 +24 +22 +26 +21 +34 +14 +10 +4 +2 +3 +5 +5 +13 +10 +0 +0 +3 +0 +1 +-1 +3 +17 +1 +0 +9 +-3 +2 +3 +-4 +0 +0 +-1 +5 +1 +1 +0 +-3 +1 +-3 +-1 +-1 +2 +7 +-3 +-1 +-1 +6 +13 +8 +-3 +-2 +14 +11 +4 +3 +-2 +-3 +-4 +0 +4 +0 +-7 +-1 +-3 +9 +-5 +2 +5 +16 +-3 +-8 +-8 +-2 +-3 +0 +3 +-1 +-3 +-3 +8 +9 +7 +8 +5 +-2 +-4 +-6 +4 +8 +2 +-2 +-7 +5 +0 +-6 +-7 +-4 +-5 +-3 +-3 +-1 +7 +4 +-1 +3 +-3 +16 +1 +-3 +9 +4 +-3 +-4 +-4 +10 +4 +-4 +-3 +-2 +-5 +0 +-5 +-2 +2 +-2 +-4 +-3 +11 +-26 +-47 +9 +-22 +-41 +15 +-20 +-37 +20 +-16 +-33 +29 +-10 +-32 +25 +-7 +-28 +30 +-7 +-19 +33 +0 +-19 +28 +-11 +-14 +30 +-10 +-29 +25 +-11 +-21 +28 +-10 +-23 +37 +-3 +-27 +37 +0 +-13 +36 +-2 +-29 +29 +-10 +-28 +26 +-7 +-26 +26 +-12 +-25 +27 +-10 +-26 +30 +-1 +-26 +34 +-6 +-27 +32 +-5 +-24 +30 +-5 +-27 +39 +-2 +-26 +28 +-9 +-26 +44 +0 +-26 +34 +-3 +-23 +29 +-9 +-27 +37 +-3 +-24 +38 +-4 +-28 +37 +-3 +-29 +46 +1 +-25 +22 +-12 +-32 +34 +-8 +-28 +29 +-9 +-28 +32 +-6 +-29 +29 +-3 +-19 +30 +-8 +-26 +42 +7 +-23 +28 +-11 +-31 +29 +-3 +-26 +34 +-7 +-29 +35 +-2 +-23 +27 +-10 +-28 +33 +-6 +-30 +30 +-2 +-25 +30 +-6 +-28 +30 +-6 +-26 +32 +-7 +-17 +33 +-6 +-27 +27 +-9 +-27 +34 +-6 +-23 +31 +-7 +-25 +30 +-8 +-27 +31 +-3 +-15 +30 +-8 +-27 +37 +1 +-25 +26 +-2 +-23 +28 +-7 +-24 +34 +3 +-23 +29 +-8 +-29 +30 +-9 +-27 +30 +-4 +-26 +31 +3 +-14 +29 +-8 +-28 +29 +-6 +-23 +42 +0 +-22 +28 +-9 +-29 +32 +0 +-26 +36 +-6 +-27 +37 +-4 +-26 +35 +-7 +-26 +31 +-5 +-24 +30 +-9 +-27 +36 +-5 +-27 +31 +-6 +-27 +32 +-7 +-25 +33 +-7 +-17 +31 +-7 +-18 +29 +-1 +-26 +33 +-7 +-14 +30 +-5 +-18 +25 +-7 +-21 +25 +-13 +-28 +26 +-10 +-28 +31 +-7 +-27 +32 +-1 +-25 +28 +-9 +-27 +34 +-4 +-12 +30 +-2 +-25 +31 +-7 +-29 +29 +-9 +-26 +50 +4 +-24 +28 +-10 +-25 +35 +-5 +-23 +37 +-1 +-19 +19 +18 +20 +15 +19 +14 +9 +19 +7 +13 +4 +2 +3 +9 +4 +5 +0 +2 +0 +-1 +2 +1 +3 +3 +14 +7 +10 +9 +3 +-2 +6 +-5 +-3 +-1 +-2 +11 +-3 +-2 +-3 +-3 +5 +-2 +0 +-2 +-2 +6 +-2 +-2 +-1 +2 +0 +2 +0 +1 +3 +0 +18 +3 +-3 +-4 +-1 +-1 +-5 +-1 +12 +2 +-4 +1 +2 +-3 +-4 +-3 +1 +6 +8 +9 +1 +-5 +-6 +-4 +0 +-1 +-1 +-4 +-1 +-1 +13 +10 +1 +12 +-1 +-5 +-8 +12 +5 +-4 +-7 +-8 +5 +3 +-5 +-4 +3 +-2 +13 +20 +0 +-5 +-6 +0 +0 +-3 +-1 +-3 +5 +-2 +2 +0 +1 +0 +15 +0 +-5 +0 +-6 +-5 +7 +-5 +-2 +7 +-4 +15 +0 +-3 +-1 +-6 +-6 +-3 +-1 +-1 +-1 +10 +11 +-2 +-5 +1 +-5 +2 +0 +-2 +9 +17 +8 +-4 +-5 +-2 +-2 +1 +-5 +-3 +-4 +-3 +-2 +3 +14 +13 +3 +-5 +-1 +11 +4 +-5 +-1 +-3 +-6 +-5 +-3 +-2 +-6 +-2 +-2 +-1 +-1 +10 +2 +-2 +-4 +2 +3 +-2 +-5 +2 +2 +-1 +-1 +0 +12 +0 +2 +13 +7 +-2 +5 +2 +-4 +-5 +-3 +1 +-5 +-3 +2 +2 +7 +-1 +-3 +13 +0 +0 +-4 +-3 +-2 +-4 +2 +0 +-3 +1 +-2 +7 +13 +1 +-5 +-6 +3 +5 +-2 +-5 +1 +2 +0 +-3 +13 +-1 +-1 +0 +-5 +-2 +0 +0 +-4 +-4 +16 +5 +12 +1 +-4 +4 +11 +-26 +-49 +21 +-14 +-41 +8 +-22 +-42 +15 +-21 +-37 +18 +-14 +-34 +32 +-8 +-29 +34 +-4 +-12 +29 +-5 +-29 +24 +-10 +-26 +36 +1 +-25 +28 +-7 +-26 +33 +-3 +-11 +28 +-10 +-32 +29 +-10 +-30 +29 +-4 +-27 +27 +-5 +-28 +29 +-9 +-24 +42 +5 +-15 +27 +0 +-26 +27 +-10 +-29 +28 +-3 +-28 +30 +-9 +-29 +32 +-6 +-13 +29 +-10 +-26 +30 +-7 +-30 +27 +-10 +-22 +33 +-5 +-27 +33 +-7 +-26 +29 +-9 +-27 +31 +-5 +-22 +42 +0 +-26 +29 +-8 +-25 +44 +3 +-26 +31 +-9 +-20 +26 +-5 +-25 +28 +-9 +-13 +36 +-5 +-28 +31 +-7 +-13 +30 +-6 +-27 +29 +-10 +-27 +27 +-6 +-24 +33 +-7 +-28 +36 +-5 +-23 +40 +-3 +-22 +32 +-7 +-18 +27 +-9 +-29 +33 +0 +-27 +32 +-8 +-23 +33 +-8 +-30 +29 +-7 +-27 +34 +1 +-21 +29 +-10 +-24 +33 +-4 +-29 +33 +-5 +-18 +45 +1 +-26 +38 +-1 +-28 +37 +-4 +-24 +23 +-15 +-20 +28 +-10 +-27 +31 +-9 +-18 +28 +-4 +-21 +25 +-13 +-32 +23 +-12 +-28 +28 +-8 +-27 +42 +0 +-23 +30 +-5 +-15 +35 +-6 +-29 +27 +-11 +-27 +28 +-10 +-23 +35 +-5 +-27 +38 +1 +-20 +25 +-11 +-27 +27 +-3 +-27 +26 +-10 +-29 +29 +-2 +-24 +29 +-9 +-27 +36 +-3 +-22 +31 +-7 +-22 +28 +-6 +-24 +35 +-4 +-14 +47 +3 +-26 +41 +-2 +-27 +33 +-6 +-29 +27 +-11 +-23 +25 +-11 +-29 +28 +-7 +-14 +31 +-8 +-26 +35 +3 +-12 +44 +1 +-29 +25 +-6 +-26 +25 +-9 +-32 +26 +-11 +-29 +27 +-3 +-25 +27 +-9 +-24 +27 +-4 +-25 +30 +-6 +-17 +17 +27 +23 +31 +29 +13 +11 +8 +20 +9 +5 +3 +11 +8 +12 +14 +13 +-2 +4 +5 +0 +-4 +-4 +-2 +-4 +17 +2 +8 +-1 +-5 +-4 +-2 +-3 +0 +4 +0 +-4 +-1 +-1 +0 +2 +-3 +-4 +7 +8 +-1 +4 +6 +10 +16 +-1 +1 +4 +-5 +-3 +-6 +-6 +2 +-2 +-2 +-1 +12 +10 +-3 +-1 +-3 +-5 +11 +13 +1 +-9 +-2 +-3 +-5 +-4 +-2 +11 +7 +-4 +-5 +-1 +-1 +-2 +1 +-4 +4 +-5 +-2 +4 +0 +-5 +-1 +-1 +6 +-3 +1 +-4 +-1 +2 +-1 +-1 +2 +5 +-2 +-2 +9 +0 +1 +5 +6 +-3 +-1 +2 +5 +4 +-2 +7 +-3 +5 +-1 +3 +-1 +5 +-4 +-1 +-5 +8 +3 +-29 +5 +-30 +-48 +12 +-23 +-36 +21 +-14 +-36 +23 +-14 +-36 +29 +-4 +-29 +25 +-12 +-32 +28 +-7 +-29 +26 +-10 +-21 +32 +-7 +-27 +30 +-8 +-25 +32 +-6 +-27 +32 +-3 +-27 +31 +-5 +-18 +29 +-8 +-23 +31 +-8 +-28 +38 +-3 +-26 +30 +-6 +-27 +32 +-6 +-26 +31 +-8 +-21 +34 +-3 +-9 +32 +-5 +-29 +38 +-1 +-26 +27 +-11 +-27 +24 +-12 +-18 +29 +-9 +-23 +29 +-9 +-26 +35 +-5 +-22 +28 +-9 +-27 +32 +-7 +-27 +30 +-8 +-22 +32 +-7 +-23 +42 +0 +-11 +31 +-8 +-25 +28 +-3 +-18 +41 +3 +-22 +30 +-8 +-31 +26 +-10 +-22 +34 +-5 +-28 +25 +-12 +-26 +33 +-5 +-26 +33 +-8 +-27 +42 +0 +-21 +38 +-5 +-25 +23 +-13 +-32 +26 +-12 +-20 +28 +-4 +-28 +35 +-5 +-18 +29 +-6 +11 +22 +31 +17 +15 +12 +9 +14 +14 +10 +5 +6 +3 +10 +4 +1 +6 +11 +1 +2 +19 +3 +-2 +2 +-2 +-6 +5 +14 +2 +-6 +-4 +-2 +7 +15 +13 +-3 +-5 +-7 +-8 +-6 +4 +3 +2 +0 +-3 +-3 +1 +5 +-3 +-3 +4 +0 +0 +1 +3 +1 +-4 +0 +9 +-2 +15 +0 +-4 +-4 +-3 +0 +0 +1 +-5 +-2 +1 +20 +2 +-1 +-6 +0 +8 +-1 +-3 +3 +6 +-2 +-3 +2 +-4 +-7 +6 +-3 +1 +-1 +-6 +-1 +1 +1 +0 +-2 +-2 +0 +3 +1 +6 +2 +12 +5 +-1 +-2 +0 +-7 +13 +9 +5 +-2 +-5 +-1 +-1 +0 +-4 +2 +6 +1 +13 +5 +-8 +3 +-5 +-2 +-3 +3 +-32 +5 +-30 +-43 +12 +-24 +-43 +17 +-17 +-37 +36 +-4 +-32 +26 +-12 +-27 +28 +-9 +-24 +25 +-12 +-31 +28 +-3 +-24 +43 +0 +-27 +41 +-1 +-23 +25 +-13 +-21 +25 +-13 +-32 +29 +-11 +-24 +35 +-5 +-25 +36 +-4 +-27 +27 +-7 +-30 +33 +-8 +-26 +30 +-8 +-27 +44 +0 +-25 +31 +-8 +-27 +27 +-11 +-28 +36 +-5 +-28 +32 +-5 +-26 +33 +-4 +-28 +31 +-7 +-28 +37 +0 +-21 +32 +-1 +-18 +27 +-11 +-21 +31 +-7 +-29 +26 +-10 +-30 +34 +-5 +-20 +32 +-1 +-21 +29 +-10 +-24 +32 +-7 +-29 +27 +-7 +-26 +33 +-1 +-26 +36 +-6 +-26 +32 +-8 +-27 +33 +-5 +-27 +35 +0 +-26 +30 +-8 +-28 +34 +-4 +-15 +36 +-4 +-27 +29 +-8 +-14 +31 +-9 +-16 +38 +-3 +-23 +34 +-7 +-27 +25 +-12 +9 +20 +22 +16 +17 +14 +10 +12 +21 +13 +11 +9 +4 +-2 +14 +5 +-1 +5 +1 +-2 +0 +-1 +0 +-3 +13 +1 +1 +18 +1 +1 +-4 +-3 +5 +-1 +-5 +6 +1 +-2 +8 +-3 +-7 +0 +12 +9 +-2 +7 +-3 +-3 +0 +3 +-4 +-4 +3 +-4 +1 +-2 +-2 +4 +1 +5 +2 +-1 +-2 +12 +16 +5 +-7 +-6 +-5 +-2 +9 +13 +6 +-7 +-6 +-6 +-5 +-4 +-1 +7 +12 +1 +3 +1 +-4 +-4 +-6 +8 +0 +-3 +-5 +-3 +-6 +-3 +-2 +0 +14 +1 +10 +8 +-4 +9 +-3 +4 +6 +-4 +-3 +12 +-4 +-4 +-4 +-6 +-5 +12 +-2 +-1 +-6 +-5 +3 +-2 +7 +4 +9 +2 +12 +17 +-1 +-6 +-4 +-7 +-2 +-6 +-6 +1 +-3 +0 +10 +12 +7 +-5 +3 +2 +-7 +9 +4 +-5 +-1 +-8 +0 +-1 +2 +-2 +1 +-3 +0 +7 +13 +1 +-6 +-3 +-4 +2 +2 +1 +0 +1 +7 +-1 +2 +-5 +-7 +-1 +-6 +-5 +1 +2 +-4 +9 +13 +9 +-4 +-4 +-2 +-1 +6 +0 +-4 +13 +-3 +-1 +-7 +-2 +-7 +-5 +-2 +8 +6 +0 +-3 +-3 +5 +-1 +-4 +-2 +-4 +-2 +-4 +4 +-1 +1 +20 +3 +-2 +-3 +12 +4 +1 +1 +2 +-3 +2 +9 +7 +0 +9 +14 +-4 +-9 +-9 +-6 +2 +-2 +7 +-3 +-6 +11 +1 +-8 +-1 +6 +-5 +-1 +-6 +-5 +-3 +-7 +2 +2 +3 +-2 +11 +-1 +5 +-3 +-6 +2 +10 +-26 +-37 +17 +-20 +-42 +11 +-19 +-38 +27 +-13 +-28 +19 +-13 +-35 +23 +-14 +-30 +27 +-10 +-26 +27 +-11 +-27 +35 +-2 +-14 +33 +-8 +-26 +41 +-2 +-27 +30 +-7 +-26 +30 +-8 +-30 +42 +-1 +-25 +41 +1 +-28 +26 +-13 +-31 +31 +-7 +-26 +34 +0 +-24 +30 +-9 +-31 +26 +-7 +-22 +27 +-9 +-18 +32 +-7 +-14 +44 +2 +-24 +35 +-7 +-17 +25 +-9 +-32 +34 +-5 +-31 +32 +0 +-28 +26 +-11 +-22 +31 +-4 +-17 +30 +-6 +-19 +25 +-12 +-32 +36 +-5 +-28 +27 +-7 +-28 +28 +-8 +-26 +26 +-11 +-30 +31 +-8 +-27 +33 +-1 +-17 +33 +-8 +-26 +29 +-8 +-24 +33 +-8 +-27 +38 +-3 +-26 +33 +-6 +-20 +36 +-1 +-27 +26 +-10 +-25 +40 +-2 +-28 +29 +-10 +-25 +28 +-7 +-28 +30 +-4 +-24 +37 +-4 +-23 +40 +-3 +-25 +28 +-9 +-23 +30 +-3 +-27 +26 +-8 +-23 +37 +-2 +-23 +26 +-8 +-28 +30 +-6 +-21 +26 +-10 +-29 +28 +-5 +-25 +26 +-8 +-22 +29 +-9 +-16 +31 +-7 +-22 +37 +-4 +-19 +29 +-9 +-28 +29 +0 +-25 +29 +-9 +-23 +36 +-5 +-17 +29 +-4 +-27 +36 +-5 +-28 +35 +-5 +-27 +35 +-6 +-26 +45 +3 +-23 +32 +-7 +-30 +36 +-4 +-29 +30 +-9 +-25 +41 +3 +-22 +24 +-14 +-32 +26 +-10 +-28 +27 +-10 +-28 +30 +-7 +-27 +36 +0 +-25 +28 +-9 +-20 +49 +3 +-22 +42 +0 +-27 +30 +-8 +-31 +27 +-9 +-29 +30 +0 +-22 +29 +-6 +-12 +30 +-10 +-31 +27 +-6 +-11 +31 +-2 +-21 +38 +-3 +-22 +26 +-13 +-28 +33 +-6 +-30 +31 +-9 +-26 +30 +-9 +-27 +39 +-4 +-27 +31 +30 +19 +26 +20 +27 +22 +8 +8 +11 +2 +2 +7 +5 +15 +8 +-1 +-5 +-3 +1 +2 +2 +-3 +-2 +2 +0 +0 +-5 +6 +7 +3 +3 +-4 +-2 +0 +-1 +0 +11 +8 +-2 +7 +0 +-4 +9 +12 +-4 +-4 +-7 +-5 +0 +4 +1 +-6 +-6 +3 +3 +-2 +1 +-2 +-3 +2 +-2 +-2 +10 +2 +-2 +0 +0 +-4 +13 +16 +0 +-4 +1 +-5 +-4 +10 +-2 +-5 +0 +-4 +1 +3 +-4 +2 +-2 +-5 +4 +0 +1 +-1 +2 +-1 +1 +-2 +-1 +1 +5 +3 +11 +1 +-2 +2 +-1 +-4 +-3 +-5 +-4 +9 +5 +1 +-2 +9 +-1 +1 +-1 +-2 +-3 +-3 +1 +6 +0 +-2 +-2 +-1 +0 +-1 +-5 +8 +-27 +-48 +10 +-18 +-40 +31 +-10 +-35 +22 +-17 +-37 +20 +-16 +-31 +28 +-11 +-29 +45 +2 +-24 +28 +-8 +-31 +29 +-4 +-28 +36 +0 +-26 +24 +-8 +-20 +29 +-10 +-21 +31 +-2 +-28 +37 +-4 +-27 +25 +-10 +-31 +33 +-7 +-18 +31 +-5 +-29 +42 +1 +-26 +29 +-10 +-28 +34 +-5 +-29 +27 +-9 +-27 +27 +-9 +-29 +34 +-2 +-21 +42 +-1 +-25 +32 +-4 +-30 +25 +-12 +-30 +40 +-1 +-25 +28 +-6 +-25 +28 +-7 +-30 +30 +-7 +-28 +29 +-2 +-19 +39 +-3 +-27 +27 +-10 +-30 +32 +-4 +-21 +40 +-2 +-23 +39 +-3 +-12 +29 +-9 +-30 +27 +-8 +-29 +37 +0 +-20 +29 +-7 +-27 +25 +-12 +-28 +40 +-3 +-27 +30 +-9 +-30 +30 +-9 +-28 +30 +1 +-20 +31 +-8 +-28 +48 +4 +-25 +48 +3 +-26 +14 +19 +17 +22 +14 +8 +9 +8 +8 +15 +10 +4 +11 +21 +3 +9 +18 +9 +3 +14 +-1 +-1 +-6 +5 +11 +13 +1 +2 +-1 +-9 +-6 +-7 +-2 +-5 +0 +-3 +-5 +16 +0 +-5 +-5 +-5 +-5 +0 +5 +-2 +-4 +-3 +12 +1 +-4 +7 +-3 +-1 +0 +8 +-4 +-3 +0 +0 +-2 +1 +-6 +0 +0 +0 +11 +0 +-1 +-2 +-1 +4 +3 +-1 +4 +6 +-3 +-3 +-3 +3 +5 +-4 +-3 +-1 +-3 +7 +5 +-2 +-4 +-3 +0 +-1 +1 +5 +10 +-2 +-3 +-1 +1 +-1 +10 +5 +-1 +-2 +2 +2 +2 +-5 +-5 +-4 +3 +1 +-2 +-4 +9 +4 +-2 +9 +8 +-3 +9 +9 +-1 +-2 +3 +16 +-1 +-7 +6 +-28 +-50 +5 +-29 +-33 +20 +-15 +-28 +22 +-15 +-37 +20 +-13 +-32 +25 +-14 +-33 +24 +-12 +-32 +33 +-7 +-24 +27 +-10 +-23 +27 +-8 +-28 +31 +-7 +-28 +33 +-7 +-25 +34 +-4 +-19 +32 +-8 +-27 +40 +-2 +-26 +28 +-9 +-21 +32 +-8 +-27 +32 +-2 +-26 +36 +-4 +-11 +31 +-8 +-23 +29 +-9 +-28 +25 +-12 +-29 +28 +-6 +-27 +33 +-6 +-25 +29 +-5 +-27 +40 +-1 +-22 +29 +-7 +-27 +30 +-9 +-23 +29 +-9 +-26 +41 +-2 +-21 +32 +-5 +-28 +42 +3 +-24 +28 +-8 +-30 +28 +-9 +-26 +43 +1 +-14 +47 +2 +-27 +22 +-12 +-25 +32 +-9 +-27 +29 +-10 +-30 +30 +-6 +-27 +29 +-7 +-29 +45 +2 +-24 +30 +-7 +-25 +31 +-3 +-27 +31 +-8 +-30 +36 +-5 +-20 +32 +-8 +-16 +29 +-11 +-23 +14 +29 +31 +28 +23 +18 +9 +10 +4 +6 +2 +6 +1 +8 +1 +7 +10 +4 +1 +12 +0 +6 +1 +-4 +-3 +6 +-1 +11 +3 +3 +1 +-4 +1 +-4 +10 +9 +-3 +-7 +0 +-1 +1 +10 +3 +0 +-5 +-4 +-2 +14 +0 +0 +-7 +-1 +-4 +-4 +2 +-2 +-1 +-3 +-3 +13 +16 +11 +-4 +-6 +-5 +-3 +-6 +-3 +11 +20 +-1 +-4 +3 +-2 +-5 +-4 +-6 +-3 +-4 +-3 +2 +-1 +-4 +4 +-1 +3 +5 +14 +3 +-4 +-3 +-3 +-4 +-5 +-2 +0 +7 +15 +0 +0 +4 +-3 +-3 +1 +4 +-5 +-1 +-3 +-6 +1 +-3 +7 +4 +0 +-4 +2 +-1 +6 +-1 +-3 +4 +10 +0 +-2 +-2 +-2 +11 +4 +-31 +9 +-25 +-45 +14 +-18 +-40 +20 +-19 +-31 +18 +-12 +-31 +21 +-15 +-34 +25 +-2 +-21 +25 +-13 +-32 +31 +-2 +-15 +31 +-9 +-21 +34 +-5 +-28 +30 +-9 +-17 +41 +4 +-25 +26 +-11 +-28 +46 +2 +-21 +40 +-3 +-26 +28 +-12 +-34 +24 +-13 +-27 +23 +-13 +-31 +26 +-2 +-22 +24 +-10 +-23 +32 +-7 +-14 +47 +3 +-26 +27 +-10 +-20 +35 +-6 +-29 +41 +-1 +-28 +30 +-8 +-31 +42 +-1 +-12 +28 +-11 +-32 +24 +-11 +-28 +31 +-9 +-31 +27 +-10 +-19 +26 +-10 +-9 +33 +-6 +-22 +25 +-12 +-31 +44 +3 +-24 +29 +-2 +-28 +36 +-6 +-28 +38 +3 +-24 +26 +-8 +-30 +26 +0 +-28 +37 +-5 +-29 +28 +-10 +-29 +29 +-9 +-27 +25 +-11 +-28 +32 +-6 +-20 +38 +-3 +-27 +33 +-2 +-26 +33 +-5 +17 +21 +19 +24 +26 +18 +25 +11 +4 +6 +4 +7 +2 +6 +2 +2 +6 +5 +8 +0 +0 +2 +0 +4 +-1 +2 +-2 +5 +4 +0 +-2 +13 +2 +-4 +17 +1 +6 +-5 +-6 +-4 +9 +6 +-3 +4 +2 +-5 +-2 +-5 +-4 +-3 +-1 +14 +7 +-4 +-4 +0 +12 +10 +-5 +-2 +-6 +5 +11 +0 +-6 +-5 +10 +-1 +-5 +3 +-3 +1 +-4 +-1 +-5 +2 +-5 +-6 +2 +6 +4 +-4 +-5 +0 +-3 +-2 +-1 +1 +-2 +-2 +5 +13 +6 +-2 +-3 +0 +0 +-2 +-2 +7 +-2 +-3 +0 +16 +0 +-1 +10 +-1 +-5 +-3 +-4 +3 +-1 +6 +-2 +3 +1 +-2 +-3 +-3 +6 +12 +-2 +4 +-1 +5 +2 +-2 +9 +-22 +-47 +6 +-24 +-45 +11 +-22 +-34 +28 +-12 +-31 +20 +-16 +-31 +34 +-7 +-31 +41 +4 +-26 +23 +-14 +-27 +27 +-11 +-31 +28 +-8 +-22 +27 +-5 +-21 +33 +-7 +-28 +29 +-2 +-18 +27 +-11 +-30 +29 +-7 +-22 +30 +-9 +-27 +30 +-4 +-11 +48 +4 +-23 +34 +-5 +-31 +24 +-10 +-27 +45 +6 +-24 +29 +-10 +-17 +37 +-4 +-27 +30 +-10 +-31 +25 +-11 +-30 +38 +1 +-25 +32 +-7 +-30 +27 +-11 +-30 +34 +-5 +-26 +34 +-6 +-25 +35 +-5 +-29 +34 +-2 +-25 +27 +-10 +-19 +28 +-9 +-29 +35 +-6 +-25 +44 +1 +-18 +33 +-7 +-30 +29 +-9 +-30 +26 +-11 +-29 +26 +-10 +-18 +45 +4 +-23 +31 +-8 +-16 +43 +2 +-27 +29 +-9 +-22 +41 +-2 +-19 +29 +-9 +-31 +23 +-14 +-31 +30 +-4 +-18 +20 +34 +23 +15 +22 +15 +10 +15 +21 +23 +5 +2 +4 +1 +2 +0 +9 +-2 +3 +-1 +-2 +6 +0 +-1 +2 +-2 +-1 +-3 +-3 +-1 +2 +-4 +1 +4 +0 +-1 +10 +4 +6 +6 +-3 +-3 +13 +15 +-2 +7 +-5 +-1 +-5 +10 +-1 +-5 +-5 +-2 +-4 +4 +-2 +0 +-4 +-5 +-2 +2 +3 +-2 +8 +-2 +4 +-3 +4 +1 +1 +-3 +-3 +8 +-2 +1 +-3 +8 +0 +9 +5 +-4 +4 +-4 +1 +4 +-7 +-6 +-5 +1 +7 +-2 +-4 +-2 +3 +-1 +3 +-1 +-2 +-2 +7 +8 +6 +13 +2 +1 +-4 +2 +-3 +2 +-5 +5 +3 +-1 +-2 +-1 +-1 +9 +-3 +5 +6 +-4 +0 +-3 +-3 +11 +-4 +-4 +-1 +-3 +-4 +9 +-2 +0 +-5 +-5 +-4 +2 +-2 +-2 +-4 +-1 +4 +20 +1 +-4 +7 +-2 +5 +2 +3 +1 +-2 +9 +-3 +1 +9 +0 +-3 +-2 +2 +-4 +-2 +6 +2 +-5 +-3 +-2 +-2 +-2 +1 +12 +6 +14 +3 +7 +5 +1 +-6 +-5 +-5 +6 +8 +12 +5 +-3 +-5 +-3 +11 +-2 +-5 +10 +-1 +-8 +-2 +-1 +2 +-2 +-7 +-5 +2 +13 +8 +-5 +-3 +-6 +-5 +3 +-3 +-2 +-5 +-3 +-4 +1 +14 +3 +3 +-4 +2 +1 +1 +-4 +-3 +0 +-2 +4 +-3 +-1 +5 +20 +0 +1 +2 +4 +5 +1 +-6 +-6 +7 +-1 +14 +-2 +-9 +-3 +5 +0 +-4 +-6 +13 +-1 +-3 +2 +-2 +-4 +4 +10 +-26 +6 +-26 +-46 +6 +-25 +-44 +19 +-18 +-38 +19 +-15 +-19 +27 +-13 +-27 +29 +-10 +-21 +30 +-10 +-19 +41 +1 +-15 +32 +-5 +-17 +33 +-5 +-24 +21 +-16 +-32 +26 +-8 +-30 +25 +-9 +-26 +43 +0 +-23 +28 +-2 +-20 +28 +-8 +-18 +30 +-10 +-31 +24 +-4 +-26 +30 +1 +-23 +39 +-1 +-24 +30 +-8 +-27 +35 +-6 +-29 +33 +-8 +-31 +32 +0 +-27 +32 +-6 +-28 +26 +-1 +-25 +34 +-7 +-25 +35 +-6 +-25 +33 +-8 +-26 +38 +-4 +-27 +31 +1 +-25 +34 +-6 +-29 +25 +-11 +-17 +28 +-10 +-17 +27 +-11 +-21 +33 +-7 +-30 +29 +-5 +-25 +37 +-4 +-29 +30 +-9 +-30 +40 +-2 +-26 +27 +-12 +-28 +40 +-2 +-28 +28 +-11 +-27 +28 +-8 +-28 +31 +-6 +-26 +33 +5 +-21 +40 +-3 +-18 +31 +-6 +-23 +26 +-12 +-31 +43 +1 +-20 +30 +-5 +-29 +27 +-10 +-26 +32 +-6 +-22 +29 +-8 +-29 +26 +1 +-23 +30 +-6 +-27 +28 +-10 +-27 +34 +-3 +-20 +30 +-8 +-25 +28 +-6 +-27 +30 +-8 +-26 +47 +3 +-23 +42 +1 +-25 +26 +-7 +-28 +35 +-5 +-14 +45 +1 +-27 +33 +-8 +-31 +34 +-5 +-25 +27 +-9 +-28 +37 +2 +-24 +26 +-12 +-16 +27 +-11 +-18 +37 +-4 +-26 +34 +-6 +-29 +23 +-11 +-25 +27 +-8 +-28 +27 +-10 +-27 +28 +-9 +-26 +28 +2 +-23 +48 +3 +-22 +27 +-10 +-25 +38 +1 +-27 +30 +-7 +-30 +26 +-3 +-18 +26 +-9 +-25 +41 +-2 +-12 +29 +-11 +-18 +44 +0 +-25 +22 +-14 +-24 +27 +-12 +-30 +25 +-9 +-26 +29 +-10 +-30 +35 +-6 +-24 +30 +-7 +-30 +28 +-4 +-27 +28 +-10 +30 +26 +32 +26 +16 +10 +6 +17 +14 +15 +3 +4 +5 +6 +1 +0 +0 +1 +-1 +3 +4 +0 +4 +0 +3 +2 +5 +13 +18 +1 +5 +-2 +-6 +-3 +2 +18 +-1 +-3 +-7 +-8 +1 +3 +-2 +-1 +1 +-3 +-3 +-3 +-3 +7 +-2 +7 +-2 +-4 +-2 +2 +-5 +2 +2 +1 +-1 +18 +2 +10 +-3 +10 +6 +-5 +3 +-4 +1 +11 +5 +2 +-7 +-7 +-5 +-2 +-4 +2 +-3 +-3 +2 +0 +8 +-1 +2 +-4 +-3 +8 +7 +2 +9 +-1 +2 +5 +-3 +1 +-7 +4 +-3 +-6 +-6 +3 +-3 +1 +14 +-1 +-5 +-2 +1 +-6 +-3 +-1 +-2 +1 +3 +10 +12 +-2 +0 +-5 +-2 +-5 +-6 +0 +13 +11 +11 +-25 +-49 +14 +-23 +-32 +24 +-15 +-37 +18 +-19 +-35 +17 +-16 +-32 +32 +-6 +-29 +21 +-7 +-22 +26 +-13 +-29 +28 +-8 +-30 +28 +-9 +-11 +31 +-7 +-12 +29 +-10 +-30 +28 +-10 +-29 +40 +-3 +-25 +28 +-9 +-29 +29 +-6 +-25 +40 +1 +-25 +30 +-10 +-26 +27 +-10 +-29 +29 +-8 +-26 +28 +-8 +-27 +36 +-5 +-20 +35 +-5 +-26 +39 +-2 +-23 +35 +-1 +-15 +34 +-5 +-24 +34 +-7 +-30 +31 +-1 +-15 +28 +-11 +-26 +29 +-10 +-30 +34 +-5 +-26 +30 +-7 +-25 +32 +-5 +-25 +40 +5 +-24 +28 +-9 +-30 +27 +-9 +-28 +48 +3 +-24 +29 +-9 +-27 +31 +-7 +-30 +26 +-11 +-30 +28 +-8 +-25 +27 +-5 +-27 +39 +-2 +-25 +27 +-11 +-24 +40 +5 +-21 +37 +-3 +-25 +26 +-6 +-29 +26 +-8 +-24 +20 +30 +27 +27 +32 +16 +9 +15 +9 +6 +4 +5 +5 +15 +7 +6 +10 +-1 +-1 +-2 +5 +4 +10 +0 +10 +2 +2 +-3 +-6 +-4 +-2 +1 +2 +-1 +3 +1 +-1 +-1 +-3 +16 +2 +2 +0 +3 +3 +-4 +-2 +12 +-1 +0 +-4 +12 +-2 +-2 +-7 +0 +-1 +-6 +0 +14 +6 +3 +-3 +4 +2 +8 +-5 +-2 +-6 +-4 +-2 +1 +-4 +-2 +-2 +4 +-4 +0 +-3 +-3 +1 +2 +2 +-1 +6 +2 +-2 +0 +2 +0 +-2 +-2 +-1 +6 +9 +1 +1 +-1 +6 +15 +0 +-3 +-3 +-5 +-5 +-2 +1 +4 +-2 +14 +12 +7 +-4 +7 +5 +-4 +-5 +2 +0 +15 +-2 +-5 +1 +-1 +-2 +-6 +3 +0 +9 +-28 +-47 +12 +-24 +-46 +15 +-21 +-42 +18 +-19 +-35 +37 +-5 +-31 +25 +-7 +-26 +23 +-11 +-16 +29 +-9 +-30 +29 +-3 +-23 +31 +-9 +-29 +37 +-5 +-29 +29 +-10 +-29 +28 +-7 +-15 +33 +-7 +-22 +30 +-6 +-16 +37 +-5 +-26 +26 +-12 +-28 +36 +-3 +-10 +29 +-9 +-32 +42 +1 +-17 +32 +-7 +-32 +25 +-5 +-30 +39 +-3 +-26 +31 +-9 +-17 +37 +-5 +-30 +27 +-6 +-30 +28 +-10 +-26 +32 +-3 +-27 +26 +-9 +-21 +33 +-6 +-18 +32 +-7 +-30 +32 +-3 +-11 +29 +-10 +-27 +25 +-12 +-25 +24 +-10 +-26 +33 +-7 +-11 +34 +-6 +-27 +38 +3 +-23 +28 +-8 +-28 +27 +-11 +-27 +33 +-6 +-26 +37 +-3 +-27 +36 +-4 +-28 +29 +-10 +-27 +29 +-9 +-26 +33 +-2 +-25 +27 +-8 +-22 +31 +-2 +-15 +30 +22 +20 +33 +22 +13 +18 +7 +6 +19 +10 +5 +7 +12 +14 +10 +3 +-1 +-2 +-4 +9 +0 +-5 +-3 +3 +1 +1 +15 +-1 +2 +-2 +15 +-1 +0 +-4 +1 +5 +-1 +1 +-6 +1 +-5 +-6 +0 +0 +-2 +-5 +6 +13 +1 +0 +3 +-4 +-3 +-3 +-4 +0 +-3 +-3 +-4 +-2 +3 +15 +13 +-2 +-4 +-3 +-3 +-4 +12 +-1 +0 +1 +0 +-2 +-4 +-5 +4 +-4 +-2 +2 +9 +-1 +5 +1 +-3 +-2 +-2 +11 +5 +-4 +5 +5 +7 +2 +0 +-2 +3 +-2 +-2 +-1 +-5 +-3 +2 +9 +-3 +-1 +-1 +-3 +-2 +1 +13 +10 +-4 +-4 +-2 +6 +0 +9 +1 +-1 +2 +-6 +9 +-5 +-4 +0 +14 +-24 +9 +-27 +-42 +11 +-24 +-42 +13 +-22 +-37 +26 +-13 +-32 +34 +-8 +-31 +27 +-12 +-24 +34 +-8 +-28 +24 +-11 +-26 +24 +-11 +-30 +39 +1 +-26 +27 +-8 +-15 +27 +-11 +-27 +28 +-11 +-24 +42 +0 +-27 +30 +-8 +-26 +27 +-10 +-21 +30 +-10 +-15 +41 +-1 +-23 +30 +-8 +-31 +37 +1 +-27 +28 +-11 +-26 +30 +-7 +-28 +28 +-3 +-12 +45 +2 +-25 +27 +-9 +-32 +31 +-9 +-28 +30 +2 +-25 +29 +-10 +-31 +31 +-6 +-13 +28 +-10 +-28 +48 +3 +-26 +25 +-12 +-31 +40 +-1 +-15 +26 +-9 +-27 +37 +-2 +-22 +23 +-7 +-23 +27 +-11 +-29 +29 +-9 +-30 +29 +-10 +-25 +28 +-10 +-16 +44 +0 +-18 +30 +-5 +-17 +28 +-9 +-31 +26 +-10 +-24 +33 +-8 +-27 +29 +-9 +-23 +33 +-8 +-26 +34 +-6 +11 +21 +23 +17 +16 +20 +22 +10 +7 +7 +11 +6 +10 +7 +6 +2 +11 +0 +3 +3 +5 +-1 +8 +1 +-1 +4 +0 +12 +5 +5 +1 +-5 +-3 +5 +0 +-1 +7 +10 +13 +-4 +-8 +-6 +-5 +-5 +-3 +1 +1 +2 +-4 +-1 +-4 +-2 +-4 +-2 +0 +-3 +5 +3 +0 +-3 +-4 +0 +4 +-2 +5 +8 +1 +-2 +-4 +7 +-2 +-3 +5 +1 +-3 +1 +10 +9 +0 +-2 +-4 +8 +-1 +2 +-2 +-3 +-5 +8 +5 +4 +5 +-5 +9 +7 +-4 +14 +-2 +-1 +-5 +2 +-4 +-3 +-7 +2 +-1 +16 +-1 +-1 +-5 +-4 +-2 +-7 +-3 +3 +0 +11 +14 +11 +-5 +-4 +-5 +1 +-7 +-3 +-4 +-3 +-3 +2 +-1 +-2 +-3 +-1 +-4 +0 +7 +-2 +9 +0 +-1 +-1 +10 +2 +-2 +-1 +-4 +1 +13 +3 +-3 +-4 +-6 +-2 +8 +-1 +2 +-3 +-3 +1 +14 +-1 +-4 +3 +13 +4 +4 +14 +8 +-3 +6 +10 +-3 +-6 +-3 +0 +-5 +-3 +-1 +-3 +9 +7 +-6 +4 +-1 +-1 +-3 +-6 +-4 +-5 +3 +0 +-4 +-1 +-1 +-2 +-5 +6 +-2 +15 +-1 +-3 +2 +0 +8 +9 +-2 +6 +0 +-4 +-6 +-3 +-3 +3 +-4 +-1 +-4 +5 +9 +8 +17 +-1 +1 +-3 +-6 +1 +-4 +-5 +0 +-4 +-2 +-2 +-3 +3 +0 +0 +5 +1 +-2 +0 +12 +-2 +-3 +-1 +11 +10 +4 +0 +-5 +-7 +-4 +-7 +-1 +3 +14 +5 +-2 +-1 +20 +-19 +-46 +16 +-23 +-43 +10 +-23 +-30 +24 +-12 +-26 +18 +-18 +-34 +21 +-7 +-29 +27 +-9 +-32 +27 +-10 +-28 +32 +-7 +-27 +27 +-7 +-27 +32 +1 +-26 +31 +-3 +-28 +34 +-6 +-30 +26 +-6 +-28 +30 +-7 +-23 +32 +-7 +-22 +35 +-4 +-26 +31 +-8 +-28 +28 +-10 +-26 +30 +-8 +-24 +36 +2 +-25 +30 +-8 +-16 +42 +2 +-25 +28 +-9 +-19 +33 +-5 +-27 +35 +-6 +-28 +26 +-11 +-30 +37 +-5 +-18 +29 +-8 +-30 +29 +-3 +-21 +28 +-10 +-27 +35 +-4 +-26 +32 +-2 +-12 +38 +-3 +-24 +43 +0 +-28 +30 +-10 +-30 +27 +-11 +-29 +43 +-1 +-13 +32 +-8 +-22 +25 +-12 +-29 +31 +-7 +-28 +30 +-9 +-29 +31 +6 +-23 +30 +-10 +-30 +30 +-6 +-15 +34 +-4 +-26 +29 +-7 +-30 +32 +-6 +-28 +19 +28 +27 +33 +19 +13 +16 +11 +24 +10 +6 +5 +6 +14 +21 +3 +16 +0 +4 +-4 +-3 +-2 +-2 +-2 +6 +-3 +-6 +2 +-1 +1 +-2 +-2 +-3 +1 +2 +-1 +-3 +2 +0 +-1 +4 +0 +-1 +15 +0 +-1 +2 +-5 +-4 +16 +1 +-2 +-4 +12 +-1 +-4 +-2 +-5 +5 +5 +-3 +-2 +-1 +-3 +-4 +-1 +0 +12 +16 +-2 +4 +-1 +3 +0 +0 +6 +-5 +-4 +-5 +-4 +-3 +-4 +4 +-1 +-2 +-2 +-1 +0 +-2 +3 +12 +0 +0 +1 +13 +9 +-3 +-4 +-6 +-2 +0 +-5 +-1 +4 +6 +-3 +-3 +7 +0 +-4 +-3 +-2 +-2 +2 +-5 +-3 +1 +0 +4 +0 +0 +1 +-2 +0 +2 +-2 +4 +1 +16 +-21 +-40 +14 +-23 +-43 +23 +-9 +-26 +32 +-9 +-30 +17 +-18 +-38 +20 +-15 +-31 +26 +-4 +-22 +25 +-8 +-30 +46 +2 +-25 +38 +-4 +-28 +24 +-12 +-22 +38 +-3 +-30 +27 +-9 +-30 +37 +-2 +-18 +26 +-12 +-31 +26 +-10 +-31 +27 +-6 +-29 +47 +2 +-25 +39 +-3 +-28 +26 +-8 +-20 +41 +-2 +-27 +29 +-10 +-24 +31 +-7 +-29 +36 +-6 +-29 +26 +-11 +-22 +27 +-11 +-30 +28 +-6 +-28 +33 +4 +-23 +29 +-9 +-29 +30 +-5 +-18 +41 +-1 +-19 +35 +-5 +-29 +27 +-10 +-29 +28 +-10 +-27 +36 +-4 +-16 +41 +-2 +-24 +28 +-9 +-29 +41 +-2 +-24 +28 +-10 +-32 +28 +-10 +-26 +30 +-2 +-19 +34 +-6 +-29 +32 +-7 +-27 +42 +2 +-24 +27 +-10 +-12 +30 +-8 +-29 +37 +-4 +-28 +30 +-10 +-30 +14 +19 +28 +23 +22 +18 +16 +9 +12 +19 +6 +3 +2 +16 +7 +-2 +1 +2 +1 +2 +2 +14 +12 +-1 +-2 +2 +3 +2 +4 +6 +-4 +-3 +-6 +5 +6 +2 +-5 +6 +-4 +-2 +-3 +3 +6 +-2 +-2 +-1 +6 +-3 +-4 +6 +-2 +8 +3 +-4 +0 +5 +-4 +2 +2 +-3 +-4 +-4 +1 +-3 +2 +-5 +0 +-1 +-4 +6 +-1 +9 +13 +8 +1 +1 +-6 +-4 +10 +16 +8 +-5 +2 +-2 +0 +8 +-2 +-6 +-5 +-4 +-2 +5 +-1 +-2 +-4 +-3 +2 +-3 +3 +0 +-3 +6 +-3 +-2 +-2 +2 +9 +5 +3 +-3 +0 +-1 +-3 +-1 +-1 +-3 +-4 +-2 +3 +11 +11 +-2 +4 +7 +2 +-4 +-9 +-6 +30 +-12 +-42 +4 +-31 +-48 +10 +-21 +-36 +25 +-13 +-32 +25 +-10 +-29 +23 +-15 +-34 +26 +-5 +-30 +26 +-11 +-26 +28 +-10 +-28 +39 +-3 +-25 +26 +-11 +-23 +29 +-7 +-27 +39 +2 +-13 +34 +-7 +-29 +25 +-2 +-19 +29 +-8 +-27 +24 +-11 +-23 +33 +-7 +-27 +29 +-4 +-18 +47 +4 +-25 +30 +-5 +-18 +25 +-12 +-30 +30 +-5 +-30 +29 +-5 +-27 +35 +-5 +-24 +29 +-8 +-15 +28 +-1 +-27 +34 +2 +-24 +35 +-6 +-27 +26 +-12 +-30 +34 +-4 +-23 +32 +-9 +-27 +33 +-6 +-28 +32 +-5 +-25 +32 +2 +-25 +29 +-10 +-26 +35 +-6 +-21 +32 +-8 +-29 +31 +-7 +-30 +34 +-6 +-14 +41 +-1 +-27 +32 +-9 +-23 +35 +-5 +-15 +28 +-9 +-28 +24 +-11 +-32 +28 +-4 +-26 +27 +-9 +-26 +28 +-10 +-15 +48 +4 +-21 +46 +2 +-27 +28 +-11 +-28 +29 +-9 +-28 +25 +-8 +-26 +40 +-3 +-25 +25 +-2 +-27 +27 +-11 +-31 +29 +-7 +-26 +26 +-11 +-29 +30 +-7 +-20 +29 +-9 +-11 +34 +-6 +-25 +30 +-7 +-14 +35 +-5 +-28 +29 +-9 +-20 +28 +-9 +-19 +28 +-9 +-28 +27 +-8 +-20 +45 +0 +-21 +36 +-5 +-23 +32 +-6 +-29 +26 +-11 +-29 +33 +-8 +-25 +36 +-3 +-21 +40 +-2 +-27 +42 +0 +-28 +26 +-12 +-25 +34 +-6 +-28 +41 +-2 +-20 +26 +-11 +-32 +36 +-6 +-29 +30 +-9 +-29 +29 +-10 +-10 +31 +-9 +-29 +28 +-9 +-27 +37 +5 +-24 +30 +-10 +-30 +39 +-3 +-24 +41 +-2 +-29 +25 +-10 +-30 +27 +-10 +-23 +35 +-3 +-27 +27 +-5 +-28 +31 +-8 +-28 +27 +-10 +-26 +29 +-8 +-28 +33 +-6 +-22 +21 +24 +38 +26 +21 +19 +16 +14 +21 +8 +2 +3 +5 +6 +5 +3 +6 +6 +3 +-1 +1 +11 +0 +2 +-3 +3 +13 +1 +-3 +-1 +7 +4 +-2 +12 +7 +-1 +-5 +0 +-4 +-1 +-4 +6 +15 +11 +-4 +7 +-1 +-6 +-6 +-6 +-7 +-5 +-3 +5 +0 +-3 +4 +2 +-3 +-2 +-4 +-2 +1 +-2 +3 +1 +4 +-3 +0 +4 +2 +3 +2 +-2 +-1 +-2 +0 +2 +-1 +-1 +7 +3 +3 +4 +-1 +13 +9 +2 +-8 +-7 +2 +0 +-5 +-2 +1 +7 +6 +-2 +1 +-3 +0 +-5 +1 +2 +-3 +-1 +1 +-3 +-1 +7 +-4 +4 +14 +11 +-1 +-6 +-6 +-1 +11 +0 +-1 +-1 +3 +10 +9 +3 +-3 +-4 +3 +-1 +-4 +-4 +-7 +3 +10 +-1 +13 +13 +0 +-7 +-5 +-4 +-6 +-2 +-6 +-4 +-3 +-3 +2 +13 +2 +-2 +1 +-4 +5 +0 +-6 +-1 +-1 +-1 +-3 +-2 +-2 +1 +0 +0 +0 +0 +1 +-1 +-2 +5 +1 +17 +1 +0 +7 +-2 +4 +-2 +-6 +-6 +-4 +-3 +1 +-2 +0 +16 +11 +1 +-4 +6 +-2 +-4 +6 +0 +-4 +1 +-1 +0 +4 +7 +-2 +0 +-4 +18 +1 +14 +-2 +2 +-1 +-7 +-5 +-4 +16 +0 +-5 +-5 +-7 +-2 +-1 +4 +3 +3 +-1 +12 +9 +6 +8 +17 +-2 +-8 +6 +5 +-5 +-2 +-8 +-5 +8 +0 +-6 +-7 +-3 +0 +-4 +11 +19 +0 +-5 +1 +6 +5 +-2 +-4 +-3 +-7 +11 +-26 +-51 +3 +-29 +-46 +11 +-21 +-34 +19 +-17 +-23 +32 +-3 +-29 +26 +-12 +-30 +23 +-10 +-28 +32 +-8 +-23 +32 +-4 +-28 +41 +-3 +-28 +26 +-12 +-32 +26 +-10 +-28 +26 +-11 +-19 +35 +-7 +-24 +30 +-7 +-28 +35 +-4 +-24 +30 +-7 +-28 +32 +-6 +-19 +28 +-8 +-26 +29 +-9 +-26 +29 +-6 +-28 +32 +-4 +-13 +35 +5 +-23 +30 +-7 +-22 +27 +-10 +-29 +44 +7 +-22 +32 +-7 +-29 +29 +-4 +-27 +30 +-9 +-25 +39 +-4 +-28 +41 +-2 +-27 +35 +-6 +-27 +36 +-5 +-27 +26 +-11 +-30 +35 +-5 +-21 +35 +-2 +-26 +33 +-4 +-27 +43 +5 +-24 +27 +-7 +-33 +30 +-2 +-28 +29 +-7 +-31 +27 +-4 +-26 +46 +2 +-15 +27 +-13 +-32 +24 +-13 +-29 +26 +-8 +-28 +29 +-9 +-27 +32 +-7 +-26 +22 +25 +24 +26 +22 +14 +13 +10 +23 +16 +6 +15 +8 +5 +0 +2 +2 +1 +0 +1 +2 +1 +-1 +4 +15 +22 +4 +1 +6 +-3 +-1 +5 +-1 +4 +-2 +-7 +-5 +-3 +0 +9 +7 +-1 +16 +0 +1 +2 +-1 +-5 +-1 +-1 +-1 +-1 +2 +2 +-4 +-2 +-1 +13 +8 +-5 +9 +16 +-3 +-6 +-6 +13 +12 +0 +-7 +0 +-8 +-3 +-6 +0 +-6 +-4 +2 +8 +-1 +-2 +-7 +3 +1 +-4 +-4 +-2 +-3 +-3 +11 +2 +-1 +14 +9 +13 +-4 +-5 +-6 +0 +-5 +-3 +-3 +0 +8 +11 +-3 +-4 +14 +-2 +-6 +-6 +-3 +11 +7 +5 +1 +7 +-6 +-8 +11 +-1 +0 +-1 +-6 +1 +-3 +0 +11 +1 +8 +-26 +-50 +5 +-29 +-36 +12 +-23 +-41 +39 +-5 +-32 +17 +-11 +-33 +21 +-15 +-33 +39 +-3 +-21 +24 +-14 +-32 +29 +-9 +-22 +28 +-10 +-26 +30 +-8 +-29 +32 +-2 +-26 +31 +-8 +-23 +32 +-8 +-26 +34 +-4 +-28 +27 +-7 +-28 +33 +-3 +-26 +32 +-7 +-18 +39 +-2 +-19 +28 +-10 +-27 +40 +-1 +-28 +45 +1 +-26 +40 +-1 +-18 +31 +-8 +-21 +36 +-5 +-30 +25 +-13 +-31 +25 +-9 +-22 +42 +-1 +-28 +35 +0 +-28 +29 +-7 +-16 +44 +0 +-25 +30 +-5 +-25 +20 +-16 +-26 +24 +-14 +-30 +41 +2 +-15 +29 +-11 +-32 +25 +-12 +-31 +40 +1 +-25 +26 +-11 +-28 +26 +-11 +-30 +37 +-2 +-18 +36 +-4 +-29 +33 +-7 +-28 +29 +-9 +-27 +44 +2 +-26 +40 +-3 +-25 +26 +-11 +-14 +30 +-9 +-30 +19 +34 +19 +23 +14 +27 +22 +9 +18 +6 +2 +13 +8 +0 +13 +14 +1 +12 +1 +-5 +-6 +4 +-3 +1 +-4 +-5 +-4 +3 +-2 +-2 +0 +-2 +17 +2 +-3 +-7 +-2 +0 +5 +12 +1 +-2 +-1 +-5 +-4 +-3 +-1 +-1 +-1 +0 +13 +-1 +2 +-1 +15 +8 +-5 +6 +1 +-3 +-2 +12 +1 +-4 +-1 +-2 +2 +-3 +11 +8 +-5 +-3 +-5 +1 +-6 +-4 +-4 +-4 +-3 +7 +13 +-1 +4 +10 +-4 +1 +-4 +3 +7 +0 +11 +4 +-6 +-6 +-2 +-4 +-3 +9 +-4 +0 +10 +11 +-3 +-2 +-8 +-2 +0 +1 +6 +1 +-2 +6 +5 +0 +-8 +-8 +-7 +1 +-5 +-3 +13 +3 +-3 +-3 +-4 +-3 +5 +8 +16 +-23 +-46 +5 +-30 +-38 +26 +-14 +-39 +16 +-19 +-38 +20 +-13 +-32 +23 +-12 +-31 +26 +-1 +-23 +28 +-9 +-27 +41 +-2 +-19 +29 +-7 +-28 +36 +0 +-26 +30 +-9 +-22 +38 +-3 +-23 +42 +-1 +-28 +34 +-6 +-30 +24 +-12 +-22 +43 +-1 +-26 +25 +-11 +26 +-5 +-30 +33 +-1 +-25 +26 +-12 +-32 +25 +-12 +-24 +25 +-12 +-24 +38 +-3 +-26 +33 +-6 +-27 +33 +-5 +-29 +27 +-11 +-25 +37 +-3 +-26 +28 +-10 +-27 +35 +-1 +-26 +28 +-8 +-25 +35 +-4 +-12 +31 +-9 +-27 +27 +-9 +-18 +45 +0 +-23 +27 +-11 +-28 +28 +-2 +-25 +30 +-4 +-28 +37 +-5 +-14 +28 +-11 +-31 +33 +-7 +-18 +36 +-5 +-21 +29 +-10 +-29 +37 +-4 +-25 +30 +-2 +-22 +25 +-10 +-19 +28 +-11 +-23 +25 +-12 +-29 +23 +26 +21 +34 +33 +23 +18 +9 +13 +3 +6 +3 +6 +2 +4 +0 +5 +12 +2 +-2 +0 +-1 +5 +2 +-1 +7 +3 +3 +1 +7 +2 +-4 +-3 +-4 +-3 +2 +7 +0 +7 +13 +9 +2 +12 +-4 +-2 +12 +-3 +-4 +-5 +-5 +-4 +-3 +11 +-1 +-6 +-5 +9 +6 +4 +0 +-7 +-6 +-4 +-3 +4 +-5 +11 +15 +-1 +0 +-1 +-1 +7 +-4 +-5 +-3 +-6 +-1 +12 +3 +-6 +-4 +6 +-5 +-4 +-4 +2 +-3 +-2 +12 +-3 +-6 +0 +-5 +-2 +-4 +-2 +-1 +11 +-1 +6 +1 +-1 +-4 +3 +17 +2 +2 +-4 +12 +1 +7 +7 +-5 +-2 +-3 +-4 +4 +-1 +-7 +-2 +-2 +13 +1 +2 +0 +-1 +0 +7 +-30 +-46 +7 +-26 +-42 +14 +-21 +-25 +23 +-16 +-37 +22 +-14 +-33 +33 +-5 +-29 +32 +-8 +-22 +23 +-10 +-24 +29 +1 +-25 +26 +-10 +-19 +35 +-4 +-29 +31 +-8 +-30 +28 +-10 +-16 +45 +6 +-23 +23 +-12 +-29 +27 +-10 +-30 +36 +-6 +-23 +28 +-9 +-12 +31 +-8 +-29 +30 +4 +-24 +31 +-7 +-16 +38 +-3 +-28 +25 +-9 +-17 +31 +-8 +-29 +28 +-11 +-30 +28 +-9 +-21 +34 +-5 +-19 +29 +-5 +-27 +27 +-10 +-24 +31 +0 +-26 +34 +-6 +-28 +30 +-9 +-21 +32 +-1 +-24 +34 +-5 +-28 +31 +-8 +-29 +43 +1 +-26 +28 +-10 +-23 +39 +-3 +-22 +25 +-10 +-29 +37 +-4 +-29 +41 +1 +-27 +25 +-8 +-23 +30 +-8 +-29 +28 +-9 +-24 +34 +-6 +-27 +39 +-2 +-27 +31 +-9 +-28 +31 +-7 +-18 +33 +33 +20 +19 +24 +33 +13 +5 +20 +17 +1 +7 +10 +-1 +-3 +-3 +-2 +-2 +3 +0 +4 +-1 +-2 +0 +-1 +-1 +16 +11 +-1 +-4 +-3 +4 +8 +6 +-4 +-4 +1 +-7 +7 +-1 +-4 +0 +-5 +-2 +1 +3 +15 +6 +7 +-2 +0 +-2 +-5 +-2 +-3 +1 +-3 +-4 +-3 +2 +13 +9 +2 +0 +-3 +-1 +3 +15 +0 +-1 +-4 +10 +-3 +-5 +-4 +9 +12 +-1 +-7 +-4 +-5 +-4 +-5 +8 +10 +0 +6 +-1 +-4 +-5 +-2 +12 +0 +-4 +0 +-3 +13 +10 +3 +-4 +-1 +7 +6 +-7 +-7 +-4 +1 +-2 +-4 +-7 +0 +3 +6 +-3 +9 +6 +1 +-2 +-3 +-2 +-4 +-6 +1 +-3 +13 +0 +-4 +3 +-2 +-36 +6 +-29 +-44 +13 +-15 +-26 +33 +-9 +-34 +18 +-17 +-37 +26 +-13 +-25 +25 +-11 +-21 +47 +2 +-23 +30 +-9 +-20 +27 +-13 +-25 +28 +-11 +-30 +24 +-8 +-28 +32 +-7 +-30 +37 +-5 +-28 +29 +-5 +-29 +28 +-8 +-23 +28 +-8 +-18 +35 +-6 +-23 +32 +-6 +-24 +27 +-11 +-29 +45 +1 +-24 +28 +-10 +-29 +33 +-7 +-29 +34 +-3 +-23 +25 +-8 +-23 +27 +-11 +-20 +34 +-1 +-17 +29 +-6 +-29 +32 +-6 +-30 +28 +-8 +-29 +43 +1 +-12 +33 +-7 +-16 +44 +1 +-27 +28 +-7 +-31 +28 +-10 +-32 +26 +-5 +-28 +25 +-10 +-29 +35 +2 +-21 +27 +-9 +-27 +28 +-10 +-28 +45 +2 +-18 +45 +0 +-27 +25 +-12 +-19 +28 +-11 +-25 +27 +-11 +-23 +42 +-2 +-27 +26 +-10 +-28 +27 +-7 +-10 +30 +25 +11 +20 +18 +12 +10 +10 +15 +9 +9 +21 +24 +5 +5 +7 +1 +-1 +1 +0 +1 +7 +-1 +-1 +16 +2 +7 +-4 +-3 +0 +2 +1 +-5 +-5 +-5 +1 +3 +1 +4 +2 +-1 +-3 +1 +-1 +-2 +1 +-3 +-1 +1 +9 +-2 +-2 +-1 +6 +5 +8 +9 +9 +5 +2 +-6 +-5 +1 +8 +0 +-2 +-7 +8 +9 +-3 +1 +-1 +-5 +1 +-2 +-4 +-5 +-2 +1 +1 +4 +-3 +-1 +-1 +8 +0 +4 +13 +2 +-4 +-6 +4 +4 +-2 +-4 +-3 +-3 +0 From e8ff188868fff6b591fbd31f411dac4c9f16fa8c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 17:03:23 +0200 Subject: [PATCH 702/924] added a test for cotag demodulation via data commands --- CHANGELOG.md | 1 + tools/pm3_tests.sh | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f39a12af4..96cabb6ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added new test for cotag demod using data commands in pm3_test.sh (@iceman1001) - Added new sample trace file for cotag w fc/272. Thanks s1acky! (@iceman1001) - Fixed `hf legic eload` - now it doesn't crash client (@doegox) - Changed `lf hitag *` - rework client side (@doegox) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index ad50121f5..57d502aba 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -384,13 +384,15 @@ while true; do if ! CheckExecute "jooki encode test" "$CLIENTBIN -c 'hf jooki encode -t'" "04 28 F4 DA F0 4A 81 \( ok \)"; then break; fi if ! CheckExecute "trace load/list 14a" "$CLIENTBIN -c 'trace load -f traces/hf_14a_mfu.trace; trace list -1 -t 14a;'" "READBLOCK\(8\)"; then break; fi if ! CheckExecute "trace load/list x" "$CLIENTBIN -c 'trace load -f traces/hf_14a_mfu.trace; trace list -x1 -t 14a;'" "0.0101840425"; then break; fi - if ! CheckExecute "nfc decode test - oob" "$CLIENTBIN -c 'nfc decode -d DA2010016170706C69636174696F6E2F766E642E626C7565746F6F74682E65702E6F6F62301000649201B96DFB0709466C65782032'" "Flex 2"; then break; fi - if ! CheckExecute "nfc decode test - device info" "$CLIENTBIN -c 'nfc decode -d d1025744690004536f6e79010752432d533338300220426c61636b204e46432052656164657220636f6e6e656374656420746f2050430310123e4567e89b12d3a45642665544000004124e464320506f72742d3130302076312e3032'" "NFC Port-100 v1.02"; then break; fi - if ! CheckExecute "nfc decode test - vcard" "$CLIENTBIN -c 'nfc decode -d d20ca3746578742f782d7643617264424547494e3a56434152440a56455253494f4e3a332e300a4e3a43687269733b4963656d616e3b3b3b0a464e3a476f7468656e627572670a5245563a323032312d30362d32345432303a31353a30385a0a6974656d322e582d4142444154453b747970653d707265663a323032302d30362d32340a4954454d322e582d41424c4142454c3a5f24213c416e6e69766572736172793e21245f0a454e443a56434152440a'" "END:VCARD"; then break; fi - if ! CheckExecute "nfc decode test - apple wallet" "$CLIENTBIN -c 'nfc decode -d 031AD10116550077616C6C65743A2F2F61637469766174652F6E6663FE'" "activate/nfc"; then break; fi - if ! CheckExecute "nfc decode test - signature" "$CLIENTBIN -c 'nfc decode -d 03FF010194113870696C65742E65653A656B616172743A3266195F26063132303832325904202020205F28033233335F2701316E1B5A13333038363439303039303030323636343030355304EBF2CE704103000000AC536967010200803A2448FCA7D354A654A81BD021150D1A152D1DF4D7A55D2B771F12F094EAB6E5E10F2617A2F8DAD4FD38AFF8EA39B71C19BD42618CDA86EE7E144636C8E0E7CFC4096E19C3680E09C78A0CDBC05DA2D698E551D5D709717655E56FE3676880B897D2C70DF5F06ECE07C71435255144F8EE41AF110E7B180DA0E6C22FB8FDEF61800025687474703A2F2F70696C65742E65652F6372742F33303836343930302D303030312E637274FE'" "30864900-0001.crt"; then break; fi + if ! CheckExecute "nfc decode test - oob" "$CLIENTBIN -c 'nfc decode -d DA2010016170706C69636174696F6E2F766E642E626C7565746F6F74682E65702E6F6F62301000649201B96DFB0709466C65782032'" "Flex 2"; then break; fi + if ! CheckExecute "nfc decode test - device info" "$CLIENTBIN -c 'nfc decode -d d1025744690004536f6e79010752432d533338300220426c61636b204e46432052656164657220636f6e6e656374656420746f2050430310123e4567e89b12d3a45642665544000004124e464320506f72742d3130302076312e3032'" "NFC Port-100 v1.02"; then break; fi + if ! CheckExecute "nfc decode test - vcard" "$CLIENTBIN -c 'nfc decode -d d20ca3746578742f782d7643617264424547494e3a56434152440a56455253494f4e3a332e300a4e3a43687269733b4963656d616e3b3b3b0a464e3a476f7468656e627572670a5245563a323032312d30362d32345432303a31353a30385a0a6974656d322e582d4142444154453b747970653d707265663a323032302d30362d32340a4954454d322e582d41424c4142454c3a5f24213c416e6e69766572736172793e21245f0a454e443a56434152440a'" "END:VCARD"; then break; fi + if ! CheckExecute "nfc decode test - apple wallet" "$CLIENTBIN -c 'nfc decode -d 031AD10116550077616C6C65743A2F2F61637469766174652F6E6663FE'" "activate/nfc"; then break; fi + if ! CheckExecute "nfc decode test - signature" "$CLIENTBIN -c 'nfc decode -d 03FF010194113870696C65742E65653A656B616172743A3266195F26063132303832325904202020205F28033233335F2701316E1B5A13333038363439303039303030323636343030355304EBF2CE704103000000AC536967010200803A2448FCA7D354A654A81BD021150D1A152D1DF4D7A55D2B771F12F094EAB6E5E10F2617A2F8DAD4FD38AFF8EA39B71C19BD42618CDA86EE7E144636C8E0E7CFC4096E19C3680E09C78A0CDBC05DA2D698E551D5D709717655E56FE3676880B897D2C70DF5F06ECE07C71435255144F8EE41AF110E7B180DA0E6C22FB8FDEF61800025687474703A2F2F70696C65742E65652F6372742F33303836343930302D303030312E637274FE'" "30864900-0001.crt"; then break; fi echo -e "\n${C_BLUE}Testing LF:${C_NC}" + if ! CheckExecute "lf cotag demod test" "$CLIENTBIN -c 'data load -f traces/lf_cotag_220_8331.pm3; data norm; data cthreshold -u 50 -d -20; data envelope; data raw --ar -c 272; lf cotag demod'" \ + "COTAG Found: FC 220, CN: 8331 Raw: FFB841170363FFFE00001E7F00000000"; then break; fi if ! CheckExecute "lf AWID test" "$CLIENTBIN -c 'data load -f traces/lf_AWID-15-259.pm3;lf search -1'" "AWID ID found"; then break; fi if ! CheckExecute "lf EM410x test" "$CLIENTBIN -c 'data load -f traces/lf_EM4102-1.pm3;lf search -1'" "EM410x ID found"; then break; fi if ! CheckExecute "lf EM4x05 test" "$CLIENTBIN -c 'data load -f traces/lf_EM4x05.pm3;lf search -1'" "FDX-B ID found"; then break; fi @@ -505,7 +507,7 @@ while true; do if ! CheckExecute slow "hf iclass loclass long test" "$CLIENTBIN -c 'hf iclass loclass --long'" "verified \( ok \)"; then break; fi if ! CheckExecute slow "emv long test" "$CLIENTBIN -c 'emv test -l'" "Test\(s\) \[ ok"; then break; fi if ! CheckExecute "hf iclass lookup test" "$CLIENTBIN -c 'hf iclass lookup --csn 9655a400f8ff12e0 --epurse f0ffffffffffffff --macs 0000000089cb984b -f $DICPATH/iclass_default_keys.dic'" \ - "valid key AE A6 84 A6 DA B2 32 78"; then break; fi + dat "valid key AE A6 84 A6 DA B2 32 78"; then break; fi if ! CheckExecute "hf iclass loclass test" "$CLIENTBIN -c 'hf iclass loclass --test'" "key diversification \( ok \)"; then break; fi if ! CheckExecute "emv test" "$CLIENTBIN -c 'emv test'" "Test\(s\) \[ ok"; then break; fi if ! CheckExecute "hf cipurse test" "$CLIENTBIN -c 'hf cipurse test'" "Tests \[ ok"; then break; fi From b277e667c9b9dd267b374ecd9ebd02bec6a5d871 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 17:04:21 +0200 Subject: [PATCH 703/924] text --- client/src/cmddata.c | 18 +++++++++--------- client/src/cmdlfcotag.c | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 0ac3c0f4e..9486402d1 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -440,7 +440,7 @@ int ASKDemod_ext(int clk, int invert, int maxErr, size_t maxlen, bool amplify, b clk /= 2; } if (errCnt < 0 || bitlen < 16) { //if fatal error (or -1) - PrintAndLogEx(DEBUG, "DEBUG: (ASKDemod_ext) No data found errors:%d, %s bitlen:%zu, clock:%d" + PrintAndLogEx(DEBUG, "DEBUG: (ASKDemod_ext) No data found errors:%d, %s bitlen:%zu, clock:%i" , errCnt , (invert) ? "inverted," : "" , bitlen @@ -451,7 +451,7 @@ int ASKDemod_ext(int clk, int invert, int maxErr, size_t maxlen, bool amplify, b } if (errCnt > maxErr) { - PrintAndLogEx(DEBUG, "DEBUG: (ASKDemod_ext) Too many errors found, errors:%d, bits:%zu, clock:%d" + PrintAndLogEx(DEBUG, "DEBUG: (ASKDemod_ext) Too many errors found, errors:%d, bits:%zu, clock:%i" , errCnt , bitlen , clk @@ -461,7 +461,7 @@ int ASKDemod_ext(int clk, int invert, int maxErr, size_t maxlen, bool amplify, b } if (verbose) { - PrintAndLogEx(DEBUG, "DEBUG: (ASKDemod_ext) using clock:%d, %sbits found:%zu, start index %d" + PrintAndLogEx(DEBUG, "DEBUG: (ASKDemod_ext) using clock:%i, %sbits found:%zu, start index %d" , clk , (invert) ? "inverted, " : "" , bitlen @@ -475,14 +475,14 @@ int ASKDemod_ext(int clk, int invert, int maxErr, size_t maxlen, bool amplify, b if (verbose) { if (errCnt > 0) - PrintAndLogEx(DEBUG, "# Errors during demoding (shown as 7 in bit stream): %d", errCnt); + PrintAndLogEx(DEBUG, "# Errors during demoding (shown as 7 in bit stream)... " _RED_("%d"), errCnt); if (askType) { - PrintAndLogEx(SUCCESS, _YELLOW_("ASK/Manchester") " - clock %d - decoded bitstream", clk); - PrintAndLogEx(INFO, "---------------------------------------------"); + PrintAndLogEx(SUCCESS, _YELLOW_("ASK/Manchester") " - clock " _YELLOW_("%i") " - decoded bitstream", clk); + PrintAndLogEx(INFO, "-----------------------------------------------"); } else { - PrintAndLogEx(SUCCESS, _YELLOW_("ASK/Raw") " - clock %d - decoded bitstream", clk); - PrintAndLogEx(INFO, "--------------------------------------"); + PrintAndLogEx(SUCCESS, _YELLOW_("ASK/Raw") " - clock " _YELLOW_("%i") " - decoded bitstream", clk); + PrintAndLogEx(INFO, "----------------------------------------"); } printDemodBuff(0, false, false, false); @@ -1369,7 +1369,7 @@ int NRZrawDemod(int clk, int invert, int maxErr, bool verbose) { if (errCnt > 0 && (verbose || g_debugMode)) PrintAndLogEx(DEBUG, "DEBUG: (NRZrawDemod) Errors during Demoding (shown as 7 in bit stream): %d", errCnt); if (verbose || g_debugMode) { - PrintAndLogEx(NORMAL, "NRZ demoded bitstream:"); + PrintAndLogEx(SUCCESS, "NRZ demoded bitstream:"); // Now output the bitstream to the scrollback by line of 16 bits printDemodBuff(0, false, invert, false); } diff --git a/client/src/cmdlfcotag.c b/client/src/cmdlfcotag.c index 4a3a5f6e6..8161ceacc 100644 --- a/client/src/cmdlfcotag.c +++ b/client/src/cmdlfcotag.c @@ -62,7 +62,7 @@ int demodCOTAG(bool verbose) { 0 1001 1100 1100 0001 1000 0101 0000 0000 100001010000000001111011100000011010000010000000000000000000000000000000000000000000000000000000100111001100000110000101000 1001 1100 1100 0001 10000101 */ - PrintAndLogEx(SUCCESS, "COTAG Found: FC %u, CN: %u Raw: %08X%08X%08X%08X", fc, cn, raw1, raw2, raw3, raw4); + PrintAndLogEx(SUCCESS, "COTAG Found: FC " _GREEN_("%u")", CN: " _GREEN_("%u")" Raw: %08X%08X%08X%08X", fc, cn, raw1, raw2, raw3, raw4); return PM3_SUCCESS; } From c01c0427bb3e8deaee2d518f55da622ac340e822 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 17:05:18 +0200 Subject: [PATCH 704/924] forgot the clock changes. --- common/lfdemod.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/lfdemod.c b/common/lfdemod.c index 42ac2bcc0..5e2f1fa54 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -915,11 +915,11 @@ int DetectStrongNRZClk(const uint8_t *dest, size_t size, int peak, int low, bool // detect nrz clock by reading #peaks vs no peaks(or errors) int DetectNRZClock(uint8_t *dest, size_t size, int clock, size_t *clockStartIdx) { size_t i = 0; - uint8_t clk[] = {8, 16, 32, 40, 50, 64, 100, 128, 255}; + uint16_t clk[] = {8, 16, 32, 40, 50, 64, 100, 128, 255, 272, 384}; size_t loopCnt = 4096; //don't need to loop through entire array... //if we already have a valid clock quit - for (; i < 8; ++i) + for (; i < ARRAYLEN(clk); ++i) if (clk[i] == clock) return clock; if (size < 20) return 0; @@ -946,7 +946,7 @@ int DetectNRZClock(uint8_t *dest, size_t size, int clock, size_t *clockStartIdx) uint8_t tol = 0; uint16_t smplCnt = 0; int16_t peakcnt = 0; - int16_t peaksdet[] = {0, 0, 0, 0, 0, 0, 0, 0}; + int16_t peaksdet[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint16_t minPeak = 255; bool firstpeak = true; //test for large clipped waves - ignore first peak @@ -969,10 +969,10 @@ int DetectNRZClock(uint8_t *dest, size_t size, int clock, size_t *clockStartIdx) bool errBitHigh = 0, bitHigh = 0, lastPeakHigh = 0; uint8_t ignoreCnt = 0, ignoreWindow = 4; int lastBit = 0; - size_t bestStart[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + size_t bestStart[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; peakcnt = 0; //test each valid clock from smallest to greatest to see which lines up - for (clkCnt = 0; clkCnt < 8; ++clkCnt) { + for (clkCnt = 0; clkCnt < ARRAYLEN(bestStart); ++clkCnt) { //ignore clocks smaller than smallest peak if (clk[clkCnt] < minPeak - (clk[clkCnt] / 4)) continue; //try lining up the peaks by moving starting point (try first 256) @@ -1025,7 +1025,7 @@ int DetectNRZClock(uint8_t *dest, size_t size, int clock, size_t *clockStartIdx) } uint8_t best = 0; - for (int m = 7; m > 0; m--) { + for (int m = ARRAYLEN(peaksdet); m > 0; m--) { if ((peaksdet[m] >= (peaksdet[best] - 1)) && (peaksdet[m] <= peaksdet[best] + 1) && lowestTransition) { if (clk[m] > (lowestTransition - (clk[m] / 8)) && clk[m] < (lowestTransition + (clk[m] / 8))) { best = m; From a918dc772ef8a3de4ba760785b43f7093645b813 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 17:12:14 +0200 Subject: [PATCH 705/924] updated to match --- doc/cheatsheet.md | 51 +++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/doc/cheatsheet.md b/doc/cheatsheet.md index 22e47b3f1..a859f4392 100644 --- a/doc/cheatsheet.md +++ b/doc/cheatsheet.md @@ -514,24 +514,22 @@ Read Hitag information pm3 --> lf hitag info ``` -Act as Hitag reader +Read Hitag memory +Crypto mode key format: ISK high + ISK low ``` Options --- - --01 HitagS, read all pages, challenge mode - --02 HitagS, read all pages, crypto mode. Set key=0 for no auth - - --21 Hitag2, read all pages, password mode. def 4D494B52 (MIKR) - --22 Hitag2, read all pages, challenge mode - --23 Hitag2, read all pages, crypto mode. Key ISK high + ISK low. def 4F4E4D494B52 (ONMIKR) - --25 Hitag2, test recorded authentications (replay?) - --26 Hitag2, read UID --k, --key key, 4 or 6 hex bytes - --nrar nonce / answer reader, 8 hex bytes + -h, --help This help + -s, --hts Hitag S + -2, --ht2 Hitag 2 + --pwd password mode + --nrar nonce / answer writer, 8 hex bytes + --crypto crypto mode + -k, --key key, 4 or 6 hex bytes -pm3 --> lf hitag --26 -pm3 --> lf hitag --21 -k 4D494B52 -pm3 --> lf hitag reader --23 -k 4F4E4D494B52 +pm3 --> lf hitag read --ht2 +pm3 --> lf hitag read --ht2 -k 4D494B52 +pm3 --> lf hitag read --ht2 -k 4F4E4D494B52 ``` Sniff Hitag traffic @@ -545,26 +543,27 @@ Simulate Hitag2 pm3 --> lf hitag sim -2 ``` -Write to Hitag block +Write a page in Hitag memory +Crypto mode key format: ISK high + ISK low ``` Options --- - --03 HitagS, write page, challenge mode - --04 HitagS, write page, crypto mode. Set key=0 for no auth + -h, --help This help + -s, --hts Hitag S + -2, --ht2 Hitag 2 + --pwd password mode + --nrar nonce / answer writer, 8 hex bytes + --crypto crypto mode + -k, --key key, 4 or 6 hex bytes + -p, --page page address to write to + -d, --data data, 4 hex bytes - --24 Hitag2, write page, crypto mode. - --27 Hitag2, write page, password mode --p, --page page address to write to --d, --data data, 4 hex bytes --k, --key key, 4 or 6 hex bytes - --nrar nonce / answer writer, 8 hex bytes - -pm3 --> lf hitag writer --24 -k 499602D2 -p 1 -d 00000000 +pm3 --> lf hitag wrbl --ht2 -k 499602D2 -p 1 -d 00000000 ``` Simulate Hitag2 sequence ``` -pm3 --> lf hitag reader --21 -k 56713368 +pm3 --> lf hitag read --ht2 -k 56713368 pm3 --> lf hitag sim -2 ``` From c1416ba256d83af631144bd71f57907f5aa08289 Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Fri, 21 Jul 2023 17:25:49 +0200 Subject: [PATCH 706/924] Adds MAC, UNMACed to messages, and code factorisation --- client/src/cmdhflist.c | 167 ++++++++++++++++++++++------------------- client/src/cmdhflist.h | 3 + 2 files changed, 91 insertions(+), 79 deletions(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 2001c4370..663a3450d 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -273,7 +273,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i MifareAuthState = masNone; break; case ISO14443A_CMD_RATS: - snprintf(exp, size, "RATS - FSDI=0x%x, CID=0x%x", (cmd[1] & 0xF0) >> 4, (cmd[1] & 0x0F) ); + snprintf(exp, size, "RATS - FSDI=%x, CID=%x", (cmd[1] & 0xF0) >> 4, (cmd[1] & 0x0F) ); break; /* Actually, PPSS is Dx case ISO14443A_CMD_PPS: @@ -429,7 +429,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i default: if ( (cmd[0] & 0xF0) == 0xD0 && ( cmdsize == 4 || cmdsize == 5 )) { - snprintf(exp, size, "PPSS - CID=0x%x", cmd[0] & 0x0F) ; + snprintf(exp, size, "PPS - CID=%x", cmd[0] & 0x0F) ; } else { return PM3_ESOFT; } @@ -1202,7 +1202,10 @@ void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { } } } -// codes for which no data is interpreted, returns the message to print. + +// MIFARE Plus + +// returns the message to print for a given opcode. const char *mfpGetAnnotationForCode(uint8_t code) { struct mfp_code_msg { uint8_t code; @@ -1222,6 +1225,19 @@ const char *mfpGetAnnotationForCode(uint8_t code) { { MFDES_PREPARE_PC, "PREPARE PROXIMITY CHECK"}, { MFDES_PROXIMITY_CHECK, "PROXIMITY CHECK"}, { MFDES_VERIFY_PC, "VERIFY PROXIMITY CHECK"}, + { MFDES_COMMIT_READER_ID, "COMMIT READER ID"}, + { MFP_INCREMENTNOMAC, "INCREMENT"}, + { MFP_INCREMENTMAC, "INCREMENT"}, + { MFP_DECREMENTMAC, "DECREMENT"}, + { MFP_DECREMENTNOMAC, "DECREMENT"}, + { MFP_TRANSFERNOMAC, "TRANSFER"}, + { MFP_TRANSFERMAC, "TRANSFER"}, + { MFP_INCREMENTTRANSFERNOMAC, "INCREMENT, TRANSFER"}, + { MFP_INCREMENTTRANSFERMAC, "INCREMENT, TRANSFER"}, + { MFP_DECREMENTTRANSFERNOMAC, "DECREMENT, TRANSFER"}, + { MFP_DECREMENTTRANSFERMAC, "DECREMENT, TRANSFER"}, + { MFP_RESTORENOMAC, "RESTORE"}, + { MFP_RESTOREMAC, "RESTORE"}, { 0, NULL} } ; @@ -1233,7 +1249,44 @@ const char *mfpGetAnnotationForCode(uint8_t code) { return NULL ; } -// MIFARE Plus +const char *mfpGetEncryptedForCode(uint8_t code){ + /* + encrypted |plain : bit 1 + 30 A0 0000 32 A2 0010 + 31 A1 0001 33 A3 0011 + 34 0100 36 0110 + 35 0101 37 0111 + */ + if ((code & 0x02) == 2) { + return "PLAIN" ; + } + return "ENCRYPTED" ; +} + +/* + response |command + NOMAC MAC UnMACed MACed + 30 31 34 30,A0 + 32 33 35 31,A1 + A0 A1 36 32,A2 + A2 A3 37 33,A3 + bit 0 is response: NOMAC if 0, MAC if 1 + bit 2 is command: UNMACed if 1, MACed if 0 +*/ +const char *mfpGetResponseMacedForCode(uint8_t code) { + if (( code & 0x01) == 0x00) { + return "NoMAC" ; + } + return "MAC" ; +} + +const char *mfpGetCommandMacedForCode(uint8_t code) { + if (( code & 0x04) == 0x04) { + return "UnMACed" ; + } + return "MACed" ; +} + void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { // If we are in Mifare Classic Authenticated mode, all the work has already be done elsewhere @@ -1269,8 +1322,8 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { if (cmdsize > (data - cmd)) { data_size = cmdsize - (data - cmd); } - - switch (cmd[pos]) { + uint8_t opcode=cmd[pos] ; + switch (opcode) { case MFP_AUTHENTICATEFIRST: case MFP_AUTHENTICATEFIRST_VARIANT: if (data_size > 1) { @@ -1295,119 +1348,75 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { case MFP_READENCRYPTEDMAC_MACED: case MFP_READENCRYPTEDNOMAC_UNMACED: case MFP_READENCRYPTEDMAC_UNMACED: - if (data_size > 2) { - uint16_t uBlockNum = MemLeToUint2byte(data) ; - uint8_t uQty = data[2] ; - if (uQty != 1) { - snprintf(exp, size, "READ ENCRYPTED(%u-%u)", uBlockNum, uBlockNum+uQty-1); - } else { - snprintf(exp, size, "READ ENCRYPTED(%u)", uBlockNum); - } - } else { - snprintf(exp, size, "READ ENCRYPTED ?"); - } - break; - case MFP_READPLAINNOMAC_MACED: case MFP_READPLAINMAC_MACED: case MFP_READPLAINNOMAC_UNMACED: - case MFP_READPLAINMAC_UNMACED: + case MFP_READPLAINMAC_UNMACED: { + const char *encrypted = mfpGetEncryptedForCode(opcode) ; + const char *responseMaced = mfpGetResponseMacedForCode(opcode) ; + const char *commandMaced = mfpGetCommandMacedForCode(opcode) ; + if (data_size > 2) { uint16_t uBlockNum = MemLeToUint2byte(data) ; uint8_t uQty = data[2] ; if (uQty != 1) { - snprintf(exp, size, "READ PLAIN(%u-%u)", uBlockNum, uBlockNum+uQty-1); + snprintf(exp, size, "READ %s(%u-%u) %s_%s", encrypted, uBlockNum, uBlockNum+uQty-1, responseMaced, commandMaced); } else { - snprintf(exp, size, "READ PLAIN(%u)", uBlockNum); + snprintf(exp, size, "READ %s(%u) %s_%s", encrypted, uBlockNum, responseMaced, commandMaced); } } else { - snprintf(exp, size, "READ PLAIN ?"); + snprintf(exp, size, "READ %s %s_%s ?", encrypted, responseMaced, commandMaced); } break; - + } + case MFP_WRITEPLAINNOMAC : case MFP_WRITEPLAINMAC : - if (data_size > 1) { - uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "WRITE PLAIN(%u)", uBlockNum); - } else { - snprintf(exp, size, "WRITE PLAIN ?"); - } - break; - case MFP_WRITEENCRYPTEDNOMAC: - case MFP_WRITEENCRYPTEDMAC : + case MFP_WRITEENCRYPTEDMAC :{ + const char *encrypted = mfpGetEncryptedForCode(opcode) ; + const char *responseMaced = mfpGetResponseMacedForCode(opcode) ; + if (data_size > 1) { uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "WRITE ENCRYPTED(%u)", uBlockNum); + snprintf(exp, size, "WRITE %s(%u) %s", encrypted, uBlockNum, responseMaced); } else { - snprintf(exp, size, "WRITE ENCRYPTED ?"); + snprintf(exp, size, "WRITE %s %s ?", encrypted, responseMaced); } break; + } case MFP_INCREMENTNOMAC : case MFP_INCREMENTMAC : - if (data_size > 1) { - uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "INCREMENT(%u)", uBlockNum); - } else { - snprintf(exp, size, "INCREMENT ?"); - } - break; - case MFP_DECREMENTNOMAC : case MFP_DECREMENTMAC : - if (data_size > 1) { - uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "DECREMENT(%u)", uBlockNum); - } else { - snprintf(exp, size, "DECREMENT ?"); - } - break; - case MFP_TRANSFERNOMAC : case MFP_TRANSFERMAC : - if (data_size > 1) { - uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "TRANSFER(%u)", uBlockNum); - } else { - snprintf(exp, size, "TRANSFER ?"); - } - break; - case MFP_INCREMENTTRANSFERNOMAC: case MFP_INCREMENTTRANSFERMAC : - if (data_size > 1) { - uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "INCREMENT, TRANSFER(%u)", uBlockNum); - } else { - snprintf(exp, size, "INCREMENT, TRANSFER ?"); - } - break; - case MFP_DECREMENTTRANSFERNOMAC: case MFP_DECREMENTTRANSFERMAC : - if (data_size > 1) { - uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "DECREMENT, TRANSFER(%u)", uBlockNum); - } else { - snprintf(exp, size, "DECREMENT, TRANSFER ?"); - } - break; - case MFP_RESTORENOMAC : - case MFP_RESTOREMAC : + case MFP_RESTOREMAC :{ + const char *responseMaced = mfpGetResponseMacedForCode(opcode) ; + const char *annotation = mfpGetAnnotationForCode(opcode) ; + if (annotation == NULL) { + //should not happen outside of default case: it means an entry is mising in mfpGetAnnotationForCode() + annotation="?? MISSING OPCODE" ; + } + if (data_size > 1) { uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "RESTORE(%u)", uBlockNum); + snprintf(exp, size, "%s(%u) %s", annotation, uBlockNum, responseMaced); } else { - snprintf(exp, size, "RESTORE ?"); + snprintf(exp, size, "%s %s ?", annotation, responseMaced); } break; + } default: { // Messages for commands that do not need args are treated here - const char *annotation = mfpGetAnnotationForCode(cmd[pos]) ; + const char *annotation = mfpGetAnnotationForCode(opcode) ; if (annotation != NULL) { snprintf(exp, size, "%s", annotation) ; } else { diff --git a/client/src/cmdhflist.h b/client/src/cmdhflist.h index 7c7e09ffb..ab544a86f 100644 --- a/client/src/cmdhflist.h +++ b/client/src/cmdhflist.h @@ -57,6 +57,9 @@ void annotateIso14443b(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); void annotateIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool is_response); void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); const char *mfpGetAnnotationForCode(uint8_t code); +const char *mfpGetEncryptedForCode(uint8_t code); +const char *mfpGetResponseMacedForCode(uint8_t code); +const char *mfpGetCommandMacedForCode(uint8_t code); void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); void annotateMifare(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, const uint8_t *parity, uint8_t paritysize, bool isResponse); From cd2394b472a0df4ed66f2755aa8ab6de29d1067d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 17:27:03 +0200 Subject: [PATCH 707/924] fix --- tools/pm3_tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 57d502aba..68d522ed6 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -507,7 +507,7 @@ while true; do if ! CheckExecute slow "hf iclass loclass long test" "$CLIENTBIN -c 'hf iclass loclass --long'" "verified \( ok \)"; then break; fi if ! CheckExecute slow "emv long test" "$CLIENTBIN -c 'emv test -l'" "Test\(s\) \[ ok"; then break; fi if ! CheckExecute "hf iclass lookup test" "$CLIENTBIN -c 'hf iclass lookup --csn 9655a400f8ff12e0 --epurse f0ffffffffffffff --macs 0000000089cb984b -f $DICPATH/iclass_default_keys.dic'" \ - dat "valid key AE A6 84 A6 DA B2 32 78"; then break; fi + "valid key AE A6 84 A6 DA B2 32 78"; then break; fi if ! CheckExecute "hf iclass loclass test" "$CLIENTBIN -c 'hf iclass loclass --test'" "key diversification \( ok \)"; then break; fi if ! CheckExecute "emv test" "$CLIENTBIN -c 'emv test'" "Test\(s\) \[ ok"; then break; fi if ! CheckExecute "hf cipurse test" "$CLIENTBIN -c 'hf cipurse test'" "Tests \[ ok"; then break; fi From 1a19640d188c34babac184a00946bfece80a3ff4 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 21 Jul 2023 18:22:46 +0200 Subject: [PATCH 708/924] make style --- client/luascripts/hf_legic.lua | 20 ++-- client/src/cmddata.c | 8 +- client/src/cmdhflist.c | 32 +++--- client/src/cmdhfmf.c | 34 +++--- client/src/cmdlfhitag.c | 6 +- client/src/crypto/asn1utils.c | 10 +- client/src/pm3line_vocabulory.h | 13 ++- doc/commands.json | 188 +++++++++++++++++++++----------- doc/commands.md | 23 ++-- 9 files changed, 198 insertions(+), 136 deletions(-) diff --git a/client/luascripts/hf_legic.lua b/client/luascripts/hf_legic.lua index 052f7ab06..6dcb9d8ca 100644 --- a/client/luascripts/hf_legic.lua +++ b/client/luascripts/hf_legic.lua @@ -382,7 +382,7 @@ function getInputBytes(infile) local arr = split(infile, ".") local path = core.search_file(arr[1], "."..arr[2]) if (path == nil) then oops("failed to read from file ".. infile); return false; end - + local fhi,err = io.open(path,"rb") if err then oops("failed to read from file ".. path); return false; end @@ -688,7 +688,7 @@ end -- write bytes to file function writeFile(bytes, filename) local emlext = ".eml" - local res, path + local res, path if (filename ~= 'MyLegicClone') then res, path = file_check(filename..emlext) if res then @@ -765,7 +765,7 @@ function readFromPM3() if not res then return nil end os.remove(path) - res, path = file_check(infile..".eml") + res, path = file_check(infile..".eml") os.remove(path) res, path = file_check(infile..".json") @@ -886,7 +886,7 @@ function loadTagMap(filename) if not res then return oops("input file: "..acyellow..filename..acoff.." not found") else - + local fhi,err = io.open(path) while true do line = fhi:read() @@ -956,7 +956,7 @@ function dumpTagMap(tag, tagMap) else io.write("("..("%04d"):format(v['start']).."-"..("%04d"):format(v['end'])..") "..((v['highlight']) and acmagenta or acyellow)..v['name']..acoff) end - + temp = "" while (#v['name'] + temp:len()) < 20 do temp = temp.." " end @@ -1015,14 +1015,14 @@ function editTagMap(tag, tagMap) ]]..acc..[[Mappings]]..acr..[[ - ]]..acy..[[im]]..acr..[[ - insert ]]..acy..[[am]]..acr..[[ - add + ]]..acy..[[im]]..acr..[[ - insert ]]..acy..[[am]]..acr..[[ - add ]]..acy..[[rm]]..acr..[[ - remove ]]..acy..[[mas]]..acr..[[ - map all segments ]]..acc..[[CRC8]]..acr..[[ - ]]..acy..[[ac8]]..acr..[[ - add ]]..acy..[[sc8]]..acr..[[ - show + ]]..acy..[[ac8]]..acr..[[ - add ]]..acy..[[sc8]]..acr..[[ - show ]]..acy..[[rc8]]..acr..[[ - remove - + ]]..acy..[[q]]..acr..[[ - exit ]]..acy..[[h]]..acr..[[ - Help ]] @@ -2446,7 +2446,7 @@ function modifyMode() outfile = input("enter filename:", "hf-legic-"..inTAG.MCD..inTAG.MSN0..inTAG.MSN1..inTAG.MSN2) bytes = tagToBytes(inTAG) --bytes=xorBytes(bytes, inTAG.MCC) - if (bytes) then + if (bytes) then writeFile(bytes, outfile) end end @@ -2854,7 +2854,7 @@ function main(args) -- write to outfile if (bytes) then - + if (outfile) then writeFile(bytes, outfile) end diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 9486402d1..43fa20911 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -3320,14 +3320,14 @@ int centerThreshold(const int *in, int *out, size_t len, int8_t up, int8_t down) for (size_t i = 0; i < len; ++i) { if ((in[i] <= up) && (in[i] >= down)) { out[i] = 0; - } + } } // clean out spikes. for (size_t i = 2; i < len - 2; ++i) { - int a = out[i-2] + out[i-1]; - int b = out[i+2] + out[i+1]; + int a = out[i - 2] + out[i - 1]; + int b = out[i + 2] + out[i + 1]; if (a == 0 && b == 0) { out[i] = 0; } @@ -3372,7 +3372,7 @@ static int envelope_square(const int *in, int *out, size_t len) { for (size_t i = 0; i < len - 5; i++) { - if (in[i] == 0 && in[i+1] == 0 && in[i+2] == 0 && in[i+3] == 0 && in[i+4] == 0) { + if (in[i] == 0 && in[i + 1] == 0 && in[i + 2] == 0 && in[i + 3] == 0 && in[i + 4] == 0) { i += 4; continue; } diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 663a3450d..cf848d090 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -273,7 +273,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i MifareAuthState = masNone; break; case ISO14443A_CMD_RATS: - snprintf(exp, size, "RATS - FSDI=%x, CID=%x", (cmd[1] & 0xF0) >> 4, (cmd[1] & 0x0F) ); + snprintf(exp, size, "RATS - FSDI=%x, CID=%x", (cmd[1] & 0xF0) >> 4, (cmd[1] & 0x0F)); break; /* Actually, PPSS is Dx case ISO14443A_CMD_PPS: @@ -428,7 +428,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i break; default: - if ( (cmd[0] & 0xF0) == 0xD0 && ( cmdsize == 4 || cmdsize == 5 )) { + if ((cmd[0] & 0xF0) == 0xD0 && (cmdsize == 4 || cmdsize == 5)) { snprintf(exp, size, "PPS - CID=%x", cmd[0] & 0x0F) ; } else { return PM3_ESOFT; @@ -1241,7 +1241,7 @@ const char *mfpGetAnnotationForCode(uint8_t code) { { 0, NULL} } ; - for (struct mfp_code_msg *p=messages ; p->annotation != NULL ; p++) { + for (struct mfp_code_msg *p = messages ; p->annotation != NULL ; p++) { if (p->code == code) { return p->annotation ; } @@ -1249,8 +1249,8 @@ const char *mfpGetAnnotationForCode(uint8_t code) { return NULL ; } -const char *mfpGetEncryptedForCode(uint8_t code){ - /* +const char *mfpGetEncryptedForCode(uint8_t code) { + /* encrypted |plain : bit 1 30 A0 0000 32 A2 0010 31 A1 0001 33 A3 0011 @@ -1263,10 +1263,10 @@ const char *mfpGetEncryptedForCode(uint8_t code){ return "ENCRYPTED" ; } -/* +/* response |command NOMAC MAC UnMACed MACed - 30 31 34 30,A0 + 30 31 34 30,A0 32 33 35 31,A1 A0 A1 36 32,A2 A2 A3 37 33,A3 @@ -1274,14 +1274,14 @@ const char *mfpGetEncryptedForCode(uint8_t code){ bit 2 is command: UNMACed if 1, MACed if 0 */ const char *mfpGetResponseMacedForCode(uint8_t code) { - if (( code & 0x01) == 0x00) { + if ((code & 0x01) == 0x00) { return "NoMAC" ; } return "MAC" ; } const char *mfpGetCommandMacedForCode(uint8_t code) { - if (( code & 0x04) == 0x04) { + if ((code & 0x04) == 0x04) { return "UnMACed" ; } return "MACed" ; @@ -1322,14 +1322,14 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { if (cmdsize > (data - cmd)) { data_size = cmdsize - (data - cmd); } - uint8_t opcode=cmd[pos] ; + uint8_t opcode = cmd[pos] ; switch (opcode) { case MFP_AUTHENTICATEFIRST: case MFP_AUTHENTICATEFIRST_VARIANT: if (data_size > 1) { // key : uint16_t uKeyNum = 0x4000 + sectorNum * 2 + (keyB ? 1 : 0); uint16_t uKeyNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "FIRST AUTH (Keynr 0x%04X: %c sector %d)", uKeyNum, uKeyNum & 0x0001 ? 'B' : 'A', (uKeyNum - 0x4000)/2 ); + snprintf(exp, size, "FIRST AUTH (Keynr 0x%04X: %c sector %d)", uKeyNum, uKeyNum & 0x0001 ? 'B' : 'A', (uKeyNum - 0x4000) / 2); } else { snprintf(exp, size, "FIRST AUTH") ; } @@ -1360,7 +1360,7 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { uint16_t uBlockNum = MemLeToUint2byte(data) ; uint8_t uQty = data[2] ; if (uQty != 1) { - snprintf(exp, size, "READ %s(%u-%u) %s_%s", encrypted, uBlockNum, uBlockNum+uQty-1, responseMaced, commandMaced); + snprintf(exp, size, "READ %s(%u-%u) %s_%s", encrypted, uBlockNum, uBlockNum + uQty - 1, responseMaced, commandMaced); } else { snprintf(exp, size, "READ %s(%u) %s_%s", encrypted, uBlockNum, responseMaced, commandMaced); } @@ -1369,11 +1369,11 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { } break; } - + case MFP_WRITEPLAINNOMAC : case MFP_WRITEPLAINMAC : case MFP_WRITEENCRYPTEDNOMAC: - case MFP_WRITEENCRYPTEDMAC :{ + case MFP_WRITEENCRYPTEDMAC : { const char *encrypted = mfpGetEncryptedForCode(opcode) ; const char *responseMaced = mfpGetResponseMacedForCode(opcode) ; @@ -1397,12 +1397,12 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { case MFP_DECREMENTTRANSFERNOMAC: case MFP_DECREMENTTRANSFERMAC : case MFP_RESTORENOMAC : - case MFP_RESTOREMAC :{ + case MFP_RESTOREMAC : { const char *responseMaced = mfpGetResponseMacedForCode(opcode) ; const char *annotation = mfpGetAnnotationForCode(opcode) ; if (annotation == NULL) { //should not happen outside of default case: it means an entry is mising in mfpGetAnnotationForCode() - annotation="?? MISSING OPCODE" ; + annotation = "?? MISSING OPCODE" ; } if (data_size > 1) { diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 06b7c8a18..0531b4f28 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -7035,12 +7035,12 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { uint8_t aCHANGE[] = {0x00, 0xa6, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00}; memcpy(aCHANGE + 5, uid, uidlen); res = ExchangeAPDU14a( - aCHANGE, sizeof(aCHANGE), - activate_field, - keep_field_on, - response, sizeof(response), - &resplen - ); + aCHANGE, sizeof(aCHANGE), + activate_field, + keep_field_on, + response, sizeof(response), + &resplen + ); if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Super card UID change [ " _RED_("fail") " ]"); @@ -7061,12 +7061,12 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { // --------------- RESET CARD ---------------- uint8_t aRESET[] = {0x00, 0xa6, 0xc0, 0x00}; res = ExchangeAPDU14a( - aRESET, sizeof(aRESET), - activate_field, - keep_field_on, - response, sizeof(response), - &resplen - ); + aRESET, sizeof(aRESET), + activate_field, + keep_field_on, + response, sizeof(response), + &resplen + ); if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Super card reset [ " _RED_("fail") " ]"); @@ -7157,11 +7157,11 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { uint64_t key64 = -1; if (mfkey32_moebius(&data, &key64)) { PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%012" PRIX64) " ]", - sprint_hex_inrow(outA, 4), - data.sector, - (data.keytype == 0x60) ? 'A' : 'B', - key64 - ); + sprint_hex_inrow(outA, 4), + data.sector, + (data.keytype == 0x60) ? 'A' : 'B', + key64 + ); } else { PrintAndLogEx(FAILED, "failed to recover any key"); } diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index c3e30f61f..7fd58c798 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -631,7 +631,7 @@ static int CmdLFHitagReader(const char *Cmd) { memcpy(key, "MIKR", 4); keylen = 4; } - if ((keylen == 0) && use_crypto) { + if ((keylen == 0) && use_crypto) { memcpy(key, "ONMIKR", 6); keylen = 6; } @@ -888,7 +888,7 @@ static int CmdLFHitagWriter(const char *Cmd) { memcpy(key, "MIKR", 4); keylen = 4; } - if ((keylen == 0) && use_crypto) { + if ((keylen == 0) && use_crypto) { memcpy(key, "ONMIKR", 6); keylen = 6; } @@ -1047,7 +1047,7 @@ static int CmdLFHitag2Dump(const char *Cmd) { memcpy(key, "MIKR", 4); keylen = 4; } - if ((keylen == 0) && use_crypto) { + if ((keylen == 0) && use_crypto) { memcpy(key, "ONMIKR", 6); keylen = 6; } diff --git a/client/src/crypto/asn1utils.c b/client/src/crypto/asn1utils.c index 34b9a8e80..1fa839a7f 100644 --- a/client/src/crypto/asn1utils.c +++ b/client/src/crypto/asn1utils.c @@ -120,12 +120,12 @@ int asn1_selftest(void) { /* - ICEMAN: + ICEMAN: Problem to be solved, how to extract data back from our asn1 decoder to compare with the expected text found in the following test cases. Thanks @Mistial for the suggestion and links. These test cases are from the project lapo-luchini's asn1js (ISC license which is like MIT license) - https://github.com/lapo-luchini/asn1js/blob/trunk/test.js + https://github.com/lapo-luchini/asn1js/blob/trunk/test.js const asn1_test tests[] = { @@ -211,7 +211,7 @@ int asn1_selftest(void) { {"181531393835313130363231303632372E332D31323334", "1985-11-06 21:06:27.3 UTC-12:34", "UTC offsets with minutes"}, // GitHub issue #54 {"181331393835313130363231303632372E332B3134", "1985-11-06 21:06:27.3 UTC+14:00", "UTC offset +13 and +14"}, - }; + }; int tot = ARRAYLEN(tests); @@ -238,7 +238,7 @@ int asn1_selftest(void) { if (t) { bool candump = false; if (asn1_tag_dump(&t->tag, 0, &candump)) { - count++; + count++; } tlvdb_free(t); } @@ -250,6 +250,6 @@ int asn1_selftest(void) { PrintAndLogEx(NORMAL, ""); */ - + return PM3_SUCCESS; } diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 950d8816f..b3f177ed2 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -83,6 +83,7 @@ const static vocabulory_t vocabulory[] = { { 1, "data autocorr" }, { 1, "data dirthreshold" }, { 1, "data decimate" }, + { 1, "data envelope" }, { 1, "data undecimate" }, { 1, "data hide" }, { 1, "data hpf" }, @@ -92,6 +93,7 @@ const static vocabulory_t vocabulory[] = { { 1, "data mtrim" }, { 1, "data norm" }, { 1, "data plot" }, + { 1, "data cthreshold" }, { 1, "data rtrim" }, { 1, "data setgraphmarkers" }, { 1, "data shiftgraphzero" }, @@ -599,15 +601,16 @@ const static vocabulory_t vocabulory[] = { { 0, "lf hid brute" }, { 0, "lf hid watch" }, { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, { 1, "lf hitag list" }, { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, { 0, "lf hitag dump" }, + { 0, "lf hitag read" }, + { 0, "lf hitag wrbl" }, + { 0, "lf hitag sniff" }, { 0, "lf hitag cc" }, + { 0, "lf hitag ta" }, + { 0, "lf hitag eload" }, + { 0, "lf hitag sim" }, { 1, "lf idteck help" }, { 1, "lf idteck demod" }, { 0, "lf idteck reader" }, diff --git a/doc/commands.json b/doc/commands.json index 0618f5152..7e6061ec3 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -199,9 +199,10 @@ "offline": true, "options": [ "-h, --help This help", - "-d ASN1 encoded byte array" + "-d ASN1 encoded byte array", + "-t, --test perform selftest" ], - "usage": "data asn1 [-h] -d " + "usage": "data asn1 [-ht] [-d ]" }, "data autocorr": { "command": "data autocorr", @@ -283,6 +284,20 @@ ], "usage": "data convertbitstream [-h]" }, + "data cthreshold": { + "command": "data cthreshold", + "description": "Inverse of dirty threshold command, all values between up and down will be average out", + "notes": [ + "data cthreshold -u 10 -d -10" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-d, --down threshold down", + "-u, --up threshold up" + ], + "usage": "data cthreshold [-h] -d -u " + }, "data decimate": { "command": "data decimate", "description": "Performs decimation, by reducing samples N times in the grapbuf. Good for PSK", @@ -301,20 +316,18 @@ "command": "data detectclock", "description": "Detect ASK, FSK, NRZ, PSK clock rate of wave in GraphBuffer", "notes": [ - "data detectclock -A -> detect clock of an ask wave in GraphBuffer", - "data detectclock -F -> detect clock of an fsk wave in GraphBuffer", - "data detectclock -N -> detect clock of an psk wave in GraphBuffer", - "data detectclock -P -> detect clock of an nrz/direct wave in GraphBuffer" + "data detectclock --ask", + "data detectclock --nzr -> detect clock of an nrz/direct wave in GraphBuffer" ], "offline": true, "options": [ "-h, --help This help", - "-A, --ASK specify ASK modulation clock detection", - "-F, --FSK specify FSK modulation clock detection", - "-N, --NZR specify NZR/DIRECT modulation clock detection", - "-P, --PSK specify PSK modulation clock detection" + "--ask specify ASK modulation clock detection", + "--fsk specify FSK modulation clock detection", + "--nzr specify NZR/DIRECT modulation clock detection", + "--psk specify PSK modulation clock detection" ], - "usage": "data detectclock [-hAFNP]" + "usage": "data detectclock [-h] [--ask] [--fsk] [--nzr] [--psk]" }, "data diff": { "command": "data diff", @@ -352,6 +365,18 @@ ], "usage": "data dirthreshold [-h] -d -u " }, + "data envelope": { + "command": "data envelope", + "description": "Create an square envelop of the samples", + "notes": [ + "data envelop" + ], + "offline": true, + "options": [ + "-h, --help This help" + ], + "usage": "data envelop [-h]" + }, "data fsktonrz": { "command": "data fsktonrz", "description": "Convert fsk2 to nrz wave for alternate fsk demodulating (for weak fsk) Omitted values are autodetect instead", @@ -8638,19 +8663,29 @@ }, "lf hitag dump": { "command": "lf hitag dump", - "description": "Read all card memory and save to fileIn password mode the default key is 4D494B52 (MIKR) In crypto mode the default key is 4F4E4D494B52 (ONMIKR) format: ISK high + ISK low.", + "description": "Read all Hitag 2 card memory and save to file Crypto mode key format: ISK high + ISK low", "notes": [ - "lf hitag dump -k 4F4E4D494B52", - "lf hitag dump -k 4D494B52" + "Password mode => use default key 4D494B52 (MIKR)", + "lf hitag dump --pwd", + "Short key = password mode", + "lf hitag dump -k 4D494B52", + "Challenge mode", + "lf hitag dump --nrar 0102030411223344", + "Crypto mode => use default key 4F4E4D494B52 (ONMIKR)", + "lf hitag dump --crypto", + "Long key = crypto mode", + "lf hitag dump -k 4F4E4D494B52" ], "offline": false, "options": [ "-h, --help This help", - "-f, --file specify file name", + "--pwd password mode", + "--nrar nonce / answer reader, 8 hex bytes", + "--crypto crypto mode", "-k, --key key, 4 or 6 hex bytes", - "--nrar nonce / answer reader, 8 hex bytes" + "-f, --file specify file name" ], - "usage": "lf hitag dump [-h] [-f ] [-k ] [--nrar ]" + "usage": "lf hitag dump [-h] [--pwd] [--nrar ] [--crypto] [-k ] [-f ]" }, "lf hitag eload": { "command": "lf hitag eload", @@ -8661,11 +8696,11 @@ "offline": false, "options": [ "-h, --help This help", - "-f, --file Specfiy dump filename", - "-1 Card type Hitag1", - "-2 Card type Hitag2", - "-s Card type HitagS", - "-m Card type HitagM" + "-f, --file Specify dump filename", + "-1, --ht1 Card type Hitag 1", + "-2, --ht2 Card type Hitag 2", + "-s, --hts Card type Hitag S", + "-m, --htm Card type Hitag \u03bc" ], "usage": "lf hitag eload [-h12sm] -f " }, @@ -8702,46 +8737,54 @@ ], "usage": "lf hitag list [-h1crux] [--frame] [-f ]" }, - "lf hitag reader": { - "command": "lf hitag reader", - "description": "Act like a Hitag Reader", + "lf hitag read": { + "command": "lf hitag read", + "description": "Read Hitag memory Crypto mode key format: ISK high + ISK low", "notes": [ - "Hitag S", - "lf hitag reader --01 --nrar 0102030411223344", - "lf hitag reader --02 -k 4F4E4D494B52", - "Hitag 2", - "lf hitag reader --21 -k 4D494B52", - "lf hitag reader --22 --nrar 0102030411223344", - "lf hitag reader --23 -k 4F4E4D494B52", - "lf hitag reader --26" + "Hitag S, plain mode", + "lf hitag read --hts", + "Hitag S, challenge mode", + "lf hitag read --hts --nrar 0102030411223344", + "Hitag S, crypto mode => use default key 4F4E4D494B52 (ONMIKR)", + "lf hitag read --hts --crypto", + "Hitag S, long key = crypto mode", + "lf hitag read --hts -k 4F4E4D494B52", + "", + "Hitag 2, password mode => use default key 4D494B52 (MIKR)", + "lf hitag read --ht2 --pwd", + "Hitag 2, providing a short key = password mode", + "lf hitag read --ht2 -k 4D494B52", + "Hitag 2, challenge mode", + "lf hitag read --ht2 --nrar 0102030411223344", + "Hitag 2, crypto mode => use default key 4F4E4D494B52 (ONMIKR)", + "lf hitag read --ht2 --crypto", + "Hitag 2, providing a long key = crypto mode", + "lf hitag read --ht2 -k 4F4E4D494B52" ], "offline": false, "options": [ "-h, --help This help", - "--01 HitagS, read all pages, challenge mode", - "--02 HitagS, read all pages, crypto mode. Set key=0 for no auth", - "--21 Hitag2, read all pages, password mode. def 4D494B52 (MIKR)", - "--22 Hitag2, read all pages, challenge mode", - "--23 Hitag2, read all pages, crypto mode. Key ISK high + ISK low. def 4F4E4D494B52 (ONMIKR)", - "--25 Hitag2, test recorded authentications (replay?)", - "--26 Hitag2, read UID", - "-k, --key key, 4 or 6 hex bytes", - "--nrar nonce / answer reader, 8 hex bytes" + "-s, --hts Hitag S", + "-2, --ht2 Hitag 2", + "--pwd password mode", + "--nrar nonce / answer writer, 8 hex bytes", + "--crypto crypto mode", + "-k, --key key, 4 or 6 hex bytes" ], - "usage": "lf hitag reader [-h] [--01] [--02] [--21] [--22] [--23] [--25] [--26] [-k ] [--nrar ]" + "usage": "lf hitag read [-hs2] [--pwd] [--nrar ] [--crypto] [-k ]" }, "lf hitag sim": { "command": "lf hitag sim", - "description": "Simulate Hitag2 / HitagS transponder You need to `lf hitag eload` first", + "description": "Simulate Hitag transponder You need to `lf hitag eload` first", "notes": [ "lf hitag sim -2" ], "offline": false, "options": [ "-h, --help This help", - "-1 simulate Hitag1", - "-2 simulate Hitag2", - "-s simulate HitagS" + "-1, --ht1 simulate Hitag 1", + "-2, --ht2 simulate Hitag 2", + "-s, --hts simulate Hitag S" ], "usage": "lf hitag sim [-h12s]" }, @@ -8757,30 +8800,43 @@ ], "usage": "lf hitag sniff [-h]" }, - "lf hitag writer": { - "command": "lf hitag writer", - "description": "Act like a Hitag writerIn password mode the default key is 4D494B52 (MIKR) In crypto mode the default key is 4F4E4D494B52 (ONMIKR) format: ISK high + ISK low.", + "lf hitag wrbl": { + "command": "lf hitag wrbl", + "description": "Write a page in Hitag memory Crypto mode key format: ISK high + ISK low", "notes": [ - "Hitag S", - "lf hitag writer --03 --nrar 0102030411223344 -p 3 -d 01020304", - "lf hitag writer --04 -k 4F4E4D494B52 -p 3 -d 01020304", - "Hitag 2", - "lf hitag writer --24 -k 4F4E4D494B52 -p 3 -d 01020304", - "lf hitag writer --27 -k 4D494B52 -p 3 -d 01020304" + "Hitag S, plain mode", + "lf hitag wrbl --hts -p 6 -d 01020304", + "Hitag S, challenge mode", + "lf hitag wrbl --hts --nrar 0102030411223344 -p 6 -d 01020304", + "Hitag S, crypto mode => use default key 4F4E4D494B52 (ONMIKR)", + "lf hitag wrbl --hts --crypto -p 6 -d 01020304", + "Hitag S, long key = crypto mode", + "lf hitag wrbl --hts -k 4F4E4D494B52 -p 6 -d 01020304", + "", + "Hitag 2, password mode => use default key 4D494B52 (MIKR)", + "lf hitag wrbl --ht2 --pwd -p 6 -d 01020304", + "Hitag 2, providing a short key = password mode", + "lf hitag wrbl --ht2 -k 4D494B52 -p 6 -d 01020304", + "Hitag 2, challenge mode", + "lf hitag wrbl --ht2 --nrar 0102030411223344 -p 6 -d 01020304", + "Hitag 2, crypto mode => use default key 4F4E4D494B52 (ONMIKR)", + "lf hitag wrbl --ht2 --crypto -p 6 -d 01020304", + "Hitag 2, providing a long key = crypto mode", + "lf hitag wrbl --ht2 -k 4F4E4D494B52 -p 6 -d 01020304" ], "offline": false, "options": [ "-h, --help This help", - "--03 HitagS, write page, challenge mode", - "--04 HitagS, write page, crypto mode. Set key=0 for no auth", - "--24 Hitag2, write page, crypto mode.", - "--27 Hitag2, write page, password mode", - "-p, --page page address to write to", - "-d, --data data, 4 hex bytes", + "-s, --hts Hitag S", + "-2, --ht2 Hitag 2", + "--pwd password mode", + "--nrar nonce / answer writer, 8 hex bytes", + "--crypto crypto mode", "-k, --key key, 4 or 6 hex bytes", - "--nrar nonce / answer writer, 8 hex bytes" + "-p, --page page address to write to", + "-d, --data data, 4 hex bytes" ], - "usage": "lf hitag writer [-h] [--03] [--04] [--24] [--27] -p [-d ] [-k ] [--nrar ]" + "usage": "lf hitag wrbl [-hs2] [--pwd] [--nrar ] [--crypto] [-k ] -p -d " }, "lf idteck clone": { "command": "lf idteck clone", @@ -11693,8 +11749,8 @@ } }, "metadata": { - "commands_extracted": 679, + "commands_extracted": 681, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-19T19:11:10" + "extracted_on": "2023-07-21T16:22:30" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index ce203b57a..cd538fe3c 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -98,10 +98,11 @@ Check column "offline" for their availability. |`data manrawdecode `|Y |`Manchester decode binary stream in DemodBuffer` |`data modulation `|Y |`Identify LF signal for clock and modulation` |`data rawdemod `|Y |`Demodulate the data in the GraphBuffer and output binary` -|`data askedgedetect `|Y |`Adjust Graph for manual ASK demod using the length of sample differences to detect the edge of a wave` +|`data askedgedetect `|Y |`Adjust Graph for manual ASK demod` |`data autocorr `|Y |`Autocorrelation over window` -|`data dirthreshold `|Y |`Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev.` +|`data dirthreshold `|Y |`Max rising higher up-thres/ Min falling lower down-thres` |`data decimate `|Y |`Decimate samples` +|`data envelope `|Y |`Generate square envelope of samples` |`data undecimate `|Y |`Un-decimate samples` |`data hide `|Y |`Hide graph window` |`data hpf `|Y |`Remove DC offset from trace` @@ -111,10 +112,11 @@ Check column "offline" for their availability. |`data mtrim `|Y |`Trim out samples from the specified start to the specified stop` |`data norm `|Y |`Normalize max/min to +/-128` |`data plot `|Y |`Show graph window` +|`data cthreshold `|Y |`Average out all values between` |`data rtrim `|Y |`Trim samples from right of trace` |`data setgraphmarkers `|Y |`Set blue and orange marker in graph window` |`data shiftgraphzero `|Y |`Shift 0 for Graphed wave + or - shift value` -|`data timescale `|Y |`Set a timescale to get a differential reading between the yellow and purple markers as time duration` +|`data timescale `|Y |`Set cursor display timescale` |`data zerocrossings `|Y |`Count time between zero-crossings` |`data convertbitstream `|Y |`Convert GraphBuffer's 0/1 values to 127 / -127` |`data getbitstream `|Y |`Convert GraphBuffer's >=1 values to 1 and <1 to 0` @@ -986,15 +988,16 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`lf hitag help `|Y |`This help` -|`lf hitag eload `|N |`Load Hitag dump file into emulator memory` |`lf hitag list `|Y |`List Hitag trace history` -|`lf hitag info `|N |`Hitag2 tag information` -|`lf hitag reader `|N |`Act like a Hitag reader` -|`lf hitag sim `|N |`Simulate Hitag transponder` +|`lf hitag info `|N |`Hitag 2 tag information` +|`lf hitag dump `|N |`Dump Hitag 2 tag` +|`lf hitag read `|N |`Read Hitag memory` +|`lf hitag wrbl `|N |`Write a block (page) in Hitag memory` |`lf hitag sniff `|N |`Eavesdrop Hitag communication` -|`lf hitag writer `|N |`Act like a Hitag writer` -|`lf hitag dump `|N |`Dump Hitag2 tag` -|`lf hitag cc `|N |`Test all challenges` +|`lf hitag cc `|N |`Hitag S: test all provided challenges` +|`lf hitag ta `|N |`Hitag 2: test all recorded authentications` +|`lf hitag eload `|N |`Load Hitag dump file into emulator memory` +|`lf hitag sim `|N |`Simulate Hitag transponder` ### lf idteck From 44b7aa2e8b7c6dc15d8c9f92589666ba5cec4b72 Mon Sep 17 00:00:00 2001 From: startrekdude Date: Fri, 21 Jul 2023 16:02:46 -0400 Subject: [PATCH 709/924] Add a tagType for Seos cards to SimulateIso14443aInit These values were observed from a standard-keyed 4K Seos card. --- armsrc/iso14443a.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 62baab9fc..c47339497 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1165,6 +1165,10 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r sak = 0x20; } break; + case 12: { // HID Seos 4K card + rATQA[0] = 0x01; + sak = 0x20; + } default: { if (g_dbglevel >= DBG_ERROR) Dbprintf("Error: unknown tagtype (%d)", tagType); From 97e61650ab0388d5fd880598a4cbcfbc325fcecc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 22:07:16 +0200 Subject: [PATCH 710/924] added missing value --- client/src/cmdhf14a.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index e6e0a20e8..63b3ebd82 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -754,7 +754,9 @@ int CmdHF14ASim(const char *Cmd) { "hf 14a sim -t 7 -> MFU EV1 / NTAG 215 Amiibo\n" "hf 14a sim -t 8 -> MIFARE Classic 4k\n" "hf 14a sim -t 9 -> FM11RF005SH Shanghai Metro\n" - "hf 14a sim -t 10 -> ST25TA IKEA Rothult\n"); + "hf 14a sim -t 10 -> ST25TA IKEA Rothult\n" + "hf 14a sim -t 11 -> javacard (JCOP)\n" + ); void *argtable[] = { arg_param_begin, @@ -808,7 +810,7 @@ int CmdHF14ASim(const char *Cmd) { CLIParserFree(ctx); - if (tagtype > 10) { + if (tagtype > 11) { PrintAndLogEx(ERR, "Undefined tag %d", tagtype); return PM3_EINVARG; } From b0fd944c7189c41e886ff0536be106c80577784f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 21 Jul 2023 22:08:52 +0200 Subject: [PATCH 711/924] added missing value --- client/src/cmdhf14a.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 63b3ebd82..cff210ad9 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -755,12 +755,13 @@ int CmdHF14ASim(const char *Cmd) { "hf 14a sim -t 8 -> MIFARE Classic 4k\n" "hf 14a sim -t 9 -> FM11RF005SH Shanghai Metro\n" "hf 14a sim -t 10 -> ST25TA IKEA Rothult\n" - "hf 14a sim -t 11 -> javacard (JCOP)\n" + "hf 14a sim -t 11 -> Javacard (JCOP)\n" + "hf 14a sim -t 12 -> 4K Seos card\n" ); void *argtable[] = { arg_param_begin, - arg_int1("t", "type", "<1-10> ", "Simulation type to use"), + arg_int1("t", "type", "<1-12> ", "Simulation type to use"), arg_str0("u", "uid", "", "<4|7|10> hex bytes UID"), arg_int0("n", "num", "", "Exit simulation after blocks have been read by reader. 0 = infinite"), arg_lit0("x", NULL, "Performs the 'reader attack', nr/ar attack against a reader"), @@ -810,7 +811,7 @@ int CmdHF14ASim(const char *Cmd) { CLIParserFree(ctx); - if (tagtype > 11) { + if (tagtype > 12) { PrintAndLogEx(ERR, "Undefined tag %d", tagtype); return PM3_EINVARG; } From 6da1b74fa928ea0b266a5ee42113b68ac44c2d12 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 13:51:28 +0200 Subject: [PATCH 712/924] text --- client/src/cmdhflegic.c | 85 +++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index a0b703453..56399a365 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -85,7 +85,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff uint32_t calc_crc = CRC8Legic(data, 4); PrintAndLogEx(SUCCESS, " " _CYAN_("CDF: System Area")); - PrintAndLogEx(NORMAL, "------------------------------------------------------"); + PrintAndLogEx(INFO, "------------------------------------------------------"); PrintAndLogEx(SUCCESS, "MCD: " _GREEN_("%02X") " MSN: " _GREEN_("%s") " MCC: " _GREEN_("%02X") " ( %s )", data[0], sprint_hex(data + 1, 3), @@ -134,7 +134,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff stamp_len = 0xfc - data[6]; } - PrintAndLogEx(SUCCESS, "DCF: %d (%02x %02x), Token Type=" _YELLOW_("%s") " (OLE=%01u), OL=%02u, FL=%02u", + PrintAndLogEx(SUCCESS, "DCF: %d (%02x %02x) Token Type=" _YELLOW_("%s") " (OLE=%01u) OL=%02u FL=%02u", dcf, data[5], data[6], @@ -153,7 +153,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff strncpy(token_type, "IM", sizeof(token_type) - 1); } - PrintAndLogEx(SUCCESS, "DCF: %d (%02x %02x), Token Type = %s (OLE = %01u)", + PrintAndLogEx(SUCCESS, "DCF: %d (%02x %02x) Token Type = %s (OLE = %01u)", dcf, data[5], data[6], @@ -166,7 +166,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff if (dcf != 0xFFFF) { if (bIsSegmented) { - PrintAndLogEx(SUCCESS, "WRP = %02u, WRC = %01u, RD = %01u, SSC = %02X", + PrintAndLogEx(SUCCESS, "WRP = %02u WRC = %01u RD = %01u SSC = %02X", data[7] & 0x0f, (data[7] & 0x70) >> 4, (data[7] & 0x80) >> 7, @@ -185,7 +185,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff } } } - PrintAndLogEx(NORMAL, "------------------------------------------------------"); + PrintAndLogEx(INFO, "------------------------------------------------------"); uint8_t segCrcBytes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; uint32_t segCalcCRC = 0; @@ -197,7 +197,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff } PrintAndLogEx(SUCCESS, _CYAN_("ADF: User Area")); - PrintAndLogEx(NORMAL, "------------------------------------------------------"); + PrintAndLogEx(INFO, "------------------------------------------------------"); if (bIsSegmented) { @@ -208,8 +208,8 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff for (segmentNum = 1; segmentNum < 128; segmentNum++) { // for decoding the segment header we need at least 4 bytes left in buffer if ((i + 4) > card_size) { - PrintAndLogEx(FAILED, "Cannot read segment header, because the input buffer is too small. " - "Please check that the data is correct and properly aligned. "); + PrintAndLogEx(FAILED, "Cannot read segment header, because the input buffer is too small."); + PrintAndLogEx(FAILED, "Please check that the data is correct and properly aligned"); return_value = PM3_EOUTOFBOUND; goto out; } @@ -236,20 +236,20 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff segCalcCRC = CRC8Legic(segCrcBytes, 8); segCRC = data[i + 4] ^ crc; - PrintAndLogEx(SUCCESS, "Segment | " _YELLOW_("%02u"), segmentNum); - PrintAndLogEx(SUCCESS, "raw header | 0x%02X 0x%02X 0x%02X 0x%02X", + PrintAndLogEx(SUCCESS, "Segment....... " _YELLOW_("%02u"), segmentNum); + PrintAndLogEx(SUCCESS, "Raw header.... 0x%02X 0x%02X 0x%02X 0x%02X", data[i] ^ crc, data[i + 1] ^ crc, data[i + 2] ^ crc, data[i + 3] ^ crc ); - PrintAndLogEx(SUCCESS, "Segment len | %u, Flag: 0x%X (valid:%01u, last:%01u)", + PrintAndLogEx(SUCCESS, "Segment len... %u Flag: 0x%X (valid:%01u last:%01u)", segment_len, segment_flag, (segment_flag & 0x4) >> 2, (segment_flag & 0x8) >> 3 ); - PrintAndLogEx(SUCCESS, " | WRP: %02u, WRC: %02u, RD: %01u, CRC: 0x%02X ( %s )", + PrintAndLogEx(SUCCESS, " WRP: %02u WRC: %02u RD: %01u CRC: 0x%02X ( %s )", wrp, wrc, ((data[i + 3] ^ crc) & 0x80) >> 7, @@ -268,28 +268,33 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff } if (hasWRC) { - PrintAndLogEx(SUCCESS, "\nWRC protected area: (I %d | K %d| WRC %d)", i, k, wrc); - PrintAndLogEx(NORMAL, "\nrow | data"); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------"); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(SUCCESS, _CYAN_("WRC protected area:") " (I %d | K %d| WRC %d)", i, k, wrc); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "## | data"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); for (k = i; k < (i + wrc); ++k) data[k] ^= crc; print_hex_break(data + i, wrc, 16); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------\n"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, ""); i += wrc; } if (hasWRP) { - PrintAndLogEx(SUCCESS, "Remaining write protected area: (I %d | K %d | WRC %d | WRP %d WRP_LEN %d)", i, k, wrc, wrp, wrp_len); - PrintAndLogEx(NORMAL, "\nrow | data"); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------"); + PrintAndLogEx(SUCCESS, _CYAN_("Remaining write protected area:") " (I %d | K %d | WRC %d | WRP %d WRP_LEN %d)", i, k, wrc, wrp, wrp_len); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "## | data"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); for (k = i; k < (i + wrp_len); ++k) data[k] ^= crc; print_hex_break(data + i, wrp_len, 16); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------\n"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, ""); i += wrp_len; // does this one work? (Answer: Only if KGH/BGH is used with BCD encoded card number! So maybe this will show just garbage...) @@ -302,15 +307,16 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff } } if (remain_seg_payload_len > 0) { - PrintAndLogEx(SUCCESS, "Remaining segment payload: (I %d | K %d | Remain LEN %d)", i, k, remain_seg_payload_len); - PrintAndLogEx(NORMAL, "\nrow | data"); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------"); + PrintAndLogEx(SUCCESS, _CYAN_("Remaining segment payload:") " (I %d | K %d | Remain LEN %d)", i, k, remain_seg_payload_len); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "## | data"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); for (k = i; k < (i + remain_seg_payload_len); ++k) data[k] ^= crc; print_hex_break(data + i, remain_seg_payload_len, 16); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------\n"); + PrintAndLogEx(INFO, "---+------------------------------------------------\n"); i += remain_seg_payload_len; } // end with last segment @@ -331,7 +337,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff int wrp_len = (wrp - wrc); int remain_seg_payload_len = (card_size - 22 - wrp); - PrintAndLogEx(SUCCESS, "Unsegmented card - WRP: %02u, WRC: %02u, RD: %01u", + PrintAndLogEx(SUCCESS, "Unsegmented card - WRP: %02u WRC: %02u RD: %01u", wrp, wrc, (data[7] & 0x80) >> 7 @@ -346,20 +352,24 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff } if (hasWRC) { - PrintAndLogEx(SUCCESS, "WRC protected area: (I %d | WRC %d)", i, wrc); - PrintAndLogEx(NORMAL, "\nrow | data"); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------"); + PrintAndLogEx(SUCCESS, _CYAN_("WRC protected area:") " (I %d | WRC %d)", i, wrc); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "## | data"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); print_hex_break(data + i, wrc, 16); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------\n"); + PrintAndLogEx(INFO, "----+------------------------------------------------"); + PrintAndLogEx(INFO, ""); i += wrc; } if (hasWRP) { - PrintAndLogEx(SUCCESS, "Remaining write protected area: (I %d | WRC %d | WRP %d | WRP_LEN %d)", i, wrc, wrp, wrp_len); - PrintAndLogEx(NORMAL, "\nrow | data"); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------"); + PrintAndLogEx(SUCCESS, _CYAN_("Remaining write protected area:") " (I %d | WRC %d | WRP %d | WRP_LEN %d)", i, wrc, wrp, wrp_len); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "## | data"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); print_hex_break(data + i, wrp_len, 16); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------\n"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, ""); i += wrp_len; // Q: does this one work? @@ -374,11 +384,12 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff } if (remain_seg_payload_len > 0) { - PrintAndLogEx(SUCCESS, "Remaining segment payload: (I %d | Remain LEN %d)", i, remain_seg_payload_len); - PrintAndLogEx(NORMAL, "\nrow | data"); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------"); + PrintAndLogEx(SUCCESS, _CYAN_("Remaining segment payload:") " (I %d | Remain LEN %d)", i, remain_seg_payload_len); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "## | data"); + PrintAndLogEx(INFO, "---+------------------------------------------------"); print_hex_break(data + i, remain_seg_payload_len, 16); - PrintAndLogEx(NORMAL, "-----+------------------------------------------------\n"); + PrintAndLogEx(INFO, "---+------------------------------------------------\n"); } } From 0180ca305e7c81b75a24c215277907a6f3dab063 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 14:07:51 +0200 Subject: [PATCH 713/924] added verbose flag to eview/view/info command where it will print the raw hex dump. This makes it a bit cleaner output --- CHANGELOG.md | 1 + client/src/cmdhflegic.c | 98 +++++++++++++++++++++++++---------------- 2 files changed, 61 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96cabb6ed..3caa5134d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Change `hf legic view/eview/info` - now in verbose mode will print raw hex dump (@iceman1001) - Added new test for cotag demod using data commands in pm3_test.sh (@iceman1001) - Added new sample trace file for cotag w fc/272. Thanks s1acky! (@iceman1001) - Fixed `hf legic eload` - now it doesn't crash client (@doegox) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 56399a365..639947311 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -58,32 +58,33 @@ static bool legic_xor(uint8_t *data, uint16_t cardsize) { } static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buffer) { - int i = 0, k = 0, segmentNum = 0, segment_len = 0, segment_flag = 0; - int crc = 0, wrp = 0, wrc = 0; - uint8_t stamp_len = 0; - char token_type[6] = {0, 0, 0, 0, 0, 0}; - int dcf = 0; - int bIsSegmented = 0; - int return_value = PM3_SUCCESS; if (!(card_size == LEGIC_PRIME_MIM22 || card_size == LEGIC_PRIME_MIM256 || card_size == LEGIC_PRIME_MIM1024)) { PrintAndLogEx(FAILED, "Bytebuffer is not any known legic card size! (MIM22, MIM256, MIM1024)"); - return_value = PM3_EFAILED; return PM3_EFAILED; } // copy input buffer into newly allocated buffer, because the existing code mutates the data inside. uint8_t *data = calloc(card_size, sizeof(uint8_t)); - if (!data) { + if (data == NULL) { PrintAndLogEx(WARNING, "Cannot allocate memory"); return PM3_EMALLOC; } memcpy(data, input_buffer, card_size); + int i = 0, k = 0, segmentNum = 0, segment_len = 0, segment_flag = 0; + int wrp = 0, wrc = 0, dcf = 0; + uint8_t stamp_len = 0; + char token_type[6] = {0, 0, 0, 0, 0, 0}; + int bIsSegmented = 0; + int return_value = PM3_SUCCESS; + // Output CDF System area (9 bytes) plus remaining header area (12 bytes) - crc = data[4]; + int crc = data[4]; uint32_t calc_crc = CRC8Legic(data, 4); + PrintAndLogEx(INFO, "--------------------- " _CYAN_("Tag Information") " ----------------------"); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, " " _CYAN_("CDF: System Area")); PrintAndLogEx(INFO, "------------------------------------------------------"); PrintAndLogEx(SUCCESS, "MCD: " _GREEN_("%02X") " MSN: " _GREEN_("%s") " MCC: " _GREEN_("%02X") " ( %s )", @@ -196,6 +197,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff goto out; } + PrintAndLogEx(INFO, ""); PrintAndLogEx(SUCCESS, _CYAN_("ADF: User Area")); PrintAndLogEx(INFO, "------------------------------------------------------"); @@ -271,14 +273,14 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff PrintAndLogEx(INFO, ""); PrintAndLogEx(SUCCESS, _CYAN_("WRC protected area:") " (I %d | K %d| WRC %d)", i, k, wrc); PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, "## | data"); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "## | data | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); for (k = i; k < (i + wrc); ++k) data[k] ^= crc; print_hex_break(data + i, wrc, 16); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); PrintAndLogEx(INFO, ""); i += wrc; } @@ -286,14 +288,14 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff if (hasWRP) { PrintAndLogEx(SUCCESS, _CYAN_("Remaining write protected area:") " (I %d | K %d | WRC %d | WRP %d WRP_LEN %d)", i, k, wrc, wrp, wrp_len); PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, "## | data"); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "## | data | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); for (k = i; k < (i + wrp_len); ++k) data[k] ^= crc; print_hex_break(data + i, wrp_len, 16); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); PrintAndLogEx(INFO, ""); i += wrp_len; @@ -309,14 +311,14 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff if (remain_seg_payload_len > 0) { PrintAndLogEx(SUCCESS, _CYAN_("Remaining segment payload:") " (I %d | K %d | Remain LEN %d)", i, k, remain_seg_payload_len); PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, "## | data"); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "## | data | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); for (k = i; k < (i + remain_seg_payload_len); ++k) data[k] ^= crc; print_hex_break(data + i, remain_seg_payload_len, 16); - PrintAndLogEx(INFO, "---+------------------------------------------------\n"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------\n"); i += remain_seg_payload_len; } // end with last segment @@ -354,10 +356,10 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff if (hasWRC) { PrintAndLogEx(SUCCESS, _CYAN_("WRC protected area:") " (I %d | WRC %d)", i, wrc); PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, "## | data"); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "## | data | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); print_hex_break(data + i, wrc, 16); - PrintAndLogEx(INFO, "----+------------------------------------------------"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); PrintAndLogEx(INFO, ""); i += wrc; } @@ -365,10 +367,10 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff if (hasWRP) { PrintAndLogEx(SUCCESS, _CYAN_("Remaining write protected area:") " (I %d | WRC %d | WRP %d | WRP_LEN %d)", i, wrc, wrp, wrp_len); PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, "## | data"); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "## | data | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); print_hex_break(data + i, wrp_len, 16); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); PrintAndLogEx(INFO, ""); i += wrp_len; @@ -386,10 +388,10 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff if (remain_seg_payload_len > 0) { PrintAndLogEx(SUCCESS, _CYAN_("Remaining segment payload:") " (I %d | Remain LEN %d)", i, remain_seg_payload_len); PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, "## | data"); - PrintAndLogEx(INFO, "---+------------------------------------------------"); + PrintAndLogEx(INFO, "## | data | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); print_hex_break(data + i, remain_seg_payload_len, 16); - PrintAndLogEx(INFO, "---+------------------------------------------------\n"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------\n"); } } @@ -411,9 +413,11 @@ static int CmdLegicInfo(const char *Cmd) { void *argtable[] = { arg_param_begin, + arg_lit0("v", "verbose", "verbose output"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + bool verbose = arg_get_lit(ctx, 1); CLIParserFree(ctx); uint16_t datalen = 0; @@ -429,7 +433,7 @@ static int CmdLegicInfo(const char *Cmd) { // allocate receiver buffer uint8_t *data = calloc(card.cardsize, sizeof(uint8_t)); - if (!data) { + if (data == NULL) { PrintAndLogEx(WARNING, "Cannot allocate memory"); return PM3_EMALLOC; } @@ -441,8 +445,15 @@ static int CmdLegicInfo(const char *Cmd) { return status; } - decode_and_print_memory(card.cardsize, data); + if (verbose) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "## | 0 1 2 3 4 5 6 7 8 9 A B C D E F | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); + print_hex_break(data, datalen, 16); + } + PrintAndLogEx(NORMAL, ""); + decode_and_print_memory(card.cardsize, data); free(data); return PM3_SUCCESS; } @@ -1186,6 +1197,7 @@ static int CmdLegicEView(const char *Cmd) { arg_lit0(NULL, "22", "LEGIC Prime MIM22"), arg_lit0(NULL, "256", "LEGIC Prime MIM256 (def)"), arg_lit0(NULL, "1024", "LEGIC Prime MIM1024"), + arg_lit0("v", "verbose", "verbose output"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1193,6 +1205,7 @@ static int CmdLegicEView(const char *Cmd) { bool m1 = arg_get_lit(ctx, 1); bool m2 = arg_get_lit(ctx, 2); bool m3 = arg_get_lit(ctx, 3); + bool verbose = arg_get_lit(ctx, 4); CLIParserFree(ctx); // validations @@ -1224,10 +1237,16 @@ static int CmdLegicEView(const char *Cmd) { return PM3_ETIMEOUT; } + if (verbose) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "## | 0 1 2 3 4 5 6 7 8 9 A B C D E F | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); + print_hex_break(dump, bytes, 16); + } + PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "## | 0 1 2 3 4 5 6 7 8 9 A B C D E F | ascii"); - PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); - print_hex_break(dump, bytes, 16); + decode_and_print_memory(bytes, dump); + free(dump); return PM3_SUCCESS; } @@ -1380,12 +1399,14 @@ static int CmdLegicView(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_str1("f", "file", "", "Filename of dump"), + arg_lit0("v", "verbose", "verbose output"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); int fnlen = 0; char filename[FILE_PATH_SIZE]; CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); + bool verbose = arg_get_lit(ctx, 2); CLIParserFree(ctx); // read dump file @@ -1396,14 +1417,15 @@ static int CmdLegicView(const char *Cmd) { return res; } - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "## | 0 1 2 3 4 5 6 7 8 9 A B C D E F | ascii"); - PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); - print_hex_break(dump, bytes_read, 16); + if (verbose) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "## | 0 1 2 3 4 5 6 7 8 9 A B C D E F | ascii"); + PrintAndLogEx(INFO, "---+-------------------------------------------------+-----------------"); + print_hex_break(dump, bytes_read, 16); + } PrintAndLogEx(NORMAL, ""); decode_and_print_memory(bytes_read, dump); - free(dump); return PM3_SUCCESS; } From c6cc1b241686d5f2d1a584c8d9e6a7ba45edbfdf Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 14:22:39 +0200 Subject: [PATCH 714/924] fix the loadfile command and more colors --- client/luascripts/hf_legic.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/luascripts/hf_legic.lua b/client/luascripts/hf_legic.lua index 6dcb9d8ca..fb98b777e 100644 --- a/client/luascripts/hf_legic.lua +++ b/client/luascripts/hf_legic.lua @@ -269,7 +269,6 @@ local function padString(str) if (#str == 1) then return '0'..str end - return str end @@ -336,6 +335,7 @@ end --- -- check availability of file function file_check(file_name) + if not file_name then return false, "" end local arr = split(file_name, ".") local path = core.search_file(arr[1], "."..arr[2]) @@ -2424,8 +2424,7 @@ function modifyMode() --- -- load file into mainTAG ["lf"] = function(x) - - if (type(x)=='string' and file_check(x)) then + if (x and not x=="" and type(x)=='string' and file_check(x)) then filename = x else filename = input("enter filename: ", "legic.temp") @@ -2782,7 +2781,7 @@ function modifyMode() } repeat -- default message / prompt - ic=input("Legic command? ('h' for help - 'q' for quit)", "h") + ic=input("Legic command? ('"..acy.."h"..acr.."' for help - '"..acy.."q"..acr.."' for quit)", acy.."h"..acr) -- command actions decisions (first match, longer commands before shorter) if (type(actions[string.lower(string.sub(ic,0,3))])=='function') then actions[string.lower(string.sub(ic,0,3))](string.sub(ic,5)) From ef03d0bee0d480f5f39e660ef46d95439d287267 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 15:51:35 +0200 Subject: [PATCH 715/924] text --- client/src/cmdlf.c | 15 +++++++++------ client/src/cmdlfmotorola.c | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index e6585d334..81ca3a081 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -352,18 +352,21 @@ int CmdLFCommandRead(const char *Cmd) { } } - PrintAndLogEx(DEBUG, "Cmd read - settings"); + PrintAndLogEx(DEBUG, _CYAN_("Cmd read - settings")); PrintAndLogEx(DEBUG, "-------------------"); - PrintAndLogEx(DEBUG, "delay: %u , zero %u , one %u , samples %u", payload.delay, payload.period_0, payload.period_1, payload.samples); - PrintAndLogEx(DEBUG, "Extra symbols"); + PrintAndLogEx(DEBUG, "delay... " _YELLOW_("%u")" zero... " _YELLOW_("%u") " one... " _YELLOW_("%u")" samples... %u", payload.delay, payload.period_0, payload.period_1, payload.samples); + PrintAndLogEx(DEBUG, ""); + PrintAndLogEx(DEBUG, _CYAN_("Extra symbols")); PrintAndLogEx(DEBUG, "-------------"); for (i = 0; i < LF_CMDREAD_MAX_EXTRA_SYMBOLS; i++) { if (payload.symbol_extra[i] == 0x00) continue; - PrintAndLogEx(DEBUG, " %c - %u", payload.symbol_extra[i], payload.period_extra[i]); + PrintAndLogEx(DEBUG, " %c ... " _YELLOW_("%u"), payload.symbol_extra[i], payload.period_extra[i]); } - PrintAndLogEx(DEBUG, "data: %s", payload.data); + PrintAndLogEx(DEBUG, ""); + PrintAndLogEx(DEBUG, "data... " _YELLOW_("%s"), payload.data); + PrintAndLogEx(DEBUG, ""); if (cm) { PrintAndLogEx(INFO, "Press " _GREEN_("") " to exit"); @@ -1825,7 +1828,7 @@ static command_t CommandTable[] = { {"io", CmdLFIO, AlwaysAvailable, "{ ioProx RFIDs... }"}, {"jablotron", CmdLFJablotron, AlwaysAvailable, "{ Jablotron RFIDs... }"}, {"keri", CmdLFKeri, AlwaysAvailable, "{ KERI RFIDs... }"}, - {"motorola", CmdLFMotorola, AlwaysAvailable, "{ Motorola RFIDs... }"}, + {"motorola", CmdLFMotorola, AlwaysAvailable, "{ Motorola Flexpass RFIDs... }"}, {"nedap", CmdLFNedap, AlwaysAvailable, "{ Nedap RFIDs... }"}, {"nexwatch", CmdLFNEXWATCH, AlwaysAvailable, "{ NexWatch RFIDs... }"}, {"noralsy", CmdLFNoralsy, AlwaysAvailable, "{ Noralsy RFIDs... }"}, diff --git a/client/src/cmdlfmotorola.c b/client/src/cmdlfmotorola.c index 90394be54..cd0c91864 100644 --- a/client/src/cmdlfmotorola.c +++ b/client/src/cmdlfmotorola.c @@ -128,7 +128,7 @@ int demodMotorola(bool verbose) { static int CmdMotorolaDemod(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf motorola demod", - "Try to find Motorola preamble, if found decode / descramble data", + "Try to find Motorola Flexpass preamble, if found decode / descramble data", "lf motorola demod" ); @@ -144,7 +144,7 @@ static int CmdMotorolaDemod(const char *Cmd) { static int CmdMotorolaReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf motorola reader", - "read a Motorola tag", + "read a Motorola Flexpass tag", "lf motorola reader -@ -> continuous reader mode" ); From eaf8aac21700b371ce544220707b2c75ff3a996d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 17:34:27 +0200 Subject: [PATCH 716/924] better smoothing in the envelope command and also allow for other raw demod to accept a larger clock as in param --- client/src/cmddata.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 43fa20911..be8f5e716 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -740,7 +740,7 @@ static int Cmdaskbiphdemod(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - uint8_t clk = (uint8_t)arg_get_int_def(ctx, 1, 0) & 0xFF; + uint16_t clk = (uint16_t)arg_get_int_def(ctx, 1, 0); bool invert = arg_get_lit(ctx, 2); int offset = arg_get_int_def(ctx, 3, 0); uint8_t max_err = (uint8_t)arg_get_int_def(ctx, 4, 50) & 0xFF; @@ -1397,7 +1397,7 @@ static int CmdNRZrawDemod(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - uint8_t clk = (uint8_t)arg_get_int_def(ctx, 1, 0) & 0xFF; + uint16_t clk = (uint16_t)arg_get_int_def(ctx, 1, 0); bool invert = arg_get_lit(ctx, 2); uint8_t max_err = (uint8_t)arg_get_int_def(ctx, 3, 100) & 0xFF; CLIParserFree(ctx); @@ -1427,7 +1427,7 @@ int CmdPSK1rawDemod(const char *Cmd) { }; CLIExecWithReturn(ctx, Cmd, argtable, true); - uint8_t clk = (uint8_t)arg_get_int_def(ctx, 1, 0) & 0xFF; + uint16_t clk = (uint16_t)arg_get_int_def(ctx, 1, 0); bool invert = arg_get_lit(ctx, 2); uint8_t max_err = (uint8_t)arg_get_int_def(ctx, 3, 100) & 0xFF; CLIParserFree(ctx); @@ -3370,14 +3370,19 @@ static int envelope_square(const int *in, int *out, size_t len) { return PM3_EINVARG; } - for (size_t i = 0; i < len - 5; i++) { - if (in[i] == 0 && in[i + 1] == 0 && in[i + 2] == 0 && in[i + 3] == 0 && in[i + 4] == 0) { - i += 4; + size_t i = 0; + while ( i < len - 8) { + + if (in[i] == 0 && in[i+1] == 0 && in[i+2] == 0 && in[i+3] == 0 && + in[i+4] == 0 && in[i+5] == 0 && in[i+6] == 0 && in[i+7] == 0) { + + i += 8; continue; } out[i] = 255; + i++; } return PM3_SUCCESS; } From 2d5724f4c38a8858c286972727b0a951b8d42750 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 18:19:02 +0200 Subject: [PATCH 717/924] text --- CHANGELOG.md | 3 ++- client/src/cmdlfcotag.c | 28 ++++++++++++++++++++++++++++ client/src/comms.c | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3caa5134d..bcd40f863 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Change `hf legic view/eview/info` - now in verbose mode will print raw hex dump (@iceman1001) + - Changed `lf cotag demo` - a new decoder (@iceman1001) + - Changed `hf legic view/eview/info` - now in verbose mode will print raw hex dump (@iceman1001) - Added new test for cotag demod using data commands in pm3_test.sh (@iceman1001) - Added new sample trace file for cotag w fc/272. Thanks s1acky! (@iceman1001) - Fixed `hf legic eload` - now it doesn't crash client (@doegox) diff --git a/client/src/cmdlfcotag.c b/client/src/cmdlfcotag.c index 8161ceacc..2306b0024 100644 --- a/client/src/cmdlfcotag.c +++ b/client/src/cmdlfcotag.c @@ -25,6 +25,7 @@ #include "ui.h" // PrintAndLog #include "ctype.h" // tolower #include "cliparser.h" +#include "commonutil.h" // reflect32 static int CmdHelp(const char *Cmd); @@ -37,6 +38,9 @@ int demodCOTAG(bool verbose) { size_t bitlen = COTAG_BITS; memcpy(bits, g_DemodBuffer, COTAG_BITS); + uint8_t inv_bits[COTAG_BITS] = {0}; + memcpy(inv_bits, g_DemodBuffer, COTAG_BITS); + uint8_t alignPos = 0; uint16_t err = manrawdecode(bits, &bitlen, 1, &alignPos); if (err > 50) { @@ -55,14 +59,38 @@ int demodCOTAG(bool verbose) { uint32_t raw3 = bytebits_to_byteLSBF(bits + 64, 32); uint32_t raw4 = bytebits_to_byteLSBF(bits + 96, 32); + /* fc 161: 1010 0001 -> LSB 1000 0101 cn 33593 1000 0011 0011 1001 -> LSB 1001 1100 1100 0001 cccc cccc cccc cccc ffffffff 0 1001 1100 1100 0001 1000 0101 0000 0000 100001010000000001111011100000011010000010000000000000000000000000000000000000000000000000000000100111001100000110000101000 1001 1100 1100 0001 10000101 + + COTAG FC/272 + 1 7 7 D E 2 0 0 8 0 0 0 3 9 2 0 D 0 4 0000000000000 + 0001 0111 0111 1101 1110 0010 0000 0000 1000 0000 0000 0000 0011 1001 0010 0000 1101 0000 0100 0000000000000000000000000000000000000000000000000000000 + 0001 0111 0111 1101 1110 001 0010 1001 0011 1000 0110 0100 + */ PrintAndLogEx(SUCCESS, "COTAG Found: FC " _GREEN_("%u")", CN: " _GREEN_("%u")" Raw: %08X%08X%08X%08X", fc, cn, raw1, raw2, raw3, raw4); + + bitlen = COTAG_BITS; + err = manrawdecode(inv_bits, &bitlen, 0, &alignPos); + if (err < 50) { + uint32_t cn_large = bytebits_to_byte(inv_bits + 1, 23); + cn_large = reflect32(cn_large) >> 9; + uint8_t a = bytebits_to_byte(inv_bits + 48, 4); + uint8_t b = bytebits_to_byte(inv_bits + 52, 4); + uint8_t c = bytebits_to_byte(inv_bits + 56, 4); + uint16_t fc_large = NIBBLE_LOW(c) << 8 | NIBBLE_LOW(b) << 4 | NIBBLE_LOW(a); + + raw1 = bytebits_to_byte(inv_bits, 32); + raw2 = bytebits_to_byte(inv_bits + 32, 32); + raw3 = bytebits_to_byte(inv_bits + 64, 32); + raw4 = bytebits_to_byte(inv_bits + 96, 32); + PrintAndLogEx(SUCCESS, " FC " _GREEN_("%u")", CN: " _GREEN_("%u")" Raw: %08X%08X%08X%08X", fc_large, cn_large, raw1, raw2, raw3, raw4); + } return PM3_SUCCESS; } diff --git a/client/src/comms.c b/client/src/comms.c index 3b7509a38..1422c42d3 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -97,7 +97,7 @@ void SendCommandOLD(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, v #endif if (!g_session.pm3_present) { - PrintAndLogEx(WARNING, "Sending bytes to Proxmark3 failed." _YELLOW_("offline")); + PrintAndLogEx(WARNING, "Sending bytes to Proxmark3 failed ( " _RED_("offline") " )"); return; } From c6b720fdcda6bf6b482df637e5f608ae47e68b41 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 23:26:04 +0200 Subject: [PATCH 718/924] make data grid less verbose --- client/src/cmddata.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index be8f5e716..3dc6494c0 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1601,7 +1601,8 @@ int CmdGrid(const char *Cmd) { g_PlotGridX = arg_get_dbl_def(ctx, 1, 0); g_PlotGridY = arg_get_dbl_def(ctx, 2, 0); CLIParserFree(ctx); - PrintAndLogEx(INFO, "Setting X %.0f Y %.0f", g_PlotGridX, g_PlotGridY); + + PrintAndLogEx(DEBUG, "Setting X %.0f Y %.0f", g_PlotGridX, g_PlotGridY); g_PlotGridXdefault = g_PlotGridX; g_PlotGridYdefault = g_PlotGridY; RepaintGraphWindow(); From 8e387231491e1e46c067c1d8d1c4c946cf0944a0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 23:27:30 +0200 Subject: [PATCH 719/924] just in case psk get odd clocks in some old system --- common/lfdemod.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/common/lfdemod.c b/common/lfdemod.c index 5e2f1fa54..f7f734eb4 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -1118,10 +1118,12 @@ uint16_t countFC(const uint8_t *bits, size_t size, bool fskAdj) { fcH = fcLens[best2]; fcL = fcLens[best1]; } + /* if ((size - 180) / fcH / 3 > fcCnts[best1] + fcCnts[best2]) { if (g_debugMode == 2) prnt("DEBUG countfc: fc is too large: %zu > %u. Not psk or fsk", (size - 180) / fcH / 3, fcCnts[best1] + fcCnts[best2]); return 0; //lots of waves not psk or fsk } + */ // TODO: take top 3 answers and compare to known Field clocks to get top 2 uint16_t fcs = (((uint16_t)fcH) << 8) | fcL; @@ -1132,8 +1134,8 @@ uint16_t countFC(const uint8_t *bits, size_t size, bool fskAdj) { // detect psk clock by reading each phase shift // a phase shift is determined by measuring the sample length of each wave int DetectPSKClock(uint8_t *dest, size_t size, int clock, size_t *firstPhaseShift, uint8_t *curPhase, uint8_t *fc) { - uint8_t clk[] = {255, 16, 32, 40, 50, 64, 100, 128, 255}; //255 is not a valid clock - uint16_t loopCnt = 4096; //don't need to loop through entire array... + uint16_t clk[] = {255, 16, 32, 40, 50, 64, 100, 128, 256, 272, 384}; // 255 is not a valid clock + uint16_t loopCnt = 4096; // don't need to loop through entire array... if (size < 160 + 20) return 0; // size must be larger than 20 here, and 160 later on. @@ -1154,8 +1156,8 @@ int DetectPSKClock(uint8_t *dest, size_t size, int clock, size_t *firstPhaseShif uint8_t clkCnt; uint16_t waveLenCnt, fullWaveLen = 0; - uint16_t bestErr[] = {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}; - uint16_t peaksdet[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + uint16_t bestErr[] = {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}; + uint16_t peaksdet[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //find start of modulating data in trace size_t i = findModStart(dest, size, *fc); @@ -1177,7 +1179,7 @@ int DetectPSKClock(uint8_t *dest, size_t size, int clock, size_t *firstPhaseShif } //test each valid clock from greatest to smallest to see which lines up - for (clkCnt = 7; clkCnt >= 1 ; clkCnt--) { + for (clkCnt = 9; clkCnt >= 1 ; clkCnt--) { uint8_t tol = *fc / 2; size_t lastClkBit = firstFullWave; //set end of wave as clock align size_t waveStart = 0; @@ -1217,8 +1219,8 @@ int DetectPSKClock(uint8_t *dest, size_t size, int clock, size_t *firstPhaseShif } //all tested with errors //return the highest clk with the most peaks found - uint8_t best = 7; - for (i = 7; i >= 1; i--) { + uint8_t best = 9; + for (i = 9; i >= 1; i--) { if (peaksdet[i] > peaksdet[best]) best = i; From c8acec74589d69815f234e7bf236e4b65d1827ee Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 22 Jul 2023 23:30:53 +0200 Subject: [PATCH 720/924] clean up --- client/src/cmdhfmfp.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/client/src/cmdhfmfp.h b/client/src/cmdhfmfp.h index 29723b204..e8be12e07 100644 --- a/client/src/cmdhfmfp.h +++ b/client/src/cmdhfmfp.h @@ -20,10 +20,6 @@ #include "common.h" - -#define AES_KEY_LEN 16 -#define MAX_AES_KEYS_LIST_LEN 1024 - typedef enum { MFP_UNKNOWN = 0, DESFIRE_MF3ICD40, From 4b64a45899cb5dc0eea5840b214f70436ee4d7fc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Jul 2023 11:15:52 +0200 Subject: [PATCH 721/924] make style --- client/src/cmddata.c | 6 +++--- client/src/cmdhf14a.c | 2 +- client/src/cmdhflegic.c | 4 ++-- doc/commands.json | 29 +++++++++++++++++------------ doc/commands.md | 2 +- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 3dc6494c0..74273921f 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -3373,10 +3373,10 @@ static int envelope_square(const int *in, int *out, size_t len) { size_t i = 0; - while ( i < len - 8) { + while (i < len - 8) { - if (in[i] == 0 && in[i+1] == 0 && in[i+2] == 0 && in[i+3] == 0 && - in[i+4] == 0 && in[i+5] == 0 && in[i+6] == 0 && in[i+7] == 0) { + if (in[i] == 0 && in[i + 1] == 0 && in[i + 2] == 0 && in[i + 3] == 0 && + in[i + 4] == 0 && in[i + 5] == 0 && in[i + 6] == 0 && in[i + 7] == 0) { i += 8; continue; diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index cff210ad9..f2ca64076 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -757,7 +757,7 @@ int CmdHF14ASim(const char *Cmd) { "hf 14a sim -t 10 -> ST25TA IKEA Rothult\n" "hf 14a sim -t 11 -> Javacard (JCOP)\n" "hf 14a sim -t 12 -> 4K Seos card\n" - ); + ); void *argtable[] = { arg_param_begin, diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 639947311..160eac05b 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -84,7 +84,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff uint32_t calc_crc = CRC8Legic(data, 4); PrintAndLogEx(INFO, "--------------------- " _CYAN_("Tag Information") " ----------------------"); - PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, " " _CYAN_("CDF: System Area")); PrintAndLogEx(INFO, "------------------------------------------------------"); PrintAndLogEx(SUCCESS, "MCD: " _GREEN_("%02X") " MSN: " _GREEN_("%s") " MCC: " _GREEN_("%02X") " ( %s )", @@ -417,7 +417,7 @@ static int CmdLegicInfo(const char *Cmd) { arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 1); CLIParserFree(ctx); uint16_t datalen = 0; diff --git a/doc/commands.json b/doc/commands.json index 7e6061ec3..84b09c862 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -1297,19 +1297,21 @@ "hf 14a sim -t 7 -> MFU EV1 / NTAG 215 Amiibo", "hf 14a sim -t 8 -> MIFARE Classic 4k", "hf 14a sim -t 9 -> FM11RF005SH Shanghai Metro", - "hf 14a sim -t 10 -> ST25TA IKEA Rothult" + "hf 14a sim -t 10 -> ST25TA IKEA Rothult", + "hf 14a sim -t 11 -> Javacard (JCOP)", + "hf 14a sim -t 12 -> 4K Seos card" ], "offline": false, "options": [ "-h, --help This help", - "-t, --type <1-10> Simulation type to use", + "-t, --type <1-12> Simulation type to use", "-u, --uid <4|7|10> hex bytes UID", "-n, --num Exit simulation after blocks have been read by reader. 0 = infinite", "-x Performs the 'reader attack', nr/ar attack against a reader", "--sk Fill simulator keys from found keys", "-v, --verbose verbose output" ], - "usage": "hf 14a sim [-hxv] -t <1-10> [-u ] [-n ] [--sk]" + "usage": "hf 14a sim [-hxv] -t <1-12> [-u ] [-n ] [--sk]" }, "hf 14a sniff": { "command": "hf 14a sniff", @@ -3617,9 +3619,10 @@ "-h, --help This help", "--22 LEGIC Prime MIM22", "--256 LEGIC Prime MIM256 (def)", - "--1024 LEGIC Prime MIM1024" + "--1024 LEGIC Prime MIM1024", + "-v, --verbose verbose output" ], - "usage": "hf legic eview [-h] [--22] [--256] [--1024]" + "usage": "hf legic eview [-hv] [--22] [--256] [--1024]" }, "hf legic info": { "command": "hf legic info", @@ -3629,9 +3632,10 @@ ], "offline": false, "options": [ - "-h, --help This help" + "-h, --help This help", + "-v, --verbose verbose output" ], - "usage": "hf legic info [-h]" + "usage": "hf legic info [-hv]" }, "hf legic list": { "command": "hf legic list", @@ -3723,9 +3727,10 @@ "offline": true, "options": [ "-h, --help This help", - "-f, --file Filename of dump" + "-f, --file Filename of dump", + "-v, --verbose verbose output" ], - "usage": "hf legic view [-h] -f " + "usage": "hf legic view [-hv] -f " }, "hf legic wipe": { "command": "hf legic wipe", @@ -9204,7 +9209,7 @@ }, "lf motorola demod": { "command": "lf motorola demod", - "description": "Try to find Motorola preamble, if found decode / descramble data", + "description": "Try to find Motorola Flexpass preamble, if found decode / descramble data", "notes": [ "lf motorola demod" ], @@ -9216,7 +9221,7 @@ }, "lf motorola reader": { "command": "lf motorola reader", - "description": "read a Motorola tag", + "description": "read a Motorola Flexpass tag", "notes": [ "lf motorola reader -@ -> continuous reader mode" ], @@ -11751,6 +11756,6 @@ "metadata": { "commands_extracted": 681, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-21T16:22:30" + "extracted_on": "2023-07-23T09:14:42" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index cd538fe3c..adbecb5bf 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -1070,7 +1070,7 @@ Check column "offline" for their availability. ### lf motorola - { Motorola RFIDs... } + { Motorola Flexpass RFIDs... } |command |offline |description |------- |------- |----------- From c5c829bce2efd76140c9163821c87d246a225e2b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Jul 2023 11:57:03 +0200 Subject: [PATCH 722/924] a bunch of minor textual changes, hiding things when no compilation support for it, also fixed the loop in keyroll generation. Added the skeleton SAM command --- CHANGELOG.md | 20 ++++---- client/src/cmdhficlass.c | 108 +++++++++++++++++++++++++++------------ common/cardhelper.c | 68 +++++++++++++++++++----- common/cardhelper.h | 1 + 4 files changed, 143 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcd40f863..51a06b0db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `hf iclass config` - now loops correct in keyroll generation (@iceman1001) + - Added `hf iclass sam` - skeleton command (@iceman1001) - Changed `lf cotag demo` - a new decoder (@iceman1001) - Changed `hf legic view/eview/info` - now in verbose mode will print raw hex dump (@iceman1001) - Added new test for cotag demod using data commands in pm3_test.sh (@iceman1001) @@ -15,7 +17,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added `hf mfp list` - interprets MIFARE Plus commands in traces (@DidierA) - Changed `hf legic sim` - loop and return codes on deviceside updated to DEFINES (@iceman1001) - Changed `hf legic einfo` - now accepts the three different cardsizes as params (@iceman1001) - - Fix `lf cotag reader -1` - now doesn't fail (@iceman1001) + - Fixed `lf cotag reader -1` - now doesn't fail (@iceman1001) - Added support for LZ4 compressed hadnested tables (@doegox) - Changed `emv reader -v` - now tries to print found transactions logs (@iceman1001) - Added ISO4217 currency lookup (@iceman1001) @@ -23,10 +25,10 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `emv reader -v` - now can decode track1/2 data if found (@iceman1001) - Added `emv reader` - act as a EMV reader (@iceman1001) - Added support for Apple Wallet NFC Passes with the Value Added Services protocol implementation (@gm3197) - - Fix compiling liblua on iOS (@The-SamminAter) + - Fixed compiling liblua on iOS (@The-SamminAter) - Changed `hf_mf_luxeo_dump.lua` - now have list of keys to iterate (@iceman1001) - Fixed the timeout of TCP connections (@wh201906) - - Made the connection timeout configurable (@wh201906) + - Changed the connection timeout configurable (@wh201906) ## [Seven.4.16717][2023-06-25] - Change `hf 14a info` - now identifes QL88 tags (@iceman1001) @@ -43,7 +45,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added more default keys (@iceman1001) Thanks anon! - Fixed `pm3-flash-all` shell script now correctly identify the if running on outdated bootloader (@iceman1001) - Fixed `hf 15693/iclass sniff` trace timings (@nvx) - - Fix LegicCash segment handling in `hf_legic.lua` script (@jmichelp) + - Fixed LegicCash segment handling in `hf_legic.lua` script (@jmichelp) - Fixed `trace list` - now handles marking of crc bytes w color a bit better (@iceman1001) - Changed `hf mfu pwdgen -r` - now generates pwd/pack for Philips Sonicare, thanks @ckuenzi, @atc1441 (@iceman1001) - Changed `hf mfu info` - now detects Philips Sonicare devices (@iceman1001) @@ -133,11 +135,11 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf mfu info` - now also does a simple OTP fingerprinting (@iceman1001) - Changed `hf mf wrbl` - now checks for strict readonly ACL's in the data to write (@iceman1001) - Changed `hf mf view` - verbose printing if strict readonly ACL's exists in dump file (@iceman1001) - - Add command `piv authsign` to get a buffer signed by the selected key (@jmichelp) - - Add command `piv scan` which tries to read all known containers on PIV (@jmichelp) - - Add support for PIV commands, over wired and contactless interfaces (@jmichelp) - - Add `--shallow` option to `hf iclass` reader commands to do shallow (ASK) reader modulation instead of OOK (@nvx) - - Improved NXP SLI/SLIX series tag identification (@nvx) + - Added command `piv authsign` to get a buffer signed by the selected key (@jmichelp) + - Added command `piv scan` which tries to read all known containers on PIV (@jmichelp) + - Added support for PIV commands, over wired and contactless interfaces (@jmichelp) + - Added `--shallow` option to `hf iclass` reader commands to do shallow (ASK) reader modulation instead of OOK (@nvx) + - Change and improved NXP SLI/SLIX series tag identification (@nvx) - Fixed buffer overflow in "lf em 4x05 sniff" (@HeinrichsH) - Fixed potential NULL array printing (@jmichelp) - Added PIV aid to resource file (@jmichelp) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index a48bbb98e..7ccec1221 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -40,7 +40,6 @@ #include "crypto/asn1utils.h" // ASN1 decoder #include "preferences.h" - #define PICOPASS_BLOCK_SIZE 8 #define NUM_CSNS 9 #define ICLASS_KEYS_MAX 8 @@ -400,9 +399,10 @@ static int generate_config_card(const iclass_config_card_item_t *o, uint8_t *ke // encrypted 0xFF PrintAndLogEx(INFO, "Setting 0xFF's... " NOLF); - for (uint8_t i = 0x16; i <= app1_limit; i++) { + for (uint16_t i = 0x16; i < (app1_limit + 1); i++) { memcpy(data + (i * 8), ffs, sizeof(ffs)); } + PrintAndLogEx(NORMAL, "( " _GREEN_("ok") " )"); // revert potential modified app1_limit @@ -443,14 +443,14 @@ static void fuse_config(const picopass_hdr_t *hdr) { uint16_t otp = (hdr->conf.otp[1] << 8 | hdr->conf.otp[0]); - PrintAndLogEx(INFO, " Raw: " _YELLOW_("%s"), sprint_hex((uint8_t *)&hdr->conf, 8)); - PrintAndLogEx(INFO, " " _YELLOW_("%02X") "..................... app limit", hdr->conf.app_limit); - PrintAndLogEx(INFO, " " _YELLOW_("%04X") " ( %5u )...... OTP", otp, otp); - PrintAndLogEx(INFO, " " _YELLOW_("%02X") "............ block write lock", hdr->conf.block_writelock); - PrintAndLogEx(INFO, " " _YELLOW_("%02X") "......... chip", hdr->conf.chip_config); - PrintAndLogEx(INFO, " " _YELLOW_("%02X") "...... mem", hdr->conf.mem_config); - PrintAndLogEx(INFO, " " _YELLOW_("%02X") "... EAS", hdr->conf.eas); - PrintAndLogEx(INFO, " " _YELLOW_("%02X") " fuses", hdr->conf.fuses); + PrintAndLogEx(INFO, " Raw... " _YELLOW_("%s"), sprint_hex((uint8_t *)&hdr->conf, 8)); + PrintAndLogEx(INFO, " " _YELLOW_("%02X") " ( %3u )............. app limit", hdr->conf.app_limit, hdr->conf.app_limit); + PrintAndLogEx(INFO, " " _YELLOW_("%04X") " ( %5u )...... OTP", otp, otp); + PrintAndLogEx(INFO, " " _YELLOW_("%02X") "............ block write lock", hdr->conf.block_writelock); + PrintAndLogEx(INFO, " " _YELLOW_("%02X") "......... chip", hdr->conf.chip_config); + PrintAndLogEx(INFO, " " _YELLOW_("%02X") "...... mem", hdr->conf.mem_config); + PrintAndLogEx(INFO, " " _YELLOW_("%02X") "... EAS", hdr->conf.eas); + PrintAndLogEx(INFO, " " _YELLOW_("%02X") " fuses", hdr->conf.fuses); uint8_t fuses = hdr->conf.fuses; @@ -594,47 +594,47 @@ static void mem_app_config(const picopass_hdr_t *hdr) { PrintAndLogEx(INFO, " * Kd, Debit key, AA1 Kc, Credit key, AA2 *"); uint8_t keyAccess = isset(mem, 0x01); if (keyAccess) { - PrintAndLogEx(INFO, " Read AA1....... debit"); - PrintAndLogEx(INFO, " Write AA1...... debit"); - PrintAndLogEx(INFO, " Read AA2....... credit"); - PrintAndLogEx(INFO, " Write AA2...... credit"); + PrintAndLogEx(INFO, " Read AA1..... debit"); + PrintAndLogEx(INFO, " Write AA1.... debit"); + PrintAndLogEx(INFO, " Read AA2..... credit"); + PrintAndLogEx(INFO, " Write AA2.... credit"); PrintAndLogEx(INFO, " Debit........ debit or credit"); PrintAndLogEx(INFO, " Credit....... credit"); } else { - PrintAndLogEx(INFO, " Read AA1....... debit or credit"); - PrintAndLogEx(INFO, " Write AA1...... credit"); - PrintAndLogEx(INFO, " Read AA2....... debit or credit"); - PrintAndLogEx(INFO, " Write AA2...... credit"); + PrintAndLogEx(INFO, " Read AA1..... debit or credit"); + PrintAndLogEx(INFO, " Write AA1.... credit"); + PrintAndLogEx(INFO, " Read AA2..... debit or credit"); + PrintAndLogEx(INFO, " Write AA2.... credit"); PrintAndLogEx(INFO, " Debit........ debit or credit"); PrintAndLogEx(INFO, " Credit....... credit"); } } void print_picopass_info(const picopass_hdr_t *hdr) { - PrintAndLogEx(INFO, "-------------------- " _CYAN_("card configuration") " --------------------"); + PrintAndLogEx(INFO, "-------------------- " _CYAN_("Card configuration") " --------------------"); fuse_config(hdr); mem_app_config(hdr); } void print_picopass_header(const picopass_hdr_t *hdr) { - PrintAndLogEx(INFO, "--------------------------- " _CYAN_("card") " ---------------------------"); - PrintAndLogEx(SUCCESS, " CSN: " _GREEN_("%s") " uid", sprint_hex(hdr->csn, sizeof(hdr->csn))); - PrintAndLogEx(SUCCESS, " Config: %s Card configuration", sprint_hex((uint8_t *)&hdr->conf, sizeof(hdr->conf))); - PrintAndLogEx(SUCCESS, "E-purse: %s Card challenge, CC", sprint_hex(hdr->epurse, sizeof(hdr->epurse))); + PrintAndLogEx(INFO, "--------------------------- " _CYAN_("Card") " ---------------------------"); + PrintAndLogEx(SUCCESS, " CSN... " _GREEN_("%s") " uid", sprint_hex(hdr->csn, sizeof(hdr->csn))); + PrintAndLogEx(SUCCESS, " Config... %s card configuration", sprint_hex((uint8_t *)&hdr->conf, sizeof(hdr->conf))); + PrintAndLogEx(SUCCESS, "E-purse... %s card challenge, CC", sprint_hex(hdr->epurse, sizeof(hdr->epurse))); if (memcmp(hdr->key_d, zeros, sizeof(zeros)) && memcmp(hdr->key_d, empty, sizeof(empty))) { - PrintAndLogEx(SUCCESS, " Kd: " _YELLOW_("%s") " debit key", sprint_hex(hdr->key_d, sizeof(hdr->key_d))); + PrintAndLogEx(SUCCESS, " Kd... " _YELLOW_("%s") " debit key", sprint_hex(hdr->key_d, sizeof(hdr->key_d))); } else { - PrintAndLogEx(SUCCESS, " Kd: %s debit key ( hidden )", sprint_hex(hdr->key_d, sizeof(hdr->key_d))); + PrintAndLogEx(SUCCESS, " Kd... %s debit key ( hidden )", sprint_hex(hdr->key_d, sizeof(hdr->key_d))); } if (memcmp(hdr->key_c, zeros, sizeof(zeros)) && memcmp(hdr->key_c, empty, sizeof(empty))) { - PrintAndLogEx(SUCCESS, " Kc: " _YELLOW_("%s") " credit key", sprint_hex(hdr->key_c, sizeof(hdr->key_c))); + PrintAndLogEx(SUCCESS, " Kc... " _YELLOW_("%s") " credit key", sprint_hex(hdr->key_c, sizeof(hdr->key_c))); } else { - PrintAndLogEx(SUCCESS, " Kc: %s credit key ( hidden )", sprint_hex(hdr->key_c, sizeof(hdr->key_c))); + PrintAndLogEx(SUCCESS, " Kc... %s credit key ( hidden )", sprint_hex(hdr->key_c, sizeof(hdr->key_c))); } - PrintAndLogEx(SUCCESS, " AIA: %s Application Issuer area", sprint_hex(hdr->app_issuer_area, sizeof(hdr->app_issuer_area))); + PrintAndLogEx(SUCCESS, " AIA... %s application issuer area", sprint_hex(hdr->app_issuer_area, sizeof(hdr->app_issuer_area))); } static int CmdHFiClassList(const char *Cmd) { @@ -2469,7 +2469,7 @@ static int CmdHFiClass_ReadBlock(const char *Cmd) { return PM3_SUCCESS; // crypto helper available. - PrintAndLogEx(INFO, "----------------------------- " _CYAN_("cardhelper") " -----------------------------"); + PrintAndLogEx(INFO, "----------------------------- " _CYAN_("Cardhelper") " -----------------------------"); switch (blockno) { case 6: { @@ -2509,7 +2509,7 @@ static int CmdHFiClass_ReadBlock(const char *Cmd) { PrintAndLogEx(SUCCESS, " bin : %s", pbin); PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, "------------------------------ " _CYAN_("wiegand") " -------------------------------"); + PrintAndLogEx(INFO, "------------------------------ " _CYAN_("Wiegand") " -------------------------------"); wiegand_message_t packed = initialize_message_object(top, mid, bot, 0); HIDTryUnpack(&packed); } else { @@ -4147,6 +4147,48 @@ static int CmdHFiClassConfigCard(const char *Cmd) { return PM3_SUCCESS; } +static int CmdHFiClassSAM(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf iclass sam", + "Manage via SAM\n", + "hf iclass sam\n" + ); + + void *argtable[] = { + arg_param_begin, + arg_str0("d", "data", "", "data"), + arg_lit0("v", "verbose", "verbose output"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + int dlen = 0; + uint8_t data[128] = {0}; + CLIGetHexWithReturn(ctx, 1, data, &dlen); + + bool verbose = arg_get_lit(ctx, 2); + CLIParserFree(ctx); + + Iso7816CommandChannel channel = CC_CONTACT; + if (IfPm3Smartcard() == false) { + if (channel == CC_CONTACT) { + PrintAndLogEx(WARNING, "PM3 does not have SMARTCARD support, exiting"); + return PM3_EDEVNOTSUPP; + } + } + + int res = IsHIDSamPresent(verbose); + if (res != PM3_SUCCESS) { + return res; + } + + SetAPDULogging(verbose); + +// do things with sending apdus.. + + SetAPDULogging(false); + return PM3_SUCCESS; +} + static command_t CommandTable[] = { {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("operations") " ---------------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, @@ -4156,7 +4198,7 @@ static command_t CommandTable[] = { {"list", CmdHFiClassList, AlwaysAvailable, "List iclass history"}, {"rdbl", CmdHFiClass_ReadBlock, IfPm3Iclass, "Read Picopass / iCLASS block"}, {"reader", CmdHFiClassReader, IfPm3Iclass, "Act like a Picopass / iCLASS reader"}, - {"restore", CmdHFiClassRestore, IfPm3Iclass, "Restore a dump file onto a Picopass / iCLASS tag"}, + {"restore", CmdHFiClassRestore, IfPm3Iclass, "Restore a dump file onto a Picopass / iCLASS tag"}, {"sniff", CmdHFiClassSniff, IfPm3Iclass, "Eavesdrop Picopass / iCLASS communication"}, {"wrbl", CmdHFiClass_WriteBlock, IfPm3Iclass, "Write Picopass / iCLASS block"}, @@ -4165,7 +4207,7 @@ static command_t CommandTable[] = { {"chk", CmdHFiClassCheckKeys, IfPm3Iclass, "Check keys"}, {"loclass", CmdHFiClass_loclass, AlwaysAvailable, "Use loclass to perform bruteforce reader attack"}, {"lookup", CmdHFiClassLookUp, AlwaysAvailable, "Uses authentication trace to check for key in dictionary file"}, - {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("simulation") " ---------------------"}, + {"-----------", CmdHelp, IfPm3Iclass, "--------------------- " _CYAN_("simulation") " ---------------------"}, {"sim", CmdHFiClassSim, IfPm3Iclass, "Simulate iCLASS tag"}, {"eload", CmdHFiClassELoad, IfPm3Iclass, "Load Picopass / iCLASS dump file into emulator memory"}, {"esave", CmdHFiClassESave, IfPm3Iclass, "Save emulator memory to file"}, @@ -4180,6 +4222,8 @@ static command_t CommandTable[] = { {"managekeys", CmdHFiClassManageKeys, AlwaysAvailable, "Manage keys to use with iclass commands"}, {"permutekey", CmdHFiClassPermuteKey, AlwaysAvailable, "Permute function from 'heart of darkness' paper"}, {"view", CmdHFiClassView, AlwaysAvailable, "Display content from tag dump file"}, + {"-----------", CmdHelp, IfPm3Smartcard, "--------------------- " _CYAN_("SAM") " ---------------------"}, + {"sam", CmdHFiClassSAM, IfPm3Smartcard, "SAM tests"}, {NULL, NULL, NULL, NULL} }; diff --git a/common/cardhelper.c b/common/cardhelper.c index c8c8b6bd8..fe0f7957f 100644 --- a/common/cardhelper.c +++ b/common/cardhelper.c @@ -35,26 +35,68 @@ // look for CardHelper bool IsCardHelperPresent(bool verbose) { - if (IfPm3Smartcard()) { - int resp_len = 0; - uint8_t version[] = {0x96, 0x69, 0x00, 0x00, 0x00}; - uint8_t resp[30] = {0}; - ExchangeAPDUSC(verbose, version, sizeof(version), true, true, resp, sizeof(resp), &resp_len); + if (IfPm3Smartcard() == false) { + return false; + } - if (resp_len < 8) { - return false; - } + int resp_len = 0; + uint8_t version[] = {0x96, 0x69, 0x00, 0x00, 0x00}; + uint8_t resp[30] = {0}; + ExchangeAPDUSC(verbose, version, sizeof(version), true, true, resp, sizeof(resp), &resp_len); - if (strstr("CryptoHelper", (char *)resp) == 0) { - if (verbose) { - PrintAndLogEx(INFO, "Found smart card helper"); - } - return true; + if (resp_len < 8) { + return false; + } + + if (strstr("CryptoHelper", (char *)resp) == 0) { + if (verbose) { + PrintAndLogEx(INFO, "Found smart card helper"); } + return true; } return false; } +bool IsHIDSamPresent(bool verbose) { + + if (IfPm3Smartcard() == false) { + return false; + } + + // detect SAM + smart_card_atr_t card; + smart_select(verbose, &card); + if (!card.atr_len) { + PrintAndLogEx(ERR, "Can't get ATR from a smart card"); + return false; + } + + // SAM identification + uint8_t sam_atr[] = {0x3B, 0x95, 0x96, 0x80, 0xB1, 0xFE, 0x55, 0x1F, 0xC7, 0x47, 0x72, 0x61, 0x63, 0x65, 0x13}; + if (memcmp(card.atr, sam_atr, card.atr_len) < 0) { + + uint8_t sam_atr2[] = {0x3b, 0x90, 0x96, 0x91, 0x81, 0xb1, 0xfe, 0x55, 0x1f, 0xc7, 0xd4}; + if (memcmp(card.atr, sam_atr2, card.atr_len) < 0) { + if (verbose) { + PrintAndLogEx(SUCCESS, "Not detecting a SAM"); + } + return false; + } + } + + // Suspect some SAMs has version name in their ATR + uint8_t T0 = card.atr[1]; + uint8_t K = T0 & 0x0F; + if (K > 4 && verbose) { + if (byte_strstr(card.atr, card.atr_len, (const uint8_t*)"Grace", 5)> -1) { + PrintAndLogEx(SUCCESS, "SAM (Grace) detected"); + } else if (byte_strstr(card.atr, card.atr_len, (const uint8_t*)"Hopper", 6) > -1) { + PrintAndLogEx(SUCCESS, "SAM (Hopper) detected"); + } + } + return true; +} + static bool executeCrypto(uint8_t ins, uint8_t *src, uint8_t *dest) { uint8_t cmd[] = {0x96, ins, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; memcpy(cmd + 5, src, 8); diff --git a/common/cardhelper.h b/common/cardhelper.h index 9574397a1..b88ff1e16 100644 --- a/common/cardhelper.h +++ b/common/cardhelper.h @@ -22,6 +22,7 @@ #include #include "common.h" +bool IsHIDSamPresent(bool verbose); bool IsCardHelperPresent(bool verbose); bool Encrypt(uint8_t *src, uint8_t *dest); bool Decrypt(uint8_t *src, uint8_t *dest); From 514af4cf845dcf6529eae4cd7c1b0d4fe99956ff Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Jul 2023 12:51:12 +0200 Subject: [PATCH 723/924] missing break --- armsrc/iso14443a.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index c47339497..74caf51c1 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1054,8 +1054,8 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r case 1: { // MIFARE Classic 1k rATQA[0] = 0x04; sak = 0x08; + break; } - break; case 2: { // MIFARE Ultralight rATQA[0] = 0x44; sak = 0x00; @@ -1085,32 +1085,31 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // READ_SIG memcpy(rSIGN, mfu_header->signature, 32); AddCrc14A(rSIGN, sizeof(rSIGN) - 2); - + break; } - break; case 3: { // MIFARE DESFire rATQA[0] = 0x44; rATQA[1] = 0x03; sak = 0x20; memcpy(rRATS, "\x06\x75\x77\x81\x02\x80\x00\x00", 8); + break; } - break; case 4: { // ISO/IEC 14443-4 - javacard (JCOP) rATQA[0] = 0x04; sak = 0x28; + break; } - break; case 5: { // MIFARE TNP3XXX rATQA[0] = 0x01; rATQA[1] = 0x0f; sak = 0x01; + break; } - break; case 6: { // MIFARE Mini 320b rATQA[0] = 0x44; sak = 0x09; + break; } - break; case 7: { // NTAG rATQA[0] = 0x44; sak = 0x00; @@ -1140,41 +1139,39 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // READ_SIG memcpy(rSIGN, mfu_header->signature, 32); AddCrc14A(rSIGN, sizeof(rSIGN) - 2); - + break; } - break; case 8: { // MIFARE Classic 4k rATQA[0] = 0x02; sak = 0x18; + break; } - break; case 9: { // FM11RF005SH (Shanghai Metro) rATQA[0] = 0x03; rATQA[1] = 0x00; sak = 0x0A; + break; } - break; case 10: { // ST25TA IKEA Rothult rATQA[0] = 0x42; rATQA[1] = 0x00; sak = 0x20; + break; } - break; case 11: { // ISO/IEC 14443-4 - javacard (JCOP) rATQA[0] = 0x04; sak = 0x20; + break; } - break; case 12: { // HID Seos 4K card rATQA[0] = 0x01; sak = 0x20; + break; } - default: { if (g_dbglevel >= DBG_ERROR) Dbprintf("Error: unknown tagtype (%d)", tagType); return false; } - break; } // if uid not supplied then get from emulator memory From a761c9765a4339170b837a7ffa4a87972e93a631 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Jul 2023 12:53:04 +0200 Subject: [PATCH 724/924] style --- client/src/pm3line_vocabulory.h | 1 + common/cardhelper.c | 4 ++-- doc/commands.json | 18 ++++++++++++++++-- doc/commands.md | 1 + 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index b3f177ed2..2646a0477 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -288,6 +288,7 @@ const static vocabulory_t vocabulory[] = { { 1, "hf iclass managekeys" }, { 1, "hf iclass permutekey" }, { 1, "hf iclass view" }, + { 0, "hf iclass sam" }, { 1, "hf legic help" }, { 0, "hf legic dump" }, { 0, "hf legic info" }, diff --git a/common/cardhelper.c b/common/cardhelper.c index fe0f7957f..7523c9a72 100644 --- a/common/cardhelper.c +++ b/common/cardhelper.c @@ -88,9 +88,9 @@ bool IsHIDSamPresent(bool verbose) { uint8_t T0 = card.atr[1]; uint8_t K = T0 & 0x0F; if (K > 4 && verbose) { - if (byte_strstr(card.atr, card.atr_len, (const uint8_t*)"Grace", 5)> -1) { + if (byte_strstr(card.atr, card.atr_len, (const uint8_t *)"Grace", 5) > -1) { PrintAndLogEx(SUCCESS, "SAM (Grace) detected"); - } else if (byte_strstr(card.atr, card.atr_len, (const uint8_t*)"Hopper", 6) > -1) { + } else if (byte_strstr(card.atr, card.atr_len, (const uint8_t *)"Hopper", 6) > -1) { PrintAndLogEx(SUCCESS, "SAM (Hopper) detected"); } } diff --git a/doc/commands.json b/doc/commands.json index 84b09c862..4506b7450 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3303,6 +3303,20 @@ ], "usage": "hf iclass restore [-hv] -f [-k ] [--ki ] --first --last [--credit] [--elite] [--raw] [--shallow]" }, + "hf iclass sam": { + "command": "hf iclass sam", + "description": "Manage via SAM", + "notes": [ + "hf iclass sam" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-d, --data data", + "-v, --verbose verbose output" + ], + "usage": "hf iclass sam [-hv] [-d ]" + }, "hf iclass sim": { "command": "hf iclass sim", "description": "Simulate a iCLASS legacy/standard tag", @@ -11754,8 +11768,8 @@ } }, "metadata": { - "commands_extracted": 681, + "commands_extracted": 682, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-23T09:14:42" + "extracted_on": "2023-07-23T09:59:37" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index adbecb5bf..99ddf0efb 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -427,6 +427,7 @@ Check column "offline" for their availability. |`hf iclass managekeys `|Y |`Manage keys to use with iclass commands` |`hf iclass permutekey `|Y |`Permute function from 'heart of darkness' paper` |`hf iclass view `|Y |`Display content from tag dump file` +|`hf iclass sam `|N |`SAM tests` ### hf legic From 7473bebdbd6a9f82d18f96e39b413c61e907ae58 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Jul 2023 22:32:59 +0200 Subject: [PATCH 725/924] coverty --- common/commonutil.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/common/commonutil.c b/common/commonutil.c index 4af16b3c0..5bb77a936 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -161,27 +161,39 @@ uint64_t bytes_to_num(uint8_t *src, size_t len) { } uint16_t MemLeToUint2byte(const uint8_t *data) { - return (data[1] << 8) + data[0]; + return (uint16_t)( + (data[1] << 8) + data[0] + ); } uint32_t MemLeToUint3byte(const uint8_t *data) { - return (data[2] << 16) + (data[1] << 8) + data[0]; + return (uint32_t)( + (data[2] << 16) + (data[1] << 8) + data[0] + ); } uint32_t MemLeToUint4byte(const uint8_t *data) { - return (data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]; + return (uint32_t)( + (data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0] + ); } uint16_t MemBeToUint2byte(const uint8_t *data) { - return (data[0] << 8) + data[1]; + return (uint16_t)( + (data[0] << 8) + data[1] + ); } uint32_t MemBeToUint3byte(const uint8_t *data) { - return (data[0] << 16) + (data[1] << 8) + data[2]; + return (uint32_t)( + (data[0] << 16) + (data[1] << 8) + data[2] + ); } uint32_t MemBeToUint4byte(const uint8_t *data) { - return (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3]; + return (uint32_t)( + (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3] + ); } void Uint2byteToMemLe(uint8_t *data, uint16_t value) { From 95e8f0693eb1786c6f3e145dc591b50554706118 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Jul 2023 22:38:02 +0200 Subject: [PATCH 726/924] coverity --- client/src/nfc/ndef.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index 44ef70ee6..fc829e8d7 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -121,7 +121,7 @@ static int ndefDecodePayload(NDEFHeader_t *ndef, bool verbose); static uint16_t ndefTLVGetLength(const uint8_t *data, size_t *indx) { uint16_t len = 0; if (data[0] == 0xFF) { - len = (data[1] << 8) + data[2]; + len = MemBeToUint2byte(data + 1); *indx += 3; } else { len = data[0]; From d6142296f376b1a3204e51f3d40e22f33a2ac423 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Jul 2023 23:23:45 +0200 Subject: [PATCH 727/924] coverity --- client/deps/hardnested/hardnested_bruteforce.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index 17edfaad0..ee0c1c8f2 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -412,11 +412,14 @@ static bool read_bench_data(statelist_t *test_candidates) { return false; } free(path); - bytes_read = fread(&nonces_to_bruteforce, 1, sizeof(nonces_to_bruteforce), benchfile); - if (bytes_read != sizeof(nonces_to_bruteforce)) { + + // read 4 bytes of data ? + bytes_read = fread(&nonces_to_bruteforce, 1, sizeof(uint32_t), benchfile); + if (bytes_read != sizeof(uint32_t)) { fclose(benchfile); return false; } + for (uint32_t i = 0; i < nonces_to_bruteforce && i < 256; i++) { bytes_read = fread(&bf_test_nonce[i], 1, sizeof(uint32_t), benchfile); if (bytes_read != sizeof(uint32_t)) { @@ -430,11 +433,13 @@ static bool read_bench_data(statelist_t *test_candidates) { return false; } } + bytes_read = fread(&num_states, 1, sizeof(uint32_t), benchfile); if (bytes_read != sizeof(uint32_t)) { fclose(benchfile); return false; } + for (states_read = 0; states_read < MIN(num_states, TEST_BENCH_SIZE); states_read++) { bytes_read = fread(test_candidates->states[EVEN_STATE] + states_read, 1, sizeof(uint32_t), benchfile); if (bytes_read != sizeof(uint32_t)) { @@ -442,9 +447,11 @@ static bool read_bench_data(statelist_t *test_candidates) { return false; } } + for (uint32_t i = states_read; i < TEST_BENCH_SIZE; i++) { test_candidates->states[EVEN_STATE][i] = test_candidates->states[EVEN_STATE][i - states_read]; } + for (uint32_t i = states_read; i < num_states; i++) { bytes_read = fread(&temp, 1, sizeof(uint32_t), benchfile); if (bytes_read != sizeof(uint32_t)) { @@ -452,6 +459,7 @@ static bool read_bench_data(statelist_t *test_candidates) { return false; } } + for (states_read = 0; states_read < MIN(num_states, TEST_BENCH_SIZE); states_read++) { bytes_read = fread(test_candidates->states[ODD_STATE] + states_read, 1, sizeof(uint32_t), benchfile); if (bytes_read != sizeof(uint32_t)) { @@ -459,6 +467,7 @@ static bool read_bench_data(statelist_t *test_candidates) { return false; } } + for (uint32_t i = states_read; i < TEST_BENCH_SIZE; i++) { test_candidates->states[ODD_STATE][i] = test_candidates->states[ODD_STATE][i - states_read]; } From 7558846e7609728664594632e3eb5bd4b361756f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 23 Jul 2023 23:47:22 +0200 Subject: [PATCH 728/924] text --- common_arm/Makefile.hal | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common_arm/Makefile.hal b/common_arm/Makefile.hal index 9679382ce..f9d7d2fe4 100644 --- a/common_arm/Makefile.hal +++ b/common_arm/Makefile.hal @@ -48,7 +48,9 @@ Known definitions: endef define HELP_DEFINITIONS + Options to define platform, platform extras and/or standalone mode: + (1) Run make with your PLATFORM, PLATFORM_EXTRAS and/or STANDALONE choices as follows: make PLATFORM=PM3GENERIC STANDALONE=$(HELP_EXAMPLE_STANDALONE) @@ -65,6 +67,7 @@ STANDALONE= For Proxmarks with only 256k, you can define PLATFORM_SIZE=256 + to be warned if the image is too big for your device and you can specify which parts to skip in order to reduce the size: SKIP_LF=1 @@ -80,6 +83,7 @@ SKIP_NFCBARCODE=1 SKIP_HFSNIFF=1 SKIP_HFPLOT=1 SKIP_ZX8211=1 + endef define KNOWN_DEFINITIONS From 5013d672087422f06e631ccdef5b832f4b20fa28 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 00:08:23 +0200 Subject: [PATCH 729/924] maybe coverity likes this better --- client/src/cmdhfmf.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 0531b4f28..a02026b06 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -366,10 +366,11 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { for (uint16_t i = 0; i < n; i++) { if (mfIsSectorTrailer(i)) { - e_sector[mfSectorNum(i)].foundKey[0] = 1; - e_sector[mfSectorNum(i)].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); - e_sector[mfSectorNum(i)].foundKey[1] = 1; - e_sector[mfSectorNum(i)].Key[1] = bytes_to_num(d + (i * MFBLOCK_SIZE) + 10, MIFARE_KEY_SIZE); + uint8_t sec = mfSectorNum(i); + e_sector[sec].foundKey[0] = 1; + e_sector[sec].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); + e_sector[sec].foundKey[1] = 1; + e_sector[sec].Key[1] = bytes_to_num(d + (i * MFBLOCK_SIZE) + 10, MIFARE_KEY_SIZE); } } printKeyTable(sectors, e_sector); From 300d274d43fbefad171ee84e274dbbd68de74b54 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 00:14:56 +0200 Subject: [PATCH 730/924] coverity migth consider this to be better --- client/src/flash.c | 3 ++- client/src/proxendian.h | 8 ++++++-- common/commonutil.c | 12 ++++++------ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/client/src/flash.c b/client/src/flash.c index cca2de7b1..4629dbdcd 100644 --- a/client/src/flash.c +++ b/client/src/flash.c @@ -240,7 +240,8 @@ static int print_and_validate_version(struct version_information_t *vi) { return PM3_EFILE; } - char temp[PM3_CMD_DATA_SIZE - 12]; // same limit as for ARM image + // same limit as for ARM image + char temp[PM3_CMD_DATA_SIZE - 12] = {0}; FormatVersionInformation(temp, sizeof(temp), "", vi); PrintAndLogEx(SUCCESS, _CYAN_("ELF file version") _YELLOW_(" %s"), temp); diff --git a/client/src/proxendian.h b/client/src/proxendian.h index 17003e75e..05b699747 100644 --- a/client/src/proxendian.h +++ b/client/src/proxendian.h @@ -53,11 +53,15 @@ #else static inline uint16_t le16(uint16_t v) { - return (v >> 8) | (v << 8); + return (uint16_t)( + (v >> 8) | (v << 8) + ); } static inline uint32_t le32(uint32_t v) { - return (le16(v) << 16) | (le16(v >> 16)); + return (uint32_t)( + (le16(v) << 16) | (le16(v >> 16)) + ); } #endif // HOST_LITTLE_ENDIAN diff --git a/common/commonutil.c b/common/commonutil.c index 5bb77a936..6790d835a 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -160,37 +160,37 @@ uint64_t bytes_to_num(uint8_t *src, size_t len) { return num; } -uint16_t MemLeToUint2byte(const uint8_t *data) { +inline uint16_t MemLeToUint2byte(const uint8_t *data) { return (uint16_t)( (data[1] << 8) + data[0] ); } -uint32_t MemLeToUint3byte(const uint8_t *data) { +inline uint32_t MemLeToUint3byte(const uint8_t *data) { return (uint32_t)( (data[2] << 16) + (data[1] << 8) + data[0] ); } -uint32_t MemLeToUint4byte(const uint8_t *data) { +inline uint32_t MemLeToUint4byte(const uint8_t *data) { return (uint32_t)( (data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0] ); } -uint16_t MemBeToUint2byte(const uint8_t *data) { +inline uint16_t MemBeToUint2byte(const uint8_t *data) { return (uint16_t)( (data[0] << 8) + data[1] ); } -uint32_t MemBeToUint3byte(const uint8_t *data) { +inline uint32_t MemBeToUint3byte(const uint8_t *data) { return (uint32_t)( (data[0] << 16) + (data[1] << 8) + data[2] ); } -uint32_t MemBeToUint4byte(const uint8_t *data) { +inline uint32_t MemBeToUint4byte(const uint8_t *data) { return (uint32_t)( (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3] ); From d19c9a262a898fc333c2a4bef912c4f2b8eb5eed Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 00:53:35 +0200 Subject: [PATCH 731/924] style, same name everywhere in project --- client/src/cmddata.c | 8 ++++---- client/src/cmdhf.c | 4 ++-- client/src/cmdhfmfhard.c | 15 ++++++++++++++- client/src/cmdlfhitag.c | 6 +++--- client/src/cmdtrace.c | 6 +++--- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 74273921f..2208a34d4 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1758,8 +1758,8 @@ int getSamplesEx(uint32_t start, uint32_t end, bool verbose, bool ignore_lf_conf if (verbose) PrintAndLogEx(INFO, "Reading " _YELLOW_("%u") " bytes from device memory", n); - PacketResponseNG response; - if (!GetFromDevice(BIG_BUF, got, n, start, NULL, 0, &response, 10000, true)) { + PacketResponseNG resp; + if (!GetFromDevice(BIG_BUF, got, n, start, NULL, 0, &resp, 10000, true)) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); return PM3_ETIMEOUT; } @@ -1769,8 +1769,8 @@ int getSamplesEx(uint32_t start, uint32_t end, bool verbose, bool ignore_lf_conf uint8_t bits_per_sample = 8; // Old devices without this feature would send 0 at arg[0] - if (response.oldarg[0] > 0 && (ignore_lf_config == false)) { - sample_config *sc = (sample_config *) response.data.asBytes; + if (resp.oldarg[0] > 0 && (ignore_lf_config == false)) { + sample_config *sc = (sample_config *) resp.data.asBytes; if (verbose) PrintAndLogEx(INFO, "Samples @ " _YELLOW_("%d") " bits/smpl, decimation 1:%d ", sc->bits_per_sample, sc->decimation); bits_per_sample = sc->bits_per_sample; } diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index b15671272..b5cff4e19 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -426,8 +426,8 @@ int handle_hf_plot(void) { uint8_t buf[FPGA_TRACE_SIZE] = {0}; - PacketResponseNG response; - if (GetFromDevice(FPGA_MEM, buf, FPGA_TRACE_SIZE, 0, NULL, 0, &response, 4000, true) == false) { + PacketResponseNG resp; + if (GetFromDevice(FPGA_MEM, buf, FPGA_TRACE_SIZE, 0, NULL, 0, &resp, 4000, true) == false) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); return PM3_ETIMEOUT; } diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index d66b3eb43..3d85a2c60 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -1562,7 +1562,20 @@ static int acquire_nonces(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_ float brute_force_depth; FILE *fnonces = NULL; - PacketResponseNG resp; + + // init to ZERO + PacketResponseNG resp = { + .cmd = 0, + .length = 0, + .magic = 0, + .status = 0, + .crc = 0, + .ng = false, + }; + resp.oldarg[0] = 0; + resp.oldarg[1] = 0; + resp.oldarg[2] = 0; + memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); uint8_t write_buf[9]; char progress_text[80]; diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 7fd58c798..4df9ca4a7 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -72,14 +72,14 @@ static int CmdLFHitagList(const char *Cmd) { } // Query for the actual size of the trace - PacketResponseNG response; - if (!GetFromDevice(BIG_BUF, got, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 2500, false)) { + PacketResponseNG resp; + if (!GetFromDevice(BIG_BUF, got, PM3_CMD_DATA_SIZE, 0, NULL, 0, &resp, 2500, false)) { PrintAndLogEx(WARNING, "command execution time out"); free(got); return PM3_ETIMEOUT; } - uint16_t traceLen = response.arg[2]; + uint16_t traceLen = resp.arg[2]; if (traceLen > PM3_CMD_DATA_SIZE) { uint8_t *p = realloc(got, traceLen); if (p == NULL) { diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 0d47d2d7c..7efb8bc35 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -986,15 +986,15 @@ static int download_trace(void) { PrintAndLogEx(INFO, "downloading tracelog data from device"); // Query for the size of the trace, downloading PM3_CMD_DATA_SIZE - PacketResponseNG response; - if (!GetFromDevice(BIG_BUF, gs_trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &response, 4000, true)) { + PacketResponseNG resp; + if (!GetFromDevice(BIG_BUF, gs_trace, PM3_CMD_DATA_SIZE, 0, NULL, 0, &resp, 4000, true)) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); free(gs_trace); gs_trace = NULL; return PM3_ETIMEOUT; } - gs_traceLen = response.oldarg[2]; + gs_traceLen = resp.oldarg[2]; // if tracelog buffer was larger and we need to download more. if (gs_traceLen > PM3_CMD_DATA_SIZE) { From 8029e081535672dae582c7be6a8349cce0aa9c0e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 00:54:12 +0200 Subject: [PATCH 732/924] cppchecker, make sure struct is initialized to zero --- client/src/comms.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/client/src/comms.c b/client/src/comms.c index 1422c42d3..7bd553f20 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -742,9 +742,21 @@ static size_t communication_delay(void) { bool WaitForResponseTimeoutW(uint32_t cmd, PacketResponseNG *response, size_t ms_timeout, bool show_warning) { PacketResponseNG resp; - - if (response == NULL) + if (response == NULL) { response = &resp; + } + + // init to ZERO + resp.cmd = 0, + resp.length = 0, + resp.magic = 0, + resp.status = 0, + resp.crc = 0, + resp.ng = false, + resp.oldarg[0] = 0; + resp.oldarg[1] = 0; + resp.oldarg[2] = 0; + memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); // Add delay depending on the communication channel & speed if (ms_timeout != (size_t) - 1) @@ -811,8 +823,21 @@ bool GetFromDevice(DeviceMemType_t memtype, uint8_t *dest, uint32_t bytes, uint3 if (bytes == 0) return true; PacketResponseNG resp; - if (response == NULL) + if (response == NULL) { response = &resp; + } + + // init to ZERO + resp.cmd = 0, + resp.length = 0, + resp.magic = 0, + resp.status = 0, + resp.crc = 0, + resp.ng = false, + resp.oldarg[0] = 0; + resp.oldarg[1] = 0; + resp.oldarg[2] = 0; + memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); // clear clearCommandBuffer(); From 38034480ca3cf5627627efd323dcb8e58441f7d3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 01:42:24 +0200 Subject: [PATCH 733/924] text --- client/src/cmdhf14a.c | 26 ++++++++++++-------------- client/src/cmdhffudan.c | 2 +- client/src/cmdhfjooki.c | 4 ++-- client/src/cmdhfmf.c | 28 ++++++++++++++-------------- client/src/cmdhfmfu.c | 8 ++++---- client/src/mifare/mifarehost.c | 14 ++++++++++---- 6 files changed, 43 insertions(+), 39 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index f2ca64076..ac94d8d0c 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -418,11 +418,10 @@ static int CmdHf14AConfig(const char *Cmd) { } int Hf14443_4aGetCardData(iso14a_card_select_t *card) { - SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); + SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); PacketResponseNG resp; WaitForResponse(CMD_ACK, &resp); - memcpy(card, (iso14a_card_select_t *)resp.data.asBytes, sizeof(iso14a_card_select_t)); uint64_t select_status = resp.oldarg[0]; // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision @@ -548,16 +547,17 @@ static int CmdHF14AReader(const char *Cmd) { } bool continuous = arg_get_lit(ctx, 7); - CLIParserFree(ctx); - int res = PM3_SUCCESS; - - if (!disconnectAfter) + if (!disconnectAfter == false) { cm |= ISO14A_NO_DISCONNECT; + } + if (continuous) { PrintAndLogEx(INFO, "Press " _GREEN_("Enter") " to exit"); } + + int res = PM3_SUCCESS; do { clearCommandBuffer(); @@ -570,8 +570,7 @@ static int CmdHF14AReader(const char *Cmd) { if (ISO14A_CONNECT & cm) { PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { - if (!silent) PrintAndLogEx(WARNING, "iso14443a card select failed"); + if (WaitForResponseTimeout(CMD_ACK, &resp, 2500) == false) { DropField(); res = PM3_ESOFT; goto plot; @@ -589,7 +588,6 @@ static int CmdHF14AReader(const char *Cmd) { uint64_t select_status = resp.oldarg[0]; if (select_status == 0) { - if (!silent) PrintAndLogEx(WARNING, "iso14443a card select failed"); DropField(); res = PM3_ESOFT; goto plot; @@ -625,8 +623,8 @@ static int CmdHF14AReader(const char *Cmd) { } PrintAndLogEx(NORMAL, ""); } - if (!disconnectAfter) { - if (!silent) PrintAndLogEx(SUCCESS, "Card is selected. You can now start sending commands"); + if ((disconnectAfter == false) && (silent == false)) { + PrintAndLogEx(SUCCESS, "Card is selected. You can now start sending commands"); } } plot: @@ -1865,8 +1863,8 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0, NULL, 0); PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { - if (verbose) PrintAndLogEx(WARNING, "iso14443a card select failed"); + if (WaitForResponseTimeout(CMD_ACK, &resp, 2500) == false) { + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); DropField(); return 0; } @@ -1883,7 +1881,7 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { uint64_t select_status = resp.oldarg[0]; if (select_status == 0) { - if (verbose) PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); DropField(); return select_status; } diff --git a/client/src/cmdhffudan.c b/client/src/cmdhffudan.c index 38ef8eef5..53e580e1b 100644 --- a/client/src/cmdhffudan.c +++ b/client/src/cmdhffudan.c @@ -110,7 +110,7 @@ static int fudan_get_type(iso14a_card_select_t *card, bool verbose) { SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0, NULL, 0); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 2500) == false) { - PrintAndLogEx(DEBUG, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); return PM3_ESOFT; } diff --git a/client/src/cmdhfjooki.c b/client/src/cmdhfjooki.c index 93ca6a00a..025fdf5c4 100644 --- a/client/src/cmdhfjooki.c +++ b/client/src/cmdhfjooki.c @@ -200,7 +200,7 @@ static int jooki_create_ndef(uint8_t *b64ndef, uint8_t *ndefrecord) { static void jooki_printEx(uint8_t *b64, uint8_t *iv, uint8_t tid, uint8_t fid, uint8_t *uid, bool verbose) { int idx = jooki_lookup(tid, fid); - PrintAndLogEx(INFO, "Encoded URL.. %s ( %s )", sprint_hex(b64, 12), b64); + PrintAndLogEx(INFO, "Encoded URL.. %s ( " _YELLOW_("%s") " )", sprint_hex(b64, 12), b64); PrintAndLogEx(INFO, "Figurine..... %02x %02x - " _GREEN_("%s, %s") , tid , fid @@ -574,7 +574,7 @@ static int CmdHF14AJookiSim(const char *Cmd) { break; } - if (WaitForResponseTimeout(CMD_HF_MIFARE_SIMULATE, &resp, 1500) == 0) + if (WaitForResponseTimeout(CMD_HF_MIFARE_SIMULATE, &resp, 1500) == false) continue; if (resp.status != PM3_SUCCESS) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index a02026b06..8c03888f0 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -101,8 +101,8 @@ static int GetHFMF14AUID(uint8_t *uid, int *uidlen) { clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + if (WaitForResponseTimeout(CMD_ACK, &resp, 2500) == false) { + PrintAndLogEx(DEBUG, "iso14443a card select failed"); DropField(); return PM3_ERFTRANS; } @@ -551,13 +551,13 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { - PrintAndLogEx(WARNING, "iso14443a card select timeout"); + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); return PM3_ETIMEOUT; } uint64_t select_status = resp.oldarg[0]; if (select_status == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); return PM3_SUCCESS; } @@ -2487,13 +2487,13 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { - PrintAndLogEx(WARNING, "iso14443a card select timeout"); + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); return PM3_ETIMEOUT; } uint64_t select_status = resp.oldarg[0]; if (select_status == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); return PM3_ECARDEXCHANGE; } @@ -5248,7 +5248,7 @@ static int CmdHF14AMfCSave(const char *Cmd) { SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { - PrintAndLogEx(WARNING, "iso14443a card select timeout"); + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); return PM3_ETIMEOUT; } @@ -5260,7 +5260,7 @@ static int CmdHF14AMfCSave(const char *Cmd) { */ uint64_t select_status = resp.oldarg[0]; if (select_status == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); return PM3_SUCCESS; } @@ -5398,7 +5398,7 @@ static int CmdHF14AMfCView(const char *Cmd) { SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { - PrintAndLogEx(WARNING, "iso14443a card select timeout"); + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); return PM3_ETIMEOUT; } @@ -5411,7 +5411,7 @@ static int CmdHF14AMfCView(const char *Cmd) { uint64_t select_status = resp.oldarg[0]; if (select_status == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); return PM3_ERFTRANS; } @@ -6231,13 +6231,13 @@ int CmdHFMFNDEFFormat(const char *Cmd) { SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { - PrintAndLogEx(WARNING, "iso14443a card select timeout"); + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); return PM3_ETIMEOUT; } uint64_t select_status = resp.oldarg[0]; if (select_status == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); return PM3_SUCCESS; } @@ -7933,7 +7933,7 @@ static int CmdHF14AGen4Save(const char *Cmd) { SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { - PrintAndLogEx(WARNING, "iso14443a card select timeout"); + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); return PM3_ETIMEOUT; } @@ -7945,7 +7945,7 @@ static int CmdHF14AGen4Save(const char *Cmd) { */ uint64_t select_status = resp.oldarg[0]; if (select_status == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); return PM3_SUCCESS; } diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 9f7f54c53..6762d0b1c 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -190,7 +190,7 @@ int ul_read_uid(uint8_t *uid) { // 2: OK, no ATS // 3: proprietary Anticollision if (select_status == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); return PM3_ESOFT; } if (card.uidlen != 7) { @@ -224,14 +224,14 @@ static bool ul_select(iso14a_card_select_t *card) { PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { - PrintAndLogEx(WARNING, "timeout while waiting for reply."); + PrintAndLogEx(DEBUG, "iso14443a card select timeout"); DropField(); return false; } else { uint16_t len = (resp.oldarg[1] & 0xFFFF); if (len == 0) { - PrintAndLogEx(WARNING, "iso14443a card select failed"); + PrintAndLogEx(DEBUG, "iso14443a card select failed"); DropField(); return false; } @@ -1351,7 +1351,7 @@ static mfu_identify_t mfu_ident_table[] = { "Jooki", "0004040201000F03", 12, 32, "E11012000103A00C340329D101255504732E6A6F6F6B692E726F636B732F732F", ul_ev1_pwdgen_def, ul_ev1_packgen_def, - "hf jooki decode -r" + "hf mfu ndefread" }, { "Lego Dimensions", "0004040201000F03", diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 6c9d8caa2..bdf4ec7f1 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -195,15 +195,22 @@ int mfCheckKeys(uint8_t blockNo, uint8_t keyType, bool clear_trace, uint8_t keyc SendCommandNG(CMD_HF_MIFARE_CHKKEYS, data, (5 + 6 * keycnt)); PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_HF_MIFARE_CHKKEYS, &resp, 2500)) return PM3_ETIMEOUT; - if (resp.status != PM3_SUCCESS) return resp.status; + if (!WaitForResponseTimeout(CMD_HF_MIFARE_CHKKEYS, &resp, 2500)) { + return PM3_ETIMEOUT; + } + if (resp.status != PM3_SUCCESS) { + return resp.status; + } struct kr { uint8_t key[6]; bool found; } PACKED; struct kr *keyresult = (struct kr *)&resp.data.asBytes; - if (!keyresult->found) return PM3_ESOFT; + if (!keyresult->found) { + return PM3_ESOFT; + } + *key = bytes_to_num(keyresult->key, sizeof(keyresult->key)); return PM3_SUCCESS; } @@ -585,7 +592,6 @@ out: return PM3_ESOFT; } - int mfStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, uint8_t trgKeyType, uint8_t *resultKey) { uint32_t uid; From 10504ae4fd9bb584eae642ec7ea05d6f7b7f0412 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 03:15:14 +0200 Subject: [PATCH 734/924] text and increasing a buffer --- .../deps/hardnested/hardnested_bruteforce.c | 2 +- client/src/cmdhffido.c | 30 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index ee0c1c8f2..6bc400d1d 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -415,7 +415,7 @@ static bool read_bench_data(statelist_t *test_candidates) { // read 4 bytes of data ? bytes_read = fread(&nonces_to_bruteforce, 1, sizeof(uint32_t), benchfile); - if (bytes_read != sizeof(uint32_t)) { + if (bytes_read != sizeof(uint32_t) || (nonces_to_bruteforce >= 256)) { fclose(benchfile); return false; } diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index a8021e4cf..d3ab66fc6 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -78,33 +78,36 @@ static int CmdHFFidoInfo(const char *Cmd) { uint8_t buf[APDU_RES_LEN] = {0}; size_t len = 0; uint16_t sw = 0; - int res = FIDOSelect(true, true, buf, sizeof(buf), &len, &sw); + int res = FIDOSelect(true, true, buf, sizeof(buf), &len, &sw); if (res) { DropField(); return res; } if (sw != ISO7816_OK) { - if (sw) - PrintAndLogEx(INFO, "Not a FIDO card! APDU response: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - else - PrintAndLogEx(ERR, "APDU exchange error. Card returns 0x0000."); - + if (sw) { + PrintAndLogEx(INFO, "Not a FIDO card. APDU response: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); + } else { + PrintAndLogEx(ERR, "APDU exchange error. Card returns 0x0000"); + } DropField(); return PM3_SUCCESS; } - if (!strncmp((char *)buf, "U2F_V2", 7)) { - if (!strncmp((char *)buf, "FIDO_2_0", 8)) { - PrintAndLogEx(INFO, "FIDO2 authenticator detected. Version... " _YELLOW_("%.*s"), (int)len, buf); + if (strncmp((char *)buf, "U2F_V2", 7) == 0) { + if (strncmp((char *)buf, "FIDO_2_0", 8) == 0) { + PrintAndLogEx(INFO, "FIDO2 authenticator"); + PrintAndLogEx(INFO, "Version... " _YELLOW_("%.*s"), (int)len, buf); } else { - PrintAndLogEx(INFO, "FIDO authenticator detected (not standard U2F)."); - PrintAndLogEx(INFO, "Non U2F authenticator version:"); + PrintAndLogEx(INFO, "FIDO authenticator (not standard U2F)"); + PrintAndLogEx(INFO, "Non U2F authenticator"); + PrintAndLogEx(INFO, "version... "); print_buffer((const unsigned char *)buf, len, 1); } } else { - PrintAndLogEx(INFO, "FIDO U2F authenticator detected. Version... " _YELLOW_("%.*s"), (int)len, buf); + PrintAndLogEx(INFO, "FIDO U2F authenticator detected"); + PrintAndLogEx(INFO, "Version... " _YELLOW_("%.*s"), (int)len, buf); } res = FIDO2GetInfo(buf, sizeof(buf), &len, &sw); @@ -112,6 +115,7 @@ static int CmdHFFidoInfo(const char *Cmd) { if (res) { return res; } + if (sw != ISO7816_OK) { PrintAndLogEx(ERR, "FIDO2 version doesn't exist (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); return PM3_SUCCESS; @@ -441,7 +445,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { controlByte = 0x07; uint8_t data[512] = {0}; - uint8_t hdata[250] = {0}; + uint8_t hdata[256] = {0}; bool public_key_loaded = false; uint8_t public_key[65] = {0}; int hdatalen = 0; From fa82c46ff730393df48e49f1fc37485bc31c8596 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 03:15:42 +0200 Subject: [PATCH 735/924] minor text --- client/src/cmdhf14a.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index ac94d8d0c..ad0eff3b5 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -2432,22 +2432,22 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { } if (isMifareUltralight) - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfu info`")); + PrintAndLogEx(HINT, "Hint: try `" _YELLOW_("hf mfu info") "`"); if (isMifarePlus && isMagic == 0 && isEMV == false) - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfp info`")); + PrintAndLogEx(HINT, "Hint: try `" _YELLOW_("hf mfp info") "`"); if (isMifareDESFire && isMagic == 0 && isEMV == false) - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfdes info`")); + PrintAndLogEx(HINT, "Hint: try `" _YELLOW_("hf mfdes info") "`"); if (isST) - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf st info`")); + PrintAndLogEx(HINT, "Hint: try `" _YELLOW_("hf st info") "`"); if (isEMV) - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`emv reader`")); + PrintAndLogEx(HINT, "Hint: try `" _YELLOW_("emv reader") "`"); if (isFUDAN) { - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf fudan dump`")); + PrintAndLogEx(HINT, "Hint: try `" _YELLOW_("hf fudan dump") "`"); /* PrintAndLogEx(HINT, " hf 14a raw -a -b 7 -k 26"); PrintAndLogEx(HINT, " hf 14a raw -k -c 3000"); @@ -2507,7 +2507,7 @@ int infoHF14A4Applications(bool verbose) { } else { for (int i = 0; i < ARRAYLEN(hintAIDList); i++) { if (cardFound[i] && strlen(hintAIDList[i].hint)) - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("%s") " commands", hintAIDList[i].hint); + PrintAndLogEx(HINT, "Hint: try `" _YELLOW_("%s") "` commands", hintAIDList[i].hint); } } } From b7900816bd127b85a394855ad5fa877081422834 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 03:16:18 +0200 Subject: [PATCH 736/924] checking if calloc failed --- tools/fpga_compress/fpga_compress.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 135125bfc..711cc2f68 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -144,12 +144,15 @@ typedef struct lz4_stream_s { // Call it either with opened infile + outsize=0 // or with opened infile, opened outfiles, num_outfiles and valid outsize static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, long *outsize) { + if (num_outfiles > 10) { return (EXIT_FAILURE); } - LZ4_streamDecode_t lz4StreamDecode_body = {{ 0 }}; - char outbuf[FPGA_RING_BUFFER_BYTES]; + LZ4_streamDecode_t lz4StreamDecode_body = {{ 0 }}; + char outbuf[FPGA_RING_BUFFER_BYTES] = {0}; + + // file size fseek(infile, 0L, SEEK_END); long infile_size = ftell(infile); fseek(infile, 0L, SEEK_SET); @@ -168,17 +171,30 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, char *outbufall = NULL; if (*outsize > 0) { outbufall = calloc(*outsize, sizeof(char)); + if (outbufall == NULL) { + return (EXIT_FAILURE); + } } + char *inbuf = calloc(infile_size, sizeof(char)); + if (inbuf == NULL) { + if (outbufall) { + free(outbufall); + } + return (EXIT_FAILURE); + } + size_t num_read = fread(inbuf, sizeof(char), infile_size, infile); if (num_read != infile_size) { + if (*outsize > 0) { fclose(infile); for (uint16_t j = 0; j < num_outfiles; j++) { fclose(outfiles[j]); } } + if (outbufall) { free(outbufall); } From 72057f9b81796f35574f8080235f9c3fb77a4cd8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 13:34:24 +0200 Subject: [PATCH 737/924] text --- client/src/cmdhfmf.c | 21 ++++++++++++++++----- client/src/mifare/mifare4.c | 14 +++++++++++--- client/src/mifare/mifare4.h | 1 + 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 8c03888f0..6f28d7d7c 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -153,26 +153,37 @@ static int initSectorTable(sector_t **src, size_t items) { static void decode_print_st(uint16_t blockno, uint8_t *data) { if (mfIsSectorTrailer(blockno)) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "----------------------- " _CYAN_("Sector trailer decoder") " -----------------------"); + PrintAndLogEx(INFO, "-------------------------- " _CYAN_("Sector trailer decoder") " --------------------------"); PrintAndLogEx(INFO, "key A........ " _GREEN_("%s"), sprint_hex_inrow(data, 6)); PrintAndLogEx(INFO, "acr.......... " _GREEN_("%s"), sprint_hex_inrow(data + 6, 3)); PrintAndLogEx(INFO, "user / gpb... " _GREEN_("%02x"), data[9]); PrintAndLogEx(INFO, "key B........ " _GREEN_("%s"), sprint_hex_inrow(data + 10, 6)); - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, " # | Access rights"); - PrintAndLogEx(INFO, "----+-----------------------------------------------------------------"); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, " # | access rights"); + PrintAndLogEx(INFO, "----+-----------------------------------------------------------------------"); if (mfValidateAccessConditions(&data[6]) == false) { PrintAndLogEx(WARNING, _RED_("Invalid Access Conditions")); } + int bln = mfFirstBlockOfSector(mfSectorNum(blockno)); int blinc = (mfNumBlocksPerSector(mfSectorNum(blockno)) > 4) ? 5 : 1; for (int i = 0; i < 4; i++) { PrintAndLogEx(INFO, "%3d%c| " _YELLOW_("%s"), bln, ((blinc > 1) && (i < 3) ? '+' : ' '), mfGetAccessConditionsDesc(i, &data[6])); bln += blinc; + + if (i == 3) { + uint8_t cond = mf_get_accesscondition(i, &data[6]); + if (cond == 0 || cond == 1 || cond == 2) { + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "OBS! Key B is readable, it SHALL NOT be able to authenticate on original MFC"); + } + } } - PrintAndLogEx(INFO, "----------------------------------------------------------------------"); + + + PrintAndLogEx(INFO, "----------------------------------------------------------------------------"); PrintAndLogEx(NORMAL, ""); } } diff --git a/client/src/mifare/mifare4.c b/client/src/mifare/mifare4.c index 7a3ec9f77..420c93a9e 100644 --- a/client/src/mifare/mifare4.c +++ b/client/src/mifare/mifare4.c @@ -83,6 +83,7 @@ bool mfValidateAccessConditions(const uint8_t *data) { return ((nd1 == (d1 ^ 0xF)) && (nd2 == (d2 ^ 0xF)) && (nd3 == (d3 ^ 0xF))); } + bool mfReadOnlyAccessConditions(uint8_t blockn, const uint8_t *data) { uint8_t d1 = NIBBLE_HIGH(data[1]) >> blockn; @@ -98,7 +99,6 @@ bool mfReadOnlyAccessConditions(uint8_t blockn, const uint8_t *data) { return false; } - const char *mfGetAccessConditionsDesc(uint8_t blockn, const uint8_t *data) { uint8_t d1 = NIBBLE_HIGH(data[1]) >> blockn; uint8_t d2 = NIBBLE_LOW(data[2]) >> blockn; @@ -118,9 +118,17 @@ const char *mfGetAccessConditionsDesc(uint8_t blockn, const uint8_t *data) { } }; - static char StaticNone[] = "none"; - return StaticNone; + static char none[] = "none"; + return none; } + +uint8_t mf_get_accesscondition(uint8_t blockn, const uint8_t *data) { + uint8_t d1 = NIBBLE_HIGH(data[1]) >> blockn; + uint8_t d2 = NIBBLE_LOW(data[2]) >> blockn; + uint8_t d3 = NIBBLE_HIGH(data[2]) >> blockn; + return (d1 & 0x01) << 2 | (d2 & 0x01) << 1 | (d3 & 0x01); +} + /* static int CalculateEncIVCommand(mf4Session_t *mf4session, uint8_t *iv, bool verbose) { memcpy(&iv[0], &mf4session->TI, 4); diff --git a/client/src/mifare/mifare4.h b/client/src/mifare/mifare4.h index fee12ef6e..6687930e6 100644 --- a/client/src/mifare/mifare4.h +++ b/client/src/mifare/mifare4.h @@ -73,6 +73,7 @@ int MFPGetVersion(bool activateField, bool leaveSignalON, uint8_t *dataout, int bool mfValidateAccessConditions(const uint8_t *data); bool mfReadOnlyAccessConditions(uint8_t blockn, const uint8_t *data); const char *mfGetAccessConditionsDesc(uint8_t blockn, const uint8_t *data); +uint8_t mf_get_accesscondition(uint8_t blockn, const uint8_t *data); uint8_t mfNumBlocksPerSector(uint8_t sectorNo); uint8_t mfFirstBlockOfSector(uint8_t sectorNo); From fcde2978a8ffe1ccbb86d8ed9103a8c792da47a8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 15:11:21 +0200 Subject: [PATCH 738/924] coverity believes somehow the return value from mfSectorNum can be 31. And wants us to check that it is only same size as sectors allocated --- client/src/cmdhfmf.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 6f28d7d7c..bbeaa5fce 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -376,13 +376,14 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { } for (uint16_t i = 0; i < n; i++) { - if (mfIsSectorTrailer(i)) { - uint8_t sec = mfSectorNum(i); - e_sector[sec].foundKey[0] = 1; - e_sector[sec].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); - e_sector[sec].foundKey[1] = 1; - e_sector[sec].Key[1] = bytes_to_num(d + (i * MFBLOCK_SIZE) + 10, MIFARE_KEY_SIZE); + if (mfIsSectorTrailer(i) == false) { + continue; } + uint8_t sec = MIN(sectors, mfSectorNum(i)); + e_sector[sec].foundKey[0] = 1; + e_sector[sec].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); + e_sector[sec].foundKey[1] = 1; + e_sector[sec].Key[1] = bytes_to_num(d + (i * MFBLOCK_SIZE) + 10, MIFARE_KEY_SIZE); } printKeyTable(sectors, e_sector); free(e_sector); From 90d1fed1fab42594d285f7d4d488eb56f3505bb3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 15:14:17 +0200 Subject: [PATCH 739/924] coverity somehow believes we read a long string from a file and the data isnt null terminated (i.e. last char is 0x00) so let see if a ugly + 1 will do the trick --- client/src/flash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/flash.c b/client/src/flash.c index 4629dbdcd..b1f4a28c9 100644 --- a/client/src/flash.c +++ b/client/src/flash.c @@ -286,7 +286,7 @@ int flash_load(flash_file_t *ctx, bool force) { goto fail; } - ctx->elf = calloc(fsize, sizeof(uint8_t)); + ctx->elf = calloc(fsize + 1, sizeof(uint8_t)); if (!ctx->elf) { PrintAndLogEx(ERR, "Error, cannot allocate memory"); res = PM3_EMALLOC; From fb35a29ba079fb6f38dc02945c0cd99e68e01a1c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 15:18:56 +0200 Subject: [PATCH 740/924] coverity doesnt think we checked the bytes_read values enough. lets add a check --- client/src/cmdnfc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdnfc.c b/client/src/cmdnfc.c index eadfa7161..431464076 100644 --- a/client/src/cmdnfc.c +++ b/client/src/cmdnfc.c @@ -109,7 +109,7 @@ static int CmdNfcDecode(const char *Cmd) { uint8_t *dump = NULL; size_t bytes_read = 4096; res = pm3_load_dump(filename, (void **)&dump, &bytes_read, 4096); - if (res != PM3_SUCCESS || dump == NULL) { + if (res != PM3_SUCCESS || dump == NULL || bytes_read > 4096) { return res; } From 90a3b968fd89d47c9d991c672d8f69994b2ea23e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 15:24:53 +0200 Subject: [PATCH 741/924] coverity dont think we check if we got enough bytes to operate on. The sizeof the bmp_header_t gives a bit, we would need more ... --- client/src/cmdhfwaveshare.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfwaveshare.c b/client/src/cmdhfwaveshare.c index 8df62bcc1..12e5320e3 100644 --- a/client/src/cmdhfwaveshare.c +++ b/client/src/cmdhfwaveshare.c @@ -1064,7 +1064,13 @@ static int CmdHF14AWSLoadBmp(const char *Cmd) { size_t bytes_read = 0; if (loadFile_safe(filename, ".bmp", (void **)&bmp, &bytes_read) != PM3_SUCCESS) { PrintAndLogEx(WARNING, "Could not find file " _YELLOW_("%s"), filename); - return PM3_EIO; + return PM3_EFILE; + } + if (bmp == NULL) { + return PM3_EMALLOC; + } + if (bytes_read < sizeof(bmp_header_t)) { + return PM3_ESOFT; } int depth = picture_bit_depth(bmp, bytes_read, model_nr); From 97ca694c103a35bc0ffb811e2c0e8222ce58f430 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 16:39:48 +0200 Subject: [PATCH 742/924] added a view command for ISO15693 --- CHANGELOG.md | 1 + client/src/cmdhf15.c | 48 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51a06b0db..bb0835a11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `hf 15 vie` - view ISO15693 dump files (@iceman1001) - Fixed `hf iclass config` - now loops correct in keyroll generation (@iceman1001) - Added `hf iclass sam` - skeleton command (@iceman1001) - Changed `lf cotag demo` - a new decoder (@iceman1001) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index c16bfb10b..63ed2dd09 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -2820,10 +2820,45 @@ static int CmdHF15EASPassProtect(const char *Cmd) { return resp.status; } +static int CmdHF15View(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 15 view", + "Print a ISO-15693 tag dump file (bin/eml/json)", + "hf 15 view -f hf-iclass-AA162D30F8FF12F1-dump.bin\n" + ); + void *argtable[] = { + arg_param_begin, + arg_str1("f", "file", "", "filename of dump (bin/eml/json)"), +// arg_lit0("z", "dense", "dense dump output style"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + int fnlen = 0; + char filename[FILE_PATH_SIZE]; + CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); +// bool dense_output = g_session.dense_output || arg_get_lit(ctx, 2); + CLIParserFree(ctx); + + // read dump file + uint8_t *dump = NULL; + size_t bytes_read = CARD_MEMORY_SIZE; + int res = pm3_load_dump(filename, (void **)&dump, &bytes_read, CARD_MEMORY_SIZE); + if (res != PM3_SUCCESS) { + return res; + } + + PrintAndLogEx(NORMAL, ""); + print_blocks_15693(dump, bytes_read, 4); + + free(dump); + return PM3_SUCCESS; +} + static command_t CommandTable[] = { - {"-----------", CmdHF15Help, AlwaysAvailable, "--------------------- " _CYAN_("General") " ---------------------"}, {"help", CmdHF15Help, AlwaysAvailable, "This help"}, {"list", CmdHF15List, AlwaysAvailable, "List ISO-15693 history"}, + {"-----------", CmdHF15Help, AlwaysAvailable, "----------------------- " _CYAN_("general") " -----------------------"}, {"demod", CmdHF15Demod, AlwaysAvailable, "Demodulate ISO-15693 from tag"}, {"dump", CmdHF15Dump, IfPm3Iso15693, "Read all memory pages of an ISO-15693 tag, save to file"}, {"info", CmdHF15Info, IfPm3Iso15693, "Tag information"}, @@ -2834,10 +2869,14 @@ static command_t CommandTable[] = { {"reader", CmdHF15Reader, IfPm3Iso15693, "Act like an ISO-15693 reader"}, {"restore", CmdHF15Restore, IfPm3Iso15693, "Restore from file to all memory pages of an ISO-15693 tag"}, {"samples", CmdHF15Samples, IfPm3Iso15693, "Acquire samples as reader (enables carrier, sends inquiry)"}, + {"view", CmdHF15View, AlwaysAvailable, "Display content from tag dump file"}, + {"wrbl", CmdHF15Write, IfPm3Iso15693, "Write a block"}, + {"-----------", CmdHF15Help, IfPm3Iso15693, "--------------------- " _CYAN_("simulation") " ----------------------"}, + {"sim", CmdHF15Sim, IfPm3Iso15693, "Fake an ISO-15693 tag"}, {"eload", CmdHF15ELoad, IfPm3Iso15693, "Load image file into emulator to be used by 'sim' command"}, {"esave", CmdHF15ESave, IfPm3Iso15693, "Save emulator memory into image file"}, {"eview", CmdHF15EView, IfPm3Iso15693, "View emulator memory"}, - {"sim", CmdHF15Sim, IfPm3Iso15693, "Fake an ISO-15693 tag"}, + {"-----------", CmdHF15Help, IfPm3Iso15693, "------------------------ " _CYAN_("SLIX") " -------------------------"}, {"slixwritepwd", CmdHF15SlixWritePassword, IfPm3Iso15693, "Writes a password on a SLIX ISO-15693 tag"}, {"slixeasdisable", CmdHF15SlixEASDisable, IfPm3Iso15693, "Disable EAS mode on SLIX ISO-15693 tag"}, {"slixeasenable", CmdHF15SlixEASEnable, IfPm3Iso15693, "Enable EAS mode on SLIX ISO-15693 tag"}, @@ -2845,12 +2884,11 @@ static command_t CommandTable[] = { {"slixprivacyenable", CmdHF15SlixEnable, IfPm3Iso15693, "Enable privacy mode on SLIX ISO-15693 tag"}, {"passprotectafi", CmdHF15AFIPassProtect, IfPm3Iso15693, "Password protect AFI - Cannot be undone"}, {"passprotecteas", CmdHF15EASPassProtect, IfPm3Iso15693, "Password protect EAS - Cannot be undone"}, - {"wrbl", CmdHF15Write, IfPm3Iso15693, "Write a block"}, - {"-----------", CmdHF15Help, IfPm3Iso15693, "----------------------- " _CYAN_("afi") " -----------------------"}, + {"-----------", CmdHF15Help, IfPm3Iso15693, "-------------------------- " _CYAN_("afi") " ------------------------"}, {"findafi", CmdHF15FindAfi, IfPm3Iso15693, "Brute force AFI of an ISO-15693 tag"}, {"writeafi", CmdHF15WriteAfi, IfPm3Iso15693, "Writes the AFI on an ISO-15693 tag"}, {"writedsfid", CmdHF15WriteDsfid, IfPm3Iso15693, "Writes the DSFID on an ISO-15693 tag"}, - {"-----------", CmdHF15Help, IfPm3Iso15693, "----------------------- " _CYAN_("magic") " -----------------------"}, + {"-----------", CmdHF15Help, IfPm3Iso15693, "------------------------- " _CYAN_("magic") " -----------------------"}, {"csetuid", CmdHF15CSetUID, IfPm3Iso15693, "Set UID for magic card"}, {NULL, NULL, NULL, NULL} }; From eaee05908ca86e4d9db5ceda5541826578042704 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 17:01:33 +0200 Subject: [PATCH 743/924] text --- client/src/cmdhficlass.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 7ccec1221..11bec0d16 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -4190,30 +4190,29 @@ static int CmdHFiClassSAM(const char *Cmd) { } static command_t CommandTable[] = { - {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("operations") " ---------------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"list", CmdHFiClassList, AlwaysAvailable, "List iclass history"}, + {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("general") " ---------------------"}, // {"clone", CmdHFiClassClone, IfPm3Iclass, "Create a HID credential to Picopass / iCLASS tag"}, {"dump", CmdHFiClassDump, IfPm3Iclass, "Dump Picopass / iCLASS tag to file"}, {"info", CmdHFiClassInfo, AlwaysAvailable, "Tag information"}, - {"list", CmdHFiClassList, AlwaysAvailable, "List iclass history"}, {"rdbl", CmdHFiClass_ReadBlock, IfPm3Iclass, "Read Picopass / iCLASS block"}, {"reader", CmdHFiClassReader, IfPm3Iclass, "Act like a Picopass / iCLASS reader"}, {"restore", CmdHFiClassRestore, IfPm3Iclass, "Restore a dump file onto a Picopass / iCLASS tag"}, {"sniff", CmdHFiClassSniff, IfPm3Iclass, "Eavesdrop Picopass / iCLASS communication"}, + {"view", CmdHFiClassView, AlwaysAvailable, "Display content from tag dump file"}, {"wrbl", CmdHFiClass_WriteBlock, IfPm3Iclass, "Write Picopass / iCLASS block"}, - - {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("recovery") " ---------------------"}, + {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("recovery") " --------------------"}, // {"autopwn", CmdHFiClassAutopwn, IfPm3Iclass, "Automatic key recovery tool for iCLASS"}, {"chk", CmdHFiClassCheckKeys, IfPm3Iclass, "Check keys"}, {"loclass", CmdHFiClass_loclass, AlwaysAvailable, "Use loclass to perform bruteforce reader attack"}, {"lookup", CmdHFiClassLookUp, AlwaysAvailable, "Uses authentication trace to check for key in dictionary file"}, - {"-----------", CmdHelp, IfPm3Iclass, "--------------------- " _CYAN_("simulation") " ---------------------"}, + {"-----------", CmdHelp, IfPm3Iclass, "-------------------- " _CYAN_("simulation") " -------------------"}, {"sim", CmdHFiClassSim, IfPm3Iclass, "Simulate iCLASS tag"}, {"eload", CmdHFiClassELoad, IfPm3Iclass, "Load Picopass / iCLASS dump file into emulator memory"}, {"esave", CmdHFiClassESave, IfPm3Iclass, "Save emulator memory to file"}, {"eview", CmdHFiClassEView, IfPm3Iclass, "View emulator memory"}, - - {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("utils") " ---------------------"}, + {"-----------", CmdHelp, AlwaysAvailable, "---------------------- " _CYAN_("utils") " ----------------------"}, {"configcard", CmdHFiClassConfigCard, AlwaysAvailable, "Reader configuration card"}, {"calcnewkey", CmdHFiClassCalcNewKey, AlwaysAvailable, "Calc diversified keys (blocks 3 & 4) to write new keys"}, {"encode", CmdHFiClassEncode, AlwaysAvailable, "Encode binary wiegand to block 7"}, @@ -4221,8 +4220,7 @@ static command_t CommandTable[] = { {"decrypt", CmdHFiClassDecrypt, AlwaysAvailable, "Decrypt given block data or tag dump file" }, {"managekeys", CmdHFiClassManageKeys, AlwaysAvailable, "Manage keys to use with iclass commands"}, {"permutekey", CmdHFiClassPermuteKey, AlwaysAvailable, "Permute function from 'heart of darkness' paper"}, - {"view", CmdHFiClassView, AlwaysAvailable, "Display content from tag dump file"}, - {"-----------", CmdHelp, IfPm3Smartcard, "--------------------- " _CYAN_("SAM") " ---------------------"}, + {"-----------", CmdHelp, IfPm3Smartcard, "----------------------- " _CYAN_("SAM") " -----------------------"}, {"sam", CmdHFiClassSAM, IfPm3Smartcard, "SAM tests"}, {NULL, NULL, NULL, NULL} }; From 63bb831a64e7d3de28a5fbf89271d5fc1ea3d8e0 Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Mon, 24 Jul 2023 23:37:33 +0800 Subject: [PATCH 744/924] Fix typos in CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb0835a11..43b0af889 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Added `hf 15 vie` - view ISO15693 dump files (@iceman1001) + - Added `hf 15 view` - view ISO15693 dump files (@iceman1001) - Fixed `hf iclass config` - now loops correct in keyroll generation (@iceman1001) - Added `hf iclass sam` - skeleton command (@iceman1001) - Changed `lf cotag demo` - a new decoder (@iceman1001) @@ -19,7 +19,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf legic sim` - loop and return codes on deviceside updated to DEFINES (@iceman1001) - Changed `hf legic einfo` - now accepts the three different cardsizes as params (@iceman1001) - Fixed `lf cotag reader -1` - now doesn't fail (@iceman1001) - - Added support for LZ4 compressed hadnested tables (@doegox) + - Added support for LZ4 compressed hardnested tables (@doegox) - Changed `emv reader -v` - now tries to print found transactions logs (@iceman1001) - Added ISO4217 currency lookup (@iceman1001) - Fixed bad free in loadfilebinarykey fct. Thanks to @gentilkiwi From 1a788b1c14ec05a1c5f81a79f9b72ce933cedd06 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 17:42:27 +0200 Subject: [PATCH 745/924] make style --- client/src/cmdhf14a.c | 2 +- client/src/cmdhf15.c | 2 +- client/src/cmdhfmfhard.c | 6 +- client/src/comms.c | 8 +- client/src/pm3line_vocabulory.h | 1542 +++++++++++++++---------------- client/src/proxendian.h | 8 +- common/commonutil.c | 24 +- 7 files changed, 796 insertions(+), 796 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index ad0eff3b5..daa9ba8fb 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -624,7 +624,7 @@ static int CmdHF14AReader(const char *Cmd) { PrintAndLogEx(NORMAL, ""); } if ((disconnectAfter == false) && (silent == false)) { - PrintAndLogEx(SUCCESS, "Card is selected. You can now start sending commands"); + PrintAndLogEx(SUCCESS, "Card is selected. You can now start sending commands"); } } plot: diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 63ed2dd09..792692773 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -2825,7 +2825,7 @@ static int CmdHF15View(const char *Cmd) { CLIParserInit(&ctx, "hf 15 view", "Print a ISO-15693 tag dump file (bin/eml/json)", "hf 15 view -f hf-iclass-AA162D30F8FF12F1-dump.bin\n" - ); + ); void *argtable[] = { arg_param_begin, arg_str1("f", "file", "", "filename of dump (bin/eml/json)"), diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 3d85a2c60..9b4cf4858 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -1564,16 +1564,16 @@ static int acquire_nonces(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_ FILE *fnonces = NULL; // init to ZERO - PacketResponseNG resp = { + PacketResponseNG resp = { .cmd = 0, .length = 0, .magic = 0, .status = 0, - .crc = 0, + .crc = 0, .ng = false, }; resp.oldarg[0] = 0; - resp.oldarg[1] = 0; + resp.oldarg[1] = 0; resp.oldarg[2] = 0; memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); diff --git a/client/src/comms.c b/client/src/comms.c index 7bd553f20..298db88e7 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -751,10 +751,10 @@ bool WaitForResponseTimeoutW(uint32_t cmd, PacketResponseNG *response, size_t ms resp.length = 0, resp.magic = 0, resp.status = 0, - resp.crc = 0, + resp.crc = 0, resp.ng = false, resp.oldarg[0] = 0; - resp.oldarg[1] = 0; + resp.oldarg[1] = 0; resp.oldarg[2] = 0; memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); @@ -832,10 +832,10 @@ bool GetFromDevice(DeviceMemType_t memtype, uint8_t *dest, uint32_t bytes, uint3 resp.length = 0, resp.magic = 0, resp.status = 0, - resp.crc = 0, + resp.crc = 0, resp.ng = false, resp.oldarg[0] = 0; - resp.oldarg[1] = 0; + resp.oldarg[1] = 0; resp.oldarg[2] = 0; memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 2646a0477..864047dba 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,776 +31,776 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data envelope" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data cthreshold" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data num" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 1, "emv list" }, - { 1, "emv test" }, - { 0, "emv challenge" }, - { 0, "emv exec" }, - { 0, "emv genac" }, - { 0, "emv gpo" }, - { 0, "emv intauth" }, - { 0, "emv pse" }, - { 0, "emv reader" }, - { 0, "emv readrec" }, - { 0, "emv roca" }, - { 0, "emv scan" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 0, "hf iclass sam" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 0, "hf legic einfo" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf gdmcfg" }, - { 0, "hf mf gdmsetcfg" }, - { 0, "hf mf gdmsetblk" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 1, "hf mfp list" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp dump" }, - { 0, "hf mfp info" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp ndefformat" }, - { 0, "hf mfp ndefread" }, - { 0, "hf mfp ndefwrite" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu tamper" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 1, "hf topaz list" }, - { 0, "hf topaz dump" }, - { 0, "hf topaz info" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf vas help" }, - { 0, "hf vas reader" }, - { 1, "hf vas decrypt" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 1, "hw timeout" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 brute" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag read" }, - { 0, "lf hitag wrbl" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag cc" }, - { 0, "lf hitag ta" }, - { 0, "lf hitag eload" }, - { 0, "lf hitag sim" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data envelope" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data cthreshold" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data num" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 1, "emv list" }, + { 1, "emv test" }, + { 0, "emv challenge" }, + { 0, "emv exec" }, + { 0, "emv genac" }, + { 0, "emv gpo" }, + { 0, "emv intauth" }, + { 0, "emv pse" }, + { 0, "emv reader" }, + { 0, "emv readrec" }, + { 0, "emv roca" }, + { 0, "emv scan" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 0, "hf iclass sam" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 0, "hf legic einfo" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf gdmcfg" }, + { 0, "hf mf gdmsetcfg" }, + { 0, "hf mf gdmsetblk" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 1, "hf mfp list" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp dump" }, + { 0, "hf mfp info" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp ndefformat" }, + { 0, "hf mfp ndefread" }, + { 0, "hf mfp ndefwrite" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu tamper" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 1, "hf topaz list" }, + { 0, "hf topaz dump" }, + { 0, "hf topaz info" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf vas help" }, + { 0, "hf vas reader" }, + { 1, "hf vas decrypt" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 1, "hw timeout" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag read" }, + { 0, "lf hitag wrbl" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag cc" }, + { 0, "lf hitag ta" }, + { 0, "lf hitag eload" }, + { 0, "lf hitag sim" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -808,4 +808,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif \ No newline at end of file +#endif diff --git a/client/src/proxendian.h b/client/src/proxendian.h index 05b699747..d258d2ce8 100644 --- a/client/src/proxendian.h +++ b/client/src/proxendian.h @@ -54,14 +54,14 @@ static inline uint16_t le16(uint16_t v) { return (uint16_t)( - (v >> 8) | (v << 8) - ); + (v >> 8) | (v << 8) + ); } static inline uint32_t le32(uint32_t v) { return (uint32_t)( - (le16(v) << 16) | (le16(v >> 16)) - ); + (le16(v) << 16) | (le16(v >> 16)) + ); } #endif // HOST_LITTLE_ENDIAN diff --git a/common/commonutil.c b/common/commonutil.c index 6790d835a..2265c240c 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -162,38 +162,38 @@ uint64_t bytes_to_num(uint8_t *src, size_t len) { inline uint16_t MemLeToUint2byte(const uint8_t *data) { return (uint16_t)( - (data[1] << 8) + data[0] - ); + (data[1] << 8) + data[0] + ); } inline uint32_t MemLeToUint3byte(const uint8_t *data) { return (uint32_t)( - (data[2] << 16) + (data[1] << 8) + data[0] - ); + (data[2] << 16) + (data[1] << 8) + data[0] + ); } inline uint32_t MemLeToUint4byte(const uint8_t *data) { return (uint32_t)( - (data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0] - ); + (data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0] + ); } inline uint16_t MemBeToUint2byte(const uint8_t *data) { return (uint16_t)( - (data[0] << 8) + data[1] - ); + (data[0] << 8) + data[1] + ); } inline uint32_t MemBeToUint3byte(const uint8_t *data) { return (uint32_t)( - (data[0] << 16) + (data[1] << 8) + data[2] - ); + (data[0] << 16) + (data[1] << 8) + data[2] + ); } inline uint32_t MemBeToUint4byte(const uint8_t *data) { return (uint32_t)( - (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3] - ); + (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3] + ); } void Uint2byteToMemLe(uint8_t *data, uint16_t value) { From 41ff9191d6e1271c33edd495614c199b1e9d241c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 21:04:21 +0200 Subject: [PATCH 746/924] text --- client/src/cmdhf14b.c | 2 +- client/src/cmdhf15.c | 50 ++++++++++++++++++++++------------------ client/src/cmdhficlass.c | 2 +- client/src/cmdhflegic.c | 2 +- client/src/cmdhfmfp.c | 1 - client/src/cmdhfmfu.c | 1 - client/src/cmdlfem4x05.c | 14 +++++------ client/src/cmdlfem4x70.c | 2 -- client/src/cmdlfhitag.c | 1 - doc/colors_notes.md | 1 - 10 files changed, 37 insertions(+), 39 deletions(-) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index 29a985b29..e8d48751a 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -861,7 +861,7 @@ static bool HF14B_Std_Info(bool verbose, bool do_aid_search) { switch (status) { case 0: { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "-------------------- " _CYAN_("Tag information") " --------------------"); + PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); PrintAndLogEx(SUCCESS, " UID : " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); PrintAndLogEx(SUCCESS, " ATQB : %s", sprint_hex(card.atqb, sizeof(card.atqb))); PrintAndLogEx(SUCCESS, " CHIPID : %02X", card.chipid); diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 792692773..ad63bd3b8 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -671,11 +671,9 @@ static int NxpTestEAS(uint8_t *uid) { SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { - PrintAndLogEx(WARNING, "iso15693 timeout"); + PrintAndLogEx(DEBUG, "iso15693 timeout"); } else { - PrintAndLogEx(NORMAL, ""); - - + PrintAndLogEx(INFO, ""); if (resp.length < 2) { PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is not active"); } else { @@ -687,7 +685,6 @@ static int NxpTestEAS(uint8_t *uid) { } } } - return PM3_SUCCESS; } @@ -712,7 +709,7 @@ static int NxpCheckSig(uint8_t *uid) { SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { - PrintAndLogEx(WARNING, "iso15693 timeout"); + PrintAndLogEx(DEBUG, "iso15693 timeout"); DropField(); return PM3_ETIMEOUT; } @@ -732,10 +729,9 @@ static int NxpCheckSig(uint8_t *uid) { } uint8_t signature[32] = {0x00}; - memcpy(signature, recv + 1, 32); + memcpy(signature, recv + 1, sizeof(signature)); nxp_15693_print_signature(uid, signature); - return PM3_SUCCESS; } @@ -764,7 +760,7 @@ static int NxpSysInfo(uint8_t *uid) { clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (WaitForResponseTimeout(CMD_HF_ISO15693_COMMAND, &resp, 2000) == false) { - PrintAndLogEx(WARNING, "iso15693 timeout"); + PrintAndLogEx(DEBUG, "iso15693 timeout"); DropField(); return PM3_ETIMEOUT; } @@ -790,21 +786,29 @@ static int NxpSysInfo(uint8_t *uid) { bool support_signature = (recv[5] & 0x01); bool support_easmode = (recv[4] & 0x04); - PrintAndLogEx(INFO, "--------- " _CYAN_("NXP Sysinfo") " ---------"); - PrintAndLogEx(INFO, " raw : %s", sprint_hex(recv, 8)); - PrintAndLogEx(INFO, " Password protection configuration:"); - PrintAndLogEx(INFO, " * Page L read%s password protected", ((recv[2] & 0x01) ? "" : " not")); - PrintAndLogEx(INFO, " * Page L write%s password protected", ((recv[2] & 0x02) ? "" : " not")); - PrintAndLogEx(INFO, " * Page H read%s password protected", ((recv[2] & 0x10) ? "" : " not")); - PrintAndLogEx(INFO, " * Page H write%s password protected", ((recv[2] & 0x20) ? "" : " not")); + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, "--- " _CYAN_("NXP Sysinfo")); + PrintAndLogEx(INFO, " raw... %s", sprint_hex(recv, 8)); + PrintAndLogEx(INFO, " " _CYAN_("Password protection configuration:")); + PrintAndLogEx(INFO, " * Page L read%s password protected", ((recv[2] & 0x01) ? "" : _GREEN_(" not"))); + PrintAndLogEx(INFO, " * Page L write%s password protected", ((recv[2] & 0x02) ? "" : _GREEN_(" not"))); + PrintAndLogEx(INFO, " * Page H read%s password protected", ((recv[2] & 0x10) ? "" : _GREEN_(" not"))); + PrintAndLogEx(INFO, " * Page H write%s password protected", ((recv[2] & 0x20) ? "" : _GREEN_(" not"))); - PrintAndLogEx(INFO, " Lock bits:"); - PrintAndLogEx(INFO, " * AFI%s locked", ((recv[3] & 0x01) ? "" : " not")); // AFI lock bit - PrintAndLogEx(INFO, " * EAS%s locked", ((recv[3] & 0x02) ? "" : " not")); // EAS lock bit - PrintAndLogEx(INFO, " * DSFID%s locked", ((recv[3] & 0x03) ? "" : " not")); // DSFID lock bit - PrintAndLogEx(INFO, " * Password protection configuration%s locked", ((recv[3] & 0x04) ? "" : " not")); // Password protection pointer address and access conditions lock bit + PrintAndLogEx(INFO, " " _CYAN_("Lock bits:")); + // AFI lock bit + PrintAndLogEx(INFO, " * AFI%s locked", ((recv[3] & 0x01) ? "" : _GREEN_(" not"))); - PrintAndLogEx(INFO, " Features:"); + // EAS lock bit + PrintAndLogEx(INFO, " * EAS%s locked", ((recv[3] & 0x02) ? "" : _GREEN_(" not"))); + + // DSFID lock bit + PrintAndLogEx(INFO, " * DSFID%s locked", ((recv[3] & 0x03) ? "" : _GREEN_(" not"))); + + // Password protection pointer address and access conditions lock bit + PrintAndLogEx(INFO, " * Password protection configuration%s locked", ((recv[3] & 0x04) ? "" : _GREEN_(" not"))); + + PrintAndLogEx(INFO, " " _CYAN_("Features:")); PrintAndLogEx(INFO, " * User memory password protection%s supported", ((recv[4] & 0x01) ? "" : " not")); PrintAndLogEx(INFO, " * Counter feature%s supported", ((recv[4] & 0x02) ? "" : " not")); PrintAndLogEx(INFO, " * EAS ID%s supported by EAS ALARM command", support_easmode ? "" : " not"); @@ -827,6 +831,7 @@ static int NxpSysInfo(uint8_t *uid) { NxpCheckSig(uid); } + PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } @@ -925,7 +930,6 @@ static int CmdHF15Info(const char *Cmd) { memcpy(uid, data + 2, sizeof(uid)); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); - PrintAndLogEx(INFO, "-------------------------------------------------------------"); PrintAndLogEx(SUCCESS, " TYPE: " _YELLOW_("%s"), getTagInfo_15(data + 2)); PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), iso15693_sprintUID(NULL, uid)); PrintAndLogEx(SUCCESS, " SYSINFO: %s", sprint_hex(data, resp.length - 2)); diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 11bec0d16..1a96fbacb 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -4282,7 +4282,7 @@ int info_iclass(bool shallow_mod) { picopass_ns_hdr_t *ns_hdr = &r->header.ns_hdr; PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "--------------------- " _CYAN_("Tag Information") " ----------------------"); + PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ----------------------------------------"); if ((r->status & FLAG_ICLASS_CSN) == FLAG_ICLASS_CSN) { PrintAndLogEx(SUCCESS, " CSN: " _GREEN_("%s") " uid", sprint_hex(hdr->csn, sizeof(hdr->csn))); diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 160eac05b..2398aa8dc 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -83,7 +83,7 @@ static int decode_and_print_memory(uint16_t card_size, const uint8_t *input_buff int crc = data[4]; uint32_t calc_crc = CRC8Legic(data, 4); - PrintAndLogEx(INFO, "--------------------- " _CYAN_("Tag Information") " ----------------------"); + PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ----------------------------------------"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, " " _CYAN_("CDF: System Area")); PrintAndLogEx(INFO, "------------------------------------------------------"); diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index e8e2c7226..01f529b99 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -283,7 +283,6 @@ static int CmdHFMFPInfo(const char *Cmd) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); - PrintAndLogEx(INFO, "-------------------------------------------------------------"); // Mifare Plus info SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 6762d0b1c..d5fcd3ac0 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1785,7 +1785,6 @@ static int CmdHF14AMfUInfo(const char *Cmd) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " --------------------------"); - PrintAndLogEx(INFO, "-------------------------------------------------------------"); ul_print_type(tagtype, 6); // Swap endianness diff --git a/client/src/cmdlfem4x05.c b/client/src/cmdlfem4x05.c index c21540f45..665518a40 100644 --- a/client/src/cmdlfem4x05.c +++ b/client/src/cmdlfem4x05.c @@ -2162,14 +2162,14 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"brute", CmdEM4x05Brute, IfPm3Lf, "Bruteforce password"}, {"chk", CmdEM4x05Chk, IfPm3Lf, "Check passwords from dictionary"}, - {"demod", CmdEM4x05Demod, AlwaysAvailable, "demodulate a EM4x05/EM4x69 tag from the GraphBuffer"}, - {"dump", CmdEM4x05Dump, IfPm3Lf, "dump EM4x05/EM4x69 tag"}, - {"info", CmdEM4x05Info, IfPm3Lf, "tag information EM4x05/EM4x69"}, - {"read", CmdEM4x05Read, IfPm3Lf, "read word data from EM4x05/EM4x69"}, + {"demod", CmdEM4x05Demod, AlwaysAvailable, "Demodulate a EM4x05/EM4x69 tag from the GraphBuffer"}, + {"dump", CmdEM4x05Dump, IfPm3Lf, "Dump EM4x05/EM4x69 tag"}, + {"info", CmdEM4x05Info, IfPm3Lf, "Tag information"}, + {"read", CmdEM4x05Read, IfPm3Lf, "Read word data from EM4x05/EM4x69"}, {"sniff", CmdEM4x05Sniff, AlwaysAvailable, "Attempt to recover em4x05 commands from sample buffer"}, - {"unlock", CmdEM4x05Unlock, IfPm3Lf, "execute tear off against EM4x05/EM4x69"}, - {"wipe", CmdEM4x05Wipe, IfPm3Lf, "wipe EM4x05/EM4x69 tag"}, - {"write", CmdEM4x05Write, IfPm3Lf, "write word data to EM4x05/EM4x69"}, + {"unlock", CmdEM4x05Unlock, IfPm3Lf, "Execute tear off against EM4x05/EM4x69"}, + {"wipe", CmdEM4x05Wipe, IfPm3Lf, "Wipe EM4x05/EM4x69 tag"}, + {"write", CmdEM4x05Write, IfPm3Lf, "Write word data to EM4x05/EM4x69"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfem4x70.c b/client/src/cmdlfem4x70.c index d7bc3811a..c1e2aff03 100644 --- a/client/src/cmdlfem4x70.c +++ b/client/src/cmdlfem4x70.c @@ -35,8 +35,6 @@ static void print_info_result(const uint8_t *data) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); - PrintAndLogEx(INFO, "-----------------------------------------------"); - PrintAndLogEx(INFO, "Block | data | info"); PrintAndLogEx(INFO, "------+----------+-----------------------------"); diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 4df9ca4a7..1cbae7bd3 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -514,7 +514,6 @@ static int CmdLFHitagInfo(const char *Cmd) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); - PrintAndLogEx(INFO, "-------------------------------------------------------------"); PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%08X"), uid); PrintAndLogEx(SUCCESS, " TYPE: " _GREEN_("%s"), getHitagTypeStr(uid)); diff --git a/doc/colors_notes.md b/doc/colors_notes.md index dac993585..b25a7d7c9 100644 --- a/doc/colors_notes.md +++ b/doc/colors_notes.md @@ -43,7 +43,6 @@ The following definition has be crystallized out from these experiments. Its no ``` PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); - PrintAndLogEx(INFO, "-------------------------------------------------------------"); ``` For more examples, see also all **-h** helptext now in the LUA scripts. For the command help texts using _YELLOW_ for the example makes it very easy to see what is the command vs the description. From b446c36da63eeb7c539f534fe4f9aa6592622ed4 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 21:04:32 +0200 Subject: [PATCH 747/924] style --- client/src/proxmark3.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 162bc7776..f6c25a9eb 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -282,19 +282,22 @@ check_script: // read script file if (fgets(script_cmd_buf, sizeof(script_cmd_buf), current_cmdscriptfile()) == NULL) { - if (!pop_cmdscriptfile()) + if (pop_cmdscriptfile() == false) { break; - + } goto check_script; - } else { - prompt_ctx = PROXPROMPT_CTX_SCRIPTFILE; - // remove linebreaks - strcleanrn(script_cmd_buf, sizeof(script_cmd_buf)); - - cmd = str_dup(script_cmd_buf); - if (cmd != NULL) - printprompt = true; } + + prompt_ctx = PROXPROMPT_CTX_SCRIPTFILE; + + // remove linebreaks + strcleanrn(script_cmd_buf, sizeof(script_cmd_buf)); + + cmd = str_dup(script_cmd_buf); + if (cmd != NULL) { + printprompt = true; + } + } else { // If there is a script command if (execCommand) { @@ -429,8 +432,9 @@ check_script: msleep(100); // Make sure command is sent before killing client } - while (current_cmdscriptfile()) + while (current_cmdscriptfile()) { pop_cmdscriptfile(); + } pm3line_flush_history(); From 4179ce1e42fe8b21453a978e1e30385c93007069 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 21:34:01 +0200 Subject: [PATCH 748/924] text --- client/src/cmdhf15.c | 2 +- client/src/cmdhfmf.c | 2 +- client/src/cmdhfmfu.c | 2 +- client/src/nfc/ndef.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index ad63bd3b8..0747cedec 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -335,7 +335,7 @@ static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { return PM3_ESOFT; } - PrintAndLogEx(INFO, " IC signature public key name: %s", nxp_15693_public_keys[i].desc); + PrintAndLogEx(INFO, " IC signature public key name: " _GREEN_("%s"), nxp_15693_public_keys[i].desc); PrintAndLogEx(INFO, "IC signature public key value: %s", nxp_15693_public_keys[i].value); PrintAndLogEx(INFO, " Elliptic curve parameters: NID_secp128r1"); PrintAndLogEx(INFO, " TAG IC Signature: %s", sprint_hex_inrow(signature, 32)); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index bbeaa5fce..f535696cc 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -89,7 +89,7 @@ int mfc_ev1_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signature, in return PM3_ESOFT; } - PrintAndLogEx(INFO, " IC signature public key name: %s", nxp_mfc_public_keys[i].desc); + PrintAndLogEx(INFO, " IC signature public key name: " _GREEN_("%s"), nxp_mfc_public_keys[i].desc); PrintAndLogEx(INFO, "IC signature public key value: %s", nxp_mfc_public_keys[i].value); PrintAndLogEx(INFO, " Elliptic curve parameters: NID_secp128r1"); PrintAndLogEx(INFO, " TAG IC Signature: %s", sprint_hex_inrow(signature, 32)); diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index d5fcd3ac0..2f8b206f2 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1097,7 +1097,7 @@ static int ulev1_print_signature(TagTypeUL_t tagtype, uint8_t *uid, uint8_t *sig return PM3_ESOFT; } - PrintAndLogEx(INFO, " IC signature public key name: %s", nxp_mfu_public_keys[i].desc); + PrintAndLogEx(INFO, " IC signature public key name: " _GREEN_("%s"), nxp_mfu_public_keys[i].desc); PrintAndLogEx(INFO, "IC signature public key value: %s", nxp_mfu_public_keys[i].value); PrintAndLogEx(INFO, " Elliptic curve parameters: NID_secp128r1"); PrintAndLogEx(INFO, " TAG IC Signature: %s", sprint_hex_inrow(signature, signature_len)); diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index fc829e8d7..e0bc83c14 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -274,7 +274,7 @@ static int ndef_print_signature(uint8_t *data, uint8_t data_len, uint8_t *signat return PM3_ESOFT; } - PrintAndLogEx(INFO, " IC signature public key name: %s", ndef_public_keys[i].desc); + PrintAndLogEx(INFO, " IC signature public key name: " _GREEN_("%s"), ndef_public_keys[i].desc); PrintAndLogEx(INFO, "IC signature public key value: %s", ndef_public_keys[i].value); PrintAndLogEx(INFO, " Elliptic curve parameters: %s", get_curve_name(ndef_public_keys[i].grp_id)); PrintAndLogEx(INFO, " NDEF Signature: %s", sprint_hex_inrow(signature, 32)); From 1a4df13aaec982f66777b06e1231807eaba54979 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 24 Jul 2023 22:18:35 +0200 Subject: [PATCH 749/924] fix coverity cid #416068 --- client/src/cmdhfwaveshare.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhfwaveshare.c b/client/src/cmdhfwaveshare.c index 12e5320e3..8bb9eadc8 100644 --- a/client/src/cmdhfwaveshare.c +++ b/client/src/cmdhfwaveshare.c @@ -1070,6 +1070,7 @@ static int CmdHF14AWSLoadBmp(const char *Cmd) { return PM3_EMALLOC; } if (bytes_read < sizeof(bmp_header_t)) { + free(bmp); return PM3_ESOFT; } From cb9ee94ed6aa63be94a351793ba49ac38244f722 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 25 Jul 2023 12:39:22 +0200 Subject: [PATCH 750/924] lets see if this sorts out the memory crash on pentoo --- client/src/fileutils.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 7ca59ef85..3de51f60f 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -210,18 +210,19 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath pfn += save_path_len + strlen(PATHSEP); } - uint16_t p_namelen = strlen(preferredName); + // remove file extension if exist in name + size_t p_namelen = strlen(preferredName); if (str_endswith(preferredName, suffix)) { p_namelen -= strlen(suffix); } // modify filename - snprintf(pfn, len, "%.*s%s", p_namelen, preferredName, suffix); + snprintf(pfn, len, "%.*s%s", (int)p_namelen, preferredName, suffix); // check complete path/filename if exists int num = 1; while (fileExists(fileName)) { // modify filename - snprintf(pfn, len, "%.*s-%03d%s", p_namelen, preferredName, num, suffix); + snprintf(pfn, len, "%.*s-%03d%s", (int)p_namelen, preferredName, num, suffix); num++; } From 1cb15c84c1b61ee355512a1f7379688e6c7f82ef Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 25 Jul 2023 21:29:31 +0200 Subject: [PATCH 751/924] adapting hf mf cget* commands to longer timeouts. Same with the quick eload used in autopwn among others.\nAlso adapted the return codes, so its more accurate in its reporting back to the client. Also added some more informative messages --- armsrc/iso14443a.c | 9 ++++--- armsrc/mifarecmd.c | 62 ++++++++++++++++++++++++++++++++++----------- armsrc/mifareutil.c | 25 ++++++++++++------ 3 files changed, 70 insertions(+), 26 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 74caf51c1..1966c8c65 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -2365,8 +2365,9 @@ static int GetIso14443aAnswerFromTag(uint8_t *receivedResponse, uint8_t *receive } // timeout already in ms + 100ms guard time - if (GetTickCountDelta(receive_timer) > timeout + 100) + if (GetTickCountDelta(receive_timer) > timeout + 100) { break; + } } return false; } @@ -2401,15 +2402,17 @@ void ReaderTransmit(uint8_t *frame, uint16_t len, uint32_t *timing) { } static uint16_t ReaderReceiveOffset(uint8_t *receivedAnswer, uint16_t offset, uint8_t *par) { - if (!GetIso14443aAnswerFromTag(receivedAnswer, par, offset)) + if (GetIso14443aAnswerFromTag(receivedAnswer, par, offset) == false) { return 0; + } LogTrace(receivedAnswer, Demod.len, Demod.startTime * 16 - DELAY_AIR2ARM_AS_READER, Demod.endTime * 16 - DELAY_AIR2ARM_AS_READER, par, false); return Demod.len; } uint16_t ReaderReceive(uint8_t *receivedAnswer, uint8_t *par) { - if (!GetIso14443aAnswerFromTag(receivedAnswer, par, 0)) + if (GetIso14443aAnswerFromTag(receivedAnswer, par, 0) == false) { return 0; + } LogTrace(receivedAnswer, Demod.len, Demod.startTime * 16 - DELAY_AIR2ARM_AS_READER, Demod.endTime * 16 - DELAY_AIR2ARM_AS_READER, par, false); return Demod.len; } diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index ef6b6022f..ffe3182ba 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -73,9 +73,10 @@ int16_t mifare_cmd_readblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t read_c struct Crypto1State *pcs = &mpcs; iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - clear_trace(); set_tracing(true); + + uint32_t timeout = iso14a_get_timeout(); LED_A_ON(); LED_B_OFF(); @@ -95,6 +96,10 @@ int16_t mifare_cmd_readblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t read_c goto OUT; }; + // frame waiting time (FWT) in 1/fc + uint32_t fwt = 256 * 16 * (1 << 6); + iso14a_set_timeout(fwt / (8 * 16)); + for (uint8_t i = 0; i < count; i++) { if (mifare_classic_readblock_ex(pcs, block_no + i, block_data + (i * 16), read_cmd)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Read block error"); @@ -112,11 +117,11 @@ int16_t mifare_cmd_readblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t read_c OUT: crypto1_deinit(pcs); + iso14a_set_timeout(timeout); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); set_tracing(false); BigBuf_free(); - return retval; } @@ -2072,6 +2077,12 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { int retval = PM3_SUCCESS; + // increase time-out. Magic card etc are slow + uint32_t timeout = iso14a_get_timeout(); + // frame waiting time (FWT) in 1/fc + uint32_t fwt = 256 * 16 * (1 << 7); + iso14a_set_timeout(fwt / (8 * 16)); + for (uint8_t s = 0; s < sectorcnt; s++) { uint64_t ui64Key = emlGetKey(s, keytype); @@ -2110,7 +2121,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { // Auth if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(s), keytype, ui64Key, AUTH_FIRST)) { retval = PM3_EPARTIAL; - if (g_dbglevel > DBG_ERROR) { + if (g_dbglevel >= DBG_ERROR) { Dbprintf("Sector %2d - Auth error", s); } continue; @@ -2122,31 +2133,43 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { for (uint8_t b = 0; b < NumBlocksPerSector(s); b++) { memset(data, 0x00, sizeof(data)); + uint8_t tb = FirstBlockOfSector(s) + b; + uint8_t r = 0; + for (; r < MAX_RETRIES; r++) { - for (uint8_t r = 0; r < MAX_RETRIES; r++) { - - if (mifare_classic_readblock(pcs, FirstBlockOfSector(s) + b, data)) { + int res = mifare_classic_readblock(pcs, tb, data); + if (res == 1) { retval |= PM3_EPARTIAL; - if (g_dbglevel > DBG_ERROR) { - Dbprintf("Error reading sector %2d block %2d", s, b); + if (g_dbglevel >= DBG_ERROR) { + Dbprintf("Error No rights reading sector %2d block %2d", s, b); } + break; + } + // retry if wrong len. + if (res != 0) { continue; } // No need to copy empty if (memcmp(data, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16) == 0) { - continue; + break; } - if (b < NumBlocksPerSector(s) - 1) { - emlSetMem(data, FirstBlockOfSector(s) + b, 1); - } else { + if (IsSectorTrailer(b)) { // sector trailer, keep the keys, set only the AC uint8_t st[16] = {0x00}; - emlGetMem(st, FirstBlockOfSector(s) + b, 1); + emlGetMem(st, tb, 1); memcpy(st + 6, data + 6, 4); - emlSetMem(st, FirstBlockOfSector(s) + b, 1); + emlSetMem(st, tb, 1); + } else { + emlSetMem(data, tb, 1); } + break; + } + + // if we failed all retries, notify client + if (r == MAX_RETRIES) { + retval |= PM3_EPARTIAL; } } } @@ -2154,6 +2177,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { int res = mifare_classic_halt(pcs); (void)res; + iso14a_set_timeout(timeout); crypto1_deinit(pcs); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); @@ -2322,6 +2346,12 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { set_tracing(true); } + // increase time-out. Magic card etc are slow + uint32_t timeout = iso14a_get_timeout(); + // frame waiting time (FWT) in 1/fc + uint32_t fwt = 256 * 16 * (1 << 7); + iso14a_set_timeout(fwt / (8 * 16)); + //loop doesn't loop just breaks out if error or done while (true) { if (workFlags & MAGIC_WUPC) { @@ -2343,7 +2373,7 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { } // read block - if ((mifare_sendcmd_short(NULL, CRYPT_NONE, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) { + if ((mifare_sendcmd_short(NULL, CRYPT_NONE, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != MAX_MIFARE_FRAME_SIZE)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("read block send command error"); errormsg = 0; break; @@ -2371,6 +2401,8 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { if (workFlags & MAGIC_OFF) OnSuccessMagic(); + + iso14a_set_timeout(timeout); } void MifareCIdent(bool is_mfc) { diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 5dfbfd26b..25744aa96 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -116,7 +116,9 @@ uint16_t mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t uint16_t len = ReaderReceive(answer, par); - if (answer_parity) *answer_parity = par[0]; + if (answer_parity) { + *answer_parity = par[0]; + } if (pcs && (crypted == CRYPT_ALL)) { if (len == 1) { @@ -127,8 +129,9 @@ uint16_t mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t res |= (crypto1_bit(pcs, 0, 0) ^ BIT(answer[0], 3)) << 3; answer[0] = res; } else { - for (pos = 0; pos < len; pos++) + for (pos = 0; pos < len; pos++) { answer[pos] = crypto1_byte(pcs, 0x00, 0) ^ answer[pos]; + } } } return len; @@ -238,11 +241,15 @@ int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint8_t blockNo, uint8 uint16_t len = mifare_sendcmd_short(pcs, 1, iso_byte, blockNo, receivedAnswer, receivedAnswerPar, NULL); if (len == 1) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error %02x", receivedAnswer[0]); + if (g_dbglevel >= DBG_ERROR) { + Dbprintf("Block " _YELLOW_("%3d") " Cmd 0x%02x Cmd Error %02x", blockNo, iso_byte, receivedAnswer[0]); + } return 1; } if (len != 18) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("wrong response len %d (expected 18)", len); + if (g_dbglevel >= DBG_ERROR) { + Dbprintf("Block " _YELLOW_("%3d") " Cmd 0x%02x Wrong response len, expected 18 got " _RED_("%d"), blockNo, iso_byte, len); + } return 2; } @@ -701,13 +708,15 @@ void emlClearMem(void) { uint8_t SectorTrailer(uint8_t blockNo) { if (blockNo <= MIFARE_2K_MAXBLOCK) { - if (g_dbglevel >= DBG_EXTENDED) + if (g_dbglevel >= DBG_EXTENDED) { Dbprintf("Sector Trailer for block %d : %d", blockNo, (blockNo | 0x03)); + } return (blockNo | 0x03); } else { - if (g_dbglevel >= DBG_EXTENDED) - Dbprintf("Sector Trailer for block %d : %d", blockNo, (blockNo | 0x0f)); - return (blockNo | 0x0f); + if (g_dbglevel >= DBG_EXTENDED) { + Dbprintf("Sector Trailer for block %d : %d", blockNo, (blockNo | 0x0F)); + } + return (blockNo | 0x0F); } } From e5b075ed3b1b28958de1312e2a84df01b2120f22 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 25 Jul 2023 22:42:42 +0200 Subject: [PATCH 752/924] hf mf restore got some textual updates in order to be easier to understand if keyB writes fails. We use a default ACL when wiping a card that doesnt allow key B to be used for writing. Restore command tries key B first, so there will be several failed key b attempts normally. --- client/src/cmdhfmf.c | 44 +++++++++++++++++++++--------------------- client/src/fileutils.c | 11 ++++++----- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index f535696cc..18c022e4b 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1352,7 +1352,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { return PM3_ESOFT; } - PrintAndLogEx(INFO, "Using key file... `" _YELLOW_("%s") "`", keyfilename); + PrintAndLogEx(INFO, "Using key file `" _YELLOW_("%s") "`", keyfilename); // try reading card uid and create filename if (datafnlen == 0) { @@ -1383,10 +1383,9 @@ static int CmdHF14AMfRestore(const char *Cmd) { // default authentication key uint8_t default_key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - PrintAndLogEx(INFO, "Restoring " _YELLOW_("%s")" to card", datafilename); - - PrintAndLogEx(INFO, " blk | "); - PrintAndLogEx(INFO, "-----+------------------------------------------------------------"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, " blk | data | status"); + PrintAndLogEx(INFO, "-----+-------------------------------------------------+----------------"); // main loop for restoring. // a bit more complicated than needed @@ -1402,6 +1401,8 @@ static int CmdHF14AMfRestore(const char *Cmd) { // if sector trailer if (mfIsSectorTrailerBasedOnBlocks(s, b)) { + + // keep the current keys on the card if (use_keyfile_for_auth == false) { // replace KEY A memcpy(bldata, keyA + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); @@ -1440,10 +1441,13 @@ static int CmdHF14AMfRestore(const char *Cmd) { for (int8_t kt = MF_KEY_B; kt > -1; kt--) { if (use_keyfile_for_auth) { - if (kt == MF_KEY_A) + + if (kt == MF_KEY_A) { memcpy(wdata, keyA + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); - else + } else { memcpy(wdata, keyB + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + } + } else { // use default key to authenticate for the write command memcpy(wdata, default_key, MIFARE_KEY_SIZE); @@ -1451,8 +1455,6 @@ static int CmdHF14AMfRestore(const char *Cmd) { uint16_t blockno = (mfFirstBlockOfSector(s) + b); - PrintAndLogEx(INFO, " %3d | %s", blockno, sprint_hex(bldata, sizeof(bldata))); - clearCommandBuffer(); SendCommandMIX(CMD_HF_MIFARE_WRITEBL, blockno, kt, 0, wdata, sizeof(wdata)); PacketResponseNG resp; @@ -1464,22 +1466,20 @@ static int CmdHF14AMfRestore(const char *Cmd) { int isOK = resp.oldarg[0] & 0xff; if (isOK == 1) { // if success, skip to next block + PrintAndLogEx(INFO, " %3d | %s| ( " _GREEN_("ok") " )", blockno, sprint_hex(bldata, sizeof(bldata))); break; - } else if (isOK == PM3_ETEAROFF) { + } + // write somehow failed. Lets determine why. + if (isOK == PM3_ETEAROFF) { PrintAndLogEx(INFO, "Tear off triggerd. Recommendation is not to use tear-off with restore command"); goto out; - } else { - if (b == 0) { - PrintAndLogEx(INFO, "Writing to manufacture block w key " _YELLOW_("%c") " ( " _RED_("fail") " )", - (kt == MF_KEY_A) ? 'A' : 'B' - ); - } else { - PrintAndLogEx(FAILED, "Write to block " _YELLOW_("%u") " w key " _YELLOW_("%c") " ( " _RED_("fail") " ) ", - blockno, - (kt == MF_KEY_A) ? 'A' : 'B' - ); - } } + + PrintAndLogEx(INFO, " %3d | %s| ( " _RED_("fail") " ) key " _YELLOW_("%c"), + blockno, + sprint_hex(bldata, sizeof(bldata)), + (kt == MF_KEY_A) ? 'A' : 'B' + ); } // end loop key types } // end loop B } // end loop S @@ -1488,7 +1488,7 @@ out: free(ref_dump); free(keyA); free(keyB); - PrintAndLogEx(INFO, "-----+------------------------------------------------------------"); + PrintAndLogEx(INFO, "-----+-------------------------------------------------+----------------"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 3de51f60f..06bd26b66 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -215,6 +215,7 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath if (str_endswith(preferredName, suffix)) { p_namelen -= strlen(suffix); } + // modify filename snprintf(pfn, len, "%.*s%s", (int)p_namelen, preferredName, suffix); @@ -862,7 +863,7 @@ int loadFile_safeEx(const char *preferredName, const char *suffix, void **pdata, *datalen = bytes_read; if (verbose) { - PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from binary file " _YELLOW_("%s"), bytes_read, preferredName); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from binary file `" _YELLOW_("%s") "`", bytes_read, preferredName); } return PM3_SUCCESS; } @@ -936,7 +937,7 @@ int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { } } fclose(f); - PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from text file " _YELLOW_("%s"), counter, preferredName); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from text file `" _YELLOW_("%s") "`", counter, preferredName); uint8_t *newdump = realloc(*pdata, counter); @@ -1023,7 +1024,7 @@ int loadFileMCT_safe(const char *preferredName, void **pdata, size_t *datalen) { } } fclose(f); - PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from MCT file " _YELLOW_("%s"), counter, preferredName); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from MCT file `" _YELLOW_("%s") "`", counter, preferredName); uint8_t *newdump = realloc(*pdata, counter); @@ -1059,7 +1060,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz json_error_t error; json_t *root = json_load_file(path, 0, &error); if (verbose) - PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), path); + PrintAndLogEx(SUCCESS, "loaded from JSON file `" _YELLOW_("%s") "`", path); free(path); @@ -1467,7 +1468,7 @@ int loadFileDICTIONARYEx(const char *preferredName, void *data, size_t maxdatale } fclose(f); if (verbose) - PrintAndLogEx(SUCCESS, "loaded " _GREEN_("%2d") " keys from dictionary file " _YELLOW_("%s"), vkeycnt, path); + PrintAndLogEx(SUCCESS, "loaded " _GREEN_("%2d") " keys from dictionary file `" _YELLOW_("%s") "`", vkeycnt, path); if (datalen) *datalen = counter; From c85258e042dbbc8c8f3ffa982a7363228d929690 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 25 Jul 2023 23:55:38 +0200 Subject: [PATCH 753/924] zerobased index --- client/src/cmdhfmf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 18c022e4b..3ab13aeb0 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -379,7 +379,8 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { if (mfIsSectorTrailer(i) == false) { continue; } - uint8_t sec = MIN(sectors, mfSectorNum(i)); + // zero based index... + uint8_t sec = MIN(sectors - 1, mfSectorNum(i)); e_sector[sec].foundKey[0] = 1; e_sector[sec].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); e_sector[sec].foundKey[1] = 1; From 30162f3d87fa592e9ec09b14eb2d1b598d15e0f0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Jul 2023 01:35:27 +0200 Subject: [PATCH 754/924] remove debug statement --- client/src/wiegand_formatutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/wiegand_formatutils.c b/client/src/wiegand_formatutils.c index e55f999bd..75aa6ae2f 100644 --- a/client/src/wiegand_formatutils.c +++ b/client/src/wiegand_formatutils.c @@ -148,7 +148,7 @@ static uint8_t get_length_from_header(wiegand_message_t *data) { len = 32; } else { - printf("hid preamble detected\n"); + PrintAndLogEx(DEBUG, "hid preamble detected"); len = 32; if ((data->Mid ^ 0x20) == 0) { hfmt = data->Bot; len = 0; } From c3c08e07e4d18d26f474a51ebfcd0adebfe495ec Mon Sep 17 00:00:00 2001 From: nvx Date: Wed, 26 Jul 2023 18:44:26 +1000 Subject: [PATCH 755/924] Fix hf mf gdmsetlbk block data being accidentally prefixed with a 0x00. This fixes a regression caused by edd8e36 (PR #2021). gdm auth has no concept of A or B keys, a partial cleanup in the previous PR removed the key type from the arm code, but the corresponding removal was missed in the client side resulting in mismatched structs for cmd CMD_HF_MIFARE_G4_GDM_WRBL. --- client/src/cmdhfmf.c | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 3ab13aeb0..325e50e7f 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -8160,8 +8160,6 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_int1(NULL, "blk", "", "block number"), - arg_lit0("a", NULL, "input key type is key A (def)"), - arg_lit0("b", NULL, "input key type is key B"), arg_str0("d", "data", "", "bytes to write, 16 hex bytes"), arg_str0("k", "key", "", "key, 6 hex bytes"), arg_lit0(NULL, "force", "override warnings"), @@ -8171,24 +8169,15 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { int b = arg_get_int_def(ctx, 1, 1); - uint8_t keytype = MF_KEY_A; - if (arg_get_lit(ctx, 2) && arg_get_lit(ctx, 3)) { - CLIParserFree(ctx); - PrintAndLogEx(WARNING, "Input key type must be A or B"); - return PM3_EINVARG; - } else if (arg_get_lit(ctx, 3)) { - keytype = MF_KEY_B;; - } - uint8_t block[MFBLOCK_SIZE] = {0x00}; int blen = 0; - CLIGetHexWithReturn(ctx, 4, block, &blen); + CLIGetHexWithReturn(ctx, 2, block, &blen); int keylen = 0; uint8_t key[6] = {0}; - CLIGetHexWithReturn(ctx, 5, key, &keylen); + CLIGetHexWithReturn(ctx, 3, key, &keylen); - bool force = arg_get_lit(ctx, 6); + bool force = arg_get_lit(ctx, 4); CLIParserFree(ctx); if (blen != MFBLOCK_SIZE) { @@ -8212,18 +8201,16 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { return PM3_EINVARG; } - PrintAndLogEx(INFO, "Writing block no %d, key %c - %s", blockno, (keytype == MF_KEY_B) ? 'B' : 'A', sprint_hex_inrow(key, sizeof(key))); + PrintAndLogEx(INFO, "Writing block no %d, key %s", blockno, sprint_hex_inrow(key, sizeof(key))); PrintAndLogEx(INFO, "data: %s", sprint_hex(block, sizeof(block))); struct p { uint8_t blockno; - uint8_t keytype; uint8_t key[6]; uint8_t data[MFBLOCK_SIZE]; // data to be written } PACKED payload; payload.blockno = blockno; - payload.keytype = keytype; memcpy(payload.key, key, sizeof(payload.key)); memcpy(payload.data, block, sizeof(payload.data)); @@ -8242,7 +8229,6 @@ static int CmdHF14AGen4_GDM_SetBlk(const char *Cmd) { return resp.status; } else { PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); - PrintAndLogEx(HINT, "Maybe access rights? Try specify keytype `" _YELLOW_("hf mf gdmsetblk -%c ...") "` instead", (keytype == MF_KEY_A) ? 'b' : 'a'); } return PM3_SUCCESS; } From 9dc6ce552c0052e36eceffa88547e3111885fea2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Jul 2023 11:08:45 +0200 Subject: [PATCH 756/924] I remembered not to add calls to functions inside macro calls... --- client/src/cmdhfmf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 3ab13aeb0..4d1dbbd6c 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -380,7 +380,8 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { continue; } // zero based index... - uint8_t sec = MIN(sectors - 1, mfSectorNum(i)); + uint8_t lookup = mfSectorNum(i); + uint8_t sec = MIN(sectors - 1, lookup); e_sector[sec].foundKey[0] = 1; e_sector[sec].Key[0] = bytes_to_num(d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); e_sector[sec].foundKey[1] = 1; From 00133a04eef14440aadbe7c427bfacd2382b0b5f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Jul 2023 17:41:48 +0200 Subject: [PATCH 757/924] added the hf mfu list --- client/src/cmdhfmfu.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 2f8b206f2..b1e260eee 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -30,9 +30,10 @@ #include "nfc/ndef.h" #include "cliparser.h" #include "cmdmain.h" -#include "amiibo.h" // amiiboo fcts +#include "amiibo.h" // amiiboo fcts #include "base64.h" -#include "fileutils.h" // saveFile +#include "fileutils.h" // saveFile +#include "cmdtrace.h" // trace list #define MAX_UL_BLOCKS 0x0F #define MAX_ULC_BLOCKS 0x2F @@ -4669,6 +4670,10 @@ static int CmdHF14AMfuView(const char *Cmd) { return PM3_SUCCESS; } +static int CmdHF14AMfuList(const char *Cmd) { + return CmdTraceListAlias(Cmd, "hf 14a", "14a"); +} + /* static int CmdHF14AMfUCDecryptAmiibo(const char *Cmd){ @@ -4715,6 +4720,7 @@ static int CmdHF14AMfUCDecryptAmiibo(const char *Cmd){ //------------------------------------ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"list", CmdHF14AMfuList, AlwaysAvailable, "List MIFARE Ultralight / NTAG history"}, {"-----------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("recovery") " -------------------------"}, {"keygen", CmdHF14AMfUGenDiverseKeys, AlwaysAvailable, "Generate 3DES MIFARE diversified keys"}, {"pwdgen", CmdHF14AMfUPwdGen, AlwaysAvailable, "Generate pwd from known algos"}, From fbdf50d7563526954d16423e3a326eebf5075d48 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Jul 2023 17:49:14 +0200 Subject: [PATCH 758/924] minor text stuff --- armsrc/iso14443a.c | 3 ++- client/src/cmdhfmfu.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 1966c8c65..325bebf16 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1110,7 +1110,7 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r sak = 0x09; break; } - case 7: { // NTAG + case 7: { // NTAG 215 rATQA[0] = 0x44; sak = 0x00; // some first pages of UL/NTAG dump is special data @@ -1274,6 +1274,7 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r AddCrc14A(rPPS, sizeof(rPPS) - 2); + // EV1/NTAG, set PWD w AMIIBO algo if all zero. if (tagType == 7) { uint8_t pwd[4]; uint8_t gen_pwd[4]; diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index b1e260eee..5680c33ce 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -3104,7 +3104,7 @@ static int CmdHF14AMfUSim(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_int1("t", "type", "<1..10> ", "Simulation type to use"), + arg_int1("t", "type", "<1..12> ", "Simulation type to use"), arg_str0("u", "uid", "", "<4|7|10> hex bytes UID"), arg_int0("n", "num", "", "Exit simulation after blocks. 0 = infinite"), arg_lit0("v", "verbose", "Verbose output"), From 538ac4b1910b6e0364039bedab870deede262187 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Jul 2023 17:51:35 +0200 Subject: [PATCH 759/924] added a bunch of empty dump files and key files in order to easily simulate a empty tag. Just eload it and sim. --- CHANGELOG.md | 1 + traces/mifare/ntag216-empty.bin | Bin 0 -> 980 bytes traces/mifare/ntag216-empty.eml | 245 ++++++++++++++++++++++++++++++ traces/mifare/ntag216-empty.json | 250 +++++++++++++++++++++++++++++++ traces/mifare/s20-empty-key.bin | 2 + traces/mifare/s20-empty.bin | Bin 0 -> 320 bytes traces/mifare/s20-empty.eml | 20 +++ traces/mifare/s20-empty.json | 93 ++++++++++++ traces/mifare/s50-empty-key.bin | 1 + traces/mifare/s50-empty.bin | Bin 0 -> 1024 bytes 10 files changed, 612 insertions(+) create mode 100644 traces/mifare/ntag216-empty.bin create mode 100644 traces/mifare/ntag216-empty.eml create mode 100644 traces/mifare/ntag216-empty.json create mode 100644 traces/mifare/s20-empty-key.bin create mode 100644 traces/mifare/s20-empty.bin create mode 100644 traces/mifare/s20-empty.eml create mode 100644 traces/mifare/s20-empty.json create mode 100644 traces/mifare/s50-empty-key.bin create mode 100644 traces/mifare/s50-empty.bin diff --git a/CHANGELOG.md b/CHANGELOG.md index 43b0af889..a0f37fcab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added empty dump files with keys for easy simulation (@iceman1001) - Added `hf 15 view` - view ISO15693 dump files (@iceman1001) - Fixed `hf iclass config` - now loops correct in keyroll generation (@iceman1001) - Added `hf iclass sam` - skeleton command (@iceman1001) diff --git a/traces/mifare/ntag216-empty.bin b/traces/mifare/ntag216-empty.bin new file mode 100644 index 0000000000000000000000000000000000000000..5c8f6241853d15dd0f0cce2e902284fbf9bcf9ff GIT binary patch literal 980 zcmZQzVPRrq5N2jzV0b3K@}K(@(u;xzgGM0Iy*qrg3#P9LU7U6&FM1*(C8 xy(|%#doRtgZ20cM!0=EYmw}n#A53nP9u0xf5TIWO>}6qK_|L!!B!B>9Edcm|9p3-| literal 0 HcmV?d00001 diff --git a/traces/mifare/ntag216-empty.eml b/traces/mifare/ntag216-empty.eml new file mode 100644 index 000000000..27ff5ed6a --- /dev/null +++ b/traces/mifare/ntag216-empty.eml @@ -0,0 +1,245 @@ +00040402 +01001303 +000000E6 +1FA9FE47 +9435E4B6 +0280F7A2 +B44293DF +9127471B +3251BC89 +42F0941A +D71A1755 +00000000 +00000000 +000000BD +045869BD +D29C3980 +F7480000 +E1106D00 +0300FE00 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +000000BD +040000FF +00050000 +FFFFFFFF +00000000 \ No newline at end of file diff --git a/traces/mifare/ntag216-empty.json b/traces/mifare/ntag216-empty.json new file mode 100644 index 000000000..5b113c409 --- /dev/null +++ b/traces/mifare/ntag216-empty.json @@ -0,0 +1,250 @@ +{ + "Created": "proxmark3", + "FileType": "mfu", + "Card": { + "UID": "045869D29C3980", + "Version": "0004040201001303", + "TBO_0": "0000", + "TBO_1": "00", + "Signature": "1FA9FE479435E4B60280F7A2B44293DF9127471B3251BC8942F0941AD71A1755", + "Counter0": "000000", + "Tearing0": "00", + "Counter1": "000000", + "Tearing1": "00", + "Counter2": "000000", + "Tearing2": "BD" + }, + "blocks": { + "0": "045869BD", + "1": "D29C3980", + "2": "F7480000", + "3": "E1106D00", + "4": "0300FE00", + "5": "00000000", + "6": "00000000", + "7": "00000000", + "8": "00000000", + "9": "00000000", + "10": "00000000", + "11": "00000000", + "12": "00000000", + "13": "00000000", + "14": "00000000", + "15": "00000000", + "16": "00000000", + "17": "00000000", + "18": "00000000", + "19": "00000000", + "20": "00000000", + "21": "00000000", + "22": "00000000", + "23": "00000000", + "24": "00000000", + "25": "00000000", + "26": "00000000", + "27": "00000000", + "28": "00000000", + "29": "00000000", + "30": "00000000", + "31": "00000000", + "32": "00000000", + "33": "00000000", + "34": "00000000", + "35": "00000000", + "36": "00000000", + "37": "00000000", + "38": "00000000", + "39": "00000000", + "40": "00000000", + "41": "00000000", + "42": "00000000", + "43": "00000000", + "44": "00000000", + "45": "00000000", + "46": "00000000", + "47": "00000000", + "48": "00000000", + "49": "00000000", + "50": "00000000", + "51": "00000000", + "52": "00000000", + "53": "00000000", + "54": "00000000", + "55": "00000000", + "56": "00000000", + "57": "00000000", + "58": "00000000", + "59": "00000000", + "60": "00000000", + "61": "00000000", + "62": "00000000", + "63": "00000000", + "64": "00000000", + "65": "00000000", + "66": "00000000", + "67": "00000000", + "68": "00000000", + "69": "00000000", + "70": "00000000", + "71": "00000000", + "72": "00000000", + "73": "00000000", + "74": "00000000", + "75": "00000000", + "76": "00000000", + "77": "00000000", + "78": "00000000", + "79": "00000000", + "80": "00000000", + "81": "00000000", + "82": "00000000", + "83": "00000000", + "84": "00000000", + "85": "00000000", + "86": "00000000", + "87": "00000000", + "88": "00000000", + "89": "00000000", + "90": "00000000", + "91": "00000000", + "92": "00000000", + "93": "00000000", + "94": "00000000", + "95": "00000000", + "96": "00000000", + "97": "00000000", + "98": "00000000", + "99": "00000000", + "100": "00000000", + "101": "00000000", + "102": "00000000", + "103": "00000000", + "104": "00000000", + "105": "00000000", + "106": "00000000", + "107": "00000000", + "108": "00000000", + "109": "00000000", + "110": "00000000", + "111": "00000000", + "112": "00000000", + "113": "00000000", + "114": "00000000", + "115": "00000000", + "116": "00000000", + "117": "00000000", + "118": "00000000", + "119": "00000000", + "120": "00000000", + "121": "00000000", + "122": "00000000", + "123": "00000000", + "124": "00000000", + "125": "00000000", + "126": "00000000", + "127": "00000000", + "128": "00000000", + "129": "00000000", + "130": "00000000", + "131": "00000000", + "132": "00000000", + "133": "00000000", + "134": "00000000", + "135": "00000000", + "136": "00000000", + "137": "00000000", + "138": "00000000", + "139": "00000000", + "140": "00000000", + "141": "00000000", + "142": "00000000", + "143": "00000000", + "144": "00000000", + "145": "00000000", + "146": "00000000", + "147": "00000000", + "148": "00000000", + "149": "00000000", + "150": "00000000", + "151": "00000000", + "152": "00000000", + "153": "00000000", + "154": "00000000", + "155": "00000000", + "156": "00000000", + "157": "00000000", + "158": "00000000", + "159": "00000000", + "160": "00000000", + "161": "00000000", + "162": "00000000", + "163": "00000000", + "164": "00000000", + "165": "00000000", + "166": "00000000", + "167": "00000000", + "168": "00000000", + "169": "00000000", + "170": "00000000", + "171": "00000000", + "172": "00000000", + "173": "00000000", + "174": "00000000", + "175": "00000000", + "176": "00000000", + "177": "00000000", + "178": "00000000", + "179": "00000000", + "180": "00000000", + "181": "00000000", + "182": "00000000", + "183": "00000000", + "184": "00000000", + "185": "00000000", + "186": "00000000", + "187": "00000000", + "188": "00000000", + "189": "00000000", + "190": "00000000", + "191": "00000000", + "192": "00000000", + "193": "00000000", + "194": "00000000", + "195": "00000000", + "196": "00000000", + "197": "00000000", + "198": "00000000", + "199": "00000000", + "200": "00000000", + "201": "00000000", + "202": "00000000", + "203": "00000000", + "204": "00000000", + "205": "00000000", + "206": "00000000", + "207": "00000000", + "208": "00000000", + "209": "00000000", + "210": "00000000", + "211": "00000000", + "212": "00000000", + "213": "00000000", + "214": "00000000", + "215": "00000000", + "216": "00000000", + "217": "00000000", + "218": "00000000", + "219": "00000000", + "220": "00000000", + "221": "00000000", + "222": "00000000", + "223": "00000000", + "224": "00000000", + "225": "00000000", + "226": "000000BD", + "227": "040000FF", + "228": "00050000", + "229": "FFFFFFFF", + "230": "00000000" + } +} \ No newline at end of file diff --git a/traces/mifare/s20-empty-key.bin b/traces/mifare/s20-empty-key.bin new file mode 100644 index 000000000..91a45f9b9 --- /dev/null +++ b/traces/mifare/s20-empty-key.bin @@ -0,0 +1,2 @@ +\ \  + diff --git a/traces/mifare/s20-empty.bin b/traces/mifare/s20-empty.bin new file mode 100644 index 0000000000000000000000000000000000000000..224614f19140985db0f5ae757512fe4028024cec GIT binary patch literal 320 pcmb0&t$Mk;lZD}g8-oG^1A{ma;|2dAfW09T!oaH-i{x Date: Wed, 26 Jul 2023 23:33:05 +0200 Subject: [PATCH 760/924] color --- armsrc/BigBuf.c | 2 +- traces/mifare/ntag216-empty.bin | Bin 980 -> 0 bytes traces/mifare/ntag216-empty.eml | 245 -------------------------------- traces/mifare/s20-empty.bin | Bin 320 -> 0 bytes traces/mifare/s20-empty.eml | 20 --- 5 files changed, 1 insertion(+), 266 deletions(-) delete mode 100644 traces/mifare/ntag216-empty.bin delete mode 100644 traces/mifare/ntag216-empty.eml delete mode 100644 traces/mifare/s20-empty.bin delete mode 100644 traces/mifare/s20-empty.eml diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index d685f0388..6cd3a29f7 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -312,7 +312,7 @@ uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length) { memcpy(mem + offset, data, length); return 0; } - Dbprintf("Error, trying to set memory outside of bounds! %d > %d", (offset + length), CARD_MEMORY_SIZE); + Dbprintf("Error, trying to set memory outside of bounds! " _RED_("%d") " > %d", (offset + length), CARD_MEMORY_SIZE); return 1; } diff --git a/traces/mifare/ntag216-empty.bin b/traces/mifare/ntag216-empty.bin deleted file mode 100644 index 5c8f6241853d15dd0f0cce2e902284fbf9bcf9ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmZQzVPRrq5N2jzV0b3K@}K(@(u;xzgGM0Iy*qrg3#P9LU7U6&FM1*(C8 xy(|%#doRtgZ20cM!0=EYmw}n#A53nP9u0xf5TIWO>}6qK_|L!!B!B>9Edcm|9p3-| diff --git a/traces/mifare/ntag216-empty.eml b/traces/mifare/ntag216-empty.eml deleted file mode 100644 index 27ff5ed6a..000000000 --- a/traces/mifare/ntag216-empty.eml +++ /dev/null @@ -1,245 +0,0 @@ -00040402 -01001303 -000000E6 -1FA9FE47 -9435E4B6 -0280F7A2 -B44293DF -9127471B -3251BC89 -42F0941A -D71A1755 -00000000 -00000000 -000000BD -045869BD -D29C3980 -F7480000 -E1106D00 -0300FE00 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -000000BD -040000FF -00050000 -FFFFFFFF -00000000 \ No newline at end of file diff --git a/traces/mifare/s20-empty.bin b/traces/mifare/s20-empty.bin deleted file mode 100644 index 224614f19140985db0f5ae757512fe4028024cec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 pcmb0&t$Mk;lZD}g8-oG^1A{ma;|2dAfW09T!oaH-i{x Date: Wed, 26 Jul 2023 23:39:27 +0200 Subject: [PATCH 761/924] improved the eload upload times by using large chunks. Quite much faster now.\nAddapted the dots and text for eload / sim across the client --- armsrc/Standalone/hf_legicsim.c | 6 +- armsrc/Standalone/hf_mfcsim.c | 3 +- armsrc/mifareutil.c | 11 ++-- client/src/cmdhf15.c | 4 +- client/src/cmdhficlass.c | 23 +++++-- client/src/cmdhfjooki.c | 23 ++++--- client/src/cmdhflegic.c | 10 ++- client/src/cmdhfmf.c | 107 +++++++++++++++++++------------- client/src/cmdhfmfu.c | 2 + client/src/cmdlfem4x50.c | 11 +++- 10 files changed, 133 insertions(+), 67 deletions(-) diff --git a/armsrc/Standalone/hf_legicsim.c b/armsrc/Standalone/hf_legicsim.c index 7765672b0..849d2be3b 100644 --- a/armsrc/Standalone/hf_legicsim.c +++ b/armsrc/Standalone/hf_legicsim.c @@ -68,8 +68,10 @@ static bool fill_eml_from_file(char *dumpfile) { } //read and load dump file BigBuf_Clear(); - if (g_dbglevel >= DBG_INFO) - Dbprintf(_YELLOW_("Found dump file %s. Uploading to emulator memory..."), dumpfile); + if (g_dbglevel >= DBG_INFO) { + Dbprintf("Found dump file... `" _YELLOW_("%s") "`", dumpfile); + Dbprintf("Uploading to emulator memory..."); + } uint8_t *emCARD = BigBuf_get_EM_addr(); rdv40_spiffs_read_as_filetype(dumpfile, emCARD, size, RDV40_SPIFFS_SAFETY_SAFE); return true; diff --git a/armsrc/Standalone/hf_mfcsim.c b/armsrc/Standalone/hf_mfcsim.c index 86ff62f6c..bba01d472 100644 --- a/armsrc/Standalone/hf_mfcsim.c +++ b/armsrc/Standalone/hf_mfcsim.c @@ -71,7 +71,8 @@ static bool fill_eml_from_file(char *dumpfile) { //read and load dump file if (g_dbglevel >= DBG_INFO) { - Dbprintf(_YELLOW_("Found dump file %s. Uploading to emulator memory..."), dumpfile); + Dbprintf("Found dump file... `" _YELLOW_("%s") "`", dumpfile); + Dbprintf("Uploading to emulator memory..."); } emlClearMem(); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 25744aa96..c2d6f8246 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -622,12 +622,15 @@ uint8_t FirstBlockOfSector(uint8_t sectorNo) { // work with emulator memory void emlSetMem(uint8_t *data, int blockNum, int blocksCount) { - emlSetMem_xt(data, blockNum, blocksCount, 16); + uint32_t offset = blockNum * 16; + uint32_t len = blocksCount * 16; + emlSet(data, offset, len); } -void emlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int blockBtWidth) { - uint8_t *emCARD = BigBuf_get_EM_addr(); - memcpy(emCARD + blockNum * blockBtWidth, data, blocksCount * blockBtWidth); +void emlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int block_width) { + uint32_t offset = blockNum * block_width; + uint32_t len = blocksCount * block_width; + emlSet(data, offset, len); } void emlGetMem(uint8_t *data, int blockNum, int blocksCount) { diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 0747cedec..a5db7f0e7 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -1133,6 +1133,7 @@ static int CmdHF15ELoad(const char *Cmd) { } free(data); PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", offset); PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`hf 15 sim -h`")); PrintAndLogEx(INFO, "Done!"); @@ -1288,12 +1289,13 @@ static int CmdHF15Sim(const char *Cmd) { CLIParserFree(ctx); PrintAndLogEx(SUCCESS, "Starting simulating UID " _YELLOW_("%s"), iso15693_sprintUID(NULL, payload.uid)); - PrintAndLogEx(INFO, "press " _YELLOW_("`Pm3 button`") " to cancel"); + PrintAndLogEx(INFO, "Press " _YELLOW_("`pm3-button`") " to abort simulation"); PacketResponseNG resp; clearCommandBuffer(); SendCommandNG(CMD_HF_ISO15693_SIMULATE, (uint8_t *)&payload, sizeof(payload)); WaitForResponse(CMD_HF_ISO15693_SIMULATE, &resp); + PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 1a96fbacb..5254c5e03 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -144,25 +144,32 @@ static void iclass_upload_emul(uint8_t *d, uint16_t n, uint16_t *bytes_sent) { *bytes_sent = 0; uint16_t bytes_remaining = n; + PrintAndLogEx(INFO, "Uploading to emulator memory"); + PrintAndLogEx(INFO, "." NOLF); + while (bytes_remaining > 0) { uint32_t bytes_in_packet = MIN(PM3_CMD_DATA_SIZE - 4, bytes_remaining); if (bytes_in_packet == bytes_remaining) { // Disable fast mode on last packet g_conn.block_after_ACK = false; } - clearCommandBuffer(); struct p *payload = calloc(4 + bytes_in_packet, sizeof(uint8_t)); payload->offset = *bytes_sent; payload->len = bytes_in_packet; memcpy(payload->data, d + *bytes_sent, bytes_in_packet); + clearCommandBuffer(); SendCommandNG(CMD_HF_ICLASS_EML_MEMSET, (uint8_t *)payload, 4 + bytes_in_packet); free(payload); bytes_remaining -= bytes_in_packet; *bytes_sent += bytes_in_packet; + + PrintAndLogEx(NORMAL, "." NOLF); + fflush(stdout); } + PrintAndLogEx(NORMAL, ""); } static const char *card_types[] = { @@ -1011,6 +1018,7 @@ static int CmdHFiClassELoad(const char *Cmd) { arg_param_begin, arg_str1("f", "file", "", "filename of dump (bin/eml/json)"), arg_lit0("m", "mem", "use RDV4 spiffs"), + arg_lit0("v", "verbose", "verbose output"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -1026,6 +1034,7 @@ static int CmdHFiClassELoad(const char *Cmd) { } bool use_spiffs = arg_get_lit(ctx, 2); + bool verbose = arg_get_lit(ctx, 3); CLIParserFree(ctx); // use RDV4 spiffs @@ -1073,15 +1082,21 @@ static int CmdHFiClassELoad(const char *Cmd) { } else { dump = newdump; } + + if (verbose) { + print_picopass_header((picopass_hdr_t *) dump); + print_picopass_info((picopass_hdr_t *) dump); + } - print_picopass_header((picopass_hdr_t *) dump); - print_picopass_info((picopass_hdr_t *) dump); + PrintAndLogEx(NORMAL, ""); //Send to device uint16_t bytes_sent = 0; iclass_upload_emul(dump, bytes_read, &bytes_sent); free(dump); - PrintAndLogEx(SUCCESS, "sent %u bytes of data to device emulator memory", bytes_sent); + PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", bytes_sent); + PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`hf iclass sim -h`")); + PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; } diff --git a/client/src/cmdhfjooki.c b/client/src/cmdhfjooki.c index 025fdf5c4..daf8530b0 100644 --- a/client/src/cmdhfjooki.c +++ b/client/src/cmdhfjooki.c @@ -525,29 +525,36 @@ static int CmdHF14AJookiSim(const char *Cmd) { // upload to emulator memory PrintAndLogEx(INFO, "Uploading to emulator memory"); - PrintAndLogEx(INFO, "." NOLF); + // fast push mode g_conn.block_after_ACK = true; uint8_t blockwidth = 4, counter = 0, blockno = 0; + + // 12 is the size of the struct the fct mfEmlSetMem_xt uses to transfer to device + uint16_t max_avail_blocks = ((PM3_CMD_DATA_SIZE - 12) / blockwidth) * blockwidth; + while (datalen) { if (datalen == blockwidth) { // Disable fast mode on last packet g_conn.block_after_ACK = false; } + uint16_t chunk_size = MIN(max_avail_blocks, datalen); + uint16_t blocks_to_send = chunk_size / blockwidth; - if (mfEmlSetMem_xt(data + counter, blockno, 1, blockwidth) != PM3_SUCCESS) { + if (mfEmlSetMem_xt(data + counter, blockno, blocks_to_send, blockwidth) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Cant set emul block: %3d", blockno); free(data); return PM3_ESOFT; } + blockno += blocks_to_send; + counter += chunk_size; + datalen -= chunk_size; PrintAndLogEx(NORMAL, "." NOLF); fflush(stdout); - blockno++; - counter += blockwidth; - datalen -= blockwidth; } - PrintAndLogEx(NORMAL, "\n"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", counter); struct { uint8_t tagtype; @@ -566,6 +573,8 @@ static int CmdHF14AJookiSim(const char *Cmd) { SendCommandNG(CMD_HF_ISO14443A_SIMULATE, (uint8_t *)&payload, sizeof(payload)); PacketResponseNG resp; + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, "Starting simulating"); PrintAndLogEx(INFO, "Press " _GREEN_("") " or pm3-button to abort simulation"); for (;;) { if (kbd_enter_pressed()) { @@ -581,8 +590,8 @@ static int CmdHF14AJookiSim(const char *Cmd) { break; } free(data); - PrintAndLogEx(INFO, "Done"); PrintAndLogEx(HINT, "Try `" _YELLOW_("hf 14a list") "` to view trace log"); + PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; } diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 2398aa8dc..7d9cd8e88 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -805,6 +805,9 @@ void legic_chk_iv(uint32_t *iv) { void legic_seteml(uint8_t *src, uint32_t offset, uint32_t numofbytes) { + PrintAndLogEx(INFO, "Uploading to emulator memory"); + PrintAndLogEx(INFO, "." NOLF); + // fast push mode g_conn.block_after_ACK = true; for (size_t i = offset; i < numofbytes; i += LEGIC_PACKET_SIZE) { @@ -823,7 +826,11 @@ void legic_seteml(uint8_t *src, uint32_t offset, uint32_t numofbytes) { clearCommandBuffer(); SendCommandNG(CMD_HF_LEGIC_ESET, (uint8_t *)payload, sizeof(legic_packet_t) + len); free(payload); + PrintAndLogEx(NORMAL, "." NOLF); + fflush(stdout); } + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", numofbytes); } static int CmdLegicReader(const char *Cmd) { @@ -1100,10 +1107,11 @@ static int CmdLegicELoad(const char *Cmd) { legic_xor(dump, bytes_read); } - PrintAndLogEx(SUCCESS, "Uploading to emulator memory"); legic_seteml(dump, 0, bytes_read); free(dump); + + PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`hf legic sim -h`")); PrintAndLogEx(SUCCESS, "Done!"); return PM3_SUCCESS; } diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 22d7a49fd..a8cc3c3ad 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4264,6 +4264,7 @@ int CmdHF14AMfELoad(const char *Cmd) { arg_lit0(NULL, "ul", "MIFARE Ultralight family"), arg_lit0("m", "mem", "use RDV4 spiffs"), arg_int0("q", "qty", "", "manually set number of blocks (overrides)"), + arg_lit0("v", "verbose", "verbose output"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -4280,7 +4281,7 @@ int CmdHF14AMfELoad(const char *Cmd) { bool use_spiffs = arg_get_lit(ctx, 7); int numblks = arg_get_int_def(ctx, 8, -1); - + bool verbose = arg_get_lit(ctx, 9); CLIParserFree(ctx); // validations @@ -4372,8 +4373,10 @@ int CmdHF14AMfELoad(const char *Cmd) { return res; } - mfu_dump_t *mfu_dump = (mfu_dump_t *)data; - printMFUdumpEx(mfu_dump, mfu_dump->pages + 1, 0); + if (verbose) { + mfu_dump_t *mfu_dump = (mfu_dump_t *)data; + printMFUdumpEx(mfu_dump, mfu_dump->pages + 1, 0); + } // update expected blocks to match converted data. block_cnt = bytes_read / MFU_BLOCK_SIZE; @@ -4389,23 +4392,28 @@ int CmdHF14AMfELoad(const char *Cmd) { size_t offset = 0; int cnt = 0; + // 12 is the size of the struct the fct mfEmlSetMem_xt uses to transfer to device + uint16_t max_avail_blocks = ((PM3_CMD_DATA_SIZE - 12) / block_width) * block_width; + while (bytes_read && cnt < block_cnt) { if (bytes_read == block_width) { // Disable fast mode on last packet g_conn.block_after_ACK = false; } - if (mfEmlSetMem_xt(data + offset, cnt, 1, block_width) != PM3_SUCCESS) { + uint16_t chunk_size = MIN(max_avail_blocks, bytes_read); + uint16_t blocks_to_send = chunk_size / block_width; + + if (mfEmlSetMem_xt(data + offset, cnt, blocks_to_send, block_width) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Can't set emulator mem at block: %3d", cnt); free(data); return PM3_ESOFT; } + cnt += blocks_to_send; + offset += chunk_size; + bytes_read -= chunk_size; PrintAndLogEx(NORMAL, "." NOLF); fflush(stdout); - - cnt++; - offset += block_width; - bytes_read -= block_width; } free(data); PrintAndLogEx(NORMAL, ""); @@ -4424,8 +4432,8 @@ int CmdHF14AMfELoad(const char *Cmd) { PrintAndLogEx(WARNING, "Error, file content, Only loaded %d blocks, must be %d blocks into emulator memory", cnt, block_cnt); return PM3_SUCCESS; } + PrintAndLogEx(INFO, "Done!"); } - PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; } @@ -5327,6 +5335,10 @@ static int CmdHF14AMfCSave(const char *Cmd) { if (mfEmlSetMem(dump + (i * MFBLOCK_SIZE), i, 5) != PM3_SUCCESS) { PrintAndLogEx(WARNING, "Can't set emul block: " _YELLOW_("%d"), i); } + if (i % 64 == 0) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "" NOLF) ; + } PrintAndLogEx(NORMAL, "." NOLF); fflush(stdout); } @@ -7836,14 +7848,6 @@ static int CmdHF14AGen4View(const char *Cmd) { for (uint16_t i = 0; i < block_cnt; i++) { - // 4k READs can be long, so we split status each 64 blocks. - if (i % 64 == 0) { - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "" NOLF) ; - } - PrintAndLogEx(NORMAL, "." NOLF); - fflush(stdout); - uint8_t flags = 0 ; if (i == 0) flags |= MAGIC_INIT ; if (i + 1 == block_cnt) flags |= MAGIC_OFF ; @@ -7855,6 +7859,14 @@ static int CmdHF14AGen4View(const char *Cmd) { free(dump); return PM3_ESOFT; } + + PrintAndLogEx(NORMAL, "." NOLF); + fflush(stdout); + // 4k READs can be long, so we split status each 64 blocks. + if (i % 64 == 0) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "" NOLF) ; + } } PrintAndLogEx(NORMAL, ""); @@ -7939,8 +7951,6 @@ static int CmdHF14AGen4Save(const char *Cmd) { PrintAndLogEx(WARNING, "Please specify a MIFARE Type"); return PM3_EINVARG; } - PrintAndLogEx(SUCCESS, "Dumping magic gen4 GTU MIFARE Classic " _GREEN_("%s") " card memory", s); - PrintAndLogEx(INFO, "." NOLF); // Select card to get UID/UIDLEN information clearCommandBuffer(); @@ -7975,63 +7985,72 @@ static int CmdHF14AGen4Save(const char *Cmd) { return PM3_EMALLOC; } + PrintAndLogEx(SUCCESS, "Dumping magic gen4 GTU MIFARE Classic " _GREEN_("%s") " card memory", s); + PrintAndLogEx(INFO, "." NOLF); + for (uint16_t i = 0; i < block_cnt; i++) { - - // 4k READs can be long, so we split status each 64 blocks. - if (i % 64 == 0) { - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "" NOLF) ; - } - PrintAndLogEx(NORMAL, "." NOLF); - fflush(stdout); - uint8_t flags = 0 ; - if (i == 0) flags |= MAGIC_INIT ; - if (i + 1 == block_cnt) flags |= MAGIC_OFF ; + if (i == 0) { + flags |= MAGIC_INIT; + } + if (i + 1 == block_cnt) { + flags |= MAGIC_OFF; + } int res = mfG4GetBlock(pwd, i, dump + (i * MFBLOCK_SIZE), flags); if (res != PM3_SUCCESS) { + PrintAndLogEx(NORMAL,""); PrintAndLogEx(WARNING, "Can't get magic card block: %u. error=%d", i, res); PrintAndLogEx(HINT, "Verify your card size, and try again or try another tag position"); free(dump); return PM3_ESOFT; } + + + PrintAndLogEx(NORMAL, "." NOLF); + fflush(stdout); + // 4k READs can be long, so we split status each 64 blocks. + if (i % 64 == 0 && i != 0) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "" NOLF) ; + } } PrintAndLogEx(NORMAL, ""); if (fill_emulator) { - PrintAndLogEx(INFO, "uploading to emulator memory" NOLF); + PrintAndLogEx(INFO, "uploading to emulator memory"); + PrintAndLogEx(INFO, "." NOLF); // fast push mode g_conn.block_after_ACK = true; size_t offset = 0; - int cnt = 0; + int cnt = 0; uint16_t bytes_left = bytes ; - while (bytes_left > 0 && cnt < block_cnt) { - // 4k writes can be long, so we split status each 64 blocks. - if (cnt % 64 == 0) { - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "" NOLF) ; - } - PrintAndLogEx(NORMAL, "." NOLF); - fflush(stdout); + // 12 is the size of the struct the fct mfEmlSetMem_xt uses to transfer to device + uint16_t max_avail_blocks = ((PM3_CMD_DATA_SIZE - 12) / MFBLOCK_SIZE) * MFBLOCK_SIZE; + while (bytes_left > 0 && cnt < block_cnt) { if (bytes_left == MFBLOCK_SIZE) { // Disable fast mode on last packet g_conn.block_after_ACK = false; } - if (mfEmlSetMem_xt(dump + offset, cnt, 1, MFBLOCK_SIZE) != PM3_SUCCESS) { + uint16_t chunk_size = MIN(max_avail_blocks, bytes_left); + uint16_t blocks_to_send = chunk_size / MFBLOCK_SIZE; + + if (mfEmlSetMem_xt(dump + offset, cnt, blocks_to_send, MFBLOCK_SIZE) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Can't set emulator mem at block: %3d", cnt); free(dump); return PM3_ESOFT; } - cnt++; - offset += MFBLOCK_SIZE; - bytes_left -= MFBLOCK_SIZE; + cnt += blocks_to_send; + offset += chunk_size; + bytes_left -= chunk_size; + PrintAndLogEx(NORMAL, "." NOLF); + fflush(stdout); } PrintAndLogEx(NORMAL, ""); diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 5680c33ce..7f1722cd4 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -3067,6 +3067,7 @@ static int CmdHF14AMfUeLoad(const char *Cmd) { arg_param_begin, arg_str1("f", "file", "", "Filename of dump"), arg_int0("q", "qty", "", "Number of blocks to load from eml file"), + arg_lit0("v", "verbose", "verbose output"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -3083,6 +3084,7 @@ static int CmdHF14AMfUeLoad(const char *Cmd) { free(nc); PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mfu sim -t 7`") " to simulate an Amiibo."); + PrintAndLogEx(INFO, "Done!"); return res; } diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index 07b1f91b0..647b6d082 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -165,6 +165,8 @@ static int em4x50_load_file(const char *filename, uint8_t *data, size_t data_len static void em4x50_seteml(uint8_t *src, uint32_t offset, uint32_t numofbytes) { + PrintAndLogEx(INFO, "uploading to emulator memory"); + PrintAndLogEx(INFO, "." NOLF); // fast push mode g_conn.block_after_ACK = true; for (size_t i = offset; i < numofbytes; i += PM3_CMD_DATA_SIZE) { @@ -176,7 +178,11 @@ static void em4x50_seteml(uint8_t *src, uint32_t offset, uint32_t numofbytes) { } clearCommandBuffer(); SendCommandOLD(CMD_LF_EM4X50_ESET, i, len, 0, src + i, len); + PrintAndLogEx(NORMAL, "." NOLF); + fflush(stdout); } + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", numofbytes); } int CmdEM4x50ELoad(const char *Cmd) { @@ -208,9 +214,8 @@ int CmdEM4x50ELoad(const char *Cmd) { } // upload to emulator memory - PrintAndLogEx(INFO, "Uploading to emulator memory contents of " _YELLOW_("%s"), filename); em4x50_seteml(data, 0, DUMP_FILESIZE); - + PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`lf em 4x50 sim -h`")); PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; } @@ -1221,7 +1226,7 @@ int CmdEM4x50Sim(const char *Cmd) { } int status = PM3_EFAILED; - PrintAndLogEx(INFO, "Simulating data from emulator memory"); + PrintAndLogEx(INFO, "Starting simulating"); clearCommandBuffer(); SendCommandNG(CMD_LF_EM4X50_SIM, (uint8_t *)&password, sizeof(password)); From fc3a518f2839f4e185dd2bdf00f3b2183b0d2b0b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Jul 2023 23:47:55 +0200 Subject: [PATCH 762/924] There is a race condition when we go from iclass commands to mf command. Especially noticable when eload large files where we used to spam the device with usb packages.\ntry iclass eload, then mf eload, and you see the client hang. With this change we trigger a preload of the fpga image before we start uploading to the device. Current places I could trigger this bug was in eload and gsave. With this patch only the first call takes some time if fpga image must be loaded. The following goes fast.\n\n if you find that the client hangs when going between, this could be the root cause. --- CHANGELOG.md | 3 +++ armsrc/appmain.c | 9 +++++++ client/src/cmdhfmf.c | 9 +++++++ client/src/cmdhw.c | 17 ++++++++++++++ client/src/cmdhw.h | 2 +- client/src/mifare/mifarehost.c | 43 ++++++++++++++++++---------------- include/pm3_cmd.h | 2 ++ 7 files changed, 64 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0f37fcab..ce56eecda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Removed some empty dump files (@iceman1001) + - Added a fct to choose fpga mode (@iceman1001) + - Changed `hf mf eload/gsave` - fast uploading to emulator memory (@iceman1001) - Added empty dump files with keys for easy simulation (@iceman1001) - Added `hf 15 view` - view ISO15693 dump files (@iceman1001) - Fixed `hf iclass config` - now loops correct in keyroll generation (@iceman1001) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 6cdff3eb6..ced039702 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -783,6 +783,15 @@ static void PacketReceived(PacketCommandNG *packet) { g_reply_via_usb = false; break; } + case CMD_SET_FPGAMODE: { + uint8_t mode = packet->data.asBytes[0]; + if (mode >= FPGA_BITSTREAM_LF && mode <= FPGA_BITSTREAM_HF_15) { + FpgaDownloadAndGo(mode); + reply_ng(CMD_SET_FPGAMODE, PM3_SUCCESS, NULL, 0); + } + reply_ng(CMD_SET_FPGAMODE, PM3_EINVARG, NULL, 0); + break; + } // emulator case CMD_SET_DBGMODE: { g_dbglevel = packet->data.asBytes[0]; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index a8cc3c3ad..b32efa2cb 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -36,6 +36,7 @@ #include "crypto/libpcrypto.h" #include "wiegand_formats.h" #include "wiegand_formatutils.h" +#include "cmdhw.h" // set_fpga_mode static int CmdHelp(const char *Cmd); @@ -4350,6 +4351,10 @@ int CmdHF14AMfELoad(const char *Cmd) { return PM3_SUCCESS; } + // ICEMAN: bug. if device has been using ICLASS commands, + // the device needs to load the HF fpga image. It takes 1.5 second. + set_fpga_mode(2); + uint8_t *data = NULL; size_t bytes_read = 0; int res = pm3_load_dump(filename, (void **)&data, &bytes_read, (block_width * block_cnt + hdr_len)); @@ -7919,6 +7924,10 @@ static int CmdHF14AGen4Save(const char *Cmd) { bool fill_emulator = arg_get_lit(ctx, 7); CLIParserFree(ctx); + // ICEMAN: bug. if device has been using ICLASS commands, + // the device needs to load the HF fpga image. It takes 1.5 second. + set_fpga_mode(2); + // validations if (pwd_len != 4 && pwd_len != 0) { PrintAndLogEx(FAILED, "Must specify 4 bytes, got " _YELLOW_("%u"), pwd_len); diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index 57bba66aa..c268344df 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -1083,6 +1083,23 @@ static int CmdBreak(const char *Cmd) { return PM3_SUCCESS; } +int set_fpga_mode(uint8_t mode) { + if (mode < 1 || mode > 4) { + return PM3_EINVARG; + } + uint8_t d[] = {mode}; + clearCommandBuffer(); + SendCommandNG(CMD_SET_FPGAMODE, d, sizeof(d)); + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_SET_FPGAMODE, &resp, 1000) == false) { + PrintAndLogEx(WARNING, "command execution timeout"); + return PM3_ETIMEOUT; + } + if (resp.status != PM3_SUCCESS) { + PrintAndLogEx(ERR, "failed to set FPGA mode"); + } + return resp.status; +} static command_t CommandTable[] = { {"-------------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("Hardware") " -----------------------"}, diff --git a/client/src/cmdhw.h b/client/src/cmdhw.h index 4756a7cb0..a2b4f96e1 100644 --- a/client/src/cmdhw.h +++ b/client/src/cmdhw.h @@ -27,5 +27,5 @@ int CmdHW(const char *Cmd); int handle_tearoff(tearoff_params_t *params, bool verbose); void pm3_version(bool verbose, bool oneliner); void pm3_version_short(void); - +int set_fpga_mode(uint8_t mode); #endif diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index bdf4ec7f1..1576b03e5 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -873,13 +873,13 @@ out: int mfReadSector(uint8_t sectorNo, uint8_t keyType, const uint8_t *key, uint8_t *data) { clearCommandBuffer(); - SendCommandMIX(CMD_HF_MIFARE_READSC, sectorNo, keyType, 0, (uint8_t *)key, 6); + SendCommandMIX(CMD_HF_MIFARE_READSC, sectorNo, keyType, 0, (uint8_t *)key, MIFARE_KEY_SIZE); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { - uint8_t isOK = resp.oldarg[0] & 0xff; + uint8_t isOK = resp.oldarg[0] & 0xFF; if (isOK) { - memcpy(data, resp.data.asBytes, mfNumBlocksPerSector(sectorNo) * 16); + memcpy(data, resp.data.asBytes, mfNumBlocksPerSector(sectorNo) * MFBLOCK_SIZE); return PM3_SUCCESS; } else { return PM3_EUNDEF; @@ -902,7 +902,7 @@ int mfReadBlock(uint8_t blockNo, uint8_t keyType, const uint8_t *key, uint8_t *d SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500)) { - memcpy(data, resp.data.asBytes, 16); + memcpy(data, resp.data.asBytes, MFBLOCK_SIZE); if (resp.status != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "failed reading block"); @@ -918,7 +918,7 @@ int mfReadBlock(uint8_t blockNo, uint8_t keyType, const uint8_t *key, uint8_t *d // EMULATOR int mfEmlGetMem(uint8_t *data, int blockNum, int blocksCount) { - size_t size = blocksCount * 16; + size_t size = blocksCount * MFBLOCK_SIZE; if (size > PM3_CMD_DATA_SIZE) { return PM3_ESOFT; } @@ -982,7 +982,7 @@ int mfEmlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int blockBtWidt int mfCSetUID(uint8_t *uid, uint8_t uidlen, const uint8_t *atqa, const uint8_t *sak, uint8_t *old_uid, uint8_t *verifed_uid, uint8_t wipecard) { uint8_t params = MAGIC_SINGLE; - uint8_t block0[16]; + uint8_t block0[MFBLOCK_SIZE]; memset(block0, 0x00, sizeof(block0)); int res = mfCGetBlock(0, block0, params); @@ -1045,11 +1045,11 @@ int mfCSetUID(uint8_t *uid, uint8_t uidlen, const uint8_t *atqa, const uint8_t * } int mfCWipe(uint8_t *uid, const uint8_t *atqa, const uint8_t *sak) { - uint8_t block0[16] = {0x00, 0x56, 0x78, 0xBB, 0x95, 0x08, 0x04, 0x00, 0x02, 0xB2, 0x1E, 0x24, 0x23, 0x27, 0x1E, 0x1D}; - // uint8_t block0[16] = {0x04, 0x03, 0x02, 0x01, 0x04, 0x08, 0x04, 0x00, 0x64, 0xB9, 0x95, 0x11, 0x4D, 0x20, 0x42, 0x09}; - uint8_t blockD[16] = {0x00}; + uint8_t block0[MFBLOCK_SIZE] = {0x00, 0x56, 0x78, 0xBB, 0x95, 0x08, 0x04, 0x00, 0x02, 0xB2, 0x1E, 0x24, 0x23, 0x27, 0x1E, 0x1D}; + // uint8_t block0[MFBLOCK_SIZE] = {0x04, 0x03, 0x02, 0x01, 0x04, 0x08, 0x04, 0x00, 0x64, 0xB9, 0x95, 0x11, 0x4D, 0x20, 0x42, 0x09}; + uint8_t blockD[MFBLOCK_SIZE] = {0x00}; // default transport ACL - uint8_t blockK[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + uint8_t blockK[MFBLOCK_SIZE] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint8_t params = MAGIC_SINGLE; if (uid != NULL) { @@ -1095,16 +1095,18 @@ int mfCWipe(uint8_t *uid, const uint8_t *atqa, const uint8_t *sak) { } int mfCSetBlock(uint8_t blockNo, uint8_t *data, uint8_t *uid, uint8_t params) { - clearCommandBuffer(); - SendCommandMIX(CMD_HF_MIFARE_CSETBL, params, blockNo, 0, data, 16); + SendCommandMIX(CMD_HF_MIFARE_CSETBL, params, blockNo, 0, data, MFBLOCK_SIZE); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 3500)) { uint8_t isOK = resp.oldarg[0] & 0xff; - if (uid != NULL) + if (uid != NULL) { memcpy(uid, resp.data.asBytes, 4); - if (!isOK) + } + + if (!isOK) { return PM3_EUNDEF; + } } else { PrintAndLogEx(WARNING, "command execute timeout"); return PM3_ETIMEOUT; @@ -1118,9 +1120,10 @@ int mfCGetBlock(uint8_t blockNo, uint8_t *data, uint8_t params) { PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { uint8_t isOK = resp.oldarg[0] & 0xff; - if (!isOK) + if (!isOK) { return PM3_EUNDEF; - memcpy(data, resp.data.asBytes, 16); + } + memcpy(data, resp.data.asBytes, MFBLOCK_SIZE); } else { PrintAndLogEx(WARNING, "command execute timeout"); return PM3_ETIMEOUT; @@ -1145,11 +1148,11 @@ int mfGen3UID(uint8_t *uid, uint8_t uidlen, uint8_t *oldUid) { int mfGen3Block(uint8_t *block, int blockLen, uint8_t *newBlock) { clearCommandBuffer(); - SendCommandMIX(CMD_HF_MIFARE_GEN3BLK, blockLen, 0, 0, block, 16); + SendCommandMIX(CMD_HF_MIFARE_GEN3BLK, blockLen, 0, 0, block, MFBLOCK_SIZE); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_HF_MIFARE_GEN3BLK, &resp, 3500)) { if (resp.status == PM3_SUCCESS && newBlock) { - memcpy(newBlock, resp.data.asBytes, 16); + memcpy(newBlock, resp.data.asBytes, MFBLOCK_SIZE); } return resp.status; } else { @@ -1187,7 +1190,7 @@ int mfG4GetBlock(uint8_t *pwd, uint8_t blockno, uint8_t *data, uint8_t workFlags if (resp.status != PM3_SUCCESS) { return PM3_EUNDEF; } - memcpy(data, resp.data.asBytes, 16); + memcpy(data, resp.data.asBytes, MFBLOCK_SIZE); } else { PrintAndLogEx(WARNING, "command execute timeout"); return PM3_ETIMEOUT; @@ -1199,7 +1202,7 @@ int mfG4SetBlock(uint8_t *pwd, uint8_t blockno, uint8_t *data, uint8_t workFlags struct p { uint8_t blockno; uint8_t pwd[4]; - uint8_t data[16]; + uint8_t data[MFBLOCK_SIZE]; uint8_t workFlags; } PACKED payload; payload.blockno = blockno; diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 13dca3b6c..a96a16c05 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -416,6 +416,8 @@ typedef struct { #define CMD_SPIFFS_WIPE 0x013A +#define CMD_SET_FPGAMODE 0x013F + // This take a +0x2000 as they are high level helper and special functions // As the others, they may have safety level argument if it makes sense #define CMD_SPIFFS_PRINT_TREE 0x2130 From 123ef14667a7df31b58fc87af8dee4e0d68f5b9c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 26 Jul 2023 23:50:12 +0200 Subject: [PATCH 763/924] style --- armsrc/mifarecmd.c | 8 +- client/src/cmdhf15.c | 8 +- client/src/cmdhficlass.c | 4 +- client/src/cmdhfmf.c | 14 +- client/src/cmdhw.c | 2 +- client/src/cmdlfem4x50.c | 2 +- client/src/pm3line_vocabulory.h | 1543 ++++++++++++++++--------------- doc/commands.json | 21 +- doc/commands.md | 23 +- 9 files changed, 819 insertions(+), 806 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index ffe3182ba..196adeaed 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -75,7 +75,7 @@ int16_t mifare_cmd_readblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t read_c iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); clear_trace(); set_tracing(true); - + uint32_t timeout = iso14a_get_timeout(); LED_A_ON(); @@ -97,7 +97,7 @@ int16_t mifare_cmd_readblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t read_c }; // frame waiting time (FWT) in 1/fc - uint32_t fwt = 256 * 16 * (1 << 6); + uint32_t fwt = 256 * 16 * (1 << 6); iso14a_set_timeout(fwt / (8 * 16)); for (uint8_t i = 0; i < count; i++) { @@ -2080,7 +2080,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { // increase time-out. Magic card etc are slow uint32_t timeout = iso14a_get_timeout(); // frame waiting time (FWT) in 1/fc - uint32_t fwt = 256 * 16 * (1 << 7); + uint32_t fwt = 256 * 16 * (1 << 7); iso14a_set_timeout(fwt / (8 * 16)); for (uint8_t s = 0; s < sectorcnt; s++) { @@ -2349,7 +2349,7 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { // increase time-out. Magic card etc are slow uint32_t timeout = iso14a_get_timeout(); // frame waiting time (FWT) in 1/fc - uint32_t fwt = 256 * 16 * (1 << 7); + uint32_t fwt = 256 * 16 * (1 << 7); iso14a_set_timeout(fwt / (8 * 16)); //loop doesn't loop just breaks out if error or done diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index a5db7f0e7..fa25e001c 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -790,17 +790,17 @@ static int NxpSysInfo(uint8_t *uid) { PrintAndLogEx(INFO, "--- " _CYAN_("NXP Sysinfo")); PrintAndLogEx(INFO, " raw... %s", sprint_hex(recv, 8)); PrintAndLogEx(INFO, " " _CYAN_("Password protection configuration:")); - PrintAndLogEx(INFO, " * Page L read%s password protected", ((recv[2] & 0x01) ? "" : _GREEN_(" not"))); + PrintAndLogEx(INFO, " * Page L read%s password protected", ((recv[2] & 0x01) ? "" : _GREEN_(" not"))); PrintAndLogEx(INFO, " * Page L write%s password protected", ((recv[2] & 0x02) ? "" : _GREEN_(" not"))); - PrintAndLogEx(INFO, " * Page H read%s password protected", ((recv[2] & 0x10) ? "" : _GREEN_(" not"))); + PrintAndLogEx(INFO, " * Page H read%s password protected", ((recv[2] & 0x10) ? "" : _GREEN_(" not"))); PrintAndLogEx(INFO, " * Page H write%s password protected", ((recv[2] & 0x20) ? "" : _GREEN_(" not"))); PrintAndLogEx(INFO, " " _CYAN_("Lock bits:")); // AFI lock bit - PrintAndLogEx(INFO, " * AFI%s locked", ((recv[3] & 0x01) ? "" : _GREEN_(" not"))); + PrintAndLogEx(INFO, " * AFI%s locked", ((recv[3] & 0x01) ? "" : _GREEN_(" not"))); // EAS lock bit - PrintAndLogEx(INFO, " * EAS%s locked", ((recv[3] & 0x02) ? "" : _GREEN_(" not"))); + PrintAndLogEx(INFO, " * EAS%s locked", ((recv[3] & 0x02) ? "" : _GREEN_(" not"))); // DSFID lock bit PrintAndLogEx(INFO, " * DSFID%s locked", ((recv[3] & 0x03) ? "" : _GREEN_(" not"))); diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 5254c5e03..4c4f3215d 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1082,7 +1082,7 @@ static int CmdHFiClassELoad(const char *Cmd) { } else { dump = newdump; } - + if (verbose) { print_picopass_header((picopass_hdr_t *) dump); print_picopass_info((picopass_hdr_t *) dump); @@ -1094,7 +1094,7 @@ static int CmdHFiClassELoad(const char *Cmd) { uint16_t bytes_sent = 0; iclass_upload_emul(dump, bytes_read, &bytes_sent); free(dump); - PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", bytes_sent); + PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", bytes_sent); PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`hf iclass sim -h`")); PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index b32efa2cb..11bcdd41f 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1479,10 +1479,10 @@ static int CmdHF14AMfRestore(const char *Cmd) { } PrintAndLogEx(INFO, " %3d | %s| ( " _RED_("fail") " ) key " _YELLOW_("%c"), - blockno, - sprint_hex(bldata, sizeof(bldata)), - (kt == MF_KEY_A) ? 'A' : 'B' - ); + blockno, + sprint_hex(bldata, sizeof(bldata)), + (kt == MF_KEY_A) ? 'A' : 'B' + ); } // end loop key types } // end loop B } // end loop S @@ -4352,7 +4352,7 @@ int CmdHF14AMfELoad(const char *Cmd) { } // ICEMAN: bug. if device has been using ICLASS commands, - // the device needs to load the HF fpga image. It takes 1.5 second. + // the device needs to load the HF fpga image. It takes 1.5 second. set_fpga_mode(2); uint8_t *data = NULL; @@ -7925,7 +7925,7 @@ static int CmdHF14AGen4Save(const char *Cmd) { CLIParserFree(ctx); // ICEMAN: bug. if device has been using ICLASS commands, - // the device needs to load the HF fpga image. It takes 1.5 second. + // the device needs to load the HF fpga image. It takes 1.5 second. set_fpga_mode(2); // validations @@ -8008,7 +8008,7 @@ static int CmdHF14AGen4Save(const char *Cmd) { int res = mfG4GetBlock(pwd, i, dump + (i * MFBLOCK_SIZE), flags); if (res != PM3_SUCCESS) { - PrintAndLogEx(NORMAL,""); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(WARNING, "Can't get magic card block: %u. error=%d", i, res); PrintAndLogEx(HINT, "Verify your card size, and try again or try another tag position"); free(dump); diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index c268344df..aae539c34 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -1096,7 +1096,7 @@ int set_fpga_mode(uint8_t mode) { return PM3_ETIMEOUT; } if (resp.status != PM3_SUCCESS) { - PrintAndLogEx(ERR, "failed to set FPGA mode"); + PrintAndLogEx(ERR, "failed to set FPGA mode"); } return resp.status; } diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index 647b6d082..09aeb8e84 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -215,7 +215,7 @@ int CmdEM4x50ELoad(const char *Cmd) { // upload to emulator memory em4x50_seteml(data, 0, DUMP_FILESIZE); - PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`lf em 4x50 sim -h`")); + PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`lf em 4x50 sim -h`")); PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; } diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 864047dba..509cf5387 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,776 +31,777 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data envelope" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data cthreshold" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data num" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 1, "emv list" }, - { 1, "emv test" }, - { 0, "emv challenge" }, - { 0, "emv exec" }, - { 0, "emv genac" }, - { 0, "emv gpo" }, - { 0, "emv intauth" }, - { 0, "emv pse" }, - { 0, "emv reader" }, - { 0, "emv readrec" }, - { 0, "emv roca" }, - { 0, "emv scan" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 0, "hf iclass sam" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 0, "hf legic einfo" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf gdmcfg" }, - { 0, "hf mf gdmsetcfg" }, - { 0, "hf mf gdmsetblk" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 1, "hf mfp list" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp dump" }, - { 0, "hf mfp info" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp ndefformat" }, - { 0, "hf mfp ndefread" }, - { 0, "hf mfp ndefwrite" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu tamper" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 1, "hf topaz list" }, - { 0, "hf topaz dump" }, - { 0, "hf topaz info" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf vas help" }, - { 0, "hf vas reader" }, - { 1, "hf vas decrypt" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 1, "hw timeout" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 brute" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag read" }, - { 0, "lf hitag wrbl" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag cc" }, - { 0, "lf hitag ta" }, - { 0, "lf hitag eload" }, - { 0, "lf hitag sim" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data envelope" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data cthreshold" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data num" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 1, "emv list" }, + { 1, "emv test" }, + { 0, "emv challenge" }, + { 0, "emv exec" }, + { 0, "emv genac" }, + { 0, "emv gpo" }, + { 0, "emv intauth" }, + { 0, "emv pse" }, + { 0, "emv reader" }, + { 0, "emv readrec" }, + { 0, "emv roca" }, + { 0, "emv scan" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 1, "hf 15 view" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 1, "hf iclass list" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 1, "hf iclass view" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 0, "hf iclass sam" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 0, "hf legic einfo" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf gdmcfg" }, + { 0, "hf mf gdmsetcfg" }, + { 0, "hf mf gdmsetblk" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 1, "hf mfp list" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp dump" }, + { 0, "hf mfp info" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp ndefformat" }, + { 0, "hf mfp ndefread" }, + { 0, "hf mfp ndefwrite" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu tamper" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 1, "hf topaz list" }, + { 0, "hf topaz dump" }, + { 0, "hf topaz info" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf vas help" }, + { 0, "hf vas reader" }, + { 1, "hf vas decrypt" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 1, "hw timeout" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag read" }, + { 0, "lf hitag wrbl" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag cc" }, + { 0, "lf hitag ta" }, + { 0, "lf hitag eload" }, + { 0, "lf hitag sim" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -808,4 +809,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif +#endif \ No newline at end of file diff --git a/doc/commands.json b/doc/commands.json index 4506b7450..d0fe5ad8b 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -1895,6 +1895,19 @@ ], "usage": "hf 15 sniff [-h]" }, + "hf 15 view": { + "command": "hf 15 view", + "description": "Print a ISO-15693 tag dump file (bin/eml/json)", + "notes": [ + "hf 15 view -f hf-iclass-AA162D30F8FF12F1-dump.bin" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-f, --file filename of dump (bin/eml/json)" + ], + "usage": "hf 15 view [-h] -f " + }, "hf 15 wrbl": { "command": "hf 15 wrbl", "description": "Write block on ISO-15693 tag", @@ -4375,13 +4388,11 @@ "options": [ "-h, --help This help", "--blk block number", - "-a input key type is key A (def)", - "-b input key type is key B", "-d, --data bytes to write, 16 hex bytes", "-k, --key key, 6 hex bytes", "--force override warnings" ], - "usage": "hf mf gdmsetblk [-hab] --blk [-d ] [-k ] [--force]" + "usage": "hf mf gdmsetblk [-h] --blk [-d ] [-k ] [--force]" }, "hf mf gdmsetcfg": { "command": "hf mf gdmsetcfg", @@ -11768,8 +11779,8 @@ } }, "metadata": { - "commands_extracted": 682, + "commands_extracted": 683, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-23T09:59:37" + "extracted_on": "2023-07-26T21:49:57" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 99ddf0efb..a26d55d8e 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -236,10 +236,12 @@ Check column "offline" for their availability. |`hf 15 reader `|N |`Act like an ISO-15693 reader` |`hf 15 restore `|N |`Restore from file to all memory pages of an ISO-15693 tag` |`hf 15 samples `|N |`Acquire samples as reader (enables carrier, sends inquiry)` +|`hf 15 view `|Y |`Display content from tag dump file` +|`hf 15 wrbl `|N |`Write a block` +|`hf 15 sim `|N |`Fake an ISO-15693 tag` |`hf 15 eload `|N |`Load image file into emulator to be used by 'sim' command` |`hf 15 esave `|N |`Save emulator memory into image file` |`hf 15 eview `|N |`View emulator memory` -|`hf 15 sim `|N |`Fake an ISO-15693 tag` |`hf 15 slixwritepwd `|N |`Writes a password on a SLIX ISO-15693 tag` |`hf 15 slixeasdisable `|N |`Disable EAS mode on SLIX ISO-15693 tag` |`hf 15 slixeasenable `|N |`Enable EAS mode on SLIX ISO-15693 tag` @@ -247,7 +249,6 @@ Check column "offline" for their availability. |`hf 15 slixprivacyenable`|N |`Enable privacy mode on SLIX ISO-15693 tag` |`hf 15 passprotectafi `|N |`Password protect AFI - Cannot be undone` |`hf 15 passprotecteas `|N |`Password protect EAS - Cannot be undone` -|`hf 15 wrbl `|N |`Write a block` |`hf 15 findafi `|N |`Brute force AFI of an ISO-15693 tag` |`hf 15 writeafi `|N |`Writes the AFI on an ISO-15693 tag` |`hf 15 writedsfid `|N |`Writes the DSFID on an ISO-15693 tag` @@ -404,13 +405,14 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`hf iclass help `|Y |`This help` +|`hf iclass list `|Y |`List iclass history` |`hf iclass dump `|N |`Dump Picopass / iCLASS tag to file` |`hf iclass info `|Y |`Tag information` -|`hf iclass list `|Y |`List iclass history` |`hf iclass rdbl `|N |`Read Picopass / iCLASS block` |`hf iclass reader `|N |`Act like a Picopass / iCLASS reader` |`hf iclass restore `|N |`Restore a dump file onto a Picopass / iCLASS tag` |`hf iclass sniff `|N |`Eavesdrop Picopass / iCLASS communication` +|`hf iclass view `|Y |`Display content from tag dump file` |`hf iclass wrbl `|N |`Write Picopass / iCLASS block` |`hf iclass chk `|N |`Check keys` |`hf iclass loclass `|Y |`Use loclass to perform bruteforce reader attack` @@ -426,7 +428,6 @@ Check column "offline" for their availability. |`hf iclass decrypt `|Y |`Decrypt given block data or tag dump file` |`hf iclass managekeys `|Y |`Manage keys to use with iclass commands` |`hf iclass permutekey `|Y |`Permute function from 'heart of darkness' paper` -|`hf iclass view `|Y |`Display content from tag dump file` |`hf iclass sam `|N |`SAM tests` @@ -878,14 +879,14 @@ Check column "offline" for their availability. |`lf em 4x05 help `|Y |`This help` |`lf em 4x05 brute `|N |`Bruteforce password` |`lf em 4x05 chk `|N |`Check passwords from dictionary` -|`lf em 4x05 demod `|Y |`demodulate a EM4x05/EM4x69 tag from the GraphBuffer` -|`lf em 4x05 dump `|N |`dump EM4x05/EM4x69 tag` -|`lf em 4x05 info `|N |`tag information EM4x05/EM4x69` -|`lf em 4x05 read `|N |`read word data from EM4x05/EM4x69` +|`lf em 4x05 demod `|Y |`Demodulate a EM4x05/EM4x69 tag from the GraphBuffer` +|`lf em 4x05 dump `|N |`Dump EM4x05/EM4x69 tag` +|`lf em 4x05 info `|N |`Tag information` +|`lf em 4x05 read `|N |`Read word data from EM4x05/EM4x69` |`lf em 4x05 sniff `|Y |`Attempt to recover em4x05 commands from sample buffer` -|`lf em 4x05 unlock `|N |`execute tear off against EM4x05/EM4x69` -|`lf em 4x05 wipe `|N |`wipe EM4x05/EM4x69 tag` -|`lf em 4x05 write `|N |`write word data to EM4x05/EM4x69` +|`lf em 4x05 unlock `|N |`Execute tear off against EM4x05/EM4x69` +|`lf em 4x05 wipe `|N |`Wipe EM4x05/EM4x69 tag` +|`lf em 4x05 write `|N |`Write word data to EM4x05/EM4x69` ### lf em 4x50 From e1e41335644bd71d8fc6f0e97e24eeae7ebfc8b9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 01:11:47 +0200 Subject: [PATCH 764/924] coverity string formatter --- client/src/cmdhf15.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index fa25e001c..75b972871 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -1133,7 +1133,7 @@ static int CmdHF15ELoad(const char *Cmd) { } free(data); PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", offset); + PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%zu") " bytes to emulator memory", offset); PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`hf 15 sim -h`")); PrintAndLogEx(INFO, "Done!"); From a57cfdde70236b60ff67d153935f0e3ca96ba53e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 01:12:08 +0200 Subject: [PATCH 765/924] size? --- client/src/fileutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 06bd26b66..8391ebaf7 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -204,7 +204,7 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath char *pfn = fileName; // user preference save paths - int save_path_len = path_size(e_save_path); + size_t save_path_len = path_size(e_save_path); if (save_path_len) { snprintf(pfn, len, "%s%s", g_session.defaultPaths[e_save_path], PATHSEP); pfn += save_path_len + strlen(PATHSEP); From 7f5590d9420b1067b31735a3a8c3e71f82016613 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 01:15:31 +0200 Subject: [PATCH 766/924] checks --- client/src/fileutils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 8391ebaf7..9ac75890f 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -205,8 +205,8 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath // user preference save paths size_t save_path_len = path_size(e_save_path); - if (save_path_len) { - snprintf(pfn, len, "%s%s", g_session.defaultPaths[e_save_path], PATHSEP); + if (save_path_len < FILE_PATH_SIZE ) { + snprintf(pfn, len, "%.*s%s", (int)save_path_len, g_session.defaultPaths[e_save_path], PATHSEP); pfn += save_path_len + strlen(PATHSEP); } From 96944aec698debaea708e103be0acf85cbafc8a5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 12:37:42 +0200 Subject: [PATCH 767/924] reinstate less checks of data_available --- armsrc/legicrfsim.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index f1bc40968..bfa01c301 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -476,14 +476,20 @@ void LegicRfSimulate(uint8_t tagtype, bool send_reply) { Dbprintf("Legic Prime, simulating uid... " _YELLOW_("%02X%02X%02X%02X"), legic_mem[0], legic_mem[1], legic_mem[2], legic_mem[3]); + uint16_t counter = 0; while (BUTTON_PRESS() == false) { WDT_HIT(); - if (data_available()) { - res = PM3_EOPABORTED; - goto OUT; + if (counter >= 1000) { + if (data_available()) { + res = PM3_EOPABORTED; + goto OUT; + } + counter = 0; } + counter++; + // wait for carrier, restart after timeout if (wait_for(RWD_PULSE, GetCountSspClk() + TAG_BIT_PERIOD) == false) { continue; From dc199b62caa4c3db446e610d21b433b6d68de328 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 12:38:40 +0200 Subject: [PATCH 768/924] text --- client/src/cmdhflegic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 7d9cd8e88..488f8dcb2 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -888,7 +888,7 @@ static int CmdLegicDump(const char *Cmd) { uint16_t dumplen = card.cardsize; legic_print_type(dumplen, 0); - PrintAndLogEx(SUCCESS, "Reading tag memory %d b...", dumplen); + PrintAndLogEx(SUCCESS, "Reading tag memory." NOLF); legic_packet_t *payload = calloc(1, sizeof(legic_packet_t)); payload->offset = 0; From 42700d3c51cab0ddff8972b13d90f0fa22fc5b71 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 12:40:04 +0200 Subject: [PATCH 769/924] skip sector 16 at all since it seems to always be locked down even if the keys authenticate. MFC Ev1 related and less errrors in autopwn when running against a MFC Ev1 in the dumping phase --- armsrc/mifarecmd.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 196adeaed..162b8e902 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2084,13 +2084,20 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { iso14a_set_timeout(fwt / (8 * 16)); for (uint8_t s = 0; s < sectorcnt; s++) { - uint64_t ui64Key = emlGetKey(s, keytype); - // MFC 1K EV1 sector 16,17 don't use key A. - if ((sectorcnt == 18) && (keytype == 0) && s > 15) { - continue; + if (sectorcnt == 18) { + // MFC 1K EV1, skip sector 16 since its lockdown + if (s == 16) { + continue; + } + // MFC 1K EV1 sector 17 don't use key A. + if (keytype == 0) { + continue; + } } + uint64_t ui64Key = emlGetKey(s, keytype); + // use fast select if (have_uid == false) { // need a full select cycle to get the uid first iso14a_card_select_t card_info; From 795745ea32461db6defa6f49eb6bf1af76125f75 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 14:20:37 +0200 Subject: [PATCH 770/924] text --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 11bcdd41f..45f33d665 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2552,7 +2552,7 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { if (has_staticnonce == NONCE_NORMAL) { prng_type = detect_classic_prng(); if (prng_type < 0) { - PrintAndLogEx(FAILED, "\nNo tag detected or other tag communication error (%u)", prng_type); + PrintAndLogEx(FAILED, "\nNo tag detected or other tag communication error (%i)", prng_type); free(e_sector); free(fptr); return PM3_ESOFT; From 7440e617e0c6e8c92dc264a3fb5977c9aba389ac Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 16:26:36 +0200 Subject: [PATCH 771/924] add stupid extra checks to see why this code overflows on pentoo... --- client/src/fileutils.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 9ac75890f..a1633844b 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -175,7 +175,7 @@ static char *filenamemcopy(const char *preferredName, const char *suffix) { } static size_t path_size(savePaths_t a) { - if (a == spItemCount) { + if (a >= spItemCount) { return 0; } return strlen(g_session.defaultPaths[a]); @@ -205,9 +205,10 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath // user preference save paths size_t save_path_len = path_size(e_save_path); - if (save_path_len < FILE_PATH_SIZE ) { - snprintf(pfn, len, "%.*s%s", (int)save_path_len, g_session.defaultPaths[e_save_path], PATHSEP); - pfn += save_path_len + strlen(PATHSEP); + if (save_path_len && save_path_len < (FILE_PATH_SIZE - strlen(PATHSEP))) { + snprintf(pfn, len, "%s%s", g_session.defaultPaths[e_save_path], PATHSEP); + pfn += save_path_len; + pfn += strlen(PATHSEP); } // remove file extension if exist in name From d9f2d5287e2929734cfa53a1a19a2bd7022c0708 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 16:46:52 +0200 Subject: [PATCH 772/924] maybe the return codes are wrong in legic sim now --- armsrc/legicrfsim.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index bfa01c301..ac207ebaf 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -91,7 +91,7 @@ static bool wait_for(bool value, const uint32_t timeout) { // - A bit length >80.2us is a 1 // - A bit length <80.2us is a 0 // - A bit length >148.6us is a code violation -static int8_t rx_bit(void) { +static int32_t rx_bit(void) { // backup ts for threshold calculation uint32_t bit_start = last_frame_end; @@ -246,7 +246,7 @@ static int32_t rx_frame(uint8_t *len) { for (*len = 0; true; ++(*len)) { // receive next bit LED_B_ON(); - int8_t bit = rx_bit(); + int32_t bit = rx_bit(); LED_B_OFF(); // check for code violation and to short / long frame From 5faf625032352439652566bfb22660a9e7919070 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 18:02:53 +0200 Subject: [PATCH 773/924] adapt name to match code style --- armsrc/iso14443a.c | 12 +++++++----- armsrc/iso14443a.h | 2 +- client/src/cmdhf14a.c | 32 ++++++++++++++++---------------- client/src/cmdhf14a.h | 4 ++-- client/src/cmdhfvas.c | 6 +++--- include/mifare.h | 6 +++--- 6 files changed, 32 insertions(+), 30 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 325bebf16..cb5f89118 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -144,7 +144,7 @@ static hf14a_config hf14aconfig = { 0, 0, 0, 0, 0 } ; // Polling frames and configurations -static iso14a_polling_parameters WUPA_POLLING_PARAMETERS = { +static iso14a_polling_parameters_t WUPA_POLLING_PARAMETERS = { .frames = { {{ 0x52 }, 1, 7, 0} }, .frame_count = 1, .extra_timeout = 0, @@ -2523,7 +2523,7 @@ static void iso14a_set_ATS_times(const uint8_t *ats) { } -static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters *polling_parameters) { +static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters_t *polling_parameters) { #define WUPA_RETRY_TIMEOUT 10 uint32_t save_iso14a_timeout = iso14a_get_timeout(); @@ -2537,7 +2537,7 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters * uint8_t current_frame = 0; do { - iso14a_polling_frame *frame_parameters = &polling_parameters->frames[current_frame]; + iso14a_polling_frame_t *frame_parameters = &polling_parameters->frames[current_frame]; if (frame_parameters->last_byte_bits == 8) { ReaderTransmit(frame_parameters->frame, frame_parameters->frame_length, NULL); @@ -2579,7 +2579,9 @@ int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32 // if anticollision is false, then the UID must be provided in uid_ptr[] // and num_cascades must be set (1: 4 Byte UID, 2: 7 Byte UID, 3: 10 Byte UID) // requests ATS unless no_rats is true -int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats, iso14a_polling_parameters *polling_parameters) { +int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, + bool anticollision, uint8_t num_cascades, bool no_rats, + iso14a_polling_parameters_t *polling_parameters) { uint8_t resp[MAX_FRAME_SIZE] = {0}; // theoretically. A usual RATS will be much smaller uint8_t resp_par[MAX_PARITY_SIZE] = {0}; @@ -3033,7 +3035,7 @@ void ReaderIso14443a(PacketCommandNG *c) { arg0 = iso14443a_select_cardEx( NULL, card, NULL, true, 0, (param & ISO14A_NO_RATS), - (param & ISO14A_USE_CUSTOM_POLLING) ? (iso14a_polling_parameters *)cmd : &WUPA_POLLING_PARAMETERS + (param & ISO14A_USE_CUSTOM_POLLING) ? (iso14a_polling_parameters_t *)cmd : &WUPA_POLLING_PARAMETERS ); // TODO: Improve by adding a cmd parser pointer and moving it by struct length to allow combining data with polling params FpgaDisableTracing(); diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index 817ee7df4..a6f68067b 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -151,7 +151,7 @@ uint16_t ReaderReceive(uint8_t *receivedAnswer, uint8_t *par); void iso14443a_setup(uint8_t fpga_minor_mode); int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, bool send_chaining, void *data, uint8_t *res); int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats); -int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats, iso14a_polling_parameters *polling_parameters); +int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats, iso14a_polling_parameters_t *polling_parameters); int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades); void iso14a_set_trigger(bool enable); diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index daa9ba8fb..85f7c9588 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -55,27 +55,27 @@ static int CmdHelp(const char *Cmd); static int waitCmd(bool i_select, uint32_t timeout, bool verbose); -static const iso14a_polling_frame WUPA_FRAME = { +static const iso14a_polling_frame_t WUPA_FRAME = { { 0x52 }, 1, 7, 0, }; -static const iso14a_polling_frame MAGWUPA1_FRAME = { +static const iso14a_polling_frame_t MAGWUPA1_FRAME = { { 0x7A }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA2_FRAME = { +static const iso14a_polling_frame_t MAGWUPA2_FRAME = { { 0x7B }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA3_FRAME = { +static const iso14a_polling_frame_t MAGWUPA3_FRAME = { { 0x7C }, 1, 7, 0 }; -static const iso14a_polling_frame MAGWUPA4_FRAME = { +static const iso14a_polling_frame_t MAGWUPA4_FRAME = { { 0x7D }, 1, 7, 0 }; -static const iso14a_polling_frame ECP_FRAME = { +static const iso14a_polling_frame_t ECP_FRAME = { .frame = { 0x6a, 0x02, 0xC8, 0x01, 0x00, 0x03, 0x00, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xD8}, .frame_length = 15, .last_byte_bits = 8, @@ -462,25 +462,25 @@ int Hf14443_4aGetCardData(iso14a_card_select_t *card) { return 0; } -iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe) { +iso14a_polling_parameters_t iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe) { // Extra 100ms give enough time for Apple (ECP) devices to proccess field info and make a decision if (use_ecp && use_magsafe) { - iso14a_polling_parameters full_polling_parameters = { + iso14a_polling_parameters_t full_polling_parameters = { .frames = { WUPA_FRAME, ECP_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, .frame_count = 6, .extra_timeout = 100 }; return full_polling_parameters; } else if (use_ecp) { - iso14a_polling_parameters ecp_polling_parameters = { + iso14a_polling_parameters_t ecp_polling_parameters = { .frames = { WUPA_FRAME, ECP_FRAME }, .frame_count = 2, .extra_timeout = 100 }; return ecp_polling_parameters; } else if (use_magsafe) { - iso14a_polling_parameters magsafe_polling_parameters = { + iso14a_polling_parameters_t magsafe_polling_parameters = { .frames = { WUPA_FRAME, MAGWUPA1_FRAME, MAGWUPA2_FRAME, MAGWUPA3_FRAME, MAGWUPA4_FRAME }, .frame_count = 5, .extra_timeout = 0 @@ -488,7 +488,7 @@ iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_m return magsafe_polling_parameters; } - iso14a_polling_parameters wupa_polling_parameters = { + iso14a_polling_parameters_t wupa_polling_parameters = { .frames = { WUPA_FRAME }, .frame_count = 1, .extra_timeout = 0, @@ -539,8 +539,8 @@ static int CmdHF14AReader(const char *Cmd) { bool use_ecp = arg_get_lit(ctx, 5); bool use_magsafe = arg_get_lit(ctx, 6); - iso14a_polling_parameters *polling_parameters = NULL; - iso14a_polling_parameters parameters = iso14a_get_polling_parameters(use_ecp, use_magsafe); + iso14a_polling_parameters_t *polling_parameters = NULL; + iso14a_polling_parameters_t parameters = iso14a_get_polling_parameters(use_ecp, use_magsafe); if (use_ecp || use_magsafe) { cm |= ISO14A_USE_CUSTOM_POLLING; polling_parameters = ¶meters; @@ -562,7 +562,7 @@ static int CmdHF14AReader(const char *Cmd) { clearCommandBuffer(); if (cm & ISO14A_USE_CUSTOM_POLLING) { - SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, (uint8_t *)polling_parameters, sizeof(iso14a_polling_parameters)); + SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, (uint8_t *)polling_parameters, sizeof(iso14a_polling_parameters_t)); } else { SendCommandMIX(CMD_HF_ISO14443A_READER, cm, 0, 0, NULL, 0); } @@ -967,7 +967,7 @@ int ExchangeRAW14a(uint8_t *datain, int datainlen, bool activateField, bool leav return 0; } -int SelectCard14443A_4_WithParameters(bool disconnect, bool verbose, iso14a_card_select_t *card, iso14a_polling_parameters *polling_parameters) { +int SelectCard14443A_4_WithParameters(bool disconnect, bool verbose, iso14a_card_select_t *card, iso14a_polling_parameters_t *polling_parameters) { // global vars should be prefixed with g_ gs_frame_len = 0; gs_frames_num = 0; @@ -981,7 +981,7 @@ int SelectCard14443A_4_WithParameters(bool disconnect, bool verbose, iso14a_card // Anticollision + SELECT card PacketResponseNG resp; if (polling_parameters != NULL) { - SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT | ISO14A_USE_CUSTOM_POLLING, 0, 0, (uint8_t *)polling_parameters, sizeof(iso14a_polling_parameters)); + SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT | ISO14A_USE_CUSTOM_POLLING, 0, 0, (uint8_t *)polling_parameters, sizeof(iso14a_polling_parameters_t)); } else { SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0, NULL, 0); } diff --git a/client/src/cmdhf14a.h b/client/src/cmdhf14a.h index 8d0c1d8bc..d7304501f 100644 --- a/client/src/cmdhf14a.h +++ b/client/src/cmdhf14a.h @@ -52,9 +52,9 @@ int Hf14443_4aGetCardData(iso14a_card_select_t *card); int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen); int ExchangeRAW14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, bool silentMode); -iso14a_polling_parameters iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe); +iso14a_polling_parameters_t iso14a_get_polling_parameters(bool use_ecp, bool use_magsafe); int SelectCard14443A_4(bool disconnect, bool verbose, iso14a_card_select_t *card); -int SelectCard14443A_4_WithParameters(bool disconnect, bool verbose, iso14a_card_select_t *card, iso14a_polling_parameters *polling_parameters); +int SelectCard14443A_4_WithParameters(bool disconnect, bool verbose, iso14a_card_select_t *card, iso14a_polling_parameters_t *polling_parameters); bool Get_apdu_in_framing(void); void Set_apdu_in_framing(bool v); diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index ac0365cdf..9d04b7477 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -41,14 +41,14 @@ #include "mbedtls/ecc_point_compression.h" #include "mbedtls/gcm.h" -static const iso14a_polling_frame WUPA_FRAME = { +static const iso14a_polling_frame_t WUPA_FRAME = { .frame = { 0x52 }, .frame_length = 1, .last_byte_bits = 7, .extra_delay = 0, }; -static const iso14a_polling_frame ECP_VAS_ONLY_FRAME = { +static const iso14a_polling_frame_t ECP_VAS_ONLY_FRAME = { .frame = {0x6a, 0x01, 0x00, 0x00, 0x02, 0xe4, 0xd2}, .frame_length = 7, .last_byte_bits = 8, @@ -349,7 +349,7 @@ static int DecryptVASCryptogram(uint8_t *pidHash, uint8_t *cryptogram, size_t cr static int VASReader(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t *cryptogram, size_t *cryptogramLen, bool verbose) { clearCommandBuffer(); - iso14a_polling_parameters polling_parameters = { + iso14a_polling_parameters_t polling_parameters = { .frames = { WUPA_FRAME, ECP_VAS_ONLY_FRAME }, .frame_count = 2, .extra_timeout = 250 diff --git a/include/mifare.h b/include/mifare.h index 863734cb5..b59b29c8d 100644 --- a/include/mifare.h +++ b/include/mifare.h @@ -86,15 +86,15 @@ typedef struct { uint8_t frame_length; uint8_t last_byte_bits; uint16_t extra_delay; -} iso14a_polling_frame; +} PACKED iso14a_polling_frame_t; // Defines polling sequence configuration // 6 would be enough for 4 magsafe, 1 wupa, 1 ecp, typedef struct { - iso14a_polling_frame frames[6]; + iso14a_polling_frame_t frames[6]; uint8_t frame_count; uint16_t extra_timeout; -} iso14a_polling_parameters; +} PACKED iso14a_polling_parameters_t; typedef struct { uint8_t *response; From 3b91c1a47f3088c335b01d455122fb82f8219072 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 18:50:19 +0200 Subject: [PATCH 774/924] text --- client/src/cmdhfmf.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 45f33d665..10e305912 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3113,8 +3113,9 @@ all_found: clearCommandBuffer(); SendCommandNG(CMD_HF_MIFARE_EML_MEMCLR, NULL, 0); - PrintAndLogEx(SUCCESS, "transferring keys to simulator memory (Cmd Error: 04 can occur)"); + PrintAndLogEx(INFO, "transferring keys to simulator memory" NOLF); + bool transfer_status = true; for (current_sector_i = 0; current_sector_i < sector_cnt; current_sector_i++) { mfEmlGetMem(block, current_sector_i, 1); if (e_sector[current_sector_i].foundKey[0]) @@ -3122,8 +3123,11 @@ all_found: if (e_sector[current_sector_i].foundKey[1]) num_to_bytes(e_sector[current_sector_i].Key[1], 6, block + 10); - mfEmlSetMem(block, mfFirstBlockOfSector(current_sector_i) + mfNumBlocksPerSector(current_sector_i) - 1, 1); + transfer_status |= mfEmlSetMem(block, mfFirstBlockOfSector(current_sector_i) + mfNumBlocksPerSector(current_sector_i) - 1, 1); } + PrintAndLogEx(NORMAL, "( %s )", (transfer_status) ? _GREEN_("ok") : _RED_("fail")); + + PrintAndLogEx(INFO, "dumping card content to emulator memory (Cmd Error: 04 can occur)"); // use ecfill trick FastDumpWithEcFill(sector_cnt); @@ -3137,8 +3141,8 @@ all_found: return PM3_EMALLOC; } - PrintAndLogEx(INFO, "downloading the card content from emulator memory"); - if (!GetFromDevice(BIG_BUF_EML, dump, bytes, 0, NULL, 0, NULL, 2500, false)) { + PrintAndLogEx(INFO, "downloading card content from emulator memory"); + if (GetFromDevice(BIG_BUF_EML, dump, bytes, 0, NULL, 0, NULL, 2500, false) == false) { PrintAndLogEx(ERR, "Fail, transfer from device time-out"); free(e_sector); free(dump); From 40533497d3c225f2b54df5a7890d397feca034ee Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 18:50:41 +0200 Subject: [PATCH 775/924] text --- client/src/fileutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index a1633844b..9a56b4eba 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -808,7 +808,7 @@ int createMfcKeyDump(const char *preferredName, uint8_t sectorsCnt, sector_t *e_ fflush(f); fclose(f); PrintAndLogEx(SUCCESS, "Found keys have been dumped to " _YELLOW_("%s"), fileName); - PrintAndLogEx(INFO, "FYI! --> " _YELLOW_("0xFFFFFFFFFFFF") " <-- has been inserted for unknown keys where " _YELLOW_("res") " is " _RED_("0")); + PrintAndLogEx(INFO, "--[ " _YELLOW_("FFFFFFFFFFFF") " ]-- has been inserted for unknown keys where " _YELLOW_("res") " is " _RED_("0")); free(fileName); return PM3_SUCCESS; } From 6ba002725f90e5e6a3dadadf07175e018932682f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 18:55:41 +0200 Subject: [PATCH 776/924] rmeoved some fct devices side regarding eml get/ set --- armsrc/BigBuf.c | 13 +++++++--- armsrc/BigBuf.h | 1 + armsrc/Standalone/hf_colin.c | 8 +++--- armsrc/Standalone/hf_mattyrun.c | 6 ++--- armsrc/iso15693.c | 20 +++++---------- armsrc/iso15693.h | 2 -- armsrc/mifarecmd.c | 13 ++-------- armsrc/mifarecmd.h | 1 - armsrc/mifaresim.c | 2 +- armsrc/mifareutil.c | 43 ++++++++++++++------------------- 10 files changed, 45 insertions(+), 64 deletions(-) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 6cd3a29f7..29f270b80 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -308,15 +308,22 @@ bool RAMFUNC LogTraceBits(const uint8_t *btBytes, uint16_t bitLen, uint32_t time // Emulator memory uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length) { uint8_t *mem = BigBuf_get_EM_addr(); - if (offset + length < CARD_MEMORY_SIZE) { + if (offset + length <= CARD_MEMORY_SIZE) { memcpy(mem + offset, data, length); return 0; } Dbprintf("Error, trying to set memory outside of bounds! " _RED_("%d") " > %d", (offset + length), CARD_MEMORY_SIZE); return 1; } - - +uint8_t emlGet(uint8_t *out, uint32_t offset, uint32_t length) { + uint8_t *mem = BigBuf_get_EM_addr(); + if (offset + length <= CARD_MEMORY_SIZE) { + memcpy(out, mem + offset, length); + return 0; + } + Dbprintf("Error, trying to read memory outside of bounds! " _RED_("%d") " > %d", (offset + length), CARD_MEMORY_SIZE); + return 1; +} // get the address of the ToSend buffer. Allocate part of Bigbuf for it, if not yet done tosend_t *get_tosend(void) { diff --git a/armsrc/BigBuf.h b/armsrc/BigBuf.h index b1003a4c1..81c2fbdfc 100644 --- a/armsrc/BigBuf.h +++ b/armsrc/BigBuf.h @@ -56,6 +56,7 @@ bool RAMFUNC LogTraceBits(const uint8_t *btBytes, uint16_t bitLen, uint32_t time bool LogTrace_ISO15693(const uint8_t *bytes, uint16_t len, uint32_t ts_start, uint32_t ts_end, uint8_t *parity, bool reader2tag); uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length); +uint8_t emlGet(uint8_t *out, uint32_t offset, uint32_t length); typedef struct { int max; diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index 91fa971eb..044d3aba3 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -293,7 +293,7 @@ static void ReadLastTagFromFlash(void) { rdv40_spiffs_read_as_filetype((char *)HFCOLIN_LASTTAG_SYMLINK, (uint8_t *)mem, len, RDV40_SPIFFS_SAFETY_SAFE); // copy 64blocks (16bytes) starting w block0, to emulator mem. - emlSetMem(mem, 0, 64); + emlSetMem_xt(mem, 0, 64, 16); DbprintfEx(FLAG_NEWLINE, "[OK] Last tag recovered from FLASHMEM set to emulator"); cjSetCursLeft(); @@ -650,7 +650,7 @@ failtag: for (uint8_t t = 0; t < 2; t++) { memcpy(mblock + t * 10, foundKey[t][sectorNo], 6); } - emlSetMem(mblock, FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 1); + emlSetMem_xt(mblock, FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 1, 16); } cjSetCursLeft(); @@ -827,12 +827,12 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { }; if (isOK) { if (blockNo < NumBlocksPerSector(s) - 1) { - emlSetMem(dataoutbuf, FirstBlockOfSector(s) + blockNo, 1); + emlSetMem_xt(dataoutbuf, FirstBlockOfSector(s) + blockNo, 1, 16); } else { // sector trailer, keep the keys, set only the AC emlGetMem(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1); memcpy(&dataoutbuf2[6], &dataoutbuf[6], 4); - emlSetMem(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1); + emlSetMem_xt(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1, 16); } } } diff --git a/armsrc/Standalone/hf_mattyrun.c b/armsrc/Standalone/hf_mattyrun.c index 9b41f18c4..ed6f93a3b 100644 --- a/armsrc/Standalone/hf_mattyrun.c +++ b/armsrc/Standalone/hf_mattyrun.c @@ -273,12 +273,12 @@ static int saMifareECardLoad(uint32_t numofsectors, uint8_t keytype) { }; if (blockNo < NumBlocksPerSector(s) - 1) { - emlSetMem(dataoutbuf, FirstBlockOfSector(s) + blockNo, 1); + emlSetMem_xt(dataoutbuf, FirstBlockOfSector(s) + blockNo, 1, 16); } else { // sector trailer, keep the keys, set only the AC emlGetMem(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1); memcpy(&dataoutbuf2[6], &dataoutbuf[6], 4); - emlSetMem(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1); + emlSetMem_xt(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1, 16); } } } @@ -505,7 +505,7 @@ void RunMod(void) { memcpy(mblock + t * 10, foundKey[t][sectorNo], 6); } } - emlSetMem(mblock, FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 1); + emlSetMem_xt(mblock, FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 1, 16); } } diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index a52b953ff..e0c3e4436 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -2119,7 +2119,6 @@ void Iso15693InitTag(void) { StartCountSspClk(); } - void EmlClearIso15693(void) { // Resetting the bitstream also frees the BigBuf memory, so we do this here to prevent // an inconvenient reset in the future by Iso15693InitTag @@ -2128,16 +2127,6 @@ void EmlClearIso15693(void) { reply_ng(CMD_HF_ISO15693_EML_CLEAR, PM3_SUCCESS, NULL, 0); } -void EmlSetMemIso15693(uint8_t count, uint8_t *data, uint32_t offset) { - uint8_t *emCARD = BigBuf_get_EM_addr(); - memcpy(emCARD + offset, data, count); -} - -void EmlGetMemIso15693(uint8_t count, uint8_t *output, uint32_t offset) { - uint8_t *emCARD = BigBuf_get_EM_addr(); - memcpy(output, emCARD + offset, count); -} - // Simulate an ISO15693 TAG, perform anti-collision and then print any reader commands // all demodulation performed in arm rather than host. - greg void SimTagIso15693(uint8_t *uid, uint8_t block_size) { @@ -2296,8 +2285,11 @@ void SimTagIso15693(uint8_t *uid, uint8_t block_size) { } // Block data if (block_size * (block_idx + j + 1) <= CARD_MEMORY_SIZE) { - EmlGetMemIso15693(block_size, resp_readblock + (work_offset + security_offset), - block_size * (block_idx + j)); + emlGet( + resp_readblock + (work_offset + security_offset), + block_size * (block_idx + j), + block_size + ); } else { memset(resp_readblock + work_offset + security_offset, 0, block_size); } @@ -2334,7 +2326,7 @@ void SimTagIso15693(uint8_t *uid, uint8_t block_size) { uint8_t *data = cmd + 3 + address_offset + multi_offset; // write data - EmlSetMemIso15693(block_count * block_size, data, block_idx * block_size); + emlSet(data, (block_idx * block_size), (block_count * block_size)); // Build WRITE_(MULTI_)BLOCK response int response_length = 3; diff --git a/armsrc/iso15693.h b/armsrc/iso15693.h index b087edd2e..4644adea9 100644 --- a/armsrc/iso15693.h +++ b/armsrc/iso15693.h @@ -47,8 +47,6 @@ int GetIso15693AnswerFromTag(uint8_t *response, uint16_t max_len, uint16_t timeo void AcquireRawAdcSamplesIso15693(void); void ReaderIso15693(iso15_card_select_t *p_card); // ISO15693 reader void EmlClearIso15693(void); -void EmlSetMemIso15693(uint8_t count, uint8_t *data, uint32_t offset); -void EmlGetMemIso15693(uint8_t count, uint8_t *output, uint32_t offset); void SimTagIso15693(uint8_t *uid, uint8_t block_size); // simulate an ISO15693 tag void BruteforceIso15693Afi(uint32_t speed); // find an AFI of a tag void DirectTag15693Command(uint32_t datalen, uint32_t speed, uint32_t recv, uint8_t *data); // send arbitrary commands from CLI diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 162b8e902..f7f05a3eb 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2019,15 +2019,6 @@ void MifareEMemClr(void) { emlClearMem(); } -void MifareEMemSet(uint8_t blockno, uint8_t blockcnt, uint8_t blockwidth, uint8_t *datain) { - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - - if (blockwidth == 0) - blockwidth = 16; // backwards compat... default bytewidth - - emlSetMem_xt(datain, blockno, blockcnt, blockwidth); // data, block num, blocks count, block byte width -} - void MifareEMemGet(uint8_t blockno, uint8_t blockcnt) { FpgaDownloadAndGo(FPGA_BITSTREAM_HF); @@ -2167,9 +2158,9 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { uint8_t st[16] = {0x00}; emlGetMem(st, tb, 1); memcpy(st + 6, data + 6, 4); - emlSetMem(st, tb, 1); + emlSetMem_xt(st, tb, 1, 16); } else { - emlSetMem(data, tb, 1); + emlSetMem_xt(data, tb, 1, 16); } break; } diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index b7f7d6379..52bc37f35 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -40,7 +40,6 @@ void MifareChkKeys_fast(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *da void MifareChkKeys_file(uint8_t *fn); void MifareEMemClr(void); -void MifareEMemSet(uint8_t blockno, uint8_t blockcnt, uint8_t blockwidth, uint8_t *datain); void MifareEMemGet(uint8_t blockno, uint8_t blockcnt); int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype); int MifareECardLoadExt(uint8_t sectorcnt, uint8_t keytype); diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index 5aa1a054a..a44220209 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -1272,7 +1272,7 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 memcpy(receivedCmd_dec, response, 16); // don't change anything } } - emlSetMem(receivedCmd_dec, cardWRBL, 1); + emlSetMem_xt(receivedCmd_dec, cardWRBL, 1, 16); EmSend4bit(mf_crypto1_encrypt4bit(pcs, CARD_ACK)); // always ACK? FpgaDisableTracing(); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index c2d6f8246..7b3d27ee1 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -617,16 +617,9 @@ uint8_t FirstBlockOfSector(uint8_t sectorNo) { return sectorNo * 4; else return 32 * 4 + (sectorNo - 32) * 16; - } // work with emulator memory -void emlSetMem(uint8_t *data, int blockNum, int blocksCount) { - uint32_t offset = blockNum * 16; - uint32_t len = blocksCount * 16; - emlSet(data, offset, len); -} - void emlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int block_width) { uint32_t offset = blockNum * block_width; uint32_t len = blocksCount * block_width; @@ -634,18 +627,18 @@ void emlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int block_width) } void emlGetMem(uint8_t *data, int blockNum, int blocksCount) { - uint8_t *emCARD = BigBuf_get_EM_addr(); - memcpy(data, emCARD + blockNum * 16, blocksCount * 16); + uint8_t *mem = BigBuf_get_EM_addr(); + memcpy(data, mem + blockNum * 16, blocksCount * 16); } void emlGetMemBt(uint8_t *data, int offset, int byteCount) { - uint8_t *emCARD = BigBuf_get_EM_addr(); - memcpy(data, emCARD + offset, byteCount); + uint8_t *mem = BigBuf_get_EM_addr(); + memcpy(data, mem + offset, byteCount); } int emlCheckValBl(int blockNum) { - uint8_t *emCARD = BigBuf_get_EM_addr(); - uint8_t *data = emCARD + blockNum * 16; + uint8_t *mem = BigBuf_get_EM_addr(); + uint8_t *data = mem + blockNum * 16; if ((data[0] != (data[4] ^ 0xff)) || (data[0] != data[8]) || (data[1] != (data[5] ^ 0xff)) || (data[1] != data[9]) || @@ -659,8 +652,8 @@ int emlCheckValBl(int blockNum) { } int emlGetValBl(uint32_t *blReg, uint8_t *blBlock, int blockNum) { - uint8_t *emCARD = BigBuf_get_EM_addr(); - uint8_t *data = emCARD + blockNum * 16; + uint8_t *mem = BigBuf_get_EM_addr(); + uint8_t *data = mem + blockNum * 16; if (emlCheckValBl(blockNum)) return 1; @@ -671,8 +664,8 @@ int emlGetValBl(uint32_t *blReg, uint8_t *blBlock, int blockNum) { } int emlSetValBl(uint32_t blReg, uint8_t blBlock, int blockNum) { - uint8_t *emCARD = BigBuf_get_EM_addr(); - uint8_t *data = emCARD + blockNum * 16; + uint8_t *mem = BigBuf_get_EM_addr(); + uint8_t *data = mem + blockNum * 16; memcpy(data + 0, &blReg, 4); memcpy(data + 8, &blReg, 4); @@ -683,29 +676,29 @@ int emlSetValBl(uint32_t blReg, uint8_t blBlock, int blockNum) { data[13] = blBlock ^ 0xff; data[14] = blBlock; data[15] = blBlock ^ 0xff; - return 0; } uint64_t emlGetKey(int sectorNum, int keyType) { uint8_t key[6] = {0x00}; - uint8_t *em = BigBuf_get_EM_addr(); - memcpy(key, em + 16 * (FirstBlockOfSector(sectorNum) + NumBlocksPerSector(sectorNum) - 1) + keyType * 10, 6); + uint8_t *mem = BigBuf_get_EM_addr(); + memcpy(key, mem + 16 * (FirstBlockOfSector(sectorNum) + NumBlocksPerSector(sectorNum) - 1) + keyType * 10, 6); return bytes_to_num(key, 6); } void emlClearMem(void) { const uint8_t trailer[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x80, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; const uint8_t uid[] = {0xe6, 0x84, 0x87, 0xf3, 0x16, 0x88, 0x04, 0x00, 0x46, 0x8e, 0x45, 0x55, 0x4d, 0x70, 0x41, 0x04}; - uint8_t *emCARD = BigBuf_get_EM_addr(); - memset(emCARD, 0, CARD_MEMORY_SIZE); + uint8_t *mem = BigBuf_get_EM_addr(); + memset(mem, 0, CARD_MEMORY_SIZE); // fill sectors trailer data - for (uint16_t b = 3; b < MIFARE_4K_MAXBLOCK; ((b < MIFARE_2K_MAXBLOCK - 4) ? (b += 4) : (b += 16))) - emlSetMem((uint8_t *)trailer, b, 1); + for (uint16_t b = 3; b < MIFARE_4K_MAXBLOCK; ((b < MIFARE_2K_MAXBLOCK - 4) ? (b += 4) : (b += 16))) { + emlSetMem_xt((uint8_t *)trailer, b, 1, 16); + } // uid - emlSetMem((uint8_t *)uid, 0, 1); + emlSetMem_xt((uint8_t *)uid, 0, 1, 16); return; } From 8ef1cdbd7508e50b25873f301a1e0fb1517d1f4b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 18:56:11 +0200 Subject: [PATCH 777/924] inceased waiting time.. --- armsrc/mifarecmd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index f7f05a3eb..3f0e6f187 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -97,7 +97,7 @@ int16_t mifare_cmd_readblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t read_c }; // frame waiting time (FWT) in 1/fc - uint32_t fwt = 256 * 16 * (1 << 6); + uint32_t fwt = 256 * 16 * (1 << 7); iso14a_set_timeout(fwt / (8 * 16)); for (uint8_t i = 0; i < count; i++) { @@ -1810,8 +1810,8 @@ OUT: emlSetMem_xt(block, blockno, 1, sizeof(block)); } - MifareECardLoad(sectorcnt, 0); - MifareECardLoad(sectorcnt, 1); + MifareECardLoad(sectorcnt, MF_KEY_A); + MifareECardLoad(sectorcnt, MF_KEY_B); } } else { // partial/none keys found From 64ea48e7d071b7d1c9dca1fb18166b60f0b3b917 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 18:57:11 +0200 Subject: [PATCH 778/924] remove fct in header file.\nreverted this decline --- armsrc/mifareutil.c | 4 ++-- armsrc/mifareutil.h | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 7b3d27ee1..415c01183 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -209,8 +209,8 @@ int mifare_classic_authex_cmd(struct Crypto1State *pcs, uint32_t uid, uint8_t bl uint32_t save_timeout = iso14a_get_timeout(); // set timeout for authentication response - if (save_timeout > 103) - iso14a_set_timeout(103); + if (save_timeout > 106) + iso14a_set_timeout(106); // Receive 4 byte tag answer len = ReaderReceive(receivedAnswer, receivedAnswerPar); diff --git a/armsrc/mifareutil.h b/armsrc/mifareutil.h index 9a179a553..1e45d50be 100644 --- a/armsrc/mifareutil.h +++ b/armsrc/mifareutil.h @@ -113,8 +113,7 @@ uint8_t SectorTrailer(uint8_t blockNo); // emulator functions void emlClearMem(void); -void emlSetMem(uint8_t *data, int blockNum, int blocksCount); -void emlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int blockBtWidth); +void emlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int block_width); void emlGetMem(uint8_t *data, int blockNum, int blocksCount); void emlGetMemBt(uint8_t *data, int offset, int byteCount); uint64_t emlGetKey(int sectorNum, int keyType); From 8bfb91562482be7b061a58f796b9be2cb84a74e9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 19:01:46 +0200 Subject: [PATCH 779/924] adapt the leftovers --- armsrc/appmain.c | 12 ++++++++++-- client/src/mifare/mifarehost.c | 8 ++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index ced039702..79b21c5bf 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -61,6 +61,7 @@ #include "commonutil.h" #include "crc16.h" #include "protocols.h" +#include "mifareutil.h" #ifdef WITH_LCD @@ -1287,7 +1288,7 @@ static void PacketReceived(PacketCommandNG *packet) { uint8_t data[]; } PACKED; struct p *payload = (struct p *) packet->data.asBytes; - EmlSetMemIso15693(payload->count, payload->data, payload->offset); + emlSet(payload->data, payload->offset, payload->count); break; } case CMD_HF_ISO15693_SIMULATE: { @@ -1693,7 +1694,14 @@ static void PacketReceived(PacketCommandNG *packet) { uint8_t data[]; } PACKED; struct p *payload = (struct p *) packet->data.asBytes; - MifareEMemSet(payload->blockno, payload->blockcnt, payload->blockwidth, payload->data); + + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + + // backwards compat... default bytewidth + if (payload->blockwidth == 0) + payload->blockwidth = 16; + + emlSetMem_xt(payload->data, payload->blockno, payload->blockcnt, payload->blockwidth); break; } case CMD_HF_MIFARE_EML_MEMGET: { diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 1576b03e5..a05456bcd 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -947,7 +947,7 @@ int mfEmlGetMem(uint8_t *data, int blockNum, int blocksCount) { } int mfEmlSetMem(uint8_t *data, int blockNum, int blocksCount) { - return mfEmlSetMem_xt(data, blockNum, blocksCount, 16); + return mfEmlSetMem_xt(data, blockNum, blocksCount, MFBLOCK_SIZE); } int mfEmlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int blockBtWidth) { @@ -961,7 +961,7 @@ int mfEmlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int blockBtWidt size_t size = ((size_t) blocksCount) * blockBtWidth; if (size > (PM3_CMD_DATA_SIZE - sizeof(struct p))) { - return PM3_ESOFT; + return PM3_EINVARG; } size_t paylen = sizeof(struct p) + size; @@ -1271,7 +1271,7 @@ int detect_classic_prng(void) { clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443A_READER, flags, sizeof(cmd), 0, cmd, sizeof(cmd)); - if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { + if (WaitForResponseTimeout(CMD_ACK, &resp, 2000) == false) { PrintAndLogEx(WARNING, "PRNG UID: Reply timeout."); return PM3_ETIMEOUT; } @@ -1281,7 +1281,7 @@ int detect_classic_prng(void) { PrintAndLogEx(ERR, "error: selecting tag failed, can't detect prng\n"); return PM3_ERFTRANS; } - if (!WaitForResponseTimeout(CMD_ACK, &respA, 2500)) { + if (WaitForResponseTimeout(CMD_ACK, &respA, 2500) == false) { PrintAndLogEx(WARNING, "PRNG data: Reply timeout."); return PM3_ETIMEOUT; } From 39eecc917e09cd03c10c3063af19067dd0f6f42e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 19:38:51 +0200 Subject: [PATCH 780/924] improved the messages reported when loading json files fails. Usually because we have reserved the wrong size memory --- client/src/cmdhfmf.c | 12 ++++++------ client/src/fileutils.c | 19 ++++++++++++------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 10e305912..92001d760 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4318,13 +4318,17 @@ int CmdHF14AMfELoad(const char *Cmd) { return PM3_EINVARG; } - PrintAndLogEx(INFO, "%d blocks ( %u bytes ) to upload", block_cnt, block_cnt * block_width); + PrintAndLogEx(INFO, "Upload " _YELLOW_("%u") " blocks " _YELLOW_("%u") " bytes", block_cnt, block_cnt * block_width); if (numblks > 0) { block_cnt = MIN(numblks, block_cnt); - PrintAndLogEx(INFO, "overriding number of blocks, will use %d blocks ( %u bytes )", block_cnt, block_cnt * block_width); + PrintAndLogEx(INFO, "overriding number of blocks, will use " _YELLOW_("%u") " blocks " _YELLOW_("%u") " bytes", block_cnt, block_cnt * block_width); } + // ICEMAN: bug. if device has been using ICLASS commands, + // the device needs to load the HF fpga image. It takes 1.5 second. + set_fpga_mode(2); + // use RDV4 spiffs if (use_spiffs && IfPm3Flash() == false) { PrintAndLogEx(WARNING, "Device not compiled to support spiffs"); @@ -4355,10 +4359,6 @@ int CmdHF14AMfELoad(const char *Cmd) { return PM3_SUCCESS; } - // ICEMAN: bug. if device has been using ICLASS commands, - // the device needs to load the HF fpga image. It takes 1.5 second. - set_fpga_mode(2); - uint8_t *data = NULL; size_t bytes_read = 0; int res = pm3_load_dump(filename, (void **)&data, &bytes_read, (block_width * block_cnt + hdr_len)); diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 9a56b4eba..1aa27ca7f 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -2085,6 +2085,9 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl } case EML: { res = loadFileEML_safe(fn, pdump, dumplen); + if (res == PM3_ESOFT) { + PrintAndLogEx(WARNING, "file IO failed"); + } break; } case JSON: { @@ -2094,8 +2097,15 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl return PM3_EMALLOC; } res = loadFileJSON(fn, *pdump, maxdumplen, dumplen, NULL); - if (res != PM3_SUCCESS) { - free(*pdump); + if (res == PM3_SUCCESS) + return res; + + free(*pdump); + + if (res == PM3_ESOFT) { + PrintAndLogEx(WARNING, "JSON objects failed to load"); + } else if (res == PM3_EMALLOC) { + PrintAndLogEx(WARNING, "Wrong size of allocated memory. Check your parameters"); } break; } @@ -2109,11 +2119,6 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl } } - if (res != PM3_SUCCESS) { - PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", fn); - return PM3_EFILE; - } - return res; } From a44e2fbc36e1d6f7f96058c34dbc149e1e6d1a05 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 19:47:11 +0200 Subject: [PATCH 781/924] text --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 92001d760..0eac61eca 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3113,7 +3113,7 @@ all_found: clearCommandBuffer(); SendCommandNG(CMD_HF_MIFARE_EML_MEMCLR, NULL, 0); - PrintAndLogEx(INFO, "transferring keys to simulator memory" NOLF); + PrintAndLogEx(INFO, "transferring keys to simulator memory " NOLF); bool transfer_status = true; for (current_sector_i = 0; current_sector_i < sector_cnt; current_sector_i++) { From 19251645e15e5701fd0af09d7bcf93dee20a9c20 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 20:12:42 +0200 Subject: [PATCH 782/924] shorten LEN variable to match the available space in string --- client/src/fileutils.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 1aa27ca7f..7383c396f 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -194,7 +194,7 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath // 16: room for filenum to ensure new filename // save_path_len + strlen(PATHSEP): the user preference save paths //const size_t len = p_namelen + strlen(suffix) + 1 + 16 + save_path_len + strlen(PATHSEP); - const size_t len = FILE_PATH_SIZE; + size_t len = FILE_PATH_SIZE; char *fileName = (char *) calloc(len, sizeof(uint8_t)); if (fileName == NULL) { @@ -207,8 +207,8 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath size_t save_path_len = path_size(e_save_path); if (save_path_len && save_path_len < (FILE_PATH_SIZE - strlen(PATHSEP))) { snprintf(pfn, len, "%s%s", g_session.defaultPaths[e_save_path], PATHSEP); - pfn += save_path_len; - pfn += strlen(PATHSEP); + pfn += save_path_len + strlen(PATHSEP); + len -= save_path_len + strlen(PATHSEP); } // remove file extension if exist in name @@ -217,11 +217,17 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath p_namelen -= strlen(suffix); } + len -= strlen(suffix) + 1; + len -= p_namelen; + // modify filename snprintf(pfn, len, "%.*s%s", (int)p_namelen, preferredName, suffix); - // check complete path/filename if exists + // "-001" + len -= 4; + int num = 1; + // check complete path/filename if exists while (fileExists(fileName)) { // modify filename snprintf(pfn, len, "%.*s-%03d%s", (int)p_namelen, preferredName, num, suffix); From 58f9ba0abfa742fdfa5695ed6bb65dd62a6b3a91 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 22:23:33 +0200 Subject: [PATCH 783/924] ugly hack to load the signature data if we are on a MFC Ev1 card. First we dont want to trigger the partial read unnecessary and secondly we dont save signature data in our MFC dump file. Need to adapt the JSON format for this --- armsrc/iso14443a.c | 12 +++++++----- armsrc/mifarecmd.c | 20 +++++++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index cb5f89118..07faa5b02 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -2596,7 +2596,7 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint p_card->ats_len = 0; } - if (GetATQA(resp, resp_par, polling_parameters) == false) { + if (GetATQA(resp, resp_par, polling_parameters) == 0) { return 0; } @@ -2621,11 +2621,11 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint memcpy(p_card->uid, resp, 4); // select again? - if (GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS) == false) { + if (GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS) == 0) { return 0; } - if (GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS) == false) { + if (GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS) == 0) { return 0; } @@ -2824,7 +2824,7 @@ int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades) { uint8_t sak = 0x04; // cascade uid int cascade_level = 0; - if (!GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS)) { + if (GetATQA(resp, resp_par, &WUPA_POLLING_PARAMETERS) == 0) { return 0; } @@ -2851,7 +2851,9 @@ int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades) { ReaderTransmit(sel_uid, sizeof(sel_uid), NULL); // Receive the SAK - if (!ReaderReceive(resp, resp_par)) return 0; + if (!ReaderReceive(resp, resp_par)) { + return 0; + } sak = resp[0]; diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 3f0e6f187..32e90d56a 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2071,24 +2071,33 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { // increase time-out. Magic card etc are slow uint32_t timeout = iso14a_get_timeout(); // frame waiting time (FWT) in 1/fc - uint32_t fwt = 256 * 16 * (1 << 7); + uint32_t fwt = 256 * 16 * (1 << 6); iso14a_set_timeout(fwt / (8 * 16)); for (uint8_t s = 0; s < sectorcnt; s++) { + uint64_t ui64Key = emlGetKey(s, keytype); + if (sectorcnt == 18) { // MFC 1K EV1, skip sector 16 since its lockdown if (s == 16) { + // unknown sector trailer, keep the keys, set only the AC + uint8_t st[16] = {0x00}; + emlGetMem(st, FirstBlockOfSector(s) + 3, 1); + memcpy(st + 6, "\x70\xF0\xF8\x69", 4); + emlSetMem_xt(st, FirstBlockOfSector(s) + 3, 1, 16); continue; } + + // ICEMAN: ugly hack, we don't want to trigger the partial load message // MFC 1K EV1 sector 17 don't use key A. - if (keytype == 0) { - continue; + // not mention we don't save signatures in our MFC dump files. + if (s == 17 && keytype == 0) { + ui64Key = 0x4B791BEA7BCC; + keytype = 1; } } - uint64_t ui64Key = emlGetKey(s, keytype); - // use fast select if (have_uid == false) { // need a full select cycle to get the uid first iso14a_card_select_t card_info; @@ -2125,6 +2134,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { continue; } + #define MAX_RETRIES 2 uint8_t data[16] = {0x00}; From 4e6962864adcbe36fa8686581ba4796f7a9a7a95 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 22:53:01 +0200 Subject: [PATCH 784/924] fix loading mifare keys to flash memory, forgot to wipe the new area which we extended to --- armsrc/appmain.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 79b21c5bf..3c471191f 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2516,6 +2516,9 @@ static void PacketReceived(PacketCommandNG *packet) { Flash_WriteEnable(); Flash_Erase4k(3, 0xC); } else if (payload->startidx == DEFAULT_MF_KEYS_OFFSET) { + Flash_CheckBusy(BUSY_TIMEOUT); + Flash_WriteEnable(); + Flash_Erase4k(3, 0x8); Flash_CheckBusy(BUSY_TIMEOUT); Flash_WriteEnable(); Flash_Erase4k(3, 0x9); From 944af6be9501511da5cc1d1b29534006d7d9d1e9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 22:55:58 +0200 Subject: [PATCH 785/924] fixed the missing erasing of flash memory bank. --- CHANGELOG.md | 2 ++ client/src/cmdflashmem.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce56eecda..1c1f4e86c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `mem load -m` - now correctly erase all allocated flash memory (@iceman1001) + - Fixed emulator quick dump to handle MFC Ev1 extra sectors (@iceman100) - Removed some empty dump files (@iceman1001) - Added a fct to choose fpga mode (@iceman1001) - Changed `hf mf eload/gsave` - fast uploading to emulator memory (@iceman1001) diff --git a/client/src/cmdflashmem.c b/client/src/cmdflashmem.c index e8db64885..2cfe3849c 100644 --- a/client/src/cmdflashmem.c +++ b/client/src/cmdflashmem.c @@ -275,7 +275,8 @@ static int CmdFlashMemLoad(const char *Cmd) { } break; } -// not needed when we transite to loadxxxx_safe methods.(iceman) + + // ICEMAN: not needed when we transite to loadxxxx_safe methods uint8_t *newdata = realloc(data, datalen); if (newdata == NULL) { free(data); From d9e867fa28980516863a2952f080f25773e4eb09 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 22:56:41 +0200 Subject: [PATCH 786/924] string formatters --- common_arm/flashmem.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common_arm/flashmem.c b/common_arm/flashmem.c index 94dcf1fd3..f4dde74a0 100644 --- a/common_arm/flashmem.c +++ b/common_arm/flashmem.c @@ -402,7 +402,7 @@ void Flashmem_print_info(void) { if (isok == 2) { num = ((keysum[1] << 8) | keysum[0]); if (num != 0xFFFF && num != 0x0) - Dbprintf(" Mifare.................. "_YELLOW_("%d")" / "_GREEN_("%d")" keys", num, DEFAULT_MF_KEYS_MAX); + Dbprintf(" Mifare.................. "_YELLOW_("%u")" / "_GREEN_("%u")" keys", num, DEFAULT_MF_KEYS_MAX); } Flash_CheckBusy(BUSY_TIMEOUT); @@ -410,7 +410,7 @@ void Flashmem_print_info(void) { if (isok == 2) { num = ((keysum[1] << 8) | keysum[0]); if (num != 0xFFFF && num != 0x0) - Dbprintf(" T55x7................... "_YELLOW_("%d")" / "_GREEN_("%d")" keys", num, DEFAULT_T55XX_KEYS_MAX); + Dbprintf(" T55x7................... "_YELLOW_("%u")" / "_GREEN_("%u")" keys", num, DEFAULT_T55XX_KEYS_MAX); } Flash_CheckBusy(BUSY_TIMEOUT); @@ -418,7 +418,7 @@ void Flashmem_print_info(void) { if (isok == 2) { num = ((keysum[1] << 8) | keysum[0]); if (num != 0xFFFF && num != 0x0) - Dbprintf(" iClass.................. "_YELLOW_("%d")" / "_GREEN_("%d")" keys", num, DEFAULT_ICLASS_KEYS_MAX); + Dbprintf(" iClass.................. "_YELLOW_("%u")" / "_GREEN_("%u")" keys", num, DEFAULT_ICLASS_KEYS_MAX); } FlashStop(); From 97a1f97308fed7231170b0aed864ae2db82c294f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 27 Jul 2023 23:42:06 +0200 Subject: [PATCH 787/924] style --- armsrc/iso14443a.c | 4 +-- client/src/pm3line_vocabulory.h | 1 + doc/commands.json | 44 +++++++++++++++++++++++++-------- doc/commands.md | 1 + 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 07faa5b02..45f61f4ce 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -2580,8 +2580,8 @@ int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32 // and num_cascades must be set (1: 4 Byte UID, 2: 7 Byte UID, 3: 10 Byte UID) // requests ATS unless no_rats is true int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint32_t *cuid_ptr, - bool anticollision, uint8_t num_cascades, bool no_rats, - iso14a_polling_parameters_t *polling_parameters) { + bool anticollision, uint8_t num_cascades, bool no_rats, + iso14a_polling_parameters_t *polling_parameters) { uint8_t resp[MAX_FRAME_SIZE] = {0}; // theoretically. A usual RATS will be much smaller uint8_t resp_par[MAX_PARITY_SIZE] = {0}; diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 509cf5387..4168a0800 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -388,6 +388,7 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mfp ndefread" }, { 0, "hf mfp ndefwrite" }, { 1, "hf mfu help" }, + { 1, "hf mfu list" }, { 1, "hf mfu keygen" }, { 1, "hf mfu pwdgen" }, { 0, "hf mfu otptear" }, diff --git a/doc/commands.json b/doc/commands.json index d0fe5ad8b..c03e4c80a 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3072,9 +3072,10 @@ "options": [ "-h, --help This help", "-f, --file filename of dump (bin/eml/json)", - "-m, --mem use RDV4 spiffs" + "-m, --mem use RDV4 spiffs", + "-v, --verbose verbose output" ], - "usage": "hf iclass eload [-hm] -f " + "usage": "hf iclass eload [-hmv] -f " }, "hf iclass encode": { "command": "hf iclass encode", @@ -4281,9 +4282,10 @@ "--4k MIFARE Classic 4k / S70", "--ul MIFARE Ultralight family", "-m, --mem use RDV4 spiffs", - "-q, --qty manually set number of blocks (overrides)" + "-q, --qty manually set number of blocks (overrides)", + "-v, --verbose verbose output" ], - "usage": "hf mf eload [-hm] -f [--mini] [--1k] [--2k] [--4k] [--ul] [-q ]" + "usage": "hf mf eload [-hmv] -f [--mini] [--1k] [--2k] [--4k] [--ul] [-q ]" }, "hf mf esave": { "command": "hf mf esave", @@ -6424,9 +6426,10 @@ "options": [ "-h, --help This help", "-f, --file Filename of dump", - "-q, --qty Number of blocks to load from eml file" + "-q, --qty Number of blocks to load from eml file", + "-v, --verbose verbose output" ], - "usage": "hf mfu eload [-h] -f [-q ]" + "usage": "hf mfu eload [-hv] -f [-q ]" }, "hf mfu esave": { "command": "hf mfu esave", @@ -6489,6 +6492,27 @@ ], "usage": "hf mfu keygen [-hr] [-u ]" }, + "hf mfu list": { + "command": "hf mfu list", + "description": "Alias of `trace list -t 14a` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "notes": [ + "hf 14a list --frame -> show frame delay times", + "hf 14a list -1 -> use trace buffer" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-1, --buffer use data from trace buffer", + "--frame show frame delay times", + "-c mark CRC bytes", + "-r show relative times (gap and duration)", + "-u display times in microseconds instead of clock cycles", + "-x show hexdump to convert to pcap(ng)", + "or to import into Wireshark using encapsulation type \"ISO 14443\"", + "-f, --file filename of dictionary" + ], + "usage": "hf 14a list [-h1crux] [--frame] [-f ]" + }, "hf mfu ndefread": { "command": "hf mfu ndefread", "description": "Prints NFC Data Exchange Format (NDEF)", @@ -6622,12 +6646,12 @@ "offline": false, "options": [ "-h, --help This help", - "-t, --type <1..10> Simulation type to use", + "-t, --type <1..12> Simulation type to use", "-u, --uid <4|7|10> hex bytes UID", "-n, --num Exit simulation after blocks. 0 = infinite", "-v, --verbose Verbose output" ], - "usage": "hf mfu sim [-hv] -t <1..10> [-u ] [-n ]" + "usage": "hf mfu sim [-hv] -t <1..12> [-u ] [-n ]" }, "hf mfu tamper": { "command": "hf mfu tamper", @@ -11779,8 +11803,8 @@ } }, "metadata": { - "commands_extracted": 683, + "commands_extracted": 684, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-26T21:49:57" + "extracted_on": "2023-07-27T21:41:37" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index a26d55d8e..7a8476a6c 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -567,6 +567,7 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`hf mfu help `|Y |`This help` +|`hf mfu list `|Y |`List MIFARE Ultralight / NTAG history` |`hf mfu keygen `|Y |`Generate 3DES MIFARE diversified keys` |`hf mfu pwdgen `|Y |`Generate pwd from known algos` |`hf mfu otptear `|N |`Tear-off test on OTP bits` From 6df79e3926677d99a76f299312dae50555758376 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 29 Jul 2023 12:44:32 +0200 Subject: [PATCH 788/924] missed to remove exclamation mark --- client/src/cmdhf14a.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 85f7c9588..c7529c56a 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -549,7 +549,7 @@ static int CmdHF14AReader(const char *Cmd) { bool continuous = arg_get_lit(ctx, 7); CLIParserFree(ctx); - if (!disconnectAfter == false) { + if (disconnectAfter == false) { cm |= ISO14A_NO_DISCONNECT; } From 0c9855017725a3a5cd1ae4924e7253b1298a311f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 30 Jul 2023 17:17:08 +0200 Subject: [PATCH 789/924] dont mark crc byte everywhere in the alias list. have to set it for those commands that would benefit from it --- client/src/cmdhf14a.c | 2 +- client/src/cmdhfmf.c | 2 +- client/src/cmdhfmfu.c | 2 +- client/src/cmdtrace.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index c7529c56a..ecd57e181 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -232,7 +232,7 @@ static uint8_t gs_frames_num = 0; static uint16_t atsFSC[] = {16, 24, 32, 40, 48, 64, 96, 128, 256}; static int CmdHF14AList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf 14a", "14a"); + return CmdTraceListAlias(Cmd, "hf 14a", "14a -c"); } int hf14a_getconfig(hf14a_config *config) { diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 0eac61eca..be336bcb3 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6736,7 +6736,7 @@ static int CmdHFMFPersonalize(const char *Cmd) { } static int CmdHF14AMfList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf mf", "mf"); + return CmdTraceListAlias(Cmd, "hf mf", "mf -c"); } static int CmdHf14AGen3UID(const char *Cmd) { diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 7f1722cd4..13b8c9cb4 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -4673,7 +4673,7 @@ static int CmdHF14AMfuView(const char *Cmd) { } static int CmdHF14AMfuList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf 14a", "14a"); + return CmdTraceListAlias(Cmd, "hf 14a", "14a -c"); } diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 7efb8bc35..e71ca4445 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -1176,7 +1176,7 @@ int CmdTraceListAlias(const char *Cmd, const char *alias, const char *protocol) CLIParserFree(ctx); char args[128] = {0}; - snprintf(args, sizeof(args), "-c -t %s ", protocol); + snprintf(args, sizeof(args), "-t %s ", protocol); strncat(args, Cmd, sizeof(args) - strlen(args) - 1); return CmdTraceList(args); } From 708cfca850d4912f9a26ebf244b766f03d681a0c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 30 Jul 2023 20:32:56 +0200 Subject: [PATCH 790/924] add default marking of crc bytes for these protocols --- client/src/cmdhficlass.c | 2 +- client/src/cmdhflto.c | 2 +- client/src/cmdhfmfdes.c | 2 +- client/src/cmdhfmfp.c | 2 +- client/src/cmdhftopaz.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 4c4f3215d..131944f6e 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -645,7 +645,7 @@ void print_picopass_header(const picopass_hdr_t *hdr) { } static int CmdHFiClassList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf iclass", "iclass"); + return CmdTraceListAlias(Cmd, "hf iclass", "iclass -c"); } static int CmdHFiClassSniff(const char *Cmd) { diff --git a/client/src/cmdhflto.c b/client/src/cmdhflto.c index b5a8d1206..d11f0c6d1 100644 --- a/client/src/cmdhflto.c +++ b/client/src/cmdhflto.c @@ -526,7 +526,7 @@ int infoLTO(bool verbose) { } static int CmdHfLTOList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf lto", "lto"); + return CmdTraceListAlias(Cmd, "hf lto", "lto -c"); } int rdblLTO(uint8_t st_blk, uint8_t end_blk, bool verbose) { diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index b2cd1f7a5..03dcea842 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1411,7 +1411,7 @@ static int CmdHF14aDesChk(const char *Cmd) { } static int CmdHF14ADesList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf mfdes", "des"); + return CmdTraceListAlias(Cmd, "hf mfdes", "des -c"); } static int DesfireAuthCheck(DesfireContext_t *dctx, DesfireISOSelectWay way, uint32_t appID, DesfireSecureChannel secureChannel, uint8_t *key) { diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 01f529b99..c0078819b 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1810,7 +1810,7 @@ static int CmdHFMFPNDEFWrite(const char *Cmd) { } static int CmdHFMFPList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf mfp", "mfp"); + return CmdTraceListAlias(Cmd, "hf mfp", "mfp -c"); } static command_t CommandTable[] = { diff --git a/client/src/cmdhftopaz.c b/client/src/cmdhftopaz.c index 4483e3154..649882416 100644 --- a/client/src/cmdhftopaz.c +++ b/client/src/cmdhftopaz.c @@ -812,7 +812,7 @@ static int CmdHFTopazRaw(const char *Cmd) { } static int CmdHFTopazList(const char *Cmd) { - return CmdTraceListAlias(Cmd, "hf topaz", "topaz"); + return CmdTraceListAlias(Cmd, "hf topaz", "topaz -c"); } static int CmdHFTopazSniff(const char *Cmd) { From 9943235e3128209eb62e8a32f9b3f7cca446fa33 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 30 Jul 2023 21:20:32 +0200 Subject: [PATCH 791/924] updated atr table --- client/src/atrs.h | 488 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 425 insertions(+), 63 deletions(-) diff --git a/client/src/atrs.h b/client/src/atrs.h index 87171c523..18c1880c6 100644 --- a/client/src/atrs.h +++ b/client/src/atrs.h @@ -43,6 +43,7 @@ const static atr_t AtrTable[] = { { "3B003B28003441454130323030", "Cryptoguard card used for pay tv Plustelka (DVB-T2 - Slovak) (Pay TV)\nhttps://www.plustelka.sk/" }, { "3B021050", "Visa (Bank)" }, { "3B02141C", "UAE (United Arab Emirates) (eID)" }, + { "3B021435", "cartao cidadao (eID)" }, { "3B021450", "Schlumberger Multiflex 3k" }, { "3B02145011", "Maste visa card (Bank)" }, { "3B021451", "8A (Bank)" }, @@ -54,7 +55,7 @@ const static atr_t AtrTable[] = { { "3B026F33", "Polish national PKI equivalent to national id card issued by Eurocert - 1 of 2 Polish authorized issuers (PKI)\nhttps://eurocert.pl/index.php/en-us/" }, { "3B0400000000", "Laundromat payment card\nSpanish ID ('DNIe: Documento Nacional de Identidad electronico).\nhttp://www.dnie.es/" }, { "3B0400000073", "ASE M2 Card (I2C) (Other)" }, - { "3B0400040000", "Italian healtcare card (TS) National Service Card (CNS) - Regione Lazio - (HealthCare)\nhttp://cns.regione.lazio.it" }, + { "3B0400040000", "Italian healthcare card (TS) National Service Card (CNS) - Regione Lazio - (HealthCare)\nhttp://cns.regione.lazio.it" }, { "3B0401020304", "SLE4442 - memory card (256) with write protection PIN. (Other)" }, { "3B0405D486C8", "Telstra (Telecom Australia) Pay Phone Phonecard (Telecommunication)\nhttps://www.telstra.com.au/home-phone/calling-cards" }, { "3B04073C8592", "OLD Spanish Prepaid phone cards (pesetas) provided by Telefonica" }, @@ -70,15 +71,18 @@ const static atr_t AtrTable[] = { { "3B0417D43000", "Gemalto BONZA game smart-card. (Other)" }, { "3B0417D46608", "Prepaid public telephone card from Antel, Uruguay. (Telecommunication)" }, { "3B0417D4C882", "prepaid payphone card, issued by Lietuvos Telekomas (now Teo LT)\nhttps://www.teo.lt/" }, + { "3B04190CF600", "USWest TeleCard for Millennium Payphones (Other)" }, { "3B041BF43F54", "German TelefonKarte 50DM. Memory card with Solaic chip (Other)" }, { "3B042AFF3200", "Mac Gray Intelligent Laundry Systems laundry card" }, + { "3B0437E409EC", "prepaid payphone card, issued by Deutsche Telekom 'Telefonkarte Comfort als klassische Karte' (Other)\nhttps://tkc.telekom-dienste.de/" }, { "3B0441117781", "Sample Mifare DESFire contactless smartcard from Phillips" }, { "3B04411177B1", "IBM JCOP 30 contactless" }, { "3B044932432E", "German Health Insurance Card\n'LogCard' from concept2.com (a indoor rower manufacturer)\nI2C card" }, - { "3B0450D7F30E", "Ukranian memory card for public phones. Manufacturer: 'Kvazar' (Other)" }, + { "3B0450D7F30E", "Ukrainian memory card for public phones. Manufacturer: 'Kvazar' (Other)" }, { "3B046089", "Smartcard 3.1 (JavaCard)" }, { "3B04696C2065", "ASE M2 Card 2Kbit (Other)" }, { "3B047F010000", "Russian memory card for payphones. Manufacturer: 'Exiton' (Other)" }, + { "3B0482231091", "VISA DEBIT (Bank)" }, { "3B0492231091", "Siemens SLE 4432/42 card" }, { "3B04989400C4", "Windsor and Maidenhead Advantage Card\nhttp://www.rbwm.gov.uk/web/advantage_index.htm" }, { "3B0499FFFF90", "Madrid prepaid parkimeters parking card" }, @@ -103,6 +107,7 @@ const static atr_t AtrTable[] = { { "3B06010022018227", "HID ProxCard II (Other)" }, { "3B06010100001073", "HID Prox 26-bit (eID)" }, { "3B06010102000001", "HID0009P (eID)" }, + { "3B06010118038209", "HID ProxKey III (125kHz) (eID)\nhttps://www.hidglobal.com/products/cards-and-credentials/hid-proximity/1346" }, { "3B06010210......", "ISOProx II Card:\nhttp://www.hidglobal.com/documents/isoprox_ds_en.pdf" }, { "3B0602..........", "HID Prox H10302 Format\n37 bit (CN)\nhttps://www.hidglobal.com/sites/default/files/omnikey_contactless_developer_guide.pdf" }, { "3B0604..........", "HID Prox H10304 Format\n37 bit (FAC+CN)\nhttps://www.hidglobal.com/sites/default/files/omnikey_contactless_developer_guide.pdf" }, @@ -136,6 +141,7 @@ const static atr_t AtrTable[] = { { "3B12953608", "EMTG56 0.8 (sub-version 0.1)" }, { "3B12953609", "EMTG56 0.9 (sub-version 0.1)" }, { "3B1396130917", "Teacher Card (Other)" }, + { "3B1411CA4DDEAD", "Tricolor (Telecommunication)" }, { "3B151112CA0700DB", "Tricolor TV center card (Pay TV)" }, { "3B151112CA0711CA", "DRE Crypt (Pay TV)" }, { "3B151112CA0714CF", "PlatformaHD (Russia) DRE Crypt 4AE1:14" }, @@ -165,12 +171,14 @@ const static atr_t AtrTable[] = { { "3B16959B0007011803", "Thai GSM UICC (Telecommunication)" }, { "3B1695D00045F70100", "Telefonica O2 Czech Republic, a.s. - O2 sim card - 173285 / SIM64ND.GO0\nhttp://www.o2.cz" }, { "3B1695D0016CFD0D00", "Virgin Mobile SIM card (SIM)" }, + { "3B1695D0017B010E00", "Vivo Brasil - SIM Card (Telecommunication)" }, { "3B1695D0017BDA0D00", "Verizon GSM SIM (Telecommunication)" }, { "3B1696417374726964", "Gemalto IDPrime v2+ .NET" }, { "3B1696770006010403", "AIS One-2-Call GSM UICC (Telecommunication)\nhttp://www.ais.co.th" }, { "3B1696BA000E010603", "Vinaphone Vietnam SIM" }, { "3B1696BA000E020A03", "Vietel (Telecommunication)" }, { "3B1696D000D4072C00", "Vodafone India Postpaid / Local Operator 3G" }, + { "3B1696D0016CA70D00", "Ukrainian Telecommunications Operator MTS (old simcard, now rebranded to Vodafone UA) (Telecommunication)\nhttps://www.vodafone.ua" }, { "3B17118065AF034200D8", "TELE2 SPB SIM Russia" }, { "3B17139C120201010740", "Schlumberger Cyberflex Access Developer 32k" }, { "3B179418010101014193", "T-Mobile SIM card" }, @@ -196,6 +204,7 @@ const static atr_t AtrTable[] = { { "3B1894451543DA0100FF02", "Airtel Tanzania Prepaid SIM Card (Telecommunication)" }, { "3B1894530D06772407FF02", "GSM SIM Tele2 Estonia, prepaid (Telecommunication)" }, { "3B1894532007AD0A05FF02", "GSM SIM Beeline Kazakhstan (Telecommunication)\nhttp://beeline.kz/" }, + { "3B18962621550401030001", "OBILedit Forensic SIM Cloning card (Telecommunication)\nhttps://www.mobiledit.com/connection-kit" }, { "3B19145590010101000508B0", "Schlumberger Multiflex 8k" }, { "3B19145590010201000504B0", "Schlumberger Multiflex 4k" }, { "3B19145901010F01000508B0", "Schlumberger Multiflex 8k" }, @@ -203,6 +212,7 @@ const static atr_t AtrTable[] = { { "3B19943303013145410602B6", "BASE Twin simcard (Telecommunication)" }, { "3B1994806794080125010101", "Mobiphone (Telecommunication)" }, { "3B1996806793270102020401", "Orange SIM card (Telecommunication)" }, + { "3B1996806794090101040104", "Morpho EIRENE GSM-R Card (Telecommunication)" }, { "3B1996806794160203010101", "Movistar Argentina Usim Card (Telecommunication)\nwww.movistar.com.ar" }, { "3B1996806798040101010101", "PLUS gsm (Telecommunication)" }, { "3B1A9692015493320103022501", "BEELINE (Telecommunication)" }, @@ -216,6 +226,7 @@ const static atr_t AtrTable[] = { { "3B1D9600230700000000000000009000", "emulator card prototype from ST" }, { "3B1D97434C5F53414D00143800009000", "CLSAM (Transport)\nhttp://www.planeta.inf.br" }, { "3B1E130069454D4345663228F86B009000", "ECHS (Ex-servicemen Contributory Health Scheme) Card (HealthCare)\nhttp://echs.gov.in/" }, + { "3B1E95806721544D4D04120E7132829F00", "SIM card of old Ukrainian Telecommunications Operator Ace&Base (deriving from Kyivstar) (Telecommunication)\nhttps://kyivstar.ua/uk/mm" }, { "3B1F110067424146495345535266FF819000", "Finnish student id card" }, { "3B1F110067804246495345105266FF819000", "Nokia branded SC (Setec)" }, { "3B1F11006A013846495345108C02FF079000", "GSM-SIM Saunalahti (from 2004)\nFinnish cell phone operator 'Sonera' SIM card (from 2002)" }, @@ -240,7 +251,7 @@ const static atr_t AtrTable[] = { { "3B23003513FF", "Schlumberger MicroPayflex" }, { "3B2300354180", "PayflexHID (idenfitied by Sun Ray Services)" }, { "3B2400......45", "Conax" }, - { "3B240000000000", "MultiChoice satelite TV Card Eutelsat 36B at 35.9degE\nhttp://www.lyngsat.com/Eutelsat-36B.html" }, + { "3B240000000000", "MultiChoice satellite TV Card Eutelsat 36B at 35.9degE\nhttp://www.lyngsat.com/Eutelsat-36B.html" }, { "3B240000E29267", "Health care (HealthCare)" }, { "3B240030423030", "ComHem Digital-TV smartcard (Sweden)\nTNK Telewizja Na Karte (Poland) - Conditional access system : Conax (Norway)\nhttp://telewizjanakarte.pl/" }, { "3B240080729443", "MPCOS-3DES 64K \\ EMV Filter (Gemplus)" }, @@ -258,6 +269,7 @@ const static atr_t AtrTable[] = { { "3B2600311A45039000", "Tajeta Sanitaria Individual (Spanish Insurance Card)\nfrom the 'Junta de Andalucia(Consejeria de Salud)'" }, { "3B2600311A51039000", "Andalusian Health Service identification card (HealthCare)" }, { "3B270011140003029000", "ITTAS CNA Smart Card Reader (PKI)\nhttps://www.ittas.by/en/solutions/cna-cryptographic-protection-of-information" }, + { "3B27002A2A4352595054", "PAY TV (Pay TV)" }, { "3B27008065A2..010137", "Gemplus GemSAFE Smart Card (4K)" }, { "3B27008065A200010137", "Gemplus GemSAFE Card CSP v1.0" }, { "3B27008065A202028237", "Gemplus GPK2000s" }, @@ -317,7 +329,6 @@ const static atr_t AtrTable[] = { { "3B3B13008066120401040158829000", "Schaffhauser Kantonalbank Switzerland (Bank)\nhttp://www.shkb.ch" }, { "3B3B7F380000006A444E496510024C", "dnie (eID)" }, { "3B3B7F380000006A444E496520024C", "DNI (eID)" }, - { "3B3B8E800180318066B1840C016E01830090001C021450", "all transport travel pass (Transport)\nhttp://www.metro.spb.ru/cnblt41.html" }, { "3B3B94000064053E030F31800E9000", "Slovenian national health insurance card" }, { "3B3B940000640E3E02F031800E9000", "HPC card 2\nZZZS Health care professional card- Slovenia (Healthcard) (HealthCare)\nhttps://partner.zzzs.si/wps/portal/portali/aizv/e-poslovanje/kartice_in_citalniki/prof_kartica/" }, { "3B3B940000640E3E030F31800E9000", "HIC card\nZZZS Health care card- Slovenia (HealthCare)\nhttps://partner.zzzs.si/wps/portal/portali/aizv/e-poslovanje/kartice_in_citalniki/kartica_zdravstvenega_zavarovanja/!ut/p/z1/04_Sj9CPykssy0xPLMnMz0vMAfIjo8ziTQxdPd2N_Q08LSyCDQ0cjZzMzXz8XQ3cXU30C7IdFQEohG-V/" }, @@ -400,8 +411,9 @@ const static atr_t AtrTable[] = { { "3B4F004932435F436172643D4E6F5F515452", "AT24C (Bank)" }, { "3B4F00536C653434322D34343DA2131091", "Debit card (Bank)" }, { "3B4F00536C65343433322D34323DA2131091", "VISA (Bank)" }, + { "3B501100", "JAVA (JavaCard)" }, { "3B57180293020101019000", "Easyflex FastOS 2.0 / Schlumberger" }, - { "3B5B96000031C064BAFC10000F9000", "SERGAS - Galician Healtcare Service (Spain) (HealthCare)\nhttps://www.sergas.gal" }, + { "3B5B96000031C064BAFC10000F9000", "SERGAS - Galician Healthcare Service (Spain) (HealthCare)\nhttps://www.sergas.gal" }, { "3B5B96000031C064C6FC1000019000", "Banking card (Oberthur C.S. 06 18710-04-10)" }, { "3B5B96000031C064C7FC1000019000", "EBanking card (Oberthur C.S. 03 1146821)" }, { "3B5E11FF4573744549442076657220312E30", "Estonian Identity Card (EstEID v1.0 2006 warm)" }, @@ -411,11 +423,16 @@ const static atr_t AtrTable[] = { { "3B5F9500807300010059434C5AC506117C9000", "Smart Card C5 68K CardLogix Corp (Other)\nhttps://www.cardlogix.com/products/most-card-c-series-microprocessor-smart-cards/" }, { "3B5F9500807300010059434C5AC50612C09000", "Republic of Liberia Civil Service Identification Card (eID)" }, { "3B5F9600805A2C1100101000FFFFFFFF829000", "Calypso (Transport)" }, + { "3B5F9600805A3F0608140101C546DEDC829000", "Navegante(r) Personalizado (Lisbon public transportation card) (Transport)\nhttps://www.navegante.pt/viajar/cartoes" }, + { "3B5F9600805A3F0608140101C546EBDC829000", "Multi-Transport Pass (Navegante) (Metro, Bus, Electric, Boat) Carris Metropolitano, PT (Transport)\nhttps://www.navegante.pt/" }, + { "3B600000", "Meano (Bank)" }, { "3B61000080", "blank A40CR card (JavaCard)" }, { "3B630000364180", "Schlumberger Payflex 4k User" }, { "3B64..FF8062..A2", "JCOP20" }, { "3B64000080620.51", "Setec SetCOS 5.1.0 EMV" }, { "3B6400FF806202A2", "VISA credit card (Nordea bank)" }, + { "3B6500002063CB3020", "CB / VISA La Banque Postale (IDEMIA) (Bank)" }, + { "3B6500002063CB3040", "Credit Mutuel Debit card (Bank)" }, { "3B6500002063CB4700", "Orga SmartyPlus DATA STORE issued by MORPHO CARDS PERU" }, { "3B6500002063CB6300", "Bank card from Societe Generale (Oberthur)" }, { "3B6500002063CB6400", "Bank card Caisse d'Epargne" }, @@ -460,21 +477,28 @@ const static atr_t AtrTable[] = { { "3B6500002063CBB020", "Credit Mutuel Arkea paycard (Bank)" }, { "3B6500002063CBB120", "Bank card 'Credit Agricole' (Bank)" }, { "3B6500002063CBB280", "Visa card distributed by 'Societe Generale' (French Bank) (Bank)\nVisa card distributed by 'Boursorama Banque' (French Bank) (Bank)\nhttps://www.visa.fr/" }, + { "3B6500002063CBB600", "Maestro Bank Card with chip (Bank)" }, { "3B6500002063CBB620", "MasterCard credit card, issued by Swedbank LT (Bank)" }, { "3B6500002063CBB680", "Visa bank card (Bank)" }, { "3B6500002063CBB700", "Lloyds Bank (UK) 'Avios Duo' Mastercard credit card (Bank)" }, - { "3B6500002063CBB720", "Lloyds Bank Platinum Mastercard Credit (Bank)" }, + { "3B6500002063CBB720", "Lloyds Bank Platinum Mastercard Credit (Bank)\nCredit Agricole Prepaid - Mastercard" }, { "3B6500002063CBB780", "VISA Credit Card (Bank)" }, { "3B6500002063CBB900", "Mastercard (Bank)" }, + { "3B6500002063CBBC", "jcop040 (JavaCard)" }, { "3B6500002063CBBC00", "Credit Agricole MasterCard Societaire (France) (Bank)\nhttps://www.ca-centrefrance.fr/moyens-de-paiement/carte-bancaire-societaire.html" }, { "3B6500002063CBBC10", "French 'Ticket Restaurant' Edenred payment card (Other)\nhttps://www.myedenred.fr/" }, { "3B6500002063CBBC80", "CB / Visa La Banque Postale (Gemalto SP)" }, { "3B6500002063CBBD00", "Credit Mutuel Arkea (Bank)" }, + { "3B6500002063CBBD80", "CARD ONEY BANQUE VISA CREDIT (Bank)\nhttps://www.oney.fr/" }, + { "3B6500002063CBBF00", "Credit Agricole SA (france) (Bank)" }, { "3B6500002063CBC000", "Nickel Credit Card (Bank)\nhttps://nickel.eu" }, { "3B6500002063CBC080", "VISA debit card (Bank)\nhttps://www.cic.fr/fr/banques/professionnels/gestion-courante/cartes-paiement-professionnelles.html" }, { "3B6500002063CBC100", "CIC (Bank)\nhttps://www.cic.fr/" }, + { "3B6500002063CBC300", "CIC Credit Card (Bank)" }, { "3B6500002063CBC310", "Pass Restaurant Sodexo Pass France (Bank)\nhttps://moncompte.sodexopass.fr/" }, { "3B6500002063CBC380", "Apetiz restaurant card (French luncheon vouchers) (Bank)\nhttps://www.apetiz.com/faq/?thematic=achats-apetiz-quoi-quand-combien" }, + { "3B6500002063CBC600", "AuMax / Credit Mutuel (Bank)\nhttps://www.aumaxpourmoi.fr/" }, + { "3B6500002063CBC680", "BNP Paribas Visa Classic Card (Bank)\nhttps://mabanque.bnpparibas/en/managing-your-accounts/cards-and-payment-methods/all-cards/visa-classic-card" }, { "3B6500002063CBFF00", "Credit Agricole business mastercard (Bank)" }, { "3B6500002640009000", "Alacard Petroltech (Transport)\nhttp://www.alacard.kz/" }, { "3B6500002905010201", "ActivCard (Schlumberger) CyberFlex 64K V1 SM 2.1" }, @@ -490,6 +514,7 @@ const static atr_t AtrTable[] = { { "3B660000009C11010103", "Axalto Cyberflex Access 32K V4 SM 1.3" }, { "3B660000009C11010301", "Axalto Cyberflex Access 64K V1 Bio SM 3.1" }, { "3B6600000512010101B1", "Lyon1 student card (Moneo compatible)" }, + { "3B660000112233445566", "Sodexo Restaurant Pass Card (Turkey) (Loyalty)\nhttps://www.sodexoavantaj.com/yemek-karti" }, { "3B660000314B01010080", "VISA credit card (Skandiabanken)" }, { "3B66000032D000300201", "Kazakhstan Kazkom Onlinebank (Homebank) PKI client key-card\nhttps://www.homebank.kz/" }, { "3B66000062C901010000", "safeview (Pay TV)\nhttps://safeviewmedia.com/" }, @@ -563,10 +588,10 @@ const static atr_t AtrTable[] = { { "3B6800000073C84010009000", "Icelandic Banking scheme Issued by the Ministry of Treasure in Iceland\nhttp://www.islandsrot.is/" }, { "3B6800000073C84011009000", "Woolworths Everyday Money prepaid Mastercard\nNordea Bank Norway Visa + national debet card [BankAxept]\nVISA Classic - Nordlandsbanken (Norway)\nCiti Double Cash MasterCard\nWescom Credit Union Visa Debit Card (Bank)\nhttps://www.wescom.org/CHECKING/CHECK-CARD.ASP" }, { "3B6800000073C84012009000", "Brazilian 'e-CPF' card" }, - { "3B6800000073C84013009000", "MASTERCARD issued by MLP (Marschollek, Lautenschlager and Partner)\nG&D 12696-GDM-10/11 DEBIT CARD issued by BANCO DE CREDITO DEL PERU\nVisa from Caisse populaire Desjardins (Canada) (Bank)\nhttps://www.desjardins.com/\nMasterCard issued by President's Choice Bank (Canada)\nhttp://pcfinancial.ca/mastercard\nMasterCard issued by CIBC (Canada)\nhttp://www.cibc.com/\nMasterCard issued by The Bank of Nova Scotia (Canada)\nhttp://www.scotiabank.com/\nMasterCard issued by JPMorgan Chase Bank, N.A.\nhttps://www.chase.com/\nCaixaBank Visa Electron (Bank)\nhttps://www.lacaixa.cat/\nAmerican Express Canada Credit Card (Bank)" }, + { "3B6800000073C84013009000", "MASTERCARD issued by MLP (Marschollek, Lautenschlager and Partner)\nG&D 12696-GDM-10/11 DEBIT CARD issued by BANCO DE CREDITO DEL PERU\nVisa from Caisse populaire Desjardins (Canada) (Bank)\nhttps://www.desjardins.com/\nMasterCard issued by President's Choice Bank (Canada)\nhttp://pcfinancial.ca/mastercard\nMasterCard issued by CIBC (Canada)\nhttp://www.cibc.com/\nMasterCard issued by The Bank of Nova Scotia (Canada)\nhttp://www.scotiabank.com/\nMasterCard issued by JPMorgan Chase Bank, N.A.\nhttps://www.chase.com/\nCaixaBank Visa Electron (Bank)\nhttps://www.lacaixa.cat/\nAmerican Express Canada Credit Card (Bank)\nAlfa-bank Russia Visa" }, { "3B6800000073C8401300907D", "NextCard - Mastercard Debit card - Intesa Sanpaolo Bank (Italy) (Bank)\nhttps://www.intesasanpaolo.com/it/persone-e-famiglie/prodotti/carte/carte-di-debito/next-card.html" }, { "3B68000000DE511001019000", "Itau Bank Mastercard Debit Card (Brazil) (Bank)\nhttps://www.itau.com.br" }, - { "3B6800000101309600009000", "Edenred - French Restauration e-Ticket card (2013) (Other)\nhttps://www.edenred.fr/ticket-restaurant" }, + { "3B6800000101309600009000", "Edenred - French Restoration e-Ticket card (2013) (Other)\nhttps://www.edenred.fr/ticket-restaurant" }, { "3B6800000101310000009000", "VISA ELECTRON Sberbank card (Bank)\nSubmarino MasterCard credit card (Brazil) (Bank)\nhttps://www.submarino.com.br/landingpage/ofertas-cartao-submarino" }, { "3B6800000102109600009000", "Italian BancoPostaClick Postamat Card (Poste Italiane) -\nMasterCard debit card\nmbna PLATINUM MasterCard\nFlash (Banca Fideuram) Italy prepaid Mastercard" }, { "3B6800000105200000009000", "Air Bank a.s. MasterCard debit card with PayPass (Bank)" }, @@ -589,7 +614,8 @@ const static atr_t AtrTable[] = { { "3B6800008066B00701010707", "Java Gemalto R7 (Bank)\nGemalto Santander Optelio TUI R7 with WG10 using Contact interface" }, { "3B6800008066B00701017707", "Tecnico Lisboa Student Card (Bank)\nhttp://www.tecnico.ulisboa.pt/\nOther Optelio Card (Santander)\nSantander Totta Student Card - Portugal (Bank)\nhttps://www.santandertotta.pt" }, { "3B68000081000350010F9000", "Holvi Payment Master Card (Bank)\nhttp://www.holvi.com" }, - { "3B680000990200D103042201", "N26 business debit card (Bank)\nhttps://n26.com/en-de/business-account" }, + { "3B680000990100C103042201", "Robinhood Debit (Bank)\nhttps://robinhood.com/us/en/" }, + { "3B680000990200D103042201", "N26 business debit card (Bank)\nhttps://n26.com/en-de/business-account\nVisa cards from Inecobank, Armenia" }, { "3B6800009D03020101564953", "Visa Card - SberBank / Russia" }, { "3B6800009D08010201564953", "Visa Card - bonus - DenizBank / Turkey" }, { "3B6800009D080103014F5453", "MasterCard Card - bonus - Garanti Bank / Turkey" }, @@ -605,7 +631,7 @@ const static atr_t AtrTable[] = { { "3B6900002494010000000001A9", "Kazakhstan Helios gas station debit card\nhttp://helios.kz/" }, { "3B6900002494010201000101A9", "Chipcard from SUN to be used in SunRay's\n370-4328-01 (31091)" }, { "3B6900002494010301000100A9", "Schlumberger MicroPayflex S card" }, - { "3B6900004944353056312E....", "eID Card to user authenticate and save paswords in the Card. Product ID50 Password manager from IDENTOS GmbH (eID)\nhttps://identos.com/id50-password-manager/" }, + { "3B6900004944353056312E....", "eID Card to user authenticate and save passwords in the Card. Product ID50 Password manager from IDENTOS GmbH (eID)\nhttps://identos.com/id50-password-manager/" }, { "3B6900004944363056312E....", "token appidkey ID60-USB (Other)\nhttps://identsmart.com/en/products/id60-datasafe/" }, { "3B6900004A434F503331563232", "Visa Europe Sample Card / Axalto" }, { "3B6900005001010401000101A9", "Sample card given to all attendees of the CTST 2004 SmartCard Conference" }, @@ -624,7 +650,7 @@ const static atr_t AtrTable[] = { { "3B690000F704010601800102A9", "Azeriqaz Smart Payment (eID)\nhttp://azeriqaz104.az/" }, { "3B690000F704010801800102A9", "Multinet (Other)" }, { "3B69000241434F534A76313031", "ACOSJ 40K Dual Interface (JavaCard)" }, - { "3B69000241434F534A76323033", "ACS ACOSJ Java Card (JavaCard)\nhttps://www.acs.com.hk/en/products/405/acosj-java-card-combi/" }, + { "3B69000241434F534A7632303.", "ACS ACOSJ Java Card (JavaCard)\nhttps://www.acs.com.hk/en/products/405/acosj-java-card-combi/" }, { "3B6900FF00644A100432059000", "NXP JCOP 20 V2.1 16K" }, { "3B6900FF3131313054434F5350", "Seven-Eleven Value Card / Smart Purse - Thailand (Other)\nhttp://www.7eleven.co.th/about7card.php" }, { "3B6900FF323332435343533336", "CSCS smart card. Must be read using CSCS go smart software.\nhttps://download.cscsreader.co.uk/" }, @@ -658,8 +684,10 @@ const static atr_t AtrTable[] = { { "3B6B00000031806443B002008C6127", "Bull Odyssey 1.2 (Javacard 2.0)" }, { "3B6B00000031C06400273400079000", "American Express Gold Air France - KLM (Bank)" }, { "3B6B00000031C064002734000F9000", "American Express Chip and Signature Card (Contact) ()\nhttps://americanexpress.com/chipandsignature" }, + { "3B6B00000031C06408046105079000", "TBC Bank Mastercard (Georgia) (Bank)\nhttps://www.tbcbank.ge/web/en/cards-and-subscription-plans" }, { "3B6B00000031C06408046112079000", "Visa Electron. BSB Bank. Belarus (Bank)" }, { "3B6B00000031C064080461120F9000", "Portuguese National Identity Card (eID)\nhttps://www.autenticacao.gov.pt/o-cartao-de-cidadao" }, + { "3B6B00000031C06408046114079000", "Belarusbank VISA credit card (Belarus) (Bank)" }, { "3B6B00000031C06408046120079000", "AMEX Bank DI Card (Bank)" }, { "3B6B00000031C06408046176079000", "Alliance Bank Debit Card (Bank)" }, { "3B6B00000031C064080461770F9000", "'Strelka' Russian Federation Travelcard (Transport)\nhttp://strelkacard.ru/" }, @@ -674,20 +702,24 @@ const static atr_t AtrTable[] = { { "3B6B00000031C064083981040F9000", "Visa Debit (Bank)" }, { "3B6B00000031C064083991080F9000", "MasterCard Bank Card (Bank)\nhttps://www.creditonebank.com/" }, { "3B6B00000031C064084403040F9000", "VISA debit card (ActivoBank, Portugal) (Bank)\nhttps://www.activobank.pt" }, + { "3B6B00000031C06408440305019000", "mastercard (Bank)" }, { "3B6B00000031C064084403050F9000", "Visa (Bank)" }, { "3B6B00000031C06408440312079000", "VISA (Bank)" }, { "3B6B00000031C064084403120F9000", "Debit Card/MasterCard shipped by electronic Bank N26 (Number26) (Bank)\nhttps://n26.com/de-de/\nBBVA (Spain) (MasterCard) debit card (Bank)\nhttps://www.bbva.es/eng/productos/ficha/tarjeta-ahora-bbva/0000009719" }, { "3B6B00000031C06408440313079000", "MasterCard, Alfa Bank (Russia) (Bank)\nhttps://alfabank.ru/everyday/debit-cards/perekrestok-prepaid/" }, { "3B6B00000031C064084403680F9000", "Credit card emitted by KBC Brussels, Belgium (Bank)\nAdvanzia Credit Card (Master Card gold), Germany (IDK if there is a difference between the german one and the other ones) (Bank)\nhttps://mastercard.gebuhrenfrei.com/\nItalian Intesa Sanpaolo Superflash Prepaid Mastercard (Bank)" }, { "3B6B00000031C06408440376079000", "Blu American Express Credit Card (Bank)\nhttps://www.americanexpress.com/it/content/carta-blu/" }, - { "3B6B00000031C064084403760F9000", "Maestro debit card, issued by Caixa Geral de Depositos (Bank)\nhttps://www.cgd.pt/Particulares/Cartoes/Cartoes-de-Debito/Pages/Cartao-Debito-Cauxautomatica-Maestro.aspx" }, + { "3B6B00000031C064084403760F9000", "Maestro debit card, issued by Caixa Geral de Depositos (Bank)\nhttps://www.cgd.pt/Particulares/Cartoes/Cartoes-de-Debito/Pages/Cartao-Debito-Cauxautomatica-Maestro.aspx\nCredit Agricole Bank Card - Bancomat / Maestro\nDanske Bank Mastercard Debit" }, + { "3B6B00000031C06408440377079000", "Sber bank VISA with Novacard chip (Bank)" }, + { "3B6B00000031C064084403930F9000", "MIR card (Bank)" }, { "3B6B00000031C064084841080F9000", "Monizze card. Card use to pay only meal. (Other)\nhttp://www.monizze.be" }, { "3B6B00000031C064131402000F9000", "UBA Card PREPAID (Bank)" }, { "3B6B00000031C0641F1801000F9000", "Portuguese Medical Association eID card (Cedula Profissional, Ordem dos Medicos, Portugal) (eID)\nhttp://www.omsul.pt/tabid/242/Default.aspx" }, { "3B6B00000031C0641F270100079000", "SOCCARDRT (HealthCare)" }, - { "3B6B00000031C0641F2701150F9000", "VISA Debit card for HSBC, Australia" }, + { "3B6B00000031C0641F2701150F9000", "VISA Debit card for HSBC, Australia\nDanske Bank Mastercard Debit" }, { "3B6B00000031C0641F27011C079000", "Raiffeizen Bank, Russia, MasterCard paypass card (Bank)" }, { "3B6B00000031C0641F2701350F9000", "V PAY (Bank)\nhttps://www.unicreditbulbank.bg/en/individual-clients/everyday-banking/payments/debit-cards/" }, + { "3B6B00000031C0643F680100079000", "JCOP empty card (JavaCard)" }, { "3B6B00000031C0643F6801020F9000", "dinacard (Bank)" }, { "3B6B00000031C0643F680103079000", "American Express Blue Cash (Bank)\nhttps://www.americanexpress.com/us/credit-cards/" }, { "3B6B00000031C0643F6801030F9000", "HSBC Credit Gold Card from VISA (Bank)" }, @@ -700,15 +732,25 @@ const static atr_t AtrTable[] = { { "3B6B00000031C064BE1B01030F9000", "dsafas (Telecommunication)" }, { "3B6B00000031C064D0100100079000", "Alfa-Bank (Russia) Master Card (Aeroflot bonus) (Bank)" }, { "3B6B00000031C16408603206079000", "HSBC (Bank)" }, + { "3B6B00000031C164086032060F90", "VISA (National Bank) (eID)" }, { "3B6B00000031C164086032060F9000", "Nationwide Building Society VISA Debit card (Bank)" }, + { "3B6B00000031C164086032090F9000", "Swedbank Estonia ISIC debit card (Bank)\nhttps://www.swedbank.ee/private/cards/debit/isic" }, { "3B6B00000031C164086032100F9000", "ICA Bank, Mastercard (Bank)\nhttps://www.icabanken.se/kort-och-betala/bankkort/" }, { "3B6B00000031C1640860321F079000", "NMRC Card (Transport)" }, { "3B6B00000031C1640860321F0F9000", "Fio bank, Mastercard, credit (Bank)\nhttps://www.fio.cz/bankovni-sluzby/platebni-karty/kreditni-karty" }, { "3B6B00000031C164086032200F9000", "Twisto (Bank)" }, { "3B6B00000031C16408603221079000", "DSK Bank Debit Mastercard (Bank)" }, + { "3B6B00000031C164086032220F9000", "Universidade de Aveiro (ID Card) (eID)\nhttps://www.ua.pt/pt/sas/cartao" }, + { "3B6B00000031C164086032420F9000", "Westpac Handybank EFTPOS/ATM Card (Bank)" }, { "3B6B00000031C164087771300F9000", "Apple Card (from launch) (Bank)\nhttps://www.apple.com/apple-card/" }, { "3B6B00000031C16408777156079000", "American Express UK Euro ICC charge card (Bank)\nhttps://www.americanexpress.com/icc/cards/the-basic-international-currency-card.html" }, + { "3B6B00000031C16408986200079000", "EquaBank Master Card (Bank)\nhttps://equabank.cz" }, + { "3B6B00000031C164089862000F9000", "NovaKBM Visa Debit (Bank)" }, { "3B6B00000031C164089862010F9000", "Sodexo Czech Gastro/Multipass (Other)\nhttps://www.sodexo.cz/" }, + { "3B6B00000031C1640924331E0F9000", "Cembra Money Bank - Certo! Mastercard credit card (Bank)\nhttps://certo-card.ch/certo/de/" }, + { "3B6B00000031C164092962250F9000", "SANTANDER BASIC CASH CARD (Bank)\nhttps://www.santander.co.uk/assets/s3fs-public/2018-09/Basic%20Current%20Account%20KFD.pdf" }, + { "3B6B00000031C16409644136079000", "HSBC UK Visa Debit Card (Bank)\nhttps://www.hsbc.co.uk/content/dam/hsbc/gb/pdf/help/hsbc-visa-debit-card-guide.pdf" }, + { "3B6B00000031C164096441360F9000", "VISA Business Folio AS /Norway (Sparebanken Vest) [IDEMIA] (Bank)\nhttps://folio.no/" }, { "3B6B000020900000000000B0A2BD69", "Fudan FM1280 (JavaCard)" }, { "3B6B0000426C756361726420344B42", "Blutronics Blucard 4K (Loyalty)\nhttp://blucard.blutronics.com" }, { "3B6B00004348495031342056312E30", "Swiss PostFinance Card (Bank)\nhttps://www.postfinance.ch/en/priv/prod/card/pfcard.html" }, @@ -739,7 +781,10 @@ const static atr_t AtrTable[] = { { "3B6C00004E544943339051024A030000", "Topas TV (Pay TV)" }, { "3B6C000080641134014873F741C08107", "Universal Electronic Card (UEC Russia) (eID)" }, { "3B6C0000806411650190730000008107", "Universal Electronic Card (UEC Russia) (eID)" }, + { "3B6C00008066B1A30401110B83009000", "NAVY F.C.U. (JavaCard)" }, + { "3B6C00008066B1A330401110B8300900", "Visa debit (Bank)" }, { "3B6C0002366186384B8C13046203598A", "Nagravision, Swiss mode" }, + { "3B6C00FF50564A434F50323156323331", "Al Etihad (Bank)" }, { "3B6C00FF8073C8211366010611590001", "Visa Crypto Business Electron by neyvabank.ru (Bank)\nhttps://neyvabank.ru/uploads/files/download/bankdirectvisacryptocardreader.pdf" }, { "3B6D0000", "PVT (Bank)" }, { "3B6D0000003180642DA0040C71968C6129", "UK Co-operative Bank Visa Debit (produced 2002)" }, @@ -756,6 +801,7 @@ const static atr_t AtrTable[] = { { "3B6D00000031C071D664A0010400849000", "Swiss Mastercard M-Budget (Bank)" }, { "3B6D00000031C071D66511223301839000", "UK Co-operative Bank Visa Debit (produced 2006)" }, { "3B6D000000664D453153050653036104F0", "FutureCard Ind. LLC / Feb-18 | Blank card for programming (JavaCard)" }, + { "3B6D00000073C800136447374237009000", "VISA DEBIT CLASSIC BANK OF AMERICA (Bank)" }, { "3B6D00000073C800136447374532009000", "Canada TD Bank Visa Debit/Interac Debit Card (Bank)" }, { "3B6D00000073C80013644A374237009000", "Sberbank Visa card (Bank)" }, { "3B6D00000073C800136454334433009000", "FirstBankcard issued for overstock.com (Bank)\nhttp://www.firstbankcard.com/overstock/" }, @@ -795,9 +841,10 @@ const static atr_t AtrTable[] = { { "3B6D000080318065B0872701BC83089000", "Kazcommertsbank\nhttp://en.kkb.kz/page/WhoWeAre\none of the biggest banks in Republic of Kazakhstan\nNordea (Finland) + Finnair MasterCard (credit)\nGXP7 T=0" }, { "3B6D000080318065B0873401D783009000", "Fidelity Investment Rewards (AMEX) (Bank)\nhttps://www.fidelity.com/cash-management/american-express-cards" }, { "3B6D000080318065B0893501F183009000", "Bank of America BankAmericard Travel Visa Chip Card (Gemalto)\nhttps://www.bankofamerica.com/credit-cards/products/bankamericard-travel-rewards-credit-card.go\nCredito Trevigiano - Banca di Credito Cooperativo - Carta BCC\nVISA Signature issued by RBC Bank (Georgia), N.A.\nhttps://www.rbcbank.com/\nBanca Popolare di Novara - (Bancomat Maestro)" }, - { "3B6D000080318065B0894001F283009000", "PSAM Card" }, + { "3B6D000080318065B0894001F283009000", "PSAM Card\nNordea Mastercard Card" }, { "3B6D00008067A1110101640855830E9000", "Italian Intesa SanPaolo Maestro" }, { "3B6D00FF003180718E6448D50200829000", "Blue for Business, American Express@Business" }, + { "3B6D00FF0031C173C8400052A1D8009000", "Discover it Credit Card (Bank)\nhttps://www.discover.com/credit-cards/cash-back/it-card.html" }, { "3B6D00FF80655343010D067394211B810[15]", "Giesecke & Devrient CardToken 350 (ICCD)" }, { "3B6D00FF8073002113574A544861314700", "ActiveKey SIM" }, { "3B6D00FF8073002113574A544861314800", "Spanish Medical College Card" }, @@ -824,7 +871,7 @@ const static atr_t AtrTable[] = { { "3B6E00000031C0657CB501018071D68C6121", "MUFG CARD (AMEX .jp) (Bank)\nhttp://www.cr.mufg.jp/mufgcard/support/webs/" }, { "3B6E00000031C065BCD002010671D68C612E", "Lloyds TSB Mastercard Credit Card" }, { "3B6E00000031C065BCD002010671D68C6133", "Lloyds TSB Visa Debit\nBarclays Visa DEBIT" }, - { "3B6E00000031C065BCD002010671D68C6143", "S-pankki (Finland) Visa Debit" }, + { "3B6E00000031C065BCD002010671D68C6143", "S-Pankki (Finland) Visa Debit" }, { "3B6E00000031C065BCD102010171D68C6133", "Travelex Cash Passport - Prepaid MasterCard Currency Card" }, { "3B6E00000031C065BCD102010171D68C6135", "MasterCard Card, issues by Rabobank in the Netherlands" }, { "3B6E00000031C065D3C102012871D68C6122", "Visa debit card" }, @@ -910,10 +957,11 @@ const static atr_t AtrTable[] = { { "3B6E0000626C756361726420344B422F7634", "eID Blutronics Blucard 4K\nhttp://blucard.blutronics.com" }, { "3B6E0000626C756361726420384B422F7634", "eID Blutronics Blucard 8K\nhttp://blucard.blutronics.com" }, { "3B6E00008025A00000002856801024000111", "Opencard, new card in Prague, Czech Republic (transport card)" }, + { "3B6E0000803108721422574458544B4E3031", "DX-Token (eID)\nhttps://www.dexon.ind.br/produtos-dxtoken" }, { "3B6E000080318065B00301015E8300009000", "FirstUSA Visa" }, { "3B6E000080318065B00302015E8300009000", "Gemplus GemXpresso 211is" }, { "3B6E000080318066B0070300AC0183009000", "e-payment card with topup system, propreteary by local bank\nhttp://www.klikbca.com/individual/silver/product.html?s=69" }, - { "3B6E000080318066B0840C016E0183009000", "Optelio Cards (D72 R4 WR)\nNordea (a Skandinavian bank) eID card\nhttp://linux.fi/wiki/Nordea_eID\nRBC Royal Bank Client Card (bank in Canada)\nBanco Santander TUI/USC R7\nGemalto Optelio/Desineo D72 (JavaCard) with WG10 and Maestro (JavaCard) (Bank)\nCarte Ticket Restaurant with MasterCard\nCitigold VISA Debit for Citibank, Australia\nPlatinum VISA card for Citibank, Australia\nVISA Infinite issued by RBC Royal Bank (Canada)\nhttp://www.rbc.com/\nPostepay Evolution - Poste Italiane (mastercard)\n'la Caixa' (Spain) (VISA Electron) debit card (Bank)\nhttps://www.lacaixa.es/\nItalian Webank.it BPM Banca Popolare di Milano Bancomat & Maestro Card (Bank)" }, + { "3B6E000080318066B0840C016E0183009000", "Optelio Cards (D72 R4 WR)\nNordea (a Skandinavian bank) eID card\nhttp://linux.fi/wiki/Nordea_eID\nNordea Mastercard card\nNordea Visa card\nRBC Royal Bank Client Card (bank in Canada)\nBanco Santander TUI/USC R7\nGemalto Optelio/Desineo D72 (JavaCard) with WG10 and Maestro (JavaCard) (Bank)\nCarte Ticket Restaurant with MasterCard\nCitigold VISA Debit for Citibank, Australia\nPlatinum VISA card for Citibank, Australia\nVISA Infinite issued by RBC Royal Bank (Canada)\nhttp://www.rbc.com/\nPostepay Evolution - Poste Italiane (mastercard)\n'la Caixa' (Spain) (VISA Electron) debit card (Bank)\nhttps://www.lacaixa.es/\nItalian Webank.it BPM Banca Popolare di Milano Bancomat & Maestro Card (Bank)\nSberbank of Russia MIR debit card (Bank)\nMasterCard bank card by OTP Bank (Hungary)" }, { "3B6E000080318066B08412016E0183009000", "Barclaycard Platinum VISA\nInteligo debit card\nVISA issued by ING (Poland)\nVISA Debit card for ING Direct, Australia\nVISA Gold issued by RBC Royal Bank (Canada)\nhttp://www.rbc.com/\nGas Natural Fenosa Visa (issued by CaixaBank) (Bank)\nhttp://www.clubfenosa.gasnaturalfenosa.es/ca/1285341160257/targeta+gas+natural+fenosa.html" }, { "3B6E000080318066B08416016E0183009000", "UK 'Barclaycard Gold VISA' with RFID" }, { "3B6E000080318066B0870C016E0183009000", "Banco Santander TUI/USC R7 - Gemalto Optelio/Desineo D72 (JavaCard)\nhttp://www.observatoriotui.com/home" }, @@ -927,17 +975,24 @@ const static atr_t AtrTable[] = { { "3B6E00FF00620000574156414E5410819000", "debit card (Visa Electron) issued by Nordea bank" }, { "3B6E00FF4573744549442076657220312E30", "Estonian Identity Card (EstEID v1.0 warm)" }, { "3B6E00FF47442D47502D333256342D444553", "Mastercard Ourocard Platinum from Banco do Brasil" }, + { "3B6F000000004A300A86454A5A231044433330", "Personal Card (eID)" }, { "3B6F00000031C068435350454D560300079000", "SOCCARDRT (HealthCare)" }, { "3B6F00000031C173C821106441443231009000", "Debit Card for Santander Universidades PT (Bank)\nhttps://www.santander.pt/pt_PT/Particulares/Universitarios.html" }, + { "3B6F00000031C173C821106441443530009000", "Discover Cashback Debit (Bank)\nhttps://www.discover.com/online-banking/" }, + { "3B6F00000031C173C8211064414D3347", "CHASE DEBIT VISA (JavaCard)" }, + { "3B6F00000031C173C8211064414D3347079000", "Java (JavaCard)" }, { "3B6F00000031C173C8211064474D3131009000", "Beutsche Bank Business mastercard credit (Bank)\nhttps://www.deutsche-bank.de/gk/zahlungsverkehr/zahlungsverkehr-im-ueberblick/kreditkarte.html" }, { "3B6F00000031C173C8211064474D3133009000", "Bank card from the Commonwealth Bank of Australia (Bank)\nhttps://www.commbank.com.au/business/pds/cbb127_eftpos_int_v7.pdf" }, { "3B6F00000031C173C8211064474D3134009000", "bancomat Banca Popolare Milano + maestro debit card + rfid (Bank)" }, + { "3B6F00000031C173C8211064474D3136009000", "Highest level of DNB AS (Norway (Bank)" }, { "3B6F00000031C173C8211064474D3331009000", "BBVA Antes Card (Spain) (VISA) prepaid card (Bank)\nhttps://www.bbva.es/eng/productos/ficha/tarjeta-antes-bbva/0T00000225" }, { "3B6F00000031C173C8211064474D3332009000", "td debit visa card (Bank)\nScotiabank ScotiaCard Interac/Visa debit card (Bank)\nhttps://www.scotiabank.com/ca/en/personal/ways-to-bank/debit-credit-prepaid-cards/debit-cards/scotiacards.html" }, { "3B6F00000031C173C8211064474D3338009000", "ING Direct Debit Card (Bank)" }, { "3B6F00000031C173C8211064474D3341009000", "Fineco debit card (Bancomat, Visa Debit) (Bank)\nhttps://finecobank.com/it/online/conto-e-carte/carte-e-bancomat/" }, - { "3B6F00000031C173C8211064474D3435009000", "VISA card, issued by OP Financial Group, Finland (Bank)" }, + { "3B6F00000031C173C8211064474D3435009000", "VISA card, issued by OP Financial Group, Finland (Bank)\nVISA card, issued by S-Pankki, Finland (Bank)" }, { "3B6F00000031C173C8211064474D3437009000", "Visa credit card, issued by Klarna (Bank) (Bank)\nhttps://www.klarna.com/se/kort/" }, + { "3B6F00000031C173C8211064474D3533009000", "American Express Platinum Card Mexico (Bank)\nhttps://www.americanexpress.com/mx/tarjetas-de-credito/the-platinum-credit-card/" }, + { "3B6F00000031C173C821106457493035009000", "Discover EMV Card (Bank)" }, { "3B6F00000031C173C821106457493036009000", "neat MasterCard (Bank)\nhttps://www.neatcommerce.com/" }, { "3B6F00000031C173C821106457493131009000", "Banca Popolare Di Sondrio (IT) - Ateneo+ Card for University of Brescia (Bank)\nhttps://www.ateneopiu.it/home" }, { "3B6F00000031C173C8211064574B3037009000", "NatWest VISA Debit card (Bank)\nhttps://personal.natwest.com/personal/current-accounts/select_account.html" }, @@ -945,7 +1000,7 @@ const static atr_t AtrTable[] = { { "3B6F00000031C173C821106457533430009000", "PNC Debit (Bank)" }, { "3B6F000000664D453161030153086104F09000", "Spanish University of Murcia smart ID card - Old version (M.Mar OS) - Also used by many others spanish universities" }, { "3B6F000000664D4531B1030153086104F09000", "Spanish UCAM University smart ID card - (M.Mar OS) - Also used by many others spanish universities" }, - { "3B6F000000664D45668003..53066103F09000", "Millenium Card (www.coruna.es/millennium) municipal city card for A Coruna, Spain.\nelectronic wallet for paying services like parking meter or public service (bus) transportation." }, + { "3B6F000000664D45668003..53066103F09000", "Millennium Card (www.coruna.es/millennium) municipal city card for A Coruna, Spain.\nelectronic wallet for paying services like parking meter or public service (bus) transportation." }, { "3B6F000000664D456680030C53066105F09000", "Transporte Metropolitano de Galicia (Transport)\nhttp://tmg.xunta.gal/" }, { "3B6F000000664D456680031453036104F09000", "Paypal Prepaid Card (YoUnique Money E.D.E.)" }, { "3B6F000000664D456680031653066105F09000", "Transport Metropolitano de Galicia (Transport)\nhttps://tmg.xunta.gal/" }, @@ -956,6 +1011,7 @@ const static atr_t AtrTable[] = { { "3B6F000000B854211004900000000000000000", "VIABUY Credit card (Bank)\nhttp://www.viabuy.de" }, { "3B6F000000B854311007900000000000000000", "Revolut Premium Mastercard (Bank)\nhttps://www.revolut.com/revolut-premium\nMonzo Bank (UK) Debit Mastercard\nhttps://monzo.com/\nLansforsakringar (SE) Debit Mastercard\nhttps://www.lansforsakringar.se/\nING Direct MasterCard (Bank)\nhttps://www.ing.es/tarjetas-ing" }, { "3B6F00000231B813FF000000000000000F9000", "Coverflex | Flexible Benefits Platform (Other)\nhttps://www.coverflex.com/" }, + { "3B6F00003101F1564011001900000000000000", "Postepay Evolution (Bank)\nhttps://postepay.poste.it/prodotti/postepay-evolution.html" }, { "3B6F0000626C75636172642031364B422F7634", "eID Blutronics Blucard 16K\nhttp://blucard.blutronics.com" }, { "3B6F00008031C0520083640219083283839000", "Bancomer Mexican Bank" }, { "3B6F00008031C05205B5640200647183839000", "Read Card in USB, used for application in Java. (JavaCard)" }, @@ -966,6 +1022,7 @@ const static atr_t AtrTable[] = { { "3B6F00008031C05211F46402B3023783839000", "VISA (Bank)" }, { "3B6F00008031C052132F640219083283839000", "Cajamadrid-UCM (Madrid, Spain) Cash/Visa Electron" }, { "3B6F00008031C05216B9640566803283839000", "Banorte Mexican Bank" }, + { "3B6F00008031C05216F5640569937083839000", "BANCO INTERAMERICANO DE FINANZAS, S.A.E.M.A. (Bank)" }, { "3B6F00008031C05220E2640562178083839000", "VISA MedicusMundi (VISA Classic Affinity credit card, issued by Laboral Kutxa) (Bank)\nhttps://www.medicusmundi.es/es/que-puedes-hacer-tu/tarjetas-affinity" }, { "3B6F00008031E05B4555520000000000070200", "Pre-loaded wallet card. 'Mondex is a smart card electronic cash system, implemented as a stored-value card' (Bank)\nhttps://en.wikipedia.org/wiki/Mondex" }, { "3B6F00008031E05B4E4F4B0000000000000200", "Norsk-Tipping (Buypass) Monodex card" }, @@ -994,6 +1051,7 @@ const static atr_t AtrTable[] = { { "3B6F00008031E06B04520502BB555555555555", "AlfaBROU - Mastercard (prepaid card emitted by Banco Republica - Uruguay) (Bank)\nhttps://www.brou.com.uy/personas/tarjetas/prepaga-alfabrou" }, { "3B6F00008031E06B04520502FD555555555555", "C6 Bank Mastercard Global Account (Bank)\nhttps://www.c6bank.com.br/conta-global\nC6 Bank Mastercard Brazil Account (Bank)\nhttps://www.c6bank.com.br/nossos-produtos" }, { "3B6F00008031E06B04520502FE555555555555", "CITIBanamex 'Perfiles' debit card (Bank)\nhttps://www.banamex.com/es/personas/cuentas/cuenta-perfiles.html" }, + { "3B6F00008031E06B04546B026D555555555555", "Mastercard Credit/Debit Card (Bank)" }, { "3B6F00008031E06B0505050280555555555555", "Banamex cuenta perfiles (Bank)\nhttp://banamex.com" }, { "3B6F00008031E06B0508050283555555555555", "Bank of Montreal debit card" }, { "3B6F00008031E06B0512050287555555555555", "American Express credit card" }, @@ -1047,8 +1105,11 @@ const static atr_t AtrTable[] = { { "3B6F0000805A080608201223C202795D829000", "OPUS is card for storing public transit passes and tickets (Transport)\nhttps://opusenligne.ca/" }, { "3B6F0000805A080608201223C2036347829000", "OPUS Card RTC Quebec's Bus system (Canada) (Transport)\nhttps://opusenligne.ca" }, { "3B6F0000805A080608201223C204D07F829000", "OPUS Card (Transport)\nhttps://en.wikipedia.org/wiki/OPUS_card" }, + { "3B6F0000805A080608201223C210E956829000", "Montreal Public transport Card (OPUS) (Transport)\nhttps://www.stm.info/en/info/fares/opus-cards-and-other-fare-media/opus-card" }, { "3B6F0000805A080608201223C21113A6829000", "OPUS (Montreal and Quebec transport card) (Transport) (Transport)\nhttps://www.stm.info/en/info/fares/opus-cards-and-other-fare-media/opus-card" }, { "3B6F0000805A080608201223C21290FD829000", "OPUS Montreal Societe des Transports de Montreal Metro and Bus card. (Transport)\nhttps://www.stm.info/en/info/fares/opus-cards-and-other-fare-media" }, + { "3B6F0000805A080608201223C215C411829000", "Montreal OPUS Transportation Card for the STM, STL, RTM and RTL (Transport) (Transport)" }, + { "3B6F0000805A080608201223C21BAFB4829000", "OPUS card (Transport)\nhttps://www.stm.info/en/info/fares/opus-cards-and-other-fare-media/opus-card" }, { "3B6F0000805A0A010120031103DCB31B829000", "Card Transport 'Lignes d'Azur' of 'Metropole Nice Cote d'Azur'" }, { "3B6F0000805A0A01012003119361D7D7829000", "Carte Tecely (Reseau TCL: metro, tramway, bus et funiculaire de Lyon) (Idemia)" }, { "3B6F0000805A0A0102200311........829000", "Card << Oura ! >> of region Rhone-Alpes, Calypso standard (TER, Transisere)" }, @@ -1072,10 +1133,16 @@ const static atr_t AtrTable[] = { { "3B6F0000805A0A070620042C031B899B829000", "Israeli public transport 'RavKav' card (ASK variant) (Transport)\nhttp://www.dannorth.co.il/" }, { "3B6F0000805A0A070620042C031C112A829000", "Peronalized RavKav (Transport)\nhttps://ravkavonline.co.il/he/" }, { "3B6F0000805A0A070620042C03288444829000", "rav-kav (Transport)\nhttp://nohal.mot.gov.il/%d7%94%d7%92%d7%93%d7%a8%d7%95%d7%aa%20%d7%91%d7%a0%d7%95%d7%a9%d7%90%20%d7%9b%d7%a8%d7%98%d7%95%d7%a1%20%d7%97%d7%9b%d7%9d.aspx" }, + { "3B6F0000805A0A070620042C0490EFCB829000", "Rav-Kav Israel (Transport)\nhttps://ravkavonline.co.il" }, { "3B6F0000805A0A070620042DC1660B73829000", "Rav-Kav: Israel's Travel Card (Transport)" }, { "3B6F0000805A0A070620042DC169517A829000", "Card for bus (Transport)" }, + { "3B6F0000805A0A070620042DC2E8E270829000", "ravkav (Transport)" }, + { "3B6F0000805A0A070620042DC3229072829000", "Israelian public transportation smartcard for all bus and rail services, called a Rav-Kav, RavKav, or Rav Kav. This variant is NFC capable. (Transport)\nhttps://ravkavonline.co.il/" }, { "3B6F0000805A28010220122103346577829000", "ONYGO! pass\nhttp://www.region-basse-normandie.fr/pass-onygo" }, + { "3B6F0000805A280102201221C12AD1C8829000", "SIMPLI CITES (Transport)\nhttps://www.fluo.eu/" }, + { "3B6F0000805A280102201221C365AF0F829000", "SIMPLI CITE Stan (France) (Transport)\nhttps://www.reseau-stan.com/" }, { "3B6F0000805A2811421010122B260CD45A829000", "French transport card Navigo (Transport)\nhttps://www.iledefrance-mobilites.fr/je-gere-ma-carte" }, + { "3B6F0000805A28114210122B03791BB9829000", "RATP Navigo Easy Paris France (Transport)\nhttps://www.transilien.com/fr/page-tarifs/navigo-easy" }, { "3B6F0000805A28114210122B037A89AA829000", "Ile-de-France Mobilites (Navigo Easy) (Transport)\nhttps://www.iledefrance-mobilites.fr/titres-et-tarifs/supports/passe-navigo-easy" }, { "3B6F0000805A28114210122B037AED59829000", "Navigo Easy (Paris) (Transport)\nhttps://www.iledefrance-mobilites.fr/titres-et-tarifs/supports/passe-navigo-easy" }, { "3B6F0000805A28114210122B23A9E229829000", "Navigo(French transport) (Transport)\nhttp://www.navigo.fr/je-gere-ma-carte/" }, @@ -1120,6 +1187,8 @@ const static atr_t AtrTable[] = { { "3B6F0000805A28130210122B03F80BC3829000", "Korrigo Card (Transport in Rennes Area in France ) (Transport)\nhttps://www.star.fr/titres-tarifs/carte-korrigo/" }, { "3B6F0000805A28130210122B7500559A829000", "Contact card to handle personal travel tickets in the Britany area. Used by several travel operators like SNCF TER Bretagne, STAR in Rennes, BIBUS in Brest,.... (Transport)" }, { "3B6F0000805A28130210122B75021B8A829000", "KorriGo, smart transport card in France region Brittany (Transport)\nhttps://www.ter.sncf.com/bretagne/offres/carte-korrigo" }, + { "3B6F0000805A28130210122B7503FB01829000", "origo (France) (Transport)\nhttps://www.breizhgo.bzh/se-deplacer-en-bretagne/KorriGo" }, + { "3B6F0000805A28130210122B750C7E79829000", "Transportation card delivered by STAR (Transportation service from the city of Rennes, France) (Transport)\nhttps://www.star.fr/titres-et-tarifs/carte-korrigo/" }, { "3B6F0000805A28130210122B9292E642829000", "Transport card in cote d'or France (mobigo)" }, { "3B6F0000805A28130210122B9292E829829000", "French transport card of the city of Dijon and Cote d'or department. (Transport)\nhttps://www.viamobigo.fr/fr/acheter-mes-titres-de-transport-mobigo-en-cote-dor/176" }, { "3B6F0000805A28130210122B92D663FC829000", "Card 'Korrigo' region Bretagne, France, Bibus Brest Metropole public transport (Transport)\nhttps://fr.wikipedia.org/wiki/KorriGo" }, @@ -1132,6 +1201,7 @@ const static atr_t AtrTable[] = { { "3B6F0000805A2C06081010059316213D829000", "Portuguese Viva Card (Transport)\nhttp://www.portalviva.pt" }, { "3B6F0000805A2C0608101005932268D0829000", "Public transport card lisbon (Transport)\nhttp://www.portalviva.pt" }, { "3B6F0000805A2C0608101005932346E2829000", "Lisboa Viva (Transport)" }, + { "3B6F0000805A2C060810100593237A11829000", "Portuguese Lisboa Viva Viagem Transport Card (Transport)" }, { "3B6F0000805A2C11C31010057B01004B829000", "French Military Circulation card (Transport)" }, { "3B6F0000805A2C11C31010057B0A1DBA829000", "French military discount on SNCF trains card (Transport)" }, { "3B6F0000805A2C11C31010057B120D53829000", "French military transport card (Transport)" }, @@ -1156,11 +1226,16 @@ const static atr_t AtrTable[] = { { "3B6F0000805A2D060810100278324D6F829000", "Lisboa Viva card, public transport card of Lisbon (Portugal) (Transport)\nhttps://www.portalviva.pt" }, { "3B6F0000805A2D06081010027835EDCE829000", "Lisbon Transportation SmartCard (Transport)" }, { "3B6F0000805A2D06081010027848BBCC829000", "Lisbon Metro Monthly Student Pass (Transport)\nhttps://www.metrolisboa.pt/" }, + { "3B6F0000805A2D0608101005935C42FB829000", "Comboios de Portugal Transit Card (Transport)\nhttps://www.cp.pt/passageiros/pt/consultar-horarios/precos/cartao-cp" }, { "3B6F0000805A3407061500017917A7E2829000", "Rav-Kav multi-line travel ticket used in the public transportation system in Israel (Transport)\nhttps://www.gov.il/en/departments/guides/multi_line_card" }, + { "3B6F0000805A340706150001792A4B5C829000", "Rav Kav Transit Payment Card (Israel) (Transport)\nhttps://ravkavonline.co.il/" }, { "3B6F0000805A3B0706150101793E797B829000", "Rav Kav (Transport)\nhttp://alhakav.mot.gov.il/he/rav-kav" }, { "3B6F0000805A3B070615010279537211829000", "Israeli public transport card ('RavKav') (Transport)\nhttps://ravkavonline.co.il" }, { "3B6F0000805A3B07061501027956C5F4829000", "RAVKAV - Israel dual interface transport card (Calypso standard) (Transport)\nhttps://en.wikipedia.org/wiki/Rav-Kav" }, + { "3B6F0000805A3B070615010279C3C331829000", "Rav-Kav Israel (Transport)\nhttps://ravkavonline.co.il" }, { "3B6F0000805A3C0608140101C3805E38829000", "Lisboa VIVA - Lisbon public transport card (Transport)\nhttps://www.portalviva.pt/" }, + { "3B6F0000805A3C0608140101C4D4FEC4829000", "Metropolitan Transports of Lisbon NAVEGANTE Card (Transport)\nhttps://www.navegante.pt/viajar/cartoes" }, + { "3B6F0000805A3C0608140101C4D522FB829000", "Navegant Perdonal Card - Transportes Metropolitanos de Lisboa (Transport)\nhttps://www.navegante.pt/" }, { "3B6F0000805A3C1142141001274AC890829000", "Gemalto Celego G1 (Transport)" }, { "3B6F0000805A3C114214100127A46D02829000", "Navigo decouverte Paris (Transport)\nhttp://www.navigo.fr/titres/le-forfait-navigo-semaine-presentation/" }, { "3B6F0000805A3C114214100127B3C81B829000", "Transport card for Paris (France) and its region. Market name is Navigo (Transport)" }, @@ -1172,8 +1247,10 @@ const static atr_t AtrTable[] = { { "3B6F0000805A3C1142141001C17BC993829000", "Navigo Easy (Transport)\nhttps://www.ratp.fr/titres-et-tarifs/passe-navigo-easy" }, { "3B6F0000805A3C1142141001C17DA8CA829000", "Navigo Easy (France) transport card (Transport)\nhttps://www.ratp.fr/titres-et-tarifs/passe-navigo-easy" }, { "3B6F0000805A3C1142141001C185D47B829000", "Navigo Liberte+ -- French (Paris region) transport card (Transport)" }, + { "3B6F0000805A3C1142141001C2A40D5F829000", "'Pass Navigo Decouverte' - Parisian transport card (Transport)\nhttps://www.iledefrance-mobilites.fr/titres-et-tarifs/supports/passe-navigo-decouverte" }, { "3B6F0000805A3C1142141001C2BF7B46829000", "Navigo RATP (Transport)" }, { "3B6F0000805A3C1330141001C3568397829000", "'oura' card for leman express and ter sncf rhone-alpes (Transport)" }, + { "3B6F0000805A3C1330141001C4F81130829000", "Oura card which allows to travel across many transport networks of France region: Auvergne-Rhone-Alpes (Transport)\nhttps://www.oura.com/" }, { "3B6F0000805A3C23C4141001C02EF7F8829000", "MOBIB basic Brussels (with NFC) (Transport)\nhttps://mobib.be/en.html" }, { "3B6F0000805A3C23C4141001C02EFA97829000", "Brussels STIB MOBIB Classic (Transport)\nhttps://www.stib-mivb.be/mobib.html" }, { "3B6F0000805A3C23C4141001C02FDEFA829000", "MOBIB public transport card (Belgium); contacted IC (Transport)" }, @@ -1187,7 +1264,9 @@ const static atr_t AtrTable[] = { { "3B6F0000805A3D0706150101792CB636829000", "RavKav (Transport)" }, { "3B6F0000805A3D23C41501027937D7AE829000", "MOBIB - Brussels (Transport)\nhttps://www.stib-mivb.be/article.html?_guid=d02c7fb6-3e9c-3810-248e-eec4ee5ebc8c&l=fr" }, { "3B6F0000805A3D23C41501027949789C829000", "MOBIB basic (Transport)\nhttp://www.stib-mivb.be/article.html?_guid=30af0085-2483-3410-5394-a71daf08acd1&l=en#contentBodyList1" }, + { "3B6F0000805A3D23C4150102795A863C829000", "mobib transportation card (Transport)" }, { "3B6F0000805A3D23C415010279748A25829000", "Mobib (Brussels transport card) for the STIB-MIVB network (Transport)\nhttps://www.stib-mivb.be/article.html?_guid=d02c7fb6-3e9c-3810-248e-eec4ee5ebc8c&l=fr" }, + { "3B6F0000805A3D23C415010279A9E567829000", "MoBIB card, a medium for the transport tickets of the four Belgian public transport operators (Transport)\nhttps://mobib.be/" }, { "3B6F0000805A434F4C44000000000000829000", "LBB Berlin, MasterCard (ADAC branding?)" }, { "3B6F0000805A4880C1205001AEC00295829000", "Calypso SAM C1 (Transport)" }, { "3B6F0000806645460138180353023110829000", "Fabrica Nacional de Moneda y Timbre FNMT WG10\nhttp://www.fnmt.es/es/html/tage/fichaTarjeta/fp1_ta_01.asp" }, @@ -1198,7 +1277,7 @@ const static atr_t AtrTable[] = { { "3B6F00008066A20302023D0753023110829000", "Electronic purse of the Universidad Politecnica of Madrid (provided by Banco Santander)" }, { "3B6F00008066B007010107............9000", "Gemalto Santander Optelio TUI R7 with WG10 customized using Contact interface" }, { "3B6F00008066B0070101070753023110829000", "Banco Santander TUI/USC R7 - Gemalto Optelio/Desineo D72 (JavaCard) with WG10 (JavaCard)" }, - { "3B6F00008066B0070101070753023124829000", "Banco Santander TUI/USC R7 - Gemalto Optelio/Desineo D72 (JavaCard) with WG10 and Maestro (JavaCard)" }, + { "3B6F00008066B0070101070753023124829000", "Banco Santander TUI/USC R7 - Gemalto Optelio/Desineo D72 (JavaCard) with WG10 and Maestro (JavaCard)\nClient bizness card (Bank)" }, { "3B6F00008066B007010177............9000", "Other Optelio Card (Santander)" }, { "3B6F00008066B0070101770753023110829000", "University ID card (issued by Banco Santander Central Hispano)\n.\nUniversidad Nacional de Educacion a Distancia (UNED, Spain)\nhttp://www.uned.es/tarjeta\n.\nUniversitat Politecnica de Catalunya (UPC.edu)\nhttps://www.upc.edu/identitatdigital\n.\nUniversitat Ramon Llull (URL)\nhttp://www.url.edu/cont/url/carnet.php" }, { "3B6F00008066B0070101770753023124829000", "Santander 4B Maestro\nUniversity of Santiago de Compostela. Spain\nPolytechnical University of Madrid, Spain" }, @@ -1227,7 +1306,7 @@ const static atr_t AtrTable[] = { { "3B76130000806207418181", "TransLink card (discontinued San Francisco Bay Area transit card)" }, { "3B76980000009C11010102", "CyberFlex Access 32" }, { "3B771800004B4153414B4944", "Identification Kazakhstan Republic (passport)\nhttps://egov.kz/" }, - { "3B7812000047C403008FF19000", "Sattelite bg 23.5 East cryptoworks card" }, + { "3B7812000047C403008FF19000", "Satellite bg 23.5 East cryptoworks card" }, { "3B7812000054C401078FF19000", "XtraMusic listening card (Pay TV)" }, { "3B7812000054C40204FFFF6F04", "UPC Direct Satellite TV Card (Pay TV)\nhttp://www.upcdirect.com/" }, { "3B7812000054C402078FF19000", "Polish WIZJA TV pay-tv card for satellite receivers (Pay TV)" }, @@ -1247,11 +1326,14 @@ const static atr_t AtrTable[] = { { "3B781400000073C8400000", "e-tazkira (eID)" }, { "3B781800000073C80140009000", "The Kyrgyz Republic eID (eID)" }, { "3B781800000073C840000000009000", "VERISOFT REWARDO LOYALTY CARD and CUSTOM PERSONALIZATION PROJECTS FOR EXTERNAL ENTITIES (Loyalty)\nhttp://www.verisoft.com" }, + { "3B781800000073C84013009000", "Mastercard (Bank)" }, { "3B781800005448204E4944203.", "Thailand National ID (eID)" }, { "3B7818000100000000C31E6919", "Storage for passwords (Bank)" }, { "3B781800FF0073C84000009000", "NAB Visa Debit - Contact I/F (Bank)" }, + { "3B789400008684044930310604", "bank of china Debit Card (Bank)" }, { "3B789600000073C84000009000", "SAM card for acquirer module by lanit.ru (Bank)" }, { "3B789600005343066001079000", "Bank of America Travel Rewards Credit Card (Bank)\nhttps://www.bankofamerica.com/credit-cards/products/travel-rewards-credit-card/" }, + { "3B789600005343066201079000", "ATM Card (Bank)" }, { "3B789600008100035001079000", "RMA BMCE BANK CARD (Bank)" }, { "3B791100008054434F4C44829000", "amazon.de / VISA / LBB Debit Card (Bank)" }, { "3B79130000806416030183829000", "Raiffeisen VPay Debit Card (Bank)\nhttp://raiffeisen.ch" }, @@ -1262,11 +1344,13 @@ const static atr_t AtrTable[] = { { "3B791800008054434F4C44829000", "LBB VISA Card" }, { "3B7918000080634B560283079000", "Pay charge of South Korean Highway Tollgate, It named hi-pass. This card is sales by 'SM hiplus', and card name is 'Greencar Postpaid hi-pass Card'. In this name, 'Greencar' means South Korea's Car Sharing Service. This card from Rented car. (Transport)\nhttps://www.lottecard.co.kr/" }, { "3B79180000806355500183079000", "TEST SAM Card (espark) (Other)" }, + { "3B79180000806355561183039000", "Hi-Pass (Other)" }, { "3B79180000806355561283079000", "'hi-pass+ Prepaid hi-pass Card' pay charge of South Korean Highway Tollgate. Sold by 'SM hiplus' (Transport)\nhttp://www.hipluscard.co.kr/" }, { "3B799400005901010E016B0102A9", "Vending machine payment card ('Necta' brand)" }, { "3B79940000EB03010102700102A9", "Sodexo - Spanish vending machines (Other)\nhttp://es.sodexo.com/home.html" }, { "3B79940000F704010103800102A9", "Pelican Rouge, vending machine (Other)\nhttp://colnect.com/es/functional_cards/functional_card/26065-Maquinas_Cafe_-_Pelican_Rouge-Pelican_Rouge-Vending-Espa%C3%B1a\nhttp://www.pelicanrouge.co.uk/en-uk/about-us" }, { "3B7995000054454C454D10211010", "Israeli Identity Card (eID)\nhttp://smartid.gov.il/English/Pages/default.aspx" }, + { "3B799600002001010601000100E9", "Casino (Other)" }, { "3B799600005448204E494420313.", "Thai National ID Card (eID)" }, { "3B799800005001010401000101A9", "Gemalto PayFlex used in Aristocrat System 7000 Casino Management System (South Africa only)" }, { "3B79980000EB03010000700101A9", "Casino Rio Patras, Greece" }, @@ -1287,16 +1371,17 @@ const static atr_t AtrTable[] = { { "3B7A9600008065A201200100303D72D641", "Oman eID (eID)" }, { "3B7A9600008065A20120013D72D641", "Oman eID (eID)" }, { "3B7A9700008065B08520040272D64.", "OMAN EID CARD (eID)" }, + { "3B7A9700008065B08521040272D641", "Oman eID (eID) (eID)\nhttps://idp.pki.ita.gov.om/" }, { "3B7B..000080620.515646696E454944", "Setec SetCOS 5.1.0" }, { "3B7B..00008065B083......83009000", "IDClassic 3XX Cards (without MPCOS Applet - FIPS)" }, - { "3B7B11000031FE45436F6D624F532000", "Debit card emmited by Societe Generale Morocco (Bank)" }, + { "3B7B11000031FE45436F6D624F532000", "Debit card emitted by Societe Generale Morocco (Bank)" }, { "3B7B1800000031C06477E30300829000", "Oberthur Cosmopolic 64K v5.2 D" }, { "3B7B1800000031C06477E91000019000", "Oberthur Card Systems: Cosmo 64 RSA V5.4 (ISK Key Set: 404142 .. 4E4F)" }, { "3B7B1800000031C06490E31100829000", "oberthur card in the middle http://postarca.posta.si/downloadfile.aspx?fileid=16918 (eID)\nhttp://postarca.posta.si/" }, { "3B7B1800000031C064C6FC1000079000", "Sberbank of the RUSSIAN federation" }, { "3B7B1800000031E85427E60000019000", "Oberthur ID-One COSMO 64k v.5" }, - { "3B7B180000806201545646696E454944", "FineID identity card for organizations\nhttp://fineid.fi/default.aspx?id=491\nhttp://www.opensc-project.org/opensc/wiki/FinnishEid" }, - { "3B7B94000080621[12]515646696E454944", "Finnish Electronic ID card (fineid card www.fineid.fi)" }, + { "3B7B180000806201545646696E454944", "FineID identity card for organizations\nhttps://dvv.fi/en/organisation-cards\nhttps://github.com/OpenSC/OpenSC/wiki/Finnish-FINEID" }, + { "3B7B94000080621[12]515646696E454944", "Finnish Electronic ID card for persons (Former FINeID card)\nhttps://dvv.fi/en/citizen-certificate-and-electronic-identity" }, { "3B7B9400008065521607865383009000", "Truemove H Thailand (Telecommunication)\nhttp://truemoveh.truecorp.co.th/" }, { "3B7B9400008065B083010[13]7483009000", "Gemplus GemXpresso Pro R3 (E64 PK)" }, { "3B7B9500008065B08301047483009000", "Gemplus GemXpresso Pro 64K R3 FIPS v2" }, @@ -1341,8 +1426,9 @@ const static atr_t AtrTable[] = { { "3B7D94000080318065B08311C0A983009000", "GemXpresso R4 72K\nNational ID card of Republic of Lithuania (2007-2012)" }, { "3B7D95000080318065B08302047E83009000", "Gemalto's Classic TPC HM CC Mifare 1K White PVC\n(Old name GemSafeXpresso 64K)" }, { "3B7D95000080318065B08311....83009000", "Portuguese ID Card (eID)\nhttp://www.cartaodecidadao.pt/" }, + { "3B7D96000080318065B07549170F83009000", "DoD CAC card issued ~October 2020, Gemalto TOP DL V2.1 144K, Geneva Conventions Identification Card (PKI)\nhttps://www.cac.mil/" }, { "3B7D96000080318065B0830201F383009000", "Gemalto IDClassic 340" }, - { "3B7D96000080318065B0831100C883009000", "GEMALTO Clasic TPC IM CC" }, + { "3B7D96000080318065B0831100C883009000", "GEMALTO Classic TPC IM CC" }, { "3B7D96000080318065B0831111AC83009000", "GEMALTO WM GX4 72 DHS TSA" }, { "3B7D96000080318065B0831111E583009000", "Gemalto TOP DL v2 StdR\neCPF (Cadastro de Pessoas Fisicas) from Imprensa Oficial do Brasil\nIdentidade digital (e-CPF) from Caixa\nhttp://www.caixa.gov.br/\nIngenico Sign/Kit Telium TETRA (Developer kit signature card)\nhttps://developer.ingenico.com/hc/en-gb\nBrazilian 'e-CNPJ' card, issued by Certisign (Safesign)" }, { "3B7D96000080318065B0831113AC83009000", "CAC card (GEMALTO GCX4 72K DI)" }, @@ -1375,7 +1461,7 @@ const static atr_t AtrTable[] = { { "3B7E9400008025A00000002856801021000114", "CryptoPlus ProID, students ISIC card at University of Zilina, Slovakia\nTOP GX4 72k contact chip using JavaCard v2.2.1. and GlobalPlatform 2.1.1" }, { "3B7E9400008025A00000002856801024000111", "'OpenCard' - card issued by Prague local authority\ndual card: chip used for electronic certificates" }, { "3B7E9400008025D20310010056000000010100", "Personal identity card (ID card) of Czech Republic" }, - { "3B7E9400008025D20310010056000000020200", "Official Czech Republic identity card issued since 7/2018 (eID)\nhttps://www.eidentita.cz/" }, + { "3B7E9400008025D20310010056000000020200", "Official Czech Republic identity card issued since 7/2018 (eID)\nhttps://info.identitaobcana.cz/eop/" }, { "3B7E94000080318066475091450313830F9000", "JTOP Trusted Logic" }, { "3B7E940000803180664750A4450511830F9000", "JTOP Trusted Logic" }, { "3B7E9500008031807334118082900000000000", "IAS (Identification, Authentication, and electronic Signature) Premium, profil DGME from Gemalto" }, @@ -1410,17 +1496,19 @@ const static atr_t AtrTable[] = { { "3B7F1300008031C0520B71640566983683839000", "OuroCard VISA International - Banco do Brasil" }, { "3B7F1300008031C0520BBB640566983683839000", "VISA OUROCARD Banco do Brasil S.A." }, { "3B7F1300008031C0520D1E640566946183839000", "Universitat Politecnica de Valencia ID Visa Electron Card\nhttp://www.upv.es" }, - { "3B7F1300008031C0520DEA640566946183839000", "Universitat Rovira i Virgili Identification Card\nThis card enables his/her propietary to sign documents and to access to rooms, laboratories and classes." }, + { "3B7F1300008031C0520DEA640566946183839000", "Universitat Rovira i Virgili Identification Card\nThis card enables his/her proprietary to sign documents and to access to rooms, laboratories and classes." }, { "3B7F1300008031C0520ED4640566966183839000", "BBVA Blue Card (VISA)\nwww.bluebbva.com" }, { "3B7F1300008031C05210496402B3027083839000", "Bank of Brazil (Bank)\nhttp://www.bb.com.br/pbb/pagina-inicial" }, { "3B7F1300008031C05210686402B3027083839000", "Santander VISA (Brazil) (Bank)" }, { "3B7F1300008031C05210A46402B3027083839000", "EMV Smartcard Reader (Other)\nSaraiva (Banco do Brasil) - VISA (Bank)\nhttps://www.bb.com.br/pbb/pagina-inicial/voce/produtos-e-servicos/cartoes#/" }, { "3B7F1300008031C052112F640569937083839000", "Banco do Brasil (Bank)\nhttp://www.bb.com.br/" }, { "3B7F1300008031C05212936402B3027083839000", "Visa Infinite issued by Banco do Brasil (www.bb.com.br)\nManufactured by Giesecke & Devrient (G&D www.gi-de.com)" }, + { "3B7F1300008031C05213076402B3023783839000", "Banco do Brasil ELO Debito (Brazil) (Bank)" }, { "3B7F1300008031C052130B6402B3023783839000", "Visa Ourocard Platinum from Banco do Brasil" }, { "3B7F1300008031C0521366640566983683839000", "VISA Platinum from Banco do Brasil" }, { "3B7F1300008031C05214D5640566966183839000", "Visa Electron Debit Card issued by Spain Caja Madrid (www.cajamadrid.es)" }, { "3B7F1300008031C0521554640566983683839000", "VISA Card from Banc Sabadell in Spain" }, + { "3B7F1300008031C0521563640200647183839000", "VISA CREDIT (Bank)" }, { "3B7F1300008031C05215B8640200647183839000", "Debit classic card banorte 'banco mercantilmdel norte' (Bank)\nhttps://www.banorte.com/" }, { "3B7F1300008031C05215C7640569937083839000", "Brazil Bank Debit Cart - Visa Electron (Banco do Brasil) (Bank)" }, { "3B7F1300008031C05215CB640566966183839000", "Bank, Spanish group BANKIA (www.bankia.es)\nVisa, Servired\nManufactured by Saetic\nhttp://www.saetic.es/" }, @@ -1488,13 +1576,16 @@ const static atr_t AtrTable[] = { { "3B7F960000006A444E4965200101550421039000", "DNI electronico (Spanish electronic ID card) (eID)\nhttp://www.dnielectronico.es" }, { "3B7F960000006A444E4965200177980311039000", "Spanish ID card (DNIe) (eID)\nwww.dnielectronico.es/" }, { "3B7F960000006A464E4D54030411430430039000", "CERES Spanish SmartCard from the 'Fabrica Nacional de Moneda y Timbre' (FNMT) (eID)\nhttp://www.cert.fnmt.es/" }, + { "3B7F960000006A54494633000101550422039000", "DNIe Spain (eID)\nhttps://www.dnielectronico.es/PortalDNIe/" }, { "3B7F96000000B854311007900000000000000000", "Mastercard (Bank)" }, { "3B7F96000000B854311107900000000000000000", "STPay-Gold (JavaCard)\nhttp://www.st.com/en/secure-mcus/stpay-gold.html" }, { "3B7F9600003100DE525001001500000000000000", "VALES (Bank)" }, + { "3B7F9600008031805843657274756D3031829000", "Certum Electronic Seal (PKI)" }, { "3B7F9600008031806555850300EF124140829000", "Civil ID (eID)" }, { "3B7F96000080318065B0842327E5120FFE829000", "Gemalto IDPrime MD 3810 dual interface smartcard ISO 7816, ISO 14443 and NFC (PKI)\nhttp://www.smartcardfocus.com/shop/ilp/id~672/gemalto-idprime-md-3810-dual-interface-smartcard/p/index.shtml" }, { "3B7F96000080318065B084413DF612004C829000", "Serasa Experian (Other)" }, { "3B7F96000080318065B084413DF6120FFE829000", "Gemalto IDPrime MD" }, + { "3B7F96000080318065B084413DF612FFFE829000", "THALES IDCore 30 B (JavaCard)\nhttps://cpl.thalesgroup.com/access-management/idcore-java-card" }, { "3B7F96000080318065B084534C0F12037B829000", "Serbian International Student Identity Card (ISIC) (eID)\nhttps://www.gpa.rs/kartice" }, { "3B7F96000080318065B0846160FB120FFD829000", "IDPrime 930/3930 FIPS Level 2 or Level 3 (T=0 CT=96) (BAI1, BAI2, BAI3, BAI5, BAI7) (PKI)" }, { "3B7F96000080318065B0850201F3120FFF829000", "Swedish National Identity Card (eID)\nhttps://polisen.se/tjanster-tillstand/pass-och-nationellt-id-kort/" }, @@ -1510,18 +1601,25 @@ const static atr_t AtrTable[] = { { "3B7F96000080318065B085040120120FFF829000", "Belgian eID v1.8 (eID)\nhttps://github.com/Fedict/eid-mw" }, { "3B7F96000080318065B085040120F20001829000", "Health Insurance Institute of Slovenia - Health Insurance Card Gen. 3 (HealthCare)" }, { "3B7F96000080318065B085040120F20002829000", "Health Insurance Institute of Slovenia - Professional Card Gen. 3 (HealthCare)" }, + { "3B7F96000080318065B085050011120FFF829000", "LuxTrust card (Luxembourg qualified electronic signature / authentication system) (Other)\nhttps://www.luxtrust.com/en/professionals/smartcard" }, + { "3B7F96000080318065B0855956FB120268829000", "qualified certificate (eID)\nhttps://www.elektronicznypodpis.pl/en/offer/qualified-certificates/" }, + { "3B7F96000080318065B0855956FB1202C1829000", "Gemalto USB (eID)" }, { "3B7F96000080318065B0855956FB12FFFE829000", "IDCORE 3140 (JavaCard)" }, { "3B7F9600008031B865B0850300EF1200F6829000", "Finnish identity card (eID)\nhttp://vrk.fi/en/citizen-certificate" }, { "3B7F9600008031B865B08504021B1200F6829000", "Finnish ID-card v5.0(?) (eID)\nhttps://dvv.fi/en/fineid-specifications" }, + { "3B7F9600008031B865B085050011122460829000", "wasim finnish id (eID)" }, { "3B7F960000EA5CBDF07AEB6541894B0400000000", "Gemalto TOP IM GX4 (Other)" }, + { "3B7F960080318065B084413DF612004C829000", "Black (PKI)\nhttps://certificadodigital.imprensaoficial.com.br" }, { "3B7F9700000031C173C821106457533430009000", "PNC Bank VISA card (Bank)" }, + { "3B7F97000080318065B08466693912FFFE829000", "IDCore3230 build 6.8, test APDU applet (JavaCard)" }, { "3B7F980000805A070404000102028458F2829000", "Mobili'carte (Angouleme mobility services card) (Transport)\nhttp://www.mobilite-grandangouleme.fr/" }, { "3B800181", "NXP Semiconductors VNG OpenPGP Card (Other)\nhttps://www.vng.com.vn/" }, - { "3B80800101", "ISO 14443 Type B without historical bytes\nElectronic Passport\nSpanish passport (2012)\nCanadian Passport\nVenez_Prox" }, + { "3B801FC78031E073FE211163407163830790009A", "Intertelecom UA RUIM card (Telecommunication)\nhttps://www.intertelecom.ua/" }, + { "3B80800101", "ISO 14443 Type B without historical bytes\nElectronic Passport\nSpanish passport (2012)\nCanadian Passport\nVenez_Prox\nCarta nazionale dei servizi\nhttps://www.agid.gov.it/it/piattaforme/carta-nazionale-servizi" }, { "3B810020", "Old MobilCOM GSM (Telecom D1) (Telecommunication)" }, { "3B81010080", "Rompetrol Romania Fill&Go Fuel Card (Other)" }, { "3B811F00CC52", "eToken R2 2242" }, - { "3B8180018080", "RFID - ISO 14443 Type A - NXP DESFire or DESFire EV1 or EV2\n'Reiner LoginCard' (or 'OWOK', how they name it) - they have been distributed by a german computer magazine ('Computer BILD')\nhttps://cardlogin.reiner-sct.com/\nBelgium A-kaart (Antwerp citycard)\nOyster card - Transport for London (second-gen 'D')\nhttps://en.wikipedia.org/wiki/Oyster_card\nKaba Legic Advant 4k\nSydney Opal card public transport ticket (Transport)\nhttps://www.opal.com.au\nTH Koln (University of Applied Sciences Cologne) - Student Identity Card\nhttps://www.th-koeln.de/en/academics/multica_5893.php\nGerman red cross blood donation service\nhttp://www.blutspende-nordost.de/\nGreater Toronto/Hamilton/Ottawa PRESTO contactless fare card\nhttp://en.wikipedia.org/wiki/Presto_card\nElectic vehicle charging card of the EMSP EnBW Energie Baden-Wurttemberg AG, Tarif ADAC e-Charge, Germany" }, + { "3B8180018080", "RFID - ISO 14443 Type A - NXP DESFire or DESFire EV1 or EV2\n'Reiner LoginCard' (or 'OWOK', how they name it) - they have been distributed by a german computer magazine ('Computer BILD')\nhttps://cardlogin.reiner-sct.com/\nBelgium A-kaart (Antwerp citycard)\nOyster card - Transport for London (second-gen 'D')\nhttps://en.wikipedia.org/wiki/Oyster_card\nKaba Legic Advant 4k\nSydney Opal card public transport ticket (Transport)\nhttps://www.opal.com.au\nTH Koln (University of Applied Sciences Cologne) - Student Identity Card\nhttps://www.th-koeln.de/en/academics/multica_5893.php\nGerman red cross blood donation service\nhttp://www.blutspende-nordost.de/\nGreater Toronto/Hamilton/Ottawa PRESTO contactless fare card\nhttp://en.wikipedia.org/wiki/Presto_card\nElectric vehicle charging card of the EMSP EnBW Energie Baden-Wurttemberg AG, Tarif ADAC e-Charge, Germany" }, { "3B8180018181", "Ticket (Transport)" }, { "3B82005518", "GSM SIM of TIM ITalian mobile company" }, { "3B82005519", "GSM card 'Hi' (KPN brand)" }, @@ -1575,9 +1673,12 @@ const static atr_t AtrTable[] = { { "3B8580012063CBAD0021", "NUMBER26 MasterCard (Bank)\nhttps://number26.eu" }, { "3B8580012063CBAD2001", "KBC Ireland MasterCard Debit Card (Bank)\nhttp://www.kbc.ie/" }, { "3B8580012063CBAD80A1", "VISA Caisse d'Epargne (Bank)\nVISA BNP Paribas (NFC) (Bank)" }, - { "3B8580012063CBB7201B", "Halifax Clarity Mastercard (Bank)" }, + { "3B8580012063CBB7003B", "Visa card issued by OTP Bank (Hungary) (Bank)\nhttps://www.otpbank.hu/portal/en/Retail/Bankcards" }, + { "3B8580012063CBB7201B", "Halifax Clarity Mastercard (Bank)\nCredit Agricole Prepaid - Mastercard" }, { "3B8580012063CBB780BB", "First Direct Debit (Bank)" }, { "3B8580012063CBB880B4", "VISA Cleo LCL (Bank)\nhttps://particuliers.lcl.fr/quotidien/cartes/carte-visa-cleo/" }, + { "3B8580012063CBC6004A", "Gold Mastercard Credit Agricole (Bank)" }, + { "3B858001300101301014", "German public health insurance card (,,Gesundheitskarte'), 2.1 generation (G2.1), issuer Techniker Krankenkasse (HealthCare) (HealthCare)\nhttps://www.gematik.de/telematikinfrastruktur/egk" }, { "3B858001300101303034", "German Health Insurance Card 'elektronische Gesundheitskarte' (eGK) / European Health Insurance Card (EHIC) (HealthCare)\nhttps://fachportal.gematik.de/karten-und-identitaeten/elektronische-gesundheitskarte" }, { "3B8580014A4D52544441", "JMRTD - Java Machine Readable Travel Document (ePassport emulator\nhttp://jmrtd.org/)" }, { "3B8580014D7945494478", "MyEID" }, @@ -1588,21 +1689,27 @@ const static atr_t AtrTable[] = { { "3B858001A000000000A4", "Italian Passport (passport)" }, { "3B85C0FA216380630101051B", "Public Distribution System\nhttp://cg.nic.in/pdsonline/corepds/" }, { "3B8640206801010204AC", "Activcard Gold, SchlumbergerSema Cryptoflex 8k" }, + { "3B8640FA808101520301", "SCOSTA (JavaCard)" }, { "3B86800100049AEE00CABD", "ASK CPL 528" }, { "3B86800103020211000015", "cash bee card. transportation and payment in south korea (seoul) (Transport)\nhttp://cashbee.co.kr" }, { "3B86800106757781028000", "NXP Mifare DESFire EV1 8K / MF3ICD81\n'OpenCard' - card issued by Prague local authority\ndual card: RFID (1k Mirfare) used for parkimeters and as public traffic ticket" }, { "3B86800106757781028F00", "Desfire (eID)" }, { "3B8680013930433032317E", "Chase Freedom VISA card" }, + { "3B86800143686970313733", "PostFinance Switzerland (Bank)\nhttp://www.postfinance.ch" }, { "3B86800144492030324D65", "Lufthansa Miles & More Gold MasterCard PayPass\nRaiffeizen Bank, Russia, MasterCard paypass card" }, { "3B8680014449203032567E", "DKB VISA paywave (Bank)\nhttp://www.visaeurope.com/en/cardholders/visa_paywave.aspx" }, { "3B8680014A434F50333012", "Mifare ProX T=CL" }, { "3B8680014A434F50333113", "JCOP BIO 31 Contactless Card" }, { "3B8680014B4F4E4112203E", "Citibank Russia, Mastercard paypass" }, + { "3B8680014B4F4E4113213E", "Vivid Money Visa Debit (Bank)\nhttps://vivid.money" }, { "3B8680014B4F4E41141109", "Mastercard paypass enabled credit card" }, { "3B8680015741524930310B", "Gusto Karta (Bank)\nhttps://www.gustokarta.cz" }, { "3B86800157575061737336", "WWPass Passkey (eID)\nhttps://www.wwpass.com/passkey" }, + { "3B8680018031C15211182C", "IDEMIA Cosmo V8.0 with a PIV applet (contactless) (PKI)" }, + { "3B8680018031C152411A7E", "IDEMIA Cosmo V8.1 with a PIV applet (contactless) (PKI)" }, { "3B86800180540410010FC9", "Nickel.eu prepaid account (Bank)\nhttps://nickel.eu" }, { "3B868001C1052F2F01BC7E", "Contactless interface to St. Petersburg unified card, Russia (Edinaia karta peterburzhtsa) (Other)\nhttps://ekp.spb.ru/" }, + { "3B868001F04938DE0C3064", "blyt mtrw (Transport)\nhttps://ezpay.ir/" }, { "3B868131703445504120454B08", "Austrian Quick E-purse 'Einreichkarte' (transfer card)\nhttp://www.quick.at/" }, { "3B8780014D49464152452B39", "PEKA CARD (JavaCard)" }, { "3B8780014D525444312E3026", "Russian Foreign Passport (passport)" }, @@ -1619,21 +1726,26 @@ const static atr_t AtrTable[] = { { "3B8780017743495002000128", "CIPURSE (transport)\nhttp://www.osptalliance.org/" }, { "3B8780018031807396128040", "Public transport: VRS Verkehrsverbund Rhein-Sieg (Germany, North_Rhine-Westphalia)\nhttp://www.vrsinfo.de/englisch/the-vrs/vrs-about-us.html" }, { "3B878001803198738401E039", "Austrian Passport" }, + { "3B878001803198738601E03B", "German passport (passport)" }, { "3B8780018031B8738401E019", "Personalausweis (German Identity Card) (eID)" }, - { "3B8780018031B973842160B8", "Hungarian eID (2016) (eID)\nhttp://kekkh.gov.hu/Eszemelyi/" }, + { "3B8780018031B8738601E01B", "Personalausweis (German Identity Card) (eID)\nhttps://www.personalausweisportal.de/" }, + { "3B8780018031B973842160B8", "Hungarian eID (2016) (eID)\nhttps://eszemelyi.hu/en/" }, { "3B8780018031C073D620C032", "RFID GeldKarte (girogo)" }, { "3B8780018031C073D621C033", "Sparkasse Hannover - German contactless GeldKarte (RFID, NFC, girogo)\nhttps://www.geldkarte.de/_www/en/pub/geldkarte/service_navigation/about_us.php" }, { "3B8780018031C073D631C023", "girocard contactless (Bank)\nhttps://www.girocard.eu/english.html" }, + { "3B8780018073842140900080", "Queensland drivers licence (eID)\nhttps://www.qld.gov.au/transport/licensing/driver-licensing" }, { "3B878001C10521300077C165", "Mifare Plus (Other)\nhttp://www.Mifare.net" }, { "3B878001C1052F2F0035C730", "MiFare Plus 2K 'S' (Other)" }, { "3B878001C1052F2F01BCD6A9", "RFID - ISO 14443 Type A - NXP Mifare Plus" }, { "3B87813140434D4643203133316F", "Telekom Paycard" }, { "3B88010003050668D06080D1", "125 Khz HID Proximity card (eID)\nhttps://www.hidglobal.com/product-display/cards-and-credentials/hid-proximity" }, { "3B88014B415A544F4B454E82", "Kaztoken (eID)\nhttp://kaztoken.kz/" }, + { "3B88018056536F6C6F203272", "SoloKeys Solo 2 Security Key (PKI)\nhttps://github.com/solokeys/solo2" }, { "3B888001000000000000000009", "Personalausweis (German Identity Card) (eID)" }, { "3B8880010000000000419100D9", "EffiTIC (Transport)\nwww.effitic.com" }, { "3B888001000000000071710009", "OPUS Public Transport card (Montreal, Quebec, Canada) - Oberthur based\nhttp://carteopus.info/\nACTV (Italy) transport card (RFID)" }, { "3B8880010000000000718100F9", "Navigo Decouverte (RFID interface) (Transport)" }, + { "3B8880010000000000817000F8", "Qantas Frequent Flyer Loyalty Card - Contactless (Loyalty)" }, { "3B8880010000000000817700FF", "KBC Maestro card (Bank)" }, { "3B88800100000000008187000F", "ING Bank Card (Bank)\nhttps://www.ing.nl/particulier/betalen/passen/betaalpas/contactloos-betalen-met-uw-betaalpas/index.html" }, { "3B888001000000000081911009", "Trenitalia (Italy) fidelity card 'CartaFreccia' (RFID)" }, @@ -1656,8 +1768,10 @@ const static atr_t AtrTable[] = { { "3B888001000005E0B381A1007F", "Japanese JPKI card (aka JINC card) (eID)\nhttps://github.com/jpki/myna" }, { "3B888001000014E0B38191005E", "'JUKICARD', the Basic Resident Registration Card in Japan (eID)" }, { "3B888001000041E0B381A1003B", "ID card issued by Japan government (eID)\nhttps://www.kojinbango-card.go.jp/mynumber/index.html" }, + { "3B8880010000C9047781730041", "D-TRUST Card 4.1, qualified signature card (eID)\nhttps://www.d-trust.net" }, { "3B8880010073C8400000900062", "NXP JCOP 31 V2.2 36K - RFID I/F\nBarclaycard Visa Wave & Pay - RFID I/F\nCIBC Visa" }, { "3B8880010073C8401300900071", "Nokia 6131 NFC phone\nhttp://wiki.forum.nokia.com/index.php/Nokia_6131_NFC_-_FAQs\nGiesecke & Devrient's (G&D) Sm@rtCafe Expert 3.1\nAmex Bank of Canada American Express\nTD Canada Trust Visa\nTD Canada Trust Access Card (Visa Debit)" }, + { "3B88800100883C1F77819500C1", "Polish Passport (passport)" }, { "3B88800100DDA611F771850060", " 'Pyrelis' card, PAU (France) public transport card. (Calypso card). (Transport)\n http://www.reseau-idelis.com/930-Billettique-IDELIS.html" }, { "3B888001040200200071C140DF", "Seoul Citypass+ T-Money Card" }, { "3B8880011000000000817000E8", "Tap&Go MasterCard Sim Card (Bank)\nhttps://www.tapngo.com.hk" }, @@ -1671,7 +1785,8 @@ const static atr_t AtrTable[] = { { "3B8880011CF0E111F771850016", "CEPAS Card (Concession card issued by Land Transport Authority Singapore) (Transport)" }, { "3B88800130415654000000077D", "Avtor ID Key (eID)\nhttp://avtor.ua/" }, { "3B888001304C47127783D50001", "elesec - TCOS 3.0 Signature Card (eID)\nhttps://www.telesec.de/de/tcos/support/downloadbereich/category/28-leistungsbeschreibung" }, - { "3B88800130ABAB017781B70079", "Italian healtcare card (TS) National Service Card (CNS) (HealthCare)" }, + { "3B88800130ABAB017781B70079", "Italian healthcare card (TS) National Service Card (CNS) (HealthCare)" }, + { "3B888001310109000000000030", "Indonesian Electronic Driving License (e-SIM) (Other)\nhttps://polri.go.id/sim, https://www.digitalkorlantas.id/sim/" }, { "3B88800131CCCC017781C1000E", "Ideal v 1.4 (Transport)" }, { "3B88800131CCCC017783A1006C", "Chile RUT (eID)" }, { "3B88800131F35E110081950090", "Venez_Omnikey" }, @@ -1681,6 +1796,7 @@ const static atr_t AtrTable[] = { { "3B8880014241454944312E316C", "BiH eID card (eID)" }, { "3B88800143433169AA200000DB", "PostFinance Switzerland (Bank)\nhttp://www.postfinance.ch" }, { "3B888001434C6169726520360F", "VISA credit card with NFC payment function (Bank)\nhttp://www.visa.ca/en/personal/visa-paywave/index.jsp" }, + { "3B8880014431314352322E3070", "javacard.pro card (JavaCard)\nhttps://javacard.pro/" }, { "3B88800146494445534D4F3167", "Fidesmo card (install or uninstall JavaCard applets or Mifare-based services on the field, using the Fidesmo Android App. (JavaCard))\nhttps://developer.fidesmo.com/" }, { "3B8880014A434F50763234315E", "RFID - ISO 14443 Type A - NXP JCOP\nNXP J3A081 JavaCard (contactless interface)" }, { "3B88800150FFFF117783D50069", "Gematik TSYS eHBA G2.1 (HealthCare)" }, @@ -1694,19 +1810,23 @@ const static atr_t AtrTable[] = { { "3B888001990200D10304220167", "Debit card (Bank)" }, { "3B888001C91207520200811014", "electronic Tickes from the german Transport Association VGN (Verkehrsgemeinschaft Niederrhein)" }, { "3B888001D10386050080800058", "Resident Identity Card of People Republic of China (Second Generation with RF Feature) (eID)\nhttp://www.gov.cn/banshi/2005-08/02/content_19457.htm" }, + { "3B888001E1686C17778395009A", "Algerian ID card (eID)" }, { "3B888001E1E1F35E1377830043", "ePerso - German ID card (issued 2011) (eID)" }, + { "3B888001E1F35E113381970071", "DK passport (passport)" }, { "3B888001E1F35E117381A50003", "US passport (2007)" }, - { "3B888001E1F35E117781950037", "Belgian Passport (passport)" }, + { "3B888001E1F35E117781950037", "Belgian Passport (passport)\nFinnish Passport (passport)" }, { "3B888001E1F35E117781A10003", "Spanish ID know as DNIe (eID)\nhttp://www.dnielectronico.es" }, { "3B888001E1F35E117781A50007", "US passport (2012)" }, { "3B888001E1F35E117781C72045", "French passport (2007-2008)" }, { "3B888001E1F35E117781E10043", "DNIE Spain (eID) Contactless (eID)\nhttp://www.dnielectronico.es/PortalDNIe/" }, + { "3B888001E1F35E117781E16023", "DNIe v4 (Spanish eID) - contactless interface (PC/SC wrapped 14443 Type B ATR) (eID)\nhttps://www.dnielectronico.es" }, { "3B888001E1F35E1177830000A0", "Residence permit (eID)\nhttp://de.wikipedia.org/wiki/Aufenthaltstitel" }, { "3B888001E1F35E117783950035", "French biometric ePassport (issued in 2012)" }, { "3B888001E1F35E117783D50075", "German Passport (ePass) (issued June 2009)" }, { "3B888001E1F35E117783D70077", "Spanish Electronic Passport 2.0 (passport)\nhttps://www.dnielectronico.es/PortalDNIe/PRF1_Cons02.action?pag=REF_1080&id_menu=56" }, { "3B888001E1F35E117787950031", "Dutch Government Pilot E-rijbewijs (eID)\nhttps://www.digid.nl/over-digid/kaartlezer-pilot" }, { "3B888001E1F35E1180879500C6", "Irish Driver Learner Permit (Other)" }, + { "3B888001E1F35E11B381A500C3", "Australian Passport (passport)\nhttps://www.passports.gov.au/" }, { "3B888001E1F35E1377830000A2", "ePerso - German ID card (issued 2013)" }, { "3B888001E1F35E137783D50077", "ePerso - German ID card (issued 2011)" }, { "3B88813120550057696E4361726429", "SmartCard for Windows 1.0" }, @@ -1717,6 +1837,7 @@ const static atr_t AtrTable[] = { { "3B894014474732364D35323830", "GSM-SIM e-plus (1800MHz)" }, { "3B898001006404150102009000EE", "German Passport (issued Apr 2007)" }, { "3B898001006404280302009000D1", "TCOS 3.0 release 2 on Philips P5CD080 (PKI)\nhttps://www.digchip.com/datasheets/parts/datasheet/1019/P5CD080.php" }, + { "3B898001024D4B4D574B534B5411", "Polish National ID (eID)\nhttps://www.gov.pl/web/e-dowod/" }, { "3B8980013131313054434F535052", "Seven-Eleven Value Card / Smart Purse - Thailand (Contactless) (Other)\nhttp://www.7eleven.co.th/about7card.php" }, { "3B8980013233324353435333363E", "CSCS Smartcard (passport)\nhttp://getgosmart.io" }, { "3B89800141434F534A763130311A", "ACS ACOSJ (Combi) (JavaCard)\nhttp://www.acs.com.hk/en/products/405/acosj-java-card-combi/" }, @@ -1737,13 +1858,15 @@ const static atr_t AtrTable[] = { { "3B89800150565F4A33413034305D", "Java Card J3A040 (JavaCard)\nhttp://smartcardsource.com/contents/en-ca/d9_JCOP-NXP-cards.html" }, { "3B898001535049564B4559373044", "Taglio PIVkey C980 smart card (Other)\nhttps://pivkey.com/" }, { "3B89800153504B323544499000DA", "SPK 2.5 D1" }, + { "3B89800153776973735061737374", "SwissPass - key to mobility and leisure in Switzerland (Transport)\nhttps://www.swisspass.ch\nhttps://www.allianceswisspass.ch/de/informationen-ov-nutzende/SwissPass" }, { "3B89800166494658425332476F32", "Blockchain Security 2Go (JavaCard)\nhttps://github.com/Infineon/Blockchain" }, { "3B898001664A41434F53322E3016", "MasterCard, Credit Card by TargoBank, Germany -- (Bank)" }, - { "3B898001665257453250524F4D1C", "NFC enabled SIM card. (Telecommunication)\nElectic vehicle charging card of the EMSP Chargepoint" }, + { "3B898001665257453250524F4D1C", "NFC enabled SIM card. (Telecommunication)\nElectric vehicle charging card of the EMSP Chargepoint" }, { "3B8980016653434F4E454432307C", "Alioth 98886 chip (Bank)" }, { "3B8980018057454D5650524F438F", "BNP Paribas Visa Classic Card (NFC) (Bank)\nhttps://mabanque.bnpparibas/fr/notre-offre/comptes-cartes-et-services/cartes-et-moyens-de-paiement/decouvrir-toutes-les-cartes/carte-visa-classic" }, { "3B89800180574A4D5650726F33F0", "PayPal UK MasterCard Contacless" }, { "3B89800180574A4D5676352E30D3", "PayPal Access Business MasterCard (contactless) (Bank)\nCoinbase Card, Visa Debit (Paysafe / TCT FCU) (Bank)\nhttps://coinbase.com/card" }, + { "3B8980018064160401868290006B", "LUKB (Bank)\nhttps://www.lukb.ch" }, { "3B8980018064160402828290006C", "Maestro card (from Mastercard) used by BCGE (switzerland) bank (Bank)" }, { "3B89800180670412B0030501024C", "Austrian Passport" }, { "3B8A0091010016000116010096", "GSM-SIM T-Mobil D1 (900MHz)" }, @@ -1761,13 +1884,20 @@ const static atr_t AtrTable[] = { { "3B8A80010031C173C8400000900090", "NXP PN65o's Internal Secure Element in card emulation mode. (Other)" }, { "3B8A80010064055C02033180900016", "T-System Contactless Netkey Card" }, { "3B8A8001006405760203318090003C", "T-System Contactless TCOS Min" }, + { "3B8A80013037393134315F3030316F", "Electronic Citizen Identity Card (e-ID Card) (eID)\nhttps://www.e-ktp.com/" }, + { "3B8A800143323330302D4649505368", "Crescendo 2300 FIPS (contactless interface) (PKI)" }, { "3B8A80014A3341303831563234316B", "NXP JCOP CJ3A081 (NFC) (JavaCard)\nNXP JCOP 80K - J3A081V241" }, + { "3B8A80014A33523138302D32353506", "Cardlogix J3R180 NXP JCOP 4 Java Card 3.0.5 Classic Dual Interface (JavaCard)\nhttps://www.cardlogix.com/product/nxp-jcop-4-java-card-3-0-5-classic/" }, { "3B8A80014A434F503331563233327A", "Snapper New Zealand (JCOP)" }, { "3B8A80014A434F503431563232317F", "JCOP41 Cards (not supported, but recognized by Classic Client)\nNXP JCOP 41 v2.2.1 72k RFID I/F" }, + { "3B8A800150564A434F5033454D5676", "NXP JCOP3 J3H082 Java Card 3.0.4 Dual-Interface (JavaCard) (JavaCard)\nhttps://www.cardlogix.com/product/nxp-jcop3-j3h082-java-card-3-0-4-j3h081-dual-interface/" }, + { "3B8A800150564A434F503453494471", "J3R180 via ifdnfc (JavaCard)" }, + { "3B8A80015345204445534669726557", "NXP-Mifare DESFire EV1 2k (used as a company ID card) (eID)" }, { "3B8A8001534F535345020325010374", "Super SIM X-SIM 16-in-1 (Telecommunication)\nhttps://multi-com.eu/,details,id_pr,14881,key,super-sim-16-in-1-card,smenu,gsm.html" }, { "3B8A8001546963546F6B20332E3008", "Cryptas TicTok v3 (PKI)\nhttps://www.cryptas.com/en/products/tictok-card" }, { "3B8A80018031B8738401E082900006", "German ID Card - Personalausweis" }, { "3B8A80018031F873F741E082900075", "ePerso - German ID card" }, + { "3B8A800180641211111073C0C1801F", "Belarussian ID card (eID)" }, { "3B8A80018065A20101013D72D64397", "Gemplus GemXpresso Pro R3 E32 PK (combi)\nMultiApp ID Dual Citizen EAC 80K CC / IDClassic 3340 (old name: Classic TPC DM) (with MPCOS Applet installed by default) - Contactless Mode with Prox DU" }, { "3B8A80018065A20131013D72D641A5", "Resident Identity Card (eID)" }, { "3B8B005275746F6B656E6C745344E3", "Aktiv Rutoken Lite SD\nhttps://www.rutoken.ru/products/catalogue/info_52.html" }, @@ -1777,12 +1907,13 @@ const static atr_t AtrTable[] = { { "3B8B015275746F6B656E44534254D7", "Rutoken ECP Bluetooth (eID)\nhttp://www.rutoken.ru" }, { "3B8B015275746F6B656E6C697465C2", "Aktiv Rutoken Lite\nhttps://www.rutoken.ru/products/all/rutoken-lite/" }, { "3B8B80010012233F536549440F9000A0", "Estonian Identity Card (eID)\nhttp://id.ee/" }, + { "3B8B80010012428F536549440F900071", "Latvia eID card (eID)\nhttps://www.pmlp.gov.lv/en/identity-card-eid" }, { "3B8B80010031C0640804610000900062", "NUMBER26 Maestro Card (Bank)\nhttps://number26.eu\nAmerican Express credit card for corporations" }, { "3B8B80010031C0640844030400900044", "Credit Card Visa (Other)" }, { "3B8B80010031C0640844031200900052", "Tomorrow Debit Mastercard issued by solarisBank AG (Bank)\nhttps://www.tomorrow.one/" }, { "3B8B80010031C0640844031300900053", "Swedbank ISIC (eID)\nhttps://www.swedbank.ee/private/cards/debit/isic?language=EST" }, { "3B8B80010031C0640844036800900028", "Advanzia / Gebuhrenfrei.com Mastercard Gold (Bank)\nhttps://www.gebuhrenfrei.com/Home/" }, - { "3B8B80010031C0640844037600900036", "American Express Blue Card (Germany) (Bank)" }, + { "3B8B80010031C0640844037600900036", "American Express Blue Card (Germany) (Bank)\nMastercard issued by OTP Bank (Hungary) (Bank)\nhttps://www.otpbank.hu/portal/en/Retail/Bankcards\nCredit Agricole Bank Card - Bancomat / Maestro" }, { "3B8B80010031C06408440393009000D3", "Novacard pp0815-04/20 chip (Bank)" }, { "3B8B80010031C0641F18010000900009", "Student ID card in Poland (eID)" }, { "3B8B80010031C0641F27010000900036", "American Express Platinum (AU Issued) (Bank)" }, @@ -1792,10 +1923,15 @@ const static atr_t AtrTable[] = { { "3B8B80010031C1640840223000900054", "IDEMIA Cosmo v8.1-n (Other)" }, { "3B8B80010031C1640860320600900052", "Banco CTT (Portugal) contactless VISA Debit card (Bank) (Bank)\nhttps://www.bancoctt.pt/home/abrir-conta.html" }, { "3B8B80010031C1640860321200900046", "AMEX Silver Credit (Bank)" }, + { "3B8B80010031C1640860321F0090004B", "Hanseatic Bank Visa Card (Bank)\nhttps://www.hanseaticbank.de/kreditkarte/genialcard" }, { "3B8B80010031C1640860322000900074", "IDEMIA (Other)" }, - { "3B8B80010031C16408923354009000F3", "Italian healtcare card (TS) National Service Card (CNS) (HealthCare)\nhttp://www.salute.gov.it/portale/lea/dettaglioContenutiLea.jsp?lingua=italiano&id=4693&area=Lea&menu=leaEssn" }, + { "3B8B80010031C1640860324200900016", "Westpac Handybank EFTPOS/ATM Card - Contactless (Bank)" }, + { "3B8B80010031C16408923354009000F3", "Italian healthcare card (TS) National Service Card (CNS) (HealthCare)\nhttp://www.salute.gov.it/portale/lea/dettaglioContenutiLea.jsp?lingua=italiano&id=4693&area=Lea&menu=leaEssn" }, + { "3B8B80010031C16408986200009000FC", "ERSTE Bank creditcard (mastercard) (Bank)" }, { "3B8B80010031C1640911213000900007", "SmartMX (Other)" }, + { "3B8B80010031C1640924331E0090000E", "Cumulus Mastercard (Bank)\nhttps://www.migros.ch/cumulus/mastercard" }, { "3B8B80010031C1640937721300900051", "French ID Card 2021 (contactless interface) (eID)\nhttps://ants.gouv.fr/Les-titres/Carte-nationale-d-identite/La-puce-de-la-nouvelle-carte-nationale-d-identite" }, + { "3B8B80010031C1640964413600900014", "Monzo (Bank)\nhttps://monzo.com/" }, { "3B8B800100640411010131800090005A", "German Passport (issued Nov 2006)\nUnited Kingdom e-Passport\nLuxembourg passport (2007)" }, { "3B8B80010B7880820244492030324D1B", "Mastercard Debit issued by Raiffeisen bank in Czech Republic" }, { "3B8B80012085008B030FE09AA0E04052", "Shanghai Public Transportation Card (Transport)\nhttp://www.sptcc.com/" }, @@ -1809,21 +1945,29 @@ const static atr_t AtrTable[] = { { "3B8B8001654B5450304432654B54504C", "NXP smart eID - Indonesia ektp (eID)" }, { "3B8B80018031C06305107F8300900061", "UAB Bank - Prepaid VISA Card (Bank)\nhttps://www.uab.com.mm/cards/" }, { "3B8B80018066475000B8007F8290002E", "Italian Card Identity (eID)\nhttps://www.cartaidentita.interno.gov.it/" }, + { "3B8B80018066475000B80094829000C5", "Italian Electronic Contactless Identity Card v. 3.0 (CIE 3.0) (eID)\nhttps://www.cartaidentita.interno.gov.it/" }, { "3B8B800180F9A00000030800001000C8", "Probably the same as 'JCOP3 SecID P60 CS (JavaCard)' but mated with a contactless Identiv reader (JavaCard)" }, { "3B8B80018688FF6F391E743C200800D3", "Chinese ICBC (bank)" }, { "3B8B81314034534D41525453434F5045316D", "Zeeland kaart (Telecommunication)" }, { "3B8C014D79536D6172744C6F676F6EA5", "EIDVirtual (USB key emulated as a virtual smart card) (PKI)\nhttp://www.mysmartlogon.com/eidvirtual/" }, + { "3B8C01805A4E6974726F6B657920337D", "'Nitrokey 3C NFC' USB authentication and security token (Other)\nhttps://shop.nitrokey.com/shop/product/nk3cn-nitrokey-3c-nfc-148" }, { "3B8C40FA808105520101A00000015001", "Algerian Postal Services Current Account Card (Bank)" }, { "3B8C80010443FD....................", "RFID - NFC Forum tag type 3 (FeliCa)" }, + { "3B8C80010C75778002C1052F2F0035C7B7", "Mifare Plus S (Other)\nhttps://www.nxp.com/products/no-longer-manufactured/mifare-plus-s-2k-4k:MIFARE_PLUS_S_2K_4K" }, { "3B8C80014F5449442894B3C00100900045", "Belgian passport (2009-2013)" }, { "3B8C80014F5449442894F7C00000900000", "French passport (2010-2013)" }, { "3B8C800150........E1F35E117781E1..", "Spanish eID, Documento Nacional de Identidad (DNIe) (eID)\nhttp://www.dnielectronico.es/" }, + { "3B8C800150000000000000000080814519", "a12 (Telecommunication)" }, { "3B8C80015000000000000000009181A0ED", "Belimo VAV-Compact NFC (Other)\nhttp://www.belimo.ch/pdf/e/flyer_nfc_en.pdf" }, { "3B8C8001500005022D0206000000819163", "Local Transport card for Trentino region (Italy) trentino trasporti esercizio (Transport)\nhttp://www.ttesercizio.it/" }, + { "3B8C80015000CA464D00000000808171EC", "Visa Classic (Bank)" }, + { "3B8C8001500197E9BE00000000808171EC", "VISA card from bank LA BANQUE POSTALE (Bank)" }, { "3B8C80015001A5CE19000000008081715E", "VISA Card from Bank BANQUE POPULAIRE (Bank)" }, { "3B8C80015001BA137E00000000B3717138", "Mobib (Brussels public transportation card)" }, + { "3B8C80015001C62E3900000000808171FD", "edenred (Loyalty)" }, { "3B8C80015003A129CF0000000011818108", "rav-kav, Israel transport card (Transport)\nhttp://www.egged.co.il/Article-786-Rav-Kav-Card.aspx" }, { "3B8C80015004463EC3E1F35E117781A1E8", "Spanish ID (eID)" }, + { "3B8C8001500509CE35000000003371A149", "Libertan transport card from Nantes (France), based on Calypso (Transport)\nhttps://www.tan.fr/fr/abonnements-libertan-1" }, { "3B8C80015005A966960000000080817171", "Hello bank! VISA CLASSIC Card (Bank)\nhttp://www.hellobank.fr/" }, { "3B8C80015006DCA8590000000080817106", "VISA Hello bank! (NFC) (Bank)\nhttps://www.hellobank.fr/" }, { "3B8C800150107331B400000000B3717108", "MiMuovo public transport card used in Italian region Emilia Romagna (Transport)" }, @@ -1831,6 +1975,7 @@ const static atr_t AtrTable[] = { { "3B8C80015010B9F98900000000B3717137", "Toulouse (France) city public transport card called TISSEO Pastel (Transport)\nhttps://www.tisseo.fr/les-tarifs/obtenir-une-carte-pastel" }, { "3B8C80015010D632A000000000B37171BA", "MOBIB (STIB) (Transport)\nhttps://www.stib-mivb.be/article.html?_guid=30af0085-2483-3410-5394-a71daf08acd1&l=en" }, { "3B8C800150186188CEE1F35E117781C70E", "French passport (2007-2008)" }, + { "3B8C800150191B6CC20000000000817707", "Rabobank bankcard (dutch) (Bank)\nhttps://www.rabobank.nl/particulieren/betalen/betaalpas" }, { "3B8C80015019E3BB3D00000000008177D7", "ING/Maestro bank card (Bank)\nhttps://www.ing.nl/particulier/betalen/passen/index.html" }, { "3B8C80015024AD64E10000000033819172", "Italian healthcare + public administration card (HealthCare)\nhttp://sistemats1.sanita.finanze.it/wps/portal" }, { "3B8C800150260DBB150000000000718128", "Navigo Card (Transport)\nhttp://www.navigo.fr/" }, @@ -1839,13 +1984,17 @@ const static atr_t AtrTable[] = { { "3B8C8001502724266400000000007181EC", "French Transport Card (Navigo Card) (Transport)\nhttps://fr.wikipedia.org/wiki/Passe_Navigo" }, { "3B8C8001502747D205000000000071811A", "Pass Navigo Decouverte (Transport)\nhttps://fr.wikipedia.org/wiki/Passe_Navigo" }, { "3B8C800150275038CE000000000071812C", "Paris transportation card (Pass Navigo) (Transport)\nhttps://fr.wikipedia.org/wiki/Passe_Navigo" }, + { "3B8C8001502752318100000000007181", "Calypso (Transport)\nhttps://www.innovatron.fr/CalypsoFuncSpecification.pdf" }, { "3B8C80015027B1F76B0000000000717157", "Navigo (public transportation in Ile-de-France), IDF Mobilites (Transport)\nhttps://www.iledefrance-mobilites.fr/l-innovation/navigo/" }, { "3B8C8001502C8D214B23180100778197CD", "Indonesian Driver License" }, + { "3B8C8001502FE0AFA1000000000081776A", "Rabo Wereldpas (Maestro) (Bank)\nhttps://www.rabobank.nl/" }, { "3B8C80015035A45B650000000080817182", "Trenitalia cartafreccia (Transport)\nhttp://www.trenitalia.com/tcom/Cartafreccia" }, { "3B8C800150370B16BD310106017781777C", "Driver License of Indonesia - SIM (Surat Izin Mengemudi) (Transport)" }, { "3B8C800150380EB25B00000000B3717131", "BIP (Biglietto Integrato Piemonte) Card, GTT (Gruppo Trasporti Torinese) (Transport)\nhttp://bip.piemonte.it/" }, { "3B8C8001503A88EC29E1F35E117781E160", "DNI electronico (Spanish electronic ID card) (eID)\nhttp://www.dnielectronico.es" }, { "3B8C8001503A964B0000000000008180BB", "Ventra Transit Pass (Transport)\nhttps://www.ventrachicago.com/how-to/ventra-cards/" }, + { "3B8C8001503BF0330B30ABAB017781B7DE", "Italian health card - national service card (HealthCare)\nhttps://sistemats1.sanita.finanze.it/portale/tessera-sanitaria" }, + { "3B8C800150438EAE7B30ABAB017781B735", "Italian healthcare card (TS) National Service Card (CNS) (HealthCare) - Regione Liguria (HealthCare)" }, { "3B8C80015043E0F5F43101060077817748", "Indonesian Driver License" }, { "3B8C8001504553FFC6E1F35E117781A178", "Electronic DNI (eID)" }, { "3B8C80015046E570EC2318010077819739", "Indonesian Driver License" }, @@ -1853,6 +2002,7 @@ const static atr_t AtrTable[] = { { "3B8C8001504B75AF41E1F35E117781A583", "USA PASSPORT BOOK ICAO (passport)\nhttps://www.icao.int/publications/pages/publication.aspx?docnum=9303" }, { "3B8C8001505381573630AAAA017781D7FE", "Indonesian ektp (eID)" }, { "3B8C8001505467137900000000F781C1B3", "Tessera Sanitaria italian health care card (HealthCare)" }, + { "3B8C8001505C4B71A152745343778183D9", "RUTOKEN ECP 3.0 (PKI)\nhttps://www.rutoken.ru/products/catalogue/id_114.html" }, { "3B8C8001505CF5A94530AAAA017781D708", "Indonesia ektp (eID)" }, { "3B8C800150605F2EFA00000000778191D1", "Residence Permit (Switzerland) (eID)" }, { "3B8C80015064E65B000000000000818085", "Chicago CTA Ventra Transit card\nhttps://www.ventrachicago.com/" }, @@ -1863,9 +2013,12 @@ const static atr_t AtrTable[] = { { "3B8C8001507919600100DDA611F7718535", "Transport Traway Montpellier France (Transport)" }, { "3B8C8001507AA44007231801007781979F", "Indonesian Driver License" }, { "3B8C8001507E0071D20000000000717180", "Unica (= Just one) joined train and public transport card for Italian region Emilia Romagna (evolution of MiMuovo) (Transport)" }, + { "3B8C8001507E0A66C2000000000071718D", "'UNICA' card for the subscription to trains and buses of the Trenitalia TPER company (Transport)\nhttps://www.trenitalia.com/it/treni_regionali/smart-card-unica.html" }, + { "3B8C8001507EDE1E0600883C1F7781952D", "Bahrain CPR (eID)" }, { "3B8C8001507F9C668A0000000000818754", "NFC Mastercard issued by CSOB bank Czech Republic, first 4 digits 5168" }, { "3B8C80015089DCA96E00000000808171BF", "Cartafreccia VISA (Italian Railways Prepaid + Loyalty Card) (Bank)" }, { "3B8C800150915D7129E1F35E117781A1C3", "Spanish eID, Documento Nacional de Identidad (DNIe) (eID)\nhttp://www.dnielectronico.es/" }, + { "3B8C80015092BF3BC0000000000071718B", "Venice Public Transport Card (Transport)\nhttps://www.veneziaunica.it/" }, { "3B8C80015093195E3000000000007171B9", "OPUS STM CANADA (Transport)\nhttp://stm.info/" }, { "3B8C800150933CCC05000000000071713B", "OPUS Card, public transport (subway) of Montreal (Transport)\nhttp://www.stm.info/fr/infos/titres-et-tarifs/carte-opus-et-autres-supports/carte-opus" }, { "3B8C800150A221FAA031CCCC017781C183", "Morpho (eID)\nhttp://www.morpho.com/" }, @@ -1878,6 +2031,7 @@ const static atr_t AtrTable[] = { { "3B8C800150C0E450CA0000000091717172", "Transportation card for Lille (France) (Transport)" }, { "3B8C800150C0EA9CBB00000000B37171E3", "Tisseo (Toulouse) (Transport)\nhttp://www.tisseo.fr/les-tarifs/obtenir-une-carte-pastel" }, { "3B8C800150C0F1DE700000000091717153", "isodep, NfcB (Transport)" }, + { "3B8C800150C10D7D5E00000000B3717101", "Pastel transport card from Toulouse (France), based on Calypso (Transport)\nhttps://www.tisseo.fr/les-tarifs/ou-acheter/la-carte-pastel" }, { "3B8C800150C110BBA9000000009171710F", "Divia card (passport)" }, { "3B8C800150C11BA3F10000000091717144", "Tramway (PKI)" }, { "3B8C800150C14164E3000000000071715A", "Navigo Annuel (France) (Transport)\nhttps://www.iledefrance-mobilites.fr/titres-et-tarifs/detail/forfait-navigo-annuel" }, @@ -1886,6 +2040,9 @@ const static atr_t AtrTable[] = { { "3B8C800150C17B55BA0000000000717108", "Navigo Easy (Paris public transportation) (Transport)\nhttps://parisbytrain.com/navigo-easy/" }, { "3B8C800150C17DA8CA0000000000717183", "Navigo Easy (France) transport card (Transport)\nhttps://www.ratp.fr/titres-et-tarifs/passe-navigo-easy" }, { "3B8C800150C2B936860000000000717196", "Passe Navigo (Transport)\nhttps://www.iledefrance-mobilites.fr/titres-et-tarifs/supports/passe-navigo-decouverte" }, + { "3B8C800150C326AF0C000000000071711B", "Navigo Mobility Paris transport's Card (Transport)\nhttps://www.iledefrance-mobilites.fr/titres-et-tarifs/liste?d=forfaits" }, + { "3B8C800150C41466C30000000000717128", "Navigo easy (Transport)\nhttps://www.iledefrance-mobilites.fr/titres-et-tarifs/supports/passe-navigo-easy" }, + { "3B8C800150C51770F0000000008081717F", "SumUp Limited Apple Pay Virtual Card (Bank)\nhttps://sumup.co.uk" }, { "3B8C800150C7251C5A00000011F781811F", "MOBIB Belgian public transport Card (Transport)\nhttps://mobib.be/fr.html" }, { "3B8C800150CA24513E00000011F781813A", "belgian mobib transportation card (Transport)" }, { "3B8C800150CBFB077E000000008081E1F4", "Samsung Digital Center in Seul Access ID card for guests (eID)" }, @@ -1915,6 +2072,10 @@ const static atr_t AtrTable[] = { { "3B8C80019067464A0100360600000000C7", "A40CR (eID)" }, { "3B8D0180FBA000000397425446590401", "Microsoft Virtual Smart Card 0 (PKI)" }, { "3B8D0180FBA000000397425446590401CF", "Microsoft Virtual Smartcard Provider shared through VMWare Workstation. (Other)\nhttps://technet.microsoft.com/en-us/library/dn593708%28v=ws.11%29.aspx" }, + { "3B8D80010004D0842186640000000000009F", "ABC UnionPay card with QuickPass contactless interface (Bank)" }, + { "3B8D8001003180718E6452D90400829000BB", "AwesomeCard (Bank)" }, + { "3B8D80010031C173C8400052A51000900070", "NXP P71 SmartMX3 (JavaCard)\nhttps://www.nxp.com/products/security-and-authentication/security-controllers/smartmx3-p71d321-secure-and-flexible-microcontroller:SMARTMX3-P71D321" }, + { "3B8D80010031C173C8400052A5100090FF8F", "NXP Smart MX3 P71D321 (JavaCard)" }, { "3B8D80010073C80013644737423700900055", "TD Canada Trust Visa" }, { "3B8D80010073C8001364543741380090004A", "Visa Debit (ING-DiBa) (Bank)\nhttps://www.ing-diba.de/\nVisa Debit Card with NFC payment function (Consorsbank)\nhttps://www.consorsbank.de/" }, { "3B8D80010073C80013645437423700900046", "pay (Bank)" }, @@ -1940,6 +2101,7 @@ const static atr_t AtrTable[] = { { "3B8E8001005131631F5901739F20C0C0900017", "Identity card (eID) Republic of Latvia (eID)\nhttp://www.pmlp.gov.lv/en/home/services/personal-certificates-%28eid%29/\nFrench driving license (eID) (contactless)" }, { "3B8E80010E7833C4020064041501020090FF95", "Spanish Passport" }, { "3B8E8001103877A78091E165D0004200008272", "Czech Republic e-Passport (issued Feb 2009)" }, + { "3B8E8001107833D4020064041101013180FFBD", "Second generation German passport (passport)\nhttps://www.cs.bham.ac.uk/~tpc/Papers/PassportTrace.pdf" }, { "3B8E80011178B3C0024F5449442894B3FFFF0E", "Civilian passport NFC tag (passport)" }, { "3B8E8001137880720280318066B1840C01FF04", "Optelio Contactless Gemalto (Bank)" }, { "3B8E8001137880800246494F4D4B5F3030314E", "MasterCard/PayPass Card issued by Czech FIO Banka a.s. (contactless chip)\nnote the ASCII string 'FIOK_001N' embedded in ATR" }, @@ -1953,7 +2115,9 @@ const static atr_t AtrTable[] = { { "3B8E800180318066B08412016E018300900003", "Contactless Barclaycard Visa\nMyCiti Transport Card MasterCard PayPass (Cape Town, South Africa)" }, { "3B8E800180318066B08416016E018300900007", "Barclaycard Platinum VISA (Bank)" }, { "3B8E800180318066B1840C016E0183009000..", "Gemalto Santander Optelio TUI R7 using Contactless interface" }, - { "3B8E800180318066B1840C016E01830090001C", "UK Lloyds Bank Gold Visa Debit (Contact & Contactless)\nbPay by barclaycard - contactless pre-paid Visa\nBPP Digital pre-paid VISA card (Bank)\nhttps://bpp.com.br/" }, + { "3B8E800180318066B1840C016E01830090001C", "UK Lloyds Bank Gold Visa Debit (Contact & Contactless)\nbPay by barclaycard - contactless pre-paid Visa\nBPP Digital pre-paid VISA card (Bank)\nhttps://bpp.com.br/\nMastercard credit card for Standard Chartered Bank, Pakistan also Mastercard debit card for JS Bank, Pakistan (Bank)" }, + { "3B8E800180318066B1840C016E01830090001C021450", "all transport travel pass (Transport)\nhttp://www.metro.spb.ru/cnblt41.html" }, + { "3B8E800180318066B1C5240100ED83009000F7", "Mastercard (Bank)" }, { "3B8E80018031815448534D3173802140810718", "Smartcard-HSM (Contactless Interface) (PKI)\nhttp://www.cardcontact.de/products/sc-hsm.html" }, { "3B8E80018031815448534D3173802140FFFF9E", "SmartCard-HSM RFID (PKI)\nhttps://www.smartcard-hsm.com/" }, { "3B8E800180919131C06477E30300838290001C", "Belgian Passport (2005)\nThai Passport 2005" }, @@ -1963,19 +2127,34 @@ const static atr_t AtrTable[] = { { "3B8F01415642000000000000000001000000DA", "AVEST-SYSTEMS AvBign (PKI)" }, { "3B8F0145464B000000000000000004000000C2", "EfitKey (PKI)" }, { "3B8F018025A00000005657444B3430300600B7", "SafeNet IKey4000" }, + { "3B8F01805D4E6974726F6B657900000000006A", "Nitrokey Nitrokey 3 Mini (eID)\nhttps://shop.nitrokey.com/shop/product/nk3am-nitrokey-3a-mini-149" }, { "3B8F80010000000000000000000000000000000E", "Tangem card (Other)\nhttps://tangem.com/" }, { "3B8F80010000000000000000000000FF829000E3", "CIE (eID)" }, { "3B8F80010031B86404B0ECC1739401808290000E", "Contactless CPS v3 Card (Carte de Professionnel de Sante)" }, + { "3B8F80010031B86404B0ECC173940180FFFFFFE3", "Card used in public French hospital (Other)" }, + { "3B8F80010031B96409377213738401E0000000AB", "National Identity Card of Slovakia (NFC interface) (eID)\nhttps://en.wikipedia.org/wiki/Slovak_identity_card" }, { "3B8F80010031C173C800106457494943009000B5", "ICC Solutions Card for Certification (Other)\nhttps://www.iccsolutions.com/" }, + { "3B8F80010031C173C8211064414D31300790008A", "master card (Bank)" }, + { "3B8F80010031C173C8211064414D31370790008D", "AirPlus International Mastercard (Bank)\nhttps://www.airplus.com/" }, { "3B8F80010031C173C8211064414D333007900088", "ING-VISA-Card (Bank)\nhttps://www.ing.de/girokonto/karten-bargeld/" }, + { "3B8F80010031C173C8211064414D333107900089", "NAB VISA Debit (Bank)\nhttps://www.nab.com.au/" }, + { "3B8F80010031C173C8211064414D3341079000F9", "Ukrainian International resere bank (ex Sberbak RF) debit card (Bank)\nhttps://www.sbrf.com.ua/" }, + { "3B8F80010031C173C8211064474D34350090008B", "S-Etukortti Visa (Bank)\nhttps://www.s-pankki.fi/fi/s-etukortti-visa" }, { "3B8F80010031C173C8211064474D343700900089", "SpareBank Visa Card, Norway (Bank)" }, + { "3B8F80010031C173C8211064574B31330090009E", "TIM Pay - HYPE (Mastercard debit card) (Bank)\nhttps://www.tim.it/fisso-e-mobile/mobile/servizi/tim-pay" }, { "3B8F80010031C173C8211064574B313400900099", "G&D Sm@rtCafe Card embedded in a wristband (Bank)\nhttps://www.gi-de.com/en/au/mobile-security/industries/financial-institutions/wearables/" }, { "3B8F800100664653051000FF71DF000000000039", "JavaCOS A40 dual interface Java card - 64K (JavaCard)" }, { "3B8F800100B85421000090000000000000000053", "netbank Germany, Mastercard (Bank)\nhttps://netbank.de" }, { "3B8F800100B85431000090000000000000000043", "Monzo MasterCard Contactless (Bank)\nhttps://monzo.com/" }, { "3B8F800100B854310000900000000000FFFFFFBC", "VISA Debit issued by WIREX. card made by CONTIS / TAG SYSTEMS (Bank)\nhttps://wirexapp.com/" }, + { "3B8F80013101F1564011001900000000000000D1", "Revolut Mastercard (Bank)" }, + { "3B8F80013101F1564011001900000000FFFFFF2E", "BVG Guthabenkarte (Prepaid Payment Card for Berlin/Brandenburg Public Transport) (Transport)\nhttps://www.bvg.de/de/service-und-kontakt/guthabenkarte" }, { "3B8F800141434F53204449616E6131204C63365B", "DKB-VISA-Card (Bank)\nhttps://produkte.dkb.de/?&page=girokonto#kreditkarte" }, { "3B8F800141434F53204449616E613120FFFFFFBD", "DKB Visa Credit Card (Bank)\nhttps://www.dkb.de" }, + { "3B8F800141434F53204449616E6132204C633658", "comdirect Visa debit (Bank)\nhttps://www.comdirect.de" }, + { "3B8F800141434F53204449616E613220FFFFFFBE", "comdirect, VISA Debit (Bank)\nhttps://www.comdirect.de/konto/karten.html#bankkarte" }, + { "3B8F800141434F532046696F6E6131204C633677", "DKB Visa (Debit) (Bank)\nhttps://www.dkb.de/" }, + { "3B8F800143433169A920000020202020202020FF", "Reka (Bank)\nhttps://reka.ch" }, { "3B8F800143443269AB41202020202020FFFFFF47", "BKB VISA Card Switzerland (Bank)\nhttps://www.bkb.ch/de/privatkunden/konten-und-karten/kreditkarten/world-mastercard-silber-oder-visa-classic/factsheet" }, { "3B8F800143553269AA20202020202020202020E9", "UBS Access Card (Mobile Online Banking, NFC, Switzerland)" }, { "3B8F800145504100000000........00........", "Austrian Quick E-purse contactless\nhttp://www.quick.at/" }, @@ -1984,6 +2163,8 @@ const static atr_t AtrTable[] = { { "3B8F800152464944494F74204A434F5020373276", "RFIDIOt JCOP 72K Blank\nhttp://rfidiot.org" }, { "3B8F800152464944494F74204A434F5037327224", "RFIDIOt JCOP 72K RANDOM_UID Blank\nhttp://rfidiot.org" }, { "3B8F800156696E5061795379732050757273652F", "JCOP (Other)" }, + { "3B8F80018031806549544A3442120FFF829000", "Italian Identity Card CIE (eID) (eID)\nhttps://www.cartaidentita.interno.gov.it/en/home/" }, + { "3B8F80018031806549544A3442120FFF8290008B", "Identity Card (eID)" }, { "3B8F800180318065B0........120FFE829000..", "IDPrime MD 3810 T=Contactless (Prox DU)" }, { "3B8F800180318065B0842327E5120FFE8290007E", "Gemalto IDPrime MD 3810 Blank Card (Other)\nhttp://www.gemalto.com/products/IDPrime_MD/index.html" }, { "3B8F800180318065B0846160FB120FFD82900066", "IDPrime 3930 FIPS Level 2 (Contactless TypeA) (BAI5, BAI7) (PKI)" }, @@ -1991,8 +2172,13 @@ const static atr_t AtrTable[] = { { "3B8F800180318065B0850300EF120FFF82900073", "Grand Duchy of Luxembourg / Identity card with LuxTrust certificate (eID)\nhttp://www.guichet.public.lu/citoyens/fr/citoyennete/papiers-identite/carte-identite/nouv-carte-identite-adulte-EN/index.html" }, { "3B8F800180318065B085040011120FFF8290008A", "Dutch driver licence (eID)\nItalian electronic identity card (eID)\nhttps://en.wikipedia.org/wiki/Italian_electronic_identity_card" }, { "3B8F80018031B865B0850300EF1200F68290004D", "Finnish electronic identity card (eID)\nhttps://vrk.fi/en/electronic-identity-and-certificates" }, + { "3B8F80018031B865B08504021B1200F6829000BC", "Finnish identity card (eID)" }, + { "3B8F80018031D865B08505001112752082900076", "Swedish national ID card (eID)\nhttps://polisen.se/en/services-and-permits/passport-and-national-id-card/check-validity-online-for-passports-and-national-id-cards/" }, { "3B8F80018031E06B042105027255555555555564", "Banamex/Citi Bank Bsmart MasterCard Paypass (Bank)\nhttps://www.banamex.com/es/personas/tarjetas_credito/ver_tarjetas/puntos_efectivo/bsmart.htm" }, { "3B8F80018031E06B04310502D1555555........", "Revolut Prepaid Mastercard (Contactless) (Bank)\nhttps://revolut.com/" }, + { "3B8F80018031E06B04520502FD555555FFFFFF32", "C6 Bank Card (Bank)" }, + { "3B8F80018031E06B0453F5025B555555555555CF", "Mastercard debit card for Askari Bank, Pakistan (Bank)" }, + { "3B8F80018031E06B04546B026D55555555555560", "Mastercard Credit/Debit Card - Contactless (Bank)" }, { "3B8F80018031E06B061605028C555555555555AF", "Air Miles American Express card (contactless) (Bank)" }, { "3B8F8001804F0CA000000306..000000000000..", "Card name not given (as per PCSC std part3)" }, { "3B8F8001804F0CA000000306..000100000000..", "MIFARE Classic 1K (as per PCSC std part3)" }, @@ -2060,10 +2246,10 @@ const static atr_t AtrTable[] = { { "3B8F8001804F0CA00000030601....00000000..", "RFID - ISO 14443 Type A Part 1 (as per PCSC std part3)" }, { "3B8F8001804F0CA00000030602....00000000..", "RFID - ISO 14443 Type A Part 2 (as per PCSC std part3)" }, { "3B8F8001804F0CA00000030603....00000000..", "RFID - ISO 14443 Type A Part 3 (as per PCSC std part3)" }, - { "3B8F8001804F0CA000000306030000000000006B", "buss/train pass for use with Skanetrafiken (www.skanetrafiken.se) busses and trains.\npublic library of Dusseldorf\nhttp://www.duesseldorf.de/stadtbuechereien/\nspecialized Mifare Ultralight card" }, - { "3B8F8001804F0CA000000306030001000000006A", "NXP/Philips MIFARE Classic 1K (as per PCSC std part3)\nhttp://www.nxp.com/#/pip/pip=[pfp=41863]|pp=[t=pfp,i=41863]\nOyster card - Transport for London (first-gen)\nhttps://en.wikipedia.org/wiki/Oyster_card\nACOS5/1k Mirfare\nvivotech ViVOcard Contactless Test Card\nBangkok BTS Sky SmartPass\nMifare Classic 1K (block 0 re-writeable)\nElectic vehicle charging card of the German Telekom, acting as EMSP GetCharge\nElectic vehicle charging card of the EMSP Stadtwerke Muenchen (SWM), ladenetz.de, Germany\nElectic vehicle charging card of the EMSP EinfachStromLaden of Maingau-Energie, Germany\nScouter carsharing customer card in Germany\nhttps://scouter.de/" }, - { "3B8F8001804F0CA0000003060300020000000069", "RFID - ISO 14443 Type A - NXP Mifare card with 4k EEPROM" }, - { "3B8F8001804F0CA0000003060300030000000068", "RFID - ISO 14443 Type A - NXP Mifare Ultralight or UltralightC" }, + { "3B8F8001804F0CA000000306030000000000006B", "bus/train pass for use with Skanetrafiken (www.skanetrafiken.se) buses and trains.\npublic library of Dusseldorf\nhttp://www.duesseldorf.de/stadtbuechereien/\nspecialized Mifare Ultralight card" }, + { "3B8F8001804F0CA000000306030001000000006A", "NXP/Philips MIFARE Classic 1K (as per PCSC std part3)\nhttp://www.nxp.com/#/pip/pip=[pfp=41863]|pp=[t=pfp,i=41863]\nOyster card - Transport for London (first-gen)\nhttps://en.wikipedia.org/wiki/Oyster_card\nACOS5/1k Mirfare\nvivotech ViVOcard Contactless Test Card\nBangkok BTS Sky SmartPass\nMifare Classic 1K (block 0 re-writeable)\nElectric vehicle charging card of the German Telekom, acting as EMSP GetCharge\nElectric vehicle charging card of the EMSP Stadtwerke Muenchen (SWM), ladenetz.de, Germany\nElectric vehicle charging card of the EMSP EinfachStromLaden of Maingau-Energie, Germany\nScouter carsharing customer card in Germany\nhttps://scouter.de/\nDKV Euro Service +charge (Transport)\nhttps://www.dkv-mobility.com/en/fuelling/fuel-card/dkv-card-charge/\nAndante (Transport)\nKazakhstan 'Onay' transport card (Transport)\nhttps://onay.kz" }, + { "3B8F8001804F0CA0000003060300020000000069", "RFID - ISO 14443 Type A - NXP Mifare card with 4k EEPROM\nOV Chipkaart\nhttps://www.ov-chipkaart.nl/home.htm" }, + { "3B8F8001804F0CA0000003060300030000000068", "RFID - ISO 14443 Type A - NXP Mifare Ultralight or UltralightC\nTempmate S1 Data Logger (Other)\nhttps://www.tempmate.com/\nprepaid bus card (Transport)\nhttps://www.t-l.ch/abos-billets/billets/carte-prepayee\nGamestate rechargable play card (Other)\nhttps://shop.gamestate.com/" }, { "3B8F8001804F0CA0000003060300FF0000000094", "ACTV (Italy) prepaid transport ticket\n'NFC Tag' -- Sony's 'Smart Tags'" }, { "3B8F8001804F0CA00000030603F004000000009F", "NFC FORUM TYPE 1 TAG\nwww.inovision-group.com/topaz\nISO/IEC 14443A - 96 Bytes read/write NFC/RFID IC mandated by NFC Forum as the Type 1 NFC Forum Tag Format." }, { "3B8F8001804F0CA00000030603F011000000008A", "Bangkok Metro (MRT)\nHTC One X Android phone (European edition 'endaevoru')" }, @@ -2074,8 +2260,10 @@ const static atr_t AtrTable[] = { { "3B8F8001804F0CA00000030607....00000000..", "RFID - ISO 14443 Type B Part 3 (as per PCSC std part3)" }, { "3B8F8001804F0CA000000306070000000000006F", "Atmel AT88RF04C CryptoRF" }, { "3B8F8001804F0CA000000306074344600201E4EF", "'Andante' Card, Porto (Portugal) metro card. (ISO14443 B CTS/CTM512B) (Transport)\nhttp://www.transportespublicos.pt/en/glossary/andante-ticket-system/" }, + { "3B8F8001804F0CA00000030607FFB00000000020", "Chinese ID Card (eID)\nhttps://en.wikipedia.org/wiki/Resident_Identity_Card" }, { "3B8F8001804F0CA00000030609....00000000..", "RFID - ISO 15693 Part 1 (as per PCSC std part3)" }, { "3B8F8001804F0CA0000003060A....00000000..", "RFID - ISO 15693 Part 2 (as per PCSC std part3)" }, + { "3B8F8001804F0CA0000003060A0018000000007A", "HID ICLASS DL (eID)" }, { "3B8F8001804F0CA0000003060A001C000000007E", "RFID - HID iCLASS 16K CL" }, { "3B8F8001804F0CA0000003060B....00000000..", "RFID - ISO 15693 Part 3 (as per PCSC std part3)" }, { "3B8F8001804F0CA0000003060B00000000000063", "RFID - ISO 15693 - EM Microelectronic-Marin SA" }, @@ -2098,6 +2286,7 @@ const static atr_t AtrTable[] = { { "3B8F8001805A08030400020024E279788290000C", "Paris Navigo card 14443 B' (Innovatron - Calypso)" }, { "3B8F80018066B007010107............9000..", "Gemalto Santander Optelio TUI R7 with WG10 customized using Contactless interface" }, { "3B8F80018073CC91CBF9A0000003080000100029", "NIST demo PIV card (eID)" }, + { "3B8F8001809100318065B08405002583019000CD", "Contactless IDCore3230 build 6.8, test APDU applet (JavaCard)" }, { "3B8F80018091E1318065B0831100AC83009000B7", "TOP DM GX4 Cards [TOP DM GX4 - contact interface]\nGemCombiXpresso R4 72K (contactless interface)" }, { "3B8F80018091E1318065B0831111AC83009000A6", "TOP DM GX4 Cards [TOP DM GX4 on Omnikey]\nGEMALTO WM GX4 72 DHS TSA (contactless interface)" }, { "3B8F80018091E1318065B0831111E583009000EF", "TOP DL V2 Cards" }, @@ -2115,6 +2304,7 @@ const static atr_t AtrTable[] = { { "3B90958011FE6A", "JC30M48CR JavaCard (JavaCard)" }, { "3B9095801FC359", "Dai Nippon Printing Co., DNP Standard-J T3.1" }, { "3B90968111FE68", "Xirka (eID)" }, + { "3B90969181B1FE551FC7D4", "iClass SE Processor (Other)\nhttps://www.hidglobal.com/products/embedded-modules/iclass-se/sio-processor" }, { "3B9194801F0323BA", "China black(COS) SIM, does not support clock stop" }, { "3B931100003200", "01-3936b2013 (Pay TV)\nhttp://www.lripl.com" }, { "3B941881B1807D1F0319C80050DC", "GoldKey Security PIV Token" }, @@ -2140,19 +2330,22 @@ const static atr_t AtrTable[] = { { "3B959680B1FE551FC7477261636513", "IClass SE Processor (Other)\nhttps://www.hidglobal.com/products/embedded-modules/iclass-se/sio-processor" }, { "3B9596C0F01FC20F100A0A16", "viettel (Telecommunication)" }, { "3B959740F01A160A1941", "SG50 (Samsung Chip) (Telecommunication)" }, + { "3B96004121920000622433339000", "Ukrainian Telecommunications Operator Kyivstar (old simcard) (Telecommunication)\nhttps://kyivstar.ua/uk/mm" }, { "3B961880018051006110309F006110309E", "Atmel/Athena T0 PC/SC Compliance Test Card No. 1 (warm reset)" }, + { "3B9694801FC6D0019FCB1000CE", "jawwal (Telecommunication)" }, { "3B9695801FC3D007830254005D", "au IC-card ver.001 (for CDMA2000) (Telecommunication)\nhttps://ja.wikipedia.org/wiki/Au_IC%E3%82%AB%E3%83%BC%E3%83%89" }, { "3B97110002020422003F03", "China Unicom (Telecommunication)" }, { "3B9711801F418031A073BE2100A6", "Comprion UT3 simulator SIM (Other)" }, { "3B9711801F428031A073BE2100A6", "ETSI 102 230 Test case 5.2.5.3. Comprion IT3 SIM emulator (Telecommunication)" }, - { "3B9711C0FFB1FE351F83A505010102A3015F", "digital chronotachygraphe card: conducteur/driver, entreprise, controleur/controler et atelier/workshop, 2006-2010\nmanufactured by Imprimerie Nationale, distributed by Chronoservices" }, - { "3B9713C0FFB1FE351F83A505010102A3015D", "digital chronotachygraphe card: conducteur/driver, entreprise, controleur/controler et atelier/workshop, 2005-2006\nmanufactured by Imprimerie Nationale, distributed by Chronoservices" }, + { "3B9711C0FFB1FE351F83A505010102A3015F", "digital chronotachygraphe card: conducteur/driver, entreprise, controleur/controller et atelier/workshop, 2006-2010\nmanufactured by Imprimerie Nationale, distributed by Chronoservices" }, + { "3B9713C0FFB1FE351F83A505010102A3015D", "digital chronotachygraphe card: conducteur/driver, entreprise, controleur/controller et atelier/workshop, 2005-2006\nmanufactured by Imprimerie Nationale, distributed by Chronoservices" }, { "3B9794801F438031E073FE211B39", "Telenor SIM card (Hungary) (Telecommunication)\nhttps://www.telenor.hu" }, { "3B9794803F44908031A073BE210095", "Comprion Simulated card that indicate Low Impedance support: TB(3) = 0x90 (Telecommunication)" }, { "3B9795801F438031E073FE211B38", "JIO (Telecommunication)" }, { "3B9795801F478031E073FE211B3C", "iFree MOGO SIM Card for test (Telecommunication)" }, { "3B9795801FC78031A073B6211BB4", "DNP Local5G (Telecommunication)" }, - { "3B9795C02A31FE35D000480105A3113C", "digital chronotachygraphe card: conducteur/driver, entreprise, controleur/controler et atelier/workshop, 2010-2015\nmanufactured by Imprimerie Nationale, distributed by Chronoservices" }, + { "3B9795C02A31FE35D000480105A3113C", "digital chronotachygraphe card: conducteur/driver, entreprise, controleur/controller et atelier/workshop, 2010-2015\nmanufactured by Imprimerie Nationale, distributed by Chronoservices" }, + { "3B97978171FE24007743534D01020300", "Infineon CIPURSE SAM SLF 9630 (Other)" }, { "3B9811000205013242030500", "Sino 3G Nano-sim ordered off Alie Express (Telecommunication)\nhttp://goo.gl/rSEi4N" }, { "3B9813400AA503010101AD1311", "Belgium Electronic ID card (eID)" }, { "3B981801524D4D2076312E32A8", "Ericsson Mini-Link RYS 110 243/1 (Other)" }, @@ -2176,6 +2369,7 @@ const static atr_t AtrTable[] = { { "3B999400910891060001060600", "GSM-SIM Orange-UK (1800)" }, { "3B999400911691080001250100", "GSM SIM E-plus, Germany (Telecommunication)" }, { "3B999400919993120001160200", "ORGA test systems - GSM Phase 2+ Test SIM" }, + { "3B999500001506030105040100", "Skylink CDMA R-UIM card (Telecommunication)\nhttps://en.wikipedia.org/wiki/Sky_Link_(Russia)" }, { "3B9A180082627593110001020200", "Supersim 6 in 1 (Telecommunication)" }, { "3B9A18801FC731425243442E312E3538C0", "HP StorageWorks (Other)\nhttps://hpe.com" }, { "3B9A940091010017000123100096", "GSM-SIM Victorvox D1 (900MHz)" }, @@ -2200,22 +2394,28 @@ const static atr_t AtrTable[] = { { "3B9C110068868D0C86980256408B0500", "China Mobile (Telecommunication)" }, { "3B9C131181647265616D6372797074000408", "XPlusTV & INXCT Access Card-9 (FIRECrypt)" }, { "3B9C131181647265616D6372797074900599", "FireCrypt, access card 9 (Pay TV)" }, + { "3B9C188121455A43332E333420524556204467", "MS-Protect safecard for access system (eID)" }, { "3B9C940068868D0A86980256C2000500", "G3 & GSM & Blank SIM card: to be programmed for OpenBTS with pySim-prog (Telecommunication)" }, { "3B9C940068868D0C86980245A1000500", "China Mobile (Telecommunication)" }, { "3B9C940068868D0C86980256408B0500", "mobiledit (Telecommunication)" }, { "3B9C948011405275746F6B656E4543507363C3", "Aktiv Rutoken ECP SC T1\nhttps://www.rutoken.ru/products/all/rutoken-ecp-sc/" }, + { "3B9C94801F478031E073FE211B545015740152", "VI india (Telecommunication)" }, + { "3B9C94801F478031E073FE211B545015745003", "SIM Card (Telecommunication)" }, { "3B9C94801F478031E073FE211B5450845450B2", "cambodia (Telecommunication)\nhttps://www.smart.com.kh/" }, + { "3B9C94801F478031E073FE211B545085745291", "Airtel india (Telecommunication)" }, { "3B9C94801F478031E073FE211B54538974509C", "China Unicom 128K M2M Card (Telecommunication)" }, { "3B9C94801F478031E073FE211B545983795091", "Vodafone Ukraine (Telecommunication)" }, { "3B9C95801FC78031E073FE211B6457444946CF", "MTC (Moscow) phone SIM card (Telecommunication)\nhttps://moskva.mts.ru/personal" }, { "3B9C9580811F039067464A01005404F272FE00C0", "Feitian Technologies Java Card A22CR (JavaCard)\nhttps://www.javacardos.com/store/javacard-a22cr.php" }, { "3B9C9580811F039067464A01011706F2727E0000", "A40CR (JavaCard)" }, + { "3B9C958131FE9F9067464A010253050172FE00FB", "Feitian Biopass K27 (PKI)\nhttps://www.ftsafe.com/Products/FIDO/Bio" }, { "3B9C96005275746F6B656E4543507363", "Aktiv Rutoken ECP SC T0\nhttps://www.rutoken.ru/products/all/rutoken-ecp-sc/" }, { "3B9C960058442403020020010A009005", "Ticket Restaurant Card (Other)\nhttp://www.edenred.it/buoni-pasto-welfare-benefit/ticket-restaurant-card/" }, { "3B9C978011405275746F6B656E4543507363C0", "Aktiv Rutoken ECP 3.0 NFC (PKI)\nhttps://www.rutoken.ru/products/all/rutoken-ecp-nfc/" }, { "3B9D114023006810114D696F434F53009000", "MioCOS 1.0" }, { "3B9D13813160378031C0694D54434F537302020440", "DPI Card Guatemala (eID)\nhttp://www.masktech.de/" }, { "3B9D13813160378031C0694D54434F537302020541", "MTCOS (eID)\nhttp://www.masktech.com/Products/MTCOS-Professional/11/en" }, + { "3B9D188131FC358031C0694D54434F5373020505D3", "Lithuanian e-ID Card (eID)\nhttps://www.nsc.vrm.lt/default_en.htm" }, { "3B9D944023006820014D696F434F53009000", "Miotec smartcard running Miocos 2.0 on an Atmel AT90SC646\nhttp://www.miotec.fi" }, { "3B9D95801FC38031E0524B5462110373FE211B8F", "KT WiBro UICC (2.3 GHz mobile WiMAX in South Korea)" }, { "3B9D95801FC38031E073FE211B65D00057026230", "Gemalto NFC enabled (acquired through the Simagine contest)" }, @@ -2228,16 +2428,21 @@ const static atr_t AtrTable[] = { { "3B9D95801FC780731A211B63AF09A9830F9000F3", "Estonian GSM operator TELE2 (WPKI eID support)" }, { "3B9D95803FC7A08031A073BE21135105830590007C", "NTT docomo Xi(LTE) DN05(DNP) Pink SIM (Telecommunication)" }, { "3B9D960053492303030020000400F59000", "shell (Transport)" }, + { "3B9D96801FC78031E073FE2113654C0404020096", "China umion 5G SIM (Telecommunication)" }, + { "3B9D96813160378031C0694D54434F5373020204C5", "Mozambique ID Card (eID)" }, { "3B9E94801F4280310073BE211066545953044C25CF", "MCI (Mobile Communication Company of Iran) SIM" }, + { "3B9E94801F478031A073BE21106686880212204027", "americamobile (Telecommunication)" }, { "3B9E94801F478031A073BE21136686880210421014", "Airspan USIM (Telecommunication)" }, { "3B9E94801F478031A073BE21136686880210731025", "module (JavaCard)" }, { "3B9E94801F478031E073BE211366868882183942F5", "China Unicom 128K Mini USIM (Telecommunication)" }, + { "3B9E94801F478031E073FE21136686880212653213", "MTS Moscow (Russia) SIM card (Telecommunication)\nhttps://moskva.mts.ru/personal" }, { "3B9E94801FC38031E073FE211B66D00017B40000A5", "Vodafone Ireland SIM card" }, { "3B9E94801FC78031E073FE211366425454423031DB", "XLB.5G CTC Test Card (Telecommunication)\nhttps://xielibo.com" }, { "3B9E94801FC78031E073FE211B66D0006C025F0033", "Vivo Brasil SIM Card" }, { "3B9E94801FC78031E073FE211B66D0006C0634005C", "SIM card SFR 250 128ko" }, { "3B9E94801FC78031E073FE211B66D0007A00000078", "GaduAIR (Poland) - Subscriber Identity Module (SIM)" }, { "3B9E94801FC78031E073FE211B66D0016DE80C008A", "Mobile TeleSystems (MTS) GSM SIM\nhttp://www.mts.ru/" }, + { "3B9E94801FC78031E073FE211B66D001A16B0F00C6", "Proximus (Belgium) SIM, unactivated (Telecommunication)" }, { "3B9E94801FC78031E073FE211B66D001A18D0F0020", "StarHub Happy Prepaid SIM (Telecommunication)\nhttp://www.starhub.com/personal/mobile/mobile-phones-plans/prepaid-cards.html" }, { "3B9E94801FC78031E073FE211B66D00217F71300F3", "VIETTEL Telecom 4G SIM 128KB (Vietnam) (Telecommunication)\nhttp://vietteltelecom.vn/" }, { "3B9E94801FC78031E073FE211B66D002195C130056", "SIM Card of the French mobile carrier 'La Poste Mobile' (Telecommunication)" }, @@ -2273,6 +2478,7 @@ const static atr_t AtrTable[] = { { "3B9E95801FC78031E073FE211B66D001A0C3120073", "3G MTN IRANCELL Sim Card. (Telecommunication)" }, { "3B9E95801FC78031E073FE211B66D001A1141100A6", "Globe (Telecommunication)" }, { "3B9E95801FC78031E073FE211B66D001A1721000C1", "Vodafone Hungary SIM Card (Telecommunication)\nhttp://vodafone.hu" }, + { "3B9E95801FC78031E073FE211B66D001A17C0F00D0", "Cricket SIM card (Telecommunication)" }, { "3B9E95801FC78031E073FE211B66D001A18C12003D", "Telkomsel SIM card (Telecommunication)\nhttps://www.telkomsel.com/en/kartu-as" }, { "3B9E95801FC78031E073FE211B66D001A1B810000B", "abc mobile prepaid sim card (serviced by CSL) (Telecommunication)\nhttps://www.hkcsl.com/en/abc-Mobile-Prepaid-SIM-Cards/" }, { "3B9E95801FC78031E073FE211B66D0021702130007", "AT&T prepaid nano iphone/android sim card (Telecommunication)" }, @@ -2336,12 +2542,16 @@ const static atr_t AtrTable[] = { { "3B9E96801FC78031E073FE211B66D001A0DD12006E", "USIM (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D001A0EC11005C", "Boost Mobile Prepaid Micro SIM Card (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D001A1121000A2", "OpenAirInerface (Telecommunication)" }, + { "3B9E96801FC78031E073FE211B66D001A1181100A9", "WinEMP NRI License Card (Other)" }, + { "3B9E96801FC78031E073FE211B66D001A122110093", "Lebara (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D001A1581100E9", "Vodafone CZ: SIMPLUS V128 LTE (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D001A1680F00C7", "Free Mobile SIM card (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D001A1721000C2", "Vodafone (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D001A1731000C3", "Prepaid public telephone card from Lidl Connect, Germany (Telecommunication)\nhttps://www.lidl.de/de/lidl-connect/s7373597" }, + { "3B9E96801FC78031E073FE211B66D001A1771000C7", "SIM Card Model X1 for Ting Mobile Carrier (Telecommunication)\nhttps://tingmobile.com/" }, { "3B9E96801FC78031E073FE211B66D001A1A70F0008", "Spanish Movistar Mobile phone SIM card (Telecommunication)\nhttp://www.movistar.es/" }, { "3B9E96801FC78031E073FE211B66D001A1E60F0049", "SIM O2 CZ (Telecommunication)" }, + { "3B9E96801FC78031E073FE211B66D002170912000E", "SIM/USIM (SPAIN) - ORANGE ESPAGNE VIRTUAL, S.A.U. (Orange / Jazztel / SIMYO) (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D0021759140058", "USIM card of of Ukrainian Telecommunications Operator Kyivstar, emitted after 2016 (Kyivstar GSM) (GSM/UMTS/LTE services) (Telecommunication) (Telecommunication)\nhttps://kyivstar.ua/uk/4g" }, { "3B9E96801FC78031E073FE211B66D002175B12005C", "Cellcom Israel USIM (micro FF) (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D0021760130066", "Vodafone spain barcelona (Telecommunication)" }, @@ -2353,12 +2563,20 @@ const static atr_t AtrTable[] = { { "3B9E96801FC78031E073FE211B66D00217D91200DE", "telenor (swedish mobile provider) SIM card (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D00217F41200F3", "SIM card for Swedish operator Vimla! (Telecommunication)\nhttps://www.vimla.se" }, { "3B9E96801FC78031E073FE211B66D002194B120042", "halebop (swedish mobile provider) SIM card (Telecommunication)" }, + { "3B9E96801FC78031E073FE211B66D0022436140004", "SIM (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D0022A72130049", "SIM Card OI (Brazil) (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D0022A861300BD", "Mobile Vikings SIM Card (Telecommunication)\nhttps://mobilevikings.com" }, + { "3B9E96801FC78031E073FE211B66D0022A8F1400B3", "Telefonica USIM (Telecommunication)" }, { "3B9E96801FC78031E073FE211B66D0022AD31300E8", "sim card from Mobilcom Debitel Telefonica (Telecommunication)\nhttps://md.de" }, { "3B9E96801FC78031E073FE211B66D0022AD91300E2", "sim (Telecommunication)" }, + { "3B9E96801FC78031E073FE211B66D0022AE81300D3", "Twilio Super SIM card (Telecommunication)\nhttps://www.twilio.com/iot/super-sim-card" }, + { "3B9E96801FC78031E073FE211B66D0022AF21400CE", "Tello (Telecommunication)\nhttps://tello.com/" }, { "3B9E96801FC78031E073FE211B66D00233AD140088", "4G-LTE (Telecommunication)" }, { "3B9E96803FC3A08031E073FE211B630801140F9000D3", "KT Olleh LTE Warp SA-L 1670 (Telecommunication)" }, + { "3B9E97801FC68031E073FE211B66D0019F7A1200F6", "Spectrun USA Sim Card (Telecommunication)" }, + { "3B9E97801FC68031E073FE211B66D002401D15004A", "Telia Sim card for IoT (Telecommunication)" }, + { "3B9E97801FC68031E073FE211B66D0024027150070", "verymobile wind 3 (Telecommunication)\nhttps://verymobile.it/" }, + { "3B9E97801FC68031E073FE211B66D0025E7315003A", "Twilio Super SIM (Telecommunication)\nhttps://www.twilio.com/iot/super-sim-card" }, { "3B9E97801FC78031E073FE211B66D0006B951100EE", "TracFone SIM Verizon Wireless LTE supported (Telecommunication)\nhttps://www.tracfone.com" }, { "3B9E97801FC78031E073FE211B66D0022AB3130089", "SIM T-MObile (Telecommunication)" }, { "3B9F..801FC300681.4405014649534531C8..9000..", "Setec SetCOS 4.4.1" }, @@ -2406,6 +2624,7 @@ const static atr_t AtrTable[] = { { "3B9F94401E0067114346495345105266FF819000", "Setec / FINEID\nSETEC Instant EID" }, { "3B9F94401E0067164346495345105266FF819000", "RSA SecurID 3100 or Utimaco Safeware Smartcard\nSetCOS 4.3.1 Revision Unknown" }, { "3B9F94801FC30068104405014649534531C807900018", "SetCOS 4.3.0 32K RSA\nInstant EID IP2\nSETEC SetCard 32K PKI Evaluated SetCOS 4.4.1a2" }, + { "3B9F94801FC38031A07320210805500940095E010274", "Yemen Mobile SIM Card Yemen (YE) (Telecommunication)" }, { "3B9F94801FC38031A073B6A10067CF3251CC9E6EC015", "OYEITIMES 2G GSM Blank SIM Card (Other)\nhttps://www.aliexpress.com/item/32972705510.html?spm=a2g0s.9042311.0.0.5a564c4daKCdcQ" }, { "3B9F94801FC38031E073FE21136301030283079000CE", "Programmable SIM card as one of the requirement for free5GC testing procedure (Telecommunication)" }, { "3B9F94801FC78031E073FE2100644090610082900069", "softsim (Telecommunication)" }, @@ -2420,6 +2639,7 @@ const static atr_t AtrTable[] = { { "3B9F94801FC78031E073FE21135749050C86986018CC", "China Unicom USIM 128K 6131H" }, { "3B9F94801FC78031E073FE21135786810586984018AE", "China Unicom USIM Card (Telecommunication)" }, { "3B9F94801FC78031E073FE211357868107869862188E", "OYEITIMES MCR3516 SIM Card (Telecommunication)" }, + { "3B9F94801FC78031E073FE2113578681098698621880", "Oyeitimes 5G ISIM R16 (Telecommunication)\nhttps://www.oyeitimes.com/detail.php?id=535&ids=565&idt=&ide=&dd=1410" }, { "3B9F94801FC78031E073FE21135786850686984218AB", "4G LTE blank USIM Green Card (Telecommunication)\nhttp://grcard.en.alibaba.com/product/60076835567-209365843/4G_LTE_blank_usim_card_for_4G_network.html" }, { "3B9F94801FC78031E073FE21136321150683079000F8", "Maroc Telecom 4G+ (Telecommunication)" }, { "3B9F94801FC78031E073FE21136761210D10000070F7", "Celcom XPAX (Telecommunication)\nhttps://www.celcom.com.my/personal/prepaid" }, @@ -2427,6 +2647,7 @@ const static atr_t AtrTable[] = { { "3B9F94801FC78031E073FE2119573C8660CFBA02A0ED", "Gotanet DK USIM (Telecommunication)" }, { "3B9F94801FC78031E073FE211B573786609B3289B2A1", "China Unicom Travel SIM (Telecommunication)\nhttps://www.cuniq.com/hk/data-card/asia/asia-12days.html" }, { "3B9F94801FC78031E073FE211B573786609BA182109B", "U Mobile POWER Prepaid (Telecommunication)\nhttp://www.u.com.my/prepaid" }, + { "3B9F94801FC78031E073FE211B573C8660CDA1001246", "Beeline SIM card (RUS) (Telecommunication)\nhttps://beeline.ru" }, { "3B9F94801FC78031E073FE211B573F86604D03000075", "Prepaid SIM card MOCHE (Portugal) (Telecommunication)" }, { "3B9F94801FC78031E073FE211B573F866083020000BA", "GSM-SIM Beeline RU (Telecommunication)\nhttp://beeline.ru" }, { "3B9F94801FC78031E073FE211B573F866096A100000C", "Lycamobile UICC/SIM card. (Telecommunication)\nhttps://www.lycamobile.com.au" }, @@ -2436,6 +2657,7 @@ const static atr_t AtrTable[] = { { "3B9F94801FC78031E073FE211B640681010082900045", "Mobicarte Orange" }, { "3B9F94801FC78031E073FE211B6407564200829000D0", "SIM mobi orange" }, { "3B9F94801FC78031E073FE211B649F4F002082900033", "USIM (3G DF) Orange (French Mobile Network) (Telecommunication)" }, + { "3B9F94801FC78031E073FE211B674B004A5503060083", "CU esim thd89 (Telecommunication)" }, { "3B9F95801F038031A073B6A10067CF97F9E063689957", "Telestial OneRate International SIM card (Telecommunication)\nhttp://www.amazon.com/gp/product/B004GV13VY/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1" }, { "3B9F95801F438031E073362113574A330E09314100A9", "GSM-SIM Elisa (Estonia, WPKI eID support)" }, { "3B9F95801F438031E073362113574A330E0C314100AC", "Vodafone SIM (mobile phone)" }, @@ -2449,6 +2671,7 @@ const static atr_t AtrTable[] = { { "3B9F95801FC38031A073BE21005302E232830590003C", "NTT docomo FOMA(W-CDMA) GE02(Japan Gemplus) Green SIM (Telecommunication)\nhttps://ja.wikipedia.org/wiki/%E3%83%89%E3%82%B3%E3%83%A2UIM%E3%82%AB%E3%83%BC%E3%83%89" }, { "3B9F95801FC38031A073BE2113674701030102000099", "T-Mobile (UK) SIM\nFresh Mobile (UK) SIM" }, { "3B9F95801FC38031A073BE2113674701050104000099", "T-Mobile Nederlands\nhttp://www.tmobile.nl" }, + { "3B9F95801FC38031A073BE2113674701050904000091", "SIM card (Telecommunication)" }, { "3B9F95801FC38031A073BE2113674701090901000098", "German SIM card (T-Mobile) (Telecommunication)" }, { "3B9F95801FC38031A073BE211367D002030901000006", "GSM, T-Mobile (Germany)" }, { "3B9F95801FC38031A073BE211367D002031901000016", "GSM SIM card from congstar (a no-frills service provider of Deutsche Telekom)" }, @@ -2464,11 +2687,14 @@ const static atr_t AtrTable[] = { { "3B9F95801FC38031E073FE211B649B4D011182900000", "Singular (now AT&T) 3G GSM SIM Card" }, { "3B9F95801FC38031E073FE211BB3E20174830F900088", "Gemplus GemXplore 3G USIM" }, { "3B9F95801FC78031A073B6A10067CF1713C41D2D3649", "Idemia card (Telecommunication)" }, - { "3B9F95801FC78031A073B6A10067CF1794AA28993F28", "Glaier Programable LTE USIM Card (Telecommunication)" }, + { "3B9F95801FC78031A073B6A10067CF1794AA28993F28", "Glaier Programmable LTE USIM Card (Telecommunication)" }, { "3B9F95801FC78031A073B6A10067CF3211B252C679F3", "open5gs (Telecommunication)" }, { "3B9F95801FC78031A073B6A10067CF3215A98FD70950", "LTE Card (Telecommunication)" }, + { "3B9F95801FC78031A073B6A10067CF3215CA9CD70920", "Gialer LTE USIM (Telecommunication)\nhttps://www.gialer.com/collections/writable-sim-card/products/gialer-writable-programmable-sim-card-4g-lte-wcdma-gsm-nano-micro-2ff-3ff-4ff-blank-usim-card-for-telecom-operator?variant=40982030090394" }, + { "3B9F95801FC78031A073B6A10067CF3216C3F1484998", "LTE USIM as used for Private LTE Networks. Manufacturer 'Huahong' in China (Telecommunication)" }, { "3B9F95801FC78031A073BE21005304D08083059000BE", "NTT_DoCoMo (Telecommunication)" }, { "3B9F95801FC78031A073BE211367D002040901000005", "T-Mobile SIM card issued in Germany 2012" }, + { "3B9F95801FC78031E073F62100000086538300900061", "Zong (Telecommunication)" }, { "3B9F95801FC78031E073F62113674D451500390102F4", "Vivo 4G LTE SIM Card (Telecommunication)" }, { "3B9F95801FC78031E073F62113674D4516004301008F", "VALID USIM (Telecommunication)" }, { "3B9F95801FC78031E073FE21135712291102010000C2", "sysmocom sysmoUSIM-GR1\nhttp://sysmocom.de/" }, @@ -2481,11 +2707,13 @@ const static atr_t AtrTable[] = { { "3B9F95801FC78031E073FE2113574A330E1932330084", "WIND Mobile SIM Card" }, { "3B9F95801FC78031E073FE2113574A330E1A32330087", "Rohde and Schwarz CMW-Z04. Mini-UICC Test Card (Telecommunication)" }, { "3B9F95801FC78031E073FE2113574A330E1A32360082", "TELUS 3G SIM Card" }, + { "3B9F95801FC78031E073FE2113574A330E1E32360086", "SIM Enreach (Telecommunication)" }, { "3B9F95801FC78031E073FE2113635510888307900006", "SHOW or UPlus USIM (Telecommunication)" }, { "3B9F95801FC78031E073FE2113635510AA8307900024", "2degrees NFC (Telecommunication)\nhttp://www.2degreesmobile.co.nz/home" }, { "3B9F95801FC78031E073FE2113672228004001000191", "Lycamobile Prepaid SIM-Card (Telecommunication)\nhttp://lycamobile.at" }, { "3B9F95801FC78031E073FE211367940311000002035C", "AT&T (US) GSM SIM" }, { "3B9F95801FC78031E073FE211B573C8660BEB7002010", "Kyivstar SIM (Telecommunication)\nhttps://kyivstar.ua/" }, + { "3B9F95801FC78031E073FE211B573F866096AE000002", "Kazakhstan 'Beeline' 4G SIM card (Telecommunication)\nhttps://beeline.kz" }, { "3B9F95801FC78031E073FE211B63E20394830F9000BE", "Telenet N.V. Walk & Talk SIM Card Belgium" }, { "3B9F95801FC78031E073FE211B63E204A5830F900088", "Cingular '64Ksmartchip' GSM SIM\nTelia GSM/3G (Swedish operator)" }, { "3B9F95801FC78031E073FE211B63E206A6830F900089", "TracFone (US) Net10 GSM SIM card\nSimyo (Germany) GSM SIM card\nH3G (Italy) UMTS USIM card" }, @@ -2498,6 +2726,7 @@ const static atr_t AtrTable[] = { { "3B9F95801FC78031E073FE211B640752930282900006", "AT&T GO PHONE 2G (Telecommunication)\nhttps://www.att.com/shop/wireless/gophone.html" }, { "3B9F95801FC78031E073FE211B6407536301829000F4", "AT&T UICC with USIM and ISIM (Telecommunication)" }, { "3B9F95801FC78031E073FE211B6440614100829000A2", "SIM card (Telecommunication)" }, + { "3B9F95801FC78031E073FE211B644067620082900087", "ATT SIM card (Telecommunication)" }, { "3B9F95801FC78031E073FE211B644112010082900090", "MTS SIM card (Russia) (Telecommunication)\nhttp://www.mts.ru/" }, { "3B9F95801FC78031E073FE211B6441132100829000B1", "AT&T SIM card (Telecommunication)" }, { "3B9F95801FC78031E073FE211B644132310082900080", "Telefonica | Vivo Brazil M2M SIM Card (Telecommunication)" }, @@ -2505,6 +2734,8 @@ const static atr_t AtrTable[] = { { "3B9F95801FC78031E073FE211B659F010902048105C4", "2degrees mobile SIM card\nhttp://www.2degreesmobile.co.nz/" }, { "3B9F95801FC78031E073FE211B65B4010E01028105ED", "USIM Card by Maroc Telecom Morocco (Telecommunication)" }, { "3B9F95801FC78031E073FE211B675348434F5F01019B", "baicells sim card (Telecommunication)\nhttp://www.baicells.com/" }, + { "3B9F95801FC78031E073FE211B675744534C45393794", "SIM card MTS Russia (Telecommunication)\nhttps://moskva.mts.ru/personal" }, + { "3B9F95801FC78031E073FEA11F6441805100829000D6", "AT&T SIM Card (Telecommunication)" }, { "3B9F95803FC3A08031E073FE2113638D434283F0900034", "Taisys Java Csrd (Telecommunication)" }, { "3B9F95803FC7A08031A073BE211B5305D0808305900024", "NTT docomo Xi(LTE) AX05(Gemalto) Pink SIM (Telecommunication)\nhttps://ja.wikipedia.org/wiki/%E3%83%89%E3%82%B3%E3%83%A2UIM%E3%82%AB%E3%83%BC%E3%83%89" }, { "3B9F95803FC7A08031E073FE211363554022830790007C", "Ubivelox (JavaCard)" }, @@ -2515,6 +2746,8 @@ const static atr_t AtrTable[] = { { "3B9F958131FE9F006646530510043171DF000000000026", "ePass2003 (PKI)" }, { "3B9F958131FE9F006646530510043171DF000006000020", "FEITIAN ePASS 2003 Auto (PKI)" }, { "3B9F958131FE9F006646530510043171DF00003900001F", "Feitian ePass2003 (PKI)" }, + { "3B9F958131FE9F006646530510063171DF000000000024", "FT ePass2003Auto USB Token (PKI)" }, + { "3B9F958131FE9F006646530510323871DF00000600001F", "token (PKI)" }, { "3B9F958131FE9F006646530520032571DF000000000005", "Feitian ePass2003 token" }, { "3B9F958131FE9F006646530520032571DF000003900096", "Feitian ePass2003 token (PKI)" }, { "3B9F958131FE9F006646530523002571C39F0000000086", "Feitian ePass2003 token" }, @@ -2522,6 +2755,10 @@ const static atr_t AtrTable[] = { { "3B9F958131FE9F006646530523002571DF000003900096", "Feitian USB Cryptographic token (FIPS 140-2 Level 3) (PKI)\nhttp://www.ftsafe.com/product/epass/epass2003" }, { "3B9F958131FE9F006646530532022571DF000006000010", "ePass 3003 Auto (PKI)\nhttps://www.ftsafe.com/products/PKI/Standard/Specification" }, { "3B9F958131FE9F006646530534002571DF0000036A82F9", "Feitian ePass2003Auto (PKI)\nhttps://www.ftsafe.com/Products/PKI/Standard/Specification" }, + { "3B9F958131FE9F006646530551003371DF000000000061", "FT ePass2003Auto 00 00 (PKI)" }, + { "3B9F958131FE9F006646530551003371DF0000036A828A", "Feitian epass2003 Auto (PKI)" }, + { "3B9F958131FE9F006646530551003371DF0000039000F2", "HyperPKI USB Token (PKI)\nhttps://www.hypersecu.com/hyperpki" }, + { "3B9F958131FE9F006646530551003371DF000006000067", "Epass2003 (PKI)" }, { "3B9F95C00A1F078031E073FE211B63F100AD830F90001D", "EMT WPKI USIM (2014, Estonia, JavaCard) (Telecommunication)" }, { "3B9F95C00A1FC78031E073FE211B63F100AD830F9000DD", "Telenor SIM card (Norway)" }, { "3B9F96400A8031E06B0420050258555555555555", "BuyPass identification card. It can also possibly be used to hold e-currency." }, @@ -2532,31 +2769,40 @@ const static atr_t AtrTable[] = { { "3B9F96801F438031E073362113574A330E0C314100AF", "GSM, Vodafone (Germany)" }, { "3B9F96801F478031E073362113574A330E0C314100AB", "NATEL SIM-Card swisscom\nVodafone Germany Micro-SIM from 2010" }, { "3B9F96801F478031E073FE2113574A330E253332003B", "SMART prepaid card, Estonia (Telecommunication)" }, + { "3B9F96801F878031A073BE2111630000018305900089", "jio sim card (Telecommunication)" }, { "3B9F96801F878031E073FE2119674A555473300948DB", "nano sim/usim card (Telecommunication)" }, { "3B9F96801F878031E073FE2119674A555475300662F8", "SIM Card (Telecommunication)" }, { "3B9F96801F878031E073FE2119674A557330310746BE", "Hologram Developer Global IoT SIM Card (Telecommunication)\nhttps://hologram.io/store/global-iot-sim-card/17" }, { "3B9F96801F878031E073FE211B674A4C5275310451D5", "Test card provided with 4G/5G network from Amarisoft (Telecommunication)" }, { "3B9F96801F878031E073FE211B674A4C7530300248A9", "Cardcentrics (Telecommunication)" }, - { "3B9F96801F878031E073FE211B674A4C753034054BA9", "Test Card (Telecommunication)" }, + { "3B9F96801F878031E073FE211B674A4C753034054BA9", "sysmoISIM-SJA2 (Telecommunication)\nhttps://osmocom.org/projects/cellular-infrastructure/wiki/SysmoISIM-SJA2" }, + { "3B9F96801F878031E073FE211B674A55527531054BD7", "Softbank (C2) USIM card (Telecommunication)" }, + { "3B9F96801F878031E073FE211B674A55733031094BBF", "NB-IoT SIM (Telecommunication)" }, { "3B9F96801FC30068104405014649534531C80790001A", "SETEC SetCard 32K PKI Evaluated SetCOS 4.4.1" }, { "3B9F96801FC38031E073FA21006331602383109000BE", "TAISYS SIMoME JAR (JavaCard)\nhttp://www.taisys.com/p-detail?id=39beTne-hf4u2Y5DnWghweplyFR-dUUf1-xpy55cWQ" }, + { "3B9F96801FC38031E073FE2100671101674006007789", "Beni's UICC 4G LTE (Telecommunication)\nhttps://cslgroup.co.id/" }, { "3B9F96801FC38031E073FE211BB3E2027E830F900082", "Vodafone SIM Card (D2, 1800Mhz, Germany, Twincard, possibly others too?), manufactured by Gemplus (See stamp on the chip)\nMobileOne (Singaporean 3G/GSM operator) SIM card 'II(3G-64) M1 3G '" }, { "3B9F96801FC68031E073F62113674D45220079020080", "TMobile (Telecommunication)" }, { "3B9F96801FC68031E073F62113674D4522008001007A", "ORANGE SPAIN GSM 4G SIM (Telecommunication)" }, { "3B9F96801FC68031E073F62113675602220080010127", "giffgaff USIM (Telecommunication)" }, { "3B9F96801FC68031E073F62113675603220121010087", "Rain 4G 5G Internet Service provider (Telecommunication)\nhttps://www.rain.co.za" }, + { "3B9F96801FC68031E073F62113675603220121020084", "T-Mobile Sim Card (Telecommunication)" }, { "3B9F96801FC68031E073FE2111633F011183079000E4", "VR-Bank VRNetworld HBCI Card (Bank)" }, { "3B9F96801FC68031E073FE2113574A330577333300E2", "USIM issued by Moldcell mobile operator in Moldova (Telecommunication)\nhttp://www.moldcell.md/" }, + { "3B9F96801FC68031E073FE211B6300850083819000C2", "Vodafone IoT USIM (Telecommunication)" }, { "3B9F96801FC68031E073FE211B6441024100829000C2", "Empire Bank ltd (Bank)\nFinnish Telia SIM-card (Telecommunication)" }, { "3B9F96801FC68031E073FE211B644104810082900004", "SAP Leonardo IoT Connect 365 SIM card (Telecommunication)\nhttps://www.sap.com/uk/products/enterprise-iot-connect.html" }, { "3B9F96801FC68031E073FE211B644115010082900095", "Telia LT prepaid Ezys USIM (Telecommunication)\nhttps://www.ezys.lt" }, { "3B9F96801FC68031E073FE211B6441177300829000E5", "Prixtel SIM card over OrangeF network (Telecommunication)\nhttps://www.prixtel.com" }, { "3B9F96801FC68031E073FE211B6441193100829000A9", "Taiwan Star Telecom Corporation Limited (Telecommunication)\nhttps://www.tstartel.com/CWS/" }, + { "3B9F96801FC68031E073FE211B6441247100829000D4", "RWG Mobile SIM Card (Telecommunication)\nhttps://www.rwgmobile.wales/rates-plans-eng-per/" }, { "3B9F96801FC68031E073FE211B644124910082900034", "Fido Canada (Telecommunication)" }, { "3B9F96801FC68031E073FE211B6441255100829000F5", "R&S CMW-Z06 Multi Test SIM (Telecommunication)" }, { "3B9F96801FC68031E073FE211B644130320082900083", "SFR (Telecommunication)" }, { "3B9F96801FC68031E073FE211B6441346100829000D4", "Ting X1 GSM SIM Card (4G, T-Mobile network) (Telecommunication)\nhttps://ting.com/shop/gsmSIM" }, + { "3B9F96801FC68031E073FE211B65CA010E0209810599", "Liquid Telecom Zambia (Telecommunication)\nhttps://zm.liquidhome.tech/" }, { "3B9F96801FC68031E073FE211B66D00206131218031E", "SIM card (Telecommunication)" }, + { "3B9F96801FC68031E073FE211B66D002061312180419", "T-Mobile NL SIM only (Telecommunication)" }, { "3B9F96801FC68031E073FE211B66D00206E20F1801F0", "Telekom Sim card (Telecommunication)" }, { "3B9F96801FC68031E073FE211B66D00206E20F1803F2", "Vulcan 0502 T-Mobile SIM (Telecommunication)" }, { "3B9F96801FC68031E073FE211B66D00206E20F1804F5", "T-Mobile Nederlands (Telecommunication)\nhttps://t-mobile.nl/" }, @@ -2565,6 +2811,7 @@ const static atr_t AtrTable[] = { { "3B9F96801FC68031E073FE211B66D00221AB11180180", "Telekom Germany Triple SIM issued in 2018 (Telecommunication)" }, { "3B9F96801FC68031E073FE211B66D00221AB11180786", "telekom HU nano sim card (Telecommunication)\nhttps://www.telekom.hu" }, { "3B9F96801FC68031E073FE211C6441193100829000AE", "SORACOM SIM (plan unknown) (Telecommunication)" }, + { "3B9F96801FC78031A073BE21136742470111000001CC", "Bank of Hawai'i (Bank)\nhttps://www.boh.com/" }, { "3B9F96801FC78031A073BE2113674320071800000100", "sysmoUSIM-SJS1 (Telecommunication) (Telecommunication)\nhttp://www.sysmocom.de/products/sysmousim-sjs1-sim-usim" }, { "3B9F96801FC78031A073BE21136743200718000001A5", "sysmoUSIM-SJS1 (Telecommunication)\nhttp://www.sysmocom.de/products/sysmousim-sjs1-sim-usim" }, { "3B9F96801FC78031A073BE21136744220610000001A9", "Fairwaves test SIM card (Telecommunication)\nhttp://fairwaves.co" }, @@ -2576,6 +2823,9 @@ const static atr_t AtrTable[] = { { "3B9F96801FC78031E073F62113675603270089010228", "TMobile Prepaid USIM (Telecommunication)" }, { "3B9F96801FC78031E073F621136756032701010203A3", "USIM LTE MOVISTAR (Telecommunication)" }, { "3B9F96801FC78031E073F621136756032701020100A0", "vivo (Other)" }, + { "3B9F96801FC78031E073F62113675603270120020081", "VALID brand SIM card from T-Mobile (Telecommunication)" }, + { "3B9F96801FC78031E073F6211367560346014901008A", "T-Mobile Poland pre-paid SIM card (Telecommunication)" }, + { "3B9F96801FC78031E073F6A157574A4D020B6110005B", "G+D Mobile Security for private 5G USIM (Telecommunication)\nhttps://www.gi-de.com/en/connectivity/mobile-network-operator/5g#5g-sim" }, { "3B9F96801FC78031E073FE21..63......83..9000..", "TIM (Italy) 128KB GSM SIM\nH3G (Italy) UMTS USIM\nVodafone (UK) SIM" }, { "3B9F96801FC78031E073FE211163407262830790009A", "GSM SIM / LTE UICC card issued by Omnitel, Lithuania (Telecomunications)" }, { "3B9F96801FC78031E073FE2111634082918307900099", "Chunghwa Telecom (Taiwan) 3G/4G PrePaid card\nhttps://www.twgate.net/prepaidcard/product_en.html" }, @@ -2591,6 +2841,8 @@ const static atr_t AtrTable[] = { { "3B9F96801FC78031E073FE2113574A330E25333200BB", "Sintel hi! Tourist prepaid (Telecommunication)\nhttp://www1.singtel.com/personal/phones-plans/mobile/prepaid/hitouristsimcards.html" }, { "3B9F96801FC78031E073FE2113574A330E26333200B8", "Vodafone sim card (Telecommunication)" }, { "3B9F96801FC78031E073FE2113574A330E3F333400A7", "SIM Card (Telecommunication)" }, + { "3B9F96801FC78031E073FE2113574A338101330017", "Telefonica M2M Global SIM (Telecommunication)" }, + { "3B9F96801FC78031E073FE2113574A33810433330014", "PureTalk SIM Card (Telecommunication)" }, { "3B9F96801FC78031E073FE2113679118020406060651", "USIM (3G PF) Orange" }, { "3B9F96801FC78031E073FE211367931801010401095F", "Telstra 128K Universal Orange SIM Card (Telecommunication)" }, { "3B9F96801FC78031E073FE2113679319010401010750", "Telefonica m2m simcard, Movistar o2 vivo (Telecommunication)" }, @@ -2600,6 +2852,7 @@ const static atr_t AtrTable[] = { { "3B9F96801FC78031E073FE211367933001030301047F", "T-Mobile US SIM card (Telecommunication)" }, { "3B9F96801FC78031E073FE211367933001030403027C", "Comprion test U(SIM): model 128K/J LTE Test (U)SIM - Mini-UICC, product number Prod. No.: 10432006 (Telecommunication)\nhttp://www.comprion.com/en/products/test__u_sims/3g_test_usim_cards" }, { "3B9F96801FC78031E073FE211367933001060201027D", "Morpho USIM (Telecommunication)" }, + { "3B9F96801FC78031E073FE2113679330010802010273", "Bouygues Telecom SIM (Telecommunication)" }, { "3B9F96801FC78031E073FE211367933001110201026A", "R&S CMW-Z04 Mini-UICC Test Card (Telecommunication)\nhttp://www.rhode-schwartz.com" }, { "3B9F96801FC78031E073FE2113679331010801010172", "Morpho (Telecommunication)" }, { "3B9F96801FC78031E073FE2113679403030A02020244", "Digi mobil Romania (old sim card version) (Telecommunication)" }, @@ -2609,6 +2862,7 @@ const static atr_t AtrTable[] = { { "3B9F96801FC78031E073FE211367940401070202024C", "Orange Mobicarte (France)" }, { "3B9F96801FC78031E073FE211367940404030505054A", "Claro operator SIM" }, { "3B9F96801FC78031E073FE211367941602070502025A", "CSL Mobile / PCCW SIM Card (Telecommunication)\nhttp://www.hkcsl.com/" }, + { "3B9F96801FC78031E073FE211367941602120101014B", "Airtel India Sim Card (Telecommunication)" }, { "3B9F96801FC78031E073FE2113679801010202030142", "Telenor SIM card (Hungary) (Telecommunication)\nhttps://www.telenor.hu" }, { "3B9F96801FC78031E073FE2113679801010402030247", "ReadySIM / T-Mobile USA USIM (2013) (Telecommunication)\nhttp://www.readysim.com/" }, { "3B9F96801FC78031E073FE2113679801010803010349", "Yesss! SIM card (Austria) (Telecommunication)\nhttps://www.yesss.at" }, @@ -2629,8 +2883,11 @@ const static atr_t AtrTable[] = { { "3B9F96801FC78031E073FE2115574A330E3B333400A5", "O2 Spain phone SIM (Telecommunication)\nhttps://o2online.es/" }, { "3B9F96801FC78031E073FE2115574A330E3F333500A0", "Telefonica (Germany) SIM Card (Telecommunication)" }, { "3B9F96801FC78031E073FE2117574A330E3F333400A3", "Telecommunication (SIM or USIM card) T-Mobile Communications (Telecommunication)" }, + { "3B9F96801FC78031E073FE2117574A330E3F333500A2", "Megafon (RUS) SIM Card (Telecommunication)\nhttps://megafon.ru" }, { "3B9F96801FC78031E073FE2117574A330E3F333600A1", "Bell Mobility MULTI SIM (Telecommunication)\nhttps://bell.ca" }, { "3B9F96801FC78031E073FE2117574A33810433360015", "HoT Austria SIM Card (Telecommunication)\nhttps://hot.at/" }, + { "3B9F96801FC78031E073FE2117574A3382033339001E", "Sm@rtSIM Zeta (Giesecke & Devrient SIM) (Telecommunication)" }, + { "3B9F96801FC78031E073FE2117574A33820433390019", "NB-IoT SIM (Telecommunication)" }, { "3B9F96801FC78031E073FE211B57318660B21A0C0C9F", "SIM CARD (JavaCard)" }, { "3B9F96801FC78031E073FE211B630057008381900011", "3 (3g microUSIM) Italian subsidiary H3G" }, { "3B9F96801FC78031E073FE211B634041918307900050", "giffgaff UK 3G SIM\nnetzclub sponsored mobile\no2 Loop GSM SIM Germany (PREPAID) from 2013" }, @@ -2655,7 +2912,10 @@ const static atr_t AtrTable[] = { { "3B9F96801FC78031E073FE211B6441447300829000B7", "Bouygues Telecom (French Mobile Provider SIM card) (Telecommunication)\nhttps://www.bouyguestelecom.fr" }, { "3B9F96801FC78031E073FE211B6441503100829000E1", "telcel sim card (Telecommunication)" }, { "3B9F96801FC78031E073FE211B6441725100829000A3", "Free Mobile (French wireless service provider) SIM card (mini-SIM with micro-SIM cutout) received in 2020-09 (Telecommunication)\nhttps://mobile.free.fr/" }, + { "3B9F96801FC78031E073FE211B6441725200829000A0", "Woolworths Mobile Prepaid SIM (Telecommunication)\nhttps://mobile.woolworths.com.au/" }, { "3B9F96801FC78031E073FE211B6441763200829000C4", "T-Mobile SIM card issued April 2021 (Telecommunication)" }, + { "3B9F96801FC78031E073FE211B6450040100826A82EC", "SIM (Telecommunication)" }, + { "3B9F96801FC78031E073FE211B6450055100829000C5", "Sim card Team Telecom Armenia (Telecommunication)\nhttps://www.telecomarmenia.am/hy/" }, { "3B9F96801FC78031E073FE211B65240109010081057B", "Lycamobile (UK) GSM SIM card" }, { "3B9F96801FC78031E073FE211B65260109000781057F", "EMT WPKI 2015 (ECC) subscription (Telecommunication)\nhttps://www.emt.ee/en/pakkumised/mobiil-id" }, { "3B9F96801FC78031E073FE211B65270109010381057B", "slarmy (Telecommunication)" }, @@ -2663,8 +2923,12 @@ const static atr_t AtrTable[] = { { "3B9F96801FC78031E073FE211B652A010A0102810574", "Thailand AIS SIM Card (Telecommunication)" }, { "3B9F96801FC78031E073FE211B652A010E0201810570", "gsm (Telecommunication)" }, { "3B9F96801FC78031E073FE211B652D010C0400810572", "Tri Indonesia Bima+ SIM Card (Telecommunication)\nhttps://beta.tri.co.id/3digiworld/Bimaplus" }, + { "3B9F96801FC78031E073FE211B652F0109020A810579", "cellcom israel sim (Telecommunication)" }, { "3B9F96801FC78031E073FE211B652F010A0301810570", "SMART Prepaid SIM (Telecommunication)" }, + { "3B9F96801FC78031E073FE211B652F010A0304810575", "Smart Telecom (PH) (Telecommunication)\nhttps://smart.com.ph/Prepaid/sim-and-phones/lte-prepaid-sim" }, + { "3B9F96801FC78031E073FE211B652F010D0100810574", "vodacom_sim (Pay TV)" }, { "3B9F96801FC78031E073FE211B6556544C017481056D", "Viettel LTE SIM (Telecommunication)" }, + { "3B9F96801FC78031E073FE211B6556544C017681056F", "Viettel Telecom (Telecommunication)" }, { "3B9F96801FC78031E073FE211B65630109020181053E", "2degrees Mobile SIM Card New Zealand (Telecommunication)\nhttp://2degreesmobile.co.nz" }, { "3B9F96801FC78031E073FE211B65BA010904048100E1", "Blank SIM (Telecommunication)" }, { "3B9F96801FC78031E073FE211B66D0016B820E1801FE", "Telekom Deutschland GmbH - Xtra Data Karte (3G SIM)" }, @@ -2678,11 +2942,17 @@ const static atr_t AtrTable[] = { { "3B9F96803FC7008031E073FE211F6441262100829000A3", "Smartjac SMAOT100A234FF (Telecommunication)\nhttps://smartjac.com" }, { "3B9F96803FC7828031E073F62157574A330581053000CE", "COMPRION M2M eUICC (Telecommunication)" }, { "3B9F96803FC7828031E073F62157574A4D020B60010069", "eSIM GSMA Card (Telecommunication)\nhttps://www.gsma.com/newsroom/wp-content/uploads/SGP.22_v2.2.pdf" }, + { "3B9F96803FC7828031E073F62157574A4D020B60610009", "ting (Telecommunication)" }, + { "3B9F96803FC7828031E073FE211B57AA8660F0010011EE", "eSIM.me pluggable eSIM (Telecommunication)\nhttps://esim.me/" }, + { "3B9F96803FC7828031E073FE211B633A204E8300900031", "eSIM (Telecommunication)" }, + { "3B9F96803FC7828031E075F62157210355020B60500019", "st33g1m2 (Telecommunication)\nhttps://www.st.com/en/secure-mcus/st33g1m2.html" }, + { "3B9F96803FC7A08031E073F62116574A4D020233456377", "ISIS-Ready T-Mobile Sim Card (Telecommunication)" }, { "3B9F96803FC7A08031E073F62156574A4D020B3444005B", "Norwegian telenor (Telecommunication)\nhttp://www.telenor.no" }, { "3B9F96803FC7A08031E073F62157574A4D020B34546329", "Orange FR - opa (Telecommunication)" }, { "3B9F96803FC7A08031E073FE211B63F100E8830090005E", "UICC CARD (Telecommunication)" }, { "3B9F96803FC7A08031E073FE211B6407689A00829000B4", "Orange SIM Card (Telecommunication)" }, { "3B9F96803FC7A08031E073FE211B64080503008290004F", "NFC-enabled SIM card of MTS Russia. (Telecommunication)" }, + { "3B9F96803FC7A08031E073FE211F6300690083819000AB", "GSM file system and SWP sample supplied with STMicro development kit (Other)" }, { "3B9F96803FC7A08031E073FE211F6441269100829000B3", "LTE Lab SIM Ver 1.3 (Telecommunication)" }, { "3B9F968131FE458065544312210831C073F6218081059A", "Scientific and Technological Research Council of Turkey (test card) (eID)" }, { "3B9F968131FE45806755454B41451212318073B3A180EA", "AKiS v1.2 on nxp chip" }, @@ -2691,10 +2961,12 @@ const static atr_t AtrTable[] = { { "3B9F968131FE45806755454B41451292318073B3A1806A", "AKiS v1.2.2 on infineon chip" }, { "3B9F968131FE45806755454B41451293318073B3A1806B", "AKiS v1.3 on infineon chip" }, { "3B9F968131FE5D00640428010231C073F701D000900065", "German eTicketing SAM (Transport)\nhttps://www.eticket-deutschland.de/" }, + { "3B9F968131FE6D00640428010231C073F701D000900055", "VDV-KA Secure Access Module (German Public Transport) (Transport)\nhttps://www.eticket-deutschland.de/" }, { "3B9F968131FE9D006405A0030431C073F701D000900028", "Deutsche Telekom AG, TeleSec PKS ECC Signature Card (PKI)\nhttps://www.telesec.de/en/signaturecard" }, { "3B9F9681B1FE451F070064051EB20031B0739621DB0590005C", "SignTrust (www.signtrust.de)\nInfinion SLE66CX680PE with Starcos 3.2\nhttp://www.deutschepost.de/dpag?xmlFile=link1015459_49595" }, { "3B9F9681B1FE451F070064051EB20331B0739621C005900044", "German Dentist ID (eID)" }, { "3B9F96C00A1FC38031E073FE211B63F100AD830F9000DA", "SIM SFR Pro (French Mobile Operator)" }, + { "3B9F96C00A1FC68031E073FE211F65D00233131B810FFA", "Tinkoff SIM card (Telecommunication)" }, { "3B9F96C00A1FC78031E073FE211B63F100AD830F9000DE", "H3G (Italy) UMTS USIM card" }, { "3B9F96C00A1FC78031E073FE211B65D0011009228100F3", "Verizon 4G LTE SIM Card (Telecommunication)\nhttp://www.verizonwireless.com/support/information/4gsim.html" }, { "3B9F96C00A1FC78031E073FE211B65D0018E0E3281007A", "Rogers 3G SIM card" }, @@ -2702,6 +2974,7 @@ const static atr_t AtrTable[] = { { "3B9F96C00A1FC78031E073FE211F65D0020B11A4810F7E", "Telia Finland Oyj, network operator LTE (Telecommunication)" }, { "3B9F96C00A1FC78031E073FE211F65D013370F3B810FD2", "Gemalto Security Element (PKI)" }, { "3B9F96C00A31FE45435431690B010001000000000000000D", "EU smart tachograph card (driver/company/control/workshop)\nhttps://dtc.jrc.ec.europa.eu/" }, + { "3B9F96C00A31FE45754A6176656C696E2D4F5320312E3051", "Vietnam ID Card (eID)" }, { "3B9F96C00A3FC6A08031E073FE211B65D001740EEB810FD7", "Verizon '4G LTE' USIM (Telecommunication)" }, { "3B9F96C00A3FC6A08031E073FE211B65D001740F50810F6D", "5G (Telecommunication)" }, { "3B9F96C00A3FC6A08031E073FE211F65D001900F3B810FE6", "Verizon US USIM card (Telecommunication)" }, @@ -2715,6 +2988,7 @@ const static atr_t AtrTable[] = { { "3B9F97801FC68031E073FE211B6441442100829000E5", "SAKURA Internet SIM (Telecommunication)\nhttps://www.sakura.ad.jp/services/sim/" }, { "3B9F97801FC68031E073FE211B65CA010E060B81059E", "rain Networks - R15 4G Sim Card (Telecommunication)\nhttp://www.rain.co.za" }, { "3B9F97801FC78031E073FE211367980801120401045B", "Tmobile Sim card (Telecommunication)" }, + { "3B9F97801FC78031E073FE2113679814010202010257", "Orange SIM from Egypt (Telecommunication)" }, { "3B9F97803FC7828031E073FE211F640856210082900019", "eSIM card (Telecommunication)" }, { "3B9F97803FC7828031E073FE211F6409069200829000FB", "Ubigi Transatel esim (Telecommunication)" }, { "3B9F978131FE458065544312210831C073F621808105", "Republic of Turkey Identity Card (eID)\nhttps://bilgem.tubitak.gov.tr/en/icerik/national-identity-card-tr-nc-identity-card" }, @@ -2761,6 +3035,7 @@ const static atr_t AtrTable[] = { { "3BB7110081319043A5..............", "Siemens CardOS/M V1.4 (SLE44C80S)" }, { "3BB7110081319043C517B09D19221E1F", "CryptoTech blank access/authentication card (Other)\nhttp://www.cryptotech.com.pl/" }, { "3BB7110081319053B5..............", "CardOS EM/V1.4 (SLE44CR80S)" }, + { "3BB711008131FE432025854702202866", "Research Institute of Applied Information Technologies (Other)\nhttp://dodatok.osvita.net/" }, { "3BB711008131FE4320283FB50320313B", "Research Institute of Applied Information Technologies (Other)\nhttp://dodatok.osvita.net/" }, { "3BB718008131704310434E5452563253", "Avtor SecureToken (PKI)" }, { "3BB718008131FE6553504B323490005A", "Giesecke & Devrient Starcos 2.4" }, @@ -2770,6 +3045,8 @@ const static atr_t AtrTable[] = { { "3BB794008131FE6553504B32339000D1", "Giesecke & Devrient Starcos 2.3\nDeutsche Bank WebSign (RSA-Card)\nG&D StarSign Token\nOsakidetza ONA (eID)\nhttp://www.osakidetza.euskadi.eus/r85-ckserv01/es/contenidos/nota_prensa/ruedasanidad35/es_rs/ruedasanidad35_c.html" }, { "3BB813008131205D0057696E4361726402", "SmartCard for Windows 1.1" }, { "3BB813008131FA524348544D4F494341A5", "citizen digital certificate (PKI)\nhttp://moica.nat.gov.tw/" }, + { "3BB897008131FE45FFFF148230502300F1", "UAE Emirates ID (eID)\nhttps://www.icp.gov.ae" }, + { "3BB89700C00831FE45FFFF148230502300B8", "Infineon SECORA ID X (JavaCard)" }, { "3BB918008131FE9E8073FF614083000000DF", "Serbian Identity Card\nThis is the new Serbian biometric identity card (every adult cityzen\nmust have). The chip contains owners picture, name, date and place\nof birth, current address, unique ID number and fingerprint." }, { "3BB9940040144747334D4838353330", "T D1 GSM card (Telecommunication)" }, { "3BB9940040144747334E4838363430", "GSM-SIM card of the Austrian mobile phone provider One\nhttp://www.one.at\nProximus SIM - Belgium (SetCOS?)\no2 GSM-SIM card Germany 2003" }, @@ -2790,6 +3067,7 @@ const static atr_t AtrTable[] = { { "3BBA96008131865D0064056002033180900066", "Telesec TCOS 2 (SLE66P)\nTCOS 2.0 (on CX320P)\nTeleSec Netkey Card" }, { "3BBA96008131865D00640560020331809000667001040530C9", "TeleSec Netkey E4 Card" }, { "3BBA96008131865D0064057B0203318090007D", "TeleSec NetKey Card\nDeutsche Post card (tcos)" }, + { "3BBB18008131FE4580670518B1020184008105E0", "STARCOS Smart Card (Other)\nhttps://www.gi-de.com/de/identities/unternehmenssicherheit/signaturkarte" }, { "3BBB1800C01031FE4580670412B003030000810138", "Giesecke & Devrient Star Sign Card, STARCOS 3.0 DI, 72 KB, RSA2048 bit\nGiesecke & Devrient Smartc@fe Expert 32K v2.0" }, { "3BBB1800C01031FE4580670412B00303000081053C", "Philips Smart MX\nSzczecin University of Technology in Poland student identity card (Elektroniczna Legitymacja Studencka = student identity card)\nCSOB bank, Czech Republic\nCATCert (Agencia Catalana de Certificacio) catalan government workers identity card" }, { "3BBB1800C03E31FE654726442054534D20312E30B7", "Italian Tachograph Driver Card" }, @@ -2873,9 +3151,9 @@ const static atr_t AtrTable[] = { { "3BD0A8FF81F1FB24001FC3F4", "Philips DESFire SAM" }, { "3BD218008131FE450101C1", "Dutch License Plate Card (RDW)\nhttps://commons.wikimedia.org/wiki/File:Kentekencard_voorzijde_1_december_2013.jpg" }, { "3BD218008131FE58C90114", "Atos CardOS5 (PKI)\nhttp://atos.net/NR/rdonlyres/17C7BDD0-225B-4A58-B9A4-438EA3F3238A/0/74743_20120830_160149_cardos_v5_0__datenblatt_en.pdf" }, - { "3BD218008131FE58C90217", "WVDP (West Valley Demonstration Project?) (PKI)" }, + { "3BD218008131FE58C90217", "Atos CardOS 5.3 (PKI)\nhttp://www.atos.net/cardos" }, { "3BD218008131FE58C90316", "Austrian 'RKS-Card' issued by GlobalTrust (PKI)\nhttps://secure.globaltrust.eu/info-rksv.html" }, - { "3BD218008131FE58C90411", "Identity Card in Slovakia with security chip and e-signature issued after 2021-06-21 (eID)" }, + { "3BD218008131FE58C90411", "Identity Card in Slovakia with security chip and e-signature issued after 2021-06-21 (eID)\nD-TRUST Card 4.1 Standard, qualified signature card" }, { "3BD218008131FE58CA6076", "CardOS IoT V5.4 (PKI)\nhttps://atos.net/wp-content/uploads/2018/11/ct_181127_lpm_cardos_iot_v5-4_fs_en4_web.pdf" }, { "3BD21802C10A31FE58C80D51", "Siemens Card CardOS M4.4" }, { "3BD396FF81B1FE451F078081052D", "German public health insurance card (Elektronische Gesundheitskarte eGK), 2nd generation (G2) (HealthCare)" }, @@ -2886,6 +3164,7 @@ const static atr_t AtrTable[] = { { "3BD518FF8191FE1FC38073C8211309", "Athena IDProtect Key (v2)\nhttp://www.athena-scs.com/product.asp?pid=33" }, { "3BD5950400AE01020101", "Axalto Cyberflex Access 64K v2b SM 1.1" }, { "3BD595FF8091FE1FC38073C8211385", "Athena IDProtect - Cryptographic Java Card\nhttp://www.athena-scs.com/product.asp?pid=32" }, + { "3BD596028031FE654F734549441F", "AVR128DA32 microcontroller based open source EID smartcard with RSA and ECC. (eID)\nhttps://oseid.sourceforge.io/" }, { "3BD596FF8191FE1FC34332333030CC", "HID Global - Crescendo C2300 (PKI)\nhttps://www.hidglobal.com/products/cards-and-credentials/crescendo/c2300" }, { "3BD6180080B1806D1F038051006110309E", "Atmel/Athena T0 PC/SC Compliance Test Card No. 1" }, { "3BD618008131FE7D415350204F5383", "ASP FIXED CHAL1, 2, 3 and 4 (Other)" }, @@ -2893,14 +3172,17 @@ const static atr_t AtrTable[] = { { "3BD6960081B1FE451F078031C1521118F8", "smart card from NASA, 2019 (PKI)" }, { "3BD6960081B1FE451F878031C152211949", "DHS CAC card (PKI)" }, { "3BD6960081B1FE451F878031C152411A2A", "Identiv SCR3310 v2.0 (eID)" }, - { "3BD6970081B1FE451F078031C1521118F9", "NASA Personal Identity Verification (PIV) card (eID)" }, + { "3BD6970081B1FE451F078031C1521118F9", "NASA Personal Identity Verification (PIV) card (eID)\nIDEMIA Cosmo V8.0 with a PIV applet" }, { "3BD6970081B1FE451F078031C1521119F8", "Secure badge (PKI)" }, { "3BD6970081B1FE451F878031C152211948", "DOS PIV (PKI)" }, { "3BD6970081B1FE451F878031C152211A4B", "ID-One PIV 2.4 (P/N 1501381) from IDEMIA (Other)" }, - { "3BD6970081B1FE451F878031C152411A2B", "Oberthur Technologies ID-One PIV/CIV on V8 Device (eID)\nhttps://csrc.nist.gov/csrc/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp2986.pdf" }, + { "3BD6970081B1FE451F878031C152411A2B", "Oberthur Technologies ID-One PIV/CIV on V8 Device (eID)\nhttps://csrc.nist.gov/csrc/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp2986.pdf\nIDEMIA Cosmo V8.1 with a PIV applet" }, + { "3BD81800801F078031C1640806920F", "US Government CAC (PKI) / IDEMIA Cosmo v8 (PKI)\nhttps://www.idemia.com/id-one-piv-card" }, + { "3BD81800801F078031C1640806920FDF", "US DoD Common Access Card (IDEMIA Cosmo v8) (PKI)" }, { "3BD8180080B1FE451F078031C1640806920FD5", "Oberthur Cosmo v8 (PKI)" }, { "3BD818FF8131FE458064041BB42A8105D5", "Schweizerische Krankenversicherungskarte KVG (HealthCare)" }, { "3BD818FF81B1FE451F038064041AB403810561", "D-Trust multicard advanced 3.1\nGerman public health insurance card ('Gesundheitskarte'), issuer SBK 'Siemens Betriebskrankenkasse'" }, + { "3BD896008031FE4400531200840F90001F", "Cape Verde National Identity Card (CNI) (eID)\nhttps://sniac.cv/cartao-nacional-de-identificacao/" }, { "3BD8960081B1FE451F0743485447504B494ADD", "Citizen Digital Certificate, Taiwan (PKI)\nhttp://moica.nat.gov.tw/" }, { "3BD896FF8131FE458064041BB42A81055B", "Swiss LAMal health insurance card" }, { "3BD911008131FE8D0000464F4D53312E3132", "TFOMS (eID)\nhttp://www.samtfoms.ru" }, @@ -2919,13 +3201,17 @@ const static atr_t AtrTable[] = { { "3BDA13FF8131FB468012392F31C173C601C03B", "My Number Card (The Social Security and Tax Number System in JAPAN) (eID)\nhttp://www.cas.go.jp/jp/seisaku/bangoseido/english.html" }, { "3BDA1802C10A31FE584B53776973735369676EA9", "SuisseID Post - ATOS CardOS 4.x (eID)\nhttps://postsuisseid.ch/" }, { "3BDA18FF8191FE1FC350564A434F503353494472", "J3H145 (P6 SecID) purchased from FUTAKO Ltd., Taiwan (JavaCard)\nhttp://www.javacardsdk.com" }, + { "3BDA18FF8191FE1FC380641211111073C0C1801B", "Belarus national identity card (passport)\nhttps://eng.belta.by/infographica/view/id-cards-in-belarus-7095/" }, { "3BDA18FF81B1FE451FC3546963546F6B20322E3068", "TikTok 2.0 (PKI)" }, { "3BDA18FF81B1FE451FC3546963546F6B20332E3069", "TicTok 3.0 (PKI) (PKI)\nhttps://en.cryptoshop.com/products/cryptas-tictok-v3-basisartikel.html" }, { "3BDA18FF81B1FE751F030031C573C001400090000C", "OpenPGP Card V2" }, { "3BDA18FF81B1FE751F030031F573C001600090001C", "OpenPGP Card V3" }, { "3BDA9400004D4D41524A2B33399000", "SIM card from Vodafone Spain" }, { "3BDA9500400A2508004053434F535441", "Card used for issuing commodity to benificiary for rice, wheat and more (Other)" }, + { "3BDA96FF8031FE454D696E694C6F61646572AB", "iClass SE Processor (Miniloader Mode) (Other)\nhttps://www.hidglobal.com/products/embedded-modules/iclass-se/sio-processor" }, + { "3BDA96FF8031FE45536E6D704C6F61646572A8", "iClass SE Processor (SNMP Loader Mode) (Other)\nhttps://www.hidglobal.com/products/embedded-modules/iclass-se/sio-processor" }, { "3BDA96FF8131FE45805631B85349434181057B", "STARCOS 3.5 ID ECC C1R (PKI)\nhttps://www.gi-de.com/fileadmin/user_upload/MS/Certificates/STARCOS35_ID_ECC_TABLES.pdf" }, + { "3BDA96FF8191FE1FC343323330302D46495053E2", "Crescendo 2300 FIPS (JavaCard)" }, { "3BDA96FF81B1FE451F0780584943412056322E30E9", "Starcos chip card from Giesecke & Devrient (PKI)\nhttps://ica.cz/functionality-smart-card" }, { "3BDB11FF5000FF0000000000000007921603", "NEC V-WAY64 v2.1" }, { "3BDB1800801F030031C06477E303008290004F", "Oberthur ID-One Cosmo 64K V5.2" }, @@ -2948,9 +3234,10 @@ const static atr_t AtrTable[] = { { "3BDB960080B1FE451F830031C064102301000F900063", "Extremenian Health Service target (HealthCare)\nhttps://saludextremadura.ses.es/web/preguntas-frecuentes" }, { "3BDB960080B1FE451F830031C0641A1801000790005A", "Ercom CRYPTOSMART\nhttp://www.ssi.gouv.fr/entreprise/qualification/gamme-cryptosmart-pour-la-securisation-des-smartphones-et-des-tablettes/" }, { "3BDB960080B1FE451F830031C0641A1801000F900052", "Serbian Car registration ID card\nhttp://blog.goranrakic.com/archives/2011/07/citanje_saobracajne_dozvole_sa_cipom.html" }, - { "3BDB960080B1FE451F830031C0641A71010007900033", "ChamberSign Gemalto USB Shell Token V2 - Certificat Audacio ** (eID)\nhttp://www.chambersign.fr/certificat-rgs-audacio/" }, + { "3BDB960080B1FE451F830031C0641A71010007900033", "ChamberSign Gemalto USB Shell Token V2 - Certificate Audacio ** (eID)\nhttp://www.chambersign.fr/certificat-rgs-audacio/" }, { "3BDB960080B1FE451F830031C064B0FC100007900005", "Oberthur Cosmo V7 debug card (SDK)" }, { "3BDB960080B1FE451F830031C064B0FC10000F90000D", "ID-One PIV (that's the only non-numeric identifying mark) (PKI)" }, + { "3BDB960080B1FE451F830031C064BAFC10000790000F", "Oberthur ID-One Cosmo v7.0 80K (eID)\nhttps://www.ssi.gouv.fr/uploads/IMG/certificat/ANSSI-CC-cible_2011-64en.pdf" }, { "3BDB960080B1FE451F830031C064BE1B0100019000FB", "Bank card" }, { "3BDB960080B1FE451F830031C064C30801000F90009B", "SIM Aruba (Italian provider)" }, { "3BDB960080B1FE451F830031C064C7FC100001900074", "Oberthur Cosmo (eID)\nhttp://www.stampit.org" }, @@ -2962,7 +3249,8 @@ const static atr_t AtrTable[] = { { "3BDB960081B1FE451F0380F9A0000003080000100018", "Oberthur CS PIV End Point v1.08 FIPS201 Certified" }, { "3BDB960081B1FE451F0380F9A0000003480000000149", "Fly Clear card" }, { "3BDB960081B1FE451F8380F9A0000003080000100098", "Oberthur Cosmo v7 128K with PIV applet\nhttp://www.smartcardfocus.com/shop/ilp/id~410/p/index.shtml" }, - { "3BDB96FF80B1FE451F870031C164093772130F9000F4", "French ID Card 2021 (eID)\nhttps://ants.gouv.fr/Les-titres/Carte-nationale-d-identite/La-puce-de-la-nouvelle-carte-nationale-d-identite" }, + { "3BDB96FF80B1FE451F870031C164093364490F9000BC", "cnie Carte Nationale d'Identite Electronique (eID)" }, + { "3BDB96FF80B1FE451F870031C164093772130F9000F4", "French ID Card 2021 (eID)\nhttps://ants.gouv.fr/nos-missions/les-titres-produits-par-l-ants/les-documents-d-identite/la-puce-de-la-nouvelle-carte-nationale-didentite" }, { "3BDB96FF8131FE4580670534B50201064081051B", "SINA STARCOS 3.5 BX-CombiCard+HSB (Other)" }, { "3BDB96FFC01031FE4580671501B403000900810521", "Digital Tachograph Card for Professional Driver\nolish driver card for digital tachograph" }, { "3BDC1802C10A31FE588031A873B0019B2460071320AA", "Public Services Card | Ireland (Other)\nhttps://psc.gov.ie/" }, @@ -2972,6 +3260,7 @@ const static atr_t AtrTable[] = { { "3BDC18FF8111C18073C821136605036351000233", "GoTrust Idem Key (Other)\nhttps://www.gotrustid.com/idem-key" }, { "3BDC18FF8111FE8073C82113660106013080018D", "Aladdin R.D. JaCarta LT (eID)" }, { "3BDC18FF8191FE1FC3060A2B06010401E910050203D1", "Caregiver card for Dutch Medical System called UZI (Unieke Zorgverlener Identificatie, Caring Unique Identification) (HealthCare)\nhttps://www.uziregister.nl/" }, + { "3BDC18FF8191FE1FC3060A2B06010401E910050204D6", "UZI (HealthCare)" }, { "3BDC18FF8191FE1FC38073C821136601060130040155", "Athena IDProtect Key Laser" }, { "3BDC18FF8191FE1FC38073C821136601061159000128", "JaCarta (PKI)\nhttp://www.aladdin-rd.ru" }, { "3BDC18FF8191FE1FC38073C8211366010B0352000538", "Athena IDProtect Smart Card Logon Card" }, @@ -2979,10 +3268,14 @@ const static atr_t AtrTable[] = { { "3BDC18FF8191FE1FC38073C821136605036057000255", "NXP IDProtect (X) (JavaCard)" }, { "3BDC18FF8191FE1FC38073C821136605036351000250", "JCOP3 SecID P60 CS (JavaCard)" }, { "3BDC96FF8111FE8031C8544356300573FFA1C03B", "NXP Javacard with Athena SCS OS (JavaCard)" }, + { "3BDC96FF8111FE8031C8544356350773FFA1C03C", "NXP JCOP 4, J3R200P0X3U/0ZA16CP NXD6.2 (JavaCard)" }, { "3BDC96FF81B1FE431FC30B46415245474F53414D5632CC", "Multismartcard SAM (used in proprietary Scheidt&Bachmann Smartcard Reader v2)" }, { "3BDD18008131FE4580F9A0000000770100700A90008B", "National ID Card of Peru issued by RENIEC from Oberthur" }, { "3BDD18008131FE4580F9A000000077010800079000FE", "Oberthur Cosmo v7 IAS ECC\nBrazilian 'e-CNPJ' card, issued by Certisign (Oberthur)" }, { "3BDD18008131FE45904C41545649412D65494490008C", "Identity card (eID) Republic of Latvia\nhttp://www.pmlp.gov.lv/lv/pakalpojumi/passes/eid.html" }, + { "3BDD18008191FE1FC3006646530803003671DF00008097", "Feitian K9Plus - ePass FIDO-NFC with PIV (Other)\nhttps://ftsafe.com/products/FIDO/NFC" }, + { "3BDD18FF8191FE1FC3006646530803003671DF00008068", "Feitian FIDO NFC Plus K9 Security Key (Other)\nhttps://www.ftsafe.com/products/FIDO/NFC" }, + { "3BDD18FF8191FE1FC3FF4F70656E506879736963616CF6", "Open Physical PIV-Compatible NXP SECID P60 (eID)\nhttps://openphysical.org/" }, { "3BDD18FFC080B1FE451FC30068D276000028040411009000C9", "Russian Federation driver card for the digital tachograph\nPolish driver card for digital tachograph" }, { "3BDD18FFC080B1FE451FC30068D276000028040971009000A4", "Worktime/driving style monitoring card (Transport)\nhttp://www.paetronics.fi/en/" }, { "3BDD96008010FE8031806301FFC073B3211B8105", "BIFIT iBank 2 USB Key (Bank)\nhttp://bifit.ua" }, @@ -3012,10 +3305,11 @@ const static atr_t AtrTable[] = { { "3BDF18008131FE588031B05202046405C903AC73B7B1D422", "Austrian 'e-Card' (=Health Card) of the 4th generation. (HealthCare)" }, { "3BDF18008131FE58AC31B05202046405C903AC73B7B1D422", "e-Card Austria (HealthCare)" }, { "3BDF18008131FE67005C49434DD49147D276000038330058", "Infineon SICRYPT Card Module D4 PC/SC Compliance Test Card" }, - { "3BDF18008131FE7D006B020C0182011101434E53103180FC", "Italian healtcare card (TS) National Service Card (CNS) (HealthCare)" }, - { "3BDF18008131FE7D006B040C0184011101434E53103180FC", "Italian healthcare card (TS) National Service Card (CNS) (HealthCare)\nhttp://www.regione.toscana.it/cartasanitaria" }, + { "3BDF18008131FE7D006B020C0182011101434E53103180FC", "Italian healthcare card (TS) National Service Card (CNS) (HealthCare)" }, + { "3BDF18008131FE7D006B040C0184011101434E53103180FC", "Italian healthcare card (TS) National Service Card (CNS) (HealthCare)\nhttp://www.regione.toscana.it/cartasanitaria\nhttps://www.agid.gov.it/it/piattaforme/carta-nazionale-servizi" }, { "3BDF18008131FE7D006B150C0180011101434E53103180E9", "Provider: Actalis S.p.A.\ncode: AT00006181\nhttp://www.actalis.it" }, { "3BDF18008131FE7D006B150C0181011101434E53103180E8", "Italian healthcare card (TS) National Service Card (CNS)\nCarta Regionale dei Servizi - Regione Lombardia\nTuscany TS-CNS\nhttp://www.regione.toscana.it/cartasanitaria" }, + { "3BDF18FF8091FE1FC3003138644790ECC273140150829000BB", "Ministry of Interior - France 'Agent Card' (Other)" }, { "3BDF18FF8131FE4580590180484944433730307300011B33", "Crescendo C700 + MiFare 4K\nhttp://www.smartcardfocus.com/shop/ilp/id~265/p/index.shtml" }, { "3BDF18FF8191FE1FC3003138644790ECC273140150829000BA", "Card store authentication and signature keys (JavaCard)\nhttps://ants.gouv.fr/Les-titres/Cartes-Agents/Adhesion/Telechargement-et-support" }, { "3BDF18FF8191FE1FC30031B8640000EC0073940000829000FE", "NXP Jcop3 P60 ChipDoc v7b4 (JavaCard)\nhttps://www.javacardos.com/store/products/10029" }, @@ -3025,6 +3319,7 @@ const static atr_t AtrTable[] = { { "3BDF18FF81F1FE43003F03834D494641524520506C75732053414D3B", "NXP SAM AV2 module" }, { "3BDF18FF81F1FE43003F03834D4946506C75732053414D3B53414D3B", "Mifare SAM -AV2 (PKI)" }, { "3BDF18FF81F1FE43003F07834D49464152452053414D204156333011", "NXP SAM AV3 module" }, + { "3BDF18FF910131FE4680319052410264050200AC73D622C099", "Acos-ID (AUSTRIACARD's Operating System) (Other)\nhttps://www.austriacard.com/digital-security/solutions/card-solutions/acos-id/" }, { "3BDF94FFC080B1FE451F03006AD2760000280415FA10040090006B", "UK Digital Tacho card (Other)" }, { "3BDF94FFC080B1FE451F03006AD2760000280415FA40040090003B", "DVLA Company Card (Transport)" }, { "3BDF9500801F878031A073FF21006345B105830F900060", "FUTURE CARD Normal ISO SIM (Telecommunication)" }, @@ -3038,11 +3333,14 @@ const static atr_t AtrTable[] = { { "3BDF960080B1FE451F838073BC9180F9A00000007780080201A4", "Latvian eSignature card (eID)\nhttps://www.lvrtc.lv/e-signature.html" }, { "3BDF960080B1FE451F870031C16408923201738421E0059000C5", "Company Card for Transport companies (Transport)" }, { "3BDF96008131FE4541434F532D4944303032382E3031366F", "Sri Lankan driving license [ web: motortraffic.gov.lk ] (eID)\nhttp://www.motortraffic.gov.lk/web/index.php?option=com_content&view=article&id=83&Itemid=140&lang=en" }, + { "3BDF96008131FE588031B05202056405A100AC73D622C020", "Austrian health insurance card 'e-card' (HealthCare)\nhttps://de.wikipedia.org/wiki/E-card_(Chipkarte)" }, { "3BDF960081B1FE451F838073CC91CBF9A0000003080000100079", "Test PIV Cards available for sale from NIST\nhttp://csrc.nist.gov/groups/SNS/piv/testcards.html" }, { "3BDF96FF8131FE455A018048494443313158587300011B09", "HID Crescendo iCLASS Px G8H" }, { "3BDF96FF8131FE4580590180504956434C41537300011BDE", "HID Global pivCLASS v1.0 (PKI)\nhttp://www.hidglobal.com/products/cards-and-credentials/pivclass/pivclass-smart-card" }, { "3BDF96FF8131FE45805B44452E42415F53433335328105B5", "Employee ID card from the Federal Employment Agency (Germany) (PKI)\nhttps://www.pki.arbeitsagentur.de/" }, { "3BDF96FF8131FE45805B44452E424E4F544B3130308105A0", "BeA - Certification Card for German Solicitors (Other)\nhttps://bea.bnotk.de/" }, + { "3BDF96FF81B1FE451F870031B96409377213738401E000000000", "National Identity Card of Slovakia (eID) (eID)\nhttps://en.wikipedia.org/wiki/Slovak_identity_card" }, + { "3BDF96FF910131FE4680319052410264050200AC73D622C017", "Acos-ID (AUSTRIACARD's Operating System) (Other)\nhttps://www.austriacard.com/digital-security/solutions/card-solutions/acos-id/" }, { "3BDF97008131FE588031B05202056405A100AC73D622C021", "Austrian healthcare insurance identification card (HealthCare)\nhttps://www.chipkarte.at" }, { "3BDF970081B1FE451F838073CC91CBF9A0000003080000100078", "NASA PIV Card (Other)" }, { "3BE000008131204030", "SmarTEC" }, @@ -3056,6 +3354,7 @@ const static atr_t AtrTable[] = { { "3BE500008121459C100100800D", "BIN 470132 -- BANK OF AMERICA VISA DEBIT -- GEMALTO MGY 0 U1090788B - 12/14 F8 00 89 (Bank)" }, { "3BE500008131FE45D00037008089", "ATM card for Standard Chartered, Taiwan" }, { "3BE500FF8131FE458073C601082D", "MUFG (.jp) (Bank)" }, + { "3BE6000080318066B1A30401110B83", "Java Jcop J2A040 (JavaCard)" }, { "3BE6000080318066B1A30401110B83009000", "VISA Credit Card (Bank)" }, { "3BE60000812145324B010101017A", "Axalto Cyberflex Palmera V5" }, { "3BE600FF8131FE4544492030324D70", "Alior Sync (Poland) - MasterCard Debit Card with PayPass (Bank)\nMasterCard Contactless Debit Card issued by Raiffeisen Bank in Czech Republic\nDebit MasterCard with paypass issued by Bank Zachodni WBK (Poland)\nDebit MasterCard with paypass issued by AliorSync" }, @@ -3075,6 +3374,7 @@ const static atr_t AtrTable[] = { { "3BE700FF8131FE458031C073C62148BE", "Japanese ETC (Electronic Toll Collection System) card (Transport) and Credit card (Issuer: Toyota) (Transport)" }, { "3BE700FF81B1FE451F018031C073C6214820", "Japanese ETC (Electronic Toll Collection System) card (Transport)" }, { "3BE8000040FA0073C84011009000", "KEBTechnology KONA USB SmartCard (Other)" }, + { "3BE800008031FE450073C8401300907DE7", "National Health System of Spain - Consejeria de Sanidad y Servicios Sociales - JUNTA DE EXTREMADURA (HealthCare)\nhttps://www.juntaex.es/es/lajunta/consejo-de-gobierno/vicepresidencia-segunda-y-consejeria-de-sanidad-y-servicios-sociales/servicio-extremeno-de-salud" }, { "3BE80000813120450073C8400000900056", "Visa credit card for Standard Chartered, Taiwan" }, { "3BE800008131FE00506572736F53696DAA", "Simulated virtual smartcard, from project PersoSim (eID)\nhttps://persosim.de/?q=node/33" }, { "3BE800008131FE450073C8400000900088", "VISA Card (Skandinaviska Enskilda Banken) with Swedish BankID\nVISA card (Chinatrust Bank (Taiwan), dual-interface card with a Taipei Metro e-purse function)" }, @@ -3102,7 +3402,7 @@ const static atr_t AtrTable[] = { { "3BE900FFC11031FE55C80120504E34303132AD", "Siemens CardOS/M 3.0 (SLE66CX160S)" }, { "3BEA0000813120438065A2........72D6....", "IDClassic 3XX Cards (with MPCOS Applet)" }, { "3BEA0000813120438065A20101013D72D643A5", "GemXpresso Pro R3 32PK (MPCOS, T=1) (warn reset)" }, - { "3BEA00008131FE450031C173C840000090007A", "Nigerian eID Card (cold reset)\nChip is NXP JCOP 2.4.1R3" }, + { "3BEA00008131FE450031C173C840000090007A", "Nigerian eID Card (cold reset)\nChip is NXP JCOP 2.4.1R3\nDual BCR Signum Mastercard (bank) + Digital Signature Costa Rica (eID)\nhttps://bancobcr.com/wps/portal/bcr/bancobcr/personas/tarjetas/signum_firma_digital/" }, { "3BEA00008131FE45436F6D624F5320494900FE", "UBS VISA Gold Card\nMasterCard from lhv.ee\nNordea Bank Finland PLC Estonian Branch (ABnote)" }, { "3BEA00008131FE454A434F5033315632333290", "NAB VISA Debit card" }, { "3BEA00008131FE454A434F5034315632323195", "HID Crescendo C700\nhttps://www.hidglobal.com/products/cards-and-credentials/crescendo/c700" }, @@ -3173,6 +3473,7 @@ const static atr_t AtrTable[] = { { "3BEF00FF813166456563202049424D20332E3120202020", "IBM eCash" }, { "3BEF00FF813166456563202049424D20332E3120202020CF", "IBM eCash" }, { "3BEF00FF8131864549424D204D4643343030303038333143", "ComCard MFC 4.1" }, + { "3BEF00FF8131FE4141434F532046696F6E6131204C633666", "EUROBANK GR (Bank)\nNBG BANK (Bank)" }, { "3BEF00FF8131FE4541434F53204449616E6131204C63364E", "comdirect VISA card (Bank)\nhttps://www.comdirect.de/konto/karten.html#Visa-Karte" }, { "3BEF00FF8131FE4541434F53204449616E6132204C63364D", "Alior Bank SA (Bank)\nhttps://www.aliorbank.pl/" }, { "3BEF00FF8131FE4565630D12810156001F00006686080122", "Commerzbank signature card SECCOS (6 or 7) providing RAH security profile (Bank)\nhttps://www.chipkartenleser-shop.de/commerzbank/electronic-banking-chipkarten/commerzbank-signaturkarte-2710050006" }, @@ -3219,11 +3520,12 @@ const static atr_t AtrTable[] = { { "3BEF00FF8131FE458031C06B49424D204A65745A204D3239", "UBS Internet Card (IBM JetZ M2)" }, { "3BEF00FF8131FE458031E06B042105026B55555555555568", "MasterCard credit card for Mega International Commercial Bank, Taiwan (Bank)\nhttps://www.megabank.com.tw/creditcard/index.asp" }, { "3BEF00FF8131FF6549424D204D4643393232393238393017", "IBM MFC 4.22 (University of Cambridge smartchip card)" }, + { "3BF01100FF01", "Not a physical smart card. But a JavaCard simulator ATR with default configuration. (JavaCard)" }, { "3BF01200FF9181B17C451F019B", "Japanese Chijou Digital B-CAS Card (pay TV) (Pay TV)" }, { "3BF01200FF9181B17C451F0399", "Japanese Chijou Digital B-CAS Card (pay TV)" }, { "3BF01200FF9181B1EF451F030A", "Japanese Digital CATV C-CAS card" }, { "3BF01300001000", "MasterCard ETEC InterOp 27. This is an dual-app Maestro/MasterCard Credit EMV test card" }, - { "3BF01300008131FE45E8", "Healt care card Romania (HealthCare)\nhttp://www.cnas.ro/casmb/national-page/cardul-national-de-asigurari-de-sanatate-2.html" }, + { "3BF01300008131FE45E8", "Healthcare card Romania (HealthCare)\nhttp://www.cnas.ro/casmb/national-page/cardul-national-de-asigurari-de-sanatate-2.html" }, { "3BF01300FF9181B1FE461F0319", "Japan BS/CS 4K Satellite Broadcasting A-CAS Card (Pay TV)\nhttp://www.acas.or.jp/index.html" }, { "3BF2180000C10A31FE55C80675", "HID iCLASS P16K C4H\nproximity card used for both door locks and keystore" }, { "3BF2180002C10A31FE55C80776", "Siemens CardOS V4.3" }, @@ -3278,6 +3580,7 @@ const static atr_t AtrTable[] = { { "3BF711000140967071090E6CB6D6", "Carte pour decodeur tele de Neuf Telecom TV" }, { "3BF71300008131FE45464F4D534F4D53A9", "Health card Russian Federation" }, { "3BF71300008131FE454A434F503234....", "NXP JCOP v2.4.x (see hist bytes for more info)" }, + { "3BF71300008131FE4580654A5030310415", "Nichizeiren Denshi-shomei (eID)\nhttps://www.nichizeiren.or.jp/taxaccount/auth/fifth/" }, { "3BF71800008031FE45736674652D6E66C4", "SmartCafe Expert 3.2 72K" }, { "3BF71800008031FE45FE42475265494424", "Bulgarian eID PKI card pilot on IFX SLE78 jTOP (PKI)" }, { "3BF71800008131FE458055433776706B28", "Only labeled 'J35110', dual interface (JavaCard)" }, @@ -3292,13 +3595,15 @@ const static atr_t AtrTable[] = { { "3BF81300008131FE15597562696B657934D4", "Yubico Yubikey 4 OTP+CCID" }, { "3BF81300008131FE4546494445534D4F318E", "Fidesmo Card with Dual Interface (JavaCard)\nhttp://shop.fidesmo.com/product/fidesmo-card-dual-interface" }, { "3BF81300008131FE454A434F50763234....", "NXP JCOP v2.4.x (see hist bytes for more info)" }, - { "3BF81300008131FE454A434F5076323431B7", "Nigerian eID Card (blank card)\nChip is NXP JCOP 2.4.1R3" }, + { "3BF81300008131FE454A434F5076323431B7", "Nigerian eID Card (blank card)\nChip is NXP JCOP 2.4.1R3\nBank of Hawaii (Bank)\nhttps://www.boh.com/\nLA BANQUE POSTALE (Bank)\nhttps://www.labanquepostale.fr/\nbnpparibas (Bank)\nhttp://www.bnpparibas.com/\nJcop040 (JavaCard)\nJcop21 (JavaCard)\nVisa debit classic (Bank)\nhttp://www.jpmorganchase.com/\nJPMorgan Chase (Bank)\nVisa (Bank)\nhttps://unitedfcu.com/" }, { "3BF81300008131FE454A4F5076323431B7", "Nigerian eID card (eID)" }, { "3BF81300008131FE455049564B45593730FF", "PIVKey CP70 (PKI)\nhttps://pivkey.com/" }, { "3BF81300008131FE455241414B43327635CB", "Raak C2 Smart Card (PKI)\nhttp://www.raaktechnologies.com/software-downloads-documentation/" }, { "3BF81300008131FE45534B555001000000FC", "Silesian Card of Public Services (Transport)\nhttps://portal.kartaskup.pl/" }, { "3BF81300008131FE45536D617274417070F8", "national Lithuania ID card" }, { "3BF81300008131FE45FF4A32413034300012", "MIDAS Card Diversification Key JavaCard (J2A040) (Bank)\nhttps://github.com/kategray/midas" }, + { "3BF81300FF108053430663010F900000", "Affinity CUIA Debit (JavaCard)\nhttps://www.affinitycuia.org" }, + { "3BF81300FF910131FE41534C4A01305023100D", "Walden Mutual Bank (Bank)\nhttps://www.waldenmutual.com/sustainable-bank-for-individuals#footnote-s0-4" }, { "3BF81800008031FE450073C8401300900092", "G&D StarSign Token" }, { "3BF81800008131FE450073C8400000900080", "NXP JCOP 31 V2.2 36K - S/C I/F" }, { "3BF81800008131FE450073C8401300900093", "Giesecke & Devrient Sm@rtCafe Expert 3.0" }, @@ -3306,6 +3611,7 @@ const static atr_t AtrTable[] = { { "3BF81800008131FE454A434F5076323431BC", "NXP J2A080 JavaCard" }, { "3BF81800FF8131FE450073C840000090007F", "NXP JCOP 10\nNXP JCOP 31 (contact interface)" }, { "3BF81800FF8131FE454A434F507632343143", "VIVOtech SAM\nNXP JCOP V241\nNXP J3A081 JavaCard (contact interface)" }, + { "3BF89600008031FE470073C840000090000D", "Italian driver tachograph smartcard (Transport)\nhttps://www.to.camcom.it/cartatachigrafica" }, { "3BF89600008131FE4400739401C00F9000DD", "fourth-generation Hong Kong permanent identity card (Other)\nhttps://en.wikipedia.org/wiki/Hong_Kong_identity_card" }, { "3BF89600008131FE454A434F507632343132", "NXP JCOP 2.4.1 (JavaCard)" }, { "3BF91100008131FE45436F6D624F53205600AA", "VISA Card (Bank)" }, @@ -3334,6 +3640,9 @@ const static atr_t AtrTable[] = { { "3BF99600008031FE4553434537200000202027", "G&D SmartCafe Expert 7 (JavaCard)" }, { "3BF99600008031FE4553434537200300204642", "ActivIdentity Activkey Sim (PKI)\nhttps://www.hidglobal.com/products/cards-and-credentials/activid/usb-tokens" }, { "3BF99600008031FE4553434537200F0020464E", "Giesecke & Devrient (DoD Alternate Token) G+D Sm@rtCafe Expert v7.0 144K DI #3 (PKI)" }, + { "3BF99600008031FE4553434537202000202007", "Serbian Identity Card (eID) (eID)" }, + { "3BF99600008031FE45534345372047434E335E", "Serbian Identity Card (eID)" }, + { "3BF99600008031FE455343453720474E335E", "Serbian Identity Card (eID)" }, { "3BF99600008131FE45454F4E43617264563173", "eONCard V1 (PKI)" }, { "3BF99600008131FE4553434537200E00202028", "Giesecke & Devrient GmbH StarSign CUT S" }, { "3BF99600008131FE45535049564B4559373028", "Taglio PIVKey C980 (PKI)\nhttps://www.pivkey.com" }, @@ -3348,25 +3657,32 @@ const static atr_t AtrTable[] = { { "3BFA1300008131FE450031C173C8400000900079", "Nigerian eID Card (warm reset)\nChip is NXP JCOP 2.4.1R3" }, { "3BFA1300008131FE454465786120434620763198", "Dexa Systems Crossfire Card (PKI)\nhttp://www.dexasystems.com/products-services/products/dexa-smartcards-credential-tokens-peripherals" }, { "3BFA1300008131FE454A434F503.3.56323332..", "JCOPxx/yy v2.3.2 (see hist bytes for more info)" }, + { "3BFA1300008131FE454A434F50323156323331", "J2A040 JCOP (JavaCard)" }, { "3BFA1300008131FE454A434F5032315632333191", "NXP JCOP 21 V2.3.1 36K" }, { "3BFA1300008131FE454A434F5032315632343196", "NXP JCOP 2.1 V 2.4.1 (JavaCard)" }, { "3BFA1300008131FE454A434F50343156", "JCOP41 V221" }, { "3BFA1300008131FE454A434F5034315632333197", "JCOP41 /72K (eID)" }, { "3BFA1300008131FE454A434F50763234........", "NXP JCOP v2.4.x (see hist bytes for more info)" }, + { "3BFA1300008131FE54A434F503233191", "Jcop (JavaCard)" }, { "3BFA1300FF813180450031C173C00100009000B1", "OpenPGP" }, { "3BFA1800008031FE45FE654944202F20504B4903", "Estonian Identity Card (EstEID v3.5 (10.2014) cold) (eID)\nhttp://id.ee/" }, { "3BFA1800008131FE4506082A841001876E0805BC", "Dutch Rijkspas (eID)" }, - { "3BFA1800008131FE4506082A841001876E0807BE", "Rijkspas (identification card dutch government employees) (eID)\nhttps://nl.wikipedia.org/wiki/Rijkspas\nDutch goverment multifunctional smartcard (Other)\nhttps://nl.wikipedia.org/wiki/Rijkspas" }, - { "3BFA1800008131FE45060860841001876F0602FE", "Card used by the Dutch health insurers to give medical personell access to patient insurance information" }, + { "3BFA1800008131FE4506082A841001876E0807BE", "Rijkspas (identification card dutch government employees) (eID)\nhttps://nl.wikipedia.org/wiki/Rijkspas\nDutch government multifunctional smartcard (Other)\nhttps://nl.wikipedia.org/wiki/Rijkspas" }, + { "3BFA1800008131FE45060860841001876F0602FE", "Card used by the Dutch health insurers to give medical personnel access to patient insurance information" }, + { "3BFA1800008131FE4546534A434F503453494480", "NXP Java Card JCOP4 P71 GP2.3 JC3.0.5 (JavaCard)\nhttps://www.javacardsdk.com/product/j3r180sim/" }, { "3BFA1800008131FE454A33413034305632343184", "NXP J3A 40K\nJava Card v2.2.2 - Global Platform v2.2.1\nDual-interface functionality (features 1K Mifare emulation)" }, { "3BFA1800008131FE454A33413038315632343189", "NXP JCOP CJ3A081\nhttp://www.usmartcards.com/media/downloads/492/NXP%20P5CX012%2002X%2040%2073%2080%20144%20%20%202011.pdf" }, + { "3BFA1800008131FE454A3344303831563234328F", "AustriaCard Dual Interface Unpersonalized EMV Cards (Bank)\nhttps://www.austriacard.com" }, { "3BFA1800008131FE454A434F503431563232319D", "NXP JCOP 41 v2.2.1 72k SmartCard I/F" }, { "3BFA1800008131FE454A546178436F72655631B2", "Taxpayer Portal Authentication for Fiji Revenue & Customs Service taxpayer portal (PKI)" }, { "3BFA1800008131FE454D4F54494F4E0000900760", "SIM card (Telecommunication)" }, { "3BFA1800008131FE4550564A434F5033454D5694", "NXP JCOP3 J3H082 Java Card 3.0.4 Dual-Interface (JavaCard)\nhttps://www.cardlogix.com/product/nxp-jcop3-j3h082-java-card-3-0-4-j3h081-dual-interface/" }, + { "3BFA1800008131FE4550564A434F503453494493", "National Health Insurance (Taiwan) (HealthCare)" }, { "3BFA180000910131FE4550564A434F503453494482", "Supposed P71 SecID purchased from a Chinese manufacturer (JavaCard)" }, + { "3BFA180000910131FE456BD1936AC2F28547E164CC", "J3R180, NXP JCOP4 JC3.0.5 Classic, GP2.3, SECID (JavaCard)\nhttps://www.cardlogix.com/product/nxp-jcop-4-java-card-3-0-5-classic/" }, { "3BFA180002C10A31FE584B53776973735369676E89", "SuisseId card (used for qualified signatures)\nhttp://postsuisseid.ch/de/suisseid\nhttp://www.suisseid.ch/" }, { "3BFA1800FF10004A546178436F72655631", "NXP JCOP4 J3R200 P71 (JavaCard)" }, + { "3BFA1800FF8031FE450031807394410000900090", "Kazakhstan Identity Card 2022 (eID)" }, { "3BFA1800FF8131FE454A434F5032315632333165", "TrubDemax healthcare card\nJCOP 21 / 72k" }, { "3BFA1800FF8131FE454A434F5034314332303074", "HID Crescendo C200\nhttps://www.hidglobal.com/sites/hidglobal.com/files/resource_files/crescendo-c200-c700-smart-card-ds-en.pdf" }, { "3BFA1800FF8131FE454A434F5034315632323162", "JCOP41\nHID Crescendo C700\nhttp://www.hidcorp.com/\nShould be compatible to RAAK\nhttp://www.raaktechnologies.com/\nMarx CrypToken MX2048-JCOP USB Token" }, @@ -3385,6 +3701,9 @@ const static atr_t AtrTable[] = { { "3BFB1300FF10800031C164086032060F9000", "Stripe Issuing Card (Bank)" }, { "3BFB1300FF10800031C164086032100F9000", "Varo (Bank)" }, { "3BFB1300FF10800031C164089862210F9000", "Visa Debit (Bank)" }, + { "3BFB1300FF10800031C164089862290F9000", "Bank Card (Bank)" }, + { "3BFB1300FF10800031C1640924331E0F9000", "TransferWise Debit Card (Bank)\nhttps://wise.com/" }, + { "3BFB1300FF10800031C164096441360F9000", "Truist Business Debit (Bank)" }, { "3BFB1300FF813180755A43352E3520524556204763", "ZeitControl BasicCard 5.5" }, { "3BFB1300FF813180755A43352E3620524556204D6A", "ZeitControl BasicCard ZC5.6 user-programmable smart card\nhttp://www.basiccard.com/index.html?overview.htm" }, { "3BFB1300FF813180755A43362E3520524556204364", "ZeitControl BasicCard 6.5, multiapplication with 30 kByte EEPROM" }, @@ -3423,7 +3742,9 @@ const static atr_t AtrTable[] = { { "3BFD1300008131FE4541373030364347203234325231D6", "YubiKey NEO (token)" }, { "3BFD1300008131FE454A434F50323176323331474454E1", "National Health Insurance Card, Taiwan" }, { "3BFD1300008131FE45543D314A323133364B56323331DC", "ic Card (JavaCard)" }, + { "3BFD1300008131FE4580318153534431738421C0810730", "Personal Info Card (eID)" }, { "3BFD1300FF10000031C173C8400052A1C5009000", "IBKR Prepaid MasterCard, Issued by Peoples Trust Company (Bank)\nhttps://www.interactivebrokers.com/en/index.php?f=26451" }, + { "3BFD1300FF10000031C173C8400052A1D5009000", "PayPal Business Debit Mastercard (Bank)\nhttps://www.paypal.com/merchantapps/appcenter/makepayments/bdmc" }, { "3BFD1800008031FE45003180718E6452D904008190005B", "Oberthur Card Systems, authentIC" }, { "3BFD1800008031FE4553434536302D43443038312D46C4", "Panama Electronic Signature (JavaCard)" }, { "3BFD1800008031FE45736674652063643134342D6E66D8", "SmartCafe Expert 3.2 144K Dual is a contact and contactless technology Java card from G&D with 144K on-board EEPROM for application and data storage. Certified to FIPS 140-2 Level 3 and Common Criteria EAL 5+. Supports specifications ISO 14443A T=CL and ISO 7816 T=1/0. (PKI)\nhttp://www.smartcardfocus.us/shop/ilp/id~523/smartcafe-expert-3-2-144k-dual/p/index.shtml" }, @@ -3449,7 +3770,10 @@ const static atr_t AtrTable[] = { { "3BFD9600008131FE4500000152332980000000000000A9", "DPI Guatemala (eID)\nhttp://www.renap.gob.gt/" }, { "3BFD9600008131FE450000015233672000000000000047", "DPI Guatemala (eID)\nhttps://www.renap.gob.gt/servicios/que-es-el-dpi" }, { "3BFD9600008131FE4500000161638620000000000000C5", "Renap Guatemala (eID)" }, + { "3BFD9600008131FE450000016687038000000000000003", "DPI (Documento Personal de Identificacion) Guatemala (eID)" }, { "3BFD9600008131FE45534C4A353247444C313238435257", "Universal JCard (Contact) with Infineon SLE78 (JavaCard)\nhttp://www.usmartcards.co.uk/cards/universal-jcard-contact-with-infineon-sle78-white-gloss-pvc-card.html" }, + { "3BFD9600008131FE45534C4A35324778787979797A5224", "J3R180 (JavaCard)" }, + { "3BFE130000108080318066B0840C016E0183009000", "Sberbank of Russia MIR debit card (Bank)" }, { "3BFE1300008131FE454A434F5076323431204C4F542057B1", "LOT test card (JavaCard)\nwww.lotgroup.eu" }, { "3BFE1800008031FE454573744549442076657220312E30A8", "Estonian Identity Card (EstEID 3.0 'JavaCard' cold)" }, { "3BFE1800008031FE4553434536302D43443038312D6E46A9", "G&D Sm@rtCafe Expert 6.0 (JavaCard)\nhttp://www.smartcardfocus.com/shop/ilp/id~684/smartcafe-expert-6-0-80k-dual-/p/index.shtml" }, @@ -3484,7 +3808,8 @@ const static atr_t AtrTable[] = { { "3BFF1100008171404200002101314252000[05]63........9000.*", "Smart Card 'The Smart Way to Login'\nUsed on Acer TravelMate to secure boot" }, { "3BFF11000240648069A2070103570000FF0083009000", "Gemplus GemXpresso" }, { "3BFF1100FF8131FE9580F9D2760000255444010083000000A0", "GiroCard Haspa Hamburger Sparkasse (Bank)\nhttps://www.haspa.de/privatkunden/ihr-online-banking/unser-angebot/haspa-digital-services-96198/" }, - { "3BFF13000010003101F1564011001900000000000000", "BVG Guthabenkarte (Prepaid Payment Card for Berlin/Brandenburg Public Transport) (Transport)\nhttps://www.bvg.de/de/service-und-kontakt/guthabenkarte" }, + { "3BFF13000010003100DE525001001500000000000000", "wisely debit (Bank)\nhttps://www.mywisely.com/" }, + { "3BFF13000010003101F1564011001900000000000000", "BVG Guthabenkarte (Prepaid Payment Card for Berlin/Brandenburg Public Transport) (Transport)\nhttps://www.bvg.de/de/service-und-kontakt/guthabenkarte\nRevolut Visa Glow-in-the-dark\nhttps://revolut.com/\nMasterCard debit - PayCenter - Corporate Benefit 'Sachbezugskarte' (Bank)\nhttps://paycenter.de/sachbezugskarte/" }, { "3BFF13000010003101F1564011001D00000000000000", "albo (Bank)\nhttps://www.albo.mx/" }, { "3BFF1300008131FE450031B9640404ECC17394018082900052", "AKD kID (eID)\nhttps://www.id.hr" }, { "3BFF1300008131FE450031B9640444ECC17394018082900012", "Croation personal ID card (eID)\nhttp://eid.hr/" }, @@ -3492,13 +3817,23 @@ const static atr_t AtrTable[] = { { "3BFF1300008131FE45434433690940000020202020202000F3", "VISA credit card (LBBW/Payback VISA) (Bank)" }, { "3BFF1300008131FE454F574F4B31302D4A................", "OWOK (One Web, One Key) login card\nhttp://www.reiner-sct.com/owok/\nReiner SCT loginCard\nhttps://cardlogin.reiner-sct.com/" }, { "3BFF1300008131FE4D8025A00000005657444B3333300600D2", "Datakey DCOS model 330 (DKCCOS 6.0 token)" }, + { "3BFF1300FF10000031C1738211064414D33470779000", "Visa Debit (Bank)\nhttps://www.chase.com/" }, { "3BFF1300FF10000031C173C821106441443533079000", "BRADESCO-CONTA SALARIO (Bank)" }, { "3BFF1300FF10000031C173C8211064414D3130079000", "Tangerine MasterCard (Bank)\nhttps://www.tangerine.ca/en/products/spending/creditcard/money-back/" }, + { "3BFF1300FF10000031C173C8211064414D3137079000", "PayPal Business Debit mastercard (Bank)\nhttps://www.paypal.com/merchantapps/appcenter/makepayments/bdmc" }, { "3BFF1300FF10000031C173C8211064414D3330079000", "VISA card issued by ING-DiBa AG (Germany) (Bank)" }, + { "3BFF1300FF10000031C173C8211064414D3331079000", "NAB VISA Debit (contact interface) (Bank)\nhttps://www.nab.com.au/" }, { "3BFF1300FF10000031C173C8211064414D3337079000", "VISA Credit Card (Postbank), Germany (Bank)" }, { "3BFF1300FF10000031C173C8211064414D3341079000", "BBVA debit card Uruguay. MIFRE Plus compatible. (Bank)\nScotiabank Passport Visa Infinite credit card (Bank)\nhttps://www.scotiabank.com/ca/en/personal/credit-cards/visa/passport-infinite-card.html" }, + { "3BFF1300FF10000031C173C8211064414D3343079000", "MasterCard issued by President's Choice Bank (Canada) (Bank)\nhttp://pcfinancial.ca/mastercard" }, { "3BFF1300FF10000031C173C8211064414D3347079000", "Chase Visa Debit Card (Bank)\nhttps://www.chase.com/bankinghelp" }, { "3BFF1300FF10000031C173C8211064414D3348079000", "BBVA blue VISA Debit Card (Bank)\nhttps://www.bbva.es/en/personas/productos/tarjetas/tarjeta-joven-ahora.html\nDesjardins Bonus Visa credit card (Bank)\nhttps://www.desjardins.com/ca/personal/loans-credit/credit-cards/bonus-visa/index.jsp" }, + { "3BFF1300FF10000031C173C8211064414D3430079000", "PNC BUSINESS VISA DEBIT (Bank)\nhttps://www.pnc.com/en/small-business/payments-and-processing/payment-cards/pnc-bank-visa-business-debit-card.html" }, + { "3BFF1300FF10000031C173C82110644930424E079000", "National Bank Debit Card with expiration date and cvv code (Bank)" }, + { "3BFF1300FF10000031C173C82110644932424E079000", "Interact, Visa Debit Bank of Novia Scotia (Bank)\nhttps://www.scotiabank.com/global/en/credit-card-terms-and-conditions.html" }, + { "3BFF1300FF10000031C173C82110644D30424E079000", "Debit payment card (Rabobank NL) (Bank)\nhttps://www.rabobank.nl/en/business/making-and-receiving-payments/payments/paying-with-your-bank-card" }, + { "3BFF1300FF10000031C173C82110645631424E079000", "Portuguese 'BancoCTT' Bank Card (Bank)\nhttps://www.bancoctt.pt/o-seu-dia-a-dia/cartao-de-credito-banco-ctt" }, + { "3BFF1300FF10000031C173C82110645631434E079000", "Chase Freedom Unlimited Credit Card (Bank)" }, { "3BFF1300FF10808031E06B04310502AF555555555555", "USAA EMV Visa Debit Card (Bank)" }, { "3BFF1300FF10808031E06B071405028A555555555555", "Tangerine Debit Card (Bank)\nhttps://www.tangerine.ca" }, { "3BFF1300FF10808031E06B08240502B5555555555555", "Tangerine Canada Interac debit card (Bank)\nhttps://www.tangerine.ca/" }, @@ -3508,7 +3843,9 @@ const static atr_t AtrTable[] = { { "3BFF1300FF8131FE45656311045002800008390004020502E9", "German 'Geldkarte' supplied by the Deutsche Bank in Karlsruhe,\nBaden-Wurttemberg, Germany." }, { "3BFF1300FF8131FE45656311045002800008540004230502A5", "Maestrocard/Geldkarte (Stadtsparkasse Haltern, Germany)" }, { "3BFF1300FF8131FE5D8025A00000005657444B33323005003F", "Datakey DCOS model 320" }, - { "3BFF1300FF918131FE4541434F53204449616E6132204C6336DF", "Alior Bank MasterCard debit (Bank)" }, + { "3BFF1300FF910131FE210031C173C82110644D30434E07900094", "AirPlus MasterCard Commercial (Bank)\nhttps://www.airplus.com/us/en/products-solutions/products/corporate-cards/corporate-cards.html" }, + { "3BFF1300FF918131FE4141434F532046696F6E6131204C6336F4", "Deutsche Kreditbank Debit (Bank)" }, + { "3BFF1300FF918131FE4541434F53204449616E6132204C6336DF", "Alior Bank MasterCard debit (Bank)\nComdirect (Deutsch Bank) debit VISA (AUSTRIACARD 56015/001) (Bank)" }, { "3BFF1400FF8131FE458025A000000056575343363530010039", "SafeNet SC650 (PKI)\nhttp://www.safenet-inc.com/data-protection/authentication/smartcard-650/" }, { "3BFF1400FF8131FE458025A000000056575343363530030239", "SafeNet SC650 v3.2 (PKI)\nhttp://www.safenetat.com/products-solutions/high-assurance-authentication/sc650/" }, { "3BFF1400FF8131FE458025A00000005657534336353004003C", "SafeNet AT SC650 V4.0 02/2018 (PKI)\nhttps://www.safenetat.com/Solutions/Enterprise-Security/high-assurance-authentication/sc650/" }, @@ -3518,6 +3855,8 @@ const static atr_t AtrTable[] = { { "3BFF1800008131FE45006B04050100012101434E5310318059", "CNS - Carta Nazionale dei Servizi (Italia)\nPA emittente: Regione Autonoma della Sardegna\nCarta del Servizio Sanitario Regionale - Emilia Romagna" }, { "3BFF1800008131FE45006B05051017012101434E531031805E", "Regional Card - Regione Liguria, Veneto - Italy (eID)\nTessera Sanitaria - Carta Regionale dei Servizi" }, { "3BFF1800008131FE45006B05052000012101434E5310318079", "health card (HealthCare)\nhttps://tscns.regione.sardegna.it/" }, + { "3BFF1800008131FE45006B0505200001F101434E53103180A9", "national health service card (HealthCare)\nhttps://ca.arubapec.it/downloads/MU_LINUX.zip" }, + { "3BFF1800008131FE45006B0505912001F101434E5310318038", "Italian Health Card (TS) and Citizen's Card (CNS) based on IDEMIA ID-One CNS v2 on Cosmo 9.1 (HealthCare)" }, { "3BFF1800008131FE45006B11050700011101434E531131807B", "Italian National Fire Corps -special identification card (eID)" }, { "3BFF1800008131FE45006B11050700012101434E531031804A", "Oberthur ID-One Cosmo V7-n it's a java card 2.2.2\nIzenpe Certificado Ciudadano (eID)\nhttps://www.izenpe.eus/informacion/certificado-ciudadano/s15-content/es/" }, { "3BFF1800008131FE4D8025A00000005657444B3430300600DD", "DataKey 400 (DK400)" }, @@ -3525,7 +3864,9 @@ const static atr_t AtrTable[] = { { "3BFF1800008131FE55006B0209040301010144534410318068", "ACA (Lawyer Identifier Card) (eID)" }, { "3BFF1800008131FE55006B02090503010101434E5310318064", "Bit4id J-SIGN 2048 (L) (PKI)\nhttps://www.bit4id.com/en/j-sign/" }, { "3BFF1800008131FE55006B02090603010101434E5310318067", "ST microelettronics JSign3 (HealthCare)" }, + { "3BFF1800008131FE55006B02090703010101434E5310318066", "Aruba digital signing card (eID)\nhttps://www.aruba.it" }, { "3BFF1800008131FE55006B02091403010101434E5310318075", "Smart Card INFOCERT digital key CNS from CST PADOVA (eID)" }, + { "3BFF1800008131FE55006B02091717010101434E5310318062", "Carta Nazionale dei Servizi (CNS) Centro Servizi Territoriali (CST) (PKI)\nhttp://cst.provincia.padova.it/category/faq/firma-digitale" }, { "3BFF1800FF8031FE45534653452D43583332322D561803087C", "Giesecke & Devrient Sm@rtCafe Expert 2.0" }, { "3BFF1800FF8031FE45536D4072744361666545787065727465", "Giesecke & Devrient SmartCafe 32K v1" }, { "3BFF1800FF8131..456563............................", "Geldkarte (generic ATR)" }, @@ -3539,7 +3880,9 @@ const static atr_t AtrTable[] = { { "3BFF1800FF81313C4565630D0231025000109055700004100A", "EC-Card from DKB (Deutsche Kreditbank AG)" }, { "3BFF1800FF81313C4565630D02310280001224300020041059", "Geldkarte (Germany)" }, { "3BFF1800FF813150456563............................", "GeldKarte v3 (Germany)" }, + { "3BFF1800FF8131FE4165630608710156000FB85073204712D8", "Commerzbank maestro (Bank)\nhttps://www.commerzbank.de/konten-zahlungsverkehr/produkte/girokonten/kostenloses-girokonto/" }, { "3BFF1800FF8131FE4165630608710156000FB8602AA0471231", "Debit card (Germany): Postbank - GeldKarte (EUR), girocard, V-PAY (Bank)\nhttps://www.postbank.de/" }, + { "3BFF1800FF8131FE4165631116710156000F0902904E5711AC", "German Bank Card IDEMIA 9 Maestro/Girocard (Sparkasse S-Payment TPY 1974693D) (Bank)" }, { "3BFF1800FF8131FE450031C573C00180547615020105900074", "SIGILANCE NFC OpenPGP Smart Card (JavaCard)\nhttps://www.sigilance.com/" }, { "3BFF1800FF8131FE455448434331305445434F4744484E3224", "National Health Insurance Card, Taiwan" }, { "3BFF1800FF8131FE455448434331305445434F4744494E3126", "National Health Insurance Card, Taiwan" }, @@ -3593,6 +3936,7 @@ const static atr_t AtrTable[] = { { "3BFF1800FF8131FE55006B02091303010101434E531031808D", "Aruba Digital Signature (Other)\nhttps://www.pec.it/offerta-firma-digitale.aspx" }, { "3BFF1800FF8131FE55006B02091303011101434E531131809C", "Politecnico di Torino Student Card (eID)\nhttp://www.polito.it/" }, { "3BFF1800FF8131FE55006B02091617011101434E531131808D", "Carta Regionale dei Servizi - Regione Autonoma Friuli Venezia Giulia (HealthCare)\nhttps://www.regione.fvg.it/rafvg/cms/RAFVG/GEN/carta-regionale-servizi/" }, + { "3BFF1800FF8131FE55006B02091717011101434E531131808C", "european health insurance card and Regional (ItalY - Provincia Autonoma di Trento) Service Card (CPS) (eID)\nhttps://www.provincia.tn.it/Servizi/Attivare-la-Carta-Provinciale-dei-Servizi-CPS#cos_e" }, { "3BFF1800FF8131FE55006B42495434494420312E3000900091", "Touch&Sign 2048 (PKI)" }, { "3BFF1800FF8131FE55006B42495434494420322E3000900092", "Izenpe Green Card (Citizen Certificate) (eID)\nhttp://www.izenpe.com/s15-12020/en/contenidos/informacion/ciudadano/en_def/index.shtml" }, { "3BFF1800FFC10A31FE55006B0508C805011101434E531031800C", "Carta Regionale dei Servizi - Regione Lombardia" }, @@ -3622,6 +3966,7 @@ const static atr_t AtrTable[] = { { "3BFF9500008031FE4380318067B0850201F3A3138301900057", "Driver's Card (Tachograf card) issued by pwpw Poland (Transport)\nhttps://www.pwpw.pl/en/Products/Cards/Cards.html" }, { "3BFF9500008031FE4380318067B0850201F3A3138301F83BFF", "UK Drivers Tachograph Card (Transport)" }, { "3BFF950000C00A1F438031E073362113574A330E0231410088", "'BASE' SIM card; BASE is a german mobile phone operator, which is a brand of E-Plus, Germany." }, + { "3BFF95000150801C444E41535034323020526576533430", "Nagra card Canal+ (Polish TV provider) (Pay TV)\nhttps://pl.canalplus.com/" }, { "3BFF95000150801C444E41535034323020526576533430F1", "NC+ Polland (Pay TV)\nhttp://www.flysat.com/ncplus.php" }, { "3BFF95000150801C444E41535034323020526576533430F15D", "NC+ Polland (Pay TV)\nhttp://www.flysat.com/ncplus.php" }, { "3BFF95000150801C444E41535034323020526576533441", "Platforma Canal+ Polska, cayman card (Pay TV)\nhttps://www.flysat.com/canalplus-pl.php" }, @@ -3633,6 +3978,7 @@ const static atr_t AtrTable[] = { { "3BFF9500FF50801C444E41535034303020526576493441", "Pay TV - NC+ in Poland (Pay TV)\nhttp://ncplus.pl/" }, { "3BFF9500FF50801C444E41535034303020526576493447", "Platforma Canal+ Polska, cameleon card (Pay TV)\nhttps://www.flysat.com/canalplus-pl.php" }, { "3BFF9500FF50801C444E41535034303020526576493548", "Canal+ France Nagra3 (Pay TV)\nhttps://www.canalplus.com/" }, + { "3BFF9500FF50801C444E41535034383220526576523038", "CANALSAT, mediaguard key (Pay TV)" }, { "3BFF9500FFC00A1F438031E073362113574A3320073341411F", "Swisscom 3G SIM card" }, { "3BFF9500FFC00A1F438031E073F62113574A334857314141E5", "MTNL 3G USIM (India)" }, { "3BFF9500FFC00A1F438031E073F62113574A334861324147D6", "GSM SIM (issued by e-plus, Germany)" }, @@ -3646,10 +3992,20 @@ const static atr_t AtrTable[] = { { "3BFF9600008131FE4380318065B0845651101201788290006A", "SafeNet eToken 5300 (PKI)" }, { "3BFF9600008131FE4380318065B08456511012021082900001", "Nedap NexS N:Secure (eID)\nhttps://www.nsecure.nl/nl/" }, { "3BFF9600008131FE4380318065B0846160FB120FFD8290000C", "IDPrime 930 FIPS Level 2 (T=1 CT=96) (BAI3.1) (PKI)" }, + { "3BFF9600008131FE4380318065B0846566FB120FFC8290000F", "SmartID 3930 FIDO Contact and Contactless card (PKI)\nhttps://www.smartcardfocus.com/shop/ilp/id~962/safenet-idprime-3930-fido-dual-interface-fips-l2/p/index.shtml" }, + { "3BFF9600008131FE4380318065B0846669FB12FFFE829000F1", "IDCore3230 build 6.8, test APDU applet (JavaCard)" }, { "3BFF9600008131FE4380318065B085040011120FFF829000E0", "Pakistan National identity card (eID)" }, { "3BFF9600008131FE4380318065B085040120120FFF829000D0", "Portuguese National Identity Card (eID) (eID)\nhttps://www.autenticacao.gov.pt/o-cartao-de-cidadao" }, + { "3BFF9600008131FE4380318065B0855956FB120FFC82900002", "THALES SafeNet IDPrime 3940 Fido (PKI)\nhttps://cpl.thalesgroup.com/fr/resources/access-management/idprime-3940-product-brief" }, { "3BFF9600008131FE4580F9A0000003080000100053454E54AC", "cac (eID)" }, { "3BFF9600008131FE55006B02090403010101434E53103180EB", "Aruba PEC SpA digital signature card made by Incard (eID)\nhttps://www.pec.it/download-software-driver.aspx" }, + { "3BFF960000C00A31FE4380318065B085040011120FFF829000AB", "French National Identity Card (eID) (eID)\nhttps://www.interieur.gouv.fr/actualites/actu-du-ministere/nouvelle-carte-nationale-didentite" }, + { "3BFF9600FF8131FE406563111562025000100A0190A90730BF", "girocard Sparkasse Ansbach, Germany BLZ 76550000 (Bank)" }, + { "3BFF9600FF8131FE4065631D02840156001F190850E10200EF", "Raiffeiesenbank Girocard Maestro (Bank)" }, + { "3BFF9600FF8131FE4065631D0284025000230308C0B702000A", "German Debitcard from Sparkasse (Bank)" }, + { "3BFF9600FF8131FE4065631D0284025000230709E0F9020061", "Sparkasse Ingolstadt (Bank)" }, + { "3BFF9600FF8131FE4065631D028402500023140710B80200CD", "Sparkasse Aachen - german Maestro/Girocard (S-Payment TGI 50380969) (Bank)" }, + { "3BFF9600FF8131FE4065631D028402500023160BB0C102001A", "debit card (Bank)" }, { "3BFF9600FF8131FE4565630D09710764000D00035450070181", "Commerzbank ServiceCard / Maestro / GeldKarte / Cirrus / girocard / CashGroup / electronic cash" }, { "3BFF9600FF8131FE4565631901500280000F002B0046501172", "Sparkasse Bremen Germany HBCI DDV" }, { "3BFF9600FF8131FE4565631901500280000F002F0025501115", "German Postbank Giro card with electronic cash, Maestro, GeldKarte features" }, @@ -3659,6 +4015,7 @@ const static atr_t AtrTable[] = { { "3BFF9600FFC00A1F438031E073362113574A43491C3130321E", "Giesecke & Devrient - UniverSIM Pegasus" }, { "3BFF9600FFC00A31FE4D8031E06B04310502A85555555555557E", "Multos (Other)" }, { "3BFF9700008131FE4380318065B0846160FB120FFD8290000D", "IDPrime 3930 FIPS Level 3 (T=1 CT=97) (BAI6) (PKI)" }, + { "3BFF9700008131FE4380318065B08466693912FFFE82900032", "IDCore3230 build 6.8, test APDU applet (JavaCard)" }, { "3F05DC20FC0001", "DigiCash Facility Card" }, { "3F28000011140003689000", "SIMEMU - a DIY GSM SIM card\nhttp://simemu.cjb.net/" }, { "3F2D0027A051827D00000052000C9000", "Porta Moedas Multibanco (Portugeese electronic purse)" }, @@ -3710,6 +4067,7 @@ const static atr_t AtrTable[] = { { "3F672F0011140003689000", "D2MAC/Eurocrypt (Pay TV)" }, { "3F672F0411200000689000", "BULL HN ITALIA 06/92 - 100.000 - 64MP\nLa Sapienza - Universita' di Roma" }, { "3F69000024AF01700101FF9000", "French GSM SIM card (900MHz)" }, + { "3F69000025AF01700103FF9000", "French Gift Card (Loyalty)" }, { "3F6A000000640150010C820101A9", "Credit Card cafe Selecta" }, { "3F6B150002A007906F4D59000C9000", "Sky Viewing Card (Gen 1) from 1990s (Pay TV)" }, { "3F6C000024A03000FF00000100049000", "Gemplus MCOS 16K DES Sample Card" }, @@ -3721,6 +4079,7 @@ const static atr_t AtrTable[] = { { "3F6C00003DA030BE4100370100049000", "Sberbank (Bank)" }, { "3F6D000080318065B00501025E83009000", "Gemplus GemXpresso 211PK or 211PK-IS" }, { "3F6D000080318065B00501025E92009000", "Gemplus GemXpresso 32K" }, + { "3F7613250421B0114A5003", "DSS/DTV F (P1; first generation access card) (Pay TV)" }, { "3F77130000C11400A2689000", "Boxer DTV Sweden (Pay TV)\nhttp://www.boxer.se" }, { "3F77180000C11400A2689000", "Viacess card HRT (Hrvatska Radio Televizija)" }, { "3F77180000C11401A2689000", "VIA 2.6 XXX (Pay TV)" }, @@ -3730,7 +4089,7 @@ const static atr_t AtrTable[] = { { "3F77180000C27A4202689000", "SCT (Via Access)" }, { "3F77180000C27A4302689000", "DORCEL (Via Access)" }, { "3F77180000C27A4402689000", "XXX Redlight_HD (Viaccess)" }, - { "3F77180000C2EB41026C9000", "Elite HD10+ (Pay TV)\nSattelite cryptoworks card - Smart card Viaccess (Telesat - belgium) (Pay TV)" }, + { "3F77180000C2EB41026C9000", "Elite HD10+ (Pay TV)\nSatellite cryptoworks card - Smart card Viaccess (Telesat - belgium) (Pay TV)" }, { "3F77180000C2EB45026C9000", "facetv (Other)" }, { "3F77180000D38A4001649000", "Skylink Viaccess 5.0 (Pay TV)\nhttp://www.skylink.sk/" }, { "3F77180000D38A4201649000", "Satellite decoder card for TV Vlaanderen (Other)\nhttps://www.tv-vlaanderen.be" }, @@ -3765,12 +4124,14 @@ const static atr_t AtrTable[] = { { "3FFD11250250000333B01569FF4A50F080034B4C03", "Kabel Deutschland G02 (Pay TV)" }, { "3FFD11250250800F41B00A69FF4A507080005A4503", "Buypass smart card (Bank)\nhttps://www.buypass.no/bruker/buypass-id/buypass-smartkort" }, { "3FFD11250250800F41B00D69FF4A50F08000565403", "Viasat (Pay TV)" }, + { "3FFD11250250800F41B00F69FF4A50F080005A4A03", "Telekom Romania Communications (DVB-C) (Pay TV)\nhttps://www.telekom.ro/" }, { "3FFD13250250000F33B00F69FF4A50D00000535902", "Sky Digital (DSS satellite TV card) 2009 issue" }, { "3FFD13250250000F33B01669FF4A50D08000535903", "Sky TV Multiroom (Pay TV)" }, { "3FFD13250250800F..B0..69FF4A50D08000495403", "Sky (Italy) VideoGuard CAM card" }, { "3FFD13250250800F33B008FFFF4A50900000474C01", "Sky (Brasil) VideoGuard CAM card" }, { "3FFD13250250800F33B008FFFF4A50900000545601", "NDS Videoguard TV CAM card (Sky Mexico 0905) (Pay TV)\nhttps://en.wikipedia.org/wiki/VideoGuard" }, { "3FFD13250250800F41B00A69FF4A50F00000503103", "Sky Germany V14 NDS card (Pay TV)\nhttp://www.wikipedia.org/wiki/Sky_Deutschland" }, + { "3FFD13250250800F41B00F69FF4A50F080005A4A03", "Orange Romania (DVB-C) (Pay TV)\nhttps://www.orange.ro/" }, { "3FFD13250250800F55B00269FF4A50F08000503103", "SKY DE V15 (Pay TV)" }, { "3FFD14250150000F33B00BFFFF4A50800000475801", "DirecTV card" }, { "3FFD14250250800F41B00A69FF4A507080004E5A03", "Sky Network Televisiton Limited (New Zealand) card for new (2016) decoder. Reportedly, this is a Kaon NS1120-500 box. (Pay TV)\nhttp://www.sky.co.nz" }, @@ -3809,7 +4170,7 @@ const static atr_t AtrTable[] = { { "3FFF9500FF918171644700444E41535030303320526576333233FF", "Satellite TV Card 'Via Digital' (Nagra)" }, { "3FFF9500FF918171A04700444E4153503031302052657641323048", "DSS/DISH ROM10" }, { "3FFF9500FF918171A04700444E4153503031302052657641323149", "PayTV card for DishNetwork Sat receiver\nhttp://www.dishnetwork.com/" }, - { "3FFF9500FF918171A04700444E4153503031312052657642", "NTL digial TV card (Nagravision)" }, + { "3FFF9500FF918171A04700444E4153503031312052657642", "NTL digital TV card (Nagravision)" }, { "3FFF9500FF918171A04700444E415350303131205265764230364E", "Telewest Broadband (Nagravision)" }, { "3FFF9500FF918171A04700444E415350303131205265764230423A", "NagraVision card for StarHub Digital Cable DVB-C Singapore" }, { "3FFF9500FF918171A04700444E415350303131205265764230443C", "NagraVision card for Virgin Media in the UK" }, @@ -3822,7 +4183,7 @@ const static atr_t AtrTable[] = { { "3FFF9500FF918171FE4700444E4153503134322052657647303216", "Polsat Nagra3\nBrazil - Claro TV Nagra3 Red" }, { "3FFF9500FF918171FE4700444E4153503134322052657647303410", "Nagra 3 Card - Telefonica Brazil Green" }, { "3FFF9500FF918171FE4700444E4153503134322052657647303612", "UM02 card from German Unitymedia cable TV provider" }, - { "3FFF9500FF918171FE4700444E4153503134322052657647433463", "HD+ card used by the satelite company astra for decryption of the HDTV channels of RTL, VOX, Sat1 and ProSieben. Nagravision V3 is used for the encryption." }, + { "3FFF9500FF918171FE4700444E4153503134322052657647433463", "HD+ card used by the satellite company astra for decryption of the HDTV channels of RTL, VOX, Sat1 and ProSieben. Nagravision V3 is used for the encryption." }, { "3FFF9500FF918171FE4700444E415350313830204D65724A30320E", "Nagra 3 Digital Plus Spain" }, { "3FFF9500FF918171FE4700444E41535032343120447368", "DISH Network G3 (Pay TV)" }, { "3FFF9500FF918171FE4700444E415350323431204473684830390C", "Dish Network Smart Card (Pay TV)" }, @@ -3836,6 +4197,7 @@ const static atr_t AtrTable[] = { { "3FFF9500FF918171FE5700444E4153503431302052657651324260", "Nagravision Kudelski Generation 7 card Rom410 MerQ2B (Pay TV)" }, { "3FFF9500FF918171FE5700444E4153503431302052657651325371", "Slovak and Czech pay TV provider Slovak Telecom (Pay TV)\nhttp://www.flysat.com/novadigi-sk.php" }, { "3FFF9500FF918171FE5700444E4153503432302052657653363017", "HD+ HD04b Card (Pay TV)" }, + { "3FFF9500FF918171FE5700444E4153503432302052657653363413", "claro card honduras central america 'NAGRA' (Pay TV)" }, { "3FFF9500FF918171FE5700444E4153503432302052657653364265", "Nagra Kudelski / Canalsat Reunion (Pay TV)" }, { "3FFF9500FF918171FE5700444E4153503435302052657657363014", "HD+ HD05 Paytv smartcard (Pay TV)" }, { "3FFF9500FF918171FE5700444E415350343832205265765232361C", "Max Tv Croatia (Pay TV)\nhttps://www.lyngsat.com/packages/Max-TV.html" }, From 48b61c6438017dcaffd8ff29ce4337943c4151f6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 30 Jul 2023 21:21:59 +0200 Subject: [PATCH 792/924] ATR from the flipper zero seader project --- client/src/atrs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/atrs.h b/client/src/atrs.h index 18c1880c6..2a6bc7521 100644 --- a/client/src/atrs.h +++ b/client/src/atrs.h @@ -2328,6 +2328,7 @@ const static atr_t AtrTable[] = { { "3B959640F001130A0A1D", "xcrypt (Pay TV)" }, { "3B959640F00F100A096A", "Zain Usim Card (Telecommunication)\nwww.qariya.com" }, { "3B959680B1FE551FC7477261636513", "IClass SE Processor (Other)\nhttps://www.hidglobal.com/products/embedded-modules/iclass-se/sio-processor" }, + { "3B90969181B1FE551FC7D4", "IClass SE Processor (Other)\nhttps://www.hidglobal.com/products/embedded-modules/iclass-se/sio-processor"}, { "3B9596C0F01FC20F100A0A16", "viettel (Telecommunication)" }, { "3B959740F01A160A1941", "SG50 (Samsung Chip) (Telecommunication)" }, { "3B96004121920000622433339000", "Ukrainian Telecommunications Operator Kyivstar (old simcard) (Telecommunication)\nhttps://kyivstar.ua/uk/mm" }, From 9e8adce7a98b5f03c18887b68ab0dc3069232ebb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 30 Jul 2023 21:22:52 +0200 Subject: [PATCH 793/924] updated ATR list --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c1f4e86c..5dd92a393 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Updated ATR list (@iceman1001) - Changed `mem load -m` - now correctly erase all allocated flash memory (@iceman1001) - Fixed emulator quick dump to handle MFC Ev1 extra sectors (@iceman100) - Removed some empty dump files (@iceman1001) From d9d03aaf1f2d292494415989361dffded5ffba78 Mon Sep 17 00:00:00 2001 From: kormax <3392860+kormax@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:47:46 +0300 Subject: [PATCH 794/924] Add new DESFire command code Update file formatting --- include/protocols.h | 220 +++++++++++++++++++++++++++----------------- 1 file changed, 137 insertions(+), 83 deletions(-) diff --git a/include/protocols.h b/include/protocols.h index 772105c9d..58b992717 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -531,95 +531,149 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. // MIFARE DESFire command set: -#define MFDES_AUTHENTICATE 0x0A // AUTHENTICATE_NATIVE -#define MFDES_AUTHENTICATE_ISO 0x1A // AUTHENTICATE_STANDARD -#define MFDES_AUTHENTICATE_AES 0xAA +#define MFDES_AUTHENTICATE 0x0A // AUTHENTICATE_NATIVE +#define MFDES_AUTHENTICATE_ISO 0x1A // AUTHENTICATE_STANDARD +#define MFDES_AUTHENTICATE_AES 0xAA // Leakage Resilient Primitive (LRP) -#define MFDES_AUTHENTICATE_EV2F 0x71 // LRP, AuthenticateLRPFirst -#define MFDES_AUTHENTICATE_EV2NF 0x77 // LRP, AuthenticateLRPNonFirst +#define MFDES_AUTHENTICATE_EV2F 0x71 // LRP, AuthenticateLRPFirst +#define MFDES_AUTHENTICATE_EV2NF 0x77 // LRP, AuthenticateLRPNonFirst + +#define MFDES_CREDIT 0x0C +#define MFDES_LIMITED_CREDIT 0x1C +#define MFDES_WRITE_RECORD 0x3B +#define MFDES_READSIG 0x3C +#define MFDES_WRITE_DATA 0x3D +#define MFDES_GET_KEY_SETTINGS 0x45 +#define MFDES_GET_UID 0x51 +#define MFDES_CHANGE_KEY_SETTINGS 0x54 +#define MFDES_ROLL_KEY_SETTINGS 0x55 +#define MFDES_INIT_KEY_SETTINGS 0x56 +#define MFDES_FINALIZE_KEY_SETTINGS 0x57 +#define MFDES_SELECT_APPLICATION 0x5A +#define MFDES_CHANGE_CONFIGURATION 0x5C +#define MFDES_CHANGE_FILE_SETTINGS 0x5F +#define MFDES_GET_VERSION 0x60 +#define MFDES_GET_ISOFILE_IDS 0x61 +#define MFDES_GET_KEY_VERSION 0x64 +#define MFDES_GET_DELEGATE_INFO 0x69 +#define MFDES_GET_APPLICATION_IDS 0x6A +#define MFDES_GET_VALUE 0x6C +#define MFDES_GET_FREE_MEMORY 0x6E +#define MFDES_GET_DF_NAMES 0x6D +#define MFDES_GET_FILE_IDS 0x6F +#define MFDES_WRITE_RECORD2 0x8B +#define MFDES_WRITE_DATA2 0x8D +#define MFDES_ABORT_TRANSACTION 0xA7 +#define MFDES_READ_RECORDS2 0xAB +#define MFDES_READ_DATA2 0xAD +#define MFDES_ADDITIONAL_FRAME 0xAF +#define MFDES_UPDATE_RECORD2 0xBA +#define MFDES_READ_RECORDS 0xBB +#define MFDES_READ_DATA 0xBD +#define MFDES_CREATE_CYCLIC_RECORD_FILE 0xC0 +#define MFDES_CREATE_LINEAR_RECORD_FILE 0xC1 +#define MFDES_CHANGE_KEY 0xC4 +#define MFDES_CHANGE_KEY_EV2 0xC6 +#define MFDES_COMMIT_TRANSACTION 0xC7 +#define MFDES_COMMIT_READER_ID 0xC8 +#define MFDES_CREATE_DELEGATE_APP 0xC9 +#define MFDES_CREATE_APPLICATION 0xCA +#define MFDES_CREATE_BACKUP_DATA_FILE 0xCB +#define MFDES_CREATE_VALUE_FILE 0xCC +#define MFDES_CREATE_STD_DATA_FILE 0xCD +#define MFDES_CREATE_TRANS_MAC_FILE 0xCE +#define MFDES_DELETE_APPLICATION 0xDA +#define MFDES_UPDATE_RECORD 0xDB +#define MFDES_DEBIT 0xDC +#define MFDES_DELETE_FILE 0xDF +#define MFDES_CLEAR_RECORD_FILE 0xEB +#define MFDES_NOTIFY_TRANSACTION_SUCCESS 0xEE // New command. Used by Apple-ECP-compliant DESFire readers to signify successful transaction +#define MFDES_PREPARE_PC 0xF0 +#define MFDES_PROXIMITY_CHECK 0xF2 +#define MFDES_GET_FILE_SETTINGS 0xF5 +#define MFDES_FORMAT_PICC 0xFC +#define MFDES_VERIFY_PC 0xFD +#define MFDES_NATIVE_ISO7816_WRAP_CLA 0x90 -#define MFDES_CREDIT 0x0C -#define MFDES_LIMITED_CREDIT 0x1C -#define MFDES_WRITE_RECORD 0x3B -#define MFDES_READSIG 0x3C -#define MFDES_WRITE_DATA 0x3D -#define MFDES_GET_KEY_SETTINGS 0x45 -#define MFDES_GET_UID 0x51 -#define MFDES_CHANGE_KEY_SETTINGS 0x54 -#define MFDES_ROLL_KEY_SETTINGS 0x55 -#define MFDES_INIT_KEY_SETTINGS 0x56 -#define MFDES_FINALIZE_KEY_SETTINGS 0x57 -#define MFDES_SELECT_APPLICATION 0x5A -#define MFDES_CHANGE_CONFIGURATION 0x5C -#define MFDES_CHANGE_FILE_SETTINGS 0x5F -#define MFDES_GET_VERSION 0x60 -#define MFDES_GET_ISOFILE_IDS 0x61 -#define MFDES_GET_KEY_VERSION 0x64 -#define MFDES_GET_DELEGATE_INFO 0x69 -#define MFDES_GET_APPLICATION_IDS 0x6A -#define MFDES_GET_VALUE 0x6C -#define MFDES_GET_FREE_MEMORY 0x6E -#define MFDES_GET_DF_NAMES 0x6D -#define MFDES_GET_FILE_IDS 0x6F -#define MFDES_WRITE_RECORD2 0x8B -#define MFDES_WRITE_DATA2 0x8D -#define MFDES_ABORT_TRANSACTION 0xA7 -#define MFDES_READ_RECORDS2 0xAB -#define MFDES_READ_DATA2 0xAD -#define MFDES_ADDITIONAL_FRAME 0xAF -#define MFDES_UPDATE_RECORD2 0xBA -#define MFDES_READ_RECORDS 0xBB -#define MFDES_READ_DATA 0xBD -#define MFDES_CREATE_CYCLIC_RECORD_FILE 0xC0 -#define MFDES_CREATE_LINEAR_RECORD_FILE 0xC1 -#define MFDES_CHANGE_KEY 0xC4 -#define MFDES_CHANGE_KEY_EV2 0xC6 -#define MFDES_COMMIT_TRANSACTION 0xC7 -#define MFDES_COMMIT_READER_ID 0xC8 -#define MFDES_CREATE_DELEGATE_APP 0xC9 -#define MFDES_CREATE_APPLICATION 0xCA -#define MFDES_CREATE_BACKUP_DATA_FILE 0xCB -#define MFDES_CREATE_VALUE_FILE 0xCC -#define MFDES_CREATE_STD_DATA_FILE 0xCD -#define MFDES_CREATE_TRANS_MAC_FILE 0xCE -#define MFDES_DELETE_APPLICATION 0xDA -#define MFDES_UPDATE_RECORD 0xDB -#define MFDES_DEBIT 0xDC -#define MFDES_DELETE_FILE 0xDF -#define MFDES_CLEAR_RECORD_FILE 0xEB -#define MFDES_PREPARE_PC 0xF0 -#define MFDES_PROXIMITY_CHECK 0xF2 -#define MFDES_GET_FILE_SETTINGS 0xF5 -#define MFDES_FORMAT_PICC 0xFC -#define MFDES_VERIFY_PC 0xFD -#define MFDES_NATIVE_ISO7816_WRAP_CLA 0x90 // MIFARE DESFire status & error codes: -#define MFDES_S_OPERATION_OK 0x00 -#define MFDES_S_NO_CHANGES 0x0C -#define MFDES_S_SIGNATURE 0x90 -#define MFDES_S_ADDITIONAL_FRAME 0xAF +#define MFDES_S_OPERATION_OK 0x00 +#define MFDES_S_NO_CHANGES 0x0C +#define MFDES_S_SIGNATURE 0x90 +#define MFDES_S_ADDITIONAL_FRAME 0xAF -#define MFDES_E_OUT_OF_EEPROM 0x0E -#define MFDES_E_ILLEGAL_COMMAND_CODE 0x1C -#define MFDES_E_INTEGRITY_ERROR 0x1E -#define MFDES_E_NO_SUCH_KEY 0x40 -#define MFDES_E_LENGTH 0x7E -#define MFDES_E_PERMISSION_DENIED 0x9D -#define MFDES_E_PARAMETER_ERROR 0x9E -#define MFDES_E_APPLICATION_NOT_FOUND 0xA0 -#define MFDES_E_APPL_INTEGRITY 0xA1 -#define MFDES_E_AUTHENTICATION_ERROR 0xAE -#define MFDES_E_BOUNDARY 0xBE -#define MFDES_E_PICC_INTEGRITY 0xC1 -#define MFDES_E_COMMAND_ABORTED 0xCA -#define MFDES_E_PICC_DISABLED 0xCD -#define MFDES_E_COUNT 0xCE -#define MFDES_E_DUPLICATE 0xDE -#define MFDES_E_EEPROM 0xEE -#define MFDES_E_FILE_NOT_FOUND 0xF0 -#define MFDES_E_FILE_INTEGRITY 0xF1 +#define MFDES_E_OUT_OF_EEPROM 0x0E +#define MFDES_E_ILLEGAL_COMMAND_CODE 0x1C +#define MFDES_E_INTEGRITY_ERROR 0x1E +#define MFDES_E_NO_SUCH_KEY 0x40 +#define MFDES_E_LENGTH 0x7E +#define MFDES_E_PERMISSION_DENIED 0x9D +#define MFDES_E_PARAMETER_ERROR 0x9E +#define MFDES_E_APPLICATION_NOT_FOUND 0xA0 +#define MFDES_E_APPL_INTEGRITY 0xA1 +#define MFDES_E_AUTHENTICATION_ERROR 0xAE +#define MFDES_E_BOUNDARY 0xBE +#define MFDES_E_PICC_INTEGRITY 0xC1 +#define MFDES_E_COMMAND_ABORTED 0xCA +#define MFDES_E_PICC_DISABLED 0xCD +#define MFDES_E_COUNT 0xCE +#define MFDES_E_DUPLICATE 0xDE +#define MFDES_E_EEPROM 0xEE +#define MFDES_E_FILE_NOT_FOUND 0xF0 +#define MFDES_E_FILE_INTEGRITY 0xF1 + +// MIFARE PLus EV2 Command set +// source: https://www.nxp.com/docs/en/data-sheet/MF1P(H)x2.pdf in Look-Up Tables + +#define MFP_READ_SIG 0x3C // same as DESFIRE +#define MFP_WRITEPERSO 0xA8 +#define MFP_COMMITPERSO 0xAA + +#define MFP_AUTHENTICATEFIRST 0x70 +#define MFP_AUTHENTICATEFIRST_VARIANT 0x73 +#define MFP_AUTHENTICATENONFIRST 0x76 +#define MFP_AUTHENTICATECONTINUE 0x72 +#define MFP_AUTHENTICATESECTORSWITCH 0x7A +#define MFP_RESETAUTH 0x78 + +#define MFP_VCSUPPORTLASTISOL3 0x4B +#define MFP_ISOSELECT 0xA4 + +#define MFP_GETVERSION 0x60 // same as DESFIRE +#define MFP_ADDITIONALFRAME 0xAF +#define MFP_SETCONFIGSL1 0x44 +#define MFP_MF_PERSONALIZEUIDUSAGE 0x40 + +// read commands +#define MFP_READENCRYPTEDNOMAC_MACED 0X30 +#define MFP_READENCRYPTEDMAC_MACED 0x31 +#define MFP_READPLAINNOMAC_MACED 0x32 +#define MFP_READPLAINMAC_MACED 0x33 +#define MFP_READENCRYPTEDNOMAC_UNMACED 0x34 +#define MFP_READENCRYPTEDMAC_UNMACED 0X35 +#define MFP_READPLAINNOMAC_UNMACED 0x36 +#define MFP_READPLAINMAC_UNMACED 0x37 + +// write commands +#define MFP_WRITEENCRYPTEDNOMAC 0xA0 +#define MFP_WRITEENCRYPTEDMAC 0xA1 +#define MFP_WRITEPLAINNOMAC 0xA2 +#define MFP_WRITEPLAINMAC 0xA3 + +// value commands +#define MFP_INCREMENTNOMAC 0xB0 +#define MFP_INCREMENTMAC 0xB1 +#define MFP_DECREMENTNOMAC 0xB2 +#define MFP_DECREMENTMAC 0xB3 +#define MFP_TRANSFERNOMAC 0xB4 +#define MFP_TRANSFERMAC 0xB5 +#define MFP_INCREMENTTRANSFERNOMAC 0xB6 +#define MFP_INCREMENTTRANSFERMAC 0xB7 +#define MFP_DECREMENTTRANSFERNOMAC 0xB8 +#define MFP_DECREMENTTRANSFERMAC 0xB9 +#define MFP_RESTORENOMAC 0xC2 +#define MFP_RESTOREMAC 0xC3 // MIFARE PLus EV2 Command set // source: https://www.nxp.com/docs/en/data-sheet/MF1P(H)x2.pdf in Look-Up Tables From ef79fb91ebfe4c5ea1051a70132ea7ae240c9164 Mon Sep 17 00:00:00 2001 From: kormax <3392860+kormax@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:48:17 +0300 Subject: [PATCH 795/924] Add annotation for new DESFire command code --- client/src/cmdhflist.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index cf848d090..8e605b91f 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -1023,6 +1023,9 @@ void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { snprintf(exp, size, "CLEAR RECORD FILE"); } break; + case MFDES_NOTIFY_TRANSACTION_SUCCESS: + snprintf(exp, size, "NOTIFY TRANSACTION SUCCESS (ECP)"); + break; case MFDES_COMMIT_TRANSACTION: snprintf(exp, size, "COMMIT TRANSACTION"); break; From d522a46fca981331fddac3117047030b5dcf5c83 Mon Sep 17 00:00:00 2001 From: "Rick Farina (Zero_Chaos)" Date: Mon, 31 Jul 2023 15:46:20 -0400 Subject: [PATCH 796/924] fix lto-type-mismatch in guidummy.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit link time optimization requires all functions named the same to actually operate the same. I am pretty sure this fixes it without breaking anything. Fixes: https://github.com/RfidResearchGroup/proxmark3/issues/2058 src/proxgui.h:35:6: error: type of ‘ShowPictureWindow’ does not match original declaration [-Werror=lto-type-mismatch] 35 | void ShowPictureWindow(uint8_t *data, int len); | ^ src/guidummy.cpp:33:17: note: type mismatch in parameter 2 33 | extern "C" void ShowPictureWindow(char *fn) { | ^ src/guidummy.cpp:33:17: note: type ‘void’ should match type ‘int’ src/guidummy.cpp:33:17: note: ‘ShowPictureWindow’ was previously declared here --- client/src/guidummy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/guidummy.cpp b/client/src/guidummy.cpp index e54c1d94e..2882fd41d 100644 --- a/client/src/guidummy.cpp +++ b/client/src/guidummy.cpp @@ -30,7 +30,7 @@ extern "C" void ShowGraphWindow(void) { extern "C" void HideGraphWindow(void) {} extern "C" void RepaintGraphWindow(void) {} -extern "C" void ShowPictureWindow(char *fn) { +extern "C" void ShowPictureWindow(char *fn, int len) { static int warned = 0; if (!warned) { From 6b648396e700db8e9753725e092a41040d8b9a5c Mon Sep 17 00:00:00 2001 From: "Rick Farina (Zero_Chaos)" Date: Mon, 31 Jul 2023 23:33:36 -0400 Subject: [PATCH 797/924] fix -Wstringop-overread error We are reading this 26 bytes into a 32 byte buffer, is this even any worse? Fixes: https://github.com/RfidResearchGroup/proxmark3/issues/2060 --- client/src/mifare/mifarehost.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index a05456bcd..76c392490 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -787,7 +787,7 @@ int mfStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBl p_keyblock = mem; } - uint8_t fn[26] = "static_nested_000.bin"; + uint8_t fn[32] = "static_nested_000.bin"; uint64_t start_time = msclock(); for (uint32_t i = 0; i < keycnt; i += max_keys_chunk) { From f451be58775c5ac6e9b48d404afc33456d237df0 Mon Sep 17 00:00:00 2001 From: "Rick Farina (Zero_Chaos)" Date: Wed, 2 Aug 2023 11:22:03 -0400 Subject: [PATCH 798/924] proxguiqt.cpp needs ui_overlays.h to build Fixes: https://github.com/RfidResearchGroup/proxmark3/issues/2062 --- client/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/Makefile b/client/Makefile index bb15a9944..f934eaed7 100644 --- a/client/Makefile +++ b/client/Makefile @@ -781,6 +781,8 @@ proxmark3: $(OBJS) $(STATICLIBS) lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lu src/proxgui.cpp: src/ui/ui_overlays.h src/ui/ui_image.h +src/proxguiqt.cpp: src/ui/ui_overlays.h + src/proxguiqt.moc.cpp: src/proxguiqt.h $(info [-] MOC $@) $(Q)$(MOC) -o$@ $^ From 0b70a1014561a19f8772052ebda4cbc0b9e23d30 Mon Sep 17 00:00:00 2001 From: "Rick Farina (Zero_Chaos)" Date: Wed, 2 Aug 2023 11:30:18 -0400 Subject: [PATCH 799/924] proxguiqt.cpp also needs ui_image.h to build This fixes the next parallel build failure in the current shuffle seed. --- client/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index f934eaed7..b79d248bb 100644 --- a/client/Makefile +++ b/client/Makefile @@ -781,7 +781,7 @@ proxmark3: $(OBJS) $(STATICLIBS) lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lu src/proxgui.cpp: src/ui/ui_overlays.h src/ui/ui_image.h -src/proxguiqt.cpp: src/ui/ui_overlays.h +src/proxguiqt.cpp: src/ui/ui_overlays.h src/ui/ui_image.h src/proxguiqt.moc.cpp: src/proxguiqt.h $(info [-] MOC $@) From 4ee7b78a07cde4dc1e3c9c2061d23ba5d1f8d02d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 17:36:50 +0200 Subject: [PATCH 800/924] always make sure resp is initialized --- client/src/comms.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/comms.c b/client/src/comms.c index 298db88e7..59c1cd1cf 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -820,7 +820,6 @@ bool WaitForResponse(uint32_t cmd, PacketResponseNG *response) { bool GetFromDevice(DeviceMemType_t memtype, uint8_t *dest, uint32_t bytes, uint32_t start_index, uint8_t *data, uint32_t datalen, PacketResponseNG *response, size_t ms_timeout, bool show_warning) { if (dest == NULL) return false; - if (bytes == 0) return true; PacketResponseNG resp; if (response == NULL) { @@ -839,6 +838,9 @@ bool GetFromDevice(DeviceMemType_t memtype, uint8_t *dest, uint32_t bytes, uint3 resp.oldarg[2] = 0; memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); + if (bytes == 0) return true; + + // clear clearCommandBuffer(); From 602daa7fdd30a77bba0a7b618891868489e9adcc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 17:40:55 +0200 Subject: [PATCH 801/924] missing inits --- client/src/cmdanalyse.c | 81 +++++++++++++++++++++++--------------- client/src/cmddata.c | 2 +- client/src/cmdhfthinfilm.c | 4 +- common/generator.c | 2 +- 4 files changed, 53 insertions(+), 36 deletions(-) diff --git a/client/src/cmdanalyse.c b/client/src/cmdanalyse.c index a2ebf9d23..3713befb5 100644 --- a/client/src/cmdanalyse.c +++ b/client/src/cmdanalyse.c @@ -311,7 +311,7 @@ static int CmdAnalyseCRC(const char *Cmd) { PrintAndLogEx(INFO, " reflect8(0x80) is %02X == 0x01", reflect8(0x80)); PrintAndLogEx(INFO, " reflect16(0x8000) is %04X == 0x0001", reflect16(0xc6c6)); - uint8_t b1, b2; + uint8_t b1 = 0, b2 = 0; // ISO14443 crc B compute_crc(CRC_14443_B, data, (size_t)dlen, &b1, &b2); uint16_t crcBB_1 = (uint16_t)(b1 << 8 | b2); @@ -1079,71 +1079,88 @@ static int CmdAnalyseUnits(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "analyse units", "experiments of unit conversions found in HF. ETU (1/13.56mhz), US or SSP_CLK (1/3.39MHz)", - "analyse uints --etu 10" - "analyse uints --us 100" + "analyse uints --etu 10\n" + "analyse uints --us 100\n" ); void *argtable[] = { arg_param_begin, arg_int0(NULL, "etu", "", "number in ETU"), arg_int0(NULL, "us", "", "number in micro seconds (us)"), + arg_lit0("t", "selftest", "self tests"), arg_param_end }; - CLIExecWithReturn(ctx, Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, true); int etu = arg_get_int_def(ctx, 1, -1); int us = arg_get_int_def(ctx, 2, -1); + bool selftest = arg_get_lit(ctx, 3); CLIParserFree(ctx); - if (etu == -1 && us == -1) { + if (selftest) { PrintAndLogEx(INFO, "US to ETU conversions"); - PrintAndLogEx(INFO, " 9 US = %u ETU (expect 1) " _GREEN_("ok"), US_TO_ETU(9)); - PrintAndLogEx(INFO, " 10 US = %u ETU (expect 1) " _GREEN_("ok"), US_TO_ETU(10)); - PrintAndLogEx(INFO, " 94 US = %u ETU (expect 10) " _GREEN_("ok"), US_TO_ETU(94)); - PrintAndLogEx(INFO, " 95 US = %u ETU (expect 10) " _GREEN_("ok"), US_TO_ETU(95)); - PrintAndLogEx(INFO, " 302 US = %u ETU (expect 32) " _GREEN_("ok"), US_TO_ETU(302)); + + int32_t test = US_TO_ETU(9); + PrintAndLogEx(INFO, " 9 US = %i ETU (expect 1) %s", test, (test == 1) ? _GREEN_("ok") : _RED_("fail")); + + test = US_TO_ETU(10); + PrintAndLogEx(INFO, " 10 US = %i ETU (expect 1) %s", test, (test == 1) ? _GREEN_("ok") : _RED_("fail")); + + test = US_TO_ETU(94); + PrintAndLogEx(INFO, " 94 US = %i ETU (expect 10) %s", test, (test == 10) ? _GREEN_("ok") : _RED_("fail")); + + test = US_TO_ETU(95); + PrintAndLogEx(INFO, " 95 US = %i ETU (expect 10) %s", test, (test == 10) ? _GREEN_("ok") : _RED_("fail")); + + test = US_TO_ETU(302); + PrintAndLogEx(INFO, " 302 US = %i ETU (expect 32) %s", test, (test == 10) ? _GREEN_("ok") : _RED_("fail")); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "ETU to US conversions"); - PrintAndLogEx(INFO, " 1 ETU = %u US (expect 9.43) " _GREEN_("ok"), ETU_TO_US(1)); - PrintAndLogEx(INFO, " 10 ETU = %u US (expect 94.39) " _GREEN_("ok"), ETU_TO_US(10)); - PrintAndLogEx(INFO, " 32 ETU = %u US (expect 302) " _GREEN_("ok"), ETU_TO_US(32)); + float test_us = ETU_TO_US(1); + PrintAndLogEx(INFO, " 1 ETU = %3.2f US (expect 9.44) %s", test_us, (test_us == 9.44) ? _GREEN_("ok") : _RED_("fail")); + test_us = ETU_TO_US(10); + PrintAndLogEx(INFO, " 10 ETU = %4.2f US (expect 94.40) %s", test_us, (test_us == 94.40) ? _GREEN_("ok") : _RED_("fail")); + test_us = ETU_TO_US(32); + PrintAndLogEx(INFO, " 32 ETU = %5.2f US (expect 302.06) %s", test_us, (test_us == 320.06) ? _GREEN_("ok") : _RED_("fail")); + + PrintAndLogEx(INFO, "ETU in %f us", ONE_ETU_IN_US); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "US to SSP CLK 3.39MHz conversions"); - PrintAndLogEx(INFO, " 9 US = %u SSP (expect 32) ", US_TO_SSP(9)); - PrintAndLogEx(INFO, " 10 US = %u SSP (expect 32 or 48) ", US_TO_SSP(10)); - PrintAndLogEx(INFO, " 94 US = %u SSP (expect 320) ", US_TO_SSP(94)); - PrintAndLogEx(INFO, " 95 US = %u SSP (expect 320 or 336) ", US_TO_SSP(95)); - PrintAndLogEx(INFO, " 302 US = %u SSP (expect 1024) ", US_TO_SSP(302)); + PrintAndLogEx(INFO, " 9 US = %i SSP (expect 32) ", US_TO_SSP(9)); + PrintAndLogEx(INFO, " 10 US = %i SSP (expect 32 or 48) ", US_TO_SSP(10)); + PrintAndLogEx(INFO, " 94 US = %i SSP (expect 320) ", US_TO_SSP(94)); + PrintAndLogEx(INFO, " 95 US = %i SSP (expect 320 or 336) ", US_TO_SSP(95)); + PrintAndLogEx(INFO, " 302 US = %i SSP (expect 1024) ", US_TO_SSP(302)); - PrintAndLogEx(INFO, " 4949000 US = %u SSP ", US_TO_SSP(4949000)); + PrintAndLogEx(INFO, " 4949000 US = %i SSP ", US_TO_SSP(4949000)); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "SSP CLK 3.39MHz to US conversions"); - PrintAndLogEx(INFO, " 32 SSP = %u US (expect 9 or 10) " _GREEN_("ok"), SSP_TO_US(32)); - PrintAndLogEx(INFO, " 320 SSP = %u US (expect 94 or 95) " _GREEN_("ok"), SSP_TO_US(320)); - PrintAndLogEx(INFO, "1024 SSP = %u US (expect 302) " _GREEN_("ok"), SSP_TO_US(1024)); + PrintAndLogEx(INFO, " 32 SSP = %i US (expect 9 or 10) " _GREEN_("ok"), SSP_TO_US(32)); + PrintAndLogEx(INFO, " 320 SSP = %i US (expect 94 or 95) " _GREEN_("ok"), SSP_TO_US(320)); + PrintAndLogEx(INFO, "1024 SSP = %i US (expect 302) " _GREEN_("ok"), SSP_TO_US(1024)); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "ETU to SSP CLK 3.39MHz conversions"); - PrintAndLogEx(INFO, " 1 ETU = %u SSP (expect 32) " _GREEN_("ok"), ETU_TO_SSP(1)); - PrintAndLogEx(INFO, " 10 ETU = %u SSP (expect 320) " _GREEN_("ok"), ETU_TO_SSP(10)); - PrintAndLogEx(INFO, " 32 ETU = %u SSP (expect 1024) " _GREEN_("ok"), ETU_TO_SSP(32)); + PrintAndLogEx(INFO, " 1 ETU = %i SSP (expect 32) " _GREEN_("ok"), ETU_TO_SSP(1)); + PrintAndLogEx(INFO, " 10 ETU = %i SSP (expect 320) " _GREEN_("ok"), ETU_TO_SSP(10)); + PrintAndLogEx(INFO, " 32 ETU = %i SSP (expect 1024) " _GREEN_("ok"), ETU_TO_SSP(32)); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "SSP CLK 3.39MHz to ETU conversions"); - PrintAndLogEx(INFO, "1024 SSP = %u ETU (expect 32) " _GREEN_("ok"), SSP_TO_ETU(1024)); - PrintAndLogEx(INFO, " 320 SSP = %u ETU (expect 10) " _GREEN_("ok"), SSP_TO_ETU(320)); - PrintAndLogEx(INFO, " 32 SSP = %u ETU (expect 1) " _GREEN_("ok"), SSP_TO_ETU(32)); + PrintAndLogEx(INFO, "1024 SSP = %i ETU (expect 32) " _GREEN_("ok"), SSP_TO_ETU(1024)); + PrintAndLogEx(INFO, " 320 SSP = %i ETU (expect 10) " _GREEN_("ok"), SSP_TO_ETU(320)); + PrintAndLogEx(INFO, " 32 SSP = %i ETU (expect 1) " _GREEN_("ok"), SSP_TO_ETU(32)); } else if (etu) { - PrintAndLogEx(INFO, " %d ETU = %u us ", ETU_TO_US(etu), 0); - PrintAndLogEx(INFO, " %d ETU = %u SSP ", ETU_TO_SSP(etu), 0); + PrintAndLogEx(INFO, " %i ETU = %u us ", ETU_TO_US(etu), 0); + PrintAndLogEx(INFO, " %i ETU = %u SSP ", ETU_TO_SSP(etu), 0); } else if (us) { - PrintAndLogEx(INFO, " %d us = %u ETU ", US_TO_ETU(us), 0); - PrintAndLogEx(INFO, " %d us = %u SSP ", US_TO_SSP(us), 0); + PrintAndLogEx(INFO, " %i us = %u ETU ", US_TO_ETU(us), 0); + PrintAndLogEx(INFO, " %i us = %u SSP ", US_TO_SSP(us), 0); } return PM3_SUCCESS; diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 2208a34d4..38ffba69c 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -1759,7 +1759,7 @@ int getSamplesEx(uint32_t start, uint32_t end, bool verbose, bool ignore_lf_conf PrintAndLogEx(INFO, "Reading " _YELLOW_("%u") " bytes from device memory", n); PacketResponseNG resp; - if (!GetFromDevice(BIG_BUF, got, n, start, NULL, 0, &resp, 10000, true)) { + if (GetFromDevice(BIG_BUF, got, n, start, NULL, 0, &resp, 10000, true) == false) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); return PM3_ETIMEOUT; } diff --git a/client/src/cmdhfthinfilm.c b/client/src/cmdhfthinfilm.c index 92c82f3f3..64b03a819 100644 --- a/client/src/cmdhfthinfilm.c +++ b/client/src/cmdhfthinfilm.c @@ -43,7 +43,7 @@ static int print_barcode(uint8_t *barcode, const size_t barcode_len, bool verbos if (verbose) { PrintAndLogEx(SUCCESS, " Data format : "_YELLOW_("%02X"), barcode[1]); if (barcode_len > 2) { - uint8_t b1, b2; + uint8_t b1 = 0, b2 = 0; compute_crc(CRC_14443_A, barcode, barcode_len - 2, &b1, &b2); bool isok = (barcode[barcode_len - 1] == b1 && barcode[barcode_len - 2] == b2); @@ -173,7 +173,7 @@ int CmdHfThinFilmSim(const char *Cmd) { CLIParserFree(ctx); if (addcrc && data_len <= 510) { - uint8_t b1, b2; + uint8_t b1 = 0, b2 = 0; compute_crc(CRC_14443_A, data, data_len, &b1, &b2); data[data_len++] = b2; data[data_len++] = b1; diff --git a/common/generator.c b/common/generator.c index 7cf5498e1..f0605f4ab 100644 --- a/common/generator.c +++ b/common/generator.c @@ -549,7 +549,7 @@ int mfdes_kdf_input_gallagher(uint8_t *uid, uint8_t uidLen, uint8_t keyNo, uint3 int mfc_generate4b_nuid(uint8_t *uid, uint8_t *nuid) { uint16_t crc; - uint8_t b1, b2; + uint8_t b1 = 0, b2 = 0; compute_crc(CRC_14443_A, uid, 3, &b1, &b2); nuid[0] = (b2 & 0xE0) | 0xF; From 2b3d33971447494422f8211f78a40aebc3da1f8d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 17:46:53 +0200 Subject: [PATCH 802/924] lto missing inits --- client/src/cmdlfindala.c | 2 +- client/src/comms.c | 2 +- common/generator.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdlfindala.c b/client/src/cmdlfindala.c index 1af21ec20..ba1d14205 100644 --- a/client/src/cmdlfindala.c +++ b/client/src/cmdlfindala.c @@ -663,7 +663,7 @@ static int CmdIndalaSim(const char *Cmd) { bool fmt4041x = arg_get_lit(ctx, 5); - int32_t cardnumber; + int32_t cardnumber = 0; uint8_t fc = 0; uint16_t cn = 0; bool got_cn = false, got_26 = false; diff --git a/client/src/comms.c b/client/src/comms.c index 59c1cd1cf..68f8f9631 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -156,7 +156,7 @@ static void SendCommandNG_internal(uint16_t cmd, uint8_t *data, size_t len, bool memcpy(&txBufferNG.data, data, len); if ((g_conn.send_via_fpc_usart && g_conn.send_with_crc_on_fpc) || ((!g_conn.send_via_fpc_usart) && g_conn.send_with_crc_on_usb)) { - uint8_t first, second; + uint8_t first = 0, second = 0; compute_crc(CRC_14443_A, (uint8_t *)&txBufferNG, sizeof(PacketCommandNGPreamble) + len, &first, &second); tx_post->crc = (first << 8) + second; } else { diff --git a/common/generator.c b/common/generator.c index f0605f4ab..20f8a0b5f 100644 --- a/common/generator.c +++ b/common/generator.c @@ -173,7 +173,7 @@ uint32_t ul_ev1_pwdgenD(const uint8_t *uid) { // AIR purifier Xiaomi uint32_t ul_ev1_pwdgenE(const uint8_t *uid) { - uint8_t hash[20]; + uint8_t hash[20] = {0}; mbedtls_sha1(uid, 7, hash); uint32_t pwd = 0; pwd |= (hash[ hash[0] % 20 ]) << 24 ; @@ -185,7 +185,7 @@ uint32_t ul_ev1_pwdgenE(const uint8_t *uid) { // NDEF tools format password generator uint32_t ul_ev1_pwdgenF(const uint8_t *uid) { - uint8_t hash[16]; + uint8_t hash[16] = {0};; mbedtls_md5(uid, 7, hash); uint32_t pwd = 0; pwd |= hash[0] << 24; From 8f2b71ffc4a9f512a70cc014a53b0b99b91dcfbb Mon Sep 17 00:00:00 2001 From: "Rick Farina (Zero_Chaos)" Date: Wed, 2 Aug 2023 13:00:32 -0400 Subject: [PATCH 803/924] fix parallel build for proxguiqt.moc.cpp seed shuffle=2866679623 found that proxguiqt.moc.cpp also needs the same header so just defining the header and defining it's needs should make everyone happy --- client/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index b79d248bb..e86d8d10e 100644 --- a/client/Makefile +++ b/client/Makefile @@ -781,12 +781,14 @@ proxmark3: $(OBJS) $(STATICLIBS) lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lu src/proxgui.cpp: src/ui/ui_overlays.h src/ui/ui_image.h -src/proxguiqt.cpp: src/ui/ui_overlays.h src/ui/ui_image.h +src/proxguiqt.cpp: src/proxguiqt.h src/proxguiqt.moc.cpp: src/proxguiqt.h $(info [-] MOC $@) $(Q)$(MOC) -o$@ $^ +src/proxguiqt.h: src/ui/ui_overlays.h src/ui/ui_image.h + src/ui/ui_overlays.h: src/ui/overlays.ui $(info [-] UIC $@) $(Q)$(UIC) $^ > $@ From ce741d3b44496d7fe46ed95adf30f45c752c6d90 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 19:12:59 +0200 Subject: [PATCH 804/924] defines --- include/iso14b.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/include/iso14b.h b/include/iso14b.h index 88ba0c2be..a9b55e69c 100644 --- a/include/iso14b.h +++ b/include/iso14b.h @@ -65,13 +65,17 @@ typedef struct { } PACKED iso14b_raw_cmd_t; -#define US_TO_SSP(x) ( (uint32_t)((x) * 3.39) ) -#define SSP_TO_US(x) ( (uint32_t)((x) / 3.39) ) +#define US_TO_SSP(x) ( (int32_t)((x) * 3.39) ) +#define SSP_TO_US(x) ( (int32_t)((x) / 3.39) ) -#define ETU_TO_SSP(x) ((uint32_t)((x) * 32)) -#define SSP_TO_ETU(x) ((uint32_t)((x) / 32)) +#define ETU_TO_SSP(x) ( (int32_t)((x) * 32) ) +#define SSP_TO_ETU(x) ( (int32_t)((x) / 32) ) -#define ETU_TO_US(x) ((uint32_t)((((x) * 9440000) / 1000000) + 0.5)) -#define US_TO_ETU(x) ((uint32_t)(((x) * 1000000 / 9440000) + 0.5)) +#define ONE_ETU_IN_US (12800000.0 / 1356000.0) +#define ETU_TO_US(x) (float)(ONE_ETU_IN_US * (x)) + +// #define ETU_TO_US(x) ( (int32_t)( ((x) * 9440000) / 1000000) ) +#define US_TO_ETU(x) ( (int32_t)( ((x) * 1000000) / 9440000) ) #endif // _ISO14B_H_ + From 1c35f14c760fe308606f19ed56fcf8f28a2bcb2e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 19:49:26 +0200 Subject: [PATCH 805/924] thanks @DidierA for the sharp eyes --- client/src/atrs.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/client/src/atrs.c b/client/src/atrs.c index 0b22eb79b..d8f11587f 100644 --- a/client/src/atrs.c +++ b/client/src/atrs.c @@ -18,8 +18,8 @@ #include "atrs.h" #include #include -#include "commonutil.h" // ARRAYLEN -#include "ui.h" // PrintAndLogEx +#include "commonutil.h" // ARRAYLEN +#include "ui.h" // PrintAndLogEx // get a ATR description based on the atr bytes // returns description of the best match @@ -32,7 +32,7 @@ const char *getAtrInfo(const char *atr_str) { if (strlen(AtrTable[i].bytes) != slen) continue; - if (strstr(AtrTable[i].bytes, "..") != NULL) { + if (strstr(AtrTable[i].bytes, ".") != NULL) { char *tmp_atr = calloc(slen, sizeof(uint8_t)); if (tmp_atr == NULL) { PrintAndLogEx(FAILED, "failed to allocate memory"); @@ -40,7 +40,7 @@ const char *getAtrInfo(const char *atr_str) { } for (int j = 0; j < slen; j++) { - tmp_atr[j] = AtrTable[i].bytes[j] == '.' ? '.' : atr_str[j]; + tmp_atr[j] = (AtrTable[i].bytes[j] == '.') ? '.' : atr_str[j]; } if (strncmp(tmp_atr, AtrTable[i].bytes, slen) == 0) { @@ -50,9 +50,12 @@ const char *getAtrInfo(const char *atr_str) { free(tmp_atr); } else { - if (strncmp(atr_str, AtrTable[i].bytes, slen) == 0) return AtrTable[i].desc; + if (strncmp(atr_str, AtrTable[i].bytes, slen) == 0) { + return AtrTable[i].desc; + } } } + if (match >= 0) { return AtrTable[match].desc; } else { From 1e26d79ddd9e556f7b81924ff9951e71bf5f13cb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 19:50:47 +0200 Subject: [PATCH 806/924] added a new command to lookup ATR arrays --- client/src/cmddata.c | 51 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 38ffba69c..0b38689b8 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -38,6 +38,7 @@ #include "mbedtls/bignum.h" // big num #include "mbedtls/entropy.h" // #include "mbedtls/ctr_drbg.h" // random generator +#include "atrs.h" // ATR lookup uint8_t g_DemodBuffer[MAX_DEMOD_BUF_LEN]; size_t g_DemodBufferLen = 0; @@ -3411,6 +3412,51 @@ static int CmdEnvelope(const char *Cmd) { return PM3_SUCCESS; } +static int CmdAtrLookup(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "data atr", + "look up ATR record from bytearray\n" + "", + "data atr -d 3B6B00000031C064BE1B0100079000\n" + ); + + void *argtable[] = { + arg_param_begin, + arg_str0("d", NULL, "", "ASN1 encoded byte array"), + arg_lit0("t", "test", "perform selftest"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + int dlen = 64; + uint8_t data[64]; + CLIGetHexWithReturn(ctx, 1, data, &dlen); +// bool selftest = arg_get_lit(ctx, 2); + CLIParserFree(ctx); +// if (selftest) { +// return atr_selftest(); +// } + // convert bytes to str. + char *hexstr = calloc((dlen << 1) + 1, sizeof(uint8_t)); + if (hexstr == NULL) { + PrintAndLogEx(WARNING, "failed to allocate memory"); + return PM3_EMALLOC; + } + hex_to_buffer((uint8_t *)hexstr, data, dlen, (dlen << 1), 0, 0, true); + + PrintAndLogEx(INFO, "ISO7816-3 ATR... " _YELLOW_("%s"), sprint_hex(data, dlen)); + PrintAndLogEx(INFO, "Fingerprint..."); + + char *copy = str_dup(getAtrInfo(hexstr)); + + char * token = strtok(copy, "\n"); + while ( token != NULL ) { + PrintAndLogEx(INFO, " %s", token); + token = strtok(NULL, "\n"); + } + free(copy); + return PM3_SUCCESS; +} + static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, @@ -3449,11 +3495,12 @@ static command_t CommandTable[] = { {"getbitstream", CmdGetBitStream, AlwaysAvailable, "Convert GraphBuffer's >=1 values to 1 and <1 to 0"}, {"-----------", CmdHelp, AlwaysAvailable, "------------------------- " _CYAN_("General") "-------------------------"}, - {"asn1", CmdAsn1Decoder, AlwaysAvailable, "asn1 decoder"}, + {"asn1", CmdAsn1Decoder, AlwaysAvailable, "ASN1 decoder"}, + {"atr", CmdAtrLookup, AlwaysAvailable, "ATR lookup"}, {"bin2hex", Cmdbin2hex, AlwaysAvailable, "Converts binary to hexadecimal"}, {"bitsamples", CmdBitsamples, IfPm3Present, "Get raw samples as bitstring"}, {"clear", CmdBuffClear, AlwaysAvailable, "Clears bigbuf on deviceside and graph window"}, - {"diff", CmdDiff, AlwaysAvailable, "diff of input files"}, + {"diff", CmdDiff, AlwaysAvailable, "Diff of input files"}, {"hexsamples", CmdHexsamples, IfPm3Present, "Dump big buffer as hex bytes"}, {"hex2bin", Cmdhex2bin, AlwaysAvailable, "Converts hexadecimal to binary"}, {"load", CmdLoad, AlwaysAvailable, "Load contents of file into graph window"}, From d6a0f8edace2afb808f13bf9673133dd8b50a707 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 19:56:29 +0200 Subject: [PATCH 807/924] use string instead --- client/src/cmddata.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 0b38689b8..4507b19bd 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -3427,26 +3427,19 @@ static int CmdAtrLookup(const char *Cmd) { arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); - int dlen = 64; - uint8_t data[64]; - CLIGetHexWithReturn(ctx, 1, data, &dlen); + int dlen = 128; + uint8_t data[128 + 1]; + CLIGetStrWithReturn(ctx, 1, data, &dlen); + // bool selftest = arg_get_lit(ctx, 2); CLIParserFree(ctx); // if (selftest) { // return atr_selftest(); // } - // convert bytes to str. - char *hexstr = calloc((dlen << 1) + 1, sizeof(uint8_t)); - if (hexstr == NULL) { - PrintAndLogEx(WARNING, "failed to allocate memory"); - return PM3_EMALLOC; - } - hex_to_buffer((uint8_t *)hexstr, data, dlen, (dlen << 1), 0, 0, true); - - PrintAndLogEx(INFO, "ISO7816-3 ATR... " _YELLOW_("%s"), sprint_hex(data, dlen)); + PrintAndLogEx(INFO, "ISO7816-3 ATR... " _YELLOW_("%s"), data); PrintAndLogEx(INFO, "Fingerprint..."); - char *copy = str_dup(getAtrInfo(hexstr)); + char *copy = str_dup(getAtrInfo((char*)data)); char * token = strtok(copy, "\n"); while ( token != NULL ) { From 3fd8be2a47d0d1506828a76a8b51c88c228ccce0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 2 Aug 2023 22:13:05 +0200 Subject: [PATCH 808/924] Avoid some unneeded rebuild and fix parallel call to fw rebuild when calling from install --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index be4af6682..1643881f8 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ INSTALLSCRIPTS=pm3 pm3-flash pm3-flash-all pm3-flash-bootrom pm3-flash-fullimage INSTALLSHARES=tools/jtag_openocd traces INSTALLDOCS=doc/*.md doc/md -install: all common/install +install: common/install common/install: $(info [@] Installing common resources to $(MYDESTDIR)$(PREFIX)...) @@ -170,7 +170,7 @@ client/%: FORCE cleanifplatformchanged $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C client $(patsubst client/%,%,$@) DESTDIR=$(MYDESTDIR) recovery/all: bootrom/all armsrc/all -recovery/install: bootrom/all armsrc/all +recovery/install: bootrom/install armsrc/install recovery/%: FORCE cleanifplatformchanged $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C recovery $(patsubst recovery/%,%,$@) DESTDIR=$(MYDESTDIR) From 5b58e438b168f747db79690cd60e9e18ec77c7ef Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 22:41:35 +0200 Subject: [PATCH 809/924] style --- client/src/cmddata.c | 6 ++--- client/src/pm3line_vocabulory.h | 1 + doc/commands.json | 42 +++++++++++++++++++++++---------- doc/commands.md | 5 ++-- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 4507b19bd..5c1948c14 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -3439,10 +3439,10 @@ static int CmdAtrLookup(const char *Cmd) { PrintAndLogEx(INFO, "ISO7816-3 ATR... " _YELLOW_("%s"), data); PrintAndLogEx(INFO, "Fingerprint..."); - char *copy = str_dup(getAtrInfo((char*)data)); + char *copy = str_dup(getAtrInfo((char *)data)); - char * token = strtok(copy, "\n"); - while ( token != NULL ) { + char *token = strtok(copy, "\n"); + while (token != NULL) { PrintAndLogEx(INFO, " %s", token); token = strtok(NULL, "\n"); } diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 4168a0800..40d2bcc29 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -102,6 +102,7 @@ const static vocabulory_t vocabulory[] = { { 1, "data convertbitstream" }, { 1, "data getbitstream" }, { 1, "data asn1" }, + { 1, "data atr" }, { 1, "data bin2hex" }, { 0, "data bitsamples" }, { 1, "data clear" }, diff --git a/doc/commands.json b/doc/commands.json index c03e4c80a..858cc02cd 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -140,15 +140,17 @@ "command": "analyse units", "description": "experiments of unit conversions found in HF. ETU (1/13.56mhz), US or SSP_CLK (1/3.39MHz)", "notes": [ - "analyse uints --etu 10analyse uints --us 100" + "analyse uints --etu 10", + "analyse uints --us 100" ], "offline": true, "options": [ "-h, --help This help", "--etu number in ETU", - "--us number in micro seconds (us)" + "--us number in micro seconds (us)", + "-t, --selftest self tests" ], - "usage": "analyse units [-h] [--etu ] [--us ]" + "usage": "analyse units [-ht] [--etu ] [--us ]" }, "auto": { "command": "auto", @@ -204,6 +206,20 @@ ], "usage": "data asn1 [-ht] [-d ]" }, + "data atr": { + "command": "data atr", + "description": "look up ATR record from bytearray", + "notes": [ + "data atr -d 3B6B00000031C064BE1B0100079000" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-d ASN1 encoded byte array", + "-t, --test perform selftest" + ], + "usage": "data atr [-ht] [-d ]" + }, "data autocorr": { "command": "data autocorr", "description": "Autocorrelate over window is used to detect repeating sequences. We use it as detection of how long in bits a message inside the signal is", @@ -1170,7 +1186,7 @@ }, "hf 14a list": { "command": "hf 14a list", - "description": "Alias of `trace list -t 14a` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t 14a -c` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "hf 14a list --frame -> show frame delay times", "hf 14a list -1 -> use trace buffer" @@ -3166,7 +3182,7 @@ }, "hf iclass list": { "command": "hf iclass list", - "description": "Alias of `trace list -t iclass` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t iclass -c` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "hf iclass list --frame -> show frame delay times", "hf iclass list -1 -> use trace buffer" @@ -3836,7 +3852,7 @@ }, "hf lto list": { "command": "hf lto list", - "description": "Alias of `trace list -t lto` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t lto -c` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "hf lto list --frame -> show frame delay times", "hf lto list -1 -> use trace buffer" @@ -4591,7 +4607,7 @@ }, "hf mf list": { "command": "hf mf list", - "description": "Alias of `trace list -t mf` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t mf -c` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "hf mf list --frame -> show frame delay times", "hf mf list -1 -> use trace buffer" @@ -5803,7 +5819,7 @@ }, "hf mfdes list": { "command": "hf mfdes list", - "description": "Alias of `trace list -t des` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t des -c` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "hf mfdes list --frame -> show frame delay times", "hf mfdes list -1 -> use trace buffer" @@ -6216,7 +6232,7 @@ }, "hf mfp list": { "command": "hf mfp list", - "description": "Alias of `trace list -t mfp` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t mfp -c` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "hf mfp list --frame -> show frame delay times", "hf mfp list -1 -> use trace buffer" @@ -6494,7 +6510,7 @@ }, "hf mfu list": { "command": "hf mfu list", - "description": "Alias of `trace list -t 14a` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t 14a -c` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "hf 14a list --frame -> show frame delay times", "hf 14a list -1 -> use trace buffer" @@ -7064,7 +7080,7 @@ }, "hf topaz list": { "command": "hf topaz list", - "description": "Alias of `trace list -t topaz` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "Alias of `trace list -t topaz -c` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "hf topaz list --frame -> show frame delay times", "hf topaz list -1 -> use trace buffer" @@ -11803,8 +11819,8 @@ } }, "metadata": { - "commands_extracted": 684, + "commands_extracted": 685, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-27T21:41:37" + "extracted_on": "2023-08-02T20:39:48" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 7a8476a6c..27d6a05b4 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -120,11 +120,12 @@ Check column "offline" for their availability. |`data zerocrossings `|Y |`Count time between zero-crossings` |`data convertbitstream `|Y |`Convert GraphBuffer's 0/1 values to 127 / -127` |`data getbitstream `|Y |`Convert GraphBuffer's >=1 values to 1 and <1 to 0` -|`data asn1 `|Y |`asn1 decoder` +|`data asn1 `|Y |`ASN1 decoder` +|`data atr `|Y |`ATR lookup` |`data bin2hex `|Y |`Converts binary to hexadecimal` |`data bitsamples `|N |`Get raw samples as bitstring` |`data clear `|Y |`Clears bigbuf on deviceside and graph window` -|`data diff `|Y |`diff of input files` +|`data diff `|Y |`Diff of input files` |`data hexsamples `|N |`Dump big buffer as hex bytes` |`data hex2bin `|Y |`Converts hexadecimal to binary` |`data load `|Y |`Load contents of file into graph window` From fd987ab8a2ca486a68b3b832d62e19b0c4ddbfa5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 2 Aug 2023 23:47:25 +0200 Subject: [PATCH 810/924] fix string formatter --- CHANGELOG.md | 2 ++ client/src/cmdanalyse.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd92a393..5a5ca1b7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `data atr` - a command to lookup ATR (@iceman1001) + - Fixed bug in ATR lookup fct, thanks @DidierA (@iceman1001) - Updated ATR list (@iceman1001) - Changed `mem load -m` - now correctly erase all allocated flash memory (@iceman1001) - Fixed emulator quick dump to handle MFC Ev1 extra sectors (@iceman100) diff --git a/client/src/cmdanalyse.c b/client/src/cmdanalyse.c index 3713befb5..bab54f3da 100644 --- a/client/src/cmdanalyse.c +++ b/client/src/cmdanalyse.c @@ -1156,7 +1156,7 @@ static int CmdAnalyseUnits(const char *Cmd) { PrintAndLogEx(INFO, " 32 SSP = %i ETU (expect 1) " _GREEN_("ok"), SSP_TO_ETU(32)); } else if (etu) { - PrintAndLogEx(INFO, " %i ETU = %u us ", ETU_TO_US(etu), 0); + PrintAndLogEx(INFO, " %3.2f ETU = %u us ", ETU_TO_US(etu), 0); PrintAndLogEx(INFO, " %i ETU = %u SSP ", ETU_TO_SSP(etu), 0); } else if (us) { PrintAndLogEx(INFO, " %i us = %u ETU ", US_TO_ETU(us), 0); From 9dfc39dbbf75d85a148647c1df5af649c1dc9c98 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 3 Aug 2023 00:37:05 +0200 Subject: [PATCH 811/924] Fix error=missing-field-initializers when compiling repo default_version_pm3.c --- common/default_version_pm3.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/default_version_pm3.c b/common/default_version_pm3.c index 46eac57c9..d93a7ef15 100644 --- a/common/default_version_pm3.c +++ b/common/default_version_pm3.c @@ -26,5 +26,7 @@ const struct version_information_t SECTVERSINFO g_version_information = { 1, /* version 1 */ 0, /* version information not present */ 2, /* cleanliness couldn't be determined */ - /* Remaining fields: zero */ + "Iceman/master/unknown", + "1970-01-01 00:00:00", + "no sha256" }; From cb72897b17019fc565cac87f9578809efdf66611 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 3 Aug 2023 00:42:08 +0200 Subject: [PATCH 812/924] `mkversion.sh`: now regenerates version_pm3.c (and consequently the binaries) only when needed and add --force to forcibly regenerate version_pm3.c and small fixes: * document mkversion.sh usage * remove call to mkversion.sh in client/experimental_lib/CMakeLists.txt on release * remove call to old `mkversion.pl` in bootrom/Makefile * just in case, mkversion.sh takes care of atomic write of the file --- CHANGELOG.md | 1 + Makefile | 4 +-- armsrc/Makefile | 6 ++-- bootrom/Makefile | 6 ++-- client/CMakeLists.txt | 2 +- client/Makefile | 6 ++-- client/experimental_lib/CMakeLists.txt | 2 +- tools/mkversion.sh | 49 ++++++++++++++++++++++++-- 8 files changed, 61 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd92a393..21e6a7026 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `mkversion.sh` - now regenerates version_pm3.c (and consequently the binaries) only when needed (@doegox) - Updated ATR list (@iceman1001) - Changed `mem load -m` - now correctly erase all allocated flash memory (@iceman1001) - Fixed emulator quick dump to handle MFC Ev1 extra sectors (@iceman100) diff --git a/Makefile b/Makefile index 1643881f8..436201bdd 100644 --- a/Makefile +++ b/Makefile @@ -370,10 +370,10 @@ release: # - Tagging temporarily... @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) # - Changing default version information based on new tag - @$(SH) tools/mkversion.sh > common/default_version_pm3.c.tmp && $(MV) common/default_version_pm3.c.tmp common/default_version_pm3.c + @$(SH) tools/mkversion.sh common/default_version_pm3.c # - Removing mkversion calls @sed -i 's#^.*\.\./tools/mkversion.sh.*|| #\t$$(Q)#' client/Makefile bootrom/Makefile armsrc/Makefile - @sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt + @sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt client/experimental_lib/CMakeLists.txt # - Deleting tag... @git tag -d $(VERSION) # - Amending commit... diff --git a/armsrc/Makefile b/armsrc/Makefile index c481a6f22..fe34c8a8f 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -181,10 +181,10 @@ showinfo: .DELETE_ON_ERROR: -# version_pm3.c should be remade on every time fullimage.stage1.elf should be remade +# version_pm3.c should be checked on every time fullimage.stage1.elf should be remade version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE - $(info [-] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ + $(info [-] CHECK $@) + $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index cad3e17d1..b6825530d 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -53,10 +53,10 @@ INSTALLFW = $(OBJDIR)/bootrom.elf OBJS = $(OBJDIR)/bootrom.s19 -# version_pm3.c should be remade on every compilation +# version_pm3.c should be checked on every compilation version_pm3.c: default_version_pm3.c .FORCE - $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ + $(info [=] CHECK $@) + $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ all: showinfo $(OBJS) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index be4e00a93..cbbedef73 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -397,7 +397,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) diff --git a/client/Makefile b/client/Makefile index e86d8d10e..0444b5932 100644 --- a/client/Makefile +++ b/client/Makefile @@ -918,10 +918,10 @@ src/pm3_pywrap.c: pm3.i .PHONY: all clean install uninstall tarbin .FORCE -# version_pm3.c should be remade on every compilation +# version_pm3.c should be checked on every compilation src/version_pm3.c: default_version_pm3.c .FORCE - $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ + $(info [=] CHECK $@) + $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index cec361446..73ec65aad 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -397,7 +397,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) diff --git a/tools/mkversion.sh b/tools/mkversion.sh index f741f2980..dd95e0441 100755 --- a/tools/mkversion.sh +++ b/tools/mkversion.sh @@ -1,5 +1,13 @@ #!/usr/bin/env sh +if [ "$1" = "--help" ] || [ "$1" = "-h" ] || [ "$1" = "" ]; then + echo "To report a short string about the current version:" + echo " $0 --short" + echo "To regenerate version_pm3.c if needed:" + echo " $0 [--force] [--undecided] path/to/version_pm3.c" + exit 0 +fi + # Output a version_pm3.c file that includes information about the current build # From mkversion.pl # pure sh POSIX as now even on Windows we use WSL or ProxSpace with sh available @@ -13,6 +21,27 @@ if [ "$1" = "--short" ]; then SHORT=true shift fi +FORCE=false +if [ "$1" = "--force" ]; then + FORCE=true + shift +fi +UNDECIDED=false +if [ "$1" = "--undecided" ]; then + UNDECIDED=true + shift +fi +VERSIONSRC="$1" + +if ! $SHORT && [ "$VERSIONSRC" = "" ]; then + echo "Error: $0 is missing its destination filename" + exit 1 +fi + +if $SHORT && [ "$VERSIONSRC" != "" ]; then + echo "Error: can't output a short string and generate file at the same time" + exit 1 +fi # if you are making your own fork, change this line to reflect your fork-name fullgitinfo="Iceman" @@ -27,7 +56,7 @@ if [ "$commandGIT" != "" ]; then # now avoiding the "fatal: No names found, cannot describe anything." error by fallbacking to abbrev hash in such case gitversion=$(git describe --dirty --always) gitbranch=$(git rev-parse --abbrev-ref HEAD) - if [ "$1" != "--undecided" ]; then + if $UNDECIDED; then if [ "$gitversion" != "${gitversion%-dirty}" ]; then clean=0 else @@ -68,7 +97,21 @@ sha=$( if [ "$sha" = "" ]; then sha="no sha256" fi -cat < "${VERSIONSRC}.tmp" < Date: Thu, 3 Aug 2023 01:13:57 +0200 Subject: [PATCH 813/924] make release: add --force to call to mkversion.sh. Not strictly needed but cleaner... --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 436201bdd..9a3ae0611 100644 --- a/Makefile +++ b/Makefile @@ -370,7 +370,7 @@ release: # - Tagging temporarily... @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) # - Changing default version information based on new tag - @$(SH) tools/mkversion.sh common/default_version_pm3.c + @$(SH) tools/mkversion.sh --force common/default_version_pm3.c # - Removing mkversion calls @sed -i 's#^.*\.\./tools/mkversion.sh.*|| #\t$$(Q)#' client/Makefile bootrom/Makefile armsrc/Makefile @sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt client/experimental_lib/CMakeLists.txt From a2ea5e3a24b61e9907dc91a057fde328ac9ed42b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 3 Aug 2023 07:43:30 +0200 Subject: [PATCH 814/924] since mkversion doesn generate all the time and only writes to file the sha256, we check the string from --short instead --- tools/pm3_tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 68d522ed6..434468147 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -250,7 +250,7 @@ while true; do if ! CheckExecute "findbits_test test" "tools/findbits_test.py 2>&1" "OK"; then break; fi if ! CheckExecute "pm3_eml_mfd test" "tools/pm3_eml_mfd_test.py 2>&1" "OK"; then break; fi if ! CheckExecute "recover_pk test" "tools/recover_pk.py selftests 2>&1" "Tests:.*\[OK\]"; then break; fi - if ! CheckExecute "mkversion sha256 test" "tools/mkversion.sh" '"[0-9a-f]{9}"'; then break; fi + if ! CheckExecute "mkversion create test" "tools/mkversion.sh --short" 'Iceman/'; then break; fi fi if $TESTALL || $TESTBOOTROM; then echo -e "\n${C_BLUE}Testing bootrom:${C_NC}" From 24a138eeb1143c93f839f962cc3e8d8716637563 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 3 Aug 2023 08:41:11 +0200 Subject: [PATCH 815/924] fix some potential empty responses and too much inline calls --- client/deps/hardnested/hardnested_bf_core.c | 2 +- client/deps/hardnested/hardnested_bruteforce.c | 2 +- client/src/cmdlf.c | 11 +++++++++++ client/src/cmdlfem4x50.c | 17 +++++++++++++++-- client/src/comms.c | 8 ++++---- 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 63eba8eba..a84ce0df9 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -371,7 +371,7 @@ uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statel for (uint32_t tests = 0; tests < nonces_to_bruteforce; ++tests) { // common bits with preceding test nonce uint32_t common_bits = next_common_bits; //tests ? trailing_zeros(bf_test_nonce_2nd_byte[tests] ^ bf_test_nonce_2nd_byte[tests-1]) : 0; - next_common_bits = tests < nonces_to_bruteforce - 1 ? trailing_zeros(bf_test_nonce_2nd_byte[tests] ^ bf_test_nonce_2nd_byte[tests + 1]) : 0; + next_common_bits = (tests < nonces_to_bruteforce - 1) ? trailing_zeros(bf_test_nonce_2nd_byte[tests] ^ bf_test_nonce_2nd_byte[tests + 1]) : 0; uint32_t parity_bit_idx = 1; // start checking with the parity of second nonce byte bitslice_value_t fb_bits = fbb[common_bits]; // start with precomputed feedback bits from previous nonce bitslice_value_t ks_bits = ksb[common_bits]; // dito for first keystream bits diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index 6bc400d1d..e4b203f4d 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -96,7 +96,7 @@ static uint32_t keys_found = 0; static uint64_t num_keys_tested; static uint64_t found_bs_key = 0; -inline uint8_t trailing_zeros(uint8_t byte) { +uint8_t trailing_zeros(uint8_t byte) { static const uint8_t trailing_zeros_LUT[256] = { 8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index 81ca3a081..87095631b 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -382,6 +382,17 @@ int CmdLFCommandRead(const char *Cmd) { SendCommandNG(CMD_LF_MOD_THEN_ACQ_RAW_ADC, (uint8_t *)&payload, PAYLOAD_HEADER_SIZE + cmd_len); PacketResponseNG resp; + // init to ZERO + resp.cmd = 0, + resp.length = 0, + resp.magic = 0, + resp.status = 0, + resp.crc = 0, + resp.ng = false, + resp.oldarg[0] = 0; + resp.oldarg[1] = 0; + resp.oldarg[2] = 0; + memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); i = 10; // 20sec wait loop diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index 09aeb8e84..c81767c7a 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -1230,9 +1230,22 @@ int CmdEM4x50Sim(const char *Cmd) { clearCommandBuffer(); SendCommandNG(CMD_LF_EM4X50_SIM, (uint8_t *)&password, sizeof(password)); - PacketResponseNG resp; - + PrintAndLogEx(INFO, "Press " _GREEN_("") " or pm3-button to abort simulation"); + + PacketResponseNG resp; + // init to ZERO + resp.cmd = 0, + resp.length = 0, + resp.magic = 0, + resp.status = 0, + resp.crc = 0, + resp.ng = false, + resp.oldarg[0] = 0; + resp.oldarg[1] = 0; + resp.oldarg[2] = 0; + memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); + bool keypress; do { keypress = kbd_enter_pressed(); diff --git a/client/src/comms.c b/client/src/comms.c index 68f8f9631..a7ed0fd06 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -742,10 +742,6 @@ static size_t communication_delay(void) { bool WaitForResponseTimeoutW(uint32_t cmd, PacketResponseNG *response, size_t ms_timeout, bool show_warning) { PacketResponseNG resp; - if (response == NULL) { - response = &resp; - } - // init to ZERO resp.cmd = 0, resp.length = 0, @@ -758,6 +754,10 @@ bool WaitForResponseTimeoutW(uint32_t cmd, PacketResponseNG *response, size_t ms resp.oldarg[2] = 0; memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); + if (response == NULL) { + response = &resp; + } + // Add delay depending on the communication channel & speed if (ms_timeout != (size_t) - 1) ms_timeout += communication_delay(); From 0e84860c2f0331d83a555c60373346ae73728da0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 3 Aug 2023 08:42:52 +0200 Subject: [PATCH 816/924] less inline calls --- client/deps/tinycbor/cborencoder.c | 10 +++++----- client/deps/tinycbor/cborparser.c | 8 ++++---- client/src/crypto/asn1dump.c | 2 +- common/commonutil.c | 20 ++++++++++---------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/client/deps/tinycbor/cborencoder.c b/client/deps/tinycbor/cborencoder.c index 570319e67..ae034d727 100644 --- a/client/deps/tinycbor/cborencoder.c +++ b/client/deps/tinycbor/cborencoder.c @@ -232,21 +232,21 @@ static inline void put64(void *where, uint64_t v) { memcpy(where, &v, sizeof(v)); } -static inline bool would_overflow(CborEncoder *encoder, size_t len) { +static bool would_overflow(CborEncoder *encoder, size_t len) { ptrdiff_t remaining = (ptrdiff_t)encoder->end; remaining -= remaining ? (ptrdiff_t)encoder->data.ptr : encoder->data.bytes_needed; remaining -= (ptrdiff_t)len; return unlikely(remaining < 0); } -static inline void advance_ptr(CborEncoder *encoder, size_t n) { +static void advance_ptr(CborEncoder *encoder, size_t n) { if (encoder->end) encoder->data.ptr += n; else encoder->data.bytes_needed += n; } -static inline CborError append_to_buffer(CborEncoder *encoder, const void *data, size_t len) { +static CborError append_to_buffer(CborEncoder *encoder, const void *data, size_t len) { if (would_overflow(encoder, len)) { if (encoder->end != NULL) { len -= encoder->end - encoder->data.ptr; @@ -263,11 +263,11 @@ static inline CborError append_to_buffer(CborEncoder *encoder, const void *data, return CborNoError; } -static inline CborError append_byte_to_buffer(CborEncoder *encoder, uint8_t byte) { +static CborError append_byte_to_buffer(CborEncoder *encoder, uint8_t byte) { return append_to_buffer(encoder, &byte, 1); } -static inline CborError encode_number_no_update(CborEncoder *encoder, uint64_t ui, uint8_t shiftedMajorType) { +static CborError encode_number_no_update(CborEncoder *encoder, uint64_t ui, uint8_t shiftedMajorType) { /* Little-endian would have been so much more convenient here: * We could just write at the beginning of buf but append_to_buffer * only the necessary bytes. diff --git a/client/deps/tinycbor/cborparser.c b/client/deps/tinycbor/cborparser.c index 2dade3a0d..468fe5da2 100644 --- a/client/deps/tinycbor/cborparser.c +++ b/client/deps/tinycbor/cborparser.c @@ -142,19 +142,19 @@ * \endif */ -static inline uint16_t get16(const uint8_t *ptr) { +static uint16_t get16(const uint8_t *ptr) { uint16_t result; memcpy(&result, ptr, sizeof(result)); return cbor_ntohs(result); } -static inline uint32_t get32(const uint8_t *ptr) { +static uint32_t get32(const uint8_t *ptr) { uint32_t result; memcpy(&result, ptr, sizeof(result)); return cbor_ntohl(result); } -static inline uint64_t get64(const uint8_t *ptr) { +static uint64_t get64(const uint8_t *ptr) { uint64_t result; memcpy(&result, ptr, sizeof(result)); return cbor_ntohll(result); @@ -949,7 +949,7 @@ CborError cbor_value_calculate_string_length(const CborValue *value, size_t *len return _cbor_value_copy_string(value, NULL, len, NULL); } -static inline void prepare_string_iteration(CborValue *it) { +static void prepare_string_iteration(CborValue *it) { if (!cbor_value_is_length_known(it)) { /* chunked string: we're before the first chunk; * advance to the first chunk */ diff --git a/client/src/crypto/asn1dump.c b/client/src/crypto/asn1dump.c index 5fcabe20a..025e200ca 100644 --- a/client/src/crypto/asn1dump.c +++ b/client/src/crypto/asn1dump.c @@ -342,7 +342,7 @@ static void asn1_tag_dump_object_id(const struct tlv *tlv, const struct asn1_tag if (jsondesc) { PrintAndLogEx(NORMAL, " - %s" NOLF, jsondesc); } else { - const char *ppstr; + const char *ppstr = NULL; mbedtls_oid_get_attr_short_name(&asn1_buf, &ppstr); if (ppstr && strnlen(ppstr, 1)) { PrintAndLogEx(NORMAL, " (%s)", ppstr); diff --git a/common/commonutil.c b/common/commonutil.c index 2265c240c..07b55f1f9 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -160,32 +160,32 @@ uint64_t bytes_to_num(uint8_t *src, size_t len) { return num; } -inline uint16_t MemLeToUint2byte(const uint8_t *data) { - return (uint16_t)( +uint16_t MemLeToUint2byte(const uint8_t *data) { + return (uint16_t)((uint16_t) (data[1] << 8) + data[0] ); } -inline uint32_t MemLeToUint3byte(const uint8_t *data) { - return (uint32_t)( +uint32_t MemLeToUint3byte(const uint8_t *data) { + return (uint32_t)((uint32_t) (data[2] << 16) + (data[1] << 8) + data[0] ); } -inline uint32_t MemLeToUint4byte(const uint8_t *data) { - return (uint32_t)( +uint32_t MemLeToUint4byte(const uint8_t *data) { + return (uint32_t)((uint32_t) (data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0] ); } -inline uint16_t MemBeToUint2byte(const uint8_t *data) { - return (uint16_t)( +uint16_t MemBeToUint2byte(const uint8_t *data) { + return (uint16_t)((uint16_t) (data[0] << 8) + data[1] ); } -inline uint32_t MemBeToUint3byte(const uint8_t *data) { - return (uint32_t)( +uint32_t MemBeToUint3byte(const uint8_t *data) { + return (uint32_t)((uint32_t) (data[0] << 16) + (data[1] << 8) + data[2] ); } From eaf11127be3e1138782a57b924dc5212fb49e38b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 3 Aug 2023 12:55:06 +0200 Subject: [PATCH 817/924] since HF SEARCH triggers multiple swaps of FPGA image HF -> HF 15 -> HF FELICA , its better to have relevant checks when the correct fpga image is loaded --- client/src/cmdhf.c | 78 ++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index b5cff4e19..ef94adf41 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -113,24 +113,6 @@ int CmdHFSearch(const char *Cmd) { } } - PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, " Searching for ISO15693 tag..."); - if (IfPm3Iso15693()) { - if (readHF15Uid(false, false)) { - PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO 15693 tag") " found\n"); - res = PM3_SUCCESS; - } - } - - PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, " Searching for iCLASS / PicoPass tag..."); - if (IfPm3Iclass()) { - if (read_iclass_csn(false, false, false) == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("iCLASS tag / PicoPass tag") " found\n"); - res = PM3_SUCCESS; - } - } - PROMPT_CLEARLINE; PrintAndLogEx(INPLACE, " Searching for LEGIC tag..."); if (IfPm3Legicrf()) { @@ -149,25 +131,6 @@ int CmdHFSearch(const char *Cmd) { } } - // 14b is the longest test - PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, " Searching for ISO14443-B tag..."); - if (IfPm3Iso14443b()) { - if (readHF14B(false, false) == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO 14443-B tag") " found\n"); - res = PM3_SUCCESS; - } - } - - PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, " Searching for FeliCa tag..."); - if (IfPm3Felica()) { - if (read_felica_uid(false, false) == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO 18092 / FeliCa tag") " found\n"); - res = PM3_SUCCESS; - } - } - // texkom PROMPT_CLEARLINE; PrintAndLogEx(INPLACE, " Searching for TEXKOM tag..."); @@ -186,6 +149,47 @@ int CmdHFSearch(const char *Cmd) { } } + // 14b is the longest test + PROMPT_CLEARLINE; + PrintAndLogEx(INPLACE, " Searching for ISO14443-B tag..."); + if (IfPm3Iso14443b()) { + if (readHF14B(false, false) == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO 14443-B tag") " found\n"); + res = PM3_SUCCESS; + } + } + + // OBS! This triggers a swap to FPGA_BITSTREAM_HF_15 == 1.5sec delay + + PROMPT_CLEARLINE; + PrintAndLogEx(INPLACE, " Searching for ISO15693 tag..."); + if (IfPm3Iso15693()) { + if (readHF15Uid(false, false)) { + PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO 15693 tag") " found\n"); + res = PM3_SUCCESS; + } + } + + PROMPT_CLEARLINE; + PrintAndLogEx(INPLACE, " Searching for iCLASS / PicoPass tag..."); + if (IfPm3Iclass()) { + if (read_iclass_csn(false, false, false) == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("iCLASS tag / PicoPass tag") " found\n"); + res = PM3_SUCCESS; + } + } + + // OBS! This triggers a swap to FPGA_BITSTREAM_HF_FELICA == 1.5sec delay + + PROMPT_CLEARLINE; + PrintAndLogEx(INPLACE, " Searching for FeliCa tag..."); + if (IfPm3Felica()) { + if (read_felica_uid(false, false) == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO 18092 / FeliCa tag") " found\n"); + res = PM3_SUCCESS; + } + } + /* PROMPT_CLEARLINE; PrintAndLogEx(INPLACE, " Searching for CryptoRF tag..."); From 33876ea8922184ab0ea3dad30a40e61f8447e574 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 3 Aug 2023 13:01:49 +0200 Subject: [PATCH 818/924] adapting fpga_compress to free memory and close file handles in exceptions --- CHANGELOG.md | 2 + tools/fpga_compress/fpga_compress.c | 133 ++++++++++++++++++---------- 2 files changed, 87 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f5879133..30854d631 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `fpga_compress` - better deallocation of memory and closing of file handles (@iceman1001) + - Changed `hf search` - less swaps of fpga images on device side (@iceman1001) - Changed `mkversion.sh` - now regenerates version_pm3.c (and consequently the binaries) only when needed (@doegox) - Added `data atr` - a command to lookup ATR (@iceman1001) - Fixed bug in ATR lookup fct, thanks @DidierA (@iceman1001) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 711cc2f68..faa35ccb9 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -21,6 +21,10 @@ #include "fpga.h" #include "lz4hc.h" +#ifndef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + static void usage(void) { fprintf(stdout, "Usage: fpga_compress ... \n"); fprintf(stdout, " Combine n FPGA bitstream files and compress them into one.\n\n"); @@ -57,10 +61,6 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { , num_infiles * FPGA_CONFIG_SIZE ); - for (uint16_t j = 0; j < num_infiles; j++) { - fclose(infile[j]); - } - free(fpga_config); return (EXIT_FAILURE); } @@ -77,59 +77,75 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { } } - } while (!all_feof(infile, num_infiles)); + } while (all_feof(infile, num_infiles) == false); uint32_t buffer_size = FPGA_RING_BUFFER_BYTES; - if (num_infiles == 1) - buffer_size = 1024 * 1024; //1M for now + if (num_infiles == 1) { + // 1M bytes for now + buffer_size = 1024 * 1024; + } uint32_t outsize_max = LZ4_compressBound(buffer_size); char *outbuf = calloc(outsize_max, sizeof(char)); + if (outbuf == NULL) { + fprintf(stderr, "failed to allocate memory"); + free(fpga_config); + return (EXIT_FAILURE); + } + + char *ring_buffer = calloc(buffer_size, sizeof(char)); + if (ring_buffer == NULL) { + fprintf(stderr, "failed to allocate memory"); + free(outbuf); + free(fpga_config); + return (EXIT_FAILURE); + } LZ4_streamHC_t *lz4_streamhc = LZ4_createStreamHC(); LZ4_resetStreamHC_fast(lz4_streamhc, LZ4HC_CLEVEL_MAX); int current_in = 0; int current_out = 0; - char *ring_buffer = calloc(buffer_size, sizeof(char)); + while (current_in < total_size) { - int bytes_to_copy = FPGA_RING_BUFFER_BYTES; - if (total_size - current_in < FPGA_RING_BUFFER_BYTES) - bytes_to_copy = total_size - current_in; + + int bytes_to_copy = MIN(FPGA_RING_BUFFER_BYTES, (total_size - current_in)); memcpy(ring_buffer, fpga_config + current_in, bytes_to_copy); + int cmp_bytes = LZ4_compress_HC_continue(lz4_streamhc, ring_buffer, outbuf, bytes_to_copy, outsize_max); if (cmp_bytes < 0) { - fprintf(stderr, "(lz4 - zlib_compress) error, got negative number of bytes from LZ4_compress_HC_continue call. got %d ", cmp_bytes); + fprintf(stderr, "(lz4 - zlib_compress) error, got negative number of bytes from LZ4_compress_HC_continue call. got %d", cmp_bytes); free(ring_buffer); free(outbuf); free(fpga_config); + LZ4_freeStreamHC(lz4_streamhc); return (EXIT_FAILURE); } + + // write size fwrite(&cmp_bytes, sizeof(int), 1, outfile); + + // write compressed data fwrite(outbuf, sizeof(char), cmp_bytes, outfile); current_in += bytes_to_copy; current_out += cmp_bytes; } + // free allocated buffers free(ring_buffer); free(outbuf); free(fpga_config); - - fclose(outfile); - for (uint16_t j = 0; j < num_infiles; j++) { - fclose(infile[j]); - } LZ4_freeStreamHC(lz4_streamhc); - fprintf(stdout, "compressed %u input bytes to %d output bytes\n", total_size, current_out); - if (current_out == 0) { fprintf(stderr, "error in lz4"); return (EXIT_FAILURE); + } else { + fprintf(stdout, "compressed %u input bytes to %d output bytes\n", total_size, current_out); } return (EXIT_SUCCESS); } @@ -159,12 +175,6 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, if (infile_size <= 0) { printf("error, when getting filesize"); - if (*outsize > 0) { - fclose(infile); - for (uint16_t j = 0; j < num_outfiles; j++) { - fclose(outfiles[j]); - } - } return (EXIT_FAILURE); } @@ -187,14 +197,6 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, size_t num_read = fread(inbuf, sizeof(char), infile_size, infile); if (num_read != infile_size) { - - if (*outsize > 0) { - fclose(infile); - for (uint16_t j = 0; j < num_outfiles; j++) { - fclose(outfiles[j]); - } - } - if (outbufall) { free(outbufall); } @@ -214,16 +216,20 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, memcpy(&cmp_bytes, compressed_fpga_stream.next_in, sizeof(int)); compressed_fpga_stream.next_in += 4; compressed_fpga_stream.avail_in -= cmp_bytes + 4; + const int decBytes = LZ4_decompress_safe_continue(compressed_fpga_stream.lz4StreamDecode, compressed_fpga_stream.next_in, outbuf, cmp_bytes, FPGA_RING_BUFFER_BYTES); if (decBytes <= 0) { break; } + if (outbufall != NULL) { memcpy(outbufall + total_size, outbuf, decBytes); } + total_size += decBytes; compressed_fpga_stream.next_in += cmp_bytes; } + if (outbufall == NULL) { *outsize = total_size; fseek(infile, 0L, SEEK_SET); @@ -243,17 +249,21 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, offset += FPGA_INTERLEAVE_SIZE; } } + total_size = 0; // FPGA bit file ends with 16 zeroes for (uint16_t j = 0; j < num_outfiles; j++) { outfilesizes[j] += 16; total_size += outfilesizes[j]; } + offset = 0; for (long k = 0; k < *outsize / (FPGA_INTERLEAVE_SIZE * num_outfiles); k++) { for (uint16_t j = 0; j < num_outfiles; j++) { if (k * FPGA_INTERLEAVE_SIZE < outfilesizes[j]) { - uint16_t chunk = outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) < FPGA_INTERLEAVE_SIZE ? outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) : FPGA_INTERLEAVE_SIZE; + uint16_t chunk = (outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) < FPGA_INTERLEAVE_SIZE) ? + outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) : FPGA_INTERLEAVE_SIZE; + fwrite(outbufall + offset, chunk, sizeof(char), outfiles[j]); } offset += FPGA_INTERLEAVE_SIZE; @@ -261,13 +271,9 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, } printf("uncompressed %li input bytes to %li output bytes\n", infile_size, total_size); } - if (*outsize > 0) { - for (uint16_t j = 0; j < num_outfiles; j++) { - fclose(outfiles[j]); - } - } free(outbufall); + free(inbuf); return (EXIT_SUCCESS); } @@ -433,7 +439,7 @@ static int generate_fpga_version_info(FILE *infile[], char *infile_names[], int fprintf(outfile, "\n"); } fprintf(outfile, "};\n"); - return 0; + return EXIT_SUCCESS; } int main(int argc, char **argv) { @@ -448,6 +454,7 @@ int main(int argc, char **argv) { usage(); return (EXIT_FAILURE); } + uint8_t num_output_files = argc - 3; FILE **outfiles = calloc(num_output_files, sizeof(FILE *)); char **outfile_names = calloc(num_output_files, sizeof(char *)); @@ -461,9 +468,17 @@ int main(int argc, char **argv) { return (EXIT_FAILURE); } } + FILE *infile = fopen(argv[2], "rb"); if (infile == NULL) { fprintf(stderr, "Error. Cannot open input file %s\n\n", argv[2]); + + // close file handlers + fclose(infile); + for (uint16_t j = 0; j < num_output_files; j++) { + fclose(outfiles[j]); + } + free(outfile_names); free(outfiles); return (EXIT_FAILURE); @@ -477,9 +492,17 @@ int main(int argc, char **argv) { // Second call to create files ret = zlib_decompress(infile, outfiles, num_output_files, &outsize); } + + // close file handlers + fclose(infile); + for (uint16_t j = 0; j < num_output_files; j++) { + fclose(outfiles[j]); + } + free(outfile_names); free(outfiles); return (ret); + } else { // Compress or generate version info bool generate_version_file = false; @@ -503,23 +526,37 @@ int main(int argc, char **argv) { return (EXIT_FAILURE); } } + FILE *outfile = fopen(argv[argc - 1], "wb"); if (outfile == NULL) { fprintf(stderr, "Error. Cannot open output file %s\n\n", argv[argc - 1]); + + // close file handlers + for (uint16_t j = 0; j < num_input_files; j++) { + fclose(infiles[j]); + } + free(infile_names); free(infiles); return (EXIT_FAILURE); } + + int ret = 0; if (generate_version_file) { - int ret = generate_fpga_version_info(infiles, infile_names, num_input_files, outfile); - free(infile_names); - free(infiles); - return (ret); + ret = generate_fpga_version_info(infiles, infile_names, num_input_files, outfile); } else { - int ret = zlib_compress(infiles, num_input_files, outfile); - free(infile_names); - free(infiles); - return (ret); + ret = zlib_compress(infiles, num_input_files, outfile); } + + // close file handlers + fclose(outfile); + for (uint16_t j = 0; j < num_input_files; j++) { + fclose(infiles[j]); + } + + // free file name allocs + free(infile_names); + free(infiles); + return (ret); } } From 007f9fcffbf969d5ec6044bbe4480f2330a0ebb8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 3 Aug 2023 13:02:42 +0200 Subject: [PATCH 819/924] style --- armsrc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/Makefile b/armsrc/Makefile index fe34c8a8f..d6ab2bfc4 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -127,7 +127,7 @@ THUMBSRC = start.c \ $(SRC_SMARTCARD) \ $(SRC_FPC) \ $(SRC_HITAG) \ - $(SRC_EM4x50) \ + $(SRC_EM4x50) \ $(SRC_EM4x70) \ $(SRC_SPIFFS) \ $(SRC_HF) \ From 22bc398b48bead99bdf98260ee3294b1383f8021 Mon Sep 17 00:00:00 2001 From: DidierA <1620015+DidierA@users.noreply.github.com> Date: Thu, 3 Aug 2023 14:43:58 +0200 Subject: [PATCH 820/924] Bugfix: `data atr -t` was reading uninitialized data --- client/src/cmddata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 5c1948c14..4c8200ee6 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -3423,7 +3423,7 @@ static int CmdAtrLookup(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_str0("d", NULL, "", "ASN1 encoded byte array"), - arg_lit0("t", "test", "perform selftest"), +// arg_lit0("t", "test", "perform selftest"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); From c6f2785463d7080db715dd90e977da2c19c90338 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 3 Aug 2023 15:33:16 +0200 Subject: [PATCH 821/924] wrong fcloses --- tools/fpga_compress/fpga_compress.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index faa35ccb9..5cb34e54b 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -235,7 +235,7 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, fseek(infile, 0L, SEEK_SET); return EXIT_SUCCESS; } else { - fclose(infile); + // seeking for trailing zeroes long offset = 0; long outfilesizes[10] = {0}; @@ -474,7 +474,6 @@ int main(int argc, char **argv) { fprintf(stderr, "Error. Cannot open input file %s\n\n", argv[2]); // close file handlers - fclose(infile); for (uint16_t j = 0; j < num_output_files; j++) { fclose(outfiles[j]); } From 0bd7dbb6c9523980964a4eef74af8aa5cfa013a7 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Fri, 4 Aug 2023 12:43:18 -0700 Subject: [PATCH 822/924] Add datasheet for the FPGA and a common flash chip --- doc/datasheets/W25X40CL_H 20220301.pdf | Bin 0 -> 1331814 bytes .../XILINX Spartan-II FPGA Family.pdf | Bin 0 -> 1013818 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/datasheets/W25X40CL_H 20220301.pdf create mode 100644 doc/datasheets/XILINX Spartan-II FPGA Family.pdf diff --git a/doc/datasheets/W25X40CL_H 20220301.pdf b/doc/datasheets/W25X40CL_H 20220301.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c847a3b814c67664628c65b3c2258b15521a8160 GIT binary patch literal 1331814 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

    >Kq6P8deuGQNr2StK+5qv7xJ=7j5=z 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

    2XUKAgR(}} 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

    NkR=#=jEmD|-*|r^w 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 z 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

    wt}6HjE%bT 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 o>+WQ=87m| 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%0DDYa9D~+8!+w zF~AE}UH%m0rzGdk1#~d0$0`_s#Ey}+XLqfXPAC^4vN%2zaHW<}o&j*RmWwgTj~5sO z487jEpEb`H8%tdG@;I{T6zc}7h$q_z?Erfi*^D+@H<75KN9eHW+hJ;peHk_Q1XA5+CZ&OP+tfOh@Up%0i0A$!r+QETc8>P zWhTQetq}g;28C}*N^YNV20I_&W4+;HzX9>h(wB3Aqz-E@brTIvE$xSU7BC5WH5eg< zh$4OiTH4$ufTXxYdd&GAp*yk2MZS!aL zc+IObFfg@~X<{x8Acf%GmN9>*1Jd>A2_hu?>e)4}tM`g)03CrR$ytlBQ}p=MOF@A8ctB(ta%PLV@E}QnT}@v25{4e-)^3t#>_97r$m=xR;gNo*;%m_R zpVlG+)6W^Lf^k+-hd=qF?Le(19DbR~-1!C+HxRf@_xWBd!a4N=~X+J~Us;fKpu5?I17Z_9Pq5sdzkvhzR9UgnBg2IazE$W%N` z;E)8PKQMDYqd3hyzT)x+?(Mbf{#aGgva;pMuZCWjtjCpGOS?KuA>o20doxHOX$${C zVmExEXKPrI{Y`%Jsi;$*^4% zG0>Fy+-Ec1Y2BnPpmWM&$wVkWF7fCb#Ll?CaBwm_(>lF^g+AbX z^08MH*?((jh@9szGFmzs^()&E##*%hTF~{;7)X;HUs+^Sz355F#hbgpNLV|J#0W+4 zo{5%!*_L6OL)`mIEs6Ghbcb~^w$^b#_}V>oO)H(LV0v7zR7U=ByYKXm zq!a)jGW*-aMGuK~6Z~qCE3(KP=(8`_+muAQ(*=y{Eo%0P2uJyrZIv3_d-7r+B{rtl z!e{p2a>YP3=RnR9GcEnG-k*Q`H@$mc)6-l#^z_g#7xVDA?23AL-m6Dsq@WVfTF}K535(3m^1X}WOS!rg7#fnsL)2TA@*96u4Qg0Hh_ndE;UM0i?#OMw6i+1E& zoRjwox4$YV_7X1UFU+gitMwj9lA&s$h)gVqOep6wcVHmlt*r%O4-c;;)(@W)f++S* z8#z{FkGx=g-E2v$WZ13x5;^MOwiWB?xrO;faM0CV6`b9WaJRj(CKO+Kd68UHd^UFu z`kvX_jTGj4cx}fb>9cgIEEtWJ2vAyCyMMs+&*-H!)fxlf4Fe?ryQpAE!4D7l4rjBA z;5}M7jTWuX8=)*G^9>&?S8;{+m5D4OB+6DaaMy?OIrVm15fm2b&>A!+HDj%c>}3GY zMoH&D+Hsk+FCjrkWBJ_$AXnto4`#szrR7mWJJR-yvc#0r?=jHt-k_Xc`xkeWS_g#e zHuV&4TiGy8_CW(#$8>RX5L!_nhNSxS=7LdH7n|HqZ7R<`k(cx{Jt;rzneH#tuZL%~ zrzcZGX{CWs&s3gi5K>JkS{M?xt5t$4O!8*jg8O9zAZfBl>n|`ipz;^&8`721M^ZCd zQnYEqn5}#q@5R!0J?gi&CSyg&FOtKkTeY!v5F;qojVv!zS1RVa)yOL!{1B%wMROFT z4HE$yN+Fc1sHqDBofDBrpIv|3l$WMYvcZ#R#AA_%-B5E}YFohgN>CU0aj+JY_<$If zW5bDSZPwX&>n*_xUZnv^G%+S+)=C};QVLZPtKXN;rEnaCtGB!^C;d}>_MAC%qY z5FDRIgj0H8J)|ImV1v`+u0ai>`yHAWNuLJhpw;HsiuRTJq$le%CtAeHiOo6i`$fy>p--T*!Cy1V9X-= z!c*7k;YQkkDt0-*Ol409m)%PY;um}+$;yU8lV?*AWb10Qa?2yl{N&-fyHV=e+#4a&orq=pJj zS9SxWYnOx7tD`Fre>BAqk-R}=4)!>xZ~D?pyZghIiT1LmxGh=xfpT4Bm6F#SBZ9ft z>4+7a^`l4Wr4@WDCWb`benaPm1!bPUMSeH{zZDZbEU(-Y>!(F2cK<4n!us?Qae4jV z`ivD1LZZNTqK)_-i#Y6C+JQ*7Yt?AvQWwuP3FrM9=zWg0a*b<_g!=t2Qcb_ggdG`5 z5>%gFE0sRHmJ4RsSbIfuicCjf)btDtCKWs-FMN$PprKpznr?n*$ zMCo)U$|$G;v(9MN=*1_A$WWG5x2(T(0!bVmO>V(FK%p&BvgvSm$;XAPy)$ZX3ieg0~_G$n4VwFuJ0Iu#3Itdk0< z_iX52cNUXmhBeBhnVl*t;iOLer$v}nl3H@WSf&E3y5mDw~XcrDkFo7=~ z+yjO%h@&;-e$+*Komf>&AxXSQYD64ox`0nJk3MbRH*^CB<4roYkf`~#BFzYcm@E++s&`yNqf3k4IYNr>xn5JdQ`}!h|2bLCIxJ(}6iS z#Q+T*tt${pe}kF<%hn7#{EjP>`Rfsg?7e`wHlv**TvB;gK(=OS;3pwuyc~heomBmn z5YX4aEE_P6)Hhl&XZ2Cd<=|KWzFpF{orLS$_u=`9a$LyuY)VzRC&044u0cBDs{ki+ znOjsE^HwOAs~D*pdHnE&j?Ra!d{4lUj(^g(*ZuwhVFvkHx#?qJYAos2h?7E~7wMyv zrlzt0!AffV^N7^#P5l0Zt+p(6VbV7N6^po7Qr(2i((xMtU1bIWu2<%byb>qDQ6&Gu zKe_<$IuA|y5Sto)ovT9F=i4ro|6Ecd9raddB>oIpVm~jIRU0I(T~91SsLk2uOIqw` zWVjg5|3(G=HNx@XLY|xvA+Z=bczD0WYLfmtP{aOYH}um|)=Rr)AkHLic|d&ev=8;| z+l~F#oi6JR@YAlcIwuxPc$7*&O3!NDIDbC2H?jMX+cGI9c#J}SkzjznnwbA_C5Y4m z)>eG}`q~QiL*4i~Rr_J@$W!*>JpEE5sdvtE0W@reTj=Vm^%uD6HrugNl5hI z^-*ykVpux{gahw4GLY!S8lvLzWtoK`zqg5xSF-8{9rYi9<-(SA_#x3R0AqcIKSGqf zq!Uj-*4+?{*P}CD?M5aW2ge8m!9bm=qU|5rrOS^VQbd1On6Z*1Kg!nk2eVDDo4EBdQwln&MDaFWhtxOEv<^$s&NBP zyh1Qn_h@3N$AW2bxPYX*z!_=1{h($#wIwvf;hzyhL7G1;oJ@O>ya5W1rB^00V0hVu zGxiMj9=v?eOJGg8;2Tih=8Fyfwc)WIyr3HphL#;=mZhlNs;* zzM}|J4gC;m_r997-e^4 z9pdPj0b za9Em?)wyl;@C8dgJ>GnyywHJGb9}yL1kds?kqv{xnL5RufM%Qd>~-y~`ptFzJ2{wJ z<`hJspTffwgftguYKZ*I*E=gSmH&+SYr>=6_vfs z8J-ji4r-xs+2%UASV^Af)4LJ1@(l!LWwu~)X1pyMPb$){%;!N#1gMrsE(M>PLSN$= zL0k%mXcc#88ag<{8>oqqy^R}_*lboHwjlYOw}u^xUk70dwBf=r#9L&OZ%ebQ{K|-* zy1$!|Z2ZjIczJ*+z!Q89p3RPM88OK-ra_sl?;@C;>w;h1_|(a`N<^xIxp5-ZV97eu zkR1MfWi$5skq+d>F_yQ!Q-$ei@GR)wA_?0Iuhhh{g~we@=-t*Lvbl`s)*6R*(GOUp z_SI425&zOkd>&s{+%Pb@kPbu!z2GkHT`s{xu$rq3#|}jaC|dlDh_z!dmyM$zLZtfa zBT#eu3Dqgi4uX(dV`e%QsHXtm{pog4Q&zDmrcgooB?33mIBYztTt4cW!4EX!&m9;% z4HbpgmW-t@F>G$TO2HH#l@DoG98E1(s{3vRm0lrHTWuKngM0QGU>NM@$r~U6%)E(T z7d*`2?UR~I+pYmjm#=+UU%p9eXYAQWFY_q!Sf1iJ9*t)?nKnI`!9(-#oN}_{3M>!Q zO#*~E8#8pZat1`zJ=GA8D3gnn)TipFIahC9gkkqZ^Q!r}3k9+Yu(c&)#2 zG^VMV*eV_18lC#@uaEJq-r_~@=^~me?~us6yjfZ9ao$7!3@V=V9Ske$Q1=+Q!pKTF zWI$1DQ>VF+#@IR4KC^Cg+~{!o(S2Bv9qE>nCRbYVV=Ou{1-^K?>KiGu6q9wa&o_H~ zT+{~+5@Bld|2cb*?Qc>X#BFW!P)qaAooXoYhwm+W<~~KeMjRzsz?}HxfnZ{ z8|u?aI_X=P8#0L57}^?{+nBzmL)Zw}IGX=w`B!yOV@E>=b2}$n2SOIMU%3Up!ut-6 zP9kRd?{}CPWc2^fH4_v2f8@M!x~5}hd{2$jxBEYNFdWRB z3_>oZ|B>jy%F4tbtMB$71tv}o_CMaK`X3oHtc;8dYX9dcW;R9!8Dsrlpb)-CR}`I$ ztyKtFS^uamENtthNl3@W#PP?w2;T$eT!inh(I)&$bN_p~!Qa{R=3xG-^r0#36UQ~q zgtwgXXM|@;>mk;w?Gp>j3i6tCs|}<2a95L>;=4ctmS$TNNt%hVsh8WO4Iqg)H@SQ> z-Rr)(V2JivGpDz9fbchg)4P^jmDHd6UwrxB^m}x*H(6E3F1}%8o(X(mcwJ`ycA>J= za__huhU@ba~?I%7lkHG$Xnk@)d`o_mvPvm>em?JjLiK)Rs)k1D1O;Z&o(B+70Uyf56CO;Cw&EV@m!;TG zxzF7X(cdNwgoZ`qHVP5{WnYaBbqQLLF>W3LYYmvy=M+OBemvvD#;nwt)HG z9gR6skC$PtUFMoL8NYAZEywdU(co2iAMI1aI>YG7^W?Qs{Y>RI6BW}kM1B)M6l`N^ z4}${}hibfWEQeUUKR>7n>(AZrN~wwM$Z3>@J|v|PTS#4pdgQxl|_A?nv)JDEiz^&gFi5R#TrjD515NfXFB(|Nvr z?Kw;iWl2|gTuTMl0~6suH1j!*jQ$5Xu#KjcVbQso-+Rhi5ifH_mo0R z2W_fRxUc%K$5)2Nn$57u?Z_tvG(6D=dqq&XFozz9r-mKl7sRqnponqt)mdVxww22X z{`lnJI;w66L0X5FKE)KR)TXq2K5bwcvibu}yP0+Q>GB@UdK9=M*x@TAg^#HlZtwki1nnb8I zg-~cv<=1pdj2ABufxFjI9VOi2#5#I3(m0Q`)Ly6}1O0 z%mOmGdhCE#LbJ0rG7I%3(5_}uVEHPdfc%uC&*?Ts(~z)ojoB7DdN z4=F*5)gKI47bX22vEoXP#3e$Op_)rrfeIu<@VQ(+%eNZV=8Q4N+)ffRFa|2{$E|N6 z2tBieOGmr)>N7`pp)v##_K#EIZlj!(?bGr(NQJbzQkpqHaHb|x@Az30^z+QS9ioX5 zec-Y=x+G;s#HDey=wX;PHBl^Vvt?iDw352y!>6~oI$@m0YIKx;BJm|JFH6-t-t#3<%WF6kJ~uGT16e@6B>7AIa9yK; zsi2t}OEOH6p?09j0C0;+H=Ea*;B-7)Hyx3*w9YA_%mBr$L6dC&l!q2bY&{r5t&c}- z{nK(A+!fkk2KJ&927Bo0npf5;TXEB>CRE-}=}(^K8Mm)TD40<*@OgH{VsqrS7KqGE z{Qkg5Ca`cokfeAxS|I$}bNx{&DA3H37-?b>QQZp)G^1dQF+9)+$e7XCAnI^{#$j#{ zVP!t-g7_5izH{g4FSa0L0Nm*(GV-Da#?PPIDGCYPnbpzozCNUGUgdVFkQ~*;w3Dn4F3OO*@{G_Kc; z#g8Q*1;T+PAi3wBUDD>nB>75+?b;SS-IC$njdp?`>UwjF+mvD44c{UUTl{E#iM-*} z6xg?${eda1fuNSz(HUF-*+Fg%uD#NBD(0hv%_0#HyF4t>_ue#`5KoO$C2?g907AhO zg_rPSICU2g#^;m@kGLWzxdFf344Fip%b&bE&Q2e2 zfNoQ@KKHbWR3%uHg?L6ToL9{eYV4kB3k4VDMi#VajFA%8SR z8C=c|^j~z6CafUxpZhH4 z2lB(b(S;j(?qja_r?mty3f4mTg=owv#$-CZtB5NHhWo<$_-ey4E1j7gNK4Qz*u(ny zWjXqjdMsHJv=&h4?sZv{0`HLob=5^3c1`D%%FM>>VO`^fk?-SzZc}!R+Y@|8R+SfK z^*f{G2{iY>m*(qE_3wkz$xZ$lp7Pgl+c_fPFkn87K04ioI#9l zRi#hdw+M>{)4U;3r&m$7+qXC;N4gv%mkusJj985m3WzF(6DqZ_LIOJ(#*=Nev64it z{J%(h4|poy|9_k)BH1hA7}?vgSN7g}?{TuS36+(-BeKd0k*#c!z4wZcsDx}q{O@y) z-tUZezt8vaujriXKIeWtuh)29uWQ~U(vU~ZT45StERSW0ozZeg?9F}K$%>b7Ha|?w zimef^;QpA~(tOfu^G5T1VGRD5?5B6rp38#|S7dBa3=%65p9J;cD-zt6eor-Gxm&+9 z(N?qC`v{b8e)*zpkkHbFRo;yp)v)`;-+705G)^Xr?I|i%Xeftl4-zI1tw>zQ z{4q8)HU;~UW~@YPAn~mTYP?p|xX+J5DXt1>;K^1{NyY|d-Vnt}dt@d(Z>O`7?jlzQgv=M-Tl8Arx)p9`g-U zL@PJ0Zn0s1M$asp6~1>f5Ern2+PEbr8ZF*yq%x2Bx+_HM0%$a(y7);k4Bmu>yKBM- zf{~4FIMScHzWMat1$z^&=|3E7$dY**J1U0bh9#?Dp6~aL{p;YG!iE4Sh;S|Z!A4&e z+uPV(6(aV?B2jD>{epM;mY0q&BZktgYhG;hH-{#E40q+vy2QIkCWUB|{gpftf{u{L zi7n1FOr79q^nO_@N{k7otg$YD%E9wm#p`NNB}#PU>tDax+uU3hC*E+~{yg!9nA+2> zj)cn7&LCbQDpLO`>P?d9SR&t-l~Iqm{gI`z9)WbGKBKSy4 zg#lk78I85KHiFFfOG6yt3ja@1L_xw3n^nxcS8>A=dCRERQ`o69t0B|Tciwrivd((o zgeB!q3NhXtq>?jDn*t&->G^z1SSVT0^B8?i*yI zUMAw=*mKpda72Fli5^8aSs@7J?Pc;Ng~cnKSVrngcefA%hOH9j6Il3o6ADP}Zqg&$ zr+KUuWVGR~-)6X(J}a*KVuOAp$R@p-_;r*2PHp~*)=&VawL?~({?_na`a45w0{(!S z^QKEV_I|D55}VR(ve#ttus&V84O*k&?=Dj^x))u&7`{q|d41k-BiIqw68}~^l?#e} zy>7+&gq+AS#Z2AoH#SUmlpLI_WUEF;e0QN*N``wN=RD?vSl-+8V-)spEy?VNC`-fW z3tK)4;h^6xyB;S1v|^uCyfShFk_%CKyfw7s`k3ryUwmnzTWNL)F8DZ3u}u~mq^pbR zhnc50a^v|BdS;}kp@jObL!4^26N2b#BiGL0Mj_9H$ii-Laqm6y!Py1fX(FH1kq`Fc zi9<>%S^-z9kioaV6Qs-`?_B1p5poWST$;;Kakse|>dqT8JP^1DUPa{F`2?2gn_K0Q zQo!^p+fb6@sBC!5ta!VtN{BkACb6v|nDrGqsUY4xBwcRB*JF><1+1lP0xQdAR(X1= zyKnKPRn=EI_*V9+QuononhLF@ew338eZBSW{jYqV?@I4=e;oE^;qz@t#&Z;JDE0-% zCH68g|I81LPwZ#1*TQ6)H+wBs;xTH1zuAoz8!e2&jIf*P3h`cIByV!xl3{<@_YR!) zV{!BjE`APAVpAicN#Q8pM)X589$TMrt2Kc&;w;+%!?p4cxtKF0l=IGd*x$7IS`OQq zzQ3>N-fjt)F#KXJxqRJ;*f{Igun_l4fr?)#lbY9J=)1`+*%_m>mputwf{k&SCd`!A z9~Rx!CFybDIQWDj=N^ZVK6eOyZ4*M`Db$D~C?CbvNPuE*C=+h|p_VdB`dc)+dMy6_ zVVmU+n)NO*joj<&s#e8X>F+fUJikcrtb30nQn7eHu3p|AO6&gG`pBwghAD@^I)--o z153CH{l|B*@`*V;w4IP~GjBd8LDOy2^ml=cYMJ62#y^7^{AX$FATp!n?M;_Ha5_mQ zeX##(vvSwj2veO5r~b>)BeHpi$k|)c;%u*A%0aQWsB=R5%H!MJI5?_%e~Lr zy-!xHUK7A|jhR2?`>F+7gfBk%KCh=1SHsUzflF&`FTi+Bn z4&=Cyv}zrt>zW_+t`W?%9A{-TQphJnA4l=Ps1z&Zy@$C$ZD9*(y{` z$%T}QSei>cjB?ioZ4u98d|T_+QJ>GAT5dX7p=wS00ZVp>y5D_ENA;Ols$+9{j!GQ8 zTWHr9j~f>GAb}|_kp_$%@g>FYD5zk7RqrVb(NTxi0EgG+Ijj?^?pO6Vxk>zJB8~8DRcRq z+Se~+-6QRqeXQC!xLV9IYHtI_B}eJw#8(W`d1tyIwkq_?E>|!cjR!o-k9zhxxL(7c zkz&QKmx7`4Fzc%@u4PJoQDpn)@89lA=DqahmKG{Q8XqEiU&Gx}M*VC~i1pT>j{LAQ zGKr;E!H>WD`> zRtnxv8BI|2hv(8bS5`=3w~KDpUa>Mj`?au)fH2TO#KErTJcMqB2beXHDYH3zHYiNF|iiD(v#@MG8;*R0ekXFAP*9~SBiZ`U4Ig)0K zq5f8XiS2DR6Q)Wff>)Asy0l-k7+TMBAc$L}DbShRYg5I(V+*Uk`aVlNsa+xV^~h$b zXb%r}FLc(uYa(x;oHC30-bZvB!!Pk;DU9I_>q^2Cs*3^>F-b_fVg>cA&Sg4UiCUSy z<9;Loc}=yCr?iiF?gOVpAt7d3uST)RReF;QwMGsS`Mejq_ESC$;fI|3vsCefc{B%- z?U0)Tm#V*tYJZ|@xG}T7t?GdEOtbEGz9i#dfxV{nyT}Lhav6|k4BQstPteSBx7M|E zKWYzDqi^xHYV2s5>|cU*nxhjl9Dy10+*Zj-3Qzmn zFkd4sKV8!pfEcHU7Nig~VbK@8so{Ax?1^i&?EYri%_`XO_N)BjONjP<`;UZ4F%7us z5NWhYb`0x!zDaWR7}?Y9YpfQv2|7$x3TbMht81jOytQ8aQC_=dfAx+Igs!=QX}mUf z(EEo#2{Oe7MZD$J1B`Ssb@aQ@-`6<#uh)WPx?f&jqThehCOD7lhuEb=K3A%5G;p~) zsv^4l2{G9e7TN9=p~F`+`B0V@?$QtWp2ush%zMt%n%Zjx8&*81za>)Hq_@m-byWa= z(9z^cvo!yU7do-;)xF~@AO@Lt*>bePx)1x&(Ue|0_T+Bp@?co+6RhpgXlh}+3h*k= zt=ye?KF*k_GH?ALK+%vm6!ZvfaPQY899Di2>1-2PV<*tzcEO-clr2IT1>>L>J0H#_ zmI9H^JB-_)z4v1ZEWuZKw)eS@)kXYR_p1x2-g#{y5KE}ejo+%h796FJVVdNvZ+SWW z&}p)Nt%Lf$P?ck5`Wxj}krAILR7|3ts75m$no^>Sp=~UFq@t@!ob}S9*C{`!(P%9H zVw^4XqT9?(Sb`iGH^1bzXxJAuvV?RxFXZ*CYgXb9l7DV}HI{h)855r+d&OkhE|BS4 zGMRWa>CVIFzOE2Lo+%&nTZ65cjK0Ve&ZF7~@BNHwHU( z2lT=^+T-`X$I2o{v$P+X|HwKhG;GIQx{q*_v~^7L-KooP`tm$ybpyhrDod;}7X_U{WlOzR4$CcjOya`-{X_c2?~#)B&744fbIDIZOUD_fWWpcF|OA z#^h-5*Qbx~%Z6*k#VR|lDLjxJ3s%WLQt+Q$J`Vfj?Q-+i(;B(Uq}B;EWZE8(7F}l+hQrU{L?8?NWAA+(YLaPzDD|3GK)X&FjuD)sh3$p$qCH8 zLH;de+G#R7k3xipj!SH&DkBP;nCQw*jGSe_>cXDCn^nf5JKor>!k1hcRv|GdpR|jy zdzy>!4y6dwo&7}YzKrMT(GhtWC}YOvqV)9Cj_BjqxZpLDvkZj)9DLeP&dy_r?RX5iGy;QTm&vg}}5<=S$yjVBkn33yP7> z`22OkOi%IaZQ&3^+?zKmgT%Km9^tEDs(x+6C9CKq;K->R5iXd2`%Zy$#Tc}F1bt(m31}(Om@y0YyGLtY}23Nra zWRq>9{?ZBZK@L{tNyl6tWJ1lFZznPdnc0qpamL(1)9xv~xjDekohj0-^gzxb)MzeE z|8d8Jn#xSi9){I{wCDTW-Ha{6oVq9lr6=5Fd3|$K%O6uUYeUtoxMe#_UeJB&HS~F) zG{&E9srUGWT5Vv-gXT-&kxhs6j63y3e1wfoJudkV>6|k57DjbzL;w&+A4hxInEukY%DPoN4H$Io#ecjO4(%EF_>CS6=4Oyp9 ztlo08zpt-s)Hi|lsx0=RdsP<^AG)hH-w%qk$3fYVvsbqHh0J}sC) zQL7-}l+|zcwUw$jFKqDIsD4-!$);pbT-)=6#niU7h}s(qcv1nSl1mfkle7BhtKqo5)rim7KD85DYf%}?&)Wi;a|N3^<$BSEWl`(p~4|B8k0==F}!r8E}8 z#qY1F-KI9V41eZ}1h72Vf7*&HXM0N_lOeDBrd;pMk~Erc#`k7fM_bns@-ub?gQw}} z$SkfM>y-sO=D0l-xABX#9304K?VWhl$tcG%$?y1(0A20tdd~f0q&EyN5MHU^vO!!; z`5fgBsI!9Fh$=DKM{cWmJ}zUsr=WC+q$C8R**x2kBGEkbZrD$!ppA!%S-}Cx+OsUO z^?c=Tupv+VNG)a=%&4=Hza#f|Y-h_X+#h)p;eO-bJ5liyb=jn#Uu=Dso6(-9NDh9d zvJ&C#=TExH;&F9Eg={I)uIO z*&(C$h;TC@i^sz1)&rfT;=IF7WGOkKX^K1ZkSn9PRN2#tLauB|HdT3itW)7(93=0s`3B{PM_HqL z9tx`L+!>pU>dBYmcMbOn?=ipphW+uhdVAJ;x@0Mt^v4`wqFTx|T)kl3$WSvYq@>8$ z+RJxt?kjTzF_5W?(A{(3DyF`pZDw*q*^V@p@hR(8oKgMUt}z*S=j%te#wsbo(x>kC zS0iNVtUjA}==O$5&TDhKmaj?%_2l;t^yOuw#c54Flzz~*Nx^B~;+WjFYKWXZ7E$o7 z``VfquV#03d?fR*{8#^b_^cV2iks2PPdOS$juAr*Q+hrxUK5-A{$Xgp>N5upIC2+F zkXGuRg6NwZj_8}OEz680rcVnr>==Q`iDv6_j{GD>=dqopyiKc#9YF9oEOVbrc1zW?l#`muMXHX}5;f2jCf{oa@} z56KK>)G+!?KUW0TuPn-Y8BH+D+HxRJyQi<0$lDtBd~b{nADi-kq_S1xkl!B2>`~$dO$ezo=C?BxZ4bY%=8StWSCXr8@w$Y7Yxsxkd z)cJX;lf+1>yQYvnt>Eo-G)=dy$EokWVT^7Yid|iaUDoupdbDA2`ABWUp#E~>HQ8_1 za@eo&6+0@2D-k$2e;|s)DH}y9#}mEZ7j>Tq(oTTl-{!+{3tyKfi}~HC)l(NFhzzB! zI%IhJ+OSkI|4>m%3OFwoQJEL^PVjd&_Qgv8cn zgnpI(WkP3lLU4`MEwqTogzw*2_;v3x*tU1x6cBQ=qT}1|Hges*j^h}l%Ve)|Ozh;; z&~m+2=V_yv%~+#t%F*ipvq?tkaiSM1fcHG5-)<4twfQEWMObFR7j>=N9O6PRIU;Ol zjx?q~P-fa+S>wm-hVn&Q-tOx`lD3mT3^DO0n;`DuWKhh^u2{8b*Ty|_E(TwQ%!N1p z`FD4e_4UX_>bkmpe>P^VQN3ZFOp$FSS3=k!D5KELRU_W;`YPQvco_ceM$}443q+q` z-HaQ{g0UyMarLXd4p&Lq&c`x^zV}V#xapJnrm9Lto$lc4Aas6{Fq-lcd_J0m!w3+Eu1AB zq#LJQ0tk!?jNzor1x;0Ku^o!SAT*; zVVt~UdbqO(i!5Z1w;d^l=%75&dRYWB-pAejX&vQ7j&wrYfcl2yoKjw}~%+$v9d zJEqB%L-QbN8NAkZ;?IV9CKdcy>=XXSCBBauhn|WGahg#YbuHbbNqVv&LlpU~NZetq ztkNpd^gd>)3O3PxSbqo0erBqKdGIgEAj(&LwiI82AKVC&x&Az&wBA`&4^ty}Qkng_ zPQTMj+YxdvF3E*!^oP!}^gq7b*u?PaOs~)TUf96#Q?bTJ>z&{*#8sk{SJF%`w28td zPU&{y;ePphrA0J^HSULpu=z2a**L|^I|M5l0 zeTcg?s>#u6Li9kMibg=+#J=iwxqXK_Wt^%k?nEkyr(#v1*v2E~`fKZK?GNnvv0G($ zo!MVJr5kQ7;=C3qE~U41!?32vkeo(4ozuGdbto3!^@Cv%P1ziiu_a8*2I)smOWdhR zJQBF#I1#M~%i>+aUrV=Ir)HF9nRmW($i03k60`YzlJSyMgcf;K5!#H89zc?hPpCbdUrkenL!3o4zFq!P6Gwnx>TXzt}Y$wYlXRlG#X*u=)1ojzr4NdL?dRaK4+}K ze^bQLTNbajlJT1ftH5f1i3K_%myMv4pkv=|&BF3e`t^Oxxj?zM&&$oryI5r2vhH<6 zW?ygRVYjLnQqeC^8QVg%h6tn4W)}%oT)i80bL42k;+McDuKH{( z2CuNvdV=so4`m`3+)`W}%Ny?+Z@LlbTee@VX!rJrJcu&%io28*u-P#TqUBQOA#E4z zs&Z1gXG4BVML-^UV<^XS6Juz`Tp0HvB&Iv{zrrQV`K8jX+qy_rIe}IG&bXu z>w^PQuSsCHeSQ>;`r^g))S3v}zDJ)%klyAYu*=?XTpzk_t$V~{rZyorYp)yKk%A#L zX|JYT)SKUL`tBx8P#cYHS7iTlHDnpipI5S(>Q<<}yQf-KiRby!HWh9oGh9u40|t3F ztMR6Q8%WFXAJejQv ze=_GDTd7+ZA>pQ{qKTelAj}J3=<}FN+N`G>bM2F;S=eHV*ZMS6utZ)O`$D!ZG;_IP z_6NtvA;}oCcW~Ed9<_1P8@$F^XzF1P{KM^c5iwIB+vFXwl)u-ZRO!!rF+FSQjFffxaEq$pd51g5g&>MaX7sx-t!TNvF1eh2NpU(> z;1b5WxGhawcj79#SG8``4L(;7zJ=LEFb8#DbD)QCwRfbVG6oR8q7#%O0A(B|d^)%v zUs|u{Q_P1a){Rvvqm+u)v72<{%k{9%y(QD`vt(OqAWmidDqoZ|N6kD5k=K2Gk$A}u zc%?5TzqKK6@@XUXptUdggmV{5mAty#M9QnDRYZ3jGhxPJVkf+CxHW`a{Ugj(BMvuG znEOUluKD~guKPpY3ZXFp{bs5-fleadp#HLIH@w&2=}!%qx{&mvWGJmF{=PNJZwR zhE&;#t6C2mcLD0Nu?4nPZ)_InW~h{qKU86lY?il>F(cwqni|_1La8f=;xof7NV~E| zqw$1@ie1WgA~_|ZU+Rg+YAd^UD3!K?y;Q@x82i@`AYU+NX7;9$m1013kMz@BX~dZ& zb&+rd!X4@8i=(4-NY@EMJVzBKH%_3=Z2&ejHh9Y92Gb-p@*yb>DvJ(>%Kst(;i9 z?-l5;vHiX9V+p774+wUZ~r|N!^3vwWMIwa zWlAgryek7n&+GSQz1Qo5sc*>!s>CMS$;t)AVd>Ii#|3^%lcRpj%xD=Tw&qd%bD9qc z32AB;srr`l@nworkI3T ztBcg%4!y|~{raF|^{#vLVlMZWl_!113-~P$!Buh=G*9j)L^*h=Glc#ijcv|Y$re`|MYQ2JO-*B-J{j1ngY1t1qcl~spNy@v*^xxFNRGkI2U=GKKYfLk7 zj(nD)Q`WqtNo&WENnhZ~g)GnuN#xf(_$Z%7TG~=?%$qL zSofVesMp8Dhdf>*uU>vls4FKdE4mH=9t<0vC^_W69kxMUezo@ zN=uSckJXwEm{qqF8Av2QF);nQ`yN|A0+MmdA!wsVy<#$?!K0%s+_eeqGX4TdcNOA< zy=bZ9#18R6{X(i)@`FbUADrDw--j+1(C{sx9)Pk5oIUv&1#b5e4^F1;>9)}gb{j-> zEtsN#)nc!$iym-mWn_)7d!=&Jv&J_eH{e8!DY5UgUFYPV4+OR&blgy)P$>(JVjL3L z%t3iG=f}yz{uMQ?!7qX`{cZ#rqvgQy(WT%;5YK-E!l^U*Ag*?nbkdSal4_y~APGrz zaWz>L4OwL+dJwCqo2!kZGo8Jijhm^1HBcZ9oR$sjmZCd4Mo>h6AebXKBRC?s06$g; zt_ZIXKnU8vYi9%t;1ve~8v;85-|sI$933QpSx-6%ehxMc4mK_hZgx&EFBh1RjhB{< zjTZQrqNBzC;}a^*juvj_mj5^Lr#3EepF49;+0E4s;$Z0l-}nVg=t9q@Q-kgN0yag# zW_M5D;newcFx|1UfI!lg4wlZQcA(!o%7E$uRZ=l^hE4@@!o;dUw{f}ZgE*ikhN-dY z=<0!ZctAXC03=}kSjo~8`a#(Fbf*QLI)V)*kb?yz1=zvO+0x~I69TIUAVkI4(*2(* zo=AkDIW6(eBh55m5;=h?s+gMF0_O^Yphpb5fJ_}MKq?Rikh!CS6~x-j+0+%N@&#~U z`{@9g@Y9x|8|pxSv%)kW?&t>H(+1n#2Iz$oYMXOb%CpRx3 z`d|B<-x|mbE&69`;0ZJikcy}T=rlBKb!8qMn1Wz_2q64V6`eu`<^gK`Zy><5@*COtScm!P zS!7)QgCq_xABY25uYW{cRPXaF3}yk{1!BtLWLxTABZ>zeE+-KMujQGDf<1)ezak3m z(kBsh-fdyGKV5e)3p+^M267jqZfOS`Hx4qOV-;67p#MW3@W?#jxzo~5#|aONWl#Ad ztmv#j4nUSO1j?(XuBISahr4dBOdx==f&XDKBCG5Iz>tt-0!b({fn=50PD56SZio{IBxCr{%*NpA-4#nVIK2GlN;c zAQ@!^38*!o|NpOoIr)IP{9Ex;{0eiX)5d`ooiz^EZ{vvDIhxx70K^sK|7Y>1xC&OU zGpul)Ho1UCNDL-Q0%B_IYA;!I7sSwQM4vLIy@ zAVY#CM(Tff{7K7x(#r9|*bSaM00(|TsSa2~25aTOzoP=qITvI5lPP)6yC3ZKr>(%v z!VW~Gx+_3~rp^{HoU#tULrvVw&$h>~iv7+(0Dk(Ttvwx^yyuA!R&-u42S~yVh)t++ z{_jG$pigM|#{o|?2R94v`34?VbRGdGNXF650wm?;0ITmGhWSf%!BGGBS28>qIgt!= zqf@TW3oSY;nF9pUR+H6`1gWSgYe`nT0wCKDHjuS_abTBmo4wC@3mzmoD^sFtZ zaEhK!EOL=#FfX9te?tVWoRbi_K=;t1^DsD1*!p+F2wfrzzz|d6U;>G$utR^b{jY#v zHu)D2+)TnPNU#r2Z-q(2H}HI&1n=D z(Iy8A$Da*4kmf;?{nI)1DWNAx)rD0*QQb+b!fbXL!9_gD@lRHL!eItxmfpI*bAMpQ-fc>QHg7?qi#~H!(1Dq2Cb@V?C1TQ*|fEyq%Qy}9! z!zBO^uD=0+Gxv$7fT10#e^v1ZlY-gKF)6(0JP@7}Ra}6C{VzyPGR}*9_CyQ6RdSA5 z!E6^XD+dcNTqUr+Dxe3>ze$JP^z0xY%pfOK|1JF-mx7@qhUZ!o4i-L;lqoQ}2D1tv zUF>ht|2tgZbvt2lFx$Dj23~aD3hZouh=+9xPP*v^bew;M0#AP~HUm5lgHZ>V?OcBd zUUUHz_OnoAS(TxQ$6s-ra?IbOvL^4+<5(~owCDm$0mFRIA!Q&#g!bnF3~U^KLjbS$#X9+eN5O38cobfA0RreC zhB@>AI7w$y7fS#E$KROzgsm?|0QVrcRe*3f%cHQO3lMMvhrh{-o#dmxQE>fL5C5HM zoK*dUJlM~ZD6HrL6hI~hA6xm2K!W!#mSBg|^TqrHulsKZ=h+j8iwm8B7wB0+hZlb% z5a+Q00fyoJn?ZmFIzbivA3$K${|)3kkpcm6ArL-bvcu8C(wW)9(Zd072{FFEs^TwR z39IVwxPazjXWCX+(Rpiduz>&`x3h$L|WZL9Mf%YHG(a&Y`VFu|H4IREqgEvDE{ zOm#81KM5B&8}XbOFD6`Ij1$%xYdS!j++bEyal!7t|g~N2ew70;5Ed&`APkpu1uRgte(N(4zr{ z@?C(lIsfeJo*F*|1AY$;X80HpC;ZLHC=C1Wu`=Ls>;H+4^Q6}X=U~qB><1HY7AiYP z)Xc>Zc;c!h(D(9$*t^+-)POu6I3Dv%r{`qc>7=K12FR&FR4~T{vY|z1WpjX(?^;49 zPXTFaz#RLZGrE5j2L=Ob_^16nQ5?M9KunxN~Za@dTa71uGa0L+qD@6Y6%%8!168RU>A5264 z;66`A9OtQ+mjyb^1fNGd>6F0T{Xbor6L#PKaOpq!m*YJD!ir8Sju+?|p2&wyVV*?W z|0tddnsojf>2PQ#etbU9<+zB9`9QF_!T+0FV0F%)a^b#o!mQ`BTbRwxRvT#WS+!OE zZ(=#28S1~)Jzql@t)G^}#{#UU5SJH~mINlFB*kT=WW`}Kb^mJk_YxfVoD7%~-u*sl zXy8>lGu+P(9pC)V%n}CcB#t>Rz<55zh)y>+@Kq_NLKs$bR#Cu+CmaQIB?a&AwJzsiX#EWaJR7<&JWmvR;wI;5 zmh(K#@&RLge`@Arb!w#&+vA2h< zH#v((@6<^7Sv+w6xL8Fnt^D>K7@M3n8?@-O*#PF{LtsJR0$3D;z>C0)paQTgbdjAl zf;xgSf)enG8^IH}ZV&v0GV#AO%kpmwoWXeV5bKLE!cBalGnjHuV}ur+#>fXuEWma4 z$HJwvO4HQ&i(j2Qz4u~3f3hy;dDev$odv`L0D`Wk`Ev!+Sws?|e?#;)PrpDbP^+H? z!OjL`!phDTKN>`JmoqtG-pIZS5T?}U0WAGF(4bDlK{*B{VU?PZcaqNkKDPqalU|xVM`tUkq4|@ zWK}l1qwZ?Yss!Q!PQ^cI5O{$D{{MSPI5+#*2iT_>D!$~ZcA7;wB<~wCsxK-oz#$62 zHM>ii)XXUmA7p;z<2&}Yp4*%2TY~&=@~|3NPN!&Qs9O-5@vH zHyjejHK7)%xMbAT;`~;VTnq8VylVCJ$ml!xi<9%4L;tyOEjrp4;$1=nobkPAw@2~QiJR?F-MvSHRFTO1D0`G^qZ+657 zd0sYzEIHI@iKE9vvuyf5A{drhXdEGk<*(^X+@Mrx{( zW*`W(O86sqaSPc<5$|E_%y;ZF9?ppBipH~LmLMmFsHVKCcD|!YjXY{VIYVzr9m^Z| zGV0xPomvSoI!#8L6w&g0bHpo=KPa6v?wDkw=T;9_wlE^mf}dpN)-++8J^T2gKPu)S zwb;PYWttmeOLC?*M1Fghs&F1t%~FZq5}6S!v0NBS+~N%&Pk>^yuaJQ^h9!1m|O>}6I|({ zYg-OcG^M_TOI5AoJKrtsTk4t&|$EKhbjs zBZBreMYCv;TZ-8_ZvB+@lQokN=H#V0GDg6U^Jg(dRg}7AaZT}&CYm`dCGPjCIo*8h zXCN>wOGH++EPhRps^xcJw`3JtpLc9ckIqxvA3Y{dIWZm$f;qc5-nW#i6eI~*bg4#g zGP<>RDu0=ez>*TyUNCt^W&HfcqKoC6gPNrVO9bY}+GWuJ$qT2e#s3D8mB#EsN4GIk14^qqNy_`p8K)Y%{RFmM&5+UH4Nu1&y-;y;o-ykUkki$p*yBFus%UD)rY^3KuZ+{L3C3QO;UTSv>#uMTxE(M= zJ|QYRyb!5o`8YU-MvA1zuEUjWK`049Do|#TbCnbkp<L@ zRe2YLm>$ieQ&D9=mUYN%vP5n_TySa9O40bj!|?0X5Q}ZL!@wPVHkBzp90>sI_{ai9 ze47Fw$2Okfmy~^MjJxg^`o~)O5NtVt;%q;N)@=<0`)!mES)Zthry3Nr7SBf{CT>ZM zV0;pq5R?j~+9ZA-A)WmQQJ5^$=TU2WmaJyd+a-b*$)gk#Bm<(n`ZCJNvy=}JSmWoLBx3aZB9eWqaBe=;h@1|WP_)>+ z*50f-?L0?lIi-NqhRS=1>S>j0O1dgzDOY}#!TY>Wg-i;uz20Ws4UJoa(^NFb}lYj;P*X z#SP{Lo;F&`c_e2y!haNm4GCZtCC$bdyIK0Wxp)9Af|s19B&gw?$qbQ`u!B`8#hg$f zaUa118jr>MZJqi0ss=Gs8kf6tq_Nx`fh0VK4DY1KsCE|fKBcEt;}m~4(kFN2q7=ir z#2eFqh>{(Gy^OndO!>OG!hu@3Nos|_VdTx#96kJ{5>h8&z1M7tFFcxZQ?~|dg2*O- z-Bq;tJwmfH5n4CxMWqGqq9x@mm6T`iTjB8L zt{6hFv$|u2!zY44o0+bjap0Fhi_MH&fA23;DFgB%{d|!M?avrY5w`C_06C@#b-`S~ z6J!Q!BFSD2)kLnm>{sMiGLH(grMO;*hSqM3E4__kkJ&4vnBzv`(kZvX{i>KOaDbcK zX~3FI;4SKwrk-G8x3>Sbix7*JR z6SVY`TQsM<>{r7374J_w-hGFG!d%T!rK#tWgQ0mZyi0S4jE&N0f=^B16{d^XyB{XY zO&K8pngQS6HvN!T_>mv|oh*it^;Hw{s6Fp=jm*~Cb4 zMq0WqbPuV`p=m^5>aKjy+GiCVxR;XG`{D86_~VC$r-vAG-RoqggrCPB{M>jUa;M?28R$7bEny=)u`;sxHGkxJ*^1_60`w+{>!|#GLhnIGTM8Bwcq#BO8 z<<(pt6IuU+!w zIz!RIfoiJI!Z=~A9Yft7TwJJmi}5p(lJBqP1>*H>>kI>Ios%G&v@@~EYk|H|qlS6K zSC!3M8XpP;U1xaZO3Pd8zoK&YCR+JoVTN0MqNgb{{fsD&$vpMiE4Ss&#a)7TTVMI{ zqJ?Hklh@w)MkN^LAbHj=!SZ6Eci1VHaYnp$kKPHDxjRTH0T*y%=BeLY9_{#bvFk$gi* zqTnoubpS)h(+S&EbXp@cW&?V>KHfAO7>I~T3c9a zyWi}3CGKUU=au1Bo#c=oGib^`iF|M0GVKGb8R1H`^=GqNeiFtFqv#x1Vc;z1R##=p$IL3@Dz!2`Q z36npstz#5%|W0}BZQo#FOyI8K1;jhQwt;alu1TV&~DXa)o^|Q|e-M|v=Okf49 zk^3oOZ6e$dfI!H~J)O8)&N6P+9#lC&tt~9g^SNWDFQMK~qfT56_?LS#PPvA&Xnn*t zD(4RfW0r>14HKXEw;5W-<7=E}Ua3Dd&9-*JaYj>uWY$KCs_rK1lF< zS*v1uPX<>fbsi<9k{(;*m#{pmS6Dk`}YhE8m-&`<6+h7UG_6h<(7#6&>e-b0Om&7eEeD!XXabm?WhdgSn36&Zx%N*KK-{ow} zP^#*91u{sz9E+Ec1K`Ig1=Cmkcs!}s?FGB+h8esBb}(nUEznD_^W*WLUqM>bY+#-3 z!*aBix$k7xu;&T=N^LFTi(22ib+?)(`&7H`V||;Y)qfai^fq=!9{j^Jlz~se6VsHLYy3N{rSZNc zMgXV}i2$g18~~Jq#9m_#>dcB0tm@QD(5f>vKEpbGDqg2eG5azmzL;-ua~c1OJI+U6 z>eBkE6ooy%s+oPX{5Ahb;k+bjcA)0#9ic@vh6{$c8?Qq5X$jPp(|D?AW4eaf*Z+^Rw*ZbKNVY{SW?8JU zn3QV<@3E+?;hp1>2xQNp2B(XYySelpTl0*b$&1 zBSNg_YC*bHjZo)BQM zTpUYN`nyCt5C1BW-G|xTW;s5meCk2hq6o&uXVorF>C(iu-6F&^;lA@bK0dG6v~?N=7ERZq$JBO7uQTbS=D zy{BI7NX?A~|JGhr#-#oH-{gU{YU6NH45=>l$zK0z@RCHA?x}e#={-YI0PIGKH3;nV zY8FX@`>TQTKK1euDH+FwBV(_-bN{cO^N&r}3XXvzB@?((F70*6G^*P_lae@HKh^R6 zubO4iQ8T_>K}`^O>H2+>qheh6_12u;`$(zl1Z=M3XZGKFU{u@*@lo6GJWf8475$hl z*v_Zk3HX_RpeXhsyly=Ge?CI)+$hoo`m>~&&~g+urE~G?j*@o`$$URC%+VbkX%X-P zgX&*h9-zgYwAj(p-E6$vj)uGLflpG8nRHMfUsd0g8TqiEeUJ zID@hA{)aPEu%`MMV3hiK9|8IX(!bAxsAqA%Tv!3~W?vqC2vu9)efz6BX=Uo}MA7pJeLeEfdLv*u6 z931=d&m2f8}S+J)HD;@52i=5vFVPDn-N~d zz(q*03`fH+9quBP((YCj{q+(CTb0Ei)xLvz?KRFN>myedidw*%hTBZI=^B;G&bKun zhTI+7{dxKit$WJRXSDsFus3`GLqlvk7MVm5uS0>it+M(xjT6v>qj`V=~CvSa(6J>7vKWH4|avba%o__jl^c8-`~}+yOmLYJ*kT8 zM&-4vg=KAAvz1=ovBB#PNgGG`Y#BCCNV-Ly+;n+;U|r*_hFX6;ezPO{u@$mo+(U)` zgif}x7Q^_~km*)6Wb5_fp0J!X+z;#ciUQ~jr=fNMw{xsKu#@hPGT3J6^8YDinR@PT+ z^R9T5acjb9%3C?&wfSuc*nRO2eD~wmJtgysZBX)UN(#VZr*$5{h(O}5%rmP?iQ&y{pLy8mNZ4Nlh~6(H3*|2Y|42} zUvW!%l(W9Yl*QP1F<&0B-Ns>5vSOvv91ddDT7Ekuu=zL&RTbygw32f&PSQtx9I0S1 zWYWB@MG5{hJtn$?F0q$2`0>4L5#~o^{isK_wdBn)my4x}bkGh;BzaFXMbU#G469mG@e z1J0zc{IDf?b?ijY-^80u(xA|TbFPrkp~SBRHLj!fEX}{KcUBR*jv2<}eu2W=T#bI~ z3g})4CWdtSbR-emAf&u+nMd36h4{}(mxcpv^uy5bDHA_ryDFq&;Il*%dvax8m)67r zg)YvQhzf|%BxK^M42nk>)Z4C0)@|tTOJ-uPlhA24UDv;VbW9V@M@ZBH*B~a0Y)*e`G!3(8u!XZj^?rPvcm|TA$%d(OptchdEI~1HU zLk)oxy+--<>n-cWo2N#Nibv8wI@lyfjVs zOdw;-b2|bY9F=|uZdBS;Xlr8OC2FQuS`p}bW@=KR;-qW481&|n_@MrTeJ%;Tk1L!X#(AzbnX)gUlnW@~_ozk~Ifiyn z9Q_j}HkZTAEux?hnzUem+E&>P&kjoi2K0cl#1}|T zW*i00CR_*-7hMS}mmon$2g&CwVN0Zt<5Cnj8T=OHj$pE+ zcS;!iBQ|>z!q>2ToCg2r~)W_?lqLPx84MysrR|3Q7m|z=&Wr|)E4b8kT3hV z;xOS`oG|dpF+aYeN8ZOueoEpC9C8;SlNtF$>akxX*hc1{&t@jPM;=or3vHFf^qm7s z01e$#8v+&?TA0oXpuI0o5YlA`3d#4`C)eMSE0GFp!yljyxKb?bqROJJ)?!$Qa=i|2 zkzWj;ctutLArvDa2WFiXYmWe&H)%G=-L>&>mZj< zQA@q04fjPTClfeps}MN4JwA&ZU$T1>FszAwLNPk3UT7gn)z@QvNWn5r7Q+ z+Dnkb1Mywmg+>%G1uCGpo#bz;*xz6(+SkItpamN_yH_!KtN+?(5fNi$DT_80 ztd>iFQbw9bPF~`QyD@U@d2ovg7Q7YS1ve@pr6D8-Z%?e#Xuz?X`FP3T# zd4|XduV+S?FsL6`$rXh&9GA7*61qdc`Gj(gaJmTI6umzt+QkACQ zh$smqqBf-YoFIvxcP;^0%+lcnn$)Pt_e!wH*v#Nt?PqAJVDQr}b~HUyY~|h%gwP!z z3e1&vK3ueb{$fBkqL}C@s>bgE1M9vMBykA={r;J}H1e2o!|Lws`%c1q;sq2MJ_=9- zdRznv-LIf9IjR2WWs^w=Fp`#^!{LwQ_5l0BPfC>jY2o%OE9K;iHDhz(w1d6nMA3X0(&lT=3fFJC=PKXI2_urKb zAQv%CV+uU`G&{Ju#6@yZhx18KDJ9EWShL#0Q%6%MgU=6ko z(P`S9W0%SUt0fhW5R(ykYE%tyQb#it0_~3O*9wPa%oSZCIqk7li17m{L@T zkbfRZKx@i>;TemU;0TL~A7r^}0SE`y7TrN4s{{JwH)(F2L~@v1gh0D9M!OG7_E0Y5P|J{DO!f2pB_abLqP{1P6Qgp-;__99eGU8s6A~oshJyk| zaz2)Z=?Nc{DGxOsHcEnAZoKFGbFFC9DZ9b<-(W_NL*qm= zgf2T2*;~jkBDbwQm{CN0deoG==K2CgMzMN_aigtboo%ankHPLuP=($8yh08Hd;$;` z<1XE}zOwfoo&B>Mw6r)E3e^qJF#`hcB49g1N*PF;<~<0XS~uR`-t5;?aDr?vGS~Rs zojo1j`)n`h&NFp7-tPuZDs{iLHod=)m!Np`EC@S!z3lM634dPj!>{z>^?Kdj?zuDV zIp}$&sVPHO_w^N(PBEySbInI5_=$Nw6NW#&ItldvO>M8U zGd2x#0*_AvKfOG6XxJ?2Xesgi>Fm{%|Ak!7m$V|BGji=-x=ov!dF%v(ThLu&vB}Dn zK4plndYMwyR&3)^m(%*I@#;yN`Ftzo#sP1x8~xpKWs+`1e6nVr`|C1hGXIMBgKot= z<;;ZgS$z0;n})?j+Wb}CfO~Odzmwa9`MPxbif4ABrE$Rtg?;F~=stPlUK?7;Pbvel z>cl`5>Ebqf&4F0Ni~P`oVh6Vg%k>f2x(@x0>5;o5nX%u9%;ZId`$k=CHh<{VMn}<^ z?d#R&CoL%J-BnMbrnfq^vv~);LW#}!G;R1+BwAZnNS)Y)zKOma)E#w&rsi*(6q8Y7 z8PMiCO;|YJ#89_lE*y20xmNjm!WHN?)HhL`jZi*e0_0y3prrf86{~B5hgfDcrOwjh zm)1IEZZgIPTC@RmZ?O|Y?$%~9>>JAt3xo%C$iGQ9=81gqF^U4Og+>czE>8jv&xg*e zO^u#Bc$SZ3O1W#7gg01>5BIfFFSwr4*nI1DM^eXG3|ZqCg@TX5A&uEZoaJn6or!1g zAAdyinOeLe@Uu=^4^NLZGJR`76d{l3q^s`ow>BkXRK^gJF=dr+A#8THbLYlQe(RJw zyX90made@tT8XPjwY6?Pk#JasPFU1CD_}0qDn)mwuRXebO$qp0B{!p|mng|X=K6-9 z%srlMdYL_vwwm( zz{;(}mTI?g{$rkNblId^8RjFOIwao`$)FNIII9Og*Q>8dkD$L?f+tk=;%G=V3-L2) z{+n?mGl5-5(((MXx`8Z??ZPQ3 z1%xU;&3%svWi|NnCXDG z0ur_F_Dbm0el{JCsC=tp+33~p@oM{CGbakP5@Q{#<%G^-QZ!Xmy>bLQYy|eUR*u(BoH}WKk-QTw43>#GMeF$TyhA zl`aCi!5DL}4%Tu^yo!GC;UikSMbQ!E_q<7LRlHP(-<%T{LltNem-u*IU#TjC@y0jk z*WTJK;jvlaT?|%D(ML>S8+U{-&f3k@zoASI<2j0#8{#JC&0|7z#fYD~Z+Or6CHx(^&$`t69rEhC@q%#e(RJ!D{iuPS}&f z2-2EwJN~ZzI55-nV<}Iuqxw7pf4~p*IQ%`pT~$$#-Ke97XU%}4X-v1iq@1yWf?dol7cPloJVRpO5N8LWG`$qHV_tUp&nWu*GL$P&DU+~ zs3c{tV@Zo8GuZCoVs^j9yhz7*X6JuIJ{V$(@CrN{;N z+xXN&lGK}CB;1}~TX4AF?-FJN7YWU=@VdHKBsfXC+5d4%dMhQGGdgn)G)hP*UCS|A zkQkc+!f-Cr9vP+?v&zaj8mU@dN&dKBTdF<4-=W#iz}nq0XBb#oT4GYUN#7IV%Yd^l zSyl*i=D{{{8Hn|fak)W78JNjFJgQPKt3gYl2_Tcsrc^WwMZ@B(V;6lQb%kCU>U z8NYX%1hmu*57EDrQq0gE50%@J;vn5!MXC2C*l2h?QpkuVzH#cdJ>4Z*rZEM}plf|~ z_6en3%hB~Dt5G%svRqUlp8tK=lZ$+1!lI4F`%TBg+w*#ldr#YmyY110S99V8L^~5c zh*te$#wm(B54BB4V+T>mYj8|_Vs?3JlXbdY9uBJ(r$vL^tkqu8(y&5pe69(#_?T*B zO1bSR%LAbn>mcst;`I*r{6o9uE&XiF>QiuMVZwO=n{c4YOpBM%1wCC6Dd+pu#R0z# zJUzd=+mE;7`IC33ya|mGGLOch_beYzMvv$FtEJ1!vsC9w`iaVl4gg+ehv)N5-(0!# z(}iB|*FN7^F&T`XS9^({bv@tuE;o;#uE$oWUFo}vIle!stKb}B+@1F9m4<22&usJ! z&Vst8pig)r`3%&GXIwiC#2zFEb7fH0jM@({8`H7Axp0k6gyG5sX~f|@o-I(9CmwI* zySWtOUANcAiyK-+9V6$_K@>|19>?&A>+NxZQcobOyGC{n+k>lS5LaE_mqiSm#MqYM z@rAlr%>$!HWC~lFjoWx+EkQ$P`q$VpCkfD{+Ak-RWDSMi+JD}yV3{g&93*OGR(PHF ztUtb$vMm=r;BU?!=@dCK76^})(X1`We2>ehZ)*}rrdHWy>!`KoXQ=Lsg)_|2||o>#Ay z&+>&XQzyK|ccTL89U~Ft!A2&vLgN?rTb~Ga#gU+{Q$*^$3p%5Dqoor>#|rw(R~S!I zHvJ9Cu8UE~Q|=jr=kdd;i&2|J=N2xWM(S^urP?3&&5<|hxSTizq-~(vd8&DBH*)>i zm+CR6Pvvch$nU46d+YmF-nzE^G_xny(cWR^(3n{>JOHiBqd5VxRPA7M1-?dZurE7@ zDMiIOvz=h`Ctw|dSA*#qH@=O_urAEwv>< zr}n+%KVV5E-=xF1ogP{7Z%U;L|FGH=SJ;cQlTOeAz7 z7#ZS9qzC`mjhm`Mbv|#d#g&SkW#0I8qsDqM*m()Yu?9p_mid=js?5aK*+Ol7OQz!d zT32-qrxUAukLAbNDc$_y07dhi{G>H0Exa{&bXTvzAxq(}>lk*$=nvSH!ewB9chBL7 zrQU>TvZyZz?+x({QC2%(-?2PwsK#h1M$Xi_SzlIFm#>dZs%Aech7p_WjDpRZ%)HH~ z297RSkCD~IHLx$Un60ZW3)QZA-U|6mTIbVptUTJK24<&9Nskn!b}4pf(nTgkFn?B0 zm95RuL`Vx;OOY+jOCU?rKuBwhZ`dqj*&4L~G?&*wnC8Qns`gCM=064uL-~s8%6-39 z^^HwL);9NVxAlq{quM+@__mNYUZ9}-y6Deb>TMr14Vm_*+A`JkZ{Z$lzRWipS4!)9 z13HbaF7MTK7ccz;&T}>L(|VnAHQM)k6GQspR569S0t8c74rdDM&SZ934tv-@r~fEc zFgN;&W-vTl>op}F44rt#>o1uoIKpx~|B<#|wzA4Ca$E6dF8n~pNLwOH<3tetuw%5r znUfWMO?CNroXt;k9q;mb+Bc1HrKZ zZK$ogk}Z3Z1G878wAPlKs%GndB@Ps|@$jDMSn8wfi>9=10rrjmwC<*?95tz=jBLXH zKxx0`3U7pBrxQ*eEG9QBsn{P{4AFjel6>U~b;2u>JwPqQD=OA5U)w-cY2qz;!7He; z^!V|sq)u98J-6i4{!&$&#rfI6cnr{r;PB%l@p%q4rV^^9|8DpAZf~w{Y2u*wVe^hv z_m8>%we{Xvx~C%XVcn|uyYg`O+%I%S!!Y+9@FGOToeZDLtG++fq5|y@{?cp^18Q@3 zofU})9`q}B&W;On=Jx+4;GQiC`f4}~*TL`!{ zh#r`d%JAQJ`~YSCeYe>EQszI>ZvHQ2{v++*|5oN>FWJAg2mSA4nExZ+&;L^9KXQ%y z?_^m1=5qU2-IV`t0Yzp;rvFDkk(Hf|^FITM`8skJq>VpXp$46ka_yJ5yx8;r-=jXU zo%$giVLWE_hV^>q0DSB&8|Bm{i0hYr>hN-NJ(`}U5{6l+s>NEh7b-vVj1$lOz$@Q= zpNSs#5#m#9B;Okx!kZ&@cAt%mL4|##=)sG~HF0P8#ibzqUgs;$jBC9;WhGu&#CkF% zDi0VqyqDxRsgc`Fn&C?hLh~RxoCx_PlFFO-nioY5W4L>-OC9jd6%zBDbvx+;d6@fD1j?=nsoWud17=1tjp1s=%fp9L}3hb8D_RC7;)bllb@=9CglH#1!I2LI!F}$>z zSo2czUoHe@z9twDPcPB3J(q{)&iX#w%2kJ0aJlXs7h^Rz)W(06JHq8H4`r;GQwe8O zP~%qK|0Fgy0d7C*02;dJG3zv2t4S?Y?Vw3L+&nua#U1apq=`(MENjVE;shr*qF^aV z4SXZ_vbp3+&xmG;_*r3n&Y5Ga=1CCOCryPOs^W5V`4#o)>1@9`1q*kkv3sc-RKA(n zV6IF+kfNL^yj(my7rB|}n(WyxRWu3OAl2C_E;s7A+%I>U^qMu*cOHlDW$05ecM$7b zu>IL@%aCaz@8yxIKBZq53m8=?H+li3Z;KN~a-z~~a9s7g=(BTT?rhqm5)%k)-W>_I zb}_nERu;{=Tl2DoWj)gMd1v~dbu7O;H59pL>7}W@JTbHvE!^wB%)rd)FDmsVnIQO3 zsLRa>56mguE&oUfa1auwDv&r}wCfpk^v)%Drm=*PnMKCS?N&YPXSg~%?f?^+j%iq! z<3z;~U(3y6`IU{3llL2Jd2UW^plrUzKt@7LEsOB7rs9oT?ooV!|Hj{|2wkOfG=>Wh z&s3Mz&p76(^XiMMTaeZhVIj#^dN%HD*&mN0#PG%7&v*K0IodUGSLg z!Vz-pSj8H;{5pvugEB1wtz#CYwQ;9fi(6|r3=3*3+3IpR!L%S>;_PB|)HnP}@u1UAB%6EReO z2_39nt7FQF!}r&;{?9TOlwwHg*Jy^&pwL`C+aWnWz<()|f=nU%$5ex(B-c!V8>&bx z21AGv!&(*SgLFb86|fZh?TCdK#a7^da#8=z+(1BOi3G|Jn42d-qj2mHz1Ij?A z{qsvF6}TqLIKiVi0E*!$v$h&CHlub5G9y`biJOcBlNixMJpc|VX&Ih%nn;KSx4P#tg#rahW+6de(sXa*_GET~PM+Er-Q4bOPmPs(m=TZ}#1&crw zdC_z6_z*loteb1Qw+a$eQ8p`DbTdW4kc5Vh={J)VjEX=m2;8i%IRFMO78VOZzGeBz zh@e5)AMX|IETs$TF}sw}!y+s*q&lhLcp0`6kY$1AZQoFj=nYaF2Kc1a%d7wVgH}Kw zSN{jIq53{fvpfT|7J61cgFbcA`VUd#Ni#IK&<3t%1It?E&u|(pV+MbI6U79;GslU3 z?keo@E!MlINhqeug}AZQVp&peDZij&uYy=-Kv@BGn3WEnRA-eNnfDDrdSplm@keM+ z+3`#6X&o>!0x((^1etGnYauG7xe6xPd&~5A%!%l$%gK$d|1JW>#9J#sn+GiHCXX!} zyUlt(6xElRCDeb_48y>%;^d)2(Z)Txw`pv48Qbso__3H9)-eecp<}kjWp{;Xkw-*+ zpF(R;UNkm}>W3>Ik!*!lwIwr;m}Y1qbKz}qcs%7@ccqb1Utwzws0BKbBNSPRdMs(! zb*+~3rCAC9G0G*fl-oB40S|q@wLju~kQIZbRMr6sO-vMVZW4L!vsRQE+Le`nz-|tt zh@e{JJ!ryV-{~iWD2vXjve^;vWyhu>kd|PD9xDnl1bcc$3mJ)k#c&xGIprGV)3r7o;0T8qg`B?HPY^Cx!VqHuxtURB|{r)hd9%{r(IM}SvO!z zq8Fm>s|$W3rD>=)gQpTetxbNLI&{SH&kE-3x1+VB2T`c*lIjs#tzHn~=o|)+=2qMb z{xQfzM2omWzcAp>5v>dBqx@Yis%1hDxM%6biv9HcO3+k|{Rh%laAR7mG3?1+=(Vcc zT3VV`#jrIT(J6;i2)%e%+7$BQBUVUEu>J%Fze=S8#>AAdVwBMR1l%)&%zPjxgp1*x zE$5h&JX@l%V>#BjyLyV_TZwb1P}P~S93T1>*Ho}MHo9U(%%azuv2^cukmVvHf?G6e z1Gts!c~4h?cPW0EW%Zkq*qD|rYYN8VR6B)4ZFp>Q%AM+MX^`?GK2iomkUf2u92aSs zF=LquGG|d7SfH(*lE^1I>BsGSk_Z#a4N13S!ZKf+%9)ZFNLkr)E5YJg5hH#yVJ=Rx z(9l7}jsQP1P%G&R%xS92($PXS_?E>TZ6p=oM8Ac03$hyMnQbQIknMEfI8>JI zVV$rw@UK%W$AZDi(sj^S`m`ym$9E@nf|w`;lJW>TS=iu_ASF{0lNGq_dLi*G>4_GI)hN|)-1*8K-0X_-vD?xB| zMvG$FS)^2d3jS~$a0n9nB*?79!_|qfVsuW%m_OS=hd$XbLyIbre&CTFg<@%zWg#QV zT%#X@w{!jo&Q2F;!8iujWU|(W7+Bb@lbfO=5f5{5*6o5kgEa$JG^)-Azwgilj{w)S z3*ZWu3KJtX3(=e>O3Vp4^J0|MWWi$PULI285uP#wpF>&!+bNPtpEUy)MOzuvGb~Uv z+(OqRlE2I5B8FYc{EQO01E;q#qej0Pqnx3LdsO@;W3$l$YA?E(&_2=>|Xe0jf z#_L%nKEKEF%=^nl$NTLBzsF1EXRpTv;@6|c%P}t;F4U)aThE&ZuLq5C+jW&;IjZ=q z>F2jOa``i4WiL?H4CNF#DoK{2mx_7UImLrV*djD#H`|VvhJI=oh7DI(i9=gyIBeui@c&cna27-|##ruqzG;}u#u0`8kiym|#_WLS+-yJ4)D zD9vo!{Dtos)=(BU?w~Oz+cy@$tFhwd&LOv|g7@c<**G|F>u34H^kqmENrBEzh?8sl z`iN1aMVm_Nb)MgyWd41T*DK7di=sK-aVAg7rfD6t>y@V~8uAYBBC$bU@Ry60M<#JE zl&v)>mToUxWmm1C>#FKR4~^1Ri=PiIjXOd)&LfA3^%opVV540O^yimEql_U@zsOuE!@&zE_+{ zB*2U61j%(Sk_D9&>jMjMXT%O}ZS_^SMmx5h+yL9udC~m0F&CEHq!#SpG%Q%YK?0BH z`cz3%?f$gd)V;mGWLz*_P_^K#kq%=+4^qo@)0tuT>`%+CI;$qxbu27p3istg%!-mM5Z;-2g*J7iIcNuBJyTtu#P?%^- z8j#0F=I|+BC^qojqyT=ZkXU89cz!XQqD;v?ZkhnU7^INYUHDnl9wZhc$Qo(3py?cWzO>A52Fzk%?M%G~Gg095vjT?_SnqguxM#znQUy5@3*aajV z`r33Mj|cVPQzTu^k^>h`2e%O9*$Q8F`MB*|z~Xur#($mH5(lvhe2IQs`suWL2}wbW z!rwX(iPN7IP(DKx?ZSEOR3ZB)+btUo91Y&?^6SCHG$!I#e4xschQ zO8w&$P-DKm)Q;udhw7_(B_b6$MB&Nt;MqSKDda(n6vT>!A|)9>Q%(s;&_WvK5vYr& z)fDq9^M=C!?llb{4_U3qN*ZMu7!RAj>zy&aaYt0n&1@q%R6TN;d6a($(zGLDeJlOY zl{zE%FQE8B*pk2MQ6|t?fQa%5G>5S$#jZf>QHc78s_pFQ50?EmNLG6nW9t!qL+wQ* z9RPS}GrIQT$7A5r$-kr&_Ayd~Rq~8X@^FR=YIy9K2ksB)Ll0lWryqRzTXW#WslOM$ zM7!i?AvKbP1{^12&g)Hq(;=mqAFa!Ma>Tqx`D#BWH4|Z0# zLEm#k7eR$8O-+xH7dJEyiL%6!s4+Mha;b z_zW|^N86FKBmT2w_0=^;|HCyQ;~Mwf0A$BEJxrw^7N0w$5!^@8LIj=#R_Mv z(n7du7&*^igUQmm#~;Fa@%VC`F7!!=Qx@+ljgCv8W4Ys6bkNka9MvrxMF>=)7$<++ z5wz&p)wvM;dKj*qPCe)Tvljn5+!G&w;yq!={bwuKu!++p{aD+=0(KVhYmSEI?Wv^( zGhodXmcZ4H-?#S$5N^Q(5!Gsj?B@h21wrGwMFeRKi}7`V>lN?h_IXaOux*I*pf58$ zLt1|-m1-kccyV&v}0 zgH^#Z{2J(Ly7o4g^w_6>X@6b&cn@G^9_2o{hf4Anj?L`-HSqC^-#ak?WKH+AqoRT` z0&?j|qw@3x>lc^C@hz%&Pyg7)qYm&JT?JK!*#!}D+OIOwSic*HIG=QxjeLy zz<~}VM3a9K;?MU};E-QlOuK%5Tl!$czJ<;9j(@P$_l=EzaOB1V{l`f1m#CJQt+y$% zT&s#y-)}DEThO`tfN?D2$DY~#YFzE2x%z=r`#4++(l@gWRHpW3$^DmT`_w!)IzGnU zH0Rz%;SF%a;nK7NG5^KF|KL-xynll8N`;9Sq*u46S)zKzen&Nwn`iqw(%)Dq+1|WxQ zJXHS6p744bb@R-oX+HZkmCTchCvE4sgXYpVEFi1Ug=Jt|Tu}TbHo1y71^kOF`#$(k z;Obk?4?)sF#=mUBiJoC(_7AFoonQh|v7x*W$<|*o1x}JAFYR6*_R4-VUs+neHfKbW z9ahbM9p@z-kbB`tVlPHVG&2P^^SR@>iX&RQTpo? z+#lA8_+5$!JO5*@lw)!DxX46w_5AjiIsGNFB?hG|{`>Jy(}2w=9!3h~tQbIw<^Pwf z*#&_752R$^ygs~54OI7G1zRDIk^k9@A%R;TbHm@t_58yv-m4~o)Crld7D^PYE{UM= z-wyuHn~!FEbNnn9X8B!1MLkFGgLO4=J~|2&0jLBi?k{}c--%7>pDYb@3z41=y}()e zFDN{4KzXT~xdFZ2NhnVp$j!q4?U?_3DPgKPii$8Zvz_TRzmEOk9a9Xvf1Mp@)zQDK zlKDGLnjvMFC4KbQU#Q!ELH)fexVJ-v;lpIFp#bUsZV}MHZ-P-*s$uV+bMqp^|L6Du z%m0t({_M>Eo-yx#eztCGXl|`<^&epg&i{O;*#GtMI@3pzFe_m4VtO&)>pzS|j17T_ z8tG+>ZA=}^2v|9onEvzedY_K;1Sz}C8q}cI?-8Rp(oi=LKM*d!0NXZ!Sc@NxFAdKZ zL!?eYUmsJ(cRrrN3JaU(gd#VZnm;M8D$#L+JwbUTPeP?z)jUF_BgCXHrN5A1gCC(q z1$Ki(AfoXUv4fw2DZME^>(n4yyP8!z%DR(;JVx*+26STJX=G;~<iCQdchjLL(HFQLt#WU_St-G~kljRC%_gj3O$?71O1? zgv-_l+aV4NY!Y=9kp#5C1T*T{>~90$XpDM-v0PcPRrIsXu2IUd z$NsqbpdpA&HJik!GhB+wif22{IVcC9F^gE$Ris2F5Q_TXXsXpJ+*-f`xAK)1NLU~L zUdCfX3ttZ`jh<&cEEXH3JrYJOw~U>S)5|uxW-7NVn9(L6oeRRyT(Fs%Cg=;yj-Qt; z$c2y?D#)E`hHL{T#>xlc?YE+#DZ;ZznyqQ$QHqU@3B+2ZWYIvz&9m+#O);?Bdn0^S zI};!NerOP?Sl~!IuBaeUy;UG}qR9i0A5nEM*G@J=>V*l9j&(Cxb{~$Vae_32iQ4Jrc6;v13}KA8M!;el(Zz+E0nZeqP?M%| z+UIW29NH6i(~!W8+QbF?BzQ zU|0zRC?H!g<#*a9P=-^rTDVcaV2qvu&(YjV`)&C4IT$O0KP%|tJg2Lppy(oqf#?Hl zj9(zbUWXq=VM~CjAWMN?u0>3qey@#8RK9(lW0zVCi>hLxRg3IOv{^EExkO3GmI41% z)zV}Qlg~)yE0`Z3L79N_rK8KBgVEEkPsZ>=Xa6Gt#zDjt_Nlnx3sF9Mzim~LO*rgG z!e=mUF$2eARw%QF{t3$cAqWgfHavL%rcV%SXaGSh?evd5A)am6H& zwMt+yB@Fcwjf`fgVN7C19_WHJ$;eGc56O%Um&}D+q?htz6A6y~jp^9G2u!tR7cN6! zKJE{Tfg-7-AJ|__Or8NqHE8b3e|G))*kadEj2wluW7ElIR5WG4{{nP4?0 znkh_`n>IB3BN3#Sg78>hT{sJj0yF}gDe)2E4l756RRPEGu&O}LFr@NBk{MLo%V0L# zvHPeL%JQ%f%CZz0jJ1k{ke1F;R(ZKqfox)YxwrNb6*pK60?Cs6k;-7;b!D_w(cQ2& zCd;Q1Be+8f2V>#XXjL||5o+wZy?BJ>;bBPY04q@Ic;F}E@5d|?C9LBPi9n5QCZT&c z5K&B(t&X*(M#X`HS_@2)Z3Gqr$*5MMk%2IE4}y3IBbzoB;mQOegrqJ$KH_zHSap#r z+P|TpMo^0wTQhgm8*MiTXE3lV8f+;Fza|QyE6v!L*_yM$>I?4@&@P~Tw7HcmsWBv- zSN;aCrULDdRQGNKL&Kp?v`aJ?aV?0y%w#S;PUF5)kX&7*Xh&QTS3A>z~lS ztR)fns7C{rmI~4O5JUaL@FWD5aVFCdEa>QKh0&lWOVBno@(8WjzPo@Zw2~@Ak@+f% zSOJr$By7bZ2;*IZg7OMF5zyk%SYL2O=7T_RMYUT(OJ%kQ-!g@TY~q&_EDj0SdPN9D zQEO;jLD1?N|0Y6I7KdQ5oLF&Tg3F|QZ_p+Q0)%l!lyWy9LQ)w@G(vf+B3+tseXw1% zyhL1B-89M`Q8^16p0Dzh-422t^)U8to@_0wMB)@T;ZdweC z`+ZQwMLk3F+N#QmRv&8$Z$Kul4aAU`L!01|8f27ZssxNBc`zh@6{p`%V(wvI#@@~b z>g&Mz%x#2-F;p8QC%FiAWi}QVk`|Qp&eaHDc25JfPcSsat+cQwyaSya`pu!;*IF)M zaF_#~HbIPNOJqhRoo>T+oHlw&oyPLvWvtOCSeBrt-hEK50oZXGSj4%~8XH8*g7?hb zLL(MN>?|fsH7fgrGN|3OPT2-yAe+H}SW$+>xa=g##4cot#IEQe)sUa-0!WyvQNdy| zY)n+tCAu=b;=2eU2cE;0f4_kuX!lwy4m#%jP8bR^ zNyzW@zX|M>)<(X54?tmv0_7Jip@BegDemTsPB4~h;7ZZQQt(8VrY5FVO@LcMBXJ}` ziyr|YLlYflM0r4=Ms|x^AWCQ&4vsiHn^zoAG#H^?gr;JxWCxEjQy_YxqOHSmBRvUW zAL{T{w*m8UZtF4`w>Z6P93RnL8kx|n3;p!42S4Qpl! zDt6T)MmNC=Zn@V5$=kr-#~{N2*n!pbjEQAt2X<7*(~+Y zN~a0MWN}`^Y*W#gIIGi>7VaWIyMhhfyHPvi3km_Y?IzzBvF`JH+B67(siXyTe$7o9 zq#N4r7|`p1Y~w^QR^9SF`Tc0cpX7;?(2_e@1k|@OCQ8Og*vP~Kp0U|Y(FkW?8&l+= zv7}>&_7M;PUwj)?V0(VeZ;}VxXy(>ZHAGeYAe4Y=z)?Nd3W*MvrSXZNK~oJk(jDlY zkswP9bcex~1|@)L3Y9Gp`OZ2xHaNGOMaxV_L#ggs@DqF2;3~*p-v~lr684Mv)?4a^ z$D`+3pEh15-^=CJ^XJU>>kj^(k6VfSuYdTx{v01VXy?0W6uU_MB*-6;;w50km-tho2qj_6d~qNLCNjyX_1)TgL*O@vq5Zr`r?q14 z7d7X8<6c!0W*g!B)lb)P^OjPs6x$T&YDW~fH~9JQo;7+ zeKW^Glr*{F91F+#l)u$sM<__Y)4H#F7vua<;TT>3mTVBQPutBlYb&wZS^dY7 zd5f)dDsF8RknkEl%G@{)~#-aWJe>41IIflf{N?c|DERVUmbE=v}v@Ilz4l`DymI?O0qvIvN|g+ z4XZrUE(ThGb*+s5(UtOGPM_Tg9kyG}+bOlbT8nGV{PGkHewq)FCZ8by{?=yFDvWZ# zbPY50@oShKQz-p=YU905sY-}Drxc2)w3n}<^_b$ipW=%6M^~t>)%r(P`5J<6r0fwHBA78|lbDcx1wqOP77y`876{C7~(yzmvDa zE;o>w{yzWpd#H*qn^<7+pxhLVl7PxI3Y{dcHDp=T_)@Vj`z`m(US{QO!K7kDin*0e zgoSs+1XQ%RwAVg&_!(ips9hYGx0Mau=3)(jI?ksY+c9>1OS8xHQuDZl|3CKxAYB^`BN z|5Jl}L10L7z)flWXZE2c$u?!mwBOrX?t97G-x~J6!r^QypMw<<4c12d$ZSyc6 zSvdVa;^hOKcg;WUQduC!G>}LKYXJ9K2e+FmJlAANd243Vp{)2|-Im~}WK&z>;S~pnO2(%UbErbT){}h+WKN&Y*@#8d1fJqrTdmr>S zy*l*zaV7ZqerVoC%>|>HQ~dcv$meF@sCvL57`NK{{{xbKb`)d%Iz@HIcRa>v`EduU>yG*^_eZ<7{f>A@Xvpm5}*U z{}o_yeV<@Vx!*bICZe{3iXGzfP$u+rs{oyUZ_b&0>S7|rpPwrDzCG%n8}qk~&yY&! z{&Z*#o>L=)$M&}4I`3|oDpSO}^py`2D)I69(X+4nvtV8_P)9_PII&A8rk5Q;^XY1o z<@fsQ<=1qPCr2cgM8~aWk*D&E2PZmp=NP%0&!T26zZM|p{U5pCt+x0YHT-*uX5IKi zPG%1egr-v@$Qp)r7fF2xw=KTSAG+ms)n?yf*MC*)Vrc(|luJ@C!)+U9{fBO;UA57- z*s){yHX!vJgKwL}d6@g)r_C(yO3;cYh4*>*%@Fq*_e#5JgKsfg=hVS04k!+ z7g~!@AFk$#>~ZA9k7@3y`znFVW97gn0%KE!zMF?0@T=4)`A&IL8YLQg8W|dMn#PT% zquh%gWJ<@rM_#zy`>pYn*_ctP>mj?{{K)Z@)fjJd+DBui-Ras_PlCoODMiA6>D#=)em?$((dADWC6RckhEPfYLeX z0a8BsVs{lmrU{E9k{h8EncTuw9#r2`llSax6gnbY%v)Ut&wk4To{u`m4#AHqtP6#6 z3OKl`_jCHcCnr8Xj>ogPi5PX)RNW?Ab3e~ZO>TufE`IQ02DS2Jy5fR8#rg|Q5>KT3J&%eCq77ufC7g z21C|=*^p+Q)PYak@Egx1>E`qR{))u@P>=hm9&4E`hSN>_<5f%X&E3s&O5!1jJjF?C zYvsu>X#0=XW8%c<4W{dT3h`Gv*ZvVVBjamU2#xCk+uHp3`SJDRTggf;T%RhN^wv5e z-Sl1`LUy+>`c`k!-BgeB32vdsn?T=hcl1Inl^B02ijT1A?o2Eu!2qqqoeTS(sJ8zPSWO z9t%AV%%lrGRW0Z>%cgJ=J-a(y%z;k))l%4QIK8Tf%p*Meo(?UO>H z=S@8Qi9i=66s(vW`Gjx7-R4`TZca;RvZY^lD+;kLx5!GD9GA%YKJ^aYwI?n|tF<4d z)p7gD0d;|nokKFqEsG^k&ox9EIy-V3V7A-#*1(I-1?s;G{{I44qu$}=&Zn2VMO98> zY53;j{c)XgO~JlTknkCM?Cm+`0_IM3iie94VEO&{Q(|PRx2m_~u+e2(kOmgvXkWQ$6_t5(8)ET%L#Me{YS}pCSWkX&*5AKJnV`KEaQ~g$7sRV z&MrZXuW}8c`*HWP*JD&)#M`9yo67|_z5{*Cb)p^|%wP3BFSaXaT0XaWS}_f9+H+qMhhrOpLmX6!6%%IJl%?b-PvPWrIu~%O@@NF5*~%wvz!=K zzl`qmndE4nxwLdnNyJMZ`5tY}a2YI!2K#7MQdl}1J=q0cjo4c}!BN`SQwKIC7Y(#p zv14J$aXilVlvy76_LW_}^HX__2-pIn@D9e_%^l76(`&nxpHe0qIGje>lJ@o**1jXZ zAJIPSO@5d|V;s3gs&0rN+|@2%`RxgIW}1cmBrnQ7ieuV2xLLZr!c+>p*-R!W}<`M=Az z8HA}#cj~{14~L2( zp>wm6Kb({=8MC65FL7_TehOFp`!m;(B3`)I87X z+QeG}r*f}r?vN1(+V5nfwozIBT7Pb&3+CoKq7P_dyHf+#QFkjHY*l43=f%i}A)W&; zl!{P#fmru}gRF#2Y6UUopZBNgL^p{9ewDR4J8XNhCJna|ZG8JSEw`*rq{@DZ>%+w` zArm!z5Z{GgIHXqkrJrA>@opY24^dm$vJbf86l>w;QA==t?EeAh;(s0!&VsmeYs1O=g?ynTKT) zKmzCF8LMAu#cHzW$bn}dttQ~`#$@VaHUV}qEzdvmEPHw@X7ylbkqu_p9Ql40WUG2Q zE7mR%4cmp(q%z7N#5BnZ5Ns0O4%%c{_`DKVDh^^i59n_#CM{J2a)kv*YYk}UC1IOt6W$3xB#Z%lp~XU?G$_VJ$e18&;k^rx`laKjyH>c`j&Px-jl+ zK6Lksf-h{~PHph*z^wk+bY&}1K#iPE&yM~NFTJgI%ls^N);?DnA9Jn{M)A>z>o<&};VH)DuVE(prY0|eO;$y9zoEc|_Vd=6% z=W~XWG;43cA)_%kUl2PRZ3bPFiP8(}Qgg=P4ms}#3AX?~UM#INUStXL0js_5&O;;H ze!6~P(4ZiwxT*Q8ODS!H_;nx#X|7a}*)Y1Wey>bL`7h6 zc!2T;aqSTI^*TQ*tAmS$ed*u|V}xymrT4Vh&%Lcv=hMA_6Q$wv4yg3|CEhoGB<7^#8Wg&N&nAKe7kbe>^6i;*dVk$7EE$`_PbRrYm;Fq(>@Bp#T=Q0+*X%6T{ zGyK9tXmAIn#2m&ch_mVCT#3wtd5I!0I+NeEQ}f5gy5gU5W9W!;Me8qQL>j#e7>d~X zLu471tJYuoYT+c@cSjdHumpu8Dx7mHT!JO)h5FCc7GV;W249s-xsxto$QJ@RL-P6r z#0gFp?qpKv zbZ}XmX!e+xm2enbrT`M7ceYm9To%I?==Gm?15p1=xs{2i`$+`(Q^%R38FVAxBj&4v zldJJ%<9mhu+#)$&A4?e4b~v%a%fu&@Yl%A8HrI#b^g`hL%tlRL1R!p{OsI_t)o3SW zD1yrpJrX>t zE|O>ZaUvCDQRtcc$ejG;|7O={kA>gD0R8(u(l%$VVN?eGIc+bZZ{l}@D01w7L;q%?J9HK?HPwInio7|bCd}ZWlj)TC4#EAk| z5e-B5Ze)Pm5SonOt3KHeZ2Zbg3#$?K6Y&!^$)Xk^XBP#t&|7>4<1z`LaiW-~Z0K&( zc2ACOAo$9eMB*Z_y|yl$OT1R&cu&Zr50GjvIEMlS?bL^`GML)?;cfX*N4KgcqX6Vx zuMK{tW`uMJhdvD8?1|}P3=OX){!m5rPtsnu*G4R5IFg{2(tlr8O^suh^LqM+c2phb z`yThLW zzoX@mbhjjEzITe5+jE)Y@cXbyjk1i$0}QZi*`(x-Xs9_+H2L39QjgC%D1wQW`^ZI< zD@=n${Jt>6DyoZulYd|`l72~iv{DHz4%+Pg9)*^M%>IsWBwqqxAZlwBPF+CZWR6oM z^F3M2Qy!WH$$*nPZ-&TOq%8GtzMpU~_2sFe<3z(%NlrY~D%$hF1I#NOn#2HW5bXkK zqc=$;LnsDAamk$-4O9b*KUv{NaC5pHdmu~)^##%h7)qih{Z6I3KN9&1rE{v2v_^tU z&3Fr?pNisK*nGo$$IP zQ70*{dB0|scOfI70gkp5to0gpeW}Yp3cl2|-L-4*fFp~{J}0Zlm(}$nU&qVqr8|yR zYe*#IO^3QLsGvvB`M-e-Vtn9eV7vYr+_B1qm8^X`FR*I9)g9P$V37~UYZN^!r_b8M zIJyxxN@yN)>*!AnH2I(ah^HqBEdOm8n!JITtqfiiLpP7nILo1K7|OIdmln(ai8x&z ziw*q662Bl~ZHy@a@Y845_0>j7lmoDx(oIrMP+ME<)P7H5;@CA3jRY`J9 z^^9cE-YG_5RW$}{jH&xQalH{{mecqze~D*`dE@Mv7O+|b3Wg@{F=9s|=NTO!ih_hA zuDf_9=8SG8x(;J6g(5p~ps$bF}dMbTRTALBeKD z{xb74WqktJ)>Dh=^Kh2n^9W3MYb4IhtIKB}b0Fw)-S(Wm^4J$`dxukWJ1^UA^Ss_< zvx0X*ylxZ0?e2A{7D=q%GFL3#(#l}t#OG4?%J)h)ms zi8ow2VlAbrE8~(_*AW9sWG6GfY~L&9i-Ay`pbgScYpDH`-y*rg(G%7ZpzO1$qiYEn zRT}pc3?LmDH*h*dE~O@6o-_4L6Aa0XgW?<$wBy6|sa81qT>5h7uxq7%Tg05i3{ae3#-FMor7yAh+Po!QSTvu-CCKB1x6tF@XpnN(IKkpR$b?$j zMrwS3X(pgtG-f#}CjkV3TC(QBK|aN-$H+2aD8^?C4XP!|fiB6r|ywlyZJ zB-W>u+ulm|!5|wD#S>Sf3|2C|JmoqD8;!EDYBghtwBYCRRXJmjd6iBKid zg|wZnabJ2NriTwp4}WR(5WbI(Ii;!ek4}P?^7ZUeQlINn!UFw(CB(hK;+t~|2IFLs zF&D69@$zMfcGu{aar)BV#mi+9^Wj#ke9ev;RJ$TAzX!k`5uPFh4DMgbPtG=o)YKRn zA?h65#0Zazrr206WlGTj1!y=!7-%9w2{Y?<*8J z2p*ed>5jUO;;5I++5u?Saw}~f9z&P6N2PptWL9CdqT0Kik$9s{D1(RbepE+7(}UYf zWGy0Rn3L3s|9rkzbdtF8o}^MdzP@=&v$r5}ca_)L0zDSit(P0&S@&W*^TbQf6Rf@` z&UbXLSmPwV&wnLvFhh7Z%e%+KagmNkEJ&8gz=2+;Rc&@Bow{0e)Huwt5}8a@w3rCF z&Q=Sio4DJEaY3giR0F<=k$qw(6)Sr){y9B(TqLPs0NJa zJFz%X$f46`7ed%5xjQ?{V@@37-Z$`*bnMl{opLmYk#u-7WE|0nuBZmI{)3_v!7BeK z7~E6M!}sAUmwcDo`Xuw1o67wQwdiFY&RsX{e z%ajRxu9vQT&ZpX*76^5p?~2z`eC`sMpRQaTQr45_K@xU=!x|F`+V4b#h+GMHZIMku z8w(Rszq`_B`)3hzdy2Pz#1*6r%r)XggT^uL8cN)*&m%YRm>G$$eIspJJw4*@haM`@ z!@?NmP68?5BZ7_M+``D{o^-wM7gl(2_R>pFBAa;QFJFG2-%P65r;McEknePR5ZfM! z7!E(%`8K<~dzAviu)W}+pxj{`{KA#2Df_d6*q~w-o$U+E8Yi& zRUO%?*sL$^Zb9&x<9DYQ1>U$6#q7o}Fn*+ppiYA9(-2#8ywY#VY0TjNBLOB-vrmO! zQF8z6EVnmv@+EILr3{FxPzJt=A^BpUZl-kiAYxA;^NKG=+FyR5w(ROKt4WR3xzyl5 zvupNvtj%P7SXF43M7cBpFk-A66j?j>nUfO-rEy#hCx^q7bC+U)Veicb)4Ph{W&L@42b(mh6sEk zkzMl*9orC{Fi;ColRK;PcZ<_q^xy0W{8xcX`UY|{jh#ANM7>U>}>T9_mQmYL7tH}`yTpQ+C0QfhLfIkZ@l zoB&#+ciKNn3+DrRxelzaCw&Nzi6N@;_S-(SLr=kH9cD1JI=#7hSrSsC?895w2pfo+ zsdV`wn9X$4!+#k3WW!lYIB2~HGNF~fUZyZCSXmpaEKEOF zTGdQx=^KL6>31LzeOChpmcWNKm(n6IlW7ePCutBte@#wh zn|4kh{`=cX)?oLK$q7^e{|q-Mp6I_#_Kv$YKCi=HcD5^EA=*pLLM@kT z%f$v6gP){iWp7zk;-L;@lZ%WbYo{~N*65z!Jw1h2$F~5+S2)8WuK%u`j%}I=Hd1da zoHPs?ptv$%XcsnNU4Y)GdbJvrFtnoPy3p04RCja)3&gVbO`h5x0%B;G;sxz0w4o2_ zW^`z7q&7oBBn;&;DHPTiYI{17CM?jQ4{l|rJ`U8&`0T!^lTT$KJ=qZ+KBp{r^F|aM1-AjHHJ6#nj8~%A#p@F|x_AMckAo;uUNAToHci&wjOSfRzcAyY%c6*5|RwH-?-&RG#@4969LuGr^lmb1TLVk5;~wl zsiVStNMBmLr<4|z>sQaq zI5WmuFA{{-N^G4roD>8F+VP_k+Fmo-fnvh!y6(<^1ym5(7}leO=QM&2lAWaKW=5`<@(>ZvQL2&$^^JEmMBi&nV=M}P})67zd}L42?9(x2dd*0 zyeP!`(eGyiotCLj?$RP9udVe&?DD}sJ1Zi=H*VIvBW^z>c}MIfAHZFHD?-%jl8yO2hJj&e4DN2bo zOqozvvpZ2z$&3gxZ$x;J^-PzYm@~ozuT0f%tS`!lACME1Oc#(DGw)4D6zVs_F_z9` zIAj7eC$C8am;+Vi!52x1)cIFH!1a8I+C&bMi&d>=QR961ois*{b5&nqeTSvJNgR^9 zqH*y;qDlmktyOeHyq@UpAe|X|+(p}#`N-B-HFBH^Z>ipC%$+URz!cOn^0Ysv;+F;{ z23T}0gGIxcGD{5{iIkMuY~bD1bd~$=l)*Oa3+#t(&ivo`(gR-l1bi60aQD-vzTAO8 z;0lWnTom>uTJ&mS?i`tM4HeUmYFnl8$E>`-t>Y=-8ZEW^U*6Lu-!jMNyCl9T$iQ-y zQ35$l=qf23DVO-K$xqZ{+9zhxI88*yge#;|l_)CB5V@@-F-?9{-_7wBMDRwb!D?7m zt}M#qyxdhR{d#$>zY#zAr<+qSb&$nddaqB0Zu(rMZ%gZ!W8PQ9uYWNtA2 zX}mCIS0&tuU?SB0nxWjIKwbL9W8p3!XFal6n$!zR+libsevb-*5dD&@ zLDxb3^C|JPiLK%^{-Gx&_+vkZI7#`Sj=QAp0WRMn1Hmz{JdklbKI?mZ909pGf?^g2 zwUVCzGv9%!+EB^l&=f<}<%?=Amgtw&)?8!0T=H_p8CCjKGs9DRR(J5GxZdeV25|M7 z;s~fjbs_j4-m2{CcKs}^GK)q~nCeiez69n{rV`&x)yOoe?dWG|aIPx}Sm>I7a7~A_ z?chqeEs(0CSu%r%19nBcbOm0ykACyZaM%2b`{5^5`l}iOVCARmkS#qKRidMI@=b(~BrwH&zChZg{z7Y-lcD2$>@rk-MnBbNj3RYS!% z{#ao-Fup*LS!LFWdGe2xX(%9^A`}qnZG&V>VUoN)R4AaOa7tbu5(mX2^n4IDKoK&1 zTOxIwcC4cuSTEefF?|XcX9*M4iwYzM{)2;|IDP!h z6l&s?Nisshg>^DQ2P{h{xSiiZGwt9&IohA#K$#}04IR)+jD}eQ%MzmjU_A^BAQ2^z z37%=?H_iZI@T^bKD*(YwUO))~tLP8v)eM=aQKOd$VVD2{+rFKlPgO(ZW;hJoNF2eh za!t- zfmr4{Ayp&6qyrf8;Ib9Z&aW%CAmRSvQOXB|1(%EB5-4b4ZDy9Zx}_KlbXx_J3qWvi z8EU4qqBN$G)mqr8bzm02b5MA6rm)bP0LQUV6$@8AeMmd%UVEAq7{U1BcSOv^B~v%c z>q*pz*Spm&cFV#g-#_x$&h{R3Mq5?b7D&xW1b`)eSF60mwld%EQ~bw>eNdSG2kW)b{H&H@w3tlXpm`g4E;eH#{0c+(d-~gj z-dKGV;;ZUE)kYK+JUo473iM*4%1nx9+#H)Y_!y-xOF^bPt8DWT-aSyG^t9T?$I1?0 za(h~Ib!;?NmSc}7Id!o(6Yy4Q-#>tqcyvRo?a`gkaA#I&PfF#jE6|Wm zzN{}TYh~`R@al`5iDHGw&nuOlFBQeAieD8goIcLV7r$c0+r+_8>q=W=&_)NO%4a8K z7A}}C!f7V$WD;wBZaZ`b_I&ZE>7c)R$5r`*HOyLJ?6^9b>Ozl3v5&`iK~cqVo_H2| zej0T2`&o!@Lj+2(F)*~p4~)qF#F)5{!ZDfIXJ#TdUAOOkrbs_5VqNBvqtZ*{DkF6? zBBnUOLl{3~VIq%8lT##*vKFHwkBSfo4KYO;X6BhSi|u@^EsVc3d<>_#J7Wu#0w^-@ zF;sAePO9fv$x6nUFMVYvKfQc8y#rr|0LQe8`}I}DeNgbZP*!b#jAe6$tlDc5o0q=m z>efP1Pp3ph4d&|Lv--H7WAqWU;bRTtu$vd2ZaBy!h@FL-ByEU{3 zuzTwVp({g{E>z@EcHxBoCAksomxzc_;(mc{@Nui(9jqlFZw~efipjs?Tg^n=Q^Eb_ zVwfHdU`0ZKOR88?X_1viE{ zIBHaroq7n7t7@F;TADEHku}YpKdlr2PYvhSHZ?*}+^dH3QeV-e%?E$syalIw-W@dd z@kfpbd7bW7Dd;}!AM5(utu^^PoI?+gIZG*fzT4$)>+0Ka>B%2?`oWI3e7~#Ua|3T- zN|*}lVD>px9Iyw)c|X}XG_mB?KbmQ$W`iHxxGk+I?w|!n`}%G&q#&8po4gBf6$s*ZcC` zrqy|i4v0)vZ9kYPVJgo@bM@o!=j>^^b6Y(?6p^@bsHy@Sp0iZ%;*X%3;t zPj8C8pfW0C%VZVA3U9hie&&2TCauAsL=f6*@Vd`Y@Hf(x&{&8j&$N@wZcaqnZ->?W7Vs%e(h9GJee#xnFQWh)Q!cyw z-ZC3);RgCj$TLwqj+AL-!Y?b5*?~&Vnx3O!2A$^ofxdF z3{=g-3Y1JE0p+O>t8HYQ1XIJ=88~w-t)tqYT1M|f`by_LqEsav`=naQ_c_YL`?2RS zvNh0VEyL0yoAcPtU&cvdVXQjqfkn;?;ml>1lb796#uLlO8RLX5$qlUU_DdPs380X0 zecBleZ+lx>u7F%^Zdz!qf#~e*{E;=o_?uA2?hmQbOM2q~kaM4hM1{{dXekFT0dy9j zPum5Mv70lVCW=>DgcX^D>z#7{C{rKOCMju<`l_2Lw}*7sZ_zhD8$*F1i+gx@Q}&g8D|j;z}O>`y5u3c6U{Qe0>~^F`W~5CF4eeBiRuNVeDn5YVmgQ)jy1La~U$3eBBX7=m)oxsS<_<&{Zfc zBy5<^R#ufQk^=N!}Q!n@9b&;awcX{@vPA_3VA#U*^0t zi`}6FUMuw5VADpI1<+mG#m&3VKGgoUBJ{|uJ-UMO7-s`I3Bd2pOzhL-?-Qq~+=?bY zd^h?o3w-aLP0$C%m@{r7iq|w+zkbWq*Hu3GfuwEQR+=dwmvZJtAW+txm4UOc`Qvb6?tRlBakWEXMZT1z1$C+>r2>;t0>r@6 zJet2D3RD}aUnqXI@!46L>Bqat4{r9E^^}AiN--p{8zKMTivWuL7J*ThTFb&8`U`X7 zl%?sRZ_gB#HVKfpKrS$I>;EdS6AQekFkvecm$!~)0{P#7p{khi5)Ppw6V2c9MLXuN zs*BHde>>1Kf!0OU@QOgSUywm27Nz80I=qcrNx9leZ5O(9{!76F^o}gG*meX5V@t4t zy99QmhE02AXxJbcbtgpwNx7wL9B#|2*O3&4vtlz`r$U1l1*b?1eB35FEbmD1&+opqy+RPPVJ(PnWFD6pOshL|#^RPfz&x z*M`F!(`u2CP*v(F?BO+2P!=p6VwG1>3*#PPWt@e3P+m`~KpNj%308ZRtA2k{ZgswZ zS_eA#JNS0nGQky%Fe-^ImdFiJ4902ZR>UU=tH6jPVhgwNzoaNCNJ|Gn5k?4_l|Zpz zL}q+4-pDaGl(d?iF|g8Db-?%8P<@D=!MHX2udq=vuw){W?fk;=E85L3y8%kDjjIpf zz8%_JCyMXZ)IlH9hQjU6pP2`3L8&TPL&lLW90|mt>dBeC(9_XimAaud^sI3}1G+M} z;AT|Hv;M~or-@XOO+y{>F(@he6eP$k6V@!8)$|WG8f7Dt&twR%ffYe{HRr}!{)y3l zj6R&qX@v5Q&{!M>^utD?M!l(D#Q8QT4m8$#V<_3v@qC3W{Bo(G6x1tuor~b&^ zFh~{`A@`*Jd4j5kC_zFiEm10eAcB>trs&UtT)u21>yhkfZ3$ai;F68(Vr>PXg@uhm zPpah!23|s}teEoWImH{@{&Xh#o_dZoq$$FD*#TB2j0Tb0u3aUgFxeUIf;JvdM3|k~ zCbmvjA3XKyL~_AX+RX` zwk-r9lG)pbdRYHyC2-qE%`2{6)el+Vx-zgjJlw5^Ud*|xMj1!IiqE+6Q9w@$#wrrK z@j+2&$N!>?@HNy(aog_RA+5OBhelif8Sf?W{L@z|5n^Z7n04YPZa)AmghDT%=6Q)P zt2QaC<$l(PLp5F!OAtv)@_D3fxRj#0V^hq$#P;`jg8n7PZELo%d5PCoYS`#2OTqm7 zLd6~}$v``q|07sZr!Hm}i7C99-z<7jDUYOn65=}jp`ixaMmMy1UslW5%dEJ>{d?fQ z{y(A_cr#v_LC3B~_mCDEN#E>8(J%%5@*C0qK8i9e3@7*maUEW_4X5G^>pzv3_)liJ z8}TAb?Z(kS*P{;&PG4A=06J199fa2JCovXhJ{%Waxv4*Kby<;kRMcKwIWG1gq3^O* zi3#D6S4WBZk+s_Hms$T|3yA$guVl?QiJ?v4Ms>4_R!2nFom+^2;(hbGG@ucB_(U0k zkmqW=DAYO5_zx%kT3Al-*SWp)#XFMISh~G;zhg_7<@#VB#b&FziSxmdXD#({9?+Y- z_)3ebs-KS7N>e@Oeef!SsLDjPE_pMXTkFzhdXPzdhAY`OdSn{k?PL0^ARjgPd&$pv zqz$EeFbbw!mf9?qcJ3mVzHPGgn_ViK0-=0=X3HmESmO#UIRQX6y&Rq@dbbt%#B+aY zrb(uv$IX1}ohY!85nj$d!-?8fM4LK!iY@A3q8Felrv4n?(N`24#hvu?8n@}30{=O( z^d@~(2-$fS3l+!etXbNJG!F8$^;W}*8 zIOJz@DU~ZnXe0++aqmzn3dNyT=-}#i5^3$kpkZYI&69)Hy1~$?beLRg4Jj5nAFG^H z5n77{>lZ>-44ahLEB`$e!EX!^)-L-ZHQ*$KxuAq_&&ZpxO2yS%zU@%bL1&|4de>7P z{`+j77&f`J);?&d!WL(2#wm}Jk%fN1)>32vAwVaizw`a)!%uyE{e8Xvor*AB2ceUY zkV?HL|AzqLSfcMMy|%Dll1`!riGYEg_Xjx@@n5AXVe=(OD~-Glwj{wZefA&)TT6ug z`W1hI)g4$=I8zxK{d-bH?ltn%c5}{g_0%5umbup#RB^T;1zpdB%|QJQ6kY$!Zqt8& zH2mhxF9&Ageb|Pe3y4<$gAI^F8WHVr;ps}7mc+^bOu2LZZwI>n2g;rOKTz&mEG*pr zJLR4W0+dU*E8x*R(r*o#1|RX~Z*Go#xaJC2Lh;nT=^YDyIdZiKm%kWxY1&=RzRcq?|ZTwz&8fe9403RRDe_`SUR0*ph&<8mPsehlESsd&o0H# zbE~Z&#m3JZGgFm$jr-;rfv{|8wec)Z8+aW!wp?q?Ff+wa-N@(|Mo?$p;q zSWKNjj2`MBpq6!ZJ>-gu#2yr^q3i&%V$a`dtPGTN0lgXBfj|#ZW7P(Z+ZZ-NjFL7Q zW86pvoTvgSw1HeD6(FEF(OM%;2R7NC+Qz-c%B`<I@EP9c%hq z=c-K0;ungbEzEHo5wkTg8Y`a-a2#s}LxF*icno)p9rGlz(ux-Rb0?y5X@eMddKjMZ za*Ok&8oD9#vF{ZAPJfhjo_1`~$O6mO5`(iZB)+ik=exrs*<(}?(Z5o9B`{IC;v3G02e*c5#@t#0= zS|i&^0yInKViztOyaueAj(p2$fRsS5=`kI7kZOct=>|X>YyZvi_WPfrHyhdFdhJ1P zwtJmHNeZF$kilzluZ?L=J6+J$y=HR4n@9Z9N~eiW&2l#LAqm0Kw!_BWMo6J-=U$xL z-zRN8z3rGRJgVV}q~;B{ZGi9vOo1ZwadYi`hHaOC3AfcnLSLs;x(33YWlo0^&q){w zncrcz@NGTSRBz>?Wx4cLn<(6Qrqs=>4Oa{<0UQ}#_9!4Pkl*f_qA@Z^;#PZHqlu8^ z@UCZoPQN00jjrZSLoUZY1kUQV+ia|(^yQcVuko&4>WHf5{5A#dQ>|!2h zG&&*9Qyu|93yvOzA4c6r2IJ&@z*{;r&lg`0-WmOBa5oFwF~vA-;L{ZSb`)XK`Q^So zI}>r_qqAt!{?kE#>G>o#+skudW^u9{s73h48j@)9EqI4T*XXprKTgP6;bpszL{Ww{ zwx~o=@g(P?42@wwOS*7Sq8jpOilU|cvCKgoPKHq^qP`kI=T=`Q zwT{Y9+CjpEW2L`#M(oqR9LE@|!o>!^L3BrAnoEgiP|>D{>RsNZh*6^N<3W4Y>-VKzgkH&0ID?$EMfBor(D00v;|Jv!CFLKNYmAKMHh0%%$Q6c}Iy1(&Ms-3kGFgqF31+7y9+ci5bEjl2fpS z`1PR>b$>7w-~GI{Py5bOhrV939ZNIw-HF}Q*3wI%0%j}(!7|cG#D@&{WyTY?cY3@p zg+40T7YBs7FBfNmMhk;qIHwcdH21e4UaT(bs@D|Nz3?tScxAeEE|DlGcmBcyNc;{4wK4vBZ4z>ZWFY-%he$d7))Ue`cw( zuoBvc?YPHY*lIj&>KrPzdl{yCe*hh&+oMLzSb@xl|omczs z40j0T5!V=JaIVOuC8#{0;K;^LT>8=zRBljkzYKTx=ZYTf(EZG)5Ivp^BJJRVCc5nB zW^0iqq!D14g-pkK%{|6xX2|KBxJ(o;oF64Gow|5PzLttx6KIZh&GH~uuQ$z^2VizHjlQH=5{f58qSpG|zl!BZS8 zd`{)-Cp?*eAY~)xDDX{qP`hQ`ZzmPOH&G*#j~tsFRruScrObfWOjc6u7gV^hU3fU( zor{;g!g%|9xQbRyq{8GO58Yzb^bi&7AU{3^jjpY5d7HsTAZiQ^*4HkIGRd{Ixr}?= zQ_C+R@$o9IE~vHcMcgJn31eSE1o3t2Zl*;}-@O-iWSn&+LY!7F|IG24kvxG6QtGGD zBX;pp-`2HORhRX~tc5s*2IG4uL(lfV zWAtPUnyvWFloV`AxPV8Ug~%Wrh@2f_H-(7rI*k_R{8&8?Jc0_uDTCk^f_w=u; zyQ`~us(aTS%a(K(1so-k@|Gtq9nK$A>L{otMee(wNMiim90!D%gS;pXe{?<9TTV& zU|B1(Lc_dR{{_`L@Dm3k42CQmH(2sZs}YI!$A2dHhvgV0==2NT-0~~nl$zqjEaP}@ z5X|1VBt?s59h~V=97E#L4Nn5as2HosgbJ=K1FhA`sc;VX(-lQL<9o>NrltY7kvLGDD3R5vucB~;hGH>7s@SuCET_?mXHiQ4B6M%aQ;vH6%leMzmOPsYD<28MDoEnwI18iad~AuR$gPRG;zg5*!atc^My& zkc$dm31o+v1dUlu2+V7*fBu-doEq@&K#r|T1}W2s7_gb-O9oXa8^;7jqyz4#I$NG%tP*VEjF%K3zK4fN$_ zgLHDk@yGxXk&U3YFWY7GIK#Js2f+YIu`}MC`s5YLuyvgMQ%m-JH+NRPbfTTghhlou z6^eMt8R;wt+Y9>jI-XetG8-%OO%OcixY4|+gnk81;4=KBZ-~JX9i0oFH0KNWr=a*LiDTK&r|n6B&YM%Ju@3SC@=7C+}m! z_JSM0-?AZdvci@IppF|YCQEqfdMM(%^t~jMt=>lqu)|oqB#{&oyKr`Qs!OU-gTl%j zv>Sq$LmW_O8!tgX{CQZE2%2F+51H-ZSfC-b`~pyl&)6Y{Q`h%sGZjKZ}cLe zqwz>ORlS_3_;j@~vS`zA+1+3&^)VuVx~}MEVNB=^YO<#(OX)6RJWA8wfPZTLVefDK zg4?P~O@>rOK)fb0ky~#TH`vZ)F{;+DKV`YHyAd;@i4Do|z&^XsQB5SB1K{G}7cI~K zlQ@M~V44Ly z6NlXrnLms3ZayGOKh8UG$&7r$RDZhBAOC3_w`oLzYi(%327UMdhuzr0o_hF<#mcVG zk^gx{8qyzl+)Zxa>xL3PXuBT8--Lep2m-j-adlGW)Ruv~fyO)!{~pBj* z^zK-G)-C}|F>A-p8+x2}QfJW28WHVU`OTH&L)yH^{6UKWS@XPjV=C}-c)j}O^_NDz zW-QDDQ-`qATwqD!?c(;bsDtn!e&Lm51 zgH1^F)ATQHkKU}R3o?qlYq~t5*nlI-9Lf?NocCSx3MTj@NSq0vxVx?CywbU2@~NKI z|8bt<*orZ3zu;vSZ4JK!QU2@{R(}$Mp;Nh-xM*S$-x{2%X z5Vg$8zj?cOt^8P=P5Kw~c)U3U5!&?X+h<`cnN2X8SJ;}T(K*iN%9bM*oP9~iSkpy7 z!pUtu@ad9Z`9^rC&8xp-hjB+sDCO9ckq-dHSMA_~T1^gZ=npx7L)2 zYcnPI@0mNcmFexYcdxi)+&m^){q&OC6#!}!Np+}XV*LcZjT zg0WjbA<`j*dR^WnaSU|9n5@$c;pZw5{C;=HG1CzB~cg z&?1vkEfP-Nu;&|Iwf-*3<8&(g?KhSA){6!!f0BZKW(n7b6{g=SwCp17)V*PRLA!j{g%0L0hjweXQ z0kjq#WZOmKHdBjm?FXMy3S(b)?1JcQ<&8zX?CAW}z0|?JE2$k^!Ky6*B5ywofJr-< zTJt%P)YL3Rq_L#l^&?h#;k#p8?xkr)BcKn89{-^(XO9$hq=5cB!&!B5d-~<%M$0#i zD&*JkUfswj-YT4^M$&Ngm^jXGLgDCnP5^N)4u?j!m;h^z$Q=}yWhH|mPKD~eCy)?N z;;HP%gnQGU80a*9&mH6GU~>*w+3QjSCryIIz(-7aqTZ#!&4=FQlY8fI3)}UT?bmX3 zXCKSh%B+YNbrSRwZ(~LDaX0OcWKAq=7t#VQZcz<5(ZjfW?5tLE+e0uYo9$awGz5h}=XhGRcx9UOBN5r=i;PBe0X7YR~kmG4T*ZhDcD*J1zxujx94v+^Y4!lx^HEsOrWEMQ1cg5-u_`~a)HC%X$e1oMS9znA~iQqhbvGASMA-yJ}f>Y;7^@<)Q@Q7 zDke{5<$Aqol8_5l;MukDw4y$o zGY}0ACl~1dhqL$sJiPyPV_;yAuHLSR{6O%8T<$Ra(W3`M*5dx><&lou9+A6#)NlN; z#a?ghK954I^zXSs@(FDnsRbS7h8{yvy{M3^EKHc3@%zPqYiLG&)##7=11r; zggOfM#$KS`87?up3T@?c_MV!X9Y9abLvCYkHcCd{M?_637DRx^!j2OBZe#8e`jTql zmK3O;Mq-O^zaRu6-M|u^Zd&EJ56-1}!#u~1-sc=w1xHQv?=kxuFb1e@)53c1n6I{p zAFB=5xSVMYFLYC=pzbB?;H2hiPhkQf)H{`VjaW_cR;5}()5eWRMX_(_X!CQW2D_A! zfA_z%d>CgpRwh*{siIpRN{>a$pH+|r;ZHm8cHsa1nzQRx(@5^xO3M5Aj-{nGRO(ku zJT5v-ubEu<$;+Mu3auJbx$vWxQwbELaiE}584v@g`byD1AvLvR!Mbnk% zxWUm(i?6##ILTGNf%zs?kN)Q2P_4mLmijV=>>%8#)mRwuH)OyYM+jr z79Z_Rl?(%W$_GMB;<~BAREXG4gXS~4mg(|Vl&qN~ABi@5Nv&x!jOc?{-Y{M)7kOrt zcC`tvG~7|EDOTLkPn@*Cd(D28!@fe>c{T<)RvHN%i7E#bad(~shX~6t^BYGoWD_Mx zkM(>wuuCFveMR5j=>_l1q*(!z`H;MBT3~2>btxvUF;7H(!^RiVD1AUdp@0Py=GjtenY7LG{`m5*hUVf0 zX$P&36dk4-{Xymq+8-sjHT$2q`qCx#YoR1`(LH+dLY9FW?b`(%lr+sJgC0t1hXa*c z`{}FMLnr>6A+bM5n1?Ho`+CW!kr=J z1$ot977q&2dYccGW*1#rNRWu3o(z+I^-9hJkK!#>Xiqz3AxL}DmYX3HRSC@`TDsNI zBwD)_%Ou(Yd2wx(1JYVpO)BvqPUKJB%9|gHnC&Tc(Lq~Fc>2Xg6HKqlIulIqfXfP6 zhK5PB;Fsx8X`2U@+zj=P^XC$*XU!c=fVWhTK*P*C609YXyG&`PxftqI3;Gg%rc;Bu z=w1h;kwBj~l628IKjaMS8Dx_KF=RgH43m~4Cnq-n!ig}Rae`rKO_xWo#DO3&n zr@&+MuU{?XxcH*HCP@j=E(3hB<4$bkRAeK+zItydP1QvQdnC~9-$9uRl198CTFO&P zumcK)0q+lB?tc$}nV6bHV{lg@bJ>@u3plgLprP^yrm0}8_fk;7=n$YBo7h{jn;3Ii z;aXOpDHggiT-y0$?`2XMx;QzwdUhYm0r#BHP4czx(hQh{AGn@cW?E9W5+)JLb7_+# zzt`Uh#qfEuNL@f*71i^WO-u!-hF;5fJJg(Z>eFNgHPo*V#F)scme8Z8o%l7Q-!%Hg zL#P~4VV7}bKu@z>^h=|@^_RsoaXwkmyy0(`0SioZlf+RX=6;@%poB$-#lGQ=S`6*P5xUeg=8-wrz+lM|B#Fq=rZEO1(uc=RUwjZ7SUfFTmD(KcZ zwDwzIsy%dV%a{Dw&Qn23A)k1o74!|L%cMYj=aLiYa9`_uh5)Hmi7Fr^K3O!iuOL#=**p@&c z^l(lA6Y&OxivhO+5S)CpJ3vs*l)|EacvX1j3Ygoc8)T4mznc^3B%xM2V;V*~uQ$Vk z5M9TZ_t9A4LFUXiGWE_ym=EQgy@}ga4Q#qG4xj z6=LRxd0f=G%S=82E_8A>shNj7kfz_LqzHzXDeFmJE;wg_@-xbWzRxcyI%o=>Ts=M) z-@!sbfqs2hwhBtd>>EH=VSgBqXP?mVdU-SXNX?bui$#DunkhWy((heWl_AEHCa6#L zmy( zr7^kzdyHy2T~Ic!$QUZ^E(Bf|p;U|f9VRU^(|=y^{C3b%PDSGbF9Q>`mfTYSC>f|P zaSo`jA1tTxW{nfba6n=Sgh^vO3BRDALw%HIu^oyd%??ysiR4bZCn3AK1mKQJ1H{0@ zQUuKCOSAP38HAQgBxr5oxvAPWM3{8fO(i#tOA8=b)`I0#oD2nztjM4t=6wk(!zT@) z(h`DzDor){2$uUsoM2k1??Is%D*fb%99Pg2zn+7yiRRHg&J_!i4D}VAUOsX)A-B$4 zQyKJ=k*3@6Ly=w8gRlIh8Ipx>bmN^Qd7u+$Y)m~8ne-x`Dj#zZj%a*tSjyYrx6{<# z42v`b%8_yQnEJH;=KhD2-N}rSPNS?ac>xtVXs3f>R|K(PCz`7GqceCPhA4{8M=+Ja zZAEU+M)&Uyf&VigjQ!QF;oZ%|{Y{_f?PeYjzNYNHDJVpk{`ejlyyo6z zXl-N9=5G01Cw>PO0uJ#l!K?A0sJSdZt6Q16;a{)~H|r!ekAYM}LLtR@b`CB;L;I^`gv3e2#hZ_AiGnThsAu&>GhPcZ8jTEyD}S)Lpd7oXoZ=*m0B@h_~Xkg%uuJLu;WDC8sb4ZT+nmSGbQo*75BN_hdn*P^Z59&WqQ8~;0^TO^%}D|*_lG;5X*$<%hC1D zJ$f_x!r@@`(pB3yf?}31TvqSK93!*R-BKPPvcW{<$V;ODWKH%=cPR2d8b(MuTH>uH z6w^{5o8zOr0<)zV0WK>83^5BMTuL&4qtyF<(KD*tZ z0G)Z*E26o0U@y5fDDIx02V;VnBVslV8KW`AN2fWAgs-wU%$VFdMyE;mWQRuyLl-S} zG0W{CPN*iIb*@o>&ScfMbVE{(1^-f?3W#aAPM-(r8Xw0^>ZiJv{ux#Bs#2rhF`W8y zEO|n!k4jmM>GXdllE5<|FLCvh_3msQ^`&ym8?kp6+$!WwvuEG2$idPJTX$ zMq))(FyciMJ#@U`d1twP*dr1cc1vNl8>FWjJdzm2Zrekz6P`U&c8$PW#5@(Kx)u`- z6W(0MpKex)NK*6c-owd1orQi%rn0?4+}}(rq)^6CrC-J9Ot14T3YN4C6(_^C;sU9f z7TI0k`n83(2OJCMHwhuu^;ISISU*9g|!w9$FLuY~3m2Ggl z_4DU6$ff$}LBhfD-}H}O$k=xZ`0Cq3;ynVR^|V6)%>zv3En{FR%MjB>vxI_*6||Jc z25+;C_ZSHsY=h;Tm3rN-1 zya!{I>H*UR6{$Vz`ReQ!HxDt(xhBvw+4cVDfPVzbchos*1fvUbP)~s` zM(D;^H4;dAu73Ylk8T}FIGq9!PUezdb;`<=1AQF=-5q_0id^?-^XJx;~|sw zSEoH)*Ef&hm=T64v9D)SkwGdZxb%c6l}n$ikoZ`UmQqH%Ckepo5;84?{LQk0=O`Qi z(HMVxG{*0V>=~d#%!1bbsC}7u`lNrEo_D>vIc#4h{+RRhZ+>A|nh_sktl|l}e(U%b z!MX9e=pA;W>uVa_fH*9AjVJO{$cER~$gWKz^(u=)3A?PLCK;_(OZ8v?8#1&BP}xEs z?D}YMbUlKY@;|Du(Dv%Hn_emPM4T+T$?ybM15y*Z5wL(+ZNSbYtxI; z0P6Nb`c0~4_mK;f;$GN0Ag~EiFl6E}_LM&ZX*;_0H9LKRivOp@YS~=gw38MqWz)tm z8Rz#D623zj&wK^oYcHG}A_efavC-V@Tre%IDJ81m_!s4tCFH5i6@m8Z%PXC(Pp~t< zaHbP9e}6Xw7^|B1!z_ToK^iN)8Jc&t4Lal@D$Aa&+S9L&A?}D%&ZoPNN z{r^4}nm~_Txb#X&e(}#n%!X+Y14rqLJN;z{|vnCHyxxPjpUppXT<$8@(cDX*Upop z|BgCT9UHmR*y|WcD0yuVr8P%rl~L-#x~2A#3NF(yUb@zZ;`( zJ=tk*wa-&vXVzLkG)}a&)pIBPB-Ic-m5MS&XN@T$g|Rf^_St&M<&g67jzKszrCUeP ztD-dnhd{ChV#2}em(Ao48@rQg+H<{#%oJsaK8~!%3%qVsv|+X%UDsREe>GS2$t|#K zZ4cDq#mld6uop7z>Plz1PX8?<)xCqoavlA!DE`C5kmI{}yAgQOYI&mf#M$wWy^mo< zEm_L5AFdi2Z;2&Z4n}N~w$m#;C}6T`J+{}cwqo+d;_`J>w_7rlTG>lIMl+jAH((>g zd{^+cz5DDC603uw{D>@>bD68fUZl#W-!#}>&L3%Z45D!*Bkb_f|9;`>p#S}ST37R5 zEVoQpx%yiL*Cj?ywvJm~58uz-9|ksHVxDdb(k%3=8-||v)~{tOskgQiAIdwV!jRfO zr)h&r5>WpB`WPDVpy;B(7uHc$MSUbah)$B4_gcFurJTs|btI*&?bffb?_Q)okI6mqp=mWwb8Me27T zwoN>!5~-K^VaPlSK>0Z`>34PitB!K=_S)ahMLgSLXC2em%5N-JN**)u)TV6&)`@g=PHQ5v2ULiYyq>gabJtuSjsewLJ9#H(qj_HNT6Td`i<6@l|BDI&u39DWT z0qRHE0HnpG|D&{#{A;>R1DG@PNj0)OkXG@+U6=Q;?3239J~AMlJyEl39z6hSIBuRs z+4@(JZ^fp|dtSu|!!PRfHGfEeb!{qhBr>#%*r+w#>K^B_$lKok*0s+A;`zUF?elW| z?-A|)hco~GQWD18M-x#}LR{3OY9Ln0p`I{P@Kmt?jY_R)n5Srv) zogm-C_Ir`_@?;lD6)0k>F={idY)dVb24{O}PU?B>^0?G)E$FhBR<$k! zBP&*y{3bi|4HM6FiEN&-?b)XJGM`4)ux(XU8UsI5Y*$lHwcEISGT}sWVcW)P4O+cqJ%d5_i}^i3w4 z4sD3%z}RYR!*zFkVEtZ2bR@8hoo7X;r}E36dP{<%Ugj%?y;D*_m=lZvetoeiGYMnP zH<-HgyW_#2AQ@c{!*GU1n6$E1S9W&^Y*6EC`8ZCI*^i`gl$hs)u#<;AqG2r0hN}Pt;;f2s72fGJR3;i*!gNg0T{B~g5~U77QgM-$RdCyA^Ugr*@Bs~M=8!kmAV|Gr*3!Jnf-o%_aX zn^j45taSom$t<6Y2-;e#mJnC(Fg7wKftTZL{4Vz&LJ5^#NI)eadVJj08mz^ZuQ-K3 ze+{o3k9QTvnY_|5(jM3lvHXZ>>0`z_;g%fR0s>`JX%Bq5o7y19{}J+|Qb)-!4>;cF z%|&gr390m<#wCHah`rAH#n14~4a3ufrZCTWo4l9(s>_ssDzq|4Dc(n!Z*g8_gM9Sc z92%+*W2_wy?%qf!i$o<)*RVtz?SU3mVLW)}I|^x+dY;PUXX*wsGEHi!Y;Cr-NHexK z+GZ5;5)pt`{`pu(-CM_Pu-=OX7>Oo{5bu3*piM~^A@i>fdJpuH?ff>zZGb!{63sxH z=Us%~b@S}}sKq!di5%5C>rf&K?NBE=4vx4bn%I{yBDXn9pUwTb6p?7=djY#1!_9>N zguy`F+sB&xrOzCT$Tb7^ctcr!RkMn4y4CWAu}GXJbrDi{2HE+^ydb*4!q(}ld+S?j zruX9#w_1{jrlO5-id}+5E(`M}CX3AQwFMa%!&Nv5g!a03IE?ENkKD4g@>D=n&CA^m zEnSIZ$>ef0(5<$FD(zrD?=^aS7WFrvn0*n@ z#^Q||&o4niGh%1ys-6uXG%2O*3`Uo)FqX*TYojBp4+zJT&y{Bh%ylGL#LAeG`#RM? z9a2tm{F%RiKmjGPp_t^?>o?~1WJ+%59ug~e7+EvQV=cc{Z%n! zoInF{#MKAYVdpt^v$LklV?x%c!NoSWZv1)|2wLQCi0=^LiI7yLar>~7<*qUd+ z(uAF=oUSz9LZn=wpW6Am=2ldSSA~%Y>;Cp3$dGkSwId2w+!q&u~CYgYzYLSprK%U}pvN$^4VABE9HjFic z0JVZAQU@6t@=ixZ2_sNPLkXaC017Xkd&4MNI+#-^T8=sAEpeh6M)zxf zMB^)2c8$al9tI{tz$r=a%#@2STBRZha9N76n>f6L^xbGO5%zKUsJw|YL(5TP?Zc9J zpq+~&Q=kR-MBl^#Ue;h(sPrR!;io2eh&CRE7t{x;CY26chN02~`R^^Q>9SE&JxuUW zP(~B1i!;fgDFsv=3BF%|Z$92m1@>gLa6kY>XkuTE#tRU?V4c^B>1YeHHS%;^7V2u)K>$0sVmdpfeoaP5O*)t zQubh=puw*Q^GfW#1m8Hda7_8?2iX--8%Ad9=1)t%hDw`DuNwX$Na~`C7ebs6&!bh5 zLwiwG`59tQfp%aQIFUhn-SR*M#bTk-X3fTO%rhBXbT12?NTI!atR{FmDl=fYx3Wfn zb9TGRSdN|jS0M;J*2hBbEpOeI<-E26EtU#{d`U6jIdew z*2*(03$7q(YI&~ur#0ZH9;auJ0`)HSB{2r#X|;;D%3j}G5PFSenJM0bC!=wRm>8=2 zm~6eqyEVV`loBjuT@%g`>)AbIuLc5o-117G8Jq|%8o85p-+Tvpy#dYgNSbLHs5KAZ z7XAdsIHQJQ>U>*y#{lZck!C1x`=rfPpTX%gS&2XL*XVdECdR|j1YgUx$K7=C5MU>% z3uyI}b+a|Fdldleq(PK`Ej9VD9?5DmIX?DM9H8ka4q6UM4>cggp@kqw>%$|7(S&SE zqaPiTZ^4msq0)tDxq8-ggdd)oL>GegSrnN2Q@ZF(9D+g8eu>7w9$2n?Z{7U^piG?6 zOD$5^qhk%e$GZU*aw@z(o!=4>qKyiT%Ocu5!osrKjg~sy3dj<~Dx%a#R4gibWavd!sY)ARZpcf~uz7t5JE z^M_o1p0CXdJ$uQlA$9p=mLcM~P6>Q}84FU6b1{e7M~&7C`@{xjD$A;2h3R~^G#|s$ z_y6GjvW5bm@41MjH|B5m?>YqJb%c3%p{$?3$&V=S>ztF`H}DomchfmO&K=+a$tAqO z8F>tT`xL~pnimUI?LsFAbTC^}PT=zm;dNA~AU;c=R4QTP zFazJDy#CmkqBxZ62~_ZnoLqjWIl%*uUbiS>3w9eUC!aTcGWGj`1W6NKK`*KWE$nVY4&pEZS4$PK(6wrh2!bgVwx?HA}=} zAx2MdY&hHWte<)Wg*+X{WRzU`oz|;dANx-GYfm%l#?dZ+>*c|KC*yIQ=k?+_RmHZKIQ7KDffEOo4%@V zw=Jqy5H*UW*tWrCPc3<)dXDp#ce}?+of{dTxnBWaN!&;f*!Rosw%_?`X?LyA1$2^I zYNFf632It!W>hA}GC#Oe@j2!5sZQRBSc}vowTGXBHPL1q;*)GU&c<@w_Ee5Utk+bo z^C6T;1L9S#=6n&$Yj(4@5&O;P*RMxfEVWAauU@N8>XC>G&v$%ie|6PsL_fC726*|y zc036b3H;LEZr_QD}qrY(tTYPXe=Y4x{$i#j=SyJdF^vT_` z%_%+dbTM7-Ug8$I8m!V3g_v1TygUr=?|&gudv@6^F=e939_?+g`?>rWp=z0Q9wrrs z6aJLHN!E=_+x+epg=~+#x)@zacMX|k6z4MmJn%upd{j3jroylhCTW(amPG!*znn8{qadf%v zmrm=j_(n>IjdU@RuT+B^_faSNGi!!_Zc9c`Z`sK43$^qvN;+lbdCIGL1pRc18_0$b zHIGe1ONtHLf<~MT2>W&QRlSSrMJ1Q+P^`BiE(P8NjoqS7s{OWP{zN~95C+7spgmSe z3lNQ;tBi#7YU6Cyvii)T1^JnkdtmPPX?S}2g`DVNqSw;#L5M@P!rmZK4&pm_V~%U4 z%u^w`KtY7k;CXrC&w)6_G;y=J_A^He#OU)lGMQyczUMP(d*x$Dp|H5>Rb;k&8RkAY zmU9FRM&_RBj9Yg+RG$6JT2AF<7e3ZAH`#H1^&PBs!3vNx2Um)k{wQ zP^}aJpp*_Ma_b;bJgi6cX5L!NcI4Lci4K?}MeF01%B6)QCLnI^Y!gov)4f_aZ#}?Q zm+dFVew*u<5lGJcD*W7pTrhZ5!TkVGKHPnhXJRdnlnt0h#o7NL?SV%t{;lRut}s%T z|A6EC4X*ItfJ;Ee)kxg);gzZ{<^7aZ!8?C*USv_a`ww;5^65XEi~r%=d6k_|W|_!2 zhaF}gkMTElVV>ftUQwDA!lA^iRR0dnGP*ppj(?arcp#qYnsRObR8x=dW@+4{-Oh4S zy3hSFov_T4WP4f>g%OWPe|-KpswK8o?1~#62iFA=^3Ah+8Ifw*FdsWfPe)^yGnV{C zzpTbZjDzekhv1GKn1^{wc#>ed^(V?1uiO10le_K@y!Mp&@LyobN%45BFYJwLq9C>5UGWTnzXKrPMrsz zo(G3PD&UJpqdu9Qx>Y0B3?FmKU>*j{Z1FPNIV0OLn?vMtwz2H-GW!o{SUh_sw&)Fu z;yp?Xj$m&8xzRs@Irr#J)7x6acQxvhRXAJxyrLhx&bgqBe?=8f2M|n8ld^m6>CEMW@S}Y7MxN+0lfLGRQv4{$LT)aEHX>ooTud5}mFXupv ziLeATV8R+ZQSU4zpA$%asA?(pg3>v+9MHVRFr?-sSK<;5|A~zQ@(zA+_iFVAFcqHg zhdg)*XQO(?>eLzkXVDi|K*t}S$&{Xug>;yPLbU-&btldS%wfcc#qNcl%Cl>&fUwlrf468ZnB$-NMc%m*~n z>U0!_$sNP@0Jo;bwo=*w*q`)6O1{4-q}l@-@WA^&4Ul{praPI~pmxV#>P^BQFnMJ2 z{-yx69Y>PMvj;9))%mA)5+rYdzdwBxs}=#YlzYr%YE?(x59Eyx0u~YaMw$b@%E-?0 zizGGzYHAI7VjJD`S8@d8j<6Dm1*B2Q_A8OqmTy-0uEFuR0adsI)7$(9``>3r8^J|GrQNx=QjMf=akGh0B-f)8lu={<*tBwSHsQ<7>CN za7s1|m6x7Ac;6Fc#6c$oI(QNySf~3Z7`dx5=?Oy}B?2ySc89 zyWeR)di=G|+ZlZ6f1HJ!6lIBFC!Y~OO-PA#VQp_LHf)n5_}E@&nPkN~vJA+i1Eg;s z!yh@d;59k*8h`6_KGC>eNP|}(y9&o!L|y+=i6{^pP#$K^h-NWk)pZ`*iny;15|4XyCf?quTf#-ic!vC7x?>w9u82Di?L-?LTd9f>pD^Z-+O;qk4JbEoO^K__Yv}*UndRuoeVow4RH^5I45G~}gsi6Xi zxnVxSwLF>)GP#-sOW&ndEcRs)e;V~=xs31fw~aGs8-VlQk5AI7bqm`h*&mMv;k8sw zFXzJXSwz!bE?yTCe=4KbKNMn4bL@ncwsL;P8t<8(N_}$D#6s?U8hn9c9+;wtf3wlk z%C38x>^#|;z69R5OM>`Ia>2IB?@#$@yaW_(CV;n;;2TN?8OGxqDh4ei;~Q!P z8D`)cf~Aj>JPYVW!k4Vr4;Py7TX$*ibXk_N7(_S-TJLE^#0XlS(21xLwBpixgEte1D!DoX`QvjLqB z-{s1thD_qqcZyGhltgTOQ1_pXVCxHb=TP6N6CQ3KDu%4K79Ke?5w|2s557E`&{hn7 ztV|^D>%971ptI~UJnfMCa&UnJ23TB3#RX`8{dOyzsD_GGfm13lQL%34JiPT&vthZ?<{C+tj_3?W@(gr1V9_K@A);_9l zL&l;TCe|3Gf!`^r_tQ6Y(yml|cAVFqdsuu*1)4_megllhUwfNTl0T2JEYeZFyW$Lf ztabR8yIfWZU{{orw?k}8y_MP17pL}fK9+A9NTH8i%1(Y+O2UxyQd389^+E+qAV*8R zNZ+mK$?qku|9*#oPvHM%hk=)qOW^h$;l);^XD{KerfW zQ{~I(>+N#SANG5{>Pu8ly)fcJCjo+1lk>4+exqx{1QXF0NLto4_L;~2wY{MD2#T}M zgpgj_Z72sFxIbw)shCzB@htux z2=OdF%Wpib2)@_aH9>rXd)-(aOkTIvn3p}jXXbA`j|x>haHs0I@DL>^fry<(S<{ad zM3~OldTrP|G6wm6kQ6Mn&f?BX*0Z90Mi=MrejIY6O(2dIlNOV46s1}LI=^90)R7r3UQ&# z$1p4X{`GQ7Ag^mecs)uYU@PtTCFwgU-ErVYgW`|civVF!-j~>g-cpl3`VsaPzAA9~ z;!c}eL1Sv?34>Bp^J2{>daM^ zv60VQ8`Tuo>|d(0kz1vOb-MgCZ92Ey#2?X!AG=8?7WjIS)*^fL%=ch9f{8y21LRNw zrSI9WjMQ$6K-ts?J|U{1Q&njs%B((J8uG_P0>$+VWpLqolpg*qmWSeRdyb`tn`m51LsizT7FBVTCorzO>Xa zYZqB<^BdJjCTE0otxfaXP6zuG_keR_tj2&yb&3MnYg~U?h~npBI$cJey zFNQ>RJTvV5j7nrh;-7f!Ka90{q_|IPdh#O&M{Nw7%ZaPRndEyj^ip&CA%YkqjhiPx zq+3Ku;9*lXVmRf2!PT2p;~%xv!$~X;%K)6E&uq;f*)*SfTGm<@OEdZ$R)~z~={VME z@$C3J&JdfjD>rzKl~ai2e#H_)bH%chOQgQe@D~e`o{|!F=OB@fTwE!y2AeajLp2c?n?q1N3u4FyN0>Tc*KwBA7kZfnKS&u*;F`IAPy z`%2MBJ)eLXmQ(J)p3!z>ekEnDZ)d)-diIaJ^qr9I%B%;|H!7^Xft=3w+*rv^dghDR*NTJS2XabSvEvPH_* zbX6&ESVUQl_SC*-aJKNwXl-1|1sLK!G!nNX5GaOLJLd+FKdTSuu8m>mtdJf9w;_AV zefj})_6P0ku3ox2SM}wZC=GqGYc*Zo#KgUmgyX%dTU(QvRCuo4nHY{KAN(uhqWk9n6Uo{s>z%GAT(_=!ECvm(G3aT5JAl201OVWQsv* zhb1k!&QItT)<>d?+a_525S6D{)Q zz`$0G2fP;HoP{^vJIPk!sLB00;261YV4RZTDwZUx>`*sxNMgZ?}mCjEr%gZlY!ntNllZ?rqZc8j__De2Jw zX*v;$q>#KkvkaCwSrJ7)Nkg^L6z;YxX^&sfbA}gAqfa5-t7@TQTdJ%zKCBjjS(1C4 z_FeGrue#%|)T$~VvJVX%#4C0)v6I$br<@D-B$={)@!1g!C)+h2T%ca2WuIfvzVwv{DGhcK&>9An?CZebNKr9J(( zct2FDN(0E*;iZGX!|*Cyi$_bk#!!NpEMfnj_PDE_*rvR-ik`1^3<=_iUhmbXU@pQV zKf6IUR8BZjbn_*Y;;fd;i&wXb_g#d#3fyyM@pJg^l3QKRLrg}!TW^o%%I0sc^7g%M zlS^;;{1r|*o8e<^(S2}|Rg_=moyn0wkk~2?_4*?he7--6cqHx8UyX?(QBO{!Y$4@7(+T9e@0>VfI>cNmW-> zcW-)7RV^K33)Vj;;B_>v>d}8gVz-l7^nHQet%66Z&f~I|8P?wlcE8t=#eG5L-Jc@1 zEOdyM@KIX~qVM;57Z-5c%`NU_%+O=B4 z4ds#R#pQpI#qxVVvU*JT+M&TsqFvv^+ydAzipOj$D5xudYWRPF*wz)W=bBmF_eSUU z1z+vwjTO7X&ZZ9&Su~zIe_4j8;6}h{s#f#W)>rDb*qdVGR_l8h1DkkQzMf z-S2ETn&Q0qH?7kJY~vc`VwRZ)*an;HJcFRmnc3=`cluK1QEM-0Gd5bd{VX0CzH}#Q zrP4h`(mg*jmv*2UD22;tb!eM!>sM0wzCo-cR-$V?Eua1FC#_-Szq8O7hWFQ76eNn{J8LbJ_|m0Cd62A@qFP-%?QRv<6UG18P?9mLD zxnUPSt+AQdv)!g;ILX9%9&x9ff2vsz-8<7?%IBi`NC>%|v!tZgrK-~v@IuR2+ZJX;(GyHa1KUUR+2T$JCT+>~8#s-9F7 zn(2~h?bXgMIv#tnyVhJjl8Azu9JpWG-wtY71uZ9o7%qDXwmNHUTd(9 zuIK9g!ho-BG)-v}?K!2#F}9fkc!UQn0ZkjZdT$u;H$YRi#bRGyjdzLd2yYlnOouBD+}d& zpJ~+yzlOp$f|^UwyC!blt9ggc?8Zyj#?OS=?k5L!#44>>gsI<@%272OP*zr|1_4l zuy8yWu%DYi{MugBzD`E;KpoD-TRTv=Q5(Q_vY@o`rSxbHz}cp4mQnG=d3m8$2Phyq z@AiVW2A#?8%|r3n>kDajDX-@{z((b4A`hqb99|zm(I<+Jm!%KyK|RKup_nJLoB+r4 zO5BkdXbGL!8xvM89ZNMVsFRvTqJ_X#XFxWO<8ZRHm0%Lnl{6T(I2PNR z69cb1`izQX_(F_dX=l^DN6WpL>hl&2v`g9+kx_R~NCS8|OMA6Z<VjU&PmkvX2rB`bV}Bqu*APu?E-Hy%jMB_w?Gnj7h6sxqMJp?*Rm>h#>A#B zoL{K?ba)eyz*thrA}{;L*`#eyf~!6jc$><)BO(2rt5$31m%4=nxEzXLf(X*x9xK&I zVpf*=Mk=YpFF~XF=^3Zx(9GpQiw0@bMp>R}1yqkQXR~dFX<1qN6VW!{g|enK&%bA7 zKHwW4x0^%8WvVtt+QbW&hP&8Qn)0#l=(&(B3)S-5GkSmZhl1rt?WH@qxd#;`cVu%e>AVW~)9e zWIf}*dOSQeYu{umx2Q+Xi@SNLdA0p|a<4ENx>Ndjq+(kxT``iF?9I2(u*=PN8OrWA zL0i@8*MDL{O{Y`W%804GSGPPDr@KJD;B>jU;BZI2uvb(1jc>tf$f@agxg+aDz5=)k ze#S^lA70kdPHobP{nVUn$H8zphnl^XMuS2)@X=wmJP!qKZ!QPyN~@Kp00G(0$80P0 zb}jO0{X&5$=nxVM4H@7k`N&-L^JgTvtQVr(CKkU{wuJ>tmHn}K(~b7xVOrU=!28wU51!)zbnkoXniH448Mfqr94PJn0)Mce0d+cY~4f_N4G#B1B0H zckbuY*O`!9F<3edzsgT$k@?bFC@@W2DQIy`|I&cB=UD+Y>0gfLz#cBYlv()Ne>B@+ zSSsDVwzJ+8hms>Q96gQ0{ zRx8xH49zRow9Vs8Ge^|Hk<#}#a=}}|muD{TxV_ju2?AHXE&qaeI-1ep2OQGB#n~EQ z!D&D5j(q=&Zky#^9C5z>BVRjr-G&UvlNm6c`X!alhDZC<#!q}z3h7?Iht+%`l(V@S zuvI^=KHYW#M;O}*hm~RE4A{1J%&Or0HF4Y+`#OkczZIX;( ze9PuqVc$4firk0##Q~ksb(^}PBy(}6)SU9yZOL*dUu%i8{sfRxjRaD)Zzan^Wo;$S z%qJBkTINI0dT&FG*>3}lgzuMA*4|IQ(l6c)&Whu*juF~l3JJaM4=z4=z8^I?ikVMx zMqb6n?(KZ-k7lWU=!kxg-p#c`OvF6C*m)m#xkbi5BjsF%(!L;NT^2X2i|#Zfw3}jP zK$Y?9h+r7{iNOFf9I+0)pg;6ehW;X41=`%|Ci|D5;xO=|UQsK9+bf%z$;@NqJPhX} z)*neOIoX4JM75I@Nd_)NY@7#aSllNA z({QH1Nb1ua{b3^KkSRC9gBn5T0Ku zq<&P}*NxNCtEl%kaJnBJe$NYzB5*I5NWm9p!5?#Eospv#uWyyJ@R5-RFhdy8QfUY- z!44|}cpz#OfWSw0s3(Z{5xBO71Vp$Z5YXvOjRjdgrm0Pi)?6i9y+L5e9CveK_BR1q z1GmcAL#HCc-V|>ObNS~?Qm5vczvK!bDZ7=~-IH+)tvTp1et`t~9Vu^~Gw+KZGp(lk(3A6jk~xWlO2hiS5lO8^Zd=bHlb?&(aU6$CBNtqtSv%%UMT(6?szYNk=DA|` zjZlq?+A)MVO!>9i;)Qj5eGyHm=IMP27s3hyuJU$j>Fa6X3I9UuToZh1W-GxcVi4k_UJOHPF%3^wnEUH`8*>#K+kg^w#6?pPBorsE;R}KkMaEocoKgTw&i>bwm@cNkX89rCQ5(!=3vAvqf zh-KSSOmi_EHeLQS+Q55N3=v;=7mH*7sfq1Z!!sFVW%+0QI?Z4bh-$%6ZyXuiHPh#p zkwdYaG$HOU4X5RshaaQb{{VjsJ9L~UNN>RA2j9TBl86Du({$KpimyL+%+mac7*IPD zE_on26ja;p4@@CJ6lGkCVwoc2X?i3-vz~!OJ=`G@etNmy8TfMX?eS^_@%`m(!@9?? z{kiX%@RR4p`y+eAfv>tuk>lI*1pmu(q4(2e@+wc{ulG+lFK;`Ah!@|o-XB{oyx*^P z7UUj)_qNxy%182f4%An{<1Xo<>Kw}_2S#Z!{xL0JJZ|q<#XXi z>-(=ALV~x;Qef8C;NTjlY^qg;^$B<&*-?sVJidQ-Ny1w25a03yA~@twdcG9DC||$ z`rX4cOa4JXSDtF%?;QeEAya{V=H zC(b?38x$V2)hgw#a**mZ=ZMKGlo>s*>!D%)Rhws9g)Z;x=$h4EZs>}il)2ypVn!!c z#_4{ojN?OgMLt9O;ktaB^(?w3^2f!X{23|RuV|AOUrk~qTvbhBWdMdX)>yr{d~G%C zuQ6B_389oi^U{+vp%8^}?KPao^9a2^S?dYmP^NiZIE;C* z$bPy5QYLFN@KH6hVgOY&b3K})ihC_eyy{72^uD4W<$DJbXOh%ozZP~_)|ZX%L9dA| zTV(27S>4CC&aHuSNAA2qb4RbP@TD_nt_UY7_xC%3Wjn!mU-a?$Z(Y$&9`pukRR<9H z3HrIeCG41$?F=~cMmfC{4cw>>M8CQcojgoMQPvih>T;D3bzPyv&W|h{uo3PId z=S_cQzGVDGYAL=LS#|f}@EYHN{Wvn#9>b*U5D;5-(0^IObCvu&8AQB`)2vr7ft-3j zs|Rq?^GBa=O?7_pUO!@f<4-o+d8g|zb{~4+_ibkp@qEd4bUeM{{fhr?Qr;&Yo;Y6= zEO|hb)bhd^?G*7`H1HI)hhNHr;Zk;H3tL9gbP*9~}9TS(pmNNxtW53n!p+{(24AQn_*CcAU|HI&Z=w%<>V;{W%S{+u; zOkL>E8}*7B{16Gw5FTp{)-PLx-&SJY*>^i4-8!r|FQ?9bE3HbcPo^%T?^c6uD|UBz zYfSHr#0Nmdq6|!|jcH=3w%TYVD1%nk+ck68-es_<1_|pL9N`0e5gkGh?@5da{&g80 z*1sfh!Vd(UYd$EmOxdN?#@J^FZhmTDYW}JV#1q{64)k=^VlBd1PFRoXs+SSY!MrCa zjZU0OL?D`)_%{tvZW?NK@NV-=Hb6SjXfcMellv!k6?b?%_o*|!b4!gb?ln07;=s#l zFz@|y2)*<{?S@(=e&o4u$}`eFL)oHO-XE!=Y`ee23fh6Ndo|c@{Q%acjwhfAai_Ib z3J=Ht?ukdepdC!mIf0}eFqWru_z&~j{a?lnRjnvzHAw`$^F;ImQxISB~}#`;w{3~o62QxK9$Qc8o2#+k%=m}_Le;<4Uuz?RQ$V(K}=RaWlIK^_DxS_ z1@Oa)bEdyS4{L@!!VEXOn0L@&z_`CxMVik=G0^|iA+%;D2>XQEI zK~|8#SqpzkvI&%vz`=+=w`|8a;xYKH);_gCy7zaZ7#D`gX}dW!6m(Dw7ge9=c)0S_ zzJ0@zREXA&iyx0>>Q8Xc3mNKrgWid;=w_UPngA~3Xad(gp_HhXb!d*-P4D(Pf`BMO4rxv^hq8=UT`1*7gA za}_dRia$3gr1TJPYbCg1Dk0HV=zQI?HC^qA>3z$Mh#tJb45)epMFZ^)vsxhA7qdL? zJx5Z^PH%u6uTu!}S`H|^yo|EAhtb(u#jiYfA~_b;!yh>B$)l_mjDWm45Ui5kZLvLy zVvLU5U6q^8sR>qO&xCdP{cXu~(sXj`+}7o%18+4?;8MU&i@y)gv-N7@P9y&6*wt#( zh_fx{fE$lC4>T<453lnd2kh?W*<4wjYCIpZb{g>c&pxzr|#L187L!laDv_a@9D-SR4#a zFV%2*V3^EopQ`(%*doxg7%fh5YT#re;RvRWpZA-nBIsp&+HnXui0J4{C<2i1W@^PQ z9M$URf1>;mf=TIjNDPan%`)j20;FuUZ=g)E|dP_s#Hm;gyR&SfATy4L(f zAyjDmLw<0T{IcLG3;WThy{K5d3C!MPrlMPau_sJJ&O(;Y?2LRO`}FNRvD43+{I_$N~AFL=wi?(M}bUg%c;x zL50WaHm9JfcJP7mB;>ANRd}AfeGs?L$b~EjCpsucBpE+9zL3bp{I2BvrH# zK>(a?Q|LV4UrPp)taAr;kjRIgHLae^Oy8+i42sy!Y$G};L>6_SapCm*i7f#E@IiyT z5~(1k0h#tDl~sF44S3y2!i)CM8VGtL#HXwQnL$-ENX|IjvcijI&^+*Zg~Z&5CY*x$ zh5y}X2_V>>KOjaL*tVn$I18xCjA_c$EhVx<4=DGmQbKBg?N;7mV$E{?>ckG2`v8(T zAWOy1BSVa)$O($(#g&w6^aE_cGn5%0ni9ENQp9b9&uVL-{{)q?En*?~Cf?O+m~Q)S z>U^R11XcD4tCAlkcQG6M9QC;hc9qic8~RWFP(s2k{@qKm2*No}l>X=jKA0Wx=rO{+ z7nHSVKfdtu1D3Do-Eu|*@Ti_R;MrkHtct#y3d9eJAzbi&kW(N0It;UzP>;z)TpCVEUsWc-Q3AikrR(}<+NBL5K5HRIIw%@G7={!)K{TtkX2&Kwo$`dL39QGDp- zpg^+Ic3+A}3n8LIA}y!i`|CdVSmiWjQCJ$%1Pvb1N6G=_Jg5o>ddP!!Mihp_k@OGPB9{+5g?CmaUo zdVqo67OyHN^zUmigk_UxGpc?QOO^8-U1&cbUUv&x75Y0Wf^XoA4za9yNIV9DPhh+b z@w_bOGdhA-;3Ch~g9_(8JTNviZ-dAbiOKGm7VjQb(4)Jn(o#W&PJ-(O9l;~8N{d)s zh4TU(pa4RHzKISZgA70e;YLP61))N|LU}}umsGO$fuyTMc>4Z1 zfM3yn99Iv`i*e?ZnUFi)M>M_#}aqF3c# zU^HNI9s>P8>K{X3y!ziE{{;VE(w46BzbAs|<$#7|3IBI0a7S%RQ(1x;2}vgv#EqyO zbQ>3Z6lG(iO4X`K-ut7$vW39 zi61*OtV4yEKshKPEwC|cDKFr2fc1+mEb!Vc{#;`&NDA@K5^e!>NsJ4DebjF+EH*B*< zdoC$cf%Q(k8^(+Xz=4nYj@8i#>~cSUE&)hg>d+2PV3t zv`($$lVo}uf5TN8nR?!FJlV4NBd7-N=i<2u*zTPH^2O=z3uKE)6G6vpM-8T9wT>$j zpBxfBrROMz8ly{UW%>$^Y31$CSd7%k_j83OP#pHEBSq5~xNqq`-`fRfC)WWzC0kYu z40Mva!wKjWT=}1E>yFigE=(XWkJ=upOpe;#7W-+Il1p?bo>A;?<4#+=*%c3pJBWzB zD0mYZHOhehIF=^4Bz-n9>zeIM`Cv-r6NDmH88As(eIq56jv`t~ge%qB8h7$TWSn*| z$j{O=6~+_`u6sA};Q@FJ>VS2BC5ixEP*=W2RCbqA%_VUaB>~;EszH86RH{Kq)Rg;A z(K7izFh1!SIHNvPL#F{+7sa<$wfZ_^ha+A^gd zifjc?sWz7?OG7FBL4*lw|6L@W_HX@<2}luPE*rzL?Zf|D1-bXr*5D!88+~>ujRPOKiuBMN--gVxz-_kI;HtVm(Ebe}QY@XYU}bg$q2QtA7UKw_Y@<#b8;k5Wt`g1rKA`6CVyNuPQIejma1 z0oP~1XOBMUKHw4#YyxnO`BC2%Y7yWAf8(}*5D>$iVw*Ybkup1cwLZoo3ogbj#d^&#)^$+%Npj?)ZdT3Ue z6G4c<1t5dz^$K7yA&GUj#hTgtCC0VIYT4w^;l}uaU}It5iP5wHy#yd34R!xO06*3r z%fBF&-R2(~5d@@wuHgvo7NXdLKk}O{(6{(XOt#f3B=i!B^rZ{h8&CxX#sh?v{W~5y z3;|fU{7xX*O&D<*TqT9Zz#5_ihWkf_0;2~^g8mir+x)NaOEA)%wSPrGf$>+lnIJ#- z#vWSVAdp^yf$;jE%%}B1RY@ksfyqUi>Zs?jslz011qA zplhFA%8&$W2tsVTvnSG7hQ#kN5(ygD%(`c_ebsdU+`Z`v!IyW{ReUQM_rla^-8DD> zCJmrZTz0*>+Vwaz=Ze6D^XH_1Fuf8XofVPqM5?jo0|z(Q=>r#W+du>h4o?C{1O~kic9ZxOi1vk~!`_;~cf+hnXw+2mrk6ic&g*gb+Hm zmk^Zs|51sIU1rLw0bleCRzk{_0m)-KdpA7REoWkM4(G12WQ-xbXwTWaAkbuHn=;dsh>Xu=MuH7X)x;YRzkno4#*6zF2==g^n^=lBmqix2tSOMe*llC_pMyL5`82=T)et2AjEXR#M^e0WoV+h$eo%VBx<6!e2%3Pd|@cw}d^MQ-wo-6r<`*&%ajrVS; z`px{ZQOP`wsiM6MoB{#K)Fk`x5B@ec6q=)iAh5DNeyBN{;8dJd{_##*od^i0oBx0a z4Uh)o`8NQ8{o7%sHO^tZkBf1umkZ?IJ*xa2HnRRBrb-y8Zd4{Mxxk;F^TFSrpSS6g zm*xcL?ABiHEn{f12XA!A-Y1*OU1}qY=Rme^#G6e>mztdXbQy#gA-n0L9;$uymaGq*oG@^k$ms2H4elLgavxBebbB7aUCnO?GxQH4*$*fecMv2 z?GD5U^q_;CNJAe-`e+jJnFnfE};0%&`0@b#q z0>FwIuH)Tc;WV|UW$!onC(J$y^?T~AX>pFz;vJwz-M|jG1+Lx;4SNvJv>moOCoT9m zY4h^fWbBow&94RS-gVn)Z*f-IW~ivTB)>1L;BS9`78XRhBhw5r{P{kmK9%a}-=~xS zE?2Gh=(VmIcyq`Z6xD?5z_D*Vx~6*Yxu|oD;Mn9_Ev}_+vN%>dlc&K$KMi6jZ`pO# za8E~(9V^~%8Q@^B-(PJ5x8ZTsd{}&glO5*?>OtWyY@3vAq;Vto;E%`;Fx*4IRs zGvqYKE!Vq>sBsGAU>q(|59MmV%8}PO`!tB5qo%jBJ?q3j=|h0!vYkR*L^mb9)RqJf zz+6dcs=0ILWVD(8l9d+t5dUsV@`f zl}+UbPvIpf+3c(PWhf@jVpWLgV(1HWL;D>W0WZWZHCX|=8>}RC{!HaNO{hnKA+PVI zeqdX1aO}Z^j;)lRnZTi?Hi;IpC683dXCXOPS|)^9&iiDuL`s9xob8=X7<`l3d0RJr zt(8cvo%@fJnIACz`|xF9XZio?J2qxcb~Z*CBWn{!QzjxNCT0Nh|C)+)>ILJeICuBn zbl;}NyhQQLEV=(V2yP?>JWc=uG_?$x35iG-5{4{*h{x9lIyZ>KFAuanOhRc=IsE5k zjX-b#M7XpTiE_Esnn1x^14$j>$@u8I$A%1v>g)US4Lv{p!uQ z*17=&5@{|K8M9S3FFgn2x9)yOl7cwA-ZIP8W;IMLzR{ z-j3`y>eSaAc8O5R)hAPFwwVttKjPAmtc31khpxN12x^S9cFd2vf>?P$V~(&1APDax{_}i_X)ra*fi-(U5c?G_OJXH>!D2 z!6!xx0-ru}z3n)TC8k061T{-RSW&An9%^5G2F^CMD_apAy|~}`!R094D?u$t$Qp`? zm^17xUi(bXnm>cH24_C&_-o4DSDw3RSKN%;@t#-*!CiGWk;jz#60Hi26D$QMVGcyY zXGVmeIaoxiZi->KX_2%U`|abQP4GE(8e%Kr3)rmfvh#y=zF!6A-`3B#PNVWK=P`(E?LLOatZ#raI(t1!6j za?m@+PO+D}v#$7k?7uFDym5Tws-lr#^#8*Cy%p{blDGreljd~NUkuEullbdrYd)t|&-Vyacgmg;)`yl<^aM4!@MnO+F)L)ie7vcP ze+_h&!e>=Hln}4qFgQ!#2geV+E)aZzG?X^WwG3LfF5ETPgh2 zjGH>3)FEcR{5qXML{L!&F{30zRK$UXQhfx+In|EjY*XCJ!qIYw_&LIsWQ@DsF%=6f z2>^0g$*=MWj(y*EX_TZ|YS>wbPav*1P$q>i;J@3?T1_37Y{+p~<(!uYXuW%2YL&k! zlf1XEF25`6TzH+9^63gt~9R_A>Prk@M%HgcIN!4N-|DWaQ{BrkW2soL%e zCRB2Wx;Uxs7OoUDQ&26cOE?I@0byc%2%m|Wu|s$Euse4+Pv z*LAaG{7Ioq<~+cwA3gFsRb|}#Y2kdY-)7evy!AxmmLQgOT9mKN@vE(Pd&}5H*zVm2 z!myBVl5VHHA4>SNDs_xH4UR+Gq8~9e**dJO6?V{BesIWSDW22dax^%~NZQG575Tli z#**4Q)CBVc!{akA#S`M5}`_Qwy+k|V$U7aP-N(6kDW&&JA9#jGAb z<*ig^+i6<1jaUj<{W{8r&y{CuadZl=R@gqFw2lSAN;zHo(TEz2N!6=6+<|^^azIZz zf#pzIrd^R)>M0&ULtw|tNHes#(3jjv>A%cBj$@GRm%u9cv0Pd*hvt!3C6HKCqOo6m zr+`yhO2?kgLBcG}}C>PXDwWszg& zJowo?HMX%V97iwO3{{@bf;OJc-VA8YR=s+e0i)R$s!TC7bHVJY18xC^i=>iVlfT zk=>YP*uVa;OKaXVFGO%nf(buGMM5f>F6oRDQ3<<(O(CXAzoBBrJ?H5!sPh#bHpG?#p^1%!mVHh4kz`;DvlsZ?a) z(#-aq%XmGlamxYHJNkQKVOw((zisPVPowH=n#S7Y9H?>}-ztL?Z@XjeJR@vn&wl>kpu?J6=o~r9b!w&;iRB`>v2~j zhrkvKq+uLH>O~q>YD{@zG;C4BqNFaiwbh~{4TPo;?s|DORMSUgM$*s5r^!s_ch^3n zc!z`Eop!rZ^XF)xq%>cbnGO4W%2;yv$cn5)Le&!RC>Ufta{(W;23c8~WdbWu7O)mL zwfnb_iI0PJ0geNJW9)(9l!A{|vU9!K^Gj^~MqK&ztZYR~FrSG}fNuxvzdOqbA2I?i zk94ASpGNz$>;it(qv4=~_DX#uWylgAUB5~lcUx)0p<*(1mMblO*zua=huIhvhK z%Mq^*Y^jK~aUPUzsaUPMZmbyH#P3m`fm%PdhuJK9v5%6AZJ6~q)wD7T3f_0oQGCmI zDZ$P9yAfu*82FnDO?7xeuUIbIIaBn}M71shz>Du#DcKkk&d>sUJ0dO-Rh0sOVKuxw zD~jP1y26z+P11kbwaS2u+A31YtF6n@ka=ZpV)0R?_Z!RiIfO0|=!E_z5X7*^Wl~w$ za{3~QR=iV5t^L+~$ubx?X*3)Z;6F^9BpNqPN3aEa_N}E4D*;p5-+3^!K|T@l(&fEV zeGydWo%x#FYgJnWS!Qyhv3#m;rzF}6)yim@pojn2LUCyOY7to&z*Gu3Y`Xsa7#|h9 zt8mTC#tfCR<#Ahg0fW=NQ*(?bmrc5UZ9fQhV%igCKreR;U9wa>12;V_^HL;&ay}2u z1F)4oy8UILe%!Rb`A143j%dpqJ;v^401U~2m@r6R72Wrcr{#g~3{K8$*fs4*rrCSr zJ~eU{N<1P(cds;%XJE#G3VV{GRA~Mt3MS^ypwSKb(S}LlJbdgB z_h;vu_76&V%DRIc{EzTox6C3^Qx zKuSFRjtI=#1}l5a8pFJVC2yd|W{r z+sM__#kNJT<+#MU#GCBg5HjDlF=rH5pI!DuO|wA(E`G#z!vQGch!MM4=xQ6+2{x;A z#KbtjpT;t=j;S_=NF|ew3H>~JbDiA65B$PlzbQ+a8zqs-8g*STdR`U_-LZQ<9jMIc zT`6v-exDG%Ss4e5W`m)}I#Bo{Obr}*H|iRn{0 z1)cLz6_NEixp^uQxXOsLqUs3hWB3cUl;6PfLnYf2sJD9F#7!aV6P+pKp~K73IUH?b za9+mO0XTEWG0~Tlp2@w#%hK)5VU0PB2E~K<51M@3gp}lrH<(negs*NBS5_r-T zkd!C`t)f68g$oKu#N&1nUtK?c`(#>GZ+or(BSHLz?Q$B&)eOG1F37N5O!Kyh&hpvr zzDn)K-+z z;Z8e_-kH31{6O`ml8(sPE+Fs*6z%x?OBEL{mhI_Jlr|L<>0hiZY zcyy(T0#Dc-<#55Cfr>g6WG?|uki{b?5#pMQ+--!(OEza4W;F=a5teEPGE)F6Q-G9m zQh;@uc@uBbZj&pAuqfD>0&e3+!IXr9uTdvgC$7(dkNa4LgMjRaKgIb19IDs>Bz!hp z!Xu1k>QBqneJPH@)Xe>nd@D0LZvW5YmnN4&QZl^`%9asK{UaoZ-*6t63S-ff3Hlqa zt@MxfSNt6{?hjO(m&UCJkS*LmTf&(QMF?mqphiIHa}ntI!=@wrFuvk=gR@rhSV5ME zy6^;PAl6dJo#foz)UnL-7rJpRB2GuCdKbDH&0D?FlSSjzwWm4P-YscXBFE(+FoJQF znU(}khm}S16&70ybX8cN-1*_vX(zLz~W*3d@`E_B3bD)dwUe9-O$OlTGcaYnqrA%HOK zl4<_MHx?4@0beS=y3ER2oD$UA=(q=JjLo=q5PFtBkzUd4BR%u*=x8~GynaS<*&#N= zd-k|fBu?&EYFew;W*43z4Sa=nhtBLUa~C_E7K%nQ5EHOb5n%jy_nkum=`b)*F6l=y zI>wKqA(=xbC%BS|V;okA8Adb2n$t+A(ypyHYBpJP+SSrg$5jd~-PCo6oG2%uCy(j&N8`G{Q_mx0!yG zFr+E1O)j#H%qh?D^|Sq0UYFlH$JWvL>ME(jfq1L*^_@O)F1#OBL}%w?N5RjpXwjHn z=wa=!qB=WTJN4}nAMc*}8Az3W(wab+A|i4STc+DZRZ6fnM$hQGM$kXHkLclP{gVGV zQ!chhJ1dbxHOw%LuLD$a5t{wuc^%H z5~TMyd7?jzK>|NuWAXM{)d;1%AItUng)Dv+51UV_s6A^q@kqL)$omvGXUm11<`|N^ zKX)R6-_hTC6AeS`d3Ti@!IMmByGPLH4;*5>hGmMEzdDAvOJoE5CVO4>_U)!lRJXf(J+ok^_Ov)9f)$ERJX~yS7X*-RLV`veo%UkpOng@ zP#0)91mO1dJEU7D0k_f;4?Wz$sdMLWni160eu8KlCviM@<-f}=M8lCq1!QTv$Koe@ zVzNIBZ!+PxvL=Md)nt5=oS2jz9nabvaYAn9&6I8&f2Zl2kw`RN7Tc3bXZ#{wISv`Pwjx_JM)wBK)YA%dzdx^EcEUFj zeiHBEFZY?h#J8e24+k6>`MOA$n}pYkS|nY<-@tV8 zE+jW>JhPu}UO1-EdV3&My(!m%WASt2Z=o~`54C<6Y|+6ccUxL=w_q&XowEP>urfkm z+;+G}{)^$6g}uSMijk|qs^S16qo6l*cwA+B(jBTJIJ@@_8@F3YeAE9G_Y!uY!S>maruGQLJ-`j5r(ey-&Tj^0N1WUg3hjjZfkI(J?l(b>_FfTY$8OG3%ln|3XhG>=!7 zv?#!jqiG{*BX6ViBJm0wVN5qH&7kHnEacVBBCSlih~G%wSQwk;t9;H|&(|sGki3|C zhZoPc3v%y46OPwQ-^$riGGNKQ0mskD)_Fnvc3M{_SdxS=shq`FxLJHC+IxeSMmc9E zLbEZ_aCxH2NSNOu#vc@|7k}7#>QkA$-||T58KF2}zQn5DD-NkXGcfWjAhn0;sQf9c zx-BHBa!S1F@;%Qa|?5-*8cU^CFi`f<~P-sawql>$!6E)ST@O)+k*!}Q#Rl- zL$?jLRAu}_gvrOdH_gSCAjX|ej;Q6AHaYdpVvk17=#rL@Mni?w&E?70hPa3Ds!GOs zpLs%-ys%CLniQcVnMn@pd;1*AkXmfddbx>7{V?>SbbOUgMUUq=Y#Fr*!u3_1LUs?l z6wH3S6F0ATqtoAP$S$cOvOh26^|jrKFN=9BQEb%DMitKR>ssqnlx|TvvAtQIZ+UOd zJVZ%fFt%p)#T_yJBoH^wIEQxI-I!vfx!E{=r_c3(R$go|W037I0Sre^_83ju4c~v> z)_TJ!#^2!+Re0gQ(MS!&cu1Z!qcN($2x#!ZdEkT(b zJ7^d)0gz%kb~5?th$e^;L{1qTm%0B%iZMZ!*;`ZH<$J<#XL^SavwZ-4KSq2Yc(CV_ zRBV*@-t<&*{@_4gBc|emKJG67e&7^>Q+#c;bYr@j99^N%FBY)(D@& z7F?p%gF0)SidFlgLgHyM7YES>Ow@l8Wo{}Ha+&5}B z*sON_FUX0BbE%9kFu}J3_y}J|HO(2ETEwHOHrcT?fr}G=wO3O!*U>%?i9P3}rr;Ng z6WgO~)p0G^q@-Lz0dC#-9OZded=b_DDMGJdwr9cA0J@Mcl&LfFZNiVw-K0Wh zVA9XF4W!~j-Rsy8f~ z{Nqe!ci#TT@gMSI)!mC93nWx!EbXd0V@XqH%wGkxxLr#4+LneA8_6sp4OUG06}Cmle(j`Bup5|W*)=86x%yf%&S8d z5T=HxuZD)Ghmryg6J}$_7xO$hNOB@c9;{V5ovxvg6WxhU?J))8+I{)fcV^X&2-GmBi;Tmwu zd>o1e?sT}&{G;aOJGLzC-v0q(K%BoTBdsjk0WNnCxJVvtr6f7Q%3@65;*8*ir4PX) zw++eg!8ukMVMh|hBCIS?hr}EnYo&Mt66!yFv3_O)YqE3=!IOGhcUEi|2u7NmoRbxv z!XhLFPv@7F<>%*`&*b4F99}RwKQA#MUT@EIuuOeId}4my=urg@iRCl)9c63o+u=Fz z^P4txvEoYi%!(?YlzIDC@324KcNYpaqo70xtKBo@nfJc=)Um_QKFyw5_2b(*R_)r_ z@kNI|?DJ3A*8AQN1<$Z2SN-_bRiZ%5;zs}5y1}@!R-8gcGi{c+e!VVXW#Y=Dbvf&D zZ%TY9_boE+NdHM9zd3i~XudJ+MjP)n~^_j zG_T2@Y2|f^6&5}swb;rXmO%=q?Cgx}9FvJGiHYe6N@Aj-95!Xgn@rh`p=MSvG^0cc zx7?I&pWPhS9=9h>%8hfy@whkBw)yF>@&3nK zD^A|KxS4~;6cmmw%-0)mC72mIb?1w9GmmaqJ9w-eQ_wf%DEo{>ef0W;FJE$d zb{zSI&+1bywdiWiqKF}Uh?$3(;BGNT^LtFYB?j6{yQSGtUjO-Cvzbo^^I30nw8ot2 zjf~Wo4_(nF6Q3R(WsTxdkH!YA7Bl~!EN9VS{g%hsDW+hs16O`xQeuLcU)X>ZBXjKF zbsLV(tUKwO!cMbyjvm_KnfdaU7heC!_jjLB*zJ;9`EOx&GCix=Ju#exn=H&?l1*U| z;tP8QeK_OE;u~28k|kqOY^1@U*NN|FX&7m>reyNOqN`WsZIB<^S~T=PRqLGv!?zBL8ntEmPqU2m>eqLUFuGrMGVr-*q7=bOp7Q>lu1>3fdZS$=- z%WmH*=w9D4aj*9I-ew!|6l$V*!jc0f9El!*o9kT;?U=z#tdvY#LWcB3hLXuRr7y>s za}Rpn6E2P(u|)u`>eK+nFBi+>^or4Gx7b0WULIieK0B?J9NBo+~~rCef3x5 z6=Qn$t+>Tem(p@2tSM(+zKAcyiau8JOG-O$mv|kkgCTa}sk(M3rO55K36Gp(1itu0Y^+lM8ndH&NWJQMQC~K9qS696*J`80cn&w$}Uvk&*-C?ww6`rqfph;Aw1u|p*J-|mht=3f8XE+xMBE{Snzx3pj4 z($&P`#g|wabWPF+#6Q4nefR**+CA&gSE(82fWXY#tjlpWT^CrDan9+%d82<0CWsyN z;qAW06y1kk#N*gA-T%HEqdSgOA)WcO^CS;^i6k{c*2QN;Mke8~^?|km2*#BnmVmGr ziVzY?jEF!QA!L+`>EDN>4I^~geUXrxXTkJrc_!Q;$|hxN||a|Y*-xL8n+~2aZ0mg zEnlO*I(%L9X8lgX4)e3guk+XRuZ6!6ojPDrx!M0QMNkB8&kRcP{~dEEJjj1Wkrc^X zu9z7~9bqn;yQ@Z&e-Kdo`HZmb)|iNh2rqN>&WMQ$4-YU{CcyN} zi0L44Y>hxm;=iTi)UQg$pehAa56+sP zPLI$3y3gl3@z~CvvwMAaojcDKutgs&ya_RW3J)${BF0QCN<>(XX<+32jH%yS)X$g# zz8G+d%Qiz2r~Jk84SXBF+bBOOvoO-@xD=*i5u80|(!6UD_lcM|Abb6%wH@sLkai{T zQB~*uo^$tY=FXipGn2_ol9_B^Lc%r>%e5*#1ca&tf=t1pU}wxmkUFXfsrg&JTD_nCSyGThzun*Fyg5SpCE{%0KS^=@vc)| zKlc|O)?dn9`Ms;ketpKvbKxGE!Ma5lxdg5njP)$pXXp{XUznj2gYx;P@R=nW21tnj zpCE=BCOae&kEtgLRyTnx_cjs} z#)T7VritkZE!peC?s@iGs_Dlw5&^P}9D5rangE8X;u&GW6zFJw)7gkslk<_Y(UVzc zjOWJ-JNajYo#G49OL1|M)~cQBS)^UyS#B=(-)QbKKZ<@7I~>)XRk!qU`na-9shuugeMdq#)%w2C$+QY8{&=QkJ zJMpzlk}=R&OY?P4z;p2>cm?KgAFhO8?bfHMk>*GMR!8ucS|>PDh{SRSd@gNpNwe+6 z9Fw)=m=QNhjf5dQGjNy@!B8bw%kXmTb!;n>L%C&OwPb4bm?-Kv0j{}gG1dY)wcdbZ zy@VLUkP<%~Ol8J^Lb>dhI7d5v0=6iKoOogk4yPZw=Wmi|9uKuZQ&0_0>9ex^JfM@)&z|Xt8l|;DXR)`W1oI z`r5#au}5@;JjTI^2+oIyB9O+*ort8Wbu_9=(}G;24?oP5;EOC7u8xPx)6F4zVHW9y zS>y)H_PNPRk~kS5c9iT8hkQva`jS}mC9yq2eMbf{86$(?u8(Xd-_NWc9_dA6x0Sq( z`p{UQ0lO`=;2G8r>qWOa%2h|>dl&qV)a433p#K0dBj86w*KAcQsMj_=$%1u)8nqHQ zLTyBefTD60n(kFVce)pQz400jr0t7qbco90L8?)4s!@&gO+={(|I5P4p{!2i4c=f( zL39<2XqZTr48-XzU1fJJTJh9_S2s-wm}-0P>WhE8F3^?w^w&RodC`IkR<6%~{N{55 z=(@<=YqqYuYE$5T{Ijd)uUxe%+5N)8Z5PbF_oT#cZrPpxpMxad6$Jz|_iI*t>~ z+r?-D$LwM6YS9J9f$**;5nMqo_!d{-UEdjZ|DWr`Vi|3ZGGOrSzgPmM&W56(hxt z)F^Si7ZV#*^}t958#sx9=);%EcR)DML%xH%J-uihRlWZv+=Fjk$*%ZobDS2GKK;tfk}%ChCdvn*Fy+Dwacpop-K70@g-t94Az zYE~wzmB(Q{JZqQl3K^uLKc+6$qj9pp>JXPSZYR`*(Ky$Y)-^RX+P)M56x8Hv3Rd`7 zAHo~@SK<5ac>ejW{3tZ{5w_>VnUCZ*0dn8jzX$+ zSMY1jl$s#yAck&(;0^}CsOn@GQQV^>g2A{+oUH2QxI|p{AV!P;1)&t03KTGj`y+ry z3>j{te=mR>!MKqob<NRtT1jhIO98GScGC&1fmEd zf+H@5Mb;?71%uu=N9k@{_nP22w=MQ^uEVS+ zuO>UO^c8pmO!GsW%L1-3!GK6Ik28J~ynFG=t}W|kuB(3h7W_{C_Gznb+l{14Z$9#3 zKk6{n-n93@d$vuR5W;`|RsQlh`J;b$;kIr2;r6G3rUk)omNK>IlOoSq=0#;_E@Dxv zI$`NZ*MUyO`0_+RR}zRx8-!@lSj$L+4Wc?>>NmqQ)(Sg;(Y`nK8NYQ^D0j%%nx7H;5|8O#BqF|x=}r&PpLCJ_q>JXyV}BFPPI&g}h=c#I#L3`P2rxBZ#L1f8 z&a#+H%QVVrSse9B?ec#y(?BcdVs-+oEC228R>ZOv1U96HN5N@5<8Z6ItH z7=lf0!5(8>GRg2$TSL^=nkG0I6oFv{v0}7ojya$0UY9>Kd9-&2yYh=0xno<_-I+J@ z$9v!1f<8qr+{>`cIbby5gQ5jO_$4W4n*NoFb`@YM-ZPY{Ps zlN3jKXpW-JOLCaRbi8grLInDuH^RCJPS)LvEtniz8Pv$`L3+d>HM!tmE@Eh+gZQ9B zq@?8JJGRpc5!?$A>YWR4 zU&QLCjtZfg(4^3$%t7sw23~GJS2I_mtGG+0Hg%bHnZ7)H6SEer<5o-8s;jis`px0r z`JVTi8k2}H8k}k4NvLQrhuC$Z$gUHvUH7yk+Mkt?e2R$|GId3J*A?wuSA+s}?OrPh zDBwkm*YIL*FS@O(G2)tj#5Mhhn*@opZ)FkNix+lQx;s_6J5{<#mCE*@8>%ORRuBi* zk9fiLHPpe-Q@g>05)?hAE_0##;Ui$73=2F1{TE?&C$ z;Iq3wU9@D)&H1D6ypunA+mBW+y6E~F7c9JC+@$sAT)TP8$`y~Xv6{Os-uUMaHZJ%@ z&9J>U>>2=?zx&qb(76|_x^C|LHLFexOkF?i(T&;*0o()v479QUjRgVLhGzGaVrs1nP!Qn1Kk@ zC?~-;8STAwxkie(jdZ|4XNeIR#DBg2+d`h9=pqK`l2uFjl8@Trx14q8xxR9$`r;E= zXN-$Z30W2Ag=SVPU>Ap$L>E>pk6xWv7riNQPw4UJuIQ(sgUO>w|H+~ILt8@ZxS9(D zT%DNanM-(8oSX!`KHc_)UF5W7r&JZ`ep!+3m$|x6WRzvpqW#o?qlNv{qWx4f*76M{ zTkD4rU)v47*0qAPYXxc73exSqf))5IANH-U8)60E0v!u*^uIv423_DzrV6-K#lZf~ zR8mN~`G+=?Yo!j5Q$4l=gfTCWD(VS~vk(ObXw#|h;ZY;2i06Yf1B!3@Xl5~k+`=5F z`qC|-tIj{?>gl7==$%V?P9X95TMu2i{O=F`>d*LFp1YaZmm~^PlJcn(zGev+T%U_UyfP9k@Tx?;Q+-R&yEJi(yyZk`OBhqKt)R zj%`K)r{HFw-3%rb7&*J?2uvC%qb+qx_M4=ivSbsGC)(1^aSkKw{IWYx^Lf! z$7nYLt$ENhdYA|38SC5C>(o2cht$I=4^x^^#wZh&7Ue>vTlr8CRmCHcD-oLof%kCg zlM1PiRPfCly|`-`h8M(UP8q9?wlC*t zrcDqqqSY`=t6}vdPmV|>3|`#06JyyI$&3Br=Kf!9X7E5iOkOMB2Up|4YsvMTQVP-G zmqjVZ69ri=+RhiroGTY4Aq1|FjnK4boUa_SAp~|4RP`C>yGPuOSaUa`!Ht6A<}gBT z!rcvTRX3HQC~m&Q6=aWl8SWO*-m<*~dAtTqAAH{B2wzgKfeD#vr96mo8lEoejRs?( zbdfyIxPe`7yu?2*>^2S?s>HXV7Cha!NZo3Dp?#r$;gLCw(>V{TDl*S;n(mPVQPe<| z1WiN?L)wJAG?||iwE%pCS(a=Il5K2~(*p1UI5L<(@Ecbn z$y*aYm~Er*>{(r$mzBi6fy1OF%4QqO+H&8J7AgG2o|c4Oc7&xZmLvv&$x9l-c8?8B zvxCM~pe9tordWT9C52`dH~j(6djHA(Uv7E_{r&EVCHER zMQwmc;uFwiAB|oAVpk_Y!K@lmo8!2N6)hDDD%#~$vhd^RW&BbZP>;V(6{y;I zgi2*#kslZ7`^R4|npu$+S@xTW+S-~LCSIC=2`Wn@e2f%<@8%2NjTHIS2>4EoephLU zWCV?nc%gUTpp_<+K`;qj5CozKf<&%VpsFVXh*}EgriUDNXvFFs*Jw#+v^Y7grjVm) zM42^mEG;?=uJLQps^SKti6q6nq*He~N?8mQoSM_IE~>S*AlOwXg;t(&b>rtm3RR_C zb3aMCokibIwKKo=-(ZmeUNFDS;0*|&A~gUrizuej3RG;HY}NvHbuTte#Mp%cMna`_ zY=(=-DJe<&Qbjpj53WF|M!SZPsQ|ER979|=kvHJX=2zMmEWG~KnH|rq%in=czIN=H zlP9jcKmRUT^25xjv&Wr#=eqnBzOQx1g+F|>scKip!l&nrV9)l27EGOVNzL(%qBeHX z#Ivs;HH8HOf8{UdUuQ~DJ?$2lk1s9-xTV1w9h;A>xkO4bjrx4>N0*j%Fsn+}GxzXM zvXAIH*e?AA{Wa!5=@+Fwk6G#~EoEzkYF}+US$2lr5||lmDY=MWRC=X(lX(w&x96Vt zX7n)L?E90)&jgsL5ip`0DYI{@&QjW%tj-!nM{UsMn=oR?xcs^ zNe?@duC#{<*lx*vpXi#67sE4u@VCgV|9;3~>1VNT4-rbaF-W(c9e!GK9971y=r zS*hU;tD!hqR>P*dU{uC;HmZNPM)jp@REcjeD(7u(h$W3^ zIQ0r^G#e8oLEbP9Da`RnMoz7V$nH>bUqdZ>ID;wY^&nSy;(oU7#GlwzeBYM*gkRDZLhvAI=5h2eprxi^WED#lUu|2ZC(YWKr9@Rk4CXei_7eCuc& zu(N3-DjPBq+v!MrWeCi#j=*O2{SzPIt^L!<-H+SSzW}au3E=Avz}GZ-jNW@R7KjD$ zyejlV$&XC7vXV)eVVq_Xm;zvsTrEOEIN@Pa2|-3EQ~=>Q!WN(!Cg(x0iOP*Uh2XTi%ls!&y_JJ_Y}V3!s^wKS7dkWv6ug(e-8lFa<` zhJfl+BX`spNrMh0p*)4W91JIExueC=EXh!Uji1I<#NyF-Nt_k5jFApz$}&=#%T%Nz zdTELYdHpHaIp9x<@UEOsr%+r4V-NUXk&sgooM>I4$s&refh*C2e`HHW{4C;STa?_buw1O4#r zH&J`n!rq@ZEbW;3gH_XRcwle-%Z~HMARp++!+`eX1Ut|~o8jr82_b)QB*!LXWux+% zf)yTPRRUBTq6$)xDoCy>bhk)JQ4~l8l9Dk{0ZXNXj8-oMQey~GQidog%XR2T$EvFb zs;dX8tq0p%)TGnPv)fYOqP~OiNsjRq`GSxGMM)hc_38RNeW}ikZ;jOD+6qlP1>az+ zQ(d#IO|+dZo2#b|0s+-#6_`~^U(B)$0=g~nm>T4SL9R_oN~BS;0+tW&!N>OO=@PsXU_iHowLu}IXh|@b`VGB z>_P6$)*@$p>YQ2IIv`TZwYDv5?k|Kuqy|l?Qz8E81aQPoePQ`GBH3F!5rXcw38%JL8umy1+f9#nBTqbT3O7CKv` zj7l<@m!rNE?vajF-O#p<(W7ACXpt&2{wZnQYPHn%2{rp5p@5>keh4@s64EeJOX5e$_xF*>0F$tW26Wpf~uW)D-_a;Z41i#Ba!bz*eA-0EGaz8aYJ;L%2YE5DoH&vX2l64|CUh$smm|5lL|d-3Yd zZ$&6@O=|LA4f#GFBuAS`I-zcmkM`%<4v}mmaV*UQewv%f3$TUc6i62ttRuAPLX?bV zsTob)8aZe3*4SVMfduJqk8QQ{`sB^wPR&P#_OKNOK`=bNk&@vtM#@A|3@~Zu37*!v zLBk@A8a}xk#&}psmLsq7SQd=>FFhd;Ls@}Lfof)@@<5ie0$DO8-Dwbm*`nM;D>*W1 zTb8S1ND?CkhZF>kg{h$E$qhlzCg;fxV#6qf;6Kr~VGn*AiT!uul>Ul$OvphIQ$yZE~)62*O?c5isft%24lO7{Lp7V6e6~kZM&M&@l)@`b+>?Y$qpq zbRVTtfTSSsr2Dg)NSaAL=Div#GYCtv>R}`qE2=;-$Z!DYSPumtgCQ+L&Ygeh-ua2H zA>G`h$~j^8ZsWDrc9VQIo$&tPUy zp-a(C97<$>%V>ujkF=y>j`Y$64^c4kKpX>uNjsd#(WpQVvJ zK$Ntzy=Nl}VJu0qqJoq3cnmU6^UMwtn|*jQxQ`Lr_@vZ}Ms#bk;wEjK%&aB1C`n6O zp(3>pZrg)Y*cbQ0%8Qs&l%moSLw%7(h!m6bE;W$Ri(9rQ`FVT?4;~tC?(`8JR6-uQ z$Tdg$sqY~9On4V9dV3&8^tYKlN$LKJ8i#0}bIsK>%?T^;HHCEMtluyi5D#hKO$HCV zNz<5!wS01%5aC|%ab+ZK#F$zo8*vlwlAF`q)?%tIF_j`(h_(=b zzYaOQ1QkBt_h(2NU1H!%q6BV8!XnE`GKaA&N*oI`;&_2ZuthY2b+>l|MhOD%(kH$^ zsd?Mhf$3UNYH+!vijwMdb)LFZ?NE7DDvn{Ds5WVHX&o;4yT!8H*XeX2mMvmyb-B7` zsxP^=BVXmuCMmOLvuil2EUsT-2lj6VcO)fY!O%9Y5e+1!0!`?Wtch6|!reU+vy#b6vQAAzkIsjo=}n1+lr*I z5`)CAx+Ob1+Jp$DN4|SsU~%6IC-R^**K#XBV>*s^kY6o?Nc(;M4aUR7kj;rEN4+Ru z1Ol;eEXHvL7f{1$jC(xX<9Xi0hQpB{pxCC@Zw_~!a&hv!CGqBCPR zh402jNrGj~genJzaLr(mk_26@+0zotkOw%QDS9wP1YIQ4E4qYRBrPXoQboch$-Ihg zkzXVePC;3Wc9f!0uj?|st_pbzk-0ZRG^g;)iW8#yTNt4TcT3{)2QwXR{xerlmZ@KT zkR_LEi#@HHH1Vm*Yzd8$S+?le6eiWkk-Qm=j>i~GQzPRWi8B@D%zShM8vP2I_+(eU z=h;{DeVboIrEk59Vpn`}+wb#l;g``8bl;x*Bkz5X-`M>kn*B`vANg0&NEGWt>K*xy z?2ISZ54Nr|5pzw<5&+~(IAZ6E%pnuAtt3c>;}nlrCK)Fwnv5d&FB;L^5!c-j*9#;?|5p=FUr)o86mylq>Oz}6CC+rX zc{m#El2pdi9*riTJRXvOihOedsxh3vFfXZ;59C5J6W826b@A=3pXFc5-+->%b$@Qk zh*kL;`96<%Vb7AC`TqW2v1r|jIoAbsl5?Ila0~w#*iVqD#w?wIJLhH|$l#L5m>^c; zTp3B)1j+&xLM=Z$T$dToH;2b%rtnk3lQKDeM#ZemCH$4_a(*4Vj=z(+hkclNlKm6& zr_e{tN8yhm(Kuhn)bitbF2~;<*^v2DhD(QPGb2OU%%sSq_~~V*S4_^dNV9x1g0thZ zOIyljCTEuam|qZFl({lW7``%*@UmE{Oo(!Hh|)xhlqOnK(28dK5i+}e*J%B22rB#7VK4x(CCxet6EYsXs?6jI@JkHTx+Fu z3n!Zv&N99x<0a#zoKwhPmJz4iwk&1^d4>_akxZsCQ5_0Zda=c_VkNb0QT8UNZF?Qt zZn7VSsxNxfn>@v0KN4G%2qUHsTSq%K?;`*(CR4@z&zfb~`|o?`w=d*(J+&2`{u04~ zpY$KxyyQtR|9A2qqS$*E%{lMF`*L+_vR9tB8_oIiJLrPG=kkyIxjX;C&Gor^QFa?r z?#REDhn@4kuNq%M^l=k-|1E$B5vClkp!%3HRSz;p$7h!aA$edNFRA$S~b#e)?Q}~pTFH%nz28J{S9YLKDQ=; zkoKGzKQnobIw!s)zD)j^=L+xj$_?IM=#P7Qy&rr2>NNn%lRj_2=kxl!nry~!DjHG* zlRU@8M`Sq^j+P|C&kXD?s@v?gGjriElPae;7XeN5NQohOJG2$BkP=B`JogIjbE1Na zOf=nBLKA-it-j`xl}jr-D%r~N2>x2%UjgnS-xcnJZ{;QxB(VN^p55_4B?lr-?Z^JP z42pUXd&8S-J$-7+erSs?JVRUbM+gIbj6snsZ`Ny!^O@rag+OhT!+L;;L`$+h;3_7( zJXSnwK!|LVm%*z*K3ZejpG+lYt zW%)KVV%55_s@Q)S+cf5iGcF>}XU-Y;EB9ag>r4ZC3hi0(F;zu9X_+Fq(A5p|WjHff z;tEj^PAQ}N=|#1Etw>gjKwLJoKrfp`bNK}f)pNz@>IG)+7&XcP~{30RIluvZ6WOn8CR$xnaYVo zs@5}=xRR|(kM@qNI4ym8{p@5*#fq0rjG-mNq<*^!vX*gPfQrCasfq zJE^_5i(M~F#T~H(lOCW(xh#J zHjawlP>YXkM=>-!78-81g$-9j3Ce~-tXq);bF~{E6S%3-De6{M(UxEOe4JCG4+g>^ zE==v2xVOxl?fTpoufF7obEeN3pI`igA1}P-^PfNT&((aNcgy2jH)Y47cV=}gUw!<( z7xG`+jovbTa`VjZx1Vg7@RH{)`0?+q_1tvJwdYN1YFbo1zWegaUTweh z6OvbI09M;adeKmrMzDelxuPowZk0j&KdTIaTV)Xck17M;H;)sbYz+OMBFVkDy)$XI zR&5uO2-lOIZiKp#Q`h;}QYp?$4#A zc>C8|GTvF-Ea@eQ3-vnnv60+(X(D%~bh-CY{$sDGG1x~Qe-`Ax5QiBkGKj!nX&{in zZbXj@5j{4XD(QYZqQ|*p2qi<)LwH_jX{aN_hQ2jQ=xNbu!PL!1C`sp;K-+sNuI(rV z@2PN32F>=KO2K<7xgd$`2fe4AnVxFooFYRZc%xxL9f=bJAB=6!VnJrGYKP9WQL@SB z#A~#=Kno2%Zr+{?^2gu!eg4?eJ!fpW`pq7`@5IyZ=TAIz3(`Mfr=8gLZ1<1$&|kV> zWME+v$+MsMRI0)JF!upY*EMh;I4(yTQja-SkeMMNadDmI^McE92NQb=b|4RYTJU<3 zD|fXh0bPH_IqpGsBdT^lJCD6e(rpWe&1*(U8u+ErV*saTc~ zXbf&(+%PQISRlX#TmZ`$V*&*G0yZ6mJYPt)DVGpRTqJA2G5*bt#-#d=Rf5;=X}3z;OL2557);Hazh-)?W6DLS9+dsp~POok3jy$O_z}* znK%-6SxLN}NYWDNLWPks9Jre@uoC{C-BJjVlNcfRwm)$(XJCpQ#>)?s;kWSKM=7{c+=(4I9`7 zs2k!GKv++rfBL`NiDSdpEqw3r3iMP&4``V&I$U}MGv*b(z8U2%T$V4@Ap(l$Dzxtn z8DGGk=SNjKehXhGjevd{0SBy(zJWhR^IC*G*=Z>@P_`%blxU7+uCKQ&&aT zaqH9@qXrix=zItVu?7v_d6x^G*$|Wv?W<&1j-z=2YoCnGkEH2_p+>@?5ZP)mj`Qly zevXP~$yp6qQET8^iDP!d%5Hk8QGuyVSY_|+=ss& zx%&B$SLy^iGV(IE#!FcT=I&<&x6 z@D$X}OcAF@Q?#jiTc|xOhr*;L9U=$aD@1GFIar`}R+9>K)~{h-kFHnfTDC!`R~q%& z&}4S1I8`CF?m~q+S zNe=$8qZ7&GDO$rWhNc0PC;E!j!d;%-cx6fwBD+{JI35cdx~3u1)T~fAtl-;5YYL-= zWd-pj9hT&9I7>;`MN15=X<3zts49cq3&YTKSkqLM5+_7a6tA?b>ZmlfV;Aqu%6;;n z%*gxDzGpA?Jjp&s<_8>efqB4WO#C88&Qgg;^jB5HlN9D1CF`#{{z2kM_mOTaz!K~p zvj(?tW0o5k7{`AMgRHPlaewgSuCV=!!9BS6W@$}8=B|($LZSnatUaFU2$9y{R7co7 zv1D>I)ge}=Itcmb?lh@O4LX^0M;K@L4F0R>F}pJyirJ@%5|$ViOA4t=j1S@W40R}K zMb)W@s;KHzWFpZ-Qo}ZWE^OoHh(u#)>?#c|+r_B&B7*+{h6vs(UCs-1pUjAJFe?ma6Yq-tdgGQtgJ+2S>YL8VhB(WBhNBf8sPv7 z@v6cjoN^##ADwU{S;k8S$9eibI_^lSbdDo$lxe&uo^>=uQL_|t&V2fQSRBtfgtaZ= zgJ6yV36kn1MSt_!St;4XQ!f)j+Y#sY%}q+(^QwdhlZU-=wWEtqloMJWB3;l1=#%-oTgH{En?AKG!E zfB3s3H)z1w?M|YbXptME1>*UWX~LpoWlhGwDZ@!}~qUSa^!X_YWafl37ufYb&Z+>t*yMPPMX##bF66*DL8(L=HrI`tg}1 zS`;SF;$Pt^1)f&qN^BG5=Mmu#Wbv&{QNl#g!2$MJYL|kPq>d<#Uq~f1lGozUWA0IG z+(=h&=iH;co#tWlM5$4_)9Qfl7fAkkiPh6hFM3$J7-sOHcSoYDt2$7;ikPc+pG|bo z)o_yvVE^##pk!!I#W6BWy6s-gdwFr885j!DLz?%$Rz@aJ6;jHRsERz>VBcdb2)jTczUG8yq^?MS} z*Y8gpsQ*LsoqBP43{?{N%pys9C{&)UYa^k^d?ID+OuW$4*xJE%G@Z%LZYqk43zv&4 z3hUJ^>dWev+Lr~Zy%m44=7e0U-CPxkU)*p_1Kp6Gpm*u_>)Z5Eo!h4G(7(_b{dwOA z?=9-8#{&DQ&kK9hi4ev)9j3x{o=lDFwVsF2<6!@vE$VujvG>tW_Q&1io#6XTvV8h^ z@vV_`n%oWV-$Ko(lbh3w(r}4+2{p|e)5Y@7fZsUbl~k1?#e*@-SLFzl;sL&&yHHAw zC3iSSdeI4!LylBn$oH8e{gVp0>>ONh&c~N>`{)ZDz0M&lUD?`+wL5CL4pPw}$Ybrk z(YIXTc|QZ|FV;@#fKH0an%0ROgB|qt4%A^2W*qY7w&-{2*!g(%1fL9Qf}hk)a1E1V z6({6gX7^(@9w{L^PzNr2@Bu+{4i~zP;D?7@Zobkl_qqskM`>IaEIjGvqk2<& zDW*_RRlQ*!Gmeyr({(b_3^Jp{Z95%tImLuhw|f^1oI#<_=Wqsuv>pCyYprwXcTS@L zGL1zEd2>xI!wWj?j*H_LF`dhPzH-M4v#y=pw(8IosAa|-x7<*%Gk*2KJMVaMfhpP5 zFQn~D_g}NL`KlFHK2lq8>v=Pux_#cJc@bSp=JN8@<4#@N8}Ge)j&sRb<2MX_b^EDP z&^z^MvwrS`**zD|KlOT2|J#h$G3ov>sR}v->-a{*sYZ@#<7RMNS7v91&Sa|7E$P$K zYchQqermWg)|oszc6PE`?A9(Yx?>k5SBk5(D~+pTS0@KEZ>xvwLy5nHKesiP!uBCjX=9edNV+l6}&V?E*ZsPSOtbUQKE8I`xwBIDDGN!A_Sg0 zjFo?Q?1FI1*4r7EYq3HPAlcNTF42L)@+oiuyx?vRQ0VZ1W9)yd$t}&5bkwA3 zs_U4D9boMk_mhFOyDr_)>x}&U7cZ=$ThIH>`ltWxy7fbDrk zAm(!cwT5CSHk4L`c$!s^9u-9LT?_DC3&5%&nB=<_VAa3&#!FCKGWT~klfS^3A*m>n zJ|ldFy(qlM?g{tUKcIiWd|!Lad@QMoT0&k)uV7Yk*Qsl?joRbtv(g^^cgwcw}vLWRyd2F0zGp;$!3FUB|){$ zOhKX5J%B2Z z{4}CB?RYq~YW1&Qf9qHOf-U7tthw*GQ{r?OEagoy&1!kARhzDHZIQP0`SiK+Igv%_ zE9hn1a_O>2PkJ!(2KQ$8ox}&>4`ov?JG z6PDkpZ229@*7N?=VZ*vEB$mhpeI`Oz%k~sQIl-^6lTH(&d8ZU#6b=aQ38Ml_v~Rw^ z2$iseAutds-K7m03Bj3=1dU8owk`Vs46rGY4*HS8i;abYBmQV+T%2jQ|#bY1uY8z?o57He?S-$_4H?Ldy#;ra7 zI-!3!`}B3||LutzH$1%g$M<~o=r+XMwQw4(AD>BwUj5zweCg1u`-yL!gMD))wv|z= zaWOa2&rs7oBOxp;rkb~GH4LTyg-i90oa+6OQusjjhgr-rm- zhD^WYYg@^AF9|y{C=+|$4~X{^V=X0rP#&iieLrpH1Si+n>g$WIW}caH3PsY$Us9no zsE}*a(x5yrL`PI;tgG!VKx@rm{2W%NV*pS21wt~kzNmXb!D^Y%-5W4* zZkK38sDjcXssd6zp1J6`roa9ClaT;NK)AmzP~<<}L^?Y0vAp~C%kCLIL@!jQ6z{z0 zr>JN@I)E}bMp04y$h#w7n%N!CU5U1CKI6*ANzNO_YPgYmowCtIZntPeLPlajVq(Hc ztV#Sp{h{_#O-yR_+Rnsaf=vKWn9Q_Rh#I3BX&FW7LL|&GJSA_7pvY+0y;*yUVTUc# z3-|`X_U7OfoJz11LqC9^g}Z;!lvZfvE~GQ9eH2PK!~`WA4VxejHL3^1sG1lhs>#ER z{_eF-MZDIjPa&>?K@i|V-#2<3s2Qn8|49S!aE|u;%fthf=42I%J;YhcO zGZEtJ4$B?0jhGfM3A~828dD0TD2q2zsDKKMn>L{WHX&4;)~=e^2kK)|uyr zek9NAx%8eBmlHd2`p81&Q*0*)(^&)DryfP&B27v@a<(!f!b=s2iYBEt(p1x-OpctT z%#0L;3zRFB++wuOj@Io)@y+IUg)whj~0;qmFx@sTS>Z2Fg>_8DAkYzCva^g|v&A+>6Em<2_^4 zU^7OSF(1cxzF9FmPc^=1fLSq;MD2`fAYV+AD{>ib4e(4xqR_Oiia4jjys~BK^}2V= zpnn1f1s3NR;f_7*ahV-SF3^P8h`72G+Yn1BkX3S zZdi|P6t*B((1Cvj9wGl9@`lkjj=I0;ww?aSCoja zUy-~!nquP18zLK{WbvYTpJJh%-9y2TJ2qG|)}Qna45%D;6GMsy^F>2CIxjkFK|B~^ z_ZIvy@7}`Ev0CL5>$piF0n5RT>AWuFbzV&&O~e+ABH;EWsz5e)NbON%N@h50xh4** z<^<#?iT)t6%ZqN+SfDO^)Y>xe?ZNdwn=^3Tss;CU;&kxu4|G5F!{LkRhqv6g=)RkW zpT}0~4y+KJWHy`sti>rp;GWdLJyCceZ5e$y2C{AJ2eiB__bDi&bSd){hRmrt z?c^SKbE^OgDFAvZm4IKVRj!6GT;v!!spwEcm%A%c@G@@@*q7x^U;V`%@$9pf3vXH9eG5@cVHe1S|dIxyF8 z9&^1+hxlw5%A-U5p*m779U8#r5C=~{JH(K48-9joS&rq~rCC@V_;KUia-^|HQ7D<+hYUyJSSX8Bi{w!>3;2xb4!8B; zM5;W)@2jz*dUS?Lo+>S$lG@WHCMr6Q5RSFGsQK7Z6WWGJ;Eq5)DVNFuECqo{vHJlW zhyu8ZN~qeOt7csu)J#xJFN7uy%e}`)!}8I>ky48TPP^?6Qs`s-!GG9%5o@a0$-vPo zVQOqTiHNUpE z$btI;7M1oXE}Kegn|q!($vwLp-wrx?9P=4mhTF!y$FcMAVTfZg+!}5pH_Ea2E0Jl& z4U)(^L9i6X+0ix%4N^m72itPQ^v`m{R1t`nT;+6gKhaD4{I2TJQNPdHb7s^$cC0fa z-VDmME&~fZ`kL?Rr)2l$dAIG>0U%>>qg=ig=VLX@HPHL@02K}xGjq%oWm&cYaz)@9 zP6y;vKu!kaiU8YcIv}S4axx&RffiydAnO6y2*}|;x@HFCP(ZcSLJj&%2hqPim-yYepJ^2rA}f4kvsJ1f{64gy|Ky;;EigeI8Ynw;2Z=h#<6-Do>s{*-xpcvn+GK_@z(=O5k#KE9wNfag zMg0WBN67x$5YdrMIf+dr;*}^4ME0y!1c~7*vABCR?F&5y5K|6u0Zzx(l%{WVKZTk}5#E?9QL=Tw< zl)|QqdM*wbYaFsy1@cw}@>Zpkw<=)o zlxlbd6g44WguE3${?aRQ%3k&Jm^((RKx(WY{J%0UPV8%v)GQ$CvJ$P91RTD+b@h8*(Lju6=OlHeibNSYkO%EfRYP$|yG zN=oYF)#n4cwB?cO-syRGfhi9(u9|)APuSWAcg$EbxB2GbYw68bUp4K4SBGD~PHOt- z$7~(e7L7`vQKBz=a}80?$|l;tGKJAW#(0(t76OI*Q2P!bJ~T>x!k$(h3aZ%Ik#M1 zt;%+q6)bEaBV(|)NT31~DPeDBF_KFG&Xxjo6H1#&3Q*_qN~eBF9R!b1!QI}&BV7Pt z(9v`G)`u%(3g3j*z9S@)H!l&tAq;c*&X1C**0bQjo;DX8L7 zX;3P_>^r```d8#?bWV^CEvvelgpw?70N1H27uUM1q%ZgL&sj0K!23)Q9e($q?E zmAb;b%3hTk%)TCZC;m?I^~%GM!bZR}KYCVQ5-#QZ?{tYXAeES-s^ zNt*^AOX~`yC&nmLBA`%-l0v16iQGXMnX)7I$Qxxg3u={hyy2`5-9Aq_?hkAE`B{nZ z$Zgq>$tp2maBCe3x6m!+0-|q{yh@^zD2DPB_01g^e&dB1XuL4TG+rD#x$y#;&9JY6 z#*56X_Ba~Tc~NS-D3E;$%FlWX6Tl(RF}CG`(k(p(@T{(2lf$R?G2=>J3;;Fg`ty8P zEE<75ByGB-Uzqo7R!h1#^dUWKg zyU(6F{1x-qYx`e$^OfKI5o^utkrmAQSZhowjeZGQvs$4GbYuJ!dJcVq%6CP(5_1xL zmD?-1)^Ka8t8#jHdTLR4QR=erWvQOZjg@ckZ-zePKT$u8n+*#NoV;zZV;8O5*J{is zbu>8jMIi^~55Ro^zhS1CYKC=pXI;x_-Fof!GMB2dn73rX)c< zl(Fi8EU&3yvIp0XsWLY;K6u_QM!vY_^>6>C_mSbMr#D>t_>T40Jvy?27EhUn#v@_- z$gPjxcl-?Inb%(X^>5#J>$fDXxt*fum#}tN2=)kcPMHu!CW~s=R`v{b5qmkij^!mw zltf7jTardGB2vH@P_k6tCnB*r8%ANe`sAIUgWvXlk9n6exPLlUAaLNp#*c|vUD%rs zU=8y^v-W=z?0wkmKDw6B43qD;!{5V^GGE@J1AABZTGXA|OM*%qODg-A$$?lh7)QFL zI05_o+aEb?Mc0KFop$=^r(6`NWNRPpojvs@b+fv9)(*cxzQeB3kC|QgJDkW?LN;D1 zZVRAokh7&A@}?qN9jTrwoh41r6|0w5 z-z429-IjYi{8ZDg7)`R1aeLyNrnhV^MW090W;2rGOU0$qQhBMeR9&jA6jw?s<(0}x zb)_~?J5XnkLGN6{ zvjdJZ3P;w?^ILTbg2;`2w4wGG+zI3S5S3I6yMm zSlF~_6BV%Cq>|BHege74DTPplQd?Uw-rZn$ypl*JqZJVUMa#{=WY_AGcNea!ts76b zwN7sT8fyanj}T2k8MbS;ap#RUZD`AX_oeU6pEjlOJBx1q#S&|$dhLpvR>oozQn$VM zU~$DuHy?N#otj>?cKP&EYvTFlGdInfbwhooF#E0RU_>i!Z(lXu^NYODjF5U8Pbd%VU4g+=o459rw`kOox-4SP~d^!&0~5y z3hO{1JPOd|=^{0r;Bmhl2c0H~2?;hyX~4@*+yqQ`j$TQ{(d1p1p9KElfbNJ_K0QpF z^${{DL7cVK(gOQV`Po5g7ZU@vCq^MG=*^C_8sUh;(q##Jx6H%Fkj>2#yhI>xyG>%G z-NR~!J$!*JfHsq7cV4=>>9*VYpM5r5sIPo@n|a#uN9fD$LBi^hd+!NMi2aB3$IRY1EggWyg?&h`KXNsZDh|& z0;dFl8j?dvdQEbBa%XZh$tFu>wo(DlE6(+kI({i|kPszhrGwJ@5-a(EgH#F}yb`_) zg?pG!gJL~k4HA^erFn@lK(AK||2nAP1`*IX-Pz&o`H9U;k~MYB(8zQ***k;bO;$}& znrOMjv&P0v?x-aW<*@Qw09P?ej0ZL7@>{CiKEb+LsF~SiQfj8_rZ+EobiSz!DAv^r z7v6Wuzz+vzUp2q&TKa+E{(C3QTDa)`JLrzD4q+`wl0FKo1u}iv*Ji>3)DF})Q#;VH z5|ked#>H|cHsR+8c3In;NXa6P_!4bH4k$V&6oTvxK;E#ojYCwm)gcqFtyvvXER=2) z$$`eMsvn<`ca{mpD^*stQuX)%d7f0AZ>3`RfFB)lzFj}QmCE9Sp*B$UQmx!UwaK%o zS#l8->BZs&(&gxKdWE<`+CW{8uBUGhH%QmZThJDIGjpeKhj^FtBkCdPJMz=iBmbAN zFM)5W%J)CNb8m8&B=_FzNz4jkrZg?3P}+dd7Al)Sp@j+zi%^Oc%2q%?5GtE2 zItuCxt|K}=*$NcY5w+u9!8fCfK0)4R5OuWbdyjEOCEskYMgKZcM54BWU(bmGgFqKCf-#Ga#bUyG0Sg`AITq8c*I^w=#RMOY zL6+ff|4G@oJIx($h&QCUx-T^(!}|4%teH!%$F8MI8(=H;%kkYRSJG9qCkR(sbYHzdIID*vX>ZOS`b^L< zCC3_*;crqSOuC-A6u5^!nd^p{dN^1~ExOhBF1i)^Oz)C<7v0LeS6KR7!S`N4wL&U; z*R>)od#P3TdbST_%GK*SY?JrM#-1xIeXv;g-YdA?E5tq!7i=m`9Hp#2SA5=Q1iWWW zzuA{^uChqUq~xU+`b<;lNvGhnE!1yTm7}(hOrPv?`E$F`q#CxL69<~k<@Oo16Q|oH zZF0!zScIm`G4)t9Gk}c59|FBhxYcA-*E$-_fLW0>i^*XXO%I!CxZW=1gD&OIDzbKR zj8o;lUi--*+n^sC7V&8FH1j=X#;iu<7E__R*;K+z6`PRhFH+Jov|;(!iOlRGR&Nxn zdXM0?=vc(+4T3@9Eef(SHZGm_7&4@6l*9Go^Q0nF%njy;NF$gkeT*B!*BEY;tIVS< z)8v~i3%NP`t(I2(DsCx%Qh!Q5Zuz_ZMrY8bUkntc0pD6Oj)6)cz?G*sOZdV9piu%#+xg#p&iI^BVJ3 zvuGAsA}eThXchBQM3P9}m52rdrd*{2ab{>XuQOAq zsmU>eqJx?0@GwJ!-&4onJL`AzRHwo{=1N0@i#P@3p9;YS*DphtB&DKR-ToWMC7h&` z(QjLF$#Ko0%!xhA#Z5k=55I8jB5^1$lJ%E8A3(x!UBfRF=)iczp zm5Dv`KSXmVI8U=@Oudp=k$Qnmt^=~_YoOR=Fz8t<=&{~Jnu4r4;Bq8SZ4GJ&I?oB& z0&rU%Wb8pLn9CMVWF;>BDN>hqqu;EU)$G}G{Q`kDL z&M;Ma0QQP|4JUAi@eRXU(mTpW%=^N7rvFkt6)l!tJQ9mpcA1nE9tlm!Djta_V*StY zNapGFjD|>}7gS6VSym_{i7cCx9y}67)XP{FmDkW~0#ykOLq@4F%UQ~hFFiiu zFI7|kH+v~$`AdaZdQU8kI(1-9oj#*lBQc{&K5871%Do<}93bkXhDiyXF~bBwhPx8` z{`>L#^!_COL}R@Rx2MAnV2a? zc*qwjC{pN#GYS@m$z=%|g2td}pmCt7SlVYcge)OzwWH2bXRWg@uq?1Hu(#@$n_A7Q zY^&^>Ok2&{E!(YIYVea8SPkhORvsbW zB{Qs*;#v8Ax zFg?SMMr1-ET+#0Fts$y}kT6ce+!F4mVIW+}l}m2rQp4izG?&t?rU>VC_cjH-?=&^q z7LouwHHRc3gI&Ec_<0Q#_S)xEz^h?rR1s{ucHwwQshCw#DiJYp%wB3vLgv;{Ka_@$ zN%DUm8$Hi+*iGZC#Kb1IEQ_K_P1Q!%#u$UzZ2l4z%qnTG6O({=o9k>t`j=HZ&AB>5 zV$mz-^RhDY{@R{s8kSwKrnV??>(fdo+p|#4U_8M8PB4a7B_N?MAsVAO99;U`+ACdM&y;x9M1Ho}*C z7+$|;Mf{f4!b1q7^~?eMd)=Ri7;~a=TECQxcN{|k2pjDkc*hY22#f4ECKCg7qmiVD z|4Ok@T)$~mbx(J^p<7)>*G+_1yDZolx;iS_Ni$+CQs?s6Xs=00pRum>k1tvJ*yAlr z9$z%Oa^&pUBP(aKe`tB^v6hy{A6r^Edv+!HlAMi2h;^`CBxf>Ot&VQx3z%onZTNfU zHdzNcS^C~+(wRgff16(XUPlb=+bZxb{0L_7WM%PoHG7vxT~go_R1u*GrQu5a5|sp0 z(jsJ%XrmOGOuSAfaw_=h;U-3nqONxQ6-LxyI~q$}i(*N`s>AujV%Yf%?4&yySshro z_bGb#RAN!$>H*sJ9!V@S;3poa{gTzupHCruK8|v6;LL*Ds4ZB+0 z%5D|S7Khu&7%iwAf2h%14y6 zId92d==(_G8@1C`QUk5aY9g)$jk_qpY3Zzlk>ryONsQ!9>wtlWwROG?y%RQ)bKuD@ zeOL08jfr24Sn!4=@{E-Na zZ-}(9pf0-Nh45pY7I9dw!@!DV)IVZrys$E%1KdZrGUDjCPcUWZZR3Z3r%V{9e@T-} z>2|7c1+>3N$MQrR^V+O@@~1Z4sNJ9Ze$xdPy5Rh~UFrwXxx4Td+e}0sgKkiBAVV?2 zX*v~OnmxLTlJio7av4R&bgTG8q$R2Y7YvaFEZYKa?cPn=)kNn1aDB4H|DZl+`hNF8 zH~xnE#)?1TKC$96+!-r=iF?V44{`^sct5w_ig$85t#~cB){1}Rf3)EyzR8B``Fa~R z@bob34UxopdG0aX3*zH>Ul*Sh-Hz=gJen%tq&=jg@AZ@r?>DDNzbc5y(BO2m?aKw_u zix>vf{_M$EVDlso9YMO{` zO2v40YJWXBdnmbhF`=wVPQvLntI>pd7nAgmlP)N+ae6K|a9~NaPkPGBnR(Ot4=iT> zl1i}uBqSU%AzbB{F|jvArDhZJ1q@ZGxkaUA?w`27a`-U!Du@4^#k;5JfCm1L-7x#JrDXeCA|)}g%PY3C8Qo;IAccT`WM zZ@Jd|QV|d&O0T`n1W1cwP)#zvA3_xjwh^}uF&%J6OeFkG8Y;NicTd8z$d%_NEtND> zS4G*F?$RXau&R<$ge7m*L6kh29rK$XkCy6<-(R5=dW~#W5xv4_8u1vWo!dGJ9iXVa z`j4x#?~zYk`q85zzG^pVz~$fehIvfQ(TJ%-+9*R+1CO&>uXJ*Zg*3LyYRDZmYogY# zoSZZNTD!Wqi{$B3_8I8ZZS9dt5(b7;0~LU*CIGupB(CY)BS@odieo(<@hBPc<#+@vBcKk*JjyelvmN;Hn9Omc_Jv{~uV9vmQ%*tz(HE6{ zr_TH@Q|N-+vSdtUwcpZnlDs4{CU7z0sRO9efD|JVO;ftHsX1IRC@Et36ZLGSnZqje}Y`>3rR4#LP$CeZlt#uoe<>eIhAM9+Lv~YY$ zt<^DiM8no*$}hvr@R5*G@qW8~`d$ zTrVPwzd?Y%Lj%^YapoZvygay8aoac~skIwV|zenf!VZUxx?>&J2)jgl~ zz6T{vL1phf{J(JzkN$Cr?{kmxZ``AxZ%!%NJqntK>e*@RSYmI*OI@iTk5@O^{X1|>l;@w z^Rh&#Uw(dW);tus&{Z1gI@_g&FNs8yvt3FTX{999MU#EM>U9v&_R723^*_1zXV()7 z*aBI_MbW}wa&JxUoymRbJol61pYDHp{-?(|KY4!YeaxQ=ii!&Eqnm$32Sf*C(^R6Q zkbM3lI$%H)-%PjhH2MSH*mG_Cxq_m?LiJ*JgPu!Fr`vzfi|?Z;=KezJl@5p|&PAgG zJ|PG207=x+hpi?Xc(E{29Iqy+Ul$Y(vV)UjQ6hpD1K}9HLcNNKmdGI*m`r}MGd(o^=iK6zFLz+t& z6YrdHO9P!Qpv6vS1$Ci3D{Gzv?VZu7t7C(7v1|z)?T5k9;rEXkku@-Lj6-Z6{OZ^_ z)_v00KqEVyw);Mx0ffgBU8oVF%tB(*cu?kX6gKL^Hsu8(CPm~TTb4+IkGmn#eStOt z`X-;5SfWuMqrwbw>Z~IAVu+3!_fVpXY#{ouEo;`SESt84FAvXYg7svRSiiJn#*9Hr z)h&JZAJG~pBkvZG2@Q*RIlU0xWP*97|pZQ4n+pMY_&+ z#tR!diS~?iMjN_H8ye!Bgh5M+{l!41R|f2inHiC|6MnsF{`_5+*F3lyK1w*79t1sb ziSLO$be5EP08@v&s4kY7YaeLGisB4&W}_u6nM_1Ma0pCBAb*TVUfXW5*%&jWiG&!k z^{6zVldiheR%522Eh87Y3&{_Kg$mgZC}@CWeW*e`XeG`$m(p_7-AkO^mDXAriB2i6 ztlTjUK1giM8drDw{$JIvYaTNRhFTWngh!N5h`FJ)^|!^ln%CS^8689@_8!T3giy>u zm}YEDcACSwbdp~%gwqjtNnT?Tr{i{Uk8qgS5FF!vp5#}ixjt-_QRHK~a*AfT!5k$i zlI!khq+9v8J4z~-PDrI|Qk+^QeP+c^(qL0nQy>d6_FHB@oWE{m&COFLu1mZP<;^wa ziDh?}PuO`k@x#V^P+2}=<+AD#un6uek0utiRSw%oX#F**V=JLGkBD`Hkq(7fUXMvm z53`77h*aV`-S1H48MIhwrx0cyaCIlvEiB(|>0@RyZmd1(vyn3O3*%H$#@@#vUD ztI`zCa9hKK12fg?6gXkOa8SS?5a#z#CN!&7j6KPO*H`Apv{#N*0zx%0?{~UPIf4=5)Q16^GWr`_+*f6 zUeT21MIDT`*aadDDxMX|XoL0viUMhqa3G7$TP(-cR8O4U=D?*ZkFFe2(R#FH#nBaI z6|F~F?%lKNf!%v{vqNj{dH1f3XYQ$~x#!HryWYL0=4$!b*WWmM=FQj7s`I8vcBiu? zM7rdh5Z@AXfQctUqYLT94yNB>FcQx}Wdex28zp)12h94Um5rw#8PVSI@cSjpnCgKI zxd-#_s-jPls$x=jLjRB1FIZc9eAr9TJ12`47Fz1BEd=tM)6S1LRK&o%4pfD zhavjadK}gh>0>bTdpigZ2A>I@3Nnj>cLwqJ;LIQ%9)wVEP!I>f(qgraBR-*3pB1!N zf{NF5iqI^GpFfO@D(MIhTS`kwRX0#3?$W4dp+Ay65j?aVHS~P^enQKVa;CT_A5$q* z&P0=h<|KymGhbYtky-oTs^$$NZJyHl^1s_VxRJ{qnLYR6#*)zFjrFz5M(1+)$iUXs zt4a#1%gck=!wNF4SnIdVD9E3*a#VF=?dWiBSz$jbrOnX9940|%Q${SF)tiRErV_Yo zAZ#gwEdyY7|Cau^wm($$hXvu*FrJzXjdp0Uz#I!qwm_u?wwPdx5#}*42Q4K`<|}Q< z_4|DJxw*O)mrE|sZy~lx%UT)6$rK2aks}rPke{E2%KTnmhO87QkfCHK);wIY_5Od8O#)!J?uzwG`g z)AltFoihjSH^pvQSvmKqRW}Z9+Ix%p-h29uzrAYcf}8S0;kWM6hLHm&56QfHgMY?7 zGYX1lw%y$F>lB&za>-^^O!gT3rKitnY2m5^N3rgXB&-BO_Uf<*!_q> zFA(N$2iAxQZ7PTc?W~BBGDf-ziT>>BR5}X_)iw|?YiiVQ4gfpkwf6Y!_|Sc?B{u64 zIf>P<>37VIt1bAp_#U;+=dnDSLwwG=V>K(?ce`;&8KmG63ATtZUtB5TQ6h{M>V-yu zspMcJ1N8tNkFLdHF?iiBmmwWFoyHae!d{otV6;1pMyH*T(@){&Q5w_lsO;sF^{5)D zYCRSbF-H`w>Po4VsA}8ZI@1=zp+Hu4Ff|>zM*~A%+pgoFB)+p+=4$Ia_E@S+m7UTrljic_p38%bQXSKHB|mAr+a0g{sh01^myMRV_IU z@Ty_<`BhZXKo&MbA6W{n)tB3^{_x(P66c6@gPyqTY9H|Wme-;3j(z(!u6XtteC3tI zcW2&9{1?gNPH2PeC)<@T5??1ijJLhHW5@FcckWi_R8%C^F;_^vi>M-&v4evqZViWP zxM>^?5u=0XbtBWl@;r+;T9YCXwhZMtT6fWiq6smYWumC`hzVE_Rs77AbBR~dPU^w) zNj%CNV;=lEUY*zmdH8L>#N%R6EvW?$sRakhLiy-GY{{H_m`wir&FzO5hM+zK3$vj< z8)j$0TrVt4hej7{vcpn4Y_`G*E38(wDR`A>s|mM?TSVLju$&l9NV2u0rQsGOcULaX z&E*SxEt1r~C6fo<=rADG=?#Yi8D6t4;MMh1Nw>2UB0X}Xp~sf^g=%R4)@)-*rO^5K z#T2JovjT&Cs->^GV|cJ8{^w8U5?A)F`}p%0Ui$LfnYmlG&7Ie_ZO*!94&AZwi35y# zYU00NOaOX$+ZiW&dY{Wl4yejl@b(5Fj|C09;T6hb|H(? zjV)-G3tTRJu9a|aR*T+Zb$b!RWZJ#5l<5^x>b-|$d*~CT_T?{7Mz5j6sQ{A{13FiA zVk~A|UwX_e?pV~G0Q`0rgcILfee#0q+3?#>9!|Wo@!>~SulbJy5UFhh@%<0Mk$5%H znrKO^Jk}w71`*%`&+pv*>Y01DA41ozp~-}M%(~N9Pmw3d@em?Hr|3=-|J`ajyTE+pqex>MxX=}JA(ulpUHIijAYQlcMuq8_>J^tgsxk91Fw zhyCFO0~5(QXJUfcpC!EcmLRs!AH=%k}$*=1P8F)a!5z_jq%e;a*k{i1AHK zoh0jCUo+9p?!uqcjX#i^8F+(hO!r|+c|3X z+UoS&32UcL`~9W~Sq+17$5sS~EP7~G{jTP5ZcjvMxOaX@pk~?4uI6W!46eNA+@8c+ z^Y3pSH+(4m*ywh<4RYyC^#!H3jL0dPyXO`{!P(b7(=`(cdQlMVk1g7q3v+US%W>x5 z#w@6H1LuZX7gV_**Sy@k+01M;!D=Hc;GvO&Vg`Z?48*Y03u}q^@WOO2jPe38)9ty) zr}(hX7tVCh0FknoDPj?MeT2xKfLCTbUY*b*8dPCTq_rv-h^A`LB;C)LpHetCR|Q8@ zSLs;ncE6XQ^DMwm*Xu}F*X&#T@T*H6jUQ~7@!UW6?Y{iT#n>K3lc^wYJJXoPg0^em7+0F)FoxhmdYM zp-ws)6!R|^HVb$Y4})3o_~-x~^2!FE$*lJ}7zraI;h0V$v8hv0*lVl%%}Gw6m<3UL zG{p|=gOM4#W^H(ScJTCZK6B=(U1L|iv3oo-y6t33;gsDk-Fo#C-KlfYDZ_GN_x-*7 z>NCmQ@XwLl6rsl0h)n}v#Q+HPAJiXD4nSo9s?wm+UF*gpi3k^9g#aOT5Q{xgAIkNG z5X~vd_on;($^3?ll*K#M922{Mco-jd7b?{0yPmm!IseX{as+zMv!nBBH%wW!w?06M zlwP-ZQ}viFOX@QC;M~@2V{YrXYxHSye(JKlb%9?fX6DG|@i#Wz6w->@_X1M#hY6S7 ztUE>OVPGtCn*gf>C}u%6`KS?K@FJgwmP(L#BVp;DTF~^2S{g8?+MJn!y9SbN)eN`f z&)7+8A@uTb!8dc&PErfI#_LX9J#qJ`CG`FC8Q%|;?-x#qk$U*Qc4jKA2Py|&rNC+aC`hFLhzZ_ zX6l`UFI^~t&c$|Yj6iKZ*z;lY4N!H%lpAnW7-~ac4}m@eb=i=X4MH|l2cR_*8Z)6Z z6SjGw(F^lEFx3Sk9pJQA+3`FX77%61!e#_shcm;Ok?TRO^z`&Rzbn`2wB{ne;`jL( zzkfhpu8#wm%j7VZ>oqbN>0XbUu&B#{Fp)9Q=!H%tURZdcQ+1=0esrNG&F^UI>;zZ0 zLicnf*}wecs8N$u(UVOWpCwi!2LUK7VWQ4nX-_3PyZF~HKAMPk%$|P=@I&)XJaos@ z$kJQE`M3DDtLFamZ~KN-|<}kAd%vg##KkKmF#C_Qd%) ziPLby0LVC0^U=1Q=l6~sz4x=%@-2s3|tOBvci`C0SKjc#yZ+ ziwC)?U6?r4Q>FP5p32YXvBzW20h>)*SqphN*&58@3wW1Kg>$4cdIPmfsk$To zsjdcUc1C+01wUyu)cDXeT(r;`EsjEuOQ#i``Q!jQV9)%yPp%j?Y}u1@U!23XCx#Ec zbxi-o2mQdjzj0*8?(=Fm`SAmSVf#EDrNvw_3F3;&P3Z-HyGJRkku@B4Bm z5J-Rm0lq-OEg=Lb*S3(9YYGJ#LV;S^1`;48B#?w6R;{+$+Im^ld22g|ZqxNY=c;zI z>(rfUH+5b%=bUq!+dAh@cj-3&$K&6lB|XpkeqTaptH>o{)8n`iI@-HjBv+~qbFaF)X`ZB zZ-Wt;K_5gC@XFqQ{@-ai{{2a+#F`K>@mYwgOW% zz3_4cJ~}2p>0Og9usyjFxS}b}Pbo@UQPiZ}>M4^PN2P_e`N<+?UMel$INQdO^QNwd zlRXYPqNi%95o=>jO7_l3HArqf$x?Ifx-x;s1>!kR-Zs8gygf#n?V!$dA*DG^`lBwT)qJxKK|jS?|%| zqgS>!%sem~MI|uK$?6RiNkxlf>!m9(?#UO~GRXjZ&WOpDD|W;YRB|}(VK?q)aHBK+m85G z+phTfWBC^cL@`8H4UPgcq=L#ElSh^?a>1>l)JBaysNGxS82J+?K%=z-L&)AL#n0!>JX3R_>c&8GEoqp-6h${RHdgkS>sYHz`LClI2 zN_CkRCDIphS%@l9 z713EmSw#vPknpLgb+wPwxtXTEiI?u?9#jEIcb zndh9nGBfz41A~W`z;~}=QKMWPN7y~+<3%y`NjhI-i3}YjC(?%00v7!}ojzZuW+yUF&f|knC*kviJ`L{F z%1#qMfjd2V7`m5i#g=nR%$j3x^Ym5DrVz=&NZ>|^qt;3fkm+$$kJY~c&gjnBuUwf9 zBndI4npYUc zf`ne*ExqKp9rFa!?)L07(lrUbY1C zuFy{WLo_2Mc2Wu|KHBR=#Ug%CDhx^J9O{n${Q?Xuy)8}XW<3%+$cGQjmE_j?kK66X zMfR3{#qTXTyQIvhcf8y7VU1Xw4Gp$Wq3o|qs)3X>^mvaRLB7gnRPjQ{q(*YtRzNvO zlwTZ;~aRf%fdgT@p!SZgXV-Rc_|o~k*Dy+MnpBJPP`!kH~mZd(Gxr@{m*zA z%gwYR-F?ziBHAg@9%?C>uAs)reCuH8=tKBPO4Im2pV*M<{FrLW5fRT7p9r?|fKc&D z`e3L${`^G%g@##b&sdqA*Nb9ABMi3rp*sfuicerF-JQ*Kikw5N}+!U`E+uDEf4)WfDJnR`FTiehbU+ZT7*{?nIFA~UN+V*1ht zmP6rqtcJ~Q2jCDi+AxYP>yP7$LAzfDKL&&#^ru@r7>h&((F-m6i{S%xU%mw2g1-{I z5M7ZxQj$i>mv1X!6xk4=uW5RC=t?yj;RY45%zPHOIK*qL&Q<1W#^xQB_2pf9o=s4P%_aV{yXryb}yo6txheJbCi=|1!` zy&Y`uY6?d}2+|BbD8eTvD${Lbar_x-Vt4@1^Y`wMCmp#Yc`!V~U9-n~?it8Lcud@o z)EGhx?3$(Q$OvwaU0|)(t5`<%v&ms;+FhDi3IaC2ti1>7ys*lV_j7y*3QCF~T)YaB zad}Q2H9lMn<1hYMv9_R0Zk54)gv1{iil^LXhwV(J(*B@~!&Q7~3CKWWrmDn&8^tXW zd{?qLbRerGyi`3Hg>hSGiFrWyj9}>o^6rRSKrv+XA1PpZh1TWl*3}g7gPaYU!_>1c0Tir(`h#U>2V9<@4%-2V#S* zBRI#oBX~I&)#TM<o&NEx=Z2~qV z3xGA4dSjHys3r3|6Xv`EHzEyKCnZJ|f1ioDHu->3fSaHg#+HhqQ5 zGuYc{BP;ut9W3_e%sEvz+dk`173{dX@D*G|87vlzO&3Rv@N%X@&z&H-zq$og2j@eO z;%nGG&`5)-OsUegL@81|VjT2yJf4GooLsK#D1*MneB6bPY|f$(0+@Y1@ly1=u%p`} z-q&bYC|F;tvrHDJ^ER*ETg!!jQycPbTGZM4Lu}-ITW)BZj!L0Z!R#*##bUk*=rTQ73cZ%7T~-feEnP8LQckfF z9Mws`JDS;Oz8(f2xQ3DHJ9-e11yoOKcJZxpk^1R^g`aEopmxVt(&gVH8VS)_lz+3J zmC%h8!jUldl~55nN4!834}>d;KRE@y_t$=O>xcpbRCgI>pUSB~Z9kf*2}Ka^4~l1w zwOsM{o0RZ@$ZY!o9c85!bfpps^Xp3Z&+#3h*{iFnYemJCrz-0XBLPJyw>6G7$TeqF z*OYL@ogkLB*1CPJlL=Jm<`Tq}!-6vf^SgJRjsR^=IJa2X@7+L+it$0+>9W=M(Z?q@ z!9r|Q`3s|W%AznGwNeYF%IHLhKTQ;4B1MIn@#_q3FI5z!$ZHnLB@j4`7~*9rf_i-B z8ypJus=FP|@4DS5YKm;NUOq_7D&4)zAC{soGgO!TlrMN%?7jEV%Sx>oh(#378BMZ( zEqm%?i3t{v zhP{{&vQIs}g=Q?{_at{9h)kG8_S_-o5_*w5rbnWe3oPsN50uo?dr7nGRHj%^IM8I% z>I&oR5S0@bR?93dtW#QXaB3o(N|-b)ufIk?M{CUW8}6>u^5H_))IOX)da9 z@y1a|Z6g~ha&qc|0!Ad2NMU#0Ln*8x-rRhwBc} zZqtqlxx+X|Y$geQdrEPN%48y4^|%3gvtL3RfG~CAh&orw$wa}M!jSw4<^ecA^QX0L zHuyxy^aJH;Z=R-qk3pt*jVK#=M{d=$ICwS%jhR&Mk*=>5r8h=DWE9vM(HxT{590Dm zkDwLkomK4Wbc^f7vZlbT^K^ANzi%w8LSR4UvUP!tMhZPUhow>KL3-6`0UY3>yej4z zz!~8+gUSOz0|GvLp!_&}Ly9rXvp*4I|MVy!BpE`AbV05xoHnZ|96w*cIyfGCXd!x? zwCSdve~BGTDq)3dT0c(k(rIO3p zK7&ZIdVu1x8ImGGC!`F&$Yy7L(FfR&AKyc#;%nhC7#3L2&l>#<4n3Qx;w6G?0K|%k zaQsP1z<@J6DFVvR8K_Fd{wEI~)r>(+9g1^w-kiSC@(`i#dktN*iK&C1aCY$wdL*cs zqCh@A#*9H~ed-&1>gjl7szVVTgPfR=u8k01et>C(SDJ~|I4}^9EA}n7#JM^!*xB~v zzzxb%#GUc3`>ifDB4}T4#V1Pl zZ%}Jtpua2>C^;+{Uw~m3*;#JDuIkw3ndHgw)QXA_qjj5jjI0 zHO~m^j?^p>0S70mvZTiw5U96JWMkrFU;I5GwF=UgLxdYJOH{&PJk=iNp4Zry&PXrp zhI+k_jK1XL2|K4dL%~uyHCyLcoPugLgD3imce>;lrj6H?V*k(l)YVnd?DZ9MJz`od z-XE`YI$t$rd;^sGNscd-SI}23Lb=7ft~+%oqVfR({$LJ%fc=Hrl*_-UHyBpaR3fI z!PKzIHXiwBEj47e1vs^t<3wJ+?=R+#lItP6-e=#Vuxr{!`y{abVJXk7MaKAu%wnAhGzcnblCa%8)S^YEz>O zKCNT;C6GX{iqB0-mI!JDH?}1zs@OyxO>Cv;spH7)ivKc#jF3H#ltxf$V7AzhJjbD8 zIiebSqknjyCSzt_{}mH%=iR?i{2j82Ss-}l2?P$MOT#00#)MtX&GCexa4JQ}gZ$02 zwQBctbV$WZ^?@HoMMHK;HoN)st=z_DdBLUlA>ks~;%nK#e(XwJrZKaL#4&9#+Ua8| zE8r{K?AkjX`)DqR#%u6?ZD1ds?^V4TXtuxhesL=+qp)`VE_KcWXUSQgjjH(Io~0oB zlPBTxHChz&V9bo|1Bv)!Fenn}8~mg`9uU6hs zZ$9$RFV+Q6b)d}| zwcPTf{NA|xM)N;nRfj2%)Mk2*n+Nd=U+?&_I{dIiJ9N0n-VFyRzxSL=WbIhd1tq5>uPwjwrY5z_c|h_?ss4-{<5 z+#pSU z$`f{v+CQ*;rl7SJMj0Xbvp}-j5li5TGB{z1=gPFN5CKD29eS26Zn}SGX8Z8d&=PLM zB(~KhWyRLhZtvD@Hv7l~V&qMOVxt!2c zEsH{|wF$!5(!4nd1oh**XW+SL$-+M#DI;Lw(taKv5NGV=aFfGvYzMS{$JcrfXf7Xi zfjimBCH{_*Y{uex034C$$tI8EhcVt=ngWb=(sQBL(+5Q$&;x>bGNOQ7*eCS64`Z8{ zK|g~8+%exf`B8JZ-fN^nHF(emhnpTw1clF=CKnfePlK*8_L>|yzZi5||Cee&12*m3 z)Pgg%g7&UZA8m<~Xx!hokAJwp=4$M{rxvi_|<@#{|T z(vS(MwCjT0b{u1!#_R3MqRK!*wJUZ~E`RnIg~^W0afn~TAicmKV%r-sO(JC7a)J-- zV_Za@0SdO$KG8{I`(>x!rz7s$;GeC_9H!!{-WiAhlVazd2-C2Y_d1CJ8($y~ebA2AIaw#EQz>(>X!5Eve4 zhMCj@7HZcOc^Ezjs=Nkv3>kP3ssMk4Cm){{=H9WscXmYTK*)VSBW^^WYA8O@2=O^Q zhTo{86a%FoW+l<4(wJlV8$OI9eDrqb?vSANKZGXSwjHVGDZP)vfmd@Xd0?;Qko6+! zS?141^!0MpcD^zGI;d>Yi5bVgKZd-4)PzM`J0`MVr5r|mBcIXIPpB})$)z7XC{(w? zkF$;K(3tiQr&cq|Y+&Tc(1GErU9x4Ia!9X{eO+X?*~sP@}Ba z6tX}Fv!x81*s6o`6mFj~qw$&f8Q5zy)Zof7e`6PB9vOU|%B|O}I)5p%HkPOU9nA1& zlBSI1LBK92koIN=s!KrYU+YT`kLl34`B;_kB*2;p1-z2h-?YrTMybF#- zUA})q_@2u?aeIVKXl855pp36bMRjsS_+wXtBZHRiMqWqvZ^lCm8=1Y6sNKe6E2^rr zflN|z0i@ceAM|6U73ZOI@RrRk5P<-zyRc&hT#~ib z`m*(-UB|A7kp-PQUWt^~LEwS@>}sxdAAWQnQ`Zk?A4@k4=ewlWIVgrKLuxDc18yX5 z+G}Ow&ge$G!q3R__)b>idmTk?&3tLYgk0KOC_P4Hs?dm&Q%H=Yd)4_wJ!Z8y1av-j_9Oa2nu7ExaRNac($BYJ8Tv z5Ab}!Uk;&b{1evl59!+ZqT@OKfN=T%+26n|YU7b8`L%?{q?1X@! zp8NgxIZ)Tfgc+*g_Jh`&8Inp>7`ho+pm(=ti}0ICK5bV`EZga%+p6pan#bLfdWdSN z0Q-%CKN9(&2^oUQEenLhvwX)bzZbpoLa7RpBW2ey=VFxeIyoQZF7}U(qxu7~;l`M; zlS`ECv+IOiNM|0o`DW4XK%3)GlBRi z_~uZY!#q!9OdRcDZPwoW4zYLP&)SBKUK=M%yvW+gF-bbhx_!=cku0{LrbRmR@TI!~ zXF*I!gW9FT0<|gKhrHH^47G3ZP}tLKALBtpPxV=K^tI(#;@*SZNzK^Xgg*)oX21Zq zv*_&Sz6u!|f?(j!29O*L1Z3z%fa{11GST9LW7%_d_tQk5({r}V+(d}x*;g9~;sNtThFQ)JA+EK;-irSW@u^oJ$>*f+2)6&se2#aid0!~ zB*M;Vz`(5%L!o~43j&nZd;pWH7e1?K(6Tm0`Ye-9G{AO(Z>eI5XV5V^3eZWD>*r8#KoB01q;n_76*qevO|LHz*ME>XW3 zM(b%A0nYqq#!0h!1GXTh42~s1fG$&GYeM_m01c#EBpm>8EuFAP!}~2!i634?JQ%Di zROQZrytc4Z_Nfky(3XDTdSEnll+f|`XTcw0qR#CCySP9vlK1)I(~KiNO6sSAcG8w} z(4IYkXkHes+uu|Gq5# zS*cLeAHaZl_V|$p2v{z)UPA%g0{Twp7zLSY%88X#MniG;JW;<1ag{K1;g|~4TT8D= z?w_RrGC%`*gV+eJ_lGt`qIzDUvIYl=i`_O_g)Y4r%!ha!V+uAJP8mn6uPM7y5>FT)|-H6$Tqe`^nIg(#14Sh#9@ zNtUM*IW2#cEGYm5*jX?KEj;dlGAX*F5m#p z0OQoXM(rkqSV}cQT%ZTe?jwEWM@s8VSj#)1YbZURJ46E4z2TPTatZ-O(=AXX7>|@{ ztyQf2{w}Yw=m`**+NvGz{9lZq+YgJIeGg8}>~B_4sFRyx53Fr0tLYkPt^67^2~bj+ z-5V>L8%O&&!TpN|So>`nY#K|rOL|x4%(hfOTv17z+Er`cYtx<_RyA@aHy7qtmMpK# z_ZItFs;rki&T9~Vl+>s9BSGezQ+1**zoLpLa3EV*Tx2>O<%C)^a`o`3{%ZpOyB$5<|Wb#4KC^{MX&hxLR(L~@kr{Ymw| zEHT?bwa;>zp(t@4=Um;HqM~x&(8HExu(m))6m-#puHRXOGHD7f3#dQfAg+X-&8(ZJ zc!>As_&vIQeBN62igkxtq(Qw(YHCa~=2*^bV=&vIHSff;b%FUt4`W>?e}K3w zUC$Y9>8)gXma8h)HG5uplg0*QZDn?1mQ@uYkgKQ~>c`T><}wH+3=kz@4ulA`TbTZt zd{Sptm9%AAeY3BckuMiJB@SZdO$lK+1kIpqW7VxVeDFU-DN8^xkm(NVdh9f?!P@e8 zp3J{%SGiYrsxPK&PtCuBjx<%*f*|GQqIuJvh}!bLM&x@o3#SjFLj0j!4=hy_jZ%Kn zwQ1K#^b@VX+_js6@$w-$5a`n`kqALWd>%1)i0kKd`j2rb`Z#CCiuXYB0dqqJ;h?n5~YZqFY%f{zDlG?>D=R zk>rvyX}V0MuMg3S8Iy(bvaB`F(fZNn9dz*Eo4(!IyCEH=ii zcirB*;AWjdj4LdU+r5+Oughp2hw>tpYIgg(__|J;21cHzKB+0LYvsMj;Fwn1`}vo~ zCxxMIYAz4+^LwPDOBwgGtYOOfho*%AOfRp)!zfpi(6P0Wx;f~IJemt(`t6Y6I2g(a zX~Q|y2@N)T9*(DVW(B*!4YK&BUw2#Yw`kb-7zvqERW$`#`6D_nJD5?6WG`xGLmb>* z<1Xi^WkYe4((8E1S~e#&%SUU68js8nPcQ_0*{<~DBzK~^b(ZFR;TB^7XIZjpk`bz5 zf+0Ea#>e_U;U)Cc!UPcmmZitoCEObXQmBw?$=OGJA=O_*$LwLB#AycXX1YMG08&WOOF zRAIjg)ECnedSAYeuU$2FrZ0ED9@hS9x8C^tJ<hA#y#TY8HqyZ_p8wfQup%Bq>+~W6Z*1-n#N;MbZ3r=)LEvSHRQbc$(*!S-lwjrw#X^Wtn)_;leYu8`Q4ml$#9 zA7sEB2tL)22`nGgG0EYy>h8z!N$Nl9u-Z(dsQOEv2#VK$>+XD0b~Rh0X-ZR@PR+~y zowY4)jQYt&yFS2xzQ8r!`0kW%E5Petv3GBq(O)DV-eURN)8>=Lc_oHCIIC2bP#RUe zfSBb^h<$)kg}NMSzv_4m(pr4Q`b<9W5)3kv7e&Fu7+8&}%YI3jv?`s?3wx*`}1 z$0tqZu$02AzEUWyk0}g5)fL*+1U)w?wO@Gw`CH->oY3q~{=#0%6m~{%ESjwA=WliF zbf!G=H*ni!_S5(^Z+`pdQ5OdBT}^54WyY%bIpJsAz`b>(3LvulF+kH?CcdVoW@q?< z0EAUy0DB^kKmdRvHe^3SR72F$p~6JfL%_pu1Brl%0tRCIlvVHQ=|u2_ge)n)e0Y^a z%E_$!yzW2xcX!VdOV(lGey?W}TsH^U**UEh;wn?C{xVRCK%tfHHf}-Vzd%7!1!mJO!qUvyo?%3T1SSS-CSL81XaUClqMthOtS)?ieIoZmQ`tM{-J(Z$)=X~ylrQd>yXF(+nJfq>mE`&tOh zJE5aEmKpkFSx#X6;JPZizPMbgWB)=&DLvs;uB{57#2$&4$PB&G69v?I?R%u%oE8ykeR8JZJ!Xhy0lcdjl#-y}i z@`q%%wC;qHt++U1|1UdtwH`=^09c%I;Xer5*Eq~^=iw+60-s#gcAxu2Rq;ruS*j3i86uvz8|QTiXWdNKsa83~UYdIA|Xw|Ga!SO2hFmjE0D zmNjFIGEw=xnhl6_9>8mBk>!&BS{sb_CXVkHYUn78@=mSDoLyBQG4dD(er~&SKZflC zB)t8>1GujJg1vrku9v{-N+rXCulV!>Am@*}%HoCUv+4zUM|xU5$ANhkd7hC)&Y>B` zxF(de?QMD<6n)s8ls490G-iLo$o^orP=eyZ(20xHR`AzE~y7HEX zC53XAuI+Jt!N`)WZw#OdfsT1=d$W~caPwv&MAelr13R17^) z@qsXHj_GmTk?`USo#l%{tl}#UCEuHhG~5~x7ZXr-U0b-}v`dmY0C^vx;*hl89VSlEk5YJ8`^FH34hoY$}002 zWuv`6GV^Q7Jg41>(ZdegM9o=c-uuxN)A)jR;HVDvw7tS)~1wLJIR3Q@ZLPFQ_?VyPGC=R z*||zt?nZ9!Mmv0lC9MYa`h`IMv^69*d6xBqj5D+YlY-dkN8zcN+MMc<}$Z9tFpR+ z{<=PmY+YX1DlK@8xPwfcEbOb^Yw|$i13N)3^27D#DG0aUk?!=FrPM80DB!k z5f8AI;|DZWE%J1|P{CMN`K644*i<~U`V#Rb`}Qep#h%@1vVK4E9*^A^R%Q@vgGuHE zrins_!~%${;%Imo!CyY%?QqJ|m-K0VYm;}CJDCh#dTg17Y5y$cwZAFn{KVIZ+fBYP z;h?64A76Iy;ytxffRZ{wvT#nOP)>zy?788(y-;SCqZpE+btoT=-V{?sVO0-xGbz@P zhkP8{)J}Ji5d7@>Ln3jp%;@ULK3>kPY;J4s_l1QL9`wT|sQQfKbWh3rC>RwL*&3vy zP1A`jlE|z-E!TuGKzu=8pS#cPDXMJb{yF(X)`T zC?u4CWXgCm<6sxPTD?r|nl;&sXU)uPBS~D~r}TTFwvItA8Wz%IQ3Cs@_JM_qK_iH6 z!^&?0E7xCpJ*jhZapf*+eiC;?>b`7=FTn365Ko{9t>D z&A%Ho8_*yiV&0R2_)JCvMU$2(|25`&V|=99_~4FXzGJ0KjQl)%9VOt5J`3NCjbG5m-u*C0gLgrENtEYT!J{|TtL`2uX5+H%hK%?)fF1*(-O}MC zP7RwDFXl9-uKlg|)ZypQ&Bl)}#`TeU{&ysRFV&u}#ZMu>J)qAYKI73lJ-F;U-Qx8X z8I&6}SL4`5m!}3N=b+8@B0uWhzyN^oMPe()T~1wEhJd$G_a~er9Ni1Ga4g3z+-FwY zy6<64j6SvSjoYyj5}&2Ff`4rC>|2jz0Y>sL8vl$Z#PM#N3Z`ruS%s#??OZ%x4TpSI zrn&QN*c0>@-|R$r(;EYInyCO*IO{ns*Bf0m2^!X~x~I!9R%au_DOyvgyP(CB0_I7& z)efVx$cbB_P`2|JEYp%3T}w6qabn_F<-*l(jK{1Pe_~B2BW8&9p)~5X?uW%ro+Rl% z(k(C^;n%-%p{Dbq*KMRT7fSuQSPac#pAizN$}82+3e1W{3EL&y3=o8YBs-?J9mbVl zi1YF&Rl07y*??pcnrev^o-=^&Mvu9WP z;g>>_r z(uHl4;iwz#0K+@21OlqWmGO&FMyo#HV)Qn2(=u|V(dJ?ojQH15cFVT{riENtv^B>K z-TkiBDR@&+2%jKiA3oe3p35!fsx2C@Ps+%Gx908bJFP#2&){|bj%erKu|oI|kb8Qy z)qVDkqTqp1t#WNt|FE7!Rd0El9>h{ozDRCo^&smy>Y~vH{K(0kJbG#`wt07v_M3Z} zy5Hs&*!SOg+4Ix+)3eAP6R+N?+X@ zJ9U1~vD+Yn%FMyU`uvd4?5|zIXkNjPo`r|zRFHDv{W_^DJ@)Lk&F`2FEWCl+kb*PF zgUy~aQ;H~R&?Z7Nc6j+jhtX17qv0 z#X^$V@2_uzCYu70Nz)npZ^ z;*_h*;(4DgJ|*TgarHE}2*p135uCA~O;82GG;kRh82+8Uu}rLtf64w;{+s_zOiaxG zpVEKPfAjd}^H(Ob#$P%AN-XsBxPQ~X%5-$NEZ>~}mj5MzmiAxxzmizLwfPtAcl}@5 zf9U?J-G6wnF*5#}*I)kM{J!~oOJrvJr<=^*{roS@zxn?I|F1ow|11AHF@4wn&Hu{& zhwh*JuXX-a|BofUY5(f?7x$m^*NzO|hGeAuYiK$~mT$?7Y=1$fZ!8lF^IwqVFP7=w zAlrW#{cjB`{kP8a^jf%Dxc|+IO#jo1f0d^F&*wkR`!4-Ia@>F9{Qu~s{9DF%>3?%H^S3Vl8Lsq9|0hNM*8Fw&-}-+T{@?O{ z=>I#mNt{JO797Z(D}% z`Q>l=movXd&v&c;%@8c#RR1yrCnt@tnWck~9gVQ1o`aE~k%5h&5sjpgwTXi%EPz$?$N*7Z(RMzRD{!DDN+VIgnR?`X#CVu8W~Dd8QSBF-!P zV2ZHzT|2Dr^IXoGM%!0pDcB4VlWPGIs_}g2zwNS^04o??%1*6}fBhtB*-DDAKN{*O z0RH5gAS#A&l3|8!F?pv_lbn>Pd1HSlcw-vG$(S*Lmn5rUoy|e}rSlNcL*aBx`JlB4 z`{$jFyE$Z9c|)@=Mb|cTRd?2lpBN+&(6vY&y7ObnhGw2N%_cMK%|+%?nK3#{Q36iX z*4d-vd_k!wVQLdUjfqHHg+<;Vk#};>%8c$0f8rff0)y@6|7pViJ3IW}4adOrJs17Q zigdWF^t7zB|J{)1o=_f&3yn{!Zy5~L_Hi-s4CQ`%?UPpcNyol|TO5Pw2Qu>vJANo2-G!p&Oki4f9*7lYWASeQk4 z9Etr)&Xw`a#xsbh)VEtnXzIT;11qcx&G6>KxvuU?bVt+f(vIIDVJv(8W_%_zId52^BW zuJG)Rw6|Oo?E4a9hjOw3+%H~>l7vgO%m|qcJFl;T2G7zm=}9u@0!ZK4W_H`MmE+=tV+672gN*@H0&UqE;_k_L zcp=piaL8Vcamh#vRgTTE&E#BC)DHdjx!Xvm1z0Bdo0VsrCkpH$uf^UH?dEv`57LL| zs--F6!F6Y56Fv2dkPRSP|Ag~*#Cyz2%u82?zYR)ld7e2{{QS z16b^D;!6W}!}$Az<-s#4K?kGb=Q?pWPTp32dPnLI+KPecxaxj+~qH8k7pKy*M*olJd1$t6#I@`_h2v5L$}R$ zmcZ4kA2M8P)I^xin%jyETaMaWk2dLV03UbY7WR8fYs=7IdtZ6AEFZ~DnfJFmo*9{p zP#FN&uTz)qKA@&PpvT#Kw~TG)?T>oj@K)^dVNci9YH)Y*{?q5tGdnL3BQMas7Gi!6 zH`KD2@5fdn&0oy_^}4?jxcv?r_HVA<7_~T_OW4rU05H=4A2!6^TT4~$J)PSIXt&NH zw+0S@4h)II7N&ljk%J@UW&s{3`|NG}lO!9@oux1(GzC9rFBp}(GQ)Zq_Jc{`>eRI* z>JMrajg}i{91iHpl%wP`Z$Yh^jAxC9ALJ<`m9TTbB5yWx)9MZG3LS#+%E|hssRmiY z&6;Y^*l*e??PylNB;kg;11@P|cmUw?!4kqxAc^9z0Umz)c}4cQD1`)23!nK!}iRl#<4LC&>FKU^S7&{F^oY<6TzO4n;VQiMJ5u>~n9 zks4i@UWf*8D}H{Sf&Shu5@I}Ppr!oWEJG0N*f>9-ot?=3fkJOd-;5Ar)AMdlSDxKF z5fZWd!cz$GTtcbfoQbBk1moG4ImVXotja=X-gA;pn2Qv$4d@xrPg`x_W1~5X`#4)P zwCG<7jBPc#hF+T?>lxv7!6rtqm}#+DNvGIxd8PjGU_?a3e})DI1x19~G7xrP-BTva z>C%zab|ZpR+J;z6v+hBoGcL1e@ia8sF=wV-v<3V{1m>QhtT@&E^@_AiOZ#t6tJO~V zBt9~T?9B%hGq^O%9W1hvDb~}XCo<&2U$sy!*(dD#N@VCyF(cc69uklN8b+U8QPP5$ zOcS$iBn}&um=$x{CuucW+dD>*xH8zS^h$zq4@2!)oahQ^k3aQ;&f)l4~rygV4$B|-~7F^id(M`Txr zjx{wcq!pWpU%ad$%PlVC!s)uMJ_j}3pu2JTsWM6Rn|df|RR&k~#iXT#rYQaPlDZV1 znf+aPSlc$Xez#g>)iX=j0cg3YD) zbYlP%(@H-_W|gikM?V2SO8efs_#9iN9K*O!rTJ;=F#S%fJ3eAx{>03-SS6-C231(m z%sjIR<2bJ)H0hLP#jrVwN@3F@&4Dv1tB2XM{{P( z)SMK>^PtsCX_@;(TqNa_{g?qoM-{}zZPOK;&`J0rhT^;~Df)h5DzVu_ z1P^$Hw~>`pryW+M(bp@NTUvk*G?g9tmFIZfvuTwahLTq&#<`RX#uEyJ7j*1q)V7o~ zy6-c3q(&5EoyEo^2m{Rxx@W*3`59$W5gl|7JdY>c@pkoy`O^PUsfkI>qEkcDj_%xk z1-v@9LVQo0b5)ucZ(?2pX}e+dSzR4$Z@jUBv5M^K8C|iSII%uETzh$JIvfqEhdPBi z*GS&~+1&*jpE5LvtHze-*tU{JmdUQcU}bF8jMN;=#MG!g>EbG&ruDt!uyF%pQZqj> zTzQ6+n$ea|3EK7Y0JWdHRD(p_%+x5qwG1GeBHD%Ds;GhbsY1Tkv9NU{?!UR6VU}0COi)4+W@L@PNEu}drJ2;Fu#NngeBJC)qWiy{05-xeX~j#V}2!^$L}v6YO8Rf zdp7_j7juIy0Z)*=7QeQ>MyTP3lC%B+)`MuSk-H|Yxk}D;>R2`@pMDQs31ELBg4~N< zdi>!_U5t&4|I6^h~0CE2YW|u^9W85prqAw%}H{;)O+Ii z+wfPArN~Hx#V^Y9B}buwu*>eN$lpI(G&))d{1d57JhYkeek0M9inaN!tIi(8_~RY% zh81Q}O%Mg|6mO#JjBAA6i0f+O4{WE3CyE!Uj`~-`Ad-#HT08`S4VgW_PK@_Qj1{`{ z6Y|?li;9LDJ|32?dWo_4br+3c5Wj2eIS%gsN>COv4hvckR~;xt03*UwUNjyrC>lE* zUQ;zsHm9Ay2oMU4hL-EX_(tpTx+BhiR)7CR|Grd$O3U`f73xVMbx<+Ld4L3hw;t`p zO*RaQ8pfwqUkp~Keljg+4TnuU+gz4GGv9Mpp*pL1g-^N?K$!cV&jX%n2*(n&c(=j0_l5h1E zicU6q4`^yP-^e%W@r8Pto~?ICxoNrCxgC<0re$k|T8CEZa`0w18W|OL3Ys1JMjbGZ4)Nq8W&0Aew<_HW1Cm=&fLZXaJ%Chz1}U3`7GE z4L~#i(O@8izYRb%7>H^hs)48mqS`=I15ph`H4xPXq8f;5AgT?74ulSb4uozXbRcvf zbRcvCp#z}4TE3DEGvo^T*pSQVm?3YYPD9>G9frJx?l9ys zDm3I$N;f3>Gh_>?7Uoq8BT8d&1WX2B1zrf=0u~QRhrni|b_D!3IKT_^A##LyvU!Vn zxA~A+*=_DK^9a*q(-zZi(;<_x+tg>`T4@q@80RRC7TRExD^Pv{#!UoeiBT)zBQfqs zoU;Y^jN~JA*9q;DOm-xb9m-_8GuehrR%+#!FxfciG%Cd7p2})pJgt|Nc&H$%?H8BLm zioduS>9XkE+`&4!e(oTv7$;*WaQnR(xez{Y#$7>d6S`(7fFmEBJdes>)o8nc6L1cL| z(uH*<21FSz zJ)v$=KL-3G1QzM>hUSwYj->h64Be(4$bJOIrK-2oChT#4=nP4ZkWZ@}X=~Mo&=*VF zt3Ie+q~4wFv!MAd_`TK`!mHka*Uepel)6&QRa>%;tBci3)kbxyTAzk?uX=@gK)6YD ztd{TEt5&1KiI_#2SG^?7XSg_Cy;;@O47Er*AmU4-gZ&m}9}p3syx{1=5#P)-pUCm) zg+AueGtDQ>8_l!KW#+MFw|R(pusPWrZHcrvE#Vfs#b&WsOcvR~Eo6!I1^V72eWXxlsr*V6|b6B#;QC$bEs;z=J|Y@+sABpn^W9n%oABf zRW)Uv(OFeKb6~2cFssUAuAWuf$=Ka>X!YRYP;oT9#J_}w9CyEbuc?_m?4|PVMZB3z|2xcnlQt8QYOr>MnSuDz+smn z1ng`MN;mA%Z4SduX2P!Xm{wWQscD8y8qqPs=2#k?XM>CZwxTmV-LP_NtX5dDTDN96 zHq7WqRbi5?8YT?Sbw)=jGY0eId}WdrGATG`QeccFv9D~@piT79vo_H~VUzX$NKIu~ ztZPK;^5?|&sT$msP2dL4x+U}CJu7ExTIcfC&^NHs8)na$CuC!jr`6q5;aTpk&^kvv z_YLajgnER#qLZGhtf}pMPH(F4j?hO`x*IF%x=M;`OD`B}?YXgPi@%|>V$oTx7^|f8 z8`PyjT_VOR6=Ri(u}bt3W30;gBJZnfJ1taJSAIoMcJVM9a=0NWrLHX2**s1pbobbl z_~l9aWMVrgEUV6Acb9n_V4=z`%`O!x>@%SX7vGEwsp6N9O-b6vc7#+;G`rkobT+gk zjH)~ZQ>r{E(`MF+RPpGI-@Imv1sUpis+?beFI=}6jL-R&wD=pT<(sIrwRN#5TC)}t zRe3U}Re45DfhT4&hH9v&L)%4X+a$?o>$F-ceSsb*v)}}45yOdE7Ry2ebsOHg%)H&y zZsy`up`|M^Id9=X+`(6X@gB#QdUK4|XTG#+NSb(mY3a%-2ui%J3h7Nu$-@X;g@6i~ z7L>Xx8$WXQ#pkOD# zt8>Ly)Y2-t67j?-t?Z*g25+Z9ays6%C~*8N`{xIa3!RYsPdL$&gB&6+Jwd-^LzzZh z>@>yE7c7B|poz%Rzu^&XH}%tfc+Ib&%`6h{Zm~3-CNdc|S+t%#6j&1YkS?Yl($>H; z?2f=r=r_(g`(?PsRIoWOiMDGi}Eo)vgK@HVAW9X&=* zz^5$MBTt|dT0pDl0hS>B0=4_-C*)^#UN4m^hcMDann5?vQfi}}^dgI7)ygsDWZ;&- z`^d&98VaB0(}%2pP2$^RdthAPO`1jB^gQM(K0Wd*dAl;pUlRCn;HP*Ce}>uE0d`o) zQ||7+J@9DYDYC<#5s1iT7-u$ppAORt^cVUoUlCYA6KEPn{y9r#8cRpSU*`#YIbSXv zHGX1M4{uv(3wf|2`)EHML~MRXee^DiW=ZT)Hk;kU{>trqE3g({Rv@;IQ5Wr@U(;*!SNfDbXHGVn&0~);59?zeb1NUhC-Y{$8E?@~N|#CZNQdPD zxlCRlzbwD0{6JY}ZZ!MPboe*HcqZ@)awi=9r_*>u^mb&$HabK{(fb?p7X4A= z5BeX=X0j_W%3`*L-OHY2KWDG7KVg<+e1`C`yaJ;xo$=~81 z@y{eh8X}F77D{5QJoHP}i=9-#K zADHhj-)Z?(e`fz5{N$hK_xQVzyB1{9GDPAL+KRm2gEe>&5&bnh?xRy!g+!LZGT?U+ z8_%lPBz8Hwf;F)_*lPAe_5gc`ZDmhk2ABgk!}ly+%BS&0-o)?ZtNC4g4?g?&3;cC{ zjGut#agtlgl14}qrJ2$!=?2W9MOrT1iOAj~?Uas4N2T|r52O=VwK#dO+$t}VAC$Mt zd*oM??gvsF2y^eC?=XOuH0Zb~!_GUb@AHSI9{(QGo0GFO||nqM`4YH4PJSSCEz z&i~OPPrx1=%y;r=c?COxhGe{bL}2DwSchrY6`xXx`;R$k-K$>*fBffXR z_EQ1-Ijt~pN&F`hedJ}o=Y8^X{9<~IHLwJEyL5x{B2S@RIE^;)1AIR#qdmNs&)^SB z#NNf-@m=KmO>{3?z!uXkc7lyzx3NODf?nmZ(lmA_6$iF*nOWIHc9P%$-7e3iE5H3m zs;r29Papapksb1_IG=p987uk(z0Dq{(@Y6`jMGiRY1D{QW8&17@0-nIbf$s-y4lJaXfIZEIv(u~{JHiJ=A1~3PNRj;#+03$^QG&&! z__=g|rIQs0XFSDcIX^G%FTTuqs(4a=F_ob1JcD9HZi*|#m4*UuTy#d0dd}zyeMy?! zBmNbL54rpS?%4`i>6U#wpTc;ao@GD;uB-;0NVBnpOom^@hkdSm9wwUl!6|lUE zPKiS5WUep1@P864#S82L{}et?IZ93%uZItf*e-F4m66p+k(PsOi1-g-P!ghLvwmuS zNRxAAE(;G_+ZKd8IE5flNr|)AiIrpZ%$?2)oKd3+^Er=+j*N@tO@|+BpEKjmp0(Fp zT;TRkd7u6DL)%UT6aS8ft`?q@!xP=`WTGCQ!82^v@M~=M^X+^`xY=rP z622mx!Y4xh7(VT>e5yQT7v4l(YsBM3|M3f*i5e#rjO0>&Y-CKdnM;+^D#i@DdhMb6 zx0h8t;h*At_KUY$|I8j|IluJ}{^FHS{HOe13Qt=7-E12Z_koh9t(Gv8&Fo`?^(527 zY;>5-b|XtSr$&%U8s#EC6YSS4iO)h3*H1d$kFh76IMvTwMdT6-5tR}XZ8DiNMvW?T zuV)FFtuqU!PvC1YhIji;a2zkII$e$o4g++Do~TG4p_fh98NEzGLVrH#gptmx zm5Z`&bN*~Zu9@W{u@)Tl-;GsheJccxdZ zuR2`LcrBjCitb9TtZgkrTlqbX-Mrkdl0CGM?KKheRI>OGr8T)35wpBpg1G zwMej7R;sUOd2z8Wr`hBlLM~_FsJI~}v&rR*jm^&+RXED!Oi$-|uidm^k&_n$_Y zUmcq~a&mr9C_NAC@n7X{*t;1Uw}U;hck_p(HP`z=hxO8$>u_50!=+f4tvJxq5d$mD z(5(yjEqooqD*M>5uB#NL`1qC2SghEwb}OE}YsLR~#Orm3Lb57rvPYKX1lvBg9e1(d z@)b`Kr=1b_Q}rj198{l@;xd^FMx_?!OX>difAq=?jOQMg-5V?~C6lcMP(a5;YoXDomUpm&cbU zlqXtJ<5Lq-6Q$U6d4{|u{^6vD2R)p;bI{IYOC%*bleOd#$xD*&Ox~FMda@;1tV?Wk z%*bT!v_~X6vF==CppG;W?~hm`^6^KzII~BHZw0zldybvk#oF0Bq7>_~*jU^+7$vF^ z$DB)f!r-$Dc*QN>*OS@q(@l9B^GURROu!5d)+J=|F& zTbxCT#Rcgq3clCXb(+MF_w_JqQbH0>ielo)3mxIBzD{ID)s)(UloaTrLEz*--{{e! z>)4`t>{mmruX4>DpTceemL+o|@A&yYy6bx>%)2*egj`rD61j zp0_&Yg&2Ozpml?IhxE9zJ$kRSPuUy&X8cTdOrs;GVDW0O-^YGPLGvACt|7$sz$+f1iI+X)%yD$1!3Er=+@<)RbfCL#_m zBcvj#2r9xy^-*cY-ZG+RE{r`F#&JA9PyAy$b1VvS4@sTGoQ@l(T)y(1-e z9A2DsVAWy&$#=1z5L~$eakY_y-qwrknxn{SPq1g%r`Z?S|7bUza4?e`E2qgr9TOb0 z9NQhwIDX-@VBjvMUr!T7)+XPdf!H-<2QZb}<*@ z%lmimTR+~r*MHK#n`L}1J$B~Gzxm(bgV|^PFl5{;WL$yLfpfvB53_`8_QJ@@$cYIL zIvxqXKl06RYoseGGR5VNTosAqh&gPCLZr*(MRy-Uoxq7+0BhN zHyq!{-|zqP@GEEUXY%|F{+9y8Zce^x;f9T?S1(B6U;6*!KXUvh-+21&pT3D)yc`kF zL@vgWn-1z@uMKOpthU^ruwB`1c|3e)RCoAZ*TJYB*O4ekj55kq;anE`H2;mWH`=_P zjsPw*b9|&TNyDKfLO2*9O6rJks3|!qJVgX7rK7~kbZf6QV3n*sHo0pzV@w2Vh$`n` zS#)DfViauWrGt-6wljNTTKuudgw(IyCrHp%$AN+r0nSb8?yZ%R)Pq}PfbIp`ydD`Hb z>h}Iy{ik02KmL=fj;&>z*xdbRK3sd>vUM9)tw5Guj{O^tEDfU{bdwzD(?>+OM%uy> z!^X&?Z4;CkVLQYAldf+8jG{XCpL6Ctv$H!p``*oCA9*aEJc8)(>#?cm&&+Qu9X{PS|&Y~yKx6aqnGz% zj2K?92@sllN_hn8qD8mk1{%>p1*C;7V}%-$X&@fcW|~!dOxHoz`krt(BOVT8UqsWY zCem*#xbzS*{?7LtVV*_of6X&S8m_~r3@`i!d~$5>XN->}D=_k?GNkM+6S8xY1)aT@ z^&i2`QRh+D3HAif%v0yPm#TCDRb=Z=4YJiyci3h#_X@y@JPQh!7p_+}__r!A`d=AIN6Bu+Ls zkRw(yLT$I+ak(Jdo%~B}}uCm+3p1OhC1z5(!jLP?_wXNuLDw znOL-toO0dZLi7#$X!wusJ^R7`oSW71;1VN!;Zm1!r!k6oON?0+UrEVF*lOWYrALG7&Y1r^E}H;Owx1^M;HZvf@+m zpKQ>O7ReGjImMssOKWWfDS@1ZXT;fJ|F@OuMF#Dvi5s;)Bjv zTYh~7iN8OEa*X3&z5F4*Ytfid(;+_Rps_h)8#}K46v@X=A*bN>5{F2-BtWv|}WPh=`;mQDk@#p)kdRq~JM`VZtouW?4><^kDWa zl9^0`*-0rM(=^ABS#{mc@t9>8L9c&%TgyxQq~Xxg_ZqteM(XZ0z*1Ltam;`L8Fp!L(@2DdZxnIS zH2b>ooA&g+2aF?l5UMVE_XxVv*u!>TeGG@wr%9D$9a#Pzu)GUcb}@BQuU$}tX4n@N zea2j37%}1zxp;9T->c<%8a%knv%`Zu9(OF7uepS5;M$y`-_ErKGi_y<~MsM~M(FDFY~RN5fRuRR*N86FClg~2X_G)BsE@HLPC z9n7&2p#0@k{Ru7<7Q|?0By&&@TZc!!^3w9jbDEc}PCYw+q;b|zQ2g+(i|&|MKeG6L zwj-@0F=VX%z`JaB_765TPk%X4cwotW2ip_@Ge?YHv*N_thm9B6beFMEw53K3`9Tq3 z=6Cm=WA6fO9Hfrxqn3#)-7CFYs14jv@k9DU`Jc3yFUD-WQ;(Ao;E76Xx>=UT3DD$m?WdP-#!VVre_*}jW7$%I~p3vg4*Llz= z6;L9R(l0_LJCh(S*+~)gh={CVIVKh+01*lMygn8h9t`iGW>HnQtvHrGkq(xv4)R3T8fgQRH7 zCrPh#S9=77BV_=oP7Shsrk{^TlTWuSp|oUbN{{fk&b)oi*lL6S1aw> zgtxbE-#1OO6CZgRSjq+HsZ6cb2Ma9FjC@YZWl(o8-^SQ7JPO5nMA8V{E! zpew)_hM`u@Fz$)hxslgcW;JSkWvXl3D5T zL^7|ZncAzLgZu3J)T7D~^@Ms(wbNN#m_(bN8?4SHJP9M@&FagE8VNY9zQKiD zB-&gg+KRk=9W(`bBhU<|3$+P2Hyoy+%h57mNP)r*2|1)(sf?6YA?hNFx7-wUr1R>< zo;EXISkVW;M*w!-xT`2OKF)oq{qWiI2U4#M#i6g$os(C-fu?_O7Two8;_SOsKU#F@AI25q z%7|n)^poU@BGW&ArRR$bE74e#@)>OhkYAeOSQdto7XN{d3b zD(wm;uG#@=mr<~64fY{Y)iK?5-pv6x_fjfTjW<&!Y{;0K{z{wvN?U1wH2V zwvlaTPqS<;+rqZ87g(m9CDl2a5-|M{qNttJX^K8X@R)S!7#uOwY^L9}!JM1vO08K8 zZkr2tOYUzKinHC{*1>&j1lztzY>U?DL4iY>CP^%fX$F#&D2al^ih?MC>e#O*c+So9 z98E}!1SCe1L?A5^Ez*JvR|98(8>3`d;02}=-?y6`Eioh2m;v1J}XqWDYU>Qf?b_p1H&V-|9WRr)o@6BnHoeoqTSvbU(d}-bim0H%Z&+ zZu%WsdV@YjUzO;=(hwTY1+IeHAGqH0do;P0>+C%bQeUoR$`mhbZ0=enENiuJ zC&%_U0#)ws4WzX0F?9chyoit{MUQKt>8h5d84Yjo?WW&=cvCxXyUU_%XnB zdLDi}{r1&|@Xmi4x4}q01335``wGQUgY{q|PrQVI3{D9Q8{{#4qwTqVT{l9UK|JKn zbjC?c|MffrpLd#l<;sY!3624nfn?~WY}l{MGF>1P$TS1d2av6cSp$<&c;KLgQQwJPl{ihC`uk2WPBo@DM;mlp(K&D@q9UF zx0M4uRcS0V3QAHY8?%>o@GL>M7ba!0fm54xmF&m@P2>~iB}yQ^TU$ds)*8qZD(z7} z>>(#YoxOwfzVInwMi9kvs}zT2Nh+r?>|%Hu+QwjPgP;<5A=i%Vok-b39@_2315ALJ zlCproH+Ec-E$4N9iGYNIOJEcZ%3;}tJMjQr14Pi_LQ02=sPbGwjNxq*f^q6akXs40 z=5K0EFrcQ}(rqu%z3h)r+7$fh<}@P(ujM7A z^I##%k4Szvt&89lLfG<=L;FSIHKv$Km~b@IysCYlTq(56m1f5V2TPK|SlF<%moBGu znyI571=`Xf>=w?@+*|Z}!p8y~rb~q+JxFK}o}#x19rO-iC;hr0TOzfhGKuvHQ>32O zmD2Jg4wDVZh; z#cT9%S+<_tlHHo!p52kng|jbY<7~CCgF<9}vCJIvReQ1)zj>Yfm>fK1&9~L|n8oQf z&~ZsnX@uQaLW4qX?RsseX=wScr?1?DhM`A|#l}IS%UF#1eYR`YUq0Qx|1|#a^oG{m ziGjv!W0UcWF$d(vjBkwI-rlR1uMj&B?tK}efY@Pyp3kve?k+!lJBy~X$62g7^A)?D z3aNy>Iw-;WFS^2;n_ZUaADgW@ZbbR4o2A8dWs#w=->C~2Fpy3eff|biFmx@WPoGAg zAp4lb+wWOFYSue%{O6AOL+=`1*}-;uBcJYA-Z|6hNuOX28!aXG+}b!pk>G;~R|Bp? zd8i0=S%0|NF~TvCpC!+-k$KaO*gpG7QQ`zn@(Et4zrD_0=imiZbh_T>pE-GAWAtFP${?n1k?8-b*N1$%%a`=k^MwV$lH9@$btmZPdi0gk8o)r`_cK0UKX%eC zN*~Zk>|BH#aq>Rv(xR^?uvD&$bGmz~p=rRdi6zmboz9mM8nbrPfx2rk|=79!| z-r22@qhq>5t5(8VwPd~=Y zj8-S}OQ-$#;Ny$`_(Oz? zOGv&&eRYZB!>EiRkI|AtCv9)Ut+*Yp#taS!>6bI3GJ4W345LzG%^1SwwyDF;WH715 zq@QFOkmzZ2%D9vHxiN}4eEISf@(}MYAYo--m);lD{oWIvv)m<4R%|vzVLsm_+T^hE9wAkxFbp+@T0(Sds6B+kp|Vg%=un6W zAy81^Kw02WfDRBK2>x4P*kgi$DX3f#Ck%<#3~k7HsvXCoq$E@M3lx`KPyTFidl1FT z9yJicKQ^38c09H>Rz}4XlFN)DNJh5WeA}Fe?#pVA}n<=l}h+~uCvOXn>poojOoxG z)#6HffhLUuGMzGslDTAo0xd+PB9;cia{3~=75xNFM+4LUkL|wlCNmf$to8SG*s-RD z9i%_&WJ1ztX0pV*#6HizByN>IK_Bwmqw)r{mfpm!=QoLKCN`wvOvl?Rx>A3X=>$d8>VQ zzvxU#{b6&BkeaB|*49SN?T0KolOOa?V<4K03Q!nLGzP%YFOAoXZk)ykjXvl^dO+Ha zt{AMj_6mA832ZM=Z<86$-{`l*;#h9+B8bg~$x3XF$zZ z4Iql;cj~1x)?x&bpMBNNjJ6SOtRn#bs97$MMPLXV?waCuVsH8!nu40p7&Jb87SE(d zrw`y^SAU(}2p;DJggj_!muY0y=)zt{HII>&0eKq+m_!^X6Imj;ZBMu`iAahKfr}%W z=X5y1h2a3=k#NVmY}j4>%MxRiADBbRU|-wW1|lI}&g>5>N6vT!%Y*pWp4Ql*#3l zY9Kj^Px1HSnfzS5i2pgi7r(}f*;wWK;xJ!}%QCv7k$()gOHay|@de(InNuQQKq?`L z3K$kh3n=38(l|Yy>38*0dI*x~{g*$x8v7c0HKO-CQ^MRr#i(-BrqAGmLKd6t4UP;A z&l-{ciF(Q@_7BtrCKgN!OfOhg@KoRz!RLcrp`*dyhHM~FG} z?CfGxLFsVTGWht2p5?5K=phw0{$MiFiSOUb@HRy%Ce8uBGh6tz*}@gYaD}eB<(z&6 zLLV`%H09d1*f6O1UJ&%U-J7%p8!ICVUxY9hj)O!<*h^Las>~EPQ5WXit+@ydP3=v*|K5Sl zdODPEd?BkmJ$!3w>%j@XeCq8x8t2rHLwEK6BCl%Fusd$6P-XnTC7aeZt=w;Pu6p#2 ztg3)eSGRk`SyykV`Wsb$-8E&Gt|do2ka}e4 z^r_3(?(~JV#yR5~^T8nPX*OoA!dYOWWra?WTu@l6I2@xRdq@g`5fGB+b_0Oe)=op(L=G=9DQNE~Rw1 zj;dG`7egNstMM)R}}e z`vSw42$ zn(YTSPnlEto5PUg7{sIe7l;}k2e!LA<2S4IzFHI4BsFQ4w`>5{xGajTIqf-kAf2=g z^dti#>0!2!o?(HFqUbi=MJ8UO+hyMFfT56lee6mBBA()KP{AjO??i+^_N1EYJ#4#V zd5p<{t%`%GA;DLancPfire=8ymuiYcDl;9_D$0G%2)fZ#n7fTDx9*y}-?(BN-u*BN zq_xsv58l0E>Gb=SZ=TYG3PDTRQD7}rueNT#WA<}f_dmPETt#x8DFk0}Q(5R&U6cxO zQYTk$6gMgB)NSkw(re;tN@q|I+-NwyovV`?a<(b^xP8H+(r<0YrIWVH{MU+-<;e2r zfDj(t?o2v7uY2C}&>qtpa%#=i?t>QpTn7QKHQHP3*zVUzD%lqZB~gWDP9SH8t%>Al zAFECDwOW6c+3F5}(+qeGno;f{&zZXYdfZ*>*K-`O0SNXJtTwq(ZQ7KC8r%e2p^=+`i?j?>lXmyD zO95t0m1q6~3Vxwglbhb{BhAh|qI8RScx$BAe898m3_;M8`SErgtYjx2Y9}9W*TGm8 zH#3)MfH18=&I(g&09qj8;$e^%#K$Q*Vk!@pr44=fTjcNm`3~c+kIqEy4|RIFrrpm9%f4sf|8v7%OJ5E=zqh^wW}W+!%bB1Tv2t^(|CraHWbyx2>80_cl3;9J;* zXIjf469B2?nV737kc)vclpn%`6ky<03!Cb4LU%KH$W>wL<#HcyqJoF4C5<>^{>{}J z=Pmq6!O&Xe2O|UfoZRApL&|I9(IOzL(mqCmbjjRig@A zp$!AdzRiY#yHEoZ)1Fh`HQO%|*L0a*&>8)4V82ZjS`SP?ib=Q4i-OcZjGL zNLkQa@9&M~C0F}9{J7PB!H>W4BR}OX@On(whHE=K=z<4%0=`-c8rtS2GSknncPVpZ zVg%v*J=N8~W=RSbYBEb2NfODy9_Vh;ghY<)qL)@2ynAy)ws9^zdT`zB3gaB4j09%x5sn8A+a6&_#)44$>*r>SCja+r^#YA@P{_mB{9b zE#eZf15U6s$5X)P9b_FVnR%qC6y!~g<#HHYxKX;T=$ zxny~w6Il;;80S!c*@qb8>Xng9!Ih7%Jtbn^;aGFdRPRIXk8NaeJG+xT#2#b6vL;HG zupMxMwH^S0T#cw}cR~f2f4P&)XJ;NN$;^wcA>IJU=%u#ke%|GCO%`SdOeceqLQ)+j z40C+0vYa{ePTsC?HdzL^$Ed(dnL`hZnLG*bZ-!oy3v71C3cD4>cHIMP=mN02n>|47 zQNPCtOxbrmQ$%hW@`%TB1g6P2mp8h4#Qg~{B>VUWsZ9;JIOpZ50~(j^HgcJQ&94rf zvGk{8+{Zu;*aSUQfHADsho491gs)v+dzhp6Jd3pe8xV1mI>9x;+vH!5H*gz-^|ns& z5BL-IkK!L}=h$=Hc}0Ce_#OT)?oHu{jh!c~M@Ui|WIl1GIt}vPOh1DNNkS=CQnQvYllAol`8O=A9P?Ou^WRa@c<0Nf zjISR<;dQfTKmGLV+3Rq072+N}>GAa} z676U#JB^*k(xuuY`wV-l#z>;WmTSXL+Inrc*4ALdwobf2@5A#j#x&-nI3=oLnb;~a zVsMGJMZ?Y75^aZeOk*^aDnK+z_%g=rr~`;(z**acvZ!nH@cNKmN(Jt;;0(qRM!34% z3gtGcey49N`Ew3r9a;H+Ci5v77}x8-#yL?38P%ab9M;k_@%F)k#*{Jz>wh?`@}DKQ zZa4l8eJq19RiTeX_^^J6b8<1E(C75UHfS5%>kFSQ5_xx>8*8sAUG}4qv$4y{r6|`& z8Lv!Lo|e~ZFGRa+{H-xPZ&<Vz8X{7(UZPa z{*6U17VRwNd=al6i6y;yR&Fxai%vo6s1PEJ`A_EKeBGa&%nufulb#Uijm4;}7?l>I z;+#mCiqs0Ak0#9!Ypu0tQmqx|WWFtsSlCHSeic%wsem$3WUlce_1+#Tqt+{lR!3e` z5bYnSi;P1}zWdNj-z6j=A7+A)D2}@n8;%E?8N}4Z<;EZi*134dJ@8|RbnBIB3y}iy z@AkxtK;l_#)GV;)k>k^Qa`UX?K+rtaL$LEh1@({CMK>sGqi;n&jB=5vO<|ZI>BnAR zM^uGbKk)UfMHwPt9!K*nDV`k!c7&{|In#pL(FH_PNHuHdjCrNY3s)kf-$^m3nYqAV z(gm*$Z|$w{>F~Zj9p2QZS5_r`MB)1M{64UO_jUMkO)<&%#s_skFh>wI277}z(|NOu zZhnz9d8szCI&ZFZXc;3@_s%Tog|C#gh9H2D5^4t>W%DlqN%Ilj-;^g@oA~?%XP@8@4kE`&*L@hGk}Y~*ZYL2Fp5ci90Tnm?M)6o;Gz7q*F*U_&cCr+}9_k(vQ7ol62D8Y~W%hl$rl1NF8nQVGa z=Xd!hIu~uO-BhmAZr_emdEYxy&K|Z%bFEfqz!5Dd0 z%rVov)O<+AY1Jv}3Q}R7L?)U4L^RAgGV{7*B-(9Y1cD{#v)d8vAdSgvq?FCY|6!!m z3Iju=fG-JH_;w>{a&Lv{Ya?V_o;LY>bb;P>b*-M8GW^-r6%W?pl#GU|n)ZC0a%}pd zc@G{U_e#!pT1M2Z>%q@~*#Ug&!4_BmeCqI#*!OZZFYx4u<|%vucWEveRDvdzcdB#M zWoVdCgJpJ%&s>_F)wO(MA(~L4gQ!ISWDh{%6%sI1T;n zH2!X+WjAo=p#a?jlYZR)8}f+iB`_c-#nK-j4{(G-XrsIc%hBu4NDr5)LOn73EDYK_ zbPmh#85rd0(VA3eVwoP;9OPt-5a zsxb9Z57C|gP<)l>cp%})2u(!idfG)?Hi8sqA$i0LV7r&CeJ0#Q{q*#R;%*B-HuT-6 zn|Zk1kx?9p6sw<2s+fA+{F!mYb!`pxTSr~CXl!J<*7b*1CC%`9CQO`TET zq&1pLUL@N=8UdK6=7K_vch7V$adTN2nk=IZVUUjlV_Ta8I~+E?C(qX7GQLPx;-4H| zqSNJ3nH0FNKHFe$wq@XqE_3z*4c2tE`Cj&sZN7azGS&CEk9d4xAMx!faCA9OlY=n> z?m{uUJBoG%mv5%p5`Z>Lr4(P=7yq<3ZYdA-fcBJ!0_?^Jb9ty8{sw$#@xXCmYuQ(w zXul>Njp8Z+9d_<%VR)#hqP);O(h(hzlAo7XESyX!s@=JHzugrcJ@#LAZ#&AJw3U@q zgagBp4q!)Ca(YfdN$S$zn9Wmto`Q5|ymI~>Td23m6d0-0&&a+oEK?)k8eGGT z7v|tOT%)Q{SczA1&8lW$y?Bdg5Y*Vr)-#fla9a{iO5*i&I)m5<9y9Vft&DwRlw?hp zZgts4mu=g&ZQHhO+qP|W*>-i=wt4IQzL~i*_x_oc87m{UBH}rbk!R(Jz4w@8MYgy} ztx3wj1N+JF@m-G{t)}R;aum)5edZq@rp&qv+p>feOEI1vJmcOqSy+hM)98Dq7miaG zX|K13wzFq%gIw5|!RJKYXY0?sFWk=+;g`HlD^ojI9w7-oq~pf0eH9>Cj2BDZ{C@m} z(y(mB0@4~-@ijV{L%qbT5Z`ZK*@52gA6Qps}49A}_G!z)r7GabovO z)AZhr~$O6V?kkO*fW+WN0DFrM|IB&UV29c@N zS?jB-OqK&j`Y4th4uMb^jh2=V{b|49Ao1{0NjnMBvazdnOxg?dGsg~`q|@EJJ>Lt6 z_eHGNlr*|L+KJosLFM6Uvwp>~+s1G@PnR4z9#L%%QjZ}=zXk{QOcIklEU(?ouHBoS z;-NqWOC8T-OlM5|V$Lo;+2KWn3q7!1U}yhgj_*aqCDNN1FY3MBQ|+l9Zxwu%39_tl z?|FJ(zp>19tQq5#$9a}u!+^mp!c8R<|{`sxiX!6@` zZ1`&i%&ILJBYdF5@j{YCm%MAnzw0&#=KM}rzQ!4+g#-s+o=1gAcnf;(bNeNd@e{s=Cf@c*U*nURGhLFd; z)ZwHYiC8|Hkp~nHLHE!s^9a2oZ0M^p`hy&?{F?p7G}Z|A7#miu^L|K&x;QU0Q)@M* zs)rMekGRJc7L68bF^+9leoIM_LACj53rw+!*G*2kxS<7~!6u(8iP&Vsyu4x6YWWqz znv=Fi8BC^3?uH?~x=)F(`gco?AZpi)L+v5<1Tj=?>j|}pDxB>Fg5MRC716JVearnL z@SUU!v9cAX{8XAS#RzlkexDNlG9omCxtYWJtPKC5_=+`zIsgZbdUbT*1rDzx# zm$nB=pVB~!_(fCi9E4$i{A}akm(+yuCZXD+zLH67ifuJpE*Sln;l9x+R)SL@8C zi%=>_Co_BpUfUgynbcLQtEe<$Oq*0w;UcwNy`AUgkLCjc=8GLe;e37eg2H`u8tTk| zJ4#GS2L&o4841EQsFcmJeqZ=**vKN=D`m&qHBvQ z#59c#01tzj$EDOk%Fk&H0X53DOPl7TPIbYQNtNhebBmeR8-D91u#7Faqf@B9L0dc= zb?dD$KYoYf&cp(1Fv_u|l$<@W^~d~{8pYmvu#r_@3nyBOi40lXKVf<%!~A1UHVtYo z0rQjSlC%R-T)Zhk4aqVFPgtS%Fr7NNu!Xz(cG%RW3Zwb)G)~!oJn^Z=Yhl{alT`cl>-PPM*XQHwJ!avn0#fJ&%ICM4`j(=YEbZMggcDTm33EUm z7=?@;cSS`+P~HlFhE4-0C>0moR zE}<&??RBvVI$%AFjYH6pf;4~x9hwxX)2u8RYyUoeRP0-Zph#)eIh|Hn0I9nT@p^rg zP-h;&Jnp&mNd7LgH=;!j%D!)0La$}mrl1IW$#3VCO6`3$G)QMaL@%tdv9+VZLzi^uKM!lQsurY$@6_Vb-nt!DPjZcr>3eJ&%fG zmzJ>J^U*^0pL0QV+n}gr=ZhV$?YVVbQ)PR4Kf1(k2HK#-+x+R|ITq15?V{S`W7!Wa z77V_3+dTjdOj?gI@98!96a!=&4jR+(A`H*>% z4Lj3L)f2gyz});Ty<|{VHDJb65eYKMk|}UWf1M_ZXkh5@65 zx~kA*f-jf1SGKGyT-G7{7BPde5F*;i__m>mmG7CeEFrVC*w7w6aDM+9tyMrhzwi=# zV?>1EQ8PHYhA&gpmXKuCJkznC%-NFrmp7frouNnIs+1%H8gM^)7pJgoQ^Z z*qTsf8hwGGd{E$wl()6XN4}ih(#Y`kpqsMtH424SgS)C||3RkQdmqVjIR$0;?PFhp zdq8!w*=}xgMOL!jWAYIjsS&GK+OXIaI~diltzlSIO))8h-Ca`a)^Zj0&JG_p0}Zo$ z%>DqrZ~p;4dSREyr%nyxu2YMpcceR(WlYPngO_TD2tQD#^UC3P_0r44KSz>!r#akZ zZK4P$I)PalULlKFngeleO0SVTltq5aCiE2q`(vDrJ3uhFFhkzyqlQK9DU}WX+%m${p zFB8}RQ7R8mA+%+Um01kkIAPMet_;W_c!#6qv;#VeZxIv4JEULb(t@5ObVZ0Y#kd z_uh&`c@&5_eo`O*3_d3%>Mxb`FhTq|FJ>iWGUsDiH8mE`1tGZNWp3xSr?K57O4LK6 zDVuFZ@4?{~ko}*BD1U;E?n2Hj8+-kMJjEAY=GBuSNmY+V5 zMGb1SsO=0NP9D(*_r>8#6P?CmmWh7Tp%WQUY>S0C@W&ETUivx6_hUfoHh>+I07p3% z$AUtrJw7C3LjbnZ>qdQk;voPrH?_X99=T^CHR|yzA#D*xRABMX-m)i!^vJx#3VPeR zWNZcLENkoq!?GAWrwC0Fj&{#*Ewt{Sd-%Oej2%vFM2g+Aa)Yu*m|0i7+5Dky@=uVDPh>=g@u01J24E{VDA?F2*0Fu)COzx1%kf&5eqF1gOk#{8hI}a^yECdb zAs*d*8AV7=H3fs7q>uoK3h%>s526OO6Sv0INSlx|`I)fQ!%fV?VcE#hbhqz*TRrBN zxsr>O2oYB|1!<>+i2dz@8jJ4F7c$j$gW1*P@_FXE>v7|G`0-QpzB+o%eZj^oYo4w=Ptc7@DWNmHP zuQ!g8ejoRaqEA(C+W9SY$wlf3t@vEYwB|%~iivHr>x@@Xa2nzEZ_3@pF@6G{u0e&s zY-&JSxL&sGtecYl(msVuF~P%Xp$zh37kF{bWswI`C@l-e1Q@f#$sTdIx2%Wn3{K0f z-61sV6*iTaue?>e)6OW2;rf9Z{+SDAXQSihY9jVD$(5C>3zK>@vqcrn#S`0r%-$qt z&9a63uzjWf*KCBnXk6Fc-2%tb`jiuB~Q-9ud6vd<<{-m)(v1<})yTDaG{ z4hEmX6K#C$H76=JHzkjJ&2OT$wa_zFPoGq#$!m2Ow!n~S0^(VrL{!GNi`42Sqc=B4 z*R<0l)eX?n@&uHAPhF*O{{3~u=HcQ7@5*55Q~@z5Urk$iFkWM!6(AWMqSz*Jg3Cgc z>7Z?R2;ho|YrJtt-QgR^dXI6XvUsgQdH*B^wSVbJyV3TM429Nea_jrB(iA0igR03g zSF1)n8w=m8kJLzjd>M3XeWA|2_De;CTEXWyjd!M1@F&B1cYT`3VAfn7m|*;~{543k zL~%}WkFs<~C255?4!D?Lg4AN&0FTE~3}}8jMpb?0qgH~5by23AEMm<5lAap3xNRDW z`3S$Y5C=7@^L(eF;H|+4`$?ajVQEF6#4=ppaiBjwT)BkQ#Yj{xF9_rL3yV8Ucg?Aj`sv z8o66Lk1&-`IPn$X7E^GN5+fXUqDHMPhbuI-GQHK(6?;z~A@I)S+qm)w1WTXl)JnjZ zS|Sds>B-)oz~4n@W#oq6d*dzX#uzapv#d;yzJs>MuK2VWNKhGFCX9DHS3^r%9@jqC z-a0xxSVNh~d&Q})e$)rd_0#Lto}g*We!>?d*raUP2FNf}Mx)wRTs4z;r^?6>!m1l3 zh#EQ?!?v`kZ=9^3M||F&aMQNl7>NX@)r&11`u8JmUWR+cip%ad9lG4AzAsDJo?9Fm zzI#ggiq^}E*-#oTvJ*Bs!jB2df3f9kA6j9@4PdKR_8~hBYP@N-4)4^xaU@p-s4j@g zgq!9i1SE)IGE_9mA2zWzA^djJHxC3Z)z<;dg|YjxnX$h@su>}VmP?i^=JGc zZXIHI*5u`~uhTeFY|)%!gtvVymUf|-%U{t=Y+Sbi9aYSqPO2N1r60_dDb_kOaAA|q z^kS~&&4gkk-G=(LAm1DZpHA3>X6U%_!NW=whWV;di=YQ=`X9O~)DYm^#M*C#{0TR5 zdIF0&u1$@=wta5fBU5R|i5%88S=vIgt7E-9{B=bC1@n95FDID>-WVwmd0}B zB|;4j1(1q|dlgDv!Bzi0L;7gm3Ai8gCPg53zY(7(<7i;rD^sxcni= z>afwKj2s?Ddaiqq8^KJSKae-Cg+E5>wne=Gk6FMd{Foy2G?q4}M)&N8m4i6l8Jx}6fx zBR_P?cgxEnm>}X=K0Fse7X4L)WQuj)E{wDQzGV9PV6oyXaZMiZ_vj%aQ8+Gk`z@rcw z&LkTwTivY&t?nSwVCJ8UeHabhcvwR0NlfP~8A&~8G~t}Ypi{A-P~;f zTR?xBb@Ya$Oq;IYYbKYi0zgGsz4xl+$`ung^1_+@b_L{Tu^(sX&>~mAZN!fPrFB-Q z?|1xDd||_Hs4~^QE)wHkv6ZhLIioEkwY!LjY(NioK+*dZHe>#hssg?G@9V*h0i>n}oX=EkZwnNk^SoJY2 z2~w0T{l0`zfJb%dX^IzJ(`5|h)p+ToFdo(7=tCUTRxfANG$yJHvk**z9)y$a$uuwl zAbi)qm`(KoB&wID*x5*H5u!U5Ui=y#a#i4ICh(PYuMQ<@ zy2QR;o_b6hCj>yq!!fS)n0W|Q8pQu30#kv@oU}6Y*zm$-AOM}3|G2wAcXL?S6(0AL zlsjAkJ`Oc?KZ_s=3`y1T-5^-?%i6CJd6P*W`9(n-ET(#n4R}X~tp(%W;_|hw1LdWR~Zs;#oh#+uA+B2Z~IaEKGK@x32i4B^~v zbACP#JwJ!*b$P$YW(4w2?>w6BG5659ipmbJCk91q&X-D?>kz6PJM@nac5IjXNupE- ze7bu^N{yOn_PuPQXj3rGH!$qFR{LGSZwGvB%dMcZNVkEM-ob{|m2Y#um+jv3XEe^* z0%W_UUY!Cn6*{xW*hOg3qR7N1_Mv?Y`5q-2fsKdXnpW8FXhiyDL#RPYarL>CKLB!)mG(JSh zFk>XwVw2TJ#Db0%k&anqd#shzIOXtYIue;GjlHk$Zzidv@5e;a8VP?Tfdad`-#&A4 zd!N3Az}FwH8&7xM6D{<0?9AD#k*`U>+PEX<_A7?HLlLgOVbNlA5IFcGHvxLoqFW6O zQng;sdgv&@XcY+P?1oH))p1*z`#o9Zu1j@ljB{_Hi`h*fL0Ca= zoKpCcFapB+tle#UjqUvrY7NXQ@&W$Y@>JjEc_>nKSy1LZubP!#hMf$nQNx=g5f`*9 z%MP}W{Rk_8aMqq%+f-#3b~)|v5P^k^%u%z&V-z;f|Mx*X)}V3&oF|)3YgN9U(x0(P zrByR;7z?3j3_X7e=b1G zo#~$D9j)TP6ZmmY{ok#2MgFBC6%pphT2I+iv6PK8FzV#ny6kv z9oVtHk6bvEm%ly+M{pC%i4-})OCP$IT_IZ~LdmlMXI};L6#di{Y3@m$kmgb7N^;c$!>^#6RK@scj>*sJ{kjs-pK7KW8* zyan=}D7KOi1~q#?G1-@ieXUv9aj4VC6U)6=r2-eWh*~6R7M&_zQX8>P(-B{}4N_4; za<9tY#9mDw0=mmTSCL|{Duz7riRiQhEsq1X@!SqHdIUS@iKKms?f}0xHYxO%K4hE? zR%iCucNHdMC+VM52^5Dm{35@icS)k=n^BuZXi!DR2ci@42szwgpv5uiGX}+i@78B^ z>6GvLQe>NaUIGzMb|boKNRtjO%q) z08D)Pin4O^Oc*dGhXqMZCEQiNrTD=zlqhB?uDAC}%@rqRDUOfzbpdzd{k_TN7K88e z1)trOb?^I)V26R+yl;3FVXj`Z{_mVEU&gT6AR?}vjU^~cj!rK{+MsJhQtmA1%pyz?ST(` zCt~2;=_Nn+xa8HE=+((=HM8Szvl#wfu5oa9O^`E}y~!m?q$dzhzEUB7F_q13S{`S3Dp&;2M%Kbs1$bLv+(ZWR!Z5)3kkwhi~TS%oiW8A zuN3A>K>4V5TQ%iaUie6YkdOzs72upM#PY!2zQ*s&~3zyW@$7Cs6h-r zseAxiRB)=}9k>VcP30#Dm-!s=n*4kg-b+UEv6~fmxPxb$OztF@zPQrg|3LL{j z_wh1$Q3<-xy)R$5IySMNJLr7$0_9GrUUp7A$6W($8~2Xe-gkcR`!4G4;_lZzvc6@0 zOnoJP!G0fU@w9S3mv>!sp}2$HemEVMYsX&!DYi@Lv_PD0l$L#GUb=< zs|hfL3Jj(W*8Iud0+A1sZ#uAb1L`*+>=~Iurh-BX;MVZsP;_Ant@tHk_jV2IgK`?t zh4xAmQ7~-g!32+uko`LwTN_pT8xDe16i(ziHV5lJrq%1p2QIzOBeeK8tV5}|fl`4? z=DJ*3*)9OsAvM6UEWt|N4rgtY2SgR0)Lo=+$*;Fy2V;>dF4nLA019NK;IC3a0A^Iz znciLss#P71yj_%1i?51ZfZJbOlq^B?7FCoi(Sl3sANB4_Mi5oPZfwdnP!yO0LcG$) zv;fOFwNCy%7z_hjzbyJ0esz%*K#*hkipuz13OCvg7IL=O1no-nnviFU6&{e|_@U;+ zT?`7=l}||61_x||Hh}BLnp`rr*sK~b^coP7%>!O!t(4xViMv#L^)CjR3Eg4i*NHYN zU-Xqc;Tm6MyZ<1 z2*KR#Cbv`Sb3cH*Fm4M!Y*ghX_)7%WLWe8I9{i&Nc{_@jFN4oJlQzN3OJwZeT$@d#iS*N#?L)Lhlw6 zIcpeqOza)-E$3&?^8NnpW=>OUW){ruxSNZcO(#k*_|yZa-en zL*U*y*w6}G1)6t(j!zU<+3#R^1PY)k1ZqL*8*cRG{H2=}f0hE~izzcV3$QF7nxN-u zDiQo3rNU$YoJD}^6oEHbCu~m(|7+ARZ*DJ^#xzhr3^xs6Tg_PyH^mVLU6@0X@$%pe zR)MW^JY2Ygzo70d1w($cpk6RR&2UNk=y^O*1b(leIpcD1b9L|zYC!hfa#sRmp-1(< ztL64&f=Z2VQbKBgFlsS(!pHNIZ|mLL?t4v7P;kslOM}YIfB}$WvHK&X?1Bz|+={064$Py(w(!D*9 zBM|MmFFu`bLdI>U_+WGn14CQ^P^#nZIN}7DBgq|;b`0wgqqNiYqS0lM?Vm={INghHU2@P|KL*hmN{i~p-=5Vm{?8~7~}6DJy>$R zp5`Kds+ghi+k1*?3#0feu&TP&+UA&<&Q-Lr{xo`^F9*`-%hJ%BlxR=}^_7 zSK{O{WmZcAOLIbVj*w)p$`jL+M987QM_2918S634!p+LKi=Cv{i7Ds8XHXBZ(|0DD zSkjkshY0liukr9nNia&DQ$81p9Tc zYIzR=3F`tDq}SQBrr!5lC#9=qRZ3<@=4T-&bLFCq>9=8(!jS1u>Tt80Vi6Y=EI97|od_l|$i@Fixx0m$uNQQcYhawI@&!A^zo@$$s zb4cRw^qdvgvZjw_`j*Ci%WQ*N^AaJH5(H|vj5#uzExk)5u>dxkLM}fSmUZ&2PBAaI zn|Or2)e>?&8f|_8r|_*T;LAHo4jXPzyL1JtXq3`6Ray_AQ5cD86d9&{ zM-5!8*FnK{^Gr&Kelbf%cJ1?)JDBqV?2R@TXUcQvHrjmc1mA7JOr+@T46_sY@a|twPHU`!}yqS{?GL6+v z=!4Etxs>w)iB%q*5oMlL>Zyy(z2G^kl~6DCH$R~&whH8EOQ`5RmX2#DMFA!o?xk2N6d>8qfiG5E$t5A@+;|oWjUa z!q`VM=xj=eq<@7Ig$v*eCWj1FW1)VC3sBMR+DxFhO7o@C>RBMLS# z^8UvC^Poj zN-K6au7D@rpITjbidCtBPKI!ce{6>@OTvGEfkGTNhJdpr^jpNVjexPAeX~h!0c4`> zRKT9#=k6Qej=u(85|I{J5E`FWoM3MpLJn9JAL%YgD{M-*IZ2R67x&qQC5}s)0tLd~ z2LiD^0DMSdK2OPpBngyB8IMJ{13wseZwy!~*bm?~*nzx`@z-9&Yn&1Za3L3+FhGtL zI}ysLLNFu<9$Ierx}qU7$Zvq*RC6COJ~sF`Qj13$`yvJi-sn<1KCvdhW?-Y}kY93C z+z@6Z#OfS+6v+2N=3YciO!Jb11yZBxY!Zju)u(>_D@DrenDwPnc%l~}Y!#uu8oDx< z*%kq(1^x)*iwSp8AOY5RiFc?G?cRB6##S<*fHUO90M`NLnnRL@6aPPd1kcWeMY z2}%>86T}024bA9uWg#rNNS+}fK?rj^FoOi>_J;u0Q!a>tq8cFOgJ6iu#Pe_y*HR~# zMX#r?L%AVSgB9Q7mx(|qw3FwW8(iC70YnI+OqJw2!n^HDy_r|=7j3I(LW}S-&O(Uj zZVFzt;A>}sOb(;vgXcdCs z=h=w4QrH8L_?fDc&^(?r31~mK9H18jfR0j%(J$G2h`Jm$(7qY8f^b$9l)VkNF=&4k zZGe~1B4`S@1f%&JF?qPL#5TU4<1@9BhZf`%f~ylKcxmt_AY+vh54Gq3W2_h;28`ud zW(<*lb8B+Ik?6v3CBT9*Ml5EW2zh24p~F!Je0rdflRJX~QWQcag97&e1>C^H)X8B0~3$RFn=#&x*6j#CP?I0<`Kr;^b zJbq^*N&1yJ!2;!rg9weu0jCe;g9(SktIG)yQ3i~a06g{iQ3X!tH2|PVum$(w1J>lh z6$tr*4wl3Z^vkInh~aTVCDVqXBTN*8&a%NrqoYdw%JxUbLuaRpDlh;^f`lYo7=VzY zW6#18;8&&pg@Vc$`QP?jTjPMh8 zAoek{STZ_uH6*(b^V6kFznr)x&$1JZU>95(Tvu?_SWZA5O3$g!(k%t=&e(4k-0w@C zukGGg)o#U47t-(Vdl{X>ZrkU(?W@Dy%?aPm)Nib*-p#4!p3D`s$|!pS-p|ivdS4G9Wi9jV8ScpL&Y>wGO=RkL(8C7~b%_+`934k!`iENXX=pzQ`Sf z6Z?N{b%WQ4`}1_W>4E88?O_2}Jhx;Bbq@@e`@DZAA{{}NTz}V{l``Iy{(2#>FL*PR zY(F#gz2VNHl0-qu%ackE0|*`kCI=>qs)SE8-f#naIHo_yQD6otu6?@)-1+Om?WR$- zx>ggA+(P*PEqXk6r<1Ao=q!=c(w=A80*fli5CZe)r2V$P^<(d}IK zg2=*!Kw|c|YK4_z9rz0SX;APJFx=)oPCAVD4&?7o#t%)pqUm5xATJfz8h7(BLp5$Y z9m%&IA@d>suNX`TQGaJDSo?iE$v*uPO;=&a_csa4QMlVc*nBL~mZ z&xIPqk8S{p^!03zr;GZ7AMpPOBP`9rWjP| zmh?|v-CYMAJ~ObBs3He_z&s_ZSDSR$KIR%vf*5*P?`CCO)y!3u;yG)0UhQ8S%U>|N zcno%~(&w?#xuTuHY2M!fqO~C%D$QD@x5cbovyaBjxBJrC$F>F3*#0g0`!E8Il3MB- z*Ub_ux6LUpNB(I~yLZv5_W=nscSncS_3vN|OZwWLm*hl}4~n^K&B~_)$HTm^Li7Lw z#8PVrY-xMsy+e1UZYq@p)|2C*$k9(cYi!OMFR1P{b<$$@B82OO;?yvl`R%ozBZ#=m1#Q9yDFsgVHx^h zabZLI9}?maC3NE69-(AO2udtIgbu_NHjBswidLjQpCqrAFGU6;%aHix5c`nXL}maE zifd|kP$S_2N&hfOV=j-q%S_>Mb9d8%0Hk}q& z7!S?jqh_lF0_iY&r17w(=cj!tc%-*A@=V4+YM1$nWC>$Zaocy?5cyutF4*JK_YQSO z%JwupSv5R&BRvhaGQFNDit6$fvU2O=G&)1#Q6V#52bTm-DQpEi0C5&RV@RwTk168F zel!WWO6#cdJJ)DFHi;;7sb`MD|9$CZ*6MMM757`ir)V{N9(;T>1r6nixNWF@Gjr{E z$ri76j-D&7FL0zq(m5qjCyT5Va&nDRU;u?Q=c@aseiX_B z5z=I<4leuvHjq{pCGC+(e~6bL*8}T0__kN5@B`#sbn%pydU_h`VatBqQ=Mn`GEzGD zwX$p}b9!*f74w`QtA%U-a?;vG;-aUDaT(0Mv|Kg@t=lKG^)k)!!Mv@liE!?^4XKRB zh4vQ2Naws8C=j(d9nEv|F5ZD?U&B=nTK}znKytUh$J8XtgId=--A7+vx=%c?UG8sP zwa!fG%9e_r0Gif^_iJKFRBYt-Ra(lm>j|$5=RQ;{R<2^ZmFWUas$`a{&Wdk#&t9y4 zu10BTR=PEvp#5Jfg3CKcDIjXA#GaKvwM00^6_yYB)2)qE>7f!A$)EVkj4x^nr!Xz6 ziMVEmN0eNUm*!X6&4erlPgo|o(4rJR%BYUV#Nf`J10kzzZg2&A8+b()?V@%?c_R%gsavq8 zIRDmgsUWZuj9TDY+lc7wXGWd_hG;dWecRoJ6d}Bd@3&-6ny~RO)xqt1tGzGe*~NOx zFQloGe2kcmk?u{6w@vYrmoiMNE*DWvp-d%O`)WPe3`n1oY(IY}mVbf5nH;HHv9+E4 zfjd?eww{h)XQU(gD)4@PzdjQmuHF22HQq`vNBFhWH<3m>3vGN=f zH9J0NgI$8ktkSC)Q^s1l#MWA!xo|g*|8vBi)^)u5@kuBf*P;E$xbM`R1$%8w?TA*; z@jyA11P<;urr}c7H&cC%&ehZVXt2*VYl{acZ7X+M*EV#quji-oibB^k;(F#&CdaWo zCO^U~m~fu9GH_H|ig*s$(_gQiz-YnU#ZkN9{f}G@aIXt^NvtrDd3ZOwTA6_>JrMnq zg8nH4?zXW6F#xxKSrig*cdcLmf>QDXB8Gedq+hP9m`_36VplpibPbBmr1{ctzskStrBM3F~zM)NUV{I8B`X!vkwJJ3ur;P-f|1AOy zI;~#af0SixH@#;S`Nd0F8XfCE;YBz9@p-~2a*x^kokiwHs3hzU8_1!As3b5A_459{ccqWM6UN7`0nerZ;t#60t5+ScbH9BNj=&wD zr1X8{^Lur@%8q{%S?eY(liJg@XqzpSogPb5TuCZ7Ykj6`Z(|oX<%(1Xr_Em8;^WIK zn-O}HtKh_B`K5D?xzixR`fAnS-lt~lL~V7I1NQylYPVRV118ekHMbsY(@3SN?c2`& z&US6&i|l09F*DLqoyTL)?zB_&`q~s3L0ad0I~k|Rph`2rfJn2wchS|l;QTiH6L&-w zqE4$D9cZQhKrqT zg6$@B!Ych!@x@6xL~q>aLXR-=3$0eO%I9^{7tx?XYZIp@J=4|2V6o779&m1^M?Y29 z_$T;oG74{n_kMqZpZRtly@j7`fdM?po7F>nLO^Nezk7s5pMb{H!jI8VL6SjdD z&gFvB#4>(Vu*wRTP*N5v@Qgu%h@=T>`D7YvzRwdA)oQgx)h0@N2$|0S173&w(Jeu2Wxy| zp&(ZU+_;&fEL09`$#!PhmtFo|*t{#+^^(uqt-f`(&*ocO&@orW4D@@)0h`9?D9Xf@ z^HsIgX{I?W8&lqu{%uBg1@WR1>&ICwwjK;o?iDZOpHG%md<@%eDuH#oaJTz+{fM>9%hGl#h*i#Wr0f$Pc-m9;u-I~(eACKYo|KG@_*ZQd zTQy8j&s?*&l2M-_fAR|zHAsZ5wrh_Kqf2qqv{!6brLU8afNC*#@5`y@|8DNQV=f0E zyP5ZhllX4Mf-H!Hxm1_dT8qDZ8Qfz$;SdUJ)>!`4axp=_>S&;NdSJ5LObJ4d-B6DK z+Qd=$EtFLYS(D?@oD(KlDR#z{xX$h(QGN(@=Kq)HBX`KFHj0{3*1M?b6?{@^o9*+7e15$MZ6joA&^w`$)Il z?5yy0l6@Jw*rxtDHQI6W6v44;{k!nJm?BH}Fh`rx%crZ2Ci5l%p?PD=(kQz&jW^R< zulh6wAJ%cYi_LFB^Mm6`o$!3LAiy0gcAZjWSe^abVR>xL^uS^p!f<+~N~?ZhINwWC zfO3WAHHOh!TkC5xUXgY!^sVviSr{zp4|iuA^V%hAsONln2~zo~vUVCLnD4Uu@Fp8a z+1c#uM0`G+x1_Wt)(Kek6WC1A2CoX~L|QO@gA%n@jg91AL-3QOGMefaGY@Hw-mYIen&;@WDwjNB)Cko* zZk^=5@~)RwK+TQCKlz&#x!$=_p-*-6@&m6~C&33qXmbMT4z`>hWrfw>2MHaqD+M)B zA8?_xhqFfxNyX8yjy(Glm4;y2`HfS8QiG1>zAGhh<67}7`5RntCHC}U*<4+lCcSHw zkJRjdCub=f{e5dEy@PuIr`PD?uF>;j#qVq@lXk{syx-dWAuL?j zj|sB+yGY*E$H}l!S!GwDH{GBPRgMs^`d*#pKF6_Ga^LwUxN3M4SK;dQ97(kLb->na z?a;gB6r{&h^QAQ4lc52NW6IQ8y<}ATV=t-@*4gP2urXumuhVgM5)DrKeIHF}%W!7)rz;9OS`F;ahP&$9&vx4XLHQMgZ|GZPi3~168eqJ`P!6XZ1PcUcn;1`o_q{wjs~M)gFFlMq2N)7 zVW@&)qHO)a5s5lNZ$i?`W*y>pBP=S^an(mFlYg~jx{Yg2eZdMeG*s1(XAj5UuYkd^V)P?R>Qm8(0CwWS#`m{K zaVB5;AfZnvsZm-f;}i~)*cSs6M~31AA#~M@BnWSn%v%X6k_o>>7x|H6xNqa<;PrFT;U?0_3EXF-q4WHr zJadUTKh?(L@fuY`S<)F9$*o;CBI~<~*v6Ep;$hK-?c~4G>F|fw+}A?Yb}i=LkJRD$ z#n#6eWznzx?ZKD4IP9C#4Gp|XadBA5m#&0?E2nof_MQ7BK7u;SDC+0l842kgK7&om zxSvOuk=ZK9RL&FC6J}ukOYR37uO(&llQkiZgfya7)a$)5Hy6{P>)==2U`xEtQB$05 zNuPbSChS$d%@;@K^X0fS2|Po@r_k+P#4Hp$ui37p6fzAF-WL|<$vwpq*rs*d=yUso z+zAS%@Fy64Ax8KdAimFgM~!Ne z?ZGl=2`~m>#?8&)1F;|_jghp-P1`!pP&MvT@M!n?!TFK*F&QauSlMjrSEqM*?WVrc ztB5H2E^YZ|dL5;A5#dh9Z(6rs^E8nL$4K=sE}+z|&`Aa^uQGkz(Xg+g?(`)#Tmi_d*Pp)HuMptf!y=ZM`5pPvy!xSS{C+pkN$thAF|jwO^nW{v#Hr-!1h zu2olTFDCKVT=P}ZmZPTyt>l^}I_DXxUKFbfkNY4e9$EbVhp{LixV`OCfr~K1m{TKZo z9v(9@%m1eQV~pj;ECa*;C@d_jcr5hvc&tB`{^9+*H>UrP{D;H#)9b&qek6XRf9x>- zjOriCf9d|a{tt&;^WW5eTm7N1uxb8lbpKfTXQco6`R{qKGXKc`aQ@vZ>yP%oYivKW z{fGWjer&M)NHMap|4aWL4E{}J|B?Bz_`|1XWB5-+X2u_6n3;aGwDJBsxU6*l7uVZeF9834c>k00pO@u7V5a-;u>Oz!{yV7u zK=x1jpZWY~{2SPRN&kD!|4{xZ|BUnh0rX$Af5G`bVEae*Uu%+!i&n(k%E{P)R>Vr* z$ymtP@aI_F&(3ON>SXq_uvmF`U?BfNY}|CyEIJTCOm18Zz3XTsvyRO?op{Q|aj`S10@TaAQJTfR}1; zav4;l3~24DvKSw?rD#Qc0!Y_XE{7W)_57Xkp(E71RPqc08}Vj_l&Y4sdQ3-Yp_$fx zhJiWpcb7?^14+hy&~l+Q2AULJ=TLR&#Tjls{2<^NhE4mEk%+!Vanh*}K>i4kwc04# zzZd9@2-eiGhBnBda#zU|_C&pYAC#(>EZ;1A6?KO;Egaw&WY7PTbNWuy!p8nq&?>?V zosHU`ccxhUV>t@%bw@&HW9%JAJnm61_Wv;UjhgFIm=}ghBG5#HWBhw1|;qTwAV@>GhR7 zBT;*>j*dYdL2qLIH-l?0;koLHWaa7iryXxs=f8mc-)H}?wEUlX!p8XjFLoU4%xwQB zkpGgMjf0W?{~gOK9|&({k=ECWj@Osenac~0o@##=~P>3oBco~24 zaH(WqU=(?SzWl%2#1Rec5dbikIgKg1A)DX?w!%Z9#qS>%F8nu+ z$E?@xSDxNi-MpC!rO9`-98QGf&tzj9@yJ0h0lFE?SmYa(atJ+<*v29UhhTJj6m(0sl-S5n{OV>gV9$~7s z8N2el*Kr}Jwt~8(y@W>vgl_JA+$TQxLt|Z9P9JqlJ|D(fQaPiQb-q3SCQ;iwKk%)R%2}KOdmymEY)e8#slTjS(y~77(WM zHgh_}kAHf2%#ul>yi&^Tsbk+95$&20xVw)UUn&YBd7FvW#O9Y?A{Bx?Ef?R(O=i6} zD&ww9&ex?q_~MsqeaFhB3+qj0X%)^rC2@p$$SgNu79&!rZC8HrV3^fT`;WhoDBwj5taK* zH74DN`66vt1=mu5_=4($z7&k{>%_b_!c*ELbPP`K00d!u)%i169VsT0TG9*T*2B3v= zubiCNwKZV`l>Ja$v7-^8EngR}{w$8JOEmRK?DhYy`-D+Q8$c?h4mQ{%xs5v_vuJHjjy!H**3FePI%Z+k?tyf~nNEEiqxZA3;UAXcFmEf@93V%=b}AUfhv+))s6^ zG2Z~bB0VRENtn&|CAVpW7R^HP#(267$cB6e*|05{JR&~x5yU#eOBiI#Fg&h7rfExn z`L@_S#r*0e-7mV`45j~GMckEmNBfCIWyj>suj7T|M$X<=V?BPgdHhA~(5IPldF#1` z`0teIzm7@RwE zi_0$7J==H6>2ToFeyHx<5d1NtJM)7tED9=ad&PV8@_d!V`QCOw^4j~`nNvkU{Sfu_ zK6&3=W{r5@{2GhQ#w%vSf7V`pNOpfF;r!AB{WJp!^}@N4HSpGPJlGv!PfXrVujM$R%CGMu$d*$%siw%ATZP&Y`7e(V5-FOWn*@>aVi*+dYUL#89It zv3W|*66L)-hW|>9%Kfc=0CRpXt{hh?mCfQkjJ(LqXfplPtC{1&uaI-SD(Dvc3DUE5 zS0cU*e)uI)TOrTkohHZil9*4Q4=I9t5IZ`CogK$bWm(GNFuu!=ehSD1u;^IfYtfT* zR5TRy*0z>z){2RA<{-j$%~~!TLo{P<9$>1KeKlEnKZ2fpyVoeZst^MgMdW{!ExlwOW1C$}os-JkcVOYwS=Wp#37d3a6rvUJ|1VB(vf zvZH^bJz8A&Ge?DZns&*nTBi0kLX*3zsGt^mvq6MylG_L>wjyuoCXA02kWJUWxHf}0 z!pJm;L@C(2;GKunEHvBnj`*I z8a`7rS-GmcmPy#6OiVi`(okX&b90%i?PFk-DQ;ys2UgGRqpdT^4($V%t1;khtOqan1Z;x^WBouJ@@QFb{XJ^0SbWL6oaeVqK5YcfDM z3k)1Amsd5IXbE@1EJ+MgRBm!ZULIhHF5ly!o&dt@rJ)nWsksEzB`2ZA<2iX641Sl* z>ER&bqZdP>^PMfMIyC++FZ9{oHGBDNVj2nGkZK@faH!stoyX$rK!$g2q3i}R2XtDXzs=FnrM!AE8<`JdeFqb-4vA*_RP&%TDmCR)b7t_8JN$^} zWGC)%opHubq~e|dy9o;>Elq5+mY6|+r3J>BqByGxtBPCb+U&!5 z6*(!i-I=yFX4Rz}t+|=K9v6xphu0;2#K(1WV5+hOS2!)M_HBKuvYF}|MTfJx9M$X7 z=(OdOm1a0$Etj-drq$}>LRIC+Kw3!UarjeTTc&5F4(P%Z(<*D#^yBuN=qb+4c1}?z zE{}3q7?@-OSmV9K+)auw&1k0$#tZ9$jue9HexD82=JG-lynSi1CI;byIr1!39|QJu zuWHh$@*#=E;_ZXMM~W2YbB%Kh%0TbZ!NkfMY6l6qMO%6@lnPi|5GiAEIX88kc2P28 z=W2@Y`<<;?eKy9T$ElBMFef$Kc-MKAbV&4Hvb@fi1r%uO-bzyN}hc+ zmX;v`9$BhB?GFYK22o7U-KB!e9*<%oO43zwg_5vx$fJ(1ua;POE%1DLev1$ zT;w11O>jIAyMy<>RDukU~-9ixk@wq)0iyAC>r) zY1i=#91-AMNtlI3CSquzpAtqi4F2_o8p{~_LiMdKz!rllzwvw*nqXD6@=yo#L< zd&9&O6n5r1F|k;fU342xjd6+8ZH*|zB;w}`U5Tb)5F_0&wn3>@RLIqM#IzewTV;kRl(uAUmnb#ckZ8HwoqhVLS`>P47S)B-y>u zmrTRf7x;u=&jy*^Wl}HfxIP;n<_7W?o8U|G)8TDVQ`H-uIh14e?J1oi?4R2^SpyKi zEH?#)BZuTu0at+&ft$y&?qZjR8CdYOp7q;Ew4`IYkM4CJ44Q7br1*ujh}c;giBrDg zuzTCm`&~iUVD72T`=Q!)Oe6FvA0pPq{ z$|2ick#MtbWJ(niE3mgFZ!{92XAD14MoTwmW9X&AmmrVLJ-K>IS5V0s zXKnGw6RmHM!X%gp$al+3;FB{W4tEfD zk~i3UHI#S8yPCbtzP2nDnLX1x#B9G9C#Q0r3`QbyMG30A!Ilue&s*mLb;gpDS!2das4F3Fwba0^m zFer@9{|}^uVBy&Kj{ai|2ps%Je-eO%VuukRx(@F_|$1 z{#ZaqHfPRf-$?rPTfoKZbA zLubJKgtuMf;AJ}u;E}YFp}TEo^iA3#VGJ-7QMu|9uSXi=uRLPxY=*B$JGzA zr)`hQj#HiCk}+4u3i{;Y@rN5c8+2tD9+~b3(6o8e)Y$>e>hi5U>dG)%ASht-7B3lS z{v3}P;=toKpF=Yu=ek7Tpdy?nEM*gy#0+(UaayTQP!fm!Y>`%#hKWd!tAr;%2lxw#9d-Y{b%#O-TjJK32|COb z|I&dx&HM*3Y;N>>ZimcAkhiR*WVgmfRFB%H?j@X6x|6PIG4#UA;C1^1-uGIz%l3xR zusKCDb|u+GP^(y{blFO&dBb_>vt@k)z<_kQ-m=H4PBjFUOds{!_j=(;c5%pILveZz z)FR{qU|$at<)RJ$(*N$yai}OB*i$8A(auIx$QX7&MvNza*NWwz=C)^W{MGiccxWLFBW)pGTP>&Q)& zKuuiT@Z>`Cg)AzvN|n-3o6H7AO%Gd16uOkAkDUw*$p{^-EOjjIB`vnv4~~S6-oIsU%w5L2cv%EiQ$yj7!?qSP^AuxMzDq7pNtf zG>fnk@sfEwynItiBJGlWZZafGwSqVuko{Q+1OQK16r*%EblBulQpTJWU#(hl+hs>Z zlC1OA5=X8q+8Mr~KaJh&7<~&jXBDbu^+r)vC=3JF0&}^sMJeQMMTWq9X3+s7Wh&M*c^6>?xjkOJmGhd^f(OAfKh1rK+VbaHHF% zd}(7ythq7nBcm(lV;sYM zwQw)O30obWn_wgO$ZsSf7xRGkVR7+Ei#7dxseeWh&}Tex%|6qg{2L2*-&Ki@CwTSC zqB%k2aGNH#bPL(nl$)7gt$JsJJ zuH?0X^v$So9y7A9a~l~|?)eFoH*YW$>`cHjU>o%dv1nu==d3PVvYgnR{f)(Bf#(7A z`0qDIN8SsQl)bGzKyEUqJk%@bE@Y1shO&^{!eagSWXJJ+vM7`Vi;bbg0$sdUxUV3< z$x(}9h9fwUOg@G)5KRH@jIZVd5T>mbvWLR9LIo5TF-n^A_FvS^Pm`a1ydd!u< z3;N|guW#b7OzXJYxZZfTq-Z|boyy(A-l_YmY$@Ixqb9&EuLMqWn6Hf8g5EjPM_|Rj zJetkb=Uo|;b>zb9BfA&vL9m;j6;G3Tl?prdZdcYN?cPG8` zynElf49^jN$`d%;o9BW@**t^C5xTWo#5Hxe|DR{^an=`Nn7> zeq{2G+doEs7WHNNawhZh=L?^Y3%_;0b9=*kBl~iaNB|WlD#yPUQDIr<0W1k5`CcBmF6 zp&2^YJ-e0g=2ag?H$cn}Cd%s!T9qK9q(Pv*Gd{*B#hS1)aM~2+O13rhJKV-FYhCq) z+SH%Jp33_50g*Rl^%1luvTpzNf#>b&knXYV&A}Hkl}sFWoC+q5RGg_qV*w^zD5+Un z6J&OW?m9VEe6$#@B(7LVy#=_vcZ-@X2``~-((7n71&@67ut|lZ*qN%1N{>oU>o3Xr z!fc{V`%2^B16kED=Ypn5_vT0FGm{q4;yYGG+t_R|azF$w$=mgaog>v!1H4!A! zt07LQp_;eou;QOfM2ZaqEo`|&Bj5$YG2Z)bsMfrP^;wIM5UB$`pECl!PoCQZy`!|b ztm;^j@y!yfWHoop>j8`A0KC0V4T|f15pPgGWx^L;+tF8q+qStNYXU9d&NT|w%YqW;c6sUWt6s=izkp>>UwNSt{HVTA7BSx?WbnnB*Kr@SwWhcV%Re z?W-`Q2}6^hMy2(luKX@j3|PCm!s+lcK7ve~^nPv6oF8dFBi3peM3@qUdN*Y2y3$Mc z80Yv2bw(D$S=bQ{-3_)Rk+Wl2_gjUl)1Wo1G6&hIQnWMnLuvq~%&2>tvob{A9>@(F z_5MzEFw2wurI}(m`de{UNV*fDaeg^02TPa1(%nU{JJ-2pEAp8TM^+%8@0i+r4|D@! zl?K=9K3&S8aZTE9$RFG>Wl9sEH97yPLD-mLWlH58qwG*nTDaH)sN$f%MuFva!`CT- zY4ut9BFHE6QV!OL$6%#>p+?e)K38m|C~S-N0{ z#TP_{DKZCAGFlZ-Ba*fc)baWW6A=?hyh4Xl4N{oWlly5t--6u#dd}H9I-pdWAxb$4 zJ2PsDZGd&&jX1w&Y!pV2$(EN1=1nd~hCaYq8t6LA3%9%mY2Mypv(|cRb0q1P5F>{A zq%-}zu8~Z>iB)sf7qKzi38f;x!LP7NUMmJ!*Z|Woi&iVF2zwWJBM@jIO9=-pz&EIC zU>gvK7^Z@UO;_rVC=Ov{$q;7MayH@&!;a67+p=IM)@HD!4ROAYz@D};?ssn}b+>fa zOYj`W zp{6GHBMvqj2PUwG!#QdX);atetbN2uQ0WGwVRN zL(m#zdsMy3)h40|!(gX{tWQ&xNOL6Cpj12ue@`hez`W|s_C}TCdO;$H*TA?UmH;;kz1g1n2X29_l`NO zItE2UbWNm#^ad;y;*)LF`K|KPcx?8P*S>So+tg*?H+Zay^emi9u4}PSbSOsLx~{FM z?1~)6C?9D_MDqMb%nd>c7tVv5knDO@w!7w)ME{ojO4?5-Uf!B|Oghx5QZ>xvzh&7! z77Tz|HC!_?dU_m7jef4m#OQvL)mFV*e>B|&XqIrIGF%p$o{WYl`C7^oPzC7X#dd&h zZWMRB{pK*1-5bQ~^#wZQATyo~joj-?^CKrDf|DbXRga&DjH$|%+REBWd5HX)94d+sONu4k zoKT$jNGX{S-=OA8{;OnrY1Tx1$-Jf*&#g-R6`EWu_Hv$cKv;XBDo{i0Y!PGm!L=r`5-F0*Sg$K0^57X~!90 zHK^sKgaFHXGV{0+xvDG)KBHvmO5;+ZXP7B>lveK+I#D_{xcts&W z!A%kxamwx-T(^OVfRU0^1*a%kANCQT6vR^`8dGV&woItIWkFN~1&{Sk#K;Yv`ji0l z=y=$$T7$Z7n3AIhr>G^@vxl=Suf(&9`bHkH?tA}|mL@v|tpupYGj`Q$Mb~5a zkpi>2vvFIb_VabM70W?lR>?R-DKn%i(N76e&=#}B;y^cguk~4TIl5U~mVDjdRpK+T zv*w2Q8*dyHXYx9-o7K07O`E78DD9njqL}lS1{8Bfg4Xo!O6T9n;R7xVw!-H0D|B3< zEv&`VLi)d794P-pYJ!{`6=>RE9N)9I)q%{qJiS9&bvFyIS70q7SB!XgE%33@uVVOe z>w|I1il-j4&ZT!<1%W%Dnyfxig^3H@7bzS_B8ujmEAA+>Azu}2q&wQ%q;EB#4rV(Y zsAnfpew}AAdpQZ`vK+soq~f-GryGvpz441EFPh)ksx7--TK~S5fT(G!^3>U$UC=bC>a@Mw6($2!!GX#4#(e{yP8{D=1!+Ik zDx59pgt(d|E?#C|XrFy0EjmsNQ#*EL)55vNxJ^6SxbfV6giOx-jmbt$Q*jXfTYco* zp`CN3L8OsrM1noNMbSx&mWE@@qP<;PM1Ex!bl*6%p4&}4`A43tYNx2$jXq30+7 ziDNIsysa~-4f8&sc5O^tt(i!bI}2U9(h$pjPX}3dHfuiRU_gXt(cZ$nd>UTb)QX^4hpFTD?t6sYxZb2DK_lSpuc95}k^al2S2N5g}F#DLtVNF|lP# zHq}(PGqoN_ECQn$#IE!&@h9G;VcH8$5+S=BzW8)BJFUuNGk?gdclFB75o|jvVy(&P z;d1nH6rhVd^p_=0Mw(Q({1yt3S%dKDLB#T8>Iz*AS3`i`+GkpU+RXaw5y&M_9cToN zO!vjeGuBGAM*2uEA#SFZ~5@~fHk;-aOXy-OXI`gFpp?s&0A|3d9hn`Hg3Nt zAI+rKj&K!uG1Rh~6nARtp#Eb2#&|NXbmYbUp=Gi%Y|bn^oI|9&fM-K>H#O0drb>?+y#@Ek|HDj7|JwAk(7)ua8U4b4D z0TCDoKK3Cs5KmtQXEqpkX$ju@|U+pv9DFxT40Vf#cxt5 z`RXW#t25wE7ti2yMmlu6{q$#sqj$I6E%i8wbjBu|u_7TOo42Ht=3eRhA%gB%svNdP zXtodx?!~wJ=DkF&R<9dSo)hJ36^cBiVud#HoU00^Wz8`0Dou=ju%yAdrc26K>qq=Y zJ5{jn!yb38eNwjVlVR=gd4C%u`a`bCC0oLP;fZ8 zQIKPtc`puvXj;8+W{Hn zV0agZlFbmne!-SW>J2ek%Of`9){h7n*C-W)!DvO^Lf{u4AlyLh@AJqtswY zT#3Y`?A+i406;yVildRVQDXgSyP)gDXS$c^J7sL9zYfLq9j@3b6Q?Ft^)wT_31Y+n zNu83$kLgN8q%lwCG^tkYNbU6S%l3=8xREGx`8tNBw552zl{quUGJGX>te2elfJ3qPlCzCe!n*#&wiBcy%RHRA- zC+u~gFlc>bqED6rQC{lK9O>vNX*j5Oo;2h`nvFqFh7E)-47Vm`gy*^UW!BqCU*~%c z$>VUrR;8!C#M0DJ>U%OI@%(erQ2~Wpk;N4Ca@4Ebdw4XC)6{kf!}D}z_Z*s+Ys(u; zD%0+El6;Zz9H9`$-D*9bZ6b%{>PZzH%XA!*XTB)9QEAt<$FWn!+l=F|W*Dp4E}LP|IjL~F=WX5O6?Gc@3`NGZ8jv`Xfk6J}bSW`*TvLdW zos^+**?vY4K_yBrJWX+CJ=J*z0D~j`Np9GyVOKuj;+`TMA?F0b#Ew$thW`)>B# z-0|Zmvvo%-!TSNqcu{X2?E>y{6L!wRijDVUX|YPHFB0#M$2(M#(bAuXmOnh$4qNu3 zh_7?#P8{MUPy(5^2)r9MXQG5JlXZXODLoT0LCI6DfeHoV<5a~rKkJG~8FF{^cL89g zg8y5mGv=YQyNi9J(jq+ zqjINbP)@|rEGFGy5gMeV3dimU1u2Jv)b}|O43txy8mY;|Gx^-3jEgD!=t)hCGEdMM zKkG6$aGRim$or4(-vTCg%EmFq;?HP8#b+0Wpb=0aX$Vm}9Z-k+PzoWXcgc1?`FnvM z`~M0gK9G_o5&{Kd&`XNE2jimm0`9da2r1WSyzFFp(^94 zw0g>R(spDwW;cnp^d$(cI3t~+h!euE#&w@`EfgwygT@Vk|9xLdHBY?Hd?9jV5{w@7 z()pqJ0y3!`{PHQW_>dYz|IPW=++U5@#)KfrAraD*z?oS&Irei9?#v|?CLo=h5=WF! zmY7U>Q?Mc^`%aYmXL{SJbT)6jgWzYO@czR?N1$D7cdXONa`~;lcQfS5W`2{@N{ZLG zGw9VigX8qs{Aex`433Qg&@}ekuKr+&Yh;V2F@n~o!8}r~>pGWv;QjWpvu_8ga#Jp6 ziL^EHGW&9CvtoM7;U3sW@P|%w3e`!beFFa!|5ebnU~K}jE9li78+R5zTg62BQYp{akpFCC&|;D4nH=$Fw%nLV!5miq;M~ zS-m#Z0*`P$)o!|FsV(_l^+!+~u~r-_j@lbk4}1$nw2r6V`@toYWghaLOazryD3%+I zgl0VgNhdN~-;jf}I<3k;hgpk=cJBbZ<~OKYH^i?x*%wLN6+{5M5E%r(XQG==WHp z_v_kj1NC|!03)qO^m5+$iQd!qv)hXbt@=asSK#;L7E8j~9Twgb4}VG0M4qboK->P6 zi@PaZgOqhv=>+4l)@jzI$>g8ZH%kD`m1xFvJ%T#t)jDd`Uep!AIA4Us0@d_9qM&6t zd|=BoEO|4kWg#3$uaR`ViYRB&llvsrxwf=)0%Dyju(R#A1tCKJiMc1p~+6mon)Ulj^vW_Z%* zazes>0K_?>#XejNAaLojFUR*@2P)Jr3iXjdz5uNTwsw?hL19Kq@ml$dXKtnWPZr)R z`E$e8&r07ruI_WLzn?PpuT^_DB9;NF0B*Al>s^${khkD^;L-v00)2t}B%SyJ-)i>D z@GLil0^$a}lxP#`J?}pyer~__#sb6&wq$I-w>Nf3+ezpVc+%EHuP+bFLrg=BuR*Uk zptni{11hj`b&_?*Xb@4-RUs;+%eg8536J&woujy8Eytct-|goE>K>p>BH6UFMz|)a zo_P1SY`1N=YOxw}8g%N@&X{G0c8iQ(CK$m12EkhvLhSRh*fY8+*Zi;tHvc}48v@kK zz^?r)h%%xV&Fq3oW@nBj_`hj%3#0^5$pk2gjP&k0=I<|AU9rwPp6zAhV`vh$K&M28 zUEK4?G;Dym`~Ky`#z1gWQ-JgvQeh}n(i31hs$2$OB+ekZxT|e$-X*u5-{PyYyddl9 z-0HtVBR8otxx_w;-&t$uc!E3tUg&C8g9?YB~m>= zd;cg-qGG5PHjtYzz3}i?SwtFXpiAn)|H-M&cf`YL{*<6mQnF0;46#+#M3&Cq0Oib7 zsL#f}A}ZE3?sM6nhW)!I$<1P=Uo5>A&%kykiRE6BWZ}>J3sm zeaMw;r@!q-K0=K&`~?3u?xQYWj+tfmF6gCDJ(>i7DBGr4Gh`8|NIj;;Kx?guI;(%B zDdvhK)xtnxJFXO1+Ao&elFlWyFfQI*n)4X~n_+2iYVN0BJN`m4M4{PM^N*X<%`HXp zr0cId#4Ey0C%+%?t3g?*l?KcJ6=W{q3@TPKs8x_ng-cFK+QHm zjI8pRu(anKkDHv?JX^$WT;)~zrC%ST%6 zY_GuBU}eZFpFP@K(8u>{Ti0D(Z^fk1vdrh+O>5uSZ)P;Nr|2UTcH<^VLHJc+y(*gw)n4v*X-h~Y$kLy1K2WXVDi&G>ywePw-C$y5+sea`!!&$R|X=FA+n z0rZ~Os2}{7J{aY6k>^03=BS%ezWfrmbGb9!2wakF(L<2FA^BzsU92{1}f56O}4-0DQU{-pVGMIS}Mm*|=PQ#!FsKB?P>2*ub#OYW=p z#a#rlnT5H=ME7?IEP;qX4u-jP>;}(sOZ9o&_aRIb?et`4)7vGh+?kCN(+)SFH5L?4Mn& z$g1y~$qhAYbQ11VBH|7)7}u{dh29{UNhys|CefuvNk4iAPD&b^OgY6(@!?QN-d>+~ zAMRZVp9T<`D7-TCD3ZOdY%IO2Umz-P$heN)%?#8CJdGVOZVXh`YN6Ul1jU>Xlb%K% zpx;)QjnB#v@1Q(q#4|4>3(WZ`YALj*q$~1%kR}>F!-3`siWJ&WI*0OcmM4E{xbL?A(5)7GLpKC?<%rf|xIK#@{UaTBx#E7qZ z#`T$6jVOW0_Je*;D;Xg6$NEo&#Lz~r09Zn>yR-Q1{Op9>*pw>L} zIfIbr6tV*z)+2+QC9h0v!lg-vf^C9BmbdVT1Sw&71sjX^4!4J+G<64smIP2EN;vzN z+BXDLY&5%_^oru0W|ABy9IE6&xN%)mCU`mg60vA3HavtSbOjpAz`XfkW$L$M#2jH7 zIu6$HY#csed~A9%AQ8aRVzu{_OJ_6}|HyjO7d z6IWn%^4u^9Lp2H(;zxBUGV*Y}Bx_d_@Qn4ski0LnTtJM2i%AEhSUm#$tQW)eKG-2R zA0pZ#Qp3n@kd?=L1ke|-H&<`U?({FJUo71L)Yq$e?4GtScW=7hWN$1-;w9>qy5l-r z2+ zQ{drjP^ddt_q3>4*WOJw4OJ-`WYtV9nQEJ>9IG8Go-3YO-=sUR;&+`_zGb_Y509|~ zk!M%~i#KDq5DJMZib>T{N>D+X^}K87))1{A94zh>;Xy0nSRrFwmIVwaaxG;vzt1j~ zrsToyj=2d-Y=6#V@)?ct2_Rl2C-5OTu2-!zU5cW1(wk~=Vg#z5k3S5$rSxJ$eVJYf#P3%#+{MQOJCQsIA&C=3( zf<&CwlBioZ8&R4vAk`t-TIB;j{VH(XMC<97`B=?cpraow*r4(*JIF*D?acAe>ET@| z-mzgn>78jxa`VLegiktCZ#(=Jhdl7QKBIV|M0dGbi({@`!)C5D7T5KiNMsqro#8N=C#jkjLRe!*3nxCH9H<0PdY>o!PCl-EW(~vZ=fO+#cN`+iqRxW7Y!N z#iuDr{evUmruZt)SDH@kW=foRd_s{q$YH@hO_cLC6PtZ8MLNT1w9K+1tb9YD?q!{W#xkZu&2mS-M{{AWzIm zA%}VQPO+Vb*WlpBSsUJR-81PQ^V)=h)kyFK@KLZ>Xdal>3|U2|O%-@Q{Q^m+= z1;|wLgGd45SZ!%s13m)`TbU#Dii05r*s$%O2OLiLM$BEzDpHIKD=_=!LuTRA_W(|U zpi-d>f6CF?m6k2zh=flM?bl2@1781Kg?{aN?KnPczZ*TSKm4+_>5q5TkNv*ByB;nY zGnWZtxc9KgtpzR{036Gu7)6Po<(RZ+G6ny4k6|;_uNvQOr`0h1 z<$GPz4|ThvjT=0C5H)LPa>Uz5rHVW9wdKTMU6ydmx}B+pnq`@8orPdIn!(t@wuZ5V z&bTrdC|O`KEM7K!|7wuPNE)~`?ZGn5WXu|%Vp0q3o%&*&5-H&(p<<%aE*%~6d~v6+dEZ5pWKKQMk)y*uIWMy? z?Qq^{+*RNSn_Zr<0$rI4=?VdS2azO=4tH za7Jfoij=)9Swi>0F?qXrq1%rjz$%zokYbz~fGbu>)J!$hO|s5Ja-_?;k>A;emBH{U zc_?%{{($?`(Q_+0fLf6XD^B_Mh2=62!^N!n67Shc)%z3Ekr1vf&y`xM)ls{DZ{PfO z6e{ncXlK56UapYIVzyd`k%E<0e-=-p^JscRZ}#UjOmY#3B*UcPDsUYR$Jg;a&o_8% zl{ew`)~F-e@&k}Y8y}T1#5!h;yfqw4I9G^z#?*XDDe&z6EdwPOqJSWC=$?|Yc+BYF zXihZC%AUx!AB#T7NATczsa!hq1vONGLT<)j@Z?3qXr`o5q@4hIY>2sHFrV%TVrup& zVrsrhtu7&KDKA7j7sTzjD0eRO5s>ad6`b$@X8?zgPo=uWw%NAP#C^%>+yqiDa3%U?%HSk*aa12*TKA9d4 zF7I~%2i9(JQFn*$GaT0Cjo1FovD#QiC2x4PQobKHW1A8)qBzU6uIX4H#ScOQ(SU?A zqTh`7OrvlhwJBRcj5}0Q#B`#}@kqtS#lgu4_XiIT^IA zqAC^>nlo9CUJ{2SekA4q$!5$gk=!Mc`6RSve>1%vy%|R6xo{(CO}^F{-B}aQws1x6Y8G9{p7v-(xy|+?d#Umi=F*C(e(;()b$@gE)Zkct^9gX z$|C*}#d~?h977HVjO|EYKnQc;13l~47CojS-+v=m#}tu%iD#lqW$Q)G$x6qD82~~P znCP(1PEuUWPyViXb-?NGATq>Gth{UKA93W4Ly7L{r?4aFD6HJ#95Y8{+6VZQT1UO9 zwCO!ay=gs64WsLD#fPPQ@?`uRxy(L7IcUS%Q*`Uw3zMZm(p+Bh7xdqu2#*=kt^A5I zbo8^0bmFsF!An=s{!@@1&86Gel96x-uKaHyV>EVFa+U)&nNj3JVB-l>^T-DnML!mA zQ-4s*i;Mc|Vke-hTwhRHo$vv&-t=-2>TLq4m?$z%$j$4Qgub@Rq>YfMY+xw;d8uiCl9L=YWcGKfOvsW zh%QLrevzP5!jCbyNj4R)N-rxmOTSjcateHJDo$n`EHTSKD?Xe8TOfm`Ge}7C(A+Z) zMOB9sO)U|IKc@tB0S3#au0p;H?hG;r5&%}AQ-ZgH!`WjFqZ(03$QW_$uk&ZZC5-cN z>C@0AL0TXxQ!I>t4vvckrtlH*(tnk7jHCRk3(~pHMYEa)=fWQvHH1EZlz1HmCafim z37X~GU~yDaT1sl!FQ5FRJoxro634%&0IN8!?8A=TosYNF=>Ukg0#=|Du@Ax2QQ9=( zsd%={T;I*#EvIVJRkKZ)hMfQ}#6&&KL@m@b?t?-^rjaTzQ;scX3~cBw|Fnm|44Na` zkobpaKH`*Lo9G2FNFmS}-fOR$(oICWHa;p*Z1pt^VnRf z=Ew;OwPUC<4D)%F)??BHHS;XaJl-=pq1hnf65VyLWuop0m6l8C*pjt#zY}XOU|-4{ zfC6NImQ(qj28`c3hE(%&>b0Oe;U`Wp<{+zqz}2CSMqQw*0jV49v#NwilTy_^Yr?!U zeEwK(Anq8yOg%t&N5lB74?^`5YI_69G6kW2fNkQJ$5n5Lb`sO3NzQ_m+4F|zsQ9Sl zM~;i^4s1-#uh2eNiRVCSy%#WkVBMIjZVBUNwgm&q2$l;c555F3Fdg5AKt_urCcpC^ zAu`w}RZlY08P{1!iQ=vjHoSs_i7F)d{wrc&0*@Chu9UO~HH8T$70l%>q< zSzGlsLRz)FHpo1uxC&`OpC*VOt+9kAu z&D+6D_(GZS5=@;&q<${Y!xsP%a!F4*+~mxQK|Oc*mb22c-f-9VC~R9Be6N4{3oFQS zu}u%pvik%3>Wv-$U=EbS=pf4+xakSNvn)S9k-b;<5P<>quO(N5HQ94(iirZ-OJvnZ zOspc45fC#*SKm2wnwM=NF+NdcnBjl5IjdV(YQR-sqhBgShqRch>OC#S!MUi;2Uve& ztxqf(xed8t*ZS1?=hs|`dei*iZ=wlS$lrX0TXIenojFlG>dDEdCc(@b)WtFs%g3rgh1 z@7YOD*iz=rC6WJH7Pe5dSoeh8$q4Nhy`5QPa%W}H zOuNp$uogGmb5hz)0VTA!jEis~qz#_8Hy~QVJn*#M{$BuFK%~E@t|z)?yrtP=sHk`(JvI@Tt3@?-k$)KI%(t(lkq*z0N(? z(qM0JFY_+(ZNi&O$E?S^r>rNvUvpmzUpu~bUF96Z9m8GY?c?2*-a1o*i63Dvb(ebS zX13X~hHbU1^Sx?+#ocA!?-tDlLIW|gK_s0qbFo6s_|juas(zw$BZiW|W_FuQX>ci} z!F5#e2Eb`IP#6Y&rFwWo&Y}=ippYFUR1NgrAK*hypMTn|H`XY|C-g)w_e9CmXZ&0= zx$XekWZr7(U!9m-}u~7c?1Un(Y7o1jpy@zC; zjv&Thgvn~6QH21kC=FbL)L>7dg^SmPLM5pV+KY=kwh$T!73Mzu+O2O*KcHXJkM4U6 z`4aYmF-z}TyK2sZYqrg(LlIEpX5@PgTYDRK-TCm#I}W_G-B=lSk%<6SoKzb6Wfx@y zKdF?-@#Q%)#x8{HtCr`pNvfWF}oh9>B2o<=JASy_onLa;#dpeVD z2??5FiGjgW(J*?`T9zL2B)-$D~Irsg;4^8i|naT zP1=3^mtIa0S>qp2@C$nxx#@i#((G*)rCW@{TSFBF)vY^6B52(Bc(VppGLsKAlaDuR zV5}rJGZu&~h(>{47aM97q6H!lS3#f>j8k;T(5{YTb-{ywK;B_r@6rFZx&b*q>p^xd zq0x`sciZ#`y}0(C@^XakD%ko`$1`UD3sL>Jet6lFW6_V7t{6S~CnRoo!2!NvKLc*l zsTB=lP#&XNRa+g?;$;Qq9WQpdZP;md+sqCNWi>m<_oO&Q!6KuXa-WQ4G7u7nY!)}_ zb0ar7Ot-@OULxPF;&4i0afMJV)CjbYYb~(Nv|(E(Vl>6<$idE;RGa&V8@mZ6fWEkW zp2c0bA-Tjm3L%v|HP{<3za00SqrBiIq=W~r3fPnt5xSeoLylsj;!@<{ji}%v>*GVV zuy>YR1iwS#J5sD5O*YP;&Nk5r1?BXf%f zS1DuMRk>pZUos^;($kQ$Ws@T3nUsjx?QsoJOddDm%_1JqVR(Q6bhFI>NxN)Hwz+vp z2MA{;+o7?fBZ#hmk@#n_B;aINBBU`(Lx{m;7w`3Pd4uE}zn26Z(dYB~*AGQQAp~`5 z5>=cPvil0JN1w~7_+#y{CeHOItHkBhj7@+3r;M93K71bxjsf2rrEBsc3_6wKnvA$* zX>c}V&lxm3+EBoeEazd3^#(@XFX4>kzXZUZl90`5#$gqR!obDAOVF)CFt_&M(rkya z{K&~=_apSq`z?sSrSaf;{hxp7eY}3o(`)C>db~0++?5`34-Mb@!s{LDe~)D3f8+Vy zI}UZvEAM*Rj30mP#h3o$<+c~WSU(58UI%gAP3_a77L=*V)C7B1Qb);(0O+|Mu&KwOS3-Ge z2|ghR>DUEOjv48WBfDt#+Qav4s}AZH)JdZ%A1>A}04+GbeQe{}^@(Tj&{w9Hj9J&3 z_&anOux&guXsmPLspc+9Br98NQiUegh`2@ED;^O)5x*7L46$BZA-2H@mgaa0w3>xH zcR|*(&{P~a5yx^oBVitLrh&y!R*dlpseaw)M}^^@|IOH!05)-)3(w46+STelR+42| zl4Z%aWJ|KKG4=w+7|dZ#V}pXjeS{D@5X=!U34{#3M9cjV}5xGOzUEQG-QY+m&y17bQ5#Oxf57zl423cvX0V ze_QxK5N2Sn1{pXPU&l7-Zef|9@gLKD^cDJ_EHj0hqFch=O7Es0rXOJrum`vUIw6a; zvITSjlh5XJ`MRi~fo@=gp$Ha%r&wCg&@4%ICh;i(B?x-@1X?9~n5eEIi-X)^1JZ|K zCx9gE%PrPyOq>n+tOk@j3^W8?<$D;$sd*pAgXAIKl_gVZCGq1hl8LXrRF; zj-AjAC%_iv0k~cHt@6*?nNwFT!CRC~{nx<{cPc*_%m7tKbA}qVBUXoYD!S>Bywb0I>V9RE)rpCqW**JB5D> zYa!9WI>iK)&?Q`n>{>KVH_la?E&8cw-VDAquQTsp-VfQQxkKVh>`UU|ymNUM@{Axa zn%9U=yqfoM9-Ak7yonmz?o>}QT!7|0nM7?I5x9V=J!sBsu|zVw-f%>~q-QdRtroc@ z*=m8SF(I8mb+XBm5zh4D?^b(Zs~39lcgJ$V;Rvy~jsOr*jS#+u?Bz1t?+Cs$B9F$O zD*OpW5)rv_R3aLAH}Y|WGDWf?oe>H|{E=8>AVNpnxqq%2bfVG=0h+9=x`g#TR!Ntz zlUj9^b=65RZC!6L7P-BEs3lln3pj{>B&lAK9e_rkW{$@1)vEr)wT@NY<)jix&Shww= z{wrD}4&98$%n1(4F3u*|T6D{F^a&c`(K6TSYE6GJGps7wES%B6ih4aZRS^t3fhyXt zw@)%N|BYx9^kLCR@M|!LLlRDe7qOQ6u7p!D^)EtBV~jy7H}D;irXmRoI=Wf;EHtfR z!kPjsD41QpPaT+=g?v9*Jfd;i5haTbKXPpBvTYlQT$_&V*8><*1NL_I$@QPZ&vch< zmmT!$=yL{H-He+@&F0y*+0JIyKD3|RuiGb{;JeX(Fz5Mh@iXQ#_H%>zY2DlC9riWd zZ$xITZYR4xK zUfVYC%wx|y^Y|mrJVW5!rQAU8!|89K~A!~I#OUT-!T2mM(~p3!Iuo6V}DqQBOoo!nQ22h!a8FFviRn~1(A zKJ73+g~Z!C2&JbpQ6j`uxeE0z$i|;vaS|fs%E>u*PsKy*+_PlCZFekOdM6&*#zo3U zO22YRdB1K}|6iz+M}Pe2(WjpzzRFw-`vMHR1!RIp<#KBkN*EIMD(^&8YpAtP^y+TP zf|)vplxSv}g(kynTeH;cnVoq^IOP4Bzht;<7cIb;L6AV}9hy_mnar#UJ7hj<9`;Pb z7K`fC^LLw}*^{N2NtcGf|J60%7qq1ju$);gEU_(@mb;f^Vgx`7s~S0)CrYfG;mJ7E zgz_KGe`)PqkUG8M;VMWe7q>53vUA(@*Y8zsK+f?q?mP(15bKzhxsU#L9d+!fgHIlQ z;o;|rg}ws-s$3oYXXM;{4CIY)2D5}&%TQ749OE+MO;%dqNfZLQTO1HkjW|_A;t8}) z&f_@D;S^$pT)><87=IH_^PVl%gH|-(y2bi}^_-Qqnn9Q>0$>V2s1rU;Rsk$EC!rS% zPHYS@^re)0vSx^5WMKZTDAkCe4Ky5!JK-^A8uYQotz(vJ+0(o0Z6N!jG}j6W0YAbMDSTIkGD= zk>e>;L-DZQX)J`XLKrQCg}y)x6IUDtKw39x`5QuwrkP0;n7g3k1VQ-~tZ&r0yR-~d z^J0i5>I3O{<|LVAhE5m`mIdkpGhwr|2ric{K>AGBfqX&BG zY#jEQ@PBQ3S^K2gGRWfj+r;MxoY3|`HMk%|+82&yg|xQYqqgM?e6Z30%Yt>m{f7I4 zUBUN)Y#=BaXxanPUJZz=Gv88C4NSYhYCD*tO(JJv?GK<9F+jJ%PIwVg0Mk8*AE4DM zZBBe8gz{uS!};_@8W9kjGJdo(F3I@0l8hfJ$;tABMCN8CIVTTq@N-R4mO2eeOS3#O z)?X$MZ1fCxP#SnOgh2gA@>o)BB%`HWYih_yulc7F?C`&o7Iz*RcvI%})*4eT-e5fZ z^=F0((Joey!y_VzBKYD(eFaE|=Qa=J=8-A_k#HmwN#{X+Cmeue!;`7f81z_gT)3({ z$L^S*{ABLt4?g+ey?hAx zlfh{@*F}XT>nul&{h<8?JJo9MwBKVtXTNA?fZc2->EE>7?df=Y(41;GT#n_$NHw3$ zK5&|Z6kO3F3d~=rK7OCN3V|=}CCS?Hw2z;H*rB(pIF;D+QoSWR8BgX|(1z3ch&M9P zwP4ev4HbHR>sIKY!xxm9w-tCZKFE(x8&~oGeD}idf2i!l`1t{rGBfBfwvZl?r6$W# z%YzKXvu?HuRaqKPgXJ^CslK0u);odVu-gTmwb{cC2Ot8{=v3__ZKC75T zt_zDtPF>pzPh+PF!>PxXU<-y*4>M#3lk15lII>~MMn^W-#p*eV_o_SR_f#eh(2%9{ zI-MZuvCoREl!x~SK~SWBT`ywZz9>60{RsgudOL9Ib3nd60V?%70H0nJ7ob5@pQY!e z1PuWXSs;+rII^gvt#Zp&JrHQU!1D+}79aB!WbRmYd2nZ@V-{+JscML3 zOxDw=LQmJwQ)!Amg<{x5?UYSo5AB(gN4yz7*C}DYv>T%9>=BK? zI2GZCatX$)09Yh&44(m<$VXck4`=6nf<+Y7V1{gc1y#Y;Q}yhAYCo&apUdkC$72-g zX_}#Vy+Df@z(YG3JMR`8qL>YG=?GKA=L!+A1e7z?d>t5%#xwQY1b!Xppw}@Se21`3 z+yU;ScQAMIcM3bi_rd#gH`C3(FLaAvfG_A?rkDRh=oP;K-_VzsuenS7H^L>c=-S8y zJ{`H>;7Q~HX${6Gusj*HVKEBd4N#bz4p5jRmy!U5|10Q#)q)O$sIkU~NaTTTG!IFc zAQr6xdi;?A1&zo2&~4~C2|b#zL4pp_F$Y@6LF#+N91MmPv=sm%uaD_vLj?x&>mvpd zhVwNR)_Pea-(1APn$mVGi4D_})`daQozAOJ16OP|@*f5$3N|Z;q2=}C(DdTl(4qWT z`N#2Nm@?|o3G(^&1N7tmS(r9N%x|qKzwMWI<#KP(Xg_xno`>DsMFXSbJhY3=Wy`?` zT|I1uo8Veb2*U!d3|4Y=a3Z%~|26wH$LG*tE?-E{mBLthitrk(nGQ%B!9dX*#|uu{Pv;A9x<;s@c?azlDupS+O5thxIQ^z@iRL*B?NO_X zaCy&BY$20~0NEj05|9=+nv5LY>D1T-eCB6)MTr45apQt)a)uIA_-Z^u`t(ITB!{wu zPwT_OVjS3Xj00MAgpKoL_C&8+Jk@Z}aKS(sDDpLm>&e&Fi`rzqR<>&KRsL;LQ+(W$ zhmw818|F~ZHW=xk9SzPzN)eX6z!$I>G#R4CT;O-a9IXzD zOcAOUQaGW`99q4;goDKBRZz0ao!FvA=tN{5sVxK%X<1PI&JiG*=VrT*vvLJ-dJ5V3?VbzAp0Y@ola8Hn20k{*e8mp3w1_VpnMIpm7QaA z#x`wfoHoThCb{4`H)bd!`o|S?GPPh-&~n~zb2IUIw^7Teoy;3pmr0;aHnIX|b=piK z6h}y3*ht|v-b&WmM(Dp#%eZB;R#IF!1cY`3^#F#!^9EZ;bhaA}k|8X%x|jY|EhUFB z&}Z&7U+O2gnB1qvjF|f`^`+De9I6o$P#3W!mgVB#Iet|6tYA$``OFFEPS}l)*EXxi z)UtHxw?#9Q&)(d)TRS9hET@{OHg$$m0-I$a4F?NZ6$b7L{Rm*PLMv$%*uIcPU|Av# zgJZ;SI7axznD`}j@@VYejXdi5(JflBzV8jx)v|TNkI@|H)&PM!l-#TJ?3hz;ZP?xB zUyC7u?xDkh0kD>u4S&S^jN*U^OTI?|ufFFk50eq*8|B%7x6n_ScK`(%ZLpk=#}BmvB0IVnYs*~!Ww|29(i1Yp-xx;3@bhdQ(QKTpEyV@K3K-0 zp?Y{~U5a`+n@oMCXF;h}yhB;)Bq)Uy(f6GK)gr*j6sS5ijep?`{U-dAS~IUec2fX# zVzUF>gNO8Q5K!oS2wtGIsu${HU>~VJRHYTYI0NnYUO~A;sxYBH!Y?s41kiY#$FS23 zfTZ+eHjnl7Cjt*qD}=CHXjH>+JtEUeKaRZ~w|?@E)8RU1HH1}7g8qv5;%ZGabv(1x z%5d0%iNh~{ab3s!$z`qs=#L1F4m_Mum0wAwt8udf|GE!6E1PMT-JPJhH@!VxYIi2| zsTQoqpBU?#;aljVd=e?@<^#QuNSTdt%x;neF=4tx?6t#I9`fCi1WeuL5Q2>$9gDTh zzXiR35US03iWH9gl$5$6);yUI?<1ANdJD)b%220M1%nl?u=3D*U-lxe9f5Qa8O`@9 zfR2C~KQdT8EJCtt(q-82AL{6TLf^EnUCJtr$4l9to2nZ3?z*qI)U&G6O|5-w)*b7b zGsBUb!jduOwPoWwo64?FcxD&5$cW~mx6xLNjRJ5)&cy^Z-q++?;-j*&xNIZlHH;q# zLi=h7N|K%K&9nD!y*`iNq{s`!kipfIK;q66Ix9bGDUpByQAUk{su)T1_CPFO*WVzrHSp(=#ebtw;Rz!(-u80<> zbxAE1(RTb9s;vfxlD%!^-z~28FX-XYg)Xq`kb6Q`87--*DE5t#5+mLDd3mL}Bkqz( z+cw?n@W#fDduC_n0qTgoJXsYh7-8BArEF(rPEpdcw6JzlW7uDm=}J}4zi%^%^g9J} z;DacMxxn>vKv6dWfY}~U?JqJgYW@nSc~B&y>p>-iEuI``*6yJ{{r}%XfBN6=F@;y} zf#7@m4p2_Px~uo-zQ;W}aQT#O@Sc}pj`@4sV+LQoY#yiHV+Kn=3q6;f0*JhmKo*FA zC@2RtU_6)#n!tRp6s!j8F#o%_tSVuNgPcl+kOxE0^L4zZU6JJL}{sdF?@rZQ|6KFWpeTTJJPHuZY5la-~gR3v2R{xb?O|M)4 zE1;iRsZxnY7U^ygbnAp(*4T?cwC{W$jP`v*sLLGiTkwZUWCtB~j0?YVLAiiETK{V# zHX8mvWee-hZh-O#87TP21Xy|$~eSfj~aH<`sF0t zKu7VczL$m+h<@1BU)n`RIt8O${at6UgvFzqA_cm#9ob2(j$k0k!Eq~(U?X_*BP*3Z zABVcVdw&4`pcMbwp)`lM~^LvJ7N#O5HZARoBfM91hTJ(D7CakN@^U}_a zG8?@Au_jY(J;qoM?spJl%my;SOu5v>cAM?`ZV``$T`xL&t!C@1;=AI2^HYXFlIYf^tZY$rzS8)%k7GRZbmE z67B$lv!<+5&cW)%cbSd}^~(%pE#JJfc%dsZc^zEdQ8yZHgm)}%GR=HX{(8^W5&0z; z(>bg3~T`d%e2u zkl)_za)EBY;Pmx&2I1l0>EO8_6%2YJy|ky-JcJEW`Lm)TjfaoO7GsD|Y#JeIb+>Zz zDI2Wz8A+44r0xlB@>0{*t)J1_v7n`4<&6{O%-?u!?%bAnwpBM&m#l!Z+ecT7kZ-vx zltD^lMONqPwd&GLsEul>jgTVY$oP2ziOQ8hjRZ+aH5CZVp=7aE<t6{^52N=fA zkP%(H5MER^Xv29K53cf0Jfe5(!IsgyfzRmi^eEidED)13m>$0rlVpjKq(Ekm-xM<; zll_oj@EigssOQzyL>Nu=k$_y%8?|s1$xA9m$wW1>4X&bLETU~ z&6q7OufMr%^(}4fZS<&yJ!iMw{_dWJhCT1zzU}OuhAVd;dg94Lhn{@m5Rq3k7=^FV zBQTZaodhCz-I`uU!ibT`>2xCQ#fwnHjzc_(r3UWHJ8|5RK)_<8u#HLTe!r%CmN#|w zf{_RQSbmk0J4F^3p9L=OUvX$$ig9tIWq(kP*IOjkD5uu&1ga#$rNs@b&3(-ypW`>$6W zx@knw#MY%t=ZrR>>#syA=Wp1&VSZ)9#O5Uy^qW`aEH0kiF=6b|#*wjbB+sLKyY#V+ z=GyYah>)C|-U_f6Q>`qaMY;xZz&Y@DWeeb61Q}|VlEiN-Q8v<3>9{I)M;+mHEP0!p z(P4nB0U9Vh4MmnYLH+cIo?=PGV=RR+^19Aosau1swrITTOld0Be}?!j->urZb6C|@ zWh2~vi5hjK>$0*DZGt~hW~%*KPP^z_+%MO_pOxE4zl`{oNWbt|LRV4dG-QFB0f0XW zfysbRspn*+lZJE{-{~3ni_%H%gjerOSF1!U$N=h-ltpxuuEtk;L58v!=#SuMX$VlS zAFS?8-V#IFgauz!+xCY@y9$rGLv1_w!Rte6+o`ro@%cuzEs3Pvs8&ZkgxjuvlJ)|% zJ}o)#){}OFTF084_k8ug^>-F-=c?Cx)#~Go10OOAv40i=W5HCpz+$(X_5SeKvA%J! z2mloklP?QX9*Bjri%JrSg6bl>o44o+iWrJeT}_;jTfD#YY$;(pBF;#=uQX2LE^XD6 z7JOy*At?|JN60jW#)~A|zZkcSh$FG>M#_P&iI-NR)CrJBa=T%dEIE% zh32$BaQ))vHjS&;)^l+E;TmWkc|%L>;)bLZO`Cjr>9hr9mh4e8ODFHSVKkk!@~Im~ zB-fnSrnIj=y1T8scv3i0SLUx=^~m)L9=&CT+vc}STQf0RDw{V>`IA&^HO8vz!^QO_ zp5WxosdU|htr#C(5C+%DqqrO?2kHDSKjK`H3q`QSia^BcwMYEEdk9PBIx-_M9W?2( z$jkA(z8r^x4i<@&r-hlSFOBn&Xre~Q@<-~8WpgYOyBt9o3!5O9>cv!fU$B2_a-CZ zhY^1sB>gesp228QhTos=QyzIkV@;RZt9XBcT z>&u%rO!Sl9`WlyQogBMy<$|2-=JwsQMy_AoIzCV7DVVURV)`wULjMZ{j^w=YWpk?2 zkX&ieE=kVcK8;kx8u*+U%e;(n9GAVhJch>T7sV{(_h-g3Q6>S0H|q=#4MQ=(Z#+t% zAW5}pJ|IveRfeIHyJ7Aif?=-mw_yloUcPeMUL7li0NUiykLutJIw%N0$LajMVCQ*ZIfMd$NI=jJ1UtSAl<-@5#PcGDaiG2; zgF_V71SGId8`7>WD=~>u{auzgHglsp3e4b_I~Y=2Ahp9~F4&>F6(6OD9#!j}kZ3>V zpmJOPLFIiILDS*p{x#@Kf1EkhzZ5;xKS|}{`E0&gB_jviE>E%tpd%A^GT&NX#v}@4O8h?u5E&&vm5O$)_(Clp}ENbbnkD~m(m{0amK3|?a5W`-F`vh8ZoD=knK(W~*$_HWptELpo z_nP>SMMVH6R7ze5ktD=P)>k!YP7M-mn#quzq){l}j(K73+$Y!9jqCW~n29-CE@ z6RMeAS~^P((be~F`u2lI<~C2d``orW&+e-0|LdYVXNK}-Y@D9DeR?=|>N-Mgw_$Cz zOr^Hf^60g~b^*;9q_?m}Z)su+tHf4L97>hc!hj~kM$uTmU}9tO2};le$Z%@I^mdin z{vEB+%ao^-y~-yr15ScX%0hTfi7}_HoW_<0sStnLz^7=PTKA(sw&(>AF0n&x<({$& zWYPba-k`_sEy1O#2l~&Fm>-MXsin`W%khz7Drtca(~K@$WXW|!mQ7kSIZ~3T$G;GzPOs z%3OAiNn%NA+z}gBMs_T(2e?C;4llhr#uzE){&z?RagT-#aXJ|5JDsKmWoml(sb7&U zmp|3I@QL>7x(z?NPL0tT4pUdCW>!h*962X6YGy3fRGX`;bB$ZLqh&??^jZ7PZQT0S zt_dx3AH9NxK&E=8t#8bYOz&)-b8BNxLDN=36()=TnJLCntw=T_s1NHnQbGAJLoo~@ z(CP&pOOvJZGhIZwrSML*A+?l-B$=W{@-F4m-MiI5hbyP3x(iUJe2t%dmoiO_Zb)F? z$eZ+!^P_M$#Pgw$qbvaeB_*yfS#v@Tim*(fDMw;KB9kDLHwpxyXG^hM?@Jp)an%~a ze1o}$A$Y?qqRDg=(E<}B?b~uSHetwDNtDB9`KFed<_b^dlzEF2$?Ip-*uv0lGR>$7 zjVa63JD@w-_KQ7RUb?vqE*%}utX^1mUw&=O?J6Eq&~!h#T}fVu$15E%Jo5iC>BD#kS~;QvXEmTTioM!#azgh zcZlVAkafsrATOrYd<_*wY@J&*Uyw|@Vhm$Tjw>5;)*jzHCb8tf1@qXVhO(@z@`l2asTEm)%Bjq$&C|BEFN|gdCv-l) zXvvFPCpP@x?asx2=;>K9|64y2Aiym$UDTe9g-BK3<$4Z#B#I=&s-`;$PrJ~(}jZpZT60rto;CqT+*5V6Zfhe}CNpudut??Xq`*WI2RVmDq)Z%ZB!NB05Jk}}c5#l8H*%>$ zm3V7pg3R1S-nA7?m0}%E1gf!%>FTn;IM#rcxNG>AYQ2*{B*2jf0ZcPo0879KeNK5} zf|6UOybC{q+?|ZxXfrjytf?lOQO_PfPPZ#(y#+8~< z;#d;;Bc@|m5;i$=ERO6K6g7Fku12TwrheaW= z!_ul@&{9`tj2!B#j$g7gl1GXZ#FQ_W0k;mBx_ZNZe~ zFLwmOBc>MaS4Jb|riYVdyw+P*(*+x^jj zX)hixo;NAGaa-%+oijpE;HXXqXo6*kd&^@ilTe_v6L^)dR4tpXyqx~qPwno% zAC2yR72QU+{||d#0^dZnE|N5PJ6)!fZZvHtU1-bJy-lGTNlQUMNSm|`ZIha$ z6kMS!g6v$RfD4NYA_5{P3Zeo<5m32`;D#vTRS;ykq9C;Wf9K33O<8=t`~Uggy}wru zO}?{z`}w|eW|GO-ch3HHmZK~<1C*tNCMyhnB?MI@aDxi zSSq?Kc2^$*OQuq*DOId}Ui*l}r=PAUU3qHhaY*)E-vvz_lh<6PQk7eB!izOoe&p&? zU8<;@q>!qoK5u*Q)2Hs)yfwMFGDi1E)r5ItRqg?dvW~ao{n(CKS^lCZ8e+b?Ko*5> z!Fmz+@lQCZOQn=VE`yB(Qep?%E^=z*_1JNt_XCnwk_@>X-+s6k;!_3r(v3yr$*u^3 zqe#9E6a_?3mXzWs5eP4Ki%b$baWaR4w%%BT=EQdYEXaa6zQmv`{}>5`;l;ir<4gMb z`ZID;9xju~6=+q6<=jQ7%nL_AyZ8?11cVMhsTeXdm~+0h06* z$b;e{q7(c?w6)W(>4}=eBkzX9Ym)l)OD>G#d8RL6EzQg-l!$4mI7%e+5s8EnAuXka zQaC|S0vZl<0??ojEe)sDG)2$~IM>nc(kQi@B;*P?BNxb}6zm~nGFref>T=MVZ~-0k z(9WCO`zU(mFrk(w1ai6*n@Q8dM!I%%=MVS!!1kHEP&dwi2OtS@@3 zW;SiT*?N}Oh!AC%K%yk*8c7HBCfL7Lh|m#Ud(RLr68?KY7V=`fD6c?YTJ9lKh?Jn29qw*Y1)oJbym9)3b0vQG zE809_;6gHfSR1-Y06P%$OG{o6BoxH0GF0F%2%yC>5Bcllvaa9hZsNPHZo2Dta@j7K zhfE?QC-#eH(;}(N8;b;~HxHvfu>GC^X^HWH4vX8d#YbnQ-Y+3XN=S($0P==7O0bj$ z&&&etNvBX`9(shnYtRwgwo*9j0{2NM-dsp_D3!#D1%_9W3i1sBspvY_RU!a3im078 z7Ev#CRuFh!`ZN7A#2<8C)n&z}M`|LewD7`kD&1S-O%(~q!2(hiJ_6H(UO_oW;T?WB|u3r_3tSEJ!L_l*| zUnFEe>-~s9#F{Kk0ZXQZkp(_vzLM0)NFWd&4Ez=Zl4*ftR3I5h`-Kl27eN+9km=xp zOG6O*Z4l&9P=qd`j zhyvd7fs45&Ah${87C}-XcZT9E7%7h89*^R>14p0OAh9XaqR`zZ^i@HJNrg;{)}k7^ zpbVMQVcxu~fn#s3P?a_ekBL7Six+g@!~+{MFMe4${2?h3J${q>L>KamP|C3b z^~KNJ1bxF^IwHbL>AGu;@LfsK`g!`C;C}slhgt4PGbQipdhwZLZIDMlCOSyDq;PbQ zDmFPzQIWlhwtDtYi;1~6Iet=Akw5KgDCzqCTIpDYL@K1ZGN=s#T0A^Pl`f*F)A*U3 z7wBm4pEP1#R*^NDjP4&FF6kE@9Q>pQIoX38>p^-D5`~13WJzd=M43T^r=|4|=YGW| z4XGj=76RcR@JI>kmw^JX0A=D=QsiMsApy=iT-@%7`%Di2F1H*epzw(9slq4} zCi%lQmL30hT*GiY^aN|op*Z|pf6@@pG$uwfh#AQG+@l${B+5S6x}ovd&t6@pyei7d zt9(RCM8g&%l8vOuNUumL zQi677A#yK1`{MP*U24W@mA{aK@5J!e9>k6-6H%#4NJc=*>$UMYaRIbYNHP+?$dHi2 z@z%ooUoa2zl)FLbUY#?}C!^3iEXF@*Toz^Re916-VqX7Hw!e4$NPP;sYz%sc3#^RU zz@rzei)44XOzJL`N6Dl5>h$r9?-o( ziByKO3tA9lAebHY3UHk4xo(FJnD}(*XmF%S5`7FE(jzrWD0TPtI7q6y^15zx6_9Bk zd3bw(!p-kn$dx^fhz(9WBp8itNa9Y(sn6TC?Pc@ z`2s<%BFK7zEDR-6L&>O6GBh%rAp8e}a}U=I&?v~k3NltfDrDhOshkc7_m_t!x@AIi zM7Oaie?=%QkVd%qBPj`ol-w5J>j~h>8R*!699!`<{t?j&+#X;8|1VqsjvWE#P5g^h z;LXWcY9w*;ApC_4ntsF6Q$P!p?yq)T={iP+o4o=>=x1d;gzaR+GTPHq4kyn*FEbg^ zb(C6^n&IVHl-LQIB6GpJzNVIUjU_j9PVO3jxCnz4e-oeLDzl=dh{+7t7X!&C z?m>PMiCRPwB87-S*KA2S`k*_yXuMr26H(l52BiZyNhLY;gYJ=F&EPB5$*GRVyM<9h zyCi}coi9@6AE|X`4|nFA?e6AIA+T$Yaz{4-MZ^~$s|mj>8A;G$lFA}U`VGNW{ITP> zR2ZGweTizJE|X&Sbh5I04!$=|$sKpI#{q_m)K!6)xJVG4v4r>)0_h6(!Df=0iu*1( z`Y1U538P&=-mNV&!}vcoWr5T?L9mNp1IIm?FAX&r$3TGux;$&^ruz=b)Li zVb^)lL|uZuEV80|HX+|ZIi}+N zM8G@^W6mb4Zqq_4b(nfYc!Z-%>2a?_;OI@Hj!@HtA8>Q2YTWBBaGl$N=YoFuxguw; zH+6t&7w+P8L6zZNG3C?+^)A(hdqEe}cqEaM;w4I^KIZ#CTIwFuCwKIzfaXJ(CP)i3 zv9t;SCoTRrh%XC?lRbs(PuAhGhJ2U&o>EZDs80mX(^~qJaHS|ov_w1+4hf09%6aKp z*)Z8FaxeKrh;of?FS~WSpYiba9I6lg3mmB)R;eU|zr_?7v)`_By+;H85c3^!R)mQpTU->^;g8z~-sIT;uf5TE9H#u%rU+F7-rLXjr zzS39vN?++KeWkDTl|NHdi~GvIZE5c-edRy8?Bh#!{J8iX@n0oq5}yA5EI%arBw7+5 zPTZY%DDktz9}+JncC%vEll5oA*l0G9O=C0JLbi-Oq0Uz?Q2&-RJgF{eSMsprr=eU* ziA&j-aw4@T^^HN%gAxa&4ayv}H7z!6e%d$bA?cOr9qFAJ{uxynuVs8QxP0*AgRc)M zA98tU^Dyx+)v$+$eLmbYd`~8kne{(hs{YTG+Dv<9Tjr9?HJO_;-^@Ie`97Ro+{c|v7Ro+{d2Iphfl}=45M$*vXNkjB!VT>L>fR9L_J}I_Y%TFnBmV(Oe30cOD@!`0Haquw43mV z1n9{o8lfp3$L#vT!g_bgm-3)XcbczA{G{D^g zco@KI0h}hH2H+Zio1xF@q{BG5XNhEhqMWrfLWOzI1BPZ8%K%+H&_OtAhz5S_2&mOV zE9z|l9&JvUkRD7}j>fz4Q;T)M5IInEznzo9H+A-mIW~|#Gc)k&jFcM8b6KUFjUm2bw$5;lp+n@#Mui0tA z9yw6I9k?*TOdDt+8;|59a!8@aJRuJ-V2X(61}t6ezvMl)jvU;JY7X=?Vp(EfqzUtG zacV4<7>%`Lb4rp17?JgRaKt-tlmK`Cv%W6Fe|`S`pW^Sg`$3PD@~|hg!dNrt1KF__ ziiwvg9_!u${FpF>QruIIJx>p~k!{McCs}ci39lm^y!ObBbfzXUh;;PCirai0$=w3H zG-D|_d22Dhc5J_~SjP-rk<+kFIUU%Yc6E$KZ5HfZNc)HoM+TEI|{Dvg1B9s~Yp+u;;C|vGX%HPqE(CQtOmK<*fJk#_if^#&rYC zse!tR_Y<@pIl3w*om(Z~EY^zkRD)N}opjd9OKQSvsu8aq$4b9d_h?QdhGJlRY%gEE zGj@)Le^s}xE5YHPR_yx@e{=Z$og{Ejzn!lkE6Bz z`nyWX`JTR)S8*%f!oPA-aWINO&3q(6+&Zl3z=KAjc=ty>%0+E6Zg4LJW@VNY24TA`~Nz$cRP* zj$1}-RXwyJ4b{O2M_(e3bK)&gGL~PxJ<-DE)R=>t|4ttIlX0I3z6D3I0|yi0^ybOX z#@Wf?HAb8>8~J?E_L%1kM+;l+2O~WUp4a)oTGs90GC(HPEXMjJ^B3Bc=i|A!l@xWmfgbV97p^x;FcE9 z4Yx*m_BagAYK^?l#5j1oyKM=S$9iRSuy(AAjtn@

    )!x6Akk_;B@%7Y{*ki?fgou=QkEj_Yd7 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

      j9;9o%<2)q1z*LXF79+Y1&3{NW~T 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ΣOyS=;W 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
      +`C4f6G2a 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

      Q~&SG1M?Fk)eOO$WpkQ1Tlj_Fz% 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

        7H^oN; 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

        Tpr^LFUUtMi_<*<3x;a}XDb7vJ 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 literal 42176 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 R8Jt4H@?Je>zIE$w{};>}unzzL diff --git a/fpga/fpga_pm3_hf.bit b/fpga/fpga_pm3_hf.bit index 3b9372dc0190aeb8c83e2ba2c32c31ab3563cb11..078b9b6fb019b406476590fef9c1c337ac7620b8 100644 GIT binary patch literal 42172 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�d_5;~&@WJ6sQau|+pEed~j!%_I|`%6|>r`R#JZ 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 Z`(66O=Z|Ko#J|H@itu;pbMOD{{{ol%HxmE= diff --git a/fpga/fpga_pm3_hf_15.bit b/fpga/fpga_pm3_hf_15.bit index 366c1c2816623df65e145e2cad5e9a1d6b007db3..1a7e7257b887f6f49513721bce2a676bdf4acc1d 100644 GIT binary patch literal 42175 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

        h3G9N*mMKrk=iH z3Lw5o6vQgai1Jw%A2|2h&YokLZ^s9`Y9NDb@CPg?bixP=AaxsF{tc)jB?%Il-FK(5 zUTG&2qHCq8lNxU%4FU^O0W^kEHczM|1IaA(+yEeF5joStrM!UyTl|Zs29p>UC z{h`az`j!CS)y>RCmAp(LL6d=z#Zft#UZgg@wm^T%AWCDnT9$gj)d5JAfuF|GgznOD zR9&r9U;{t{OEwTjQFVzPpO<6RysQWsi>qp!7f893mm`Uv4{i_(b#{zHY8C^}ipq*; zbTN=YSz7*A@UqH=idw!*$4m0@(}*5n6ty(<09Y`t=G7BaE<%B+0={zx0J!>JijoZ_3HP^6Ylld+L>z5 zk-auZQ|zhYWhVN}OosV=SN6Keu)Ti0ehEDLewlS^vf6`7fb{Q&dR*gvZ7tm*Q}c^~ z7WNIaR~0V@1nu*3_+0sjmluOj2e}`ra33r^Rsvynn;M1B6{Dh;cH&HPi-8Erf~tUy z)wFsE2p$V%Rq=8}&ldq4q+byT(x48vXjjorY0WPIK^+ze znlG@5Z(tRFG4O(XM4UE>WHFYe=_Oz?ENiFXp36GD$<(1GKn8WF391@S^njrK0Y+sc zv;y-ovoPp*5s+b7qPv($8$DVI0F#6&5Vn^;7hBxs)(~b*em3~@={Vx$N)V(GJ)e*5 z5--nf?yO%5MEG2V3JO?63SL+k({V${%T=H&O!EKA%hhxo67-)$Wi6%SQ1W4vrizy% zf>t0((^N9Xs3o7UbOqeR@z+b)F%!;sf8*jgi{k3NK82muAeX;i&i+8<^BP!5dbeS@K$tchSf!DCjFTv=fgk8?w^qoZQ@sn zT285RKP6G~`Jgbqc{~j2XA;#w;2l(y4GA)rVH&pFRjo>yM27gyi0rg+iga){NEb|C zG@b?#R;6rwQVVJge*|h6+$EWAe8f6;vcRiYL4#2mnbnlc3in~#pD0{W(am%dCixwR9#V; z9k1>1zq;XngI|S7%K4NNhZ%lcn)m#Cc3ipVmzEX&92tJ!i}GNwv7xL!B#7K#P%cmP)jZtBCGH!n)Q9cH#k#C(Ntw6PTMQk? zR>2=7cs^RC%gS^cb}$`2iEI35zZL+c z%V$KZJzS;BTi{lN*A5xPwp!@soNhID4qFDLAw;57Gd4Be)w<@VrK^3VPOvUR66qji zq09VS@TP3Q<8%SkFxY9A(-7(>$vVh;@|5aXhZ*dw(&a6hNB7a1xfLzGE-$QT27uKO z=`xjC)R>T+<9v8bK+gMl@GM3()PM$JO-1Q89tLeUM9l!HXsjcoXojbo&|Wfa6RWV0 zjslV^kS}WlAN&(@9u2Q9i#j3KH7wuQfh5x9GVs3%KR>B1OSC|s!k+(IFM6UdFMb}r za92J^$R;1KR9!Zq9sSGl0XjoPKgCy(UR?80pq{@tssQhO z@axljlCl=3sVewm|AS>YjVslm{H-6GU|G0a1IsnATm#EBuv`PnHLzR*pYj?|^Ce7} zFkcd%@~T*V{N);0u7TwmSgwKP8d$D@Phkx>DwuEP9fu_Re-v{_)P9m`2-3$L8s*<{ O)B*mUD=$k0nfxEa&@5;G diff --git a/fpga/fpga_pm3_lf.bit b/fpga/fpga_pm3_lf.bit index 864274cca566de094dbd364e4fc389714277eafa..32ec549622626fcd4551910ad0c97fe1bf271c74 100644 GIT binary patch delta 29 lcmdmUl4;LLrU_;O7WzgO3@HqphK5!q7FG%t8{Nv50051p2+jZi delta 29 lcmdmUl4;LLrU_;O=K6+43@HqphGtfVMpg Date: Mon, 28 Aug 2023 12:04:12 +0200 Subject: [PATCH 886/924] misspelled a name.... sorry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 637917d1a..cae4e6507 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Swapped to OE1 for Shallow modulation on RDV4. Thanks to @gentlekiwi for testing (@d18c7db) + - Swapped to OE1 for Shallow modulation on RDV4. Thanks to @gentilkiwi for testing (@d18c7db) - Changed iClass SIO and Legacy credential detection to be more reliable (@nvx) - Added `hf iclass esetblk` - set iClass emulator memory block data (@nvx) - Added cryptorf regressiontests (@iceman1001) From ba320f26f7456c633dab1efe2ee243b70eb962f6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 28 Aug 2023 15:34:36 +0200 Subject: [PATCH 887/924] ensure registers and vars is set correct --- fpga/fpga_icopyx_hf.bit | Bin 72749 -> 72749 bytes fpga/fpga_pm3_felica.bit | Bin 42176 -> 42176 bytes fpga/fpga_pm3_hf.bit | Bin 42172 -> 42172 bytes fpga/fpga_pm3_hf_15.bit | Bin 42175 -> 42175 bytes fpga/fpga_pm3_lf.bit | Bin 42172 -> 42172 bytes fpga/hi_reader.v | 12 ++++++------ 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fpga/fpga_icopyx_hf.bit b/fpga/fpga_icopyx_hf.bit index 07a1a0bbd39a3dd1a2b84a58bad4b2779de19fc5..2deb3216ce64bc0e7e8add8049df1a585632cf8e 100644 GIT binary patch literal 72749 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 z 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 literal 72749 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

        Tpr^LFUUtMi_<*<3x;a}XDb7vJ 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 Yn~_P(pDt2^KL=lm@cZ;P=YIBo0Jbn{)Bpeg literal 42176 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 diff --git a/fpga/fpga_pm3_hf.bit b/fpga/fpga_pm3_hf.bit index 078b9b6fb019b406476590fef9c1c337ac7620b8..c824711fd4b50ad0bd973c85f06631f0b0e10d19 100644 GIT binary patch literal 42172 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∩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 literal 42172 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 TVg`G5ZxIDs@G literal 42175 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 Date: Mon, 28 Aug 2023 15:36:01 +0200 Subject: [PATCH 888/924] text --- client/src/cmdhw.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index 1b2cd5459..4b26bc00e 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -1294,7 +1294,7 @@ void pm3_version(bool verbose, bool oneliner) { return; PrintAndLogEx(NORMAL, "\n [ " _YELLOW_("Proxmark3 RFID instrument") " ]"); - PrintAndLogEx(NORMAL, "\n [ " _YELLOW_("CLIENT") " ]"); + PrintAndLogEx(NORMAL, "\n [ " _YELLOW_("Client") " ]"); FormatVersionInformation(temp, sizeof(temp), " ", &g_version_information); PrintAndLogEx(NORMAL, "%s", temp); PrintAndLogEx(NORMAL, " compiled with............. " PM3CLIENTCOMPILER __VERSION__); @@ -1333,7 +1333,7 @@ void pm3_version(bool verbose, bool oneliner) { #endif if (g_session.pm3_present) { - PrintAndLogEx(NORMAL, "\n [ " _YELLOW_("PROXMARK3") " ]"); + PrintAndLogEx(NORMAL, "\n [ " _YELLOW_("Proxmark3") " ]"); PacketResponseNG resp; clearCommandBuffer(); From c8cfd4a517cfa83c0ce5697fdbc66eba9804dffc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 28 Aug 2023 15:36:29 +0200 Subject: [PATCH 889/924] text --- armsrc/appmain.c | 1 + 1 file changed, 1 insertion(+) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 5908ed855..900cb6517 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2723,6 +2723,7 @@ void __attribute__((noreturn)) AppMain(void) { SpinDelay(100); BigBuf_initialize(); + // Add stack canary for (uint32_t *p = _stack_start; p + 0x200 < _stack_end ; ++p) { *p = 0xdeadbeef; } From 70bd5b80b59521e5f396d8dde2274ce5953310a8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 28 Aug 2023 17:59:48 +0200 Subject: [PATCH 890/924] limit clearing the bigbuff for 14b raw commands only to clear_trace flag --- armsrc/iso14443b.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index adfd52491..c2516c36a 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -2093,7 +2093,6 @@ void iso14443b_setup(void) { // allocate command receive buffer BigBuf_free(); - BigBuf_Clear_ext(false); // Initialize Demod and Uart structs Demod14bInit(BigBuf_malloc(MAX_FRAME_SIZE), MAX_FRAME_SIZE); @@ -2417,6 +2416,7 @@ void SendRawCommand14443B_Ex(iso14b_raw_cmd_t *p) { if ((p->flags & ISO14B_CLEARTRACE) == ISO14B_CLEARTRACE) { clear_trace(); + BigBuf_Clear_ext(false); } set_tracing(true); From 0810f07a4177e25b37bf635e23d993397dffbb4e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 28 Aug 2023 18:00:32 +0200 Subject: [PATCH 891/924] improving false positive for 14b SR tags --- client/src/cmdhf14b.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index e8d48751a..4e808a969 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -440,8 +440,13 @@ static bool get_14b_UID(uint8_t *d, iso14b_type_t *found_type) { if (resp.oldarg[0] == 0) { memcpy(d, resp.data.asBytes, sizeof(iso14b_card_select_t)); - *found_type = ISO14B_SR; - return true; + + iso14b_card_select_t *card = (iso14b_card_select_t*)d; + uint8_t empty[] = "\x00\0x00\x00\0x00\x00\0x00\x00\0x00"; + if (memcmp(card->uid, empty, card->uidlen)) { + *found_type = ISO14B_SR; + return true; + } } } @@ -964,9 +969,13 @@ static bool HF14B_st_reader(bool verbose) { iso14b_card_select_t card; memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); + uint8_t empty[] = "\x00\0x00\x00\0x00\x00\0x00\x00\0x00"; int status = resp.oldarg[0]; switch (status) { case 0: + if (memcmp(card.uid, empty, card.uidlen) == 0) { + return false; + } print_st_general_info(card.uid, card.uidlen); return true; case -1: @@ -1399,7 +1408,6 @@ static int CmdHF14BDump(const char *Cmd) { return switch_off_field_14b(); } - if (select_cardtype == ISO14B_SR) { iso14b_card_select_t card; memcpy(&card, (iso14b_card_select_t *)&select, sizeof(iso14b_card_select_t)); From 4e411bec2284aa578eb99f8e5f539c0f8fb1b9ce Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 29 Aug 2023 10:57:05 +0200 Subject: [PATCH 892/924] fixing false positives --- client/src/cmdhf14b.c | 45 ++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index 4e808a969..536fa2ce3 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -442,11 +442,12 @@ static bool get_14b_UID(uint8_t *d, iso14b_type_t *found_type) { memcpy(d, resp.data.asBytes, sizeof(iso14b_card_select_t)); iso14b_card_select_t *card = (iso14b_card_select_t*)d; - uint8_t empty[] = "\x00\0x00\x00\0x00\x00\0x00\x00\0x00"; + uint8_t empty[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; if (memcmp(card->uid, empty, card->uidlen)) { - *found_type = ISO14B_SR; - return true; + return false; } + *found_type = ISO14B_SR; + return true; } } @@ -918,6 +919,11 @@ static bool HF14B_ST_Info(bool verbose, bool do_aid_search) { if (status < 0) return false; + uint8_t empty[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if ((card.uidlen < 8) || (memcmp(card.uid, empty, card.uidlen) == 0)) { + return false; + } + print_st_general_info(card.uid, card.uidlen); if (do_aid_search) { @@ -969,13 +975,14 @@ static bool HF14B_st_reader(bool verbose) { iso14b_card_select_t card; memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); - uint8_t empty[] = "\x00\0x00\x00\0x00\x00\0x00\x00\0x00"; + uint8_t empty[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if ((card.uidlen < 8) || (memcmp(card.uid, empty, card.uidlen) == 0)) { + return false; + } + int status = resp.oldarg[0]; switch (status) { case 0: - if (memcmp(card.uid, empty, card.uidlen) == 0) { - return false; - } print_st_general_info(card.uid, card.uidlen); return true; case -1: @@ -1011,12 +1018,18 @@ static bool HF14B_std_reader(bool verbose) { } return false; } - int status = resp.oldarg[0]; + + iso14b_card_select_t card; + memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); + + uint8_t empty[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if (memcmp(card.uid, empty, card.uidlen) == 0) { + return false; + } + switch (status) { case 0: { - iso14b_card_select_t card; - memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, " UID : " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); PrintAndLogEx(SUCCESS, " ATQB : %s", sprint_hex(card.atqb, sizeof(card.atqb))); @@ -1111,13 +1124,13 @@ static bool HF14B_other_reader(bool verbose) { if (status == 0) { PrintAndLogEx(SUCCESS, "\n14443-3b tag found:"); - PrintAndLogEx(SUCCESS, "unknown tag type answered to a 0x000b3f80 command ans:"); + PrintAndLogEx(SUCCESS, "unknown tag type answered to a " _YELLOW_("0x000b3f80") " command ans:"); switch_off_field_14b(); free(packet); return true; } else if (status > 0) { PrintAndLogEx(SUCCESS, "\n14443-3b tag found:"); - PrintAndLogEx(SUCCESS, "unknown tag type answered to a 0x000b3f80 command ans:"); + PrintAndLogEx(SUCCESS, "unknown tag type answered to a " _YELLOW_("0x000b3f80") " command ans:"); PrintAndLogEx(SUCCESS, "%s", sprint_hex(resp.data.asBytes, status)); switch_off_field_14b(); free(packet); @@ -1141,13 +1154,13 @@ static bool HF14B_other_reader(bool verbose) { if (status == 0) { PrintAndLogEx(SUCCESS, "\n14443-3b tag found:"); - PrintAndLogEx(SUCCESS, "Unknown tag type answered to a 0x0A command ans:"); + PrintAndLogEx(SUCCESS, "Unknown tag type answered to a " _YELLOW_("0x0A") " command ans:"); switch_off_field_14b(); free(packet); return true; } else if (status > 0) { PrintAndLogEx(SUCCESS, "\n14443-3b tag found:"); - PrintAndLogEx(SUCCESS, "unknown tag type answered to a 0x0A command ans:"); + PrintAndLogEx(SUCCESS, "unknown tag type answered to a " _YELLOW_("0x0A") " command ans:"); PrintAndLogEx(SUCCESS, "%s", sprint_hex(resp.data.asBytes, status)); switch_off_field_14b(); free(packet); @@ -1170,12 +1183,12 @@ static bool HF14B_other_reader(bool verbose) { if (status == 0) { PrintAndLogEx(SUCCESS, "\n14443-3b tag found:"); - PrintAndLogEx(SUCCESS, "Unknown tag type answered to a 0x0C command ans:"); + PrintAndLogEx(SUCCESS, "Unknown tag type answered to a " _YELLOW_("0x0C") " command ans:"); switch_off_field_14b(); return true; } else if (status > 0) { PrintAndLogEx(SUCCESS, "\n14443-3b tag found:"); - PrintAndLogEx(SUCCESS, "unknown tag type answered to a 0x0C command ans:"); + PrintAndLogEx(SUCCESS, "unknown tag type answered to a " _YELLOW_("0x0C") " command ans:"); PrintAndLogEx(SUCCESS, "%s", sprint_hex(resp.data.asBytes, status)); switch_off_field_14b(); return true; From 44fc77ec3beee66ffcb6220447d6b5637f6704b7 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 29 Aug 2023 11:24:32 +0200 Subject: [PATCH 893/924] Newer Atmel define file, fixes some typos, adds a few new defines --- include/at91sam7s512.h | 284 ++++++++++++++++++++++------------------- 1 file changed, 150 insertions(+), 134 deletions(-) diff --git a/include/at91sam7s512.h b/include/at91sam7s512.h index b43f0dbb1..25e03506e 100644 --- a/include/at91sam7s512.h +++ b/include/at91sam7s512.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // ATMEL Microcontroller Software Support - ROUSSET - // ---------------------------------------------------------------------------- -// Copyright (c) 2006, Atmel Corporation +// Copyright (c) 2008, Atmel Corporation // // All rights reserved. // @@ -27,14 +27,14 @@ // ---------------------------------------------------------------------------- // File Name : AT91SAM7S512.h // Object : AT91SAM7S512 definitions -// Generated : AT91 SW Application Group 07/07/2008 (16:13:20) +// Generated : AT91 SW Application Group 01/23/2009 (11:51:35) // -// CVS Reference : /AT91SAM7S512.pl/1.6/Wed Aug 30 14:08:44 2006// +// CVS Reference : /AT91SAM7S512.pl/1.6/Wed Jan 21 10:52:45 2009// // CVS Reference : /SYS_SAM7S.pl/1.2/Thu Feb 3 10:47:39 2005// // CVS Reference : /MC_SAM7SE.pl/1.10/Thu Feb 16 16:35:28 2006// // CVS Reference : /PMC_SAM7S_USB.pl/1.4/Tue Feb 8 14:00:19 2005// // CVS Reference : /RSTC_SAM7S.pl/1.2/Wed Jul 13 15:25:17 2005// -// CVS Reference : /UDP_4ept.pl/1.1/Thu Aug 3 12:26:00 2006// +// CVS Reference : /UDP_4ept.pl/1.1/Wed Jan 21 10:53:24 2009// // CVS Reference : /PWM_SAM7S.pl/1.1/Tue May 10 12:38:54 2005// // CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// // CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// @@ -48,7 +48,7 @@ // CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// // CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:10:41 2004// // CVS Reference : /TWI_6061A.pl/1.2/Fri Oct 27 11:40:48 2006// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// +// CVS Reference : /TC_6082A.pl/1.8/Fri Oct 17 13:27:58 2008// // CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// // CVS Reference : /EBI_SAM7SE512.pl/1.22/Fri Nov 18 17:47:47 2005// // CVS Reference : /SMC_1783A.pl/1.4/Thu Feb 3 10:30:06 2005// @@ -337,7 +337,7 @@ typedef struct _AT91S_DBGU { #define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register #define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register #define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register -//#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register +#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register #define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000044) // (DBGU_EXID) Chip ID Extension Register #define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register @@ -1455,12 +1455,12 @@ typedef struct _AT91S_TC { #define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable #define AT91C_TC_WAVE (0x1 << 15) // (TC) #define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA -#define T91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none #define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set #define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear #define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle #define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection -#define T91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None #define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA #define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA #define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA @@ -1533,10 +1533,21 @@ typedef struct _AT91S_TCB { AT91_REG Reserved2[4]; // AT91_REG TCB_BCR; // TC Block Control Register AT91_REG TCB_BMR; // TC Block Mode Register + AT91_REG Reserved3[9]; // + AT91_REG TCB_ADDRSIZE; // TC ADDRSIZE REGISTER + AT91_REG TCB_IPNAME1; // TC IPNAME1 REGISTER + AT91_REG TCB_IPNAME2; // TC IPNAME2 REGISTER + AT91_REG TCB_FEATURES; // TC FEATURES REGISTER + AT91_REG TCB_VER; // Version Register } AT91S_TCB, *AT91PS_TCB; #else #define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register #define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register +#define TC_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (TC_ADDRSIZE) TC ADDRSIZE REGISTER +#define TC_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (TC_IPNAME1) TC IPNAME1 REGISTER +#define TC_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (TC_IPNAME2) TC IPNAME2 REGISTER +#define TC_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (TC_FEATURES) TC FEATURES REGISTER +#define TC_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (TC_VER) Version Register #endif // -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- @@ -1727,13 +1738,13 @@ typedef struct _AT91S_UDP { #define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). #define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction #define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN #define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle #define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable #define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO @@ -2048,178 +2059,183 @@ typedef struct _AT91S_UDP { #define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register #define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0xFFFA00A0) // (TC2) Status Register // ========== Register definition for TCB peripheral ========== -#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register -#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +#define AT91C_TCB_ADDRSIZE (AT91_CAST(AT91_REG *) 0xFFFA00EC) // (TCB) TC ADDRSIZE REGISTER +#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_VER (AT91_CAST(AT91_REG *) 0xFFFA00FC) // (TCB) Version Register +#define AT91C_TCB_FEATURES (AT91_CAST(AT91_REG *) 0xFFFA00F8) // (TCB) TC FEATURES REGISTER +#define AT91C_TCB_IPNAME1 (AT91_CAST(AT91_REG *) 0xFFFA00F0) // (TCB) TC IPNAME1 REGISTER +#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +#define AT91C_TCB_IPNAME2 (AT91_CAST(AT91_REG *) 0xFFFA00F4) // (TCB) TC IPNAME2 REGISTER // ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register #define AT91C_PWMC_CH3_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register // ========== Register definition for PWMC_CH2 peripheral ========== #define AT91C_PWMC_CH2_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register // ========== Register definition for PWMC_CH1 peripheral ========== #define AT91C_PWMC_CH1_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register // ========== Register definition for PWMC_CH0 peripheral ========== #define AT91C_PWMC_CH0_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register // ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register // ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register // ***************************************************************************** // PIO DEFINITIONS FOR AT91SAM7S512 // ***************************************************************************** -#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_PWM0 (AT91C_PIO_PA0) // PWM Channel 0 -#define AT91C_PA0_TIOA0 (AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_PWM1 (AT91C_PIO_PA1) // PWM Channel 1 -#define AT91C_PA1_TIOB0 (AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_PWM2 (AT91C_PIO_PA2) // PWM Channel 2 -#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock -#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_TWD (AT91C_PIO_PA3) // TWI Two-wire Serial Data -#define AT91C_PA3_NPCS3 (AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_TWCK (AT91C_PIO_PA4) // TWI Two-wire Serial Clock -#define AT91C_PA4_TCLK0 (AT91C_PIO_PA4) // Timer Counter 0 external clock input -#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RXD0 (AT91C_PIO_PA5) // USART 0 Receive Data -#define AT91C_PA5_NPCS3 (AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_TXD0 (AT91C_PIO_PA6) // USART 0 Transmit Data -#define AT91C_PA6_PCK0 (AT91C_PIO_PA6) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_RTS0 (AT91C_PIO_PA7) // USART 0 Ready To Send -#define AT91C_PA7_PWM3 (AT91C_PIO_PA7) // PWM Channel 3 -#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_CTS0 (AT91C_PIO_PA8) // USART 0 Clear To Send -#define AT91C_PA8_ADTRG (AT91C_PIO_PA8) // ADC External Trigger -#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_DRXD (AT91C_PIO_PA9) // DBGU Debug Receive Data -#define AT91C_PA9_NPCS1 (AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 -#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 +#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_PWM0 (AT91C_PIO_PA0) // PWM Channel 0 +#define AT91C_PA0_TIOA0 (AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_PWM1 (AT91C_PIO_PA1) // PWM Channel 1 +#define AT91C_PA1_TIOB0 (AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_PWM2 (AT91C_PIO_PA2) // PWM Channel 2 +#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_TWD (AT91C_PIO_PA3) // TWI Two-wire Serial Data +#define AT91C_PA3_NPCS3 (AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_TWCK (AT91C_PIO_PA4) // TWI Two-wire Serial Clock +#define AT91C_PA4_TCLK0 (AT91C_PIO_PA4) // Timer Counter 0 external clock input +#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD0 (AT91C_PIO_PA5) // USART 0 Receive Data +#define AT91C_PA5_NPCS3 (AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD0 (AT91C_PIO_PA6) // USART 0 Transmit Data +#define AT91C_PA6_PCK0 (AT91C_PIO_PA6) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_RTS0 (AT91C_PIO_PA7) // USART 0 Ready To Send +#define AT91C_PA7_PWM3 (AT91C_PIO_PA7) // PWM Channel 3 +#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_CTS0 (AT91C_PIO_PA8) // USART 0 Clear To Send +#define AT91C_PA8_ADTRG (AT91C_PIO_PA8) // ADC External Trigger +#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_DRXD (AT91C_PIO_PA9) // DBGU Debug Receive Data +#define AT91C_PA9_NPCS1 (AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 +#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 #define AT91C_PA10_DTXD (AT91C_PIO_PA10) // DBGU Debug Transmit Data #define AT91C_PA10_NPCS2 (AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 +#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 #define AT91C_PA11_NPCS0 (AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 #define AT91C_PA11_PWM0 (AT91C_PIO_PA11) // PWM Channel 0 -#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 +#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 #define AT91C_PA12_MISO (AT91C_PIO_PA12) // SPI Master In Slave #define AT91C_PA12_PWM1 (AT91C_PIO_PA12) // PWM Channel 1 -#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 +#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 #define AT91C_PA13_MOSI (AT91C_PIO_PA13) // SPI Master Out Slave #define AT91C_PA13_PWM2 (AT91C_PIO_PA13) // PWM Channel 2 -#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 +#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 #define AT91C_PA14_SPCK (AT91C_PIO_PA14) // SPI Serial Clock #define AT91C_PA14_PWM3 (AT91C_PIO_PA14) // PWM Channel 3 -#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 +#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 #define AT91C_PA15_TF (AT91C_PIO_PA15) // SSC Transmit Frame Sync #define AT91C_PA15_TIOA1 (AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 +#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 #define AT91C_PA16_TK (AT91C_PIO_PA16) // SSC Transmit Clock #define AT91C_PA16_TIOB1 (AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 +#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 #define AT91C_PA17_TD (AT91C_PIO_PA17) // SSC Transmit data #define AT91C_PA17_PCK1 (AT91C_PIO_PA17) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 +#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 #define AT91C_PA18_RD (AT91C_PIO_PA18) // SSC Receive Data #define AT91C_PA18_PCK2 (AT91C_PIO_PA18) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 +#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 #define AT91C_PA19_RK (AT91C_PIO_PA19) // SSC Receive Clock #define AT91C_PA19_FIQ (AT91C_PIO_PA19) // AIC Fast Interrupt Input -#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 +#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 #define AT91C_PA20_RF (AT91C_PIO_PA20) // SSC Receive Frame Sync #define AT91C_PA20_IRQ0 (AT91C_PIO_PA20) // External Interrupt 0 -#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 +#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 #define AT91C_PA21_RXD1 (AT91C_PIO_PA21) // USART 1 Receive Data #define AT91C_PA21_PCK1 (AT91C_PIO_PA21) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 +#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 #define AT91C_PA22_TXD1 (AT91C_PIO_PA22) // USART 1 Transmit Data #define AT91C_PA22_NPCS3 (AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 +#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 #define AT91C_PA23_SCK1 (AT91C_PIO_PA23) // USART 1 Serial Clock #define AT91C_PA23_PWM0 (AT91C_PIO_PA23) // PWM Channel 0 -#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 +#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 #define AT91C_PA24_RTS1 (AT91C_PIO_PA24) // USART 1 Ready To Send #define AT91C_PA24_PWM1 (AT91C_PIO_PA24) // PWM Channel 1 -#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 +#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 #define AT91C_PA25_CTS1 (AT91C_PIO_PA25) // USART 1 Clear To Send #define AT91C_PA25_PWM2 (AT91C_PIO_PA25) // PWM Channel 2 -#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 +#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 #define AT91C_PA26_DCD1 (AT91C_PIO_PA26) // USART 1 Data Carrier Detect #define AT91C_PA26_TIOA2 (AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 +#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 #define AT91C_PA27_DTR1 (AT91C_PIO_PA27) // USART 1 Data Terminal ready #define AT91C_PA27_TIOB2 (AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 +#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 #define AT91C_PA28_DSR1 (AT91C_PIO_PA28) // USART 1 Data Set ready #define AT91C_PA28_TCLK1 (AT91C_PIO_PA28) // Timer Counter 1 external clock input -#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 +#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 #define AT91C_PA29_RI1 (AT91C_PIO_PA29) // USART 1 Ring Indicator #define AT91C_PA29_TCLK2 (AT91C_PIO_PA29) // Timer Counter 2 external clock input -#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 +#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 #define AT91C_PA30_IRQ1 (AT91C_PIO_PA30) // External Interrupt 1 #define AT91C_PA30_NPCS2 (AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA31 (1u << 31) // Pin Controlled by PA31 +#define AT91C_PIO_PA31 (1u << 31) // Pin Controlled by PA31 #define AT91C_PA31_NPCS1 (AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 #define AT91C_PA31_PCK2 (AT91C_PIO_PA31) // PMC Programmable Clock Output 2 // ***************************************************************************** // PERIPHERAL ID DEFINITIONS FOR AT91SAM7S512 // ***************************************************************************** -#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ( 1) // System Peripheral -#define AT91C_ID_PIOA ( 2) // Parallel IO Controller -#define AT91C_ID_3_Reserved ( 3) // Reserved -#define AT91C_ID_ADC ( 4) // Analog-to-Digital Converter -#define AT91C_ID_SPI ( 5) // Serial Peripheral Interface -#define AT91C_ID_US0 ( 6) // USART 0 -#define AT91C_ID_US1 ( 7) // USART 1 -#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller -#define AT91C_ID_TWI ( 9) // Two-Wire Interface -#define AT91C_ID_PWMC (10) // PWM Controller -#define AT91C_ID_UDP (11) // USB Device Port -#define AT91C_ID_TC0 (12) // Timer Counter 0 -#define AT91C_ID_TC1 (13) // Timer Counter 1 -#define AT91C_ID_TC2 (14) // Timer Counter 2 +#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ( 1) // System Peripheral +#define AT91C_ID_PIOA ( 2) // Parallel IO Controller +#define AT91C_ID_3_Reserved ( 3) // Reserved +#define AT91C_ID_ADC ( 4) // Analog-to-Digital Converter +#define AT91C_ID_SPI ( 5) // Serial Peripheral Interface +#define AT91C_ID_US0 ( 6) // USART 0 +#define AT91C_ID_US1 ( 7) // USART 1 +#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ( 9) // Two-Wire Interface +#define AT91C_ID_PWMC (10) // PWM Controller +#define AT91C_ID_UDP (11) // USB Device Port +#define AT91C_ID_TC0 (12) // Timer Counter 0 +#define AT91C_ID_TC1 (13) // Timer Counter 1 +#define AT91C_ID_TC2 (14) // Timer Counter 2 #define AT91C_ID_15_Reserved (15) // Reserved #define AT91C_ID_16_Reserved (16) // Reserved #define AT91C_ID_17_Reserved (17) // Reserved @@ -2235,8 +2251,8 @@ typedef struct _AT91S_UDP { #define AT91C_ID_27_Reserved (27) // Reserved #define AT91C_ID_28_Reserved (28) // Reserved #define AT91C_ID_29_Reserved (29) // Reserved -#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) +#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) #define AT91C_ALL_INT (0xC0007FF7) // ALL VALID INTERRUPTS // ***************************************************************************** @@ -2283,14 +2299,14 @@ typedef struct _AT91S_UDP { // MEMORY MAPPING DEFINITIONS FOR AT91SAM7S512 // ***************************************************************************** // ISRAM -#define AT91C_ISRAM (0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE (0x00010000) // Internal SRAM size in byte (64 Kbytes) +#define AT91C_ISRAM (0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE (0x00010000) // Internal SRAM size in byte (64 Kbytes) // IFLASH -#define AT91C_IFLASH (0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE (0x00080000) // Internal FLASH size in byte (512 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH Page Size: 256 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE (16384) // Internal FLASH Lock Region Size: 16 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES (2048) // Internal FLASH Number of Pages: 2048 bytes +#define AT91C_IFLASH (0x00100000) // Internal FLASH base address +#define AT91C_IFLASH_SIZE (0x00080000) // Internal FLASH size in byte (512 Kbytes) +#define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH Page Size: 256 bytes +#define AT91C_IFLASH_LOCK_REGION_SIZE (16384) // Internal FLASH Lock Region Size: 16 Kbytes +#define AT91C_IFLASH_NB_OF_PAGES (2048) // Internal FLASH Number of Pages: 2048 bytes #define AT91C_IFLASH_NB_OF_LOCK_BITS (32) // Internal FLASH Number of Lock Bits: 32 bytes #endif From 61765cc9339df6be1658963990fa83784f5d50d2 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 29 Aug 2023 11:24:56 +0200 Subject: [PATCH 894/924] More compact notation --- fpga/lo_read.v | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fpga/lo_read.v b/fpga/lo_read.v index c51857eb4..87279e8ec 100644 --- a/fpga/lo_read.v +++ b/fpga/lo_read.v @@ -54,10 +54,7 @@ begin if ((pck_cnt == 8'd7) && !pck_divclk) to_arm_shiftreg <= adc_d; else - begin - to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - to_arm_shiftreg[0] <= 1'b0; - end + to_arm_shiftreg <= {to_arm_shiftreg[6:0], 1'b0}; end // ADC samples on falling edge of adc_clk, data available on the rising edge From 762c942e953b8f2694fb919f1e7b924f8808f646 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 29 Aug 2023 11:26:43 +0200 Subject: [PATCH 895/924] Redundant check A 3 bit counter will naturally roll over to zero on overflow, there is no need to explicitly check for max value and manually reset to zero --- fpga/hi_sniffer.v | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fpga/hi_sniffer.v b/fpga/hi_sniffer.v index 11781ca5a..8cfb0fe9a 100644 --- a/fpga/hi_sniffer.v +++ b/fpga/hi_sniffer.v @@ -48,10 +48,7 @@ assign ssp_din = adc_d_out[0]; always @(posedge ssp_clk) begin - if(ssp_cnt[2:0] == 3'd7) - ssp_cnt[2:0] <= 3'd0; - else - ssp_cnt <= ssp_cnt + 1; + ssp_cnt <= ssp_cnt + 1; if(ssp_cnt[2:0] == 3'b000) // set frame length begin From b70092efa2c97433cec326373e839b7c68b41847 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 29 Aug 2023 11:26:51 +0200 Subject: [PATCH 896/924] Typo --- doc/clocks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/clocks.md b/doc/clocks.md index b2ba3c995..9e0384d23 100644 --- a/doc/clocks.md +++ b/doc/clocks.md @@ -49,7 +49,7 @@ Basic units of time you will run into in the RFID world. 125 kHz = 1/ 125 000 = 8 micro seconds ``` -Given these units the following clocks used by Proxmark3 wil make more sense. +Given these units the following clocks used by Proxmark3 will make more sense. Like the SSP Clock running at 3.39 MHz. 3.39 MHz = 1 / 3 390 000 = 294,98 nano seconds = 0,2949 micro seconds From 12efd96173d4258e19e3d521a129949abd20a9cb Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 29 Aug 2023 11:27:32 +0200 Subject: [PATCH 897/924] Remove define for FPGA_MAJOR_MODE_HF_FSK_READER since there in no support for it in FPGA --- armsrc/fpgaloader.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 4d687f338..fefc16029 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -162,8 +162,7 @@ void FpgaSetupSsc(uint16_t fpga_mode) { // 8, 16 or 32 bits per transfer, no loopback, MSB first, 1 transfer per sync // pulse, no output sync - if (((fpga_mode & FPGA_MAJOR_MODE_MASK) == FPGA_MAJOR_MODE_HF_READER || - (fpga_mode & FPGA_MAJOR_MODE_MASK) == FPGA_MAJOR_MODE_HF_FSK_READER) && + if (((fpga_mode & FPGA_MAJOR_MODE_MASK) == FPGA_MAJOR_MODE_HF_READER ) && (FpgaGetCurrent() == FPGA_BITSTREAM_HF || FpgaGetCurrent() == FPGA_BITSTREAM_HF_15)) { AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(16) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); } else { From b46e1cb556cdb0e3107a0d91196d37ff3ac3965a Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 29 Aug 2023 11:27:50 +0200 Subject: [PATCH 898/924] Fix BUGBUG in fpgaloader.h, realign fpga\define.v with armsrc\fpgaloader.h --- armsrc/fpgaloader.h | 180 ++++++++++++++++++++++++++------------------ 1 file changed, 107 insertions(+), 73 deletions(-) diff --git a/armsrc/fpgaloader.h b/armsrc/fpgaloader.h index a1869d5da..b345e34f2 100644 --- a/armsrc/fpgaloader.h +++ b/armsrc/fpgaloader.h @@ -1,5 +1,4 @@ //----------------------------------------------------------------------------- -// Copyright (C) Jonathan Westhues, April 2006 // Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. // // This program is free software: you can redistribute it and/or modify @@ -32,80 +31,116 @@ #define FPGA_BITSTREAM_HF_15 4 /* - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c (function FpgaSendCommand) - Send 16 bit command / data pair to FPGA + Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() + Send 16 bit command / data pair to FPGA with the bit format: - BUGBUG -- Conflicts with information in ../fpga/define.v ++------ frame layout circa 2020 ------------------+ +| 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | ++-------------------------------------------------+ +| C C C C M M M M P P P P P P P P | C = FPGA_CMD_SET_CONFREG, M = FPGA_MAJOR_MODE_*, P = FPGA_LF_* or FPGA_HF_* parameter +| C C C C D D D D D D D D | C = FPGA_CMD_SET_DIVISOR, D = divisor +| C C C C T T T T T T T T | C = FPGA_CMD_SET_EDGE_DETECT_THRESHOLD, T = threshold +| C C C C E | C = FPGA_CMD_TRACE_ENABLE, E=0 off, E=1 on ++-------------------------------------------------+ - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data ++------ frame layout current ---------------------+ +| 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | ++-------------------------------------------------+ +| C C C C M M M P P P P P P | C = FPGA_CMD_SET_CONFREG, M = FPGA_MAJOR_MODE_*, P = FPGA_LF_* or FPGA_HF_* parameter +| C C C C D D D D D D D D | C = FPGA_CMD_SET_DIVISOR, D = divisor +| C C C C T T T T T T T T | C = FPGA_CMD_SET_EDGE_DETECT_THRESHOLD, T = threshold +| C C C C E | C = FPGA_CMD_TRACE_ENABLE, E=0 off, E=1 on ++-------------------------------------------------+ + + shift_reg receive this 16bit frame + + LF command + ---------- + shift_reg[15:12] == 4bit command + LF has three commands (FPGA_CMD_SET_CONFREG, FPGA_CMD_SET_DIVISOR, FPGA_CMD_SET_EDGE_DETECT_THRESHOLD) + Current commands uses only 2bits. We have room for up to 4bits of commands total (7). + + LF data + ------- + shift_reg[11:0] == 12bit data + lf data is divided into MAJOR MODES and configuration values. + + The major modes uses 3bits (0,1,2,3,7 | 000, 001, 010, 011, 111) + 000 FPGA_MAJOR_MODE_LF_READER = Act as LF reader (modulate) + 001 FPGA_MAJOR_MODE_LF_EDGE_DETECT = Simulate LF + 010 FPGA_MAJOR_MODE_LF_PASSTHRU = Passthrough mode, CROSS_LO line connected to SSP_DIN. SSP_DOUT logic level controls if we modulate / listening + 011 FPGA_MAJOR_MODE_LF_ADC = refactor hitag2, clear ADC sampling + 111 FPGA_MAJOR_MODE_OFF = turn off sampling. + + Each one of this major modes can have options. Currently these two major modes uses options. + - FPGA_MAJOR_MODE_LF_READER + - FPGA_MAJOR_MODE_LF_EDGE_DETECT + + FPGA_MAJOR_MODE_LF_READER + ------------------------------------- + lf_field = 1bit (FPGA_LF_ADC_READER_FIELD) + + You can send FPGA_CMD_SET_DIVISOR to set with FREQUENCY the fpga should sample at + divisor = 8bits shift_reg[7:0] + + FPGA_MAJOR_MODE_LF_EDGE_DETECT + ------------------------------------------ + lf_ed_toggle_mode = 1bits + lf_ed_threshold = 8bits threshold defaults to 127 + + You can send FPGA_CMD_SET_EDGE_DETECT_THRESHOLD to set a custom threshold + lf_ed_threshold = 8bits threshold value. + + conf_word 12bits + conf_word[7:5] = 3bit major mode. + conf_word[0] = 1bit lf_field + conf_word[1] = 1bit lf_ed_toggle_mode + conf_word[7:0] = 8bit divisor + conf_word[7:0] = 8bit threshold ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- */ - -// Definitions for the FPGA commands. -// BOTH HF / LF -#define FPGA_CMD_SET_CONFREG (1<<12) // C - -// LF -#define FPGA_CMD_SET_DIVISOR (2<<12) // C -#define FPGA_CMD_SET_USER_BYTE1 (3<<12) // C - -// HF -#define FPGA_CMD_TRACE_ENABLE (2<<12) // C - -// Definitions for the FPGA configuration word. +// Defining commands, modes and options. This must be aligned to the definitions in fpga/define.v #define FPGA_MAJOR_MODE_MASK 0x01C0 #define FPGA_MINOR_MODE_MASK 0x003F -// LF +// Definitions for the FPGA commands. +#define FPGA_CMD_SET_CONFREG (1<<12) +#define FPGA_CMD_SET_DIVISOR (2<<12) +#define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD (3<<12) +#define FPGA_CMD_TRACE_ENABLE (2<<12) + +// Major modes #define FPGA_MAJOR_MODE_LF_READER (0<<6) #define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<6) #define FPGA_MAJOR_MODE_LF_PASSTHRU (2<<6) #define FPGA_MAJOR_MODE_LF_ADC (3<<6) -// HF -#define FPGA_MAJOR_MODE_HF_READER (0<<6) // D -#define FPGA_MAJOR_MODE_HF_SIMULATOR (1<<6) // D -#define FPGA_MAJOR_MODE_HF_ISO14443A (2<<6) // D -#define FPGA_MAJOR_MODE_HF_SNIFF (3<<6) // D -#define FPGA_MAJOR_MODE_HF_ISO18092 (4<<6) // D -#define FPGA_MAJOR_MODE_HF_GET_TRACE (5<<6) // D -#define FPGA_MAJOR_MODE_HF_FSK_READER (6<<6) // D - -// BOTH HF / LF -#define FPGA_MAJOR_MODE_OFF (7<<6) // D - +#define FPGA_MAJOR_MODE_HF_READER (0<<6) +#define FPGA_MAJOR_MODE_HF_SIMULATOR (1<<6) +#define FPGA_MAJOR_MODE_HF_ISO14443A (2<<6) +#define FPGA_MAJOR_MODE_HF_SNIFF (3<<6) +#define FPGA_MAJOR_MODE_HF_ISO18092 (4<<6) +#define FPGA_MAJOR_MODE_HF_GET_TRACE (5<<6) +#define FPGA_MAJOR_MODE_OFF (7<<6) // Options for LF_READER -#define FPGA_LF_ADC_READER_FIELD 0x1 +#define FPGA_LF_ADC_READER_FIELD ( 1 ) // Options for LF_EDGE_DETECT -#define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD FPGA_CMD_SET_USER_BYTE1 -#define FPGA_LF_EDGE_DETECT_READER_FIELD 0x1 -#define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 0x2 +#define FPGA_LF_EDGE_DETECT_READER_FIELD ( 1 ) +#define FPGA_LF_EDGE_DETECT_TOGGLE_MODE ( 2 ) -// Options for the HF reader -#define FPGA_HF_READER_MODE_RECEIVE_IQ (0<<0) -#define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE (1<<0) -#define FPGA_HF_READER_MODE_RECEIVE_PHASE (2<<0) -#define FPGA_HF_READER_MODE_SEND_FULL_MOD (3<<0) -#define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD (4<<0) -#define FPGA_HF_READER_MODE_SNIFF_IQ (5<<0) -#define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE (6<<0) -#define FPGA_HF_READER_MODE_SNIFF_PHASE (7<<0) -#define FPGA_HF_READER_MODE_SEND_JAM (8<<0) -#define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4 (9<<0) +// Options for the generic HF reader +#define FPGA_HF_READER_MODE_RECEIVE_IQ ( 0 ) +#define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE ( 1 ) +#define FPGA_HF_READER_MODE_RECEIVE_PHASE ( 2 ) +#define FPGA_HF_READER_MODE_SEND_FULL_MOD ( 3 ) +#define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD ( 4 ) +#define FPGA_HF_READER_MODE_SNIFF_IQ ( 5 ) +#define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE ( 6 ) +#define FPGA_HF_READER_MODE_SNIFF_PHASE ( 7 ) +#define FPGA_HF_READER_MODE_SEND_JAM ( 8 ) +#define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4 ( 9 ) #define FPGA_HF_READER_SUBCARRIER_848_KHZ (0<<4) #define FPGA_HF_READER_SUBCARRIER_424_KHZ (1<<4) @@ -113,24 +148,23 @@ thres| x x x x x x x x #define FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ (3<<4) // Options for the HF simulated tag, how to modulate -#define FPGA_HF_SIMULATOR_NO_MODULATION 0x0 // 0000 -#define FPGA_HF_SIMULATOR_MODULATE_BPSK 0x1 // 0001 -#define FPGA_HF_SIMULATOR_MODULATE_212K 0x2 // 0010 -#define FPGA_HF_SIMULATOR_MODULATE_424K 0x4 // 0100 -#define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT 0x5 // 0101 -// no 848K +#define FPGA_HF_SIMULATOR_NO_MODULATION ( 0 ) +#define FPGA_HF_SIMULATOR_MODULATE_BPSK ( 1 ) +#define FPGA_HF_SIMULATOR_MODULATE_212K ( 2 ) +#define FPGA_HF_SIMULATOR_MODULATE_424K ( 4 ) +#define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT ( 5 ) // Options for ISO14443A -#define FPGA_HF_ISO14443A_SNIFFER 0x0 -#define FPGA_HF_ISO14443A_TAGSIM_LISTEN 0x1 -#define FPGA_HF_ISO14443A_TAGSIM_MOD 0x2 -#define FPGA_HF_ISO14443A_READER_LISTEN 0x3 -#define FPGA_HF_ISO14443A_READER_MOD 0x4 +#define FPGA_HF_ISO14443A_SNIFFER ( 0 ) +#define FPGA_HF_ISO14443A_TAGSIM_LISTEN ( 1 ) +#define FPGA_HF_ISO14443A_TAGSIM_MOD ( 2 ) +#define FPGA_HF_ISO14443A_READER_LISTEN ( 3 ) +#define FPGA_HF_ISO14443A_READER_MOD ( 4 ) -//options for Felica. -#define FPGA_HF_ISO18092_FLAG_NOMOD 0x1 // 0001 disable modulation module -#define FPGA_HF_ISO18092_FLAG_424K 0x2 // 0010 should enable 414k mode (untested). No autodetect -#define FPGA_HF_ISO18092_FLAG_READER 0x4 // 0100 enables antenna power, to act as a reader instead of tag +// Options for ISO18092 / Felica +#define FPGA_HF_ISO18092_FLAG_NOMOD ( 1 ) // 0001 disable modulation module +#define FPGA_HF_ISO18092_FLAG_424K ( 2 ) // 0010 should enable 414k mode (untested). No autodetect +#define FPGA_HF_ISO18092_FLAG_READER ( 4 ) // 0100 enables antenna power, to act as a reader instead of tag void FpgaSendCommand(uint16_t cmd, uint16_t v); void FpgaWriteConfWord(uint16_t v); From 85aac72855b3aa23df60f01a2992bf35964c752c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 29 Aug 2023 16:46:52 +0200 Subject: [PATCH 899/924] new fpga images --- fpga/fpga_icopyx_hf.bit | Bin 72749 -> 72749 bytes fpga/fpga_pm3_felica.bit | Bin 42176 -> 42176 bytes fpga/fpga_pm3_hf.bit | Bin 42172 -> 42172 bytes fpga/fpga_pm3_hf_15.bit | Bin 42175 -> 42175 bytes fpga/fpga_pm3_lf.bit | Bin 42172 -> 42172 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/fpga/fpga_icopyx_hf.bit b/fpga/fpga_icopyx_hf.bit index 2deb3216ce64bc0e7e8add8049df1a585632cf8e..c49849667f118837581d975e02f36224650abfd0 100644 GIT binary patch literal 72749 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 literal 72749 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 z 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 diff --git a/fpga/fpga_pm3_felica.bit b/fpga/fpga_pm3_felica.bit index 626d1779299843e0951a7354481b41e5e8f3cfdf..a60a914d230912790937c2bc969cb4cbd8ff69da 100644 GIT binary patch literal 42176 zcma&PeRxyXl`g)t&#^hyk*$L<88;!xv1}5>k&TdvLmVS-jAup@Xi?M7eYoEWp&hpm zZQYN#m+75f@3w3}U=jqO9XCTW!nheHrBh)@FoBX|$4v}zKxMcoNz;s=4mFgfCZW`T z1HX6cSRei4-e=rDx+8Cn_C9;B^{)3_Yj0DDd&>SFk>d%f_+rQ3Jn`Qc1zn`8YJ>U;CEHala3OqvVsAO?t(~>1kOB(14MExDN z@$=&M|N4u55)LAo<99^l|7(7S=^)Wk=O;`4H_iUO#83D<|KAQjaSBt-lT>cVkN+<} zs>uA}-_gfp|CdMDAKTCQ_w*_Me?3RFpY!kOGw=WToXju(&2R{cP$kWw*+wxrzDHjW zl~la6Wz>?LtfCnj7e`E2=yL%Y6%D3)OlhFM6)jfj4aH9#vX3w(SdZ{TXo%Gl8fhI3 z@sF`4;hj-T)i3+Ribm;2REsaeONf$5Ix&?FnCqy{rpGd86Df-=c5wt zN$LBUmmi_pXi1X!)rfo!&A-MjYD?Q)@#;Dn69KXPpz@%0b62xb>Q};Q<~eD{HhQ04 zHGeXxf5dN(wS?VP*H!vA7OW{t>eHApez>uZk5D5$eQ@tr=q3-Gb{$kcpqngUxRSb| znzGMWk&m_t&v{LbIY}M^jY&E}9@3^*fVk|FE?PyM(Hfzftd;gh6FlZ>wderVlxqRD z6k7~GrsJOCt+A?gC2QC{fAw;_Dp9#XV0>cX6WWHTWCra#l#(ir$UXx_m+3e)THAy& zLL=P)?iSUTG3KCE5~!}V*DEylC~b07k+*}r$2QU)p?9zp9U`BleY1S0{hlp)j-D3x zr?tOl@6%>cmDV?)aY)pqo&T#9#w5QhRB`z)HfiQgO=FfRmSasd%>4-YX14m-PJ7)a z=f6lNcw^kBmzV3A1jxvSIm}peS$UF-xZ=X%}@(rnWkuFZ3}Y`vniUUAeDA2 zr(weQ(ToXxJkb<#?a*uJdLp>a-K*DV*C`os-KjA9yM+41+D>71czaom+wpB~9CE8DE5!bJD0do46o zJIjIWNb zn4s$vSvKT56oP zhUBgjttQ1X4Qz-Q^^sSwGJEb?(Wp2~-bjhTx~Y>)?lfRuXjqybW46C*{_`qkYH7R6 z@24#hPq_BGtcG`zhs(L!Ymunvr|V-&BTrQ*8`*NpA1SU-7K-B{z+G{t*S0S&_0z{j zuwBlJVP5TZm>0VqZ{}`8IYALQFR#%@V~&9N^d{w;HqC>T+q=;iqoC%BDNftIyy{Ze zS3_UuGP@~`buJQk$|P-Ni-eYTI_!&U5O}a@bd_{4(`88WUQQncR?lMA28N$E;85 zF*b<}S#RnIHjee`GqoXR+H0XvF?FfFVL*UoB+2KvOKX*VYDim}wJ*}z=}ox=0$T!O zmi8q_7@$>2ooxF`+6o$<-uHm%`lx!!UN2#sr&!cuYBA=anDCgP7<)AGBh$m3hgsTw&#@v)&RxL1Ot_1B zt0cy>_+iZ??8Ec6eOdGOiC9~0hqjN^(Tltm2Ftwa3$ebCGs&jxb?5U>(s3gg{&Yeq zqmL-qTRNnB>6Qrex{^vNi(iB6mUvjWQ_9EmEB^30_hm)Sw8g}FP22B~8v}HM2S&=0 zNgu6|bM1)HTM= z8_8~;*`v`#!g&13PTRh0{A#g2eMQ+te=r_-qU`I+bn+A0uDY*u72wx2P!ITJ(i8yN z9aqN8H_6}WTAIhNI303S4a1risAyPvn4J~d=_S&>!OHFTY|*oHG`7g|K&ZT&j*2gs zz^@y|W~(~k{WiSibB=(_Mjx{Z}*L`w6-m_>^L<=R`n_)_IC+&9qr%biD=KVVj+FFW&pq5k&W-ObPm7xPhHg#zYfNpqH5{7Ysf*h ze~!lMv-YJ{XfMfMrC5b)BUMGTN~b!ogFJ0od2}R;UlAbephFW%f{kJJK2cru^Ra;@ z!xvRPoW-xw3A%#F0bV`h54k%vZ^HP!_tkbRN)ErS(yxG4pH9K_{tb=N)EwYfq9MFG zHLuvn;LcJb4YZQ@g;~rtOjYovD!l-|F3=9);ompd1nr% zUUq?cEKjSm7Z?XLM`uqKzvjPzHSK8tYf=j7*Z!&ze-=Lm%2dKSMN{o*55q`jsC+C6kZEK9i7u(u_CB}&_sThTYB7DwD0luNdKX?J&HO`EN< zIJVzSIM33A^1I|s^B9NUn8hywe%%%aBECr_$i_uO#J5Hdnzuzm+BL0^yDJKMLa=m*FC4)vX7S6c7^g(YOu+wW zB&7eTVJ;aT@)AEQz^@}#V9Ir{`b%)I0n4>tX@;-6uLE)TELIA-Y+*WMtG}mQ6bK77 z_bzP6o7B{r!LJPNNc@s9r0=4#gl;DQWK&AB#4irNYPHSc*Wb_(`63#%di+Bwu&HvZ z&*)Jf;M#tc&f=HHJR<5N+CgB!5vuQipLbzkYb{`0I%{7=Lz18v;1T)_7{PqVgK`M^rtmr}OyLhBxm?KhVAP zD<<&E(iSsaz`iUnvK;@qmu(jhOlV{5zlo<3Pnz0Ub|?L_sJf!JM|1d9q`gJ~QAbJ} zJ5Nc=XDY4;a7RXi1^f&1>RiN?gJQ;PQQgA`Ch^G#=2d`SACrH%OMFfMStBQpKp$N6A(!S)}bNDqxw|GEoODJA8LP_CEC{7tr33o*K zwvCnGUlo#V!Nr}cu^TI<`0OWn{7M|Rnz$>j+>dx;Fyia2zQB)Dpxw1wXIcFEqT1OB zwA$^wpKT#H>RoW=Xhh(#3;CDh#WwBdYzaMOREM;;*;VwxzbfEg#jRVYder+_xSb5f zh1pfsX_)J@ozXo1>I45WeEmulNw@402m;6WV3TjNQoz4H0X=a)JMTjGbw|d%PtYd` ze3HuJ*B|?aNuq;NgXs*)2~N;3Z)tb8={f%O8pYIud%Xw}Ddxxk*%ZY@y-|o?qtQ;P z3hCk2CE8Qn0N*v`R~?x;5!iB!2CLli^>B&&v=ojup)DuY?$*2E!*~y{#Ep8X zWKQZ!!O_BUA0`|N2<(P5&QjFv_zLM`kJC4Bk;O7hQ>rDaJN-93N54~8gT5+4?Ck6P$ZpMQ2 zRiOiyEd*2p*khQNmBBB+e22g<0konrOZT&r)X?v`toZ5o)L^;4mFHjI#4z?++SHxR ztaEJ1TCI|m;>~+VPb!ftemy{t;4G&c^A-~}DB#SYsyP&Jv^;)wVis8~PJ}R>%mjP< ztkofhLsS%^<7$A)#0nE`*<(-ew=({jQnLK(Q!@Oa#)mZ2>4{XzxULuA>m6XK_~(w=G<3EcevQ+R zYC0+*Ns`1|jhsH}a@GKsTXXoePlHZ!zH%sf!F)DW&$T@Ou^*|mmUi&5S^bdD$JP>q zrgz(l^E6~N3zs_Ye)c9Uv0TG>{5ncAqo9+i6*B|}BIUKK>TOlB<3jwpXhf*!%y5Ur5zo_9F8fvF$S|xLxIsB6R3)Uo*jDA?_+WMNO zPx@!q(_K0I0$MpB#iW$0^arWQ051lvKhn(I@8z7{a$ZZc{UIK%EEQeqHbXcwabA(UL^kWkk zmtqU?qC6ZCV*!3$iGbc3y2{RF@N`}cJ5EUqtbl*X*qCSd*E^k22h z2aAiPbXfrUNxU&vG>2bBl9HRE=ZBzOuTZ_v5-^9Y^l-F5KZHJ?1f!Q)6B;!pe5T9T zi+Oo#3i0bGRWV3#DSDaej7nqc0&6oZmxI;w9Kctg_RB%rEz5$a0h{qpYr^RZm=M2+@t)MZkWwl z**xWP#eY_VVfU`CG-dG%p1*-yY0$T~B<&K43&4R-&gAiHJ=~y4TB59u^}x`8O+GXL zWLH^EKlB-|7#<6Z%*U};MP-utj4p>KA~i;PEwnZly`pAf5+rD_0cHWZhI`}Xv-U-$ z>#+n9g+XCp=8~Q?XY@lDNEW~Do}oWV{F+i`v<#4?=Slr=8FzQMbND6mUk!ZDG(vsA z7L|@DOQPUkCN|`(erOpl%COMXhuDX-mpo%yk>`HiBkG^P1k-Bf{fwz&B*+}r4YmzX zTjK!*mO({5d8t4@WUx_>o{U}w1eg>{!pT5&lrL&lKWv*nO=DvRB8VIy{E9}IB2n<3 zn?tUnT{-;__{D+__jTa%ZHU8eOZg+_)#8kDh=3*A^+t=BbY)Y z6VLH45&IUrL=yfPK}EcDc08gznde`Rfhr~{5lf6)KQg@J6>xfcH6Pa)o7E4K4!5yM zRDr_DT#{8aQL-u;q|IW{0}v85TPF!=C0fk%TfVuhZ}@h zC0n-{0P)lKoLRK zU7a?ExWuon9DaQ$jysletWL(^x4V*EHFVtw!msA>3;e4UNE8R{I&69(vF`!D4kxe{ zJ7GJ99CIfBRrTU*pKh~N>uvR^06R_v_*HCl8K&hm5Q^--BhluaD}hYz!?{^~eyDV9 z-xz8sUIQ_ONhfIXx36GW$`OigrRC?IAj!~k%29y&fU+} za;P+U{4x&D_3)B-bV5a+R{W~Qdzik=OE7nPEfVuTpzEPzMB8n@=MD_)egss3FSvTM z_|@*{H-TRh?(ZuT+I90-+xDHx1r8xG;;t;*~hX&2EP5}LMQIJ;U`B%|W z^=a~S1GXU2nbn=zWk?ps#8Tl*=lRzvwv`eQxVUj~AY=~L`nPIyfJ3)giauevrU^$m zV8Z+?VB$UCSCv&6X|1F~+Jlz!TY3Cqbh2~tTGs~8`@k=Mx@?VdC;c(HEbVH~<5z-i zID#Q}@|zj{#dV=f!giW1XdpTKx&isIVZ!xy5L?r}~aHrp%fFg)Q5@%nGaX zfYpCiTgE~Z69`2FE0NCA(kVJ-+trID$?Y5*6Vy{u~40he@cL_?X z2qD7TlU?Uvdckr`XA;h#(Q?bx$@pi7ffSPF=dLN`miPoO*pi0}yX`2b*tfGde5=rKK(9)CPNi(e{X_j;{% zf2$?;Dq$Z={^cD;lrl0`E-Bgip~Nrj!zpPFQoxZwhIv_vz3z8|Z83`fs|HwQc&BI)YPOX2e#OciQFHE_fKPX_H!0s60UO~|I!(W|`a@4QJi=kXq4lCyK(dU|nr1>uG79*Y0s9j03DD;q5aCk{fg%!N-f%wu^&A~ae8pTIVy)C|-S5#t z&c_|w#U4wWF3$5Wxu#Yqz)E91R==e+vad#?7NW0YA^(zUVQHVT z!@r@!BlUmL+Z(M>w{Xwn+ZV9=>74LtqkhcH-) zrycUk?EF`sp>?yWHrU0B+E%AW#JUq6sJr?44Wzwh%QkkXRamWPh4x)Lp3mbK1JevY z8~4;urztF~`vUrbS;gV`v-pMjjd$!}sPv8~4?iu(^G>>)Z`%p|(3Inm^&5}~hU@(L zgn3;Y<3HNj^#NVP>bQ41m-rQQ$$XOej_6S>9;6L|0ZnR4eHiuTM}v zVC!l6;tpqmy#NQ>C^RWDXMViUk@j=ni2lg4Zq{|dmvSaq8U162&+;yHK4#;W=`iRe z@`X!enaxJNkUJynIrErY!H!L{`i2+$OO|cuOQTNp4Y4R)b{6jI{|IEnHYks=%y(&b z@1vVwkyrva85Pq(d4r1akUQBmi(h>HD+uEso%xq(C19Ks4QcSN@9g1ZJ-R+~kk89<~#tZNlk=Vz*S35)$ZRpihMH>rHe;5NzjsUhA35hV%byf**2#GcB<5~VC zjLR14^en`^&^$3zXPo)O5o8SY!7Tp*ewhiRV*s^2^g)nJ*ffLQ^&FUc-jT6WYyMB@ z#cuOw+RGVQ>Pb6g{_8N+3NW%<{l+DBNd!U*I+ePqWH>7sV>V9F(Nwo2)g%k+a0O|Fgr)10=~3-yPz$$Bu2s*iixbsc0%eE)1pxUEvJv_VAezW1idp$-KYNWEYEZ0xaYbG~G^NDkjw)#=NkN97LMBbz*pTzG z{EH-h4RX+d2{|v03H}iCx`+RHe8q@u%c$Q__lMU?+3*8t?_oXe_<#=cdcJZOOXu*5 z4wrfIeUvy`V*XTf^O7?xSHGcRmCZJ=tkp@Ct>hQy z*x2%b;Z~JBG|huXXrD2KpZGKBh#F5%Z8su+P|YNBtozWnoAIY!TdGNP8Dy zeV4=JpOQK8jC~>hr5@omTnpQMIOP2{qmv@7u-w;eznYl;8-9fvBd*=beeykj))k-E zkBX^4xHPUz+CIVS=*OFH3W0xttXV<6(m>_l_kl%=;>u$bk-o(%@yi?}pt3J-&QSLh5So~=xMO6G8iKoUZ=A)O8p}b`U~_! zaZIa9Y2PZpo3?9pDJ>GMq)lw01<}B3+t+}0ulNJ#l5bLPVw=#YZk4{ zz)D~#lAcHybtmRc7NO3;0+7w(7xG`)C-IiZJ!jz$KM@(n*u-zeTP6zm*KWGD6zKW5 zrvkuQ#Y-(^&E(5Vm%Wc%QjUN90Hv*qpm}->^PpBudWcmxUUq^s-M!2Ww{>eH~5X^L91-2 zOKLK~5lm-;xMc>{xL^KL{Av+yAUvGRJmH!GVYyBBTJB2)_(ezf{h};Vyp&#cR12*G z;BthTIQT`benWcfdVZI!&)4$GIF?|@tWUsartP)RRF{luB@Ks-s{X-3w* z$YtY~o4{qJsEJ(hzl5Kct0Qv!tMn+``$JSFmB1N#nBd-J<5BpHJpYyI7 zK1!&yR^<|Q+1P6gj6T-K`m*@-JZ&jQA1Twl0N4U>T&5m|Y+#Om@%iUzGBkLm%&+gW z($uuhl~l%=%v+Tup!;R)H0?-YUM=Z5q`m0f_`USCUc9JE~?H#X3lS zXf=fNXQ_ICT<3Zqmt^tl4mv0nrdMw8oCXnFXs(17r~dPfx~Y}zGmZB&&0LrwG|B5{D)=E!#7QgsE(IM+A ziMvpC=-9aJ2~+MK+dw<63Cz*M&=+lVSg9!OC0vs^PXp+A6_IR!X%I#7N}20Kn!AU5%kMHg-E)yN!IB4r$(C&Pom4vYttpBNYlKJ)b(?3b{VGC!8!V+u|^l~gVO z^@4o0QIP)l)roOGG^mH;A&sA8KzY@AEgLkT|n9m;c&jK?xL3g+1@7hr(6e8pgvnn-6qr zS919;zRUj)h!{&E#Ztqs+UV>E>@qjf6GAJf-x$G^QF2M_)NutSllghJsOe=Is8%;l<11jP46R|Za{n}o!)||lLjqcZ;6)YUw0Ur z;tLbb4M?K?gQ!dBYuFv;K~WbeS;KPpMet*d9LK&&!M~cV)r-3{0hNY6?a$-aLCoTa zEJt~dV_ud!wNe6Ei&d8AUqxy9D4N`fvW;T!N}TmbDdPst?^t+av-z(O^m(KSM63gP z%Vt&=)x#iSn?b}Liy&_mk=rLzKQF2yh+zMWHj51Hde`w2@nqWB&ZfweeL@w(Jh>d1 z*~QKxA?My>uv3mbJaXQ-B%l9!mTqBnd|u^Ic7pB^t0T%U*M8Wse`i^{lFNUAno_VB zzD~kcGxA?(tN|m_H$IcYuZhHQEoi~3*Kk0?g6*XAF`sLbgX6E@)~{41OE9nv1}b=!?z(QElbyh^7$`W zx7?JLeqIJ$Yp@|D5o@Nhg8GdcbSl=6{tV6&@oS>t9GuKY+ST}C(>1Q-@?Sqtx6{L; z+TXGT{AHu+4D9P{>`-NuRr=RiPDHfJ+>B2!<^_HjBLQm9s>h5kvDyOu^%ix7zGxwh z;>O&u?go1uk<~y-uVG`hUmcj=MW`N0*T+%ygn%3%rJP61)|4viUNOt{1WkD0Do5SD z%4LChMcqT0c@p3yhic{ycu&hZA9ts(PWxJWKT!sF{ym5$FRgE^A*Z3CXJ-ibXNN$VTA#XX`h(@e{g%(hgVLT^}Fg zflh2%Fc$+_x8!jq+!)R;1CED%W1)DlEKx(r?m+|<4I+@%&ElMX7&1^4&P)6_vlb5} zyb9q^o?q0cD+~0)Khq9cK&!LmchL7lRphQ!t?$x73!+>BerehjBdFG48Kb8Sf4AH0 zviL`|gdnEvWO6vDKRigci(BaF6xQqa)H1vs#{t6EfL}ONo+^&WJ_ALU=(x8GE(LMR zG`1EtZ4LdMKmaqOf7y;VWc@tO%MAB~*%^A-E=0sZUEr7AQJm#p^oqGTwh$vMexD$9 zCVDm$-$Ad6DpQ}#^RH8|FBBXY(sJ*Rd_`W@(wK=o+O7~peL$_aDEwuhzuo9 zz%LXc)>9}^p2M$EAgswXn<@fo4b-meaY#ffz%T0bKsyEPG7cN{ZQ2fJ4ST_;=P@IX zU%#Q_Vld*`f!BL|?QEUrMMpFD71SR---l|Awne?l1plQYvjh{yJBXII$CVs@?Llak zQ47!0v>8+pXPOL&X45V70{->1$moaD^a=-3wnIlMqiO-Cm&3312n(U@NRE%VcN)jO zTwv1XXiowEnyYp5y(z7OoiR~=DDjJ7gcLXo|)`VGuR>WjarDpVpJc>yj^rR`|Ky$4CpDMj=hsZyXn%r2Z5dv2H}> zy}&P1K4%R4OOQ{iq*lBLY(G6w-d`^0zU5AXc{($FtoaEurqwe|L{0Pi&^PpbYykS< z^Re=yt$te@r1{tBByWkkCQ!z9k_Ic?+mr!9VL-U7pnhWj%hW8s1|3_yh49_4r6* zU6CbWWeM0Qm(NKTt&`IUl^9GV5KRAFD!^u^Fu$c&AS<1D&uPaUv@u>K*%lh2Dxr_D za>s5I(gO=Zsv(~f($wg%k>qvdPL&N)BI>4j>hhG~-{tmu%Jca3NkvOrSqgg$Xa9wp zEAR2&8!c_95lR(Byb1M(@Ck^2q};cOz9R18 z#SrRQUE4qhaL1I-5%e6WVpSUa3&}g+7smV?y(H>79@|h1_aXa)Do%! z@ynE|NLLQO-oVz9Di+`vF+cWmm#SUt3s`^Io9AC&(6&T9$mW0!fLlraj=*Eg^9_AL zYmR>{bUbD34QXMv#P})ttOUo0Slt&|xg(n6Ulq%dLTb}e&NH$wV7cD=m?{GpNx)f= zoVvV!gT^`oeqT)Ss51hx;nuyL#3T&@$a4Iv^f%G#Jh;KVOGloF!_ZRmuBxBVG42j4 z=k5L6TXfCyR;-~N)qP*2>-Gef(67`Mt`*?dIYQY+g|@LeVo2H0XTdJEQqTb)Dxp?6h)zKW351Q-6zOu{{du`{@M}isDXopB+mi zpdU(=#ur!C;XM!Hg?HVDfvx9d6{tTn<#(a}5Y)_uEi{_fmBp1&@s4N;mBy8K?Y)8g zmprYkA^Pf&(g(Rl6%!r_LPr69J;JxDdlPVRwL;d zrPUP~(oav+8oh-h|FfXZD9id=nrh%wQK%AMyFWkQ&P9+wt zb0LpLw?s<M9V2VJ{*`k6x~dVNQ*qS3;PEk6>i-fd0DNao=6_QcKv*_ z`4vk`;0)%=2127L6bqptAb!r`SEORhv6sFoye8|W{Q{bm3gWY0^L-w^<*e$LFKA$X z0$c_vL{i#?1=~^eucCr9IMuUHxn%D#LFZ617aYbcCg~%8Fb%NVXWoDqq8xRkZGR|? zKhmjL^}OS-x8CYWf`mdyw0h)oB641Q{so#6O&!~} zy>{N5?v^3M{lArwxy+0Rd(3Ia(a?pl_#ubg5RM{r*6BMiPVi(jj>K&U3B&u5P1$uZw~ zufO$YSe=>?tVNTJUncPDU|e#U@;gcncGi6WPNijdM5B zCs+^w#~>sw8Fg3W&wm}HtL#xZi`nxI@;Jb&8a@f<`PXHdihvHpl{EZMbJ{gDPoB#T zTC4rlx%?Nb8@0Qc_z?Cbyx)M3_zTG|BFZR1H z#jkNKDP$ZKJ!Kx);|n|eOflt}_L$Dc?RB4=|DyN^cLYIKpEj?FmcFutF6-y(h5M@o z_eaSqhRD4UW1cpG<)xC;oXz;UJbr;4$IChBq@>&5h+u+X3bq$z_IJtqH;~qmu!Xdj z=|M`X{0;E}f;T;`L~K7M>*o*iT1(%-J`jh6X9S()$$Hr*uOG_%*T6cg;3(uZ)NjZJ zvP%~Fv^wN+0l&b%aDI99i?5weOkegiA^(-8v4ITu=IZBV{_A1zFK{c=Z%l5FEAL_O z@Q?-iAiSZ%DL4 zG^jcNWEL9sCm8eNS^Rn)?6lxu1NzevVW zs+s9iyYS-t*E5#6Q(qE2NzZf)q%uV88CuWL z$mPH8;m?T&#L5o#7X1Tzz|x?_nK5|g2s+zPq?5Taum`> z^l6;->X6UL+#hAan!XO&)$Olq!+6f{Ul@xm{Ts@c?e|P{ls3~>Mqz^~`YtVM#nG^{ z_@s(Erx19U@;PP&(#qt!0($Zq^``6nnDRK`?6##hvt0e*F?uZ;bipouXTBqXCj3|? zf~B(NeE#cl+YN!p;W_;3;^%{vAT_uvkD5{$M&_5_CGX$B`LB*ukgCiXxeq&(K=@4r z9`32GguTa5e<+d2(6+J5?L%Xp4lSvy#QEI%xSnKHwta~r)NcTiw9X9e@|XZJuL-gi zMxTVe7O3AaAaN7QQ7lJNNyxNU1P8BRU&%cGT3>mSJbatLn5P|q<(OB-k6}@igc6ox zPTc(--JX-7U8zir1jmR^q@VA|>xXaCTmHET_i4o+8`mB(U27Zxep$4b(5(FSdI{qK zZRzlsD|fSM+ByQ-6=Ocp(+%>7%#l6!SkYw?jzlLi;3^jwypvds$keK_yngt+v1P=Q z(50*aI~{TMM!g(pF6T9?AJY8S#c?Z;z${Aq$3u<0Y@6aivcBHCJxN9uzYYQm5bh?G z$#pkbOHFBN#dr;ZrHPC{8j*A7#*b-o4EL@KDn5>M=g-loaUDm3$~~CRf7NKnzD;RM zitA}h3@_Yd50r1MXgaTNVmbZrGqjhR!t3{de?`otq@pY;YPoPr7_2h$o+FM%6a4ES zVCxQ&cL|2pu*R{Coey|%IyjgAa#5O+^Id-I-eK}bUH&dtV#M2QA%Z<^+n3Z2Z?Tq9 zEED{pT&A=#CD6d#qIvxK5NL&J`5{~{@D?>ETuIh$yxIK?3!mihYnQYXY33E`W)+1} zk@7RtU4)A`Eby<)`?2U4+tm4FBs1oXVo}1|9<8U%oezMKX&qQU{Ddkjuz-kkDaEXl z`(Aejn8k!?(tyr#_%%c)0}b(gFDgyqq|uUetykJX44Z^2QE>l;nC8bccQ@__kS^}2 zZUj^_^b^B9I&Y`VFErx8*=n5U@n*hurzu;@SN2 z5bn2`ngrY0+6DZ|z?NPG%x$EyiM)P@`rgDcj_4w@UR+PjyAVZi!b@}Y8@v(T|2zqDf} zLi7PPDYk|H(EE(q_}~3%Mfe^Trtg;2jr2sKUi&%n{4%OFBKn3EugkO-&M)havp=8#-c*2J$V99G z?UHG)GI4LbD`6rw<{0xxaYT-X7hU7GI~%5C+6#ewOJX(hDeM>Gp|opyMNU859XYBY zKK$GAcOYh=Z1wXjW#W>J(a;moSxwKN-43L^!eCoxrN&4AvMGomu*wJ)*OcECsTil^ z80g9DKD6}v*lR2rGN07$%j<{x=wlI(*AO9I6<8Ee{cC!M<37D!@UMt`&MwsQ&MZH+ z3s)mvBmkKgo9&7R3m3<{(zbmG<5uJotAP+%9j4peaGp2tE9lrES1MP(0sKNdUxVH9 zn@m8Z_m`ieEy5S}#`63N_@(v5dj^1CuNd{>t|YS(Tdn#iDg@H@TFCmtAxu&Cv)K^K z#FU}V2@QAjIOLGQzt#g`Gx1M<#wS3ZPc!6~`L<*}|0S>8cvWP)`fS=u`V9;|ox?B3 zM|4Zz6x%f9$EyOkEXy|D5)Enauc<74U6Q!`o-*|KSB)d$MedCwM1Mg={wtoZpSKWM znXl=74;Dp*com02&?#yJyu^9izO4BJZJ?ai$|PH_y;4;x)8!t|3*tV3XnD$B3qC(h zAM*niu<3Vn!wj^!7R-B)9TzXFh(L1n^FuZYPgP-hR2*@i0Z;j_beE~8(1^(QBkK=u zax6D;wdPH2aM-m={}M+$FBdnZnzGLr;=?0n7s>Jb9{O`*q%_Xz5r^0NF|Qncal&0* z)=Iy6g6|*kSYCsz#k~hIE0o1A(@}0SmksP){!;J4M9Bu{UG&3Eb!o7h9DWfEwl-V; zv{)JYtB;J1)2?0fB2g4_(4W-LtH-n!YYtc>zjepgaDS9OYwNE>#xtrD#~Hh zRbIk$KC%$cdudn%cEZWz@GCB(Q|qn{INbk(LXJ=e>!mZaOu+l)@M~vg%qW#SAtdHP zYr2b`5>*~xuHUvViC+h}Onc!t-!mr4hZ3yQ+(Eu_?96Qbt4M0OP+(AsOefO^gzJ+2 zsPkkZuw#2)fqrOAYZ=c5{NmY$KrT`!S^W?;m|-q)<$?+ztRwfzE#o?a*Li^@3G!YsfqWPGrKmpO{$TVwGi^l_k1A^(zG=Fjo3UPmKSNU!ov z148|d?EL@|zW}w5ZkPPx2Kk$|b?Zt36?XzCoa0|o#zeJzy!r$BpY&?`PyUl~E&53U zV}3W6|8hvS6^sBKCQ#ZjE0De=5p9?9x@}*x{3~eFF0~eM6d)+7_7Uo%P8Q-v{c9@~_O8&(f>>{!Loz>vy28yNa}q)>-_L_aDZgK4tuTAA88ms28GjOfP)m^7o=dz2|DQ*q6l{;Sjgs;SY?O&D%2kWzZ~_$pm;Kt z2nZMQDNNqq3y*Cn_PXQ#4V0Q#?kNYb32tzaEadnNEyE`{{3?2%#;Y3Au`y+kkN`#f zhVHj!ybWsUw9=8quk#d3c}8%{L9J_x0RKXPlZ6SYm_?3%O@e=!W12sj$e5L8Fp}aY zZAs?upC4ech&ha#eC{*0Mm!N3h~5V_+E<0z%US-#=MU4c<%!^QUQ|2Y8HlKripQK5 zfk0`&{qsYio6(jeVu`EjEyt_Ffa3}5%w^=Bnpc2dCn#{yVyP-avF9^*3qRUDCh29O6i;Rp=lUlE;1`-Ll}EX686EI-NNmpnUJ zWr-=afZ^<hq{)yOW-Y)?gNS{2C_Y)~69! zxhZOyY28=u?A}Xe8t-SP?N=w~AEuLz1N(iKlsm-$;ZVT&f#c^Bh3nX*Hpe4KYu|2l2% zoy@i`iC<$c_;Fg8RC+9BY z-_M4ZH}a=a%0Ny(Y`sFq_@|$(o+y_0II}T!t8&a4+J!M!&p-#odZqICCGX$Ju&p5BI*|xu!zS%iw82D1 zBc~sJ2xsa^Kb>UwBOoZe;gRH5YNX2&CK#^g23`8reI3->3W;0kxDv;yDdb4>XP<@x2q+;b4| z*tlFK!ogVi_dzhPALsFFl>;IAs7&YKC@8LFTN0IjKP5rB>71?K!1-kjR|rmkxxCN2 z<5eag;52w|Rez@7ip%ek_a9!Nq~%_M<7~r5fG_YP?D-g*6lz8ezi?hpv{>7xaQe8ywVDj&$ zR1vg`9Dd2u%2g3!p>YrnJ`1^KW2RNK+BOUi~a5tcj1ybH=(#=dO*5PPh`S%f})VbqlV zjK0r3Vf?FH{e}t(xX;eJApT?GSo`Y#l;dATpgHy|YGAM#{syud2Z59t+NE4@VKxQ&RRPzoxIM<&8@`k_2-V_M)KIG-XAK6x?b0|GIU z7k$EVUh@9lL-c@T0SinNa-_6%tO5~0rs1`HW=21ZE#Ut2V^6M zU;F50`?1s<6A*w2O6QQq?#(o2^+TEex((X3e!BV^y(J!spdK3;7O_}1a`=V&0eICY z%<3xPegLj<5W~z`@GK`H+6~#T+JeQU%#Bn{C2OK7>PEwRmgVqERtT6D(iUm#)r3(} z0sj-z;D|ou%<`}K7&G}tUCFKw*$F3I%eo+^IZ%tp^vbJp-9#lD2ZVK}o6Jbu@}n zKgtO+_9gRQ(uZrw@(BY&Ol^_T$op_1r|9<0i>0X88T zOjoL>iExqB!n%)o{Py1qu#8C)89JO&jQV0dUIa_>{`oCxt)_hsxRZH5V?}AvW!8_C zL}^=RpJ@{Km!<-ewGw|cVA~h;Lx$%_?ny`BSP1+wac79g>xX+xc)t{$$) z7w&}sqLm#~=BlP#Q>h=ya|+szJ*L=VnJM_gDshAwlUlFxKWw{@fBy>^RsL5##>Dq6 z7@CXeVvsx`=TJ0Pe;B0gVsAt{yYn7G{k(ZssP9?zP`qd@ZWsJ}`#HFOL;NdB1o_{b@=I_ek7xpU4)R3q7qydL7i^TAEd^ij($G?!hWw_Qj=}6FV(U^w2 z@Y2VR`Jo$Ef7yONW2m2(=PO}W%~EnF{5c_c|2zz>g9VBsa_;i}!_D1`65v+P8Jjz+ z(v|JS_t2}cClj~{Aws6?6RJQY3>`ot&;Q@v^#;dPUH9|eySsXlR?=H}*DQ@mo@4S zbKiX~Zg6R0bFx8v_k!y-_L=R0UR=rk8J2mr9Pg=MM=Km&)w6Ku*XV7z?o8?x>krA( z`4HSL=C2E@c^rP1Q1|)KH|cEqnu&P*&{=?0-z-}k%rk$`vDw3#)qV*glc}6#24(U7 zjVCZowI|J6*TRZ%^B1b3-y;! z(=l$JKIaue9M-jeh-l6PR01}^)$uRbgmC}HNCFnpKo34>3VVvW`I+H7PVAFVwDy?4 z%pmTW?83mlO@5jk)xV~F7tlUO0$W!}b35O$*XCmn`TX9tlck34dnu1yomR+Sy#Mem z_+M+WyjFf|asyslKK7ploWD`{cDoht-1Ql=O`1x>ts1jY~DWlbZYk$Rrk9GkZcZBnBh%BEkPstX~)zSjBQ9{o?(Hh?W|wCao)kebn-SNu0C9hoWE} zUWxeYs>!sq7JE)OU_=k_`r%mt=W)KuUzl&$8&!*Mu9^N4?Gj`Pz` zVV=2W{21If!sZkSBKtYa8CHO&w6f7 zYt{Xgffwn~$<1ADzOLX}jvO5fY$ks{1^j-Z?eq%QJZJP#&ouH0*Sar7{H5m-6U}F= zhv_FqC*@A-=ecL5b=v%&Dt|pqI6BG3?EOiQ-30G(T}Pk2gc)PFe*^xP@vItMz*uc{ zpHv<5_6T08+Nf@4kL*IkU%dZt8mC3!sPiXj8j~(KeXl#4c-QMcn{3AP`Sa+nnT8)* z*W^!~jSJ`|?znsW)~mJrg&6eww#w=mf_Yah!MA=k&!_t0^P}|lQ#_vgT?Ub1p<{cJ z4*|gWy<^q*7yDnlTf_V+=DltOFJJ$Z{z~<5N*w>f{O~HOd{^g1Ea`M9-KWnOJ$`pJ z{*^sN@5;MXPX%*Yytp^n^9}0??D1wEht>0=PnMk=ZCz0c;?E}P0iy+-O82j zuQ!3V^fNz)XO7R`z}Zk0{Z`Zh{RBFwH=q31H}1wdoAsAT%}u!k?>|J8f%%KWUfbB; zK}~tr;-dH$c575XTf7d?#QX)1ECV8|iGNKg?SBoz=yl5`=3J}{02FHDUkX!Vv=2!9 zTliN~7iPlaoH7^kSC(59w3TVzZ{qW6a@)y6`gvq4EJ-l`;rN%{KOc0#dTBj}zQD}N zM=fgnFL+yKs@zOiUws;%GqGF>z3iI!*I8OUX`dSJc8|a;G=CF{f45wtP}3g$4IEJ1oE+`VoJfq`xN|Bh1f(`QZ#UX+XbtlYGtjy*PhfV(ESi^@7a#=AwDh#zv0P z$Hq(_b3t4j|2j<-|5V;gO4R*oGr_iCAyJ|3HU1Yyi;u6RAPz!zyn#p6Q9KFoO3 ze__pPQ?V@%H~DS)9$sg&U`6{eW1KcZ{$l?NAqkm!&bk3^7jLA8ZMg=f2Ji>9edhg# z*z$CB;*8m4VoeX91%W+0BiB$X9I+bz3(JNu-CcClfJ_-O-*J2R)Zh6?zu5o6yf@z@ zOn!g4o9l&$vpl*u{somuP2=+iM+qWzr75>R|U;xA2GJ~ZVT{Swct?L0GD>(z+A zXtv)Plb4;1qUD@5)_>W#0ia>5|D^Ldag*Q6%}g{qm^fhU?ceQWXJU{&K$qnXC+qj> zF$TglTs4AE8;bEdpgMwld@?+oyRecHDjflxvWv3H4P<6V5|0>r)owR?K|Dfx)k7Kt zDN$L6B}fV%ktRdcgXoz@1aCwxxDJOFG*H3~QdA^!U!qVdR(9h2aR3J(YbK;BPG@=& z6xAzb?4XDIY(B9q0Am2VN&4x$kl{1WfO}v*1sMRsp+V~BW9M!DyFaRzhxJqpQiVB4 z6(pdJSVs@bnxTYed{Va$n&p$UOJ-GKzcE7GKG8Fi4U^}q3VZOpkyi}F z^9j5&@9waL-x0{n780J?pHGltPRSsC?L(&$%3 zFOy5u19F41P%l!_b!-uU2YJwn^1ZGzA|jdDVQag3!MiipQVU8tB`RxnIB}q~%G;g0 zd9Lw5X)i!_E*Szp?609=>wr4xZOpaISqDm&z2DEJ=Wy3$@3(U|`RU+!hB%+SqkMY^ z5_6dYigV8T>7WhCT&h-s<3_%$HBJTGO_WTJsy*JyT;hl^THfRB%4LrvMoS|M6grr% zA(2|GKGXJ72TaSt5vC(PoxqBL;5@2jGdscUcxep{?2?hl^BS?{l?%;KOs|X!Q*M^=pkQCEc)As8_)xrCeUxW>9fqG)*e$l&GvBX?W%y`YPS5 z8rlBrqMM*Z27_!=uUToaTCsjHFg}le8Dj=7k+vv`E|E7jX5RM;- zX#JA0egRyfF4RP)ghGjQ@8GuLij0^wdSw6-z5OGc66doz@$k7%<#!#=emw>vOi|Uc z&_~jQ#$x!Qvs{|gW$Bbq$R6C6&Z*&!^aKMjY;0G9UN%=oN;RLMVtQxhAtNgph^%4A z{-U!}a7t7bUc^J6XWYXKisM=L@Cd+8jDp!ngqjRfN$i^!0dPVv1rW=mtR3`%--@=_`M?@akI(zPxea3vb4l&FK`djKWAdbPt7tq|1Hj9- zrW*Z7NH87Ch?gU9nL#X5XE$K$LZ((xK1A=srw$l4ylnA^v5H$Byc`44DSjmLzWFdy zhnHQ$%Zmuwb7Gm>#C@gq%HXMVEl@fo%EeF74$An6ys@ng$bg!_Y*giCa*TkW*;q;g zq{o--*QiabKM{y!1bBvq!POy12jD?Uhy3Lj()8#A-9lI+Ukb)`Q6z`J%P}1<0io@c z5M9K}+FZmbIwMI~kW?wxvgv#s@U@68E2hzUpb!08TBA2iblY3i+DLEXn;^gf=}OrmjkAjA*UF_ zf_Zr>sJ0IHK}OOTHkp@i%{9)|fl#Ix@Uo_L=H*4;eAtHdyj-VW5_KO{IWL(rj?@7a zJP!?d;-K+y+N#p?bs!oW=&wb*91?WE%Tc`wnwQx|*MYDs9)~(yYV*rNCB#hwAQ@0p zFN=zP29#|K)BzcmRmaPiUk3#38i5Fp!$rIt6EuUUEJH3|dseRt6iDmV)z9Sp&j5m&*^Q(ueAR3fs_- zr0F;^C*~rcGm^##(=oHK=H*2|MPQ{uta>_* zQr?MW7V&aS&>F-tcvpYwVt1j@883@JwtKuLr}J?g5kZVAzJ!BD$DEY}G>W#vSw%NU z%|?-oQ|{@o?E%wKWdX3y%+O#S&Y(1_`Q*Tr7nSy5O>iY#mRv(Od4<1}nCE@F=8R2uRC2WXXS;Ff=c zR-F$R!zLGBkDt-4iZ_G^Yr3m0ZKaNj*lHc+!)?ZUgU~)WdjpM^M&w{{JyIlmndov= z7rKc>RVFWN({S+aEHZ?Bi!MEZslCNWU9xfrcd&?X12KnW2!b7eL_y>*NaUZJHaQZl z%=45g@WPa~wph@=F@T5{NTM5YhaV)={8VoAhp9AjLHSWq@Y^L+ov$2qM9m+j=w$rZ za{c;spa1wo1UN-RiP}V z2KA!w<9$exi*%U`K?AJ9HkM*Ap>zNQgE%jzoa$v=&M1tr<0*;rM#^-Ty+oH;a|hg2 zBk+oRs3UZF15yCue28_6N1?4cp@VKGHWK1Pd3Cz1rN%K5Z7gE&=mNlf0DM7DRWh$v z!gI(+97jGmb<6rCx*VzSL24pVa$U+(!K`wo&w=*bo@2SjH{qIz);s8`?+M(n=M}>pN1M63ICEh8}p?pQBZN!+H%Sslhca zI!LMNGPa#^JLh0Cd$lQW%CHHk?QuTnQ-Om_VB(zdxLIIh$t~6>Chl_Wlx1dc5Ft05 zMZ^t|+7~_z8qraf6Evwu-6WvDa3H#o&TAX7F1z@HFDLR{Vi2Uiw=PSia0^k5E-Q3B ztFR>vt;uvFkqq+)f8qHd!v&F5s!M=^-6IOiJh+J~jfOY(^eeP4jEoWUKOr^3DOE42KN ztFSClvN`)X+3cRuNQRMR@Yp!SA--%|2v!i29m~eZKiF+WOXMFw__A5^6EgS;BUnR( zV?h4pd#Xp88Sgpwo>g*AI;~Q7Rad?5^FGh}R+&ot6WRX|dG4l)``Z8d?*G~Tw~hbv zzVAHn-Fxq@fAHQlbPstWf7clP`|r;Whv{B2BjHG617Fk-Sww57WPW6E;{yDbzC+a4 z{w02%`}zO4FHF)yMAw8parM7O*uy;}o9e>ksQ*t>zb^?B?&tr%CrpA`speiPx76+b z%a1PIU;H=PaQ1(BMD}*}IsctD<^Qke=-KD|ciPPSe?G_kOWx%8MzjbWm-G3`5f-H{Q%zJF*V^$%_>tB}bemHzO1H9l z{W%%n-W02+{j%OD`&EMLVbvyi`*GSOf`@~4d58>(lVLL-?V?a~Ne#Ql<37ik@w~C0 z>Yb7_tLOa`Xt_hO5bdW29IwsV^|*Qt6^+wHx~*jc(=<9PB94z~A>4^pmD*aX?mj2u z8Kf_1iSSRDm*`8@Wcw#HTu{>*e_R{HyYVCFd3n(jJ-$I|b@ZRBqrzwR>`>34GTXFt zuG)+g-OLZ!^`lAjhu)@8tI_B7C+ZmEEP_YiCsVYFc4cbfhT$zENukPHb?-_wF6rfg zMfke-;mhV2FUq2~e@?0m&M+vJP9!6|L`R_G7YcIjXa;EUZa!qQSTr-ZtS9_3(d$gD8&c(5h8iH%VY)eA$l*-5tWZeqpRxiEAccS0?dR$!PqC@72>Wx8i4abcDx znq4cDFx8efU+={XR=uzz)Mie53BTq9QbWZ*g|M7Fih@r20ik$v7qTfHVjf zX@VgoSXp-LhCZzN+-#%*I(1V(c&%c06mi4yvaEeo&gu)}`-tEsRwL0S=AGq!pZb_# zvEuAp*cDHs&oBo|tC5Fg581b@7wxJM z<17nKJ;#_MK9jpLD}Q9pp)Zn4U=634BYV6Pnbh#kIi> zJs#U@H)Mi?>=eD-9!T}<@GActa7xpR3)jA+r;YEG4`z%3wCQ01GRgIs0Vg>hi&m&{ z87*X`=>Z#~$iN0UnO3pF0`8QA8Oz!i89`VI)?pfb?!mJ0OEcv5$2Xx-*1qf;P8u*P z3HLtA;OEKjC_nExYUCS6v?#rnZY1AXEj%Nx`XjARXix^? zMzTCW-CY50B;oKk@&Fkxv1$A&I!?PfoLNcHYITGc+M1Jml5pCdTEW^vYjW``9rGBrsBI8ov(E75Mp5HJo?o z7Wq9jDHrLW^oO;{tbGY<2Rvj%l%?PkXR2=-Mvk;kt;$Cs~>CG(j<18RV?6KXCn_Ar~qFV7r0ByaiRrGuIx7}PKR11NPS^_0*L>(tSop$b9>4T2=+@+&cWdXw7kp`#|86y3 z)THJsk6#3@&V7T`20JDr0uDb!7t;~pPir4d;n$39K&$Pr_vT7k=TU~wX49eYJjeX| z@)OzbtnllAyfZi|p8+U}p%-i@UV(0UrzcCHEKsWW9wss-=t{7!37rzo(hM$D5gBw)% zwTS!W@)P7f2lz$j9gG65(l`Pq<4&BqzyOD`?~?j`F{~e9rpkxm!+}jH_~)sM%oKhV zxri1sQ^2o+HV>-CFHhN*t~|djObcx~nEM=^I(VqXC{GMoYUngr8mCE*GAk{^Mkq=_ zX>xV3IF!&n(cDH`Zy2L5JWIu@_L=AO&v5altuV&(i-2e;?esP6>N%A~=hS?uan;}= zii_$6>Q0M4wft*&{2HfTGUZ*i0y0|Rz^n#oF<&8pU+%k%qG5W;Qzfo%Wfk-S)y2(L zrbbZ{Gp*+49DeD)q-tTl&X&+iT@AvV#P``rwXOIX)A%(*AyH(xKV{y?(Vteo<>J@e zR`jrK3coyk^r72TH5^>5%Hmg4Y_tmSizdYY`Mb2cg*&;9JE!jC9-YFkqQ&|EtjXlp zjMKhkz0_--VVr6+ZC^gxP9cF&oS{w@ za$L*VMYe-GLmu@iqS6QGm>zX71!w3O;lkF&;p-x*&yJRz_ZxEF@13k0RDGWEhdKN@ zs~=*G(x*K3acZQM3dkh>IsSD@;m&);AgiUMtc@cM2meacJI3NXevQn4dv{{w z?Sm->snRYZ3EN3|W^R3fAdR^rJy{L0X!?TvBYE80`^ zp|MyZoC~>=;tS{bSDMb!Qm3JP=8xIi%DspGVnU5eU@mg_)gK@KM&z!tzRof6X>3sV z`Z^U)Q8CHQR@S~oih|a93Y;)@CyvtoHSD*>wnRYn$AZ1*_}6m8IyG^?kD#;+hD$2T zo7>W8bA17RmDA4>|B^}msQEv{3zEl6#>>AAEU3$v1^7jZe+i$WU1#|sstaoZ__ZYF z53k7K*CzS{-Rk&1t-fSoII_&q4$vjF*xt+IR|e<+I8H5R#z~6EPzo`mTC`ePtDVNL z6z!p^!=>T!3hMOm!$zE0Kr{q_?LgSLT0RbK2A1;)?^^axv_)368-sKIIosz+7S7sN ztin-k{VgI${c=uBHyEMJd}bv{nP-g&&WFb_==RtvbHSszXl`) z+7)b#?0qI6j3>Pctzb-^PXs% zzctUl&asc>!nl8Hvu?c!AoHcF6)3oCwSa#mML@1Vrzly3(8z%+7zD?MCz`j z8ic1pJCAPykV#=3hngC}BrZkYb*d>t(=(zVRXOt6>xP`!xUZtd_lGBN}f` zcqMUe6qmoE@A8DkjW9S`){l7>(MIAKBU}zrBlwWf-mLV5x(VY4)BLO7@X`lze#RFA zqj%)a4EWb?`4QGsq$ImvdcpZ}mbX?}lwj(-i(I;!e2)WCjDs%!s_$A6hPhbEZ^$B;mF%4`cQOba6gXw1 zn-xc^C*apK|I&R}y`WtNOCnb11fJr?y{gSL{{ns?j#52D_)P;&D6MfH$fJO&mg8R& zSuf#exXALaca&o!`1w43(Mn8H>4^51^iCJ%%h96z_ld?#=_vlnwF_yTreqhEUy}Wb zk|0o!YyQ#R7^`)Rtt^xEEy*GWm>ck{2-7hAoNB=jnNL0@z!@!eDr;ZPtY6Wy6wtjp z6LYECs1+q?wh|!jK4&89>%^>=>6DD5R~a*p(+S$=_zVp2Z3;W3;2?Sa_4`y)rqr2v zi4HoqO!zz8bqF9E&Er=eeKbGPTGp%8I3H0YSq2;gj{_4Qz;n2oi;<#w>XCez(VuvR z)&qQvMDr5bs0SQxN*l=fx=hiE6bXBgSBDAN86I|dWsi==3)p1VzPRUF@lc`)ydiLq z9_pwLAl8~g56h~IcQs~EsCUH-gCFMMyUJ#0UG$z|%TNGB?AHp3!rBR@nm|9?Mn3~C zuloA(bMyr+%!%r$2xK&mU&nRFv+x(CVa;b9rm!f*0+7eTQ3t#-&%fBiigvZL*$n!j zFxs^nh90)+9HW&L@UK4S#tAUQYpd4DD!XJ6`*!MKyDn3?mgV@@YxERm(1^f`c1k{G zgjt9>DRekkiRXk>pT}qYf=)XN?9#R#FFll*zoj&8w$V`*l?Lz3^Dn2eB+C5qFA(?E zz;A3YGc@6G9Y_wpPRk?qz-U=Yo6C;yNSjX)mJcZs_ifGVhrq8)pxJnm-6V0*?oE{| z{$CLzp(tE78)tcs%mUlOqU&;w|K2- z`vQJ3=r)99!|5b0LeKSJv=p&?>wBj4!y6QAEm5m3i(eZ@wXw|kMN6P4=J9Kc4to{~ zzoqFgSOhQ=7}pVa65mPf<*a=v{V?f)6eAH0j#D-4y_~b8UQ0pAUd?`Iqv#D}XX?PBtz3YZ*0odMmwcY?z1=)P3bL!ep@5z`Jhd+O%-WX?`#MYu+x;mI z;sjbKe2RY^!9v0ZAJ6eG_9keTKL!0z5wU-LB1^=Y0nj=8O2fC@q9mO#o#DImvZMx! z0w}DKdHky7i+P~itZxpc){k*%oMJ(?o*JZ?$>A6D!$!_W%qZKC+{O4G0b9^*2thlc zO{-dCwx<$m9Qc>RHq$nIABlzS01F&5mdCGh`V6q;Z!@2yFXa4qO>kzJ=Qqw$?vLg5 z!yWM9i#-@coHBY8;emFBUu?lTq&)w+V*Gy+Y-_DH#}yJ+ovel)HQZ=J7|-F?R&$?Uu<{qU@agh7)7e8i4O{|n|4FsT6vAj{(yKhJ?*ecHz=L>C(? zW}ZQ898JM7=J0DmT#~!Ue^?6(KtOTXB>drj5|~TM%;DFAib;)@q)#-+!RFAUu@(HH zhip6Oy9&Q}AX8$)6%5LH;qAo*G_){OVopNMm!T8-$EhR*qy~kN2Dx(zAmh{aMM~eG z2$d@PLfGRevzM!JMF{IKhhOJhwgu1c#`DfbCAj^bma0{k!>=p!CFTpm!8FNRGnl3@ zA)vCMluqH71N{)J-&1M>M&Fi!3 za`=TI!%h*8xkE-9HjheZuI){;9Db>Yh&$dz)dnzSv2yQ3Z;mYJg?}!^htO4m)&*ADjj}+BWng!+> zPd5jh1chwlr$h6GyBQR!G&`G}i%ii(#FKSVI;zG_;p+#)G=RFUPZRx5Rwz6sZPgk z$DHQytDi1-7Iu``Gv`@DA|ic#+HLYx1M8S%jW2btJ-EfpjQq%Tiy%m3|mZ)dIhWuTIXsYc6%zw(`$c>4(*#zqNS* zJ#XDCz^!V83sP6rBxZ@w3s$HTEHF= z5tt+NL)Wh={qWP?U$r${r=6DP^@R?23V_UB3U;HNX6N&)|(YP4zod+Mh9m45j06n+&c_NVkrvxXg}a>aA+3v@qJ|8?|v3cuPs zJLr50c_PqB-+4MH8n&8U)_EJeGLK)R@?X1v-e#DNTTRxT&dm8WlYF6?4yDX+%%dg1!;7vLGuyhAk3=s%>hA!v; z=&<%7eT-NOJ|V}yKBrgZt_-~2K}E#kpg9-ll3dz{JF18PKT1D*S5y_%H8YDL5!Q8V znf3;Kv7%1;3-rS+^bn{SsA38iPm?Lws1klaeW>^(cDl0GJkODT$OB5c&ZTl?67#dW!N z!s=ZfYl1EtjaI4C6K2p4+pf8wU67ZkF#+f4w76}g{(%0{;cCY_0sXmWP5ofcqs<@4 zw1fhjW;y-vMm1mbY%zRzH$5m#rCuVtgf@3&vcAsHeNcB0_ky)if@(wwhC^v`edf>% z)g9=EYv{ZuOmzhJ?&^o>YtCR40O)jHKYR!A;UULA0iFWK2-xztjI0BFp2n|PpMvo> zW$NAh7c~+>$9B3b=f`~+0GT^qvhryxzcP4I<@alqp~$0@S;`ehHu;MUq2{g+m;GzSwkQa$Iow0BBBq*gJlHcXAlis8Bu!BO5Z?f1l zei7o{XEv4gn*Gg(Y0)SW=v|3l(@##8rp&vTdJOniy7@D4oAjU3Cd8N4EyJa)9+!WK zvbVHUaa^_OFB+>HS+)dp(i1dB2;oW^@$)eWAlsAI54S0$LO0^g79~7Y(i=xQ82BZ; z?TMUz_@r@-Y~bEDb{(yg{2sv8UmDl2 zyELyK{vvVIj@o6Je^|_3rCq7en6}otp5~`~<12FdVTL0MuKPPWaY4~a|HImLF$v$c ziaK-nby}!pjA*dW176wgo2}^r`LFvQ*pla8_vziNUaSYL(2h_qfQ&uEx~|tdMScDA|v)jrE-hzo3sj+L_~DzfHXvjJ9ojtNKdvV|I)1w|dUeXLge)`(~bh zodaw|Maw2?!9_r906?ougb2Q6=Ji7z8RdWxED!W&@vFL>l6E~A8xuMG@Hp#`b;1}e z|3+$^oEHavT}vGX^m(g{W$g?6E7&bVA_&Qp9tqqWGe+I>u7q_kl=&*AVb=!fq230m8c zA8fKhFKhFy<1`}L0{6r;^tzuUaL3@q&j%oXXOjle7{CX&iu2p%y;;>fz1)3*~_HrX@UqPds zUX%^*`PO1R4@sM^jG5&iVoNhV!@MJFU&al6bek2W2B|3!hu;WmA4}AwIKbs8{1UTN zJl~Wl8<`meel^*lf2hX9rsk`7-kQR%uWS)7TIkRBnWaNEY%y+UNHkkj$=dJd>o-zL z;T-k~^()ARMsxXU&%@SDPGu{4!`0a1`WWr!57Z(TA-MJHugLm)N`IK=Up4U_fDF`Q_ftutm_x;?w~aK=%Jqi^kz$d`tPJX)HpfVNH{i~LP6=v_)X4GUizELPMr^DR z`z7sD`e8`P0UhF>>E^8=#cZTsyr`C_5%}i+5(W(msB?M#WvTv@4pfKO5H2>5cASp1hex0UPV=unKj89ZHi5L) z6#|frYL|@5^S^ZNoXG2kp8%~EXF_{ALn!l$41n*n&~c1wLymvN5Ffg=Phm(Fdu$s) zVB!thfaovJzf}FkMmg^kU<>3iRh2Q?im%YmBret#=lK^wHq1bwsuu%{j~a{UHU1c{ zIkEaG{&mz|Z2PvGLG(G&<@=TP<1O#%JCi#K`4@v{Qz{MOV~Sc0vN3~z4n*u~{)N@+ zPn&aP2mK)9Pj`;d5j)aK@GV(e2LGbHqQ2GK!frCUMQz;NT>d^iD{GMv(`<6rywVS+ z+S~}59EkO#==K@itXH94u70D4b_$exRWNYs=KdCQM)R=PZawF~ZzMd*bbwz1(clvD zBmc$5`vd#@k9NLCN5>Q%Ik-xWK#B41s`1>NNkY39#aM!c9Nn5fuc}93|7Sq z)Nk;0D0wZh*f5+!MkFm7%Gy`utS(xoSBa#m@mNQJW>x57Y?|?E9Q<^ef6W>LTA@Fi zXU;{POyujODfWRlBFn#v{^a#Tg;saNtB=9GN1M&Gc7~r%98iobrytrhf+VpI`VWGv z0ZR$3Y~bIQVH}Ki;AHi z#?Op*7x1sI(8Ho?6lI6AOZFI5L)ZVL_*?W8{Spg1&%dJVRr!=18uyl$9FpIUm)&a4 z34@4b>hk>S251EYwqO za{MbrFL;p2Qe{zZu&UPU?_%#bzqRfjHm~AeyTL9X8-{6}ywSN{6rc1cMus*{7Qc8! zhSI4JL1T@>yP92Bc|`8Qu7PR()uFGYN2yK*Gw3tQ*o0}9 zzrx>yTG*4$^Do4Qhz7BuROtfBHYAEPdU#+|waLa3N(D6xUV3Y=l!;U+1_!DZ>)q zhg)x9T%ojffA;&tW+WAU>A`k5LFAXEx4nE3R_1nP?>YYUIDu`&QNMA5UX)LTy%P`; zA5X4{BmdQ&wXaykD|)BR+hSq%D&HjnmUmHrXuU*j^ZY#j+AojZ5gx4H@z_P{3N@zd zZF3R5OJ9|~e(lE;SKkozhjLOs2-xa;Pn_h@a+E+|mMO{$@#|%I47&+XR|zf7Ge?wd z)1G$m3x1VRSUm^zhgP>!A2+r%pO&g@!~3`*5l$eM#5&C5SGNWG`Y9VDw~fU%xRV>3 zk+0v-VPA;(XRu*`5{O~%jOG^6VFg-T{-s_8{JN+2D5(OCZNfLIy}=M(wqO~r0TGL2 zLKRw`e<73u+p<~Q!bQ+nU(V!7dp8(%zJB9n)n@@qQLv?)XX1x^ozZZY(OOu);f_7U z*2r!vB)qD2<)`%50&S-24~ssaBiMQnQrL8aN8=5fw6CE*s?HPq%f;NFXPxqgV&k^z z(*`b7pHD+kJSc!@)A&U;P2L@?1lu~L9FeCKjz}Uu$N*&1{Hv%|-v`VyPP0h>8OpR= zB1T+Qba=D&6)d__q>)jLEuc>XYRHG??OtEXo{Ft;ykR!Qzibb}FptXK2F_t&*GT|b zB`$7s42QL4pVMz#i~QHp%I^c>vj}j>gO*lNx3Hq0$dke@eg3 zUeA)OKX!ggen8busmSNQwoxB7I3-^%euJJ-eHO(Po(+{%RML*#aP=;3y&}{9J9MIi z*bwcC*GR7nJSd+dZj_|+`LE|`+*veQx&&M> zSZ*Qj=*%Aken-`j(&5gyuvDK>ztN#e6OC=`G#oxkcI`w^uCGMp-cDv`=R)mI>D7a3 ztwMs6T&(9zC{Pe3jisJEFJ5g^XIkbnJ~-6NsXCIdCeUseT1Q2ZZ~ zJze!2%G*@_D_L}0{DNx8sAM`{Z}blt;e<~Dg~=%3UwsDjI*zK3kd0{~gD{m|s;{_; ze~H)Q3wUVIoU0$h7eWZifjiMK04T@59*36O>+we1j(fG zA?$7l1u(8${l*;Hn5yQ+Wci=a!#}Uem}|kmpk{DmEv7`Mcf|}{3{iMA6xL8!qAwbT zc5xhm$C4r3ndV>E|MdmkpaZrp(G~rW2gz0}HqTNA;~LG{7xY8?)qun(ib1#cLCmjK z6^Z|)egj8?=3%)6>r0QQEtMJGuIe$LWBqvMVPcLp>^=o$hlT_!rCZuQRmM zshPKE3Db=P1@XRS2N}cA@!(bb>xwH@&KU17;P}FNgsPh2rl)#DIQSz`uZ2D4W+>!M~6m`mXd}4& zdMoAUTjD5>Sxmo?OEU%euN!PS%XW-H2RN=H zuowP`<;YEVuFij5p)b;n@B7+}InA%8K)X;sZ$VL9Q^>!zqI&obNMgS zZ`gr}P=_|R0{Zh^8@FnIpo<)AtAKxfq&&bdmME5=IJnHeyYn+XHLe{0I!9NG#*ciC zwt!G)-s~S;4(C}6MmCY>Uvb)JbLWmSrUkmCTL$ofzTXpC4S$%+f6WDz4md`V=29}* z8wdXykE8xj>4%wV{9-hya}kuR#_9lUfrL8r7;F%c@RWT~X&d?+5g|FVM!^4@pm2f`|c|W}x#oY6ZHF6Wi_1$oD4!@%8`EH(pT6n^ zPi2j|lfy3`|Fy7VrHJ_zY&okeQ*U`411t?!=kV))>0h)q$zm)m{Ut@aTCoxA<5bgV z*{6B@dWAlc5vBHEucBJCX(fY|CEc@?W3u zV?3Jirx2|IzvBK%0Q6x(A)-}~|6<*;zRgTscayVsL!i~%%9Ilh#AAj0OF-XHmGBC` z0;_vAu?6jqz=+_(bM=Qcy5cgB4RzXE!2v)Fg&Y=df%9b3_!Y-jjn={^1Z-?{s`an$ zsqQ^Ko?aX(s6RYYj4Cg+ZTW}R<-Vx6CS{)PQgsfi3h)amsB)F6wBt22_O+S|=uL68 zewcy#swY#H$K8t{f<;PhuML(K;MW-IpaE=gsJI4!`;=jNLI) zfi>b;H&KZF1>J-~-va!4U$L!LVAE;#p{4fOnKe2J=>=9)4!@vTZN<2rSpG7-DVH4n zbL78t;1@=rP4h40zi`rlj;Tcbm;u>`z`rsoAzOf7UVXi6NSn5G8;|mUt!0kh%GT=v z3I267>+6C=&D7Z(`U_Nn_~b6VhERUWpber(tN_2}vvme2=UV8Z*rLc*ATX zY&`p%exqFcCbjfE|0MP=UzRTfP<9xh|09701^QtJmIOwDR08P#;#TOQuJYCjEEvkh zhg5WevfGwB-x9d6{i}h4ugS)C#PiNH|4PwAR_VX>e4o88*3|&ETG>|c!Fd81u_;ZD zD2+P`tr917kjIlQy(|eb3Y_05zlY+252M5S|NUMfo)$IGtB@B4vOtliJJ+m#BDQ; zU!<_W0SXUOQs-n^UV~JDCB~J*uee%2=wb61d?fV46c*Akn(x4mIaB-#`7eYSs?Y8P zU8Be&@Jrp9)(<_GoR4|quy53i(Abv7FzOFgA>#bFDnt}6UO3ie;8)-c-`w(A>bWtn z%-Gr-u##Okh+`|rk?ZSFe+UJJOH?U`2!-@9xQiNcMFYtK9c~+E#tsi4djh8l1m&|v zpcS7b2>YtX!48RVR=c2CrwPXb*f@T{NB`*{kN@*d-u!EMAm!U?=IS?|5hqKcvTU>y z<$0(-Ts5v?7xt#c_x);vTb%GCtS&mz8ga_DV7d_~TE3^Ng9`CmHtYtEbNi$Cm!Z(p zNCas$N6ELr;Lt$$u+b@pUoD6n<~q=*b^3+miKOLynRX_r7k*<3zcQX{>8Gh1GbL^1 z5&CD@U>j|Lw{Y@6RfgIyH!d##|AN@CAn7O5r@v0n{Q}x?RMVt|4_u~Lbs6;=d&DRD zekyaclh6_Of-`CVcq|{Pfmn-vc|$U&8Z;xB352 zfL}Bz<`%Eo0BfpLHt2Z%PFxbV{g?a~RJCRPa;*k2|9~jns?|tE#8wvYFQ|p0SD240 zY|^pDW`k(#q~2EGS0VorZs-`|d#PHK{FK%3m*`%#YwYD|`_fxbzKFD!nr^GA#TfOf zO~F;d#RB!2RsDuN(jQsuf3$~NlPwXeR5|Jko<<7g`B&-Z64s>DLREH%Bn3o5CAbL$ z9;b?3+u2(5KE37vTD2qY{WqE~%35*p3f%xkh8c9*xb^cCAfOdzSXo&jrc@dPc=`H6 zs2Mz-v@mv6{J$Rf1xDubuM-~kIh8Z|=vmo|)Yy0pfDA6>r!Ib#3E1grJ+8)OBmdRy zi7bPzev>>L54S?To=ZpE8W`XgS8duneJG1M81rxIe4n2e(dLGf_5lNat?{R3zLi}Y zK}*sI2W+j=c(aP1QO?Z;G~r60tj_VTAeF^YNjMI<@2#rpgpu)9(m_vA7QfW1-1-eE z;*N6Ngk&rAFDmzicf~@=hab(_j?xc7VMef?)AY~qE@MGL?fK5;|vns6##D35LQpIO1oHQc-HHTm7{EbVA zM&O|9263>%THxRn^_(A>)---?qZeYZufH#!tv^jw1U>UB;>B2968)K~sUX@$yKzQ` z+1lF*2&gJXA;%lo2-c7&X>XpguXx27fD6yS&kKyorWnT(O>^*_ujcDF4$vQEM}Bw1;+B*3{D+PVZK`Z0|*r3YV6XwL~rxP zp;f8Q2>-oGggK~ryG#uNSm3m9w~hW2>T!Aj5l5BpD2IX8J8q4vo5IvzI z?FD^9{z8WYmnc8eioL*T)rMNtb5#8ymMG@5xJE5eGB_Isp4SMBbVyfCNMirj+taZ1 zc2?FvaO*}FnvRjRu#9sf}R3uk6^JqKU4{ywL&6j*2rW7}_L? z2XK&-?JMA4r^Mb=;7#;7B!e~BKswMHC3s-ldl|ebtooBIa^Ok$%ZPjXFcZM0Nbv?C zInW`@&Sve)nPsbxSjC5Z9D<~RY^Z!4fq0;Re?hsG1J1@uv!6an4oo1-zzHg`aKDk( zoNS*np5El;5uotv+E3^w9#uc@c|hT^EG^()HXX4Lw*c0=p#O}PrJ>iMBGC%%%j4Hv zx!q|%e^?Rt7Z>A-mO1mU z$?>lP^gI1~!x+~&@j1Purs;C?C9CQ78$SKbXmMQir@tt}5QYt_Y=wQ6At{;GKE_^; zh>b*8j(@40k_{t(txDPr{V=HX!xueOGWd5alJ#Q_J;5KAb>qfr_Bb7c#DhfGyW&t1 zo7dK|IC1r^SjB79S&lqWW$n|nt3BB64YT9=t|Q#SoZgk4_wiYK>8OlKu&rld=C^Gx zv$b*hTs$RL+TI^$-xWhdf|Uth=Zyo%=FBcq{0nzxB6{Bp6UL8WotB5~u-K5&>cU4X zr5|eGGK2!u0{ps9BHJa5a`rTJWB^jBzz0}Sz287ZM-IP2q*9qis{BS6QD6v@JI0^I zf;4|xfM4VRegUnzL^t@?3Pp-{;=)v1Ms>%{f5rL-)cH|WI^rKi#7^1c0v>yPXRdz! z4S0ZP+rPAGrxTa$LyrH6YV2t4g??yVtsi1ImJ3_%xN3l3OGVizfTLZ#D~n&fwLQ|S z@T(R?jKPt!#keqY^@l3|rF!VqJ=pTL3|&=4*P*!AVs~Zj%iX_hDeNx3(dg#2akNo; z-)bFvgz5a(toN~gRDaaAuej=usT1lC*W6if{>C%nQ{_nxXz$Z`TIg&{X=j4xdGsEP z;;pPdbn#2gDPWyX#-Ojda|)FhUo3}Tx6-3P;S$@s9~(LXIFd!_qSRn}GkN}Xr|itA zSUvGQ!bTNUx^SFOkr+3YBy#ohB?SKE0KeYg*i_~8{D7S_pvA?#?TH-!n!{dBxN0Ge zjgs>-{(tIxOVuC7eQmk=dDL%U)j1^toqaSx3srdo5=QZ;v(e7;ug^)i z>vMW-WImt$BQ1wtn_M*>{i&cmqUvi#yS5Gcml6LI;MW!m+3mAM2i5-Nb~dVj>}y6G zfd^Of&MTaFnlSc7~e70MwnI0LFb;W@XyETm!432X;)`F8%rSnCHAv`vjQ8BDp12fX!8;LA++~R zShNDea`8)*;+SFVuS{dCa2G@1)FDxr|7ye18o;zp*Jj*^X;1e=Q?EkX%N@UW(zp`UT{)^HUR2r+<7P2Pjcx`6TPL)ZwaDG(wU6_l( zU?703*=Ydyt(8ADt7u%J@Gn`d4kn5ueGlc&KZLI% z)MkJx%Jrj9WpF;yA7nQc5)N{SOyk!|o>J$|)ne846F-4M#1U!RI|ywSk^7zFo;jjR zHe`&|#l_Y-8xp~{%Fkj8dmV@v2%b=Lq4s}`(vp$TwcwTG6do$IG>6`!B^}3W?k#7k z35im5+6MIA(Q1?(@UZdO*woNapdTXE0{j8Cg1+!Mrf2m zNl*8((As1w@d0LVF%(7Ej-~pH{Fes&x+AFKs2-yp+m?|ddsft|6Qy$cp$`1A)yhOI zL`6ufwy+?#YeCVIGT1bJ#c8B}fPCwFdwWqfU+Yui=Xk&Cv2*qF!@#dY;+hHVhsNdY zO9TSNci8XfHpRcD&Oh8*r1oICY9UJN@hixo=g{Zd1n{eXe+^Qv2iY#T*sRtB6P`s~?BZLRl**|6S8Z36g}*ALZ^Bf#$B)ARQ7UV-y%#{R5?9#o8V zy8cj|A0;BFhtxi>&bKTU5Ga6Xzg^t&>Xz!9e%J?z8`-V_ct3>k%TP26u{s%z`%|4c z{m=#$U^iS>PnGhkMtzr7#i0^&@KdkO)m#LNZl!}p73vSQTH~OzJyEwkP?_9EwF|={*%l26OMNhRzE<*n6kWu6O)oQN=1evFD zwZW`?sq>?DNvKAv*|)7PB@CU<6hCznUXmvTNYeN#IjewV_X0{u{(zft8F@y)YQNMDsQ?!|s@ z=o=|x&E_fnu#!@gplZixWj8DX=1RcUInP6MH{p(xwXZnNw~>xLVT2Hh>>A<{lY5vt zn&Cx#LwWts7#V?zz5!{1^BHXTeT0|DXi6y+^_Jf@BSLXqUE@g!!Lt&fupG-EYKLkNhvIlSebHK zpO@HQd66Olt0hE`#b^VF1~lpcfk>FN?7X|@M;#Iy1LA}H?vKwb$bapV^_k=#;ATB8%t0K4xV~d?e8ri9`VB-)K%y|Z z3N6h_`5WqONAehb)%0FNI%!v|u}t9)c9TWT-T(ArYo8>G1Q;yO>%&?)kk}4CG4M zwF&)_z_?T)$7Kz;JcgWMT(yCIs74|E`!u4X@u^LVXJt6Z{_BHTnG4lk}op7e`KEA$6h8xcIH-Q1af4aerAJzjO>)tOy54&FLuS6i0t{ z)l8HWoZs7z<%b^HIQH-;;26_1DO4fihPal)FPCkF{c`3hXs%J?Po*c*GT9L=M$n$a zuQB>G1v)UOongmp=%T6Rs2SieM${kbu6?Qc`Ter?E^}M+nCQ0a1x?i_h!vZ2`@f1H zEgFHlO$A$1g}!6pXqe@z@M|Xpmti=-FLFaH%&8s{Xj6b+lM-wTP)n-N7l!7J0{rW# z9DXS*z%*H!>*p0u$sWX!$1l{+!=+%C4fI3y3Jey*QFkH&jjzJ5dWBy$C5r>J0zgKC zw2(~aD*R$l3sXpYbs*HgzP0$b^pdO+W@`?=pdTWWjyC0e9QpTU<|tD%{-%}{qgUY< zlqFy4nwvn22UIss)2A}979A_Vuk$+m;WqO=q5Pr8?Q@Mg7gynzy92$7jc~VYW9s`j z`SUk|C@rf?ncp$LN$-k!ImN%+iyVHfq_h$0GOK`App(jPpu7M@p(w}C;TP%;#or#r zGG5JpsuE#w=n0D5tO(}uYYySqLshL&K3%r)TT&H?{iSFM>b3ESHY?E?jd#C>{scQU`I&UjrUT*?3;nAAbjtK>H5YpAEi{$QUT}RpFCEHrcWi@nIgn z_A>bJG^liss85-j*@udZSg`{90vxM#7;biuw8aJiLgQXNK;U0f_NC50L|0+vFst>- zq2WUD3&NeN@JrPn0*Ty0dZA5SjOOv{bNYj9G%!06y4=-hl(~iUay|#5XC}Fd0GQqkdbg1uMW@=5r)8iQx3oO=wHr=^3qJt z6>&u_5#Jj%QKwhbH0GbUCda>?mKT%r+kLiHhv{B8+n1`IYh2_J;Y)Rn>Re#~&hLdk zM4YfA&=Bqv&_xHCUkr={5HTjsW^pG|bURLCzt}MeaNn(1M+4Y@!?4JIja8fk5<@1y6O>egceYUck1-1SY-Li^Yw?j zTQ6IO97Gr2id|OQ^jfPgiO;QDoQ6!ke&bbai$hi@Xx0NSW>Oi~YRCb>gbn7;k3uxa zCC)3Dtv}=jf!^6FVw5oaT>T;HH=MiUC<*&#+9<2|9Vc1TdQ?`Was1On*1lpDM=k7C zoG^%$QcouEsdqs$&R7#r?3W~R=Wh(sC(XN_F*4d9y*kp^f9H2PE1O?6c6In4EI7Y6 zK4~1JhAx(QbdvUzmxB0-Ngh?`ki)Oj$@A{9Q6A)=d8FN^&P9h(TFAeEUwZ}O!^heC z)?T}}HMp7G$WYNCRy={&&y5c&i*P=GT6MrLi5!`u$hEE7K%Xz*UprHHj>VA5tbmZ{ zf&vT0kEN#VOP#+l0ol;!!j_2a!v%MN41Lbw7ud3WNZf?97h&77IyMR?2Ix&<)#x<; zs=QrsG(@>+K-XL z$9!Az`1L%UPe$*@P8@^~a>=sNP3Bkth=yADtLitDw~-o(OXJ8dOD(M8Uh+G?p5|Y- z*Frz6Mz$;PHtmtsU2RVRZq~;_3dr*KC2@w^>qam!90ms&rbTR)5vyp{+7O!yKtdB&i-94wf%pV=U>m; z@R_pV84dLt%Du~*+h9#DE*Id}71@|E&TH?M;~@I6vhSLayEdc%WU)Mc{aneIWV8oH z>7mtC$Bn;Zl^NJqk#ScdhhJOV{Ff0AoD`4^g}1f1k{)LuV(st@k6mj#$1y*p^Vz;n`UY<(vI2W^(auMhE0Y()6V zWG83GQej?`MvQdKiu@pCYdQQHq)B-QRSgVBg-}zwe*%40JGC*=9DY3u4J1r|F2M^f z3b>0j{QNObWH@A3=kP12d>sLWgOrZL>7`i>PC(r~QD?IpeyyYdvYnDN)Ad~=ap?_z ztwyP8tCKvBU*KPA3-DU+wJnFb;YT8}?btp?GT~aJdK`_Oae5v@80{l7y*jkM0Ba>I6ej^3K(#PC$9ql}R zZ2*2%A?*d3pVHwOA%1a;-ruf(6v@uzI%4lOb{8IX1;4r4r zU~nlX5F6LWy1RmdB^=Lj?LyUWsIvJDwlqifFrhM@{emPi~2+^r}f{%mC zC{k056FIKJFPsxd5%EY$)9KGtNQ{_YSD709D*greS_D(x8+FC4N|eEti04{^h58{q z!k%g_8D(FEpNDj&+H^MuTD@2CuXUoT)%XUR#kPx3O9}E{s6MJ~sohk7U$zsBcuNzV zVH$W* z_t--12*>^ywuOJi;2zZIS ze#ko2ozeR%QrN#Nf)=arxNTB}{0rw1p(@7hPh>T^fpaFipeSC=zX)a6ir&KEgO+Mz z)|*`Ehk5*xq|TrBCBT!8FN2UMwK(t{C;ArTzp!mt4*viAa4+#YUYzhCFfL`|l1orN8 z`i(iN&cP0@#mOG8%AIzoO#|rzkcIv+pZ{_-8HrJ-a^)ou4crSXwmpUX3+L&@A+Ie| zaBQQH<8yjN?&5Hah5SpE{fP1fqRUc32RldWsEVOuIs8%_4H$Pfvk3ZzG~;ZPHW*cL zv>`Z3{HXJzFn0J%6vdCh_Qs!tqKyeX}Hk~o$a=n75b z^IvD^tT>=_0EjcKfUUH;08-;3Lpl7yb0nUFLkJ8!N4ZKISmF2z@C*D)^h(GYLFy3= zD$E!MyMPZ*7vdNG1ss8x1a(9PsC1eQGXzV@ndk7!-HI+SE?seI3BNH+sOX?zc-p=c z|8iwRTjMYXbk#;zM<^_O?RoqHXH>GGv)rwpSACu^aFCSPIFZM%FOgyS2bvAqWn9|i zuPHmP4Twvrrm+9`G=4eO8QC2ST#KWI>plAe_1XPj`#Ch3G)>iSp#D&9;z7DjCUk2j z4~<}tb5i0QX~Qhf)o;w$fl;7xakn=}i>V$%POPCpDs%7;D@@@R%{qhr)RH%;Ve!)( zDobm99(cdae z|8+#FmS#l`zcQXVv`*G>^9Y;cc@Z0#EBlRabDTe)HowJk^&25%yFxzye67WL-4k^} z9Kfnhq{l|E9DeO6hP%KyODjg`Ep@RS*o}WMOTyug7RS|^SNh>A6^kpeGJ}w`)jwyZ ztwBN!HkiY&kr@Z9b$zHd6v!`Q+t*=}YuK@(yG6Wbr(?D!S;zJgZVq~Jc!bOPuo0*Y5Q^K zLiSzQzl?Bq2_kcCCqWmbRl1hOp$#fl*K+)83^i{HomZ^?zrE{?jjPJ;=e>C|ezwQ) zo5X|OQbXT3227ei69St*M9H0r?aV^DJ4-^6qI`H^sgw_unt-&;R^4*PnSe#I)KJ=` z6|E+Kszs0&UVc#XbzkB6l*gqYl z^~fK?x?j`tSU!CI>(B58JEyzuP5%Y068>}LH?W4bD(t?9XiG2;&R14z9$c)yM|}D{ z5BL9kg#391N4^SMz%0n$*h?2LZ`#mP?+V(RAt!#9t|qoo?lC{41S24zu;H9eB9Y zfCI4r6aLp3#Q7VQ^ac7}PRx&ur*I0z;+u(!!WN&Iy;!U~wAnc&YlDVS$X6PHdaoSEB08>h?ce8KaXRTZehAJ9J`giZ5^8!+CR1j9@>gC$lplf zuT9vyUejE0`JUTdzAoeF$2dOEU=i+Vw^=;o_9*)mL1p;JB!=II$PHub(37kmiuBK5 ztu}|acH{RE$6;gTa%zK^!3uuw_0+UkKb)Y$-ipx&OI?2TP49j=goA0#H~sa`_I_>b zeJy9+|Ke+-kj>j4;3AI54Q-!uPQ-&%JJR|U_BDM>@B6zu%MN|F*>wUgaSxJMkiFs9 z7xkDwng0$%rM_Ka1zrEr?PX`8>o@2J(WVc(e`xl(_IXgrWU34ezbeG^NW?tL#70;v{$gJOI|xOa z4_Xe$E&>20I#O)KUs!)8l=B+4QE)6pcD-O<3KXR+|L`gzDa^(vQ&;VG5nitxhmWKv zCt!D!el@MP1gzC`@5h(~Z$xWl&pT);C=mu^oBdL|U3@(148d&4)Rh1`h7o4|X(wR$ z@cQ8?ZV!&++D8Q9TuJ|qcy%CJbi!`MUlP5L=oiwxrUoU>r~J6|`a}>t*mnLaHUS6m zrGIj~(C9vx`3b(!^4KLLMYQ5CSgVa(JEx7^D|?YY4@xm=w_iV0{X#wfmZ3cONW8%p z_iH*6a+}$HVfC9+r&ij?i<1yk7yTV=Y%ZU*e#raFa0_vE(!;Xh0nE?;$V$|9e)%s0 z+`sW*_s90_^pxZ_Bj1e!F|2te@z+(vUyUYKau(4MKakkM!JW)_r*M*6_6u(EJum#x z-{9Kbcca&3N28n1>v2ZnEc>OxuI^?4SA=@yD+aXNFSub*mcs$w*oD7wRkHIx%YNb7 zsFhWGB_$RKMTkTW1PI@!4X|HWCsF#P&M&*mr;%L)p5cMAiyQ_d$-^f>3}W=lDc8K^ zxNXCB#B1u>4fu!H5fj~Q_eYf|dVdq{@9iqkhtbR4@hM^_UF|}x3>7Jq0APh9mHQkZ4?G{P`%t% z{vlQiF%=-%TBZQ*d*4StI0mP^E&lp49g>K@)(vC{8xT`aH1-ddM*vCu)w(|__$z^d zz0a-^8wHH;B>pn@MsPw$QY-lsa4tRMb@ zuE;fE_F^~3Uu$?8{29;l45BvsMOc+ZEKCO?zVdMf67SD#u?DvY~3x9TH8w zDB_I7*nS1b-x#OBcHIGz&sl>KU5+g5ICI~pv`smV@9g+bI&nFB^3V#X)t^%DpQQec zphOW~N?ezO|H^aS@A7NHbt2HO)YUs;p0@Z4yV5e-#Hx{U^{22;9iOg>hKoG6)SQF# z7Gb@Yc`z{w48LpgvQ#r-LH zuyB!g;Efv~oj_Bh;dvlku2ma5hH_m19zfo$ zQLgBSq+cX3eR5VC0}H?fz^Or^QUSm5Oop~gV}w;<4A=x%W7w5)OL1M3A{|=4MLX#Z zse#DLj>oLspyZP_i&ThU@r%?W6}W|R;}GVQqL_Y_onkE;Y;iqAE(-VnQc;WyB~g*G zlp=~0KvN?R<4I8hQV-r~vA!)>;yP!nqEz7R^gWRRQJ}^%O_tMPZFjKK&5y+(cPJf7 zMUkdo<+=Ta0E#swiKJg;C#?CwC>xa+j5+t7?hHmNxr8T7@3wZ*!!mCG#N=CLrU>)C zGFC}?VV|F7P@M%R?pNKmND3aSc8)>S?HjWkSt@uH$M8&!roJjKg!lP9?VzS8rmo3M z`heUM?(*~J(g$i9bR4MlGbM`O#YiS~K)x5Q^?T0YPZ~G}YA=Pq=ie6Pw46sq`Qv+c z`F&5N3x_MJz&ui%RXI7WUsRr@R)xjx@R$|W-2jRvbumO4Yp>iL-r|ou6@xTDtrG6^ z^M+?cr1x8UXe;F-L~VO$J9!Z(+h`Xkaa|*23Z)-pTntYJ7!?d$rbyFf+X?Un%PwE0 zhCjg@7z4#;O2Si4i&{0<;pXi;K=I*h9+YTD(C4Pf^lOV%jdm3C*>oFtNbU&oZd#ar z!GR}FsV|isrD&{Qiegws$~H+E1lUZ{V2A;NPf$!<=z9olO6DI{s}77HrC)KsCPhl? z*KHEuMeFN`46OYYUpLVs$vk~UD@$9b8aWKU1{pe`aJ?-Kz7ryOpkD&|C5)m?&|s`z zh9#X_Ew)vc^bJp1403(WWO}uzfZ`!XUmt{-Q@P-@(j(I~ZO2U&(ZKn&-eZ`(_3fxi5Zdpj@zbi!lLnm2g57}FHr zk)|A?|J|M%9v4=)A9gv%@4^7;mk$l)BExfY<;=CqFwpR0${~)F#?Lb6f!gB6@bO$b zkctv>xKS2US6`GaV(OX;w5!FIjoR%p83Rp@u%MLuxKW}uq_l-6yBM&AjCmZMB}QSZ zV~{goz0^FOC2UL=m?b*pJTRt;Au%$~E++=si|1Ye)>(EL6G)U$JXMfD1KFCVTtwz` zL8MqzU5Oc;3#6WV1uW+re+2V;-~*#2;=DZI~ZK+kFUx{57==)yjhZ)~O0{R>vb$e(ebPig#(^i>l&I4v_ z;C;=q%dvshcG>i+oY>`gAg+tYAz#*@1NasYOd->+6s%icF`c#8%*_TOt_!Ntvdf8q zo@JL&*BrZ?80f?<3royZt3*SbEW;{6^96E` z9Bfz51yNj%lcv=oTg8g`q+@`goH2E6al+GnaWtDdL~A}Ds3hpu>~4LrZP6ii;Z2L1xkkH|J5$fHpj+5e>16TzBx9OPZFM4b~!Q7 z3M4#s-N6k6MoWy z%DladG3h>P_sLKv&jPf>c1mu-91`e4Dy za);|dq0S;Pk2e7qLp=c`GKK%iOZk>2LE7r^NW{SSJEqT?Otf*MCm>}WD=iSll-^#$ zM$s2Ew5278zJO0en$Y%B2Kpc9kyHpR(?HYlGf@8lxa22I0kQ4bJTo&B@xOolR17xH zJgF%OSHjZ*Pu>I%N)|~O3|b$bxu&c5zw3H3ia(_R|3f`(<;2YZ<(E&sRpV+ zc#o!>gAxZ@j-o)nF)&A$dHsx}70{5X24%R2j8&0wZAfE!`krIaak0$ndiquNRYRR|C!B@wSqojewEa-z0OQ0##dZbf?`+;Ui z_|`o(8lh*yxHVveF6#$5$oi2UWUZe>m(8og)Sw@o1rYxOziw8SB?QkZoD!DOWG*4% zAMFobvwrYRV*CU$P`_J0pud{rllz&vY}8@%saVmHauVHHd&B6v0rPn_Uo$+XV(=+E zGpkNTOx|q3r}11fx*UT~;W1StElhYm8x%3c^9wFg`AeV8y}+>`fdvUHNMJz%3ldn6 zz=8xme-cps5*#M@OXBm_`-L7aNMJz%3ldn6z=8x8B=C8cKv5<0{pdSIESW+UsUnHa Yn~_P(pDt2^KL=lm@cZ;P=YIBo0Jbn{)Bpeg diff --git a/fpga/fpga_pm3_hf.bit b/fpga/fpga_pm3_hf.bit index c824711fd4b50ad0bd973c85f06631f0b0e10d19..1fd05b3e15c1f1c2c0bfb86a972ade9ee706cc90 100644 GIT binary patch literal 42172 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∩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 diff --git a/fpga/fpga_pm3_hf_15.bit b/fpga/fpga_pm3_hf_15.bit index cbf58183570e2503332d0f5e04d47d3bb186866d..c19f86bedfdf8151f9d0ee0be6e171581f44ce13 100644 GIT binary patch literal 42175 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 TVg`G5ZxIDs@G diff --git a/fpga/fpga_pm3_lf.bit b/fpga/fpga_pm3_lf.bit index 98f309c67fd8f14aabc17d4908cd4a1c0d8ce4ec..c00af088cf4ee01358073153de6869b84b2cc8f5 100644 GIT binary patch literal 42172 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 literal 42172 zcmeIbeRy2ubuYU1ySK#F%*eAX%N#WrvNaN9a7NNtHsBZ`ZOeuZ*o~EhCY*C}o8hB9 zZXS{d(%Z-BP1{!^f#nb4!I0GCa(c&()2b;=$2K44d&>xCYy=30<~YxMH$aXQ;=GPV1*UArYQ2 z-mB}8_0#$csrNY61A+IL>V+563FQM`T+uyiUC83111F?>sEq>}yk^;Jqhh zM(ADYa-&Io+!JiQF8#LIC8No~L*B-5E)0z8N0u7kG3T_^voc!HCq$aRYow+;KL>Nq z$xb(#)nnvJD;+WQh2DCl=H5?_P@5a>7f0xS&}A$vp!L)&&3@6~&9h5?Tk7*^S}&W6 z;Vu!gH_MOOA1c)5v0?C&Y7DIDJ=E%kyFw9bFqLx`CPQ1jb)T9)!m}!)Iem%_Qm2d_ z)#J4Xon^ywc8JHk?@CdTW~iGm^GeX7LZ7Bn)Il|__DQHPeoSkUj#IaT;T*Mnp_Ptn z{A6&S_g&Jsg&w7L2is=S_Jq(!=ux-5KYYI^lEv?7s%b5^@rBS8#*-U6ZVDgH?Dy8f zGz{8B2`6lcF;8gN*hmjin-lI6`;-}>z4hs;K2tQK+ujpbe@j>EzU{(FpUt)33M@r^l#WhI8WQ^q8xJg7?H02fek3 zSM+O~@(%RN7B1x}L1Bs=Ea}&R@_sfS93f_h9Rug zUoAa(L-10Nd12WmyqTM^VH0w^A+>H=BlUf?X>Q{L?csPfIvJe`chcr;Piyo5I;Pfi zq*}kwpIb7lUrOWN@aCDQtb>PXNW(|A=u&Mi=&yA>{YsbhtM++$4`J-B8O@db3F`u* zw&1P%2yCWr4_UwdiVdR>uI!>MQuyB`scaM8jnJ;+8 zGeIxXVmC59NGnyF0pr$^J$&9eoQ0u&P~>2rV~ifQWAS^WR&I0D-sss(w&7?aVay$F zV;T|I%v(JyP~*yr2WS(;Tr-co%1wysZY_=LC>_+gM=`DhJx85xB(IaFU%3m*eLhk$ z_-r@S9-FG|=hrCw!YHCQtat~ob>+@zq2-CbGs!D{0z}IT)yBiG*s<_7@j7jivElGY z?^W*8$yfo1=Fbn~*W+Y!pNoL4I13SL4;#It2;kQqi~{)en!s>|!aFjIAnJ*aUyi~r zWtLx~XR^zZ(cw^nPKwK23@}^4uaoqY8+{2XbDDYvVBWvl__R<4KY(Ay&CY#^{9q0f zbvYZxQ|7N}8NVlhUyly795x>ontV*gWLRK!p7#0^#4k7JnvG(}-cxLK!c7iabv3{$ z{Azy9JluOeJvrQ*UUdV2Y!8FNIuXP#GwH6jbP4=g;zUUwuX~r4GNK*gm4NP)@M{9& z`lYu_SizJU*Mz4R75rN9lRP%|b@g)al=~w`&CeU2e);${1=xDodXPF?(-BA9Ep{^l z*&**ej9(88w@splhZxAxbt&*WCH9G-huh8WZ#^HqbT><=h%{O|3Zpr!`^7KpLSGMbx$bC>f;Fmim51aXOTE+`^ z7Jiw)FJ-7%ur^SP5$!De;*ab{?SvcR#@lHjx2fQlwJV;u&MaX83%P-~?Euk&_+@vS z5g&62UY{$c>}8C?0sMLou+=evu0mLau1@BT$CWS}zjksPr=A=CP;JOh?YESEDf}|p zwXp0>D*S>eC@Px(M0>%TXT~puuoL25g}HU;Gu)%#EkC4US;P*P1F>GIdWbJziNPAeeH~2Z`e<5Y?o$EOc@(BB^}lIrhU>un@qn zhpA15)8b|H=Q3BnEpr42tMuy)58ng$b%dVsKH@ePvkv_CPU&6r z?*Ou|P3z9eBoCeO%l8kb%tsF|bYbulz@2u+ouZFlH3`*bRkn9ZneJ72wE0I~FSM!P z*KSHkK=zntDzl*o>_);hlO_G4`T%~N1OWZlJo@ts*zm9Ab;rXv#xEbOrs>z{>Y53F zug_ej&Qp6{;g{@D%cOybQDO!g(xXs%-m`~6{#64amNxf_*TKJHwz(~28*1z&{&hjJ zVO#?dbIjx=?(az|Y9SIaPrtywOpkxn9<71knEBet?VHS)zzdU}etG!S%`<=0d|Y(f zfa4!G6~=CFoO8c!Rq!jozpg5Ph`m6+a=%)HRtE6vq@mvP0Qtgk_xZlXM4Zkn|tVQ&v(_4!G|JsbTNYDjIF)Fh5PAhIeZ~OQ?v-#IL@rrXd zu)zFNk@DUH{^j`mYcuex%Z)D5$DKpk5_h$xpNoHa1Jq7A9oCg&(YN(%ZJNKUf?vAY z0F=nDIL3YyMbhWwU+ktr%{|;nr5k4RuRj8QC5k4p$3cu># zpMRNhMOxuk+!gP~zs!l4&l%sJf5o%n|D=DiTAa|dDDf}GugW}ke>##Ctp?Dlf6X_; zCH|%D47TawMfn-ML|rTE?>iU&^465}mtbuc(;Qb1dHNM+{33;4Q@)^&&@zfivi0k{ zwW#7>YO}Rw+?qT|g53yt`W3`4P0_Bj_%|qHvx^P6)_V`**RN$8^Dm}d5E#gQDU<0r zYxRYKRVT>5*t~bU=jHSfOGOXhBYFD8_*E5;s-FRn9g&OeIS2FrewE`Jp76<+`_@~{ z`^+zwI8haTahp2E+^>_p(oD+$eg*Yw0*baTmZ4lW-Y5e2#a)HZ&o(MCRiEp9onA3J z?=Y=%;ujhh5MMj$U`-wE?|@&*J_EnBfX(c2BgLC1n@+kth?w3yn}2!su%7*my@<1g zheWP|U!D#3Z6=`2TijI~Omoyc8_d7TcB9>`OA0S~uqhWR@h{-l;}{p)d9@a>^ANOd z_rvGnUuD=jC;yW0E(+ou^OWppO-$?EhQEU4_#uYFVMC4|LMWK;i5RJI4U2R&eu4G7 zCW12qX0ieNOD0BFRruH32k3FbiyvYeGk!JL%Hc#nvOj=d#^vss{EDM zq4w!jn;Tw}Zx{&ROpA*-(9s|M@1lx-C5mAaUegXjn`CXR+?`LX4KEPq!mn>bcR*M^ zL=VZfTzIVr@-OPzAJqokl|QB~xh5Gl=pE|njauug@oV(M)90P4f#cysr&r9-RqQqW zT%YjtYoz8auxz#Nw>Clb(vcZmSguUkRq?|b70qzO1pLD<$ar$&0&P8A%0L#tul3wj zz?SyNKwHuL3Lty4Y_ZLP2;dicP2n0b>Lj&Pq3e(H|Vcg2qYej0LaW=4qtBLIA&Dx8?*XzC5GD@fcW~#xm_Dte_3P?Bkbfy}@Xe+cX?|9YV~8GcX5%M1^QY zLyf&qQ((-Mybm!6w!2A+oXBZdoeF*-SMr$I-n(g6?5Oj2Y=;a#*idi$BejnqQaN40 zFSzJ3I;_9mI%9TDY#GwG)6cWrNes}(uW9WGASlc``fLJfcSdj1PdTqr&pv=ufPbBE zy8EIJ>u=IY7VgA*erR`F(OrWRhRynZxF*50YgpwS^1LWdi1yS*xBVRqu#8_RrA=W& zxCYcph8Ky=w3QOmo0io2_?6cbT1{^H3W&!e*|uW%TG45LeYnjIud6NNm&s_wp=p)> zYQ%6h(;V{LXsXVR#e$CMB1U71yICV04#Dv|bK4yud(zRV0DjSWquDXju?6OO z0UDUr`{bR}HU#e?kpJ33%^9;V(`B!x7S|ljbb0HQhJ{r2hvSEX!*+5wBBC_t+S5og zt*|qNL@sPq@M|+YS4b8kOZ9eo&hC6Y@`T>pdN9?U#~!QTmrx#2PCp9aDL1+m0|cV2 zR!FVvGsh2K6g@j4FAoC0Oqj}LdcXBT4!-e(?&Fs7}-KjmGJ8{;-biZ71+&?SJ-O`Er>d5$m^ZZla=`4ZZ}ru zUu?%t0i-T}+5Dx*dHBWg!^fPQtMH56CkW$CK5n~B$w2%N)56)Vn~qwTpV4q8b`d-z41|H`TS*Cfrjm#>W8KX}yqYSPQ=RpN*5ae2dQ`iyg?Q7yqyIx*Dcb|i!N zb<$i`z*0^cGY-`A4*h8CS>pGEEf2q#f9)EMy%T;Q^K%FNk>R_8y*Mo0Dcod1L4QPUOvbrk+a zXA$^?i2`h`$$#rDdO^ECH3ezxE6_ ztFR$4{{mHfHM<@$&(vR3#Sf+JnuZvqypb?LLdWSItRMmcpY+z9FB{?ufjf6Wu$`Wd}#cCOu=4GZtP zX2lP|t$r#WrG;tpe#9;;o0d zu;sO3*uvt{bGgNRK(tEzhOrm01+`-S1=x}?MzmPm9Nrj+A3nsc2=^JztpgJ`MgxwW z0-^~``JyWSg=is<9YcoMc@RM!ApUXySt)+V^&8Iaa(|Q{4y1Q;oHp+11=nwIIZCO| zpp*KT&5Hu0KIqwAuHRr!I5Ilu<-fSTrPrlpAYz+J@k1kSa{SQT$^47;Yf4-R{A!V* zB4UH;N9Dg#iH3MYjM~c9B||Xg6nD)e+VpWFTT`%AMDzd@2BaqZRp9daBxWNiOm9u& zh#wx4UAag~e+BVF&@SK(y*P4Z5l=#%e);tq4m`cdlFJ9d>7hBrQvA><<-cb1Us-2{ zdO+yJGI|k-Fk?oyJbQ@x4d-F2O@@~bZgUZdmo% zY8%6%FpK<%ySA?uL*j9zfnS(+f?7$oEfWao7_cpukeRD(G8FD`{lUE z_hj_DVbooi(67Aie;3zpAmr{wck4&xNv>7f4TtJox-tt(lE#+BkIH`)dgKBZ7Lxhb z=ce_9^&BluM@Ds8soJRgm*lXRn1rFe#EmWx-=%-0mWb(A;)k~~w5c{;GH9CsW22bF zZ`s~@nG_*FfQ%EocTVSpEHOm)7`8Mil+n052@2Z4iU=_LBN zNr`^}t-!y;6)uKzj6R2m6yw)<{oIE0Ur19nM+$l;wqB17;Z@@JVZGbZU%{`vnV6j# z{$$MLvO{xNyk#N7;X<&zd1m~|17l5^!zGUiT1vI!v_~Y|IubW|`sLLh#zxJ2FVcdo zDlK@FXTvpj2lHRkcBhf3)5$DQS8HTw5QchdyIVh`_m%O>IJE-&YhvCh1LVknnr)?Ips%MO8G^o-TzMlP$uFAuFee`C!wkBgtY9pGOur=86ax#D#yAi%|RK>01a zpS|_+>Nnu8_BR|cIM4ywbwvCN1Qqv7^Vq%m!xj&}{6HcXBBIahL?C{+hjNF^%f*YC z!F1wqc&Qk-Fm~5mnhC@Y;s0bKlln<}ztfYAz5)E&NZrzWOPq~g9u}xR`*E9U{G!f2 z&t^&({ClyVQ8Um#C)<+o_88;WF51zz>fVM)@#_$>up9iuY{>ZWc`yIf$iC`{ZQo@(9fIWsM zmHZdV4x6=AE5%EV4?1nyDo6a#dPFcfG{n94c=@kI%(e~z$gX1H2djUb0gx>X=D((q zVTtDFm3%+_H3l*XL@V>J)3jeMYK;`;bvomBFSaAsHhjZ*F$;S*qdOJ+x-vS`;TQ8Scp!jaL5&j6 zOqg{Vv=U@qB}{M6Gkz5um}XPJU2W$G!~$w2*~0ju7S%JjCxCB-ZdsCEf%wTQ9F zvG_f*2K5^@tlw^tkelq-VRM&=qfKICi1EweHl`7w-9s1!#zn)@)=U$*B*YIXlq~s& z%)j9BQAEzOsX)6S=r-(F7tP66>JN{ATfzGE>qk((ag`gL27WOkyK6egzkWtQ;e!4b zNK;;BM^drd=|{Q6I}=lSfPZb8h^2v6Z&;g#RCzys+i<0kzp+*_Sp}! zTX?Jauk@IVJg~wl;}?&@>0n<1c0)#s4A69i?3fDT*T0&bz3}I!>^Ge5!pHOBqs~c0 zgrK<-75rL16idT=y+Io$kl(2rT;ZVpP@2|F<@n)hx~I>+9uesS&UTsL(3LdykRjJn zERg>~2|8%kohRr{*-;FwYxpDc5qa?rv#Ngn`((4ZD7dcyzvkGwbl#?6JuB;9YB^<|p(`c)jfvVcw^8*Q5@tsNCf+5KVOvbV?FJdyp$F>^ z?aLgPxWfd+mkZOvqCIAdjHfe)42R#N_!svXr6%-6ceO z-^!)+1yAnS%_tr4& zYM3_mY76N)2^RwVs}2U_1#j%-`okN*zn;`Cc0ShEaJ{yR(!FqQ%lWUJ^fYx8SG^>T z84r;^_J6?qgzgUJzrdu@Te$4-IQnzfedy0|+U?BQ8pwa)3HNy(w?XV3<1$}Dw5Oi) zUuyr9_*c}OH!a4sD+$V&r^5jH$dDe$e?4Zj4}^F2PFWkt-i~c!ny(O$Iwwl+sd2Ei z*gwp;G-!?#L&*5UTq%0l(pD15z` zpgWsdsLny^`4ReKH`Fg&PrvL&q`lyQAht7JJ0RnSQ%l6xU|U+<4<#${L)GVEbf-RU z9>{i1wdDsB&Kd1Nw;lO{5`HOf(8jKN4a(^Ght8L2nOhUUFIY$kIyt4kC!VLpFe!sc z%*LK#WV#eT9Kh@L-rL?9zE8YnXJpJ-l@uH#L`6fs5Pd`Y3#GqYe~30? z+@_>o4+=X72 zAiX-(mm=g)Tlzs~b8rREI1dH0pKeBnU&cIQ-fPiy;uk6uCJ1Rz_hm-*MY++f23 z2tjhV)i%vcZz~NCq5iN6zqYr=Q+1-(v5@~FG#<-lHRi&xGXL6)?0?LO4~3eYVV50F z^Ag&a0dC7o(pw7$@xz~sWh=q9(qhKxY(Ugur&%a2NgJ&J{slVO<956jJ}rP>D?45q zJjO#@fn;kS|Mgr`_saThdb54d>dZw(VCPRboqb<>B2a%QH_08vI4{BAfLf+@dQ5{o zyuZS~K8{q&cWGt}HG)3K)bkl5+wX+(xP#a>UpZ0*BzN49y=TpRjZLf9~E-ay|# zBJ88Di@zwvH<*7Nu)3W#D@-`Yk!16}nWpD19lj{3Zxy_ve*ExhH#!~us`Dc_9$2QY z(&@QZxb^P@`PUDra}=u_X?%{52urR=(2rr~qa*s~J^f<-1-B5|6j~tG({>08IRb0dt+%(2 znQx2FV(dFs0=w_@)`IKj4@mH@t$M5Q6ONaN1G%IVX$tT!aom2&`R8nSGIX4tayqhu zlk&I?MB5GgO7ptMtsOLOEjA*qp0t@Tu|QMKGMXbR`1MhHqZ7-TJHe7R=5}OLBVu7~ zhFZR1K2X80)nc%in~Gm9kYg?63g#2yLYrHo%+cQDUmBmLn8w8h%))=!Hh^Dp$Lf?v?VCZxvR z&V05PM=!@f%{YG8;l`Z+ehEoC?6?#yB$2GHGen#QokR*iU+~s_1o{Q@ZYG9T+$gaR zt;o=|ws@w{osDd);1@?hyCd5t{x+gjwoTvEL5POWI_7C`1?~Bf2H-RGkKY3B^ z*`IiO)6(7-%{^{pqJm#H)36g;Vh)8`#PCEcS-)BQv$4sr`%{}U<@}d{)rq-lclR>& zh`9@sVgw)+YYGhn@ynx=uxl*Tk%({`irXdskWe2b(Y1us!7CvkpalLUurss3uRdPW z+=XCU8th@eek!EGP#*uf%30$E`PX}LQ5sb`-SAr$F|Rxgzh&{t$Z>4Qetr+v&p#?- z+gASU=m|fb4%vQ}1E^_2|Z!i|9eC z`Av+yDJPE7CL?y=!hD5)A(rdH8r!Itc+TGK!u=ixuiVog*{cWmm!e&$HndR$FH0z2;~*fM3|6lo$l8A8>Z>kI2EJ_DRtxVfih?=5cZSkRuiF93GIFK7`zd#4l{- zU-h{PeywI7$uXD2>J1=mu`XE)b=81z`KtJ#>;TM)t5KkTrZ3bmcho8^tg zc!3KMv)ci_B3Z$&Jx;Dva|8pAby?Bc1z@(Pw30yoB znG6TxhgOdkb)R_~{0nKXJ771!$h33uFJ<1bjq^HeCUrW-?EKgHq6VfLaC2|NPi*F2 ze{fd(5UC%~F8eNgWPTmNe2xuPUfLz2@8z%zwRy@YXGZ;9os`e^4DigoOlxv|7*$2j=1!@T)TofG*<~ z!iLBqm@;IGVdGl}NUX>a@T(CKm_Yn+7qvUXeX&LjK<1cD0{JgOR3sbBe}Q}U4Q~~f zk*Z7CDt0o)T?>3K<-a(7nC|LJH0d?Q0ho)`_qR-zfGk))AH%q|&6_ljyMV22`c49n zr8}5^sr^$rzZ`K_B+YRf$2a6)QF5Ra_#TKKqRd!^ay(^x)UoKiu~RZwKRtPgBc2b3$~{ zT>`1PbnRgczs12u^7M=2hltNlUz=!HZfqTBl^4V_oAJb+zV`B9{P0~TIUSj!>$J~C zeH0UxGqi`1$d6U3_@T|U*80)(aTDu>WHfMDJ*nWA$8IJDm(UAYoNMEQU?*v}3;q?z ze?2aCxWhSQUa@T`JOVq<{Hs1$$$$BbOk(B%NkeFZVmw~2s`#PL+CX!#=QlAHU|eop zUX=1*>ik!yo5+R}ViUTd)tN(pdY6Qo;o!Xa zE;>T$;NG<3;g0o|_4Kn>ycT~a){WxIO9(ZbabqK?ijJbU7KIx0(7`A!4@Ddfb%yO; zDX}5la8kTJU}KA^_#x7Q$bX51g|MoDbI<^B;}RtA#IzS1G{CRmhwG9%}MbBoISA~=O;n@lDG4F<^cWxWI4T!{ynXnt_csn z4r>X-TYik45b6>rvmtYbek-A_lIJ-PKjfK5pTR){fNTWYZ@UZDpA>%la9X>_*pqEO ziW2k>-}(2lEtgvRpB7b3ghhd)Ez!?5!a`Z4lf(WE$3%S}A~ z<@6km{8B$9;cv+3YlFZq>#s4c^Cr$qa~qByzUy>OL>>x1;Bq<->&^k>PChr`=hh3X zUruhK{&szJ4kcSyB@SU`3j)01vz^+o{Mr~^+XTj5`~0Erel3$vk%aVDaj1JSKw zgERa5a?Gi-8d_nx+nrE0WY8wBO@M#xipQ@DH)M<*+o}CJbL&PUHxSP)hxfHl<7xKp z->^H)dZF7x1<`G`XTl^4wn~Hrjq}T>pZ9B${rF)D{7a?kz!^=fg#$R| zB1~1tame!zQNLk5YQ&af$hYv=xopF*HaT-RQuyW=5f8^?Tt9)u%-&F(l*C`u#{=mnx!A#u6LCb@l?&RhodSJ$j z=9gpl+gs$th4AegKRdKuUg`qT3Wn0J5xNLyh5Eyp6@SEj_|%6_>7U#2qWnq`p7}wc z+L-X4743R>kk2o7k0}Fk()e>1mVci&KU}|YM()9TM7PDXi|arvL=;(=sNfeLTmFN7 zy>Do}S2n+Z9;7dzKec{LuZf_8a2@MzgFml|?We)N)a4=N_#xMC?1F`?ONJb98JLuh zi8i^rU)h$!CI0n*0k7MwpJscQ>)0PnhP$Ls9{=65hgsymxPD_xQZLt~uoZ=I;P_#h zCtAXBM7ja?aNYt=d%4jQdKV$D=VB5@SK6wLf%D7aJ8mc+%87rZD_ztiC&aLWTx4F9 z`4{qEGRF4s5`qoKN4Q^Nn-WBk`uIJZ|Jp^kJ0=;DC`Z9?K&C0nLOFgYIsb+JteytH zPJQJzD{auOPAnW?s}OErq%Llr zYMJ)dOPyaHK(uf#j(t5Y6>PQB)7e<@t{iYD$$jSf4ctmW*oTIKS`2v(1dP-c?|Ay< z)o(1c)z}}`P>9H0Cy;vIh9~fzG{1-AhwsudJCP5^=>K9|UOL#0wa6C{037qytEfGJ z9$q0Z^E@sLrwAf;l5mb5g127Y{ZW@otf051Ti~2H&xAT>qC3Nlo}Q}u4YD)g%QBPB z9=jltaHXYF&A$Kv zdjVVi7ClPOIY~ESw*>i@2G~Mc2TH_gZgGSLQLiw^h7)!tUo+KJ-eg1@KRgVA0mVc!?Pm2t-NldsGNDQ~@ zN>9D>%UB%?>&2a4Gp)Z&#~nC<)%;7ev*l;tUBBqEdC>o<4r5`VE!R z^6!tb;3uGC=?K>!_Vd`|j9;p&r9MB#0+1To^opln9{=+1-vFnk=n(j6!P+e%Rs0KO zhlmJ^H;}+?XV^MHU+Zh$fc#g;TMJcx$nGu)myif^!;8c-QVvnpOojsd3zmNr+xXw$ znDKt@ebrt+&>~Y+{L3%fQ1u&tt$SV-0J2=-PlNRv*mW*O;hFa}59?!mszpY31o;=x zDjnhbH(ro{t>XwxA#;>Q9?h!Y7y2U+E&La{gZqQnpaVtAn*F7k3O>J#t8YGS_KD+! z(t0=icBlyp*CEYGES$~r%=`;O9)N`$12@Ommu4ao(ViWMv;7xu&vX3-`kaS<_!9wt z!;LvuOQbSB9F-5rRq1RCl{TX$4Bf@a6X~;h!@?( z5|vlB_g((^FWxp&a719Alj1Ho?Xg_Q6**78WKDv1=2&efUm#RM$S5ef}C%D)Z_@&N`UL}!r z4dB;lz*b^L|0BU=qA0WZb9!-TaRG=Hz%O7fyMg( zT#^;1Iufe^zVR_2+Uphk+S>|5+b!DTn`mLd%-<9@zNIf@H23j~fM4&(&ejO&Hbb)Ax z1b0XAuV1(J)I~=>HSHX;uy76onSqM>=?Z?0bN-@;XllfIW&p62)F}rCW-5YwuBTs| z|GJZ!Y1qN#pPV>IISr^crnW{D_U1XQ#2*ZDC;SAu34$5mU#I9w9L?Zb zHR`FwhMab0V5sYZ^&707%Fc@eFqH@_w2A{(HUC;kOe@0ozWy^h;I{V<-!DFbCp%c< ziavg6T$1r6Cp;m3W#5Hk%jV(C15?SB{ zUnB+lQ{rE^|8Q7~$y5#&0ELJW<~<23k)UAx#>=F_h7<5fxR74;c^BR4z;5iT;1{2L z8_uI-=Vf=WwZT((lbF-D_iXCJbPt zKL53dX&25f%d4h?^&2BVt8Td_zrqU$tdaAIh;?_r0xRLyA38O^B0dir;bY6{7%U%T z#uG3yy`2BL-+5$i+t|p>;z-EjU$G;KTS32k{$&>=_@SoKlG2wW) zXyeB>n12DSie?uaHR;0Oo1o}>=!-mdKmWCNevW2xxW{a_{`&B+?6#v)D?0GiUDkKc zCy~Sv`|g1?4`LrGUb#zus{~|z{4i_zA-L&5*h~{xFs+{wOvED7mHgLQLcI+N4xmj_ zP*3<#E+G!U_PNBrpkI&D7oBjvw}?6i)uu=r(q5YieyO^Yq)-E7Q#np3O6PI;@eNsj zi?^dnzJzir3f{Qf3Vxj-lx-CC38r1db^~X-ROd_hr5(aDE#`csD!iFQnrGr!ndkWllSK1DM_@Fga~d1u_Yg4e5zU%Tm)`=pF= zDgmw$+UPgYF<=}PrHo%WDwy59(fr^P%uYAk`BpmU?3RfDeqn5~eOq{_VG_q2mSLGz zt+x*j!GHwt%MqDASm!#iKRr)NxR{UYGIvWPR?7HgYYlX#{6hKy)beTf%0DfdsfKT+ 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 Unk41;_uxzMdqyj1DZl0a3pfQ2?EnA( From b90326be612e1de85c24ee3b5ebe199858fd4f78 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 29 Aug 2023 21:21:26 +0200 Subject: [PATCH 900/924] remove file not used anymore --- rdv40.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 rdv40.txt diff --git a/rdv40.txt b/rdv40.txt deleted file mode 100644 index e69de29bb..000000000 From 0cbc0c2f8b8a220cbd4e46cd293d5757bad14a20 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 29 Aug 2023 21:45:15 +0200 Subject: [PATCH 901/924] fix CID #416734 --- client/src/cmdhficlass.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 5e271a743..36144abbe 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1238,8 +1238,9 @@ static int CmdHFiClassESetBlk(const char *Cmd) { int blk = arg_get_int_def(ctx, 1, 0); - if (blk > 255) { - PrintAndLogEx(WARNING, "block number must be between 0 and 255. Got %i", blk); + if (blk > 255 || blk < 0) { + PrintAndLogEx(WARNING, "block number must be between 0 and 255. Got " _RED_("%i"), blk); + CLIParserFree(ctx); return PM3_EINVARG; } @@ -1247,18 +1248,17 @@ static int CmdHFiClassESetBlk(const char *Cmd) { int datalen = 0; int res = CLIParamHexToBuf(arg_get_str(ctx, 2), data, sizeof(data), &datalen); CLIParserFree(ctx); + if (res) { PrintAndLogEx(FAILED, "Error parsing bytes"); return PM3_EINVARG; } - if (datalen != sizeof(data)) { - PrintAndLogEx(WARNING, "block data must include 8 HEX bytes. Got %i", datalen); + if (datalen != PICOPASS_BLOCK_SIZE) { + PrintAndLogEx(WARNING, "block data must include 8 HEX bytes. Got " _RED_("%i"), datalen); return PM3_EINVARG; } - CLIParserFree(ctx); - uint16_t bytes_sent = 0; iclass_upload_emul(data, sizeof(data), blk * PICOPASS_BLOCK_SIZE, &bytes_sent); @@ -1805,7 +1805,6 @@ static int CmdHFiClassDump(const char *Cmd) { uint8_t tag_data[0x100 * 8]; memset(tag_data, 0xFF, sizeof(tag_data)); - iclass_card_select_t payload_rdr = { .flags = (FLAG_ICLASS_READER_INIT | FLAG_ICLASS_READER_CLEARTRACE) }; From 32f892e512d97be402c0abaf6f00675686ed0893 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 29 Aug 2023 22:37:56 +0200 Subject: [PATCH 902/924] fix 14b dump --- client/src/cmdhf14b.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index 536fa2ce3..ae3dd5002 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -443,7 +443,7 @@ static bool get_14b_UID(uint8_t *d, iso14b_type_t *found_type) { iso14b_card_select_t *card = (iso14b_card_select_t*)d; uint8_t empty[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - if (memcmp(card->uid, empty, card->uidlen)) { + if (memcmp(card->uid, empty, card->uidlen) == 0) { return false; } *found_type = ISO14B_SR; From e3cc8a98e94547a0579e29e4e42144fe775f37e1 Mon Sep 17 00:00:00 2001 From: Thomas Pedley Date: Tue, 29 Aug 2023 23:56:23 +0100 Subject: [PATCH 903/924] Fix MFU authentication to send PACK correctly. --- CHANGELOG.md | 1 + armsrc/iso14443a.c | 40 ++++++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cae4e6507..6854aef6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Fixed the timeout of TCP connections (@wh201906) - Changed the connection timeout configurable (@wh201906) - Add hf_cardhopper standalone mode for long-distance relay attacks (@startrekdude) + - Fix MFU authentication to send PACK correctly (@shallax) ## [Seven.4.16717][2023-06-25] - Change `hf 14a info` - now identifes QL88 tags (@iceman1001) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index c3ee6f050..8e7988188 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1284,8 +1284,16 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r if (memcmp(pwd, gen_pwd, sizeof(pwd)) == 0) { rPACK[0] = 0x80; rPACK[1] = 0x80; + } else { + uint16_t start = (*pages) * 4 + MFU_DUMP_PREFIX_LENGTH; + emlGetMemBt(rPACK, start, sizeof(rPACK)); + if (g_dbglevel >= DBG_DEBUG) { + Dbprintf("PACK loaded from memory: "); + Dbhexdump(4, rPACK, 0); + } } } + AddCrc14A(rPACK, sizeof(rPACK) - 2); static tag_response_info_t responses_init[] = { @@ -1703,33 +1711,29 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ } else if (receivedCmd[0] == MIFARE_ULC_AUTH_1) { // ULC authentication, or Desfire Authentication LogTrace(receivedCmd, Uart.len, Uart.startTime * 16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime * 16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, true); p_response = NULL; - } else if (receivedCmd[0] == MIFARE_ULEV1_AUTH && len == 7 && tagType == 7) { // NTAG / EV-1 authentication - - /* - // PWD stored in dump now + } else if (receivedCmd[0] == MIFARE_ULEV1_AUTH && len == 7 && tagType == 7) { // NTAG / EV-1 uint8_t pwd[4]; emlGetMemBt(pwd, (pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(pwd)); + if (g_dbglevel >= DBG_DEBUG) { + Dbprintf("Reader sent password: "); + Dbhexdump(4, receivedCmd + 1, 0); + Dbprintf("Loaded password from memory: "); + Dbhexdump(4, pwd, 0); + } + if (memcmp(pwd, "\x00\x00\x00\x00", 4) == 0) { Uint4byteToMemLe(pwd, ul_ev1_pwdgenB(data)); - Dbprintf("Calc pwd... %02X %02X %02X %02X", pwd[0], pwd[1], pwd[2], pwd[3]); + if (g_dbglevel >= DBG_DEBUG) Dbprintf("Calc pwd... %02X %02X %02X %02X", pwd[0], pwd[1], pwd[2], pwd[3]); } if (memcmp(receivedCmd + 1, pwd, 4) == 0) { - - uint8_t pack[4]; - emlGetMemBt(pack, pages * 4 + MFU_DUMP_PREFIX_LENGTH, 2); - if (memcmp(pack, "\x00\x00\x00\x00", 4) == 0) { - pack[0] = 0x80; - pack[1] = 0x80; - } - AddCrc14A(pack, sizeof(pack) - 2); - EmSendCmd(pack, sizeof(pack)); + if (g_dbglevel >= DBG_DEBUG) Dbprintf("Password match, responding with PACK."); + p_response = &responses[RESP_INDEX_PACK]; } else { - EmSend4bit(CARD_NACK_NA); - if (g_dbglevel >= DBG_DEBUG) Dbprintf("Auth attempt: %08x", bytes_to_num(receivedCmd + 1, 4)); + if (g_dbglevel >= DBG_DEBUG) Dbprintf("Password did not match, NACK_IV."); + p_response = NULL; + EmSend4bit(CARD_NACK_IV); } - p_response = NULL; - */ p_response = &responses[RESP_INDEX_PACK]; } else if (receivedCmd[0] == MIFARE_ULEV1_VCSL && len == 23 && tagType == 7) { uint8_t cmd[3]; From 3e034e146aa290c88c5dfbffe02d4c4aa9dea13f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 3 Sep 2023 12:36:30 +0200 Subject: [PATCH 904/924] remove unneeded line --- armsrc/iso14443a.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 8e7988188..5af71bef3 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1577,7 +1577,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ // block1 = 4byte UID. p_response = &responses[RESP_INDEX_UIDC1]; } else { // all other tags (16 byte block tags) - uint8_t emdata[MAX_MIFARE_FRAME_SIZE]; + uint8_t emdata[MAX_MIFARE_FRAME_SIZE] = {0}; emlGetMemBt(emdata, block, 16); AddCrc14A(emdata, 16); EmSendCmd(emdata, sizeof(emdata)); @@ -1591,7 +1591,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ // send NACK 0x0 == invalid argument EmSend4bit(CARD_NACK_IV); } else { - uint8_t emdata[MAX_FRAME_SIZE]; + uint8_t emdata[MAX_FRAME_SIZE] = {0}; // first blocks of emu are header int start = block1 * 4 + MFU_DUMP_PREFIX_LENGTH; len = (block2 - block1 + 1) * 4; @@ -1675,7 +1675,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ // send NACK 0x0 == invalid argument EmSend4bit(CARD_NACK_IV); } else { - uint8_t cmd[3]; + uint8_t cmd[3] = {0,0,0}; cmd[0] = tearings[index]; AddCrc14A(cmd, sizeof(cmd) - 2); EmSendCmd(cmd, sizeof(cmd)); @@ -1712,7 +1712,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ LogTrace(receivedCmd, Uart.len, Uart.startTime * 16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime * 16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, true); p_response = NULL; } else if (receivedCmd[0] == MIFARE_ULEV1_AUTH && len == 7 && tagType == 7) { // NTAG / EV-1 - uint8_t pwd[4]; + uint8_t pwd[4] = {0,0,0,0}; emlGetMemBt(pwd, (pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(pwd)); if (g_dbglevel >= DBG_DEBUG) { Dbprintf("Reader sent password: "); @@ -1734,9 +1734,9 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ p_response = NULL; EmSend4bit(CARD_NACK_IV); } - p_response = &responses[RESP_INDEX_PACK]; + } else if (receivedCmd[0] == MIFARE_ULEV1_VCSL && len == 23 && tagType == 7) { - uint8_t cmd[3]; + uint8_t cmd[3] = {0,0,0}; emlGetMemBt(cmd, (pages - 2) * 4 + 1 + MFU_DUMP_PREFIX_LENGTH, 1); AddCrc14A(cmd, sizeof(cmd) - 2); EmSendCmd(cmd, sizeof(cmd)); From 276bd29da9faeab53eb729a2047e5feee777a751 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 3 Sep 2023 14:43:38 +0200 Subject: [PATCH 905/924] cleanup and fix shadowing var --- armsrc/iso14443a.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 5af71bef3..21393b206 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1276,21 +1276,15 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // EV1/NTAG, set PWD w AMIIBO algo if all zero. if (tagType == 7) { - uint8_t pwd[4]; - uint8_t gen_pwd[4]; - uint16_t start = (*pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH; - emlGetMemBt(pwd, start, sizeof(pwd)); + uint8_t pwd[4] = {0,0,0,0}; + uint8_t gen_pwd[4] = {0,0,0,0}; + emlGetMemBt(pwd, (*pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(pwd)); + emlGetMemBt(rPACK, (*pages) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(rPACK)); + Uint4byteToMemBe(gen_pwd, ul_ev1_pwdgenB(data)); if (memcmp(pwd, gen_pwd, sizeof(pwd)) == 0) { rPACK[0] = 0x80; rPACK[1] = 0x80; - } else { - uint16_t start = (*pages) * 4 + MFU_DUMP_PREFIX_LENGTH; - emlGetMemBt(rPACK, start, sizeof(rPACK)); - if (g_dbglevel >= DBG_DEBUG) { - Dbprintf("PACK loaded from memory: "); - Dbhexdump(4, rPACK, 0); - } } } From e5941bcf3af0af371dc3d725ab36bf438114280e Mon Sep 17 00:00:00 2001 From: Harry Sintonen Date: Tue, 5 Sep 2023 16:38:33 +0300 Subject: [PATCH 906/924] fix crc render position when data len is multiple of 16 --- client/src/cmdtrace.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index e71ca4445..9182608ae 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -655,11 +655,12 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (crcStatus == 0 || crcStatus == 1) { char *pos1 = line[(data_len - 2) / TRACE_MAX_HEX_BYTES]; - pos1 += (((data_len - 2) % TRACE_MAX_HEX_BYTES) * 4) - 1; + int delta = (data_len - 2) % TRACE_MAX_HEX_BYTES ? 1 : 0; + pos1 += (((data_len - 2) % TRACE_MAX_HEX_BYTES) * 4) - delta; - (*(pos1 + 6 + 1)) = '\0'; + (*(pos1 + 6 + delta)) = '\0'; - char *cb_str = str_dup(pos1 + 1); + char *cb_str = str_dup(pos1 + delta); if (g_session.supports_colors) { if (crcStatus == 0) { From cc846216d28b2bc9db44bdea1e78b21d90de27e2 Mon Sep 17 00:00:00 2001 From: Ernestas Kulik Date: Mon, 4 Sep 2023 20:10:58 +0300 Subject: [PATCH 907/924] dictionaries: Add keys for Vilnius public transit card --- client/dictionaries/mfc_default_keys.dic | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index b2d656969..421ab14ae 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2193,3 +2193,15 @@ DDDAA35A9749 # Mercator Pika Card, Slovenia 97D77FAE77D3 5AF445D2B87A +# +# Vilniečio/JUDU kortelė, Lithuania +# A +16901CB400BC +F0FE56621A42 +8C187E78EE9C +FE2A42E85CA8 +# B +6A6C80423226 +F4CE4AF888AE +307448829EBC +C2A0105EB028 From 9ddbdad8cb74f71300c1b982c558622f1494bf83 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 6 Sep 2023 10:59:21 +0200 Subject: [PATCH 908/924] added keys from #2019 unknown if they are static --- client/dictionaries/mfc_default_keys.dic | 77 +++++++++++++++--------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 421ab14ae..088ab80d0 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -1829,6 +1829,37 @@ E19504C39461 FA1FBB3F0F1F FF16014FEFC7 # +# +# Food GEM +6686FADE5566 +# +# Data from Discord, French pool +9B7C25052FC3 +494446555455 +# +# Data from Discord, seems to be related to ASSA +427553754D47 +# Keys found on Edith Cowan University Smart Riders +9A677289564D +186C59E6AFC9 +DDDAA35A9749 +9D0D0A829F49 +# Mercator Pika Card, Slovenia +97D77FAE77D3 +5AF445D2B87A +# +# Vilniečio/JUDU kortelė, Lithuania +# A +16901CB400BC +F0FE56621A42 +8C187E78EE9C +FE2A42E85CA8 +# B +6A6C80423226 +F4CE4AF888AE +307448829EBC +C2A0105EB028 +# # Keys from Flipper Zero Community # Last update: Aug 13, 2022 # @@ -2175,33 +2206,19 @@ D201DBB6AB6E 09074A146605 151F3E85EC46 # -# -# Food GEM -6686FADE5566 -# -# Data from Discord, French pool -9B7C25052FC3 -494446555455 -# -# Data from Discord, seems to be related to ASSA -427553754D47 -# Keys found on Edith Cowan University Smart Riders -9A677289564D -186C59E6AFC9 -DDDAA35A9749 -9D0D0A829F49 -# Mercator Pika Card, Slovenia -97D77FAE77D3 -5AF445D2B87A -# -# Vilniečio/JUDU kortelė, Lithuania -# A -16901CB400BC -F0FE56621A42 -8C187E78EE9C -FE2A42E85CA8 -# B -6A6C80423226 -F4CE4AF888AE -307448829EBC -C2A0105EB028 +# Travelodge by Wyndham Berkeley +0000FFFFFFFF +4663ACD2FFFF +EDC317193709 +# Hotel Santa Cruz +75FAB77E2E5B +# saflok brand HOTEL key +32F093536677 +# A WaterFront Hotel in Oakland +3351916B5A77 +# Ballys (2018) +336E34CC2177 +# Random Hawaiian Hotel +A1670589B2AF +# SF Hotel (SoMa area) +2E0F00700000 From 5abae85edac425059919ae08679e3c54bd6a7f3d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 7 Sep 2023 12:54:46 +0200 Subject: [PATCH 909/924] legic sim should work now.... --- armsrc/legicrfsim.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index ac207ebaf..1f6accf4a 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -215,7 +215,6 @@ static void tx_ack(void) { // - receive the frame // - detect end of frame (last pause) static int32_t rx_frame(uint8_t *len) { - int32_t frame = 0; // add 2 SSP clock cycles (1 for tx and 1 for rx pipeline delay) // those will be subtracted at the end of the rx phase @@ -241,6 +240,7 @@ static int32_t rx_frame(uint8_t *len) { // backup ts for trace log uint32_t last_frame_start = last_frame_end; + int32_t frame = 0; // receive frame for (*len = 0; true; ++(*len)) { @@ -353,7 +353,7 @@ static int32_t setup_phase(legic_card_select_t *p_card) { // wait for iv int32_t iv = rx_frame(&len); if ((len != 7) || (iv < 0)) { - return PM3_ERFTRANS; + return PM3_ETIMEOUT; } // configure prng @@ -375,7 +375,7 @@ static int32_t setup_phase(legic_card_select_t *p_card) { // wait for ack int32_t ack = rx_frame(&len); if ((len != 6) || (ack < 0)) { - return PM3_ERFTRANS; + return PM3_ETIMEOUT; } // validate data @@ -464,24 +464,23 @@ void LegicRfSimulate(uint8_t tagtype, bool send_reply) { // configure ARM and FPGA init_tag(); - int res = PM3_SUCCESS; + int res = init_card(tagtype, &card); // verify command line input - if (init_card(tagtype, &card) != PM3_SUCCESS) { + if (res != PM3_SUCCESS) { DbpString("Unknown tagtype to simulate"); - res = PM3_ESOFT; goto OUT; } LED_A_ON(); - Dbprintf("Legic Prime, simulating uid... " _YELLOW_("%02X%02X%02X%02X"), legic_mem[0], legic_mem[1], legic_mem[2], legic_mem[3]); + Dbprintf("Legic Prime, simulating MCD... " _YELLOW_("%02X") " MSN... " _YELLOW_("%02X%02X%02X"), legic_mem[0], legic_mem[1], legic_mem[2], legic_mem[3]); uint16_t counter = 0; while (BUTTON_PRESS() == false) { WDT_HIT(); - if (counter >= 1000) { + if (counter >= 2000) { if (data_available()) { res = PM3_EOPABORTED; goto OUT; @@ -501,7 +500,7 @@ void LegicRfSimulate(uint8_t tagtype, bool send_reply) { } // connection is established, process commands until one fails - while (connected_phase(&card) != PM3_SUCCESS) { + while (connected_phase(&card) == PM3_SUCCESS) { WDT_HIT(); } } @@ -512,14 +511,16 @@ OUT: Dbprintf("Emulator stopped. Trace length... " _YELLOW_("%d"), BigBuf_get_traceLen()); } - if (res == PM3_EOPABORTED) + if (res == PM3_EOPABORTED) { DbpString("Aborted by user"); + } switch_off(); StopTicks(); - if (send_reply) + if (send_reply) { reply_ng(CMD_HF_LEGIC_SIMULATE, res, NULL, 0); + } BigBuf_free_keep_EM(); } From d74e264250f33d2f99e3abfdb030b586507a0b03 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 Sep 2023 20:13:18 +0200 Subject: [PATCH 910/924] style --- armsrc/fpgaloader.c | 2 +- armsrc/iso14443a.c | 10 ++++----- armsrc/iso14443b.c | 12 +++++------ armsrc/iso15693.c | 4 ++-- client/src/cmdhf14b.c | 2 +- client/src/cmdlft55xx.c | 48 ++++++++++++++++++++--------------------- doc/commands.json | 4 ++-- fpga/hi_flite.v | 2 +- include/iso14b.h | 2 +- 9 files changed, 43 insertions(+), 43 deletions(-) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index fefc16029..ccc47bcde 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -162,7 +162,7 @@ void FpgaSetupSsc(uint16_t fpga_mode) { // 8, 16 or 32 bits per transfer, no loopback, MSB first, 1 transfer per sync // pulse, no output sync - if (((fpga_mode & FPGA_MAJOR_MODE_MASK) == FPGA_MAJOR_MODE_HF_READER ) && + if (((fpga_mode & FPGA_MAJOR_MODE_MASK) == FPGA_MAJOR_MODE_HF_READER) && (FpgaGetCurrent() == FPGA_BITSTREAM_HF || FpgaGetCurrent() == FPGA_BITSTREAM_HF_15)) { AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(16) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); } else { diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 21393b206..410a83308 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1276,8 +1276,8 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // EV1/NTAG, set PWD w AMIIBO algo if all zero. if (tagType == 7) { - uint8_t pwd[4] = {0,0,0,0}; - uint8_t gen_pwd[4] = {0,0,0,0}; + uint8_t pwd[4] = {0, 0, 0, 0}; + uint8_t gen_pwd[4] = {0, 0, 0, 0}; emlGetMemBt(pwd, (*pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(pwd)); emlGetMemBt(rPACK, (*pages) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(rPACK)); @@ -1669,7 +1669,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ // send NACK 0x0 == invalid argument EmSend4bit(CARD_NACK_IV); } else { - uint8_t cmd[3] = {0,0,0}; + uint8_t cmd[3] = {0, 0, 0}; cmd[0] = tearings[index]; AddCrc14A(cmd, sizeof(cmd) - 2); EmSendCmd(cmd, sizeof(cmd)); @@ -1706,7 +1706,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ LogTrace(receivedCmd, Uart.len, Uart.startTime * 16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime * 16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, true); p_response = NULL; } else if (receivedCmd[0] == MIFARE_ULEV1_AUTH && len == 7 && tagType == 7) { // NTAG / EV-1 - uint8_t pwd[4] = {0,0,0,0}; + uint8_t pwd[4] = {0, 0, 0, 0}; emlGetMemBt(pwd, (pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(pwd)); if (g_dbglevel >= DBG_DEBUG) { Dbprintf("Reader sent password: "); @@ -1730,7 +1730,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint16_t flags, uint8_t *data, uint8_ } } else if (receivedCmd[0] == MIFARE_ULEV1_VCSL && len == 23 && tagType == 7) { - uint8_t cmd[3] = {0,0,0}; + uint8_t cmd[3] = {0, 0, 0}; emlGetMemBt(cmd, (pages - 2) * 4 + 1 + MFU_DUMP_PREFIX_LENGTH, 1); AddCrc14A(cmd, sizeof(cmd) - 2); EmSendCmd(cmd, sizeof(cmd)); diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index c2516c36a..db20119d2 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -45,7 +45,7 @@ * 1 / 3 390 000 = 294.98 nano seconds ( 0.2949 µs ) * * 1 ETU = 9.4395 µs = 32 SSP_CLK = 128 FC -* 1 SSP_CLK = 4 FC +* 1 SSP_CLK = 4 FC * 1 µs 3 SSP_CLK about 14 FC * PROBLEM 1. * ---------- @@ -1409,9 +1409,9 @@ static void TransmitFor14443b_AsReader(uint32_t *start_time) { #ifdef RDV4 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4); -#else +#else FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD); -#endif +#endif // TR2 minimum 14 ETUs if (*start_time < ISO14B_TR0) { @@ -1596,7 +1596,7 @@ int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, void // SSP_CLK = 4833 µS * 3.39 = 16384 - int len = Get14443bAnswerFromTag(rxdata, rxmaxlen, iso14b_timeout , &eof_time); + int len = Get14443bAnswerFromTag(rxdata, rxmaxlen, iso14b_timeout, &eof_time); FpgaDisableTracing(); uint8_t *data_bytes = (uint8_t *) rxdata; @@ -2107,9 +2107,9 @@ void iso14443b_setup(void) { // Signal field is on with the appropriate LED #ifdef RDV4 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4); -#else +#else FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD); -#endif +#endif SpinDelay(100); diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index 9a1f5be49..54aaa16bd 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -296,9 +296,9 @@ void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time, bool #ifdef RDV4 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | (shallow_mod ? FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4 : FPGA_HF_READER_MODE_SEND_FULL_MOD)); -#else +#else FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | (shallow_mod ? FPGA_HF_READER_MODE_SEND_SHALLOW_MOD : FPGA_HF_READER_MODE_SEND_FULL_MOD)); -#endif +#endif if (*start_time < DELAY_ARM_TO_TAG) { diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index ae3dd5002..1ba73e797 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -441,7 +441,7 @@ static bool get_14b_UID(uint8_t *d, iso14b_type_t *found_type) { if (resp.oldarg[0] == 0) { memcpy(d, resp.data.asBytes, sizeof(iso14b_card_select_t)); - iso14b_card_select_t *card = (iso14b_card_select_t*)d; + iso14b_card_select_t *card = (iso14b_card_select_t *)d; uint8_t empty[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; if (memcmp(card->uid, empty, card->uidlen) == 0) { return false; diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 75475d161..5033b5d54 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -4158,7 +4158,7 @@ static int CmdT55xxSniff(const char *Cmd) { usedPassword <<= 1; if (data[i] == '1') { usedPassword |= 1; - } + } } // Lock bit 34 @@ -4167,7 +4167,7 @@ static int CmdT55xxSniff(const char *Cmd) { blockData <<= 1; if (data[i] == '1') { blockData |= 1; - } + } } blockAddr = 0; @@ -4198,7 +4198,7 @@ static int CmdT55xxSniff(const char *Cmd) { blockData <<= 1; if (data[i] == '1') { blockData |= 1; - } + } } for (uint8_t i = 2; i <= 33; i++) { @@ -4239,7 +4239,7 @@ static int CmdT55xxSniff(const char *Cmd) { usedPassword <<= 1; if (data[i] == '1') { usedPassword |= 1; - } + } } blockData = 0; @@ -4247,7 +4247,7 @@ static int CmdT55xxSniff(const char *Cmd) { blockData <<= 1; if (data[i] == '1') { blockData |= 1; - } + } } blockAddr = 0; @@ -4255,7 +4255,7 @@ static int CmdT55xxSniff(const char *Cmd) { blockAddr <<= 1; if (data[i] == '1') { blockAddr |= 1; - } + } } have_data = true; @@ -4271,26 +4271,26 @@ static int CmdT55xxSniff(const char *Cmd) { if (have_data) { if (blockAddr == 7) { PrintAndLogEx(SUCCESS, "%-22s | "_GREEN_("%10s")" | "_YELLOW_("%8s")" | "_YELLOW_("%d")" | "_GREEN_("%d")" | %3d | %3d | %s" - , modeText - , pwdText - , dataText - , blockAddr - , page - , minWidth - , maxWidth - , data - ); + , modeText + , pwdText + , dataText + , blockAddr + , page + , minWidth + , maxWidth + , data + ); } else { PrintAndLogEx(SUCCESS, "%-22s | "_GREEN_("%10s")" | "_GREEN_("%8s")" | "_GREEN_("%d")" | "_GREEN_("%d")" | %3d | %3d | %s" - , modeText - , pwdText - , dataText - , blockAddr - , page - , minWidth - , maxWidth - , data - ); + , modeText + , pwdText + , dataText + , blockAddr + , page + , minWidth + , maxWidth + , data + ); } } } diff --git a/doc/commands.json b/doc/commands.json index 895998486..bbe8f8b93 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -8786,7 +8786,7 @@ "-1, --ht1 Card type Hitag 1", "-2, --ht2 Card type Hitag 2", "-s, --hts Card type Hitag S", - "-m, --htm Card type Hitag \u00ce\u00bc" + "-m, --htm Card type Hitag \u03bc" ], "usage": "lf hitag eload [-h12sm] -f " }, @@ -11837,6 +11837,6 @@ "metadata": { "commands_extracted": 686, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-08-24T05:14:06" + "extracted_on": "2023-09-07T18:12:46" } } \ No newline at end of file diff --git a/fpga/hi_flite.v b/fpga/hi_flite.v index d93d67d21..8346e49f2 100644 --- a/fpga/hi_flite.v +++ b/fpga/hi_flite.v @@ -296,7 +296,7 @@ begin mid <= 8'd129; else if (adc_d < curminthres) mid <= 8'd127; - else + else begin if (after_hysteresis) begin diff --git a/include/iso14b.h b/include/iso14b.h index 10995eba0..e809ef2c0 100644 --- a/include/iso14b.h +++ b/include/iso14b.h @@ -69,7 +69,7 @@ typedef struct { #define SSP_TO_US(x) ( (int32_t)((x) / 3.39) ) #define HF14_ETU_TO_SSP(x) ((x) << 5) // 1 ETU = 32 SSP -#define HF14_SSP_TO_ETU(x) ((x) >> 5) // +#define HF14_SSP_TO_ETU(x) ((x) >> 5) // #define HF14_ETU_TO_US(x) ( (float)((x) * 9.4396) ) #define HF14_ETU_TO_US_2(x) ( (int32_t)( ((x) * 9439600) / 1000000) ) From d97f417ee642b547ab1daa65c9e2861d23fd0ca1 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 Sep 2023 21:00:07 +0200 Subject: [PATCH 911/924] Fix clang warnings on increasing alignment requirements --- client/src/cmdhfmfhard.c | 3 ++- client/src/flash.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 9b4cf4858..713a658e9 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -406,7 +406,8 @@ static void init_bitflip_bitarrays(void) { exit(5); } - uint32_t count = ((uint32_t *)uncompressed_data)[0]; + uint32_t count; + memcpy(&count, uncompressed_data, sizeof(uint32_t)); if ((float)count / (1 << 24) < IGNORE_BITFLIP_THRESHOLD) { uint32_t *bitset = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1 << 19)); diff --git a/client/src/flash.c b/client/src/flash.c index b1f4a28c9..aed71f805 100644 --- a/client/src/flash.c +++ b/client/src/flash.c @@ -350,7 +350,8 @@ int flash_load(flash_file_t *ctx, bool force) { } if (strcmp(((char *)shstr) + shdrs[i].sh_name, ".bootphase1") == 0) { - uint32_t offset = *(uint32_t *)(ctx->elf + le32(shdrs[i].sh_offset) + le32(shdrs[i].sh_size) - 4); + uint32_t offset; + memcpy(&offset, ctx->elf + le32(shdrs[i].sh_offset) + le32(shdrs[i].sh_size) - 4, sizeof(uint32_t)); if (offset >= le32(shdrs[i].sh_addr)) { offset -= le32(shdrs[i].sh_addr); if (offset < le32(shdrs[i].sh_size)) { From 3aeb5c493fe4622425011c4d3040c180197b7cf0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 Sep 2023 22:28:37 +0200 Subject: [PATCH 912/924] fix a few cppcheck warnings --- armsrc/Standalone/hf_cardhopper.c | 8 +++--- armsrc/iso14443a.c | 4 +-- armsrc/mifaresim.c | 2 +- .../deps/hardnested/hardnested_bruteforce.c | 7 ++--- client/src/cmddata.c | 7 ++--- client/src/cmdhflist.c | 4 +-- client/src/cmdhfvas.c | 26 +++++++++---------- client/src/emv/cmdemv.c | 2 +- client/src/proxmark3.c | 4 +-- common/lfdemod.c | 2 +- tools/hitag2crack/crack3/ht2crack3.c | 15 ++++++----- tools/mf_nonce_brute/mf_nonce_brute.c | 2 +- tools/mf_nonce_brute/mf_trace_brute.c | 2 +- 13 files changed, 44 insertions(+), 41 deletions(-) diff --git a/armsrc/Standalone/hf_cardhopper.c b/armsrc/Standalone/hf_cardhopper.c index cfad35605..0a154f66b 100644 --- a/armsrc/Standalone/hf_cardhopper.c +++ b/armsrc/Standalone/hf_cardhopper.c @@ -275,16 +275,16 @@ static void cook_ats(packet_t *ats, uint8_t fwi, uint8_t sfgi) { ats->dat[0] = 0x04; ats->dat[1] = 0x78; ats->dat[2] = 0x77; - ats->dat[3] = 0x80; + // ats->dat[3] = 0x80; } else if (ats->len == 2) { ats->len = 4; ats->dat[0] = 0x04; ats->dat[2] = 0x77; - ats->dat[3] = 0x80; + // ats->dat[3] = 0x80; } else if (ats->len == 3) { ats->len = 4; ats->dat[0] = 0x04; - ats->dat[3] = 0x80; + // ats->dat[3] = 0x80; } // Set the SFGI as well as the FWI - needed for some older readers (firmware revs?) @@ -293,7 +293,7 @@ static void cook_ats(packet_t *ats, uint8_t fwi, uint8_t sfgi) { } -static bool try_use_canned_response(uint8_t *dat, int len, tag_response_info_t *canned) { +static bool try_use_canned_response(const uint8_t *dat, int len, tag_response_info_t *canned) { if ((dat[0] == ISO14443A_CMD_REQA || dat[0] == ISO14443A_CMD_WUPA) && len == 1) { EmSendPrecompiledCmd(canned + RESP_INDEX_ATQA); return true; diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 410a83308..346669398 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -2529,7 +2529,7 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, iso14a_polling_parameters_t bool first_try = true; uint32_t retry_timeout = WUPA_RETRY_TIMEOUT * polling_parameters->frame_count + polling_parameters->extra_timeout; - uint32_t start_time; + uint32_t start_time = 0; int len; uint8_t current_frame = 0; @@ -2584,7 +2584,7 @@ int iso14443a_select_cardEx(uint8_t *uid_ptr, iso14a_card_select_t *p_card, uint uint8_t resp[MAX_FRAME_SIZE] = {0}; // theoretically. A usual RATS will be much smaller uint8_t resp_par[MAX_PARITY_SIZE] = {0}; - uint8_t sak; // cascade uid + uint8_t sak = 0; // cascade uid bool do_cascade = 1; int cascade_level = 0; diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index a44220209..eddb59dc0 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -523,7 +523,7 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 uint8_t rAUTH_NT_keystream[4]; uint32_t nonce = 0; - tUart14a *uart = GetUart14a(); + const tUart14a *uart = GetUart14a(); // free eventually allocated BigBuf memory but keep Emulator Memory BigBuf_free_keep_EM(); diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index e4b203f4d..f55d8885a 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -304,12 +304,13 @@ static bool ensure_buckets_alloc(size_t need_buckets) { while (need_buckets > alloc_sz) { alloc_sz *= 2; } - - buckets = realloc(buckets, sizeof(statelist_t *) * alloc_sz); - if (buckets == NULL) { + statelist_t **new_buckets = realloc(buckets, sizeof(statelist_t *) * alloc_sz); + if (new_buckets == NULL) { + free(buckets); buckets_allocated = 0; return false; } + buckets = new_buckets; memset(buckets + buckets_allocated, 0, (alloc_sz - buckets_allocated) * sizeof(statelist_t *)); buckets_allocated = alloc_sz; } diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 4c8200ee6..6eb3fcb85 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -2224,7 +2224,7 @@ int CmdNorm(const char *Cmd) { if (g_GraphBuffer[i] < min) min = g_GraphBuffer[i]; } - if (max != min) { + if ((g_GraphTraceLen > 10) && (max != min)) { for (uint32_t i = 0; i < g_GraphTraceLen; ++i) { g_GraphBuffer[i] = ((long)(g_GraphBuffer[i] - ((max + min) / 2)) * 256) / (max - min); //marshmelow: adjusted *1000 to *256 to make +/- 128 so demod commands still work @@ -3218,12 +3218,12 @@ static int CmdNumCon(const char *Cmd) { int hlen = 256; char hex[256]; memset(hex, 0, sizeof(hex)); - res = CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)hex, sizeof(hex), &hlen); + res |= CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)hex, sizeof(hex), &hlen); int blen = 256; char bin[256]; memset(bin, 0, sizeof(bin)); - res = CLIParamStrToBuf(arg_get_str(ctx, 3), (uint8_t *)bin, sizeof(bin), &blen); + res |= CLIParamStrToBuf(arg_get_str(ctx, 3), (uint8_t *)bin, sizeof(bin), &blen); bool shall_invert = arg_get_lit(ctx, 4); CLIParserFree(ctx); @@ -3236,6 +3236,7 @@ static int CmdNumCon(const char *Cmd) { // results for MPI actions bool ret = false; + (void) ret; // container of big number mbedtls_mpi N; diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 8e605b91f..bf67a2b0b 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -1362,8 +1362,8 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { if (data_size > 2) { uint16_t uBlockNum = MemLeToUint2byte(data) ; uint8_t uQty = data[2] ; - if (uQty != 1) { - snprintf(exp, size, "READ %s(%u-%u) %s_%s", encrypted, uBlockNum, uBlockNum + uQty - 1, responseMaced, commandMaced); + if (uQty > 1) { + snprintf(exp, size, "READ %s(%u-%i) %s_%s", encrypted, uBlockNum, uBlockNum + uQty - 1, responseMaced, commandMaced); } else { snprintf(exp, size, "READ %s(%u) %s_%s", encrypted, uBlockNum, responseMaced, commandMaced); } diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index 9d04b7477..4e4a305e5 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -28,8 +28,8 @@ #include "util.h" #include "util_posix.h" #include "iso7816/iso7816core.h" -#include "stddef.h" -#include "stdbool.h" +#include +#include #include "mifare.h" #include #include @@ -59,10 +59,10 @@ uint8_t aid[] = { 0x4f, 0x53, 0x45, 0x2e, 0x56, 0x41, 0x53, 0x2e, 0x30, 0x31 }; uint8_t getVasUrlOnlyP2 = 0x00; uint8_t getVasFullReqP2 = 0x01; -static int ParseSelectVASResponse(uint8_t *response, size_t resLen, bool verbose) { +static int ParseSelectVASResponse(const uint8_t *response, size_t resLen, bool verbose) { struct tlvdb *tlvRoot = tlvdb_parse_multi(response, resLen); - struct tlvdb *versionTlv = tlvdb_find_full(tlvRoot, 0x9F21); + const struct tlvdb *versionTlv = tlvdb_find_full(tlvRoot, 0x9F21); if (versionTlv == NULL) { tlvdb_free(tlvRoot); return PM3_ECARDEXCHANGE; @@ -80,7 +80,7 @@ static int ParseSelectVASResponse(uint8_t *response, size_t resLen, bool verbose return PM3_ECARDEXCHANGE; } - struct tlvdb *capabilitiesTlv = tlvdb_find_full(tlvRoot, 0x9F23); + const struct tlvdb *capabilitiesTlv = tlvdb_find_full(tlvRoot, 0x9F23); if (capabilitiesTlv == NULL) { tlvdb_free(tlvRoot); return PM3_ECARDEXCHANGE; @@ -99,7 +99,7 @@ static int ParseSelectVASResponse(uint8_t *response, size_t resLen, bool verbose return PM3_SUCCESS; } -static int CreateGetVASDataCommand(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t *out, int *outLen) { +static int CreateGetVASDataCommand(const uint8_t *pidHash, const char *url, size_t urlLen, uint8_t *out, int *outLen) { if (pidHash == NULL && url == NULL) { PrintAndLogEx(FAILED, "Must provide a Pass Type ID or a URL"); return PM3_EINVARG; @@ -154,10 +154,10 @@ static int CreateGetVASDataCommand(uint8_t *pidHash, const char *url, size_t url return PM3_SUCCESS; } -static int ParseGetVASDataResponse(uint8_t *res, size_t resLen, uint8_t *cryptogram, size_t *cryptogramLen) { +static int ParseGetVASDataResponse(const uint8_t *res, size_t resLen, uint8_t *cryptogram, size_t *cryptogramLen) { struct tlvdb *tlvRoot = tlvdb_parse_multi(res, resLen); - struct tlvdb *cryptogramTlvdb = tlvdb_find_full(tlvRoot, 0x9F27); + const struct tlvdb *cryptogramTlvdb = tlvdb_find_full(tlvRoot, 0x9F27); if (cryptogramTlvdb == NULL) { tlvdb_free(tlvRoot); return PM3_ECARDEXCHANGE; @@ -171,10 +171,10 @@ static int ParseGetVASDataResponse(uint8_t *res, size_t resLen, uint8_t *cryptog return PM3_SUCCESS; } -static int LoadReaderPrivateKey(uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair *privKey) { +static int LoadReaderPrivateKey(const uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair *privKey) { struct tlvdb *derRoot = tlvdb_parse_multi(buf, bufLen); - struct tlvdb *privkeyTlvdb = tlvdb_find_full(derRoot, 0x04); + const struct tlvdb *privkeyTlvdb = tlvdb_find_full(derRoot, 0x04); if (privkeyTlvdb == NULL) { tlvdb_free(derRoot); return PM3_EINVARG; @@ -187,7 +187,7 @@ static int LoadReaderPrivateKey(uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair return PM3_EINVARG; } - struct tlvdb *pubkeyCoordsTlvdb = tlvdb_find_full(derRoot, 0x03); + const struct tlvdb *pubkeyCoordsTlvdb = tlvdb_find_full(derRoot, 0x03); if (pubkeyCoordsTlvdb == NULL) { tlvdb_free(derRoot); PrintAndLogEx(FAILED, "Private key file should include public key component"); @@ -229,7 +229,7 @@ static int GetPrivateKeyHint(mbedtls_ecp_keypair *privKey, uint8_t *keyHint) { return PM3_SUCCESS; } -static int LoadMobileEphemeralKey(uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKey) { +static int LoadMobileEphemeralKey(const uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKey) { uint8_t compressedEcKey[33] = {0}; compressedEcKey[0] = 0x02; memcpy(compressedEcKey + 1, xcoordBuf, 32); @@ -249,7 +249,7 @@ static int LoadMobileEphemeralKey(uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKe static int internalVasDecrypt(uint8_t *cipherText, size_t cipherTextLen, uint8_t *sharedSecret, uint8_t *ansiSharedInfo, size_t ansiSharedInfoLen, - uint8_t *gcmAad, size_t gcmAadLen, uint8_t *out, size_t *outLen) { + const uint8_t *gcmAad, size_t gcmAadLen, uint8_t *out, size_t *outLen) { uint8_t key[32] = {0}; if (ansi_x963_sha256(sharedSecret, 32, ansiSharedInfo, ansiSharedInfoLen, sizeof(key), key)) { PrintAndLogEx(FAILED, "ANSI X9.63 key derivation failed"); diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index c322f6406..5462f6eed 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -2646,7 +2646,7 @@ static int CmdEMVReader(const char *Cmd) { res = EMVSelectPSE(channel, true, true, 2, buf, sizeof(buf), &len, &sw); // search PSE / PPSE - res = EMVSearchPSE(channel, false, true, psenum, false, tlvSelect); + res |= EMVSearchPSE(channel, false, true, psenum, false, tlvSelect); if (res) { // EMV SEARCH with AID list DropFieldEx(channel); diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 3e924a1c7..a91f74179 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -606,7 +606,7 @@ static void show_help(bool showFullHelp, char *exec_name) { } } -static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[FLASH_MAX_FILES], bool can_write_bl, bool force) { +static int flash_pm3(char *serial_port_name, uint8_t num_files, const char *filenames[FLASH_MAX_FILES], bool can_write_bl, bool force) { int ret = PM3_EUNDEF; flash_file_t files[FLASH_MAX_FILES]; @@ -756,7 +756,7 @@ int main(int argc, char *argv[]) { bool flash_force = false; bool debug_mode_forced = false; int flash_num_files = 0; - char *flash_filenames[FLASH_MAX_FILES]; + const char *flash_filenames[FLASH_MAX_FILES]; // color management: // 1. default = no color diff --git a/common/lfdemod.c b/common/lfdemod.c index f7f734eb4..9ed6f4e28 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -1025,7 +1025,7 @@ int DetectNRZClock(uint8_t *dest, size_t size, int clock, size_t *clockStartIdx) } uint8_t best = 0; - for (int m = ARRAYLEN(peaksdet); m > 0; m--) { + for (int m = ARRAYLEN(peaksdet) - 1; m >= 0; m--) { if ((peaksdet[m] >= (peaksdet[best] - 1)) && (peaksdet[m] <= peaksdet[best] + 1) && lowestTransition) { if (clk[m] > (lowestTransition - (clk[m] / 8)) && clk[m] < (lowestTransition + (clk[m] / 8))) { best = m; diff --git a/tools/hitag2crack/crack3/ht2crack3.c b/tools/hitag2crack/crack3/ht2crack3.c index a81d33d40..f50ea6af4 100644 --- a/tools/hitag2crack/crack3/ht2crack3.c +++ b/tools/hitag2crack/crack3/ht2crack3.c @@ -386,13 +386,14 @@ int main(int argc, char *argv[]) { // debug mode only runs one thread from klowerstart tdata[0].klowerstart = klowerstart; crack(tdata); - } else { - // run full threaded mode - for (i = 0; i < NUM_THREADS; i++) { - if (pthread_create(&(threads[i]), NULL, crack, (void *)(tdata + i))) { - printf("cannot start thread %d\n", i); - exit(1); - } + return 0; + } + + // run full threaded mode + for (i = 0; i < NUM_THREADS; i++) { + if (pthread_create(&(threads[i]), NULL, crack, (void *)(tdata + i))) { + printf("cannot start thread %d\n", i); + exit(1); } } diff --git a/tools/mf_nonce_brute/mf_nonce_brute.c b/tools/mf_nonce_brute/mf_nonce_brute.c index 161f1c749..2491c502d 100644 --- a/tools/mf_nonce_brute/mf_nonce_brute.c +++ b/tools/mf_nonce_brute/mf_nonce_brute.c @@ -533,7 +533,7 @@ static int usage(void) { return 1; } -int main(int argc, char *argv[]) { +int main(int argc, const char *argv[]) { printf("\nMifare classic nested auth key recovery\n\n"); if (argc < 9) return usage(); diff --git a/tools/mf_nonce_brute/mf_trace_brute.c b/tools/mf_nonce_brute/mf_trace_brute.c index 1d8a7c6fb..c416c006f 100644 --- a/tools/mf_nonce_brute/mf_trace_brute.c +++ b/tools/mf_nonce_brute/mf_trace_brute.c @@ -247,7 +247,7 @@ static int usage(void) { return 1; } -int main(int argc, char *argv[]) { +int main(int argc, const char *argv[]) { printf("Mifare classic nested auth key recovery Phase 2\n"); if (argc < 3) return usage(); From 27edaa6d0cd8d3446688159a34524005e7519df6 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 Sep 2023 22:48:55 +0200 Subject: [PATCH 913/924] forgot fct declaration --- armsrc/Standalone/hf_cardhopper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/Standalone/hf_cardhopper.c b/armsrc/Standalone/hf_cardhopper.c index 0a154f66b..90742f4cf 100644 --- a/armsrc/Standalone/hf_cardhopper.c +++ b/armsrc/Standalone/hf_cardhopper.c @@ -54,7 +54,7 @@ static void select_card(void); static void become_card(void); static void prepare_emulation(uint8_t *, uint16_t *, uint8_t *, packet_t *); static void cook_ats(packet_t *, uint8_t, uint8_t); -static bool try_use_canned_response(uint8_t *, int, tag_response_info_t *); +static bool try_use_canned_response(const uint8_t *, int, tag_response_info_t *); static void reply_with_packet(packet_t *); static void read_packet(packet_t *); From cf16e7124437e49ddddc3b52f27029ba4fc038d8 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 7 Sep 2023 23:44:31 +0200 Subject: [PATCH 914/924] Fix cmake, stringop-overflow false positives are not specific to MINGW --- client/CMakeLists.txt | 22 +++++++++++----------- client/experimental_lib/CMakeLists.txt | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 5090dab63..eaee2f0f0 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -656,21 +656,21 @@ if (MINGW) set(CMAKE_C_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_CXX_FLAGS}") - # GCC 10 has issues with false positives on stringop-overflow, - # let's disable them for now (cf https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92955, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94335) - # beware these flags didn't exist for GCC < 7 - if(CMAKE_COMPILER_IS_GNUCXX) - execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) - if (GCC_VERSION VERSION_GREATER 10.0 OR GCC_VERSION VERSION_EQUAL 10.0) - set(CMAKE_C_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") - endif() - endif(CMAKE_COMPILER_IS_GNUCXX) - # link Winsock2 set(ADDITIONAL_LNK ws2_32 ${ADDITIONAL_LNK}) endif (MINGW) +# GCC 10 has issues with false positives on stringop-overflow, +# let's disable them for now (cf https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92955, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94335) +# beware these flags didn't exist for GCC < 7 +if(CMAKE_COMPILER_IS_GNUCXX) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (GCC_VERSION VERSION_GREATER 10.0 OR GCC_VERSION VERSION_EQUAL 10.0) + set(CMAKE_C_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") + endif() +endif(CMAKE_COMPILER_IS_GNUCXX) + target_include_directories(proxmark3 PRIVATE ${PM3_ROOT}/common ${PM3_ROOT}/common_fpga diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index f08ccdd6c..a5caeb014 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -656,19 +656,19 @@ if (MINGW) set(CMAKE_C_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_CXX_FLAGS}") - # GCC 10 has issues with false positives on stringop-overflow, - # let's disable them for now (cf https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92955, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94335) - # beware these flags didn't exist for GCC < 7 - if(CMAKE_COMPILER_IS_GNUCXX) - execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) - if (GCC_VERSION VERSION_GREATER 10.0 OR GCC_VERSION VERSION_EQUAL 10.0) - set(CMAKE_C_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") - endif() - endif(CMAKE_COMPILER_IS_GNUCXX) - endif (MINGW) +# GCC 10 has issues with false positives on stringop-overflow, +# let's disable them for now (cf https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92955, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94335) +# beware these flags didn't exist for GCC < 7 +if(CMAKE_COMPILER_IS_GNUCXX) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (GCC_VERSION VERSION_GREATER 10.0 OR GCC_VERSION VERSION_EQUAL 10.0) + set(CMAKE_C_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") + endif() +endif(CMAKE_COMPILER_IS_GNUCXX) + target_include_directories(pm3rrg_rdv4 PRIVATE ${PM3_ROOT}/common ${PM3_ROOT}/common_fpga From 87bdbef851b7aa8398831a0987b28a68fc2e717c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 Sep 2023 11:06:18 +0200 Subject: [PATCH 915/924] pm3_tests: timings of slow executions and faster aes bruteforce --- tools/pm3_tests.sh | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 0c34360c6..479861b6d 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -196,11 +196,18 @@ function CheckExecute() { return $RESULT fi + start=$(date +%s) + TIMEINFO="" for I in $RETRY do RES=$(eval "$2") + end=$(date +%s) + delta=$(expr $end - $start) + if [ $delta -gt 2 ]; then + TIMEINFO=" ($delta s)" + fi if echo "$RES" | grep -E -q "$3"; then - echo -e "[ ${C_GREEN}OK${C_NC} ] ${C_OK}" + echo -e "[ ${C_GREEN}OK${C_NC} ] ${C_OK} $TIMEINFO" return $RESULT fi if [ ! $I == "e" ]; then echo "retry $I"; fi @@ -208,11 +215,11 @@ function CheckExecute() { RESULT=1 if $IGNOREFAILURE; then - echo -e "[ ${C_YELLOW}IGNORED${C_NC} ]" + echo -e "[ ${C_YELLOW}IGNORED${C_NC} ] $TIMEINFO" return 0 fi - echo -e "[ ${C_RED}FAIL${C_NC} ] ${C_FAIL}" + echo -e "[ ${C_RED}FAIL${C_NC} ] ${C_FAIL} $TIMEINFO" echo -e "Execution trace:\n$RES" return $RESULT } @@ -298,7 +305,7 @@ while true; do if $TESTALL || $TESTMFDAESBRUTE; then echo -e "\n${C_BLUE}Testing mfd_aes_brute:${C_NC} ${MFDASEBRUTEBIN:=./tools/mfd_aes_brute/mfd_aes_brute}" if ! CheckFileExist "mfd_aes_brute exists" "$MFDASEBRUTEBIN"; then break; fi - if ! CheckExecute "mfd_aes_brute test 1/2" "$MFDASEBRUTEBIN 1605394800 bb6aea729414a5b1eff7b16328ce37fd 82f5f498dbc29f7570102397a2e5ef2b6dc14a864f665b3c54d11765af81e95c" "key.................... .*261C07A23F2BC8262F69F10A5BDF3764"; then break; fi + if ! CheckExecute "mfd_aes_brute test 1/2" "$MFDASEBRUTEBIN 1629394800 bb6aea729414a5b1eff7b16328ce37fd 82f5f498dbc29f7570102397a2e5ef2b6dc14a864f665b3c54d11765af81e95c" "key.................... .*261C07A23F2BC8262F69F10A5BDF3764"; then break; fi if ! CheckExecute slow "mfd_aes_brute test 2/2" "$MFDASEBRUTEBIN 1546300800 3fda933e2953ca5e6cfbbf95d1b51ddf 97fe4b5de24188458d102959b888938c988e96fb98469ce7426f50f108eaa583" "key.................... .*E757178E13516A4F3171BC6EA85E165A"; then break; fi fi @@ -306,7 +313,7 @@ while true; do echo -e "\n${C_BLUE}Testing CryptoRF sma:${C_NC} ${CRYPTRFBRUTEBIN:=./tools/cryptorf/sma} ${CRYPTRF_MULTI_BRUTEBIN:=./tools/cryptorf/sma_multi}" if ! CheckFileExist "sma exists" "$CRYPTRFBRUTEBIN"; then break; fi if ! CheckFileExist "sma_multi exists" "$CRYPTRF_MULTI_BRUTEBIN"; then break; fi - if ! CheckExecute slow "sma test" "$CRYPTRFBRUTEBIN ffffffffffffffff 1234567812345678 88c9d4466a501a87 dec2ee1b1c9276e9" "key found \[.*4f794a463ff81d81.*\]"; then break; fi +# if ! CheckExecute slow "sma test" "$CRYPTRFBRUTEBIN ffffffffffffffff 1234567812345678 88c9d4466a501a87 dec2ee1b1c9276e9" "key found \[.*4f794a463ff81d81.*\]"; then break; fi if ! CheckExecute slow "sma_multi test" "$CRYPTRF_MULTI_BRUTEBIN ffffffffffffffff 1234567812345678 88c9d4466a501a87 dec2ee1b1c9276e9" "key found \[.*4f794a463ff81d81.*\]"; then break; fi fi # hitag2crack not yet part of "all" From 7b5c35008903b5afa0faff74cc77724f5499f8fc Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 Sep 2023 15:46:49 +0200 Subject: [PATCH 916/924] fix Tumbleweed docker --- docker/opensuse-tumbleweed/Dockerfile | 3 +-- docker/opensuse-tumbleweed/README.md | 5 +++++ docker/opensuse-tumbleweed/run_tests.sh | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docker/opensuse-tumbleweed/Dockerfile b/docker/opensuse-tumbleweed/Dockerfile index 04aaff64c..8a18c7d43 100644 --- a/docker/opensuse-tumbleweed/Dockerfile +++ b/docker/opensuse-tumbleweed/Dockerfile @@ -8,8 +8,7 @@ RUN zypper --non-interactive install --no-recommends shadow sudo git patterns-de # zypper --gpg-auto-import-keys refresh && \ # zypper --non-interactive install cross-arm-none-eabi-gcc12 cross-arm-none-eabi-newlib -RUN zypper --non-interactive install cmake python3 python3-pip && \ - python3 -m pip install ansicolors sslcrypto +RUN zypper --non-interactive install cmake python311 python311-pip python311-virtualenv RUN zypper --non-interactive install ocl-icd-devel diff --git a/docker/opensuse-tumbleweed/README.md b/docker/opensuse-tumbleweed/README.md index bd55e0c9d..282d3f4f7 100644 --- a/docker/opensuse-tumbleweed/README.md +++ b/docker/opensuse-tumbleweed/README.md @@ -16,5 +16,10 @@ Or if you want to run single test, ``` sudo zypper refresh && sudo zypper --non-interactive update make clean; make -j +python3 -m venv /tmp/venv +source /tmp/venv/bin/activate +python3 -m pip install --use-pep517 pyaes +python3 -m pip install ansicolors sslcrypto tools/pm3_tests.sh --long +deactivate ``` diff --git a/docker/opensuse-tumbleweed/run_tests.sh b/docker/opensuse-tumbleweed/run_tests.sh index 9002131e9..bb613ffc0 100755 --- a/docker/opensuse-tumbleweed/run_tests.sh +++ b/docker/opensuse-tumbleweed/run_tests.sh @@ -5,4 +5,9 @@ # docker/opensuse-tumbleweed/run_tests.sh; sudo zypper refresh && sudo zypper --non-interactive update +python3 -m venv /tmp/venv +source /tmp/venv/bin/activate +python3 -m pip install --use-pep517 pyaes +python3 -m pip install ansicolors sslcrypto tools/release_tests.sh +deactivate From 032e4b832eb9bf836d2c8fc9036d54791a70f284 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 Sep 2023 20:32:23 +0200 Subject: [PATCH 917/924] spurious exec mode on .c file --- armsrc/Standalone/hf_14bsniff.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 armsrc/Standalone/hf_14bsniff.c diff --git a/armsrc/Standalone/hf_14bsniff.c b/armsrc/Standalone/hf_14bsniff.c old mode 100755 new mode 100644 From 5c1b802e71841668aa2ebab3d400f7b6cf75a2d0 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 8 Sep 2023 20:45:44 +0200 Subject: [PATCH 918/924] standalone doc --- armsrc/Standalone/hf_14asniff.c | 3 ++- armsrc/Standalone/hf_14bsniff.c | 15 +++++++++++++++ armsrc/Standalone/hf_15sniff.c | 3 ++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/armsrc/Standalone/hf_14asniff.c b/armsrc/Standalone/hf_14asniff.c index 041a0b6f0..dc0c0905c 100644 --- a/armsrc/Standalone/hf_14asniff.c +++ b/armsrc/Standalone/hf_14asniff.c @@ -43,7 +43,7 @@ * 1. mem spiffs dump -s hf_14asniff.trace -d hf_14asniff.trace * Copies trace data file from flash to your PC. * - * 2. trace load hf_14asniff.trace + * 2. trace load -f hf_14asniff.trace * Loads trace data from a file into PC-side buffers. * * 3. For ISO14a: trace list -t 14a -1 @@ -55,6 +55,7 @@ * the lab connected to PM3 client before taking it into the field. * * To delete the trace data from flash: + * mem spiffs remove -f hf_14asniff.trace * * Caveats / notes: * - Trace buffer will be cleared on starting stand-alone mode. Data in flash diff --git a/armsrc/Standalone/hf_14bsniff.c b/armsrc/Standalone/hf_14bsniff.c index d342afa93..d3adaeb23 100644 --- a/armsrc/Standalone/hf_14bsniff.c +++ b/armsrc/Standalone/hf_14bsniff.c @@ -14,9 +14,24 @@ * - LED3: sniffed reader command, turns off when finished sniffing tag command * - LED4: unmounting/sync'ing flash (normally < 100ms) * + * To retrieve trace data from flash: + * + * 1. mem spiffs dump -s hf_14bsniff.trace -d hf_14bsniff.trace + * Copies trace data file from flash to your PC. + * + * 2. trace load -f hf_14bsniff.trace + * Loads trace data from a file into PC-side buffers. + * + * 3. For ISO14a: trace list -t 14b -1 + * + * Lists trace data from buffer without requesting it from PM3. + * * This module emits debug strings during normal operation -- so try it out in * the lab connected to PM3 client before taking it into the field. * + * To delete the trace data from flash: + * mem spiffs remove -f hf_14bsniff.trace + * * Caveats / notes: * - Trace buffer will be cleared on starting stand-alone mode. * - This module will terminate if the trace buffer is full. diff --git a/armsrc/Standalone/hf_15sniff.c b/armsrc/Standalone/hf_15sniff.c index 24d068275..ad1d3f8b6 100644 --- a/armsrc/Standalone/hf_15sniff.c +++ b/armsrc/Standalone/hf_15sniff.c @@ -43,7 +43,7 @@ * 1. mem spiffs dump -s hf_15693sniff.trace -d hf_15693sniff.trace * Copies trace data file from flash to your PC. * - * 2. trace load hf_15693sniff.trace + * 2. trace load -f hf_15693sniff.trace * Loads trace data from a file into PC-side buffers. * * 3. For ISO15693: trace list -t 15 -1 @@ -54,6 +54,7 @@ * the lab connected to PM3 client before taking it into the field. * * To delete the trace data from flash: + * mem spiffs remove -f hf_15693sniff.trace * * Caveats / notes: * - Trace buffer will be cleared on starting stand-alone mode. Data in flash From 5a9819ad66265f79c10a1a2e5cf6669891c075d8 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 9 Sep 2023 09:35:08 +0200 Subject: [PATCH 919/924] text --- CHANGELOG.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6854aef6c..5a0eb1497 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,18 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + +## [Raccoon][2003-09-09] + - Changed text and adjust pm3_test case for mf_aes_brute (@doegox) + - Fix CPPChecker warnings (@doegox) + - Fix TubmleWeed docker setup (@doegox) + - Added default keys (@ernestask) (@craftbyte) + - Fixed MFU authentication to send PACK correctly (@shallax) + - Fixed list output when line has 16 bytes (@piru) + - Changed AIDlist w new entries (@kormax) - Swapped to OE1 for Shallow modulation on RDV4. Thanks to @gentilkiwi for testing (@d18c7db) - Changed iClass SIO and Legacy credential detection to be more reliable (@nvx) + - Add hf_cardhopper standalone mode for long-distance relay attacks (@startrekdude) - Added `hf iclass esetblk` - set iClass emulator memory block data (@nvx) - Added cryptorf regressiontests (@iceman1001) - Fixed `cryptorf/sma_multi` - local state used in multithread (@iceman1001) @@ -47,8 +57,6 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf_mf_luxeo_dump.lua` - now have list of keys to iterate (@iceman1001) - Fixed the timeout of TCP connections (@wh201906) - Changed the connection timeout configurable (@wh201906) - - Add hf_cardhopper standalone mode for long-distance relay attacks (@startrekdude) - - Fix MFU authentication to send PACK correctly (@shallax) ## [Seven.4.16717][2023-06-25] - Change `hf 14a info` - now identifes QL88 tags (@iceman1001) From 6ca0ce704afc400a9682f0ce7daff24c6857252c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 9 Sep 2023 11:00:00 +0200 Subject: [PATCH 920/924] Release v4.17140 - Raccoon --- Makefile.defs | 4 ++-- armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- client/CMakeLists.txt | 4 ++-- client/Makefile | 4 ++-- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 18 ++++++++-------- client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/experimental_lib/CMakeLists.txt | 2 +- client/src/proxmark3.c | 2 +- common/default_version_pm3.c | 29 +++++++------------------- common_arm/Makefile.common | 2 +- 18 files changed, 35 insertions(+), 50 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 76409a37d..874440a47 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -112,8 +112,8 @@ ifeq ($(DEBUG),1) DEFCFLAGS = -g -O0 -fstrict-aliasing -pipe DEFLDFLAGS = else - DEFCXXFLAGS = -Wall -Werror -O3 -pipe - DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe + DEFCXXFLAGS = -Wall -O3 -pipe + DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe DEFLDFLAGS = endif diff --git a/armsrc/Makefile b/armsrc/Makefile index d6ab2bfc4..407b0b174 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -184,7 +184,7 @@ showinfo: # version_pm3.c should be checked on every time fullimage.stage1.elf should be remade version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE $(info [-] CHECK $@) - $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index b6825530d..86c785cd1 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -56,7 +56,7 @@ OBJS = $(OBJDIR)/bootrom.s19 # version_pm3.c should be checked on every compilation version_pm3.c: default_version_pm3.c .FORCE $(info [=] CHECK $@) - $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ all: showinfo $(OBJS) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index eaee2f0f0..a71a2585d 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -397,7 +397,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) @@ -633,7 +633,7 @@ add_executable(proxmark3 ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +target_compile_options(proxmark3 PUBLIC -Wall -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1) add_dependencies(proxmark3 ncurses readline) diff --git a/client/Makefile b/client/Makefile index b63fdf329..0a0ca3c1b 100644 --- a/client/Makefile +++ b/client/Makefile @@ -415,7 +415,7 @@ endif PM3CFLAGS += -DHAVE_SNPRINTF -CXXFLAGS ?= -Wall -Werror -O3 +CXXFLAGS ?= -Wall -O3 CXXFLAGS += $(MYDEFS) $(MYCXXFLAGS) $(MYINCLUDES) PM3CXXFLAGS = $(CXXFLAGS) @@ -921,7 +921,7 @@ src/pm3_pywrap.c: pm3.i # version_pm3.c should be checked on every compilation src/version_pm3.c: default_version_pm3.c .FORCE $(info [=] CHECK $@) - $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index c946c0682..8c524c170 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -19,7 +19,7 @@ target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE m pm3rrg_rdv4_mbedtls) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE amiitool diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index fccae33b7..a85cc2374 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -9,5 +9,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index ec545e2a8..468ee4ef2 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -32,7 +32,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -47,7 +47,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -62,7 +62,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -77,7 +77,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -92,7 +92,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -116,7 +116,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM64_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_neon PRIVATE @@ -134,7 +134,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM32_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_neon BEFORE PRIVATE -mfpu=neon) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -155,7 +155,7 @@ add_library(pm3rrg_rdv4_hardnested STATIC hardnested/hardnested_bruteforce.c $ ${SIMD_TARGETS}) -target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested PRIVATE ../../common diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index c91a47047..42c701d5e 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -14,5 +14,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 12870342e..5cf33d724 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -52,5 +52,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 58b9aae23..35ee2c967 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -47,5 +47,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) target_include_directories(pm3rrg_rdv4_mbedtls INTERFACE ../../common/mbedtls) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index d7e3cfd8a..1040730f1 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 5a6abda25..c74618149 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index d2d6a5b2a..721873066 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index a5caeb014..216f13362 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -397,7 +397,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index a91f74179..6abc00b8e 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -42,7 +42,7 @@ static int mainret = PM3_ESOFT; #ifndef LIBPM3 #define BANNERMSG1 "" #define BANNERMSG2 " [ :coffee: ]" -#define BANNERMSG3 "" +#define BANNERMSG3 "Release v4.17140 - Raccoon" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version_pm3.c b/common/default_version_pm3.c index d93a7ef15..376b85de6 100644 --- a/common/default_version_pm3.c +++ b/common/default_version_pm3.c @@ -1,20 +1,5 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- #include "common.h" -/* This is the default version_pm3.c file that Makefile.common falls back to if sh is not available */ +/* Generated file, do not edit */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -23,10 +8,10 @@ const struct version_information_t SECTVERSINFO g_version_information = { VERSION_INFORMATION_MAGIC, - 1, /* version 1 */ - 0, /* version information not present */ - 2, /* cleanliness couldn't be determined */ - "Iceman/master/unknown", - "1970-01-01 00:00:00", - "no sha256" + 1, + 1, + 2, + "Iceman/master/v4.17140", + "2023-09-09 11:00:00", + "5901f2664" }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 18d931b46..3c01c9a2e 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -49,7 +49,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits From f9877f79de6ebe6ef57fcb3a52d31e2858d9276f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 9 Sep 2023 11:00:00 +0200 Subject: [PATCH 921/924] Revert "Release v4.17140 - Raccoon" This reverts commit 6ca0ce704afc400a9682f0ce7daff24c6857252c. --- Makefile.defs | 4 ++-- armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- client/CMakeLists.txt | 4 ++-- client/Makefile | 4 ++-- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 18 ++++++++-------- client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/experimental_lib/CMakeLists.txt | 2 +- client/src/proxmark3.c | 2 +- common/default_version_pm3.c | 29 +++++++++++++++++++------- common_arm/Makefile.common | 2 +- 18 files changed, 50 insertions(+), 35 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 874440a47..76409a37d 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -112,8 +112,8 @@ ifeq ($(DEBUG),1) DEFCFLAGS = -g -O0 -fstrict-aliasing -pipe DEFLDFLAGS = else - DEFCXXFLAGS = -Wall -O3 -pipe - DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe + DEFCXXFLAGS = -Wall -Werror -O3 -pipe + DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe DEFLDFLAGS = endif diff --git a/armsrc/Makefile b/armsrc/Makefile index 407b0b174..d6ab2bfc4 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -184,7 +184,7 @@ showinfo: # version_pm3.c should be checked on every time fullimage.stage1.elf should be remade version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE $(info [-] CHECK $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index 86c785cd1..b6825530d 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -56,7 +56,7 @@ OBJS = $(OBJDIR)/bootrom.s19 # version_pm3.c should be checked on every compilation version_pm3.c: default_version_pm3.c .FORCE $(info [=] CHECK $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ all: showinfo $(OBJS) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a71a2585d..eaee2f0f0 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -397,7 +397,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) @@ -633,7 +633,7 @@ add_executable(proxmark3 ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -O3) +target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1) add_dependencies(proxmark3 ncurses readline) diff --git a/client/Makefile b/client/Makefile index 0a0ca3c1b..b63fdf329 100644 --- a/client/Makefile +++ b/client/Makefile @@ -415,7 +415,7 @@ endif PM3CFLAGS += -DHAVE_SNPRINTF -CXXFLAGS ?= -Wall -O3 +CXXFLAGS ?= -Wall -Werror -O3 CXXFLAGS += $(MYDEFS) $(MYCXXFLAGS) $(MYINCLUDES) PM3CXXFLAGS = $(CXXFLAGS) @@ -921,7 +921,7 @@ src/pm3_pywrap.c: pm3.i # version_pm3.c should be checked on every compilation src/version_pm3.c: default_version_pm3.c .FORCE $(info [=] CHECK $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 8c524c170..c946c0682 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -19,7 +19,7 @@ target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE m pm3rrg_rdv4_mbedtls) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE amiitool diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index a85cc2374..fccae33b7 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -9,5 +9,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 468ee4ef2..ec545e2a8 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -32,7 +32,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -47,7 +47,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -62,7 +62,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -77,7 +77,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -92,7 +92,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -116,7 +116,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM64_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_neon PRIVATE @@ -134,7 +134,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM32_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_neon BEFORE PRIVATE -mfpu=neon) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -155,7 +155,7 @@ add_library(pm3rrg_rdv4_hardnested STATIC hardnested/hardnested_bruteforce.c $ ${SIMD_TARGETS}) -target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested PRIVATE ../../common diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 42c701d5e..c91a47047 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -14,5 +14,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 5cf33d724..12870342e 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -52,5 +52,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 35ee2c967..58b9aae23 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -47,5 +47,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) target_include_directories(pm3rrg_rdv4_mbedtls INTERFACE ../../common/mbedtls) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 1040730f1..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index c74618149..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index 721873066..d2d6a5b2a 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 216f13362..a5caeb014 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -397,7 +397,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 6abc00b8e..a91f74179 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -42,7 +42,7 @@ static int mainret = PM3_ESOFT; #ifndef LIBPM3 #define BANNERMSG1 "" #define BANNERMSG2 " [ :coffee: ]" -#define BANNERMSG3 "Release v4.17140 - Raccoon" +#define BANNERMSG3 "" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version_pm3.c b/common/default_version_pm3.c index 376b85de6..d93a7ef15 100644 --- a/common/default_version_pm3.c +++ b/common/default_version_pm3.c @@ -1,5 +1,20 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- #include "common.h" -/* Generated file, do not edit */ +/* This is the default version_pm3.c file that Makefile.common falls back to if sh is not available */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -8,10 +23,10 @@ const struct version_information_t SECTVERSINFO g_version_information = { VERSION_INFORMATION_MAGIC, - 1, - 1, - 2, - "Iceman/master/v4.17140", - "2023-09-09 11:00:00", - "5901f2664" + 1, /* version 1 */ + 0, /* version information not present */ + 2, /* cleanliness couldn't be determined */ + "Iceman/master/unknown", + "1970-01-01 00:00:00", + "no sha256" }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 3c01c9a2e..18d931b46 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -49,7 +49,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits From 8c72ef42e4b27066e886a99ed2eca35cf2ffe6ab Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 9 Sep 2023 11:02:14 +0200 Subject: [PATCH 922/924] text update release version --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a0eb1497..201f5166a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] -## [Raccoon][2003-09-09] +## [Raccoon.4.17140][2003-09-09] - Changed text and adjust pm3_test case for mf_aes_brute (@doegox) - Fix CPPChecker warnings (@doegox) - Fix TubmleWeed docker setup (@doegox) From cee33f7fe2d93702daac2c84d84ec80c1c0ccefd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 9 Sep 2023 11:20:32 +0200 Subject: [PATCH 923/924] wrong date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 201f5166a..1803239cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] -## [Raccoon.4.17140][2003-09-09] +## [Raccoon.4.17140][2023-09-09] - Changed text and adjust pm3_test case for mf_aes_brute (@doegox) - Fix CPPChecker warnings (@doegox) - Fix TubmleWeed docker setup (@doegox) From b59fad842b46464a001086b172953e747be89555 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 10 Sep 2023 10:25:51 +0200 Subject: [PATCH 924/924] reworked the decimal to hexadecimal converter. It now works. Thanks to @ATK for pointing out it was broken --- client/lualibs/utils.lua | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/client/lualibs/utils.lua b/client/lualibs/utils.lua index 00103d6b4..03862ac29 100644 --- a/client/lualibs/utils.lua +++ b/client/lualibs/utils.lua @@ -262,14 +262,19 @@ local Utils = -- -- Converts DECIMAL to HEX - ConvertDecToHex = function(IN) - local B,K,OUT,I,D = 16, "0123456789ABCDEF", "", 0 - while IN > 0 do - I = I+1 - IN, D = math.floor(IN/B), math.modf(IN, B) + 1 - OUT = string.sub(K, D, D)..OUT + ConvertDecToHex = function(decimal) + if decimal == 0 then + return "0" end - return OUT + + local B,DIGITS,hex = 16, "0123456789ABCDEF", "" + + while decimal > 0 do + local remainder = math.fmod(decimal, B) + hex = string.sub(DIGITS, remainder + 1, remainder + 1) .. hex + decimal = math.floor(decimal / B) + end + return hex end, --- -- Convert Byte array to string of hex

        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 b`uX+iKd&!;K0V?oKRw>O`Skm5Pmliqaj6pA literal 0 HcmV?d00001 From 6781dadc303b4850a96b5011f9880a8ca8487cd4 Mon Sep 17 00:00:00 2001 From: Anton Todorov Date: Sun, 6 Aug 2023 14:27:58 +0300 Subject: [PATCH 823/924] emv: display the transaction time as HH:MM:SS in the transaction log Signed-off-by: Anton Todorov --- client/src/emv/cmdemv.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 2282698d5..c322f6406 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -233,6 +233,11 @@ static int emv_parse_log(struct tlvdb *ttdb, const uint8_t *d, size_t n) { PrintAndLogEx(INFO, "%-30s... " _YELLOW_("20%02x-%02x-%02x"), s, d[pos], d[pos + 1], d[pos + 2]); } break; + case 0x9F21: + if (tpitem->len == 3) { + PrintAndLogEx(INFO, "%-30s... " _YELLOW_("%02x:%02x:%02x"), s, d[pos], d[pos + 1], d[pos + 2]); + } + break; default: PrintAndLogEx(INFO, "%-30s... " _YELLOW_("%s"), s, sprint_hex_inrow(d + pos, tpitem->len)); break; From 5e71621c692784ec99abd0612b8ac9db1d9cc46c Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 20:52:21 -0700 Subject: [PATCH 824/924] `const` improvement for BigBuf.h --- armsrc/BigBuf.c | 6 +++--- armsrc/BigBuf.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 29f270b80..b622e013b 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -233,7 +233,7 @@ uint32_t BigBuf_get_traceLen(void) { by 'hf list -t raw', alternatively 'hf list -t ' for protocol-specific annotation of commands/responses. **/ -bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, uint8_t *parity, bool reader2tag) { +bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, const uint8_t *parity, bool reader2tag) { if (tracing == false) { return false; } @@ -290,7 +290,7 @@ bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_ } // specific LogTrace function for ISO15693: the duration needs to be scaled because otherwise it won't fit into a uint16_t -bool LogTrace_ISO15693(const uint8_t *bytes, uint16_t len, uint32_t ts_start, uint32_t ts_end, uint8_t *parity, bool reader2tag) { +bool LogTrace_ISO15693(const uint8_t *bytes, uint16_t len, uint32_t ts_start, uint32_t ts_end, const uint8_t *parity, bool reader2tag) { uint32_t duration = ts_end - ts_start; duration /= 32; ts_end = ts_start + duration; @@ -306,7 +306,7 @@ bool RAMFUNC LogTraceBits(const uint8_t *btBytes, uint16_t bitLen, uint32_t time } // Emulator memory -uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length) { +uint8_t emlSet(const uint8_t *data, uint32_t offset, uint32_t length) { uint8_t *mem = BigBuf_get_EM_addr(); if (offset + length <= CARD_MEMORY_SIZE) { memcpy(mem + offset, data, length); diff --git a/armsrc/BigBuf.h b/armsrc/BigBuf.h index 81c2fbdfc..0938bd555 100644 --- a/armsrc/BigBuf.h +++ b/armsrc/BigBuf.h @@ -51,11 +51,11 @@ void set_tracing(bool enable); void set_tracelen(uint32_t value); bool get_tracing(void); -bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, uint8_t *parity, bool reader2tag); +bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, const uint8_t *parity, bool reader2tag); bool RAMFUNC LogTraceBits(const uint8_t *btBytes, uint16_t bitLen, uint32_t timestamp_start, uint32_t timestamp_end, bool reader2tag); -bool LogTrace_ISO15693(const uint8_t *bytes, uint16_t len, uint32_t ts_start, uint32_t ts_end, uint8_t *parity, bool reader2tag); +bool LogTrace_ISO15693(const uint8_t *bytes, uint16_t len, uint32_t ts_start, uint32_t ts_end, const uint8_t *parity, bool reader2tag); -uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length); +uint8_t emlSet(const uint8_t *data, uint32_t offset, uint32_t length); uint8_t emlGet(uint8_t *out, uint32_t offset, uint32_t length); typedef struct { From 5bd8058113dcc9f9b701f029fe35853f937a7274 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 21:03:36 -0700 Subject: [PATCH 825/924] More `const` enabled --- armsrc/cmd.c | 6 +++--- armsrc/cmd.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/armsrc/cmd.c b/armsrc/cmd.c index c179ed2a9..f2b432d33 100644 --- a/armsrc/cmd.c +++ b/armsrc/cmd.c @@ -26,7 +26,7 @@ bool g_reply_with_crc_on_fpc = true; bool g_reply_via_fpc = false; bool g_reply_via_usb = false; -int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) { +int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, const void *data, size_t len) { PacketResponseOLD txcmd = {CMD_UNKNOWN, {0, 0, 0}, {{0}}}; // for (size_t i = 0; i < sizeof(PacketResponseOLD); i++) @@ -42,7 +42,7 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d if (data && len) { len = MIN(len, PM3_CMD_DATA_SIZE); for (size_t i = 0; i < len; i++) { - txcmd.d.asBytes[i] = ((uint8_t *)data)[i]; + txcmd.d.asBytes[i] = ((const uint8_t *)data)[i]; } } @@ -135,7 +135,7 @@ int reply_ng(uint16_t cmd, int16_t status, const uint8_t *data, size_t len) { return reply_ng_internal(cmd, status, data, len, true); } -int reply_mix(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) { +int reply_mix(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, const void *data, size_t len) { int16_t status = PM3_SUCCESS; uint64_t arg[3] = {arg0, arg1, arg2}; if (len > PM3_CMD_DATA_SIZE - sizeof(arg)) { diff --git a/armsrc/cmd.h b/armsrc/cmd.h index b578db8e8..22a79ce16 100644 --- a/armsrc/cmd.h +++ b/armsrc/cmd.h @@ -27,9 +27,9 @@ extern bool g_reply_with_crc_on_fpc; extern bool g_reply_via_fpc; extern bool g_reply_via_usb; -int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len); +int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, const void *data, size_t len); int reply_ng(uint16_t cmd, int16_t status, const uint8_t *data, size_t len); -int reply_mix(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len); +int reply_mix(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, const void *data, size_t len); int receive_ng(PacketCommandNG *rx); #endif // _PROXMARK_CMD_H_ From 7801abf7a5dd119ae722677850947140d1a9b438 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 21:06:17 -0700 Subject: [PATCH 826/924] Localize effect of unused macro --- armsrc/dbprint.h | 28 ---------------------------- armsrc/usart.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/armsrc/dbprint.h b/armsrc/dbprint.h index b1a7753da..f22f965c5 100644 --- a/armsrc/dbprint.h +++ b/armsrc/dbprint.h @@ -22,34 +22,6 @@ #include "common.h" #include "ansi.h" -#define Dbprintf_usb(...) {\ - bool tmpfpc = g_reply_via_fpc;\ - bool tmpusb = g_reply_via_usb;\ - g_reply_via_fpc = false;\ - g_reply_via_usb = true;\ - Dbprintf(__VA_ARGS__);\ - g_reply_via_fpc = tmpfpc;\ - g_reply_via_usb = tmpusb;} - -#define Dbprintf_fpc(...) {\ - bool tmpfpc = g_reply_via_fpc;\ - bool tmpusb = g_reply_via_usb;\ - g_reply_via_fpc = true;\ - g_reply_via_usb = false;\ - Dbprintf(__VA_ARGS__);\ - g_reply_via_fpc = tmpfpc;\ - g_reply_via_usb = tmpusb;} - -#define Dbprintf_all(...) {\ - bool tmpfpc = g_reply_via_fpc;\ - bool tmpusb = g_reply_via_usb;\ - g_reply_via_fpc = true;\ - g_reply_via_usb = true;\ - Dbprintf(__VA_ARGS__);\ - g_reply_via_fpc = tmpfpc;\ - g_reply_via_usb = tmpusb;} - - void DbpString(const char *str); void DbpStringEx(uint32_t flags, const char *src, size_t srclen); void Dbprintf(const char *fmt, ...); diff --git a/armsrc/usart.c b/armsrc/usart.c index 915d4a445..a205acb03 100644 --- a/armsrc/usart.c +++ b/armsrc/usart.c @@ -18,6 +18,34 @@ #include "usart.h" #include "proxmark3_arm.h" +#define Dbprintf_usb(...) {\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = false;\ + g_reply_via_usb = true;\ + Dbprintf(__VA_ARGS__);\ + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} + +#define Dbprintf_fpc(...) {\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = true;\ + g_reply_via_usb = false;\ + Dbprintf(__VA_ARGS__);\ + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} + +#define Dbprintf_all(...) {\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = true;\ + g_reply_via_usb = true;\ + Dbprintf(__VA_ARGS__);\ + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} + + static volatile AT91PS_USART pUS1 = AT91C_BASE_US1; static volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; static volatile AT91PS_PDC pPDC = AT91C_BASE_PDC_US1; From 31645c56b0f226b1cf29ad52282a59b64bd99f5f Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 21:09:31 -0700 Subject: [PATCH 827/924] more use of `const` --- armsrc/dbprint.c | 6 +++--- armsrc/dbprint.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/armsrc/dbprint.c b/armsrc/dbprint.c index 7be7bba4c..218223231 100644 --- a/armsrc/dbprint.c +++ b/armsrc/dbprint.c @@ -74,7 +74,7 @@ void Dbprintf(const char *fmt, ...) { } // prints HEX & ASCII -void Dbhexdump(int len, uint8_t *d, bool bAsci) { +void Dbhexdump(int len, const uint8_t *d, bool bAsci) { #if DEBUG char ascii[9]; @@ -103,9 +103,9 @@ void Dbhexdump(int len, uint8_t *d, bool bAsci) { #endif } -void print_result(const char *name, uint8_t *buf, size_t len) { +void print_result(const char *name, const uint8_t *buf, size_t len) { - uint8_t *p = buf; + const uint8_t *p = buf; uint16_t tmp = len & 0xFFF0; for (; p - buf < tmp; p += 16) { diff --git a/armsrc/dbprint.h b/armsrc/dbprint.h index f22f965c5..0795db274 100644 --- a/armsrc/dbprint.h +++ b/armsrc/dbprint.h @@ -26,8 +26,8 @@ void DbpString(const char *str); void DbpStringEx(uint32_t flags, const char *src, size_t srclen); void Dbprintf(const char *fmt, ...); void DbprintfEx(uint32_t flags, const char *fmt, ...); -void Dbhexdump(int len, uint8_t *d, bool bAsci); -void print_result(const char *name, uint8_t *buf, size_t len); +void Dbhexdump(int len, const uint8_t *d, bool bAsci); +void print_result(const char *name, const uint8_t *buf, size_t len); //void PrintToSendBuffer(void); #endif From b279df2d46ea116707873cea213b6c5a243a2d4c Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 22:50:34 -0700 Subject: [PATCH 828/924] more const - spiffs --- armsrc/spiffs.c | 40 ++++++++++++++++++++-------------------- armsrc/spiffs.h | 22 +++++++++++----------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c index e243b8ed1..9659dc77b 100644 --- a/armsrc/spiffs.c +++ b/armsrc/spiffs.c @@ -196,7 +196,7 @@ int rdv40_spiffs_check(void) { ///// Base RDV40_SPIFFS_SAFETY_NORMAL operations//////////////////////////////// -void write_to_spiffs(const char *filename, uint8_t *src, uint32_t size) { +void write_to_spiffs(const char *filename, const uint8_t *src, uint32_t size) { spiffs_file fd = SPIFFS_open(&fs, filename, SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0); if (SPIFFS_write(&fs, fd, src, size) < 0) { Dbprintf("wr errno %i\n", SPIFFS_errno(&fs)); @@ -204,7 +204,7 @@ void write_to_spiffs(const char *filename, uint8_t *src, uint32_t size) { SPIFFS_close(&fs, fd); } -void append_to_spiffs(const char *filename, uint8_t *src, uint32_t size) { +void append_to_spiffs(const char *filename, const uint8_t *src, uint32_t size) { spiffs_file fd = SPIFFS_open(&fs, filename, SPIFFS_APPEND | SPIFFS_RDWR, 0); if (SPIFFS_write(&fs, fd, src, size) < 0) { Dbprintf("errno %i\n", SPIFFS_errno(&fs)); @@ -310,10 +310,10 @@ static int is_valid_filename(const char *filename) { } */ static void copy_in_spiffs(const char *src, const char *dst) { - uint32_t size = size_in_spiffs((char *)src); + uint32_t size = size_in_spiffs(src); uint8_t *mem = BigBuf_malloc(size); - read_from_spiffs((char *)src, (uint8_t *)mem, size); - write_to_spiffs((char *)dst, (uint8_t *)mem, size); + read_from_spiffs(src, (uint8_t *)mem, size); + write_to_spiffs(dst, (uint8_t *)mem, size); } //////////////////////////////////////////////////////////////////////////////// @@ -434,7 +434,7 @@ int rdv40_spiffs_lazy_mount_rollback(int changed) { // TODO : forbid writing to a filename which already exists as lnk ! // TODO : forbid writing to a filename.lnk which already exists without lnk ! // Note: Writing in SPIFFS_WRITE_CHUNK_SIZE (8192) byte chucks helps to ensure "free space" has been erased by GC (Garbage collection) -int rdv40_spiffs_write(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_write(const char *filename, const uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( uint32_t idx; if (size <= SPIFFS_WRITE_CHUNK_SIZE) { @@ -457,7 +457,7 @@ int rdv40_spiffs_write(const char *filename, uint8_t *src, uint32_t size, RDV40S ) } -int rdv40_spiffs_append(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_append(const char *filename, const uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( uint32_t idx; // Append any SPIFFS_WRITE_CHUNK_SIZE byte chunks @@ -480,26 +480,26 @@ int rdv40_spiffs_read(const char *filename, uint8_t *dst, uint32_t size, RDV40Sp // TODO : forbid writing to a filename which already exists as lnk ! // TODO : forbid writing to a filename.lnk which already exists without lnk ! -int rdv40_spiffs_rename(char *old_filename, char *new_filename, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_rename(const char *old_filename, const char *new_filename, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( // rename_in_spiffs(old_filename, new_filename); // ) } -int rdv40_spiffs_remove(char *filename, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_remove(const char *filename, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( // remove_from_spiffs(filename); // ) } -int rdv40_spiffs_copy(char *src, char *dst, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_copy(const char *src_filename, const char *dst_filename, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( // - copy_in_spiffs(src, dst); // + copy_in_spiffs(src_filename, dst_filename); // ) } -int rdv40_spiffs_stat(char *filename, uint32_t *buf, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_stat(const char *filename, uint32_t *size_in_bytes, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( // - *buf = size_in_spiffs(filename); // + *size_in_bytes = size_in_spiffs(filename); // ) } @@ -530,7 +530,7 @@ int rdv40_spiffs_is_symlink(const char *s) { // symlink ?") // ATTENTION : you must NOT provide the whole filename (so please do not include the .lnk extension) // TODO : integrate in read_function -int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_read_as_symlink(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( char linkdest[SPIFFS_OBJ_NAME_LEN]; @@ -538,7 +538,7 @@ int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RD sprintf(linkfilename, "%s.lnk", filename); if (g_dbglevel >= DBG_DEBUG) - Dbprintf("Linkk real filename is " _YELLOW_("%s"), linkfilename); + Dbprintf("Link real filename is " _YELLOW_("%s"), linkfilename); read_from_spiffs((char *)linkfilename, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); @@ -561,11 +561,11 @@ int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RD // which you can then read back with : // rdv40_spiffs_read_as_symlink((uint8_t *)"world",(uint8_t *) buffer, orig_file_size, RDV40_SPIFFS_SAFETY_SAFE); // TODO : FORBID creating a symlink with a basename (before.lnk) which already exists as a file ! -int rdv40_spiffs_make_symlink(char *linkdest, char *filename, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_make_symlink(const char *linkdest, const char *filename, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( char linkfilename[SPIFFS_OBJ_NAME_LEN]; sprintf(linkfilename, "%s.lnk", filename); - write_to_spiffs((char *)linkfilename, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); + write_to_spiffs(linkfilename, (const uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); ) } @@ -575,15 +575,15 @@ int rdv40_spiffs_make_symlink(char *linkdest, char *filename, RDV40SpiFFSSafetyL // Still, this case won't happen when the write(s) functions will check for both symlink and real file // preexistence, avoiding a link being created if filename exists, or avoiding a file being created if // symlink exists with same name -int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_read_as_filetype(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( RDV40SpiFFSFileType filetype = filetype_in_spiffs((char *)filename); switch (filetype) { case RDV40_SPIFFS_FILETYPE_REAL: - rdv40_spiffs_read((char *)filename, (uint8_t *)dst, size, level); + rdv40_spiffs_read(filename, dst, size, level); break; case RDV40_SPIFFS_FILETYPE_SYMLINK: - rdv40_spiffs_read_as_symlink(filename, (uint8_t *)dst, size, level); + rdv40_spiffs_read_as_symlink(filename, dst, size, level); break; case RDV40_SPIFFS_FILETYPE_BOTH: case RDV40_SPIFFS_FILETYPE_UNKNOWN: diff --git a/armsrc/spiffs.h b/armsrc/spiffs.h index 5958e559b..7bbfb794b 100644 --- a/armsrc/spiffs.h +++ b/armsrc/spiffs.h @@ -46,18 +46,18 @@ typedef struct rdv40_spiffs_fsinfo { uint32_t usedPercent, freePercent; } rdv40_spiffs_fsinfo; -int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_read_as_filetype(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_check(void); int rdv40_spiffs_lazy_unmount(void); int rdv40_spiffs_lazy_mount(void); int rdv40_spiffs_lazy_mount_rollback(int changed); -int rdv40_spiffs_write(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_write(const char *filename, const uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_read(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_rename(char *old_filename, char *new_filename, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_remove(char *filename, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); -void write_to_spiffs(const char *filename, uint8_t *src, uint32_t size); +int rdv40_spiffs_rename(const char *old_filename, const char *new_filename, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_remove(const char *filename, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_read_as_symlink(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); +void write_to_spiffs(const char *filename, const uint8_t *src, uint32_t size); void read_from_spiffs(const char *filename, uint8_t *dst, uint32_t size); void test_spiffs(void); void rdv40_spiffs_safe_print_tree(void); @@ -65,11 +65,11 @@ int rdv40_spiffs_unmount(void); int rdv40_spiffs_mount(void); int rdv40_spiffs_is_symlink(const char *s); void rdv40_spiffs_safe_print_fsinfo(void); -int rdv40_spiffs_make_symlink(char *linkdest, char *filename, RDV40SpiFFSSafetyLevel level); -void append_to_spiffs(const char *filename, uint8_t *src, uint32_t size); -int rdv40_spiffs_copy(char *src, char *dst, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_append(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_stat(char *filename, uint32_t *buf, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_make_symlink(const char *linkdest, const char *filename, RDV40SpiFFSSafetyLevel level); +void append_to_spiffs(const char *filename, const uint8_t *src, uint32_t size); +int rdv40_spiffs_copy(const char *src_filename, const char *dst_filename, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_append(const char *filename, const uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_stat(const char *filename, uint32_t *size_in_bytes, RDV40SpiFFSSafetyLevel level); uint32_t size_in_spiffs(const char *filename); int exists_in_spiffs(const char *filename); From e973aebae6960708d22826fc2c6963f8f6fe1d70 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 22:56:51 -0700 Subject: [PATCH 829/924] Workaround SPIFFS lack of `const` --- armsrc/spiffs.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c index 9659dc77b..359f2f07c 100644 --- a/armsrc/spiffs.c +++ b/armsrc/spiffs.c @@ -198,7 +198,8 @@ int rdv40_spiffs_check(void) { void write_to_spiffs(const char *filename, const uint8_t *src, uint32_t size) { spiffs_file fd = SPIFFS_open(&fs, filename, SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0); - if (SPIFFS_write(&fs, fd, src, size) < 0) { + // Note: SPIFFS_write() doesn't declare third parameter as const (but should) + if (SPIFFS_write(&fs, fd, (void*)src, size) < 0) { Dbprintf("wr errno %i\n", SPIFFS_errno(&fs)); } SPIFFS_close(&fs, fd); @@ -206,7 +207,8 @@ void write_to_spiffs(const char *filename, const uint8_t *src, uint32_t size) { void append_to_spiffs(const char *filename, const uint8_t *src, uint32_t size) { spiffs_file fd = SPIFFS_open(&fs, filename, SPIFFS_APPEND | SPIFFS_RDWR, 0); - if (SPIFFS_write(&fs, fd, src, size) < 0) { + // Note: SPIFFS_write() doesn't declare third parameter as const (but should) + if (SPIFFS_write(&fs, fd, (void*)src, size) < 0) { Dbprintf("errno %i\n", SPIFFS_errno(&fs)); } SPIFFS_close(&fs, fd); From 1a8ef489c8990ac052a6a544462da1dc5925d76d Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 23:03:34 -0700 Subject: [PATCH 830/924] const for em4x50 --- armsrc/appmain.c | 16 ++++++++-------- armsrc/em4x50.c | 34 +++++++++++++++++----------------- armsrc/em4x50.h | 19 ++++++++++--------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 3c471191f..5908ed855 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1154,27 +1154,27 @@ static void PacketReceived(PacketCommandNG *packet) { #ifdef WITH_EM4x50 case CMD_LF_EM4X50_INFO: { - em4x50_info((em4x50_data_t *)packet->data.asBytes, true); + em4x50_info((const em4x50_data_t *)packet->data.asBytes, true); break; } case CMD_LF_EM4X50_WRITE: { - em4x50_write((em4x50_data_t *)packet->data.asBytes, true); + em4x50_write((const em4x50_data_t *)packet->data.asBytes, true); break; } case CMD_LF_EM4X50_WRITEPWD: { - em4x50_writepwd((em4x50_data_t *)packet->data.asBytes, true); + em4x50_writepwd((const em4x50_data_t *)packet->data.asBytes, true); break; } case CMD_LF_EM4X50_READ: { - em4x50_read((em4x50_data_t *)packet->data.asBytes, true); + em4x50_read((const em4x50_data_t *)packet->data.asBytes, true); break; } case CMD_LF_EM4X50_BRUTE: { - em4x50_brute((em4x50_data_t *)packet->data.asBytes, true); + em4x50_brute((const em4x50_data_t *)packet->data.asBytes, true); break; } case CMD_LF_EM4X50_LOGIN: { - em4x50_login((uint32_t *)packet->data.asBytes, true); + em4x50_login((const uint32_t *)packet->data.asBytes, true); break; } case CMD_LF_EM4X50_SIM: { @@ -1184,7 +1184,7 @@ static void PacketReceived(PacketCommandNG *packet) { // destroy the Emulator Memory. //----------------------------------------------------------------------------- FpgaDownloadAndGo(FPGA_BITSTREAM_LF); - em4x50_sim((uint32_t *)packet->data.asBytes, true); + em4x50_sim((const uint32_t *)packet->data.asBytes, true); break; } case CMD_LF_EM4X50_READER: { @@ -1208,7 +1208,7 @@ static void PacketReceived(PacketCommandNG *packet) { // destroy the Emulator Memory. //----------------------------------------------------------------------------- FpgaDownloadAndGo(FPGA_BITSTREAM_LF); - em4x50_chk((uint8_t *)packet->data.asBytes, true); + em4x50_chk((const char *)packet->data.asBytes, true); break; } #endif diff --git a/armsrc/em4x50.c b/armsrc/em4x50.c index d43a6a15f..4910caa31 100644 --- a/armsrc/em4x50.c +++ b/armsrc/em4x50.c @@ -634,7 +634,7 @@ static int login(uint32_t password) { } // searching for password using chosen bruteforce algorithm -static bool brute(em4x50_data_t *etd, uint32_t *pwd) { +static bool brute(const em4x50_data_t *etd, uint32_t *pwd) { generator_context_t ctx; bool pwd_found = false; @@ -694,7 +694,7 @@ static bool brute(em4x50_data_t *etd, uint32_t *pwd) { } // login into EM4x50 -void em4x50_login(uint32_t *password, bool ledcontrol) { +void em4x50_login(const uint32_t *password, bool ledcontrol) { em4x50_setup_read(); int status = PM3_EFAILED; @@ -713,7 +713,7 @@ void em4x50_login(uint32_t *password, bool ledcontrol) { } // invoke password search -void em4x50_brute(em4x50_data_t *etd, bool ledcontrol) { +void em4x50_brute(const em4x50_data_t *etd, bool ledcontrol) { em4x50_setup_read(); bool bsuccess = false; @@ -733,7 +733,7 @@ void em4x50_brute(em4x50_data_t *etd, bool ledcontrol) { } // check passwords from dictionary content in flash memory -void em4x50_chk(uint8_t *filename, bool ledcontrol) { +void em4x50_chk(const char *filename, bool ledcontrol) { int status = PM3_EFAILED; uint32_t pwd = 0x0; @@ -743,11 +743,11 @@ void em4x50_chk(uint8_t *filename, bool ledcontrol) { int changed = rdv40_spiffs_lazy_mount(); uint16_t pwd_count = 0; - uint32_t size = size_in_spiffs((char *)filename); + uint32_t size = size_in_spiffs(filename); pwd_count = size / 4; uint8_t *pwds = BigBuf_malloc(size); - rdv40_spiffs_read_as_filetype((char *)filename, pwds, size, RDV40_SPIFFS_SAFETY_SAFE); + rdv40_spiffs_read_as_filetype(filename, pwds, size, RDV40_SPIFFS_SAFETY_SAFE); if (changed) rdv40_spiffs_lazy_unmount(); @@ -873,7 +873,7 @@ static int selective_read(uint32_t addresses, uint32_t *words) { } // reads by using "selective read mode" -> bidirectional communication -void em4x50_read(em4x50_data_t *etd, bool ledcontrol) { +void em4x50_read(const em4x50_data_t *etd, bool ledcontrol) { int status = PM3_EFAILED; uint32_t words[EM4X50_NO_WORDS] = {0x0}; @@ -906,7 +906,7 @@ void em4x50_read(em4x50_data_t *etd, bool ledcontrol) { } // collects as much information as possible via selective read mode -void em4x50_info(em4x50_data_t *etd, bool ledcontrol) { +void em4x50_info(const em4x50_data_t *etd, bool ledcontrol) { int status = PM3_EFAILED; uint32_t words[EM4X50_NO_WORDS] = {0x0}; @@ -1053,7 +1053,7 @@ static int write_password(uint32_t password, uint32_t new_password) { // write operation process for EM4x50 tag, // single word is written to given address, verified by selective read operation // wrong password -> return with PM3_EFAILED -void em4x50_write(em4x50_data_t *etd, bool ledcontrol) { +void em4x50_write(const em4x50_data_t *etd, bool ledcontrol) { int status = PM3_EFAILED; uint32_t words[EM4X50_NO_WORDS] = {0x0}; @@ -1113,7 +1113,7 @@ void em4x50_write(em4x50_data_t *etd, bool ledcontrol) { } // simple change of password -void em4x50_writepwd(em4x50_data_t *etd, bool ledcontrol) { +void em4x50_writepwd(const em4x50_data_t *etd, bool ledcontrol) { int status = PM3_EFAILED; em4x50_setup_read(); @@ -1358,7 +1358,7 @@ static bool em4x50_sim_read_word(uint32_t *word) { } // check if reader requests receive mode (rm) by sending two zeros -static int check_rm_request(uint32_t *tag, bool ledcontrol) { +static int check_rm_request(const uint32_t *tag, bool ledcontrol) { // look for first zero int bit = em4x50_sim_read_bit(); @@ -1387,7 +1387,7 @@ static int check_rm_request(uint32_t *tag, bool ledcontrol) { } // send single listen window in simulation mode -static int em4x50_sim_send_listen_window(uint32_t *tag, bool ledcontrol) { +static int em4x50_sim_send_listen_window(const uint32_t *tag, bool ledcontrol) { SHORT_COIL(); wait_cycles(EM4X50_T_TAG_HALF_PERIOD); @@ -1460,7 +1460,7 @@ static void em4x50_sim_send_nak(void) { } // standard read mode process (simulation mode) -static int em4x50_sim_handle_standard_read_command(uint32_t *tag, bool ledcontrol) { +static int em4x50_sim_handle_standard_read_command(const uint32_t *tag, bool ledcontrol) { // extract control data int fwr = reflect32(tag[EM4X50_CONTROL]) & 0xFF; // first word read @@ -1500,7 +1500,7 @@ static int em4x50_sim_handle_standard_read_command(uint32_t *tag, bool ledcontro } // selective read mode process (simulation mode) -static int em4x50_sim_handle_selective_read_command(uint32_t *tag, bool ledcontrol) { +static int em4x50_sim_handle_selective_read_command(const uint32_t *tag, bool ledcontrol) { // read password uint32_t address = 0; @@ -1555,7 +1555,7 @@ static int em4x50_sim_handle_selective_read_command(uint32_t *tag, bool ledcontr } // login process (simulation mode) -static int em4x50_sim_handle_login_command(uint32_t *tag, bool ledcontrol) { +static int em4x50_sim_handle_login_command(const uint32_t *tag, bool ledcontrol) { // read password uint32_t password = 0; @@ -1581,7 +1581,7 @@ static int em4x50_sim_handle_login_command(uint32_t *tag, bool ledcontrol) { } // reset process (simulation mode) -static int em4x50_sim_handle_reset_command(uint32_t *tag, bool ledcontrol) { +static int em4x50_sim_handle_reset_command(const uint32_t *tag, bool ledcontrol) { // processing pause time (corresponds to a "1" bit) em4x50_sim_send_bit(1); @@ -1806,7 +1806,7 @@ void em4x50_handle_commands(int *command, uint32_t *tag, bool ledcontrol) { // simulate uploaded data in emulator memory // LED C -> reader command has been detected // LED D -> operations that require authentication are possible -void em4x50_sim(uint32_t *password, bool ledcontrol) { +void em4x50_sim(const uint32_t *password, bool ledcontrol) { int command = PM3_ENODATA; diff --git a/armsrc/em4x50.h b/armsrc/em4x50.h index af3a7a8db..eb52c36e5 100644 --- a/armsrc/em4x50.h +++ b/armsrc/em4x50.h @@ -21,20 +21,21 @@ #include "../include/em4x50.h" +// used by standalone mode void em4x50_setup_read(void); int standard_read(int *now, uint32_t *words); - void em4x50_setup_sim(void); void em4x50_handle_commands(int *command, uint32_t *tag, bool ledcontrol); -void em4x50_info(em4x50_data_t *etd, bool ledcontrol); -void em4x50_write(em4x50_data_t *etd, bool ledcontrol); -void em4x50_writepwd(em4x50_data_t *etd, bool ledcontrol); -void em4x50_read(em4x50_data_t *etd, bool ledcontrol); -void em4x50_brute(em4x50_data_t *etd, bool ledcontrol); -void em4x50_login(uint32_t *password, bool ledcontrol); -void em4x50_sim(uint32_t *password, bool ledcontrol); +// dispatch functions (appmain.c) +void em4x50_info(const em4x50_data_t *etd, bool ledcontrol); +void em4x50_write(const em4x50_data_t *etd, bool ledcontrol); +void em4x50_writepwd(const em4x50_data_t *etd, bool ledcontrol); +void em4x50_read(const em4x50_data_t *etd, bool ledcontrol); +void em4x50_brute(const em4x50_data_t *etd, bool ledcontrol); +void em4x50_login(const uint32_t *password, bool ledcontrol); +void em4x50_sim(const uint32_t *password, bool ledcontrol); void em4x50_reader(bool ledcontrol); -void em4x50_chk(uint8_t *filename, bool ledcontrol); +void em4x50_chk(const char *filename, bool ledcontrol); #endif /* EM4X50_H */ From 0af484fdee48ee76f7d2eed8ef82f5be82f9601d Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 23:24:10 -0700 Subject: [PATCH 831/924] const for em4x70 --- armsrc/em4x70.c | 43 +++++++++++++++++++++++-------------------- armsrc/em4x70.h | 14 +++++++------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/armsrc/em4x70.c b/armsrc/em4x70.c index 806442f7f..ab73bd153 100644 --- a/armsrc/em4x70.c +++ b/armsrc/em4x70.c @@ -310,6 +310,7 @@ static bool check_ack(void) { return false; } +// TODO: define and use structs for rnd, frnd, response static int authenticate(const uint8_t *rnd, const uint8_t *frnd, uint8_t *response) { if (find_listen_window(true)) { @@ -350,8 +351,10 @@ static int authenticate(const uint8_t *rnd, const uint8_t *frnd, uint8_t *respon return PM3_ESOFT; } -static int set_byte(uint8_t *target, int value) { - int c = value > 0xFF; +// Sets one (reflected) byte and returns carry bit +// (1 if `value` parameter was greater than 0xFF) +static int set_byte(uint8_t *target, uint16_t value) { + int c = value > 0xFF ? 1 : 0; // be explicit about carry bit values *target = reflect8(value); return c; } @@ -373,27 +376,27 @@ static int bruteforce(const uint8_t address, const uint8_t *rnd, const uint8_t * uint16_t rev_k = reflect16(k); switch (address) { case 9: - c = set_byte(&temp_rnd[0], rev_rnd[0] + (rev_k & 0xFF)); - c = set_byte(&temp_rnd[1], rev_rnd[1] + c + ((rev_k >> 8) & 0xFF)); + c = set_byte(&temp_rnd[0], rev_rnd[0] + ((rev_k ) & 0xFFu)); + c = set_byte(&temp_rnd[1], rev_rnd[1] + c + ((rev_k >> 8) & 0xFFu)); c = set_byte(&temp_rnd[2], rev_rnd[2] + c); c = set_byte(&temp_rnd[3], rev_rnd[3] + c); c = set_byte(&temp_rnd[4], rev_rnd[4] + c); c = set_byte(&temp_rnd[5], rev_rnd[5] + c); - set_byte(&temp_rnd[6], rev_rnd[6] + c); + set_byte( &temp_rnd[6], rev_rnd[6] + c); break; case 8: - c = set_byte(&temp_rnd[2], rev_rnd[2] + (rev_k & 0xFF)); - c = set_byte(&temp_rnd[3], rev_rnd[3] + c + ((rev_k >> 8) & 0xFF)); + c = set_byte(&temp_rnd[2], rev_rnd[2] + ((rev_k ) & 0xFFu)); + c = set_byte(&temp_rnd[3], rev_rnd[3] + c + ((rev_k >> 8) & 0xFFu)); c = set_byte(&temp_rnd[4], rev_rnd[4] + c); c = set_byte(&temp_rnd[5], rev_rnd[5] + c); - set_byte(&temp_rnd[6], rev_rnd[6] + c); + set_byte( &temp_rnd[6], rev_rnd[6] + c); break; case 7: - c = set_byte(&temp_rnd[4], rev_rnd[4] + (rev_k & 0xFF)); - c = set_byte(&temp_rnd[5], rev_rnd[5] + c + ((rev_k >> 8) & 0xFF)); - set_byte(&temp_rnd[6], rev_rnd[6] + c); + c = set_byte(&temp_rnd[4], rev_rnd[4] + ((rev_k ) & 0xFFu)); + c = set_byte(&temp_rnd[5], rev_rnd[5] + c + ((rev_k >> 8) & 0xFFu)); + set_byte( &temp_rnd[6], rev_rnd[6] + c); break; default: @@ -707,7 +710,7 @@ static int em4x70_receive(uint8_t *bits, size_t length) { return bit_pos; } -void em4x70_info(em4x70_data_t *etd, bool ledcontrol) { +void em4x70_info(const em4x70_data_t *etd, bool ledcontrol) { uint8_t status = 0; @@ -728,7 +731,7 @@ void em4x70_info(em4x70_data_t *etd, bool ledcontrol) { reply_ng(CMD_LF_EM4X70_INFO, status, tag.data, sizeof(tag.data)); } -void em4x70_write(em4x70_data_t *etd, bool ledcontrol) { +void em4x70_write(const em4x70_data_t *etd, bool ledcontrol) { uint8_t status = 0; @@ -758,7 +761,7 @@ void em4x70_write(em4x70_data_t *etd, bool ledcontrol) { reply_ng(CMD_LF_EM4X70_WRITE, status, tag.data, sizeof(tag.data)); } -void em4x70_unlock(em4x70_data_t *etd, bool ledcontrol) { +void em4x70_unlock(const em4x70_data_t *etd, bool ledcontrol) { uint8_t status = 0; @@ -791,7 +794,7 @@ void em4x70_unlock(em4x70_data_t *etd, bool ledcontrol) { reply_ng(CMD_LF_EM4X70_UNLOCK, status, tag.data, sizeof(tag.data)); } -void em4x70_auth(em4x70_data_t *etd, bool ledcontrol) { +void em4x70_auth(const em4x70_data_t *etd, bool ledcontrol) { uint8_t status = 0; uint8_t response[3] = {0}; @@ -813,7 +816,7 @@ void em4x70_auth(em4x70_data_t *etd, bool ledcontrol) { reply_ng(CMD_LF_EM4X70_AUTH, status, response, sizeof(response)); } -void em4x70_brute(em4x70_data_t *etd, bool ledcontrol) { +void em4x70_brute(const em4x70_data_t *etd, bool ledcontrol) { uint8_t status = 0; uint8_t response[2] = {0}; @@ -834,7 +837,7 @@ void em4x70_brute(em4x70_data_t *etd, bool ledcontrol) { reply_ng(CMD_LF_EM4X70_BRUTE, status, response, sizeof(response)); } -void em4x70_write_pin(em4x70_data_t *etd, bool ledcontrol) { +void em4x70_write_pin(const em4x70_data_t *etd, bool ledcontrol) { uint8_t status = 0; @@ -850,8 +853,8 @@ void em4x70_write_pin(em4x70_data_t *etd, bool ledcontrol) { if (em4x70_read_id()) { // Write new PIN - if ((write(etd->pin & 0xFFFF, EM4X70_PIN_WORD_UPPER) == PM3_SUCCESS) && - (write((etd->pin >> 16) & 0xFFFF, EM4X70_PIN_WORD_LOWER) == PM3_SUCCESS)) { + if ((write((etd->pin ) & 0xFFFF, EM4X70_PIN_WORD_UPPER) == PM3_SUCCESS) && + (write((etd->pin >> 16) & 0xFFFF, EM4X70_PIN_WORD_LOWER) == PM3_SUCCESS)) { // Now Try to authenticate using the new PIN @@ -874,7 +877,7 @@ void em4x70_write_pin(em4x70_data_t *etd, bool ledcontrol) { reply_ng(CMD_LF_EM4X70_WRITEPIN, status, tag.data, sizeof(tag.data)); } -void em4x70_write_key(em4x70_data_t *etd, bool ledcontrol) { +void em4x70_write_key(const em4x70_data_t *etd, bool ledcontrol) { uint8_t status = 0; diff --git a/armsrc/em4x70.h b/armsrc/em4x70.h index 0fd640f86..83a8237d7 100644 --- a/armsrc/em4x70.h +++ b/armsrc/em4x70.h @@ -30,12 +30,12 @@ typedef enum { FALLING_EDGE } edge_detection_t; -void em4x70_info(em4x70_data_t *etd, bool ledcontrol); -void em4x70_write(em4x70_data_t *etd, bool ledcontrol); -void em4x70_brute(em4x70_data_t *etd, bool ledcontrol); -void em4x70_unlock(em4x70_data_t *etd, bool ledcontrol); -void em4x70_auth(em4x70_data_t *etd, bool ledcontrol); -void em4x70_write_pin(em4x70_data_t *etd, bool ledcontrol); -void em4x70_write_key(em4x70_data_t *etd, bool ledcontrol); +void em4x70_info(const em4x70_data_t *etd, bool ledcontrol); +void em4x70_write(const em4x70_data_t *etd, bool ledcontrol); +void em4x70_brute(const em4x70_data_t *etd, bool ledcontrol); +void em4x70_unlock(const em4x70_data_t *etd, bool ledcontrol); +void em4x70_auth(const em4x70_data_t *etd, bool ledcontrol); +void em4x70_write_pin(const em4x70_data_t *etd, bool ledcontrol); +void em4x70_write_key(const em4x70_data_t *etd, bool ledcontrol); #endif /* EM4x70_H */ From 63a457c27fd99fe9181030ca95bdf86c7b00845e Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 23:38:26 -0700 Subject: [PATCH 832/924] const and static functions for epa --- armsrc/epa.c | 38 ++++++++++++++++++++++++++++---------- armsrc/epa.h | 24 +++--------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/armsrc/epa.c b/armsrc/epa.c index 7bd563676..4e4113d45 100644 --- a/armsrc/epa.c +++ b/armsrc/epa.c @@ -37,6 +37,24 @@ static const uint8_t pps[] = {0xD0, 0x11, 0x00, 0x52, 0xA6}; #endif +// this struct is used by EPA_Parse_CardAccess and contains info about the +// PACE protocol supported by the chip +typedef struct { + uint8_t oid[10]; + uint8_t version; + uint8_t parameter_id; +} pace_version_info_t; + +// general functions +static void EPA_Finish(void); +static size_t EPA_Parse_CardAccess(const uint8_t *data, size_t length, pace_version_info_t *pace_info); +static int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length); +static int EPA_Setup(void); + +// PACE related functions +static int EPA_PACE_MSE_Set_AT(const pace_version_info_t pace_version_info, uint8_t password); +static int EPA_PACE_Get_Nonce(uint8_t requested_length, uint8_t *nonce); + // APDUs for communication with German Identification Card // General Authenticate (request encrypted nonce) WITHOUT the Le at the end @@ -153,7 +171,7 @@ static int EPA_APDU(uint8_t *apdu, size_t length, uint8_t *response, uint16_t re //----------------------------------------------------------------------------- // Closes the communication channel and turns off the field //----------------------------------------------------------------------------- -void EPA_Finish(void) { +static void EPA_Finish(void) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); iso_type = 0; @@ -172,7 +190,7 @@ void EPA_Finish(void) { // TODO: Support elements with long tags (tag is longer than 1 byte) // TODO: Support proprietary PACE domain parameters //----------------------------------------------------------------------------- -size_t EPA_Parse_CardAccess(uint8_t *data, size_t length, pace_version_info_t *pace_info) { +static size_t EPA_Parse_CardAccess(const uint8_t *data, size_t length, pace_version_info_t *pace_info) { size_t index = 0; @@ -243,7 +261,7 @@ size_t EPA_Parse_CardAccess(uint8_t *data, size_t length, pace_version_info_t *p // Returns -1 on failure or the length of the data on success // TODO: for the moment this sends only 1 APDU regardless of the requested length //----------------------------------------------------------------------------- -int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length) { +static int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length) { // the response APDU of the card // since the card doesn't always care for the expected length we send it, // we reserve 262 bytes here just to be safe (256-byte APDU + SW + ISO frame) @@ -300,7 +318,7 @@ static void EPA_PACE_Collect_Nonce_Abort(uint32_t cmd, uint8_t step, int func_re //----------------------------------------------------------------------------- // Acquire one encrypted PACE nonce //----------------------------------------------------------------------------- -void EPA_PACE_Collect_Nonce(PacketCommandNG *c) { +void EPA_PACE_Collect_Nonce(const PacketCommandNG *c) { /* * ack layout: * arg: @@ -354,7 +372,7 @@ void EPA_PACE_Collect_Nonce(PacketCommandNG *c) { struct p { uint32_t m; } PACKED; - struct p *packet = (struct p *)c->data.asBytes; + const struct p *packet = (const struct p *)c->data.asBytes; func_return = EPA_PACE_Get_Nonce(packet->m, nonce); // check if the command succeeded @@ -377,7 +395,7 @@ void EPA_PACE_Collect_Nonce(PacketCommandNG *c) { // Returns the actual size of the nonce on success or a less-than-zero error // code on failure. //----------------------------------------------------------------------------- -int EPA_PACE_Get_Nonce(uint8_t requested_length, uint8_t *nonce) { +static int EPA_PACE_Get_Nonce(uint8_t requested_length, uint8_t *nonce) { // build the APDU uint8_t apdu[sizeof(apdu_general_authenticate_pace_get_nonce) + 1]; @@ -416,7 +434,7 @@ int EPA_PACE_Get_Nonce(uint8_t requested_length, uint8_t *nonce) { // Initializes the PACE protocol by performing the "MSE: Set AT" step // Returns 0 on success or a non-zero error code on failure //----------------------------------------------------------------------------- -int EPA_PACE_MSE_Set_AT(pace_version_info_t pace_version_info, uint8_t password) { +static int EPA_PACE_MSE_Set_AT(const pace_version_info_t pace_version_info, uint8_t password) { // create the MSE: Set AT APDU uint8_t apdu[23]; @@ -479,7 +497,7 @@ int EPA_PACE_MSE_Set_AT(pace_version_info_t pace_version_info, uint8_t password) //----------------------------------------------------------------------------- // Perform the PACE protocol by replaying given APDUs //----------------------------------------------------------------------------- -void EPA_PACE_Replay(PacketCommandNG *c) { +void EPA_PACE_Replay(const PacketCommandNG *c) { uint32_t timings[ARRAYLEN(apdu_lengths_replay)] = {0}; @@ -547,7 +565,7 @@ void EPA_PACE_Replay(PacketCommandNG *c) { // Set up a communication channel (Card Select, PPS) // Returns 0 on success or a non-zero error code on failure //----------------------------------------------------------------------------- -int EPA_Setup(void) { +static int EPA_Setup(void) { #ifdef WITH_ISO14443a { @@ -593,7 +611,7 @@ int EPA_Setup(void) { return 1; } -void EPA_PACE_Simulate(PacketCommandNG *c) { +void EPA_PACE_Simulate(const PacketCommandNG *c) { //---------Initializing--------- diff --git a/armsrc/epa.h b/armsrc/epa.h index 72524f836..62880eca3 100644 --- a/armsrc/epa.h +++ b/armsrc/epa.h @@ -22,26 +22,8 @@ #include "common.h" #include "pm3_cmd.h" -// this struct is used by EPA_Parse_CardAccess and contains info about the -// PACE protocol supported by the chip -typedef struct { - uint8_t oid[10]; - uint8_t version; - uint8_t parameter_id; -} pace_version_info_t; - -// general functions -void EPA_Finish(void); -size_t EPA_Parse_CardAccess(uint8_t *data, size_t length, pace_version_info_t *pace_info); -int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length); -int EPA_Setup(void); - -// PACE related functions -int EPA_PACE_MSE_Set_AT(pace_version_info_t pace_version_info, uint8_t password); -int EPA_PACE_Get_Nonce(uint8_t requested_length, uint8_t *nonce); - -void EPA_PACE_Collect_Nonce(PacketCommandNG *c); -void EPA_PACE_Replay(PacketCommandNG *c); -void EPA_PACE_Simulate(PacketCommandNG *c); +void EPA_PACE_Collect_Nonce(const PacketCommandNG *c); +void EPA_PACE_Replay(const PacketCommandNG *c); +void EPA_PACE_Simulate(const PacketCommandNG *c); #endif /* __EPA_H */ From 6804e719e55556472a7dc13361a04aa2e14003dc Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 23:55:20 -0700 Subject: [PATCH 833/924] const for felica --- armsrc/felica.c | 25 +++++++++++++++---------- armsrc/felica.h | 4 ++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/armsrc/felica.c b/armsrc/felica.c index 0a74a30cc..b575ad9c4 100644 --- a/armsrc/felica.c +++ b/armsrc/felica.c @@ -49,7 +49,7 @@ static uint32_t felica_lasttime_prox2air_start; static void iso18092_setup(uint8_t fpga_minor_mode); static uint8_t felica_select_card(felica_card_select_t *card); -static void TransmitFor18092_AsReader(uint8_t *frame, uint16_t len, uint32_t *timing, uint8_t power, uint8_t highspeed); +static void TransmitFor18092_AsReader(const uint8_t *frame, uint16_t len, const uint32_t *NYI_timing_NYI, uint8_t power, uint8_t highspeed); static bool WaitForFelicaReply(uint16_t maxbytes); static void iso18092_set_timeout(uint32_t timeout) { @@ -269,13 +269,13 @@ static uint8_t felica_select_card(felica_card_select_t *card) { // copy UID // idm 8 if (card) { - memcpy(card->IDm, FelicaFrame.framebytes + 4, 8); + memcpy(card->IDm, FelicaFrame.framebytes + 4, 8); memcpy(card->PMm, FelicaFrame.framebytes + 4 + 8, 8); //memcpy(card->servicecode, FelicaFrame.framebytes + 4 + 8 + 8, 2); - memcpy(card->code, card->IDm, 2); - memcpy(card->uid, card->IDm + 2, 6); - memcpy(card->iccode, card->PMm, 2); - memcpy(card->mrt, card->PMm + 2, 6); + memcpy(card->code, card->IDm, 2); + memcpy(card->uid, card->IDm + 2, 6); + memcpy(card->iccode, card->PMm, 2); + memcpy(card->mrt, card->PMm + 2, 6); if (g_dbglevel >= DBG_DEBUG) { Dbprintf("Received Frame: "); Dbhexdump(FelicaFrame.len, FelicaFrame.framebytes, 0); @@ -350,7 +350,12 @@ static void BuildFliteRdblk(const uint8_t *idm, uint8_t blocknum, const uint16_t AddCrc(frameSpace + 2, c - 2); } -static void TransmitFor18092_AsReader(uint8_t *frame, uint16_t len, uint32_t *timing, uint8_t power, uint8_t highspeed) { +static void TransmitFor18092_AsReader(const uint8_t *frame, uint16_t len, const uint32_t *NYI_timing_NYI, uint8_t power, uint8_t highspeed) { + if (NYI_timing_NYI != NULL) { + Dbprintf("Error: TransmitFor18092_AsReader does not check or set parameter NYI_timing_NYI"); + return; + } + uint16_t flags = FPGA_MAJOR_MODE_HF_ISO18092; if (power) flags |= FPGA_HF_ISO18092_FLAG_READER; @@ -512,12 +517,12 @@ static void felica_reset_frame_mode(void) { // arg0 FeliCa flags // arg1 len of commandbytes // d.asBytes command bytes to send -void felica_sendraw(PacketCommandNG *c) { +void felica_sendraw(const PacketCommandNG *c) { if (g_dbglevel >= DBG_DEBUG) Dbprintf("FeliCa_sendraw Enter"); felica_command_t param = c->oldarg[0]; size_t len = c->oldarg[1] & 0xffff; - uint8_t *cmd = c->data.asBytes; + const uint8_t *cmd = c->data.asBytes; uint32_t arg0; felica_card_select_t card; @@ -675,7 +680,7 @@ void felica_sniff(uint32_t samplesToSkip, uint32_t triggersToSkip) { #define R_READBLK_LEN 0x21 //simulate NFC Tag3 card - for now only poll response works // second half (4 bytes) of NDEF2 goes into nfcid2_0, first into nfcid2_1 -void felica_sim_lite(uint8_t *uid) { +void felica_sim_lite(const uint8_t *uid) { // prepare our 3 responses... uint8_t resp_poll0[R_POLL0_LEN] = { 0xb2, 0x4d, 0x12, FELICA_POLL_ACK, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x43, 0x00, 0xb3, 0x7f}; diff --git a/armsrc/felica.h b/armsrc/felica.h index 8f232b3e4..2677dbfb9 100644 --- a/armsrc/felica.h +++ b/armsrc/felica.h @@ -21,9 +21,9 @@ #include "common.h" #include "cmd.h" -void felica_sendraw(PacketCommandNG *c); +void felica_sendraw(const PacketCommandNG *c); void felica_sniff(uint32_t samplesToSkip, uint32_t triggersToSkip); -void felica_sim_lite(uint8_t *uid); +void felica_sim_lite(const uint8_t *uid); void felica_dump_lite_s(void); #endif From 6f38c814a7ee3cd6c898a7c8cf8b3b8cba68b435 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Tue, 8 Aug 2023 23:59:42 -0700 Subject: [PATCH 834/924] Note inconsistency in FPGA frame layout docs. --- armsrc/fpgaloader.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/armsrc/fpgaloader.h b/armsrc/fpgaloader.h index 6069d3257..3359643f1 100644 --- a/armsrc/fpgaloader.h +++ b/armsrc/fpgaloader.h @@ -34,6 +34,9 @@ /* Communication between ARM / FPGA is done inside armsrc/fpgaloader.c (function FpgaSendCommand) Send 16 bit command / data pair to FPGA + + BUGBUG -- Conflicts with information in ../fpga/define.v + The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 where C is 4bit command From 890ea0d32113a3991dc6e80af3a1054d5db65a99 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Wed, 9 Aug 2023 00:03:48 -0700 Subject: [PATCH 835/924] const for hfops --- armsrc/hfops.c | 2 +- armsrc/hfops.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/hfops.c b/armsrc/hfops.c index 6a97be76a..df42c8685 100644 --- a/armsrc/hfops.c +++ b/armsrc/hfops.c @@ -200,7 +200,7 @@ static uint32_t HfEncodeTkm(const uint8_t *uid, uint8_t modulation, uint8_t *dat return len; } -int HfSimulateTkm(uint8_t *uid, uint8_t modulation, uint32_t timeout) { +int HfSimulateTkm(const uint8_t *uid, uint8_t modulation, uint32_t timeout) { // free eventually allocated BigBuf memory BigBuf_free_keep_EM(); diff --git a/armsrc/hfops.h b/armsrc/hfops.h index 352f9d2bc..c738887b4 100644 --- a/armsrc/hfops.h +++ b/armsrc/hfops.h @@ -22,6 +22,6 @@ #include "common.h" int HfReadADC(uint32_t samplesCount, bool ledcontrol); -int HfSimulateTkm(uint8_t *uid, uint8_t modulation, uint32_t timeout); +int HfSimulateTkm(const uint8_t *uid, uint8_t modulation, uint32_t timeout); #endif From 282c0904a529a5684d1281009cb086e2d48193c0 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Wed, 9 Aug 2023 00:08:13 -0700 Subject: [PATCH 836/924] visual alignment only .. no code change --- armsrc/hitag2_crypto.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/armsrc/hitag2_crypto.c b/armsrc/hitag2_crypto.c index a8a01dae4..9b59b5521 100644 --- a/armsrc/hitag2_crypto.c +++ b/armsrc/hitag2_crypto.c @@ -90,18 +90,18 @@ uint32_t _hitag2_byte(uint64_t *x) { } void hitag2_cipher_reset(struct hitag2_tag *tag, const uint8_t *iv) { - uint64_t key = ((uint64_t)tag->sectors[2][2]) | - ((uint64_t)tag->sectors[2][3] << 8) | + uint64_t key = ((uint64_t)tag->sectors[2][2] ) | + ((uint64_t)tag->sectors[2][3] << 8) | ((uint64_t)tag->sectors[1][0] << 16) | ((uint64_t)tag->sectors[1][1] << 24) | ((uint64_t)tag->sectors[1][2] << 32) | ((uint64_t)tag->sectors[1][3] << 40); - uint32_t uid = ((uint32_t)tag->sectors[0][0]) | - ((uint32_t)tag->sectors[0][1] << 8) | + uint32_t uid = ((uint32_t)tag->sectors[0][0] ) | + ((uint32_t)tag->sectors[0][1] << 8) | ((uint32_t)tag->sectors[0][2] << 16) | ((uint32_t)tag->sectors[0][3] << 24); - uint32_t iv_ = (((uint32_t)(iv[0]))) | - (((uint32_t)(iv[1])) << 8) | + uint32_t iv_ = (((uint32_t)(iv[0])) ) | + (((uint32_t)(iv[1])) << 8) | (((uint32_t)(iv[2])) << 16) | (((uint32_t)(iv[3])) << 24); tag->cs = _hitag2_init(REV64(key), REV32(uid), REV32(iv_)); From 47ea4d6566feff2e27f1bd94750f84fabb47c17b Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Wed, 9 Aug 2023 00:11:52 -0700 Subject: [PATCH 837/924] const for hitag2 --- armsrc/hitag2.c | 6 +++--- armsrc/hitag2.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index 7206b735c..d4abe9ff1 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -979,7 +979,7 @@ static bool hitag2_read_uid(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t return true; } -void EloadHitag(uint8_t *data, uint16_t len) { +void EloadHitag(const uint8_t *data, uint16_t len) { memcpy(tag.sectors, data, sizeof(tag.sectors)); } @@ -1532,7 +1532,7 @@ void SimulateHitag2(bool ledcontrol) { // reply_ng(CMD_LF_HITAG_SIMULATE, (checked == -1) ? PM3_EOPABORTED : PM3_SUCCESS, (uint8_t *)tag.sectors, tag_size); } -void ReaderHitag(hitag_function htf, hitag_data *htd, bool ledcontrol) { +void ReaderHitag(hitag_function htf, const hitag_data *htd, bool ledcontrol) { uint32_t command_start = 0, command_duration = 0; uint32_t response_start = 0, response_duration = 0; @@ -1928,7 +1928,7 @@ out: reply_mix(CMD_ACK, bSuccessful, 0, 0, 0, 0); } -void WriterHitag(hitag_function htf, hitag_data *htd, int page, bool ledcontrol) { +void WriterHitag(hitag_function htf, const hitag_data *htd, int page, bool ledcontrol) { uint32_t command_start = 0; uint32_t command_duration = 0; diff --git a/armsrc/hitag2.h b/armsrc/hitag2.h index dcad3b417..90aa8132b 100644 --- a/armsrc/hitag2.h +++ b/armsrc/hitag2.h @@ -24,7 +24,7 @@ void SniffHitag2(bool ledcontrol); void SimulateHitag2(bool ledcontrol); -void ReaderHitag(hitag_function htf, hitag_data *htd, bool ledcontrol); -void WriterHitag(hitag_function htf, hitag_data *htd, int page, bool ledcontrol); -void EloadHitag(uint8_t *data, uint16_t len); +void ReaderHitag(hitag_function htf, const hitag_data *htd, bool ledcontrol); +void WriterHitag(hitag_function htf, const hitag_data *htd, int page, bool ledcontrol); +void EloadHitag(const uint8_t *data, uint16_t len); #endif From c26583ebfd3da2934f51b7f167056474a6234813 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 9 Aug 2023 13:37:38 +0200 Subject: [PATCH 838/924] Bugfix to keyboard scrolling At zoom levels above x16 the left and right keys only scroll the graph buffer to the left, even if right key is pressed. Mouse wheel behaves correctly. Enabled mouse wheel to zoom when control is pressed since that is the more standard UI convention (but left shift scrolling in place). Minor changes to zooming, using more intuitive constants. --- client/src/proxguiqt.cpp | 72 +++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/client/src/proxguiqt.cpp b/client/src/proxguiqt.cpp index ff88bce1e..e7dfe1018 100644 --- a/client/src/proxguiqt.cpp +++ b/client/src/proxguiqt.cpp @@ -794,7 +794,7 @@ void Plot::paintEvent(QPaintEvent *event) { snprintf(scalestr, sizeof(scalestr), "[%2.2f %s] ", ((int32_t)(CursorBPos - CursorAPos)) / g_CursorScaleFactor, g_CursorScaleFactorUnit); } } - snprintf(str, sizeof(str), "@%u..%u dt=%i %szoom=%2.2f CursorAPos=%u CursorBPos=%u GridX=%lf GridY=%lf (%s) GridXoffset=%lf", + snprintf(str, sizeof(str), "@%u..%u dt=%i %szoom=%2.3f CursorAPos=%u CursorBPos=%u GridX=%lf GridY=%lf (%s) GridXoffset=%lf", g_GraphStart, g_GraphStop, CursorBPos - CursorAPos, @@ -838,17 +838,25 @@ void Plot::closeEvent(QCloseEvent *event) { gs_useOverlays = false; } +// every 4 steps the zoom doubles (or halves) +#define ZOOM_STEP (1.189207) +// limit zoom to 32 times in either direction +#define ZOOM_LIMIT (32) + void Plot::Zoom(double factor, uint32_t refX) { + double g_GraphPixelsPerPointNew = g_GraphPixelsPerPoint * factor; + if (factor >= 1) { // Zoom in - if (g_GraphPixelsPerPoint <= 25 * factor) { - g_GraphPixelsPerPoint *= factor; + if (g_GraphPixelsPerPointNew <= ZOOM_LIMIT) { + g_GraphPixelsPerPoint = g_GraphPixelsPerPointNew; if (refX > g_GraphStart) { g_GraphStart += (refX - g_GraphStart) - ((refX - g_GraphStart) / factor); } } } else { // Zoom out - if (g_GraphPixelsPerPoint >= 0.01 / factor) { - g_GraphPixelsPerPoint *= factor; + if (g_GraphPixelsPerPointNew >= (1.0 / ZOOM_LIMIT) ) { + g_GraphPixelsPerPoint = g_GraphPixelsPerPointNew; + // shift graph towards refX when zooming out if (refX > g_GraphStart) { if (g_GraphStart >= ((refX - g_GraphStart) / factor) - (refX - g_GraphStart)) { g_GraphStart -= ((refX - g_GraphStart) / factor) - (refX - g_GraphStart); @@ -885,7 +893,6 @@ void Plot::Move(int offset) { void Plot::Trim(void) { uint32_t lref, rref; - const double zoom_offset = 1.148698354997035; // 2**(1/5) if ((CursorAPos == 0) || (CursorBPos == 0)) { // if we don't have both cursors set lref = g_GraphStart; rref = g_GraphStop; @@ -902,12 +909,12 @@ void Plot::Trim(void) { } else { lref = CursorAPos < CursorBPos ? CursorAPos : CursorBPos; rref = CursorAPos < CursorBPos ? CursorBPos : CursorAPos; - // g_GraphPixelsPerPoint mush remain a power of zoom_offset + // g_GraphPixelsPerPoint must remain a power of ZOOM_STEP double GPPPtarget = g_GraphPixelsPerPoint * (g_GraphStop - g_GraphStart) / (rref - lref); while (g_GraphPixelsPerPoint < GPPPtarget) { - g_GraphPixelsPerPoint *= zoom_offset; + g_GraphPixelsPerPoint *= ZOOM_STEP; } - g_GraphPixelsPerPoint /= zoom_offset; + g_GraphPixelsPerPoint /= ZOOM_STEP; CursorAPos -= lref; CursorBPos -= lref; } @@ -925,34 +932,26 @@ void Plot::wheelEvent(QWheelEvent *event) { const float move_offset = 0.05; // -120+shift => zoom in (5 times = *2) // 120+shift => zoom out (5 times = /2) - const double zoom_offset = 1.148698354997035; // 2**(1/5) - if (event->modifiers() & Qt::ShiftModifier) { -// event->position doesn't exist in QT5.12.8, both exist in 5.14.2 and event->x doesn't exist in 5.15.0 #if QT_VERSION >= 0x050d00 - uint32_t x = event->position().x(); + // event->position doesn't exist in QT5.12.8, both exist in 5.14.2 and event->x doesn't exist in 5.15.0 + uint32_t x = event->position().x(); + // event->angleDelta doesn't exist in QT4, both exist in 5.12.8 and 5.14.2 and event->delta doesn't exist in 5.15.0 + float delta = -event->angleDelta().y(); #else - uint32_t x = event->x(); + uint32_t x = event->x(); + float delta = -event->delta(); #endif + if (event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier)) { x -= WIDTH_AXES; x = (int)(x / g_GraphPixelsPerPoint); x += g_GraphStart; -// event->angleDelta doesn't exist in QT4, both exist in 5.12.8 and 5.14.2 and event->delta doesn't exist in 5.15.0 -#if QT_VERSION >= 0x050d00 - float delta = event->angleDelta().y(); -#else - float delta = event->delta(); -#endif if (delta < 0) { - Zoom(zoom_offset, x); + Zoom(ZOOM_STEP, x); } else { - Zoom(1.0 / zoom_offset, x); + Zoom(1.0 / ZOOM_STEP, x); } } else { -#if QT_VERSION >= 0x050d00 - Move(PageWidth * (-(float)event->angleDelta().y() / (120 / move_offset))); -#else - Move(PageWidth * (-(float)event->delta() / (120 / move_offset))); -#endif + Move(PageWidth * delta * move_offset / 120 ); } this->update(); } @@ -972,7 +971,6 @@ void Plot::mouseMoveEvent(QMouseEvent *event) { void Plot::keyPressEvent(QKeyEvent *event) { uint32_t offset; // Left/right movement offset (in sample size) - const double zoom_offset = 1.148698354997035; // 2**(1/5) if (event->modifiers() & Qt::ShiftModifier) { if (g_PlotGridX) @@ -983,22 +981,22 @@ void Plot::keyPressEvent(QKeyEvent *event) { if (event->modifiers() & Qt::ControlModifier) offset = 1; else - offset = (int)(20 / g_GraphPixelsPerPoint); + offset = int(ZOOM_LIMIT/g_GraphPixelsPerPoint); } switch (event->key()) { case Qt::Key_Down: if (event->modifiers() & Qt::ShiftModifier) { if (event->modifiers() & Qt::ControlModifier) { - Zoom(zoom_offset, CursorBPos); + Zoom(ZOOM_STEP, CursorBPos); } else { - Zoom(2, CursorBPos); + Zoom(ZOOM_STEP*2, CursorBPos); } } else { if (event->modifiers() & Qt::ControlModifier) { - Zoom(zoom_offset, CursorAPos); + Zoom(ZOOM_STEP, CursorAPos); } else { - Zoom(2, CursorAPos); + Zoom(ZOOM_STEP*2, CursorAPos); } } break; @@ -1006,15 +1004,15 @@ void Plot::keyPressEvent(QKeyEvent *event) { case Qt::Key_Up: if (event->modifiers() & Qt::ShiftModifier) { if (event->modifiers() & Qt::ControlModifier) { - Zoom(1.0 / zoom_offset, CursorBPos); + Zoom(1.0 / ZOOM_STEP, CursorBPos); } else { - Zoom(0.5, CursorBPos); + Zoom(1.0 / (ZOOM_STEP*2), CursorBPos); } } else { if (event->modifiers() & Qt::ControlModifier) { - Zoom(1.0 / zoom_offset, CursorAPos); + Zoom(1.0 / ZOOM_STEP, CursorAPos); } else { - Zoom(0.5, CursorAPos); + Zoom(1.0 / (ZOOM_STEP*2), CursorAPos); } } break; From 6947a61d982f80cc91fec4c0789f32f70ef639c0 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 9 Aug 2023 14:30:07 +0200 Subject: [PATCH 839/924] Whitespace --- .vscode/setup.sh | 12 ++--- armsrc/fpgaloader.c | 50 +++++++++---------- armsrc/ldscript | 2 +- client/CMakeLists.txt | 6 +-- client/deps/mbedtls.cmake | 4 +- client/dictionaries/iclass_default_keys.dic | 2 +- client/dictionaries/mfc_default_keys.dic | 12 ++--- client/dictionaries/mfdes_default_keys.dic | 2 +- client/experimental_lib/CMakeLists.txt | 8 +-- client/resources/ecplist.json | 1 - client/src/cmdhw.c | 2 +- client/src/cmdlfem4x50.c | 6 +-- common/crapto1/readme | 4 +- tools/fpga_compress/fpga_compress.c | 14 +++--- tools/hitag2crack/crack2/.gitignore | 6 +-- .../crack5opencl/ht2crack5opencl_kernel.cl | 2 +- tools/mfd_aes_brute/readme.txt | 16 +++--- tools/mfkey/example_trace.txt | 8 +-- tools/nonce2key/readme.txt | 2 +- tools/pm3_tests.sh | 2 +- traces/lf_ATA5577.txt | 4 +- 21 files changed, 82 insertions(+), 83 deletions(-) diff --git a/.vscode/setup.sh b/.vscode/setup.sh index 70672b924..a319ab056 100755 --- a/.vscode/setup.sh +++ b/.vscode/setup.sh @@ -39,7 +39,7 @@ function print_config { function setup_serial_port { if [ -z "$SerialPort" ]; then pm3list=$($VSCODEPATH/../pm3 --list 2>/dev/null) - #Use first port listed + #Use first port listed export SerialPort=$(echo $pm3list | head -n 1 | cut -c 4-) if [ -z "$SerialPort" ]; then echo >&2 "[!!] No serial port found, please set SerialPort manually" @@ -129,17 +129,17 @@ fi HOSTOS=$(uname | awk '{print toupper($0)}') if [ "$HOSTOS" = "LINUX" ]; then - if uname -a|grep -q Microsoft; then + if uname -a|grep -q Microsoft; then setup_wsl - else + else setup_linux - fi + fi elif [ "$HOSTOS" = "DARWIN" ]; then echo >&2 "[!!] MacOS not supported, sorry!" exit 1 elif [[ "$HOSTOS" =~ MINGW(32|64)_NT* ]]; then setup_ps else - echo >&2 "[!!] Host OS not recognized, abort: $HOSTOS" - exit 1 + echo >&2 "[!!] Host OS not recognized, abort: $HOSTOS" + exit 1 fi \ No newline at end of file diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 5c5b6f8c5..2d3f8caab 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -95,43 +95,43 @@ void SetupSpi(int mode) { case SPI_FPGA_MODE: AT91C_BASE_SPI->SPI_MR = (0 << 24) | // Delay between chip selects (take default: 6 MCK periods) - (0xE << 16) | // Peripheral Chip Select (selects FPGA SPI_NCS0 or PA11) + (0xE << 16) | // Peripheral Chip Select (selects FPGA SPI_NCS0 or PA11) (0 << 7) | // Local Loopback Disabled - AT91C_SPI_MODFDIS | // Mode Fault Detection disabled + AT91C_SPI_MODFDIS | // Mode Fault Detection disabled (0 << 2) | // Chip selects connected directly to peripheral - AT91C_SPI_PS_FIXED | // Fixed Peripheral Select + AT91C_SPI_PS_FIXED | // Fixed Peripheral Select AT91C_SPI_MSTR; // Master Mode AT91C_BASE_SPI->SPI_CSR[0] = (1 << 24) | // Delay between Consecutive Transfers (32 MCK periods) (1 << 16) | // Delay Before SPCK (1 MCK period) (6 << 8) | // Serial Clock Baud Rate (baudrate = MCK/6 = 24MHz/6 = 4M baud - AT91C_SPI_BITS_16 | // Bits per Transfer (16 bits) + AT91C_SPI_BITS_16 | // Bits per Transfer (16 bits) (0 << 3) | // Chip Select inactive after transfer - AT91C_SPI_NCPHA | // Clock Phase data captured on leading edge, changes on following edge + AT91C_SPI_NCPHA | // Clock Phase data captured on leading edge, changes on following edge (0 << 0); // Clock Polarity inactive state is logic 0 break; - /* - case SPI_LCD_MODE: - AT91C_BASE_SPI->SPI_MR = - ( 0 << 24) | // Delay between chip selects (take default: 6 MCK periods) - (0xB << 16) | // Peripheral Chip Select (selects LCD SPI_NCS2 or PA10) - ( 0 << 7) | // Local Loopback Disabled - ( 1 << 4) | // Mode Fault Detection disabled - ( 0 << 2) | // Chip selects connected directly to peripheral - ( 0 << 1) | // Fixed Peripheral Select - ( 1 << 0); // Master Mode +/* + case SPI_LCD_MODE: + AT91C_BASE_SPI->SPI_MR = + ( 0 << 24) | // Delay between chip selects (take default: 6 MCK periods) + (0xB << 16) | // Peripheral Chip Select (selects LCD SPI_NCS2 or PA10) + ( 0 << 7) | // Local Loopback Disabled + ( 1 << 4) | // Mode Fault Detection disabled + ( 0 << 2) | // Chip selects connected directly to peripheral + ( 0 << 1) | // Fixed Peripheral Select + ( 1 << 0); // Master Mode - AT91C_BASE_SPI->SPI_CSR[2] = - ( 1 << 24) | // Delay between Consecutive Transfers (32 MCK periods) - ( 1 << 16) | // Delay Before SPCK (1 MCK period) - ( 6 << 8) | // Serial Clock Baud Rate (baudrate = MCK/6 = 24MHz/6 = 4M baud - AT91C_SPI_BITS_9 | // Bits per Transfer (9 bits) - ( 0 << 3) | // Chip Select inactive after transfer - ( 1 << 1) | // Clock Phase data captured on leading edge, changes on following edge - ( 0 << 0); // Clock Polarity inactive state is logic 0 - break; - */ + AT91C_BASE_SPI->SPI_CSR[2] = + ( 1 << 24) | // Delay between Consecutive Transfers (32 MCK periods) + ( 1 << 16) | // Delay Before SPCK (1 MCK period) + ( 6 << 8) | // Serial Clock Baud Rate (baudrate = MCK/6 = 24MHz/6 = 4M baud + AT91C_SPI_BITS_9 | // Bits per Transfer (9 bits) + ( 0 << 3) | // Chip Select inactive after transfer + ( 1 << 1) | // Clock Phase data captured on leading edge, changes on following edge + ( 0 << 0); // Clock Polarity inactive state is logic 0 + break; +*/ default: DisableSpi(); break; diff --git a/armsrc/ldscript b/armsrc/ldscript index 1dd09e937..0824205a2 100644 --- a/armsrc/ldscript +++ b/armsrc/ldscript @@ -53,7 +53,7 @@ SECTIONS .bss : { __bss_start__ = .; *(.bss) - *(.bss.*) + *(.bss.*) . = ALIGN(4); __bss_end__ = .; } >ram AT>ram :bss diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index cbbedef73..5090dab63 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -379,7 +379,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/fileutils.c ${PM3_ROOT}/client/src/flash.c ${PM3_ROOT}/client/src/graph.c - ${PM3_ROOT}/client/src/iso4217.c + ${PM3_ROOT}/client/src/iso4217.c ${PM3_ROOT}/client/src/jansson_path.c ${PM3_ROOT}/client/src/preferences.c ${PM3_ROOT}/client/src/pm3.c @@ -656,14 +656,14 @@ if (MINGW) set(CMAKE_C_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_CXX_FLAGS}") - # GCC 10 has issues with false positives on stringop-overflow, + # GCC 10 has issues with false positives on stringop-overflow, # let's disable them for now (cf https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92955, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94335) # beware these flags didn't exist for GCC < 7 if(CMAKE_COMPILER_IS_GNUCXX) execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) if (GCC_VERSION VERSION_GREATER 10.0 OR GCC_VERSION VERSION_EQUAL 10.0) set(CMAKE_C_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") endif() endif(CMAKE_COMPILER_IS_GNUCXX) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 2d212d9c2..58b9aae23 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -10,8 +10,8 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ../../common/mbedtls/error.c ../../common/mbedtls/ecp.c ../../common/mbedtls/ecdh.c - ../../common/mbedtls/ecc_point_compression.c - ../../common/mbedtls/gcm.c + ../../common/mbedtls/ecc_point_compression.c + ../../common/mbedtls/gcm.c ../../common/mbedtls/ecp_curves.c ../../common/mbedtls/certs.c ../../common/mbedtls/camellia.c diff --git a/client/dictionaries/iclass_default_keys.dic b/client/dictionaries/iclass_default_keys.dic index d2d6489b2..c717cd88f 100644 --- a/client/dictionaries/iclass_default_keys.dic +++ b/client/dictionaries/iclass_default_keys.dic @@ -37,5 +37,5 @@ F41DAF58B20C8B91 66584C91EE80D5E5 C1B74D7478053AE2 # -# default iCLASS RFIDeas +# default iCLASS RFIDeas 6B65797374726B72 diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 345d1a702..a2ae9655e 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -36,7 +36,7 @@ D01AFEEB890A 2612C6DE84CA 707B11FC1481 # -# QL88 diversifed +# QL88 diversifed 03F9067646AE 2352C5B56D85 # @@ -71,8 +71,8 @@ B27CCAB30DBD D2ECE8B9395E # NSCP default key 1494E81663D7 -# -# NFC tools +# +# NFC tools 7c9fb8474242 # # Kiev keys @@ -299,7 +299,7 @@ AAFB06045877 25094DF6F148 # # -# https://mattionline.de/fitnessstudio-armband-reverse-engineering/ +# https://mattionline.de/fitnessstudio-armband-reverse-engineering/ # https://mattionline.de/milazycracker/ # gym wistband A, same as Fysiken A # gym wistband B @@ -310,7 +310,7 @@ AAFB06045877 A05DBD98E0FC # # GoFit -AA4DDA458EBB +AA4DDA458EBB EAB8066C7479 # # Nordic Wellness A, same as Fysiken A @@ -871,7 +871,7 @@ AD4FB33388BF # # HID MIFARE Classic 1k Key 484944204953 -204752454154 +204752454154 # HID MIFARE SO 3B7E4FD575AD 11496F97752A diff --git a/client/dictionaries/mfdes_default_keys.dic b/client/dictionaries/mfdes_default_keys.dic index fbf3a459f..3989054f9 100644 --- a/client/dictionaries/mfdes_default_keys.dic +++ b/client/dictionaries/mfdes_default_keys.dic @@ -15,7 +15,7 @@ ffffffffffffffffffffffffffffffffffffffffffffffff 6AC292FAA1315B4D858AB3A3D7D5933A 404142434445464748494a4b4c4d4e4f 3112B738D8862CCD34302EB299AAB456 # Gallagher AES (https://pastebin.com/GkbGLz8r) -47454D5850524553534F53414D504C45 # Gemalto +47454D5850524553534F53414D504C45 # Gemalto 2b7e151628aed2a6abf7158809cf4f3c fbeed618357133667c85e08f7236a8de f7ddac306ae266ccf90bc11ee46d513b diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 73ec65aad..f08ccdd6c 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -379,7 +379,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/fileutils.c ${PM3_ROOT}/client/src/flash.c ${PM3_ROOT}/client/src/graph.c - ${PM3_ROOT}/client/src/iso4217.c + ${PM3_ROOT}/client/src/iso4217.c ${PM3_ROOT}/client/src/jansson_path.c ${PM3_ROOT}/client/src/preferences.c ${PM3_ROOT}/client/src/pm3.c @@ -632,7 +632,7 @@ add_library(pm3rrg_rdv4 SHARED ) target_compile_definitions(pm3rrg_rdv4 PRIVATE LIBPM3) - + target_compile_options(pm3rrg_rdv4 PUBLIC -Wall -Werror -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1) @@ -656,14 +656,14 @@ if (MINGW) set(CMAKE_C_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-mno-ms-bitfields -fexec-charset=cp850 ${CMAKE_CXX_FLAGS}") - # GCC 10 has issues with false positives on stringop-overflow, + # GCC 10 has issues with false positives on stringop-overflow, # let's disable them for now (cf https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92955, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94335) # beware these flags didn't exist for GCC < 7 if(CMAKE_COMPILER_IS_GNUCXX) execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) if (GCC_VERSION VERSION_GREATER 10.0 OR GCC_VERSION VERSION_EQUAL 10.0) set(CMAKE_C_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "-Wno-stringop-overflow -Wno-error=stringop-overflow ${CMAKE_CXX_FLAGS}") endif() endif(CMAKE_COMPILER_IS_GNUCXX) diff --git a/client/resources/ecplist.json b/client/resources/ecplist.json index 991f79f2b..27db827f1 100644 --- a/client/resources/ecplist.json +++ b/client/resources/ecplist.json @@ -25,7 +25,6 @@ "description": "iPhones before IOS17 emit this frame so that other Apple devices don't react to the field during background reading. Also emitted during NFCReaderSession subtypes" }, - { "value": "6a02c801000300000000000000", "name": "Transit: Ventra", diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index aae539c34..ec3ab4867 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -690,7 +690,7 @@ static int CmdSetDivisor(const char *Cmd) { CLIParserFree(ctx); if (arg < 19) { - PrintAndLogEx(ERR, "Divisor must be between" _YELLOW_("19") " and " _YELLOW_("255")); + PrintAndLogEx(ERR, "Divisor must be between " _YELLOW_("19") " and " _YELLOW_("255")); return PM3_EINVARG; } // 12 000 000 (12MHz) diff --git a/client/src/cmdlfem4x50.c b/client/src/cmdlfem4x50.c index c81767c7a..a304a84fe 100644 --- a/client/src/cmdlfem4x50.c +++ b/client/src/cmdlfem4x50.c @@ -1230,9 +1230,9 @@ int CmdEM4x50Sim(const char *Cmd) { clearCommandBuffer(); SendCommandNG(CMD_LF_EM4X50_SIM, (uint8_t *)&password, sizeof(password)); - + PrintAndLogEx(INFO, "Press " _GREEN_("") " or pm3-button to abort simulation"); - + PacketResponseNG resp; // init to ZERO resp.cmd = 0, @@ -1245,7 +1245,7 @@ int CmdEM4x50Sim(const char *Cmd) { resp.oldarg[1] = 0; resp.oldarg[2] = 0; memset(resp.data.asBytes, 0, PM3_CMD_DATA_SIZE); - + bool keypress; do { keypress = kbd_enter_pressed(); diff --git a/common/crapto1/readme b/common/crapto1/readme index d57fa3e08..3a979efad 100644 --- a/common/crapto1/readme +++ b/common/crapto1/readme @@ -3,10 +3,10 @@ CRAPTO1 Provides a set of library functions which aid the verification of crypto1 weaknesses. - In short a partial implementation of: + In short a partial implementation of: Dismantling MIFARE Classic URL: http://www.sos.cs.ru.nl/applications/rfid/2008-esorics.pdf - Flavio D. Garcia, Gerhard de Koning Gans, Ruben Muijrers, + Flavio D. Garcia, Gerhard de Koning Gans, Ruben Muijrers, Peter van Rossum, Roel Verdult, Ronny Wichers Schreur, Bart Jacobs Institute for Computing and Information Sciences, Radboud University Nijmegen, The Netherlands diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 5cb34e54b..152c8627e 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -83,7 +83,7 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { if (num_infiles == 1) { // 1M bytes for now - buffer_size = 1024 * 1024; + buffer_size = 1024 * 1024; } uint32_t outsize_max = LZ4_compressBound(buffer_size); @@ -92,7 +92,7 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { if (outbuf == NULL) { fprintf(stderr, "failed to allocate memory"); free(fpga_config); - return (EXIT_FAILURE); + return (EXIT_FAILURE); } char *ring_buffer = calloc(buffer_size, sizeof(char)); @@ -100,7 +100,7 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { fprintf(stderr, "failed to allocate memory"); free(outbuf); free(fpga_config); - return (EXIT_FAILURE); + return (EXIT_FAILURE); } LZ4_streamHC_t *lz4_streamhc = LZ4_createStreamHC(); @@ -108,7 +108,7 @@ static int zlib_compress(FILE *infile[], uint8_t num_infiles, FILE *outfile) { int current_in = 0; int current_out = 0; - + while (current_in < total_size) { int bytes_to_copy = MIN(FPGA_RING_BUFFER_BYTES, (total_size - current_in)); @@ -261,7 +261,7 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, for (long k = 0; k < *outsize / (FPGA_INTERLEAVE_SIZE * num_outfiles); k++) { for (uint16_t j = 0; j < num_outfiles; j++) { if (k * FPGA_INTERLEAVE_SIZE < outfilesizes[j]) { - uint16_t chunk = (outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) < FPGA_INTERLEAVE_SIZE) ? + uint16_t chunk = (outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) < FPGA_INTERLEAVE_SIZE) ? outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) : FPGA_INTERLEAVE_SIZE; fwrite(outbufall + offset, chunk, sizeof(char), outfiles[j]); @@ -534,7 +534,7 @@ int main(int argc, char **argv) { for (uint16_t j = 0; j < num_input_files; j++) { fclose(infiles[j]); } - + free(infile_names); free(infiles); return (EXIT_FAILURE); @@ -546,7 +546,7 @@ int main(int argc, char **argv) { } else { ret = zlib_compress(infiles, num_input_files, outfile); } - + // close file handlers fclose(outfile); for (uint16_t j = 0; j < num_input_files; j++) { diff --git a/tools/hitag2crack/crack2/.gitignore b/tools/hitag2crack/crack2/.gitignore index 71494d126..7cf31896d 100644 --- a/tools/hitag2crack/crack2/.gitignore +++ b/tools/hitag2crack/crack2/.gitignore @@ -1,6 +1,6 @@ -ht2crack2buildtable -ht2crack2search -ht2crack2gentest +ht2crack2buildtable +ht2crack2search +ht2crack2gentest ht2crack2buildtable.exe ht2crack2search.exe diff --git a/tools/hitag2crack/crack5opencl/ht2crack5opencl_kernel.cl b/tools/hitag2crack/crack5opencl/ht2crack5opencl_kernel.cl index 1d4bd9653..f914b229c 100644 --- a/tools/hitag2crack/crack5opencl/ht2crack5opencl_kernel.cl +++ b/tools/hitag2crack/crack5opencl/ht2crack5opencl_kernel.cl @@ -603,7 +603,7 @@ void find_state(const uint candidate_index_base, const bitslice_t filter9_3 = f_b_bs(state[-2 + 37], state[-2 + 38], state[-2 + 40], state[-2 + 42]); const bitslice_t filter9 = f_c_bs(filter9_0, filter9_1, filter9_2, filter9_3, filter9_4); - + results8 &= (filter9 ^ keystream[9]); if (!results8) continue; diff --git a/tools/mfd_aes_brute/readme.txt b/tools/mfd_aes_brute/readme.txt index c69835609..4d0ac2ec3 100644 --- a/tools/mfd_aes_brute/readme.txt +++ b/tools/mfd_aes_brute/readme.txt @@ -42,10 +42,10 @@ expected result: 261c07a23f2bc8262f69f10a5bdf3764 -Bruteforce using 8 threads -Found timestamp........ 1631100305 ( '2021-09-08 13:25:05' ) -key.................... 261c07a23f2bc8262f69f10a5bdf3764 -execution time 1.00 sec +Bruteforce using 8 threads +Found timestamp........ 1631100305 ( '2021-09-08 13:25:05' ) +key.................... 261c07a23f2bc8262f69f10a5bdf3764 +execution time 1.00 sec # # complex @@ -55,8 +55,8 @@ expected result: e757178e13516a4f3171bc6ea85e165a -Bruteforce using 8 threads -Found timestamp........ 1606834416 ( '2020-12-01 15:53:36' ) -key.................... e757178e13516a4f3171bc6ea85e165a -execution time 18.54 sec +Bruteforce using 8 threads +Found timestamp........ 1606834416 ( '2020-12-01 15:53:36' ) +key.................... e757178e13516a4f3171bc6ea85e165a +execution time 18.54 sec diff --git a/tools/mfkey/example_trace.txt b/tools/mfkey/example_trace.txt index 3705cebd1..b068c0577 100644 --- a/tools/mfkey/example_trace.txt +++ b/tools/mfkey/example_trace.txt @@ -10,20 +10,20 @@ + 1287: : a1 e4 58 ce 6e ea 41 e0 + 64: 0: TAG 5c ad f4 39 -:: Sample of trace above, +:: Sample of trace above, ./mfkey64 9c599b32 82a4166c a1e458ce 6eea41e0 5cadf439 ----------------------------------------------------------------------------------------------------- :: For mfkey32, you want to get two different NR_0/NR_1 values. :: -./mfkey32 52B0F519 5417D1F8 4D545EA7 E15AC8C2 DAC1A7F4 5AE5C37F +./mfkey32 52B0F519 5417D1F8 4D545EA7 E15AC8C2 DAC1A7F4 5AE5C37F :: For mfkey32v2 (moebius), you want to get two different NT/NT1 values. (like in the SIM commands) :: ./mfkey32v2 12345678 1AD8DF2B 1D316024 620EF048 30D6CB07 C52077E2 837AC61A -./mfkey32v2 52B0F519 5417D1F8 4D545EA7 E15AC8C2 A1BA88C6 DAC1A7F4 5AE5C37F +./mfkey32v2 52B0F519 5417D1F8 4D545EA7 E15AC8C2 A1BA88C6 DAC1A7F4 5AE5C37F :: for mfkey64, you want to have the AT response from tag. @@ -32,7 +32,7 @@ ./mfkey64 52B0F519 5417D1F8 4D545EA7 E15AC8C2 5056E41B ----------------------------------------------------------------------------------------------------- -New functionality from @zhovner, +New functionality from @zhovner, ----------------------------------------------------------------------------------------------------- ### Communication decryption RDR 26 diff --git a/tools/nonce2key/readme.txt b/tools/nonce2key/readme.txt index 39ef9ae6b..d28e57434 100644 --- a/tools/nonce2key/readme.txt +++ b/tools/nonce2key/readme.txt @@ -1,7 +1,7 @@ To test the nonce2key tool. :: tip -You can use the output from "hf mf mifare" to use with this tool. +You can use the output from "hf mf mifare" to use with this tool. :: sample ./nonce2key e9cadd9c a8bf4a12 a020a8285858b090 050f010607060e07 5693be6c00000000 diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 434468147..0957fd386 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -288,7 +288,7 @@ while true; do if ! CheckFileExist "mf_nonce_brute exists" "$MFNONCEBRUTEBIN"; then break; fi if ! CheckExecute slow "mf_nonce_brute test 1/2" "$MFNONCEBRUTEBIN 9c599b32 5a920d85 1011 98d76b77 d6c6e870 0000 ca7e0b63 0111 3e709c8a" "Key found \[.*ffffffffffff.*\]"; then break; fi if ! CheckExecute slow "mf_nonce_brute test 2/2" "$MFNONCEBRUTEBIN 96519578 d7e3c6ac 0011 cd311951 9da49e49 0010 2bb22e00 0100 a4f7f398" "Key found \[.*3b7e4fd575ad.*\]"; then break; fi - fi + fi if $TESTALL || $TESTMFDAESBRUTE; then echo -e "\n${C_BLUE}Testing mfd_aes_brute:${C_NC} ${MFDASEBRUTEBIN:=./tools/mfd_aes_brute/mfd_aes_brute}" if ! CheckFileExist "mfd_aes_brute exists" "$MFDASEBRUTEBIN"; then break; fi diff --git a/traces/lf_ATA5577.txt b/traces/lf_ATA5577.txt index 7d9ac4561..0ae92af08 100644 --- a/traces/lf_ATA5577.txt +++ b/traces/lf_ATA5577.txt @@ -44,7 +44,7 @@ lf indala clone --fc 123 --cn 1337 lf read s 10000 data save f lf_ATA5577_indala -lf indala clone -l -r 80000001b23523a6c2e31eba3cbee4afb3c6ad1fcf649393928c14e5 +lf indala clone -l -r 80000001b23523a6c2e31eba3cbee4afb3c6ad1fcf649393928c14e5 lf read s 10000 data save f lf_ATA5577_indala_224 @@ -92,7 +92,7 @@ lf noralsy clone 112233 lf read s 10000 data save f lf_ATA5577_noralsy -lf pac clone c CD4F5552 +lf pac clone c CD4F5552 lf read s 10000 data save f lf_ATA5577_pac From 4b1090c8c75e4d619e9ae319cad986e380fbdccd Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 9 Aug 2023 19:49:55 +0200 Subject: [PATCH 840/924] Rename "vocabulory" to "vocabulary" --- Makefile | 2 +- client/pyscripts/pm3_help2list.py | 12 +- client/src/pm3line.c | 10 +- client/src/pm3line_vocabulary.h | 1627 +++++++++++++++++++++++++++++ client/src/pm3line_vocabulory.h | 814 --------------- 5 files changed, 1639 insertions(+), 826 deletions(-) create mode 100644 client/src/pm3line_vocabulary.h delete mode 100644 client/src/pm3line_vocabulory.h diff --git a/Makefile b/Makefile index 9a3ae0611..c548646bf 100644 --- a/Makefile +++ b/Makefile @@ -321,7 +321,7 @@ style: [ -x client/proxmark3 ] && client/proxmark3 --fulltext | sed 's#com[0-9]#/dev/ttyacm0#'|python3 client/pyscripts/pm3_help2json.py - doc/commands.json # Update the readline autocomplete autogenerated code - [ -x client/proxmark3 ] && client/proxmark3 --fulltext | python3 client/pyscripts/pm3_help2list.py - client/src/pm3line_vocabulory.h + [ -x client/proxmark3 ] && client/proxmark3 --fulltext | python3 client/pyscripts/pm3_help2list.py - client/src/pm3line_vocabulary.h # Detecting weird codepages and tabs. diff --git a/client/pyscripts/pm3_help2list.py b/client/pyscripts/pm3_help2list.py index 7c27d23fe..7355bca46 100755 --- a/client/pyscripts/pm3_help2list.py +++ b/client/pyscripts/pm3_help2list.py @@ -12,7 +12,7 @@ This version - Iceman Note: - This script is used as a helper script to generate the pm3line_vocabulory.h file. + This script is used as a helper script to generate the pm3line_vocabulary.h file. It need a working proxmark3 client to extract the help text. Ie: this script can't be used inside the normal build sequence. @@ -65,8 +65,8 @@ def main(): // readline auto complete utilities //----------------------------------------------------------------------------- -#ifndef PM3LINE_VOCABULORY_H__ -#define PM3LINE_VOCABULORY_H__ +#ifndef PM3LINE_VOCABULARY_H__ +#define PM3LINE_VOCABULARY_H__ #ifdef __cplusplus extern "C" { @@ -74,12 +74,12 @@ extern "C" { #include -typedef struct vocabulory_s { +typedef struct vocabulary_s { bool offline; const char *name; -} vocabulory_t; +} vocabulary_t; -const static vocabulory_t vocabulory[] = {\n""") +const static vocabulary_t vocabulary[] = {\n""") for key, values in command_data.items(): offline = 0 diff --git a/client/src/pm3line.c b/client/src/pm3line.c index 1bf4476e0..5c09c6135 100644 --- a/client/src/pm3line.c +++ b/client/src/pm3line.c @@ -27,7 +27,7 @@ #elif defined(HAVE_LINENOISE) #include "linenoise.h" #endif -#include "pm3line_vocabulory.h" +#include "pm3line_vocabulary.h" #include "pm3_cmd.h" #include "ui.h" // g_session #include "util.h" // str_ndup @@ -45,12 +45,12 @@ static char *rl_command_generator(const char *text, int state) { len = strlen(text); } - while ((command = vocabulory[index].name)) { + while ((command = vocabulary[index].name)) { // When no pm3 device present // and the command is not available offline, // we skip it. - if ((g_session.pm3_present == false) && (vocabulory[index].offline == false)) { + if ((g_session.pm3_present == false) && (vocabulary[index].offline == false)) { index++; continue; } @@ -82,12 +82,12 @@ static void ln_command_completion(const char *text, linenoiseCompletions *lc) { size_t prev_match_len = 0; size_t len = strlen(text); const char *command; - while ((command = vocabulory[index].name)) { + while ((command = vocabulary[index].name)) { // When no pm3 device present // and the command is not available offline, // we skip it. - if ((g_session.pm3_present == false) && (vocabulory[index].offline == false)) { + if ((g_session.pm3_present == false) && (vocabulary[index].offline == false)) { index++; continue; } diff --git a/client/src/pm3line_vocabulary.h b/client/src/pm3line_vocabulary.h new file mode 100644 index 000000000..96fb95dc5 --- /dev/null +++ b/client/src/pm3line_vocabulary.h @@ -0,0 +1,1627 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// readline auto complete utilities +//----------------------------------------------------------------------------- + +#ifndef PM3LINE_VOCABULARY_H__ +#define PM3LINE_VOCABULARY_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef struct vocabulary_s { + bool offline; + const char *name; +} vocabulary_t; + +const static vocabulary_t vocabulary[] = { + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data envelope" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data cthreshold" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data atr" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data num" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 1, "emv list" }, + { 1, "emv test" }, + { 0, "emv challenge" }, + { 0, "emv exec" }, + { 0, "emv genac" }, + { 0, "emv gpo" }, + { 0, "emv intauth" }, + { 0, "emv pse" }, + { 0, "emv reader" }, + { 0, "emv readrec" }, + { 0, "emv roca" }, + { 0, "emv scan" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 1, "hf 15 view" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 1, "hf iclass list" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 1, "hf iclass view" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 0, "hf iclass sam" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 0, "hf legic einfo" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf gdmcfg" }, + { 0, "hf mf gdmsetcfg" }, + { 0, "hf mf gdmsetblk" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 1, "hf mfp list" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp dump" }, + { 0, "hf mfp info" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp ndefformat" }, + { 0, "hf mfp ndefread" }, + { 0, "hf mfp ndefwrite" }, + { 1, "hf mfu help" }, + { 1, "hf mfu list" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu tamper" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 1, "hf topaz list" }, + { 0, "hf topaz dump" }, + { 0, "hf topaz info" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf vas help" }, + { 0, "hf vas reader" }, + { 1, "hf vas decrypt" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 1, "hw timeout" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag read" }, + { 0, "lf hitag wrbl" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag cc" }, + { 0, "lf hitag ta" }, + { 0, "lf hitag eload" }, + { 0, "lf hitag sim" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, + {0, NULL} +}; + +#ifdef __cplusplus +} +#endif + +#endif//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// readline auto complete utilities +//----------------------------------------------------------------------------- + +#ifndef PM3LINE_VOCABULORY_H__ +#define PM3LINE_VOCABULORY_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef struct vocabulory_s { + bool offline; + const char *name; +} vocabulory_t; + +const static vocabulory_t vocabulory[] = { + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data envelope" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data cthreshold" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data atr" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data num" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 1, "emv list" }, + { 1, "emv test" }, + { 0, "emv challenge" }, + { 0, "emv exec" }, + { 0, "emv genac" }, + { 0, "emv gpo" }, + { 0, "emv intauth" }, + { 0, "emv pse" }, + { 0, "emv reader" }, + { 0, "emv readrec" }, + { 0, "emv roca" }, + { 0, "emv scan" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 1, "hf 15 view" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 1, "hf iclass list" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 1, "hf iclass view" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 0, "hf iclass sam" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 0, "hf legic einfo" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf gdmcfg" }, + { 0, "hf mf gdmsetcfg" }, + { 0, "hf mf gdmsetblk" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 1, "hf mfp list" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp dump" }, + { 0, "hf mfp info" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp ndefformat" }, + { 0, "hf mfp ndefread" }, + { 0, "hf mfp ndefwrite" }, + { 1, "hf mfu help" }, + { 1, "hf mfu list" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu tamper" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 1, "hf topaz list" }, + { 0, "hf topaz dump" }, + { 0, "hf topaz info" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf vas help" }, + { 0, "hf vas reader" }, + { 1, "hf vas decrypt" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 1, "hw timeout" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag read" }, + { 0, "lf hitag wrbl" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag cc" }, + { 0, "lf hitag ta" }, + { 0, "lf hitag eload" }, + { 0, "lf hitag sim" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, + {0, NULL} +}; + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h deleted file mode 100644 index 40d2bcc29..000000000 --- a/client/src/pm3line_vocabulory.h +++ /dev/null @@ -1,814 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- -// readline auto complete utilities -//----------------------------------------------------------------------------- - -#ifndef PM3LINE_VOCABULORY_H__ -#define PM3LINE_VOCABULORY_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -typedef struct vocabulory_s { - bool offline; - const char *name; -} vocabulory_t; - -const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data envelope" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data cthreshold" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data atr" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data num" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 1, "emv list" }, - { 1, "emv test" }, - { 0, "emv challenge" }, - { 0, "emv exec" }, - { 0, "emv genac" }, - { 0, "emv gpo" }, - { 0, "emv intauth" }, - { 0, "emv pse" }, - { 0, "emv reader" }, - { 0, "emv readrec" }, - { 0, "emv roca" }, - { 0, "emv scan" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 1, "hf 15 view" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 1, "hf iclass list" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 1, "hf iclass view" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 0, "hf iclass sam" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 0, "hf legic einfo" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf gdmcfg" }, - { 0, "hf mf gdmsetcfg" }, - { 0, "hf mf gdmsetblk" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 1, "hf mfp list" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp dump" }, - { 0, "hf mfp info" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp ndefformat" }, - { 0, "hf mfp ndefread" }, - { 0, "hf mfp ndefwrite" }, - { 1, "hf mfu help" }, - { 1, "hf mfu list" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu tamper" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 1, "hf topaz list" }, - { 0, "hf topaz dump" }, - { 0, "hf topaz info" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf vas help" }, - { 0, "hf vas reader" }, - { 1, "hf vas decrypt" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 1, "hw timeout" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 brute" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag read" }, - { 0, "lf hitag wrbl" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag cc" }, - { 0, "lf hitag ta" }, - { 0, "lf hitag eload" }, - { 0, "lf hitag sim" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, - {0, NULL} -}; - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file From 0b143e5bcd02dd9598eb03406149691d36cde0e4 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 18:57:36 -0700 Subject: [PATCH 841/924] Add 5..8 byte versions for LE/BE conversions --- common/commonutil.c | 252 +++++++++++++++++++++++++++++++++++++------- common/commonutil.h | 19 ++++ 2 files changed, 235 insertions(+), 36 deletions(-) diff --git a/common/commonutil.c b/common/commonutil.c index 07b55f1f9..2e850fb39 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -161,75 +161,255 @@ uint64_t bytes_to_num(uint8_t *src, size_t len) { } uint16_t MemLeToUint2byte(const uint8_t *data) { - return (uint16_t)((uint16_t) - (data[1] << 8) + data[0] - ); + return (uint16_t)( + (((uint16_t)(data[1])) << (8*1)) + + (((uint16_t)(data[0])) << (8*0)) + ); } uint32_t MemLeToUint3byte(const uint8_t *data) { - return (uint32_t)((uint32_t) - (data[2] << 16) + (data[1] << 8) + data[0] - ); + return (uint32_t)( + (((uint32_t)(data[2])) << (8*2)) + + (((uint32_t)(data[1])) << (8*1)) + + (((uint32_t)(data[0])) << (8*0)) + ); } uint32_t MemLeToUint4byte(const uint8_t *data) { - return (uint32_t)((uint32_t) - (data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0] - ); + return (uint32_t)( + (((uint32_t)(data[3])) << (8*3)) + + (((uint32_t)(data[2])) << (8*2)) + + (((uint32_t)(data[1])) << (8*1)) + + (((uint32_t)(data[0])) << (8*0)) + ); +} + +uint64_t MemLeToUint5byte(const uint8_t *data) { + return (uint64_t)( + (((uint64_t)(data[4])) << (8*4)) + + (((uint64_t)(data[3])) << (8*3)) + + (((uint64_t)(data[2])) << (8*2)) + + (((uint64_t)(data[1])) << (8*1)) + + (((uint64_t)(data[0])) << (8*0)) + ); +} + +uint64_t MemLeToUint6byte(const uint8_t *data) { + return (uint64_t)( + (((uint64_t)(data[5])) << (8*5)) + + (((uint64_t)(data[4])) << (8*4)) + + (((uint64_t)(data[3])) << (8*3)) + + (((uint64_t)(data[2])) << (8*2)) + + (((uint64_t)(data[1])) << (8*1)) + + (((uint64_t)(data[0])) << (8*0)) + ); +} + +uint64_t MemLeToUint7byte(const uint8_t *data) { + return (uint64_t)( + (((uint64_t)(data[6])) << (8*6)) + + (((uint64_t)(data[5])) << (8*5)) + + (((uint64_t)(data[4])) << (8*4)) + + (((uint64_t)(data[3])) << (8*3)) + + (((uint64_t)(data[2])) << (8*2)) + + (((uint64_t)(data[1])) << (8*1)) + + (((uint64_t)(data[0])) << (8*0)) + ); +} + +uint64_t MemLeToUint8byte(const uint8_t *data) { + return (uint64_t)( + (((uint64_t)(data[7])) << (8*7)) + + (((uint64_t)(data[6])) << (8*6)) + + (((uint64_t)(data[5])) << (8*5)) + + (((uint64_t)(data[4])) << (8*4)) + + (((uint64_t)(data[3])) << (8*3)) + + (((uint64_t)(data[2])) << (8*2)) + + (((uint64_t)(data[1])) << (8*1)) + + (((uint64_t)(data[0])) << (8*0)) + ); } uint16_t MemBeToUint2byte(const uint8_t *data) { - return (uint16_t)((uint16_t) - (data[0] << 8) + data[1] - ); + return (uint16_t)( + (((uint16_t)(data[0])) << (8*1)) + + (((uint16_t)(data[1])) << (8*0)) + ); } uint32_t MemBeToUint3byte(const uint8_t *data) { - return (uint32_t)((uint32_t) - (data[0] << 16) + (data[1] << 8) + data[2] - ); + return (uint32_t)( + (((uint32_t)(data[0])) << (8*2)) + + (((uint32_t)(data[1])) << (8*1)) + + (((uint32_t)(data[2])) << (8*0)) + ); } -inline uint32_t MemBeToUint4byte(const uint8_t *data) { +uint32_t MemBeToUint4byte(const uint8_t *data) { return (uint32_t)( - (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3] - ); + (((uint32_t)(data[0])) << (8*3)) + + (((uint32_t)(data[1])) << (8*2)) + + (((uint32_t)(data[2])) << (8*1)) + + (((uint32_t)(data[3])) << (8*0)) + ); +} + +uint64_t MemBeToUint5byte(const uint8_t *data) { + return (uint64_t)( + (((uint64_t)(data[0])) << (8*4)) + + (((uint64_t)(data[1])) << (8*3)) + + (((uint64_t)(data[2])) << (8*2)) + + (((uint64_t)(data[3])) << (8*1)) + + (((uint64_t)(data[4])) << (8*0)) + ); +} + +uint64_t MemBeToUint6byte(const uint8_t *data) { + return (uint64_t)( + (((uint64_t)(data[0])) << (8*5)) + + (((uint64_t)(data[1])) << (8*4)) + + (((uint64_t)(data[2])) << (8*3)) + + (((uint64_t)(data[3])) << (8*2)) + + (((uint64_t)(data[4])) << (8*1)) + + (((uint64_t)(data[5])) << (8*0)) + ); +} + +uint64_t MemBeToUint7byte(const uint8_t *data) { + return (uint64_t)( + (((uint64_t)(data[0])) << (8*6)) + + (((uint64_t)(data[1])) << (8*5)) + + (((uint64_t)(data[2])) << (8*4)) + + (((uint64_t)(data[3])) << (8*3)) + + (((uint64_t)(data[4])) << (8*2)) + + (((uint64_t)(data[5])) << (8*1)) + + (((uint64_t)(data[6])) << (8*0)) + ); +} + +uint64_t MemBeToUint8byte(const uint8_t *data) { + return (uint64_t)( + (((uint64_t)(data[0])) << (8*7)) + + (((uint64_t)(data[1])) << (8*6)) + + (((uint64_t)(data[2])) << (8*5)) + + (((uint64_t)(data[3])) << (8*4)) + + (((uint64_t)(data[4])) << (8*3)) + + (((uint64_t)(data[5])) << (8*2)) + + (((uint64_t)(data[6])) << (8*1)) + + (((uint64_t)(data[7])) << (8*0)) + ); } void Uint2byteToMemLe(uint8_t *data, uint16_t value) { - data[1] = (value >> 8) & 0xff; - data[0] = value & 0xff; + data[0] = (uint8_t)((value >> (8*0)) & 0xffu); + data[1] = (uint8_t)((value >> (8*1)) & 0xffu); } void Uint3byteToMemLe(uint8_t *data, uint32_t value) { - data[2] = (value >> 16) & 0xff; - data[1] = (value >> 8) & 0xff; - data[0] = value & 0xff; + data[0] = (uint8_t)((value >> (8*0)) & 0xffu); + data[1] = (uint8_t)((value >> (8*1)) & 0xffu); + data[2] = (uint8_t)((value >> (8*2)) & 0xffu); } void Uint4byteToMemLe(uint8_t *data, uint32_t value) { - data[3] = (value >> 24) & 0xff; - data[2] = (value >> 16) & 0xff; - data[1] = (value >> 8) & 0xff; - data[0] = value & 0xff; + data[0] = (uint8_t)((value >> (8*0)) & 0xffu); + data[1] = (uint8_t)((value >> (8*1)) & 0xffu); + data[2] = (uint8_t)((value >> (8*2)) & 0xffu); + data[3] = (uint8_t)((value >> (8*3)) & 0xffu); +} + +void Uint5byteToMemLe(uint8_t *data, uint64_t value) { + data[0] = (uint8_t)((value >> (8*0)) & 0xffu); + data[1] = (uint8_t)((value >> (8*1)) & 0xffu); + data[2] = (uint8_t)((value >> (8*2)) & 0xffu); + data[3] = (uint8_t)((value >> (8*3)) & 0xffu); + data[4] = (uint8_t)((value >> (8*4)) & 0xffu); +} + +void Uint6byteToMemLe(uint8_t *data, uint64_t value) { + data[0] = (uint8_t)((value >> (8*0)) & 0xffu); + data[1] = (uint8_t)((value >> (8*1)) & 0xffu); + data[2] = (uint8_t)((value >> (8*2)) & 0xffu); + data[3] = (uint8_t)((value >> (8*3)) & 0xffu); + data[4] = (uint8_t)((value >> (8*4)) & 0xffu); + data[5] = (uint8_t)((value >> (8*5)) & 0xffu); +} + +void Uint7byteToMemLe(uint8_t *data, uint64_t value) { + data[0] = (uint8_t)((value >> (8*0)) & 0xffu); + data[1] = (uint8_t)((value >> (8*1)) & 0xffu); + data[2] = (uint8_t)((value >> (8*2)) & 0xffu); + data[3] = (uint8_t)((value >> (8*3)) & 0xffu); + data[4] = (uint8_t)((value >> (8*4)) & 0xffu); + data[5] = (uint8_t)((value >> (8*5)) & 0xffu); + data[6] = (uint8_t)((value >> (8*6)) & 0xffu); +} + +void Uint8byteToMemLe(uint8_t *data, uint64_t value) { + data[0] = (uint8_t)((value >> (8*0)) & 0xffu); + data[1] = (uint8_t)((value >> (8*1)) & 0xffu); + data[2] = (uint8_t)((value >> (8*2)) & 0xffu); + data[3] = (uint8_t)((value >> (8*3)) & 0xffu); + data[4] = (uint8_t)((value >> (8*4)) & 0xffu); + data[5] = (uint8_t)((value >> (8*5)) & 0xffu); + data[6] = (uint8_t)((value >> (8*6)) & 0xffu); + data[7] = (uint8_t)((value >> (8*7)) & 0xffu); } void Uint2byteToMemBe(uint8_t *data, uint16_t value) { - data[0] = (value >> 8) & 0xff; - data[1] = value & 0xff; + data[0] = (uint8_t)((value >> (8*1)) & 0xffu); + data[1] = (uint8_t)((value >> (8*0)) & 0xffu); } void Uint3byteToMemBe(uint8_t *data, uint32_t value) { - data[0] = (value >> 16) & 0xff; - data[1] = (value >> 8) & 0xff; - data[2] = value & 0xff; + data[0] = (uint8_t)((value >> (8*2)) & 0xffu); + data[1] = (uint8_t)((value >> (8*1)) & 0xffu); + data[2] = (uint8_t)((value >> (8*0)) & 0xffu); } void Uint4byteToMemBe(uint8_t *data, uint32_t value) { - data[0] = (value >> 24) & 0xff; - data[1] = (value >> 16) & 0xff; - data[2] = (value >> 8) & 0xff; - data[3] = value & 0xff; + data[0] = (uint8_t)((value >> (8*3)) & 0xffu); + data[1] = (uint8_t)((value >> (8*2)) & 0xffu); + data[2] = (uint8_t)((value >> (8*1)) & 0xffu); + data[3] = (uint8_t)((value >> (8*0)) & 0xffu); +} + +void Uint5byteToMemBe(uint8_t *data, uint64_t value) { + data[0] = (uint8_t)((value >> (8*4)) & 0xffu); + data[1] = (uint8_t)((value >> (8*3)) & 0xffu); + data[2] = (uint8_t)((value >> (8*2)) & 0xffu); + data[3] = (uint8_t)((value >> (8*1)) & 0xffu); + data[4] = (uint8_t)((value >> (8*0)) & 0xffu); +} + +void Uint6byteToMemBe(uint8_t *data, uint64_t value) { + data[0] = (uint8_t)((value >> (8*5)) & 0xffu); + data[1] = (uint8_t)((value >> (8*4)) & 0xffu); + data[2] = (uint8_t)((value >> (8*3)) & 0xffu); + data[3] = (uint8_t)((value >> (8*2)) & 0xffu); + data[4] = (uint8_t)((value >> (8*1)) & 0xffu); + data[5] = (uint8_t)((value >> (8*0)) & 0xffu); +} + +void Uint7byteToMemBe(uint8_t *data, uint64_t value) { + data[0] = (uint8_t)((value >> (8*6)) & 0xffu); + data[1] = (uint8_t)((value >> (8*5)) & 0xffu); + data[2] = (uint8_t)((value >> (8*4)) & 0xffu); + data[3] = (uint8_t)((value >> (8*3)) & 0xffu); + data[4] = (uint8_t)((value >> (8*2)) & 0xffu); + data[5] = (uint8_t)((value >> (8*1)) & 0xffu); + data[6] = (uint8_t)((value >> (8*0)) & 0xffu); +} + +void Uint8byteToMemBe(uint8_t *data, uint64_t value) { + data[0] = (uint8_t)((value >> (8*7)) & 0xffu); + data[1] = (uint8_t)((value >> (8*6)) & 0xffu); + data[2] = (uint8_t)((value >> (8*5)) & 0xffu); + data[3] = (uint8_t)((value >> (8*4)) & 0xffu); + data[4] = (uint8_t)((value >> (8*3)) & 0xffu); + data[5] = (uint8_t)((value >> (8*2)) & 0xffu); + data[6] = (uint8_t)((value >> (8*1)) & 0xffu); + data[7] = (uint8_t)((value >> (8*0)) & 0xffu); } // RotateLeft - Ultralight, Desfire diff --git a/common/commonutil.h b/common/commonutil.h index 7beb95355..23dd27f85 100644 --- a/common/commonutil.h +++ b/common/commonutil.h @@ -65,15 +65,34 @@ uint64_t bytes_to_num(uint8_t *src, size_t len); uint16_t MemLeToUint2byte(const uint8_t *data); uint32_t MemLeToUint3byte(const uint8_t *data); uint32_t MemLeToUint4byte(const uint8_t *data); +uint64_t MemLeToUint5byte(const uint8_t *data); +uint64_t MemLeToUint6byte(const uint8_t *data); +uint64_t MemLeToUint7byte(const uint8_t *data); +uint64_t MemLeToUint8byte(const uint8_t *data); + uint16_t MemBeToUint2byte(const uint8_t *data); uint32_t MemBeToUint3byte(const uint8_t *data); uint32_t MemBeToUint4byte(const uint8_t *data); +uint64_t MemBeToUint5byte(const uint8_t *data); +uint64_t MemBeToUint6byte(const uint8_t *data); +uint64_t MemBeToUint7byte(const uint8_t *data); +uint64_t MemBeToUint8byte(const uint8_t *data); + void Uint2byteToMemLe(uint8_t *data, uint16_t value); void Uint3byteToMemLe(uint8_t *data, uint32_t value); void Uint4byteToMemLe(uint8_t *data, uint32_t value); +void Uint5byteToMemLe(uint8_t *data, uint64_t value); +void Uint6byteToMemLe(uint8_t *data, uint64_t value); +void Uint7byteToMemLe(uint8_t *data, uint64_t value); +void Uint8byteToMemLe(uint8_t *data, uint64_t value); + void Uint2byteToMemBe(uint8_t *data, uint16_t value); void Uint3byteToMemBe(uint8_t *data, uint32_t value); void Uint4byteToMemBe(uint8_t *data, uint32_t value); +void Uint5byteToMemBe(uint8_t *data, uint64_t value); +void Uint6byteToMemBe(uint8_t *data, uint64_t value); +void Uint7byteToMemBe(uint8_t *data, uint64_t value); +void Uint8byteToMemBe(uint8_t *data, uint64_t value); // rotate left byte array void rol(uint8_t *data, const size_t len); From c858d6fdc7c5afbcea377dddce44ec15356f36b2 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 19:07:35 -0700 Subject: [PATCH 842/924] Minor update to WSL2 instructions --- .../Windows-WSL2-Installation-Instructions.md | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md b/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md index 21cb8048c..0869ab04e 100644 --- a/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/Windows-WSL2-Installation-Instructions.md @@ -156,27 +156,18 @@ However, it may be necessary to give the `udev` service a kind reminder: ## Inform udev that it really, really should work -The following workaround appears to work to get udev to apply the permissions -appropriately. Note that this may need to be run again, such as when the WSL2 -distributions have been restarted. I don't know why ... but it's a small hiccup. +As of August 2023, the following needs to be done anytime the WSL2 subsystem +has been restarted (e.g., host machine reboot, first WSL2 console window, etc.). +Otherwise, it appears that `udev` service will not see the arrival of devices, +and therefore won't modify permissions on `/dev/ttyACM*` devices. -```sh -sudo udevadm trigger --action=change -``` - -General instructions suggested to use `sudo udevadm control --reload-rules`. However, -this may simply result in the following cryptic error message: - -```sh -$ sudo udevadm control --reload-rules -[sudo] password for root: -Failed to send reload request: No such file or directory -``` - -_Note that the following should **NOT** be required:_ +After this is run once, `udev` appears to work correctly (at least until the +host machine reboots or the last WSL console window is closed for a while). +One workaround is to simply ensure you keep at least one WSL2 console open. ```sh sudo service udev restart +sudo udevadm trigger --action=change ``` ## Verify Device Exists From db8f91d7e1625f5c56a5c17aff08ebb77fbd5582 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 20:01:20 -0700 Subject: [PATCH 843/924] make logfile more unique (per client run) --- client/src/proxmark3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/proxmark3.h b/client/src/proxmark3.h index a9f80ae91..71072422a 100644 --- a/client/src/proxmark3.h +++ b/client/src/proxmark3.h @@ -36,7 +36,7 @@ #define PROXPROMPT_DEV_OFFLINE _RL_BOLD_RED_("offline") #define PROXHISTORY "history.txt" -#define PROXLOG "log_%Y%m%d.txt" +#define PROXLOG "log_%Y%m%d%H%M%S.txt" #define MAX_NESTED_CMDSCRIPT 10 #define MAX_NESTED_LUASCRIPT 10 From 6eae62edecbaddab5a305b6f74337b272183bbe3 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 20:34:13 -0700 Subject: [PATCH 844/924] const for `hitagS` --- armsrc/hitagS.c | 10 +++++----- armsrc/hitagS.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index db219bcf2..d304cb6b3 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -635,7 +635,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, /* * Emulates a Hitag S Tag with the given data from the .hts file */ -void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data, bool ledcontrol) { +void SimulateHitagSTag(bool tag_mem_supplied, const uint8_t *data, bool ledcontrol) { StopTicks(); @@ -1052,7 +1052,7 @@ static size_t concatbits(uint8_t *dstbuf, size_t dstbufskip, const uint8_t *srcb return dstbufskip + srcbuflen; } -static int selectHitagS(hitag_function htf, hitag_data *htd, uint8_t *tx, size_t sizeoftx, uint8_t *rx, size_t sizeofrx, int t_wait, bool ledcontrol) { +static int selectHitagS(hitag_function htf, const hitag_data *htd, uint8_t *tx, size_t sizeoftx, uint8_t *rx, size_t sizeofrx, int t_wait, bool ledcontrol) { StopTicks(); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); @@ -1263,7 +1263,7 @@ static int selectHitagS(hitag_function htf, hitag_data *htd, uint8_t *tx, size_t * If the key was given the password will be decrypted. * Reads every page of a hitag S transpoder. */ -void ReadHitagS(hitag_function htf, hitag_data *htd, bool ledcontrol) { +void ReadHitagS(hitag_function htf, const hitag_data *htd, bool ledcontrol) { uint8_t rx[HITAG_FRAME_LEN]; size_t rxlen = 0; @@ -1356,7 +1356,7 @@ void ReadHitagS(hitag_function htf, hitag_data *htd, bool ledcontrol) { * Authenticates to the Tag with the given Key or Challenge. * Writes the given 32Bit data into page_ */ -void WritePageHitagS(hitag_function htf, hitag_data *htd, int page, bool ledcontrol) { +void WritePageHitagS(hitag_function htf, const hitag_data *htd, int page, bool ledcontrol) { bool bSuccessful = false; //check for valid input @@ -1443,7 +1443,7 @@ write_end: * is not received correctly due to Antenna problems. This function * detects these challenges. */ -void Hitag_check_challenges(uint8_t *data, uint32_t datalen, bool ledcontrol) { +void Hitag_check_challenges(const uint8_t *data, uint32_t datalen, bool ledcontrol) { //check for valid input if (datalen < 8) { Dbprintf("Error, need chals"); diff --git a/armsrc/hitagS.h b/armsrc/hitagS.h index 49a4f358f..cbb87722f 100644 --- a/armsrc/hitagS.h +++ b/armsrc/hitagS.h @@ -25,8 +25,8 @@ #include "hitag.h" -void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data, bool ledcontrol); -void ReadHitagS(hitag_function htf, hitag_data *htd, bool ledcontrol); -void WritePageHitagS(hitag_function htf, hitag_data *htd, int page, bool ledcontrol); -void Hitag_check_challenges(uint8_t *data, uint32_t datalen, bool ledcontrol); +void SimulateHitagSTag(bool tag_mem_supplied, const uint8_t *data, bool ledcontrol); +void ReadHitagS(hitag_function htf, const hitag_data *htd, bool ledcontrol); +void WritePageHitagS(hitag_function htf, const hitag_data *htd, int page, bool ledcontrol); +void Hitag_check_challenges(const uint8_t *data, uint32_t datalen, bool ledcontrol); #endif From 8af8723528847596b0f3979cf4f1c0a36216bee7 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 21:45:21 -0700 Subject: [PATCH 845/924] const for `i2c` --- armsrc/i2c.c | 6 +++--- armsrc/i2c.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/armsrc/i2c.c b/armsrc/i2c.c index ca3cb46fd..016ae2f13 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -407,7 +407,7 @@ bool I2C_WriteByte(uint8_t data, uint8_t device_cmd, uint8_t device_address) { //Sends array of data (Array, length, command to be written , SlaveDevice address ). // len = uint16 because we need to write up to 256 bytes -bool I2C_BufferWrite(uint8_t *data, uint16_t len, uint8_t device_cmd, uint8_t device_address) { +bool I2C_BufferWrite(const uint8_t *data, uint16_t len, uint8_t device_cmd, uint8_t device_address) { bool bBreak = true; do { if (!I2C_Start()) @@ -602,7 +602,7 @@ int16_t I2C_ReadFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t return readcount; } -bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address) { +bool I2C_WriteFW(const uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address) { //START, 0xB0, 0x00, 0x00, xx, yy, zz, ......, STOP bool bBreak = true; @@ -772,7 +772,7 @@ void SmartCardAtr(void) { // StopTicks(); } -void SmartCardRaw(smart_card_raw_t *p) { +void SmartCardRaw(const smart_card_raw_t *p) { LED_D_ON(); uint16_t len = 0; diff --git a/armsrc/i2c.h b/armsrc/i2c.h index 972704c1b..6fa8b8809 100644 --- a/armsrc/i2c.h +++ b/armsrc/i2c.h @@ -41,12 +41,12 @@ void I2C_Reset_EnterBootloader(void); bool I2C_WriteCmd(uint8_t device_cmd, uint8_t device_address); bool I2C_WriteByte(uint8_t data, uint8_t device_cmd, uint8_t device_address); -bool I2C_BufferWrite(uint8_t *data, uint16_t len, uint8_t device_cmd, uint8_t device_address); +bool I2C_BufferWrite(const uint8_t *data, uint16_t len, uint8_t device_cmd, uint8_t device_address); int16_t I2C_BufferRead(uint8_t *data, uint16_t len, uint8_t device_cmd, uint8_t device_address); // for firmware int16_t I2C_ReadFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address); -bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address); +bool I2C_WriteFW(const uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address); bool sc_rx_bytes(uint8_t *dest, uint16_t *destlen); // @@ -54,7 +54,7 @@ bool GetATR(smart_card_atr_t *card_ptr, bool verbose); // generice functions void SmartCardAtr(void); -void SmartCardRaw(smart_card_raw_t *p); +void SmartCardRaw(const smart_card_raw_t *p); void SmartCardUpgrade(uint64_t arg0); void SmartCardSetBaud(uint64_t arg0); void SmartCardSetClock(uint64_t arg0); From efce76db53db4e71a64807c4c731714791faa76a Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 22:07:04 -0700 Subject: [PATCH 846/924] more const for `iso14443a` --- armsrc/iso14443a.c | 4 ++-- armsrc/iso14443a.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 45f61f4ce..c3ee6f050 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -188,7 +188,7 @@ void printHf14aConfig(void) { * @brief setSamplingConfig * @param sc */ -void setHf14aConfig(hf14a_config *hc) { +void setHf14aConfig(const hf14a_config *hc) { if ((hc->forceanticol >= 0) && (hc->forceanticol <= 2)) hf14aconfig.forceanticol = hc->forceanticol; @@ -564,7 +564,7 @@ RAMFUNC int ManchesterDecoding(uint8_t bit, uint16_t offset, uint32_t non_real_t } -// Thinfilm, Kovio mangels ISO14443A in the way that they don't use start bit nor parity bits. +// Thinfilm, Kovio mangles ISO14443A in the way that they don't use start bit nor parity bits. static RAMFUNC int ManchesterDecoding_Thinfilm(uint8_t bit) { Demod.twoBits = (Demod.twoBits << 8) | bit; diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index a6f68067b..7957e6f48 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -121,7 +121,7 @@ typedef enum { #endif void printHf14aConfig(void); -void setHf14aConfig(hf14a_config *hc); +void setHf14aConfig(const hf14a_config *hc); hf14a_config *getHf14aConfig(void); void iso14a_set_timeout(uint32_t timeout); uint32_t iso14a_get_timeout(void); From a8d84b2f132e021071d635ba68edc468a5e4842e Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 22:16:11 -0700 Subject: [PATCH 847/924] more const for `iso14443b` --- armsrc/iso14443b.c | 2 +- armsrc/iso14443b.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index e4f1e4e93..8fe502833 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -701,7 +701,7 @@ static void TransmitFor14443b_AsTag(const uint8_t *response, uint16_t len) { // Main loop of simulated tag: receive commands from reader, decide what // response to send, and send it. //----------------------------------------------------------------------------- -void SimulateIso14443bTag(uint8_t *pupi) { +void SimulateIso14443bTag(const uint8_t *pupi) { LED_A_ON(); // the only commands we understand is WUPB, AFI=0, Select All, N=1: diff --git a/armsrc/iso14443b.h b/armsrc/iso14443b.h index 2579e6f1c..afa21e9d1 100644 --- a/armsrc/iso14443b.h +++ b/armsrc/iso14443b.h @@ -41,7 +41,7 @@ int iso14443b_select_card(iso14b_card_select_t *card); int iso14443b_select_card_srx(iso14b_card_select_t *card); int iso14443b_select_xrx_card(iso14b_card_select_t *card); -void SimulateIso14443bTag(uint8_t *pupi); +void SimulateIso14443bTag(const uint8_t *pupi); void AcquireRawAdcSamplesIso14443b(uint32_t parameter); void ReadSTBlock(uint8_t blocknr); void SniffIso14443b(void); From db46e2ce110b4c91a6e49b1b902fd3260095d1a3 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 22:45:48 -0700 Subject: [PATCH 848/924] more const for `iso15693` --- armsrc/iso15693.c | 40 ++++++++++++++++++++-------------------- armsrc/iso15693.h | 16 ++++++++-------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index e0c3e4436..0c5e7c7ab 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -2656,7 +2656,7 @@ void SetTag15693Uid(const uint8_t *uid) { switch_off(); } -static void init_password_15693_Slix(uint8_t *buffer, uint8_t *pwd, const uint8_t *rnd) { +static void init_password_15693_Slix(uint8_t *buffer, const uint8_t *pwd, const uint8_t *rnd) { memcpy(buffer, pwd, 4); if (rnd) { buffer[0] ^= rnd[0]; @@ -2684,7 +2684,7 @@ static bool get_rnd_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t return true; } -static uint32_t disable_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pass_id, uint8_t *password) { +static uint32_t disable_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pass_id, const uint8_t *password) { uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { @@ -2706,7 +2706,7 @@ static uint32_t disable_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_ti return PM3_SUCCESS; } -static uint32_t set_pass_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pass_id, uint8_t *password, uint8_t *uid) { +static uint32_t set_pass_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pass_id, const uint8_t *password, uint8_t *uid) { uint8_t rnd[2]; @@ -2733,7 +2733,7 @@ static uint32_t set_pass_15693_Slix(uint32_t start_time, uint32_t *eof_time, uin return PM3_SUCCESS; } -static uint32_t set_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *password) { +static uint32_t set_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, const uint8_t *password) { uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; @@ -2754,7 +2754,7 @@ static uint32_t set_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, return PM3_SUCCESS; } -static uint32_t disable_eas_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd) { +static uint32_t disable_eas_15693_Slix(uint32_t start_time, uint32_t *eof_time, const uint8_t *password, bool usepwd) { uint8_t uid[8]; get_uid_slix(start_time, eof_time, uid); @@ -2788,7 +2788,7 @@ static uint32_t disable_eas_15693_Slix(uint32_t start_time, uint32_t *eof_time, } -static uint32_t enable_eas_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd) { +static uint32_t enable_eas_15693_Slix(uint32_t start_time, uint32_t *eof_time, const uint8_t *password, bool usepwd) { uint8_t uid[8]; get_uid_slix(start_time, eof_time, uid); @@ -2820,7 +2820,7 @@ static uint32_t enable_eas_15693_Slix(uint32_t start_time, uint32_t *eof_time, u return PM3_SUCCESS; } -static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pwd_id, uint8_t *password, uint8_t *uid) { +static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t pwd_id, const uint8_t *password, uint8_t *uid) { uint8_t new_pwd_cmd[] = { (ISO15_REQ_DATARATE_HIGH | ISO15_REQ_ADDRESS), ISO15693_WRITE_PASSWORD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, pwd_id, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; @@ -2841,7 +2841,7 @@ static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_tim return PM3_SUCCESS; } -static uint32_t pass_protect_EASAFI_15693_Slix(uint32_t start_time, uint32_t *eof_time, bool set_option_flag, uint8_t *password) { +static uint32_t pass_protect_EASAFI_15693_Slix(uint32_t start_time, uint32_t *eof_time, bool set_option_flag, const uint8_t *password) { uint8_t flags; @@ -2880,7 +2880,7 @@ static uint32_t pass_protect_EASAFI_15693_Slix(uint32_t start_time, uint32_t *eo return PM3_SUCCESS; } -static uint32_t write_afi_15693(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi) { +static uint32_t write_afi_15693(uint32_t start_time, uint32_t *eof_time, const uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi) { if (!use_uid) { int res_getuid = get_uid_slix(start_time, eof_time, uid); @@ -2917,7 +2917,7 @@ static uint32_t write_afi_15693(uint32_t start_time, uint32_t *eof_time, uint8_t } /* -static uint32_t enable_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t pass_id, uint8_t *password) { +static uint32_t enable_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t pass_id, const uint8_t *password) { uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; @@ -2938,7 +2938,7 @@ static uint32_t enable_privacy_15693_Slix(uint32_t start_time, uint32_t *eof_tim return PM3_SUCCESS; } -static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t pass_id, uint8_t *password) { +static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t pass_id, const uint8_t *password) { uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { return PM3_ETIMEOUT; @@ -2961,7 +2961,7 @@ static uint32_t write_password_15693_Slix(uint32_t start_time, uint32_t *eof_tim return PM3_SUCCESS; } -static uint32_t destroy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, uint8_t *password) { +static uint32_t destroy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint8_t *uid, const uint8_t *password) { uint8_t rnd[2]; if (get_rnd_15693_Slix(start_time, eof_time, rnd) == false) { @@ -2985,7 +2985,7 @@ static uint32_t destroy_15693_Slix(uint32_t start_time, uint32_t *eof_time, uint */ -void WritePasswordSlixIso15693(uint8_t *old_password, uint8_t *new_password, uint8_t pwd_id) { +void WritePasswordSlixIso15693(const uint8_t *old_password, const uint8_t *new_password, uint8_t pwd_id) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -3010,7 +3010,7 @@ void WritePasswordSlixIso15693(uint8_t *old_password, uint8_t *new_password, uin } -void DisablePrivacySlixIso15693(uint8_t *password) { +void DisablePrivacySlixIso15693(const uint8_t *password) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -3025,7 +3025,7 @@ void DisablePrivacySlixIso15693(uint8_t *password) { switch_off(); } -void EnablePrivacySlixIso15693(uint8_t *password) { +void EnablePrivacySlixIso15693(const uint8_t *password) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -3041,7 +3041,7 @@ void EnablePrivacySlixIso15693(uint8_t *password) { } -void DisableEAS_AFISlixIso15693(uint8_t *password, bool usepwd) { +void DisableEAS_AFISlixIso15693(const uint8_t *password, bool usepwd) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -3059,7 +3059,7 @@ void DisableEAS_AFISlixIso15693(uint8_t *password, bool usepwd) { switch_off(); } -void EnableEAS_AFISlixIso15693(uint8_t *password, bool usepwd) { +void EnableEAS_AFISlixIso15693(const uint8_t *password, bool usepwd) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -3074,7 +3074,7 @@ void EnableEAS_AFISlixIso15693(uint8_t *password, bool usepwd) { switch_off(); } -void PassProtextEASSlixIso15693(uint8_t *password) { +void PassProtextEASSlixIso15693(const uint8_t *password) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -3083,7 +3083,7 @@ void PassProtextEASSlixIso15693(uint8_t *password) { reply_ng(CMD_HF_ISO15693_SLIX_PASS_PROTECT_EAS, res, NULL, 0); switch_off(); } -void PassProtectAFISlixIso15693(uint8_t *password) { +void PassProtectAFISlixIso15693(const uint8_t *password) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); @@ -3093,7 +3093,7 @@ void PassProtectAFISlixIso15693(uint8_t *password) { switch_off(); } -void WriteAFIIso15693(uint8_t *password, bool use_pwd, uint8_t *uid, bool use_uid, uint8_t afi) { +void WriteAFIIso15693(const uint8_t *password, bool use_pwd, uint8_t *uid, bool use_uid, uint8_t afi) { LED_D_ON(); Iso15693InitReader(); StartCountSspClk(); diff --git a/armsrc/iso15693.h b/armsrc/iso15693.h index 4644adea9..8a9e2fe82 100644 --- a/armsrc/iso15693.h +++ b/armsrc/iso15693.h @@ -60,12 +60,12 @@ int SendDataTagEOF(uint8_t *recv, uint16_t max_recv_len, uint32_t start_time, ui void SetTag15693Uid(const uint8_t *uid); -void WritePasswordSlixIso15693(uint8_t *old_password, uint8_t *new_password, uint8_t pwd_id); -void DisablePrivacySlixIso15693(uint8_t *password); -void EnablePrivacySlixIso15693(uint8_t *password); -void DisableEAS_AFISlixIso15693(uint8_t *password, bool usepwd); -void EnableEAS_AFISlixIso15693(uint8_t *password, bool usepwd); -void PassProtextEASSlixIso15693(uint8_t *password); -void PassProtectAFISlixIso15693(uint8_t *password); -void WriteAFIIso15693(uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi); +void WritePasswordSlixIso15693(const uint8_t *old_password, const uint8_t *new_password, uint8_t pwd_id); +void DisablePrivacySlixIso15693(const uint8_t *password); +void EnablePrivacySlixIso15693(const uint8_t *password); +void DisableEAS_AFISlixIso15693(const uint8_t *password, bool usepwd); +void EnableEAS_AFISlixIso15693(const uint8_t *password, bool usepwd); +void PassProtextEASSlixIso15693(const uint8_t *password); +void PassProtectAFISlixIso15693(const uint8_t *password); +void WriteAFIIso15693(const uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi); #endif From d78dae5904e0f4d59b69c466ef9ea01fb9898997 Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 22:50:25 -0700 Subject: [PATCH 849/924] more const for `legicrf` and the disabled LCD code --- armsrc/LCD_disabled.c | 2 +- armsrc/LCD_disabled.h | 2 +- armsrc/legicrf.c | 2 +- armsrc/legicrf.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/armsrc/LCD_disabled.c b/armsrc/LCD_disabled.c index 1a4b253e2..67b0f3de9 100644 --- a/armsrc/LCD_disabled.c +++ b/armsrc/LCD_disabled.c @@ -53,7 +53,7 @@ void LCDFill(unsigned char xs, unsigned char ys, unsigned char width, unsigned c } } -void LCDString(char *lcd_string, const char *font_style, unsigned char x, unsigned char y, unsigned char fcolor, unsigned char bcolor) { +void LCDString(const char *lcd_string, const char *font_style, unsigned char x, unsigned char y, unsigned char fcolor, unsigned char bcolor) { unsigned int i; unsigned char mask = 0, px, py, xme, yme, offset; const char *data; diff --git a/armsrc/LCD_disabled.h b/armsrc/LCD_disabled.h index e2f57e02c..26900531a 100644 --- a/armsrc/LCD_disabled.h +++ b/armsrc/LCD_disabled.h @@ -130,7 +130,7 @@ void LCDInit(void); void LCDReset(void); void LCDSetXY(unsigned char x, unsigned char y); void LCDSetPixel(unsigned char x, unsigned char y, unsigned char color); -void LCDString(char *lcd_string, const char *font_style, unsigned char x, unsigned char y, unsigned char fcolor, unsigned char bcolor); +void LCDString(const char *lcd_string, const char *font_style, unsigned char x, unsigned char y, unsigned char fcolor, unsigned char bcolor); void LCDFill(unsigned char xs, unsigned char ys, unsigned char width, unsigned char height, unsigned char color); #endif diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index c6af0dace..42d511875 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -528,7 +528,7 @@ OUT: StopTicks(); } -void LegicRfWriter(uint16_t offset, uint16_t len, uint8_t iv, uint8_t *data) { +void LegicRfWriter(uint16_t offset, uint16_t len, uint8_t iv, const uint8_t *data) { // configure ARM and FPGA init_reader(); diff --git a/armsrc/legicrf.h b/armsrc/legicrf.h index 670688aab..02f20b536 100644 --- a/armsrc/legicrf.h +++ b/armsrc/legicrf.h @@ -25,7 +25,7 @@ void LegicRfInfo(void); int LegicRfReaderEx(uint16_t offset, uint16_t len, uint8_t iv); void LegicRfReader(uint16_t offset, uint16_t len, uint8_t iv); -void LegicRfWriter(uint16_t offset, uint16_t len, uint8_t iv, uint8_t *data); +void LegicRfWriter(uint16_t offset, uint16_t len, uint8_t iv, const uint8_t *data); legic_card_select_t *getLegicCardInfo(void); #endif /* __LEGICRF_H */ From 665cf3254b8fc1e21dc6da8e80d17ef17432cbda Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 23:02:09 -0700 Subject: [PATCH 850/924] more const for `lfops` and some `commonutil` --- armsrc/lfops.c | 12 ++++++------ armsrc/lfops.h | 10 +++++----- common/commonutil.c | 10 +++++----- common/commonutil.h | 6 +++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/armsrc/lfops.c b/armsrc/lfops.c index c130d78e8..ed2a29378 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -287,7 +287,7 @@ void printT55xxConfig(void) { DbpString(""); } -void setT55xxConfig(uint8_t arg0, t55xx_configurations_t *c) { +void setT55xxConfig(uint8_t arg0, const t55xx_configurations_t *c) { for (uint8_t i = 0; i < 4; i++) { if (c->m[i].start_gap != 0) T55xx_Timing.m[i].start_gap = c->m[i].start_gap; @@ -1009,7 +1009,7 @@ void CmdHIDsimTAG(uint32_t hi2, uint32_t hi, uint32_t lo, uint8_t longFMT, bool // prepare a waveform pattern in the buffer based on the ID given then // simulate a FSK tag until the button is pressed // arg1 contains fcHigh and fcLow, arg2 contains STT marker and clock -void CmdFSKsimTAGEx(uint8_t fchigh, uint8_t fclow, uint8_t separator, uint8_t clk, uint16_t bitslen, uint8_t *bits, bool ledcontrol, int numcycles) { +void CmdFSKsimTAGEx(uint8_t fchigh, uint8_t fclow, uint8_t separator, uint8_t clk, uint16_t bitslen, const uint8_t *bits, bool ledcontrol, int numcycles) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); @@ -1045,7 +1045,7 @@ void CmdFSKsimTAGEx(uint8_t fchigh, uint8_t fclow, uint8_t separator, uint8_t cl // prepare a waveform pattern in the buffer based on the ID given then // simulate a FSK tag until the button is pressed // arg1 contains fcHigh and fcLow, arg2 contains STT marker and clock -void CmdFSKsimTAG(uint8_t fchigh, uint8_t fclow, uint8_t separator, uint8_t clk, uint16_t bitslen, uint8_t *bits, bool ledcontrol) { +void CmdFSKsimTAG(uint8_t fchigh, uint8_t fclow, uint8_t separator, uint8_t clk, uint16_t bitslen, const uint8_t *bits, bool ledcontrol) { CmdFSKsimTAGEx(fchigh, fclow, separator, clk, bitslen, bits, ledcontrol, -1); reply_ng(CMD_LF_FSK_SIMULATE, PM3_EOPABORTED, NULL, 0); } @@ -1866,9 +1866,9 @@ void T55xxResetRead(uint8_t flags, bool ledcontrol) { if (ledcontrol) LED_A_OFF(); } -void T55xxDangerousRawTest(uint8_t *data, bool ledcontrol) { +void T55xxDangerousRawTest(const uint8_t *data, bool ledcontrol) { // supports only default downlink mode - t55xx_test_block_t *c = (t55xx_test_block_t *)data; + const t55xx_test_block_t *c = (const t55xx_test_block_t *)data; uint8_t start_wait = 4; uint8_t bs[128 / 8]; @@ -2320,7 +2320,7 @@ void CopyHIDtoT55x7(uint32_t hi2, uint32_t hi, uint32_t lo, uint8_t longFMT, boo } // clone viking tag to T55xx -void CopyVikingtoT55xx(uint8_t *blocks, bool q5, bool em, bool ledcontrol) { +void CopyVikingtoT55xx(const uint8_t *blocks, bool q5, bool em, bool ledcontrol) { uint32_t data[] = {T55x7_BITRATE_RF_32 | T55x7_MODULATION_MANCHESTER | (2 << T55x7_MAXBLOCK_SHIFT), 0, 0}; if (q5) { diff --git a/armsrc/lfops.h b/armsrc/lfops.h index f1bc88b64..755afa88f 100644 --- a/armsrc/lfops.h +++ b/armsrc/lfops.h @@ -38,9 +38,9 @@ void CmdHIDsimTAGEx(uint32_t hi2, uint32_t hi, uint32_t lo, uint8_t longFMT, boo void CmdHIDsimTAG(uint32_t hi2, uint32_t hi, uint32_t lo, uint8_t longFMT, bool ledcontrol); void CmdFSKsimTAGEx(uint8_t fchigh, uint8_t fclow, uint8_t separator, uint8_t clk, uint16_t bitslen, - uint8_t *bits, bool ledcontrol, int numcycles); + const uint8_t *bits, bool ledcontrol, int numcycles); void CmdFSKsimTAG(uint8_t fchigh, uint8_t fclow, uint8_t separator, uint8_t clk, uint16_t bitslen, - uint8_t *bits, bool ledcontrol); + const uint8_t *bits, bool ledcontrol); void CmdASKsimTAG(uint8_t encoding, uint8_t invert, uint8_t separator, uint8_t clk, uint16_t size, const uint8_t *bits, bool ledcontrol); void CmdPSKsimTAG(uint8_t carrier, uint8_t invert, uint8_t clk, uint16_t size, @@ -54,7 +54,7 @@ int lf_em410x_watch(int findone, uint32_t *high, uint64_t *low, bool ledcontrol) int lf_io_watch(int findone, uint32_t *high, uint32_t *low, bool ledcontrol); void CopyHIDtoT55x7(uint32_t hi2, uint32_t hi, uint32_t lo, uint8_t longFMT, bool q5, bool em, bool ledcontrol); // Clone an HID card to T5557/T5567 -void CopyVikingtoT55xx(uint8_t *blocks, bool q5, bool em, bool ledcontrol); +void CopyVikingtoT55xx(const uint8_t *blocks, bool q5, bool em, bool ledcontrol); int copy_em410x_to_t55xx(uint8_t card, uint8_t clock, uint32_t id_hi, uint32_t id_lo, bool ledcontrol); @@ -66,7 +66,7 @@ void T55xxReadBlock(uint8_t page, bool pwd_mode, bool brute_mem, uint8_t block, uint8_t downlink_mode, bool ledcontrol); void T55xxWakeUp(uint32_t pwd, uint8_t flags, bool ledcontrol); void T55xx_ChkPwds(uint8_t flags, bool ledcontrol); -void T55xxDangerousRawTest(uint8_t *data, bool ledcontrol); +void T55xxDangerousRawTest(const uint8_t *data, bool ledcontrol); void turn_read_lf_on(uint32_t delay); void turn_read_lf_off(uint32_t delay); @@ -78,7 +78,7 @@ void EM4xWriteWord(uint8_t addr, uint32_t data, uint32_t pwd, uint8_t usepwd, bo void EM4xProtectWord(uint32_t data, uint32_t pwd, uint8_t usepwd, bool ledcontrol); void Cotag(uint32_t arg0, bool ledcontrol); -void setT55xxConfig(uint8_t arg0, t55xx_configurations_t *c); +void setT55xxConfig(uint8_t arg0, const t55xx_configurations_t *c); t55xx_configurations_t *getT55xxConfig(void); void printT55xxConfig(void); void loadT55xxConfig(void); diff --git a/common/commonutil.c b/common/commonutil.c index 07b55f1f9..6d57d90a9 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -23,8 +23,8 @@ * verifies the magic properties, then stores a formatted string, prefixed by * prefix in dst. */ -void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_info) { - struct version_information_t *v = (struct version_information_t *)version_info; +void FormatVersionInformation(char *dst, int len, const char *prefix, const void *version_info) { + const struct version_information_t *v = (const struct version_information_t *)version_info; dst[0] = 0; strncat(dst, prefix, len - 1); if (v->magic != VERSION_INFORMATION_MAGIC) { @@ -53,8 +53,8 @@ void FormatVersionInformation(char *dst, int len, const char *prefix, void *vers strncat(dst, v->armsrc, len - strlen(dst) - 1); } -void format_version_information_short(char *dst, int len, void *version_info) { - struct version_information_t *v = (struct version_information_t *)version_info; +void format_version_information_short(char *dst, int len, const void *version_info) { + const struct version_information_t *v = (const struct version_information_t *)version_info; dst[0] = 0; if (v->magic != VERSION_INFORMATION_MAGIC) { strncat(dst, "Missing/Invalid version information", len - strlen(dst) - 1); @@ -151,7 +151,7 @@ void num_to_bytes(uint64_t n, size_t len, uint8_t *dest) { } } -uint64_t bytes_to_num(uint8_t *src, size_t len) { +uint64_t bytes_to_num(const uint8_t *src, size_t len) { uint64_t num = 0; while (len--) { num = (num << 8) | (*src); diff --git a/common/commonutil.h b/common/commonutil.h index 7beb95355..34daf65d2 100644 --- a/common/commonutil.h +++ b/common/commonutil.h @@ -50,8 +50,8 @@ #endif extern struct version_information_t g_version_information; -void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_info); -void format_version_information_short(char *dst, int len, void *version_info); +void FormatVersionInformation(char *dst, int len, const char *prefix, const void *version_info); +void format_version_information_short(char *dst, int len, const void *version_info); uint32_t reflect(uint32_t v, int b); // used in crc.c ... uint8_t reflect8(uint8_t b); // dedicated 8bit reversal @@ -59,7 +59,7 @@ uint16_t reflect16(uint16_t b); // dedicated 16bit reversal uint32_t reflect32(uint32_t b); // dedicated 32bit reversal void num_to_bytes(uint64_t n, size_t len, uint8_t *dest); -uint64_t bytes_to_num(uint8_t *src, size_t len); +uint64_t bytes_to_num(const uint8_t *src, size_t len); // LE and BE to/from memory uint16_t MemLeToUint2byte(const uint8_t *data); From 78262139ece75b6fb0f29a0302f500f848830b1f Mon Sep 17 00:00:00 2001 From: Henry Gabryjelski Date: Mon, 14 Aug 2023 23:07:19 -0700 Subject: [PATCH 851/924] more const for `lfsampling` and `lfzx` --- armsrc/lfsampling.c | 2 +- armsrc/lfsampling.h | 2 +- armsrc/lfzx.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index a56e013ee..6c131e7f3 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -94,7 +94,7 @@ void setDefaultSamplingConfig(void) { * @brief setSamplingConfig * @param sc */ -void setSamplingConfig(sample_config *sc) { +void setSamplingConfig(const sample_config *sc) { // decimation (1-8) how many bits of adc sample value to save if (sc->decimation > 0 && sc->decimation < 9) diff --git a/armsrc/lfsampling.h b/armsrc/lfsampling.h index 11c03ca74..8a8e40868 100644 --- a/armsrc/lfsampling.h +++ b/armsrc/lfsampling.h @@ -110,7 +110,7 @@ void LFSetupFPGAForADC(int divisor, bool reader_field); * @brief setSamplingConfig * @param sc */ -void setSamplingConfig(sample_config *sc); +void setSamplingConfig(const sample_config *sc); void setDefaultSamplingConfig(void); sample_config *getSamplingConfig(void); diff --git a/armsrc/lfzx.c b/armsrc/lfzx.c index be09247ca..f086c2d71 100644 --- a/armsrc/lfzx.c +++ b/armsrc/lfzx.c @@ -115,7 +115,7 @@ static void zx8211_setup_read(void) { WDT_HIT(); } -static void zx_send(uint8_t *cmd, uint8_t clen) { +static void zx_send(const uint8_t *cmd, uint8_t clen) { if (clen == 0) return; From 8ae97d10944a1fb5b50e78dfe4f5c9a80ae2f23b Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 15 Aug 2023 09:31:00 +0200 Subject: [PATCH 852/924] Vocabulary file became appended to itself Remove duplicated data --- client/src/pm3line_vocabulary.h | 813 -------------------------------- 1 file changed, 813 deletions(-) diff --git a/client/src/pm3line_vocabulary.h b/client/src/pm3line_vocabulary.h index 96fb95dc5..0f617ef0d 100644 --- a/client/src/pm3line_vocabulary.h +++ b/client/src/pm3line_vocabulary.h @@ -811,817 +811,4 @@ const static vocabulary_t vocabulary[] = { } #endif -#endif//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- -// readline auto complete utilities -//----------------------------------------------------------------------------- - -#ifndef PM3LINE_VOCABULORY_H__ -#define PM3LINE_VOCABULORY_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -typedef struct vocabulory_s { - bool offline; - const char *name; -} vocabulory_t; - -const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data envelope" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data cthreshold" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data atr" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data num" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 1, "emv list" }, - { 1, "emv test" }, - { 0, "emv challenge" }, - { 0, "emv exec" }, - { 0, "emv genac" }, - { 0, "emv gpo" }, - { 0, "emv intauth" }, - { 0, "emv pse" }, - { 0, "emv reader" }, - { 0, "emv readrec" }, - { 0, "emv roca" }, - { 0, "emv scan" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 1, "hf 15 view" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 1, "hf iclass list" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 1, "hf iclass view" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 0, "hf iclass sam" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 0, "hf legic einfo" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf gdmcfg" }, - { 0, "hf mf gdmsetcfg" }, - { 0, "hf mf gdmsetblk" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 1, "hf mfp list" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp dump" }, - { 0, "hf mfp info" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp ndefformat" }, - { 0, "hf mfp ndefread" }, - { 0, "hf mfp ndefwrite" }, - { 1, "hf mfu help" }, - { 1, "hf mfu list" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu tamper" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 1, "hf topaz list" }, - { 0, "hf topaz dump" }, - { 0, "hf topaz info" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf vas help" }, - { 0, "hf vas reader" }, - { 1, "hf vas decrypt" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 1, "hw timeout" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 brute" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag read" }, - { 0, "lf hitag wrbl" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag cc" }, - { 0, "lf hitag ta" }, - { 0, "lf hitag eload" }, - { 0, "lf hitag sim" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, - {0, NULL} -}; - -#ifdef __cplusplus -} -#endif - #endif \ No newline at end of file From 9a70bf1aecc9c7780a0e757442bd81eff40363e7 Mon Sep 17 00:00:00 2001 From: coderxian Date: Tue, 15 Aug 2023 17:16:17 -0500 Subject: [PATCH 853/924] Fixes issue 2076 --- client/src/cmdanalyse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdanalyse.c b/client/src/cmdanalyse.c index bab54f3da..d1e14d694 100644 --- a/client/src/cmdanalyse.c +++ b/client/src/cmdanalyse.c @@ -1117,7 +1117,7 @@ static int CmdAnalyseUnits(const char *Cmd) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "ETU to US conversions"); - float test_us = ETU_TO_US(1); + double test_us = ETU_TO_US(1); PrintAndLogEx(INFO, " 1 ETU = %3.2f US (expect 9.44) %s", test_us, (test_us == 9.44) ? _GREEN_("ok") : _RED_("fail")); test_us = ETU_TO_US(10); PrintAndLogEx(INFO, " 10 ETU = %4.2f US (expect 94.40) %s", test_us, (test_us == 94.40) ? _GREEN_("ok") : _RED_("fail")); From dfabad37d95dbd4c1a82fefbf41358380cf94c0d Mon Sep 17 00:00:00 2001 From: Roman D Date: Thu, 17 Aug 2023 12:41:34 +0200 Subject: [PATCH 854/924] Configurable number of CPU cores. --- client/src/proxmark3.c | 17 +++++++++++++++++ client/src/util.c | 6 ++++++ client/src/util.h | 1 + 3 files changed, 24 insertions(+) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index f6c25a9eb..26f4a5698 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -581,6 +581,7 @@ static void show_help(bool showFullHelp, char *exec_name) { PrintAndLogEx(NORMAL, " --unlock-bootloader Enable flashing of bootloader area *DANGEROUS* (need --flash)"); PrintAndLogEx(NORMAL, " --force Enable flashing even if firmware seems to not match client version"); PrintAndLogEx(NORMAL, " --image image to flash. Can be specified several times."); + PrintAndLogEx(NORMAL, " --ncpu override number of CPU cores"); PrintAndLogEx(NORMAL, "\nExamples:"); PrintAndLogEx(NORMAL, "\n to run Proxmark3 client:\n"); PrintAndLogEx(NORMAL, " %s "SERIAL_PORT_EXAMPLE_H" -- runs the pm3 client", exec_name); @@ -996,6 +997,22 @@ int main(int argc, char *argv[]) { continue; } + if (strcmp(argv[i], "--ncpu") == 0) { + if (i + 1 == argc) { + PrintAndLogEx(ERR, _RED_("ERROR:") " missing CPU number specification after --ncpu\n"); + show_help(false, exec_name); + return 1; + } + long int ncpus = strtol(argv[i + 1], NULL, 10); + if (ncpus < 0 || ncpus >= INT_MAX) { + PrintAndLogEx(ERR, _RED_("ERROR:") " invalid number of CPU cores: --ncpu " _YELLOW_("%s") "\n", argv[i + 1]); + return 1; + } + g_numCPUs = ncpus; + i++; + continue; + } + // We got an unknown parameter PrintAndLogEx(ERR, _RED_("ERROR:") " invalid parameter: " _YELLOW_("%s") "\n", argv[i]); show_help(false, exec_name); diff --git a/client/src/util.c b/client/src/util.c index 51408a524..150b042a5 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -40,6 +40,8 @@ uint8_t g_debugMode = 0; uint8_t g_printAndLog = PRINTANDLOG_PRINT | PRINTANDLOG_LOG; // global client tell if a pending prompt is present bool g_pendingPrompt = false; +// global CPU core count override +int g_numCPUs = 0; #ifdef _WIN32 #include @@ -1079,6 +1081,10 @@ uint64_t HornerScheme(uint64_t num, uint64_t divider, uint64_t factor) { // determine number of logical CPU cores (use for multithreaded functions) int num_CPUs(void) { + if (g_numCPUs > 0) { + return g_numCPUs; + } + #if defined(_WIN32) #include SYSTEM_INFO sysinfo; diff --git a/client/src/util.h b/client/src/util.h index 4dab9ae06..0712d8d18 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -32,6 +32,7 @@ extern uint8_t g_debugMode; extern uint8_t g_printAndLog; extern bool g_pendingPrompt; +extern int g_numCPUs; #define PRINTANDLOG_PRINT 1 #define PRINTANDLOG_LOG 2 From 20f89013683c923da331296481acb00022dedcec Mon Sep 17 00:00:00 2001 From: Roman D Date: Thu, 17 Aug 2023 12:43:08 +0200 Subject: [PATCH 855/924] Fix macports Makefile configuration. --- client/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/Makefile b/client/Makefile index 0444b5932..b63fdf329 100644 --- a/client/Makefile +++ b/client/Makefile @@ -40,7 +40,7 @@ ifeq ($(USE_BREW),1) PKG_CONFIG_ENV := PKG_CONFIG_PATH=$(BREW_PREFIX)/lib/pkgconfig:$(BREW_PREFIX)/opt/qt/lib/pkgconfig:$(BREW_PREFIX)/opt/qt5/lib/pkgconfig endif -ifdef ($(USE_MACPORTS),1) +ifeq ($(USE_MACPORTS),1) INCLUDES += -I$(MACPORTS_PREFIX)/include LDLIBS += -L$(MACPORTS_PREFIX)/lib PKG_CONFIG_ENV := PKG_CONFIG_PATH=$(MACPORTS_PREFIX)/lib/pkgconfig From 44888f601555fb36851e3fdb2cf285b757c9d52a Mon Sep 17 00:00:00 2001 From: Adam Jon Foster Date: Fri, 18 Aug 2023 12:55:56 +0800 Subject: [PATCH 856/924] Update mfc_default_keys.dic Added 4 keys extracted from old dumps on Edith Cowan University Smart rider cards Signed-off-by: Adam Jon Foster --- client/dictionaries/mfc_default_keys.dic | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index a2ae9655e..2e9be89f3 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2179,4 +2179,8 @@ D201DBB6AB6E # # Data from Discord, seems to be related to ASSA 427553754D47 - +# Keys found on Edith Cowan University Smart Riders +9A677289564D +186C59E6AFC9 +DDDAA35A9749 +9D0D0A829F49 From b17a733bdb185bd664028afcc22a669f406fa225 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 21 Aug 2023 12:36:02 +0200 Subject: [PATCH 857/924] modified some output and made sure a local state is used for multithreaded. Also added the mod fix from Doegox in sma.cpp --- CHANGELOG.md | 1 + tools/cryptorf/sma.cpp | 18 +++++++++++------- tools/cryptorf/sma_multi.cpp | 33 ++++++++++++++++++++++----------- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30854d631..0080cf27a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `cryptorf/sma_multi` - local state used in multithread (@iceman1001) - Changed `fpga_compress` - better deallocation of memory and closing of file handles (@iceman1001) - Changed `hf search` - less swaps of fpga images on device side (@iceman1001) - Changed `mkversion.sh` - now regenerates version_pm3.c (and consequently the binaries) only when needed (@doegox) diff --git a/tools/cryptorf/sma.cpp b/tools/cryptorf/sma.cpp index d15b0e6a2..2c0044388 100644 --- a/tools/cryptorf/sma.cpp +++ b/tools/cryptorf/sma.cpp @@ -159,6 +159,10 @@ void print_cs(const char *text, pcs s) { } static inline uint8_t mod(uint8_t a, uint8_t m) { + if (m == 0) { + return 0; // Actually, divide by zero error + } + // Just return the input when this is less or equal than the modular value if (a < m) return a; @@ -754,7 +758,7 @@ int main(int argc, const char *argv[]) { Q[pos] = rand(); } sm_auth(Gc, Ci, Q, Ch, Ci_1, &ostate); - printf(" Gc: "); + printf(" Gc... "); print_bytes(Gc, 8); } else { sscanf(argv[1], "%016" SCNx64, &nCi); @@ -765,7 +769,7 @@ int main(int argc, const char *argv[]) { num_to_bytes(nCh, 8, Ch); sscanf(argv[4], "%016" SCNx64, &nCi_1); num_to_bytes(nCi_1, 8, Ci_1); - printf(" Gc: unknown\n"); + printf(" Gc... unknown\n"); } for (pos = 0; pos < 8; pos++) { @@ -773,16 +777,16 @@ int main(int argc, const char *argv[]) { ks[(2 * pos) + 1] = Ch[pos]; } - printf(" Ci: "); + printf(" Ci... "); print_bytes(Ci, 8); - printf(" Q: "); + printf(" Q... "); print_bytes(Q, 8); - printf(" Ch: "); + printf(" Ch... "); print_bytes(Ch, 8); - printf("Ci+1: "); + printf("Ci+1... "); print_bytes(Ci_1, 8); printf("\n"); - printf(" Ks: "); + printf(" Ks... "); print_bytes(ks, 16); printf("\n"); diff --git a/tools/cryptorf/sma_multi.cpp b/tools/cryptorf/sma_multi.cpp index 50b962248..b57f85ef9 100644 --- a/tools/cryptorf/sma_multi.cpp +++ b/tools/cryptorf/sma_multi.cpp @@ -168,6 +168,7 @@ static inline uint8_t mod(uint8_t a, uint8_t m) { if (m == 0) { return 0; // Actually, divide by zero error } + // Just return the input when this is less or equal than the modular value if (a < m) return a; @@ -935,9 +936,19 @@ static void ice_compare( uint8_t *Ch, uint8_t *Ci_1 ) { - uint8_t Gc_chk[8]; - uint8_t Ch_chk[ 8]; - uint8_t Ci_1_chk[ 8]; + uint8_t Gc_chk[8] = {0}; + uint8_t Ch_chk[8] = {0}; + uint8_t Ci_1_chk[8] = {0}; + + crypto_state_t ls; + ls.b0 = ostate->b0; + ls.b1 = ostate->b1; + ls.b1l = ostate->b1l; + ls.b1r = ostate->b1r; + ls.b1s = ostate->b1s; + ls.l = ostate->l; + ls.m = ostate->m; + ls.r = ostate->r; for (std::size_t i = offset; i < candidates->size(); i += skips) { if (key_found.load(std::memory_order_relaxed)) @@ -946,7 +957,7 @@ static void ice_compare( uint64_t tkey = candidates->at(i); num_to_bytes(tkey, 8, Gc_chk); - sm_auth(Gc_chk, Ci, Q, Ch_chk, Ci_1_chk, ostate); + sm_auth(Gc_chk, Ci, Q, Ch_chk, Ci_1_chk, &ls); if ((memcmp(Ch_chk, Ch, 8) == 0) && (memcmp(Ci_1_chk, Ci_1, 8) == 0)) { g_ice_mtx.lock(); key_found = true; @@ -1008,7 +1019,7 @@ int main(int argc, const char *argv[]) { Q[pos] = rand(); } sm_auth(Gc, Ci, Q, Ch, Ci_1, &ostate); - printf(" Gc: "); + printf(" Gc... "); print_bytes(Gc, 8); } else { sscanf(argv[1], "%016" SCNx64, &nCi); @@ -1019,7 +1030,7 @@ int main(int argc, const char *argv[]) { num_to_bytes(nCh, 8, Ch); sscanf(argv[4], "%016" SCNx64, &nCi_1); num_to_bytes(nCi_1, 8, Ci_1); - printf(" Gc: unknown\n"); + printf(" Gc... unknown\n"); } for (pos = 0; pos < 8; pos++) { @@ -1027,16 +1038,16 @@ int main(int argc, const char *argv[]) { ks[(2 * pos) + 1] = Ch[pos]; } - printf(" Ci: "); + printf(" Ci... "); print_bytes(Ci, 8); - printf(" Q: "); + printf(" Q... "); print_bytes(Q, 8); - printf(" Ch: "); + printf(" Ch... "); print_bytes(Ch, 8); - printf("Ci+1: "); + printf("Ci+1... "); print_bytes(Ci_1, 8); printf("\n"); - printf(" Ks: "); + printf(" Ks... "); print_bytes(ks, 16); printf("\n"); From 5ecdd673ba898d5b7a1e0f528ae2d8d976c52e08 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 21 Aug 2023 12:37:05 +0200 Subject: [PATCH 858/924] added the possibility to compile cryptoRF solvers in the main makefile. Will add tests in regression script next --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c548646bf..8ca441faf 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ ifneq (,$(DESTDIR)) endif endif -all clean install uninstall check: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% mf_nonce_brute/% mfd_aes_brute/% fpga_compress/% +all clean install uninstall check: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% mf_nonce_brute/% mfd_aes_brute/% fpga_compress/% cryptorf/% # hitag2crack toolsuite is not yet integrated in "all", it must be called explicitly: "make hitag2crack" #all clean install uninstall check: %: hitag2crack/% @@ -109,6 +109,9 @@ endif $(Q)-$(INSTALLSUDO) $(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH) # tests +cryptorf/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) mfkey/check: FORCE $(info [*] CHECK $(patsubst %/check,%,$@)) $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) @@ -145,6 +148,9 @@ common/check: FORCE check: common/check $(info [*] ALL CHECKS DONE) +cryptorf/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C tools/cryptorf $(patsubst cryptorf/%,%,$@) DESTDIR=$(MYDESTDIR) mfkey/%: FORCE $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C tools/mfkey $(patsubst mfkey/%,%,$@) DESTDIR=$(MYDESTDIR) @@ -196,6 +202,7 @@ help: @echo "+ recovery - Make bootrom and fullimage files for JTAG flashing" @echo @echo "+ client - Make only the OS-specific host client" + @echo "+ cryptorf - Make tools/cryptorf" @echo "+ mfkey - Make tools/mfkey" @echo "+ nonce2key - Make tools/nonce2key" @echo "+ mf_nonce_brute - Make tools/mf_nonce_brute" @@ -232,6 +239,8 @@ fullimage/uninstall: armsrc/uninstall recovery: recovery/all +cryptorf: cryptorf/all + mfkey: mfkey/all nonce2key: nonce2key/all From 0d1b86cc46e51f1e57b7930b05fda6e738afc964 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 21 Aug 2023 13:08:08 +0200 Subject: [PATCH 859/924] added regressiontests for cryptoRF SMA code part --- CHANGELOG.md | 1 + tools/cryptorf/sma.cpp | 2 +- tools/cryptorf/sma_multi.cpp | 2 +- tools/pm3_tests.sh | 16 +++++++++++++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0080cf27a..e773482db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added cryptorf regressiontests (@iceman1001) - Fixed `cryptorf/sma_multi` - local state used in multithread (@iceman1001) - Changed `fpga_compress` - better deallocation of memory and closing of file handles (@iceman1001) - Changed `hf search` - less swaps of fpga images on device side (@iceman1001) diff --git a/tools/cryptorf/sma.cpp b/tools/cryptorf/sma.cpp index 2c0044388..c1c9b54e3 100644 --- a/tools/cryptorf/sma.cpp +++ b/tools/cryptorf/sma.cpp @@ -844,7 +844,7 @@ int main(int argc, const char *argv[]) { num_to_bytes(*itgc, 8, Gc_chk); sm_auth(Gc_chk, Ci, Q, Ch_chk, Ci_1_chk, &ostate); if ((memcmp(Ch_chk, Ch, 8) == 0) && (memcmp(Ci_1_chk, Ci_1, 8) == 0)) { - printf("\nFound valid key: " _GREEN_("%016" PRIx64)"\n\n", *itgc); + printf("\nValid key found [ " _GREEN_("%016" PRIx64)" ]\n\n", *itgc); return 0; } } diff --git a/tools/cryptorf/sma_multi.cpp b/tools/cryptorf/sma_multi.cpp index b57f85ef9..cacaa31d1 100644 --- a/tools/cryptorf/sma_multi.cpp +++ b/tools/cryptorf/sma_multi.cpp @@ -1128,7 +1128,7 @@ int main(int argc, const char *argv[]) { } if (key_found) { - printf("\nFound valid key: " _GREEN_("%016lX")"\n\n", key.load()); + printf("\nValid key found [ " _GREEN_("%016" PRIx64)" ]\n\n", key.load()); break; } diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 0957fd386..0c34360c6 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -14,6 +14,7 @@ TESTNONCE2KEY=false TESTMFNONCEBRUTE=false TESTMFDAESBRUTE=false TESTHITAG2CRACK=false +TESTCRYPTORF=false TESTFPGACOMPRESS=false TESTBOOTROM=false TESTARMSRC=false @@ -27,7 +28,7 @@ while (( "$#" )); do case "$1" in -h|--help) echo """ -Usage: $0 [--long] [--opencl] [--clientbin /path/to/proxmark3] [mfkey|nonce2key|mf_nonce_brute|mfd_aes_brute|fpga_compress|bootrom|armsrc|client|recovery|common] +Usage: $0 [--long] [--opencl] [--clientbin /path/to/proxmark3] [mfkey|nonce2key|mf_nonce_brute|mfd_aes_brute|cryptorf|fpga_compress|bootrom|armsrc|client|recovery|common] --long: Enable slow tests --opencl: Enable tests requiring OpenCL (preferably a Nvidia GPU) --clientbin ...: Specify path to proxmark3 binary to test @@ -52,6 +53,11 @@ Usage: $0 [--long] [--opencl] [--clientbin /path/to/proxmark3] [mfkey|nonce2key| exit 1 fi ;; + cryptorf) + TESTALL=false + TESTCRYPTORF=true + shift + ;; mfkey) TESTALL=false TESTMFKEY=true @@ -295,6 +301,14 @@ while true; do if ! CheckExecute "mfd_aes_brute test 1/2" "$MFDASEBRUTEBIN 1605394800 bb6aea729414a5b1eff7b16328ce37fd 82f5f498dbc29f7570102397a2e5ef2b6dc14a864f665b3c54d11765af81e95c" "key.................... .*261C07A23F2BC8262F69F10A5BDF3764"; then break; fi if ! CheckExecute slow "mfd_aes_brute test 2/2" "$MFDASEBRUTEBIN 1546300800 3fda933e2953ca5e6cfbbf95d1b51ddf 97fe4b5de24188458d102959b888938c988e96fb98469ce7426f50f108eaa583" "key.................... .*E757178E13516A4F3171BC6EA85E165A"; then break; fi fi + + if $TESTALL || $TESTCRYPTORF; then + echo -e "\n${C_BLUE}Testing CryptoRF sma:${C_NC} ${CRYPTRFBRUTEBIN:=./tools/cryptorf/sma} ${CRYPTRF_MULTI_BRUTEBIN:=./tools/cryptorf/sma_multi}" + if ! CheckFileExist "sma exists" "$CRYPTRFBRUTEBIN"; then break; fi + if ! CheckFileExist "sma_multi exists" "$CRYPTRF_MULTI_BRUTEBIN"; then break; fi + if ! CheckExecute slow "sma test" "$CRYPTRFBRUTEBIN ffffffffffffffff 1234567812345678 88c9d4466a501a87 dec2ee1b1c9276e9" "key found \[.*4f794a463ff81d81.*\]"; then break; fi + if ! CheckExecute slow "sma_multi test" "$CRYPTRF_MULTI_BRUTEBIN ffffffffffffffff 1234567812345678 88c9d4466a501a87 dec2ee1b1c9276e9" "key found \[.*4f794a463ff81d81.*\]"; then break; fi + fi # hitag2crack not yet part of "all" # if $TESTALL || $TESTHITAG2CRACK; then if $TESTHITAG2CRACK; then From 456af75b78ee7a20d4e5c02b623f110075cdda04 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 21 Aug 2023 16:10:26 +0200 Subject: [PATCH 860/924] lets see if this makes osx happy by guarding the cpp code with defines --- tools/cryptorf/sma.cpp | 8 ++++++++ tools/cryptorf/sma_multi.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/tools/cryptorf/sma.cpp b/tools/cryptorf/sma.cpp index c1c9b54e3..3fb1da343 100644 --- a/tools/cryptorf/sma.cpp +++ b/tools/cryptorf/sma.cpp @@ -32,6 +32,10 @@ #include "cryptolib.h" #include "util.h" +#ifdef __cplusplus +extern "C" { +#endif + using namespace std; #ifdef _MSC_VER @@ -852,3 +856,7 @@ int main(int argc, const char *argv[]) { } return 0; } + +#if defined(__cplusplus) +} +#endif \ No newline at end of file diff --git a/tools/cryptorf/sma_multi.cpp b/tools/cryptorf/sma_multi.cpp index cacaa31d1..91cf97d7c 100644 --- a/tools/cryptorf/sma_multi.cpp +++ b/tools/cryptorf/sma_multi.cpp @@ -35,6 +35,10 @@ #include "cryptolib.h" #include "util.h" +#ifdef __cplusplus +extern "C" { +#endif + using namespace std; #ifdef _MSC_VER @@ -1136,3 +1140,7 @@ int main(int argc, const char *argv[]) { } return 0; } + +#if defined(__cplusplus) +} +#endif \ No newline at end of file From 908b8ca0b3bf2af143a19d94814c1882b9165b8c Mon Sep 17 00:00:00 2001 From: Roman D Date: Mon, 21 Aug 2023 22:24:13 +0200 Subject: [PATCH 861/924] Limit configurable CPU count to the number of detected CPU cores. --- client/src/proxmark3.c | 5 +++-- client/src/util.c | 6 +++++- client/src/util.h | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 26f4a5698..3e924a1c7 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -1004,8 +1004,9 @@ int main(int argc, char *argv[]) { return 1; } long int ncpus = strtol(argv[i + 1], NULL, 10); - if (ncpus < 0 || ncpus >= INT_MAX) { - PrintAndLogEx(ERR, _RED_("ERROR:") " invalid number of CPU cores: --ncpu " _YELLOW_("%s") "\n", argv[i + 1]); + const int detected_cpus = detect_num_CPUs(); + if (ncpus < 0 || ncpus >= detected_cpus) { + PrintAndLogEx(ERR, _RED_("ERROR:") " invalid number of CPU cores: --ncpu " _YELLOW_("%s") " (available: %d)\n", argv[i + 1], detected_cpus); return 1; } g_numCPUs = ncpus; diff --git a/client/src/util.c b/client/src/util.c index 150b042a5..f1e58abe0 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -1079,12 +1079,16 @@ uint64_t HornerScheme(uint64_t num, uint64_t divider, uint64_t factor) { return result; } -// determine number of logical CPU cores (use for multithreaded functions) int num_CPUs(void) { if (g_numCPUs > 0) { return g_numCPUs; } + return detect_num_CPUs(); +} + +// determine number of logical CPU cores (use for multithreaded functions) +int detect_num_CPUs(void) { #if defined(_WIN32) #include SYSTEM_INFO sysinfo; diff --git a/client/src/util.h b/client/src/util.h index 0712d8d18..fa636ce9b 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -131,7 +131,8 @@ void wiegand_add_parity_swapped(uint8_t *target, uint8_t *source, uint8_t length uint32_t PackBits(uint8_t start, uint8_t len, const uint8_t *bits); uint64_t HornerScheme(uint64_t num, uint64_t divider, uint64_t factor); -int num_CPUs(void); // number of logical CPUs +int num_CPUs(void); +int detect_num_CPUs(void); // number of logical CPUs void str_lower(char *s); // converts string to lower case void str_upper(char *s); // converts string to UPPER case From 210d2847aeb2019d15ae69eadff68771a4b656ef Mon Sep 17 00:00:00 2001 From: nvx Date: Tue, 22 Aug 2023 07:32:07 +1000 Subject: [PATCH 862/924] Adds `hf iclass esetblk`, equivalent to `hf mf esetblk` Also some minor tweaks to make commands.json and commands.md properly on Windows. --- Makefile | 2 +- client/pyscripts/pm3_help2list.py | 2 +- client/src/cmdhficlass.c | 55 ++++++++++++++++++++++++++++--- client/src/cmdhftexkom.c | 8 ++--- client/src/pm3line_vocabulary.h | 1 + doc/commands.json | 28 ++++++++++++---- doc/commands.md | 1 + 7 files changed, 81 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 8ca441faf..64b0aa6ab 100644 --- a/Makefile +++ b/Makefile @@ -327,7 +327,7 @@ style: # Make sure python3 is installed @command -v python3 >/dev/null || ( echo "Please install 'python3' package first" ; exit 1 ) # Update commands.json, patch port in case it was run under Windows - [ -x client/proxmark3 ] && client/proxmark3 --fulltext | sed 's#com[0-9]#/dev/ttyacm0#'|python3 client/pyscripts/pm3_help2json.py - doc/commands.json + [ -x client/proxmark3 ] && client/proxmark3 --fulltext | sed 's#com[0-9]#/dev/ttyACM0#'|python3 client/pyscripts/pm3_help2json.py - doc/commands.json # Update the readline autocomplete autogenerated code [ -x client/proxmark3 ] && client/proxmark3 --fulltext | python3 client/pyscripts/pm3_help2list.py - client/src/pm3line_vocabulary.h diff --git a/client/pyscripts/pm3_help2list.py b/client/pyscripts/pm3_help2list.py index 7355bca46..a896e5546 100755 --- a/client/pyscripts/pm3_help2list.py +++ b/client/pyscripts/pm3_help2list.py @@ -88,7 +88,7 @@ const static vocabulary_t vocabulary[] = {\n""") cmd = values['command'] - args.output_file.write(' {{ {}, "{}" }}, \n'.format(offline, cmd)) + args.output_file.write(' {{ {}, "{}" }},\n'.format(offline, cmd)) args.output_file.write(""" {0, NULL}\n}; diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 131944f6e..4a4ac3289 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -129,7 +129,7 @@ static inline uint32_t leadingzeros(uint64_t a) { #endif } -static void iclass_upload_emul(uint8_t *d, uint16_t n, uint16_t *bytes_sent) { +static void iclass_upload_emul(uint8_t *d, uint16_t n, uint16_t offset, uint16_t *bytes_sent) { struct p { uint16_t offset; @@ -155,7 +155,7 @@ static void iclass_upload_emul(uint8_t *d, uint16_t n, uint16_t *bytes_sent) { } struct p *payload = calloc(4 + bytes_in_packet, sizeof(uint8_t)); - payload->offset = *bytes_sent; + payload->offset = offset + *bytes_sent; payload->len = bytes_in_packet; memcpy(payload->data, d + *bytes_sent, bytes_in_packet); @@ -424,7 +424,7 @@ static int generate_config_card(const iclass_config_card_item_t *o, uint8_t *ke //Send to device PrintAndLogEx(INFO, "Uploading to device... "); uint16_t bytes_sent = 0; - iclass_upload_emul(data, tot_bytes, &bytes_sent); + iclass_upload_emul(data, tot_bytes, 0, &bytes_sent); free(data); PrintAndLogEx(NORMAL, ""); @@ -1092,7 +1092,7 @@ static int CmdHFiClassELoad(const char *Cmd) { //Send to device uint16_t bytes_sent = 0; - iclass_upload_emul(dump, bytes_read, &bytes_sent); + iclass_upload_emul(dump, bytes_read, 0, &bytes_sent); free(dump); PrintAndLogEx(SUCCESS, "uploaded " _YELLOW_("%d") " bytes to emulator memory", bytes_sent); PrintAndLogEx(HINT, "You are ready to simulate. See " _YELLOW_("`hf iclass sim -h`")); @@ -1222,6 +1222,52 @@ static int CmdHFiClassEView(const char *Cmd) { return PM3_SUCCESS; } +static int CmdHFiClassESetBlk(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf iclass esetblk", + "Display emulator memory.\n" + "Number of bytes to download defaults to 256. Other value is 2048.", + "hf iclass eview\n" + "hf iclass eview -s 2048\n" + "hf iclass eview -s 2048 -v"); + + void *argtable[] = { + arg_param_begin, + arg_int1("b", "blk", "", "block number"), + arg_str0("d", "data", "", "bytes to write, 16 hex bytes"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + int blk = arg_get_int_def(ctx, 1, 0); + + if (blk > 255) { + PrintAndLogEx(WARNING, "block number must be between 0 and 255. Got %i", blk); + return PM3_EINVARG; + } + + uint8_t data[PICOPASS_BLOCK_SIZE] = {0x00}; + int datalen = 0; + int res = CLIParamHexToBuf(arg_get_str(ctx, 2), data, sizeof(data), &datalen); + CLIParserFree(ctx); + if (res) { + PrintAndLogEx(FAILED, "Error parsing bytes"); + return PM3_EINVARG; + } + + if (datalen != sizeof(data)) { + PrintAndLogEx(WARNING, "block data must include 8 HEX bytes. Got %i", datalen); + return PM3_EINVARG; + } + + CLIParserFree(ctx); + + uint16_t bytes_sent = 0; + iclass_upload_emul(data, sizeof(data), blk * PICOPASS_BLOCK_SIZE, &bytes_sent); + + return PM3_SUCCESS; +} + static void iclass_decode_credentials(uint8_t *data) { BLOCK79ENCRYPTION encryption = (data[(6 * 8) + 7] & 0x03); bool has_values = (memcmp(data + (8 * 7), empty, 8) != 0) && (memcmp(data + (8 * 7), zeros, 8) != 0); @@ -4226,6 +4272,7 @@ static command_t CommandTable[] = { {"sim", CmdHFiClassSim, IfPm3Iclass, "Simulate iCLASS tag"}, {"eload", CmdHFiClassELoad, IfPm3Iclass, "Load Picopass / iCLASS dump file into emulator memory"}, {"esave", CmdHFiClassESave, IfPm3Iclass, "Save emulator memory to file"}, + {"esetblk", CmdHFiClassESetBlk, IfPm3Iclass, "Set emulator memory block data"}, {"eview", CmdHFiClassEView, IfPm3Iclass, "View emulator memory"}, {"-----------", CmdHelp, AlwaysAvailable, "---------------------- " _CYAN_("utils") " ----------------------"}, {"configcard", CmdHFiClassConfigCard, AlwaysAvailable, "Reader configuration card"}, diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 4164060f7..6cb77a54e 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -850,10 +850,10 @@ static int CmdHFTexkomSim(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf texkom sim", "Simulate a texkom tag", - "hf texkom sim \r\n" - "hf texkom sim --raw FFFF638C7DC45553 -> simulate TK13 tag with id 8C7DC455\r\n" - "hf texkom sim --tk17 --raw FFFFCA17F31EC512 -> simulate TK17 tag with id 17F31EC5\r\n" - "hf texkom sim --id 8C7DC455 -> simulate TK13 tag with id 8C7DC455\r\n" + "hf texkom sim \n" + "hf texkom sim --raw FFFF638C7DC45553 -> simulate TK13 tag with id 8C7DC455\n" + "hf texkom sim --tk17 --raw FFFFCA17F31EC512 -> simulate TK17 tag with id 17F31EC5\n" + "hf texkom sim --id 8C7DC455 -> simulate TK13 tag with id 8C7DC455\n" "hf texkom sim --id 8C7DC455 --tk17 -> simulate TK17 tag with id 17F31EC5"); void *argtable[] = { diff --git a/client/src/pm3line_vocabulary.h b/client/src/pm3line_vocabulary.h index 0f617ef0d..8926ffb94 100644 --- a/client/src/pm3line_vocabulary.h +++ b/client/src/pm3line_vocabulary.h @@ -282,6 +282,7 @@ const static vocabulary_t vocabulary[] = { { 0, "hf iclass sim" }, { 0, "hf iclass eload" }, { 0, "hf iclass esave" }, + { 0, "hf iclass esetblk" }, { 0, "hf iclass eview" }, { 1, "hf iclass configcard" }, { 1, "hf iclass calcnewkey" }, diff --git a/doc/commands.json b/doc/commands.json index 858cc02cd..f92263843 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -215,10 +215,9 @@ "offline": true, "options": [ "-h, --help This help", - "-d ASN1 encoded byte array", - "-t, --test perform selftest" + "-d ASN1 encoded byte array" ], - "usage": "data atr [-ht] [-d ]" + "usage": "data atr [-h] [-d ]" }, "data autocorr": { "command": "data autocorr", @@ -3150,6 +3149,22 @@ ], "usage": "hf iclass esave [-h] [-f ] [-s <256|2048>]" }, + "hf iclass esetblk": { + "command": "hf iclass esetblk", + "description": "Display emulator memory. Number of bytes to download defaults to 256. Other value is 2048.", + "notes": [ + "hf iclass eview", + "hf iclass eview -s 2048", + "hf iclass eview -s 2048 -v" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-b, --blk block number", + "-d, --data bytes to write, 16 hex bytes" + ], + "usage": "hf iclass esetblk [-h] -b [-d ]" + }, "hf iclass eview": { "command": "hf iclass eview", "description": "Display emulator memory. Number of bytes to download defaults to 256. Other value is 2048.", @@ -6986,6 +7001,7 @@ "description": "Simulate a texkom tag", "notes": [ "hf texkom sim", + "", "hf texkom sim --raw FFFF638C7DC45553 -> simulate TK13 tag with id 8C7DC455", "hf texkom sim --tk17 --raw FFFFCA17F31EC512 -> simulate TK17 tag with id 17F31EC5", "hf texkom sim --id 8C7DC455 -> simulate TK13 tag with id 8C7DC455", @@ -8770,7 +8786,7 @@ "-1, --ht1 Card type Hitag 1", "-2, --ht2 Card type Hitag 2", "-s, --hts Card type Hitag S", - "-m, --htm Card type Hitag \u03bc" + "-m, --htm Card type Hitag \u00ce\u00bc" ], "usage": "lf hitag eload [-h12sm] -f " }, @@ -11819,8 +11835,8 @@ } }, "metadata": { - "commands_extracted": 685, + "commands_extracted": 686, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-08-02T20:39:48" + "extracted_on": "2023-08-21T21:25:03" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 27d6a05b4..919ce3f8e 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -421,6 +421,7 @@ Check column "offline" for their availability. |`hf iclass sim `|N |`Simulate iCLASS tag` |`hf iclass eload `|N |`Load Picopass / iCLASS dump file into emulator memory` |`hf iclass esave `|N |`Save emulator memory to file` +|`hf iclass esetblk `|N |`Set emulator memory block data` |`hf iclass eview `|N |`View emulator memory` |`hf iclass configcard `|Y |`Reader configuration card` |`hf iclass calcnewkey `|Y |`Calc diversified keys (blocks 3 & 4) to write new keys` From d183944bb16b9bb0a4a7702c5723084c0de635b2 Mon Sep 17 00:00:00 2001 From: nvx Date: Tue, 22 Aug 2023 07:53:57 +1000 Subject: [PATCH 863/924] Add CHANGELOG entry for hf iclass esetblk command --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e773482db..cf9c6f192 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `hf iclass esetblk` - set iClass emulator memory block data (@nvx) - Added cryptorf regressiontests (@iceman1001) - Fixed `cryptorf/sma_multi` - local state used in multithread (@iceman1001) - Changed `fpga_compress` - better deallocation of memory and closing of file handles (@iceman1001) From 0d442d7f190b4c2827122abd515ca592c3e0f2d1 Mon Sep 17 00:00:00 2001 From: startrekdude Date: Tue, 22 Aug 2023 01:10:21 -0400 Subject: [PATCH 864/924] Add hf_cardhopper standalone mode Adds the hf_cardhopper standalone mode, as one component of my (Sam Haskins) and Trevor Stevado's long-range relay attack on ISO 14443-4 Type A protocols, as presented at DEF CON 31. --- CHANGELOG.md | 1 + armsrc/Standalone/Makefile.hal | 7 +- armsrc/Standalone/Makefile.inc | 4 + armsrc/Standalone/hf_cardhopper.c | 408 ++++++++++++++++++ .../4_Advanced-compilation-parameters.md | 1 + tools/build_all_firmwares.sh | 4 +- 6 files changed, 421 insertions(+), 4 deletions(-) create mode 100644 armsrc/Standalone/hf_cardhopper.c diff --git a/CHANGELOG.md b/CHANGELOG.md index e773482db..eec2ac775 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Changed `hf_mf_luxeo_dump.lua` - now have list of keys to iterate (@iceman1001) - Fixed the timeout of TCP connections (@wh201906) - Changed the connection timeout configurable (@wh201906) + - Add hf_cardhopper standalone mode for long-distance relay attacks (@startrekdude) ## [Seven.4.16717][2023-06-25] - Change `hf 14a info` - now identifes QL88 tags (@iceman1001) diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index da204eaca..1a903a0ac 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -86,6 +86,9 @@ define KNOWN_STANDALONE_DEFINITIONS | HF_BOG | 14a sniff with ULC/ULEV1/NTAG auth | | (RDV4 only) | storing in flashmem - Bogito | +----------------------------------------------------------+ +| HF_CARDHOPPER | Relay 14a protocols over long distances| +| (RDV4 only) | (w/ IP backbone) - Sam Haskins | ++----------------------------------------------------------+ | HF_COLIN | Mifare ultra fast sniff/sim/clone | | (RDV4 only) | - Colin Brigato | +----------------------------------------------------------+ @@ -130,9 +133,9 @@ endef STANDALONE_MODES := LF_SKELETON STANDALONE_MODES += LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_MULTIHID LF_NEDAP_SIM LF_NEXID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE -STANDALONE_MODES += HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY HF_TCPRST HF_TMUDFORD HF_YOUNG +STANDALONE_MODES += HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_CARDHOPPER HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY HF_TCPRST HF_TMUDFORD HF_YOUNG STANDALONE_MODES += DANKARMULTI -STANDALONE_MODES_REQ_BT := HF_REBLAY +STANDALONE_MODES_REQ_BT := HF_CARDHOPPER HF_REBLAY STANDALONE_MODES_REQ_SMARTCARD := STANDALONE_MODES_REQ_FLASH := LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG HF_COLIN HF_ICECLASS HF_LEGICSIM HF_MFCSIM ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES)),) diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index 6aeb163bb..19e3645ff 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -97,6 +97,10 @@ endif ifneq (,$(findstring WITH_STANDALONE_HF_BOG,$(APP_CFLAGS))) SRC_STANDALONE = hf_bog.c endif +# WITH_STANDALONE_HF_CARDHOPPER +ifneq (,$(findstring WITH_STANDALONE_HF_CARDHOPPER,$(APP_CFLAGS))) + SRC_STANDALONE = hf_cardhopper.c +endif # WITH_STANDALONE_HF_COLIN ifneq (,$(findstring WITH_STANDALONE_HF_COLIN,$(APP_CFLAGS))) SRC_STANDALONE = vtsend.c hf_colin.c frozen.c nprintf.c diff --git a/armsrc/Standalone/hf_cardhopper.c b/armsrc/Standalone/hf_cardhopper.c new file mode 100644 index 000000000..7101b5ae7 --- /dev/null +++ b/armsrc/Standalone/hf_cardhopper.c @@ -0,0 +1,408 @@ +/* + * hf_cardhopper standalone mode by Sam Haskins + * + * A component of our (me + Trevor Stevado) research on long-range relay + * attacks against 14a-based protocols (as presented at DEF CON '31). + * Works with a CardHopper (recommended) or BlueShark add-on. + * + * If you're reading this, you're clearly a very interesting person--- + * do reach out if you get any fun results? [ sam AT loudmouth DOT io ] + * Good luck, and may the odds be ever in your favour! + * + * The companion Android app is available on our gitlab: gitlab.com/loudmouth-security + * + * For more information, see: https://media.defcon.org/DEF%20CON%2031/DEF%20CON%2031%20presentations/Trevor%20Stevado%20Sam%20Haskins%20-%20Unlocking%20Doors%20from%20Half%20a%20Continent%20Away.pdf + */ + +#include + +#include "appmain.h" +#include "BigBuf.h" +#include "dbprint.h" +#include "fpgaloader.h" +#include "iso14443a.h" +#include "protocols.h" +#include "proxmark3_arm.h" +#include "standalone.h" +#include "ticks.h" +#include "util.h" +#include "usart.h" + + +void ModInfo(void) { + DbpString(" HF - Long-range relay 14a over serial<->IP - a.k.a. CardHopper (Sam Haskins)"); +} + + +typedef struct PACKED { + uint8_t len; + uint8_t dat[255]; +} packet_t; + +// Magic numbers +static const uint8_t magicREAD[4] = "READ"; +static const uint8_t magicCARD[4] = "CARD"; +static const uint8_t magicEND [4] = "\xff" "END"; +static const uint8_t magicRSRT[7] = "RESTART"; +static const uint8_t magicERR [4] = "\xff" "ERR"; +static uint8_t magicACK [1] = "\xfe"; // is constant, but must be passed to API that doesn't like that + +// Forward declarations +static void become_reader(void); +static void select_card(void); + +static void become_card(void); +static void prepare_emulation(uint8_t*, uint16_t*, uint8_t*, packet_t*); +static void cook_ats(packet_t*, uint8_t, uint8_t); +static bool try_use_canned_response(uint8_t*, int, tag_response_info_t*); +static void reply_with_packet(packet_t*); + +static void read_packet(packet_t*); +static void write_packet(packet_t*); + +static bool GetIso14443aCommandFromReaderInterruptible(uint8_t*, uint8_t*, int*); + + +void RunMod(void) { + StandAloneMode(); + DbpString(_CYAN_("[@]") " CardHopper has started - waiting for mode"); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + + clear_trace(); + set_tracing(true); + + // Indicate we are alive and in CardHopper + LEDsoff(); + LED_A_ON(); + LED_D_ON(); + + while (1) { + WDT_HIT(); + + packet_t modeRx = { 0 }; + read_packet(&modeRx); + + if (memcmp(magicREAD, modeRx.dat, sizeof(magicREAD)) == 0) { + DbpString(_CYAN_("[@]") " I am a READER. I talk to a CARD."); + become_reader(); + } else if (memcmp(magicCARD, modeRx.dat, sizeof(magicCARD)) == 0) { + DbpString(_CYAN_("[@]") " I am a CARD. I talk to a READER."); + become_card(); + } else if (memcmp(magicEND, modeRx.dat, sizeof(magicEND)) == 0) { + break; + } else { + DbpString(_YELLOW_("[!]") " unknown mode!"); + Dbhexdump(modeRx.len, modeRx.dat, true); + } + } + + DbpString(_CYAN_("[@]") " exiting ..."); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); +} + + +static void become_reader(void) { + iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD); + select_card(); // also sends UID, ATS + + DbpString(_CYAN_("[@]") " entering reader main loop ..."); + packet_t packet = { 0 }; + packet_t *rx = &packet; + packet_t *tx = &packet; + uint8_t toCard[256] = { 0 }; + uint8_t parity[MAX_PARITY_SIZE] = { 0 }; + + while(1) { + WDT_HIT(); + + read_packet(rx); + if (memcmp(magicRSRT, rx->dat, sizeof(magicRSRT)) == 0) break; + + memcpy(toCard, rx->dat, rx->len); + AddCrc14A(toCard, rx->len); + ReaderTransmit(toCard, rx->len + 2, NULL); + + tx->len = ReaderReceive(tx->dat, parity); + if (tx->len == 0) { + tx->len = sizeof(magicERR); + memcpy(tx->dat, magicERR, sizeof(magicERR)); + } else tx->len -= 2; // cut off the CRC + + write_packet(tx); + } +} + + +static void select_card(void) { + iso14a_card_select_t card = { 0 }; + while(1) { + WDT_HIT(); + + int ret = iso14443a_select_card(NULL, &card, NULL, true, 0, false); + if (ret && ret != 1) + Dbprintf(_RED_("[!]") " Error selecting card: %d", ret); + if (ret == 1) break; + + SpinDelay(20); + } + + DbpString(_CYAN_("[@]") " UID:"); + Dbhexdump(card.uidlen, card.uid, false); + DbpString(_CYAN_("[@]") " ATS:"); + Dbhexdump(card.ats_len - 2 /* no CRC */, card.ats, false); + + packet_t tx = { 0 }; + tx.len = card.uidlen; + memcpy(tx.dat, card.uid, tx.len); + write_packet(&tx); + + tx.len = card.ats_len - 2; + memcpy(tx.dat, card.ats, tx.len); + write_packet(&tx); +} + + +static void become_card(void) { + iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN); + + uint8_t tagType; + uint16_t flags; + uint8_t data[PM3_CMD_DATA_SIZE] = { 0 }; + packet_t ats = { 0 }; + prepare_emulation(&tagType, &flags, data, &ats); + + tag_response_info_t *canned; + uint32_t cuid; + uint32_t counters[3] = { 0 }; + uint8_t tearings[3] = { 0xbd, 0xbd, 0xbd }; + uint8_t pages; + SimulateIso14443aInit(tagType, flags, data, &canned, &cuid, counters, tearings, &pages); + + DbpString(_CYAN_("[@]") " Setup done - entering emulation loop"); + int fromReaderLen; + uint8_t fromReaderDat[256] = { 0 }; + uint8_t parity[MAX_PARITY_SIZE] = { 0 }; + packet_t packet = { 0 }; + packet_t *tx = &packet; + packet_t *rx = &packet; + + while (1) { + WDT_HIT(); + + if (!GetIso14443aCommandFromReaderInterruptible(fromReaderDat, parity, &fromReaderLen)) { + if (usart_rxdata_available()) { + read_packet(rx); + if (memcmp(magicRSRT, rx->dat, sizeof(magicRSRT)) == 0) { + DbpString(_CYAN_("[@]") " Breaking from reader loop"); + break; + } + } + continue; + } + + // Option 1: Use a canned response + if (try_use_canned_response(fromReaderDat, fromReaderLen, canned)) continue; + + // Option 2: Reply with our cooked ATS + if (fromReaderDat[0] == ISO14443A_CMD_RATS && fromReaderLen == 4) { + reply_with_packet(&ats); + continue; + } + + // Option 3: Relay the message + tx->len = fromReaderLen - 2; // cut off the crc + memcpy(tx->dat, fromReaderDat, tx->len); + write_packet(tx); + + read_packet(rx); + reply_with_packet(rx); + } +} + + +static void prepare_emulation(uint8_t *tagType, uint16_t *flags, uint8_t *data, packet_t *ats) { + packet_t tagTypeRx = { 0 }; read_packet(&tagTypeRx); + packet_t timeModeRx = { 0 }; read_packet(&timeModeRx); + packet_t uidRx = { 0 }; read_packet(&uidRx); + read_packet(ats); + + *tagType = tagTypeRx.dat[0]; + Dbprintf(_CYAN_("[@]") " Using tag type: %hhu", *tagType); + + DbpString(_CYAN_("[@]") " Time control parameters:"); + Dbhexdump(timeModeRx.len, timeModeRx.dat, false); + uint8_t fwi = timeModeRx.dat[0] & 0x0f; + uint8_t sfgi = timeModeRx.dat[1] & 0x0f; + Dbprintf(_CYAN_("[@]") " Parsed as fwi = %hhu, sfgi = %hhu", fwi, sfgi); + + if (fwi == 0xf) { + DbpString(_YELLOW_("[!]") " Refusing to use 15 as FWI - will use 14"); + fwi = 0xe; + } + if (sfgi == 0xf) { + DbpString(_YELLOW_("[!]") " Refusing to use 15 as SFGI - will use 14"); + sfgi = 0xe; + } + + memcpy(data, uidRx.dat, uidRx.len); + *flags = (uidRx.len == 10 ? FLAG_10B_UID_IN_DATA : (uidRx.len == 7 ? FLAG_7B_UID_IN_DATA : FLAG_4B_UID_IN_DATA)); + DbpString(_CYAN_("[@]") " UID:"); + Dbhexdump(uidRx.len, data, false); + Dbprintf(_CYAN_("[@]") " Flags: %hu", *flags); + + DbpString(_CYAN_("[@]") " Original ATS:"); + Dbhexdump(ats->len, ats->dat, false); + cook_ats(ats, fwi, sfgi); + DbpString(_CYAN_("[@]") " Cooked ATS:"); + Dbhexdump(ats->len, ats->dat, false); +} + + +static void cook_ats(packet_t *ats, uint8_t fwi, uint8_t sfgi) { + if (ats->len != ats->dat[0]) { + DbpString(_RED_("[!]") " Malformed ATS - unable to cook; things may go wrong!"); + return; + } + + // If the ATS is too short (unusual), pad it to length with hopefully-sensible data + // Might be better for the phone side to do this tbh + if (ats->len == 1) { + ats->len = 4; + ats->dat[0] = 0x04; ats->dat[1] = 0x78; ats->dat[2] = 0x77; ats->dat[3] = 0x80; + } else if (ats->len == 2) { + ats->len = 4; + ats->dat[0] = 0x04; ats->dat[2] = 0x77; ats->dat[3] = 0x80; + } else if (ats->len == 3) { + ats->len = 4; + ats->dat[0] = 0x04; ats->dat[3] = 0x80; + } + + // Set the SFGI as well as the FWI - needed for some older readers (firmware revs?) + uint8_t cookedTB0 = (fwi << 4) | sfgi; + ats->dat[3] = cookedTB0; +} + + +static bool try_use_canned_response(uint8_t *dat, int len, tag_response_info_t *canned) { + if ((dat[0] == ISO14443A_CMD_REQA || dat[0] == ISO14443A_CMD_WUPA) && len == 1) { + EmSendPrecompiledCmd(canned + RESP_INDEX_ATQA); + return true; + } + + if (dat[1] == 0x20 && len == 2) { + if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT) { + EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC1); + return true; + } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2) { + EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC2); + return true; + } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_3) { + EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC3); + return true; + } + } + + if (dat[1] == 0x70 && len == 9) { + if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT) { + EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC1); + return true; + } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2) { + EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC2); + return true; + } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_3) { + EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC3); + return true; + } + } + + if (dat[0] == ISO14443A_CMD_PPS) { + EmSendPrecompiledCmd(canned + RESP_INDEX_PPS); + return true; + } + + // No response is expected to these 14a commands + if ((dat[0] == 0xf2 && len == 4) || dat[0] == 0xfa) return true; + if (dat[0] == ISO14443A_CMD_HALT && len == 4) return true; + + // Ignore Apple ECP2 polling + if (dat[0] == 0x6a) return true; + + return false; +} + + +static uint8_t g_responseBuffer [512 ] = { 0 }; +static uint8_t g_modulationBuffer[1024] = { 0 }; + +static void reply_with_packet(packet_t *packet) { + tag_response_info_t response = { 0 }; + response.response = g_responseBuffer; + response.modulation = g_modulationBuffer; + + memcpy(response.response, packet->dat, packet->len); + AddCrc14A(response.response, packet->len); + response.response_n = packet->len + 2; + + prepare_tag_modulation(&response, sizeof(g_modulationBuffer)); + EmSendPrecompiledCmd(&response); +} + + +static void read_packet(packet_t *packet) { + while(!usart_rxdata_available()) { + WDT_HIT(); + SpinDelayUs(100); + } + + uint32_t dataReceived = usart_read_ng((uint8_t*) packet, sizeof(packet_t)) - 1; + while(dataReceived != packet->len) { + while(!usart_rxdata_available()) WDT_HIT(); + + dataReceived += usart_read_ng(packet->dat + dataReceived, 255 - dataReceived); + } + usart_writebuffer_sync(magicACK, sizeof(magicACK)); +} + + +static void write_packet(packet_t *packet) { + usart_writebuffer_sync((uint8_t*) packet, packet->len + 1); +} + + +static bool GetIso14443aCommandFromReaderInterruptible(uint8_t *received, uint8_t *par, int *len) { + LED_D_OFF(); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_LISTEN); + + Uart14aInit(received, par); + + uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + (void)b; + + uint8_t flip = 0; + uint16_t checker = 4000; + for (;;) { + WDT_HIT(); + + if (flip == 3) { + if (usart_rxdata_available()) + return false; + + flip = 0; + } + + if (checker-- == 0) { + flip++; + checker = 4000; + } + + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { + b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + if (MillerDecoding(b, 0)) { + *len = GetUart14a()->len; + return true; + } + } + } + return false; +} diff --git a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md index 53726b9dd..823e527da 100644 --- a/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md +++ b/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md @@ -121,6 +121,7 @@ Here are the supported values you can assign to `STANDALONE` in `Makefile.platfo | HF_15SNIFF | 15693 sniff storing to flashmem - Glaser | HF_AVEFUL | MIFARE Ultralight read/simulation - Ave Ozkal | HF_BOG | 14a sniff with ULC/ULEV1/NTAG auth storing in flashmem - Bogito +| HF_CARDHOPPER | Long distance (over IP) relay of 14a protocols - Sam Haskins | HF_COLIN | Mifare ultra fast sniff/sim/clone - Colin Brigato | HF_CRAFTBYTE | UID stealer - Emulates scanned 14a UID - Anze Jensterle | HF_ICECLASS | iCLASS 4-1 mode sim/read & dump/loclass/glitch & config to flashmem - Iceman1001 diff --git a/tools/build_all_firmwares.sh b/tools/build_all_firmwares.sh index 4a0fe5947..261d89135 100755 --- a/tools/build_all_firmwares.sh +++ b/tools/build_all_firmwares.sh @@ -32,9 +32,9 @@ mv bootrom/obj/bootrom.elf "$DEST/PM3BOOTROM.elf" # cf armsrc/Standalone/Makefile.hal STANDALONE_MODES=(LF_SKELETON) STANDALONE_MODES+=(LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_MULTIHID LF_NEDAP_SIM LF_NEXID LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE) -STANDALONE_MODES+=(HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY HF_TCPRST HF_TMUDFORD HF_YOUNG) +STANDALONE_MODES+=(HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_AVEFUL HF_BOG HF_CARDHOPPER HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY HF_TCPRST HF_TMUDFORD HF_YOUNG) STANDALONE_MODES+=(DANKARMULTI) -STANDALONE_MODES_REQ_BT=(HF_REBLAY) +STANDALONE_MODES_REQ_BT=(HF_CARDHOPPER HF_REBLAY) STANDALONE_MODES_REQ_SMARTCARD=() STANDALONE_MODES_REQ_FLASH=(LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG HF_COLIN HF_ICECLASS HF_LEGICSIM HF_MFCSIM) From bc8761500885f5c1a644712392b376dd5ea2a49a Mon Sep 17 00:00:00 2001 From: nvx Date: Wed, 23 Aug 2023 02:43:18 +1000 Subject: [PATCH 865/924] Fix help text for hf iclass esetblk --- client/src/cmdhficlass.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 4a4ac3289..92df71046 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1225,16 +1225,13 @@ static int CmdHFiClassEView(const char *Cmd) { static int CmdHFiClassESetBlk(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf iclass esetblk", - "Display emulator memory.\n" - "Number of bytes to download defaults to 256. Other value is 2048.", - "hf iclass eview\n" - "hf iclass eview -s 2048\n" - "hf iclass eview -s 2048 -v"); + "Sets an individual block in emulator memory.", + "hf iclass esetblk -b 7 -d 0000000000000000"); void *argtable[] = { arg_param_begin, arg_int1("b", "blk", "", "block number"), - arg_str0("d", "data", "", "bytes to write, 16 hex bytes"), + arg_str0("d", "data", "", "bytes to write, 8 hex bytes"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); From 9fdf314347778511ff2323670e440f805fad6220 Mon Sep 17 00:00:00 2001 From: nvx Date: Wed, 23 Aug 2023 03:15:21 +1000 Subject: [PATCH 866/924] regenerate doc/commands.json --- doc/commands.json | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/doc/commands.json b/doc/commands.json index f92263843..12509b1e7 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3151,17 +3151,15 @@ }, "hf iclass esetblk": { "command": "hf iclass esetblk", - "description": "Display emulator memory. Number of bytes to download defaults to 256. Other value is 2048.", + "description": "Sets an individual block in emulator memory.", "notes": [ - "hf iclass eview", - "hf iclass eview -s 2048", - "hf iclass eview -s 2048 -v" + "hf iclass esetblk -b 7 -d 0000000000000000" ], "offline": false, "options": [ "-h, --help This help", "-b, --blk block number", - "-d, --data bytes to write, 16 hex bytes" + "-d, --data bytes to write, 8 hex bytes" ], "usage": "hf iclass esetblk [-h] -b [-d ]" }, @@ -7001,7 +6999,6 @@ "description": "Simulate a texkom tag", "notes": [ "hf texkom sim", - "", "hf texkom sim --raw FFFF638C7DC45553 -> simulate TK13 tag with id 8C7DC455", "hf texkom sim --tk17 --raw FFFFCA17F31EC512 -> simulate TK17 tag with id 17F31EC5", "hf texkom sim --id 8C7DC455 -> simulate TK13 tag with id 8C7DC455", @@ -11837,6 +11834,6 @@ "metadata": { "commands_extracted": 686, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-08-21T21:25:03" + "extracted_on": "2023-08-22T17:13:49" } } \ No newline at end of file From a2a31423555aa5d74a869404005d1ddeb6783fa3 Mon Sep 17 00:00:00 2001 From: nvx Date: Wed, 23 Aug 2023 09:27:05 +1000 Subject: [PATCH 867/924] Improve iClass SIO and legacy credential detection to improve reliability. Now relies on the legacy config block for SR detection and the end-of-SIO detection no longer partially cuts off the SIO for any dumps I have. --- CHANGELOG.md | 1 + client/src/cmdhficlass.c | 107 +++++++++++++++++++++++---------------- client/src/util.c | 19 +++++++ client/src/util.h | 1 + doc/commands.json | 4 +- 5 files changed, 85 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06254cec2..b1bd9deb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed iClass SIO and Legacy credential detection to be more reliable (@nvx) - Added `hf iclass esetblk` - set iClass emulator memory block data (@nvx) - Added cryptorf regressiontests (@iceman1001) - Fixed `cryptorf/sma_multi` - local state used in multithread (@iceman1001) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 92df71046..5204fc488 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1266,6 +1266,11 @@ static int CmdHFiClassESetBlk(const char *Cmd) { } static void iclass_decode_credentials(uint8_t *data) { + if (memcmp(data + (5 * PICOPASS_BLOCK_SIZE), "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", PICOPASS_BLOCK_SIZE)) { + // Not a Legacy or SR card, nothing to do here. + return; + } + BLOCK79ENCRYPTION encryption = (data[(6 * 8) + 7] & 0x03); bool has_values = (memcmp(data + (8 * 7), empty, 8) != 0) && (memcmp(data + (8 * 7), zeros, 8) != 0); if (has_values && encryption == None) { @@ -1290,7 +1295,7 @@ static void iclass_decode_credentials(uint8_t *data) { wiegand_message_t packed = initialize_message_object(top, mid, bot, 0); HIDTryUnpack(&packed); } else { - PrintAndLogEx(INFO, "No credential found"); + PrintAndLogEx(INFO, "No unencrypted legacy credential found"); } } @@ -1515,23 +1520,19 @@ static int CmdHFiClassDecrypt(const char *Cmd) { // decode block 9 has_values = (memcmp(decrypted + (8 * 9), empty, 8) != 0) && (memcmp(decrypted + (8 * 9), zeros, 8) != 0); - if (has_values) { - + if (has_values && use_sc) { uint8_t usr_blk_len = GetNumberBlocksForUserId(decrypted + (8 * 6)); if (usr_blk_len < 3) { - if (use_sc) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "Block 9 decoder"); - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "Block 9 decoder"); + uint8_t pinsize = GetPinSize(decrypted + (8 * 6)); + if (pinsize > 0) { - uint8_t pinsize = GetPinSize(decrypted + (8 * 6)); - if (pinsize > 0) { - - uint64_t pin = bytes_to_num(decrypted + (8 * 9), 5); - char tmp[17] = {0}; - snprintf(tmp, sizeof(tmp), "%."PRIu64, BCD2DEC(pin)); - PrintAndLogEx(INFO, "PIN........................ " _GREEN_("%.*s"), pinsize, tmp); - } + uint64_t pin = bytes_to_num(decrypted + (8 * 9), 5); + char tmp[17] = {0}; + snprintf(tmp, sizeof(tmp), "%."PRIu64, BCD2DEC(pin)); + PrintAndLogEx(INFO, "PIN........................ " _GREEN_("%.*s"), pinsize, tmp); } } } @@ -2628,50 +2629,60 @@ static int CmdHFiClass_loclass(const char *Cmd) { } static void detect_credential(uint8_t *data, bool *legacy, bool *se, bool *sr) { - bool r1 = !memcmp(data + (5 * 8), "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8); + *legacy = false; + *sr = false; + *se = false; - uint8_t pattern_se[] = {0x05, 0x00}; - bool r2 = byte_strstr(data + (6 * 8), 6 * 8, pattern_se, sizeof(pattern_se)) != -1; + // Legacy AIA + if (!memcmp(data + (5 * PICOPASS_BLOCK_SIZE), "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", PICOPASS_BLOCK_SIZE)) { + *legacy = true; - uint8_t pattern_sr[] = {0x05, 0x00, 0x05, 0x00}; - bool r3 = byte_strstr(data + (11 * 8), 6 * 8, pattern_sr, sizeof(pattern_sr)) != -1; + // SR bit set in legacy config block + if ((data[6 * PICOPASS_BLOCK_SIZE] & 0xA0) == 0xA0) { + // If the card is blank (all FF's) then we'll reach here too, so check for an empty block 10 + // to avoid false positivies + if (memcmp(data + (10 * PICOPASS_BLOCK_SIZE), "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", PICOPASS_BLOCK_SIZE)) { + *sr = true; + } + } - *legacy = (r1) && (data[6 * 8] != 0x30); - *se = (r2) && (data[6 * 8] == 0x30); - *sr = (r3) && (data[10 * 8] == 0x30); - r1 = NULL, r2 = NULL, r3 = NULL; + return; + } + + // SE AIA + if (!memcmp(data + (5 * PICOPASS_BLOCK_SIZE), "\xFF\xFF\xFF\x00\x06\xFF\xFF\xFF", PICOPASS_BLOCK_SIZE)) { + *se = true; + return; + } } // print ASN1 decoded array in TLV view static void printIclassSIO(uint8_t *iclass_dump) { - bool isLegacy, isSE, isSR; detect_credential(iclass_dump, &isLegacy, &isSE, &isSR); - int dlen = 0; uint8_t *sio_start; if (isSE) { - - sio_start = iclass_dump + (6 * 8); - uint8_t pattern_se[] = {0x05, 0x00}; - dlen = byte_strstr(sio_start, 8 * 8, pattern_se, sizeof(pattern_se)); - if (dlen == -1) { - return; - } - dlen += sizeof(pattern_se); + // SE SIO starts at block 6 + sio_start = iclass_dump + (6 * PICOPASS_BLOCK_SIZE); } else if (isSR) { - - sio_start = iclass_dump + (10 * 8); - uint8_t pattern_sr[] = {0x05, 0x00, 0x05, 0x00}; - dlen = byte_strstr(sio_start, 8 * 8, pattern_sr, sizeof(pattern_sr)); - if (dlen == -1) { - return; - } - dlen += sizeof(pattern_sr); + // SR SIO starts at block 10 + sio_start = iclass_dump + (10 * PICOPASS_BLOCK_SIZE); } else { + // No SIO on Legacy credentials return; } + // Readers assume the SIO always fits within 7 blocks (they don't read any further blocks) + // Search backwards to find the last 0x05 0x00 seen at the end of the SIO + const uint8_t pattern_sio_end[] = {0x05, 0x00}; + int dlen = byte_strrstr(sio_start, 7 * PICOPASS_BLOCK_SIZE, pattern_sio_end, 2); + if (dlen == -1) { + return; + } + + dlen += sizeof(pattern_sio_end); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "---------------------------- " _CYAN_("SIO - RAW") " ----------------------------"); print_hex_noascii_break(sio_start, dlen, 32); @@ -2702,8 +2713,15 @@ void printIclassDumpContents(uint8_t *iclass_dump, uint8_t startblock, uint8_t e else maxmemcount = 31; - if (startblock == 0) - startblock = 6; + uint8_t pagemap = get_pagemap(hdr); + + if (startblock == 0) { + if (pagemap == PICOPASS_NON_SECURE_PAGEMODE) { + startblock = 3; + } else { + startblock = 6; + } + } if ((endblock > maxmemcount) || (endblock == 0)) endblock = maxmemcount; @@ -2721,7 +2739,6 @@ void printIclassDumpContents(uint8_t *iclass_dump, uint8_t startblock, uint8_t e , filemaxblock ); */ - uint8_t pagemap = get_pagemap(hdr); bool isLegacy = false, isSE = false, isSR = false; if (filemaxblock >= 17) { @@ -2886,7 +2903,7 @@ static int CmdHFiClassView(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_str1("f", "file", "", "filename of dump (bin/eml/json)"), - arg_int0(NULL, "first", "", "Begin printing from this block (default block 6)"), + arg_int0(NULL, "first", "", "Begin printing from this block (default first user block - 6 or 3 on non secured chips)"), arg_int0(NULL, "last", "", "End printing at this block (default 0, ALL)"), arg_lit0("v", "verbose", "verbose output"), arg_lit0("z", "dense", "dense dump output style"), diff --git a/client/src/util.c b/client/src/util.c index f1e58abe0..30a96a3dc 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -1289,6 +1289,25 @@ int byte_strstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_ return -1; } +int byte_strrstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_t plen) { + for (int i = srclen - plen; i >= 0; i--) { + // compare only first byte + if (src[i] != pattern[0]) + continue; + + // try to match rest of the pattern + for (int j = plen - 1; j >= 1; j--) { + + if (src[i + j] != pattern[j]) + break; + + if (j == 1) + return i; + } + } + return -1; +} + void sb_append_char(smartbuf *sb, unsigned char c) { if (sb->idx >= sb->size) { sb->size *= 2; diff --git a/client/src/util.h b/client/src/util.h index fa636ce9b..cfaf97167 100644 --- a/client/src/util.h +++ b/client/src/util.h @@ -155,6 +155,7 @@ uint32_t leadingzeros32(uint32_t a); uint64_t leadingzeros64(uint64_t a); int byte_strstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_t plen); +int byte_strrstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_t plen); struct smartbuf { char *ptr; diff --git a/doc/commands.json b/doc/commands.json index 12509b1e7..cf96b6895 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3403,7 +3403,7 @@ "options": [ "-h, --help This help", "-f, --file filename of dump (bin/eml/json)", - "--first Begin printing from this block (default block 6)", + "--first Begin printing from this block (default first user block - 6 or 3 on non secured chips)", "--last End printing at this block (default 0, ALL)", "-v, --verbose verbose output", "-z, --dense dense dump output style" @@ -11834,6 +11834,6 @@ "metadata": { "commands_extracted": 686, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-08-22T17:13:49" + "extracted_on": "2023-08-22T23:15:58" } } \ No newline at end of file From 760bfbb39901d42df3892bb03e0d999fcde5bb27 Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Wed, 23 Aug 2023 22:05:00 -0400 Subject: [PATCH 868/924] Fix macOS errors while building after cryptoRF solvers was added. --- tools/cryptorf/Makefile | 6 ++++++ tools/cryptorf/sma.cpp | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/cryptorf/Makefile b/tools/cryptorf/Makefile index 5ff3250e6..32c2c5ab4 100644 --- a/tools/cryptorf/Makefile +++ b/tools/cryptorf/Makefile @@ -8,6 +8,12 @@ MYLDLIBS = -lpthread BINS = cm sm sma sma_multi INSTALLTOOLS = $(BINS) +platform = $(shell uname) + +ifeq ($(platform),Darwin) +CXXFLAGS = -std=c++14 +endif + include ../../Makefile.host # checking platform can be done only after Makefile.host diff --git a/tools/cryptorf/sma.cpp b/tools/cryptorf/sma.cpp index 3fb1da343..9cf5caf40 100644 --- a/tools/cryptorf/sma.cpp +++ b/tools/cryptorf/sma.cpp @@ -671,13 +671,12 @@ static inline void search_gc_candidates_left(const uint64_t lstate_before_gc, co void combine_valid_left_right_states(vector *plcstates, vector *prcstates, vector *pgc_candidates) { vector::iterator itl, itr; - size_t pos, count; + size_t pos; uint64_t gc; bool valid; // Clean up the candidate list pgc_candidates->clear(); - count = 0; for (itl = plcstates->begin(); itl != plcstates->end(); ++itl) { for (itr = prcstates->begin(); itr != prcstates->end(); ++itr) { valid = true; @@ -700,7 +699,6 @@ void combine_valid_left_right_states(vector *plcstates, vector *prcs // printf("%09llx - ",itl->l); // printf("%07llx\n",itr->r); } - count++; } } printf("Found a total of " _YELLOW_("%llu")" combinations, ", ((unsigned long long)plcstates->size()) * prcstates->size()); From 42330fc5ed535b095acd6a320aedab832a265eb8 Mon Sep 17 00:00:00 2001 From: nvx Date: Thu, 24 Aug 2023 15:08:11 +1000 Subject: [PATCH 869/924] Misc tidyups replacing magic numbers with defines, better help text, and some added comments --- client/src/cmdhficlass.c | 46 +++++++++++++++++++++------------------- client/src/util.c | 5 +++++ 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index 5204fc488..5e271a743 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -42,8 +42,10 @@ #define PICOPASS_BLOCK_SIZE 8 #define NUM_CSNS 9 +#define MAC_ITEM_SIZE 24 // csn(8) + epurse(8) + nr(4) + mac(4) = 24 bytes #define ICLASS_KEYS_MAX 8 #define ICLASS_AUTH_RETRY 10 +#define ICLASS_CFG_BLK_SR_BIT 0xA0 // indicates SIO present when set in block6[0] (legacy tags) #define ICLASS_DECRYPTION_BIN "iclass_decryptionkey.bin" static void print_picopass_info(const picopass_hdr_t *hdr); @@ -54,13 +56,13 @@ static void iclass_set_last_known_card(picopass_hdr_t *card) { memcpy(&iclass_last_known_card, card, sizeof(picopass_hdr_t)); } -static uint8_t empty[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; -static uint8_t zeros[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static uint8_t empty[PICOPASS_BLOCK_SIZE] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +static uint8_t zeros[PICOPASS_BLOCK_SIZE] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static int CmdHelp(const char *Cmd); static void printIclassSIO(uint8_t *iclass_dump); -static uint8_t iClass_Key_Table[ICLASS_KEYS_MAX][8] = { +static uint8_t iClass_Key_Table[ICLASS_KEYS_MAX][PICOPASS_BLOCK_SIZE] = { { 0xAE, 0xA6, 0x84, 0xA6, 0xDA, 0xB2, 0x32, 0x78 }, { 0xFD, 0xCB, 0x5A, 0x52, 0xEA, 0x8F, 0x30, 0x90 }, { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 }, @@ -747,7 +749,7 @@ static int CmdHFiClassSim(const char *Cmd) { // remember to change the define NUM_CSNS to match. // pre-defined 9 CSN by iceman - uint8_t csns[8 * NUM_CSNS] = { + uint8_t csns[NUM_CSNS * PICOPASS_BLOCK_SIZE] = { 0x01, 0x0A, 0x0F, 0xFF, 0xF7, 0xFF, 0x12, 0xE0, 0x0C, 0x06, 0x0C, 0xFE, 0xF7, 0xFF, 0x12, 0xE0, 0x10, 0x97, 0x83, 0x7B, 0xF7, 0xFF, 0x12, 0xE0, @@ -779,7 +781,7 @@ static int CmdHFiClassSim(const char *Cmd) { PrintAndLogEx(INFO, "press " _YELLOW_("`enter`") " to cancel"); PacketResponseNG resp; clearCommandBuffer(); - SendCommandMIX(CMD_HF_ICLASS_SIMULATE, sim_type, NUM_CSNS, 1, csns, 8 * NUM_CSNS); + SendCommandMIX(CMD_HF_ICLASS_SIMULATE, sim_type, NUM_CSNS, 1, csns, NUM_CSNS * PICOPASS_BLOCK_SIZE); while (WaitForResponseTimeout(CMD_ACK, &resp, 2000) == false) { tries++; @@ -799,7 +801,7 @@ static int CmdHFiClassSim(const char *Cmd) { if (num_mac == 0) break; - size_t datalen = NUM_CSNS * 24; + size_t datalen = NUM_CSNS * MAC_ITEM_SIZE; uint8_t *dump = calloc(datalen, sizeof(uint8_t)); if (!dump) { PrintAndLogEx(WARNING, "Failed to allocate memory"); @@ -811,11 +813,11 @@ static int CmdHFiClassSim(const char *Cmd) { uint8_t i = 0; for (i = 0 ; i < NUM_CSNS ; i++) { //copy CSN - memcpy(dump + i * 24, csns + i * 8, 8); + memcpy(dump + (i * MAC_ITEM_SIZE), csns + i * 8, 8); //copy epurse - memcpy(dump + i * 24 + 8, resp.data.asBytes + i * 16, 8); + memcpy(dump + (i * MAC_ITEM_SIZE) + 8, resp.data.asBytes + i * 16, 8); // NR_MAC (eight bytes from the response) ( 8b csn + 8b epurse == 16) - memcpy(dump + i * 24 + 16, resp.data.asBytes + i * 16 + 8, 8); + memcpy(dump + (i * MAC_ITEM_SIZE) + 16, resp.data.asBytes + i * 16 + 8, 8); } /** Now, save to dumpfile **/ saveFile("iclass_mac_attack", ".bin", dump, datalen); @@ -830,7 +832,7 @@ static int CmdHFiClassSim(const char *Cmd) { PrintAndLogEx(INFO, "press Enter to cancel"); PacketResponseNG resp; clearCommandBuffer(); - SendCommandMIX(CMD_HF_ICLASS_SIMULATE, sim_type, NUM_CSNS, 1, csns, 8 * NUM_CSNS); + SendCommandMIX(CMD_HF_ICLASS_SIMULATE, sim_type, NUM_CSNS, 1, csns, NUM_CSNS * PICOPASS_BLOCK_SIZE); while (WaitForResponseTimeout(CMD_ACK, &resp, 2000) == false) { tries++; @@ -850,25 +852,23 @@ static int CmdHFiClassSim(const char *Cmd) { if (num_mac == 0) break; - size_t datalen = NUM_CSNS * 24; + size_t datalen = NUM_CSNS * MAC_ITEM_SIZE; uint8_t *dump = calloc(datalen, sizeof(uint8_t)); if (!dump) { PrintAndLogEx(WARNING, "Failed to allocate memory"); return PM3_EMALLOC; } -#define MAC_ITEM_SIZE 24 - //KEYROLL 1 //Need zeroes for the CC-field memset(dump, 0, datalen); for (uint8_t i = 0; i < NUM_CSNS ; i++) { // copy CSN - memcpy(dump + i * MAC_ITEM_SIZE, csns + i * 8, 8); //CSN + memcpy(dump + (i * MAC_ITEM_SIZE), csns + i * 8, 8); //CSN // copy EPURSE - memcpy(dump + i * MAC_ITEM_SIZE + 8, resp.data.asBytes + i * 16, 8); + memcpy(dump + (i * MAC_ITEM_SIZE) + 8, resp.data.asBytes + i * 16, 8); // copy NR_MAC (eight bytes from the response) ( 8b csn + 8b epurse == 16) - memcpy(dump + i * MAC_ITEM_SIZE + 16, resp.data.asBytes + i * 16 + 8, 8); + memcpy(dump + (i * MAC_ITEM_SIZE) + 16, resp.data.asBytes + i * 16 + 8, 8); } saveFile("iclass_mac_attack_keyroll_A", ".bin", dump, datalen); @@ -877,11 +877,11 @@ static int CmdHFiClassSim(const char *Cmd) { for (uint8_t i = 0; i < NUM_CSNS; i++) { uint8_t resp_index = (i + NUM_CSNS) * 16; // Copy CSN - memcpy(dump + i * MAC_ITEM_SIZE, csns + i * 8, 8); + memcpy(dump + (i * MAC_ITEM_SIZE), csns + i * 8, 8); // copy EPURSE - memcpy(dump + i * MAC_ITEM_SIZE + 8, resp.data.asBytes + resp_index, 8); + memcpy(dump + (i * MAC_ITEM_SIZE) + 8, resp.data.asBytes + resp_index, 8); // copy NR_MAC (eight bytes from the response) ( 8b csn + 8 epurse == 16) - memcpy(dump + i * MAC_ITEM_SIZE + 16, resp.data.asBytes + resp_index + 8, 8); + memcpy(dump + (i * MAC_ITEM_SIZE) + 16, resp.data.asBytes + resp_index + 8, 8); resp_index++; } saveFile("iclass_mac_attack_keyroll_B", ".bin", dump, datalen); @@ -2638,7 +2638,7 @@ static void detect_credential(uint8_t *data, bool *legacy, bool *se, bool *sr) { *legacy = true; // SR bit set in legacy config block - if ((data[6 * PICOPASS_BLOCK_SIZE] & 0xA0) == 0xA0) { + if ((data[6 * PICOPASS_BLOCK_SIZE] & ICLASS_CFG_BLK_SR_BIT) == ICLASS_CFG_BLK_SR_BIT) { // If the card is blank (all FF's) then we'll reach here too, so check for an empty block 10 // to avoid false positivies if (memcmp(data + (10 * PICOPASS_BLOCK_SIZE), "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", PICOPASS_BLOCK_SIZE)) { @@ -2898,12 +2898,14 @@ static int CmdHFiClassView(const char *Cmd) { CLIParserInit(&ctx, "hf iclass view", "Print a iCLASS tag dump file (bin/eml/json)", "hf iclass view -f hf-iclass-AA162D30F8FF12F1-dump.bin\n" - "hf iclass view --first 1 -f hf-iclass-AA162D30F8FF12F1-dump.bin\n"); + "hf iclass view --first 1 -f hf-iclass-AA162D30F8FF12F1-dump.bin\n\n" + "If --first is not specified it will default to the first user block\n" + "which is block 6 for secured chips or block 3 for non-secured chips"); void *argtable[] = { arg_param_begin, arg_str1("f", "file", "", "filename of dump (bin/eml/json)"), - arg_int0(NULL, "first", "", "Begin printing from this block (default first user block - 6 or 3 on non secured chips)"), + arg_int0(NULL, "first", "", "Begin printing from this block (default first user block)"), arg_int0(NULL, "last", "", "End printing at this block (default 0, ALL)"), arg_lit0("v", "verbose", "verbose output"), arg_lit0("z", "dense", "dense dump output style"), diff --git a/client/src/util.c b/client/src/util.c index 30a96a3dc..e531b51ea 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -1266,6 +1266,8 @@ inline uint64_t leadingzeros64(uint64_t a) { } +// byte_strstr searches for the first occurrence of pattern in src +// returns the byte offset the pattern is found at, or -1 if not found int byte_strstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_t plen) { size_t max = srclen - plen + 1; @@ -1289,6 +1291,9 @@ int byte_strstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_ return -1; } +// byte_strrstr is like byte_strstr except searches in reverse +// ie it returns the last occurrence of the pattern in src instead of the first +// returns the byte offset the pattern is found at, or -1 if not found int byte_strrstr(const uint8_t *src, size_t srclen, const uint8_t *pattern, size_t plen) { for (int i = srclen - plen; i >= 0; i--) { // compare only first byte From 8dd963d305a31429bba4ae1418b65142fa39cd24 Mon Sep 17 00:00:00 2001 From: nvx Date: Thu, 24 Aug 2023 15:18:39 +1000 Subject: [PATCH 870/924] make style --- armsrc/Standalone/hf_cardhopper.c | 527 ++++++++++++++-------------- armsrc/em4x70.c | 16 +- armsrc/fpgaloader.c | 40 +-- armsrc/hitag2_crypto.c | 6 +- armsrc/spiffs.c | 4 +- client/src/proxguiqt.cpp | 14 +- common/commonutil.c | 308 ++++++++-------- doc/commands.json | 9 +- tools/cryptorf/sma.cpp | 2 +- tools/cryptorf/sma_multi.cpp | 2 +- tools/fpga_compress/fpga_compress.c | 2 +- 11 files changed, 471 insertions(+), 459 deletions(-) diff --git a/armsrc/Standalone/hf_cardhopper.c b/armsrc/Standalone/hf_cardhopper.c index 7101b5ae7..cfad35605 100644 --- a/armsrc/Standalone/hf_cardhopper.c +++ b/armsrc/Standalone/hf_cardhopper.c @@ -30,13 +30,13 @@ void ModInfo(void) { - DbpString(" HF - Long-range relay 14a over serial<->IP - a.k.a. CardHopper (Sam Haskins)"); + DbpString(" HF - Long-range relay 14a over serial<->IP - a.k.a. CardHopper (Sam Haskins)"); } typedef struct PACKED { - uint8_t len; - uint8_t dat[255]; + uint8_t len; + uint8_t dat[255]; } packet_t; // Magic numbers @@ -52,283 +52,292 @@ static void become_reader(void); static void select_card(void); static void become_card(void); -static void prepare_emulation(uint8_t*, uint16_t*, uint8_t*, packet_t*); -static void cook_ats(packet_t*, uint8_t, uint8_t); -static bool try_use_canned_response(uint8_t*, int, tag_response_info_t*); -static void reply_with_packet(packet_t*); +static void prepare_emulation(uint8_t *, uint16_t *, uint8_t *, packet_t *); +static void cook_ats(packet_t *, uint8_t, uint8_t); +static bool try_use_canned_response(uint8_t *, int, tag_response_info_t *); +static void reply_with_packet(packet_t *); -static void read_packet(packet_t*); -static void write_packet(packet_t*); +static void read_packet(packet_t *); +static void write_packet(packet_t *); -static bool GetIso14443aCommandFromReaderInterruptible(uint8_t*, uint8_t*, int*); +static bool GetIso14443aCommandFromReaderInterruptible(uint8_t *, uint8_t *, int *); void RunMod(void) { - StandAloneMode(); - DbpString(_CYAN_("[@]") " CardHopper has started - waiting for mode"); - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + StandAloneMode(); + DbpString(_CYAN_("[@]") " CardHopper has started - waiting for mode"); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - clear_trace(); - set_tracing(true); + clear_trace(); + set_tracing(true); - // Indicate we are alive and in CardHopper - LEDsoff(); - LED_A_ON(); - LED_D_ON(); + // Indicate we are alive and in CardHopper + LEDsoff(); + LED_A_ON(); + LED_D_ON(); - while (1) { - WDT_HIT(); + while (1) { + WDT_HIT(); - packet_t modeRx = { 0 }; - read_packet(&modeRx); + packet_t modeRx = { 0 }; + read_packet(&modeRx); - if (memcmp(magicREAD, modeRx.dat, sizeof(magicREAD)) == 0) { - DbpString(_CYAN_("[@]") " I am a READER. I talk to a CARD."); - become_reader(); - } else if (memcmp(magicCARD, modeRx.dat, sizeof(magicCARD)) == 0) { - DbpString(_CYAN_("[@]") " I am a CARD. I talk to a READER."); - become_card(); - } else if (memcmp(magicEND, modeRx.dat, sizeof(magicEND)) == 0) { - break; - } else { - DbpString(_YELLOW_("[!]") " unknown mode!"); - Dbhexdump(modeRx.len, modeRx.dat, true); + if (memcmp(magicREAD, modeRx.dat, sizeof(magicREAD)) == 0) { + DbpString(_CYAN_("[@]") " I am a READER. I talk to a CARD."); + become_reader(); + } else if (memcmp(magicCARD, modeRx.dat, sizeof(magicCARD)) == 0) { + DbpString(_CYAN_("[@]") " I am a CARD. I talk to a READER."); + become_card(); + } else if (memcmp(magicEND, modeRx.dat, sizeof(magicEND)) == 0) { + break; + } else { + DbpString(_YELLOW_("[!]") " unknown mode!"); + Dbhexdump(modeRx.len, modeRx.dat, true); + } } - } - DbpString(_CYAN_("[@]") " exiting ..."); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); + DbpString(_CYAN_("[@]") " exiting ..."); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); } static void become_reader(void) { - iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD); - select_card(); // also sends UID, ATS + iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD); + select_card(); // also sends UID, ATS - DbpString(_CYAN_("[@]") " entering reader main loop ..."); - packet_t packet = { 0 }; - packet_t *rx = &packet; - packet_t *tx = &packet; - uint8_t toCard[256] = { 0 }; - uint8_t parity[MAX_PARITY_SIZE] = { 0 }; + DbpString(_CYAN_("[@]") " entering reader main loop ..."); + packet_t packet = { 0 }; + packet_t *rx = &packet; + packet_t *tx = &packet; + uint8_t toCard[256] = { 0 }; + uint8_t parity[MAX_PARITY_SIZE] = { 0 }; - while(1) { - WDT_HIT(); + while (1) { + WDT_HIT(); - read_packet(rx); - if (memcmp(magicRSRT, rx->dat, sizeof(magicRSRT)) == 0) break; + read_packet(rx); + if (memcmp(magicRSRT, rx->dat, sizeof(magicRSRT)) == 0) break; - memcpy(toCard, rx->dat, rx->len); - AddCrc14A(toCard, rx->len); - ReaderTransmit(toCard, rx->len + 2, NULL); + memcpy(toCard, rx->dat, rx->len); + AddCrc14A(toCard, rx->len); + ReaderTransmit(toCard, rx->len + 2, NULL); - tx->len = ReaderReceive(tx->dat, parity); - if (tx->len == 0) { - tx->len = sizeof(magicERR); - memcpy(tx->dat, magicERR, sizeof(magicERR)); - } else tx->len -= 2; // cut off the CRC + tx->len = ReaderReceive(tx->dat, parity); + if (tx->len == 0) { + tx->len = sizeof(magicERR); + memcpy(tx->dat, magicERR, sizeof(magicERR)); + } else tx->len -= 2; // cut off the CRC - write_packet(tx); - } + write_packet(tx); + } } static void select_card(void) { - iso14a_card_select_t card = { 0 }; - while(1) { - WDT_HIT(); + iso14a_card_select_t card = { 0 }; + while (1) { + WDT_HIT(); - int ret = iso14443a_select_card(NULL, &card, NULL, true, 0, false); - if (ret && ret != 1) - Dbprintf(_RED_("[!]") " Error selecting card: %d", ret); - if (ret == 1) break; + int ret = iso14443a_select_card(NULL, &card, NULL, true, 0, false); + if (ret && ret != 1) + Dbprintf(_RED_("[!]") " Error selecting card: %d", ret); + if (ret == 1) break; - SpinDelay(20); - } + SpinDelay(20); + } - DbpString(_CYAN_("[@]") " UID:"); - Dbhexdump(card.uidlen, card.uid, false); - DbpString(_CYAN_("[@]") " ATS:"); - Dbhexdump(card.ats_len - 2 /* no CRC */, card.ats, false); + DbpString(_CYAN_("[@]") " UID:"); + Dbhexdump(card.uidlen, card.uid, false); + DbpString(_CYAN_("[@]") " ATS:"); + Dbhexdump(card.ats_len - 2 /* no CRC */, card.ats, false); - packet_t tx = { 0 }; - tx.len = card.uidlen; - memcpy(tx.dat, card.uid, tx.len); - write_packet(&tx); + packet_t tx = { 0 }; + tx.len = card.uidlen; + memcpy(tx.dat, card.uid, tx.len); + write_packet(&tx); - tx.len = card.ats_len - 2; - memcpy(tx.dat, card.ats, tx.len); - write_packet(&tx); + tx.len = card.ats_len - 2; + memcpy(tx.dat, card.ats, tx.len); + write_packet(&tx); } static void become_card(void) { - iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN); + iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN); - uint8_t tagType; - uint16_t flags; - uint8_t data[PM3_CMD_DATA_SIZE] = { 0 }; - packet_t ats = { 0 }; - prepare_emulation(&tagType, &flags, data, &ats); + uint8_t tagType; + uint16_t flags; + uint8_t data[PM3_CMD_DATA_SIZE] = { 0 }; + packet_t ats = { 0 }; + prepare_emulation(&tagType, &flags, data, &ats); - tag_response_info_t *canned; - uint32_t cuid; - uint32_t counters[3] = { 0 }; - uint8_t tearings[3] = { 0xbd, 0xbd, 0xbd }; - uint8_t pages; - SimulateIso14443aInit(tagType, flags, data, &canned, &cuid, counters, tearings, &pages); + tag_response_info_t *canned; + uint32_t cuid; + uint32_t counters[3] = { 0 }; + uint8_t tearings[3] = { 0xbd, 0xbd, 0xbd }; + uint8_t pages; + SimulateIso14443aInit(tagType, flags, data, &canned, &cuid, counters, tearings, &pages); - DbpString(_CYAN_("[@]") " Setup done - entering emulation loop"); - int fromReaderLen; - uint8_t fromReaderDat[256] = { 0 }; - uint8_t parity[MAX_PARITY_SIZE] = { 0 }; - packet_t packet = { 0 }; - packet_t *tx = &packet; - packet_t *rx = &packet; + DbpString(_CYAN_("[@]") " Setup done - entering emulation loop"); + int fromReaderLen; + uint8_t fromReaderDat[256] = { 0 }; + uint8_t parity[MAX_PARITY_SIZE] = { 0 }; + packet_t packet = { 0 }; + packet_t *tx = &packet; + packet_t *rx = &packet; - while (1) { - WDT_HIT(); + while (1) { + WDT_HIT(); - if (!GetIso14443aCommandFromReaderInterruptible(fromReaderDat, parity, &fromReaderLen)) { - if (usart_rxdata_available()) { - read_packet(rx); - if (memcmp(magicRSRT, rx->dat, sizeof(magicRSRT)) == 0) { - DbpString(_CYAN_("[@]") " Breaking from reader loop"); - break; + if (!GetIso14443aCommandFromReaderInterruptible(fromReaderDat, parity, &fromReaderLen)) { + if (usart_rxdata_available()) { + read_packet(rx); + if (memcmp(magicRSRT, rx->dat, sizeof(magicRSRT)) == 0) { + DbpString(_CYAN_("[@]") " Breaking from reader loop"); + break; + } + } + continue; } - } - continue; + + // Option 1: Use a canned response + if (try_use_canned_response(fromReaderDat, fromReaderLen, canned)) continue; + + // Option 2: Reply with our cooked ATS + if (fromReaderDat[0] == ISO14443A_CMD_RATS && fromReaderLen == 4) { + reply_with_packet(&ats); + continue; + } + + // Option 3: Relay the message + tx->len = fromReaderLen - 2; // cut off the crc + memcpy(tx->dat, fromReaderDat, tx->len); + write_packet(tx); + + read_packet(rx); + reply_with_packet(rx); } - - // Option 1: Use a canned response - if (try_use_canned_response(fromReaderDat, fromReaderLen, canned)) continue; - - // Option 2: Reply with our cooked ATS - if (fromReaderDat[0] == ISO14443A_CMD_RATS && fromReaderLen == 4) { - reply_with_packet(&ats); - continue; - } - - // Option 3: Relay the message - tx->len = fromReaderLen - 2; // cut off the crc - memcpy(tx->dat, fromReaderDat, tx->len); - write_packet(tx); - - read_packet(rx); - reply_with_packet(rx); - } } static void prepare_emulation(uint8_t *tagType, uint16_t *flags, uint8_t *data, packet_t *ats) { - packet_t tagTypeRx = { 0 }; read_packet(&tagTypeRx); - packet_t timeModeRx = { 0 }; read_packet(&timeModeRx); - packet_t uidRx = { 0 }; read_packet(&uidRx); - read_packet(ats); + packet_t tagTypeRx = { 0 }; + read_packet(&tagTypeRx); + packet_t timeModeRx = { 0 }; + read_packet(&timeModeRx); + packet_t uidRx = { 0 }; + read_packet(&uidRx); + read_packet(ats); - *tagType = tagTypeRx.dat[0]; - Dbprintf(_CYAN_("[@]") " Using tag type: %hhu", *tagType); + *tagType = tagTypeRx.dat[0]; + Dbprintf(_CYAN_("[@]") " Using tag type: %hhu", *tagType); - DbpString(_CYAN_("[@]") " Time control parameters:"); - Dbhexdump(timeModeRx.len, timeModeRx.dat, false); - uint8_t fwi = timeModeRx.dat[0] & 0x0f; - uint8_t sfgi = timeModeRx.dat[1] & 0x0f; - Dbprintf(_CYAN_("[@]") " Parsed as fwi = %hhu, sfgi = %hhu", fwi, sfgi); + DbpString(_CYAN_("[@]") " Time control parameters:"); + Dbhexdump(timeModeRx.len, timeModeRx.dat, false); + uint8_t fwi = timeModeRx.dat[0] & 0x0f; + uint8_t sfgi = timeModeRx.dat[1] & 0x0f; + Dbprintf(_CYAN_("[@]") " Parsed as fwi = %hhu, sfgi = %hhu", fwi, sfgi); - if (fwi == 0xf) { - DbpString(_YELLOW_("[!]") " Refusing to use 15 as FWI - will use 14"); - fwi = 0xe; - } - if (sfgi == 0xf) { - DbpString(_YELLOW_("[!]") " Refusing to use 15 as SFGI - will use 14"); - sfgi = 0xe; - } + if (fwi == 0xf) { + DbpString(_YELLOW_("[!]") " Refusing to use 15 as FWI - will use 14"); + fwi = 0xe; + } + if (sfgi == 0xf) { + DbpString(_YELLOW_("[!]") " Refusing to use 15 as SFGI - will use 14"); + sfgi = 0xe; + } - memcpy(data, uidRx.dat, uidRx.len); - *flags = (uidRx.len == 10 ? FLAG_10B_UID_IN_DATA : (uidRx.len == 7 ? FLAG_7B_UID_IN_DATA : FLAG_4B_UID_IN_DATA)); - DbpString(_CYAN_("[@]") " UID:"); - Dbhexdump(uidRx.len, data, false); - Dbprintf(_CYAN_("[@]") " Flags: %hu", *flags); + memcpy(data, uidRx.dat, uidRx.len); + *flags = (uidRx.len == 10 ? FLAG_10B_UID_IN_DATA : (uidRx.len == 7 ? FLAG_7B_UID_IN_DATA : FLAG_4B_UID_IN_DATA)); + DbpString(_CYAN_("[@]") " UID:"); + Dbhexdump(uidRx.len, data, false); + Dbprintf(_CYAN_("[@]") " Flags: %hu", *flags); - DbpString(_CYAN_("[@]") " Original ATS:"); - Dbhexdump(ats->len, ats->dat, false); - cook_ats(ats, fwi, sfgi); - DbpString(_CYAN_("[@]") " Cooked ATS:"); - Dbhexdump(ats->len, ats->dat, false); + DbpString(_CYAN_("[@]") " Original ATS:"); + Dbhexdump(ats->len, ats->dat, false); + cook_ats(ats, fwi, sfgi); + DbpString(_CYAN_("[@]") " Cooked ATS:"); + Dbhexdump(ats->len, ats->dat, false); } static void cook_ats(packet_t *ats, uint8_t fwi, uint8_t sfgi) { - if (ats->len != ats->dat[0]) { - DbpString(_RED_("[!]") " Malformed ATS - unable to cook; things may go wrong!"); - return; - } + if (ats->len != ats->dat[0]) { + DbpString(_RED_("[!]") " Malformed ATS - unable to cook; things may go wrong!"); + return; + } - // If the ATS is too short (unusual), pad it to length with hopefully-sensible data - // Might be better for the phone side to do this tbh - if (ats->len == 1) { - ats->len = 4; - ats->dat[0] = 0x04; ats->dat[1] = 0x78; ats->dat[2] = 0x77; ats->dat[3] = 0x80; - } else if (ats->len == 2) { - ats->len = 4; - ats->dat[0] = 0x04; ats->dat[2] = 0x77; ats->dat[3] = 0x80; - } else if (ats->len == 3) { - ats->len = 4; - ats->dat[0] = 0x04; ats->dat[3] = 0x80; - } + // If the ATS is too short (unusual), pad it to length with hopefully-sensible data + // Might be better for the phone side to do this tbh + if (ats->len == 1) { + ats->len = 4; + ats->dat[0] = 0x04; + ats->dat[1] = 0x78; + ats->dat[2] = 0x77; + ats->dat[3] = 0x80; + } else if (ats->len == 2) { + ats->len = 4; + ats->dat[0] = 0x04; + ats->dat[2] = 0x77; + ats->dat[3] = 0x80; + } else if (ats->len == 3) { + ats->len = 4; + ats->dat[0] = 0x04; + ats->dat[3] = 0x80; + } - // Set the SFGI as well as the FWI - needed for some older readers (firmware revs?) - uint8_t cookedTB0 = (fwi << 4) | sfgi; - ats->dat[3] = cookedTB0; + // Set the SFGI as well as the FWI - needed for some older readers (firmware revs?) + uint8_t cookedTB0 = (fwi << 4) | sfgi; + ats->dat[3] = cookedTB0; } static bool try_use_canned_response(uint8_t *dat, int len, tag_response_info_t *canned) { - if ((dat[0] == ISO14443A_CMD_REQA || dat[0] == ISO14443A_CMD_WUPA) && len == 1) { - EmSendPrecompiledCmd(canned + RESP_INDEX_ATQA); - return true; - } - - if (dat[1] == 0x20 && len == 2) { - if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT) { - EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC1); - return true; - } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2) { - EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC2); - return true; - } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_3) { - EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC3); - return true; + if ((dat[0] == ISO14443A_CMD_REQA || dat[0] == ISO14443A_CMD_WUPA) && len == 1) { + EmSendPrecompiledCmd(canned + RESP_INDEX_ATQA); + return true; } - } - if (dat[1] == 0x70 && len == 9) { - if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT) { - EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC1); - return true; - } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2) { - EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC2); - return true; - } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_3) { - EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC3); - return true; + if (dat[1] == 0x20 && len == 2) { + if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT) { + EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC1); + return true; + } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2) { + EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC2); + return true; + } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_3) { + EmSendPrecompiledCmd(canned + RESP_INDEX_UIDC3); + return true; + } } - } - if (dat[0] == ISO14443A_CMD_PPS) { - EmSendPrecompiledCmd(canned + RESP_INDEX_PPS); - return true; - } + if (dat[1] == 0x70 && len == 9) { + if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT) { + EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC1); + return true; + } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2) { + EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC2); + return true; + } else if (dat[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_3) { + EmSendPrecompiledCmd(canned + RESP_INDEX_SAKC3); + return true; + } + } - // No response is expected to these 14a commands - if ((dat[0] == 0xf2 && len == 4) || dat[0] == 0xfa) return true; - if (dat[0] == ISO14443A_CMD_HALT && len == 4) return true; + if (dat[0] == ISO14443A_CMD_PPS) { + EmSendPrecompiledCmd(canned + RESP_INDEX_PPS); + return true; + } - // Ignore Apple ECP2 polling - if (dat[0] == 0x6a) return true; + // No response is expected to these 14a commands + if ((dat[0] == 0xf2 && len == 4) || dat[0] == 0xfa) return true; + if (dat[0] == ISO14443A_CMD_HALT && len == 4) return true; - return false; + // Ignore Apple ECP2 polling + if (dat[0] == 0x6a) return true; + + return false; } @@ -336,73 +345,73 @@ static uint8_t g_responseBuffer [512 ] = { 0 }; static uint8_t g_modulationBuffer[1024] = { 0 }; static void reply_with_packet(packet_t *packet) { - tag_response_info_t response = { 0 }; - response.response = g_responseBuffer; - response.modulation = g_modulationBuffer; + tag_response_info_t response = { 0 }; + response.response = g_responseBuffer; + response.modulation = g_modulationBuffer; - memcpy(response.response, packet->dat, packet->len); - AddCrc14A(response.response, packet->len); - response.response_n = packet->len + 2; + memcpy(response.response, packet->dat, packet->len); + AddCrc14A(response.response, packet->len); + response.response_n = packet->len + 2; - prepare_tag_modulation(&response, sizeof(g_modulationBuffer)); - EmSendPrecompiledCmd(&response); + prepare_tag_modulation(&response, sizeof(g_modulationBuffer)); + EmSendPrecompiledCmd(&response); } static void read_packet(packet_t *packet) { - while(!usart_rxdata_available()) { - WDT_HIT(); - SpinDelayUs(100); - } + while (!usart_rxdata_available()) { + WDT_HIT(); + SpinDelayUs(100); + } - uint32_t dataReceived = usart_read_ng((uint8_t*) packet, sizeof(packet_t)) - 1; - while(dataReceived != packet->len) { - while(!usart_rxdata_available()) WDT_HIT(); + uint32_t dataReceived = usart_read_ng((uint8_t *) packet, sizeof(packet_t)) - 1; + while (dataReceived != packet->len) { + while (!usart_rxdata_available()) WDT_HIT(); - dataReceived += usart_read_ng(packet->dat + dataReceived, 255 - dataReceived); - } - usart_writebuffer_sync(magicACK, sizeof(magicACK)); + dataReceived += usart_read_ng(packet->dat + dataReceived, 255 - dataReceived); + } + usart_writebuffer_sync(magicACK, sizeof(magicACK)); } static void write_packet(packet_t *packet) { - usart_writebuffer_sync((uint8_t*) packet, packet->len + 1); + usart_writebuffer_sync((uint8_t *) packet, packet->len + 1); } static bool GetIso14443aCommandFromReaderInterruptible(uint8_t *received, uint8_t *par, int *len) { - LED_D_OFF(); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_LISTEN); + LED_D_OFF(); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_LISTEN); - Uart14aInit(received, par); + Uart14aInit(received, par); - uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - (void)b; + uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + (void)b; - uint8_t flip = 0; - uint16_t checker = 4000; - for (;;) { - WDT_HIT(); + uint8_t flip = 0; + uint16_t checker = 4000; + for (;;) { + WDT_HIT(); - if (flip == 3) { - if (usart_rxdata_available()) - return false; + if (flip == 3) { + if (usart_rxdata_available()) + return false; - flip = 0; + flip = 0; + } + + if (checker-- == 0) { + flip++; + checker = 4000; + } + + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { + b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + if (MillerDecoding(b, 0)) { + *len = GetUart14a()->len; + return true; + } + } } - - if (checker-- == 0) { - flip++; - checker = 4000; - } - - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - if (MillerDecoding(b, 0)) { - *len = GetUart14a()->len; - return true; - } - } - } - return false; + return false; } diff --git a/armsrc/em4x70.c b/armsrc/em4x70.c index ab73bd153..40eadb890 100644 --- a/armsrc/em4x70.c +++ b/armsrc/em4x70.c @@ -376,27 +376,27 @@ static int bruteforce(const uint8_t address, const uint8_t *rnd, const uint8_t * uint16_t rev_k = reflect16(k); switch (address) { case 9: - c = set_byte(&temp_rnd[0], rev_rnd[0] + ((rev_k ) & 0xFFu)); + c = set_byte(&temp_rnd[0], rev_rnd[0] + ((rev_k) & 0xFFu)); c = set_byte(&temp_rnd[1], rev_rnd[1] + c + ((rev_k >> 8) & 0xFFu)); c = set_byte(&temp_rnd[2], rev_rnd[2] + c); c = set_byte(&temp_rnd[3], rev_rnd[3] + c); c = set_byte(&temp_rnd[4], rev_rnd[4] + c); c = set_byte(&temp_rnd[5], rev_rnd[5] + c); - set_byte( &temp_rnd[6], rev_rnd[6] + c); + set_byte(&temp_rnd[6], rev_rnd[6] + c); break; case 8: - c = set_byte(&temp_rnd[2], rev_rnd[2] + ((rev_k ) & 0xFFu)); + c = set_byte(&temp_rnd[2], rev_rnd[2] + ((rev_k) & 0xFFu)); c = set_byte(&temp_rnd[3], rev_rnd[3] + c + ((rev_k >> 8) & 0xFFu)); c = set_byte(&temp_rnd[4], rev_rnd[4] + c); c = set_byte(&temp_rnd[5], rev_rnd[5] + c); - set_byte( &temp_rnd[6], rev_rnd[6] + c); + set_byte(&temp_rnd[6], rev_rnd[6] + c); break; case 7: - c = set_byte(&temp_rnd[4], rev_rnd[4] + ((rev_k ) & 0xFFu)); + c = set_byte(&temp_rnd[4], rev_rnd[4] + ((rev_k) & 0xFFu)); c = set_byte(&temp_rnd[5], rev_rnd[5] + c + ((rev_k >> 8) & 0xFFu)); - set_byte( &temp_rnd[6], rev_rnd[6] + c); + set_byte(&temp_rnd[6], rev_rnd[6] + c); break; default: @@ -853,8 +853,8 @@ void em4x70_write_pin(const em4x70_data_t *etd, bool ledcontrol) { if (em4x70_read_id()) { // Write new PIN - if ((write((etd->pin ) & 0xFFFF, EM4X70_PIN_WORD_UPPER) == PM3_SUCCESS) && - (write((etd->pin >> 16) & 0xFFFF, EM4X70_PIN_WORD_LOWER) == PM3_SUCCESS)) { + if ((write((etd->pin) & 0xFFFF, EM4X70_PIN_WORD_UPPER) == PM3_SUCCESS) && + (write((etd->pin >> 16) & 0xFFFF, EM4X70_PIN_WORD_LOWER) == PM3_SUCCESS)) { // Now Try to authenticate using the new PIN diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 2d3f8caab..4d687f338 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -111,27 +111,27 @@ void SetupSpi(int mode) { AT91C_SPI_NCPHA | // Clock Phase data captured on leading edge, changes on following edge (0 << 0); // Clock Polarity inactive state is logic 0 break; -/* - case SPI_LCD_MODE: - AT91C_BASE_SPI->SPI_MR = - ( 0 << 24) | // Delay between chip selects (take default: 6 MCK periods) - (0xB << 16) | // Peripheral Chip Select (selects LCD SPI_NCS2 or PA10) - ( 0 << 7) | // Local Loopback Disabled - ( 1 << 4) | // Mode Fault Detection disabled - ( 0 << 2) | // Chip selects connected directly to peripheral - ( 0 << 1) | // Fixed Peripheral Select - ( 1 << 0); // Master Mode + /* + case SPI_LCD_MODE: + AT91C_BASE_SPI->SPI_MR = + ( 0 << 24) | // Delay between chip selects (take default: 6 MCK periods) + (0xB << 16) | // Peripheral Chip Select (selects LCD SPI_NCS2 or PA10) + ( 0 << 7) | // Local Loopback Disabled + ( 1 << 4) | // Mode Fault Detection disabled + ( 0 << 2) | // Chip selects connected directly to peripheral + ( 0 << 1) | // Fixed Peripheral Select + ( 1 << 0); // Master Mode - AT91C_BASE_SPI->SPI_CSR[2] = - ( 1 << 24) | // Delay between Consecutive Transfers (32 MCK periods) - ( 1 << 16) | // Delay Before SPCK (1 MCK period) - ( 6 << 8) | // Serial Clock Baud Rate (baudrate = MCK/6 = 24MHz/6 = 4M baud - AT91C_SPI_BITS_9 | // Bits per Transfer (9 bits) - ( 0 << 3) | // Chip Select inactive after transfer - ( 1 << 1) | // Clock Phase data captured on leading edge, changes on following edge - ( 0 << 0); // Clock Polarity inactive state is logic 0 - break; -*/ + AT91C_BASE_SPI->SPI_CSR[2] = + ( 1 << 24) | // Delay between Consecutive Transfers (32 MCK periods) + ( 1 << 16) | // Delay Before SPCK (1 MCK period) + ( 6 << 8) | // Serial Clock Baud Rate (baudrate = MCK/6 = 24MHz/6 = 4M baud + AT91C_SPI_BITS_9 | // Bits per Transfer (9 bits) + ( 0 << 3) | // Chip Select inactive after transfer + ( 1 << 1) | // Clock Phase data captured on leading edge, changes on following edge + ( 0 << 0); // Clock Polarity inactive state is logic 0 + break; + */ default: DisableSpi(); break; diff --git a/armsrc/hitag2_crypto.c b/armsrc/hitag2_crypto.c index 9b59b5521..931c17fa8 100644 --- a/armsrc/hitag2_crypto.c +++ b/armsrc/hitag2_crypto.c @@ -90,17 +90,17 @@ uint32_t _hitag2_byte(uint64_t *x) { } void hitag2_cipher_reset(struct hitag2_tag *tag, const uint8_t *iv) { - uint64_t key = ((uint64_t)tag->sectors[2][2] ) | + uint64_t key = ((uint64_t)tag->sectors[2][2]) | ((uint64_t)tag->sectors[2][3] << 8) | ((uint64_t)tag->sectors[1][0] << 16) | ((uint64_t)tag->sectors[1][1] << 24) | ((uint64_t)tag->sectors[1][2] << 32) | ((uint64_t)tag->sectors[1][3] << 40); - uint32_t uid = ((uint32_t)tag->sectors[0][0] ) | + uint32_t uid = ((uint32_t)tag->sectors[0][0]) | ((uint32_t)tag->sectors[0][1] << 8) | ((uint32_t)tag->sectors[0][2] << 16) | ((uint32_t)tag->sectors[0][3] << 24); - uint32_t iv_ = (((uint32_t)(iv[0])) ) | + uint32_t iv_ = (((uint32_t)(iv[0]))) | (((uint32_t)(iv[1])) << 8) | (((uint32_t)(iv[2])) << 16) | (((uint32_t)(iv[3])) << 24); diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c index 359f2f07c..3154bfc0f 100644 --- a/armsrc/spiffs.c +++ b/armsrc/spiffs.c @@ -199,7 +199,7 @@ int rdv40_spiffs_check(void) { void write_to_spiffs(const char *filename, const uint8_t *src, uint32_t size) { spiffs_file fd = SPIFFS_open(&fs, filename, SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0); // Note: SPIFFS_write() doesn't declare third parameter as const (but should) - if (SPIFFS_write(&fs, fd, (void*)src, size) < 0) { + if (SPIFFS_write(&fs, fd, (void *)src, size) < 0) { Dbprintf("wr errno %i\n", SPIFFS_errno(&fs)); } SPIFFS_close(&fs, fd); @@ -208,7 +208,7 @@ void write_to_spiffs(const char *filename, const uint8_t *src, uint32_t size) { void append_to_spiffs(const char *filename, const uint8_t *src, uint32_t size) { spiffs_file fd = SPIFFS_open(&fs, filename, SPIFFS_APPEND | SPIFFS_RDWR, 0); // Note: SPIFFS_write() doesn't declare third parameter as const (but should) - if (SPIFFS_write(&fs, fd, (void*)src, size) < 0) { + if (SPIFFS_write(&fs, fd, (void *)src, size) < 0) { Dbprintf("errno %i\n", SPIFFS_errno(&fs)); } SPIFFS_close(&fs, fd); diff --git a/client/src/proxguiqt.cpp b/client/src/proxguiqt.cpp index e7dfe1018..1c9a05d11 100644 --- a/client/src/proxguiqt.cpp +++ b/client/src/proxguiqt.cpp @@ -854,7 +854,7 @@ void Plot::Zoom(double factor, uint32_t refX) { } } } else { // Zoom out - if (g_GraphPixelsPerPointNew >= (1.0 / ZOOM_LIMIT) ) { + if (g_GraphPixelsPerPointNew >= (1.0 / ZOOM_LIMIT)) { g_GraphPixelsPerPoint = g_GraphPixelsPerPointNew; // shift graph towards refX when zooming out if (refX > g_GraphStart) { @@ -951,7 +951,7 @@ void Plot::wheelEvent(QWheelEvent *event) { Zoom(1.0 / ZOOM_STEP, x); } } else { - Move(PageWidth * delta * move_offset / 120 ); + Move(PageWidth * delta * move_offset / 120); } this->update(); } @@ -981,7 +981,7 @@ void Plot::keyPressEvent(QKeyEvent *event) { if (event->modifiers() & Qt::ControlModifier) offset = 1; else - offset = int(ZOOM_LIMIT/g_GraphPixelsPerPoint); + offset = int(ZOOM_LIMIT / g_GraphPixelsPerPoint); } switch (event->key()) { @@ -990,13 +990,13 @@ void Plot::keyPressEvent(QKeyEvent *event) { if (event->modifiers() & Qt::ControlModifier) { Zoom(ZOOM_STEP, CursorBPos); } else { - Zoom(ZOOM_STEP*2, CursorBPos); + Zoom(ZOOM_STEP * 2, CursorBPos); } } else { if (event->modifiers() & Qt::ControlModifier) { Zoom(ZOOM_STEP, CursorAPos); } else { - Zoom(ZOOM_STEP*2, CursorAPos); + Zoom(ZOOM_STEP * 2, CursorAPos); } } break; @@ -1006,13 +1006,13 @@ void Plot::keyPressEvent(QKeyEvent *event) { if (event->modifiers() & Qt::ControlModifier) { Zoom(1.0 / ZOOM_STEP, CursorBPos); } else { - Zoom(1.0 / (ZOOM_STEP*2), CursorBPos); + Zoom(1.0 / (ZOOM_STEP * 2), CursorBPos); } } else { if (event->modifiers() & Qt::ControlModifier) { Zoom(1.0 / ZOOM_STEP, CursorAPos); } else { - Zoom(1.0 / (ZOOM_STEP*2), CursorAPos); + Zoom(1.0 / (ZOOM_STEP * 2), CursorAPos); } } break; diff --git a/common/commonutil.c b/common/commonutil.c index 11037c2f7..58e694d76 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -162,254 +162,254 @@ uint64_t bytes_to_num(const uint8_t *src, size_t len) { uint16_t MemLeToUint2byte(const uint8_t *data) { return (uint16_t)( - (((uint16_t)(data[1])) << (8*1)) + - (((uint16_t)(data[0])) << (8*0)) - ); + (((uint16_t)(data[1])) << (8 * 1)) + + (((uint16_t)(data[0])) << (8 * 0)) + ); } uint32_t MemLeToUint3byte(const uint8_t *data) { return (uint32_t)( - (((uint32_t)(data[2])) << (8*2)) + - (((uint32_t)(data[1])) << (8*1)) + - (((uint32_t)(data[0])) << (8*0)) - ); + (((uint32_t)(data[2])) << (8 * 2)) + + (((uint32_t)(data[1])) << (8 * 1)) + + (((uint32_t)(data[0])) << (8 * 0)) + ); } uint32_t MemLeToUint4byte(const uint8_t *data) { return (uint32_t)( - (((uint32_t)(data[3])) << (8*3)) + - (((uint32_t)(data[2])) << (8*2)) + - (((uint32_t)(data[1])) << (8*1)) + - (((uint32_t)(data[0])) << (8*0)) - ); + (((uint32_t)(data[3])) << (8 * 3)) + + (((uint32_t)(data[2])) << (8 * 2)) + + (((uint32_t)(data[1])) << (8 * 1)) + + (((uint32_t)(data[0])) << (8 * 0)) + ); } uint64_t MemLeToUint5byte(const uint8_t *data) { return (uint64_t)( - (((uint64_t)(data[4])) << (8*4)) + - (((uint64_t)(data[3])) << (8*3)) + - (((uint64_t)(data[2])) << (8*2)) + - (((uint64_t)(data[1])) << (8*1)) + - (((uint64_t)(data[0])) << (8*0)) - ); + (((uint64_t)(data[4])) << (8 * 4)) + + (((uint64_t)(data[3])) << (8 * 3)) + + (((uint64_t)(data[2])) << (8 * 2)) + + (((uint64_t)(data[1])) << (8 * 1)) + + (((uint64_t)(data[0])) << (8 * 0)) + ); } uint64_t MemLeToUint6byte(const uint8_t *data) { return (uint64_t)( - (((uint64_t)(data[5])) << (8*5)) + - (((uint64_t)(data[4])) << (8*4)) + - (((uint64_t)(data[3])) << (8*3)) + - (((uint64_t)(data[2])) << (8*2)) + - (((uint64_t)(data[1])) << (8*1)) + - (((uint64_t)(data[0])) << (8*0)) - ); + (((uint64_t)(data[5])) << (8 * 5)) + + (((uint64_t)(data[4])) << (8 * 4)) + + (((uint64_t)(data[3])) << (8 * 3)) + + (((uint64_t)(data[2])) << (8 * 2)) + + (((uint64_t)(data[1])) << (8 * 1)) + + (((uint64_t)(data[0])) << (8 * 0)) + ); } uint64_t MemLeToUint7byte(const uint8_t *data) { return (uint64_t)( - (((uint64_t)(data[6])) << (8*6)) + - (((uint64_t)(data[5])) << (8*5)) + - (((uint64_t)(data[4])) << (8*4)) + - (((uint64_t)(data[3])) << (8*3)) + - (((uint64_t)(data[2])) << (8*2)) + - (((uint64_t)(data[1])) << (8*1)) + - (((uint64_t)(data[0])) << (8*0)) - ); + (((uint64_t)(data[6])) << (8 * 6)) + + (((uint64_t)(data[5])) << (8 * 5)) + + (((uint64_t)(data[4])) << (8 * 4)) + + (((uint64_t)(data[3])) << (8 * 3)) + + (((uint64_t)(data[2])) << (8 * 2)) + + (((uint64_t)(data[1])) << (8 * 1)) + + (((uint64_t)(data[0])) << (8 * 0)) + ); } uint64_t MemLeToUint8byte(const uint8_t *data) { return (uint64_t)( - (((uint64_t)(data[7])) << (8*7)) + - (((uint64_t)(data[6])) << (8*6)) + - (((uint64_t)(data[5])) << (8*5)) + - (((uint64_t)(data[4])) << (8*4)) + - (((uint64_t)(data[3])) << (8*3)) + - (((uint64_t)(data[2])) << (8*2)) + - (((uint64_t)(data[1])) << (8*1)) + - (((uint64_t)(data[0])) << (8*0)) - ); + (((uint64_t)(data[7])) << (8 * 7)) + + (((uint64_t)(data[6])) << (8 * 6)) + + (((uint64_t)(data[5])) << (8 * 5)) + + (((uint64_t)(data[4])) << (8 * 4)) + + (((uint64_t)(data[3])) << (8 * 3)) + + (((uint64_t)(data[2])) << (8 * 2)) + + (((uint64_t)(data[1])) << (8 * 1)) + + (((uint64_t)(data[0])) << (8 * 0)) + ); } uint16_t MemBeToUint2byte(const uint8_t *data) { return (uint16_t)( - (((uint16_t)(data[0])) << (8*1)) + - (((uint16_t)(data[1])) << (8*0)) - ); + (((uint16_t)(data[0])) << (8 * 1)) + + (((uint16_t)(data[1])) << (8 * 0)) + ); } uint32_t MemBeToUint3byte(const uint8_t *data) { return (uint32_t)( - (((uint32_t)(data[0])) << (8*2)) + - (((uint32_t)(data[1])) << (8*1)) + - (((uint32_t)(data[2])) << (8*0)) - ); + (((uint32_t)(data[0])) << (8 * 2)) + + (((uint32_t)(data[1])) << (8 * 1)) + + (((uint32_t)(data[2])) << (8 * 0)) + ); } uint32_t MemBeToUint4byte(const uint8_t *data) { return (uint32_t)( - (((uint32_t)(data[0])) << (8*3)) + - (((uint32_t)(data[1])) << (8*2)) + - (((uint32_t)(data[2])) << (8*1)) + - (((uint32_t)(data[3])) << (8*0)) - ); + (((uint32_t)(data[0])) << (8 * 3)) + + (((uint32_t)(data[1])) << (8 * 2)) + + (((uint32_t)(data[2])) << (8 * 1)) + + (((uint32_t)(data[3])) << (8 * 0)) + ); } uint64_t MemBeToUint5byte(const uint8_t *data) { return (uint64_t)( - (((uint64_t)(data[0])) << (8*4)) + - (((uint64_t)(data[1])) << (8*3)) + - (((uint64_t)(data[2])) << (8*2)) + - (((uint64_t)(data[3])) << (8*1)) + - (((uint64_t)(data[4])) << (8*0)) - ); + (((uint64_t)(data[0])) << (8 * 4)) + + (((uint64_t)(data[1])) << (8 * 3)) + + (((uint64_t)(data[2])) << (8 * 2)) + + (((uint64_t)(data[3])) << (8 * 1)) + + (((uint64_t)(data[4])) << (8 * 0)) + ); } uint64_t MemBeToUint6byte(const uint8_t *data) { return (uint64_t)( - (((uint64_t)(data[0])) << (8*5)) + - (((uint64_t)(data[1])) << (8*4)) + - (((uint64_t)(data[2])) << (8*3)) + - (((uint64_t)(data[3])) << (8*2)) + - (((uint64_t)(data[4])) << (8*1)) + - (((uint64_t)(data[5])) << (8*0)) - ); + (((uint64_t)(data[0])) << (8 * 5)) + + (((uint64_t)(data[1])) << (8 * 4)) + + (((uint64_t)(data[2])) << (8 * 3)) + + (((uint64_t)(data[3])) << (8 * 2)) + + (((uint64_t)(data[4])) << (8 * 1)) + + (((uint64_t)(data[5])) << (8 * 0)) + ); } uint64_t MemBeToUint7byte(const uint8_t *data) { return (uint64_t)( - (((uint64_t)(data[0])) << (8*6)) + - (((uint64_t)(data[1])) << (8*5)) + - (((uint64_t)(data[2])) << (8*4)) + - (((uint64_t)(data[3])) << (8*3)) + - (((uint64_t)(data[4])) << (8*2)) + - (((uint64_t)(data[5])) << (8*1)) + - (((uint64_t)(data[6])) << (8*0)) - ); + (((uint64_t)(data[0])) << (8 * 6)) + + (((uint64_t)(data[1])) << (8 * 5)) + + (((uint64_t)(data[2])) << (8 * 4)) + + (((uint64_t)(data[3])) << (8 * 3)) + + (((uint64_t)(data[4])) << (8 * 2)) + + (((uint64_t)(data[5])) << (8 * 1)) + + (((uint64_t)(data[6])) << (8 * 0)) + ); } uint64_t MemBeToUint8byte(const uint8_t *data) { return (uint64_t)( - (((uint64_t)(data[0])) << (8*7)) + - (((uint64_t)(data[1])) << (8*6)) + - (((uint64_t)(data[2])) << (8*5)) + - (((uint64_t)(data[3])) << (8*4)) + - (((uint64_t)(data[4])) << (8*3)) + - (((uint64_t)(data[5])) << (8*2)) + - (((uint64_t)(data[6])) << (8*1)) + - (((uint64_t)(data[7])) << (8*0)) - ); + (((uint64_t)(data[0])) << (8 * 7)) + + (((uint64_t)(data[1])) << (8 * 6)) + + (((uint64_t)(data[2])) << (8 * 5)) + + (((uint64_t)(data[3])) << (8 * 4)) + + (((uint64_t)(data[4])) << (8 * 3)) + + (((uint64_t)(data[5])) << (8 * 2)) + + (((uint64_t)(data[6])) << (8 * 1)) + + (((uint64_t)(data[7])) << (8 * 0)) + ); } void Uint2byteToMemLe(uint8_t *data, uint16_t value) { - data[0] = (uint8_t)((value >> (8*0)) & 0xffu); - data[1] = (uint8_t)((value >> (8*1)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 0)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 1)) & 0xffu); } void Uint3byteToMemLe(uint8_t *data, uint32_t value) { - data[0] = (uint8_t)((value >> (8*0)) & 0xffu); - data[1] = (uint8_t)((value >> (8*1)) & 0xffu); - data[2] = (uint8_t)((value >> (8*2)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 0)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 2)) & 0xffu); } void Uint4byteToMemLe(uint8_t *data, uint32_t value) { - data[0] = (uint8_t)((value >> (8*0)) & 0xffu); - data[1] = (uint8_t)((value >> (8*1)) & 0xffu); - data[2] = (uint8_t)((value >> (8*2)) & 0xffu); - data[3] = (uint8_t)((value >> (8*3)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 0)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 3)) & 0xffu); } void Uint5byteToMemLe(uint8_t *data, uint64_t value) { - data[0] = (uint8_t)((value >> (8*0)) & 0xffu); - data[1] = (uint8_t)((value >> (8*1)) & 0xffu); - data[2] = (uint8_t)((value >> (8*2)) & 0xffu); - data[3] = (uint8_t)((value >> (8*3)) & 0xffu); - data[4] = (uint8_t)((value >> (8*4)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 0)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[4] = (uint8_t)((value >> (8 * 4)) & 0xffu); } void Uint6byteToMemLe(uint8_t *data, uint64_t value) { - data[0] = (uint8_t)((value >> (8*0)) & 0xffu); - data[1] = (uint8_t)((value >> (8*1)) & 0xffu); - data[2] = (uint8_t)((value >> (8*2)) & 0xffu); - data[3] = (uint8_t)((value >> (8*3)) & 0xffu); - data[4] = (uint8_t)((value >> (8*4)) & 0xffu); - data[5] = (uint8_t)((value >> (8*5)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 0)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[4] = (uint8_t)((value >> (8 * 4)) & 0xffu); + data[5] = (uint8_t)((value >> (8 * 5)) & 0xffu); } void Uint7byteToMemLe(uint8_t *data, uint64_t value) { - data[0] = (uint8_t)((value >> (8*0)) & 0xffu); - data[1] = (uint8_t)((value >> (8*1)) & 0xffu); - data[2] = (uint8_t)((value >> (8*2)) & 0xffu); - data[3] = (uint8_t)((value >> (8*3)) & 0xffu); - data[4] = (uint8_t)((value >> (8*4)) & 0xffu); - data[5] = (uint8_t)((value >> (8*5)) & 0xffu); - data[6] = (uint8_t)((value >> (8*6)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 0)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[4] = (uint8_t)((value >> (8 * 4)) & 0xffu); + data[5] = (uint8_t)((value >> (8 * 5)) & 0xffu); + data[6] = (uint8_t)((value >> (8 * 6)) & 0xffu); } void Uint8byteToMemLe(uint8_t *data, uint64_t value) { - data[0] = (uint8_t)((value >> (8*0)) & 0xffu); - data[1] = (uint8_t)((value >> (8*1)) & 0xffu); - data[2] = (uint8_t)((value >> (8*2)) & 0xffu); - data[3] = (uint8_t)((value >> (8*3)) & 0xffu); - data[4] = (uint8_t)((value >> (8*4)) & 0xffu); - data[5] = (uint8_t)((value >> (8*5)) & 0xffu); - data[6] = (uint8_t)((value >> (8*6)) & 0xffu); - data[7] = (uint8_t)((value >> (8*7)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 0)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[4] = (uint8_t)((value >> (8 * 4)) & 0xffu); + data[5] = (uint8_t)((value >> (8 * 5)) & 0xffu); + data[6] = (uint8_t)((value >> (8 * 6)) & 0xffu); + data[7] = (uint8_t)((value >> (8 * 7)) & 0xffu); } void Uint2byteToMemBe(uint8_t *data, uint16_t value) { - data[0] = (uint8_t)((value >> (8*1)) & 0xffu); - data[1] = (uint8_t)((value >> (8*0)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 0)) & 0xffu); } void Uint3byteToMemBe(uint8_t *data, uint32_t value) { - data[0] = (uint8_t)((value >> (8*2)) & 0xffu); - data[1] = (uint8_t)((value >> (8*1)) & 0xffu); - data[2] = (uint8_t)((value >> (8*0)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 0)) & 0xffu); } void Uint4byteToMemBe(uint8_t *data, uint32_t value) { - data[0] = (uint8_t)((value >> (8*3)) & 0xffu); - data[1] = (uint8_t)((value >> (8*2)) & 0xffu); - data[2] = (uint8_t)((value >> (8*1)) & 0xffu); - data[3] = (uint8_t)((value >> (8*0)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 0)) & 0xffu); } void Uint5byteToMemBe(uint8_t *data, uint64_t value) { - data[0] = (uint8_t)((value >> (8*4)) & 0xffu); - data[1] = (uint8_t)((value >> (8*3)) & 0xffu); - data[2] = (uint8_t)((value >> (8*2)) & 0xffu); - data[3] = (uint8_t)((value >> (8*1)) & 0xffu); - data[4] = (uint8_t)((value >> (8*0)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 4)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[4] = (uint8_t)((value >> (8 * 0)) & 0xffu); } void Uint6byteToMemBe(uint8_t *data, uint64_t value) { - data[0] = (uint8_t)((value >> (8*5)) & 0xffu); - data[1] = (uint8_t)((value >> (8*4)) & 0xffu); - data[2] = (uint8_t)((value >> (8*3)) & 0xffu); - data[3] = (uint8_t)((value >> (8*2)) & 0xffu); - data[4] = (uint8_t)((value >> (8*1)) & 0xffu); - data[5] = (uint8_t)((value >> (8*0)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 5)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 4)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[4] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[5] = (uint8_t)((value >> (8 * 0)) & 0xffu); } void Uint7byteToMemBe(uint8_t *data, uint64_t value) { - data[0] = (uint8_t)((value >> (8*6)) & 0xffu); - data[1] = (uint8_t)((value >> (8*5)) & 0xffu); - data[2] = (uint8_t)((value >> (8*4)) & 0xffu); - data[3] = (uint8_t)((value >> (8*3)) & 0xffu); - data[4] = (uint8_t)((value >> (8*2)) & 0xffu); - data[5] = (uint8_t)((value >> (8*1)) & 0xffu); - data[6] = (uint8_t)((value >> (8*0)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 6)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 5)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 4)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[4] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[5] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[6] = (uint8_t)((value >> (8 * 0)) & 0xffu); } void Uint8byteToMemBe(uint8_t *data, uint64_t value) { - data[0] = (uint8_t)((value >> (8*7)) & 0xffu); - data[1] = (uint8_t)((value >> (8*6)) & 0xffu); - data[2] = (uint8_t)((value >> (8*5)) & 0xffu); - data[3] = (uint8_t)((value >> (8*4)) & 0xffu); - data[4] = (uint8_t)((value >> (8*3)) & 0xffu); - data[5] = (uint8_t)((value >> (8*2)) & 0xffu); - data[6] = (uint8_t)((value >> (8*1)) & 0xffu); - data[7] = (uint8_t)((value >> (8*0)) & 0xffu); + data[0] = (uint8_t)((value >> (8 * 7)) & 0xffu); + data[1] = (uint8_t)((value >> (8 * 6)) & 0xffu); + data[2] = (uint8_t)((value >> (8 * 5)) & 0xffu); + data[3] = (uint8_t)((value >> (8 * 4)) & 0xffu); + data[4] = (uint8_t)((value >> (8 * 3)) & 0xffu); + data[5] = (uint8_t)((value >> (8 * 2)) & 0xffu); + data[6] = (uint8_t)((value >> (8 * 1)) & 0xffu); + data[7] = (uint8_t)((value >> (8 * 0)) & 0xffu); } // RotateLeft - Ultralight, Desfire diff --git a/doc/commands.json b/doc/commands.json index cf96b6895..895998486 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3397,13 +3397,16 @@ "description": "Print a iCLASS tag dump file (bin/eml/json)", "notes": [ "hf iclass view -f hf-iclass-AA162D30F8FF12F1-dump.bin", - "hf iclass view --first 1 -f hf-iclass-AA162D30F8FF12F1-dump.bin" + "hf iclass view --first 1 -f hf-iclass-AA162D30F8FF12F1-dump.bin", + "", + "If --first is not specified it will default to the first user block", + "which is block 6 for secured chips or block 3 for non-secured chips" ], "offline": true, "options": [ "-h, --help This help", "-f, --file filename of dump (bin/eml/json)", - "--first Begin printing from this block (default first user block - 6 or 3 on non secured chips)", + "--first Begin printing from this block (default first user block)", "--last End printing at this block (default 0, ALL)", "-v, --verbose verbose output", "-z, --dense dense dump output style" @@ -11834,6 +11837,6 @@ "metadata": { "commands_extracted": 686, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-08-22T23:15:58" + "extracted_on": "2023-08-24T05:14:06" } } \ No newline at end of file diff --git a/tools/cryptorf/sma.cpp b/tools/cryptorf/sma.cpp index 3fb1da343..06f1729f3 100644 --- a/tools/cryptorf/sma.cpp +++ b/tools/cryptorf/sma.cpp @@ -859,4 +859,4 @@ int main(int argc, const char *argv[]) { #if defined(__cplusplus) } -#endif \ No newline at end of file +#endif diff --git a/tools/cryptorf/sma_multi.cpp b/tools/cryptorf/sma_multi.cpp index 91cf97d7c..c8f6ec0ec 100644 --- a/tools/cryptorf/sma_multi.cpp +++ b/tools/cryptorf/sma_multi.cpp @@ -1143,4 +1143,4 @@ int main(int argc, const char *argv[]) { #if defined(__cplusplus) } -#endif \ No newline at end of file +#endif diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 152c8627e..ab1d93243 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -262,7 +262,7 @@ static int zlib_decompress(FILE *infile, FILE *outfiles[], uint8_t num_outfiles, for (uint16_t j = 0; j < num_outfiles; j++) { if (k * FPGA_INTERLEAVE_SIZE < outfilesizes[j]) { uint16_t chunk = (outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) < FPGA_INTERLEAVE_SIZE) ? - outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) : FPGA_INTERLEAVE_SIZE; + outfilesizes[j] - (k * FPGA_INTERLEAVE_SIZE) : FPGA_INTERLEAVE_SIZE; fwrite(outbufall + offset, chunk, sizeof(char), outfiles[j]); } From 424e68dff65946bee3d15a041caaea614534a553 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 24 Aug 2023 10:20:01 +0200 Subject: [PATCH 871/924] fixing the wrong calculations --- armsrc/iso14443b.c | 53 +++++++++++++++++++++++++---------------- client/src/cmdanalyse.c | 46 +++++++++++++++++------------------ include/iso14b.h | 15 ++++++------ 3 files changed, 63 insertions(+), 51 deletions(-) diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 8fe502833..7d28255e1 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -39,9 +39,14 @@ * Current timing issues with ISO14443-b implementation * Proxmark3 * Carrier Frequency 13.56MHz +* 1 / 13 560 000 = 73.74 nano seconds ( 0.07374 µs ) + * SSP_CLK runs at 13.56MHz / 4 = 3,39MHz +* 1 / 3 390 000 = 294.98 nano seconds ( 0.2949 µs ) * -* +* 1 ETU = 9.4395 µs = 32 SSP_CLK = 128 FC +* 1 SSP_CLK = 4 FC +* 1 µs 3 SSP_CLK about 14 FC * PROBLEM 1. * ---------- * one way of calculating time, that relates both to PM3 ssp_clk 3.39MHz, ISO freq of 13.56Mhz and ETUs @@ -106,6 +111,9 @@ * */ + + + #ifndef MAX_14B_TIMEOUT // FWT(max) = 4949 ms or 4.95 seconds. // SSP_CLK = 4949000 * 3.39 = 16777120 @@ -122,8 +130,8 @@ // ETU 14 * 9.4395 µS = 132 µS == 0.132ms // TR2, counting from start of PICC EOF 14 ETU. -#define DELAY_ISO14443B_PICC_TO_PCD_READER ETU_TO_SSP(14) -#define DELAY_ISO14443B_PCD_TO_PICC_READER ETU_TO_SSP(15) +#define DELAY_ISO14443B_PICC_TO_PCD_READER HF14_ETU_TO_SSP(14) +#define DELAY_ISO14443B_PCD_TO_PICC_READER HF14_ETU_TO_SSP(15) /* Guard Time (per 14443-2) in ETU * @@ -138,41 +146,41 @@ * TR0 */ #ifndef ISO14B_TR0 -# define ISO14B_TR0 ETU_TO_SSP(32) +# define ISO14B_TR0 HF14_ETU_TO_SSP(16) #endif #ifndef ISO14B_TR0_MAX -# define ISO14B_TR0_MAX ETU_TO_SSP(32) +# define ISO14B_TR0_MAX HF14_ETU_TO_SSP(32) // * TR0 - 32 ETU's maximum for ATQB only // * TR0 - FWT for all other commands -// TR0 max is 151/fsc = 151/848kHz = 302us or 64 samples from FPGA -// 32 ETU * 9.4395 µS == 302 µS -// 32 * 8 = 256 sub carrier cycles, -// 256 / 4 = 64 I/Q pairs. +// TR0 max is 159 µS or 32 samples from FPGA +// 16 ETU * 9.4395 µS == 151 µS +// 16 * 8 = 128 sub carrier cycles, +// 128 / 4 = 32 I/Q pairs. // since 1 I/Q pair after 4 subcarrier cycles at 848kHz subcarrier #endif // 8 ETU = 75 µS == 256 SSP_CLK #ifndef ISO14B_TR0_MIN -# define ISO14B_TR0_MIN ETU_TO_SSP(8) +# define ISO14B_TR0_MIN HF14_ETU_TO_SSP(8) #endif // Synchronization time (per 14443-2) in ETU -// 10 ETU = 94,39 µS == 320 SSP_CLK +// 16 ETU = 151 µS == 512 SSP_CLK #ifndef ISO14B_TR1_MIN -# define ISO14B_TR1_MIN ETU_TO_SSP(10) +# define ISO14B_TR1_MIN HF14_ETU_TO_SSP(16) #endif // Synchronization time (per 14443-2) in ETU // 25 ETU == 236 µS == 800 SSP_CLK #ifndef ISO14B_TR1_MAX -# define ISO14B_TR1 ETU_TO_SSP(25) +# define ISO14B_TR1 HF14_ETU_TO_SSP(25) #endif // Frame Delay Time PICC to PCD (per 14443-3 Amendment 1) in ETU // 14 ETU == 132 µS == 448 SSP_CLK #ifndef ISO14B_TR2 -# define ISO14B_TR2 ETU_TO_SSP(14) +# define ISO14B_TR2 HF14_ETU_TO_SSP(14) #endif // 4sample @@ -440,7 +448,7 @@ static void Uart14bInit(uint8_t *data) { // param timeout accepts ETU static void iso14b_set_timeout(uint32_t timeout_etu) { - uint32_t ssp = ETU_TO_SSP(timeout_etu); + uint32_t ssp = HF14_ETU_TO_SSP(timeout_etu); if (ssp > MAX_14B_TIMEOUT) ssp = MAX_14B_TIMEOUT; @@ -1381,7 +1389,7 @@ static int Get14443bAnswerFromTag(uint8_t *response, uint16_t max_len, uint32_t } if (Demod.len > 0) { - uint32_t sof_time = *eof_time - ETU_TO_SSP( + uint32_t sof_time = *eof_time - HF14_ETU_TO_SSP( (Demod.len * (8 + 2)) // time for byte transfers // + (10) // time for TR1 + (10 + 2) // time for SOF transfer @@ -1401,7 +1409,6 @@ static void TransmitFor14443b_AsReader(uint32_t *start_time) { FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD); - // TR2 minimum 14 ETUs if (*start_time < ISO14B_TR0) { // *start_time = DELAY_ARM_TO_TAG; @@ -1544,7 +1551,7 @@ static void CodeAndTransmit14443bAsReader(const uint8_t *cmd, int len, uint32_t // eof_time in ssp clocks, but bits was added here! // *eof_time = *start_time + (10 * ts->max) + 10 + 2 + 10; - *eof_time = *start_time + ETU_TO_SSP(8 * ts->max); + *eof_time = *start_time + HF14_ETU_TO_SSP(8 * ts->max); LogTrace(cmd, len, *start_time, *eof_time, NULL, true); } @@ -1579,7 +1586,13 @@ int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, void CodeAndTransmit14443bAsReader(real_cmd, msg_len + 3, &start_time, &eof_time, true); eof_time += DELAY_ISO14443B_PCD_TO_PICC_READER; - int len = Get14443bAnswerFromTag(rxdata, rxmaxlen, iso14b_timeout, &eof_time); + +// Activation frame waiting time +// 65536/fc == 4833 µS +// SSP_CLK = 4833 µS * 3.39 = 16384 + + + int len = Get14443bAnswerFromTag(rxdata, rxmaxlen, iso14b_timeout , &eof_time); FpgaDisableTracing(); uint8_t *data_bytes = (uint8_t *) rxdata; @@ -1836,7 +1849,7 @@ int iso14443b_select_xrx_card(iso14b_card_select_t *card) { int slot; for (slot = 0; slot < 4; slot++) { - start_time = eof_time + ETU_TO_SSP(30); //(24); // next slot after 24 ETU + start_time = eof_time + HF14_ETU_TO_SSP(30); //(24); // next slot after 24 ETU retlen = Get14443bAnswerFromTag(x_atqb, sizeof(x_atqb), iso14b_timeout, &eof_time); diff --git a/client/src/cmdanalyse.c b/client/src/cmdanalyse.c index d1e14d694..e8b925292 100644 --- a/client/src/cmdanalyse.c +++ b/client/src/cmdanalyse.c @@ -1116,25 +1116,24 @@ static int CmdAnalyseUnits(const char *Cmd) { PrintAndLogEx(INFO, " 302 US = %i ETU (expect 32) %s", test, (test == 10) ? _GREEN_("ok") : _RED_("fail")); PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "ETU to US conversions"); - double test_us = ETU_TO_US(1); + PrintAndLogEx(INFO, "ETU to Micro seconds (µS) conversions"); + double test_us = HF14_ETU_TO_US(1); PrintAndLogEx(INFO, " 1 ETU = %3.2f US (expect 9.44) %s", test_us, (test_us == 9.44) ? _GREEN_("ok") : _RED_("fail")); - test_us = ETU_TO_US(10); + test_us = HF14_ETU_TO_US(10); PrintAndLogEx(INFO, " 10 ETU = %4.2f US (expect 94.40) %s", test_us, (test_us == 94.40) ? _GREEN_("ok") : _RED_("fail")); - test_us = ETU_TO_US(32); + test_us = HF14_ETU_TO_US(32); PrintAndLogEx(INFO, " 32 ETU = %5.2f US (expect 302.06) %s", test_us, (test_us == 320.06) ? _GREEN_("ok") : _RED_("fail")); - PrintAndLogEx(INFO, "ETU in %f us", ONE_ETU_IN_US); PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "US to SSP CLK 3.39MHz conversions"); - PrintAndLogEx(INFO, " 9 US = %i SSP (expect 32) ", US_TO_SSP(9)); - PrintAndLogEx(INFO, " 10 US = %i SSP (expect 32 or 48) ", US_TO_SSP(10)); - PrintAndLogEx(INFO, " 94 US = %i SSP (expect 320) ", US_TO_SSP(94)); - PrintAndLogEx(INFO, " 95 US = %i SSP (expect 320 or 336) ", US_TO_SSP(95)); - PrintAndLogEx(INFO, " 302 US = %i SSP (expect 1024) ", US_TO_SSP(302)); + PrintAndLogEx(INFO, "Microseconds (µS) to SSP CLK 3.39MHz conversions"); + PrintAndLogEx(INFO, " 9 µS = %i SSP (expect 32) ", US_TO_SSP(9)); + PrintAndLogEx(INFO, " 10 µS = %i SSP (expect 32 or 48) ", US_TO_SSP(10)); + PrintAndLogEx(INFO, " 94 µS = %i SSP (expect 320) ", US_TO_SSP(94)); + PrintAndLogEx(INFO, " 95 µS = %i SSP (expect 320 or 336) ", US_TO_SSP(95)); + PrintAndLogEx(INFO, " 302 µS = %i SSP (expect 1024) ", US_TO_SSP(302)); - PrintAndLogEx(INFO, " 4949000 US = %i SSP ", US_TO_SSP(4949000)); + PrintAndLogEx(INFO, " 4949000 µS = %i SSP ", US_TO_SSP(4949000)); PrintAndLogEx(NORMAL, ""); @@ -1145,22 +1144,21 @@ static int CmdAnalyseUnits(const char *Cmd) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "ETU to SSP CLK 3.39MHz conversions"); - PrintAndLogEx(INFO, " 1 ETU = %i SSP (expect 32) " _GREEN_("ok"), ETU_TO_SSP(1)); - PrintAndLogEx(INFO, " 10 ETU = %i SSP (expect 320) " _GREEN_("ok"), ETU_TO_SSP(10)); - PrintAndLogEx(INFO, " 32 ETU = %i SSP (expect 1024) " _GREEN_("ok"), ETU_TO_SSP(32)); + PrintAndLogEx(INFO, " 1 ETU = %i SSP (expect 32) " _GREEN_("ok"), HF14_ETU_TO_SSP(1)); + PrintAndLogEx(INFO, " 10 ETU = %i SSP (expect 320) " _GREEN_("ok"), HF14_ETU_TO_SSP(10)); + PrintAndLogEx(INFO, " 32 ETU = %i SSP (expect 1024) " _GREEN_("ok"), HF14_ETU_TO_SSP(32)); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "SSP CLK 3.39MHz to ETU conversions"); - PrintAndLogEx(INFO, "1024 SSP = %i ETU (expect 32) " _GREEN_("ok"), SSP_TO_ETU(1024)); - PrintAndLogEx(INFO, " 320 SSP = %i ETU (expect 10) " _GREEN_("ok"), SSP_TO_ETU(320)); - PrintAndLogEx(INFO, " 32 SSP = %i ETU (expect 1) " _GREEN_("ok"), SSP_TO_ETU(32)); - } else if (etu) { + PrintAndLogEx(INFO, "1024 SSP = %i ETU (expect 32) " _GREEN_("ok"), HF14_SSP_TO_ETU(1024)); + PrintAndLogEx(INFO, " 320 SSP = %i ETU (expect 10) " _GREEN_("ok"), HF14_SSP_TO_ETU(320)); + PrintAndLogEx(INFO, " 32 SSP = %i ETU (expect 1) " _GREEN_("ok"), HF14_SSP_TO_ETU(32)); + } else if (etu > -1) { - PrintAndLogEx(INFO, " %3.2f ETU = %u us ", ETU_TO_US(etu), 0); - PrintAndLogEx(INFO, " %i ETU = %u SSP ", ETU_TO_SSP(etu), 0); - } else if (us) { - PrintAndLogEx(INFO, " %i us = %u ETU ", US_TO_ETU(us), 0); - PrintAndLogEx(INFO, " %i us = %u SSP ", US_TO_SSP(us), 0); + PrintAndLogEx(INFO, " %i ETU = %3.2f µS", etu, HF14_ETU_TO_US(etu)); + PrintAndLogEx(INFO, " %i ETU = %i SSP", etu, HF14_ETU_TO_SSP(etu)); + } else if (us > -1) { + PrintAndLogEx(INFO, " %i µS = %3.2f ETU = %u SSP", us, US_TO_ETU(us), US_TO_SSP(us)); } return PM3_SUCCESS; diff --git a/include/iso14b.h b/include/iso14b.h index a9b55e69c..10995eba0 100644 --- a/include/iso14b.h +++ b/include/iso14b.h @@ -65,17 +65,18 @@ typedef struct { } PACKED iso14b_raw_cmd_t; -#define US_TO_SSP(x) ( (int32_t)((x) * 3.39) ) +#define US_TO_SSP(x) ( (int32_t) ((x) * 3.39) ) #define SSP_TO_US(x) ( (int32_t)((x) / 3.39) ) -#define ETU_TO_SSP(x) ( (int32_t)((x) * 32) ) -#define SSP_TO_ETU(x) ( (int32_t)((x) / 32) ) +#define HF14_ETU_TO_SSP(x) ((x) << 5) // 1 ETU = 32 SSP +#define HF14_SSP_TO_ETU(x) ((x) >> 5) // -#define ONE_ETU_IN_US (12800000.0 / 1356000.0) -#define ETU_TO_US(x) (float)(ONE_ETU_IN_US * (x)) +#define HF14_ETU_TO_US(x) ( (float)((x) * 9.4396) ) +#define HF14_ETU_TO_US_2(x) ( (int32_t)( ((x) * 9439600) / 1000000) ) -// #define ETU_TO_US(x) ( (int32_t)( ((x) * 9440000) / 1000000) ) -#define US_TO_ETU(x) ( (int32_t)( ((x) * 1000000) / 9440000) ) +// #define US_TO_ETU(x) ( (int32_t)( ((x) * 1000000) / 9439600) ) + +#define US_TO_ETU(x) ( (float)((x) / 9.4396) ) #endif // _ISO14B_H_ From 9659bc85fee49011e5648156125ca86525a0a34b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 24 Aug 2023 10:20:28 +0200 Subject: [PATCH 872/924] maur keys --- client/dictionaries/mfc_default_keys.dic | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 2e9be89f3..20f20f0bc 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -136,6 +136,11 @@ F1D83F964314 199404281970 199404281998 # +# Data from http://www.proxmark.org/forum/viewtopic.php?pid=25925#p25925 +# Tengo Cards Key A +FFF011223358 +FF9F11223358 +# # more Keys from mfc_default_keys.lua 000000000001 000000000002 @@ -600,6 +605,7 @@ BFB6796A11DB # Data from Salto A/B 6A1987C40A21 7F33625BC129 +6BE9314930D8 # # Data from forum 2338B4913111 From 5e9e7c6b902e005a4d88adc92512d6f08faa08bb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 24 Aug 2023 10:21:11 +0200 Subject: [PATCH 873/924] added missing ISO14443a command WTX --- include/protocols.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/protocols.h b/include/protocols.h index 58b992717..516cdf7d3 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -178,6 +178,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define ISO14443A_CMD_RATS 0xE0 #define ISO14443A_CMD_PPS 0xD0 #define ISO14443A_CMD_NXP_DESELECT 0xC2 +#define ISO14443A_CMD_WTX 0xF2 #define MIFARE_SELECT_CT 0x88 #define MIFARE_AUTH_KEYA 0x60 From 279d6486c1d89ab29c3e71fc34dcca58845d776c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 24 Aug 2023 10:22:18 +0200 Subject: [PATCH 874/924] stylish --- client/src/cmdlft55xx.c | 61 ++++++++++++++++++++++++++++++++--------- client/src/cmdlft55xx.h | 19 +++++++------ 2 files changed, 58 insertions(+), 22 deletions(-) diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index ffb90513b..75475d161 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -4139,8 +4139,9 @@ static int CmdT55xxSniff(const char *Cmd) { blockAddr = 0; for (uint8_t i = 3; i < 6; i++) { blockAddr <<= 1; - if (data[i] == '1') + if (data[i] == '1') { blockAddr |= 1; + } } blockData = 0; have_data = true; @@ -4155,21 +4156,26 @@ static int CmdT55xxSniff(const char *Cmd) { usedPassword = 0; for (uint8_t i = 2; i <= 33; i++) { usedPassword <<= 1; - if (data[i] == '1') + if (data[i] == '1') { usedPassword |= 1; } + } + // Lock bit 34 blockData = 0; for (uint8_t i = 35; i <= 66; i++) { blockData <<= 1; - if (data[i] == '1') + if (data[i] == '1') { blockData |= 1; } + } + blockAddr = 0; for (uint8_t i = 67; i <= 69; i++) { blockAddr <<= 1; - if (data[i] == '1') + if (data[i] == '1') { blockAddr |= 1; + } } have_data = true; modeText = "Default pwd write"; @@ -4190,20 +4196,24 @@ static int CmdT55xxSniff(const char *Cmd) { blockData = 0; for (uint8_t i = 3; i <= 34; i++) { blockData <<= 1; - if (data[i] == '1') + if (data[i] == '1') { blockData |= 1; } + } + for (uint8_t i = 2; i <= 33; i++) { usedPassword <<= 1; if (data[i] == '1') { usedPassword |= 1; } } + blockAddr = 0; for (uint8_t i = 35; i <= 37; i++) { blockAddr <<= 1; - if (data[i] == '1') + if (data[i] == '1') { blockAddr |= 1; + } } have_data = true; modeText = "Default write/pwd read"; @@ -4227,21 +4237,27 @@ static int CmdT55xxSniff(const char *Cmd) { usedPassword = 0; for (uint8_t i = 5; i <= 36; i++) { usedPassword <<= 1; - if (data[i] == '1') + if (data[i] == '1') { usedPassword |= 1; } + } + blockData = 0; for (uint8_t i = 38; i <= 69; i++) { blockData <<= 1; - if (data[i] == '1') + if (data[i] == '1') { blockData |= 1; } + } + blockAddr = 0; for (uint8_t i = 70; i <= 72; i++) { blockAddr <<= 1; - if (data[i] == '1') + if (data[i] == '1') { blockAddr |= 1; } + } + have_data = true; modeText = "Leading 0 pwd write"; snprintf(pwdText, sizeof(pwdText), " %08X", usedPassword); @@ -4253,10 +4269,29 @@ static int CmdT55xxSniff(const char *Cmd) { // Print results if (have_data) { - if (blockAddr == 7) - PrintAndLogEx(SUCCESS, "%-22s | "_GREEN_("%10s")" | "_YELLOW_("%8s")" | "_YELLOW_("%d")" | "_GREEN_("%d")" | %3d | %3d | %s", modeText, pwdText, dataText, blockAddr, page, minWidth, maxWidth, data); - else - PrintAndLogEx(SUCCESS, "%-22s | "_GREEN_("%10s")" | "_GREEN_("%8s")" | "_GREEN_("%d")" | "_GREEN_("%d")" | %3d | %3d | %s", modeText, pwdText, dataText, blockAddr, page, minWidth, maxWidth, data); + if (blockAddr == 7) { + PrintAndLogEx(SUCCESS, "%-22s | "_GREEN_("%10s")" | "_YELLOW_("%8s")" | "_YELLOW_("%d")" | "_GREEN_("%d")" | %3d | %3d | %s" + , modeText + , pwdText + , dataText + , blockAddr + , page + , minWidth + , maxWidth + , data + ); + } else { + PrintAndLogEx(SUCCESS, "%-22s | "_GREEN_("%10s")" | "_GREEN_("%8s")" | "_GREEN_("%d")" | "_GREEN_("%d")" | %3d | %3d | %s" + , modeText + , pwdText + , dataText + , blockAddr + , page + , minWidth + , maxWidth + , data + ); + } } } diff --git a/client/src/cmdlft55xx.h b/client/src/cmdlft55xx.h index def6a5be6..6dbab378c 100644 --- a/client/src/cmdlft55xx.h +++ b/client/src/cmdlft55xx.h @@ -21,15 +21,15 @@ #include "common.h" -#define T55x7_CONFIGURATION_BLOCK 0x00 -#define T55x7_PWD_BLOCK 0x07 -#define T55x7_TRACE_BLOCK1 0x01 -#define T55x7_TRACE_BLOCK2 0x02 -#define T55x7_PAGE0 0x00 -#define T55x7_PAGE1 0x01 -#define T55x7_PWD 0x00000010 -#define REGULAR_READ_MODE_BLOCK 0xFF -#define T55x7_BLOCK_COUNT 12 +#define T55x7_CONFIGURATION_BLOCK 0x00 +#define T55x7_PWD_BLOCK 0x07 +#define T55x7_TRACE_BLOCK1 0x01 +#define T55x7_TRACE_BLOCK2 0x02 +#define T55x7_PAGE0 0x00 +#define T55x7_PAGE1 0x01 +#define T55x7_PWD 0x00000010 +#define REGULAR_READ_MODE_BLOCK 0xFF +#define T55x7_BLOCK_COUNT 12 // config blocks #define T55X7_DEFAULT_CONFIG_BLOCK 0x000880E8 // ASK, compat mode, data rate 32, manchester, STT, 7 data blocks @@ -70,6 +70,7 @@ #define T55X7_PAC_CONFIG_BLOCK 0x00080080 // NRZ, data rate 32, 4 data blocks #define T55X7_VERICHIP_CONFIG_BLOCK 0x000C0080 // NRZ, data rate 40, 4 data blocks + #define T55X7_bin 0b0010 // Q5 / Termic / T5555 From 62da4017a0c92d02ea8e512d2541b8d1adbb6c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C5=BEe=20Jen=C5=A1terle?= Date: Thu, 24 Aug 2023 15:26:48 +0200 Subject: [PATCH 875/924] Add Slovenian Mercator Pika keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Anže Jenšterle --- client/dictionaries/mfc_default_keys.dic | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 20f20f0bc..b2d656969 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -2190,3 +2190,6 @@ D201DBB6AB6E 186C59E6AFC9 DDDAA35A9749 9D0D0A829F49 +# Mercator Pika Card, Slovenia +97D77FAE77D3 +5AF445D2B87A From c41c6858073c12f2948a5cc791190cf3f20bf688 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 24 Aug 2023 17:52:12 +0200 Subject: [PATCH 876/924] Merged hi_reader and hi_reader_15 into one file hi_reader_15 was a superset of hi_reader, now uses conditional compile from Makefile like the other files to select compilations options --- fpga/Makefile | 1 - fpga/fpga_pm3_top.v | 8 - fpga/hi_reader.v | 170 +++++++++++++--- fpga/hi_reader_15.v | 459 -------------------------------------------- 4 files changed, 139 insertions(+), 499 deletions(-) delete mode 100644 fpga/hi_reader_15.v diff --git a/fpga/Makefile b/fpga/Makefile index 068b75255..1731d4869 100644 --- a/fpga/Makefile +++ b/fpga/Makefile @@ -104,7 +104,6 @@ TARGET_COMMON_FILES += hi_flite.v TARGET_COMMON_FILES += hi_get_trace.v TARGET_COMMON_FILES += hi_iso14443a.v TARGET_COMMON_FILES += hi_reader.v -TARGET_COMMON_FILES += hi_reader_15.v TARGET_COMMON_FILES += hi_simulate.v TARGET_COMMON_FILES += hi_sniffer.v TARGET_COMMON_FILES += lf_edge_detect.v diff --git a/fpga/fpga_pm3_top.v b/fpga/fpga_pm3_top.v index 89bd2e56b..f200bf498 100644 --- a/fpga/fpga_pm3_top.v +++ b/fpga/fpga_pm3_top.v @@ -73,11 +73,7 @@ multiple outputs connected together therefore leading to a failed compilation //`ifdef WITH_LF2 `include "lo_passthru.v" `endif //`ifdef WITH_LF3 `include "lo_adc.v" `endif // -//`ifdef WITH_HF_15 -//`ifdef WITH_HF0 `include "hi_reader_15.v" `endif -//`else //`ifdef WITH_HF0 `include "hi_reader.v" `endif -//`endif //`ifdef WITH_HF1 `include "hi_simulate.v" `endif //`ifdef WITH_HF2 `include "hi_iso14443a.v" `endif //`ifdef WITH_HF3 `include "hi_sniffer.v" `endif @@ -277,11 +273,7 @@ assign mux6_pwr_lo = 1'b1; // HF reader `ifdef WITH_HF0 -`ifdef WITH_HF_15 -hi_reader_15 hr( -`else hi_reader hr( -`endif .ck_1356meg (ck_1356megb), .adc_d (adc_d), .subcarrier_frequency (conf_word[5:4]), diff --git a/fpga/hi_reader.v b/fpga/hi_reader.v index ffa2634d8..434215457 100644 --- a/fpga/hi_reader.v +++ b/fpga/hi_reader.v @@ -13,7 +13,7 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- -//`include "define.v" +// with optional support for iso15 2sc mode slected with compiler define WITH_HF_15 module hi_reader( input ck_1356meg, @@ -63,7 +63,6 @@ begin end end - // Let us report a correlation every 64 samples. I.e. // one Q/I pair after 4 subcarrier cycles for the 848kHz subcarrier, // one Q/I pair after 2 subcarrier cycles for the 424kHz subcarriers, @@ -71,10 +70,105 @@ end // We need a 6-bit counter for the timing. reg [5:0] corr_i_cnt; always @(negedge adc_clk) -begin corr_i_cnt <= corr_i_cnt + 1; -end +`ifdef WITH_HF_15 +reg [1:0] fskout = 2'd0; +reg last0 = 1'b0; + +reg [7:0] avg = 8'd0; +reg [127:0] avg128 = 128'd0; +reg [7:0] diff16 = 8'd0; +reg [7:0] diff28 = 8'd0; +reg [7:0] diff32 = 8'd0; + +reg [11:0] match16 = 12'd0; +reg [11:0] match32 = 12'd0; +reg [11:0] match28 = 12'd0; + +always @(negedge adc_clk) +begin + if (corr_i_cnt[0] == 1'b0) // every 2 clock + avg = adc_d[7:1]; + else + begin + avg = avg + adc_d[7:1]; + if (corr_i_cnt[0] == 1'b1) // every 2 clock + begin + if (avg > avg128[63:56]) + diff16 = avg - avg128[63:56]; + else + diff16 = avg128[63:56] - avg; + + if (avg > avg128[111:104]) + diff28 = avg - avg128[111:104]; + else + diff28 = avg128[111:104] - avg; + + if (avg > avg128[127:120]) + diff32 = avg - avg128[127:120]; + else + diff32 = avg128[127:120] - avg; + + avg128[127:8] = avg128[119:0]; + avg128[7:0] = avg; + + if (corr_i_cnt[4:1] == 4'b0000) // every 32 clock (8*4) + begin + match16 = diff16; + match28 = diff28; + match32 = diff32; + end + else + begin + match16 = match16 + diff16; + match28 = match28 + diff28; + match32 = match32 + diff32; + + if (corr_i_cnt[4:1] == 4'b1111) // every 32 clock (8*4) + begin + last0 = (fskout == 2'b0); + if (match16 < 12'd64 && last0) + fskout = 2'b00; // not yet started + else if ((match16 | match28 | match32) == 12'b0) + fskout = 2'b00; // signal likely ended + else if (((match16 <= match28 + 12'd16) && (match16 <= match32+ 12'd16)) || + (match28 <= 12'd16 && match32 <= 12'd16)) + begin + if (!last0) + fskout = 2'b11; // 16 match better than 28 or 32 but already started + end + else + begin + if (match28 < match32) + begin + diff28 = match32 - match28; + diff16 = match16 - match28; + if (diff28*2 > diff16) + fskout = 2'b01; + else if (!last0) + begin + fskout = 2'b01; + end + end + else //if (match32 <= match28) + begin + diff32 = match28 - match32; + diff16 = match16 - match32; + if (diff32*2 > diff16) + fskout = 2'b10; + else if (!last0) + begin + fskout = 2'b10; + end + end + end + end + end + end + end +end +`endif // A couple of registers in which to accumulate the correlations. From the 64 samples // we would add at most 32 times the difference between unmodulated and modulated signal. It should @@ -89,7 +183,6 @@ reg signed [13:0] corr_q_accum; reg signed [7:0] corr_i_out; reg signed [7:0] corr_q_out; - // the amplitude of the subcarrier is sqrt(ci^2 + cq^2). // approximate by amplitude = max(|ci|,|cq|) + 1/2*min(|ci|,|cq|) reg [13:0] corr_amplitude, abs_ci, abs_cq, max_ci_cq; @@ -122,7 +215,6 @@ begin end - // The subcarrier reference signals reg subcarrier_I; reg subcarrier_Q; @@ -130,23 +222,22 @@ reg subcarrier_Q; always @(*) begin if (subcarrier_frequency == `FPGA_HF_READER_SUBCARRIER_848_KHZ) - begin - subcarrier_I = ~corr_i_cnt[3]; - subcarrier_Q = ~(corr_i_cnt[3] ^ corr_i_cnt[2]); - end + begin + subcarrier_I = ~corr_i_cnt[3]; + subcarrier_Q = ~(corr_i_cnt[3] ^ corr_i_cnt[2]); + end else if (subcarrier_frequency == `FPGA_HF_READER_SUBCARRIER_212_KHZ) - begin - subcarrier_I = ~corr_i_cnt[5]; - subcarrier_Q = ~(corr_i_cnt[5] ^ corr_i_cnt[4]); - end + begin + subcarrier_I = ~corr_i_cnt[5]; + subcarrier_Q = ~(corr_i_cnt[5] ^ corr_i_cnt[4]); + end else - begin // 424 kHz - subcarrier_I = ~corr_i_cnt[4]; - subcarrier_Q = ~(corr_i_cnt[4] ^ corr_i_cnt[3]); - end + begin // 424 kHz + subcarrier_I = ~corr_i_cnt[4]; + subcarrier_Q = ~(corr_i_cnt[4] ^ corr_i_cnt[3]); + end end - // ADC data appears on the rising edge, so sample it on the falling edge always @(negedge adc_clk) begin @@ -157,9 +248,20 @@ begin begin if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_AMPLITUDE) begin - // send amplitude plus 2 bits reader signal - corr_i_out <= corr_amplitude[13:6]; - corr_q_out <= {corr_amplitude[5:0], after_hysteresis_prev_prev, after_hysteresis_prev}; +`ifdef WITH_HF_15 + if (subcarrier_frequency == `FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ) + begin + // send amplitude + 2 bits fsk (2sc) signal + 2 bits reader signal + corr_i_out <= corr_amplitude[13:6]; + corr_q_out <= {corr_amplitude[5:2], fskout, after_hysteresis_prev_prev, after_hysteresis_prev}; + end + else +`endif + begin + // send amplitude plus 2 bits reader signal + corr_i_out <= corr_amplitude[13:6]; + corr_q_out <= {corr_amplitude[5:0], after_hysteresis_prev_prev, after_hysteresis_prev}; + end end else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ) begin @@ -183,13 +285,23 @@ begin end else if (minor_mode == `FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE) begin - // send amplitude - corr_i_out <= {2'b00, corr_amplitude[13:8]}; - corr_q_out <= corr_amplitude[7:0]; +`ifdef WITH_HF_15 + if (subcarrier_frequency == `FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ) + begin + // send 2 bits fsk (2sc) signal + amplitude + corr_i_out <= {fskout, corr_amplitude[13:8]}; + corr_q_out <= corr_amplitude[7:0]; + end + else +`endif + begin + // send amplitude + corr_i_out <= {2'b00, corr_amplitude[13:8]}; + corr_q_out <= corr_amplitude[7:0]; + end end else if (minor_mode == `FPGA_HF_READER_MODE_RECEIVE_IQ) begin - // Send 8 bits of in phase tag signal if (corr_i_accum[13:11] == 3'b000 || corr_i_accum[13:11] == 3'b111) corr_i_out <= corr_i_accum[11:4]; @@ -251,7 +363,6 @@ begin end - // ssp clock and frame signal for communication to and from ARM // _____ _____ _____ _ // ssp_clk | |_____| |_____| |_____| @@ -262,7 +373,6 @@ end // // corr_i_cnt 0 1 2 3 4 5 6 7 8 9 10 11 12 ... // - always @(negedge adc_clk) begin if (corr_i_cnt[1:0] == 2'b00) @@ -280,10 +390,8 @@ begin ssp_frame <= 1'b0; end - assign ssp_din = corr_i_out[7]; - // a jamming signal reg jam_signal; reg [3:0] jam_counter; @@ -333,7 +441,7 @@ assign pwr_oe1 = 1'b0; assign pwr_oe3 = 1'b0; // Unused. -assign pwr_lo = 1'b0; +assign pwr_lo = 1'b0; assign pwr_oe2 = 1'b0; // Debug Output diff --git a/fpga/hi_reader_15.v b/fpga/hi_reader_15.v deleted file mode 100644 index ad41e771c..000000000 --- a/fpga/hi_reader_15.v +++ /dev/null @@ -1,459 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- -// modified to add support for iso15 2sc mode - -module hi_reader_15( - input ck_1356meg, - input [7:0] adc_d, - input [1:0] subcarrier_frequency, - input [3:0] minor_mode, - input ssp_dout, - - output ssp_din, - output reg ssp_frame, - output reg ssp_clk, - output adc_clk, - output pwr_lo, - output reg pwr_hi, - output pwr_oe1, - output pwr_oe2, - output pwr_oe3, - output reg pwr_oe4, - output debug -); - -assign adc_clk = ck_1356meg; // sample frequency is 13,56 MHz - -// When we're a reader, we just need to do the BPSK demod; but when we're an -// eavesdropper, we also need to pick out the commands sent by the reader, -// using AM. Do this the same way that we do it for the simulated tag. -reg after_hysteresis, after_hysteresis_prev, after_hysteresis_prev_prev; -reg [11:0] has_been_low_for; -always @(negedge adc_clk) -begin - if (& adc_d[7:0]) after_hysteresis <= 1'b1; - else if (~(| adc_d[7:0])) after_hysteresis <= 1'b0; - - if (after_hysteresis) - begin - has_been_low_for <= 12'd0; - end - else - begin - if (has_been_low_for == 12'd4095) - begin - has_been_low_for <= 12'd0; - after_hysteresis <= 1'b1; - end - else - has_been_low_for <= has_been_low_for + 1; - end -end - - -// Let us report a correlation every 64 samples. I.e. -// one Q/I pair after 4 subcarrier cycles for the 848kHz subcarrier, -// one Q/I pair after 2 subcarrier cycles for the 424kHz subcarriers, -// one Q/I pair for each subcarrier cyle for the 212kHz subcarrier. -// We need a 6-bit counter for the timing. -reg [5:0] corr_i_cnt; -always @(negedge adc_clk) -begin - corr_i_cnt <= corr_i_cnt + 1; -end - - -reg [1:0] fskout = 2'd0; -reg last0 = 1'b0; - -reg [7:0] avg = 8'd0; -reg [127:0] avg128 = 128'd0; -reg [7:0] diff16 = 8'd0; -reg [7:0] diff28 = 8'd0; -reg [7:0] diff32 = 8'd0; - -reg [11:0] match16 = 12'd0; -reg [11:0] match32 = 12'd0; -reg [11:0] match28 = 12'd0; - -always @(negedge adc_clk) -begin - if (corr_i_cnt[0] == 1'b0) // every 2 clock - begin - avg = adc_d[7:1]; - end - else - begin - avg = avg + adc_d[7:1]; - if (corr_i_cnt[0] == 1'b1) // every 2 clock - begin - if (avg > avg128[63:56]) - diff16 = avg - avg128[63:56]; - else - diff16 = avg128[63:56] - avg; - - if (avg > avg128[111:104]) - diff28 = avg - avg128[111:104]; - else - diff28 = avg128[111:104] - avg; - - if (avg > avg128[127:120]) - diff32 = avg - avg128[127:120]; - else - diff32 = avg128[127:120] - avg; - - avg128[127:8] = avg128[119:0]; - avg128[7:0] = avg; - - - if (corr_i_cnt[4:1] == 4'b0000) // every 32 clock (8*4) - begin - match16 = diff16; - match28 = diff28; - match32 = diff32; - end - else - begin - match16 = match16 + diff16; - match28 = match28 + diff28; - match32 = match32 + diff32; - - if (corr_i_cnt[4:1] == 4'b1111) // every 32 clock (8*4) - begin - last0 = (fskout == 2'b0); - if (match16 < 12'd64 && last0) - fskout = 2'b00; // not yet started - else if ((match16 | match28 | match32) == 12'b0) - fskout = 2'b00; // signal likely ended - else if (((match16 <= match28 + 12'd16) && (match16 <= match32+ 12'd16)) || - (match28 <= 12'd16 && match32 <= 12'd16)) - begin - if (!last0) - fskout = 2'b11; // 16 match better than 28 or 32 but already started - end - else - begin - if (match28 < match32) - begin - diff28 = match32 - match28; - diff16 = match16 - match28; - if (diff28*2 > diff16) - fskout = 2'b01; - else if (!last0) - begin - fskout = 2'b01; - end - end - else //if (match32 <= match28) - begin - diff32 = match28 - match32; - diff16 = match16 - match32; - if (diff32*2 > diff16) - fskout = 2'b10; - else if (!last0) - begin - fskout = 2'b10; - end - end - end - end - end - end - end -end - - -// A couple of registers in which to accumulate the correlations. From the 64 samples -// we would add at most 32 times the difference between unmodulated and modulated signal. It should -// be safe to assume that a tag will not be able to modulate the carrier signal by more than 25%. -// 32 * 255 * 0,25 = 2040, which can be held in 11 bits. Add 1 bit for sign. -// Temporary we might need more bits. For the 212kHz subcarrier we could possible add 32 times the -// maximum signal value before a first subtraction would occur. 32 * 255 = 8160 can be held in 13 bits. -// Add one bit for sign -> need 14 bit registers but final result will fit into 12 bits. -reg signed [13:0] corr_i_accum; -reg signed [13:0] corr_q_accum; -// we will report maximum 8 significant bits -reg signed [7:0] corr_i_out; -reg signed [7:0] corr_q_out; - - -// the amplitude of the subcarrier is sqrt(ci^2 + cq^2). -// approximate by amplitude = max(|ci|,|cq|) + 1/2*min(|ci|,|cq|) -reg [13:0] corr_amplitude, abs_ci, abs_cq, max_ci_cq; -reg [12:0] min_ci_cq_2; // min_ci_cq / 2 - -always @(*) -begin - if (corr_i_accum[13] == 1'b0) - abs_ci <= corr_i_accum; - else - abs_ci <= -corr_i_accum; - - if (corr_q_accum[13] == 1'b0) - abs_cq <= corr_q_accum; - else - abs_cq <= -corr_q_accum; - - if (abs_ci > abs_cq) - begin - max_ci_cq <= abs_ci; - min_ci_cq_2 <= abs_cq / 2; - end - else - begin - max_ci_cq <= abs_cq; - min_ci_cq_2 <= abs_ci / 2; - end - - corr_amplitude <= max_ci_cq + min_ci_cq_2; - -end - - -// The subcarrier reference signals -reg subcarrier_I; -reg subcarrier_Q; - -always @(*) -begin - if (subcarrier_frequency == `FPGA_HF_READER_SUBCARRIER_848_KHZ) - begin - subcarrier_I = ~corr_i_cnt[3]; - subcarrier_Q = ~(corr_i_cnt[3] ^ corr_i_cnt[2]); - end - else if (subcarrier_frequency == `FPGA_HF_READER_SUBCARRIER_212_KHZ) - begin - subcarrier_I = ~corr_i_cnt[5]; - subcarrier_Q = ~(corr_i_cnt[5] ^ corr_i_cnt[4]); - end - else - begin // 424 kHz - subcarrier_I = ~corr_i_cnt[4]; - subcarrier_Q = ~(corr_i_cnt[4] ^ corr_i_cnt[3]); - end -end - - -// ADC data appears on the rising edge, so sample it on the falling edge -always @(negedge adc_clk) -begin - // These are the correlators: we correlate against in-phase and quadrature - // versions of our reference signal, and keep the (signed) results or the - // resulting amplitude to send out later over the SSP. - if (corr_i_cnt == 6'd0) - begin - if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_AMPLITUDE) - begin - if (subcarrier_frequency == `FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ) - begin - // send amplitude + 2 bits fsk (2sc) signal + 2 bits reader signal - corr_i_out <= corr_amplitude[13:6]; - corr_q_out <= {corr_amplitude[5:2], fskout, after_hysteresis_prev_prev, after_hysteresis_prev}; - end - else - begin - // send amplitude plus 2 bits reader signal - corr_i_out <= corr_amplitude[13:6]; - corr_q_out <= {corr_amplitude[5:0], after_hysteresis_prev_prev, after_hysteresis_prev}; - end - end - else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ) - begin - // Send 7 most significant bits of in phase tag signal (signed), plus 1 bit reader signal - if (corr_i_accum[13:11] == 3'b000 || corr_i_accum[13:11] == 3'b111) - corr_i_out <= {corr_i_accum[11:5], after_hysteresis_prev_prev}; - else // truncate to maximum value - if (corr_i_accum[13] == 1'b0) - corr_i_out <= {7'b0111111, after_hysteresis_prev_prev}; - else - corr_i_out <= {7'b1000000, after_hysteresis_prev_prev}; - - // Send 7 most significant bits of quadrature phase tag signal (signed), plus 1 bit reader signal - if (corr_q_accum[13:11] == 3'b000 || corr_q_accum[13:11] == 3'b111) - corr_q_out <= {corr_q_accum[11:5], after_hysteresis_prev}; - else // truncate to maximum value - if (corr_q_accum[13] == 1'b0) - corr_q_out <= {7'b0111111, after_hysteresis_prev}; - else - corr_q_out <= {7'b1000000, after_hysteresis_prev}; - end - else if (minor_mode == `FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE) - begin - if (subcarrier_frequency == `FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ) - begin - // send 2 bits fsk (2sc) signal + amplitude - corr_i_out <= {fskout, corr_amplitude[13:8]}; - corr_q_out <= corr_amplitude[7:0]; - end - else - begin - // send amplitude - corr_i_out <= {2'b00, corr_amplitude[13:8]}; - corr_q_out <= corr_amplitude[7:0]; - end - end - else if (minor_mode == `FPGA_HF_READER_MODE_RECEIVE_IQ) - begin - // Send 8 bits of in phase tag signal - if (corr_i_accum[13:11] == 3'b000 || corr_i_accum[13:11] == 3'b111) - corr_i_out <= corr_i_accum[11:4]; - else // truncate to maximum value - if (corr_i_accum[13] == 1'b0) - corr_i_out <= 8'b01111111; - else - corr_i_out <= 8'b10000000; - - // Send 8 bits of quadrature phase tag signal - if (corr_q_accum[13:11] == 3'b000 || corr_q_accum[13:11] == 3'b111) - corr_q_out <= corr_q_accum[11:4]; - else // truncate to maximum value - if (corr_q_accum[13] == 1'b0) - corr_q_out <= 8'b01111111; - else - corr_q_out <= 8'b10000000; - end - - // for each Q/I pair report two reader signal samples when sniffing. Store the 1st. - after_hysteresis_prev_prev <= after_hysteresis; - - // Initialize next correlation. - // Both I and Q reference signals are high when corr_i_nct == 0. Therefore need to accumulate. - corr_i_accum <= $signed({1'b0, adc_d}); - corr_q_accum <= $signed({1'b0, adc_d}); - end - else - begin - if (subcarrier_I) - corr_i_accum <= corr_i_accum + $signed({1'b0, adc_d}); - else - corr_i_accum <= corr_i_accum - $signed({1'b0, adc_d}); - - if (subcarrier_Q) - corr_q_accum <= corr_q_accum + $signed({1'b0, adc_d}); - else - corr_q_accum <= corr_q_accum - $signed({1'b0, adc_d}); - end - - // for each Q/I pair report two reader signal samples when sniffing. Store the 2nd. - if (corr_i_cnt == 6'd32) - after_hysteresis_prev <= after_hysteresis; - - // Then the result from last time is serialized and send out to the ARM. - // We get one report each cycle, and each report is 16 bits, so the - // ssp_clk should be the adc_clk divided by 64/16 = 4. - // ssp_clk frequency = 13,56MHz / 4 = 3.39MHz - - if (corr_i_cnt[1:0] == 2'b00) - begin - // Don't shift if we just loaded new data, obviously. - if (corr_i_cnt != 6'd0) - begin - corr_i_out[7:0] <= {corr_i_out[6:0], corr_q_out[7]}; - corr_q_out[7:1] <= corr_q_out[6:0]; - end - end - -end - - -// ssp clock and frame signal for communication to and from ARM -// _____ _____ _____ _ -// ssp_clk | |_____| |_____| |_____| -// _____ -// ssp_frame ___| |____________________________ -// ___________ ___________ ___________ _ -// ssp_d_in X___________X___________X___________X_ -// -// corr_i_cnt 0 1 2 3 4 5 6 7 8 9 10 11 12 ... -// - -always @(negedge adc_clk) -begin - if (corr_i_cnt[1:0] == 2'b00) - ssp_clk <= 1'b1; - - if (corr_i_cnt[1:0] == 2'b10) - ssp_clk <= 1'b0; - - // set ssp_frame signal for corr_i_cnt = 1..3 - // (send one frame with 16 Bits) - if (corr_i_cnt == 6'd1) - ssp_frame <= 1'b1; - - if (corr_i_cnt == 6'd3) - ssp_frame <= 1'b0; -end - - -assign ssp_din = corr_i_out[7]; - - -// a jamming signal -reg jam_signal; -reg [3:0] jam_counter; - -always @(negedge adc_clk) -begin - if (corr_i_cnt == 6'd0) - begin - jam_counter <= jam_counter + 1; - jam_signal <= jam_counter[1] ^ jam_counter[3]; - end -end - -always @(*) -begin - if (minor_mode == `FPGA_HF_READER_MODE_SEND_SHALLOW_MOD) - begin - pwr_hi = ck_1356meg; - pwr_oe4 = ssp_dout; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SEND_FULL_MOD) - begin - pwr_hi = ck_1356meg & ~ssp_dout; - pwr_oe4 = 1'b0; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SEND_JAM) - begin - pwr_hi = ck_1356meg & jam_signal; - pwr_oe4 = 1'b0; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ - || minor_mode == `FPGA_HF_READER_MODE_SNIFF_AMPLITUDE - || minor_mode == `FPGA_HF_READER_MODE_SNIFF_PHASE) - begin // all off - pwr_hi = 1'b0; - pwr_oe4 = 1'b0; - end - else // receiving from tag - begin - pwr_hi = ck_1356meg; - pwr_oe4 = 1'b0; - end -end - -// always on -assign pwr_oe1 = 1'b0; -assign pwr_oe3 = 1'b0; - -// Unused. -assign pwr_lo = 1'b0; -assign pwr_oe2 = 1'b0; - -// Debug Output -assign debug = corr_i_cnt[3]; - -endmodule From 66b1758278170df8b66c645a163f32eb16988003 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 24 Aug 2023 18:06:44 +0200 Subject: [PATCH 877/924] Removed commented out includes Include statements in individual files are not required when compiling the code the correct way as a project with an explicitly defined work library. The Makefile exactly replicates the compilation process of the ISE environment and generates the required project files. --- fpga/fpga_icopyx_hf.v | 8 -------- fpga/fpga_icopyx_lf.v | 7 ------- fpga/fpga_icopyx_top.v | 5 ----- fpga/fpga_pm3_top.v | 15 +-------------- fpga/hi_get_trace.v | 1 - fpga/hi_iso14443a.v | 1 - fpga/hi_simulate.v | 1 - fpga/lf_edge_detect.v | 3 --- fpga/lo_edge_detect.v | 3 --- fpga/mux16.v | 3 --- fpga/mux2_onein.v | 15 +++++++++++++-- fpga/mux2_oneout.v | 15 +++++++++++++-- fpga/mux8.v | 3 --- 13 files changed, 27 insertions(+), 53 deletions(-) diff --git a/fpga/fpga_icopyx_hf.v b/fpga/fpga_icopyx_hf.v index b7730875d..233c1aeab 100644 --- a/fpga/fpga_icopyx_hf.v +++ b/fpga/fpga_icopyx_hf.v @@ -20,14 +20,6 @@ // frequency modes, the FPGA might perform some demodulation first, to // reduce the amount of data that we must send to the ARM. //----------------------------------------------------------------------------- -//`include "define.v" - -//`include "hi_reader.v" -//`include "hi_simulate.v" -//`include "hi_iso14443a.v" -//`include "hi_flite.v" -//`include "hi_sniffer.v" -//`include "hi_get_trace.v" module fpga_hf( input spck, diff --git a/fpga/fpga_icopyx_lf.v b/fpga/fpga_icopyx_lf.v index 0ca4739b7..b1b890b79 100644 --- a/fpga/fpga_icopyx_lf.v +++ b/fpga/fpga_icopyx_lf.v @@ -20,13 +20,6 @@ // frequency modes, the FPGA might perform some demodulation first, to // reduce the amount of data that we must send to the ARM. //----------------------------------------------------------------------------- -//`include "define.v" - -//`include "lo_read.v" -//`include "lo_passthru.v" -//`include "lo_edge_detect.v" -//`include "lo_adc.v" -//`include "clk_divider.v" module fpga_lf( input spck, diff --git a/fpga/fpga_icopyx_top.v b/fpga/fpga_icopyx_top.v index 81aacb73c..39981e6cf 100644 --- a/fpga/fpga_icopyx_top.v +++ b/fpga/fpga_icopyx_top.v @@ -20,11 +20,6 @@ // frequency modes, the FPGA might perform some demodulation first, to // reduce the amount of data that we must send to the ARM. //----------------------------------------------------------------------------- -//`include "fpga_lf.v" -//`include "fpga_hf.v" -//`include "mux2_onein.v" -//`include "mux2_oneout.v" -//`include "util.v" module fpga_top( input spck, diff --git a/fpga/fpga_pm3_top.v b/fpga/fpga_pm3_top.v index f200bf498..89b03d3ad 100644 --- a/fpga/fpga_pm3_top.v +++ b/fpga/fpga_pm3_top.v @@ -20,18 +20,8 @@ // frequency modes, the FPGA might perform some demodulation first, to // reduce the amount of data that we must send to the ARM. //----------------------------------------------------------------------------- -/* -Once upon a time the FPGA had a 16 input mux so we could have all LF and HF modules enabled and selectable -As the functionality grew, we run out of space in the FPGA and we had to split into an "LF only" and an "HF only" FPGA bitstream -But even then after a while it was not possible to fit all the HF functions at the same time so now we have multiple "HF only" bitstreams -For example "Felica but without ISO14443", or "ISO14443 but without Felica" or "HF_15 but without Felica and ISO14443" -Because of all of the above, you can not enable both HF and LF modes at the same time, because some LF modules outputs -map to the same mux inputs as some HF modules outputs (thanks to reducing the mux from 16 to 8 inputs) and you can not have -multiple outputs connected together therefore leading to a failed compilation -*/ - -// These defines are meant to be passed by the Makefile so do not uncomment them here +// These defines are for reference only, they are passed by the Makefile so do not uncomment them here // Proxmark3 RDV4 target //`define PM3RDV4 // Proxmark3 generic target @@ -64,9 +54,6 @@ multiple outputs connected together therefore leading to a failed compilation // WITH_HF5 enables module get trace //`define WITH_HF5 -//`include "define.v" -//`include "util.v" -// //`ifdef WITH_LF `include "clk_divider.v" `endif //`ifdef WITH_LF0 `include "lo_read.v" `endif //`ifdef WITH_LF1 `include "lo_edge_detect.v" `endif diff --git a/fpga/hi_get_trace.v b/fpga/hi_get_trace.v index 9bf32bc64..cd33173b2 100644 --- a/fpga/hi_get_trace.v +++ b/fpga/hi_get_trace.v @@ -13,7 +13,6 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- -//`include "define.v" module hi_get_trace( input ck_1356megb, diff --git a/fpga/hi_iso14443a.v b/fpga/hi_iso14443a.v index 6fd450528..182b66f7e 100644 --- a/fpga/hi_iso14443a.v +++ b/fpga/hi_iso14443a.v @@ -14,7 +14,6 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- // ISO14443-A support for the Proxmark III -//`include "define.v" module hi_iso14443a( input ck_1356meg, diff --git a/fpga/hi_simulate.v b/fpga/hi_simulate.v index 97346eb9b..2d8ff2771 100644 --- a/fpga/hi_simulate.v +++ b/fpga/hi_simulate.v @@ -30,7 +30,6 @@ // // Jonathan Westhues, October 2006 //----------------------------------------------------------------------------- -//`include "define.v" module hi_simulate( input ck_1356meg, diff --git a/fpga/lf_edge_detect.v b/fpga/lf_edge_detect.v index 2a58331d1..1e4cd0cce 100644 --- a/fpga/lf_edge_detect.v +++ b/fpga/lf_edge_detect.v @@ -15,9 +15,6 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- -// input clk is 24MHz -//`include "min_max_tracker.v" - module lf_edge_detect( input clk, input [7:0] adc_d, diff --git a/fpga/lo_edge_detect.v b/fpga/lo_edge_detect.v index c820466f7..9bf408cc7 100644 --- a/fpga/lo_edge_detect.v +++ b/fpga/lo_edge_detect.v @@ -25,9 +25,6 @@ // - ssp_frame (wired to TIOA1 on the arm) for the edge detection/state // - ssp_clk: cross_lo -//`include "lp20khz_1MSa_iir_filter.v" -//`include "lf_edge_detect.v" - module lo_edge_detect( input pck0, input pck_divclk, diff --git a/fpga/mux16.v b/fpga/mux16.v index 1d9777706..b22ee6bf7 100644 --- a/fpga/mux16.v +++ b/fpga/mux16.v @@ -13,9 +13,6 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- -// -// General-purpose miscellany. -// // 16 inputs to 1 output multiplexer module mux16( diff --git a/fpga/mux2_onein.v b/fpga/mux2_onein.v index baefa72c8..24a53bbe4 100644 --- a/fpga/mux2_onein.v +++ b/fpga/mux2_onein.v @@ -1,9 +1,20 @@ //----------------------------------------------------------------------------- -// Two way MUX. +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. // -// kombi, 2020.05 +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- +// 2 inputs to 1 output multiplexer module mux2_one( input [1:0] sel, output reg y, diff --git a/fpga/mux2_oneout.v b/fpga/mux2_oneout.v index fa61205a2..d312b68c6 100644 --- a/fpga/mux2_oneout.v +++ b/fpga/mux2_oneout.v @@ -1,9 +1,20 @@ //----------------------------------------------------------------------------- -// Two way MUX. +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. // -// kombi, 2020.05 +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- +// 1 input to 2 outputs multiplexer module mux2_oneout( input [1:0] sel, input y, diff --git a/fpga/mux8.v b/fpga/mux8.v index d9118d243..1918db2d8 100644 --- a/fpga/mux8.v +++ b/fpga/mux8.v @@ -13,9 +13,6 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- -// -// General-purpose miscellany. -// // 8 inputs to 1 output multiplexer module mux8( From 3e4b7d07ff0a4effbc06b114a373bc3b4fa97764 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 24 Aug 2023 18:21:07 +0200 Subject: [PATCH 878/924] Whitespace, formatting --- fpga/clk_divider.v | 2 +- fpga/fpga_icopyx_lf.v | 8 +- fpga/hi_flite.v | 378 ++++++++++++++++++++--------------------- fpga/hi_get_trace.v | 16 +- fpga/hi_iso14443a.v | 49 ++---- fpga/hi_simulate.v | 19 +-- fpga/lf_edge_detect.v | 120 ++++++------- fpga/lo_edge_detect.v | 4 +- fpga/lo_read.v | 7 +- fpga/min_max_tracker.v | 82 ++++----- 10 files changed, 332 insertions(+), 353 deletions(-) diff --git a/fpga/clk_divider.v b/fpga/clk_divider.v index 0bcc2e608..7cb9925f3 100644 --- a/fpga/clk_divider.v +++ b/fpga/clk_divider.v @@ -22,7 +22,7 @@ module clk_divider( ); reg [7:0] div_cnt_ = 0; - reg div_clk_; + reg div_clk_ = 0; assign div_cnt = div_cnt_; assign div_clk = div_clk_; diff --git a/fpga/fpga_icopyx_lf.v b/fpga/fpga_icopyx_lf.v index b1b890b79..d1495498a 100644 --- a/fpga/fpga_icopyx_lf.v +++ b/fpga/fpga_icopyx_lf.v @@ -71,7 +71,13 @@ reg [7:0] lf_ed_threshold; wire [7:0] pck_cnt; wire pck_divclk; reg [7:0] divisor; -clk_divider div_clk(pck0, divisor, pck_cnt, pck_divclk); + +clk_divider div_clk( + .clk (pck0), + .divisor (divisor), + .div_cnt (pck_cnt), + .div_clk (pck_divclk) +); // We switch modes between transmitting to the 13.56 MHz tag and receiving // from it, which means that we must make sure that we can do so without diff --git a/fpga/hi_flite.v b/fpga/hi_flite.v index ac9e7e069..d93d67d21 100644 --- a/fpga/hi_flite.v +++ b/fpga/hi_flite.v @@ -66,7 +66,7 @@ assign adc_clk = ck_1356meg; `define min_bitdelay_212 8 //minimum values and corresponding thresholds -reg [8:0] curmin=`imin; +reg [8:0] curmin=`imin; reg [8:0] curminthres=`ithrmin; reg [8:0] curmaxthres=`ithrmax; reg [8:0] curmax=`imax; @@ -75,10 +75,10 @@ reg [8:0] curmax=`imax; reg after_hysteresis = 1'b1; //state machine for envelope tracking -reg [1:0] state=1'd0; +reg [1:0] state = 1'd0; //lower edge detected, trying to detect first bit of SYNC (b24d, 1011001001001101) -reg try_sync=1'b0; +reg try_sync = 1'b0; //detected first sync bit, phase frozen reg did_sync=0; @@ -105,32 +105,32 @@ reg zero = 1'b0; // Manchester first halfbit low second high corresponds to this reg [8:0] ssp_cnt = 9'd0; always @(posedge adc_clk) - ssp_cnt <= (ssp_cnt + 1); + ssp_cnt <= (ssp_cnt + 1); //maybe change it so that ARM sends preamble as well. //then: ready bits sent to ARM, 8 bits sent from ARM (all ones), then preamble (all zeros, presumably) - which starts modulation always @(negedge adc_clk) begin - //count fc/64 - transfer bits to ARM at the rate they are received - if( ((~speed) && (ssp_cnt[5:0] == 6'b000000)) || (speed && (ssp_cnt[4:0] == 5'b00000))) - begin - ssp_clk <= 1'b1; - //send current bit (detected in SNIFF mode or the one being modulated in MOD mode, 0 otherwise) - ssp_din <= curbit; - end - if( ( (~speed) && (ssp_cnt[5:0] == 6'b100000)) ||(speed && ssp_cnt[4:0] == 5'b10000)) - ssp_clk <= 1'b0; + //count fc/64 - transfer bits to ARM at the rate they are received + if( ((~speed) && (ssp_cnt[5:0] == 6'b000000) ) || (speed && (ssp_cnt[4:0] == 5'b00000)) ) + begin + ssp_clk <= 1'b1; + //send current bit (detected in SNIFF mode or the one being modulated in MOD mode, 0 otherwise) + ssp_din <= curbit; + end + if( ( (~speed) && (ssp_cnt[5:0] == 6'b100000)) ||(speed && ssp_cnt[4:0] == 5'b10000)) + ssp_clk <= 1'b0; //create frame pulses. TBH, I still don't know what they do exactly, but they are crucial for ARM->FPGA transfer. If the frame is in the beginning of the byte, transfer slows to a crawl for some reason // took me a day to figure THAT out. - if(( (~speed) && (ssp_cnt[8:0] == 9'd31)) || (speed && ssp_cnt[7:0] == 8'd15)) - begin - ssp_frame <= 1'b1; - end - if(( (~speed) && (ssp_cnt[8:0] == 9'b1011111)) || (speed &&ssp_cnt[7:0] == 8'b101111) ) - begin - ssp_frame <= 1'b0; - end + if(( (~speed) && (ssp_cnt[8:0] == 9'd31)) || (speed && ssp_cnt[7:0] == 8'd15)) + begin + ssp_frame <= 1'b1; + end + if(( (~speed) && (ssp_cnt[8:0] == 9'b1011111)) || (speed &&ssp_cnt[7:0] == 8'b101111) ) + begin + ssp_frame <= 1'b0; + end end //previous signal value, mostly to detect SYNC @@ -144,206 +144,200 @@ reg[7:0] mid = 8'd128; // reg sending = 1'b0; // are we actively modulating? reg [11:0] bit_counts = 12'd0; // for timeslots. only support ts=0 for now, at 212 speed -512 fullbits from end of frame. One hopes. might remove those? - //we need some way to flush bit_counts triggers on mod_type changes don't compile reg dlay; always @(negedge adc_clk) // every data ping? begin - //envelope follow code... + //envelope follow code... //////////// - if (fccount == bitmlen) - begin + if (fccount == bitmlen) + begin if ((~try_sync) && (adc_d < curminthres) && disabl ) begin - fccount <= 1; - end - else - begin - fccount <= 0; - end - dlay <= ssp_dout; - if (bit_counts > 768) // should be over ts0 now, without ARM interference... stop counting... - begin - bit_counts <= 0; - end - else - if (power) - bit_counts <= 0; - else - bit_counts <= bit_counts + 1; + fccount <= 1; end else begin + fccount <= 0; + end + dlay <= ssp_dout; + if (bit_counts > 768) // should be over ts0 now, without ARM interference... stop counting... + begin + bit_counts <= 0; + end + else + if (power) + bit_counts <= 0; + else + bit_counts <= bit_counts + 1; + end + else + begin if((~try_sync) && (adc_d < curminthres) && disabl) begin - fccount <= 1; - end - else - begin - fccount <= fccount + 1; - end + fccount <= 1; end + else + begin + fccount <= fccount + 1; + end + end - // rising edge - if (adc_d > curmaxthres) - begin + // rising edge + if (adc_d > curmaxthres) + begin case (state) - 0: begin - curmax <= adc_d > `imax? adc_d : `imax; - state <= 2; + 0: begin + curmax <= adc_d > `imax? adc_d : `imax; + state <= 2; end - 1: begin - curminthres <= ((curmin >> 1) + (curmin >> 2) + (curmin >> 4) + (curmax >> 3) + (curmax >> 4)); //threshold: 0.1875 max + 0.8125 min - curmaxthres <= ((curmax >> 1) + (curmax >> 2) + (curmax >> 4) + (curmin >> 3) + (curmin >> 4)); - curmax <= adc_d > 155 ? adc_d : 155; // to hopefully prevent overflow from spikes going up to 255 - state <= 2; + 1: begin + curminthres <= ((curmin >> 1) + (curmin >> 2) + (curmin >> 4) + (curmax >> 3) + (curmax >> 4)); //threshold: 0.1875 max + 0.8125 min + curmaxthres <= ((curmax >> 1) + (curmax >> 2) + (curmax >> 4) + (curmin >> 3) + (curmin >> 4)); + curmax <= adc_d > 155 ? adc_d : 155; // to hopefully prevent overflow from spikes going up to 255 + state <= 2; end - 2: begin - if (adc_d > curmax) - curmax <= adc_d; - end - default: + 2: begin + if (adc_d > curmax) + curmax <= adc_d; + end + default: begin end endcase after_hysteresis <= 1'b1; if(try_sync) - tsinceedge <= 0; - end - else if (adc_d> 1) + (curmin >> 2) + (curmin >> 4) + (curmax >> 3) + (curmax >> 4)); curmaxthres <= ( (curmax >> 1) + (curmax >> 2) + (curmax >> 4) + (curmin >> 3) + (curmin >> 4)); curmin <= adc_d < `imin ? adc_d : `imin; state <= 1; - end - default: - begin - end - endcase - after_hysteresis <= 0; - if (~try_sync ) //begin modulation, lower edge... - begin - try_sync <= 1; - fccount <= 1; - did_sync <= 0; - curbit <= 0; - mid <= 8'd127; - tsinceedge <= 0; - prv <= 1; - end - else - begin - tsinceedge <= 0; - end - end - else //stable state, low or high - begin - curminthres <= ( (curmin >> 1) + (curmin >> 2) + (curmin >> 4) + (curmax >> 3) + (curmax >> 4)); - curmaxthres <= ( (curmax >> 1) + (curmax >> 2) + (curmax >> 4) + (curmin >> 3) + (curmin >> 4)); - state <= 0; - - if (try_sync ) - begin - if (tsinceedge >= (128)) - begin - //we might need to start counting... assuming ARM wants to reply to the frame. - bit_counts <= 1;// i think? 128 is about 2 bits passed... but 1 also works - try_sync <= 0; - did_sync <= 0;//desync - curmin <= `imin; //reset envelope - curmax <= `imax; - curminthres <= `ithrmin; - curmaxthres <= `ithrmax; - prv <= 1; - tsinceedge <= 0; - after_hysteresis <= 1'b1; - curbit <= 0; - mid <= 8'd128; - end - else - tsinceedge <= (tsinceedge + 1); - end - end - - - if (try_sync && tsinceedge < 128) + end + default: begin - //detect bits in their middle ssp sampling is in sync, so it would sample all bits in order - if (fccount == bithalf) - begin - if ((~did_sync) && ((prv == 1 && (mid > 128))||(prv == 0 && (mid <= 128)))) - begin - //sync the Zero, and set curbit roperly - did_sync <= 1'b1; - zero <= ~prv;// 1-prv - curbit <= 1; - end + end + endcase + after_hysteresis <= 0; + if (~try_sync ) //begin modulation, lower edge... + begin + try_sync <= 1; + fccount <= 1; + did_sync <= 0; + curbit <= 0; + mid <= 8'd127; + tsinceedge <= 0; + prv <= 1; + end + else + begin + tsinceedge <= 0; + end + end + else //stable state, low or high + begin + curminthres <= ( (curmin >> 1) + (curmin >> 2) + (curmin >> 4) + (curmax >> 3) + (curmax >> 4)); + curmaxthres <= ( (curmax >> 1) + (curmax >> 2) + (curmax >> 4) + (curmin >> 3) + (curmin >> 4)); + state <= 0; + + if (try_sync ) + begin + if (tsinceedge >= (128)) + begin + //we might need to start counting... assuming ARM wants to reply to the frame. + bit_counts <= 1;// i think? 128 is about 2 bits passed... but 1 also works + try_sync <= 0; + did_sync <= 0;//desync + curmin <= `imin; //reset envelope + curmax <= `imax; + curminthres <= `ithrmin; + curmaxthres <= `ithrmax; + prv <= 1; + tsinceedge <= 0; + after_hysteresis <= 1'b1; + curbit <= 0; + mid <= 8'd128; + end + else + tsinceedge <= (tsinceedge + 1); + end + end + + if (try_sync && tsinceedge < 128) + begin + //detect bits in their middle ssp sampling is in sync, so it would sample all bits in order + if (fccount == bithalf) + begin + if ((~did_sync) && ((prv == 1 && (mid > 128))||(prv == 0 && (mid <= 128)))) + begin + //sync the Zero, and set curbit roperly + did_sync <= 1'b1; + zero <= ~prv;// 1-prv + curbit <= 1; + end + else + curbit <= (mid > 128) ? (~zero) : zero; + + prv <= (mid > 128) ? 1 : 0; + + if (adc_d > curmaxthres) + mid <= 8'd129; + else if (adc_d < curminthres) + mid <= 8'd127; + else + begin + if (after_hysteresis) + begin + mid <= 8'd129; + end else - curbit <= (mid > 128) ? (~zero) : zero; - - prv <= (mid > 128) ? 1 : 0; - - if (adc_d > curmaxthres) - mid <= 8'd129; - else if (adc_d < curminthres) - mid <= 8'd127; - else - begin - if (after_hysteresis) - begin - mid <= 8'd129; - end - else - begin - mid <= 8'd127; - end - end - - end - else - begin - if (fccount==bitmlen) - begin - // fccount <= 0; - prv <= (mid > 128) ? 1 : 0; - mid <= 128; - end - else - begin + begin + mid <= 8'd127; + end + end + end + else + begin + if (fccount==bitmlen) + begin + // fccount <= 0; + prv <= (mid > 128) ? 1 : 0; + mid <= 128; + end + else + begin // minimum-maximum calc - if(adc_d > curmaxthres) - mid <= mid + 1; - else if (adc_d < curminthres) + if(adc_d > curmaxthres) + mid <= mid + 1; + else if (adc_d < curminthres) mid <= mid - 1; - else + else begin - if (after_hysteresis) - begin - mid <= mid + 1; - end - else - begin - mid <= mid - 1; - end + if (after_hysteresis) + begin + mid <= mid + 1; + end + else + begin + mid <= mid - 1; + end end - end - end end - else - begin - end -// sending <= 0; + end + end +// sending <= 0; end //put modulation here to maintain the correct clock. Seems that some readers are sensitive to that @@ -353,23 +347,23 @@ wire mod = ((fccount >= bithalf) ^ dlay) & (~disabl); always @(ck_1356meg or ssp_dout or power or disabl or mod) begin if (power) - begin + begin pwr_hi <= ck_1356meg; pwr_lo <= 1'b0; pwr_oe1 <= 1'b0;//mod; pwr_oe2 <= 1'b0;//mod; pwr_oe3 <= 1'b0;//mod; pwr_oe4 <= mod;//1'b0; - end + end else - begin + begin pwr_hi <= 1'b0; pwr_lo <= 1'b0; pwr_oe1 <= 1'b0; pwr_oe2 <= 1'b0; pwr_oe3 <= 1'b0; pwr_oe4 <= mod; - end + end end endmodule diff --git a/fpga/hi_get_trace.v b/fpga/hi_get_trace.v index cd33173b2..b577ff6be 100644 --- a/fpga/hi_get_trace.v +++ b/fpga/hi_get_trace.v @@ -105,13 +105,12 @@ begin write_enable1 <= 1'b0; write_enable2 <= 1'b0; if (previous_major_mode != `FPGA_MAJOR_MODE_OFF && previous_major_mode != `FPGA_MAJOR_MODE_HF_GET_TRACE) // just switched off - begin + begin start_addr <= addr; - end + end end end - // (2+1)k RAM reg [7:0] D_out1, D_out2; reg [7:0] ram1 [2047:0]; // 2048 u8 @@ -127,7 +126,7 @@ begin else D_out1 <= ram1[addr[10:0]]; if (write_enable2) -begin + begin ram2[addr[9:0]] <= adc_d; D_out2 <= adc_d; end @@ -135,7 +134,6 @@ begin D_out2 <= ram2[addr[9:0]]; end - reg [7:0] shift_out; always @(negedge ck_1356megb) @@ -150,10 +148,10 @@ begin shift_out <= D_out2; end else - begin - // or shift left - shift_out[7:1] <= shift_out[6:0]; - end + begin + // or shift left + shift_out[7:1] <= shift_out[6:0]; + end end ssp_clk <= ~clock_cnt[3]; // ssp_clk frequency = 13,56MHz / 16 = 847,5 kHz diff --git a/fpga/hi_iso14443a.v b/fpga/hi_iso14443a.v index 182b66f7e..0ceac6d95 100644 --- a/fpga/hi_iso14443a.v +++ b/fpga/hi_iso14443a.v @@ -104,8 +104,6 @@ begin end end - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tag -> PM3 // filter the input for a tag's signal. The filter box needs the 4 previous input values and is a gaussian derivative filter @@ -132,7 +130,6 @@ wire [9:0] tmp2 = adc_d_times_2 + input_prev_1; // convert intermediate signals to signed and calculate the filter output wire signed [10:0] adc_d_filtered = {1'b0, tmp1} - {1'b0, tmp2}; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // internal FPGA timing. Maximum required period is 128 carrier clock cycles for a full 8 Bit transfer to ARM. (i.e. we need a // 7 bit counter). Adjust its frequency to external reader's clock when simulating a tag or sniffing. @@ -176,7 +173,6 @@ begin end end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tag -> PM3: // determine best possible time for starting/resetting the modulation detector. @@ -208,7 +204,6 @@ begin end end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tag -> PM3: // modulation detector. Looks for the steepest falling and rising edges within a 16 clock period. If there is both a significant @@ -228,27 +223,27 @@ always @(negedge adc_clk) begin if(negedge_cnt[3:0] == mod_detect_reset_time) begin - if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) - begin - // detect modulation signal: if modulating, there must have been a falling AND a rising edge - if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLDHIGH) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLDHIGH)) - curbit <= 1'b1; // modulation - else - curbit <= 1'b0; // no modulation - end - else - begin - // detect modulation signal: if modulating, there must have been a falling AND a rising edge - if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLD) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLD)) - curbit <= 1'b1; // modulation - else - curbit <= 1'b0; // no modulation - end + if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) + begin + // detect modulation signal: if modulating, there must have been a falling AND a rising edge + if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLDHIGH) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLDHIGH)) + curbit <= 1'b1; // modulation + else + curbit <= 1'b0; // no modulation + end + else + begin + // detect modulation signal: if modulating, there must have been a falling AND a rising edge + if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLD) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLD)) + curbit <= 1'b1; // modulation + else + curbit <= 1'b0; // no modulation + end // reset modulation detector rx_mod_rising_edge_max <= 0; rx_mod_falling_edge_max <= 0; end - else // look for steepest edges (slopes) + else // look for steepest edges (slopes) begin if (adc_d_filtered > 0) begin @@ -264,7 +259,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tag+Reader -> PM3 // sample 4 bits reader data and 4 bits tag data for sniffing @@ -280,7 +274,6 @@ begin end end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader: // a delay line to ensure that we send the (emulated) tag's answer at the correct time according to ISO14443-3 @@ -303,7 +296,6 @@ begin end end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader, internal timing: // a timer for the 1172 cycles fdt (Frame Delay Time). Start the timer with a rising edge of the reader's signal. @@ -366,7 +358,6 @@ begin if(fdt_counter == `FDT_INDICATOR_COUNT) fdt_indicator <= 1'b1; end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader or Tag // assign a modulation signal to the antenna. This signal is either a delayed signal (to achieve fdt when sending to a reader) @@ -395,7 +386,6 @@ begin end end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader // determine the required delay in the mod_sig_buf (set mod_sig_ptr). @@ -438,7 +428,6 @@ begin end end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FPGA -> ARM communication: // buffer 8 bits data to be sent to ARM. Shift them out bit by bit. @@ -482,10 +471,8 @@ begin to_arm[7:1] <= to_arm[6:0]; end end - end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FPGA <-> ARM communication: // generate a ssp clock and ssp frame signal for the synchronous transfer from/to the ARM @@ -520,7 +507,6 @@ begin end end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FPGA -> ARM communication: // select the data to be sent to ARM @@ -565,7 +551,6 @@ assign sub_carrier = ~sub_carrier_cnt[3]; // in FPGA_HF_ISO14443A_READER_LISTEN: carrier always on; in other modes: carrier always off assign pwr_hi = (ck_1356meg & (((mod_type == `FPGA_HF_ISO14443A_READER_MOD) & ~mod_sig_coil) || (mod_type == `FPGA_HF_ISO14443A_READER_LISTEN))); - // Enable HF antenna drivers: assign pwr_oe1 = 1'b0; assign pwr_oe3 = 1'b0; diff --git a/fpga/hi_simulate.v b/fpga/hi_simulate.v index 2d8ff2771..77b9a44ed 100644 --- a/fpga/hi_simulate.v +++ b/fpga/hi_simulate.v @@ -88,7 +88,6 @@ begin end end - // Divide 13.56 MHz to produce various frequencies for SSP_CLK // and modulation. reg [8:0] ssp_clk_divider; @@ -99,17 +98,16 @@ always @(negedge adc_clk) always @(negedge adc_clk) begin if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K_8BIT) - // Get bit every at 53KHz (every 8th carrier bit of 424kHz) - ssp_clk <= ~ssp_clk_divider[7]; + // Get bit every at 53KHz (every 8th carrier bit of 424kHz) + ssp_clk <= ~ssp_clk_divider[7]; else if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) - // Get next bit at 212kHz - ssp_clk <= ~ssp_clk_divider[5]; + // Get next bit at 212kHz + ssp_clk <= ~ssp_clk_divider[5]; else - // Get next bit at 424kHz - ssp_clk <= ~ssp_clk_divider[4]; + // Get next bit at 424kHz + ssp_clk <= ~ssp_clk_divider[4]; end - // Produce the byte framing signal; the phase of this signal // is arbitrary, because it's just a bit stream in this module. always @(negedge adc_clk) @@ -130,7 +128,6 @@ begin end end - // Synchronize up the after-hysteresis signal, to produce DIN. always @(posedge ssp_clk) ssp_din = after_hysteresis; @@ -147,9 +144,7 @@ always @(*) else if(mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K || mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K_8BIT) modulating_carrier <= ssp_dout & ssp_clk_divider[4]; // switch 424kHz modulation on/off else - modulating_carrier <= 1'b0; // yet unused - - + modulating_carrier <= 1'b0; // yet unused // Load modulation. Toggle only one of these, since we are already producing much deeper // modulation than a real tag would. diff --git a/fpga/lf_edge_detect.v b/fpga/lf_edge_detect.v index 1e4cd0cce..27d7f6901 100644 --- a/fpga/lf_edge_detect.v +++ b/fpga/lf_edge_detect.v @@ -1,4 +1,3 @@ - //----------------------------------------------------------------------------- // Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. // @@ -30,73 +29,74 @@ module lf_edge_detect( output edge_toggle ); - min_max_tracker tracker( - .clk (clk), - .adc_d (adc_d), - .threshold (lf_ed_threshold), - .min (min), - .max (max) +min_max_tracker tracker( + .clk (clk), + .adc_d (adc_d), + .threshold (lf_ed_threshold), + .min (min), + .max (max) ); - // auto-tune - assign high_threshold = (max + min) / 2 + (max - min) / 4; - assign highz_threshold = (max + min) / 2 + (max - min) / 8; - assign lowz_threshold = (max + min) / 2 - (max - min) / 8; - assign low_threshold = (max + min) / 2 - (max - min) / 4; +// auto-tune +assign high_threshold = (max + min) / 2 + (max - min) / 4; +assign highz_threshold = (max + min) / 2 + (max - min) / 8; +assign lowz_threshold = (max + min) / 2 - (max - min) / 8; +assign low_threshold = (max + min) / 2 - (max - min) / 4; - // heuristic to see if it makes sense to try to detect an edge - wire enabled = - (high_threshold > highz_threshold) - & (highz_threshold > lowz_threshold) - & (lowz_threshold > low_threshold) - & ((high_threshold - highz_threshold) > 8) - & ((highz_threshold - lowz_threshold) > 16) - & ((lowz_threshold - low_threshold) > 8); +// heuristic to see if it makes sense to try to detect an edge +wire enabled = + (high_threshold > highz_threshold) + & (highz_threshold > lowz_threshold) + & (lowz_threshold > low_threshold) + & ((high_threshold - highz_threshold) > 8) + & ((highz_threshold - lowz_threshold) > 16) + & ((lowz_threshold - low_threshold) > 8); - // Toggle the output with hysteresis - // Set to high if the ADC value is above the threshold - // Set to low if the ADC value is below the threshold - reg is_high = 0; - reg is_low = 0; - reg is_zero = 0; - reg trigger_enabled = 1; - reg output_edge = 0; - reg output_state; +// Toggle the output with hysteresis +// Set to high if the ADC value is above the threshold +// Set to low if the ADC value is below the threshold +reg is_high = 0; +reg is_low = 0; +reg is_zero = 0; +reg trigger_enabled = 1; +reg output_edge = 0; +reg output_state; - always @(posedge clk) +always @(posedge clk) +begin + is_high <= (adc_d >= high_threshold); + is_low <= (adc_d <= low_threshold); + is_zero <= ((adc_d > lowz_threshold) & (adc_d < highz_threshold)); +end + +// all edges detection +always @(posedge clk) +if (enabled) +begin + // To enable detecting two consecutive peaks at the same level + // (low or high) we check whether or not we went back near 0 in-between. + // This extra check is necessary to prevent from noise artifacts + // around the threshold values. + if (trigger_enabled & (is_high | is_low)) begin - is_high <= (adc_d >= high_threshold); - is_low <= (adc_d <= low_threshold); - is_zero <= ((adc_d > lowz_threshold) & (adc_d < highz_threshold)); + output_edge <= ~output_edge; + trigger_enabled <= 0; end + else + trigger_enabled <= trigger_enabled | is_zero; +end - // all edges detection - always @(posedge clk) - if (enabled) - begin - // To enable detecting two consecutive peaks at the same level - // (low or high) we check whether or not we went back near 0 in-between. - // This extra check is necessary to prevent from noise artifacts - // around the threshold values. - if (trigger_enabled & (is_high | is_low)) - begin - output_edge <= ~output_edge; - trigger_enabled <= 0; - end else - trigger_enabled <= trigger_enabled | is_zero; - end +// edge states +always @(posedge clk) +if (enabled) +begin + if (is_high) + output_state <= 1'd1; + else if (is_low) + output_state <= 1'd0; +end - // edge states - always @(posedge clk) - if (enabled) - begin - if (is_high) - output_state <= 1'd1; - else if (is_low) - output_state <= 1'd0; - end - - assign edge_state = output_state; - assign edge_toggle = output_edge; +assign edge_state = output_state; +assign edge_toggle = output_edge; endmodule diff --git a/fpga/lo_edge_detect.v b/fpga/lo_edge_detect.v index 9bf408cc7..c29fdccb3 100644 --- a/fpga/lo_edge_detect.v +++ b/fpga/lo_edge_detect.v @@ -51,8 +51,8 @@ wire tag_modulation = ssp_dout & !lf_field; wire reader_modulation = !ssp_dout & lf_field & pck_divclk; // No logic, straight through. -assign pwr_oe1 = 1'b0; // not used in LF mode -assign pwr_oe3 = 1'b0; // base antenna load = 33 Ohms +assign pwr_oe1 = 1'b0; // not used in LF mode +assign pwr_oe3 = 1'b0; // base antenna load = 33 Ohms // when modulating, add another 33 Ohms and 10k Ohms in parallel: assign pwr_oe2 = tag_modulation; assign pwr_oe4 = tag_modulation; diff --git a/fpga/lo_read.v b/fpga/lo_read.v index 06bd0ae5a..c51857eb4 100644 --- a/fpga/lo_read.v +++ b/fpga/lo_read.v @@ -51,7 +51,7 @@ reg [7:0] to_arm_shiftreg; // we read the ADC value when pck_cnt=7 and shift it out on counts 8..15 always @(posedge pck0) begin - if((pck_cnt == 8'd7) && !pck_divclk) + if ((pck_cnt == 8'd7) && !pck_divclk) to_arm_shiftreg <= adc_d; else begin @@ -73,14 +73,15 @@ end // _ _ _ _ _ _ _ _ _ _ // ssp_clk |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ -// serialized SSP data is gated by ant_lo to suppress unwanted signal +// serialized SSP data is gated by pck_divclk to suppress unwanted signal assign ssp_din = to_arm_shiftreg[7] && !pck_divclk; // SSP clock always runs at 24MHz assign ssp_clk = pck0; -// SSP frame is gated by ant_lo and goes high when pck_divider=8..15 +// SSP frame is gated by pck_divclk and goes high when pck_cnt=8..15 assign ssp_frame = (pck_cnt[7:3] == 5'd1) && !pck_divclk; // unused signals tied low assign pwr_hi = 1'b0; +// always on outputs, unused assign pwr_oe1 = 1'b0; assign pwr_oe2 = 1'b0; assign pwr_oe3 = 1'b0; diff --git a/fpga/min_max_tracker.v b/fpga/min_max_tracker.v index 2f6e06017..2aaab66bb 100644 --- a/fpga/min_max_tracker.v +++ b/fpga/min_max_tracker.v @@ -31,50 +31,50 @@ module min_max_tracker( output [7:0] max ); - reg [7:0] min_val = 255; - reg [7:0] max_val = 0; - reg [7:0] cur_min_val = 255; - reg [7:0] cur_max_val = 0; - reg [1:0] state = 0; +reg [7:0] min_val = 255; +reg [7:0] max_val = 0; +reg [7:0] cur_min_val = 255; +reg [7:0] cur_max_val = 0; +reg [1:0] state = 0; - always @(posedge clk) - begin - case (state) - 0: // initialize - begin - if (cur_max_val >= ({1'b0, adc_d} + threshold)) - state <= 2; - else if (adc_d >= ({1'b0, cur_min_val} + threshold)) - state <= 1; - if (cur_max_val <= adc_d) - cur_max_val <= adc_d; - else if (adc_d <= cur_min_val) - cur_min_val <= adc_d; +always @(posedge clk) +begin + case (state) + 0: // initialize + begin + if (cur_max_val >= ({1'b0, adc_d} + threshold)) + state <= 2; + else if (adc_d >= ({1'b0, cur_min_val} + threshold)) + state <= 1; + if (cur_max_val <= adc_d) + cur_max_val <= adc_d; + else if (adc_d <= cur_min_val) + cur_min_val <= adc_d; + end + 1: // high phase + begin + if (cur_max_val <= adc_d) + cur_max_val <= adc_d; + else if (({1'b0, adc_d} + threshold) <= cur_max_val) begin + state <= 2; + cur_min_val <= adc_d; + max_val <= cur_max_val; end - 1: // high phase - begin - if (cur_max_val <= adc_d) - cur_max_val <= adc_d; - else if (({1'b0, adc_d} + threshold) <= cur_max_val) begin - state <= 2; - cur_min_val <= adc_d; - max_val <= cur_max_val; - end + end + 2: // low phase + begin + if (adc_d <= cur_min_val) + cur_min_val <= adc_d; + else if (adc_d >= ({1'b0, cur_min_val} + threshold)) begin + state <= 1; + cur_max_val <= adc_d; + min_val <= cur_min_val; end - 2: // low phase - begin - if (adc_d <= cur_min_val) - cur_min_val <= adc_d; - else if (adc_d >= ({1'b0, cur_min_val} + threshold)) begin - state <= 1; - cur_max_val <= adc_d; - min_val <= cur_min_val; - end - end - endcase - end + end + endcase +end - assign min = min_val; - assign max = max_val; +assign min = min_val; +assign max = max_val; endmodule From f47e4ed115176d76ee4caaf6246d344300818126 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 24 Aug 2023 18:22:50 +0200 Subject: [PATCH 879/924] Move hardcoded value where it belongs Keep FPGA parameters together in the same place --- client/src/cmdhw.c | 3 ++- common_fpga/fpga.h | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index ec3ab4867..1b2cd5459 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -27,6 +27,7 @@ #include "comms.h" #include "usart_defs.h" #include "ui.h" +#include "fpga.h" #include "cmdhw.h" #include "cmddata.h" #include "commonutil.h" @@ -1392,7 +1393,7 @@ void pm3_version(bool verbose, bool oneliner) { } } PrintAndLogEx(NORMAL, payload->versionstr); - if (strstr(payload->versionstr, "2s30vq100") == NULL) { + if (strstr(payload->versionstr, FPGA_TYPE) == NULL) { PrintAndLogEx(NORMAL, " FPGA firmware... %s", _RED_("chip mismatch")); } diff --git a/common_fpga/fpga.h b/common_fpga/fpga.h index b7e017d68..35143ec6f 100644 --- a/common_fpga/fpga.h +++ b/common_fpga/fpga.h @@ -23,9 +23,11 @@ #define FPGA_BITSTREAM_FIXED_HEADER_SIZE sizeof(bitparse_fixed_header) #define FPGA_INTERLEAVE_SIZE 288 #if defined XC3 -#define FPGA_CONFIG_SIZE 72864L // our current fpga_[lh]f.bit files are 72742 bytes. Rounded up to next multiple of FPGA_INTERLEAVE_SIZE +#define FPGA_TYPE "3s100evq100" +#define FPGA_CONFIG_SIZE 72864L // FPGA .bit file rounded up to next multiple of FPGA_INTERLEAVE_SIZE #else -#define FPGA_CONFIG_SIZE 42336L // our current fpga_[lh]f.bit files are 42175 bytes. Rounded up to next multiple of FPGA_INTERLEAVE_SIZE +#define FPGA_TYPE "2s30vq100" +#define FPGA_CONFIG_SIZE 42336L // FPGA .bit file rounded up to next multiple of FPGA_INTERLEAVE_SIZE #endif #define FPGA_RING_BUFFER_BYTES (1024 * 30) #define FPGA_TRACE_SIZE 3072 From 15ee28c7be1ce06946c71b090bed5dce75236ec1 Mon Sep 17 00:00:00 2001 From: kormax <3392860+kormax@users.noreply.github.com> Date: Thu, 24 Aug 2023 21:39:59 +0300 Subject: [PATCH 880/924] Add SEOS AIDs --- client/resources/aidlist.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/client/resources/aidlist.json b/client/resources/aidlist.json index 9173d0a10..6eeba5e28 100644 --- a/client/resources/aidlist.json +++ b/client/resources/aidlist.json @@ -2406,5 +2406,21 @@ "Name": "AirDrop connection negotiation", "Description": "Used by NFC-based AirDrop negotiation added in IOS17", "Type": "" + }, + { + "AID": "a0000004400001010001", + "Vendor": "HID Global", + "Country": "", + "Name": "SEOS", + "Description": "Used by both by physical cards and mobile implementations", + "Type": "access" + }, + { + "AID": "A00000054000060100010000FF", + "Vendor": "HID Global", + "Country": "", + "Name": "SEOS Mobile", + "Description": "Declared by some SEOS-compatible applications for HCE", + "Type": "access" } ] From 96eededb8c40006ef682255845d489f7075ff63e Mon Sep 17 00:00:00 2001 From: kormax <3392860+kormax@users.noreply.github.com> Date: Thu, 24 Aug 2023 21:40:53 +0300 Subject: [PATCH 881/924] Remove duplicate MFP command definitions --- include/protocols.h | 51 --------------------------------------------- 1 file changed, 51 deletions(-) diff --git a/include/protocols.h b/include/protocols.h index 516cdf7d3..b4de7da1a 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -624,57 +624,6 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MFDES_E_FILE_NOT_FOUND 0xF0 #define MFDES_E_FILE_INTEGRITY 0xF1 -// MIFARE PLus EV2 Command set -// source: https://www.nxp.com/docs/en/data-sheet/MF1P(H)x2.pdf in Look-Up Tables - -#define MFP_READ_SIG 0x3C // same as DESFIRE -#define MFP_WRITEPERSO 0xA8 -#define MFP_COMMITPERSO 0xAA - -#define MFP_AUTHENTICATEFIRST 0x70 -#define MFP_AUTHENTICATEFIRST_VARIANT 0x73 -#define MFP_AUTHENTICATENONFIRST 0x76 -#define MFP_AUTHENTICATECONTINUE 0x72 -#define MFP_AUTHENTICATESECTORSWITCH 0x7A -#define MFP_RESETAUTH 0x78 - -#define MFP_VCSUPPORTLASTISOL3 0x4B -#define MFP_ISOSELECT 0xA4 - -#define MFP_GETVERSION 0x60 // same as DESFIRE -#define MFP_ADDITIONALFRAME 0xAF -#define MFP_SETCONFIGSL1 0x44 -#define MFP_MF_PERSONALIZEUIDUSAGE 0x40 - -// read commands -#define MFP_READENCRYPTEDNOMAC_MACED 0X30 -#define MFP_READENCRYPTEDMAC_MACED 0x31 -#define MFP_READPLAINNOMAC_MACED 0x32 -#define MFP_READPLAINMAC_MACED 0x33 -#define MFP_READENCRYPTEDNOMAC_UNMACED 0x34 -#define MFP_READENCRYPTEDMAC_UNMACED 0X35 -#define MFP_READPLAINNOMAC_UNMACED 0x36 -#define MFP_READPLAINMAC_UNMACED 0x37 - -// write commands -#define MFP_WRITEENCRYPTEDNOMAC 0xA0 -#define MFP_WRITEENCRYPTEDMAC 0xA1 -#define MFP_WRITEPLAINNOMAC 0xA2 -#define MFP_WRITEPLAINMAC 0xA3 - -// value commands -#define MFP_INCREMENTNOMAC 0xB0 -#define MFP_INCREMENTMAC 0xB1 -#define MFP_DECREMENTNOMAC 0xB2 -#define MFP_DECREMENTMAC 0xB3 -#define MFP_TRANSFERNOMAC 0xB4 -#define MFP_TRANSFERMAC 0xB5 -#define MFP_INCREMENTTRANSFERNOMAC 0xB6 -#define MFP_INCREMENTTRANSFERMAC 0xB7 -#define MFP_DECREMENTTRANSFERNOMAC 0xB8 -#define MFP_DECREMENTTRANSFERMAC 0xB9 -#define MFP_RESTORENOMAC 0xC2 -#define MFP_RESTOREMAC 0xC3 // MIFARE PLus EV2 Command set // source: https://www.nxp.com/docs/en/data-sheet/MF1P(H)x2.pdf in Look-Up Tables From 923be3f54d1424b8f4819fbc55f5b4feea078f17 Mon Sep 17 00:00:00 2001 From: Simon Van Mello <90702729+SimonVanMello@users.noreply.github.com> Date: Fri, 25 Aug 2023 23:20:55 +0200 Subject: [PATCH 882/924] fix typo Signed-off-by: Simon Van Mello <90702729+SimonVanMello@users.noreply.github.com> --- doc/T5577_Guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/T5577_Guide.md b/doc/T5577_Guide.md index 6c4eceaf5..ded308676 100644 --- a/doc/T5577_Guide.md +++ b/doc/T5577_Guide.md @@ -142,7 +142,7 @@ developers have done a great job and gave us commands. What we need to know is that with the T5577, data is read/written one complete block at a time. Each block holds 32 bits of data (hence the binary output shown) -Since we know that the card has data and configuration blocks, lets say +Since we know that the card has data and configuration blocks, lets stay away from those while we learn how to read and write. I suggest you follow along and perform each command and check the results as we go. From 007e8b9e5af4caab06c2768c58c95ee08ba50836 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 26 Aug 2023 12:01:55 +0200 Subject: [PATCH 883/924] added a section about time units --- doc/clocks.md | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/doc/clocks.md b/doc/clocks.md index 161d680fb..b2ba3c995 100644 --- a/doc/clocks.md +++ b/doc/clocks.md @@ -7,6 +7,7 @@ The device side firmware uses a range of different clocks. Here is an attempt t # Table of Contents - [Notes on device side clocks](#notes-on-device-side-clocks) - [Table of Contents](#table-of-contents) + - [Units](#units) - [Slow clock](#slow-clock) - [Main Oscillator / MAINCK](#main-oscillator--mainck) - [PLL clock](#pll-clock) @@ -15,9 +16,48 @@ The device side firmware uses a range of different clocks. Here is an attempt t - [1 kHz RTC: TickCount functions](#1-khz-rtc-tickcount-functions) - [Occasional PWM timer](#occasional-pwm-timer) - [Occasional TC0+TC1 / CountUS functions](#occasional-tc0tc1--countus-functions) - - [Occasional TC0+TC1+TC2 SSP_CLK from FPGA / CountSspClk functions](#occasional-tc0tc1tc2-ssp_clk-from-fpga--countsspclk-functions) + - [Occasional TC0+TC1+TC2 SSP\_CLK from FPGA / CountSspClk functions](#occasional-tc0tc1tc2-ssp_clk-from-fpga--countsspclk-functions) - [Occasional TC0+TC1 / Ticks functions](#occasional-tc0tc1--ticks-functions) + +## Units +^[Top](#top) + +Good calculator +https://www.unitjuggler.com/convert-frequency-from-MHz-to-ns(p).html?val=3.39 + +Basic units of time measurment or how long in time is a Hertz? + +``` +1 hertz = 1 second = 1000 milli seconds +10 Hertz = 1 / 10 = 0,1 = 100 milli seconds +100 Hertz = 1 / 100 = 0,01 = 10 milli seconds +1 kHz = 1 / 1000 = 0,001 = 1 milli seconds +10 kHz = 1 / 10 000 = 0,000 1 = 100 micro seconds +100 kHz = 1 / 100 000 = 0,000 01 = 10 micro seconds +1 MHZ = 1 / 1 000 000 = 0,000 001 = 1 micro seconds +``` + +- kHz, Kilo Hertz, 1000 Hertz +- MHz, Mega Hertz, 1000 000 Hertz + + +Basic units of time you will run into in the RFID world. + +``` +13.56 MHz = 1 / 13 560 000 = 73,74 nano seconds = 0,07374 micro seconds +125 kHz = 1/ 125 000 = 8 micro seconds +``` + +Given these units the following clocks used by Proxmark3 wil make more sense. + +Like the SSP Clock running at 3.39 MHz. +3.39 MHz = 1 / 3 390 000 = 294,98 nano seconds = 0,2949 micro seconds + +1 tick at 3.39 MHz is 294.98 nano seconds. + + + ## Slow clock ^[Top](#top) From 8a861aea5734e4d960ee00f5c0531ed98744b2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pa=C4=BEo?= Date: Sun, 27 Aug 2023 19:23:38 +0200 Subject: [PATCH 884/924] Change "Mac OS X" to "macOS" in documentation --- README.md | 8 ++++---- doc/md/Installation_Instructions/Troubleshooting.md | 2 +- ...tions.md => macOS-Compile-From-Source-Instructions.md} | 6 +++--- ...ons.md => macOS-Homebrew-Installation-Instructions.md} | 8 ++++---- ...ons.md => macOS-MacPorts-Installation-Instructions.md} | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) rename doc/md/Installation_Instructions/{Mac-OS-X-Compile-From-Source-Instructions.md => macOS-Compile-From-Source-Instructions.md} (82%) rename doc/md/Installation_Instructions/{Mac-OS-X-Homebrew-Installation-Instructions.md => macOS-Homebrew-Installation-Instructions.md} (96%) rename doc/md/Installation_Instructions/{Mac-OS-X-MacPorts-Installation-Instructions.md => macOS-MacPorts-Installation-Instructions.md} (97%) diff --git a/README.md b/README.md index 9096c9559..d65262674 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,9 @@ The Proxmark3 is the swiss-army tool of RFID, allowing for interactions with the | :------------------: | :------------------: | | [Linux - Setup and Build](/doc/md/Installation_Instructions/Linux-Installation-Instructions.md) | [Compilation Instructions](/doc/md/Use_of_Proxmark/0_Compilation-Instructions.md)| | [Linux - Important notes on ModemManager](/doc/md/Installation_Instructions/ModemManager-Must-Be-Discarded.md) | [Validating Proxmark3 Client Functionality](/doc/md/Use_of_Proxmark/1_Validation.md)| -| [Mac OS X - Homebrew & Upgrading HomeBrew Tap Formula](/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md) | [First Use and Verification](/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md)| -| [Mac OS X - MacPorts](/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md) | [Commands & Features](/doc/md/Use_of_Proxmark/3_Commands-and-Features.md)| -| [Mac OS X - Setup and Build](/doc/md/Installation_Instructions/Mac-OS-X-Compile-From-Source-Instructions.md) || +| [macOS - Homebrew & Upgrading HomeBrew Tap Formula](/doc/md/Installation_Instructions/macOS-Homebrew-Installation-Instructions.md) | [First Use and Verification](/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md)| +| [macOS - MacPorts](/doc/md/Installation_Instructions/macOS-MacPorts-Installation-Instructions.md) | [Commands & Features](/doc/md/Use_of_Proxmark/3_Commands-and-Features.md)| +| [macOS - Setup and Build](/doc/md/Installation_Instructions/macOS-Compile-From-Source-Instructions.md) || | [Windows - Setup and Build](/doc/md/Installation_Instructions/Windows-Installation-Instructions.md) || | [Termux / Android - Setup and Build](/doc/termux_notes.md) || | [Blue Shark Manual](/doc/bt_manual_v10.md) | [Command Cheat Sheet](/doc/cheatsheet.md)| @@ -184,7 +184,7 @@ This repo compiles nicely on - Windows/MinGW environment - Ubuntu, ParrotOS, Gentoo, Pentoo, Kali, NetHunter, Arch Linux, Fedora, Debian, Raspbian - Android / Termux - - Mac OS X / Homebrew (or MacPorts, experimental) / Apple Silicon M1 + - macOS / Homebrew (or MacPorts, experimental) / Apple Silicon M1 - Docker container - [ Iceman repo based ubuntu 18.04 container ](https://hub.docker.com/r/secopsconsult/proxmark3) - [ Iceman fork based container v1.7 ](https://hub.docker.com/r/iceman1001/proxmark3/) diff --git a/doc/md/Installation_Instructions/Troubleshooting.md b/doc/md/Installation_Instructions/Troubleshooting.md index d3fbab571..d63e49b75 100644 --- a/doc/md/Installation_Instructions/Troubleshooting.md +++ b/doc/md/Installation_Instructions/Troubleshooting.md @@ -38,7 +38,7 @@ client/proxmark3 ... Refer to the installation guide specific to your OS for details about ports. * [Linux](/doc/md/Installation_Instructions/Linux-Installation-Instructions.md) -* [Mac OSX](/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md) +* [macOS](/doc/md/Installation_Instructions/macOS-Homebrew-Installation-Instructions.md) * [Windows](/doc/md/Installation_Instructions/Windows-Installation-Instructions.md) Note that with the Bluetooth adapter, you *have to* use directly the client, and flasher over Bluetooth is not possible. diff --git a/doc/md/Installation_Instructions/Mac-OS-X-Compile-From-Source-Instructions.md b/doc/md/Installation_Instructions/macOS-Compile-From-Source-Instructions.md similarity index 82% rename from doc/md/Installation_Instructions/Mac-OS-X-Compile-From-Source-Instructions.md rename to doc/md/Installation_Instructions/macOS-Compile-From-Source-Instructions.md index 049ddb31d..c9f101a40 100644 --- a/doc/md/Installation_Instructions/Mac-OS-X-Compile-From-Source-Instructions.md +++ b/doc/md/Installation_Instructions/macOS-Compile-From-Source-Instructions.md @@ -1,9 +1,9 @@ -# Mac OS X - Compilation from source instructions +# macOS - Compilation from source instructions # Table of Contents -- [Mac OS X - Compilation from source instructions](x#mac-os-x---compilation-from-source-instructions) +- [macOS - Compilation from source instructions](#macos---compilation-from-source-instructions) - [Table of Contents](#table-of-contents) - [Follow Homebrew developer instructions](#follow-homebrew-developer-instructions) - [(optional) Running without sudo](#optional-running-without-sudo) @@ -12,7 +12,7 @@ ## Follow Homebrew developer instructions ^[Top](#top) -Follow the instructions here [developer instructions](/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md#homebrew-mac-os-x-developer-installation) and you are done. +Follow the instructions here [developer instructions](/doc/md/Installation_Instructions/macOS-Homebrew-Installation-Instructions.md#homebrew-macos-developer-installation) and you are done. ## (optional) Running without sudo ^[Top](#top) diff --git a/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md b/doc/md/Installation_Instructions/macOS-Homebrew-Installation-Instructions.md similarity index 96% rename from doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md rename to doc/md/Installation_Instructions/macOS-Homebrew-Installation-Instructions.md index 3b2e31530..c4622641a 100644 --- a/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/macOS-Homebrew-Installation-Instructions.md @@ -1,11 +1,11 @@ -# Mac OS X - Homebrew automatic installation +# macOS - Homebrew automatic installation # Table of Contents -- [Mac OS X - Homebrew automatic installation](#mac-os-x---homebrew-automatic-installation) +- [macOS - Homebrew automatic installation](#macos---homebrew-automatic-installation) - [Table of Contents](#table-of-contents) - [macOS Ventura Beta users](#macos-ventura-beta-users) - [Apple Silicon (M1) Notes](#apple-silicon-m1-notes) @@ -14,7 +14,7 @@ - [Flash the BOOTROM & FULLIMAGE](#flash-the-bootrom--fullimage) - [Run the client](#run-the-client) - [Next steps](#next-steps) -- [Homebrew (Mac OS X), developer installation](#homebrew-mac-os-x-developer-installation) +- [Homebrew (macOS), developer installation](#homebrew-macos-developer-installation) - [Clone the Iceman repository](#clone-the-iceman-repository) - [Compile the project](#compile-the-project) - [the button trick](#the-button-trick) @@ -151,7 +151,7 @@ For the next steps, please read the following pages: -# Homebrew (Mac OS X), developer installation +# Homebrew (macOS), developer installation ^[Top](#top) These instructions will show how to setup the environment on OSX to the point where you'll be able to clone and compile the repo by yourself, as on Linux, Windows, etc. diff --git a/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md b/doc/md/Installation_Instructions/macOS-MacPorts-Installation-Instructions.md similarity index 97% rename from doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md rename to doc/md/Installation_Instructions/macOS-MacPorts-Installation-Instructions.md index 2f05f3b98..2c36d1371 100644 --- a/doc/md/Installation_Instructions/Mac-OS-X-MacPorts-Installation-Instructions.md +++ b/doc/md/Installation_Instructions/macOS-MacPorts-Installation-Instructions.md @@ -1,10 +1,10 @@ -# Mac OS X - MacPorts automatic installation +# macOS - MacPorts automatic installation # Table of Contents -- [Mac OS X - MacPorts automatic installation](#mac-os-x---macports-automatic-installation) +- [macOS - MacPorts automatic installation](#macOS---macports-automatic-installation) - [Table of Contents](#table-of-contents) - [Main prerequisite](#main-prerequisite) - [Installing latest releases](#installing-latest-releases) From 114dda158290a8b57d000507b1efb0ea3b51a941 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 28 Aug 2023 12:00:44 +0200 Subject: [PATCH 885/924] After testing and verification its found that the SHALLOW MODULATION in HF is not working well in RDV4. Swapping from PWR_OE4 to PWR_OE1 makes it much better. Thanks to @d18c7db for solution and @gentlekiwi for testing and never giving up on finding the bug --- CHANGELOG.md | 1 + armsrc/fpgaloader.h | 1 + armsrc/iso14443b.c | 9 +++++++++ armsrc/iso15693.c | 5 +++++ fpga/define.v | 1 + fpga/fpga_icopyx_hf.bit | Bin 72749 -> 72749 bytes fpga/fpga_pm3_felica.bit | Bin 42176 -> 42176 bytes fpga/fpga_pm3_hf.bit | Bin 42172 -> 42172 bytes fpga/fpga_pm3_hf_15.bit | Bin 42175 -> 42175 bytes fpga/fpga_pm3_lf.bit | Bin 42172 -> 42172 bytes fpga/hi_reader.v | 9 +++++++-- 11 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1bd9deb5..637917d1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Swapped to OE1 for Shallow modulation on RDV4. Thanks to @gentlekiwi for testing (@d18c7db) - Changed iClass SIO and Legacy credential detection to be more reliable (@nvx) - Added `hf iclass esetblk` - set iClass emulator memory block data (@nvx) - Added cryptorf regressiontests (@iceman1001) diff --git a/armsrc/fpgaloader.h b/armsrc/fpgaloader.h index 3359643f1..a1869d5da 100644 --- a/armsrc/fpgaloader.h +++ b/armsrc/fpgaloader.h @@ -105,6 +105,7 @@ thres| x x x x x x x x #define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE (6<<0) #define FPGA_HF_READER_MODE_SNIFF_PHASE (7<<0) #define FPGA_HF_READER_MODE_SEND_JAM (8<<0) +#define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4 (9<<0) #define FPGA_HF_READER_SUBCARRIER_848_KHZ (0<<4) #define FPGA_HF_READER_SUBCARRIER_424_KHZ (1<<4) diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 7d28255e1..adfd52491 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -1407,7 +1407,11 @@ static void TransmitFor14443b_AsReader(uint32_t *start_time) { tosend_t *ts = get_tosend(); +#ifdef RDV4 + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4); +#else FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD); +#endif // TR2 minimum 14 ETUs if (*start_time < ISO14B_TR0) { @@ -2102,7 +2106,12 @@ void iso14443b_setup(void) { FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); // Signal field is on with the appropriate LED +#ifdef RDV4 + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4); +#else FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD); +#endif + SpinDelay(100); // Start the timer diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index 0c5e7c7ab..9a1f5be49 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -294,7 +294,12 @@ void CodeIso15693AsTag(const uint8_t *cmd, size_t len) { // Transmit the command (to the tag) that was placed in cmd[]. void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time, bool shallow_mod) { +#ifdef RDV4 + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | (shallow_mod ? FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4 : FPGA_HF_READER_MODE_SEND_FULL_MOD)); +#else FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | (shallow_mod ? FPGA_HF_READER_MODE_SEND_SHALLOW_MOD : FPGA_HF_READER_MODE_SEND_FULL_MOD)); +#endif + if (*start_time < DELAY_ARM_TO_TAG) { *start_time = DELAY_ARM_TO_TAG; diff --git a/fpga/define.v b/fpga/define.v index b7423278b..05cbd6d7e 100644 --- a/fpga/define.v +++ b/fpga/define.v @@ -129,6 +129,7 @@ `define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE 6 `define FPGA_HF_READER_MODE_SNIFF_PHASE 7 `define FPGA_HF_READER_MODE_SEND_JAM 8 +`define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD_RDV4 9 `define FPGA_HF_READER_SUBCARRIER_848_KHZ 0 `define FPGA_HF_READER_SUBCARRIER_424_KHZ 1 diff --git a/fpga/fpga_icopyx_hf.bit b/fpga/fpga_icopyx_hf.bit index 053f5cce888de824b6e65a7b2e8f8d9de4be3b8c..07a1a0bbd39a3dd1a2b84a58bad4b2779de19fc5 100644 GIT binary patch literal 72749 zcmeFa4|p8ac`y8)nOSLey^==K+7Tc-N3sG76)?6GuAm}05(^f@C5vOF#2*Q3Ag;+x z(}j}8P1ADp2do$aTVq_z19X9q7?oSpgnO?Wa>E!oSP->1A^Ga>X=&CrZE4zT)HpP$ zW4zz*J+rHSmTb8R?Y+;FSDHEh-t(USXU^}uXJ#o{GZFp~iS<;!A^RKaZ@l&9-^%{( zrW-eIxac!C-$FN0yzRGF`2Ht<=QiBwW?Hn;U)grC?6`Pk2i-!^6)P@lzw|P>f<8&& zoWCi8hIjUE@JS0Is`N#MP2U$1=8C`bMIgi;dcdcE{i(zk^@+nL-NGkDX}aoh_ItO; zg5bqOnkbTfx6=5JkXx&`49>e;hKsx&xnEdF>Hjivr|0+oik7Y*>s@Zl=~eO{Xum)= z{0FA?3rb3OzaT;XiDJy$`k$EoFO&Xd4g9hOepv&*tbt$Fz%OfHo*J03P@RY8|8(!_ zcO!$kEOgSsfM?244*ogK|HMU7?B~q-e^B&_QaV#BVxJ-V&rO*b65=ylzjXYv2L2;z zpjaHI;o%~Uw+;911o6G5rgwP5hPLtE;kNM&8`iBW7KuXphDqWbFQ#K-M+)KJ@m=gb zzKdPQ#>U%r?tJR0ojcj&`?0a(yT()R_YWN!A3qiuf0=oEQ!D?=v-vDr4ZRvXn}0U{ zYVc}sEOzIe$KRpmq49T$6es=l7m6o}MJEQ=oa9rTxa7f=V&$V>4X=Ca#7cHAg`2N? zN%)D9eJT8zuS!ss_=?h|$xF19+%203d?tRGKMFq{_;t=EhwaQ8P6WQOPj{F7r<--; zJE42dLZA#5@@yf07SgruWiHX840FlvQJBcPbuTXFV>|nyd=(F}9T&&tFvC-J!@SpZ z!)I+&LM|?2Cdm+|QwJG85*3fmx~eGBlla;Du6=acRTajXc`p_}hpxh{K5B?<`MjpE zb@O@d2~1(1c_zko-eKFx$L5~$PC z6mHDiEcaw$8rhAKMXpBACW|g-2aENoMN>J%#w1B=8$b&N4$^bmY_0&}leK zK3wFR)1AXCN9P@6kZyK3(?kP_LFqKX!x7LsB))P*~j z!GXF$+2lDkSf&#g%Onz5+-f8xKG9CJRZJi|;(nq+EUIW#qm?H~_|HyUl<>)I6nQM_ zbdGBc*@RqAKem6`V%P8GyMr zL77SgA8;YGfVW{(>37D+UECT3ZlR77$JH}dj%+#3=IS(CPu za@`1e-*!jG`nV*z!~$FpfPRO z{g{VLMO=C1R#!L)*Q-r5m^uU3+~oO!XFf?83Vc^Lo2o%)S>lQSWp}CUaZ5x)LPTv0 zUf+dHqIQ9jXFIfVrr;~#ek7|$inP{`AYE&Z7Jj|j=togGGZioYNEKM2?asu zkd_!pG}xlx!LhY5=f71TVf?#p++xFI#H9+$s;D5xs;J@s2 zLYcalU&?7h*V0MeHJJik$IiZtNpg|b)dHKni?vG7=ZC8 zV}o_;!tf9sm_`4qufO{2v%deMV?SESZpNQ6>%-Qw`DdO95l0zw4EG+39gn{n3=bcR z6>0ZwAOWTmC&bU3A>xo1wth_)PmKTNi4!C^i1Fy3vITT!@ttG6y}fI9?j(Jrws>T& zveuPwCS%4jZUi=6{M8V10-LP_E(^m-;rEttV_m$%VT{Ob#+Ph&-3|gj#{;G_xD`0A z!(dRxp?rxX4`g6i9?%%B24}`YtXh`M{)Ugkb69lY0i7y#T8oXEb zM;PNwln=NQ*bpZ3OyW+${Lgq4e$2zXp^OltGN18-d2gN5gEEAd;3*$*&$;m02Y+@U z@aD|xUaA5Po$1Fsb7E00R(a2YP2R~U7XNvi{dsSLQ6=Na&>zSXJ|W^{bKSa$k$Z<2 zkCt~qxL=06ROGl}UkuIHhl=!UetaC5)buB+ebq108*jWmG%-9p{&s$Rc=v909ruqk zW4{FmlriW82Lh!|OpK2Mkd|p$JCwZ^U~0pYo0>U{m>k-?965YQ@kA9qJxczVgEG|* zxdwx}JqC-)fI>{_!sI#aFWGcl>n~kn(zZYb!gCSA=2@YcIIElzGT}|x7ibF?VWs?I zx-j{6Db>gEdHN{NJ8XJWWhj*|WhbzZXd=2N#Gc;kR4`FDdYMO zBGTUFyiB(%MWr>UBhJRVR{O#9-cm-E@PWs^9p|5`WO1Ft=qvY&*1NVD2Ok(OMsT!lgm zVz+@5GOcj~1$Ar+;}WD%>1Ngz@D(}O^XvxbB8fl80Rjz86pkahn&WUdsEZ`9zk|da zMG{LgZIc`nstF!A0@r0>L1YP>tuNX4$Kly%3CX7L zo?{k8maM_TNOg*d3J(G(!`?)-n9JnFx%N06Jj-fcr;OvaR%fRF%lb=>Yt= z=JV8fP3!&T~=ns8BCK>z`D@qQve+ z8kokW%PJKwzY~3Mx&Wlzkq#g=(#U!`yN{k*SkNv>1K?QzI|T>R5wBhzTo2 zc-4sn9n29-+|g1RW}~H=h*S2w2O`LBpA+{0-}NHuN0%`q9SfbJ0vi_1&mxEL+_2mfuc!+! zkyR{sd85U{An-CoE4_n5tpyWJ$$$$1VJdIaiuGE%O@T=6(a3mxy2GZXx@2a_3XBt? z2}p9?j5v7P)8w3=aj8q#=UIp?&=}m?uOoZ2q

      kL3X#zAJ(Xizc3 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 literal 0 HcmV?d00001 diff --git a/doc/datasheets/XILINX Spartan-II FPGA Family.pdf b/doc/datasheets/XILINX Spartan-II FPGA Family.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b1eb4d231ebfc56961f27fda52f3f63a7ffec40 GIT binary patch literal 1013818 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

    yo=`LE9 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..db3b33de46636d2f467e808a135d05a73219cb26 GIT binary patch literal 36987 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 AE&u=k literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 deleted file mode 100644 index d6b2059730a6fd116687dc3b57a7c93b8859772c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2083 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..d52ee181d3a7a71d92797c72d5d72f616ac2e58e GIT binary patch literal 20720 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 SBnh`I_fd{;J^shvtoRQgK|*E# literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 deleted file mode 100644 index f59ffec93c62099d44b48d2da86e76bfc82a7797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2316 zcmZY5X;cyj0>E+eB88O{xmtuN2TbK5U~eA_c#V^eMVJu^GkI~8GqVTmvRxYI@AH3!kOkv64}V@e zG-e~>E|CHwQ!e-*#A@87J#CD%H2DGP??&1W`oPDk)E_ST!+sw5FbNdY#z?6hEA$CO z35MH}izY*_wA2K0!1gnXXU$hCXewe-$w_4d9@ap6a_%lF{?OdMC z^R6c7!ZLfMTlDx+MH{};kyliK2FoDzviewD)J=;!H-Q;H?J0}6kzt)%mXy*^OgaD! zG>R4t=`wFKZ4>OS#BT$hW8#0-mrsrxWPo)frDwt=G20DmEwkh2G?dXzQuUhD^HkBW zybM*6@F?mfO5*WWqhRYk$uBARcWMJ$;s)A9y(0sMPQl{M(UcqEvEcNUI$@zKI-=Af#8{6D@R zt@lN)(x0>58iIcf%)}+iroDyD1?vreN;r#oRGB`_C+=iAsX4!@O?~{82Y1m=eptHy zWGxQ*w&LPD=Wp2jltO&@lV{~qL(ZMlHL!Fs5!m)3KgP4oy0;MrU4MY|xa9dMW3Ey| zThCieJW~CJE}M_8_#%%#pQ|bTJ~6~@pBSZ)X0_fb)spLJ38?w=oiAr9rOTC%8mb=( zwdf97pP$0h2l>g{?dN^ynoTlp|L6IGEkixI0*)zNnDkI6BQq5a@P`XgTg_Y4^Qpg- zp>nR5Hec9``Y|!babIQFbR`{J%lvGr^j5+b^X*>2NDZW=p|)YbrW9PZ@rHM&8m3K3 zA^$@Mw;rw7a-3K2beiaylO=4#5@%?R)lowJm4V08VwP~xG;Q!OL_ueZuW_;&j5LRw!^{G3eDEme8^h6d z0X@^#)mR2x*PIwdsu6<1#`=Kj(z=Zn#vP;KbMOyLU|sJ)7lo`7sUmCqiS8bmu>^_# zChxQEgZT{>*}c3I-39W2aWH?gF))?oawu;WAj16Ns{o0EIhu2 z!6}qODD9&+PKx3<{S|(%=+FsmYIViY1)wZIo+C)|ykFah@8l12^HOb9Sk4GSlO3~` zGspYhk90;<;`jDWg_9KH&atHdj`n^c-n$Zh4&KE_^rEtnnMaDr0#P@KQW-hdr0ypU zIk+rvK>EFNIroGUOPyUjRBY=yaX1so znh6szKM(~~7s?tAs6&<69PX7_6>(JA)7YrzEZ*XB8EKKxR~oN0z6M@chyb<=>|70! z)iObioKJ_uMlEq@N>;sz%DhMv&yGp>Ep{<;9>xOBK<6q5v>I0V91bVhP*(wXh;r16i`8QyTxQT zmz!JPR&D)#gEwYLRH!s1IN*F3ECR770>Q-Pj$BO43 zlGgi%HH&V~;yza18CGOxrR^!WX1JWZVwNLNwba22=N$3*exX@p^d(d4xg? h0cFX;dLvMgZ6Po?Af(}a{k?-X4t-L3>|T-2{{V5PHJJba diff --git a/client/resources/hardnested_tables/bitflip_1_0da_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0da_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..255006b82cc9cae2b31add153061c624d0307c81 GIT binary patch literal 23063 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 rw>!QmIRgb5_n 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a8232844ac5b716fec48988b8c22a57c3b107161 GIT binary patch literal 17302 zcmeHO&1)4`6hAYW_jtzS9U%eZL)xJcql=85f_T~j66CQ>C4xmAd$ z6jG_1I$~PeL7dP5PN^UJF{V)DY$2xJ^3*PhO2jd}%M|>;N$?d%w1p|!&4WaE;1G^Q z=5Y0ACUhk7h^Zv<3sbkqIrl0(JHf8oSvidMv;4!f z#T{VtnR}C*a2<)9VO8zLt&;=Qah9u{eNd=cP9t<*;-q{KKM$)=K{*K^{(eqE=vx%I z%xS37e2acg`seYAPgSDdy#(6lLltxQshDz&sUq(;A{6Rmmzys z_&L2+OX>A`tUBD`Pz^>$AnbvLb53(I3WLBKNpPFf(OwAuCesP10&hIVmAl>>v(6bJ zbxxxZXm>y75cmH3oL>D97bf78UcCQpRpyv`>M>qA!b#gurtbNiQ$F#^ooYDcsllT$ z0HcrN!Wbt7h!m<*2cgIWZaw}Yy8?3}JC?T44A6)>=bT1K0n!yAO`=aP-mWvv=#_Dv zjy3}W15k4x(+7HP0y=KWynZGx-S7ghiyUYAOCQp9iRmYQq~KTJ<0=sE8?I*RIMmn^#+Cx!+Jlk zT||sq0$C*qBx&E&M8F`NhwMiHsg^yi-fTly4j`&lQtvW^v{-^@@D9Ra+2!YaFd3m% zL|Q94p~3))#6Ij%23+2aJvI@mC|RyJOKs6Cw-$t1!BBuHmPcpyeq^tW}hLWH;^y{ViUgteJw_<|v(GpoxweRxr z-=cRdKdh4c;KIQOhKLc2*150|46UQD_CFLO7>*+}{{|Vskj4mx5sX(pKN!KV5sa7S z!bUKRU>LzLg7Mrb5+fK!Ffe3hQzV#7v=Iy&!EmJ_zp**iyfqd%p1~xUO_9JbHiF^M zF>eiq5ey?3Mlfs*#>*}jvJng$!7zg1DytC;BN(>G(_tXLu|=M?$a4kjk&R#&!7zeh z1jD9C>?@Kyt!N$_!7zeh1fv-b^N(zbWWGh_{kAER%pf*`;S6C@B>0NaK2vRE2_qOr lFpOX{!ePOI5sU>UdG>@6jLaUZf?(V`?4%{MZ`%I5_CGjI2`m5r literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 deleted file mode 100644 index e969ed97c342339ef592226b4f52b10d8770ba8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4522 zcmZwJdr(scz6bD#5(MH4l8|tz3M4T(Ibw3e4(w2rSIFZiNk~EtV}(2pqqH*@*!EuP ziscy~ITrFHab1N#cmymE>kRFxg^*w#?5+>6cGsN?6go=XE_$_EpO@SFm^(Z7kKaGP ze||H+ncwgG$t^ve$<09+#Yp<@p3w~vF{cXOuHg<*Hf_Kq*6&)_jN7~!hpUfXNVrhP z#}RQjCQiIw-H|vPE=G*QZK`)R9*U@+fe&-es>>O6g4TCCx}Ono;{R(M7V^8d;OlV_ zCJ8_OaDL!+aA*IY&98gnpIhSm`C}|lAU_^Gw4*W7P1?I@M4TweBjOuNevk^{mT3)d zOqO05`{j3`hPz^gzIeBDoUafc1Y{vj03w!OW)*a*9SXj0M<=Q+CnLBKSqMO>(m@mx zdbRx|$8HWj*ZnJ5-|NkSHnU_l)fgg zc2w)PDZ@8bLRrPcN1US>k4~OHPd$0=Lijm*abMZ}Pg7HuuYG8*i=sbegJ2E1RYRXS zB40FrPZpvt&4D=?9gMTWJh~v=+|6K8^jLY>>?xJcjr2yLnE`O+81VWEvMnN z8BPaTzUp6GIyY>!>W&S#A1!o!t1N0RI32&n6NI48$+4U?iN)Vy@eaL_(=LoNJ0do2 zveDevqH}#tu2}2jC|U|muK)o_mGrE9!|D6^K3VotA?fYEP2jAx`KvPbPx%oml0*{T zE&oWrhcC)yam8CBN&xYv_nFI0Br5+cKuYHy-Jo|AveIyi5;F~S6vwIkP097A=7hd$ zgUern(Dvo`3TZ_-Z5X^o)zeTLKc~%01-?AVQ&v>K_8NuA(t&CxteFK|pawXQQ)8{> za!a1%+%&!eTnP%bu+R}{l<0fK>rq07@DT{61 zP$-KR_uWQ9CR(&yHL=V3Cux|h0cTMS7%H5X)hWP(k^1mwx?$Q0SO+@}Z{fA3inhoc ziQJ=I8v-@`!ih)xmwZnCjjlUJQ&0QeC{o-55_-J8Reg>oMo|#KJ&tgpw@uC{reUseTP%rkJ6j3zonh)1+mM9L=D^^mdE^ zJJH=)@exZ+EZN6$z28urXd`>3Q2uinRuGzjjYgY>WCXHfhz{vhr#Yb8p1Jv~^b26F z`{PYr4P3<`pH@|%^~CvXfFe(ryf*Y+fo0MIGIj^cN5-ZJn2j?V2J#-(l_cm6&5oeT zOVp^xHXauoP3jt$zwqs=OI;7I&vqCcg6E?9r%6kqhhnv~%>8QDyP0q=Rzma+kon7) z`!k6Z8vROp1UyA#9h8U>+OB3sJ226{g*n06i@QuW=G@Znx+mZsQkwx+Ta+L=TPuoj zV=OjtnuN5&vr}BHjj9gDf;)7npi-?v@+bxZguGjceIe1MGIV6OqtvAigPzMd_8B&S zbx$*Wf^s>GN2KBHGjarW59vrq6P~4=Q8!T~Scsq=fs|7y6bmufbXbLfsJ$0b+cZ=} z=~w$Js92aQ-f7)R-sDw>i7*nU*-uu8BFz-7#~y%fqBxF6>0du>4+0X`7X>*?y&PTn zj3!3ahy}6P9$(+YXAo?2s_mYj2v1JrRI=ld*zGeILBXovj58pe2;fYEI@lDnRO}~V z`>FN{gsg<7AunQ5`cSwMw%vnDM=o=}KLavJH!rYX)POs`iDh@3YLS z?|kt*qdMuU;pWG`T3A@Fsw!Vx`kC}{U+;_aeNW4x_Vqjg)nAX%pSQ=7I8o1BB@07| zlmn$b|K4|8*LNcB0MSv7_gF)7OT<0Fl0?rSR+=!z^$Sd*nlwP06L_2v|A+}d~1 zc2tL&2^ir#J`+--O4#1YP6>qu7V5fop8p)F@p#_bb@%P{dvBWFJDu?Al6m?1w{N2Y zsM0=Wha8nUf|3ivN~~Y5APjNJd$+5D+7XY3;`Yfh^UK^8R1w)1=qznWcOKxG zat*IYNU;QkIdfq8xH>kvIF=dmSUa`#(~;_sb6Ns*pO6dIoV_#davrT0uq4vtGw>`1 zf{OK-SU*b`&;h-)5f;SDVF-|1t!~gX%y)iF?BGlN`JSEwah@Tn?6YQGXQuEli9VnI zFu(n;tX}>&!x=>30&x}4&m=InRwTH#pp>dR&S)2DdJqi28Ny;Al8pKG99Y5z29PT(pjZgK?Xt zDL4i$LWSYtaT_>?g|hSA+vXFui75>NX5aC%l^fD4=89enZhMw5`^7g>ywDtHbTR%yS8C(??nX*^R%!8WbrRLW<`C?Xv%N%#Um5iWf(DQa< zT5%e+cIW1`+5xa5at20F?CRE|y?$;{eB^XT!q9`ouA$(ogU?5suYNlIiqPSF;ZZ%# z+&7M>G-l?nscBHnDB*(GpII{Z^q}bB>!^F#&R02qx1F`RDl6kwcUMc(`eF_w;xEcS z5IV4souVGsQYfB)BNi{i;8czcB!eykI6~6No6Ca;ypc=>5uUW7LOMBvfGFnB&Q4PK z-gtlqcu^MEBX9JGWpA$EL)8|<_n;i_8CY!v+H5l0NSemSlGOx zsDQ@RsD%HbBSwE-JR;VShk@f^;NbL=& zWN!ge(V8%IvVMx*4vaR6$C;Rn%3{kYv?EXQg!-C61Ft6nl@1s~?SY0l zOOH=t5~S;YCt$9+6Wu*rnbjK^5T15Bzl^CQ^_{O4j{zAbKiq5S!c`3hO=Nhe*>Aw- z;a)JU?WcN8%VUAO&ZkMn_XvDdlWI6(ZO>pp$CKAQ!Nz819h~KnF5uX0x^F0;qaP{Y znFi=bDCMWcKd|1988F%U_5x?cBRP%5ORVy*EGJk&?Kq5e?Q1YZZKP{4&_;2;zVlzA zfd{`#vPG^APgQv+$40K87$;~Z43l9`Rst~$a;&<7#kWbv>?c)6w6m(!Nw|>p73#9^Ow?h9S{I{Yy}JdSzWS{SLM?s12GGXO5mxo*?ta z|JO70XD*ezGU3mn6dQ}1F|;Sb`o5LtZf!{JKB7%k-ueSlzMr7|+?CV`w(H}G!?Cdt z7zqK8!7kaAi$#|sK(Ji@-S&?E3_RF@S@*PgbfSpjNhQs0<=7bOzoOkzzXr$Z2`-6O zJ#K)Ht3Diq`c477lobtw9|&{xKFiAovaTCF0_z^%?w?#LQjH623+Y(EBj*3*j29C? ziEX3KzNh5kh`^Y=iQed$CP0vKdOtX{t?A*!6$p=N0KYwOP@vVsg&qY@);V79>aTeV z*709ZEf*};ib7Webs>UK^sLOhdYxsd)-Ty*OTi?gRT6^w<o*#i&X0el< zZ#~LnbS}9m5jUyCcZB*kPJwL7OrmBSqOEQKp# z>?cw}ScOQ1&*_*01c}G~HhKWSuWJYqN}hIWVFr zrBq(F5q_I?v9|W}WB+ow?w!Ej(mby|_~v(oznQFVYNFfV3x`e}Y)xH8ZPYrEtuU}$ zTe7&#x`vgp|HmyZ*O|*})!vm`RabuB)MT8RYHBsyFZsD_-}fiY^QV%o6`5w(FWNqD ziJ99gm;WSqU&7lfw+S8!nzi=9VHRFV7Ke7MjtlS&pmx)ObB`;kJuug2Kb zTrJh|Xy=nu`w3&S9+k1dJb9e~!^6?$?JHUYk-h5p>bu+X;WUM!u=mA<2hR_7{;ACR z`rF_W&5v(dZ;Wrd+i`c@EYE*2%PVElh-*5!W~wQ9X$s!MUiez|ID2~S>MnY=sOxT> zzPA14P1)C-tg=7SCSiWCY*w0e@i?YO7^WNe&R~9+rPrQuW883@ za4x0NJN7$INpGiNV=$@n1$Vx)Y8}U-odL7twW{iBH_26qe{6M#C>x4sv?h>F)GZ8 lUUHQ5Hr>p4qO2M(zNufBnwmK_`Zl4aAVb{w7u;RwKLF?%rHB9k diff --git a/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..f99bdf117fe3da43e3fc79333960090482da031f GIT binary patch literal 29435 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 diff --git a/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..2c9de9e5d21a9bacae6696345f7d97999a5612a6 GIT binary patch literal 23792 zcmeI4e~eVs701t;ogIc{_MKIBVOU{j16$aH1rgMmpzXv~vu$wuBS2}o>c&!`jrgNg zBn>}qQE5tW{ZV6#RZH4h+f)gE&;|_FX|T49bn741*eq1is;C8*q_iR`x1W38%O$^JbA;nO57XAZ%Z)ZQDSHv4+??)-3InZ@%0Q_oKUIls{e=Fd zl53So`F4R+i%M=oPNKL(i)gk=&B{sno?2~{c`Dg;T9QUuJ;rzYrb=d&n%em)jbCy% zY_DVXh)Ui*nas&Hs5CQt^Ca4C;0pQ7c$JCv4cCg#y=rO}snlA#nl3+4GXYMe-955) zKa{zAq1<+(O3~l9_MpnSjCEH@zM@9wGMiYXVP+2TNka#M{~A5`hjc_sX&Pjl3|7Vx(LIff&!*2myaZM-nN5JUzqsA-$(X`5QiEW2`@* zoTZL&Zb6stxohGhdY?4qmPYX3;|E@+W+gL-oT)BQnU2*(T|7ky8*k)$8`tH~PwO6O zLCE~Bf%!CjYJb7=$GE2e#7!vbZvWn+rxg@UccUFC7^ciXF>_qfPHLp%0vG*~lQ4?4D*xoXcY94P_vv#2q*@MgziA6tF*<;th zC3pAW8|PY^S2>J8owcCt6h7*eTqaYm=8FXF1{Wf)CHzI(U8XQS5Ube_9Za;kdG+A# z`*=08v4{)o?M?XxQb_^k&zqz&Ws47*o62$@-mOJVV;4`L|GfPjmi{nPz~IKwDN3su z-^6c-M;Vl(Hm|;3y}-zaBNKF-Qwu-dkESZ!WQCl+Uvp zoj;}~74ovtK7j`zlG-O2_`wre<8V1E8^iZZd#Uj)MpBnb_5 z4Z;Bw>H@sA*nI6vDx>zp0yoKKU-t~SXY18`whc0UDqD6k(kUaJteV#@A}o>1-Z$J) z+4UmK&V@g+&q;tA^ze=c9u-uxBC)&!b(@JwZB4QHG*VySv*Kmd#%Hn!!NGwOWDzHp z<9+s($EoC9a^9mJ*W5=0hjekjmgbQ&ia)GCQSusEctNGp)AVWX@ zD6nuoGV$32UvI^N2#`-YW3d*8e;m``n=_1*gVY{>49RB#0Tp$;cR=;&r`6sL85c<} zfW*e5s5!a~YSu4A03^j;mvr_KYRBQjuY)A>B<6j8PZ$CWnHGYKOQrkvy0r6#OOF=7 z@fI9q-B1TXU|C|ei7_xd$R`on5Qa!e9#b&4BziIQE#6lL(7-}9qj9FXWnNV@&olK# z=lc!BjCzK>739_?Ub0b5YK8)@BqBtJWJDd%^ED7pp zJ|ErOq_VvYQB3>r;B9jUY9E=>0@g-J0c#&K>;SpV)HhjDu)~gs^t7c2Z8C14Sad5|%q0F`zP`kt%XD>5;4(z~^ zu(T{Tg2G&}H5Aa_qkyjFs@l3)e=EnuK5+I@{w^vZ5$zl z+BiZ8webwWHPpsKZJat`sEt=63->+L#zSp9)W%18#j$>e+W5#tS*VS(pbE9|P#Yhy z7bVoj!#>D2r7HrtdavJusjF7Q=iGsg_&(yGQeE173Vc&SzH$Joro=vbrFU56*ed9!t zSE@G9tYh;`*f;JsJ%xSa>K|e-qQ@V@lYENwee6JXR~?M{-0h93j4;( zYpV^_Xy_QP-G_bS{`I=BZ#?W9e_sc$gni?cS4P8`D&b5O{)9q7A~`|lkb58H4c>GK zXR5e&Gs2lF;Y^j0_3l&o9cts@OqFn^$|=1R7i#0-Oci&)TsTvO*PwXeI-IEz&Q$3G ymGftzaDE|YDTVV3IhbMafPs(j`GsNMc-S`{YU3ZpGgVf8-mk%hPwIx(GXDYg{i9L< literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 deleted file mode 100644 index 2b87ca8f29cea5c6c95f1c9805c1934ee622f802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3508 zcmYL~Ygp0=qQ-F?tw<{`5O7LOgpf-L13uN0j+a2WSaSIz{I?wy!2z6oPPKKOu9m5k zh#Bxlh3Vo2P!LlH=2V;IjRt8wM^WfZyPa&N=2WM4t)0plvpI7&o(u^Ub( zOa4TgVLfe&5+&rrW@z$cSbQ|T;GZ?$Vz6djHqIC5y9At))?7A3mz^^7Xipt2+y61UiC8PEzOpxYU`=_UVW!8OIkTq-R48vmKJCEb(+7vlcg&cpDiRIxX~k4L0OR5`3yYr!mYCz;=j5Ntelh zmQu9{bR$d+yi6U>R;m!k7W$laYPCpVceB)ZN)gZCQ@Rj3&`w30dnxE{b1h3%<5H+H z;|xqlb;Y(9m7Df(o{4OHdaSt2)Xd7 ze$ODYnKmB5C{$z@O6e*^tB3E!k|UU2mcta26g;5Z7XF)>I8P)WhW>iCXI<)Dzk zMPjO@y#fnWHrwL~gwfon?(9jm+${zgz2;IemkkE)UhvbsuC7o=2K^Fzd=4cfdO#|R zu9B;LWR<>wq39L6yIrg*eZ8|YL2c)Voxg24X*-0IMI(yG1vkVFj4@d0H-l2uft^j_ zjHxZN2m1j2_b5mqrB)(=cRic9>~j@3K_1~O(J|U5SR&q@VEXcg3Xzg;z`A2R+07&4hi{QQ1{KGk}@GU1;xT8n|$K{&Mn=;b7C`ewn;2 z@$9+lhXG*^5=UP&QZN(@T@4zAC5vX@IQq!->sf2+HO^aGlj3$h8^1?X%R)DJS1~DZ z$Lsb!@x53nmWJ-|mPdbyd28=>9MwBfoxLmVs~2T0F^{ts_6HSIF#sJ!_068>@Vrl5 zy3Nj$4LR~I9P0liJ~86ScAjiXuY))sz-q!(YFprmEBy5wN56*9ig)(;v+5mH^|kCp z2Mgq+jJtm|DJlb@9WE&70aXKVVzVb}#&#SN&J(lkM_> zXZwWE{DE3l(Hq+3%=b9%R;ga<|@(6*u#{~Vjxtd*hFr}SqrZ`z>%1ux>^4AbYn9@y=Gs(Q3P$< zU9U`9;qy%*6m%9Rxbo<2TK{=Y@lP3D*WhV(GjFPd0yrC4BvO2VfXn`$X4sYYXB>ic zr+X9yVhEaI^ZFB>4m-)8w7XDHYAFkoTKr*fB@7+H%N%xq!vN>19=-!%@3; zz25M0d}M(Fs9MyHD3AfoJ4_?D7yTo{~f0PC^*t^*Fc55^1+M_gRuTUdEz=z zYsO;c4t9^JXLFH$TX*Qxj|5Uiu$GYcdDQ~i&oQT_MZ=;`!!{({f|j@bUT+201hB+d?ZI_|Ls7C02$1CAv=(vP;Gpl?hEscP?r{0n+8O<`RqAWiU-?tn zjPe3oIVnzl>+`#HJ1*v-7uUDM6Yi)^CCqn>;`>+q=?$iQ>i!PfP9dj{uMI2q`*36G zz`H&N9;ggsTHwRUAuqYfY0BGR`eLD9X4`8j>Q4w@=UV_^`|j+*7iGZ&tB)>@Ir&UD z&Qw|hCW!Dt+xDs7xw z%OIi2za8XP)RvlBN{wsU6}D7U@^#i;L5kbD$GRp-1*X_043kA%*WU@q%E!B&(uK??6QwR+M{x{@bd(FB=UBf?!*e&9 z^Q`+yCB`R?)WmI~?Mc=p!Y>$o$a1+MCTt{;ed>G29G{K*5Am1TpmaEb8RFb1V#TxC zi_b27`6hCwqj|@ZQVgC#?`0Is%hx3v{m z=;FTYz!B#y;rYf(94hOUGa{wkBU2^vBeafdyAF&k_**wNXs8dX%$RDSaU0_Z_0{s{ z6URP2ym4xJMYO_xCma62P0*}brj~0mCKsz4bY`klnj*RK<(N|1!#r4n&dFi<{s`37etYTPUf%rXQuViQFTQ(v zf2;A`^&e&*zd7*;I$w?ke%ZDae?G@EV&1hkNq_&3(jT(ghW_`;y}y0@@0FC)YyQQP zwpVo#=ey}^{C}t`%K!A>#YpkP7rV0kOUH9lId}GYh7X%8%O^(e?45h^^WF!}roUOy zB_NAnVISwFTf`Q3|8?t=gSuz;S$ka4P10;1+_a*_CZxO;UF^=B#cB27L{-clK|*Ej z%s>I&x|O;6S08)}RJ@W%xCR%rP`^s&0#3MHtWe_wpcIiwTU{hDpp!M$-b_M3aD#~aWu&hgr$~YX_rdl zs>voAy+`R8c1sE;;@Zh^oy4god63^r;!$bp$l9b0Gj8o9)g0$O<8iwzp1YvI6!@e# zB0J1BG?PJ46%~9^ixrb0BKTM+0E>gbx#$8ghy?xg9+Ca`P_7`n&98Zda zwpFI~+v$?XNFpy2db{LQ%j1G{^cAG_SX=Bb$o#%ye_l)^*4lORii5pr2?~-}AybQk zZE{#&PSP2Xyc|79b&4%A5@dr=Oj)vFUcwfc(4Wv3Jw_5Vk&Glr2Ms0Z7%YhdPw1-# zLw5~rB9nt$l%#>%O%yzql!kO#!g3-LN{+TAJdv{8gTu^L335Bcv{6+;Yv1DGBoig< zS(LaoEJ-j=GI?o?gqH6$lC#-lo6ORYq$NY+oklWS8YO^AIuGU~i1_Dmv z{mVKoYyTb7VBgo4mO0wAg>@!Sk?k>s!#nBo)Lc1)7mc*FnBk?k&!X(NOk}dWW^@Uj zwakWzj51~I&4vnm+LeP#l3EZqM~hILn*tRN!3@ZzC|3#&l}wa^E91{qF1=bAkhRyr z9Bb1in$F8KwNiADP}ZchRL0fUQo}s?CvPS*DA*r!oT9FLn^x-9^53CNTI-^)MTj;p;oYIpUTsI`GUer2K-fDi>ptHG`@<*k=d zl3wnb1wW>7hl~ArT9^y?u2M13ZaM6tisEJqwB#JxqXzoTTH7Csewg!?K3l&IB^M$} zMw2^1+khm8&9%dbib6%yVn&77vp^>12~BQ-Uf>$8sG?;f_*1kzL%)mMxF|9n1fD%Y zy7U1^9yD_FQ8X8~@(V`S1+TjQK0?B9e5w7i0%wJhk}?Ph>l|8Lp>uQG!gFx9$;_Pu zPEzor9eyaUBCYYk*Db>Xl$~Fra*_cevikY5R4ZCf#_(UgM;j6dC*axI*$X{R2v1vbm6i?9*Y)qB?%+JPeLIr8&O~@xyGn zfC8t(V7kc1gSef+=itV6BSZQ`bwdyq+^@zzbH&d zXumEakV-(d5p--l0XN zkV)obHqY-tyLIX}-pnQW?2l?K_9cneosD!+7?++%S+=DHS9Ti=$#zYIzguxFP>Vu|y z=5$j|%%a6rZhW9Kn5wqvMEJSX$fNKqvB${vi=dbyW!uMe=0zFiF=Mf4JD*1@fK|T1 z@B}lk98w^G8NrN3X_br)<9t(Iz8vy5U~{JP?)Z9}vkq}w>}*a%N6=Rt@rIanU|iX6 zuR&5%V{|-1pO>OTkkV#IL;tKXvaq{3){`AJS_G%&pKc0w(B_t9Y56`D+D!ju(rHVS zUx=a`lEb*qL=nDC4!xrR?;G=;-j+|kl zIo(FS3#0F3%zZ6Q83~q3N3RTk<{oI;p)`P7Wd~SLc5q8sUR9L-dLs|mKN)$@T7lMM zARbWfWLn=v(}-K{+5ob_T51MjzsaHHO@)(Qt83h_DsE6R1WHn%BnL`r2nSz1lz$Uc zDS~39E=~1HeJ$_lHe6Xh0UJ|bFogRbQL#rsO|f^Qn!6A_raO8L%1*YX!{+5FBTajA zD5Er1)mbd`^^nY{Su9iw$jtm6jX?F2!F0V^VbZ7>7#0^p8i%S9p4`BQ@r+U!QUNjQ zh8o$G&`wKcpgomw_%0fG_xZHzA7>7qaET-upFNA|n@yHfMTSjz$+aPkumNup70{*+ z(VJEwp<6TgTY>*Vps^ES-{WkmgrCF5Q&`YNB_{c- z>itt`_S~A@zwja`WxAGik|qJoqktnF>wU&E{zmtWAtW$2Nb2V?RrYw-OVo}nb3uk` zule-~UxN(#A;^fR!sMv(U_XV=6ev{0huitaAK}pZc)g}zo6P0dpC~voCh;Uny;RlN zd9A~|8yRId_3@sO7nUJ}6dh+F`T`TJz)eZ4HwB}f%+#+)N^rF^57xI z*fQG~|0>>UZ+j6O1~0|*8h?)R1zc9J3sCl1iy;_ySp~4;sQ~d=0>LlLMg*|ek!#2bO2>CMC0bOl{4bmsPBbk^6BPevH$AN4fu^6yCsgf}y_Tu<>A# zcCOlYV%S4AAJ5^k{0C+KinGm*9ga^2Tb&xsd_+gE^13O-vNH{Kj-?gJmcqd?1~-vXEpSLbHa!$&~?!{2mXv#@EQJKi+#p&p*=4Y*$Yjdo3Ym`$T zvb%MR4VTb54yp@e9^y`$BLW%qS3$ylfs8Dqdz^9|FcVT4PDJC40Z_l@aD5H2Owh*QWX4o4V}^Jl^>QDX&RV_Zu;~kMe5=e+dB41 z5yI_Uq#4M;zl@=`&Syb<7DSgLeHO%LLDXpZEXW$41sPuG z@>vjk`78)ZWwa#frq~Ak zZ+>j$vmlk9B>Ep*vC!#%aOHn+6}vQ9p9LB58(p6TsV&_5EQrs7kmk@VDVNWJxSti0 zn&D@WW3V;EXF1UL#9X|2b4Z!Q4qksEmOl|ov-AE$ zEPo;v8o{54bpuVfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_111_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_111_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_113_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_113_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_115_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_115_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_117_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_117_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 zcmeHNZ-`V?6hE^wvu(Nij+(BME<1~m3F*3uyR3vYLB@i+>k=VSX+jo4xGJHTS@Vc2 z`;ZI$F%b-j+#*yqvr<3Ad=N8A*^dPUeX#$v?pmu-=IM9tdo%Oi{+StbGJ<MV`$LbdlJ^aZJLK30%$+Sx%axs}cMeWHnMf9fvHS-t^o0I9j z=>6P9@npI!HkT>3m)!|yl`Wj2UIyg{Ox622qZAZ9!VT2O6g>d8k%LTCBD?rf%`B$L zn@s7XcIjbC{KYgy`N({3avY|}FHDt{+S<(hRp608+uL9zw`t`7lOvm%W}|jXwySn; zX1Zw|Q~kY=t%GTy)`|SYl)_&>y9>Z-hV12uWo4$@xg#FXh?J0{!XTe$nIcj@=5;$1Jus)i}>q-(g#Lz%r}cX z$J8aVK}QZG=s)GN$G|Em(q}rwTBa3V(fnRwas$P1b|up!k=;yd!}TalHCn>3x~3SS zdlZFML~?U^0!B0dV^ULV3DQCUM_QoGb0V_~O%$D8U}{8vUF0#gIXRu`g?8<_?} z1lx)X9wN>a_Nw}?aGOlU6!xLIwU9z{-HK=WFo`@BwDe8BR4{ilG_3?MMgR>~$W@*9 z7wlsicV;aVYn3&~U@wJ!Ewv6gTA zn%!y}oqmWLJ8P`?dk--#V#|Mv>~b@Yoq)dWoQgXN1dF+f>d|x$x5XBtpToN&H9*Wc zScB*iQ~>Sbosi;S4u+<)YXA{wQYnYD3A6@}-tl2=5-Mt>#^8(F6ojKQobhexd|@mC zb2l*G@v{lDrTTNb1C%f2`)*^}rs(R)2SZJb&neJy3)6hlO;J3YM()-*;bxTJFdh*3 zi0L@I$uw<-<*dRV?D=C<86RQvrEQvE4iRaDW%V*W;#H0L3%h7V10~Zoz?1I|*RAD#O`TT8`B zH5i_NcF${?k_Y{ROlxujHXG~*o5Qe5pz28s@|EAZklkr2LD&M0fnv`I{3Kpus#ARh zR_6*+O%2+-s!uWc1+(=A0F;g{|MN`WDPoUu2)R*nqUAGjra3y*fYoefdI*Yw{|2+w zAcfEIX6o-eISVmX+ils$AIDeDg9i)FLX-_yQ`rHxQ41C=v-#k5XQf) zf#b+19TlkXoC6Gh-&7p6E^`}UGW$fZCBjxxfJeCLO(0~8T7B>Jw|ZEJIq?AF8NizH zB*UJ0F)ZU&16sruvSW&HGro^k8O z>4!7x`EDO_#=#uyn~0uqMjY$LVOVlCK(GVE8;jTiloiyY$RC(f0F8(8A%;r__~>y5 zj&Yq2*Z{y?SgBf6t>N8jeTXo;lcFDCII<*}&Q!uatASFf2;6D(EfZ$AxiAAr0S{1l zC%f^Lz>TNPF?y#C0RT$?{yiv}kCPeTrBczZ5?;7M4~ccF_*AsnSOmOoH6(C8=gegA zihd0zEsrT=Lq?tBiYzD9;aqTuNvAKZ$jb^D%M5^fX92_=%W)2XWYv(UQEtWLKpx*; zvfnog8j3;^;p)RQw^l6jY8Oce7Wa|N{d5=9omD%cy%mal<9S{ zwia|nnLbn}b70IFuSUpw^SFL9m0K5jpOVIK2?EpUs+<2FaL{Jgx$1%?kOc2 z8Lm%%fg91pD`OpdiiF^&p{B%{avuH>qTDA~jHTSvJ_UJPO}FESg*XLq;XjU3p4IsN ze-NkOeZf6;5K7Izf_M>1CL5vP`p~?A^w~F%Y{-d=Mf(Oqcf2N5;Bbc z*3v(=y;_A%>=K=pe_Cv2`_@I=+Us4*{ybpZgAZn_y0FFv$dYY36kXr^K7R9k`6i#P zPdig7}`?oS3LXG#FBbAiE0K@1^cda(mm< zdoh=Z)@0XhnP0c14LeVouw(b@jxEf$ZAk~IFzpO?*UjHokZ-2xsi})I@GbgX`p33y zAMbei+TknTF?)j_@Ne@BkFVV>Q9Jd~eHndC-#3lCpjT0dI6T^}j1G`r#p{4ooDgH3 zs!oZG{np}SbV+-}>7?4hs80q>IM%CzR}6Y5Z@~lUY=v8rDE3lNO%N1_57k_Co3u%C$rvymuok6&xa~yIQ^7lBUB&(`4EZ^ zYdX_+r*{>sA#IE!cKcuw-w+V*loeWpvPZP;v=a4@7URNJWwDl9{W;Y-H+81(U#)$X z-%}yrfh1(o2`+7qw`5g|r!RaL{L=JvI6QaGK^-V^x5-zPPZp1MPe#xDVn4B#U)`|b z+?-z8+Vxt#XAfaEHNpPpJY3JlKy<_k?sko(`l60_!|jHYNkQRG03tNqT184TO|2NP zp}0>6$AzU3WYG=ZoT0 zL+xn)51VE*K}OM^<{`g{OGxw}nZ+>0|6LT>XnMLEEt-Bm#{|6 z5HflV%(yBbI}Rd)1R#`Hf0~PoYceH+VUY3gFhTN87e;wOjv&26y~k^g05-|PEU+1x zGhTv~WYG*6Cm?4f-govyb7j>`1v`$ZYdSQ2(bci5s!j3%2Q&xGGnz~8X~;QkiXn)Q-w7PFNlc#KSl0$P)! zTo?hHz@%DphJ?n9>&kcDlAy-y`4oYOI51<|NAZQzM$AlHQu@8L0(Xq*C9j{gS8Bv;21dR;l~C#@Xd6<3DQ!?hzyO zyh@{cC7F*KqtZM@3aJ!#dPJEd`Yg-X`B2WYZO<0j~o8NA^-LC@T7 zORBovDn(!J+-a4Y75QD<}Q&)95U%}d1XQ%Ps^ z_cfT>0wu8{WG+AJvr5|hZ(j{ z$e;#ZV~jc9FnMYnuwwbx02cN#|84YiyT)~M^Lr$J3>nf5 zCSywJ?klTCoH5l{o$tgnMkD-^EygO_owJD^uE_mC^vL9XxUHucEh!6rETh1kT0tT2 z{VH=zuNdqbD$~|C95Sv?_eR|#(L!FKFRwYMOx>YzW@lSZL4FUp=PDD8({N_?gUKXI z2EPb+km2&5>2eOIjr)T71*p>pmOhWn!aS18h63=^a+EU4MPr8?Vzb4 zZkg0Q2Ec8rSDEFQ50bmc^^C`X=J_fse2sq&P&X@h2%4e43j;^dAh&9*wLN0Hk4?_^ zKd$j(rf?s&nsXbLVR+F*m332XBH9>D$Q?sl)3YeD_8+19Rd54iGjkYWhV&4Zgv3XA5LL~Ez;uVG~NeNYKG{lEcz-TZigzJD>e6F(jn@Pd0sWv_FXUULVa@*elR z%Aqf-^jGOb_5&%ba@h+J6!30@`e)0jOay#2LD7Ns!~W2hE?R3H%yk2DRQCm#iYB>`p87*SD|;tOyvFFYu~)iT5uAs=&KZ&U~1ib8l5`#Nre0Tsu{^4CK~O zxDLLoM2AxbSj#IIjrF0BhU~AH$eqIkR~}4|O|3T2UJDDZ31nly;XwUbjpxv9p#p64 zAb$67aE7n9DaNg^KYAT@Fl`^cQ2d0-lMGBm$W`Ny8r@Swd%oNqCtzR#4eO2ilS#1> zQZ#D3@VXKYsX0z%$DdW6!Y*n6gn= z4l!Pc@yuCX4Kd!^_+^m&_;83<*I!5AFsh+ISde>zSfCd8I??U26M4VDr}6}Gl3+2H z1$dRE?Q>Tf;BD4;QVW201E`O${@{V{u1bIavnm%3>zZkR&k?^I9@jji*BfFL_95aX zzY4n^qC2M214=<&;Zg;Y39-!}N8az>9q}CfTq(q0*&A0l@IHTh(&IHOoaOj)@wMdlRPJNWEBtUn zEhGuax}Nc5ZYYuYO^u%`E4Ru%7`+nbz7IyfSc=qH)4Zwj(s}N%Ual|abA0lLrDRAF zdUl5-p|N2H;p6^tSYZXk=e7_GNy3mMG<6t!?Fvc4kR%LALT?sCivv=ziGvPF!jL2k zNy3mMG=K<6!YlYV9Fl~W@vS%{32SU>h!jNl5L_Fvha};}zK(<>VOdjpS^r;ZlT1hw zx{xFcI|(tDu#+&sjF2P@I|(oGu_Po3!%o7mlQ4nGkR)_rCt=u07yob z{cj&A2}#0`B%JlXcv>XvB)s6r+z0kmBCWe`UOJci@Ol@lZ3xUm~k}&x$7mgd3{=Y&<5{4w< Spd{heWj@Lgu0I^#cJe>3AxA<0 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 deleted file mode 100644 index f7e2d1674d4fce897625e0221dabbd6710bbdf9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1788 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_11b_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_11b_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_120_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_120_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..746496cf34cf93c8f933542b8385cc8c14e7ca93 GIT binary patch literal 17302 zcmeHO&2Lmy6hH6v&14+gIVNplnGk%jgyO;|ffy4LGl`1=p$gO$x|qZg+Cup#U=;~@ z0pmxPE{IDK-MG+hNQfpR?+@tGg<;bs#!o;CDVu^Ee&^oD^f4W1$F3UAUCev)?tS;3 zkKZ}>H}~F&UL5QlKK|o{w}>v)xBpDji?d~sh-xC!<&Zkcv|~}Ehbl33&z9&Fks67} zAfX9`757GmmKoPC|55^+rLFaEb|joab6sKNPA}(g?$sIH~N$*S#uKP)P!azmt;? z`W8jba~i5N-(#Gk{(W@ukxKNZmq5o{R53>$iYcElRpq^g{MrKL6DR#&OK+)7dQtKB zDrD~tzoJdkDZNmRRflUFs=;UI@Sl_UuHUjT6p6gYUaE* z=AAP{?sFQALc5zehq(T4a{B29sF;LP`q2Mts?0(6);)AO%1Os?rtX=XQ$F;{9cwt{ zp~0hZ0HdGd!Z;@dh!m<*>riA8O%FZEuE3ngwv{b312m%Lg3~A|K)NENN%Za3<#VPP zt(o9U(H3A}2x<;6y|2$Eq2uPv>nHNkjV$xJ$RVa1`jVD&OuzU$1-}9xwLrWtsLj-I zsK4w{zoDP$z$u`93)e<#oK`ik_Ms^p9A*yA(0CSd9e`XDu-XqkbmUD=%6Jx}aC+=~ za#qccNYmJJV*_XKzx?4fxwC>XpYe|U4(cu>`^3>4`s$XXw)U*SyB4UxuLyw z&$bl|Tfx9upRHiDzu0Cg82Ur~=}sULzLf{|ktxmzO`Mlg(ET9M^2B!|7%hyFe`EwB zvxX52X9y!0_!p!7O|_9CYz4zsFl+^*5f004j9@G?$)gX9U}W}K7X;(_UMDS~49tD= F?gJho;<^9; literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 deleted file mode 100644 index 0e406a01950d17b502e7f64c8e7f804e77cc0190..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7248 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 diff --git a/client/resources/hardnested_tables/bitflip_1_122_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_122_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7b1d7eee7e1f0363faae30799aaa4a000e9a3527 GIT binary patch literal 41970 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 Q^BTJbDZJL7c>XW{FJ4B!S^xk5 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 deleted file mode 100644 index e02d0729ae55fe61b4c4435644cad4731c825ac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6269 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 X7(V!C|F7=9D)waN?s_?Tz5Txc9Vytx diff --git a/client/resources/hardnested_tables/bitflip_1_128_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_128_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..4c620265df601e69079361babdf8e49199e74f53 GIT binary patch literal 30841 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_131_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_131_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_135_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_135_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 MHkiz_%fH|FFJzo{(*OVf diff --git a/client/resources/hardnested_tables/bitflip_1_138_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_138_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..87e96276102372a10a05ec0d04175f575de5a102 GIT binary patch literal 24606 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 LgpbKA`1!v8!YRQN literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_145_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_145_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_147_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_147_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_148_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_148_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..eeac62486ef1a972d110d971f66c234af4e04ec7 GIT binary patch literal 25815 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 Myl|zK-SeIQ0twPW(f|Me literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 deleted file mode 100644 index ceb8298d87e5e8a14ca8c7e0e36695c0e11db33d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1263 zcmYk4UrZBs0LKfqUH@E!LVNsXQ0!{UpI-2OhKEkWM35qQ8ilqw7a(`Pnka9Vg-p#B zr9f-1Z7daBPU93YB4C5pmxV35+_iULmLKAJRqMuJGPI!4qSb5#CxMBHTXoX(_{PUo>2*x*EmXAN3QnlS-G{BwVI%_MS7})v8fN-MGDc=}f9yx7hgp_HcM_Y8gI%6n>3$ z4dlC$(#N?M%Vp@p_rJ|=Ca*h}%N{*GisQA>zl~`iikSpmJGjKK{r@H>){D+=6cxS( z1RTJ2mTEV1rZ=^5OZYjO`)clGcjKF~p^fBFZecICmRdId;oAs5rAI0suKG)7Cd85S zZs4zc*|2#CB9xS<8jzqsDk>j0WIFl<8+329*w8tdQO0d^nC=fHTp9&- z=;F8&MhF+kkSZhPFk{4tg2sM9@W)F8uMyf}-;rn*B4*afqYMmGv+XKFLVZn(?g*o! zuZ5kwKkJh_Js?XeS9D=IVO5To+?k(JZliVEKUkBM?J|9B5UyT3M^GnG!Qkt|r9WsJ z>W@sl!|W^$hTmrW<#wuA5gB+wqSM4tOPfj#(aspi86#w?LzA6E6oFR{GNe~;#!GSB z5|sepLwuX02C6AXvFz3p?MxGEWCG@6~{56jKrJ%G$$I7TOMV*jCtQq9=q{v1{q>HvMnYhN8W=@Q_3prtuk%n<2%{Ji<90#eGyydJxN)RXlGmaY> zl^!R6hy>_Uk^P`FUN{|N8AVa8+)UM6fwR|2TOSPO?+x^G^xZJ)oL8gS2WD-~%E&R{ zCost~!nN4lG0OfFwk=Mm^CHWVvu2&Ap_jYqgqV*C*!vX}C=nz?=#V0^IB5n0Sckqi ZXXT(f9F;=@ALBoMcC+e8!w$dF_a8p+0U7`R diff --git a/client/resources/hardnested_tables/bitflip_1_158_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_158_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..8ee5757b940026e29af614968f2c4d022ed109a3 GIT binary patch literal 20720 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 SkR;*OWj@LguF~hXKmH%Ck}&T8 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 deleted file mode 100644 index 6264a1abb57b3e7d7bc2b28e66bbd36d36f706b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1300 zcmX}q?QaqX0D$ppZM%ZhQOY50TqYDKP@t7SqQ*?2K;a6Ompj&CorOSh#Vv6rF3z{K zQd*!j@>04&)D+|>T&t@M-3OO#(9}qAX3(C?K5U6Gx-`bw=-iu2w)ttv^AG%zM`=U% z?NRjeEd6(j3j@Ha6n?)_O$Dd`c<2x?Tmt~Zz%cpYTkoE)f-!9>RBr;vLm|K4XVFjU z^~$)@;c(D5TAP}v1_=I*GI^;=2a%S$WW-+}boq=5>NrVb1+tQ_0oK_{EsAhwqs=Pp zlZ^J*`SQ8lgqWpK1Rytj$<*JNAs?XQow_zED&MXMx>4zj@pkxN;$W5Md2jwi=lSt% z_vznoCb3?v9FqC*%&YB!lFKG$Br8J`d?LncF$G|v(sldP>QUUm4R0pP1Ian+<~hvM zo6W9CQk%Pw)yG$^;#>O;2*+d6uGvUHuo>WQvB)Ke{7`){U`K{jx3`IDnQl0{Li?pwb@Pc484eyBL>f%=xh){_JG=LUiybo) zB~*IPd{2R9QzMu_O20+237sQ;WC+r$PBO~B&N6S>yhOpADJK)^lSa77k?@16F=NSX?Wr=57rc&!Jv`7u8xkX_HRrs@7EKKj zihkHTRBy$oabLSud5Z?7Mt7)T!8_|D9zs_DTqobyUQ*GDu?81yFTkqOo;@^ zOg%5)mtP@{(11Cy$erZscujpI!bs^6--IQ;&-fqTTv~kG~8Axh6e1k2i*6X6+ z=#0*P@MnHIr*wS3a%_B-b)*!q?N$QSKy?Oq^DMP$0Jysq1yvV8GY$8W2Z8^qA)?eW zkiuFwgdg$#O+d)YDe55o?-BM3Z4?7V!M6FP!`u$EI+jt-m80e>d#%w3p;jTJ4+hqDqhi~&~Cf)@mhq(({I3p!xdQOEagA7 zN%TVZnW$7k8%R9epSGS|dUU1(IodwA^8?;@lC#SFY2!1&YWBxK_H@F8n@mLp$x<(` zw;&CTs*h_-B}vF(ZA7zTK{DDWEcS&9RxdifF3YZ2=#z^m>a=+*is<0?Bn>6=`B#c` zyfDUjbQwM@yykr#|6||r;LB^0kyHA%umo&F*_XMH1|L4ARV^eHZoH$SzHo`#1G%uV z<%ldDLWAY0JLWZWZi3d#N(eI6T6w>fE)`N>kNE~{%cewKN|OUBtEHCeX|+Zjk_%gC zF|ubn!(y?}3*H-cA5O`vq~tXPkefAOo!6B)BViZB?=!7nNHj~#L(b%S%q-T-ScQuV zKF7Rv8X3KlLi(JF>xgZ^V5nYdHOcE7ampS;PZvXk#N4)KYYNKqOCS^XI?U2hE5y#J zp_@TP`$|+Nr5i7VLj@C@>nuN@$nY6glWH->7zxi9OiVGf7$J>TT-pn^=mit+hsp8*4oMoqNak#w40NvkIPB%*>m)bMN{1 zopXNg-kIp#p3eSLKYj55(fIh}1DYyN%!))*6PcO~sil>+l|?$J5>xv`iQX5fk%-(V zL{ti?)In`Az12pX&|Xfd2ghNiP~=P@rmphD4vI>|F@4As{LD#kl_T276z$|bB0R7k z=OQz>`#Vzw9m{`AC6PN!9U|vkS9*1n-LTVmd=n?tZl+?wx2cNbR;IP`FH@)P+O)Ae zV%q3Vu>0KgB*)!ABBxnZd-Yc4Ky{qvTDcnv)hcO(;Y*xU_TlG26)LDC0mR?KNeF$5 zB3C#KRhsJ<=Y)SAU3{hz-Sraam`_y9f#+h%S4>qoQkP#_V7us~|Euwo+N2XV{$7IY z?csOy&Qwb4W@FXi7KdsuIs{?&)}3>TlOY%c-bjL*oDOwC`1hEOLlt=ADem0%-k5gI z5P8OFGzjhP=N#htzt8EHALGU-oYIB?H-AqUI+9-5fpLzXsUb=yKUKcsW^p8HI+hwL-{h5MafseaDyx(v)Q^%qH zhDZIHZl=R$f%*+x8?13!)xbK0rf_hWIXFY(CCGIca*e=hKl;#-U7WPyT9Cr&vGd6# zH9sOvW6zBZoWcL{r`P21BF0?h9XksUS20#vNpL9bSrVLen1{jGlAyXj2i1KF)y+%? zhMcHPLbZSSP(24L#@?d8KwEV94U9Z?B7^D=nFlrPz^jN@Bs00^?Ayp@XS{)-!+^F2 zwu^{yOCT#Gfh4W#8wluw^N{@rAl0(RwQpMxmc59o<br%oSaSKf5R65r z6_M78GF0eAk=TtR%7DwevBxH26(!3RXL+z-mU0;tQR&b;q6zjP(3~az=zE`WLwh6cJNB3n!UBa?(BXxeO&ibLh3j#(vv-bY|HE%ta)oJa6XAeGFu{nVQdD& zp<~WF7)CIRU>L!$cQ9V}bs?LLzL zf?)*1mPqU?l028y9MdtjrC6de_HiO{|VM`?ViqSq(t!D`% n7)CIRVAR85-iZ;6c_w-Bf)R|&9xH-i+&k!`C2Zy2b{+U1pn?Wy literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 deleted file mode 100644 index 64619890057767ddd63990d313622510438ecc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51IqkDT4*^jL0KkKStu1O0RR>VfBpSPUQGxH2nYyB2n+}S2oA@^CV&6}00^jn z06+*B&;}j=000000AoW#Kn6oV0000CXlQ5v$Y=ln00E5+4FDMp00000F`=QL10kRQ z0003=Nd%K>X)zc~rpck8BlJ&7Z9iE`QT!KmSbf9kUsBAUBJRF7(DHa^3*{V6o(m_u zKCyZRVRXv&E-$>ERt}vGl=2_`VzKZU#g2!AEPca;nQ>WJmNLd+pS)R5EMLgN;>LJK zsQpX8dykcQF~#pO^BteCPAcGc7<4alhv0Wk!RTGrP8Gv5E1`7brd&rHOv5u6M+Q!p z6EedOQ5=#~H%G$6?aw^0P8&MV~p^} z8N=u}#C=8cj*ARfG98v#**Ltf4lK;}D~htp^-m5D?8}BY1n-DD`18 z4~dn0OqODgMvt=}N$h!D-IVL6mE_Fq;^U0;J%bec%N8$bnVG`wtFYj{(%^dwqU^db zPek-vHd&AMevkD0&&A~IyFNkC#$NNf;d@KuBMudJC*)ig47xFc69c*Vp7Q9P;ozb6 z1@|w-bU2^IIA4P4eQB0m*XB=*tKuwuC&1{qV#h^$$8zv~BiI*`JfCRz56IwqOVne) z`UQ*gF@A&noIeE*l`8cQu>6mK@H>wEK_ z`SPgYBME}o0jgD$GOHz8q_8xQ!zwIBMJ5?kVq#%Tlwf2=F(H7#D;5hSiIWPLVwNmM zEHPq+F;fgiCJI==EHP1xRbpW1OLJq>&c diff --git a/client/resources/hardnested_tables/bitflip_1_161_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_161_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_163_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_163_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_165_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_165_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..7ec52a440530141d10f2efa0d982a92d057bec1c GIT binary patch literal 12849 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 diff --git a/client/resources/hardnested_tables/bitflip_1_168_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_1_168_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..151d6c198a5e735f5f3a14f13ca538481f673916 GIT binary patch literal 29435 zcmeI5dyG`|701t=xiieHGxJ+u1M7(HAd4)x3yAm#HSxCffyi1FAE?{7wiHnT5q!X^ zc(oR5Yuhw6t+AUR1>m!=fSAB%F@x4H?Vnt;6^>gl>ogE%htr~6p zO|pAu@8kD7zwddUbMIY$|MtdN3s%3eP-Ii8_0YdcpY3b0Yx}IVYo%{ppRJQ$Tg%Sg zwPM#c$SLbM*pd^kBn@j@(*RI5D9x#zm9*diyfs1(KL8 zBl~(AIb4uTPNXEo-WENp-H4a>d@*IoGlX9+L)Rtrz+58#=hN1!RFJAvhO-}Nsh4(Fp|4rka$p=G=VqCNb>Sb zkV*$)N;1tzW*J9@a^gLFxBoPfzQ%;9Q;ams(;aqEv?$+5qkY;)35fcP6q`&~9M8F3 zY@68feT3bpC-GTo!sMAo_O*5iG@fUqMfd7w3B$4hsOZFtj0Dkseie*No?+yWIeIK_ zGBSkO#wzhf4(Ir@x-@Gy#WdLMI?_22Z92lDp>}E(jI*BjjnZZ#E3a4I0aDBY$q224_eMLp=o1P{763U zORfxW>RVyMxm*+hwb_*Y15B7c7&I;~M0lscdpuWxOUl|yxOOXJogHx?BTZ|=x*-s8 zEc-{QT)<*rE--3AnRW^AZ-wQYpL&4vZe`0z1@<+7D=Z4rkUXSC*|ed8=ua6e0xN8W z7=f6~dEL%`iJqf#-#0G(#)68xx00t7KghD)9r zU_xTieyV&aRY9S^QE`5YK|7WPh)x zp-@sr)eo9h(aEmts#!jOp=G{mM<^#SY`#`Al%Go7LK9xWH&2E8OcS100=NlA7XH|j zm#UCA8|m(1dNDn+PXu}=S|UkS=`RA{-*65%qyR>x&29teS7Nv_y%F`7Mf2#f%fKzk zJdc~O9*GS-7Mrvenet7u!0u8bH@BfFB_j{7LRetwhzlZ(`oNU;`*tMQJyM8NG7^!z zwclrH3{q8>#mx9!C^#Kfvyz6xYFWL|c*^QcCRDlOx&Vodcu~Ouew_s4y*nXorIER# zSmSsjod^W1e~%-t#;Y96B9Oe?GZ1ql(;Z{N+3g&@iwp13DgVWK)Jy<-EDIYIgbl3D zT1Fl_hWQ}{?fw%>Zvn{G*LM(wVMaRasZ3#KLx6&}Ef$4&6}kOEJi-e=pEVErn7Z^q z3=d#wmJ#X|yZ>C*kAkdOz{NgP*6Qy#mV_zwMk@iFkhXR)iaLtv4&<*Th=E$g6XH>H z1s$+vj{OP9C?xmSkgJ?frE5m%Cf0IdNw(wn>>t)7fx@sV+w;fd#%8aZ0n(|xf)tY- z3tjDOS+6Q$7VGOvCm64RxbA$*ss9enW)*>@gN0@ znr=P~3a>TNW9PGUXkYiFl7(s9`V#OWsn~DeOW5ZkRvpP0(6@%E$1>DG+2v>W2^n

    +qH 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 QdU$Psfp871`sw2T0zXs6;s5{u literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 deleted file mode 100644 index fea5cf3e8286222bb847d6e2c392d72fb2853361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1820 zcmV+%2jlocT4*^jL0KkKS;op;8~_r1|KI;retZ#CFw_@ea4}E-7hs0g5kLS0HXr~3 z6j6P8;0*r&000000000000000aL~!7hM5`~WMml`8W{nJqb7hdWMUZMp_5GwGBh;E z$TBiCG6NGvO#o!b#4*D|CYl;#XlapOKr?n@vDg6}-`eKx!{Bazp%GreE@FzVs^2OM-j^>$Z$Ikx<1q6 zA8c^*4>HMzI*!Wb936)l(bTZ$8IBhi9>kB(vW#V8B*s~b9tU%&{_ZE?9CUO%o|E#Q zNbX*ye^Brr_c|%!XVm+r&~zR{(Eg$6bWhAP^%g0KVxH9%*~RWXZZ9((Uz}$c?p!=W z(#Cn599$eMdCukb20i8Z)=y&oNAo>EdJm!h(~o(d?sQnm>w3qm%e_~=y({+~gZ7@2 zu|LIBW9BSmWnK>xABpw8xA;C6-a9MmUsH+T$F%!TCK>e)LE^`tADr?#m(Y5S@z6gBd%*Hi`c@RU zr{h;cFWzBcadlGYKebo&iHc8@yug>lK2_qgy_xr2SCbtVRhWAi?q&WS9nV;I4(0Wq zv2{A9RP%?-{!Zh_&(a?P_*eWV*!#=!o=fjOQ|Emz(!FQteh?mkm5T4eB2eG2@KxbHZwFQEBX%AVu?XQe*k{0a8gx%m`5 zsrgnYsnwI#x(_6}ELiCCr*d{5#oTr}zXC)rfqoMt;;8+_ z+*xIV_zan0h87sGoeP3u#JGnHEKUm?E)1AvD+R${?Ceq4=nL_k6RV*^gD4q+9ZZGt zs^cdDeC8FHvBaRl;&6sTz~Zj*=w)4n@D^Tn6AUa}oD9i~GBC>E;dm!Og9b3TS4Jh^ zE4?v0#FyMv>_V9?3#iMfmz>})1;%2^iwu}#4;1lsTv=llDRG$0xLEEw4ky;AKjBM( zcOZ`Rq29@4$PSCaGMAw^S$F|C0E!dS5+MgBoIGZ~y59370Vi;FB>9SN2gGB9GYWZ=r;%QEb%g6>nHW1}uOxVkzfS!BzH6-(Y8 zk?1F+q3KF@s(H!kDcE4cD;URccPe_8Q!I?V0Q47l@;ry2FzD!UT^&i#xGb?ACE{L6 zyj6qFqkx|Byb*K>>~+u>gA)v^!92sF z=!{%5i;0tkj`8OmPR^?CCxecqj4{=nO8#X`87#zMkxW?vRWPYk{&<3-{(+U1jK)kV z5jv2jRg@HDQW3>jDyp0%QsHE&Sz@JSij^41BPuc$U@WX4#wbjdN*PS7GAj%UEWl<+ zsf4h^!b~PgWLZ-p#Kg)hSVYRoSTe9+#gt&PGRziaGNFXSD$J}SBFPvTFl5P$l~}SCGE*^@Lna1HQdq$(Fsm3V1{ldOz%a;RV#XDQ7{ZebN@Es3{x0N- KaG@cMl)5;~NPPPM diff --git a/client/resources/hardnested_tables/bitflip_0_059_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_059_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..3fb7f1f6094e9c7dd3fe6357ca49315d835891e1 GIT binary patch literal 18328 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 deleted file mode 100644 index 4dd885ec3ec6446a721dc82f6a42858f71069e03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmbWr?K7JP008iZ2sg=vA{V*y*6Ag;lS`9_%}XkVq26^$JzW!t$k7_h1wkxS4U^@H z#!KSRx~S3WI$XPOXFQTrB9WSExt?=T)_NJKMlnP7VgJE?AAb>7bAzej5Fr)vc~f2m zAPJS$e_rNGs{(DB!|{L|a0c9M@!`%k&Ncwx;Vcv5x0NP)D*zk;DF9#_q?0C6D6&?{!da13>ROY^MzX^XB{E;_$#jd2>>4x{cm1<#1! z4Uv9MXX)_5DB342!(%0KA;U0{+|!!+->F#J9!EL=6qzrx$5 z-d=t3nzxp%Y4ddgcS=3E)&hszL#HD=6S42NuM|9{?Ad$sw?xL5qQ}T>CSq@d?20b! zQf;`_d>HosRew+Dl`uAC4!f>BM3*N+FrTt@0fq%_fzS3sygyqS*JT?6(`($uGU$Svm6Oy%^6#Hi?|$9w_RMXYowg6Z6@ zwr8f37@w85$rmj&$@dRW7PNP>cop$SqfM_nzmx5EHY{y048Qao1k+&Yps*E8%Gt|| zmFp%dBa!oEm>j4TY!>n>q;=oa%<`dzN9AavRB9Y@p^vS`^~iQ{>H_sUR<~4VK%OoU9!h zlhbb&p$|s&-2#lX(L!5VTB_xZkM_sScl$kzs|g+ubI^lawl7J1tAa~N#e&%i(q&Bw z(UF=Kb^XfodfnH0XZ7TzS`-3>a+C}ckg`VASy`W^1uf534`h=hm&9yvNO7hGOsJ`6 z1q?LhRueKbV7394;Yp+k_4JVJkvR9kjEg!q#h@o?xw+aKV!a=@*bcervGVljC=v^z zWU$ma0ys1s&2DvL-;q-jK&+&XdTRhg!;%(`iwcF$m`sqhLJ-)a`%$9qrKEG?(Ngz; hNr-#d5GAu``#bhhI7t6G-15PRVV zAp%1D0R}-f5y6Cq_(+V3f?A_Sz}82iD25=B7=%73K_WPQbMEfl-NG(Zs^Q1IKX&Jw zGc#vq&di*-JDXKrUo@}zy_*6=Gxu*55+Buc_2BaulTYMabyp9*>+~x_WHlFLH|RnU zCW16Ok1{cOgDFcy$^m}BlrPhGt*@FRzDg!b!c|>8{u~Yu_zcU;VVcO4xt@3XK$-Cv z=6nZx^u*(O=U!_+r{$%wHA(H z8o5v@OW(BuIc#Ul<$zU&2|J?^jJH|-VH~8LOhcuDZOBIhR&ppS9~eR37!GD)so)l- zGLfYgB&F+RAO|v;iMMk>7IyZ5&jb;CW}O6d((sl#hyO!Bx`t;LL~PMv$f7C^7q3@wtHclV*-TS`v5cvBWK_pGv5caa4qyrb`mY~k1cwVY>(VG_D00E_!_X6;b0~+Rs3JB_2FQ7vVC2(g~J;PpRF)s*^qt6NYe})4cYc(cGE8gpZU~s%$%8dkB!LG(~bBBsGWu zrkgvMO6%kHF!S4(CIj8r&rFOp0(85wiga_Zx*FuNo2g~6RnP)+)U(}G!&EK{m?lEI zjf>zuj&w4F0|UTvxqO|##PGfgDjE0sLh`T;n683vi^SCt8OOAt-GY78segy2O;F*2 zk#Gi6Km>=Md$S7p7Snjc*7-Qod$)u&ku0X^bD1jiTw)FZgr_Zfm}#~;_2k=_!iMG# z#~z)Q2`@Pc(m1anOwU5|LaAbUNQ2Iful0h)a&taB>vMTdBQfDQ8#j2NI-#C;8`Gi$ z6c>d1^q9flOtsM9PLVZCqvaseD=rcM@NAS>%B@;frZokSbGWU2G}9=AN=YJcp#HtTi~sbva@ z6l2gf6%JpTjO>mk#SW%i{VVy5{?tfAWMTGersrImi-0psyBc-d-6C+q6&h2HJuX7M zVGzUFT>%bgU>h3QDu<)`tS_22=Nh- zwORp0n0C0daQ#kq-~fkU%V8Q#2a_DIOSi316dXTniR2g1V}H08dFo*gAGr}ZFqnX` z6$uw{7uKmR$Mt&jCP?{=(GY6y7cZ+|x?My6j+C3FSQyEXb}c#5mJGV$Yi|W7m=tC1?+xU9k4 z5=u5k#b^-R>C>VL;^_nk0ikC&sd?XL3s z2DVSbBhwTV-|JbpLYeI*;EIgy+lspl^e^JNJ>et^%{{F_YAR0%C2@+8yI_}1UT9PyDt=a8VF;;N)K2n4%s ze~B#bB(pe+AJQiNLEsW7L6!5B`~lFWMs9rpQ90ga5Y&Bqct5r22?Y^MQljNqww8}h z+y|io?wW^OA^;eNhDBqq;Os))*gexZc||JM<7j4b4%8*P8>iX9bjY1h0C_f=UBC{O zYG-;X2_ZHhrr`$0tzX;JUq!bSSpvU0oHj(fn%k?nV_v9^kF@61+^#|X2jH5mxf3$G zF~b#Rwf^gOcYlgIH?jE%;Q-Dq+_$&j zB9v+%u9W?t-QpW;`EgC=xiTJ8zHPm0Q0oG}ulcprT6fga8 zi_9ApR?X|3{stTcyk3CU3-EdYGQ+%~o%DJEUN6Aw1$e!H{IoCCUN6Aw1zcQcdA$H* z6R#Iw%&-_41iuQFdcA;)Bc<;%UN4~UHghPvUVzsNi29D#3-EdYZW{4=0p9;_-2dNr hy?|@JFYEOJyk3BtydB`GdjZEoh7sYp|JhMB{{UWj(Ww9c literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 deleted file mode 100644 index 7ea71a9c6a21618fc2cf146b821a0502248669bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2472 zcmZXWYg1YW0){bK42HoN6%QG6u_}t3Q8=_6)_6%`)T(E_aq-a6CdZf4sfA z!#bwDI*wn$5%C&@>@dFO!wwwdICPwN`nXqL4Q}ev+$BcMCH$v2FIwL95<)jlc6jQK z3>qzHuJ7<-(DFCC@BKBfvd<9sdNB7ZM0NU!{wO1qQE0ET#I+x5>kgD?eXnIzO>Hx42dfZ^W9&x)(Q;8?}Q=MTECZq-JaQyw={{) z7fD|RD*t((VB1_yivG$&LpqthmhPGn0@_bt$NCLNtU(q`0y_;0pWGf;@0scgtCz}` zSwyk~lPf>!t1#|{#;0^_{>M;enOWS?B%biM7Ia-M^6k1>@16u-wO{#}JwD!kY1v$}uGaX$|O7^mL}(35I6(rTpHXFHk*X2#>1)%Fic2R)kcd&^t? z#-DROeKl;~OPUS2ZvC<9`?Qvy=ASnpFnV{Rlb3g=w?Dn{` zHj`WmNCTv)&}EufzyZf1a|R0O;S>%j5@n2e8Cf87lhdG?k6CbPx|x#Xt}-VD1H}SN zA6$`F;45LOqn&MkT5yYns1xH09EFrJwqX?=$CLq@ab!xw@=eS6Eia-FjCM8~L`NNA z`tzdbJ~1Cwb{Z{;I;@H!LI4E9)h z)#NljQ%wi#Tq{OIkmxyp0zoEPvs@*pae{n&jHOqFXh90h0-0*CkDsStn8ow7lHhu6 zOr#3V7iKg^Hn6$30yJj*IYp#`iIUMFXdw+`GUj8do#^M&CimxMy*40oO5C#1Y9h7iJ^dL5XI(f1URn$RGW8Ez>g<;w5&52+h!RMMfc`c2>ss*Ni z55^3Nc{Q@B1hwmmK!iu^hA%!fVp?#F#flH9U0*QKnX2bL9^wFF)EJO-JIk4gWr+Ft zBkSt#2U;No*GvTknC*tk(0O%fj||>R-6Mx0Qj?5UHl78>x#74uadPc`DEGxlK1IP; zVoR*on5KV=USJwl~#?UM9)VMyjgNP4QrALpK@77D8poA_5QY9=)&vmV-J zNX%!6p=9BA^e;oR!L|5g&cSE%Pbyv(!owgm>$mo3lYP-dv$k$CWo(B?B>~EXHc6a# z^H+=Kr{sd>mFH#H6}TWRtz0CFn!J{7Z>pa-lij|#J6IL_ZP)nSwXHb&{?JgEbuwqmTrp90)p4=kJ;J*jRjX-AvA)h$y-ezKyT`{%y#eX(WS{ar zxtIM&dVhJAI4ddr^Ub1De@_^B_^kNCeHB*OzqEBPOZjx7;;v_xpbQ~J1vb1IDzH|D zNXm^bvQMo$1V2@MYfnyDKlSeRWdC64qw1e~_M_(Zm2;|5)w?PeM^2cNNgB8tLBn>gm8 zL%-kHtA6I+aZ5FfAF!#wb8SJ~>z!t!{jQ4ce*7ORX7TI?E)fzp<(Od&N=7B}OIKo$}Hx?$s@ublL~ z=1hE^3{bT{I?J^m_za})SfiVsM{wV;TVjegQ_tVY2x?v#h#3v~&6c|w(-))mVM@SG zwI8hTJ)D=<5Opk#YvD;i46#hRW*|&~7*HcZMOZ|eJq4deVG4u_ctFDm2LXet_+NpK zY($ADSOtNUk~xxzhf{Ai5gviyW% zija0-D-UX9I3iFBD_Fu1s##P4;>3&?s6A@e;V}gdV=!&9+mTwTAbO`{!NIKmn(e`w zjXEPDUVt2^zGMLr83m1ygcTCXW>JMRjj{P>xVLImn2exPkqEYMz%MpD!d^Do;~H+D zl5Eacd%m!_02QWq`&l}s9nh$mfwIiOj|G64PsPAN7dmRQVU07YZp9J&`wlqDyDQ|Q z{EZ5eZ>H3!^->2bPH!CB=1n*1w17|#%m>J2ASqyR0zw>uvfSxy^Wt{4#utsOv(jXT t#?(|_zfFcRRhX(nC*VUKVNoN)In7Z7)=e==$o_9a{*ubhz45;?`!78MV5a~8 diff --git a/client/resources/hardnested_tables/bitflip_0_05d_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_05d_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..f149660c50691ca3c904fe8a81901c030414b83b GIT binary patch literal 24131 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 SIOX0k&zVDbeK33I#{UHqqRZ|8 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 deleted file mode 100644 index bda71a64e2f95bb8fa9d600b29c13fa68e27ec6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1448 zcmV;Z1y}k)T4*^jL0KkKS(fx@)Bqz{|Nr$@L9>bUK@`9d5D)+mL;!)90r6lFKm-&y z0Dy=91K!{ZKL7v#00000000009MO{#022{`8el<)!7^YGhcslwzy!o#Mwk#{Fie;P zVa*vaFaa?b5vBwfj1wjS7;{EUOaM$q1ZjZ=BLvBSMjX+T695wtff`^zh`};o5rIic z5RFDgnomU3^l3j*JwwT<>VBpuVt6U$si*f;LV8Z&eJ(zs=Reu|k4kr`#bGk)eapFc z2Z7j*50vP~(m3dHtMxyltK40mg7&Z2p40L_(C{x&9;3># zy(#BElKK`udg`m%`rJeLK4+Bjh`t5#od*|-51nKB40#qW75Y9Ff9vOXyOS7U;<$U` z^gYq|A2alKj`e+y$@#mTPrdM};{OGg2ZH>Lr&qOlj?1I5kEv7l36b|NnTq^N9Akxp zqB@|)MU=5j6lGRiI=Y-PW-}P*oke8ItYTuAGF3cDkxLU9PXJ7(aX!Nliz#K3EU}8r zF_pxfS3|LsGQeXMmRV&(p&q5xVUr<&KJu3ngE5sd2MA<8vRPGOWUBBfb_(J^${&h5 z2YSOMTmj@}V&QaHjs?)H%ZrM`BMhmGI2mPwj4Uv?Sz{fMaI3*MJBif071-crCkumt zj9p523B_C&R~ea^oy_QrWn|3koEK#1%ZrT3oktu-XGRDguX*;KXNll(!=d%Or*Sx9 zn0$-4y=%bF;$4XHI|6~9t{g2S-tFY{4!|)%1?_WZHQ^nqQyDv%ftJps=-mh7D$G(T9;#Z09 z2kknX9};#rkIc(2FnlY}zSPIw?4JAo59V}FLE^l}pg(!<1v-bwF=dR(#vX%*yqym7 zxU-4p`}leo`X0macsnO$$L(KY{a^BSd7gH8oenSJ^(^~G#JCwa zUi0E#z;SgQlb-5spe$Q_Za>H@-J}9&^`cooy_d&x;h+B74jVy=6tVt zbUiH0nVFZ7`nB;uV_&>c&mJ36NnaCUK7Fra&K zqN4o)N?z4cmBc-{RFx>=7!DIGqlCCr<0@H(GA1lc z#b!v%GRaJsqmn}u;g&}!Ck4YQ##wPLCRH%FF@=;I6yalwhFNkPM-wZQlPShW2+Fll zg{o5q31%ZQq-6_YH%#ubdNF(l!Xrx{#-_`8xR!i0pkqeh_b Cx1gs0 diff --git a/client/resources/hardnested_tables/bitflip_0_05f_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_05f_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..472f2b8540df66a0e094c68abe108ba988957cc6 GIT binary patch literal 15388 zcmeHO4{TNC6+idAS7_<$J%u8a{#jquEjat<8DJC{;i1eBp=*(4uodQWBO5~sO>~Ki zU@vS2xALdXWK-+pS=eGC|CX2y5u_QLG16cqWK+?B&SVM{1ezd!%GvLH_x1I?@*X2) zqFe4wdf&a@cfRlZKi@gucN@5|ws2w7OF3UBn*Emtg~X!f=3bGh7x6U1juKn+0Fxzh zuDZDwzq9nmC$hGB>c!186L&NgqH&3@AxM6JZet3F$c=b>nJG`gRZ}m9EROoW!wyyI z09z`mntMY-Ihr*QP#c*1l{&5eH+m1$a=w2y+FLkm6?0dhoGDwRlxfHccCrlQ$Q7n- zErXN}rb3ZhxRc6ta$g?M$PT8E?8kKBtTMF5v^8rY-lKR2lH&XIUh*fKeCz~}Mu^ z0rVGO)>4eaWMf4D7wBdx+sKslHq$8aF^zhNr?dm1zS|(d7PNznY~?2~2Ld?;L82k+6gp+BO(W6S2-X%D zRAAo_{{&_Q4|gz4S6*6d8lf#qFnAnh{Ma?TFDdj1D5DhkBJ>7#TDj~@s05?;8BL7g ze44|KACrfq#%{`jj?@C?a>xgchDe3lz|hI6W}3+z#wH-<5(sB1xM{H+A4jZ*F+~|T zmIH>oVpjo|Fp8{hrV^3vY7r`cWa7H~nL)3li<~jq2fyko@@=+AfAw0&k?Lu%yIk-F zCHjup)XW`^&Q38nFOjMw3e~ZScS9k71d;EdYa4j%HG~5?3FLnSTKG&!M0ca1x6dJ>2l~CP2rnexV=_0>X zlgS3!yG)eGMT8h8OXEhaGl~3;DR&RkQjtcE+_ww{FU!*5bfIyNLHy86jcmr`;o9M< zF2ux%rmY>ECLsGC&NKaOjylw1Fpnu9l&me_4}bF%s7^;g=7u%|G!cY%R~`o-j|IvF zY(gn_jUqFJVTicriuCLBX|FL%vp{4_o>Y7>Ij&SK#q$y$q?$&>3%~*-iXLcek-TFf zibxs6F9+izCZo}Xk=vP`msVrlA~z{8qN}3@w>=#_Cv6(5)aV7f-&(CNo8h$>8iOml z(wdPx^a*)Mn~x=oe!G!$jjk^q5O!&zX#W6_1R z1_Dq8o#2DImKAPgdN%=ke8yl=IXu=6ll%k?y{N)9 zXtyDtnZ0BdiTj1tkXZnbFZ$7G4PiC98s>_3%kSie!g z354_139j%4$)9gXF?e~J>8ZnUC7w!{`HJ7Tt9L8;d?2CXm8*k8gAJ}P|=J#9iX?Gft=}aA&CXyjc zdop%r?%1hV4Tkz-z_XBQneLG%u|zfEHB-PBsYWaU;hKeEbsnR(x)`?VxR}Z{D1S@C zyt&re6mVhlw~YnBRMWyEY8>DQ`Ero8X}YP2C;7&} zi5|wth=oWJuXTd!?TC+~qZ(|7xG77M?tEH+L~^wqBV;iR9I`Z+$B>LVrhrJFl-eDD zE|7dM3Ik1-k&f47D5N~J!7)yz=A*gr%da4~sdT_e9XwhDu5R@z%3<3C`!G<)V`_$6m7eLtVSY!) z3e&I7Xv+1UuOg;D9yXTNZ4-z=ve3x% zHU#;uR0OxX&h$c^@t}arfcaaxQusN##q1`4@2Dq8r>kre!!RI;CaHJb-ZGW>15-d4oT?@r(oAhIt=PRf6{;GP3P10M zdlRyPqDuN(@boF_BgC0Cno%X`+Rbq)6m;Ms`%udGk6==7*sTvj<}hB3B}eVnpC<7B z1To|#QxiUlAOuk)UwPd5nhB_{!_a)X5kngNoqc)9OL+uQ1=2h6ckQyCgKwZ)5y6@? z7thkNL=`StEq(wF=b4xI4e#{@X25%*xaKFMuj?9?FYFdN76SeiS2eQ- zipji{Eg`;v56E@Cz}un&slA@>o4KpaY@M|=AnPzEJ)3|ZbxNRCGt%G7^Vs@;3BIUF zxY^xtw|ubu>8pc2t z-_)ekJMg-FMa>i zKBDA!UfuDl6+bV@2LJ5*XlMJS(%lVoCxzrYAwcE?4naViI|}Up|BV8#zrC9Q0NEuF zI6YJ{vIhX(0{#bORaME?-`)Ljr3gNTtk=(fFc`d5Y_`?+$DE$ky}bhfe!12?`q_DR zWP@u;SH<$n(KmUzC+L(MLHQNZB~O2tpQr%w83gT^duQ(cdh;w5X-5jQGleq0xSo4J zQf;c_a8|mfM&@`JBsbJ=)TvAd9(iL*&O5+*lD|THs z-x%4Rr8=XLbFMLTuyU$ETGRD(CI!}tzgVblzxE|pAkEvSVAij3frzR5W&hKnt6hf^ zB)=$9)GF5Do9Cm&pKPh;zfmrqtURlDd?Kf- zDNEOfK!agZ$>60ST%bg$T52$~ASli-R7i41s`@l&0B0nc;*fYMjYyUHveAH0<;3wY zL*tT{tMW>o9*-U6ZQj5Hs6pv&!rOvQLnI%OJY0hbNti|ji}PN%o*5Uk9g*+&JfmRg zWk!+_lUf6FW!$mA_y9`aG*KOeD@uy0SqI9sfDrk>I|CZ5Ca49(sN%Ke)W0r^O}UO_ zR~+x1REl`*V&itEJN8H|pyMlKIfl*<1U`7XaErYE`iO8Mp6Y|GM^^V{ucl5o>*-S7 zH#d;W66m$ddGb^tJKjS@PTnquOp(mfz7;G}=3g>wUFnE#PnjPbvl?mwE_G`A)q~8v z`SG*a$>L4U!nMF;vlu1&)ICrAa7Gv{2-8-Qr}_md4YE8>*FjX+aoZ!#GQ2=72SyJ= z#FpZh{kq_4{u#Pm*;ZIfERYa+E9_zD)+&z!HaEa#i%+!yx7H<5(-HfozvmCM)AhWw zX3y6@5NWyLFxen;p9-S0swH)AG^T^_nAv6z9+f{mA&v%3za0RUmt*@ujCMhdmg&Wg z>V$RRoH9{qbD~~OOBDdj*!CgD$Pe4)s!=7~4160h&1LafZCX&q>Y00J%EJ9pj4WZ% zDMZV2Hj$xdMktH*!Mz6;gUrqEp>o8?kIK<$)*CbvcGRi}U8?v=pD7eP!+Et@n_1c-JM{-%WNH-Z{c7|}phZ%zQv8*tGd9q8Nvslv()mH)k1w?mOt4( z#J3&`Vx(V@um*D^BQc*tN-=USNuzU5X?_fMwvJUb&M8UEh)yCnP1|U~IDr_ja$}i5 z=ox0j$n!W)dnrgys_d8sHSETsKy3J^`jEraNQp$IYZS;_( z{4i0*8JWiT>RNjWo`BynmuV6pK+2gkR{s6sm^D#51R7ZHFin&rSr1y&ax}NcEiiZL z*f={=r;bzlRIJx-J1VQUoAns%u9K^-MDK=;5irMIPc>dn6*4ddnw}=Ocfc4k c?~3vwKinI_akYHM_f^)7y_MBND{I~V01RXgWB>pF diff --git a/client/resources/hardnested_tables/bitflip_0_064_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_064_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..a596bd59c6c831cde67bce2900309055f6a7f26f GIT binary patch literal 21807 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 deleted file mode 100644 index ff80c223390f495eab4e1d2c27f54dcffb92dea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 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 W0a0eiJAeC!O&3x!W;R^n)c+4N`g(x? diff --git a/client/resources/hardnested_tables/bitflip_0_071_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_071_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..15ebf5ea034f20e2247a5fde6836f37957554be0 GIT binary patch literal 45965 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 Fe*t=46y^W` diff --git a/client/resources/hardnested_tables/bitflip_0_073_states.bin.lz4 b/client/resources/hardnested_tables/bitflip_0_073_states.bin.lz4 new file mode 100644 index 0000000000000000000000000000000000000000..bb38d5cb46f358f78b73896fd35b3553e8e8928a GIT binary patch literal 22696 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 literal 0 HcmV?d00001 diff --git a/client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 deleted file mode 100644 index acaf1e210cf5da1b8b11e7e23d53fe909c4cc29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2916 zcmaKu>rYb&!p7^k6oIoM0_B`dUlB@6FK40W@P434Bd@xM(vxwxw481TZBKh}ce9&N z=EKm0f`~2Bo&|d4G-2tiN>yl-)-RF}MtY@}jLzz2Gs$LSfyy}9Oj^`TUqoI1f_?si zCwcOF@;mq2-${_ON?wn0;@2;IjDIwaF~2`CaiZw^q7z3dj-5Dn^#%hkeeplvF#cPP z{22i+&9J@(;Q^y63W)*7t>m+bv#vro@o^WF@3%wjqcW3gpaC+8gF)Egx#XPd+lDpT4y{@pp}VdX1}_H^PJ8u2Soz;}uA9ZT3KOX_sO;-40~D;oleig!iU`h>e{ zQb?p=p6GPoP#kN5!7z*k^oNq#M7;Fl#D}TU!ssic5V?TVs$PG6JrWcGeHw$;U@49*)(OQO2!(# z`NgiGantrDZc|N_ByI2ICxg!S*L;=L>WFq*m~YUGg}grnK6UCc7Yk>j!pKaiRGjV( zm)ZZCZ8x^#$@t+nQ-{*@8X4a=jNm~$hP(yRP+K{>Ut_@h-b8M7d-t_BF@uv+^tz_) zEAP={Ym9huYYG90aBAvVIoekGD5}4{JDkgW3#z7O@7UgXYMJGsae3YQ6a7VFTmEaC zy7Na5^W)r6ft7u3*ri8f?PhM0f7q!I49#-NfVH|2W|`|$`^-stc}>$lAzgM0lBYP0 z+>UA0*Mdl4MYu3fU05B)qtljkLLrH@{ndP?ssG9wBsU29(88Mb|7*8C%!~&LjyLq> z&3D4ZK2tKe!mIfqns8$avrl*Pm(5@Pm`K&H8=~4&+@&Yopc3|zN=o}GZy@8djgC-m zRJs964FbGm_7dvH3}7-rM+d=4BgmbiC|MZp?eU>tJl^rG!Cb7HYa2yNl#^h0sbu0Cu zxrLFBsXzzVcZlccAKWgyY5kM)Y>??b{#PYlC*L1->Z0{BMTp{de_( zw!-8GJe|Jz5!jO~3_HyIEg$F(H%XKq)O@r$SEACTfvWxa>VdA^ne(PIEg7S}U#yuf z2gBedfZ@<7|z(WhmmnUCDYAc*Cdra5#_J>wetbA6G z?x-o6G-=G@1$V2YPY~HO^FUZ^Xryv+foH@&qwH|@EbMs}hlUcUF5x24M+v

  • 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 literal 0 HcmV?d00001 diff --git a/fpga/fpga_pm3_top.v b/fpga/fpga_pm3_top.v new file mode 100644 index 000000000..89bd2e56b --- /dev/null +++ b/fpga/fpga_pm3_top.v @@ -0,0 +1,438 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// The FPGA is responsible for interfacing between the A/D, the coil drivers, +// and the ARM. In the low-frequency modes it passes the data straight +// through, so that the ARM gets raw A/D samples over the SSP. In the high- +// frequency modes, the FPGA might perform some demodulation first, to +// reduce the amount of data that we must send to the ARM. +//----------------------------------------------------------------------------- +/* +Once upon a time the FPGA had a 16 input mux so we could have all LF and HF modules enabled and selectable +As the functionality grew, we run out of space in the FPGA and we had to split into an "LF only" and an "HF only" FPGA bitstream +But even then after a while it was not possible to fit all the HF functions at the same time so now we have multiple "HF only" bitstreams +For example "Felica but without ISO14443", or "ISO14443 but without Felica" or "HF_15 but without Felica and ISO14443" + +Because of all of the above, you can not enable both HF and LF modes at the same time, because some LF modules outputs +map to the same mux inputs as some HF modules outputs (thanks to reducing the mux from 16 to 8 inputs) and you can not have +multiple outputs connected together therefore leading to a failed compilation +*/ + +// These defines are meant to be passed by the Makefile so do not uncomment them here +// Proxmark3 RDV4 target +//`define PM3RDV4 +// Proxmark3 generic target +//`define PM3GENERIC +// iCopy-X with XC3S100E +//`define PM3ICOPYX + +// Pass desired defines to compiler to enable required modules +// WITH_LF enables Low Frequency mode when defined else HF is enabled +//`define WITH_LF +// WITH_LF0 enables module reader +//`define WITH_LF0 +// WITH_LF1 enables module edge detect +//`define WITH_LF1 +// WITH_LF2 enables module passthrough +//`define WITH_LF2 +// WITH_LF3 enables module ADC +//`define WITH_LF3 + +// WITH_HF0 enables module HF reader +//`define WITH_HF0 +// WITH_HF1 enables module simulated tag +//`define WITH_HF1 +// WITH_HF2 enables module ISO14443-A +//`define WITH_HF2 +// WITH_HF3 enables module sniff +//`define WITH_HF3 +// WITH_HF4 enables module ISO18092 FeliCa +//`define WITH_HF4 +// WITH_HF5 enables module get trace +//`define WITH_HF5 + +//`include "define.v" +//`include "util.v" +// +//`ifdef WITH_LF `include "clk_divider.v" `endif +//`ifdef WITH_LF0 `include "lo_read.v" `endif +//`ifdef WITH_LF1 `include "lo_edge_detect.v" `endif +//`ifdef WITH_LF2 `include "lo_passthru.v" `endif +//`ifdef WITH_LF3 `include "lo_adc.v" `endif +// +//`ifdef WITH_HF_15 +//`ifdef WITH_HF0 `include "hi_reader_15.v" `endif +//`else +//`ifdef WITH_HF0 `include "hi_reader.v" `endif +//`endif +//`ifdef WITH_HF1 `include "hi_simulate.v" `endif +//`ifdef WITH_HF2 `include "hi_iso14443a.v" `endif +//`ifdef WITH_HF3 `include "hi_sniffer.v" `endif +//`ifdef WITH_HF4 `include "hi_flite.v" `endif +//`ifdef WITH_HF5 `include "hi_get_trace.v" `endif + +module fpga_top( + input ck_1356meg, + input ck_1356megb, + input spck, + input pck0, + input ncs, + input [7:0] adc_d, + input cross_hi, + input cross_lo, + input mosi, + input ssp_dout, + + output ssp_din, + output ssp_frame, + output ssp_clk, + output adc_clk, + output adc_noe, + output miso, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output dbg +); + +// In all modes, let the ADC's outputs be enabled. +assign adc_noe = 1'b0; + +//----------------------------------------------------------------------------- +// The SPI receiver. This sets up the configuration word, which the rest of +// the logic looks at to determine how to connect the A/D and the coil +// drivers (i.e., which section gets it). Also assign some symbolic names +// to the configuration bits, for use below. +//----------------------------------------------------------------------------- + +// Receive 16bits of data from ARM here. +reg [15:0] shift_reg; +always @(posedge spck) if (~ncs) shift_reg <= {shift_reg[14:0], mosi}; + +reg trace_enable; + +reg [7:0] lf_ed_threshold; + +// adjustable frequency clock +wire [7:0] pck_cnt; +wire pck_divclk; +reg [7:0] divisor; +clk_divider div_clk(pck0, divisor, pck_cnt, pck_divclk); + +`ifdef WITH_LF +reg [11:0] conf_word; +`else +reg [8:0] conf_word; +`endif + +// We switch modes between transmitting to the 13.56 MHz tag and receiving +// from it, which means that we must make sure that we can do so without +// glitching, or else we will glitch the transmitted carrier. +always @(posedge ncs) +begin + // 4 bit command + case (shift_reg[15:12]) +`ifdef WITH_LF + `FPGA_CMD_SET_CONFREG: + begin + // 12 bit data + conf_word <= shift_reg[11:0]; + if (shift_reg[8:6] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) lf_ed_threshold <= 127; // default threshold + end + + `FPGA_CMD_SET_DIVISOR: + divisor <= shift_reg[7:0]; // 8bits + + `FPGA_CMD_SET_EDGE_DETECT_THRESHOLD: + lf_ed_threshold <= shift_reg[7:0]; // 8 bits +`else + `FPGA_CMD_SET_CONFREG: conf_word <= shift_reg[8:0]; + `FPGA_CMD_TRACE_ENABLE: trace_enable <= shift_reg[0]; +`endif + endcase +end + +//----------------------------------------------------------------------------- +// And then we instantiate the modules corresponding to each of the FPGA's +// major modes, and use muxes to connect the outputs of the active mode to +// the output pins. +//----------------------------------------------------------------------------- + +// ############################################################################ +// # Enable Low Frequency Modules +`ifdef WITH_LF + +// LF reader (generic) +`ifdef WITH_LF0 +lo_read lr( + .pck0 (pck0), + .pck_divclk (pck_divclk), + .pck_cnt (pck_cnt), + .adc_d (adc_d), + .lf_field (conf_word[0]), + + .ssp_din (mux0_ssp_din), + .ssp_frame (mux0_ssp_frame), + .ssp_clk (mux0_ssp_clk), + .adc_clk (mux0_adc_clk), + .pwr_lo (mux0_pwr_lo), + .pwr_hi (mux0_pwr_hi), + .pwr_oe1 (mux0_pwr_oe1), + .pwr_oe2 (mux0_pwr_oe2), + .pwr_oe3 (mux0_pwr_oe3), + .pwr_oe4 (mux0_pwr_oe4), + .debug (mux0_debug) +); +`endif + +// LF edge detect (generic) +`ifdef WITH_LF1 +lo_edge_detect le( + .pck0 (pck0), + .pck_divclk (pck_divclk), + .adc_d (adc_d), + .cross_lo (cross_lo), + .lf_field (conf_word[0]), + .lf_ed_toggle_mode (conf_word[1]), + .lf_ed_threshold (lf_ed_threshold), + .ssp_dout (ssp_dout), + + .ssp_frame (mux1_ssp_frame), + .ssp_clk (mux1_ssp_clk), + .adc_clk (mux1_adc_clk), + .pwr_lo (mux1_pwr_lo), + .pwr_hi (mux1_pwr_hi), + .pwr_oe1 (mux1_pwr_oe1), + .pwr_oe2 (mux1_pwr_oe2), + .pwr_oe3 (mux1_pwr_oe3), + .pwr_oe4 (mux1_pwr_oe4), + .debug (mux1_debug) +); +`endif + +// LF passthrough +`ifdef WITH_LF2 +lo_passthru lp( + .pck_divclk (pck_divclk), + .cross_lo (cross_lo), + .ssp_dout (ssp_dout), + + .ssp_din (mux2_ssp_din), + .adc_clk (mux2_adc_clk), + .pwr_lo (mux2_pwr_lo), + .pwr_hi (mux2_pwr_hi), + .pwr_oe1 (mux2_pwr_oe1), + .pwr_oe2 (mux2_pwr_oe2), + .pwr_oe3 (mux2_pwr_oe3), + .pwr_oe4 (mux2_pwr_oe4), + .debug (mux2_debug) +); +`endif + +// LF ADC (read/write) +`ifdef WITH_LF3 +lo_adc la( + .pck0 (pck0), + .adc_d (adc_d), + .divisor (divisor), + .lf_field (conf_word[0]), + .ssp_dout (ssp_dout), + + .ssp_din (mux3_ssp_din), + .ssp_frame (mux3_ssp_frame), + .ssp_clk (mux3_ssp_clk), + .adc_clk (mux3_adc_clk), + .pwr_lo (mux3_pwr_lo ), + .pwr_hi (mux3_pwr_hi ), + .pwr_oe1 (mux3_pwr_oe1), + .pwr_oe2 (mux3_pwr_oe2), + .pwr_oe3 (mux3_pwr_oe3), + .pwr_oe4 (mux3_pwr_oe4), + .debug (mux3_debug) +); +`endif // WITH_LF3 + +assign mux6_pwr_lo = 1'b1; +// 7 -- SPARE + +`else // if WITH_LF not defined +// ############################################################################ +// # Enable High Frequency Modules + +// HF reader +`ifdef WITH_HF0 +`ifdef WITH_HF_15 +hi_reader_15 hr( +`else +hi_reader hr( +`endif + .ck_1356meg (ck_1356megb), + .adc_d (adc_d), + .subcarrier_frequency (conf_word[5:4]), + .minor_mode (conf_word[3:0]), + .ssp_dout (ssp_dout), + + .ssp_din (mux0_ssp_din), + .ssp_frame (mux0_ssp_frame), + .ssp_clk (mux0_ssp_clk), + .adc_clk (mux0_adc_clk), + .pwr_lo (mux0_pwr_lo), + .pwr_hi (mux0_pwr_hi), + .pwr_oe1 (mux0_pwr_oe1), + .pwr_oe2 (mux0_pwr_oe2), + .pwr_oe3 (mux0_pwr_oe3), + .pwr_oe4 (mux0_pwr_oe4), + .debug (mux0_debug) +); +`endif // WITH_HF0 + +// HF simulated tag +`ifdef WITH_HF1 +hi_simulate hs( + .ck_1356meg (ck_1356meg), + .adc_d (adc_d), + .mod_type (conf_word[3:0]), + .ssp_dout (ssp_dout), + + .ssp_din (mux1_ssp_din), + .ssp_frame (mux1_ssp_frame), + .ssp_clk (mux1_ssp_clk), + .adc_clk (mux1_adc_clk), + .pwr_lo (mux1_pwr_lo), + .pwr_hi (mux1_pwr_hi), + .pwr_oe1 (mux1_pwr_oe1), + .pwr_oe2 (mux1_pwr_oe2), + .pwr_oe3 (mux1_pwr_oe3), + .pwr_oe4 (mux1_pwr_oe4), + .debug (mux1_debug) +); +`endif // WITH_HF1 + +// HF ISO14443-A +`ifdef WITH_HF2 +hi_iso14443a hisn( + .ck_1356meg (ck_1356meg), + .adc_d (adc_d), + .mod_type (conf_word[3:0]), + .ssp_dout (ssp_dout), + + .ssp_din (mux2_ssp_din), + .ssp_frame (mux2_ssp_frame), + .ssp_clk (mux2_ssp_clk), + .adc_clk (mux2_adc_clk), + .pwr_lo (mux2_pwr_lo), + .pwr_hi (mux2_pwr_hi), + .pwr_oe1 (mux2_pwr_oe1), + .pwr_oe2 (mux2_pwr_oe2), + .pwr_oe3 (mux2_pwr_oe3), + .pwr_oe4 (mux2_pwr_oe4), + .debug (mux2_debug) +); +`endif // WITH_HF2 + +// HF sniff +`ifdef WITH_HF3 +hi_sniffer he( + .ck_1356meg (ck_1356megb), + .adc_d (adc_d), + + .ssp_din (mux3_ssp_din), + .ssp_frame (mux3_ssp_frame), + .ssp_clk (mux3_ssp_clk), + .adc_clk (mux3_adc_clk), + .pwr_lo (mux3_pwr_lo), + .pwr_hi (mux3_pwr_hi), + .pwr_oe1 (mux3_pwr_oe1), + .pwr_oe2 (mux3_pwr_oe2), + .pwr_oe3 (mux3_pwr_oe3), + .pwr_oe4 (mux3_pwr_oe4) +); +`endif //WITH_HF3 + +// HF ISO18092 FeliCa +`ifdef WITH_HF4 +hi_flite hfl( + .ck_1356meg (ck_1356megb), + .adc_d (adc_d), + .mod_type (conf_word[3:0]), + .ssp_dout (ssp_dout), + + .ssp_din (mux4_ssp_din), + .ssp_frame (mux4_ssp_frame), + .ssp_clk (mux4_ssp_clk), + .adc_clk (mux4_adc_clk), + .pwr_lo (mux4_pwr_lo), + .pwr_hi (mux4_pwr_hi), + .pwr_oe1 (mux4_pwr_oe1), + .pwr_oe2 (mux4_pwr_oe2), + .pwr_oe3 (mux4_pwr_oe3), + .pwr_oe4 (mux4_pwr_oe4), + .debug (mux4_debug) +); +`endif // WITH_HF4 + +// HF get trace +`ifdef WITH_HF5 +hi_get_trace gt( + .ck_1356megb (ck_1356megb), + .adc_d (adc_d), + .trace_enable (trace_enable), + .major_mode (conf_word[8:6]), + .ssp_din (mux5_ssp_din), + .ssp_frame (mux5_ssp_frame), + .ssp_clk (mux5_ssp_clk) +); +`endif // WITH_HF5 + +`endif // WITH_LF + +// These assignments must agree with the defines in fpgaloader.h +// Major modes Low Frequency +// mux0 = LF reader (generic) +// mux1 = LF edge detect (generic) +// mux2 = LF passthrough +// mux3 = LF ADC (read/write) +// mux4 = SPARE +// mux5 = SPARE +// mux6 = SPARE +// mux7 = FPGA_MAJOR_MODE_OFF + +// Major modes High Frequency +// mux0 = HF reader +// mux1 = HF simulated tag +// mux2 = HF ISO14443-A +// mux3 = HF sniff +// mux4 = HF ISO18092 FeliCa +// mux5 = HF get trace +// mux6 = unused +// mux7 = FPGA_MAJOR_MODE_OFF + +mux8 mux_ssp_clk (.sel(conf_word[8:6]), .y(ssp_clk ), .x0(mux0_ssp_clk ), .x1(mux1_ssp_clk ), .x2(mux2_ssp_clk ), .x3(mux3_ssp_clk ), .x4(mux4_ssp_clk ), .x5(mux5_ssp_clk ), .x6(mux6_ssp_clk ), .x7(mux7_ssp_clk ) ); +mux8 mux_ssp_din (.sel(conf_word[8:6]), .y(ssp_din ), .x0(mux0_ssp_din ), .x1(mux1_ssp_din ), .x2(mux2_ssp_din ), .x3(mux3_ssp_din ), .x4(mux4_ssp_din ), .x5(mux5_ssp_din ), .x6(mux6_ssp_din ), .x7(mux7_ssp_din ) ); +mux8 mux_ssp_frame (.sel(conf_word[8:6]), .y(ssp_frame), .x0(mux0_ssp_frame), .x1(mux1_ssp_frame), .x2(mux2_ssp_frame), .x3(mux3_ssp_frame), .x4(mux4_ssp_frame), .x5(mux5_ssp_frame), .x6(mux6_ssp_frame), .x7(mux7_ssp_frame) ); +mux8 mux_pwr_oe1 (.sel(conf_word[8:6]), .y(pwr_oe1 ), .x0(mux0_pwr_oe1 ), .x1(mux1_pwr_oe1 ), .x2(mux2_pwr_oe1 ), .x3(mux3_pwr_oe1 ), .x4(mux4_pwr_oe1 ), .x5(mux5_pwr_oe1 ), .x6(mux6_pwr_oe1 ), .x7(mux7_pwr_oe1 ) ); +mux8 mux_pwr_oe2 (.sel(conf_word[8:6]), .y(pwr_oe2 ), .x0(mux0_pwr_oe2 ), .x1(mux1_pwr_oe2 ), .x2(mux2_pwr_oe2 ), .x3(mux3_pwr_oe2 ), .x4(mux4_pwr_oe2 ), .x5(mux5_pwr_oe2 ), .x6(mux6_pwr_oe2 ), .x7(mux7_pwr_oe2 ) ); +mux8 mux_pwr_oe3 (.sel(conf_word[8:6]), .y(pwr_oe3 ), .x0(mux0_pwr_oe3 ), .x1(mux1_pwr_oe3 ), .x2(mux2_pwr_oe3 ), .x3(mux3_pwr_oe3 ), .x4(mux4_pwr_oe3 ), .x5(mux5_pwr_oe3 ), .x6(mux6_pwr_oe3 ), .x7(mux7_pwr_oe3 ) ); +mux8 mux_pwr_oe4 (.sel(conf_word[8:6]), .y(pwr_oe4 ), .x0(mux0_pwr_oe4 ), .x1(mux1_pwr_oe4 ), .x2(mux2_pwr_oe4 ), .x3(mux3_pwr_oe4 ), .x4(mux4_pwr_oe4 ), .x5(mux5_pwr_oe4 ), .x6(mux6_pwr_oe4 ), .x7(mux7_pwr_oe4 ) ); +mux8 mux_pwr_lo (.sel(conf_word[8:6]), .y(pwr_lo ), .x0(mux0_pwr_lo ), .x1(mux1_pwr_lo ), .x2(mux2_pwr_lo ), .x3(mux3_pwr_lo ), .x4(mux4_pwr_lo ), .x5(mux5_pwr_lo ), .x6(mux6_pwr_lo ), .x7(mux7_pwr_lo ) ); +mux8 mux_pwr_hi (.sel(conf_word[8:6]), .y(pwr_hi ), .x0(mux0_pwr_hi ), .x1(mux1_pwr_hi ), .x2(mux2_pwr_hi ), .x3(mux3_pwr_hi ), .x4(mux4_pwr_hi ), .x5(mux5_pwr_hi ), .x6(mux6_pwr_hi ), .x7(mux7_pwr_hi ) ); +mux8 mux_adc_clk (.sel(conf_word[8:6]), .y(adc_clk ), .x0(mux0_adc_clk ), .x1(mux1_adc_clk ), .x2(mux2_adc_clk ), .x3(mux3_adc_clk ), .x4(mux4_adc_clk ), .x5(mux5_adc_clk ), .x6(mux6_adc_clk ), .x7(mux7_adc_clk ) ); +mux8 mux_dbg (.sel(conf_word[8:6]), .y(dbg ), .x0(mux0_debug ), .x1(mux1_debug ), .x2(mux2_debug ), .x3(mux3_debug ), .x4(mux4_debug ), .x5(mux5_debug ), .x6(mux6_debug ), .x7(mux7_debug ) ); + +endmodule diff --git a/fpga-xc2s30/hi_flite.v b/fpga/hi_flite.v similarity index 92% rename from fpga-xc2s30/hi_flite.v rename to fpga/hi_flite.v index 75ffbc9e5..ac9e7e069 100644 --- a/fpga-xc2s30/hi_flite.v +++ b/fpga/hi_flite.v @@ -30,33 +30,30 @@ */ module hi_flite( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type + input ck_1356meg, + input [7:0] adc_d, + input [3:0] mod_type, + input ssp_dout, + + output reg ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output reg pwr_lo, + output reg pwr_hi, + output reg pwr_oe1, + output reg pwr_oe2, + output reg pwr_oe3, + output reg pwr_oe4, + output debug ); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [3:0] mod_type; -assign dbg = 0; +assign debug = 0; -wire power = mod_type[2]; -wire speed = mod_type[1]; +wire power = mod_type[2]; +wire speed = mod_type[1]; wire disabl = mod_type[0]; -// Most off, oe4 for modulation; -// Trying reader emulation (would presumably just require switching power on, but I am not sure) -assign pwr_lo = 1'b0; -assign pwr_oe2 = 1'b0; - // 512x64/fc -wait before ts0, 32768 ticks // tslot: 256*64/fc assign adc_clk = ck_1356meg; @@ -95,10 +92,6 @@ reg did_sync=0; wire [7:0] bithalf = speed ? `bithalf_424 : `bithalf_212; wire [7:0] bitmlen = speed ? `bitmlen_424 : `bitmlen_212; - -//ssp clock and current values -reg ssp_clk; -reg ssp_frame; reg curbit = 1'b0; reg [7:0] fccount = 8'd0; // in-bit tick counter. Counts carrier cycles from the first lower edge detected, reset on every manchester bit detected @@ -107,6 +100,7 @@ reg [7:0] tsinceedge = 8'd0;// ticks from last edge, desync if the valye is too reg zero = 1'b0; // Manchester first halfbit low second high corresponds to this value. It has been known to change. SYNC is used to set it +//ssp clock and current values //ssp counter for transfer and framing reg [8:0] ssp_cnt = 9'd0; @@ -122,6 +116,7 @@ begin if( ((~speed) && (ssp_cnt[5:0] == 6'b000000)) || (speed && (ssp_cnt[4:0] == 5'b00000))) begin ssp_clk <= 1'b1; + //send current bit (detected in SNIFF mode or the one being modulated in MOD mode, 0 otherwise) ssp_din <= curbit; end if( ( (~speed) && (ssp_cnt[5:0] == 6'b100000)) ||(speed && ssp_cnt[4:0] == 5'b10000)) @@ -138,9 +133,6 @@ begin end end -//send current bit (detected in SNIFF mode or the one being modulated in MOD mode, 0 otherwise) -reg ssp_din; - //previous signal value, mostly to detect SYNC reg prv = 1'b1; @@ -353,11 +345,8 @@ begin end // sending <= 0; end + //put modulation here to maintain the correct clock. Seems that some readers are sensitive to that -reg pwr_hi; -reg pwr_oe1; -reg pwr_oe3; -reg pwr_oe4; wire mod = ((fccount >= bithalf) ^ dlay) & (~disabl); @@ -365,21 +354,22 @@ always @(ck_1356meg or ssp_dout or power or disabl or mod) begin if (power) begin - pwr_hi <= ck_1356meg; + pwr_hi <= ck_1356meg; + pwr_lo <= 1'b0; pwr_oe1 <= 1'b0;//mod; + pwr_oe2 <= 1'b0;//mod; pwr_oe3 <= 1'b0;//mod; pwr_oe4 <= mod;//1'b0; end else begin - pwr_hi <= 1'b0; + pwr_hi <= 1'b0; + pwr_lo <= 1'b0; pwr_oe1 <= 1'b0; + pwr_oe2 <= 1'b0; pwr_oe3 <= 1'b0; pwr_oe4 <= mod; end end - - - endmodule diff --git a/fpga-xc2s30/hi_get_trace.v b/fpga/hi_get_trace.v similarity index 86% rename from fpga-xc2s30/hi_get_trace.v rename to fpga/hi_get_trace.v index 6e4369e14..9bf32bc64 100644 --- a/fpga-xc2s30/hi_get_trace.v +++ b/fpga/hi_get_trace.v @@ -13,17 +13,18 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- +//`include "define.v" module hi_get_trace( - ck_1356megb, - adc_d, trace_enable, major_mode, - ssp_frame, ssp_din, ssp_clk + input ck_1356megb, + input [7:0] adc_d, + input trace_enable, + input [2:0] major_mode, + + output ssp_din, + output reg ssp_frame, + output reg ssp_clk ); - input ck_1356megb; - input [7:0] adc_d; - input trace_enable; - input [2:0] major_mode; - output ssp_frame, ssp_din, ssp_clk; // clock divider reg [6:0] clock_cnt; @@ -88,9 +89,9 @@ begin write_enable2 <= 1'b0; end else - begin + begin addr <= addr + 1; - end + end end end else @@ -136,9 +137,6 @@ begin end -// SSC communication to ARM -reg ssp_clk; -reg ssp_frame; reg [7:0] shift_out; always @(negedge ck_1356megb) @@ -147,16 +145,16 @@ begin begin if (clock_cnt[6:4] == 3'd0) // either load new value begin - if (addr[11] == 1'b0) - shift_out <= D_out1; - else - shift_out <= D_out2; + if (addr[11] == 1'b0) + shift_out <= D_out1; + else + shift_out <= D_out2; end else - begin - // or shift left - shift_out[7:1] <= shift_out[6:0]; - end + begin + // or shift left + shift_out[7:1] <= shift_out[6:0]; + end end ssp_clk <= ~clock_cnt[3]; // ssp_clk frequency = 13,56MHz / 16 = 847,5 kHz diff --git a/fpga-xc2s30/hi_iso14443a.v b/fpga/hi_iso14443a.v similarity index 97% rename from fpga-xc2s30/hi_iso14443a.v rename to fpga/hi_iso14443a.v index d52ab4000..7ccd7f610 100644 --- a/fpga-xc2s30/hi_iso14443a.v +++ b/fpga/hi_iso14443a.v @@ -14,29 +14,28 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- // ISO14443-A support for the Proxmark III -// +//`include "define.v" module hi_iso14443a( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type + input ck_1356meg, + input [7:0] adc_d, + input [3:0] mod_type, + input ssp_dout, + + output ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [3:0] mod_type; - - -wire adc_clk = ck_1356meg; - +assign adc_clk = ck_1356meg; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Reader -> PM3: @@ -76,8 +75,6 @@ begin end - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Reader -> PM3 // detect when a reader is active (modulating). We assume that the reader is active, if we see the carrier off for at least 8 @@ -137,7 +134,6 @@ wire [9:0] tmp2 = adc_d_times_2 + input_prev_1; wire signed [10:0] adc_d_filtered = {1'b0, tmp1} - {1'b0, tmp2}; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // internal FPGA timing. Maximum required period is 128 carrier clock cycles for a full 8 Bit transfer to ARM. (i.e. we need a // 7 bit counter). Adjust its frequency to external reader's clock when simulating a tag or sniffing. @@ -222,7 +218,11 @@ reg signed [10:0] rx_mod_falling_edge_max; reg signed [10:0] rx_mod_rising_edge_max; reg curbit; +`ifdef PM3ICOPYX +`define EDGE_DETECT_THRESHOLD 3 +`else `define EDGE_DETECT_THRESHOLD 5 +`endif `define EDGE_DETECT_THRESHOLDHIGH 20 always @(negedge adc_clk) @@ -266,7 +266,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tag+Reader -> PM3 // sample 4 bits reader data and 4 bits tag data for sniffing @@ -283,7 +282,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader: // a delay line to ensure that we send the (emulated) tag's answer at the correct time according to ISO14443-3 @@ -307,7 +305,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader, internal timing: // a timer for the 1172 cycles fdt (Frame Delay Time). Start the timer with a rising edge of the reader's signal. @@ -400,7 +397,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader // determine the required delay in the mod_sig_buf (set mod_sig_ptr). @@ -444,7 +440,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FPGA -> ARM communication: // buffer 8 bits data to be sent to ARM. Shift them out bit by bit. @@ -495,8 +490,6 @@ end //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FPGA <-> ARM communication: // generate a ssp clock and ssp frame signal for the synchronous transfer from/to the ARM -reg ssp_clk; -reg ssp_frame; always @(negedge adc_clk) begin @@ -529,7 +522,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FPGA -> ARM communication: // select the data to be sent to ARM @@ -553,7 +545,6 @@ begin sendbit = 1'b0; end - if(mod_type == `FPGA_HF_ISO14443A_SNIFFER) // send sampled reader and tag data: bit_to_arm = to_arm[7]; @@ -589,6 +580,6 @@ assign pwr_oe4 = mod_sig_coil & sub_carrier & (mod_type == `FPGA_HF_ISO14443A_TA assign pwr_oe2 = 1'b0; assign pwr_lo = 1'b0; -assign dbg = negedge_cnt[3]; +assign debug = negedge_cnt[3]; endmodule diff --git a/fpga-xc2s30/hi_reader.v b/fpga/hi_reader.v similarity index 95% rename from fpga-xc2s30/hi_reader.v rename to fpga/hi_reader.v index dbc38a8a7..ffa2634d8 100644 --- a/fpga-xc2s30/hi_reader.v +++ b/fpga/hi_reader.v @@ -13,24 +13,27 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- +//`include "define.v" module hi_reader( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - subcarrier_frequency, minor_mode + input ck_1356meg, + input [7:0] adc_d, + input [1:0] subcarrier_frequency, + input [3:0] minor_mode, + input ssp_dout, + + output ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output pwr_lo, + output reg pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output reg pwr_oe4, + output debug ); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [1:0] subcarrier_frequency; - input [3:0] minor_mode; assign adc_clk = ck_1356meg; // sample frequency is 13,56 MHz @@ -160,7 +163,6 @@ begin end else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ) begin - // Send 7 most significant bits of in phase tag signal (signed), plus 1 bit reader signal if (corr_i_accum[13:11] == 3'b000 || corr_i_accum[13:11] == 3'b111) corr_i_out <= {corr_i_accum[11:5], after_hysteresis_prev_prev}; @@ -261,9 +263,6 @@ end // corr_i_cnt 0 1 2 3 4 5 6 7 8 9 10 11 12 ... // -reg ssp_clk; -reg ssp_frame; - always @(negedge adc_clk) begin if (corr_i_cnt[1:0] == 2'b00) @@ -298,9 +297,6 @@ begin end end -// Antenna drivers -reg pwr_hi, pwr_oe4; - always @(*) begin if (minor_mode == `FPGA_HF_READER_MODE_SEND_SHALLOW_MOD) @@ -341,6 +337,6 @@ assign pwr_lo = 1'b0; assign pwr_oe2 = 1'b0; // Debug Output -assign dbg = corr_i_cnt[3]; +assign debug = corr_i_cnt[3]; endmodule diff --git a/fpga-xc2s30/hi_reader_15.v b/fpga/hi_reader_15.v similarity index 96% rename from fpga-xc2s30/hi_reader_15.v rename to fpga/hi_reader_15.v index 0db4fe2a3..ad41e771c 100644 --- a/fpga-xc2s30/hi_reader_15.v +++ b/fpga/hi_reader_15.v @@ -14,25 +14,26 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- // modified to add support for iso15 2sc mode -// -module hi_15_reader( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - subcarrier_frequency, minor_mode +module hi_reader_15( + input ck_1356meg, + input [7:0] adc_d, + input [1:0] subcarrier_frequency, + input [3:0] minor_mode, + input ssp_dout, + + output ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output pwr_lo, + output reg pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output reg pwr_oe4, + output debug ); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [1:0] subcarrier_frequency; - input [3:0] minor_mode; assign adc_clk = ck_1356meg; // sample frequency is 13,56 MHz @@ -379,9 +380,6 @@ end // corr_i_cnt 0 1 2 3 4 5 6 7 8 9 10 11 12 ... // -reg ssp_clk; -reg ssp_frame; - always @(negedge adc_clk) begin if (corr_i_cnt[1:0] == 2'b00) @@ -416,9 +414,6 @@ begin end end -// Antenna drivers -reg pwr_hi, pwr_oe4; - always @(*) begin if (minor_mode == `FPGA_HF_READER_MODE_SEND_SHALLOW_MOD) @@ -459,6 +454,6 @@ assign pwr_lo = 1'b0; assign pwr_oe2 = 1'b0; // Debug Output -assign dbg = corr_i_cnt[3]; +assign debug = corr_i_cnt[3]; endmodule diff --git a/fpga-xc2s30/hi_simulate.v b/fpga/hi_simulate.v similarity index 91% rename from fpga-xc2s30/hi_simulate.v rename to fpga/hi_simulate.v index 2232aedd9..97346eb9b 100644 --- a/fpga-xc2s30/hi_simulate.v +++ b/fpga/hi_simulate.v @@ -30,23 +30,26 @@ // // Jonathan Westhues, October 2006 //----------------------------------------------------------------------------- +//`include "define.v" module hi_simulate( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type + input ck_1356meg, + input [7:0] adc_d, + input [3:0] mod_type, + input ssp_dout, + + output reg ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [3:0] mod_type; // Power amp goes between LOW and tri-state, so pwr_hi (and pwr_lo) can // always be low. @@ -57,7 +60,7 @@ assign pwr_lo = 1'b0; // LF antenna connected to GND assign pwr_oe2 = 1'b0; assign adc_clk = ck_1356meg; -assign dbg = ssp_frame; +assign debug = ssp_frame; // The comparator with hysteresis on the output from the peak detector. reg after_hysteresis; @@ -94,8 +97,6 @@ reg [8:0] ssp_clk_divider; always @(negedge adc_clk) ssp_clk_divider <= (ssp_clk_divider + 1); -reg ssp_clk; - always @(negedge adc_clk) begin if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K_8BIT) @@ -112,7 +113,6 @@ end // Produce the byte framing signal; the phase of this signal // is arbitrary, because it's just a bit stream in this module. -reg ssp_frame; always @(negedge adc_clk) begin if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) @@ -133,7 +133,6 @@ end // Synchronize up the after-hysteresis signal, to produce DIN. -reg ssp_din; always @(posedge ssp_clk) ssp_din = after_hysteresis; diff --git a/fpga-xc2s30/hi_sniffer.v b/fpga/hi_sniffer.v similarity index 69% rename from fpga-xc2s30/hi_sniffer.v rename to fpga/hi_sniffer.v index ed62191f1..11781ca5a 100644 --- a/fpga-xc2s30/hi_sniffer.v +++ b/fpga/hi_sniffer.v @@ -15,16 +15,20 @@ //----------------------------------------------------------------------------- module hi_sniffer( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_clk + input ck_1356meg, + input [7:0] adc_d, + + output ssp_din, + output reg ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4 ); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - output ssp_frame, ssp_din, ssp_clk; // We are only snooping, all off. assign pwr_hi = 1'b0; @@ -34,12 +38,13 @@ assign pwr_oe2 = 1'b0; assign pwr_oe3 = 1'b0; assign pwr_oe4 = 1'b0; -reg ssp_frame; +//reg ssp_frame; reg [7:0] adc_d_out = 8'd0; -reg [2:0] ssp_cnt = 3'd0; +reg [2:0] ssp_cnt = 3'd0; -assign adc_clk = ck_1356meg; +assign adc_clk = ck_1356meg; assign ssp_clk = ~ck_1356meg; +assign ssp_din = adc_d_out[0]; always @(posedge ssp_clk) begin @@ -49,18 +54,16 @@ begin ssp_cnt <= ssp_cnt + 1; if(ssp_cnt[2:0] == 3'b000) // set frame length - begin - adc_d_out[7:0] <= adc_d; - ssp_frame <= 1'b1; - end + begin + adc_d_out[7:0] <= adc_d; + ssp_frame <= 1'b1; + end else - begin - adc_d_out[7:0] <= {1'b0, adc_d_out[7:1]}; - ssp_frame <= 1'b0; - end + begin + // shift value right one bit + adc_d_out[7:0] <= {1'b0, adc_d_out[7:1]}; + ssp_frame <= 1'b0; + end end - -assign ssp_din = adc_d_out[0]; - endmodule diff --git a/fpga-xc2s30/lf_edge_detect.v b/fpga/lf_edge_detect.v similarity index 72% rename from fpga-xc2s30/lf_edge_detect.v rename to fpga/lf_edge_detect.v index 4b6c0ac01..2a58331d1 100644 --- a/fpga-xc2s30/lf_edge_detect.v +++ b/fpga/lf_edge_detect.v @@ -15,23 +15,37 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- - // input clk is 24MHz -`include "min_max_tracker.v" +//`include "min_max_tracker.v" -module lf_edge_detect(input clk, input [7:0] adc_d, input [7:0] lf_ed_threshold, - output [7:0] max, output [7:0] min, - output [7:0] high_threshold, output [7:0] highz_threshold, - output [7:0] lowz_threshold, output [7:0] low_threshold, - output edge_state, output edge_toggle); +module lf_edge_detect( + input clk, + input [7:0] adc_d, + input [7:0] lf_ed_threshold, - min_max_tracker tracker(clk, adc_d, lf_ed_threshold, min, max); + output [7:0] max, + output [7:0] min, + output [7:0] low_threshold, + output [7:0] high_threshold, + output [7:0] lowz_threshold, + output [7:0] highz_threshold, + output edge_state, + output edge_toggle +); + + min_max_tracker tracker( + .clk (clk), + .adc_d (adc_d), + .threshold (lf_ed_threshold), + .min (min), + .max (max) +); // auto-tune - assign high_threshold = (max + min) / 2 + (max - min) / 4; + assign high_threshold = (max + min) / 2 + (max - min) / 4; assign highz_threshold = (max + min) / 2 + (max - min) / 8; - assign lowz_threshold = (max + min) / 2 - (max - min) / 8; - assign low_threshold = (max + min) / 2 - (max - min) / 4; + assign lowz_threshold = (max + min) / 2 - (max - min) / 8; + assign low_threshold = (max + min) / 2 - (max - min) / 4; // heuristic to see if it makes sense to try to detect an edge wire enabled = @@ -55,18 +69,20 @@ module lf_edge_detect(input clk, input [7:0] adc_d, input [7:0] lf_ed_threshold, always @(posedge clk) begin is_high <= (adc_d >= high_threshold); - is_low <= (adc_d <= low_threshold); + is_low <= (adc_d <= low_threshold); is_zero <= ((adc_d > lowz_threshold) & (adc_d < highz_threshold)); end // all edges detection always @(posedge clk) - if (enabled) begin + if (enabled) + begin // To enable detecting two consecutive peaks at the same level // (low or high) we check whether or not we went back near 0 in-between. // This extra check is necessary to prevent from noise artifacts // around the threshold values. - if (trigger_enabled & (is_high | is_low)) begin + if (trigger_enabled & (is_high | is_low)) + begin output_edge <= ~output_edge; trigger_enabled <= 0; end else @@ -75,14 +91,15 @@ module lf_edge_detect(input clk, input [7:0] adc_d, input [7:0] lf_ed_threshold, // edge states always @(posedge clk) - if (enabled) begin + if (enabled) + begin if (is_high) output_state <= 1'd1; else if (is_low) output_state <= 1'd0; end - assign edge_state = output_state; + assign edge_state = output_state; assign edge_toggle = output_edge; endmodule diff --git a/fpga-xc2s30/lo_adc.v b/fpga/lo_adc.v similarity index 74% rename from fpga-xc2s30/lo_adc.v rename to fpga/lo_adc.v index 808ec96ed..475cc869f 100644 --- a/fpga-xc2s30/lo_adc.v +++ b/fpga/lo_adc.v @@ -22,22 +22,24 @@ //----------------------------------------------------------------------------- module lo_adc( - pck0, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, divisor, - lf_field + input pck0, + input [7:0] adc_d, + input [7:0] divisor, + input lf_field, + input ssp_dout, + + output ssp_din, + output ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); - input pck0; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - output dbg; - input [7:0] divisor; - input lf_field; reg [7:0] to_arm_shiftreg; reg [7:0] pck_divider; @@ -49,16 +51,16 @@ wire reader_modulation = !ssp_dout & lf_field & clk_state; // always on (High Frequency outputs, unused) assign pwr_oe1 = 1'b0; -assign pwr_hi = 1'b0; +assign pwr_hi = 1'b0; // low frequency outputs -assign pwr_lo = reader_modulation; +assign pwr_lo = reader_modulation; assign pwr_oe2 = 1'b0; // 33 Ohms assign pwr_oe3 = tag_modulation; // base antenna load = 33 Ohms assign pwr_oe4 = 1'b0; // 10k Ohms // Debug Output ADC clock -assign dbg = adc_clk; +assign debug = adc_clk; // ADC clock out of phase with antenna driver assign adc_clk = ~clk_state; @@ -76,10 +78,10 @@ assign ssp_frame = (pck_divider[7:3] == 5'd1) && !clk_state; always @(posedge pck0) begin if (pck_divider == divisor[7:0]) - begin + begin pck_divider <= 8'd0; clk_state = !clk_state; - end + end else begin pck_divider <= pck_divider + 1; @@ -92,13 +94,9 @@ always @(posedge pck0) begin if ((pck_divider == 8'd7) && !clk_state) to_arm_shiftreg <= adc_d; - else begin + else + begin to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - // simulation showed a glitch occurring due to the LSB of the shifter - // not being set as we shift bits out - // this ensures the ssp_din remains low after a transfer and suppresses - // the glitch that would occur when the last data shifted out ended in - // a 1 bit and the next data shifted out started with a 0 bit to_arm_shiftreg[0] <= 1'b0; end end diff --git a/fpga-xc2s30/lo_edge_detect.v b/fpga/lo_edge_detect.v similarity index 67% rename from fpga-xc2s30/lo_edge_detect.v rename to fpga/lo_edge_detect.v index 462dfcc46..c820466f7 100644 --- a/fpga-xc2s30/lo_edge_detect.v +++ b/fpga/lo_edge_detect.v @@ -25,19 +25,29 @@ // - ssp_frame (wired to TIOA1 on the arm) for the edge detection/state // - ssp_clk: cross_lo -`include "lp20khz_1MSa_iir_filter.v" -`include "lf_edge_detect.v" +//`include "lp20khz_1MSa_iir_filter.v" +//`include "lf_edge_detect.v" module lo_edge_detect( - input pck0, input pck_divclk, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, - output ssp_frame, input ssp_dout, output ssp_clk, + input pck0, + input pck_divclk, + input [7:0] adc_d, input cross_lo, - output dbg, input lf_field, - input lf_ed_toggle_mode, input [7:0] lf_ed_threshold + input lf_ed_toggle_mode, + input [7:0] lf_ed_threshold, + input ssp_dout, + + output ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); wire tag_modulation = ssp_dout & !lf_field; @@ -58,18 +68,34 @@ assign pwr_hi = 1'b0; wire data_rdy; wire [7:0] adc_filtered; assign adc_clk = pck0; -lp20khz_1MSa_iir_filter adc_filter(pck0, adc_d, data_rdy, adc_filtered); + +lp20khz_1MSa_iir_filter adc_filter( + .clk (pck0), + .adc_d (adc_d), + .rdy (data_rdy), + .out (adc_filtered) +); // detect edges wire [7:0] high_threshold, highz_threshold, lowz_threshold, low_threshold; wire [7:0] max, min; wire edge_state, edge_toggle; -lf_edge_detect lf_ed(pck0, adc_filtered, lf_ed_threshold, - max, min, - high_threshold, highz_threshold, lowz_threshold, low_threshold, - edge_state, edge_toggle); -assign dbg = lf_ed_toggle_mode ? edge_toggle : edge_state; +lf_edge_detect lf_ed( + .clk (pck0), + .adc_d (adc_filtered), + .lf_ed_threshold (lf_ed_threshold), + .max (max), + .min (min), + .high_threshold (high_threshold), + .highz_threshold (highz_threshold), + .lowz_threshold (lowz_threshold), + .low_threshold (low_threshold), + .edge_state (edge_state), + .edge_toggle (edge_toggle) +); + +assign debug = lf_ed_toggle_mode ? edge_toggle : edge_state; assign ssp_frame = lf_ed_toggle_mode ? edge_toggle : edge_state; diff --git a/fpga-xc2s30/lo_passthru.v b/fpga/lo_passthru.v similarity index 82% rename from fpga-xc2s30/lo_passthru.v rename to fpga/lo_passthru.v index 52e56d4c5..a5ae1d4e2 100644 --- a/fpga-xc2s30/lo_passthru.v +++ b/fpga/lo_passthru.v @@ -17,27 +17,32 @@ // For reading TI tags, we need to place the FPGA in pass through mode // and pass everything through to the ARM - module lo_passthru( input pck_divclk, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - output adc_clk, - output ssp_din, input ssp_dout, input cross_lo, - output dbg + input ssp_dout, + + output ssp_din, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); // the antenna is modulated when ssp_dout = 1, when 0 the // antenna drivers stop modulating and go into listen mode -assign pwr_oe3 = 1'b0; +assign ssp_din = cross_lo; +assign adc_clk = 1'b0; +assign pwr_lo = pck_divclk && ssp_dout; +assign pwr_hi = 1'b0; assign pwr_oe1 = ssp_dout; assign pwr_oe2 = ssp_dout; +assign pwr_oe3 = 1'b0; assign pwr_oe4 = ssp_dout; -assign pwr_lo = pck_divclk && ssp_dout; -assign pwr_hi = 1'b0; -assign adc_clk = 1'b0; -assign ssp_din = cross_lo; -assign dbg = cross_lo; +assign debug = cross_lo; endmodule diff --git a/fpga-xc2s30/lo_read.v b/fpga/lo_read.v similarity index 80% rename from fpga-xc2s30/lo_read.v rename to fpga/lo_read.v index a7e481654..06bd0ae5a 100644 --- a/fpga-xc2s30/lo_read.v +++ b/fpga/lo_read.v @@ -22,13 +22,23 @@ //----------------------------------------------------------------------------- module lo_read( - input pck0, input [7:0] pck_cnt, input pck_divclk, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - input [7:0] adc_d, output adc_clk, - output ssp_frame, output ssp_din, output ssp_clk, - output dbg, - input lf_field + input pck0, + input pck_divclk, + input [7:0] pck_cnt, + input [7:0] adc_d, + input lf_field, + + output ssp_din, + output ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); reg [7:0] to_arm_shiftreg; @@ -43,13 +53,9 @@ always @(posedge pck0) begin if((pck_cnt == 8'd7) && !pck_divclk) to_arm_shiftreg <= adc_d; - else begin + else + begin to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - // simulation showed a glitch occurring due to the LSB of the shifter - // not being set as we shift bits out - // this ensures the ssp_din remains low after a transfer and suppresses - // the glitch that would occur when the last data shifted out ended in - // a 1 bit and the next data shifted out started with a 0 bit to_arm_shiftreg[0] <= 1'b0; end end @@ -74,7 +80,7 @@ assign ssp_clk = pck0; // SSP frame is gated by ant_lo and goes high when pck_divider=8..15 assign ssp_frame = (pck_cnt[7:3] == 5'd1) && !pck_divclk; // unused signals tied low -assign pwr_hi = 1'b0; +assign pwr_hi = 1'b0; assign pwr_oe1 = 1'b0; assign pwr_oe2 = 1'b0; assign pwr_oe3 = 1'b0; @@ -84,5 +90,5 @@ assign pwr_lo = lf_field & pck_divclk; // ADC clock out of phase with antenna driver assign adc_clk = ~pck_divclk; // ADC clock also routed to debug pin -assign dbg = adc_clk; +assign debug = adc_clk; endmodule diff --git a/fpga-xc2s30/lo_simulate.v b/fpga/lo_simulate.v similarity index 79% rename from fpga-xc2s30/lo_simulate.v rename to fpga/lo_simulate.v index 89b548c73..c3f819cd7 100644 --- a/fpga-xc2s30/lo_simulate.v +++ b/fpga/lo_simulate.v @@ -22,23 +22,27 @@ //----------------------------------------------------------------------------- module lo_simulate( - pck0, ck_1356meg, ck_1356megb, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - cross_hi, cross_lo, - dbg, - divisor + input pck0, + input ck_1356meg, + input ck_1356megb, + input [7:0] adc_d, + input [7:0] divisor, + input cross_hi, + input cross_lo, + input ssp_dout, + + output ssp_din, + output ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); - input pck0, ck_1356meg, ck_1356megb; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - input cross_hi, cross_lo; - output dbg; - input [7:0] divisor; // No logic, straight through. assign pwr_oe3 = 1'b0; @@ -46,9 +50,9 @@ assign pwr_oe1 = ssp_dout; assign pwr_oe2 = ssp_dout; assign pwr_oe4 = ssp_dout; assign ssp_clk = cross_lo; -assign pwr_lo = 1'b0; -assign pwr_hi = 1'b0; -assign dbg = ssp_frame; +assign pwr_lo = 1'b0; +assign pwr_hi = 1'b0; +assign debug = ssp_frame; // Divide the clock to be used for the ADC reg [7:0] pck_divider; diff --git a/fpga-xc2s30/lp20khz_1MSa_iir_filter.v b/fpga/lp20khz_1MSa_iir_filter.v similarity index 96% rename from fpga-xc2s30/lp20khz_1MSa_iir_filter.v rename to fpga/lp20khz_1MSa_iir_filter.v index 8bc6cca4f..d4a16cde1 100644 --- a/fpga-xc2s30/lp20khz_1MSa_iir_filter.v +++ b/fpga/lp20khz_1MSa_iir_filter.v @@ -36,7 +36,12 @@ // See details about its design see // https://fail0verflow.com/blog/2014/proxmark3-fpga-iir-filter.html -module lp20khz_1MSa_iir_filter(input clk, input [7:0] adc_d, output rdy, output [7:0] out); +module lp20khz_1MSa_iir_filter( + input clk, + input [7:0] adc_d, + output rdy, + output [7:0] out +); // clk is 24MHz, the IIR filter is designed for 1MS/s // hence we need to divide it by 24 diff --git a/fpga-xc2s30/min_max_tracker.v b/fpga/min_max_tracker.v similarity index 95% rename from fpga-xc2s30/min_max_tracker.v rename to fpga/min_max_tracker.v index 210d3c666..2f6e06017 100644 --- a/fpga-xc2s30/min_max_tracker.v +++ b/fpga/min_max_tracker.v @@ -23,8 +23,13 @@ // This algorithm therefore can't be used directly for realtime peak detections, // but it can be used as a simple envelope follower. -module min_max_tracker(input clk, input [7:0] adc_d, input [7:0] threshold, - output [7:0] min, output [7:0] max); +module min_max_tracker( + input clk, + input [7:0] adc_d, + input [7:0] threshold, + output [7:0] min, + output [7:0] max +); reg [7:0] min_val = 255; reg [7:0] max_val = 0; diff --git a/fpga/mux16.v b/fpga/mux16.v new file mode 100644 index 000000000..1d9777706 --- /dev/null +++ b/fpga/mux16.v @@ -0,0 +1,50 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// General-purpose miscellany. +// + +// 16 inputs to 1 output multiplexer +module mux16( + input [3:0] sel, + output reg y, + input x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 +); + +always @(*) +begin + // y = x[sel]; + case (sel) + 4'd0: y = x0; + 4'd1: y = x1; + 4'd2: y = x2; + 4'd3: y = x3; + 4'd4: y = x4; + 4'd5: y = x5; + 4'd6: y = x6; + 4'd7: y = x7; + 4'd8: y = x8; + 4'd9: y = x9; + 4'd10: y = x10; + 4'd11: y = x11; + 4'd12: y = x12; + 4'd13: y = x13; + 4'd14: y = x14; + 4'd15: y = x15; + endcase +end + +endmodule diff --git a/fpga-xc3s100e/mux2_onein.v b/fpga/mux2_onein.v similarity index 70% rename from fpga-xc3s100e/mux2_onein.v rename to fpga/mux2_onein.v index 86f17a553..baefa72c8 100644 --- a/fpga-xc3s100e/mux2_onein.v +++ b/fpga/mux2_onein.v @@ -4,13 +4,14 @@ // kombi, 2020.05 //----------------------------------------------------------------------------- -module mux2_one(sel, y, x0, x1); - input [1:0] sel; - input x0, x1; - output y; - reg y; +module mux2_one( + input [1:0] sel, + output reg y, + input x0, + input x1 +); -always @(x0 or x1 or sel) +always @(*) begin case (sel) 1'b0: y = x1; diff --git a/fpga-xc3s100e/mux2_oneout.v b/fpga/mux2_oneout.v similarity index 68% rename from fpga-xc3s100e/mux2_oneout.v rename to fpga/mux2_oneout.v index 3cbc0fd6b..fa61205a2 100644 --- a/fpga-xc3s100e/mux2_oneout.v +++ b/fpga/mux2_oneout.v @@ -4,13 +4,14 @@ // kombi, 2020.05 //----------------------------------------------------------------------------- -module mux2_oneout(sel, y, x0, x1); - input [1:0] sel; - output x0, x1; - input y; - reg x0, x1; +module mux2_oneout( + input [1:0] sel, + input y, + output reg x0, + output reg x1 +); -always @(x0 or x1 or sel) +always @(*) begin case (sel) 1'b0: x1 = y; diff --git a/fpga-xc2s30/util.v b/fpga/mux8.v similarity index 68% rename from fpga-xc2s30/util.v rename to fpga/mux8.v index 66361ca59..d9118d243 100644 --- a/fpga-xc2s30/util.v +++ b/fpga/mux8.v @@ -17,23 +17,25 @@ // General-purpose miscellany. // -module mux8(sel, y, x0, x1, x2, x3, x4, x5, x6, x7); - input [2:0] sel; - input x0, x1, x2, x3, x4, x5, x6, x7; - output y; - reg y; +// 8 inputs to 1 output multiplexer +module mux8( + input [2:0] sel, + output reg y, + input x0, x1, x2, x3, x4, x5, x6, x7 +); -always @(x0 or x1 or x2 or x3 or x4 or x5 or x6 or x7 or sel) +always @(*) begin + // y = x[sel]; case (sel) - 3'b000: y = x0; - 3'b001: y = x1; - 3'b010: y = x2; - 3'b011: y = x3; - 3'b100: y = x4; - 3'b101: y = x5; - 3'b110: y = x6; - 3'b111: y = x7; + 3'd0: y = x0; + 3'd1: y = x1; + 3'd2: y = x2; + 3'd3: y = x3; + 3'd4: y = x4; + 3'd5: y = x5; + 3'd6: y = x6; + 3'd7: y = x7; endcase end diff --git a/fpga-xc2s30/tests/Makefile b/fpga/tests/Makefile similarity index 100% rename from fpga-xc2s30/tests/Makefile rename to fpga/tests/Makefile diff --git a/fpga-xc2s30/tests/plot_edgedetect.py b/fpga/tests/plot_edgedetect.py old mode 100755 new mode 100644 similarity index 100% rename from fpga-xc2s30/tests/plot_edgedetect.py rename to fpga/tests/plot_edgedetect.py diff --git a/fpga-xc2s30/sim.tcl b/fpga/tests/sim.tcl similarity index 100% rename from fpga-xc2s30/sim.tcl rename to fpga/tests/sim.tcl diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.high.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.high.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.high.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.high.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.highz.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.highz.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.highz.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.highz.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.in b/fpga/tests/tb_data/pcf7931_read_1MSA_data.in similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.in rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.in diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.low.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.low.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.low.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.low.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.max.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.max.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.max.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.max.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.min.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.min.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.min.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.min.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.state.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.state.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.state.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.state.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.time b/fpga/tests/tb_data/pcf7931_read_1MSA_data.time similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.time rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.time diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.in b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.in similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.in rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.in diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.time b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.time similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.time rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.time diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold diff --git a/fpga-xc2s30/tests/tb_lf_edge_detect.v b/fpga/tests/tb_lf_edge_detect.v similarity index 100% rename from fpga-xc2s30/tests/tb_lf_edge_detect.v rename to fpga/tests/tb_lf_edge_detect.v diff --git a/fpga-xc2s30/tests/tb_lp20khz_1MSa_iir_filter.v b/fpga/tests/tb_lp20khz_1MSa_iir_filter.v similarity index 100% rename from fpga-xc2s30/tests/tb_lp20khz_1MSa_iir_filter.v rename to fpga/tests/tb_lp20khz_1MSa_iir_filter.v diff --git a/fpga-xc2s30/tests/tb_min_max_tracker.v b/fpga/tests/tb_min_max_tracker.v similarity index 100% rename from fpga-xc2s30/tests/tb_min_max_tracker.v rename to fpga/tests/tb_min_max_tracker.v diff --git a/fpga-xc2s30/testbed_fpga.v b/fpga/tests/testbed_fpga.v similarity index 100% rename from fpga-xc2s30/testbed_fpga.v rename to fpga/tests/testbed_fpga.v diff --git a/fpga-xc2s30/testbed_hi_read_tx.v b/fpga/tests/testbed_hi_read_tx.v similarity index 100% rename from fpga-xc2s30/testbed_hi_read_tx.v rename to fpga/tests/testbed_hi_read_tx.v diff --git a/fpga-xc2s30/testbed_hi_simulate.v b/fpga/tests/testbed_hi_simulate.v similarity index 100% rename from fpga-xc2s30/testbed_hi_simulate.v rename to fpga/tests/testbed_hi_simulate.v diff --git a/fpga-xc2s30/testbed_lo_read.v b/fpga/tests/testbed_lo_read.v similarity index 100% rename from fpga-xc2s30/testbed_lo_read.v rename to fpga/tests/testbed_lo_read.v diff --git a/fpga-xc2s30/testbed_lo_simulate.v b/fpga/tests/testbed_lo_simulate.v similarity index 100% rename from fpga-xc2s30/testbed_lo_simulate.v rename to fpga/tests/testbed_lo_simulate.v diff --git a/fpga/xc2s30-5-vq100.ucf b/fpga/xc2s30-5-vq100.ucf new file mode 100644 index 000000000..e42ce0d88 --- /dev/null +++ b/fpga/xc2s30-5-vq100.ucf @@ -0,0 +1,45 @@ +# See the schematic for the pin assignment. + +NET "adc_d<0>" LOC = "P62" ; +NET "adc_d<1>" LOC = "P60" ; +NET "adc_d<2>" LOC = "P58" ; +NET "adc_d<3>" LOC = "P57" ; +NET "adc_d<4>" LOC = "P56" ; +NET "adc_d<5>" LOC = "P55" ; +NET "adc_d<6>" LOC = "P54" ; +NET "adc_d<7>" LOC = "P53" ; +#NET "cross_hi" LOC = "P88" ; +#NET "miso" LOC = "P40" ; +NET "adc_clk" LOC = "P46" ; +NET "adc_noe" LOC = "P47" ; +NET "ck_1356meg" LOC = "P91" ; +NET "ck_1356megb" LOC = "P93" ; +NET "cross_lo" LOC = "P87" ; +NET "dbg" LOC = "P22" ; +NET "mosi" LOC = "P43" ; +NET "ncs" LOC = "P44" ; +NET "pck0" LOC = "P36" ; +NET "pwr_hi" LOC = "P80" ; +NET "pwr_lo" LOC = "P81" ; +NET "pwr_oe1" LOC = "P82" ; +NET "pwr_oe2" LOC = "P83" ; +NET "pwr_oe3" LOC = "P84" ; +NET "pwr_oe4" LOC = "P86" ; +NET "spck" LOC = "P39" ; +NET "ssp_clk" LOC = "P71" ; +NET "ssp_din" LOC = "P32" ; +NET "ssp_dout" LOC = "P34" ; +NET "ssp_frame" LOC = "P31" ; + +# definition of Clock nets: +NET "ck_1356meg" TNM_NET = "clk_net_1356" ; +NET "ck_1356megb" TNM_NET = "clk_net_1356b"; +NET "pck0" TNM_NET = "clk_net_pck0" ; +NET "spck" TNM_NET = "clk_net_spck" ; + +# Timing specs of clock nets: +TIMEGRP "clk_net_1356_all" = "clk_net_1356" "clk_net_1356b" ; +TIMESPEC "TS_1356MHz" = PERIOD "clk_net_1356_all" 74 ns HIGH 37 ns ; +TIMESPEC "TS_24MHz" = PERIOD "clk_net_pck0" 42 ns HIGH 21 ns ; +TIMESPEC "TS_4MHz" = PERIOD "clk_net_spck" 250 ns HIGH 125 ns ; + diff --git a/fpga/xc3s100e-4-vq100.ucf b/fpga/xc3s100e-4-vq100.ucf new file mode 100644 index 000000000..b259af2ed --- /dev/null +++ b/fpga/xc3s100e-4-vq100.ucf @@ -0,0 +1,48 @@ +# See the schematic for the pin assignment. + +NET "adc_d<0>" LOC = "P79" ; +NET "adc_d<1>" LOC = "P78" ; +NET "adc_d<2>" LOC = "P71" ; +NET "adc_d<3>" LOC = "P70" ; +NET "adc_d<4>" LOC = "P69" ; +NET "adc_d<5>" LOC = "P68" ; +NET "adc_d<6>" LOC = "P67" ; +NET "adc_d<7>" LOC = "P66" ; +#NET "cross_hi" LOC = "P88" ; +#NET "miso" LOC = "P40" ; +NET "adc_clk" LOC = "P65" ; +NET "adc_noe" LOC = "P62" ; +NET "ck_1356meg" LOC = "P88" ; +NET "ck_1356megb" LOC = "P89" ; +NET "cross_lo" LOC = "P90" ; +NET "dbg" LOC = "P22" ; +NET "mosi" LOC = "P43" ; +NET "ncs" LOC = "P40" ; +NET "pck0" LOC = "P36" ; +NET "pwr_hi" LOC = "P85" ; +NET "pwr_lo" LOC = "P83" ; +NET "pwr_oe1" LOC = "P84" ; +NET "pwr_oe2" LOC = "P91" ; +NET "pwr_oe3" LOC = "P92" ; +NET "pwr_oe4" LOC = "P86" ; +NET "spck" LOC = "P39" ; +NET "ssp_clk" LOC = "P33" ; +NET "ssp_din" LOC = "P32" ; +NET "ssp_dout" LOC = "P34" ; +NET "ssp_frame" LOC = "P27" ; +NET "FPGA_SWITCH" LOC = "P38" ; +NET "PWR_LO_EN" LOC = "P94" ; + +# definition of Clock nets: +NET "ck_1356meg" TNM_NET = "clk_net_1356" ; +NET "ck_1356megb" TNM_NET = "clk_net_1356b"; +NET "pck0" TNM_NET = "clk_net_pck0" ; +NET "spck" TNM_NET = "clk_net_spck" ; +NET "FPGA_SWITCH" CLOCK_DEDICATED_ROUTE = FALSE ; + +# Timing specs of clock nets: +TIMEGRP "clk_net_1356_all" = "clk_net_1356" "clk_net_1356b" ; +TIMESPEC "TS_1356MHz" = PERIOD "clk_net_1356_all" 74 ns HIGH 37 ns ; +TIMESPEC "TS_24MHz" = PERIOD "clk_net_pck0" 42 ns HIGH 21 ns ; +TIMESPEC "TS_4MHz" = PERIOD "clk_net_spck" 250 ns HIGH 125 ns ; + diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 58b3a2162..0a66142ac 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -282,7 +282,8 @@ static int bitparse_find_section(FILE *infile, char section_name, unsigned int * /* Four byte length field */ for (int i = 0; i < 4; i++) { tmp = fgetc(infile); - if (tmp < 0) { + /* image length sanity check, should be under 300KB */ + if ( (tmp < 0) || (tmp > 300*1024) ) { break; } current_length += tmp << (24 - (i * 8)); @@ -292,7 +293,8 @@ static int bitparse_find_section(FILE *infile, char section_name, unsigned int * default: /* Fall through, two byte length field */ for (int i = 0; i < 2; i++) { tmp = fgetc(infile); - if (tmp < 0) { + /* if name, date or time fields are too long, we probably shouldn't parse them */ + if ( (tmp < 0) || (tmp > 64) ){ break; } current_length += tmp << (8 - (i * 8)); @@ -334,14 +336,16 @@ static int FpgaGatherVersion(FILE *infile, char *infile_name, char *dst, int len } } - if (!memcmp("fpga_lf", basename(infile_name), 7)) - strncat(dst, "LF", len - strlen(dst) - 1); - else if (!memcmp("fpga_hf_15", basename(infile_name), 10)) - strncat(dst, "HF 15", len - strlen(dst) - 1); - else if (!memcmp("fpga_hf.", basename(infile_name), 8)) - strncat(dst, "HF", len - strlen(dst) - 1); - else if (!memcmp("fpga_felica", basename(infile_name), 7)) - strncat(dst, "HF FeliCa", len - strlen(dst) - 1); + if (bitparse_find_section(infile, 'a', &fpga_info_len)) { + for (uint32_t i = 0; i < fpga_info_len; i++) { + char c = (char)fgetc(infile); + if (i < sizeof(tempstr)) { + tempstr[i] = c; + } + } + + strncat(dst, tempstr, len - strlen(dst) - 1); + } strncat(dst, " image ", len - strlen(dst) - 1); if (bitparse_find_section(infile, 'b', &fpga_info_len)) { From 97eb0238b101bc9fd79802b39b62e28c6e8e4d89 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 2 Jun 2023 10:45:04 +0200 Subject: [PATCH 495/924] style --- armsrc/Standalone/hf_msdsal.c | 8 +- armsrc/appmain.c | 2 +- armsrc/iso14443a.c | 10 +- armsrc/mifarecmd.c | 4 +- client/luascripts/hf_mf_ultimatecard.lua | 10 +- client/src/cmdhfmf.c | 148 +++++++++++------------ client/src/cmdhfmfhard.c | 2 +- client/src/cmdhfmfp.c | 6 +- client/src/cmdlfhitag.c | 2 +- client/src/cmdlft55xx.c | 2 +- client/src/fileutils.c | 12 +- client/src/mifare/mad.c | 8 +- client/src/nfc/ndef.c | 22 ++-- client/src/pm3line_vocabulory.h | 3 +- client/update_amiibo_tools_lua.py | 14 +-- doc/commands.json | 91 +++++++++----- doc/commands.md | 7 +- 17 files changed, 191 insertions(+), 160 deletions(-) diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index b0d81ff79..f97a2e57f 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -376,7 +376,7 @@ void RunMod(void) { // dynamic_response_info will be in charge of responses dynamic_response_info.response_n = 0; - + //Dbprintf("receivedCmd: %02x\n", receivedCmd); // received a REQUEST if (receivedCmd[0] == ISO14443A_CMD_REQA && len == 1) { @@ -399,12 +399,12 @@ void RunMod(void) { // received request for UID (cascade 1) } else if (receivedCmd[1] == 0x20 && receivedCmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && len == 2) { //DbpString(_YELLOW_("+") "Request for UID C1"); - p_response = &responses[RESP_INDEX_UIDC1]; + p_response = &responses[RESP_INDEX_UIDC1]; // received a SELECT (cascade 1) } else if (receivedCmd[1] == 0x70 && receivedCmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && len == 9) { //DbpString(_YELLOW_("+") "Request for SELECT S1"); - p_response = &responses[RESP_INDEX_SAKC1]; + p_response = &responses[RESP_INDEX_SAKC1]; // received a RATS request } else if (receivedCmd[0] == ISO14443A_CMD_RATS && len == 4) { @@ -412,7 +412,7 @@ void RunMod(void) { prevCmd = 0; //p_response = &responses[RESP_INDEX_RATS]; - static uint8_t rRATS[] = { 0x13, 0x78, 0x80, 0x72, 0x02, 0x80, 0x31, 0x80, 0x66, 0xb1, 0x84, 0x0c, 0x01, 0x6e, 0x01, 0x83, 0x00, 0x90, 0x00 }; + static uint8_t rRATS[] = { 0x13, 0x78, 0x80, 0x72, 0x02, 0x80, 0x31, 0x80, 0x66, 0xb1, 0x84, 0x0c, 0x01, 0x6e, 0x01, 0x83, 0x00, 0x90, 0x00 }; memcpy(&dynamic_response_info.response[0], rRATS, sizeof(rRATS)); dynamic_response_info.response_n = sizeof(rRATS); diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 38c680050..184307042 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2045,7 +2045,7 @@ static void PacketReceived(PacketCommandNG *packet) { reply_ng(CMD_USART_RX, PM3_ENODATA, NULL, 0); } - StopTicks(); + StopTicks(); BigBuf_free(); LED_B_OFF(); break; diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index b4730b62d..01eed12c1 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1189,12 +1189,12 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r // Configure the ATQA and SAK accordingly rATQA[0] &= 0xBF; - if(tagType == 11){ - rSAKc1[0] = sak & 0xFC & 0X70; - }else{ - rSAKc1[0] = sak & 0xFB; + if (tagType == 11) { + rSAKc1[0] = sak & 0xFC & 0X70; + } else { + rSAKc1[0] = sak & 0xFB; } - + AddCrc14A(rSAKc1, sizeof(rSAKc1) - 2); *cuid = bytes_to_num(data, 4); diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 30558541d..5dd5dfcf6 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -1300,7 +1300,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 break; } */ - + uint32_t nttmp = prng_successor(nt1, 100); //NXP Mifare is typical around 840,but for some unlicensed/compatible mifare card this can be 160 for (i = 101; i < 1200; i++) { nttmp = prng_successor(nttmp, 1); @@ -1354,7 +1354,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 LED_C_ON(); // get crypted nonces for target sector - for (i = 0; ((i < 2) && (isOK == PM3_SUCCESS)); i++) { + for (i = 0; ((i < 2) && (isOK == PM3_SUCCESS)); i++) { // look for exactly two different nonces diff --git a/client/luascripts/hf_mf_ultimatecard.lua b/client/luascripts/hf_mf_ultimatecard.lua index 09b53937f..4bb6034ee 100644 --- a/client/luascripts/hf_mf_ultimatecard.lua +++ b/client/luascripts/hf_mf_ultimatecard.lua @@ -50,20 +50,20 @@ arguments = [[ -c read magic configuration -u UID (8-20 hexsymbols), set UID on tag -t tag type to impersonate - 1 = Mifare Mini S20 4-byte + 1 = Mifare Mini S20 4-byte 2 = Mifare Mini S20 7-byte 15 = NTAG 210 3 = Mifare Mini S20 10-byte 16 = NTAG 212 4 = Mifare 1k S50 4-byte 17 = NTAG 213 5 = Mifare 1k S50 7-byte 18 = NTAG 215 - 6 = Mifare 1k S50 10-byte 19 = NTAG 216 + 6 = Mifare 1k S50 10-byte 19 = NTAG 216 7 = Mifare 4k S70 4-byte 20 = NTAG I2C 1K 8 = Mifare 4k S70 7-byte 21 = NTAG I2C 2K 9 = Mifare 4k S70 10-byte 22 = NTAG I2C 1K PLUS *** 10 = UL - NOT WORKING FULLY 23 = NTAG I2C 2K PLUS *** 11 = UL-C - NOT WORKING FULLY 24 = NTAG 213F 12 = UL EV1 48b 25 = NTAG 216F - 13 = UL EV1 128b - *** 14 = UL Plus - NOT WORKING YET + 13 = UL EV1 128b + *** 14 = UL Plus - NOT WORKING YET -p NTAG password (8 hexsymbols), set NTAG password on tag. -a NTAG pack ( 4 hexsymbols), set NTAG pack on tag. @@ -297,7 +297,7 @@ return true, 'Ok' end --- -- calculate block0 -local function calculate_block0(useruid) +local function calculate_block0(useruid) local uidbytes = utils.ConvertHexToBytes(useruid) local i = 1 local bcc = bxor(uidbytes[i], uidbytes[i+1]); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index afadc9e78..3dee09d3b 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -349,13 +349,13 @@ static int mf_save_keys_from_arr(uint16_t n, uint8_t *d) { uint8_t sector = 0; for (uint16_t i = 0; i < n; i++) { if (mfIsSectorTrailer(i)) { - // key A offset in ST block - memcpy(keys + (MIFARE_KEY_SIZE * sector), d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); + // key A offset in ST block + memcpy(keys + (MIFARE_KEY_SIZE * sector), d + (i * MFBLOCK_SIZE), MIFARE_KEY_SIZE); - // key B offset in ST block - memcpy(keys + (MIFARE_KEY_SIZE * sectors) + (MIFARE_KEY_SIZE * sector), d + (i * MFBLOCK_SIZE) + 10, MIFARE_KEY_SIZE); + // key B offset in ST block + memcpy(keys + (MIFARE_KEY_SIZE * sectors) + (MIFARE_KEY_SIZE * sector), d + (i * MFBLOCK_SIZE) + 10, MIFARE_KEY_SIZE); - sector++; + sector++; } } @@ -484,7 +484,7 @@ static int mf_analyse_st_block(uint8_t blockno, uint8_t *block, bool force) { * @param numSectors: size of the card * @param keyFileName: filename containing keys or NULL. */ -static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t numSectors, char *keyfn){ +static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t numSectors, char *keyfn) { // Select card to get UID/UIDLEN/ATQA/SAK information clearCommandBuffer(); @@ -517,7 +517,7 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n size_t alen = 0, blen = 0; uint8_t *keyA, *keyB; - if (loadFileBinaryKey(keyfn, "", (void**)&keyA, (void**)&keyB, &alen, &blen) != PM3_SUCCESS) { + if (loadFileBinaryKey(keyfn, "", (void **)&keyA, (void **)&keyB, &alen, &blen) != PM3_SUCCESS) { if (keyA) { free(keyA); } @@ -607,7 +607,7 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); } else { // data block. Check if it can be read with key A or key B - if ((rights[sectorNo][data_area] == 0x03) || (rights[sectorNo][data_area] == 0x05)) { + if ((rights[sectorNo][data_area] == 0x03) || (rights[sectorNo][data_area] == 0x05)) { // only key B would work payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; payload.keytype = MF_KEY_B; @@ -617,7 +617,7 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n SendCommandNG(CMD_HF_MIFARE_READBL, (uint8_t *)&payload, sizeof(mf_readblock_t)); received = WaitForResponseTimeout(CMD_HF_MIFARE_READBL, &resp, 1500); } else { - // key A would work + // key A would work payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; payload.keytype = current_key; memcpy(payload.key, (current_key == MF_KEY_A) ? keyA + (sectorNo * MIFARE_KEY_SIZE) : keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); @@ -649,9 +649,9 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n uint8_t *data = resp.data.asBytes; - if (mfIsSectorTrailer(blockNo)) { + if (mfIsSectorTrailer(blockNo)) { // sector trailer. Fill in the keys. - memcpy(data , keyA + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + memcpy(data, keyA + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); memcpy(data + 10, keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); } @@ -1096,7 +1096,7 @@ static int CmdHF14AMfDump(const char *Cmd) { } else if (m2) { numSectors = MIFARE_2K_MAXSECTOR; bytes = MIFARE_2K_MAX_BYTES; - } else if (m4) { + } else if (m4) { numSectors = MIFARE_4K_MAXSECTOR; bytes = MIFARE_4K_MAX_BYTES; } else { @@ -1259,7 +1259,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { // size_t alen = 0, blen = 0; uint8_t *keyA, *keyB; - if (loadFileBinaryKey(keyfilename, "", (void**)&keyA, (void**)&keyB, &alen, &blen) != PM3_SUCCESS) { + if (loadFileBinaryKey(keyfilename, "", (void **)&keyA, (void **)&keyB, &alen, &blen) != PM3_SUCCESS) { if (keyA) { free(keyA); } @@ -1354,7 +1354,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { if (kt == MF_KEY_A) memcpy(wdata, keyA + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); else - memcpy(wdata, keyB+ (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + memcpy(wdata, keyB + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); } else { // use default key to authenticate for the write command memcpy(wdata, default_key, MIFARE_KEY_SIZE); @@ -2518,16 +2518,16 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { sectorno = i; keytype = j; PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ] (used for nested / hardnested attack)", - i, - (j == MF_KEY_B) ? 'B' : 'A', - sprint_hex_inrow(key, sizeof(key)) - ); + i, + (j == MF_KEY_B) ? 'B' : 'A', + sprint_hex_inrow(key, sizeof(key)) + ); } else { PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ]", - i, - (j == MF_KEY_B) ? 'B' : 'A', - sprint_hex_inrow(key, sizeof(key)) - ); + i, + (j == MF_KEY_B) ? 'B' : 'A', + sprint_hex_inrow(key, sizeof(key)) + ); } ++num_found_keys; } @@ -2645,16 +2645,16 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { sectorno = i; keytype = j; PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ] (used for nested / hardnested attack)", - i, - (j == MF_KEY_B) ? 'B' : 'A', - sprint_hex_inrow(tmp_key, sizeof(tmp_key)) - ); + i, + (j == MF_KEY_B) ? 'B' : 'A', + sprint_hex_inrow(tmp_key, sizeof(tmp_key)) + ); } else { PrintAndLogEx(SUCCESS, "target sector %3u key type %c -- found valid key [ " _GREEN_("%s") " ]", - i, - (j == MF_KEY_B) ? 'B' : 'A', - sprint_hex_inrow(tmp_key, sizeof(tmp_key)) - ); + i, + (j == MF_KEY_B) ? 'B' : 'A', + sprint_hex_inrow(tmp_key, sizeof(tmp_key)) + ); } } } @@ -3839,7 +3839,7 @@ static int CmdHF14AMfSim(const char *Cmd) { if ((flags & FLAG_NR_AR_ATTACK) != FLAG_NR_AR_ATTACK) break; - + if ((resp.oldarg[0] & 0xffff) != CMD_HF_MIFARE_SIMULATE) break; @@ -3949,11 +3949,11 @@ void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector } PrintAndLogEx(SUCCESS, " " _YELLOW_("%03d") " | %03d | %s | %s | %s | %s" - , s - , mfSectorTrailerOfSector(s) - , strA, resA - , strB, resB - ); + , s + , mfSectorTrailerOfSector(s) + , strA, resA + , strB, resB + ); } PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); @@ -4424,7 +4424,7 @@ static int CmdHF14AMfEView(const char *Cmd) { arg_lit0(NULL, "2k", "MIFARE Classic/Plus 2k"), arg_lit0(NULL, "4k", "MIFARE Classic 4k / S70"), arg_lit0("v", "verbose", "verbose output"), - arg_lit0(NULL, "sk", "Save extracted keys to file"), + arg_lit0(NULL, "sk", "Save extracted keys to file"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -5901,7 +5901,7 @@ int CmdHFMFNDEFRead(const char *Cmd) { CLIParserFree(ctx); uint16_t ndef_aid = NDEF_MFC_AID; - if (aidlen == 2){ + if (aidlen == 2) { ndef_aid = (aid[0] << 8) + aid[1]; } @@ -6123,7 +6123,7 @@ int CmdHFMFNDEFFormat(const char *Cmd) { // size_t alen = 0, blen = 0; uint8_t *tmpA, *tmpB; - if (loadFileBinaryKey(keyFilename, "", (void**)&tmpA, (void**)&tmpB, &alen, &blen) != PM3_SUCCESS) { + if (loadFileBinaryKey(keyFilename, "", (void **)&tmpA, (void **)&tmpB, &alen, &blen) != PM3_SUCCESS) { if (tmpA) { free(tmpA); } @@ -6131,13 +6131,13 @@ int CmdHFMFNDEFFormat(const char *Cmd) { } PrintAndLogEx(INFO, "Using `" _YELLOW_("%s") "`", keyFilename); - - for (int i=0; i < numSectors; i++) { - memcpy(keyA[i], tmpA + (i *MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); - memcpy(keyB[i], tmpB + (i *MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + + for (int i = 0; i < numSectors; i++) { + memcpy(keyA[i], tmpA + (i * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); + memcpy(keyB[i], tmpB + (i * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); } free(tmpA); - free(tmpB); + free(tmpB); } skipfile: @@ -6680,7 +6680,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { return PM3_EINVARG; } - #define SUPER_MAX_TRACES 7 +#define SUPER_MAX_TRACES 7 uint8_t trace = 0; uint8_t traces[SUPER_MAX_TRACES][16]; @@ -7056,7 +7056,7 @@ static int CmdHF14AMfView(const char *Cmd) { arg_param_begin, arg_str1("f", "file", "", "filename of dump"), arg_lit0("v", "verbose", "verbose output"), - arg_lit0(NULL, "sk", "Save extracted keys to file"), + arg_lit0(NULL, "sk", "Save extracted keys to file"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -7964,24 +7964,24 @@ static int CmdHF14AMfValue(const char *Cmd) { "hf mf value --blk 16 -k FFFFFFFFFFFF -b --get\n" "hf mf value --blk 16 -k FFFFFFFFFFFF --res --transfer 30 --tk FFFFFFFFFFFF --> transfer block 16 value to block 30 (even if block can't be incremented by ACL)\n" "hf mf value --get -d 87D612007829EDFF87D6120011EE11EE\n" - ); + ); void *argtable[] = { - arg_param_begin, - arg_str0("k", "key", "", "key, 6 hex bytes"), - arg_lit0("a", NULL, "input key type is key A (def)"), - arg_lit0("b", NULL, "input key type is key B"), - arg_u64_0(NULL, "inc", "", "Increment value by X (0 - 2147483647)"), - arg_u64_0(NULL, "dec", "", "Decrement value by X (0 - 2147483647)"), - arg_u64_0(NULL, "set", "", "Set value to X (-2147483647 - 2147483647)"), - arg_u64_0(NULL, "transfer", "", "Transfer value to other block (after inc/dec/restore)"), - arg_str0(NULL, "tkey", "", "transfer key, 6 hex bytes (if transfer is preformed to other sector)"), - arg_lit0(NULL, "ta", "transfer key type is key A (def)"), - arg_lit0(NULL, "tb", "transfer key type is key B"), - arg_lit0(NULL, "get", "Get value from block"), - arg_lit0(NULL, "res", "Restore (copy value to card buffer, should be used with --transfer)"), - arg_int0(NULL, "blk", "", "block number"), - arg_str0("d", "data", "", "block data to extract values from (16 hex bytes)"), - arg_param_end + arg_param_begin, + arg_str0("k", "key", "", "key, 6 hex bytes"), + arg_lit0("a", NULL, "input key type is key A (def)"), + arg_lit0("b", NULL, "input key type is key B"), + arg_u64_0(NULL, "inc", "", "Increment value by X (0 - 2147483647)"), + arg_u64_0(NULL, "dec", "", "Decrement value by X (0 - 2147483647)"), + arg_u64_0(NULL, "set", "", "Set value to X (-2147483647 - 2147483647)"), + arg_u64_0(NULL, "transfer", "", "Transfer value to other block (after inc/dec/restore)"), + arg_str0(NULL, "tkey", "", "transfer key, 6 hex bytes (if transfer is preformed to other sector)"), + arg_lit0(NULL, "ta", "transfer key type is key A (def)"), + arg_lit0(NULL, "tb", "transfer key type is key B"), + arg_lit0(NULL, "get", "Get value from block"), + arg_lit0(NULL, "res", "Restore (copy value to card buffer, should be used with --transfer)"), + arg_int0(NULL, "blk", "", "block number"), + arg_str0("d", "data", "", "block data to extract values from (16 hex bytes)"), + arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -8038,7 +8038,7 @@ static int CmdHF14AMfValue(const char *Cmd) { // Action: 0 Increment, 1 - Decrement, 2 - Restore, 3 - Set, 4 - Get, 5 - Decode from data // iceman: TODO - should be enum - uint8_t action = 4; + uint8_t action = 4; uint32_t value = 0; // Need to check we only have 1 of inc/dec/set and get the value from the selected option @@ -8109,10 +8109,10 @@ static int CmdHF14AMfValue(const char *Cmd) { } // don't want to write value data and break something - if ((blockno == 0) || - (mfIsSectorTrailer(blockno)) || - (trnval == 0) || - (trnval != -1 && mfIsSectorTrailer(trnval))) { + if ((blockno == 0) || + (mfIsSectorTrailer(blockno)) || + (trnval == 0) || + (trnval != -1 && mfIsSectorTrailer(trnval))) { PrintAndLogEx(WARNING, "invalid block number, should be a data block"); return PM3_EINVARG; } @@ -8130,7 +8130,7 @@ static int CmdHF14AMfValue(const char *Cmd) { memcpy(block, (uint8_t *)&value, 4); uint8_t cmddata[34]; - memcpy(cmddata, key, sizeof(key)); + memcpy(cmddata, key, sizeof(key)); // Key == 6 data went to 10, so lets offset 9 for inc/dec if (action == 0) { @@ -8141,13 +8141,13 @@ static int CmdHF14AMfValue(const char *Cmd) { } // 00 if increment, 01 if decrement, 02 if restore - cmddata[9] = action; - + cmddata[9] = action; + if (trnval != -1) { // transfer to block - cmddata[10] = trnval; - + cmddata[10] = trnval; + memcpy(cmddata + 27, transferkey, sizeof(transferkey)); if (mfSectorNum(trnval) != mfSectorNum(blockno)) { cmddata[33] = 1; // should send nested auth @@ -8200,7 +8200,7 @@ static int CmdHF14AMfValue(const char *Cmd) { if (isok) { PrintAndLogEx(SUCCESS, "Update ... : " _GREEN_("success")); - getval = true; + getval = true; // all ok so set flag to read current value } else { PrintAndLogEx(FAILED, "Update ... : " _RED_("failed")); diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index acbf32ea5..c885e41c9 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -510,7 +510,7 @@ static char failstr[250] = ""; #endif // the probability that a random nonce has a Sum Property K -static const float p_K0[NUM_SUMS] = { +static const float p_K0[NUM_SUMS] = { 0.0290, 0.0083, 0.0006, 0.0339, 0.0048, 0.0934, 0.0119, 0.0489, 0.0602, 0.4180, 0.0602, 0.0489, 0.0119, 0.0934, 0.0048, 0.0339, 0.0006, 0.0083, 0.0290 diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index b079e15c1..4f956d3af 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1006,7 +1006,7 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA for (uint8_t keyAB = startKeyAB; keyAB <= endKeyAB; keyAB++) { // main cycle with key check for (int i = 0; i < keyListLen; i++) { - + // allow client abort every iteration if (kbd_enter_pressed()) { PrintAndLogEx(WARNING, "\naborted via keyboard!\n"); @@ -1052,14 +1052,14 @@ static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyA selectCard = true; msleep(50); - // break out from keylist check loop, + // break out from keylist check loop, break; } if (verbose) PrintAndLogEx(WARNING, "\nsector %02d key %d [%s] res: %d", sector, keyAB, sprint_hex_inrow(keyList[i], 16), res); - // RES can be: + // RES can be: // PM3_ERFTRANS -7 // PM3_EWRONGANSWER -16 if (res == PM3_ERFTRANS) { diff --git a/client/src/cmdlfhitag.c b/client/src/cmdlfhitag.c index 23b8ac235..8cd28b842 100644 --- a/client/src/cmdlfhitag.c +++ b/client/src/cmdlfhitag.c @@ -338,7 +338,7 @@ static void printHitag2PaxtonDowngrade(const uint8_t *data) { bytes = (bytes * 0x100) + data[i]; } - for (int j = 0; j< 8; j++) { + for (int j = 0; j < 8; j++) { num = bytes & mask; skip -= 5; mask = mask >> 5; diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 554658c9f..ffb90513b 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -4028,7 +4028,7 @@ static int CmdT55xxSniff(const char *Cmd) { if (use_graphbuf == false) { // make loop to call sniff with skip samples.. - // then build it up by adding + // then build it up by adding CmdLFSniff(""); } diff --git a/client/src/fileutils.c b/client/src/fileutils.c index d26470ed5..8fd06456e 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -316,9 +316,9 @@ int saveFileJSON(const char *preferredName, JSONFileType ftype, uint8_t *data, s int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, size_t datalen, bool verbose, void (*callback)(json_t *), savePaths_t e_save_path) { if (ftype != jsfCustom) { - if (data == NULL || datalen == 0) { - return PM3_EINVARG; - } + if (data == NULL || datalen == 0) { + return PM3_EINVARG; + } } char *fileName = newfilenamemcopyEx(preferredName, ".json", e_save_path); @@ -2032,8 +2032,8 @@ int searchFile(char **foundpath, const char *pm3dir, const char *searchname, con PrintAndLogEx(FAILED, "Error - can't find `" _YELLOW_("%s") "`", filename); } } - free(filename); - return res; + free(filename); + return res; } int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumplen) { @@ -2067,7 +2067,7 @@ int pm3_load_dump(const char *fn, void **pdump, size_t *dumplen, size_t maxdumpl } case MCT: { res = loadFileMCT_safe(fn, pdump, dumplen); - break; + break; } } diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 49d3de065..328c2e63c 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -424,8 +424,8 @@ int DetectHID(uint8_t *d, uint16_t manufacture) { int convert_mad_to_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen) { - if (in == NULL || out == NULL || ilen == 0 ) { - return PM3_EINVARG; + if (in == NULL || out == NULL || ilen == 0) { + return PM3_EINVARG; } // MAD detection @@ -464,8 +464,8 @@ int convert_mad_to_arr(uint8_t *in, uint16_t ilen, uint8_t *out, uint16_t *olen) // copy to out (skip ST) memcpy(out, tmp, sizeof(tmp) - MFBLOCK_SIZE); out += sizeof(tmp) - MFBLOCK_SIZE; - *olen += sizeof(tmp) -MFBLOCK_SIZE; + *olen += sizeof(tmp) - MFBLOCK_SIZE; } } return PM3_SUCCESS; -} \ No newline at end of file +} diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index 311615c2a..09ff31945 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -313,7 +313,7 @@ static int ndefDecodeSig1(uint8_t *sig, size_t siglen) { if (sigType == stECDSA_P256) { slen = 32; } - + PrintAndLogEx(SUCCESS, "\tSignature [%u]...", intsiglen); print_hex_noascii_break(&sig[indx], intsiglen, 32); @@ -508,7 +508,7 @@ static int ndefDecodePayloadHandoverRequest(uint8_t *payload, size_t len) { PrintAndLogEx(INFO, _CYAN_("Handover Request")); uint8_t *p = payload; uint8_t major = (*(p) >> 4) & 0x0F; - uint8_t minor = *(p) & 0x0F; + uint8_t minor = *(p) & 0x0F; p++; PrintAndLogEx(INFO, "Version....... " _YELLOW_("%u.%u"), major, minor); @@ -866,7 +866,7 @@ static int ndefDecodeMime_bt(NDEFHeader_t *ndef) { uint8_t rev[6] = {0}; reverse_array_copy(ndef->Payload + 2, 6, rev); PrintAndLogEx(INFO, "BT MAC.......... " _YELLOW_("%s"), sprint_hex(rev, sizeof(rev))); - + // Let's check payload[8]. Tells us a bit about the UUID's. If 0x07 then it tells us a service UUID is 128bit switch (ndef->Payload[8]) { case 0x02: @@ -903,29 +903,29 @@ static int ndefDecodeMime_bt(NDEFHeader_t *ndef) { return PM3_SUCCESS; } -// https://raw.githubusercontent.com/haldean/ndef/master/docs/NFCForum-TS-RTD_1.0.pdf +// https://raw.githubusercontent.com/haldean/ndef/master/docs/NFCForum-TS-RTD_1.0.pdf static int ndefDecodeExternal_record(NDEFHeader_t *ndef) { - + if (ndef->TypeLen == 0) { PrintAndLogEx(INFO, "no type"); return PM3_SUCCESS; } - + if (ndef->PayloadLen == 0) { PrintAndLogEx(INFO, "no payload"); return PM3_SUCCESS; } PrintAndLogEx(INFO - , " URN... " _GREEN_("urn:nfc:ext:%.*s") - , (int)ndef->TypeLen - , ndef->Type - ); + , " URN... " _GREEN_("urn:nfc:ext:%.*s") + , (int)ndef->TypeLen + , ndef->Type + ); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "Payload [%zu]...", ndef->PayloadLen); print_hex_noascii_break(ndef->Payload, ndef->PayloadLen, 32); - + // do a character check? if (!strncmp((char *)ndef->Type, "pilet.ee:ekaart:2", ndef->TypeLen)) { PrintAndLogEx(NORMAL, ""); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index e6d6dc438..ffe9c66ff 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -360,7 +360,8 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mf gsave" }, { 0, "hf mf gsetblk" }, { 0, "hf mf gview" }, - { 0, "hf mf gdmconfig" }, + { 0, "hf mf gdmcfg" }, + { 0, "hf mf gdmsetcfg" }, { 0, "hf mf gdmsetblk" }, { 0, "hf mf ndefformat" }, { 0, "hf mf ndefread" }, diff --git a/client/update_amiibo_tools_lua.py b/client/update_amiibo_tools_lua.py index 873a6e18d..8a31b9d60 100644 --- a/client/update_amiibo_tools_lua.py +++ b/client/update_amiibo_tools_lua.py @@ -8,15 +8,15 @@ Author: Cory Solovewicz Description: This is a python script to automate what the updating of the amiibo_tools.lua -file which holds a lua table of all known amiibos. Previously updating the +file which holds a lua table of all known amiibos. Previously updating the amiibo_tools.lua was a very manual process. -This script automates the following original command: +This script automates the following original command: curl https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/database/amiibo.json | jq 'del(.amiibos[].release)' | jq 'del(.characters)' | pbcopy --> transform to table -And outputs the formatted file as amiibo_tools.lua -If everything goes well, this should be an updated copy of amiibo_tools.lua -which can then be placed in the /lualibs/ directory. -The temporary amiibo.json file is then deleted +And outputs the formatted file as amiibo_tools.lua +If everything goes well, this should be an updated copy of amiibo_tools.lua +which can then be placed in the /lualibs/ directory. +The temporary amiibo.json file is then deleted Dependencies: python3 -m pip install jq @@ -25,7 +25,7 @@ How to run: python update_amiibo_tools_lua.py The script will create the file amiibo_tools.lua -After running, manually backup the original /lualibs/amiibo_tools.lua and move the +After running, manually backup the original /lualibs/amiibo_tools.lua and move the updated amiibo_tools.lua to the /lualibs/ directory. ----------------------------------------------------------------------------- """ diff --git a/doc/commands.json b/doc/commands.json index f8712fc47..70b10c521 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -1354,9 +1354,10 @@ "offline": false, "options": [ "-h, --help This help", - "-f, --file (optional) filename, if no UID will be used as filename" + "-f, --file (optional) filename, if no UID will be used as filename", + "--ns no save to file" ], - "usage": "hf 14b dump [-h] [-f ]" + "usage": "hf 14b dump [-h] [-f ] [--ns]" }, "hf 14b help": { "command": "hf 14b help", @@ -4218,9 +4219,10 @@ "--mini MIFARE Classic Mini / S20", "--1k MIFARE Classic 1k / S50 (def)", "--2k MIFARE Classic/Plus 2k", - "--4k MIFARE Classic 4k / S70" + "--4k MIFARE Classic 4k / S70", + "--ns no save to file" ], - "usage": "hf mf dump [-h] [-f ] [-k ] [--mini] [--1k] [--2k] [--4k]" + "usage": "hf mf dump [-h] [-f ] [-k ] [--mini] [--1k] [--2k] [--4k] [--ns]" }, "hf mf ecfill": { "command": "hf mf ecfill", @@ -4368,9 +4370,10 @@ "--1k MIFARE Classic 1k / S50 (def)", "--2k MIFARE Classic/Plus 2k", "--4k MIFARE Classic 4k / S70", - "-v, --verbose verbose output" + "-v, --verbose verbose output", + "--sk Save extracted keys to file" ], - "usage": "hf mf eview [-hv] [--mini] [--1k] [--2k] [--4k]" + "usage": "hf mf eview [-hv] [--mini] [--1k] [--2k] [--4k] [--sk]" }, "hf mf fchk": { "command": "hf mf fchk", @@ -4400,18 +4403,18 @@ ], "usage": "hf mf fchk [-h] [-k ]... [--mini] [--1k] [--2k] [--4k] [--emu] [--dump] [--mem] [-f ]" }, - "hf mf gdmconfig": { - "command": "hf mf gdmconfig", + "hf mf gdmcfg": { + "command": "hf mf gdmcfg", "description": "Get configuration data from magic gen4 GDM card.", "notes": [ - "hf mf gdmconfig" + "hf mf gdmcfg" ], "offline": false, "options": [ "-h, --help This help", "-k, --key key 6 bytes" ], - "usage": "hf mf gdmconfig [-h] [-k ]" + "usage": "hf mf gdmcfg [-h] [-k ]" }, "hf mf gdmsetblk": { "command": "hf mf gdmsetblk", @@ -4431,6 +4434,19 @@ ], "usage": "hf mf gdmsetblk [-hab] --blk [-d ] [-k ] [--force]" }, + "hf mf gdmsetcfg": { + "command": "hf mf gdmsetcfg", + "description": "Set configuration data on a magic gen4 GDM card", + "notes": [ + "hf mf gdmsetcfg -d 850000000000000000005A5A00000008" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-d, --data bytes to write, 16 hex bytes" + ], + "usage": "hf mf gdmsetcfg [-h] -d " + }, "hf mf gen3blk": { "command": "hf mf gen3blk", "description": "Overwrite full manufacturer block for magic Gen3 card - You can specify part of manufacturer block as 4/7-bytes for UID change only", @@ -4902,6 +4918,7 @@ "hf mf value --blk 16 -k FFFFFFFFFFFF --inc 10", "hf mf value --blk 16 -k FFFFFFFFFFFF -b --dec 10", "hf mf value --blk 16 -k FFFFFFFFFFFF -b --get", + "hf mf value --blk 16 -k FFFFFFFFFFFF --res --transfer 30 --tk FFFFFFFFFFFF -> transfer block 16 value to block 30 (even if block can't be incremented by ACL)", "hf mf value --get -d 87D612007829EDFF87D6120011EE11EE" ], "offline": true, @@ -4910,14 +4927,19 @@ "-k, --key key, 6 hex bytes", "-a input key type is key A (def)", "-b input key type is key B", - "--inc Incremenet value by X (0 - 2147483647)", - "--dec Dcrement value by X (0 - 2147483647)", + "--inc Increment value by X (0 - 2147483647)", + "--dec Decrement value by X (0 - 2147483647)", "--set Set value to X (-2147483647 - 2147483647)", + "--transfer Transfer value to other block (after inc/dec/restore)", + "--tkey transfer key, 6 hex bytes (if transfer is preformed to other sector)", + "--ta transfer key type is key A (def)", + "--tb transfer key type is key B", "--get Get value from block", + "--res Restore (copy value to card buffer, should be used with --transfer)", "--blk block number", "-d, --data block data to extract values from (16 hex bytes)" ], - "usage": "hf mf value [-hab] [-k ] [--inc ] [--dec ] [--set ] [--get] [--blk ] [-d ]" + "usage": "hf mf value [-hab] [-k ] [--inc ] [--dec ] [--set ] [--transfer ] [--tkey ] [--ta] [--tb] [--get] [--res] [--blk ] [-d ]" }, "hf mf view": { "command": "hf mf view", @@ -4929,9 +4951,10 @@ "options": [ "-h, --help This help", "-f, --file filename of dump", - "-v, --verbose verbose output" + "-v, --verbose verbose output", + "--sk Save extracted keys to file" ], - "usage": "hf mf view [-hv] -f " + "usage": "hf mf view [-hv] -f [--sk]" }, "hf mf wipe": { "command": "hf mf wipe", @@ -6146,7 +6169,7 @@ }, "hf mfp commitp": { "command": "hf mfp commitp", - "description": "Executes Commit Perso command. Can be used in SL0 mode only.", + "description": "Executes Commit Perso command. Can be used in SL0 mode only. OBS! This command will not be executed if CardConfigKey, CardMasterKey and L3SwitchKey AES keys are not written.", "notes": [ "hf mfp commitp" ], @@ -6246,9 +6269,9 @@ "-b, --keyb Use key B (def: keyA)", "-p, --plain Plain communication mode between reader and card", "--blk <0..255> Block number", - "--key Key, 16 hex bytes" + "-k, --key Key, 16 hex bytes" ], - "usage": "hf mfp rdbl [-hvbp] [-n ] --blk <0..255> [--key ]" + "usage": "hf mfp rdbl [-hvbp] [-n ] --blk <0..255> [-k ]" }, "hf mfp rdsc": { "command": "hf mfp rdsc", @@ -6335,9 +6358,10 @@ "-k, --key Key for authentication (UL-C 16 bytes, EV1/NTAG 4 bytes)", "-l Swap entered key's endianness", "-p, --page Manually set start page number to start from", - "-q, --qty Manually set number of pages to dump" + "-q, --qty Manually set number of pages to dump", + "--ns no save to file" ], - "usage": "hf mfu dump [-hl] [-f ] [-k ] [-p ] [-q ]" + "usage": "hf mfu dump [-hl] [-f ] [-k ] [-p ] [-q ] [--ns]" }, "hf mfu eload": { "command": "hf mfu eload", @@ -6565,7 +6589,7 @@ }, "hf mfu tamper": { "command": "hf mfu tamper", - "description": "Set the congiguration of the NTAG 213TT tamper feature Supports: NTAG 213TT", + "description": "Set the configuration of the NTAG 213TT tamper feature Supports: NTAG 213TT", "notes": [ "hf mfu tamper -e -> enable tamper feature", "hf mfu tamper -d -> disable tamper feature", @@ -8039,15 +8063,19 @@ "command": "lf em 4x50 brute", "description": "Tries to bruteforce the password of a EM4x50 card. Function can be stopped by pressing pm3 button.", "notes": [ - "lf em 4x50 brute --first 12330000 --last 12340000 -> tries pwds from 0x12330000 to 0x1234000000" + "lf em 4x50 brute --mode range --begin 12330000 --end 12340000 -> tries pwds from 0x12330000 to 0x12340000", + "lf em 4x50 brute --mode charset --digits --uppercase -> tries all combinations of ASCII codes for digits and uppercase letters" ], "offline": false, "options": [ "-h, --help This help", - "--first first password (start), 4 bytes, lsb", - "--last last password (stop), 4 bytes, lsb" + "--mode Bruteforce mode (range|charset)", + "--begin Range mode - start of the key range", + "--end Range mode - end of the key range", + "--digits Charset mode - include ASCII codes for digits", + "--uppercase Charset mode - include ASCII codes for uppercase letters" ], - "usage": "lf em 4x50 brute [-h] --first --last " + "usage": "lf em 4x50 brute [-h] --mode [--begin ] [--end ] [--digits] [--uppercase]" }, "lf em 4x50 chk": { "command": "lf em 4x50 chk", @@ -10199,12 +10227,13 @@ "-f, --file filename (default is generated on blk 0)", "-o, --override override, force pwd read despite danger to card", "-p, --pwd password (4 hex bytes)", + "--ns no save", "--r0 downlink - fixed bit length", "--r1 downlink - long leading reference", "--r2 downlink - leading zero", "--r3 downlink - 1 of 4 coding reference" ], - "usage": "lf t55xx dump [-ho] [-f ] [-p ] [--r0] [--r1] [--r2] [--r3]" + "usage": "lf t55xx dump [-ho] [-f ] [-p ] [--ns] [--r0] [--r1] [--r2] [--r3]" }, "lf t55xx help": { "command": "lf t55xx help", @@ -10867,7 +10896,7 @@ "options": [ "-h, --help This help", "-f, --file SPIFFS file to view", - "-c, --cols column breaks (def 32)" + "-c, --cols column breaks (def 16)" ], "usage": "mem spiffs view [-h] -f [-c ]" }, @@ -11592,7 +11621,7 @@ }, "script help": { "command": "script help", - "description": "This is a feature to run Lua/Cmd/Python scripts. You can place scripts within the luascripts/cmdscripts/pyscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", + "description": "This is a feature to run Lua/Cmd scripts. You can place scripts within the luascripts/cmdscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", "notes": [], "offline": true, "options": [], @@ -11987,8 +12016,8 @@ } }, "metadata": { - "commands_extracted": 754, + "commands_extracted": 755, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-03-26T15:04:49" + "extracted_on": "2023-06-02T08:44:26" } -} +} \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 487cea0c9..938413fa8 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -523,7 +523,8 @@ Check column "offline" for their availability. |`hf mf gsave `|N |`Save dump from card into file or emulator` |`hf mf gsetblk `|N |`Write block to card` |`hf mf gview `|N |`View card` -|`hf mf gdmconfig `|N |`Read config block from card` +|`hf mf gdmcfg `|N |`Read config block from card` +|`hf mf gdmsetcfg `|N |`Write config block to card` |`hf mf gdmsetblk `|N |`Write block to card` |`hf mf ndefformat `|N |`Format MIFARE Classic Tag as NFC Tag` |`hf mf ndefread `|N |`Read and print NDEF records from card` @@ -568,7 +569,7 @@ Check column "offline" for their availability. |`hf mfu restore `|N |`Restore a dump onto a MFU MAGIC tag` |`hf mfu view `|Y |`Display content from tag dump file` |`hf mfu wrbl `|N |`Write block` -|`hf mfu tamper `|N |`Cofigure the tamper feature on an NTAG 213TT` +|`hf mfu tamper `|N |`Configure the tamper feature on an NTAG 213TT` |`hf mfu eload `|N |`Load Ultralight dump file into emulator memory` |`hf mfu esave `|N |`Save Ultralight dump file from emulator memory` |`hf mfu eview `|N |`View emulator memory` @@ -874,7 +875,7 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`lf em 4x50 help `|Y |`This help` -|`lf em 4x50 brute `|N |`Simple bruteforce attack to find password` +|`lf em 4x50 brute `|N |`Bruteforce attack to find password` |`lf em 4x50 chk `|N |`Check passwords from dictionary` |`lf em 4x50 dump `|N |`Dump EM4x50 tag` |`lf em 4x50 info `|N |`Tag information` From dc1a0936da34c8d004819ee307f1e97f28dc750a Mon Sep 17 00:00:00 2001 From: Angel Date: Sun, 4 Jun 2023 11:38:13 -0400 Subject: [PATCH 496/924] Re-added old checksum under command parameter for demod and read. --- client/src/cmdlf.c | 2 +- client/src/cmdlfparadox.c | 48 +++++++++++++++++++++++++++++++++------ client/src/cmdlfparadox.h | 2 +- doc/commands.json | 23 +++++++++++-------- 4 files changed, 56 insertions(+), 19 deletions(-) diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index 848f6cab0..e6585d334 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -1680,7 +1680,7 @@ int CmdLFfind(const char *Cmd) { goto out; } } - if (demodParadox(true) == PM3_SUCCESS) { + if (demodParadox(true, false) == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Paradox ID") " found!"); if (search_cont) { found++; diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 650a8c5c4..d750efa51 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -35,6 +35,13 @@ #include "cliparser.h" static int CmdHelp(const char *Cmd); + +static const uint8_t paradox_lut[] = { + 0xDB, 0xFC, 0x3F, 0xC5, 0x50, 0x14, 0x05, 0x47, + 0x9F, 0xED, 0x7D, 0x59, 0x22, 0x84, 0x21, 0x4E, + 0x39, 0x48, 0x12, 0x88, 0x53, 0xDE, 0xBB, 0xE4, + 0xB4, 0x2D, 0x4D, 0x55, 0xCA, 0xBE, 0xA3, 0xE2 +}; // FC:108, Card01827 // 00000000 01101100 00000111 00100011 // hex(0xED xor 0x7D xor 0x22 xor 0x84 xor 0xDE xor 0xBB xor 0xE4 xor 0x4D xor 0xA3 xor 0xE2 xor 0x47) 0xFC @@ -93,7 +100,7 @@ static uint8_t GetParadoxBits(const uint32_t fc, const uint32_t cn, unsigned int return crc; } -int demodParadox(bool verbose) { +int demodParadox(bool verbose, bool oldChksum) { (void) verbose; // unused so far //raw fsk demod no manchester decoding no start bit finding just get binary from wave uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0}; @@ -174,7 +181,29 @@ int demodParadox(bool verbose) { uint32_t fc = ((hi & 0x3) << 6) | (lo >> 26); uint32_t cardnum = (lo >> 10) & 0xFFFF; uint8_t chksum = (lo >> 2) & 0xFF; + if (oldChksum) { + // Calc CRC & Checksum + // 000088f0b - FC: 8 - Card: 36619 - Checksum: 05 - RAW: 0f55555559595aa559a5566a + // checksum? + uint8_t calc_chksum = 0x47; + uint8_t pos = 0; + for (uint8_t i = 0; i < 8; i++) { + uint8_t ice = rawhex[i + 1]; + for (uint8_t j = 0x80; j > 0; j >>= 2) { + + if (ice & j) { + calc_chksum ^= paradox_lut[pos]; + } + pos++; + } + } + uint32_t crc = CRC8Maxim(rawhex + 1, 8); + PrintAndLogEx(INFO, " FSK/MAN raw : %s", sprint_hex(rawhex, sizeof(rawhex))); + PrintAndLogEx(INFO, " raw : %s = (maxim crc8) %02x == %02x", sprint_hex(rawhex + 1, 8), crc, + calc_chksum); + // PrintAndLogEx(DEBUG, " OTHER sample CRC-8/MAXIM : 55 55 69 A5 55 6A 59 5A = FC"); + } uint32_t rawLo = bytebits_to_byte(bits + idx + 64, 32); uint32_t rawHi = bytebits_to_byte(bits + idx + 32, 32); uint32_t rawHi2 = bytebits_to_byte(bits + idx, 32); @@ -208,32 +237,37 @@ static int CmdParadoxDemod(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf paradox demod", "Try to find Paradox preamble, if found decode / descramble data", - "lf paradox demod" + "lf paradox demod --old -> Display previous checksum version" ); void *argtable[] = { arg_param_begin, + arg_lit0(NULL, "old", "optional - Display previous checksum version"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + bool old = arg_get_lit(ctx, 1); CLIParserFree(ctx); - return demodParadox(true); + return demodParadox(true, old); } static int CmdParadoxReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf paradox reader", "read a Paradox tag", - "lf Paradox reader -@ -> continuous reader mode" + "lf paradox reader -@ -> continuous reader mode\n" + "lf paradox reader --old -> Display previous checksum version" ); void *argtable[] = { arg_param_begin, arg_lit0("@", NULL, "optional - continuous reader mode"), + arg_lit0(NULL, "old", "optional - Display previous checksum version"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); bool cm = arg_get_lit(ctx, 1); + bool old = arg_get_lit(ctx, 2); CLIParserFree(ctx); if (cm) { @@ -242,7 +276,7 @@ static int CmdParadoxReader(const char *Cmd) { do { lf_read(false, 10000); - demodParadox(!cm); + demodParadox(!cm, old); } while (cm && !kbd_enter_pressed()); return PM3_SUCCESS; @@ -253,7 +287,7 @@ static int CmdParadoxClone(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "lf paradox clone", "clone a paradox tag to a T55x7, Q5/T5555 or EM4305/4469 tag.", - "lf paradox clone --fc 96 --cn 40426 [--q5|--em] -> encode for T55x7 tag with fc and cn\n" + "lf paradox clone --fc 96 --cn 40426 -> encode for T55x7 tag with fc and cn\n" "lf paradox clone --raw 0f55555695596a6a9999a59a -> encode for T55x7 tag\n" "lf paradox clone --raw 0f55555695596a6a9999a59a --q5 -> encode for Q5/T5555 tag\n" "lf paradox clone --raw 0f55555695596a6a9999a59a --em -> encode for EM4305/4469" @@ -353,7 +387,7 @@ static int CmdParadoxSim(const char *Cmd) { "Enables simulation of paradox card with specified card number.\n" "Simulation runs until the button is pressed or another USB command is issued.", "lf paradox sim --raw 0f55555695596a6a9999a59a -> simulate tag\n" - "lf paradox clone --fc 96 --cn 40426 -> simulate tag with fc and cn\n" + "lf paradox sim --fc 96 --cn 40426 -> simulate tag with fc and cn\n" ); void *argtable[] = { diff --git a/client/src/cmdlfparadox.h b/client/src/cmdlfparadox.h index 010f08301..142ee19a7 100644 --- a/client/src/cmdlfparadox.h +++ b/client/src/cmdlfparadox.h @@ -22,6 +22,6 @@ int CmdLFParadox(const char *Cmd); -int demodParadox(bool verbose); +int demodParadox(bool verbose, bool oldChksum); int detectParadox(uint8_t *dest, size_t *size, int *wave_start_idx); #endif diff --git a/doc/commands.json b/doc/commands.json index 4e8f0fd90..5fc6d2285 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -9632,7 +9632,7 @@ "command": "lf paradox clone", "description": "clone a paradox tag to a T55x7, Q5/T5555 or EM4305/4469 tag.", "notes": [ - "lf paradox clone --fc 96 --cn 40426 [--q5|--em] -> encode for T55x7 tag with fc and cn", + "lf paradox clone --fc 96 --cn 40426 -> encode for T55x7 tag with fc and cn", "lf paradox clone --raw 0f55555695596a6a9999a59a -> encode for T55x7 tag", "lf paradox clone --raw 0f55555695596a6a9999a59a --q5 -> encode for Q5/T5555 tag", "lf paradox clone --raw 0f55555695596a6a9999a59a --em -> encode for EM4305/4469" @@ -9652,13 +9652,14 @@ "command": "lf paradox demod", "description": "Try to find Paradox preamble, if found decode / descramble data", "notes": [ - "lf paradox demod" + "lf paradox demod --old -> Display previous checksum version" ], "offline": true, "options": [ - "-h, --help This help" + "-h, --help This help", + "--old optional - Display previous checksum version" ], - "usage": "lf paradox demod [-h]" + "usage": "lf paradox demod [-h] [--old]" }, "lf paradox help": { "command": "lf paradox help", @@ -9672,21 +9673,23 @@ "command": "lf paradox reader", "description": "read a Paradox tag", "notes": [ - "lf Paradox reader -@ -> continuous reader mode" + "lf paradox reader -@ -> continuous reader mode", + "lf paradox reader --old -> Display previous checksum version" ], "offline": false, "options": [ "-h, --help This help", - "-@ optional - continuous reader mode" + "-@ optional - continuous reader mode", + "--old optional - Display previous checksum version" ], - "usage": "lf paradox reader [-h@]" + "usage": "lf paradox reader [-h@] [--old]" }, "lf paradox sim": { "command": "lf paradox sim", "description": "Enables simulation of paradox card with specified card number. Simulation runs until the button is pressed or another USB command is issued.", "notes": [ "lf paradox sim --raw 0f55555695596a6a9999a59a -> simulate tag", - "lf paradox clone --fc 96 --cn 40426 -> simulate tag with fc and cn" + "lf paradox sim --fc 96 --cn 40426 -> simulate tag with fc and cn" ], "offline": false, "options": [ @@ -11618,7 +11621,7 @@ }, "script help": { "command": "script help", - "description": "This is a feature to run Lua/Cmd/Python scripts. You can place scripts within the luascripts/cmdscripts/pyscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", + "description": "This is a feature to run Lua/Cmd scripts. You can place scripts within the luascripts/cmdscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", "notes": [], "offline": true, "options": [], @@ -12015,6 +12018,6 @@ "metadata": { "commands_extracted": 755, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-05-25T01:54:13" + "extracted_on": "2023-06-04T15:36:56" } } \ No newline at end of file From d5f820228479fa4ef482e98ebac10da95fb7a3f5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 10 Jun 2023 12:03:39 +0200 Subject: [PATCH 497/924] textual --- client/src/nfc/ndef.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index 09ff31945..40cfe7113 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -1075,10 +1075,11 @@ static int ndefRecordDecodeAndPrint(uint8_t *ndefRecord, size_t ndefRecordLen, b return res; ndefPrintHeader(&NDEFHeader, verbose); - PrintAndLogEx(INFO, ""); - PrintAndLogEx(INFO, _CYAN_("Payload info")); if (verbose) { + PrintAndLogEx(INFO, ""); + PrintAndLogEx(INFO, _CYAN_("Payload info")); + if (NDEFHeader.TypeLen) { PrintAndLogEx(INFO, "Type data"); print_buffer(NDEFHeader.Type, NDEFHeader.TypeLen, 1); @@ -1229,7 +1230,9 @@ int NDEFDecodeAndPrint(uint8_t *ndef, size_t ndefLen, bool verbose) { break; } case 0xFE: { - PrintAndLogEx(SUCCESS, "NDEF Terminator detected"); + if (verbose) { + PrintAndLogEx(SUCCESS, "NDEF Terminator detected"); + } return PM3_SUCCESS; } default: { From f1d78c4e7c1675325a58eefbb5be4f20f1f06110 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 10 Jun 2023 12:17:56 +0200 Subject: [PATCH 498/924] new crc16 option used with Philips toothbrushes. different init value 0x49a3. Should be reported to the CRC catalog https://reveng.sourceforge.io/crc-catalogue/16.htm --- common/crc16.c | 23 ++++++++++++++--------- common/crc16.h | 4 ++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/common/crc16.c b/common/crc16.c index f78fab5b4..d402977b9 100644 --- a/common/crc16.c +++ b/common/crc16.c @@ -42,10 +42,14 @@ void init_table(CrcType_t crctype) { case CRC_15693: case CRC_ICLASS: case CRC_CRYPTORF: + case CRC_KERMIT: generate_table(CRC16_POLY_CCITT, true); break; case CRC_FELICA: case CRC_XMODEM: + case CRC_CCITT: + case CRC_11784: + case CRC_PHILIPS: generate_table(CRC16_POLY_CCITT, false); break; case CRC_LEGIC: @@ -54,15 +58,6 @@ void init_table(CrcType_t crctype) { case CRC_LEGIC_16: generate_table(CRC16_POLY_LEGIC_16, true); break; - case CRC_CCITT: - generate_table(CRC16_POLY_CCITT, false); - break; - case CRC_KERMIT: - generate_table(CRC16_POLY_CCITT, true); - break; - case CRC_11784: - generate_table(CRC16_POLY_CCITT, false); - break; case CRC_NONE: crc_table_init = false; current_crc_type = CRC_NONE; @@ -210,6 +205,9 @@ void compute_crc(CrcType_t ct, const uint8_t *d, size_t n, uint8_t *first, uint8 case CRC_LEGIC_16: // TODO return; + case CRC_PHILIPS: + crc = crc16_philips(d, n); + break; case CRC_NONE: return; } @@ -244,6 +242,8 @@ uint16_t Crc16ex(CrcType_t ct, const uint8_t *d, size_t n) { case CRC_LEGIC_16: // TODO return 0; + case CRC_PHILIPS: + return crc16_philips(d, n); case CRC_NONE: default: break; @@ -290,6 +290,8 @@ bool check_crc(CrcType_t ct, const uint8_t *d, size_t n) { case CRC_LEGIC_16: // TODO return false; + case CRC_PHILIPS: + return (crc16_philips(d, n) == 0); case CRC_NONE: default: break; @@ -350,3 +352,6 @@ uint16_t crc16_legic(uint8_t const *d, size_t n, uint8_t uidcrc) { return crc16_fast(d, n, initial, true, false); } +uint16_t crc16_philips(uint8_t const *d, size_t n) { + return crc16_fast(d, n, 0x49A3, false, false); +} \ No newline at end of file diff --git a/common/crc16.h b/common/crc16.h index d9631c43c..80758d95b 100644 --- a/common/crc16.h +++ b/common/crc16.h @@ -42,6 +42,7 @@ typedef enum { CRC_KERMIT, CRC_XMODEM, CRC_CRYPTORF, + CRC_PHILIPS, } CrcType_t; uint16_t update_crc16_ex(uint16_t crc, uint8_t c, uint16_t polynomial); @@ -78,6 +79,9 @@ uint16_t crc16_iclass(uint8_t const *d, size_t n); // ie: uidcrc = 0x78 then initial_value == 0x7878 uint16_t crc16_legic(uint8_t const *d, size_t n, uint8_t uidcrc); +// Calculate CRC-16/ Philips. +uint16_t crc16_philips(uint8_t const *d, size_t n); + // table implementation void init_table(CrcType_t crctype); void reset_table(void); From dfc338c384fab4f3578b2181bedf9da388626ff9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 11 Jun 2023 20:04:26 +0200 Subject: [PATCH 499/924] philips pwd/pack gen algo --- common/generator.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/common/generator.c b/common/generator.c index 852ea2b61..a83935780 100644 --- a/common/generator.c +++ b/common/generator.c @@ -195,6 +195,20 @@ uint32_t ul_ev1_pwdgenF(const uint8_t *uid) { return pwd; } +// Solution from @atc1441 +// https://gist.github.com/atc1441/41af75048e4c22af1f5f0d4c1d94bb56 +// Philips Sonicare toothbrush NFC head +uint32_t ul_ev1_pwdgenG(const uint8_t *uid, const uint8_t *mfg) { + + init_table(CRC_PHILIPS); + // UID + uint32_t crc1 = crc16_philips(uid, 7); + // MFG string + uint32_t crc2 = crc16_fast(mfg, 10, crc1, false, false); + + return (BSWAP_16(crc2) << 16 | BSWAP_16(crc1)); +} + // pack generation for algo 1-3 uint16_t ul_ev1_packgenA(const uint8_t *uid) { uint16_t pack = (uid[0] ^ uid[1] ^ uid[2]) << 8 | (uid[2] ^ 8); @@ -224,13 +238,26 @@ uint16_t ul_ev1_packgenD(const uint8_t *uid) { p ^= 0x5555; return BSWAP_16(p & 0xFFFF); } - uint16_t ul_ev1_packgenE(const uint8_t *uid) { uint32_t pwd = ul_ev1_pwdgenE(uid); return (0xAD << 8 | ((pwd >> 24) & 0xFF)); } +uint16_t ul_ev1_packgenG(const uint8_t *uid, const uint8_t *mfg) { + init_table(CRC_PHILIPS); + // UID + uint32_t crc1 = crc16_philips(uid, 7); + // MFG string + uint32_t crc2 = crc16_fast(mfg, 10, crc1, false, false); + // PWD + uint32_t pwd = (BSWAP_16(crc2) << 16 | BSWAP_16(crc1)); + + uint8_t pb[4]; + num_to_bytes(pwd, 4, pb); + return BSWAP_16(crc16_fast(pb, 4, crc2, false, false)); +} + // default shims uint32_t ul_ev1_pwdgen_def(const uint8_t *uid) { From 5df82c537c4172432ebfeda28e32312fe291d39a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 11 Jun 2023 21:33:04 +0200 Subject: [PATCH 500/924] missed one file --- common/generator.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/generator.h b/common/generator.h index 1008d01fa..ce2601f26 100644 --- a/common/generator.h +++ b/common/generator.h @@ -28,6 +28,7 @@ uint32_t ul_ev1_pwdgenC(const uint8_t *uid); uint32_t ul_ev1_pwdgenD(const uint8_t *uid); uint32_t ul_ev1_pwdgenE(const uint8_t *uid); uint32_t ul_ev1_pwdgenF(const uint8_t *uid); +uint32_t ul_ev1_pwdgenG(const uint8_t *uid, const uint8_t *mfg); uint16_t ul_ev1_packgen_def(const uint8_t *uid); uint16_t ul_ev1_packgenA(const uint8_t *uid); @@ -35,6 +36,7 @@ uint16_t ul_ev1_packgenB(const uint8_t *uid); uint16_t ul_ev1_packgenC(const uint8_t *uid); uint16_t ul_ev1_packgenD(const uint8_t *uid); uint16_t ul_ev1_packgenE(const uint8_t *uid); +uint16_t ul_ev1_packgenG(const uint8_t *uid, const uint8_t *mfg); uint32_t ul_c_otpgenA(const uint8_t *uid); From 4180f6bfe26e1c961ff759fa7523b4f81e4760e6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 11 Jun 2023 21:52:42 +0200 Subject: [PATCH 501/924] added philips toothbrush detection in `hf mfu info` and generator in `hf mfu pwdgen -r` --- client/src/cmdhfmfu.c | 51 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index f720d8599..94494ac3f 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1391,6 +1391,18 @@ static mfu_identify_t mfu_ident_table[] = { "hf mfu dump -k %08x" }, */ + { + "Philips Toothbrush", "0004040201010F03", + 16, 20, "0310D1010C55027068696C6970732E636F6DFE00", + ul_ev1_pwdgen_def, ul_ev1_packgen_def, + "hf mfu pwdgen -r" + }, + { + "Philips Toothbrush", "0004040201010F03", + 16, 36, "0320D1011C55027068696C6970732E636F6D2F6E6663627275736868656164746170FE00", + ul_ev1_pwdgen_def, ul_ev1_packgen_def, + "hf mfu pwdgen -r" + }, {NULL, NULL, 0, 0, NULL, NULL, NULL, NULL} }; @@ -1412,7 +1424,7 @@ static mfu_identify_t *mfu_match_fingerprint(uint8_t *version, uint8_t *data) { uint8_t mtmp[40] = {0}; param_gethex_to_eol(mfu_ident_table[i].match, 0, mtmp, sizeof(mtmp), &ml); - bool m2 = (memcmp(mtmp, data + mfu_ident_table[i].mpos, mfu_ident_table[i].mlen) == 0); + bool m2 = (memcmp(mtmp, data + mfu_ident_table[i].mpos, mfu_ident_table[i].mlen) == 0); if (m2) { PrintAndLogEx(DEBUG, "(fingerprint) found %s", mfu_ident_table[i].desc); return &mfu_ident_table[i]; @@ -3581,6 +3593,8 @@ static int CmdHF14AMfUPwdGen(const char *Cmd) { if (selftest) return generator_selftest(); + uint8_t philips_mfg[10] = {0}; + if (use_tag) { // read uid from tag int res = ul_read_uid(uid); @@ -3588,6 +3602,19 @@ static int CmdHF14AMfUPwdGen(const char *Cmd) { return res; } + iso14a_card_select_t card; + if (ul_select(&card)) { + // Philips toothbrush needs page 0x21-0x23 + uint8_t data[16] = {0x00}; + int status = ul_read(0x21, data, sizeof(data)); + if (status == -1) { + PrintAndLogEx(DEBUG, "Error: tag didn't answer to READ"); + } else if (status == 16) { + memcpy(philips_mfg, data + 2, sizeof(philips_mfg)); + } + DropField(); + } + } else { if (u_len != 7) { PrintAndLogEx(WARNING, "Key must be 7 hex bytes"); @@ -3599,19 +3626,23 @@ static int CmdHF14AMfUPwdGen(const char *Cmd) { PrintAndLogEx(INFO, " Using UID 4b: " _YELLOW_("%s"), sprint_hex(uid, 4)); PrintAndLogEx(INFO, " Using UID 7b: " _YELLOW_("%s"), sprint_hex(uid, 7)); PrintAndLogEx(INFO, "----------------------------------"); - PrintAndLogEx(INFO, " algo | pwd | pack"); - PrintAndLogEx(INFO, "-----------------+----------+-----"); - PrintAndLogEx(INFO, " Transport EV1 | %08X | %04X", ul_ev1_pwdgenA(uid), ul_ev1_packgenA(uid)); - PrintAndLogEx(INFO, " Amiibo | %08X | %04X", ul_ev1_pwdgenB(uid), ul_ev1_packgenB(uid)); - PrintAndLogEx(INFO, " Lego Dimension | %08X | %04X", ul_ev1_pwdgenC(uid), ul_ev1_packgenC(uid)); - PrintAndLogEx(INFO, " XYZ 3D printer | %08X | %04X", ul_ev1_pwdgenD(uid), ul_ev1_packgenD(uid)); - PrintAndLogEx(INFO, " Xiaomi purifier | %08X | %04X", ul_ev1_pwdgenE(uid), ul_ev1_packgenE(uid)); - PrintAndLogEx(INFO, " NTAG tools | %08X | %04X", ul_ev1_pwdgenF(uid), ul_ev1_packgen_def(uid)); - PrintAndLogEx(INFO, "-----------------+----------+-----"); + PrintAndLogEx(INFO, " algo | pwd | pack"); + PrintAndLogEx(INFO, "--------------------+----------+-----"); + PrintAndLogEx(INFO, " Transport EV1 | %08X | %04X", ul_ev1_pwdgenA(uid), ul_ev1_packgenA(uid)); + PrintAndLogEx(INFO, " Amiibo | %08X | %04X", ul_ev1_pwdgenB(uid), ul_ev1_packgenB(uid)); + PrintAndLogEx(INFO, " Lego Dimension | %08X | %04X", ul_ev1_pwdgenC(uid), ul_ev1_packgenC(uid)); + PrintAndLogEx(INFO, " XYZ 3D printer | %08X | %04X", ul_ev1_pwdgenD(uid), ul_ev1_packgenD(uid)); + PrintAndLogEx(INFO, " Xiaomi purifier | %08X | %04X", ul_ev1_pwdgenE(uid), ul_ev1_packgenE(uid)); + PrintAndLogEx(INFO, " NTAG tools | %08X | %04X", ul_ev1_pwdgenF(uid), ul_ev1_packgen_def(uid)); + if (philips_mfg[0] != 0) { + PrintAndLogEx(INFO, " Philips Toothbrush | %08X | %04X", ul_ev1_pwdgenG(uid, philips_mfg), ul_ev1_packgenG(uid, philips_mfg)); + } + PrintAndLogEx(INFO, "--------------------+----------+-----"); PrintAndLogEx(INFO, " Vingcard algo"); PrintAndLogEx(INFO, " Saflok algo"); PrintAndLogEx(INFO, " SALTO algo"); PrintAndLogEx(INFO, " Dorma Kaba algo"); + PrintAndLogEx(INFO, " STiD algo"); PrintAndLogEx(INFO, "----------------------------------"); return PM3_SUCCESS; } From 219d38e0faf2d1b5b73d818ce629f978d14befb1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 11 Jun 2023 21:53:42 +0200 Subject: [PATCH 502/924] added test for philips in the selftest --- common/generator.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/common/generator.c b/common/generator.c index a83935780..7cf5498e1 100644 --- a/common/generator.c +++ b/common/generator.c @@ -583,7 +583,7 @@ int mfc_algo_touch_one(uint8_t *uid, uint8_t sector, uint8_t keytype, uint64_t * int generator_selftest(void) { #ifndef ON_DEVICE -#define NUM_OF_TEST 8 +#define NUM_OF_TEST 9 PrintAndLogEx(INFO, "PWD / KEY generator selftest"); PrintAndLogEx(INFO, "----------------------------"); @@ -633,18 +633,27 @@ int generator_selftest(void) { testresult++; PrintAndLogEx(success ? SUCCESS : WARNING, "UID | %s | %08X - %s", sprint_hex(uid6, 7), pwd6, success ? "OK" : "->A9C4C3C0<--"); + uint8_t uid7[] = {0x04, 0x0D, 0x4B, 0x5A, 0xC5, 0x71, 0x81}; + uint8_t mfg[] = {0x32, 0x31, 0x30, 0x36, 0x32, 0x38, 0x20, 0x35, 0x32, 0x4D}; + uint32_t pwd7 = ul_ev1_pwdgenG(uid7, mfg); + success = (pwd7 == 0xFBCFACC1); + if (success) + testresult++; + PrintAndLogEx(success ? SUCCESS : WARNING, "UID | %s | %08X - %s", sprint_hex(uid7, 7), pwd7, success ? "OK" : "->FBCFACC1<--"); + + // uint8_t uid5[] = {0x11, 0x22, 0x33, 0x44}; // uint64_t key1 = mfc_algo_a(uid5); // success = (key1 == 0xD1E2AA68E39A); // PrintAndLogEx(success ? SUCCESS : WARNING, "UID | %s | %"PRIx64" - %s", sprint_hex(uid5, 4), key1, success ? "OK" : "->D1E2AA68E39A<--"); - uint8_t uid7[] = {0x74, 0x57, 0xCA, 0xA9}; - uint64_t key7 = 0; - mfc_algo_sky_one(uid7, 15, 0, &key7); - success = (key7 == 0x82c7e64bc565); + uint8_t uid8[] = {0x74, 0x57, 0xCA, 0xA9}; + uint64_t key8 = 0; + mfc_algo_sky_one(uid8, 15, 0, &key8); + success = (key8 == 0x82c7e64bc565); if (success) testresult++; - PrintAndLogEx(success ? SUCCESS : WARNING, "UID | %s | %"PRIx64" - %s", sprint_hex(uid7, 4), key7, success ? "OK" : "->82C7E64BC565<--"); + PrintAndLogEx(success ? SUCCESS : WARNING, "UID | %s | %"PRIx64" - %s", sprint_hex(uid8, 4), key8, success ? "OK" : "->82C7E64BC565<--"); uint32_t lf_id = lf_t55xx_white_pwdgen(0x00000080); From 1caf4ad1d2c8703fef7a49d7b6526f5a2d793e87 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 11 Jun 2023 22:30:09 +0200 Subject: [PATCH 503/924] text --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21c43c33c..dfa5e9510 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf mfu pwdgen -r` - now generates pwd/pack for Philips Sonicare, thanks @ckuenzi, @atc1441 (@iceman1001) + - Changed `hf mfu info` - now detects Philips Sonicare devices (@iceman1001) - Fixed truncated FPGA upload due to incorrect integer size variable (@d18c7db) - Changed `usart btfactory` - handles the new BT board with version "BT SPP V3.0" (@iceman1001) - Changed `hf mf eview --sk` - now can extract keys and save to file (@iceman1001) From 5505096483960cf3d4502916d2353ca3b6f9cfc1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 11 Jun 2023 22:41:52 +0200 Subject: [PATCH 504/924] text --- client/dictionaries/mfulc_default_keys.dic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/dictionaries/mfulc_default_keys.dic b/client/dictionaries/mfulc_default_keys.dic index 51b4b9365..09dea8caf 100644 --- a/client/dictionaries/mfulc_default_keys.dic +++ b/client/dictionaries/mfulc_default_keys.dic @@ -1,5 +1,5 @@ # -# Mifare Ultralight Default Keys +# Mifare Ultralight C Default Keys # -- iceman fork version -- # -- contribute to this list, sharing is caring -- # From 3de4f5225b36e3754c920651cc9af82441f1cb96 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 11 Jun 2023 22:59:10 +0200 Subject: [PATCH 505/924] enable fingerprint for UL-C tags too --- client/src/cmdhfmfu.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 94494ac3f..e17032507 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1305,10 +1305,10 @@ typedef struct { } mfu_otp_identify_t; static mfu_otp_identify_t mfu_otp_ident_table[] = { - { "SALTO", 12, 4, "534C544F", ul_c_otpgenA, NULL }, -// { "SAFLOK", 12, 4, NULL, ul_c_otpgenB, NULL }, -// { "VINGCARD", 12, 4, NULL, ul_c_otpgenC, NULL }, -// { "DORMA KABA", 12, 4, NULL, ul_c_otpgenD, NULL }, + { "SALTO tag", 12, 4, "534C544F", ul_c_otpgenA, NULL }, +// { "SAFLOK tag", 12, 4, NULL, ul_c_otpgenB, NULL }, +// { "VINGCARD tag", 12, 4, NULL, ul_c_otpgenC, NULL }, +// { "DORMA KABA tag", 12, 4, NULL, ul_c_otpgenD, NULL }, { NULL, 0, 0, NULL, NULL, NULL } }; @@ -1827,6 +1827,8 @@ static int CmdHF14AMfUInfo(const char *Cmd) { else locked = true; + mfu_fingerprint(tagtype, has_auth_key, authkeyptr, ak_len); + if ((tagtype & MAGIC)) { //just read key uint8_t ulc_deskey[16] = {0x00}; @@ -3622,10 +3624,10 @@ static int CmdHF14AMfUPwdGen(const char *Cmd) { } } - PrintAndLogEx(INFO, "------------------.---------------"); + PrintAndLogEx(INFO, "------------------.------------------"); PrintAndLogEx(INFO, " Using UID 4b: " _YELLOW_("%s"), sprint_hex(uid, 4)); PrintAndLogEx(INFO, " Using UID 7b: " _YELLOW_("%s"), sprint_hex(uid, 7)); - PrintAndLogEx(INFO, "----------------------------------"); + PrintAndLogEx(INFO, "-------------------------------------"); PrintAndLogEx(INFO, " algo | pwd | pack"); PrintAndLogEx(INFO, "--------------------+----------+-----"); PrintAndLogEx(INFO, " Transport EV1 | %08X | %04X", ul_ev1_pwdgenA(uid), ul_ev1_packgenA(uid)); @@ -3643,7 +3645,7 @@ static int CmdHF14AMfUPwdGen(const char *Cmd) { PrintAndLogEx(INFO, " SALTO algo"); PrintAndLogEx(INFO, " Dorma Kaba algo"); PrintAndLogEx(INFO, " STiD algo"); - PrintAndLogEx(INFO, "----------------------------------"); + PrintAndLogEx(INFO, "-------------------------------------"); return PM3_SUCCESS; } From 383c52c1bddae636a055c8ce720535ba8f372062 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 12 Jun 2023 19:54:05 +0200 Subject: [PATCH 506/924] added colors and show all sectors in range for `hf mf chk` --- client/src/cmdhfmfp.c | 54 ++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 4f956d3af..f3b53ed3e 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1097,10 +1097,6 @@ static void Fill2bPattern(uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], uint3 } static int CmdHFMFPChk(const char *Cmd) { - int res; - uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN] = {{0}}; - uint32_t keyListLen = 0; - uint8_t foundKeys[2][64][AES_KEY_LEN + 1] = {{{0}}}; CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp chk", @@ -1133,6 +1129,10 @@ static int CmdHFMFPChk(const char *Cmd) { uint8_t startSector = arg_get_int_def(ctx, 3, 0); uint8_t endSector = arg_get_int_def(ctx, 4, 0); + uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN] = {{0}}; + uint32_t keyListLen = 0; + uint8_t foundKeys[2][64][AES_KEY_LEN + 1] = {{{0}}}; + uint8_t vkey[16] = {0}; int vkeylen = 0; CLIGetHexWithReturn(ctx, 5, vkey, &vkeylen); @@ -1222,6 +1222,8 @@ static int CmdHFMFPChk(const char *Cmd) { if (pattern2b) Fill2bPattern(keyList, &keyListLen, &startPattern); + int res = PM3_SUCCESS; + // dictionary mode size_t endFilePosition = 0; if (dict_filenamelen) { @@ -1265,6 +1267,7 @@ static int CmdHFMFPChk(const char *Cmd) { Fill2bPattern(keyList, &keyListLen, &startPattern); continue; } + if (dict_filenamelen && endFilePosition) { if (verbose == false) PrintAndLogEx(NORMAL, "d" NOLF); @@ -1274,6 +1277,7 @@ static int CmdHFMFPChk(const char *Cmd) { if (res == PM3_SUCCESS && endFilePosition) { keyListLen = keycnt; } + continue; } break; @@ -1282,26 +1286,38 @@ static int CmdHFMFPChk(const char *Cmd) { PrintAndLogEx(NORMAL, ""); // print result + char strA[46 + 1] = {0}; + char strB[46 + 1] = {0}; + bool printedHeader = false; - for (uint8_t sector = startSector; sector <= endSector; sector++) { - if (foundKeys[0][sector][0] || foundKeys[1][sector][0]) { - if (!printedHeader) { - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "-------+--------------------------------+---------------------------------"); - PrintAndLogEx(INFO, "|sector| key A | key B |"); - PrintAndLogEx(INFO, "|------+--------------------------------+--------------------------------|"); - printedHeader = true; - } - PrintAndLogEx(INFO, "| %02d |%32s|%32s|", - sector, - (foundKeys[0][sector][0] == 0) ? "------ " : sprint_hex_inrow(&foundKeys[0][sector][1], AES_KEY_LEN), - (foundKeys[1][sector][0] == 0) ? "------ " : sprint_hex_inrow(&foundKeys[1][sector][1], AES_KEY_LEN)); + for (uint8_t s = startSector; s <= endSector; s++) { + if (printedHeader == false) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "-----+----------------------------------+----------------------------------"); + PrintAndLogEx(INFO, " Sec | key A | key B"); + PrintAndLogEx(INFO, "-----+----------------------------------+----------------------------------"); + printedHeader = true; } + + if (foundKeys[0][s][0]) { + snprintf(strA, sizeof(strA), _GREEN_("%s"), sprint_hex_inrow(&foundKeys[0][s][1], AES_KEY_LEN)); + } else { + snprintf(strA, sizeof(strA), _RED_("%s"), "--------------------------------"); + } + + if (foundKeys[1][s][0]) { + snprintf(strB, sizeof(strB), _GREEN_("%s"), sprint_hex_inrow(&foundKeys[1][s][1], AES_KEY_LEN)); + } else { + snprintf(strB, sizeof(strB), _RED_("%s"), "--------------------------------"); + } + + PrintAndLogEx(INFO, " " _YELLOW_("%03d") " | %s | %s", s, strA, strB); } - if (!printedHeader) + + if (printedHeader == false) PrintAndLogEx(INFO, "No keys found("); else - PrintAndLogEx(INFO, "'------+--------------------------------+--------------------------------'\n"); + PrintAndLogEx(INFO, "-----+----------------------------------+----------------------------------\n"); // save keys to json if ((jsonnamelen > 0) && printedHeader) { From f462e6bd02d76114f2314b80cc71af168f215cb9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 12 Jun 2023 20:14:12 +0200 Subject: [PATCH 507/924] hf mfp rdsc - style similar to MF commands --- client/src/cmdhfmfp.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index f3b53ed3e..d1cd0a8ac 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -172,7 +172,7 @@ static int plus_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signature const ecdsa_publickey_t nxp_plus_public_keys[] = { {"MIFARE Plus EV1", "044409ADC42F91A8394066BA83D872FB1D16803734E911170412DDF8BAD1A4DADFD0416291AFE1C748253925DA39A5F39A1C557FFACD34C62E"}, {"MIFARE Plus Ev_x", "04BB49AE4447E6B1B6D21C098C1538B594A11A4A1DBF3D5E673DEACDEB3CC512D1C08AFA1A2768CE20A200BACD2DC7804CD7523A0131ABF607"}, - {"MIFARE Plus Trojka", "040F732E0EA7DF2B38F791BF89425BF7DCDF3EE4D976669E3831F324FF15751BD52AFF1782F72FF2731EEAD5F63ABE7D126E03C856FFB942AF"} + {"MIFARE Plus Troika", "040F732E0EA7DF2B38F791BF89425BF7DCDF3EE4D976669E3831F324FF15751BD52AFF1782F72FF2731EEAD5F63ABE7D126E03C856FFB942AF"} }; uint8_t i; @@ -849,8 +849,14 @@ static int CmdHFMFPRdsc(const char *Cmd) { uint8_t data[250] = {0}; int datalen = 0; uint8_t mac[8] = {0}; - for (int n = mfFirstBlockOfSector(sectorNum); n < mfFirstBlockOfSector(sectorNum) + mfNumBlocksPerSector(sectorNum); n++) { - res = MFPReadBlock(&mf4session, plain, n & 0xff, 1, false, true, data, sizeof(data), &datalen, mac); + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, " # | sector " _GREEN_("%02d") " / " _GREEN_("0x%02X") " | ascii", sectorNum, sectorNum); + PrintAndLogEx(INFO, "----+-------------------------------------------------+-----------------"); + + for (int blockno = mfFirstBlockOfSector(sectorNum); blockno < mfFirstBlockOfSector(sectorNum) + mfNumBlocksPerSector(sectorNum); blockno++) { + + res = MFPReadBlock(&mf4session, plain, blockno & 0xff, 1, false, true, data, sizeof(data), &datalen, mac); if (res) { PrintAndLogEx(ERR, "Read error: %d", res); DropField(); @@ -862,25 +868,32 @@ static int CmdHFMFPRdsc(const char *Cmd) { DropField(); return PM3_ESOFT; } - if (datalen != 1 + 16 + 8 + 2) { + + if (datalen != 1 + MFBLOCK_SIZE + 8 + 2) { PrintAndLogEx(ERR, "Error return length:%d", datalen); DropField(); return PM3_ESOFT; } - PrintAndLogEx(INFO, "data[%03d]: %s", n, sprint_hex(&data[1], 16)); + // PrintAndLogEx(INFO, "data[%03d]: %s", n, sprint_hex(&data[1], 16)); + if (blockno == 0) { + PrintAndLogEx(INFO, "%3d | " _RED_("%s"), blockno, sprint_hex_ascii(data + 1, MFBLOCK_SIZE)); + } else { + PrintAndLogEx(INFO, "%3d | %s ", blockno, sprint_hex_ascii(data + 1, MFBLOCK_SIZE)); + } if (memcmp(&data[1 + 16], mac, 8)) { - PrintAndLogEx(WARNING, "WARNING: mac on block %d not equal...", n); - PrintAndLogEx(WARNING, "MAC card: %s", sprint_hex(&data[1 + 16], 8)); - PrintAndLogEx(WARNING, "MAC reader: %s", sprint_hex(mac, 8)); + PrintAndLogEx(WARNING, "WARNING: mac on block %d not equal...", blockno); + PrintAndLogEx(WARNING, "MAC card... " _YELLOW_("%s"), sprint_hex_inrow(&data[1 + MFBLOCK_SIZE], 8)); + PrintAndLogEx(WARNING, "MAC reader... " _YELLOW_("%s"), sprint_hex_inrow(mac, sizeof(mac))); } else { - if (verbose) - PrintAndLogEx(INFO, "MAC: %s", sprint_hex(&data[1 + 16], 8)); + if (verbose) { + PrintAndLogEx(INFO, "MAC... " _YELLOW_("%s"), sprint_hex_inrow(&data[1 + MFBLOCK_SIZE], 8)); + } } } + PrintAndLogEx(NORMAL, ""); DropField(); - return PM3_SUCCESS; } From 8ac04b2d210b16521a842755346e00f80c949cbf Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 12 Jun 2023 20:34:06 +0200 Subject: [PATCH 508/924] style on hf mf rdsc , hf mf rdbl, to match the MF commands --- client/src/cmdhfmf.c | 6 +++--- client/src/cmdhfmf.h | 6 +++++- client/src/cmdhfmfp.c | 40 +++++++++++++++++----------------------- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 3dee09d3b..6aac4677c 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -207,7 +207,7 @@ static char GetFormatFromSector(uint8_t sectors) { } } -static bool mfc_value(const uint8_t *d, int32_t *val) { +bool mfc_value(const uint8_t *d, int32_t *val) { // values int32_t a = (int32_t)MemLeToUint4byte(d); uint32_t a_inv = MemLeToUint4byte(d + 4); @@ -225,7 +225,7 @@ static bool mfc_value(const uint8_t *d, int32_t *val) { return val_checks; } -static void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose) { +void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose) { if (blockno == 0) { PrintAndLogEx(INFO, "%3d | " _RED_("%s"), blockno, sprint_hex_ascii(d, MFBLOCK_SIZE)); } else if (mfIsSectorTrailer(blockno)) { @@ -389,7 +389,7 @@ static void mf_print_values(uint16_t n, uint8_t *d) { } */ -static void mf_print_sector_hdr(uint8_t sector) { +void mf_print_sector_hdr(uint8_t sector) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, " # | sector " _GREEN_("%02d") " / " _GREEN_("0x%02X") " | ascii", sector, sector); PrintAndLogEx(INFO, "----+-------------------------------------------------+-----------------"); diff --git a/client/src/cmdhfmf.h b/client/src/cmdhfmf.h index 5c21c7fb3..96a8f9079 100644 --- a/client/src/cmdhfmf.h +++ b/client/src/cmdhfmf.h @@ -33,7 +33,11 @@ int CmdHFMFNDEFWrite(const char *Cmd); // used by "nfc mf cwrite" void showSectorTable(sector_t *k_sector, size_t k_sectors_cnt); void readerAttack(sector_t *k_sector, size_t k_sectors_cnt, nonces_t data, bool setEmulatorMem, bool verbose); void printKeyTable(size_t sectorscnt, sector_t *e_sector); -void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector); +void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector, bool singel_sector); + +bool mfc_value(const uint8_t *d, int32_t *val); +void mf_print_sector_hdr(uint8_t sector); +void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose); int mfc_ev1_print_signature(uint8_t *uid, uint8_t uidlen, uint8_t *signature, int signature_len); #endif diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index d1cd0a8ac..a48dd45c7 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -33,6 +33,7 @@ #include "fileutils.h" #include "protocols.h" #include "crypto/libpcrypto.h" +#include "cmdhfmf.h" // printblock, header static const uint8_t DefaultKey[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; static uint16_t CardAddresses[] = {0x9000, 0x9001, 0x9002, 0x9003, 0x9004, 0xA000, 0xA001, 0xA080, 0xA081, 0xC000, 0xC001}; @@ -766,25 +767,25 @@ static int CmdHFMFPRdbl(const char *Cmd) { return PM3_ESOFT; } + uint8_t sector = mfSectorNum(blockn); + mf_print_sector_hdr(sector); + int indx = blockn; for (int i = 0; i < blocksCount; i++) { - PrintAndLogEx(INFO, "data[%03d]: %s", indx, sprint_hex(&data[1 + i * 16], 16)); + mf_print_block_one(indx, data + 1 + (i * MFBLOCK_SIZE), verbose); indx++; - if (mfIsSectorTrailer(indx) && i != blocksCount - 1) { - PrintAndLogEx(INFO, "data[%03d]: ------------------- trailer -------------------", indx); - indx++; + } + + if (memcmp(&data[(blocksCount * 16) + 1], mac, 8)) { + PrintAndLogEx(WARNING, "WARNING: mac not equal..."); + PrintAndLogEx(WARNING, "MAC card... " _YELLOW_("%s"), sprint_hex_inrow(&data[1 + (blocksCount * MFBLOCK_SIZE)], 8)); + PrintAndLogEx(WARNING, "MAC reader... " _YELLOW_("%s"), sprint_hex_inrow(mac, sizeof(mac))); + } else { + if (verbose) { + PrintAndLogEx(INFO, "MAC... " _YELLOW_("%s"), sprint_hex_inrow(&data[1 + (blocksCount * MFBLOCK_SIZE)], 8)); } } - - if (memcmp(&data[blocksCount * 16 + 1], mac, 8)) { - PrintAndLogEx(WARNING, "WARNING: mac not equal..."); - PrintAndLogEx(WARNING, "MAC card: %s", sprint_hex(&data[blocksCount * 16 + 1], 8)); - PrintAndLogEx(WARNING, "MAC reader: %s", sprint_hex(mac, 8)); - } else { - if (verbose) - PrintAndLogEx(INFO, "MAC: %s", sprint_hex(&data[blocksCount * 16 + 1], 8)); - } - + PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } @@ -850,9 +851,7 @@ static int CmdHFMFPRdsc(const char *Cmd) { int datalen = 0; uint8_t mac[8] = {0}; - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, " # | sector " _GREEN_("%02d") " / " _GREEN_("0x%02X") " | ascii", sectorNum, sectorNum); - PrintAndLogEx(INFO, "----+-------------------------------------------------+-----------------"); + mf_print_sector_hdr(sectorNum); for (int blockno = mfFirstBlockOfSector(sectorNum); blockno < mfFirstBlockOfSector(sectorNum) + mfNumBlocksPerSector(sectorNum); blockno++) { @@ -875,12 +874,7 @@ static int CmdHFMFPRdsc(const char *Cmd) { return PM3_ESOFT; } - // PrintAndLogEx(INFO, "data[%03d]: %s", n, sprint_hex(&data[1], 16)); - if (blockno == 0) { - PrintAndLogEx(INFO, "%3d | " _RED_("%s"), blockno, sprint_hex_ascii(data + 1, MFBLOCK_SIZE)); - } else { - PrintAndLogEx(INFO, "%3d | %s ", blockno, sprint_hex_ascii(data + 1, MFBLOCK_SIZE)); - } + mf_print_block_one(blockno, data + 1, verbose); if (memcmp(&data[1 + 16], mac, 8)) { PrintAndLogEx(WARNING, "WARNING: mac on block %d not equal...", blockno); From f370e0df71e7e2575c99477bb4ce1b65022213d0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 12 Jun 2023 21:12:24 +0200 Subject: [PATCH 509/924] revert --- client/src/cmdhfmf.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.h b/client/src/cmdhfmf.h index 96a8f9079..4e92bca70 100644 --- a/client/src/cmdhfmf.h +++ b/client/src/cmdhfmf.h @@ -33,7 +33,8 @@ int CmdHFMFNDEFWrite(const char *Cmd); // used by "nfc mf cwrite" void showSectorTable(sector_t *k_sector, size_t k_sectors_cnt); void readerAttack(sector_t *k_sector, size_t k_sectors_cnt, nonces_t data, bool setEmulatorMem, bool verbose); void printKeyTable(size_t sectorscnt, sector_t *e_sector); -void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector, bool singel_sector); +void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector); +// void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector, bool singel_sector); bool mfc_value(const uint8_t *d, int32_t *val); void mf_print_sector_hdr(uint8_t sector); From 6fd0d93647a9fb7b9179e6833d480b83e1797586 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 14 Jun 2023 14:24:41 +0200 Subject: [PATCH 510/924] fixed the trace list output when marking crcbytes in color mode. Some odd cases exists. --- CHANGELOG.md | 1 + client/src/cmdhflist.c | 2 +- client/src/cmdtrace.c | 133 +++++++++++++++++++++++++++++------------ 3 files changed, 98 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfa5e9510..700f906bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `trace list` - now handles marking of crc bytes w color a bit better (@iceman1001) - Changed `hf mfu pwdgen -r` - now generates pwd/pack for Philips Sonicare, thanks @ckuenzi, @atc1441 (@iceman1001) - Changed `hf mfu info` - now detects Philips Sonicare devices (@iceman1001) - Fixed truncated FPGA upload due to incorrect integer size variable (@d18c7db) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index 7207e50f9..fe0ee46b0 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -70,7 +70,7 @@ static uint8_t *gs_mfuc_key = NULL; uint8_t iso14443A_CRC_check(bool isResponse, uint8_t *d, uint8_t n) { if (n < 3) return 2; - if (isResponse && (n < 6)) return 2; + if (isResponse && (n == 5)) return 2; if (d[1] == 0x50 && d[0] >= ISO14443A_CMD_ANTICOLL_OR_SELECT && d[0] <= ISO14443A_CMD_ANTICOLL_OR_SELECT_3) { diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index d3096307a..ad4847e35 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -570,8 +570,12 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr //1 CRC-command, CRC ok //2 Not crc-command - //--- Draw the data column - char line[18][160] = {{0}}; + // Draw the data column + #define TRACE_MAX_LINES 36 + // number of hex bytes to be printed per row (16 data + 2 crc) + #define TRACE_MAX_HEX_BYTES 18 + + char line[TRACE_MAX_LINES][160] = {{0}}; if (data_len == 0) { if (protocol == ICLASS && duration == 2048) { @@ -582,9 +586,10 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr snprintf(line[0], sizeof(line[0]), ""); } } + uint8_t partialbytebuff = 0; uint8_t offset = 0; - for (int j = 0; j < data_len && j / 18 < 18; j++) { + for (int j = 0; j < data_len && (j / TRACE_MAX_HEX_BYTES) < TRACE_MAX_HEX_BYTES; j++) { uint8_t parityBits = parityBytes[j >> 3]; if (protocol != LEGIC && protocol != ISO_14443B @@ -602,11 +607,14 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr && (oddparity8(frame[j]) != ((parityBits >> (7 - (j & 0x0007))) & 0x01))) { snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x! ", frame[j]); + } else if (protocol == ICLASS && hdr->isResponse == false) { + uint8_t parity = 0; for (int i = 0; i < 6; i++) { parity ^= ((frame[0] >> i) & 1); } + if (parity == ((frame[0] >> 7) & 1)) { snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x ", frame[j]); } else { @@ -631,10 +639,8 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } - - uint8_t crc_format_string_offset = 0; if (markCRCBytes && data_len > 2) { - //CRC-command + // CRC-command if (((protocol == PROTO_HITAG1) || (protocol == PROTO_HITAGS)) && (data_len > 1)) { // Note that UID REQUEST response has no CRC, but we don't know // if the response we see is a UID @@ -647,8 +653,8 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (crcStatus == 0 || crcStatus == 1) { - char *pos1 = line[(data_len - 2) / 18]; - pos1 += (((data_len - 2) % 18) * 4) - 1; + char *pos1 = line[(data_len - 2) / TRACE_MAX_HEX_BYTES]; + pos1 += (((data_len - 2) % TRACE_MAX_HEX_BYTES) * 4) - 1; (*(pos1 + 6 + 1)) = '\0'; @@ -657,26 +663,56 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr if (hdr->isResponse) { if (g_session.supports_colors) { if (crcStatus == 0) { - snprintf(pos1, 24, " " _RED_("%s") " ", cb_str); + snprintf(pos1, 24, AEND " " _RED_("%s"), cb_str); } else { - snprintf(pos1, 24, " " _GREEN_("%s") " ", cb_str); + snprintf(pos1, 24, AEND " " _GREEN_("%s"), cb_str); } - crc_format_string_offset = 9; } else { snprintf(pos1, 9, "[%s]", cb_str); } } else { if (g_session.supports_colors) { if (crcStatus == 0) { - snprintf(pos1, 24, AEND " " _RED_("%s") " ", cb_str); + snprintf(pos1, 24, AEND " " _RED_("%s"), cb_str); } else { - snprintf(pos1, 24, AEND " " _GREEN_("%s") " ", cb_str); + snprintf(pos1, 24, AEND " " _GREEN_("%s"), cb_str); } - crc_format_string_offset = 13; } else { snprintf(pos1, 9, "[%s]", cb_str); } } + + // odd case of second crc byte is alone in a new line + if (strlen(cb_str) < 5) { + + free(cb_str); + + pos1 = line[((data_len - 2) / TRACE_MAX_HEX_BYTES) + 1]; + cb_str = str_dup(pos1); + + if (hdr->isResponse) { + if (g_session.supports_colors) { + if (crcStatus == 0) { + snprintf(pos1, 24, _RED_("%s"), cb_str); + } else { + snprintf(pos1, 24, _GREEN_("%s"), cb_str); + } + } else { + snprintf(pos1, 9, "[%s]", cb_str); + } + } else { + if (g_session.supports_colors) { + if (crcStatus == 0) { + snprintf(pos1, 24, _RED_("%s"), cb_str); + } else { + snprintf(pos1, 24, _GREEN_("%s"), cb_str); + } + } else { + snprintf(pos1, 9, "[%s]", cb_str); + } + } + } + free(cb_str); } } @@ -688,8 +724,8 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr // mark short bytes (less than 8 Bit + Parity) if (protocol == ISO_14443A || - protocol == PROTO_MIFARE || - protocol == THINFILM) { + protocol == PROTO_MIFARE || + protocol == THINFILM) { // approximated with 128 * (9 * data_len); uint16_t bitime = 1056 + 32; @@ -791,8 +827,14 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } } - int num_lines = MIN((data_len - 1) / 18 + 1, 18); + int str_padder = 72; + int num_lines = MIN((data_len - 1) / TRACE_MAX_HEX_BYTES + 1, TRACE_MAX_HEX_BYTES); + for (int j = 0; j < num_lines ; j++) { + + bool last_line = (j == num_lines - 1); + str_padder = 72; + if (j == 0) { uint32_t time1 = hdr->timestamp - first_hdr->timestamp; @@ -802,25 +844,30 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr time2 = duration; } + // ansi codes addes extra chars that needs to be taken in consideration. + if (last_line && (memcmp(crc, "\x20\x20\x20\x20", 4) != 0) && g_session.supports_colors && markCRCBytes) { + str_padder = 85; + } + if (hdr->isResponse) { // tag row if (use_us) { PrintAndLogEx(NORMAL, " %10.1f | %10.1f | Tag |%-*s | %s| %s", (float)time1 / 13.56, (float)time2 / 13.56, - 72 + crc_format_string_offset, + str_padder, line[j], - (j == num_lines - 1) ? crc : " ", - (j == num_lines - 1) ? explanation : "" + (last_line) ? crc : " ", + (last_line) ? explanation : "" ); } else { PrintAndLogEx(NORMAL, " %10u | %10u | Tag |%-*s | %s| %s", time1, time2, - 72 + crc_format_string_offset, + str_padder, line[j], - (j == num_lines - 1) ? crc : " ", - (j == num_lines - 1) ? explanation : "" + (last_line) ? crc : " ", + (last_line) ? explanation : "" ); } } else { @@ -830,41 +877,51 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr _YELLOW_(" %10.1f") " | " _YELLOW_("%10.1f") " | " _YELLOW_("Rdr") " |" _YELLOW_("%-*s")" | " _YELLOW_("%s") "| " _YELLOW_("%s"), (float)time1 / 13.56, (float)time2 / 13.56, - 72 + crc_format_string_offset, + str_padder, line[j], - (j == num_lines - 1) ? crc : " ", - (j == num_lines - 1) ? explanation : "" + (last_line) ? crc : " ", + (last_line) ? explanation : "" ); } else { PrintAndLogEx(NORMAL, _YELLOW_(" %10u") " | " _YELLOW_("%10u") " | " _YELLOW_("Rdr") " |" _YELLOW_("%-*s")" | " _YELLOW_("%s") "| " _YELLOW_("%s"), time1, time2, - 72 + crc_format_string_offset, + str_padder, line[j], - (j == num_lines - 1) ? crc : " ", - (j == num_lines - 1) ? explanation : "" + (last_line) ? crc : " ", + (last_line) ? explanation : "" ); } - } } else { + + + if (last_line && (memcmp(crc, "\x20\x20\x20\x20", 4) != 0) && g_session.supports_colors && markCRCBytes) { + str_padder = 85; + // odd case of multiline, and last single byte on empty row has been colorised... + if (strlen(line[j]) < 14) { + str_padder = 81; + } + } + if (hdr->isResponse) { PrintAndLogEx(NORMAL, " | | |%-*s | %s| %s", - 72 + crc_format_string_offset, + str_padder, line[j], - (j == num_lines - 1) ? crc : " ", - (j == num_lines - 1) ? explanation : "" + last_line ? crc : " ", + last_line ? explanation : "" ); } else { PrintAndLogEx(NORMAL, " | | |" _YELLOW_("%-*s")" | " _YELLOW_("%s") "| " _YELLOW_("%s"), - 72 + crc_format_string_offset, + str_padder, line[j], - (j == num_lines - 1) ? crc : " ", - (j == num_lines - 1) ? explanation : "" + last_line ? crc : " ", + last_line ? explanation : "" ); } + } } @@ -875,8 +932,10 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr memset(explanation, 0x00, sizeof(explanation)); annotateIso14443a(explanation, sizeof(explanation), mfData, mfDataLen, hdr->isResponse); uint8_t crcc = iso14443A_CRC_check(hdr->isResponse, mfData, mfDataLen); + + //iceman: colorise crc bytes here will need a refactor of code from above. PrintAndLogEx(NORMAL, " | | * |%-*s | %-4s| %s", - 72 + crc_format_string_offset, + str_padder, sprint_hex_inrow_spaces(mfData, mfDataLen, 2), (crcc == 0 ? _RED_(" !! ") : (crcc == 1 ? _GREEN_(" ok ") : " ")), explanation); From fdd85d7e1e1e4afccbb580bf129fc8d6dc5a118a Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Wed, 14 Jun 2023 16:32:10 +0200 Subject: [PATCH 511/924] Fix LegicCash segment CRC computation --- client/luascripts/hf_legic.lua | 47 +++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/client/luascripts/hf_legic.lua b/client/luascripts/hf_legic.lua index d6260ac88..cad71f270 100644 --- a/client/luascripts/hf_legic.lua +++ b/client/luascripts/hf_legic.lua @@ -221,7 +221,7 @@ end --- -- curency-codes for Legic-Cash-Segments (ISO 4217) local currency = { - ["03d2"]="EUR", + ["03D2"]="EUR", ["0348"]="USD", ["033A"]="GBP", ["02F4"]="CHF" @@ -1447,7 +1447,10 @@ function dumpLegicCash(tag, x) print("--------------------------------\n\tLegic-Cash Values\n--------------------------------") local limit, curr, balance, rid, tcv -- currency of balance & limit - curr=currency[tag.SEG[x].data[8]..tag.SEG[x].data[9]] + curr=string.upper(tag.SEG[x].data[8]..tag.SEG[x].data[9]) + if currency[curr] ~= nil then + curr = currency[curr] + end -- maximum balance limit=string.format("%4.2f", tonumber(tag.SEG[x].data[10]..tag.SEG[x].data[11]..tag.SEG[x].data[12], 16)/100) -- current balance @@ -1784,17 +1787,17 @@ end --- -- edit Segment Data -function editSegmentData(data) +function editSegmentData(data, uid) io.write("\n") if istable(data) == false then print("no Segment-Data found") end - local lc = check4LegicCash(data) + local lc = check4LegicCash(data, uid) for i=0, #data-1 do data[i]=input(accyan.."Data"..i..acoff..": ", data[i]) end if (lc) then - data = fixLegicCash(data) + data = fixLegicCash(data, uid) end return data end @@ -1917,7 +1920,7 @@ function autoSelectSegment(tag, s) repeat io.write(". ") x=x-1 - res=check4LegicCash(tag.SEG[x].data) + res=check4LegicCash(tag.SEG[x].data, uid) until ( res or x==0 ) end --- @@ -2011,7 +2014,7 @@ end --- -- edit Legic Cash -function editLegicCash(data) +function editLegicCash(data, uid) local limit, curr, balance, rid, tcv -- currency of balance & limit curr=currency[data[8]..data[9]] @@ -2064,12 +2067,12 @@ function editLegicCash(data) data[20]=string.sub(rid, 5, 6) end - return fixLegicCash(data) + return fixLegicCash(data, uid) end --- -- chack for signature of a 'Legic-Cash-Segment' -function check4LegicCash(data) +function check4LegicCash(data, uid) if(#data==32) then local stamp_len=(#data-25) local stamp="" @@ -2077,9 +2080,9 @@ function check4LegicCash(data) stamp=stamp..data[i].." " end if (data[7]=="01") then - if (("%04x"):format(utils.Crc16(dumpTable(data, "", 0, 12))) == data[13]..data[14]) then - if (("%04x"):format(utils.Crc16(dumpTable(data, "", 15, 20))) == data[21]..data[22]) then - if (("%04x"):format(utils.Crc16(dumpTable(data, "", 23, 29))) == data[30]..data[31]) then + if (("%04x"):format(utils.Crc16Legic(dumpTable(data, "", 0, 12), uid)) == data[13]..data[14]) then + if (("%04x"):format(utils.Crc16Legic(dumpTable(data, "", 15, 20), uid)) == data[21]..data[22]) then + if (("%04x"):format(utils.Crc16Legic(dumpTable(data, "", 23, 29), uid)) == data[30]..data[31]) then io.write(accyan.."Legic-Cash Segment detected "..acoff) return true end @@ -2156,7 +2159,7 @@ end --- -- repair / fix crc's of a 'Legic-Cash-Segment' -function fixLegicCash(data) +function fixLegicCash(data, uid) if(#data==32 and data[7]=="01") then local crc1, crc2, crc3 -- set shadow-balance equal to balance @@ -2168,9 +2171,9 @@ function fixLegicCash(data) data[27]=data[19] data[28]=data[20] -- calculate all crc's - crc1=("%04x"):format(utils.Crc16(dumpTable(data, "", 0, 12))) - crc2=("%04x"):format(utils.Crc16(dumpTable(data, "", 15, 20))) - crc3=("%04x"):format(utils.Crc16(dumpTable(data, "", 23, 29))) + crc1=("%04x"):format(utils.Crc16Legic(dumpTable(data, "", 0, 12), uid)) + crc2=("%04x"):format(utils.Crc16Legic(dumpTable(data, "", 15, 20), uid)) + crc3=("%04x"):format(utils.Crc16Legic(dumpTable(data, "", 23, 29), uid)) -- set crc's data[13]=string.sub(crc1, 1, 2) data[14]=string.sub(crc1, 3, 4) @@ -2413,7 +2416,7 @@ function modifyMode() for i=0, #inTAG.SEG do if(check43rdPartyCash1(uid, inTAG.SEG[i].data)) then io.write(accyan.."in Segment index: "..inTAG.SEG[i].index ..acoff.. "\n") - elseif(check4LegicCash(inTAG.SEG[i].data)) then + elseif(check4LegicCash(inTAG.SEG[i].data, uid)) then io.write(accyan.."in Segment index: "..inTAG.SEG[i].index..acoff.."\n") lc=true; lci=inTAG.SEG[i].index; @@ -2520,7 +2523,7 @@ function modifyMode() if (type(x)=="string" and string.len(x)>0) then sel=tonumber(x,10) else sel=selectSegment(inTAG) end if (istable(inTAG.SEG[sel])) then - inTAG.SEG[sel].data=editSegmentData(inTAG.SEG[sel].data) + inTAG.SEG[sel].data=editSegmentData(inTAG.SEG[sel].data, inTAG.MCC) end end, --- @@ -2587,13 +2590,15 @@ function modifyMode() else x = selectSegment(inTAG) end - inTAG.SEG[x].data=fixLegicCash(inTAG.SEG[x].data) + local uid=inTAG.MCD..inTAG.MSN0..inTAG.MSN1..inTAG.MSN2 + inTAG.SEG[x].data=fixLegicCash(inTAG.SEG[x].data, uid) end, --- - -- edit legic-cash values fixLegicCash(data) + -- edit legic-cash values fixLegicCash(data, mcc) ["elc"] = function(x) x=autoSelectSegment(inTAG, "legiccash") - inTAG.SEG[x].data=editLegicCash(inTAG.SEG[x].data) + local uid=inTAG.MCD..inTAG.MSN0..inTAG.MSN1..inTAG.MSN2 + inTAG.SEG[x].data=editLegicCash(inTAG.SEG[x].data, uid) end, --- -- dump legic-cash human-readable From d9ed07c77ceed7be281d4c3f0d0b1b50ad70e596 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Wed, 14 Jun 2023 16:37:29 +0200 Subject: [PATCH 512/924] Missed one line for LegicCash uid --- client/luascripts/hf_legic.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/luascripts/hf_legic.lua b/client/luascripts/hf_legic.lua index cad71f270..21684b6fb 100644 --- a/client/luascripts/hf_legic.lua +++ b/client/luascripts/hf_legic.lua @@ -2523,7 +2523,8 @@ function modifyMode() if (type(x)=="string" and string.len(x)>0) then sel=tonumber(x,10) else sel=selectSegment(inTAG) end if (istable(inTAG.SEG[sel])) then - inTAG.SEG[sel].data=editSegmentData(inTAG.SEG[sel].data, inTAG.MCC) + local uid = inTAG.MCD..inTAG.MSN0..inTAG.MSN1..inTAG.MSN2 + inTAG.SEG[sel].data=editSegmentData(inTAG.SEG[sel].data, uid) end end, --- @@ -2594,7 +2595,7 @@ function modifyMode() inTAG.SEG[x].data=fixLegicCash(inTAG.SEG[x].data, uid) end, --- - -- edit legic-cash values fixLegicCash(data, mcc) + -- edit legic-cash values fixLegicCash(data, uid) ["elc"] = function(x) x=autoSelectSegment(inTAG, "legiccash") local uid=inTAG.MCD..inTAG.MSN0..inTAG.MSN1..inTAG.MSN2 From 45b710dc0a9bb930508c613a51ae24d0ee4d5576 Mon Sep 17 00:00:00 2001 From: Jean-Michel Picod Date: Wed, 14 Jun 2023 16:42:11 +0200 Subject: [PATCH 513/924] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 700f906bc..4f8a2d225 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fix LegicCash segment handling in `hf_legic.lua` script (@jmichelp) - Fixed `trace list` - now handles marking of crc bytes w color a bit better (@iceman1001) - Changed `hf mfu pwdgen -r` - now generates pwd/pack for Philips Sonicare, thanks @ckuenzi, @atc1441 (@iceman1001) - Changed `hf mfu info` - now detects Philips Sonicare devices (@iceman1001) From 5c9c360977cc1bca88142bd8dcd41a4aef2918d4 Mon Sep 17 00:00:00 2001 From: nvx Date: Thu, 15 Jun 2023 22:19:02 +1000 Subject: [PATCH 514/924] Fix hf iclass/15693 sniff trace timings. Previously reader durations would be reported to be twice as long in the trace vs reality, and as a result the start time would be earlier than it should have been as well. Also fixes a minor sniff trace timing with card dual subcarrier responses. --- armsrc/iso15693.c | 68 +++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index daa84f886..703f1288f 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -1736,14 +1736,19 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string, bool icla // no need to try decoding reader data if the tag is sending if (!tag_is_active) { - if (Handle15693SampleFromReader((sniffdata & 0x02) >> 1, &dreader)) { + int extra_8s = 1; + if (Handle15693SampleFromReader((sniffdata & 0x02) >> 1, &dreader) || + (++extra_8s && Handle15693SampleFromReader(sniffdata & 0x01, &dreader))) { - uint32_t eof_time = dma_start_time + (samples * 16) + 8 - DELAY_READER_TO_ARM_SNIFF; // end of EOF if (dreader.byteCount > 0) { + // sof/eof_times are in ssp_clk, which is 13.56MHz / 4 + // not sure where the extra +8's on the EOF time comes from though, if someone knows update this comment + uint32_t eof_time = dma_start_time + (samples * 16) + (extra_8s * 8) - DELAY_READER_TO_ARM_SNIFF; // end of EOF uint32_t sof_time = eof_time - - dreader.byteCount * (dreader.Coding == CODING_1_OUT_OF_4 ? 128 * 16 : 2048 * 16) // time for byte transfers - - 32 * 16 // time for SOF transfer - - 16 * 16; // time for EOF transfer + - dreader.byteCount * (dreader.Coding == CODING_1_OUT_OF_4 ? 1024 : 16384) // time for byte transfers + - 256 // time for SOF transfer (1024/fc / 4) + - 128; // time for EOF transfer (512/fc / 4) + // sof/eof_times * 4 here to bring from ssp_clk freq to RF carrier freq LogTrace_ISO15693(dreader.output, dreader.byteCount, (sof_time * 4), (eof_time * 4), NULL, true); if (!iclass) { // Those flags don't exist in iClass @@ -1751,52 +1756,38 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string, bool icla expect_fast_answer = dreader.output[0] & ISO15_REQ_DATARATE_HIGH; } } + // And ready to receive another command. //DecodeReaderReset(&dreader); // already reseted DecodeTagReset(&dtag); DecodeTagFSKReset(&dtagfsk); reader_is_active = false; expect_tag_answer = true; - } else if (Handle15693SampleFromReader(sniffdata & 0x01, &dreader)) { - - uint32_t eof_time = dma_start_time + (samples * 16) + 16 - DELAY_READER_TO_ARM_SNIFF; // end of EOF - if (dreader.byteCount > 0) { - uint32_t sof_time = eof_time - - dreader.byteCount * (dreader.Coding == CODING_1_OUT_OF_4 ? 128 * 16 : 2048 * 16) // time for byte transfers - - 32 * 16 // time for SOF transfer - - 16 * 16; // time for EOF transfer - LogTrace_ISO15693(dreader.output, dreader.byteCount, (sof_time * 4), (eof_time * 4), NULL, true); - if (!iclass) { // Those flags don't exist in iClass - expect_fsk_answer = dreader.output[0] & ISO15_REQ_SUBCARRIER_TWO; - expect_fast_answer = dreader.output[0] & ISO15_REQ_DATARATE_HIGH; - } - } - // And ready to receive another command - //DecodeReaderReset(&dreader); // already reseted - DecodeTagReset(&dtag); - DecodeTagFSKReset(&dtagfsk); - reader_is_active = false; - expect_tag_answer = true; } else { reader_is_active = (dreader.state >= STATE_READER_RECEIVE_DATA_1_OUT_OF_4); } } - if (!reader_is_active && expect_tag_answer) { // no need to try decoding tag data if the reader is currently sending or no answer expected yet + // no need to try decoding tag data if the reader is currently sending or no answer expected yet + if (!reader_is_active && expect_tag_answer) { if (!expect_fsk_answer) { + // single subcarrier tag response if (Handle15693SamplesFromTag((sniffdata >> 4) << 2, &dtag, expect_fast_answer)) { + // sof/eof_times are in ssp_clk, which is 13.56MHz / 4 uint32_t eof_time = dma_start_time + (samples * 16) - DELAY_TAG_TO_ARM_SNIFF; // end of EOF if (dtag.lastBit == SOF_PART2) { eof_time -= (8 * 16); // needed 8 additional samples to confirm single SOF (iCLASS) } uint32_t sof_time = eof_time - - dtag.len * 8 * 8 * 16 // time for byte transfers - - (32 * 16) // time for SOF transfer - - (dtag.lastBit != SOF_PART2 ? (32 * 16) : 0); // time for EOF transfer + - dtag.len * 1024 // time for byte transfers (4096/fc / 4) + - 512 // time for SOF transfer (2048/fc / 4) + - (dtag.lastBit != SOF_PART2 ? 512 : 0); // time for EOF transfer (2048/fc / 4) + // sof/eof_times * 4 here to bring from ssp_clk freq to RF carrier freq LogTrace_ISO15693(dtag.output, dtag.len, (sof_time * 4), (eof_time * 4), NULL, false); + // And ready to receive another response. DecodeTagReset(&dtag); DecodeTagFSKReset(&dtagfsk); @@ -1807,26 +1798,23 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string, bool icla tag_is_active = (dtag.state >= STATE_TAG_RECEIVING_DATA); } } else { + // dual subcarrier tag response if (FREQ_IS_0((sniffdata >> 2) & 0x3)) // tolerate 1 00 sniffdata = sniffdata_prev; if (Handle15693FSKSamplesFromTag((sniffdata >> 2) & 0x3, &dtagfsk, expect_fast_answer)) { - expect_fsk_answer = false; - } else { - tag_is_active = (dtagfsk.state >= STATE_FSK_RECEIVING_DATA_484); - } - if (!expect_fsk_answer) { - // FSK answer no more expected: switch back to ASK if (dtagfsk.len > 0) { + // sof/eof_times are in ssp_clk, which is 13.56MHz / 4 uint32_t eof_time = dma_start_time + (samples * 16) - DELAY_TAG_TO_ARM_SNIFF; // end of EOF if (dtagfsk.lastBit == SOF) { eof_time -= (8 * 16); // needed 8 additional samples to confirm single SOF (iCLASS) } uint32_t sof_time = eof_time - - dtagfsk.len * 8 * 8 * 16 // time for byte transfers - - (32 * 16) // time for SOF transfer - - (dtagfsk.lastBit != SOF ? (32 * 16) : 0); // time for EOF transfer + - dtagfsk.len * 1016 // time for byte transfers (4064/fc / 4) - FSK is slightly different + - 512 // time for SOF transfer (2048/fc / 4) + - (dtagfsk.lastBit != SOF ? 512 : 0); // time for EOF transfer (2048/fc / 4) + // sof/eof_times * 4 here to bring from ssp_clk freq to RF carrier freq LogTrace_ISO15693(dtagfsk.output, dtagfsk.len, (sof_time * 4), (eof_time * 4), NULL, false); } @@ -1834,6 +1822,10 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string, bool icla DecodeReaderReset(&dreader); expect_tag_answer = false; tag_is_active = false; + // FSK answer no more expected: switch back to ASK + expect_fsk_answer = false; + } else { + tag_is_active = (dtagfsk.state >= STATE_FSK_RECEIVING_DATA_484); } } } From 6d48b1a5dd4afabec6e6d764687cc0ad6cdc42c2 Mon Sep 17 00:00:00 2001 From: nvx Date: Thu, 15 Jun 2023 22:23:46 +1000 Subject: [PATCH 515/924] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 700f906bc..e427cf587 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `hf 15693/iclass sniff` trace timings (@nvx) - Fixed `trace list` - now handles marking of crc bytes w color a bit better (@iceman1001) - Changed `hf mfu pwdgen -r` - now generates pwd/pack for Philips Sonicare, thanks @ckuenzi, @atc1441 (@iceman1001) - Changed `hf mfu info` - now detects Philips Sonicare devices (@iceman1001) From be507e166293d763003c90426ec628ebb1175045 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 15 Jun 2023 16:09:15 +0200 Subject: [PATCH 516/924] Avoid spurious 'No history will be recorded' error on fresh install --- client/src/proxmark3.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 378b9f0dc..162bc7776 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -250,16 +250,13 @@ main_loop(char *script_cmds_file, char *script_cmd, bool stayInCommandLoop) { if (g_session.incognito) { PrintAndLogEx(INFO, "No history will be recorded"); } else { - bool loaded_history = false; if (searchHomeFilePath(&g_session.history_path, NULL, PROXHISTORY, true) != PM3_SUCCESS) { g_session.history_path = NULL; - } else { - loaded_history = (pm3line_load_history(g_session.history_path) == PM3_SUCCESS); - } - if (loaded_history) { - pm3line_install_signals(); - } else { PrintAndLogEx(ERR, "No history will be recorded"); + } else { + if (pm3line_load_history(g_session.history_path) != PM3_SUCCESS) { + PrintAndLogEx(INFO, "No previous history could be loaded"); + } } } From 620e5f49512c7539c689ee7b95efdf9b998c52fd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 15 Jun 2023 22:47:21 +0200 Subject: [PATCH 517/924] simplify logic --- client/src/cmdtrace.c | 44 ++++++++++--------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index ad4847e35..c2e750623 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -660,26 +660,14 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr char *cb_str = str_dup(pos1 + 1); - if (hdr->isResponse) { - if (g_session.supports_colors) { - if (crcStatus == 0) { - snprintf(pos1, 24, AEND " " _RED_("%s"), cb_str); - } else { - snprintf(pos1, 24, AEND " " _GREEN_("%s"), cb_str); - } + if (g_session.supports_colors) { + if (crcStatus == 0) { + snprintf(pos1, 24, AEND " " _RED_("%s"), cb_str); } else { - snprintf(pos1, 9, "[%s]", cb_str); + snprintf(pos1, 24, AEND " " _GREEN_("%s"), cb_str); } } else { - if (g_session.supports_colors) { - if (crcStatus == 0) { - snprintf(pos1, 24, AEND " " _RED_("%s"), cb_str); - } else { - snprintf(pos1, 24, AEND " " _GREEN_("%s"), cb_str); - } - } else { - snprintf(pos1, 9, "[%s]", cb_str); - } + snprintf(pos1, 9, "[%s]", cb_str); } // odd case of second crc byte is alone in a new line @@ -690,26 +678,14 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr pos1 = line[((data_len - 2) / TRACE_MAX_HEX_BYTES) + 1]; cb_str = str_dup(pos1); - if (hdr->isResponse) { - if (g_session.supports_colors) { - if (crcStatus == 0) { - snprintf(pos1, 24, _RED_("%s"), cb_str); - } else { - snprintf(pos1, 24, _GREEN_("%s"), cb_str); - } + if (g_session.supports_colors) { + if (crcStatus == 0) { + snprintf(pos1, 24, _RED_("%s"), cb_str); } else { - snprintf(pos1, 9, "[%s]", cb_str); + snprintf(pos1, 24, _GREEN_("%s"), cb_str); } } else { - if (g_session.supports_colors) { - if (crcStatus == 0) { - snprintf(pos1, 24, _RED_("%s"), cb_str); - } else { - snprintf(pos1, 24, _GREEN_("%s"), cb_str); - } - } else { - snprintf(pos1, 9, "[%s]", cb_str); - } + snprintf(pos1, 9, "[%s]", cb_str); } } From 28fa53170ee5092bf81697dadbc3ca091b1dbf72 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 16 Jun 2023 04:34:26 +0200 Subject: [PATCH 518/924] hf mfp mad now has same checks as mf mad cmd --- client/src/cmdhfmfp.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index a48dd45c7..ccf2e8f78 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1109,7 +1109,7 @@ static int CmdHFMFPChk(const char *Cmd) { CLIParserInit(&ctx, "hf mfp chk", "Checks keys on MIFARE Plus card", "hf mfp chk -k 000102030405060708090a0b0c0d0e0f -> check key on sector 0 as key A and B\n" - "hf mfp chk -s 2 -a -> check default key list on sector 2, key A\n" + "hf mfp chk -s 2 -a -> check default key list on sector 2, only key A\n" "hf mfp chk -d mfp_default_keys -s0 -e6 -> check keys from dictionary against sectors 0-6\n" "hf mfp chk --pattern1b -j keys -> check all 1-byte keys pattern and save found keys to json\n" "hf mfp chk --pattern2b --startp2b FA00 -> check all 2-byte keys pattern. Start from key FA00FA00...FA00"); @@ -1208,10 +1208,10 @@ static int CmdHFMFPChk(const char *Cmd) { uint8_t startKeyAB = 0; uint8_t endKeyAB = 1; - if (keyA && !keyB) + if (keyA && (keyB == false)) endKeyAB = 0; - if (!keyA && keyB) + if ((keyA == false) && keyB) startKeyAB = 1; if (endSector < startSector) @@ -1219,8 +1219,9 @@ static int CmdHFMFPChk(const char *Cmd) { // 1-byte pattern search mode if (pattern1b) { - for (int i = 0; i < 0x100; i++) + for (int i = 0; i < 0x100; i++) { memset(keyList[i], i, 16); + } keyListLen = 0x100; } @@ -1245,8 +1246,9 @@ static int CmdHFMFPChk(const char *Cmd) { if (keyListLen == 0) { for (int i = 0; i < g_mifare_plus_default_keys_len; i++) { - if (hex_to_bytes(g_mifare_plus_default_keys[i], keyList[keyListLen], 16) != 16) + if (hex_to_bytes(g_mifare_plus_default_keys[i], keyList[keyListLen], 16) != 16) { break; + } keyListLen++; } @@ -1259,16 +1261,20 @@ static int CmdHFMFPChk(const char *Cmd) { PrintAndLogEx(INFO, "Loaded " _YELLOW_("%"PRIu32) " keys", keyListLen); } - if (verbose == false) + if (verbose == false) { PrintAndLogEx(INFO, "Search keys"); + } while (true) { - res = MFPKeyCheck(startSector, endSector, startKeyAB, endKeyAB, keyList, keyListLen, foundKeys, verbose); - if (res == PM3_EOPABORTED) + res = plus_key_check(startSector, endSector, startKeyAB, endKeyAB, keyList, keyListLen, foundKeys, verbose); + if (res == PM3_EOPABORTED) { break; + } + if (pattern2b && startPattern < 0x10000) { - if (verbose == false) + if (verbose == false) { PrintAndLogEx(NORMAL, "p" NOLF); + } keyListLen = 0; Fill2bPattern(keyList, &keyListLen, &startPattern); @@ -1604,7 +1610,7 @@ int CmdHFMFPNDEFRead(const char *Cmd) { } PrintAndLogEx(NORMAL, ""); - if (!datalen) { + if (datalen == 0) { PrintAndLogEx(ERR, "no NDEF data"); return PM3_SUCCESS; } @@ -1618,8 +1624,20 @@ int CmdHFMFPNDEFRead(const char *Cmd) { if (fnlen != 0) { saveFile(filename, ".bin", data, datalen); } - NDEFDecodeAndPrint(data, datalen, verbose); - PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mfp ndefread -vv`") " for more details"); + + res = NDEFDecodeAndPrint(data, datalen, verbose); + if (res != PM3_SUCCESS) { + PrintAndLogEx(INFO, "Trying to parse NDEF records w/o NDEF header"); + res = NDEFRecordsDecodeAndPrint(data, datalen, verbose); + } + + if (verbose == false) { + PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mfp ndefread -v`") " for more details"); + } else { + if (verbose2 == false) { + PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mfp ndefread -vv`") " for more details"); + } + } return PM3_SUCCESS; } From d861354344391d7454fd252a6211743c65374bfe Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 16 Jun 2023 05:33:35 +0200 Subject: [PATCH 519/924] fix pm3-flash-all script, where the identification of outdated bootloader failed because of the comparision didnt match any longer --- CHANGELOG.md | 1 + pm3 | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84668aa29..94d492c41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed `pm3-flash-all` shell script now correctly identify the if running on outdated bootloader (@iceman1001) - Fixed `hf 15693/iclass sniff` trace timings (@nvx) - Fix LegicCash segment handling in `hf_legic.lua` script (@jmichelp) - Fixed `trace list` - now handles marking of crc bytes w color a bit better (@iceman1001) diff --git a/pm3 b/pm3 index d59d10ea6..b011c8ed5 100755 --- a/pm3 +++ b/pm3 @@ -144,7 +144,8 @@ function get_pm3_list_Windows { DEV=${DEV/ */} #prevent soft bricking when using pm3-flash-all on an outdated bootloader if [ $(basename -- "$0") = "pm3-flash-all" ]; then - if [ ! $(wmic /locale:ms_409 path Win32_SerialPort Where "DeviceID='$DEV'" Get PNPDeviceID 2>/dev/null | awk -b '/^USB/{print $1}') = "USB\VID_9AC4&PID_4B8F\ICEMAN" ]; then + line=$(wmic /locale:ms_409 path Win32_SerialPort Where "DeviceID='$DEV'" Get PNPDeviceID 2>/dev/null | awk -b '/^USB/{print $1}'); + if [[ ! $line =~ ^"USB\VID_9AC4&PID_4B8F\ICEMAN" ]]; then echo -e "\033[0;31m[!] Using pm3-flash-all on an oudated bootloader, use pm3-flash-bootrom first!" exit 1 fi @@ -189,9 +190,11 @@ function get_pm3_list_WSL { DEV=$(echo $DEV | sed -nr 's#^COM([0-9]+)\b#/dev/ttyS\1#p') # ttyS counterpart takes some more time to appear if [ -e "$DEV" ]; then + #prevent soft bricking when using pm3-flash-all on an outdated bootloader if [ $(basename -- "$0") = "pm3-flash-all" ]; then - if [ ! $($PSHEXE -command "Get-CimInstance -ClassName Win32_serialport | Where-Object {\$_.DeviceID -eq '$_comport'} | Select -expandproperty PNPDeviceID" 2>/dev/null | tr -dc '[:print:]') = "USB\VID_9AC4&PID_4B8F\ICEMAN" ]; then + line=$($PSHEXE -command "Get-CimInstance -ClassName Win32_serialport | Where-Object {\$_.DeviceID -eq '$_comport'} | Select -expandproperty PNPDeviceID" 2>/dev/null | tr -dc '[:print:]'); + if [[ ! $line =~ ^"USB\VID_9AC4&PID_4B8F\ICEMAN" ]]; then echo -e "\033[0;31m[!] Using pm3-flash-all on an oudated bootloader, use pm3-flash-bootrom first!" exit 1 fi From 2010d10f81b0b07d30413222415c2364523da5d5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 16 Jun 2023 05:34:52 +0200 Subject: [PATCH 520/924] forgot to push function rename --- client/src/cmdhfmfp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index ccf2e8f78..9434d88ed 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1000,7 +1000,7 @@ static int CmdHFMFPWrbl(const char *Cmd) { #define AES_KEY_LEN 16 #define MAX_KEYS_LIST_LEN 1024 -static int MFPKeyCheck(uint8_t startSector, uint8_t endSector, uint8_t startKeyAB, uint8_t endKeyAB, +static int plus_key_check(uint8_t startSector, uint8_t endSector, uint8_t startKeyAB, uint8_t endKeyAB, uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_t keyListLen, uint8_t foundKeys[2][64][AES_KEY_LEN + 1], bool verbose) { int res; From d65094b7e0900c7470a26863fe4d636f61d0b39f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 19 Jun 2023 15:01:40 +0200 Subject: [PATCH 521/924] fixed some color to mad directory printings and fixed a sector issue in when saving keyfiles to Mifare Plus cards --- client/src/fileutils.c | 8 ++++---- client/src/mifare/mad.c | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 8fd06456e..3411215c6 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -551,19 +551,19 @@ int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, if (atslen > 0) JsonSaveBufAsHexCompact(root, "$.Card.ATS", &data[14], atslen); - uint8_t vdata[2][64][16 + 1] = {{{0}}}; - memcpy(vdata, &data[14 + atslen], 2 * 64 * 17); + uint8_t vdata[2][64][17] = {{{0}}}; + memcpy(vdata, data + (14 + atslen), 2 * 64 * 17); for (size_t i = 0; i < datalen; i++) { char path[PATH_MAX_LENGTH] = {0}; if (vdata[0][i][0]) { - snprintf(path, sizeof(path), "$.SectorKeys.%d.KeyA", mfSectorNum(i)); + snprintf(path, sizeof(path), "$.SectorKeys.%zu.KeyA", i); JsonSaveBufAsHexCompact(root, path, &vdata[0][i][1], 16); } if (vdata[1][i][0]) { - snprintf(path, sizeof(path), "$.SectorKeys.%d.KeyB", mfSectorNum(i)); + snprintf(path, sizeof(path), "$.SectorKeys.%zu.KeyB", i); JsonSaveBufAsHexCompact(root, path, &vdata[1][i][1], 16); } } diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 328c2e63c..c870dbb28 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -331,12 +331,22 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMA for (int i = 1; i < 16; i++) { uint16_t aid = madGetAID(sector, swapmad, 1, i); if (aid < 6) { - PrintAndLogEx(INFO, (ibs == i) ? _MAGENTA_(" %02d [%04X] (%s)") : " %02d [%04X] (%s)", i, aid, aid_admin[aid]); + PrintAndLogEx(INFO, + (ibs == i) ? _MAGENTA_(" %02d [%04X] %s") : " %02d [" _GREEN_("%04X") "] %s", + i, + aid, + aid_admin[aid] + ); + } else if (prev_aid == aid) { - PrintAndLogEx(INFO, (ibs == i) ? _MAGENTA_(" %02d [%04X] (continuation)") : " %02d [%04X] (continuation)", i, aid); + PrintAndLogEx(INFO, + (ibs == i) ? _MAGENTA_(" %02d [%04X] continuation") : " %02d [" _YELLOW_("%04X") "] continuation", + i, + aid + ); } else { - char fmt[30]; - snprintf(fmt, sizeof(fmt), (ibs == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [%04X]%s", i, aid, "%s"); + char fmt[60]; + snprintf(fmt, sizeof(fmt), (ibs == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [" _GREEN_("%04X") "]%s", i, aid, "%s"); print_aid_description(mad_known_aids, aid, fmt, verbose); prev_aid = aid; } From a4a7033b2385ff679101e8febcb3ce8c259d6dd6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 21 Jun 2023 18:43:21 +0200 Subject: [PATCH 522/924] adapt comparision of text --- client/src/nfc/ndef.c | 2 +- client/src/wiegand_formats.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index 40cfe7113..e03913fbc 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -927,7 +927,7 @@ static int ndefDecodeExternal_record(NDEFHeader_t *ndef) { print_hex_noascii_break(ndef->Payload, ndef->PayloadLen, 32); // do a character check? - if (!strncmp((char *)ndef->Type, "pilet.ee:ekaart:2", ndef->TypeLen)) { + if (!strncmp((char *)ndef->Type, "pilet.ee:ekaart:", ndef->TypeLen - 1)) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, _GREEN_("Ekaart detected") " - Trying ASN1 decode..."); asn1_print(ndef->Payload, ndef->PayloadLen, " "); diff --git a/client/src/wiegand_formats.c b/client/src/wiegand_formats.c index e63040a19..f88c8f759 100644 --- a/client/src/wiegand_formats.c +++ b/client/src/wiegand_formats.c @@ -730,7 +730,9 @@ static bool Pack_C15001(wiegand_card_t *card, wiegand_message_t *packed, bool pr static bool Unpack_C15001(wiegand_message_t *packed, wiegand_card_t *card) { memset(card, 0, sizeof(wiegand_card_t)); - if (packed->Length != 36) return false; // Wrong length? Stop here. + + if (packed->Length != 36) + return false; // Wrong length? Stop here. card->OEM = get_linear_field(packed, 1, 10); card->FacilityCode = get_linear_field(packed, 11, 8); @@ -976,8 +978,10 @@ static bool Pack_C1k48s(wiegand_card_t *card, wiegand_message_t *packed, bool pr packed->Mid |= (evenparity32((packed->Mid & 0x00001B6D) ^ (packed->Bot & 0xB6DB6DB6))) << 14; packed->Bot |= (oddparity32((packed->Mid & 0x000036DB) ^ (packed->Bot & 0x6DB6DB6C))); packed->Mid |= (oddparity32((packed->Mid & 0x00007FFF) ^ (packed->Bot & 0xFFFFFFFF))) << 15; + if (preamble) return add_HID_header(packed); + return true; } From 681382e0cc429d786317f4858a51ae8d07d01c27 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 21 Jun 2023 18:45:25 +0200 Subject: [PATCH 523/924] new AID for Kiev metro card --- client/resources/mad.json | 14 ++++++++++++++ client/src/cmdhfmfp.h | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/client/resources/mad.json b/client/resources/mad.json index cfa6294d3..38cdf2636 100644 --- a/client/resources/mad.json +++ b/client/resources/mad.json @@ -4073,6 +4073,20 @@ "service_provider": "HID Corporation", "system_integrator": "HID Corporation" }, + { + "application": "City transport, prepaid ticket, cardholder, servicespass", + "company": "Ridango AS", + "mad": "0x3C56", + "service_provider": "Pilet.ee ekaart", + "system_integrator": "Pilet.ee ekaart" + }, + { + "application": "City transport, prepaid ticket, cardholder, servicespass", + "company": "Ridango AS", + "mad": "0x3D56", + "service_provider": "Pilet.ee ekaart", + "system_integrator": "Pilet.ee ekaart" + }, { "application": "City transport bus, ferry, administration", "company": "VFJ Technology Pty Ltd", diff --git a/client/src/cmdhfmfp.h b/client/src/cmdhfmfp.h index 7381f87a2..2a4d7cd2c 100644 --- a/client/src/cmdhfmfp.h +++ b/client/src/cmdhfmfp.h @@ -20,6 +20,10 @@ #include "common.h" + +#define AES_KEY_LEN 16 +#define MAX_AES_KEYS_LIST_LEN 1024 + int CmdHFMFP(const char *Cmd); int CmdHFMFPNDEFRead(const char *Cmd); From cdb906cd23ac66106eaca1f474207220f30c71e0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 21 Jun 2023 18:45:59 +0200 Subject: [PATCH 524/924] style --- client/luascripts/lf_ident_json.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/luascripts/lf_ident_json.lua b/client/luascripts/lf_ident_json.lua index 73794547c..11657910d 100644 --- a/client/luascripts/lf_ident_json.lua +++ b/client/luascripts/lf_ident_json.lua @@ -113,7 +113,7 @@ local function getDefault(block0) block0 = block0:upper() - local T55X7_DEFAULT_CONFIG_BLOCK = '000880E8' --// compat mode, RF/32, manchester, STT, 7 data blocks + local T55X7_DEFAULT_CONFIG_BLOCK = '000880E8' --// compat mode, RF/32, manchester, STT, 7 data blocks local T55X7_RAW_CONFIG_BLOCK = '000880E0' --// compat mode, RF/32, manchester, 7 data blocks local T55X7_EM_UNIQUE_CONFIG_BLOCK = '00148040' --// emulate em4x02/unique - compat mode, manchester, RF/64, 2 data blocks -- FDXB requires data inversion and BiPhase 57 is simply BipHase 50 inverted, so we can either do it using the modulation scheme or the inversion flag From d3792c0853272545282ba6cbde781849415711ee Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 21 Jun 2023 18:48:04 +0200 Subject: [PATCH 525/924] adapt mifare plus key files to be loaded/saved in json. WIP , will need a typedef struct in order to work properly --- client/src/fileutils.c | 44 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 3411215c6..aad9b9cce 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -29,6 +29,7 @@ #include "cmdhficlass.h" // pagemap #include "protocols.h" // iclass defines #include "cmdhftopaz.h" // TOPAZ defines +#include "cmdhfmfp.h" // MFP / AES defines #ifdef _WIN32 #include "scandir.h" @@ -543,13 +544,14 @@ int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, break; } case jsfMfPlusKeys: { - JsonSaveStr(root, "FileType", "mfp"); + JsonSaveStr(root, "FileType", "mfpkeys"); JsonSaveBufAsHexCompact(root, "$.Card.UID", &data[0], 7); JsonSaveBufAsHexCompact(root, "$.Card.SAK", &data[10], 1); JsonSaveBufAsHexCompact(root, "$.Card.ATQA", &data[11], 2); uint8_t atslen = data[13]; - if (atslen > 0) + if (atslen > 0) { JsonSaveBufAsHexCompact(root, "$.Card.ATS", &data[14], atslen); + } uint8_t vdata[2][64][17] = {{{0}}}; memcpy(vdata, data + (14 + atslen), 2 * 64 * 17); @@ -559,12 +561,12 @@ int saveFileJSONex(const char *preferredName, JSONFileType ftype, uint8_t *data, if (vdata[0][i][0]) { snprintf(path, sizeof(path), "$.SectorKeys.%zu.KeyA", i); - JsonSaveBufAsHexCompact(root, path, &vdata[0][i][1], 16); + JsonSaveBufAsHexCompact(root, path, &vdata[0][i][1], AES_KEY_LEN); } if (vdata[1][i][0]) { snprintf(path, sizeof(path), "$.SectorKeys.%zu.KeyB", i); - JsonSaveBufAsHexCompact(root, path, &vdata[1][i][1], 16); + JsonSaveBufAsHexCompact(root, path, &vdata[1][i][1], AES_KEY_LEN); } } break; @@ -1296,6 +1298,40 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz *datalen += sptr; } + + if (!strcmp(ctype, "mfpkeys")) { + + JsonLoadBufAsHex(root, "$.Card.UID", udata.bytes, 7, datalen); + JsonLoadBufAsHex(root, "$.Card.SAK", udata.bytes + 10, 1, datalen); + JsonLoadBufAsHex(root, "$.Card.ATQA", udata.bytes + 11, 2, datalen); + uint8_t atslen = udata.bytes[13]; + if (atslen > 0) { + JsonLoadBufAsHex(root, "$.Card.ATS", udata.bytes + 14, atslen, datalen); + } + + size_t sptr = (14 + atslen); + + // memcpy(vdata, udata.bytes + (14 + atslen), 2 * 64 * 17); + for (size_t i = 0; i < 64; i++) { + + if ((sptr + (AES_KEY_LEN * 2)) > maxdatalen) { + break; + } + + size_t offset = (14 + atslen) + (i * 2 * AES_KEY_LEN); + + char blocks[40] = {0}; + snprintf(blocks, sizeof(blocks), "$.SectorKeys.%zu.KeyA", i); + JsonLoadBufAsHex(root, blocks, udata.bytes + offset, AES_KEY_LEN, datalen); + + snprintf(blocks, sizeof(blocks), "$.SectorKeys.%zu.KeyB", i); + JsonLoadBufAsHex(root, blocks, udata.bytes + offset + AES_KEY_LEN, AES_KEY_LEN, datalen); + + sptr += (2 * AES_KEY_LEN); + } + *datalen += sptr; + } + out: if (callback != NULL) { From c7af7169426b656c556715cbab8b3cacfdbc3e29 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 21 Jun 2023 18:49:12 +0200 Subject: [PATCH 526/924] style --- client/src/uart/uart_posix.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index 86d76317b..c64d85db6 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -189,6 +189,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { free(sp); return INVALID_SERIAL_PORT; } + int sfd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); if (sfd == -1) { PrintAndLogEx(ERR, "Error opening Bluetooth socket"); @@ -196,6 +197,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { free(sp); return INVALID_SERIAL_PORT; } + if (connect(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { PrintAndLogEx(ERR, "Error: cannot connect device " _YELLOW_("%s") " over Bluetooth", addrstr); close(sfd); From 1bd389bdd0c408e732f4b6c6b3cc89c7e41a53fb Mon Sep 17 00:00:00 2001 From: kormax Date: Thu, 22 Jun 2023 18:06:23 +0300 Subject: [PATCH 527/924] Add annotation for AirDrop ECP frame --- client/src/cmdhflist.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index fe0ee46b0..b38d7fea4 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -189,7 +189,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i if (cmd[1] == 0x01 && cmdsize == 7) { snprintf(exp, size, "ECP1"); return PM3_SUCCESS; - } else if (cmd[1] == 0x02 && cmdsize == (cmd[2] & 0x0f) + 7) { + } else if (cmd[1] == 0x02 && cmdsize == (cmd[2] & 0x0F) + 7) { // Byte 3 is the reader type switch (cmd[3]) { case 0x01: @@ -201,6 +201,9 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i case 0x03: snprintf(exp, size, "ECP2 (Identity)"); break; + case 0x05: + snprintf(exp, size, "ECP2 (AirDrop)"); + break; default: snprintf(exp, size, "ECP2"); break; From 57b827613b91266376a1a463c294036355f9fb95 Mon Sep 17 00:00:00 2001 From: kormax Date: Thu, 22 Jun 2023 18:30:52 +0300 Subject: [PATCH 528/924] Update aidlist.json --- client/resources/aidlist.json | 106 +++++++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 13 deletions(-) diff --git a/client/resources/aidlist.json b/client/resources/aidlist.json index ff574dd6a..9173d0a10 100644 --- a/client/resources/aidlist.json +++ b/client/resources/aidlist.json @@ -2255,13 +2255,21 @@ "Description": "Student ID cards", "Type": "identity" }, + { + "AID": "D2760000254D010200", + "Vendor": "Zentraler Kreditausschuss (ZKA)", + "Country": "Germany", + "Name": "Girocard Jugendschutz", + "Description": "Age verification", + "Type": "identity" + }, { "AID": "A000000809434343444B467631", "Vendor": "Car Connectivity Consortium (CCC)", "Country": "", "Name": "Digital Car Key Framework", "Description": "Used during key provisioning and configuration", - "Type": "access" + "Type": "" }, { "AID": "A000000809434343444B417631", @@ -2295,13 +2303,69 @@ "Description": "AID prefix used by MIFARE 2GO-based cards", "Type": "" }, + { + "AID": "A00000039656434103F1216000000000", + "Vendor": "LV Monorail", + "Country": "United States", + "Name": "Las Vegas Monorail", + "Description": "", + "Type": "transport" + }, + { + "AID": "A00000039656434103F8852200000000", + "Vendor": "Ubian", + "Country": "Slovakia", + "Name": "Ubian digital transit card", + "Description": "DESFire-based virtual transit card", + "Type": "transport" + }, + { + "AID": "DE5C0D1F1CADA5", + "Vendor": "CRTM", + "Country": "Spain", + "Name": "Madrid transit card", + "Description": "DESFire-based transit card", + "Type": "transport" + }, + { + "AID": "A00000F21100", + "Vendor": "PTV", + "Country": "Australia", + "Name": "Myki transit card", + "Description": "DESFire-based transit card", + "Type": "transport" + }, + { + "AID": "637001ff4c41", + "Vendor": "Cubic", + "Country": "United States", + "Name": "LA Tap", + "Description": "DESFire-based transit card (ASCII cp\\x01\\xffLA)", + "Type": "transport" + }, + { + "AID": "637001ff574d415441", + "Vendor": "Cubic", + "Country": "United States", + "Name": "Smart Trip", + "Description": "DESFire-based transit card (ASCII cp\\x01\\xffWMATA)", + "Type": "transport" + }, + { + "AID": "637001ff434c4950504552", + "Vendor": "Cubic", + "Country": "United States", + "Name": "Clipper", + "Description": "DESFire-based transit card (ASCII cp\\x01\\xffCLIPPER)", + "Type": "transport" + }, { "AID": "A0000002164954534F2D31", "Vendor": "ITSO", "Country": "United Kingdom", "Name": "ITSO CMD2", "Description": "AID used by ITSO for smartcard/phone-based transit cards", - "Type": "transit" + "Type": "transport" }, { "AID": "A000000632010105", @@ -2309,22 +2373,38 @@ "Country": "China", "Name": "China T-Union", "Description": "Universal transit card used by many big public transit operators", - "Type": "transit" - }, - { - "AID": "D2760000254D010200", - "Vendor": "Zentraler Kreditausschuss (ZKA)", - "Country": "Germany", - "Name": "Girocard Jugendschutz", - "Description": "Age verification", - "Type": "" + "Type": "transport" }, { "AID": "A00000000491", "Vendor": "MasterCard International", "Country": "", "Name": "Mastercard Private Label Transit", - "Description": "AID prefix used by transit cards that use private label mastercards (E.g. Ventra and HOP)", - "Type": "transit" + "Description": "AID prefix used by transit cards that use private label mastercard", + "Type": "transport" + }, + { + "AID": "A0000000049100", + "Vendor": "MasterCard International", + "Country": "United States", + "Name": "HOP Fastpass", + "Description": "", + "Type": "transport" + }, + { + "AID": "A0000000049101", + "Vendor": "MasterCard International", + "Country": "United States", + "Name": "Ventra", + "Description": "", + "Type": "transport" + }, + { + "AID": "A000000858044F53452E4348", + "Vendor": "Apple", + "Country": "", + "Name": "AirDrop connection negotiation", + "Description": "Used by NFC-based AirDrop negotiation added in IOS17", + "Type": "" } ] From f138e54db6289ea936b3da112d740b23f0f61a06 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 22 Jun 2023 22:34:49 +0200 Subject: [PATCH 529/924] fix: missing includes when building with "gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9)" --- tools/mfd_aes_brute/mfd_aes_brute.c | 1 + tools/mfd_aes_brute/mfd_multi_brute.c | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/mfd_aes_brute/mfd_aes_brute.c b/tools/mfd_aes_brute/mfd_aes_brute.c index 19bb54ce5..53a984421 100644 --- a/tools/mfd_aes_brute/mfd_aes_brute.c +++ b/tools/mfd_aes_brute/mfd_aes_brute.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "util_posix.h" #define AEND "\x1b[0m" diff --git a/tools/mfd_aes_brute/mfd_multi_brute.c b/tools/mfd_aes_brute/mfd_multi_brute.c index 226fd9f7f..b097c77d7 100644 --- a/tools/mfd_aes_brute/mfd_multi_brute.c +++ b/tools/mfd_aes_brute/mfd_multi_brute.c @@ -35,6 +35,7 @@ #include #include #include +#include //#include #include "util_posix.h" #include "randoms.h" From 492a09f5ccd6300df003233a96cbfb34dcea1632 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 22 Jun 2023 22:51:16 +0200 Subject: [PATCH 530/924] correct LEGIC 16bit CRC calculation "hf legic crc", use init_table(CRC_LEGIC_16) to be consistent with l_crc16legic in client/src/scripting.c --- client/src/cmdhflegic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhflegic.c b/client/src/cmdhflegic.c index 02a43e0aa..b842ddf54 100644 --- a/client/src/cmdhflegic.c +++ b/client/src/cmdhflegic.c @@ -682,7 +682,7 @@ static int CmdLegicCalcCrc(const char *Cmd) { switch (type) { case 16: - init_table(CRC_LEGIC); + init_table(CRC_LEGIC_16); PrintAndLogEx(SUCCESS, "Legic crc16: %X", crc16_legic(data, data_len, mcc[0])); break; default: From 59a2b63d6be3138f6d60d06c0ac5fc074a2842bd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 06:56:05 +0200 Subject: [PATCH 531/924] thanks to user Hawkeye which tested on old conference badges on a NTAG216 --- client/dictionaries/t55xx_default_pwds.dic | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/dictionaries/t55xx_default_pwds.dic b/client/dictionaries/t55xx_default_pwds.dic index e56904ea4..9231b9314 100644 --- a/client/dictionaries/t55xx_default_pwds.dic +++ b/client/dictionaries/t55xx_default_pwds.dic @@ -52,6 +52,8 @@ C0F5009A # prefered pwds of members in the community FEEDBEEF DEADC0DE +# derived from BCARD key B +A9EF2AFC # Default pwd, simple: 00000000 11111111 From db4086718d43a6679afcdb052bed1dcce0cfdd17 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 13:37:37 +0200 Subject: [PATCH 532/924] kety length checks for hf mf rdbl, rdsc, wrbl, and some textual changes to hf mf mad --- client/src/cmdhfmf.c | 66 ++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 6aac4677c..066e1bdfd 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -785,7 +785,8 @@ static int CmdHF14AMfWrBl(const char *Cmd) { " \n" "`--force` param is used to override warnings like bad ACL and BLOCK 0 writes.\n" " if not specified, it will exit if detected", - "hf mf wrbl --blk 1 -k FFFFFFFFFFFF -d 000102030405060708090a0b0c0d0e0f" + "hf mf wrbl --blk 1 -d 000102030405060708090a0b0c0d0e0f\n" + "hf mf wrbl --blk 1 -k A0A1A2A3A4A5 -d 000102030405060708090a0b0c0d0e0f\n" ); void *argtable[] = { arg_param_begin, @@ -813,7 +814,7 @@ static int CmdHF14AMfWrBl(const char *Cmd) { bool force = arg_get_lit(ctx, 4); int keylen = 0; - uint8_t key[6] = {0}; + uint8_t key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; CLIGetHexWithReturn(ctx, 5, key, &keylen); uint8_t block[MFBLOCK_SIZE] = {0x00}; @@ -821,6 +822,11 @@ static int CmdHF14AMfWrBl(const char *Cmd) { CLIGetHexWithReturn(ctx, 6, block, &blen); CLIParserFree(ctx); + if (keylen && keylen != 6) { + PrintAndLogEx(WARNING, "Key must be 12 hex digits. Got %d", keylen); + return PM3_EINVARG; + } + if (blen != MFBLOCK_SIZE) { PrintAndLogEx(WARNING, "block data must include 16 HEX bytes. Got %i", blen); return PM3_EINVARG; @@ -879,7 +885,8 @@ static int CmdHF14AMfRdBl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf rdbl", "Read MIFARE Classic block", - "hf mf rdbl --blk 0 -k FFFFFFFFFFFF\n" + "hf mf rdbl --blk 0\n" + "hf mf rdbl --blk 0 -k A0A1A2A3A4A5\n" "hf mf rdbl --blk 3 -v -> get block 3, decode sector trailer\n" ); void *argtable[] = { @@ -904,11 +911,16 @@ static int CmdHF14AMfRdBl(const char *Cmd) { } int keylen = 0; - uint8_t key[6] = {0}; + uint8_t key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; CLIGetHexWithReturn(ctx, 4, key, &keylen); bool verbose = arg_get_lit(ctx, 5); CLIParserFree(ctx); + if (keylen && keylen != 6) { + PrintAndLogEx(WARNING, "Key must be 12 hex digits. Got %d", keylen); + return PM3_EINVARG; + } + if (b > 255) { return PM3_EINVARG; } @@ -934,7 +946,8 @@ static int CmdHF14AMfRdSc(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf rdsc", "Read MIFARE Classic sector", - "hf mf rdsc -s 0 -k FFFFFFFFFFFF\n" + "hf mf rdsc -s 0\n" + "hf mf rdsc -s 0 -k A0A1A2A3A4A5\n" ); void *argtable[] = { arg_param_begin, @@ -956,17 +969,23 @@ static int CmdHF14AMfRdSc(const char *Cmd) { } int keylen = 0; - uint8_t key[6] = {0}; + uint8_t key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; CLIGetHexWithReturn(ctx, 3, key, &keylen); int s = arg_get_int_def(ctx, 4, 0); bool verbose = arg_get_lit(ctx, 5); CLIParserFree(ctx); + if (keylen && keylen != 6) { + PrintAndLogEx(WARNING, "Key must be 12 hex digits. Got %d", keylen); + return PM3_EINVARG; + } + if (s > MIFARE_4K_MAXSECTOR) { PrintAndLogEx(WARNING, "Sector number must be less then 40"); return PM3_EINVARG; } + uint8_t sector = (uint8_t)s; uint16_t sc_size = mfNumBlocksPerSector(sector) * MFBLOCK_SIZE; @@ -1266,7 +1285,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { return PM3_ESOFT; } - PrintAndLogEx(INFO, "Using `" _YELLOW_("%s") "`", keyfilename); + PrintAndLogEx(INFO, "Using key file... `" _YELLOW_("%s") "`", keyfilename); // try reading card uid and create filename if (datafnlen == 0) { @@ -5679,7 +5698,6 @@ static int CmdHF14AMfMAD(const char *Cmd) { block_cnt = MIFARE_4K_MAXBLOCK; if (verbose) { - PrintAndLogEx(INFO, "File: " _YELLOW_("%s"), filename); PrintAndLogEx(INFO, "File size %zu bytes, file blocks %d (0x%x)", bytes_read, block_cnt, block_cnt); } @@ -5733,6 +5751,11 @@ static int CmdHF14AMfMAD(const char *Cmd) { PrintAndLogEx(INFO, ""); PrintAndLogEx(INFO, _CYAN_("VIGIK PACS detected")); } + + if (haveMAD2) { + MAD2DecodeAndPrint(dump + (MIFARE_1K_MAXBLOCK * MF_MAD2_SECTOR), swapmad, verbose); + } + free(dump); return PM3_SUCCESS; } @@ -5916,8 +5939,9 @@ int CmdHFMFNDEFRead(const char *Cmd) { uint8_t data[4096] = {0}; int datalen = 0; - if (verbose) + if (verbose) { PrintAndLogEx(INFO, "reading MAD v1 sector"); + } if (mfReadSector(MF_MAD1_SECTOR, MF_KEY_A, g_mifare_mad_key, sector0)) { PrintAndLogEx(ERR, "error, read sector 0. card doesn't have MAD or doesn't have MAD on default keys"); @@ -5925,24 +5949,24 @@ int CmdHFMFNDEFRead(const char *Cmd) { return PM3_ESOFT; } + if (verbose) { + PrintAndLogEx(INFO, "reading MAD v2 sector"); + } + + if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, g_mifare_mad_key, sector10)) { + if (verbose) { + PrintAndLogEx(ERR, "error, read sector 0x10. card doesn't have MAD 2 or doesn't have MAD 2 on default keys"); + PrintAndLogEx(INFO, "Skipping MAD 2"); + } + } + bool haveMAD2 = false; - int res = MADCheck(sector0, NULL, verbose, &haveMAD2); + int res = MADCheck(sector0, sector10, verbose, &haveMAD2); if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "MAD error %d", res); return res; } - if (haveMAD2) { - if (verbose) - PrintAndLogEx(INFO, "reading MAD v2 sector"); - - if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, g_mifare_mad_key, sector10)) { - PrintAndLogEx(ERR, "error, read sector 0x10. card doesn't have MAD or doesn't have MAD on default keys"); - PrintAndLogEx(HINT, "Try " _YELLOW_("`hf mf ndefread -k `") " with your custom key"); - return PM3_ESOFT; - } - } - uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, false); From 7fe02233d82cc8fb49d2ca144348924d2016b595 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 13:56:59 +0200 Subject: [PATCH 533/924] textual changes to MAD output --- client/src/mifare/mad.c | 47 +++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index c870dbb28..42a05c5a2 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -190,7 +190,7 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) uint8_t GPB = sector0[(3 * 16) + 9]; if (verbose) - PrintAndLogEx(SUCCESS, "%14s " _GREEN_("0x%02x"), "GPB", GPB); + PrintAndLogEx(SUCCESS, "GPB....... " _GREEN_("0x%02X"), GPB); // DA (MAD available) if (!(GPB & 0x80)) { @@ -200,21 +200,22 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) uint8_t mad_ver = GPB & 0x03; if (verbose) - PrintAndLogEx(SUCCESS, "%14s " _GREEN_("%d"), "MAD version", mad_ver); + PrintAndLogEx(SUCCESS, "Version... " _GREEN_("%d"), mad_ver); // MAD version if ((mad_ver != 0x01) && (mad_ver != 0x02)) { - PrintAndLogEx(ERR, "Wrong MAD version " _RED_("0x%02x"), mad_ver); + PrintAndLogEx(ERR, "Wrong MAD version " _RED_("0x%02X"), mad_ver); return PM3_ESOFT; }; - if (haveMAD2) + if (haveMAD2) { *haveMAD2 = (mad_ver == 2); + } int res = madCRCCheck(sector0, true, 1); - - if (verbose && res == PM3_SUCCESS) - PrintAndLogEx(SUCCESS, "%14s " _GREEN_("0x%02x") " ( %s )", "CRC8", sector0[16], _GREEN_("ok")); + if (verbose && res == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "CRC8...... 0x%02X ( %s )", sector0[16], _GREEN_("ok")); + } if (mad_ver == 2 && sector10) { int res2 = madCRCCheck(sector10, true, 2); @@ -222,7 +223,7 @@ int MADCheck(uint8_t *sector0, uint8_t *sector10, bool verbose, bool *haveMAD2) res = res2; if (verbose && !res2) - PrintAndLogEx(SUCCESS, "%14s " _GREEN_("0x%02x") " ( %s )", "CRC8", sector10[0], _GREEN_("ok")); + PrintAndLogEx(SUCCESS, "CRC8...... 0x%02X ( %s )", sector10[0], _GREEN_("ok")); } // MA (multi-application card) @@ -284,9 +285,10 @@ static int MADInfoByteDecode(const uint8_t *sector, bool swapmad, int mad_ver, b info = sector[16 + 1] & 0x3f; if (info >= 0xF) { PrintAndLogEx(WARNING, "Invalid Info byte (MAD1) value " _YELLOW_("0x%02x"), info); - if (verbose) + if (verbose) { // I understand the spec in a way that MAD1 InfoByte should not point into MAD2 sectors, @lukaskuzmiak PrintAndLogEx(WARNING, "MAD1 Info byte points outside of MAD1 sector space (0x%02x), report a bug?", info); + } return PM3_ESOFT; } } else { @@ -318,7 +320,7 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMA int ibs = MADInfoByteDecode(sector, swapmad, 1, verbose); if (ibs > 0) { - PrintAndLogEx(SUCCESS, "Card publisher sector " _MAGENTA_("0x%02x"), ibs); + PrintAndLogEx(SUCCESS, "Card publisher sector " _MAGENTA_("0x%02X"), ibs); } else { PrintAndLogEx(WARNING, "Card publisher " _RED_("not") " present " _YELLOW_("0x%02x"), ibs); } @@ -356,7 +358,7 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMA } int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { - open_mad_file(&mad_known_aids, verbose); + open_mad_file(&mad_known_aids, false); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "------------ " _CYAN_("MAD v2 details") " -------------"); @@ -364,14 +366,14 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { int res = madCRCCheck(sector, true, 2); if (verbose) { if (res == PM3_SUCCESS) - PrintAndLogEx(SUCCESS, "CRC8 ( %s )", _GREEN_("ok")); + PrintAndLogEx(SUCCESS, "CRC8...... 0x%02X ( " _GREEN_("%s") " )", sector[0], "ok"); else - PrintAndLogEx(WARNING, "CRC8 ( %s )", _RED_("fail")); + PrintAndLogEx(SUCCESS, "CRC8...... 0x%02X ( " _RED_("%s") " )", sector[0], "fail"); } int ibs = MADInfoByteDecode(sector, swapmad, 2, verbose); if (ibs > 0) { - PrintAndLogEx(SUCCESS, "Card publisher sector " _MAGENTA_("0x%02x"), ibs); + PrintAndLogEx(SUCCESS, "Card publisher sector " _MAGENTA_("0x%02X"), ibs); } else { PrintAndLogEx(WARNING, "Card publisher " _RED_("not") " present " _YELLOW_("0x%02x"), ibs); } @@ -385,12 +387,21 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { for (int i = 1; i < 8 + 8 + 7 + 1; i++) { uint16_t aid = madGetAID(sector, swapmad, 2, i); if (aid < 6) { - PrintAndLogEx(INFO, (ibs == i) ? _MAGENTA_(" %02d [%04X] (%s)") : " %02d [%04X] (%s)", i + 16, aid, aid_admin[aid]); + PrintAndLogEx(INFO, + (ibs == i) ? _MAGENTA_(" %02d [%04X] %s") : " %02d [" _GREEN_("%04X") "] %s", + i + 16, + aid, + aid_admin[aid] + ); } else if (prev_aid == aid) { - PrintAndLogEx(INFO, (ibs == i) ? _MAGENTA_(" %02d [%04X] (continuation)") : " %02d [%04X] (continuation)", i + 16, aid); + PrintAndLogEx(INFO, + (ibs == i) ? _MAGENTA_(" %02d [%04X] continuation") : " %02d [" _YELLOW_("%04X") "] continuation", + i + 16, + aid + ); } else { - char fmt[30]; - snprintf(fmt, sizeof(fmt), (ibs == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [%04X]%s", i + 16, aid, "%s"); + char fmt[60]; + snprintf(fmt, sizeof(fmt), (ibs == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [" _GREEN_("%04X") "]%s", i + 16, aid, "%s"); print_aid_description(mad_known_aids, aid, fmt, verbose); prev_aid = aid; } From 673f15c247eb1c7875790a712f19d847b734097d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 14:19:50 +0200 Subject: [PATCH 534/924] text --- client/dictionaries/t55xx_default_pwds.dic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/dictionaries/t55xx_default_pwds.dic b/client/dictionaries/t55xx_default_pwds.dic index 9231b9314..fc9c6bb8b 100644 --- a/client/dictionaries/t55xx_default_pwds.dic +++ b/client/dictionaries/t55xx_default_pwds.dic @@ -37,7 +37,7 @@ A5B4C3D2 E9920427 # paxton bullit? 575F4F4B -# +# Hotel system 50520901 # iCopy-X 20206666 From 419d0c1f5b793d1c8d66d516e6235c99c764445c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 16:25:43 +0200 Subject: [PATCH 535/924] adapt return codes for some mifare commands and their debug logging. this will reduce debug message on the client side --- armsrc/mifarecmd.c | 39 +++++++++++++++++--------------- armsrc/mifareutil.c | 45 +++++++++++++++++++------------------ client/src/mifare/mifare4.c | 16 ++++++------- 3 files changed, 52 insertions(+), 48 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 5dd5dfcf6..4d57ef0ce 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -484,8 +484,8 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { if (res == PM3_ETEAROFF) { retval = PM3_ETEAROFF; goto OUT; - } else if (res) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + } else if (res != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); retval = PM3_ESOFT; goto OUT; } @@ -554,7 +554,7 @@ void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t if (res == PM3_ETEAROFF) { retval = PM3_ETEAROFF; goto OUT; - } else if (res) { + } else if (res != PM3_SUCCESS) { retval = PM3_ESOFT; goto OUT; } @@ -688,8 +688,8 @@ void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) { break; }; - if (mifare_classic_value(pcs, cuid, blockNo, blockdata, action)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + if (mifare_classic_value(pcs, cuid, blockNo, blockdata, action) != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); break; }; @@ -777,8 +777,8 @@ static void MifareUWriteBlockEx(uint8_t arg0, uint8_t arg1, uint8_t *datain, boo } } - if (mifare_ultra_writeblock(blockNo, blockdata)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + if (mifare_ultra_writeblock(blockNo, blockdata) != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); OnError(0); return; }; @@ -851,8 +851,8 @@ void MifareUWriteBlockCompat(uint8_t arg0, uint8_t arg1, uint8_t *datain) { } } - if (mifare_ultra_writeblock_compat(blockNo, blockdata)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + if (mifare_ultra_writeblock_compat(blockNo, blockdata) != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); OnError(0); return; }; @@ -896,8 +896,8 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain) { blockdata[1] = pwd[6]; blockdata[2] = pwd[5]; blockdata[3] = pwd[4]; - if (mifare_ultra_writeblock(44, blockdata)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + if (mifare_ultra_writeblock(44, blockdata) != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); OnError(44); return; }; @@ -906,8 +906,8 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain) { blockdata[1] = pwd[2]; blockdata[2] = pwd[1]; blockdata[3] = pwd[0]; - if (mifare_ultra_writeblock(45, blockdata)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + if (mifare_ultra_writeblock(45, blockdata) != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); OnError(45); return; }; @@ -916,8 +916,8 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain) { blockdata[1] = pwd[14]; blockdata[2] = pwd[13]; blockdata[3] = pwd[12]; - if (mifare_ultra_writeblock(46, blockdata)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + if (mifare_ultra_writeblock(46, blockdata) != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); OnError(46); return; }; @@ -926,8 +926,8 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain) { blockdata[1] = pwd[10]; blockdata[2] = pwd[9]; blockdata[3] = pwd[8]; - if (mifare_ultra_writeblock(47, blockdata)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Write block error"); + if (mifare_ultra_writeblock(47, blockdata) != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); OnError(47); return; }; @@ -1522,7 +1522,6 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, target_ks[0] = nt2 ^ target_nt[0]; // second collection - if (mifare_classic_halt(pcs, cuid)) { continue; } @@ -2836,6 +2835,10 @@ OUT: crypto1_deinit(pcs); } +// FUDAN card w static encrypted nonces +// 2B F9 1C 1B D5 08 48 48 03 A4 B1 B1 75 FF 2D 90 +// ^^ ^^ + void OnSuccessMagic(void) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 472c2616f..7296f1abe 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -434,7 +434,7 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); - return 1; + return PM3_EFAILED; } uint8_t d_block[18], d_block_enc[18]; @@ -465,11 +465,11 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; if ((len != 1) || (res != 0x0A)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd send data2 Error: %02x", res); - return 2; + if (g_dbglevel >= DBG_INFO) Dbprintf("Cmd send data2 Error: %02x", res); + return PM3_EFAILED; } } - return 0; + return PM3_SUCCESS; } int mifare_classic_write_cfg_block_gdm(struct Crypto1State *pcs, uint32_t uid, uint8_t *blockData) { @@ -480,7 +480,7 @@ int mifare_classic_write_cfg_block_gdm(struct Crypto1State *pcs, uint32_t uid, u uint16_t len = mifare_sendcmd_short(pcs, 1, MIFARE_MAGIC_GDM_WRITE_CFG, 0, receivedAnswer, receivedAnswerPar, NULL); if ((len != 1) || (receivedAnswer[0] != 0x0A)) { - return 1; + return PM3_EFAILED; } uint8_t d_block[18], d_block_enc[18]; @@ -511,14 +511,12 @@ int mifare_classic_write_cfg_block_gdm(struct Crypto1State *pcs, uint32_t uid, u res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; if ((len != 1) || (res != 0x0A)) { - return 2; + return PM3_EFAILED; } } - return 0; + return PM3_SUCCESS; } - - int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t action) { // variables uint16_t len = 0; @@ -540,8 +538,8 @@ int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo len = mifare_sendcmd_short(pcs, 1, command, blockNo, receivedAnswer, receivedAnswerPar, NULL); if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK - if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); - return 1; + if (g_dbglevel >= DBG_INFO) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); + return PM3_EFAILED; } memcpy(d_block, blockData, 4); @@ -566,12 +564,12 @@ int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; if ((len != 1) || (res != 0x0A)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd send data2 Error: %02x", res); - return 2; + if (g_dbglevel >= DBG_INFO) Dbprintf("Cmd send data2 Error: %02x", res); + return PM3_EFAILED; } } - return 0; + return PM3_SUCCESS; } int mifare_ultra_writeblock_compat(uint8_t blockNo, uint8_t *blockData) { @@ -585,9 +583,10 @@ int mifare_ultra_writeblock_compat(uint8_t blockNo, uint8_t *blockData) { len = mifare_sendcmd_short(NULL, CRYPT_NONE, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); if (receivedAnswer[0] != 0x0A) { // 0x0a - ACK - if (g_dbglevel >= DBG_ERROR) + if (g_dbglevel >= DBG_INFO) { Dbprintf("Cmd Send Error: %02x %d", receivedAnswer[0], len); - return 1; + } + return PM3_EFAILED; } memcpy(d_block, blockData, 16); @@ -599,11 +598,12 @@ int mifare_ultra_writeblock_compat(uint8_t blockNo, uint8_t *blockData) { len = ReaderReceive(receivedAnswer, receivedAnswerPar); if (receivedAnswer[0] != 0x0A) { // 0x0a - ACK - if (g_dbglevel >= DBG_ERROR) + if (g_dbglevel >= DBG_INFO) { Dbprintf("Cmd Send Data Error: %02x %d", receivedAnswer[0], len); - return 2; + } + return PM3_EFAILED; } - return 0; + return PM3_SUCCESS; } int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData) { @@ -618,11 +618,12 @@ int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData) { len = mifare_sendcmd(MIFARE_ULC_WRITE, block, sizeof(block), receivedAnswer, receivedAnswerPar, NULL); if (receivedAnswer[0] != 0x0A) { // 0x0a - ACK - if (g_dbglevel >= DBG_ERROR) + if (g_dbglevel >= DBG_INFO) { Dbprintf("Cmd Send Error: %02x %d", receivedAnswer[0], len); - return 1; + } + return PM3_EFAILED; } - return 0; + return PM3_SUCCESS; } int mifare_classic_halt_ex(struct Crypto1State *pcs) { uint8_t receivedAnswer[4] = {0x00, 0x00, 0x00, 0x00}; diff --git a/client/src/mifare/mifare4.c b/client/src/mifare/mifare4.c index ec8d1a6bf..52a5a8465 100644 --- a/client/src/mifare/mifare4.c +++ b/client/src/mifare/mifare4.c @@ -24,9 +24,9 @@ #include "ui.h" #include "crypto/libpcrypto.h" -static bool VerboseMode = false; +static bool g_verbose_mode = false; void mfpSetVerboseMode(bool verbose) { - VerboseMode = verbose; + g_verbose_mode = verbose; } static const PlusErrorsElm_t PlusErrors[] = { @@ -340,12 +340,12 @@ int MifareAuth4(mf4Session_t *mf4session, uint8_t *keyn, uint8_t *key, bool acti } static int intExchangeRAW14aPlus(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen) { - if (VerboseMode) + if (g_verbose_mode) PrintAndLogEx(INFO, ">>> %s", sprint_hex(datain, datainlen)); int res = ExchangeRAW14a(datain, datainlen, activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen, false); - if (VerboseMode) + if (g_verbose_mode) PrintAndLogEx(INFO, "<<< %s", sprint_hex(dataout, *dataoutlen)); return res; @@ -367,7 +367,7 @@ int MFPCommitPerso(bool activateField, bool leaveSignalON, uint8_t *dataout, int int MFPReadBlock(mf4Session_t *mf4session, bool plain, uint8_t blockNum, uint8_t blockCount, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac) { uint8_t rcmd[4 + 8] = {(plain ? (0x37) : (0x33)), blockNum, 0x00, blockCount}; if (!plain && mf4session) - CalculateMAC(mf4session, mtypReadCmd, blockNum, blockCount, rcmd, 4, &rcmd[4], VerboseMode); + CalculateMAC(mf4session, mtypReadCmd, blockNum, blockCount, rcmd, 4, &rcmd[4], g_verbose_mode); int res = intExchangeRAW14aPlus(rcmd, plain ? 4 : sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen); if (res) @@ -377,7 +377,7 @@ int MFPReadBlock(mf4Session_t *mf4session, bool plain, uint8_t blockNum, uint8_t mf4session->R_Ctr++; if (mf4session && mac && *dataoutlen > 11) - CalculateMAC(mf4session, mtypReadResp, blockNum, blockCount, dataout, *dataoutlen - 8 - 2, mac, VerboseMode); + CalculateMAC(mf4session, mtypReadResp, blockNum, blockCount, dataout, *dataoutlen - 8 - 2, mac, g_verbose_mode); return 0; } @@ -386,7 +386,7 @@ int MFPWriteBlock(mf4Session_t *mf4session, uint8_t blockNum, uint8_t *data, boo uint8_t rcmd[1 + 2 + 16 + 8] = {0xA3, blockNum, 0x00}; memmove(&rcmd[3], data, 16); if (mf4session) - CalculateMAC(mf4session, mtypWriteCmd, blockNum, 1, rcmd, 19, &rcmd[19], VerboseMode); + CalculateMAC(mf4session, mtypWriteCmd, blockNum, 1, rcmd, 19, &rcmd[19], g_verbose_mode); int res = intExchangeRAW14aPlus(rcmd, sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen); if (res) @@ -396,7 +396,7 @@ int MFPWriteBlock(mf4Session_t *mf4session, uint8_t blockNum, uint8_t *data, boo mf4session->W_Ctr++; if (mf4session && mac && *dataoutlen > 3) - CalculateMAC(mf4session, mtypWriteResp, blockNum, 1, dataout, *dataoutlen, mac, VerboseMode); + CalculateMAC(mf4session, mtypWriteResp, blockNum, 1, dataout, *dataoutlen, mac, g_verbose_mode); return 0; } From ed34453461c59c3037980684da86f66e7058952f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 16:27:30 +0200 Subject: [PATCH 536/924] maur --- client/dictionaries/mfc_default_keys.dic | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 63598f78b..0d34541ff 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -145,6 +145,9 @@ F1D83F964314 222222222222 27DD91F1FCF1 # +# Hotel system +505209016A1F +# # Directory and eventlog KeyB 2BA9621E0A36 # From 88e2618131f8c754b08dea86da2ce594433b5adf Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 17:08:32 +0200 Subject: [PATCH 537/924] function to support figuring out if block 0-3 , 0-15 is sectortrailer. The previous function uses 0-255.. --- client/src/mifare/mifare4.c | 10 +++++++++- client/src/mifare/mifare4.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/client/src/mifare/mifare4.c b/client/src/mifare/mifare4.c index 52a5a8465..7a3ec9f77 100644 --- a/client/src/mifare/mifare4.c +++ b/client/src/mifare/mifare4.c @@ -534,7 +534,7 @@ uint8_t mfSectorTrailer(uint16_t blockNo) { if (blockNo < 32 * 4) { return (blockNo | 0x03); } else { - return (blockNo | 0x0f); + return (blockNo | 0x0F); } } @@ -551,3 +551,11 @@ uint8_t mfSectorNum(uint16_t blockNo) { return (32 + (blockNo - 32 * 4) / 16); } + +bool mfIsSectorTrailerBasedOnBlocks(uint8_t sectorno, uint16_t blockno) { + if (sectorno < 32) { + return ((blockno | 0x03) == blockno); + } else { + return ((blockno | 0x0F) == blockno); + } +} diff --git a/client/src/mifare/mifare4.h b/client/src/mifare/mifare4.h index 80d55db7b..fee12ef6e 100644 --- a/client/src/mifare/mifare4.h +++ b/client/src/mifare/mifare4.h @@ -79,6 +79,7 @@ uint8_t mfFirstBlockOfSector(uint8_t sectorNo); uint8_t mfSectorTrailerOfSector(uint8_t sectorNo); uint8_t mfSectorTrailer(uint16_t blockNo); bool mfIsSectorTrailer(uint16_t blockNo); +bool mfIsSectorTrailerBasedOnBlocks(uint8_t sectorno, uint16_t blockno); uint8_t mfSectorNum(uint16_t blockNo); From a508ed76464aef461dce708151dc280f957fa329 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 17:10:04 +0200 Subject: [PATCH 538/924] fix hf mf dump --- client/src/cmdhfmf.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 066e1bdfd..398705074 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -590,12 +590,13 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n current_key = MF_KEY_A; uint8_t data_area = (sectorNo < 32) ? blockNo : blockNo / 5; if (rights[sectorNo][data_area] == 0x07) { // no key would work - PrintAndLogEx(WARNING, "access rights do not allow reading of sector %2d block %3d, skipping", sectorNo, blockNo); + PrintAndLogEx(WARNING, "access rights do not allow reading of sector " _YELLOW_("%2d") " block " _YELLOW_("%3d") ", skipping", sectorNo, blockNo); continue; } for (uint8_t tries = 0; tries < MIFARE_SECTOR_RETRY; tries++) { - if (mfIsSectorTrailer(blockNo)) { + + if (mfIsSectorTrailerBasedOnBlocks(sectorNo, blockNo)) { // sector trailer. At least the Access Conditions can always be read with key A. payload.blockno = mfFirstBlockOfSector(sectorNo) + blockNo; @@ -649,16 +650,16 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n uint8_t *data = resp.data.asBytes; - if (mfIsSectorTrailer(blockNo)) { + if (mfIsSectorTrailerBasedOnBlocks(sectorNo, blockNo)) { // sector trailer. Fill in the keys. memcpy(data, keyA + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); memcpy(data + 10, keyB + (sectorNo * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); } memcpy(carddata + (MFBLOCK_SIZE * (mfFirstBlockOfSector(sectorNo) + blockNo)), data, MFBLOCK_SIZE); - PrintAndLogEx(SUCCESS, "successfully read block %2d of sector %2d.", blockNo, sectorNo); + PrintAndLogEx(INPLACE, "successfully read block " _YELLOW_("%2d") " of sector " _YELLOW_("%2d"), blockNo, sectorNo); } else { - PrintAndLogEx(FAILED, "could not read block %2d of sector %2d", blockNo, sectorNo); + PrintAndLogEx(FAILED, "\ncould not read block %2d of sector %2d", blockNo, sectorNo); } } else { PrintAndLogEx(WARNING, "command execute timeout when trying to read block %2d of sector %2d.", blockNo, sectorNo); @@ -1125,7 +1126,7 @@ static int CmdHF14AMfDump(const char *Cmd) { // read card iso14a_card_select_t card ; - uint8_t *mem = calloc(MIFARE_4K_MAXBLOCK * MFBLOCK_SIZE, sizeof(uint8_t)); + uint8_t *mem = calloc(MIFARE_4K_MAX_BYTES, sizeof(uint8_t)); if (mem == NULL) { PrintAndLogEx(ERR, "failed to allocate memory"); return PM3_EMALLOC; From 4b12d67632fbbedfebb986811a988d1939a054ca Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 17:12:29 +0200 Subject: [PATCH 539/924] text and fixes for MAD v2 --- client/src/cmdhfmf.c | 72 ++++++++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 398705074..031341c71 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3446,6 +3446,7 @@ static int CmdHF14AMfChk(const char *Cmd) { PrintAndLogEx(WARNING, "Provided block out of possible MIFARE Type memory map"); return PM3_EINVARG; } + if (sectors_cnt == 1) { sectors_cnt = min_sectors_cnt; } else if (sectors_cnt < min_sectors_cnt) { @@ -3453,6 +3454,7 @@ static int CmdHF14AMfChk(const char *Cmd) { return PM3_EINVARG; } } + if (sectors_cnt == 1) { sectors_cnt = MIFARE_1K_MAXSECTOR; } @@ -3520,6 +3522,7 @@ static int CmdHF14AMfChk(const char *Cmd) { } if (singleSector) break; + b < 127 ? (b += 4) : (b += 16); } } @@ -3974,6 +3977,7 @@ void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector , strA, resA , strB, resB ); + } PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); @@ -5614,28 +5618,27 @@ static int CmdHF14AMfAuth4(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf auth4", "Executes AES authentication command in ISO14443-4", - "hf mf auth4 4000 000102030405060708090a0b0c0d0e0f -> executes authentication\n" - "hf mf auth4 9003 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> executes authentication\n"); + "hf mf auth4 -n 4000 -k 000102030405060708090a0b0c0d0e0f -> executes authentication\n" + "hf mf auth4 -n 9003 -k FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> executes authentication\n"); void *argtable[] = { arg_param_begin, - arg_str1(NULL, NULL, "", NULL), - arg_str1(NULL, NULL, "", NULL), + arg_str1("n", NULL, "", "key num, 2 hex bytes"), + arg_str1("k", "key", "", "key, 16 hex bytes"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); - CLIGetHexWithReturn(ctx, 1, keyn, &keynlen); CLIGetHexWithReturn(ctx, 2, key, &keylen); CLIParserFree(ctx); if (keynlen != 2) { - PrintAndLogEx(ERR, " must be 2 bytes long instead of: %d", keynlen); + PrintAndLogEx(ERR, "Key number must be 2 bytes. Got... %d", keynlen); return PM3_ESOFT; } if (keylen != 16) { - PrintAndLogEx(ERR, " must be 16 bytes long instead of: %d", keylen); + PrintAndLogEx(ERR, "Key must be 16 bytes. Got... %d", keylen); return PM3_ESOFT; } @@ -5655,12 +5658,12 @@ static int CmdHF14AMfMAD(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_lit0("v", "verbose", "show technical data"), - arg_str0(NULL, "aid", "", "print all sectors with specified aid"), - arg_str0("k", "key", "", "key for printing sectors"), + arg_str0(NULL, "aid", "", "print all sectors with specified aid"), + arg_str0("k", "key", "", "key for printing sectors"), arg_lit0("b", "keyb", "use key B for access printing sectors (by default: key A)"), arg_lit0(NULL, "be", "(optional, BigEndian)"), arg_lit0(NULL, "dch", "decode Card Holder information"), - arg_str0("f", "file", "", "load dump file and decode MAD"), + arg_str0("f", "file", "", "load dump file and decode MAD"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -5685,17 +5688,17 @@ static int CmdHF14AMfMAD(const char *Cmd) { // read dump file uint8_t *dump = NULL; size_t bytes_read = 0; - int res = pm3_load_dump(filename, (void **)&dump, &bytes_read, (MFBLOCK_SIZE * MIFARE_4K_MAXBLOCK)); + int res = pm3_load_dump(filename, (void **)&dump, &bytes_read, MIFARE_4K_MAX_BYTES); if (res != PM3_SUCCESS) { return res; } uint16_t block_cnt = MIN(MIFARE_1K_MAXBLOCK, (bytes_read / MFBLOCK_SIZE)); - if (bytes_read == 320) + if (bytes_read == MIFARE_MINI_MAX_BYTES) block_cnt = MIFARE_MINI_MAXBLOCK; - else if (bytes_read == 2048) + else if (bytes_read == MIFARE_2K_MAX_BYTES) block_cnt = MIFARE_2K_MAXBLOCK; - else if (bytes_read == 4096) + else if (bytes_read == MIFARE_4K_MAX_BYTES) block_cnt = MIFARE_4K_MAXBLOCK; if (verbose) { @@ -5765,8 +5768,8 @@ static int CmdHF14AMfMAD(const char *Cmd) { return PM3_ENOTTY; - uint8_t sector0[16 * 4] = {0}; - uint8_t sector10[16 * 4] = {0}; + uint8_t sector0[MFBLOCK_SIZE * 4] = {0}; + uint8_t sector10[MFBLOCK_SIZE * 4] = {0}; bool got_first = true; if (mfReadSector(MF_MAD1_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector0) != PM3_SUCCESS) { @@ -5820,7 +5823,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { // user specified key if (keylen == 6) { - memcpy(akey, userkey, 6); + memcpy(akey, userkey, sizeof(akey)); } uint16_t aaid = 0x0004; @@ -5833,7 +5836,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { for (int i = 0; i < madlen; i++) { if (aaid == mad[i]) { - uint8_t vsector[16 * 4] = {0}; + uint8_t vsector[MFBLOCK_SIZE * 4] = {0}; if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector)) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(ERR, "error, read sector %d", i + 1); @@ -5841,7 +5844,7 @@ static int CmdHF14AMfMAD(const char *Cmd) { } for (int j = 0; j < (verbose ? 4 : 3); j ++) - PrintAndLogEx(NORMAL, " [%03d] %s", (i + 1) * 4 + j, sprint_hex(&vsector[j * 16], 16)); + PrintAndLogEx(NORMAL, " [%03d] %s", (i + 1) * 4 + j, sprint_hex(&vsector[j * MFBLOCK_SIZE], MFBLOCK_SIZE)); } } } @@ -5851,21 +5854,22 @@ static int CmdHF14AMfMAD(const char *Cmd) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "-------- " _CYAN_("Card Holder Info 0x%04x") " --------", aaid); - uint8_t data[4096] = {0}; + uint8_t data[MIFARE_4K_MAX_BYTES] = {0}; int datalen = 0; for (int i = 0; i < madlen; i++) { if (aaid == mad[i]) { - uint8_t vsector[16 * 4] = {0}; + uint8_t vsector[MFBLOCK_SIZE * 4] = {0}; if (mfReadSector(i + 1, keyB ? MF_KEY_B : MF_KEY_A, akey, vsector)) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(ERR, "error, read sector %d", i + 1); return PM3_ESOFT; } - memcpy(&data[datalen], vsector, 16 * 3); - datalen += 16 * 3; + // skip ST block hence only 3 blocks copy + memcpy(&data[datalen], vsector, MFBLOCK_SIZE * 3); + datalen += MFBLOCK_SIZE * 3; } } @@ -5879,9 +5883,16 @@ static int CmdHF14AMfMAD(const char *Cmd) { if (verbose) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "------------ " _CYAN_("MAD sector raw") " -------------"); - for (int i = 0; i < 4; i ++) - PrintAndLogEx(INFO, "[%d] %s", i, sprint_hex(§or0[i * 16], 16)); + PrintAndLogEx(INFO, "------------ " _CYAN_("MAD v1 sector raw") " -------------"); + for (int i = 0; i < 4; i ++) { + PrintAndLogEx(INFO, "[%d] %s", i, sprint_hex(§or0[i * MFBLOCK_SIZE], MFBLOCK_SIZE)); + } + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "------------ " _CYAN_("MAD v2 sector raw") " -------------"); + for (int i = 0; i < 4; i ++) { + PrintAndLogEx(INFO, "[%d] %s", i, sprint_hex(§or10[i * MFBLOCK_SIZE], MFBLOCK_SIZE)); + } } return PM3_SUCCESS; @@ -5912,12 +5923,15 @@ int CmdHFMFNDEFRead(const char *Cmd) { bool verbose = arg_get_lit(ctx, 1); bool verbose2 = arg_get_lit(ctx, 1) > 1; uint8_t aid[2] = {0}; + int aidlen; CLIGetHexWithReturn(ctx, 2, aid, &aidlen); uint8_t key[6] = {0}; + int keylen; CLIGetHexWithReturn(ctx, 3, key, &keylen); bool keyB = arg_get_lit(ctx, 4); + int fnlen = 0; char filename[FILE_PATH_SIZE] = {0}; CLIParamStrToBuf(arg_get_str(ctx, 5), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); @@ -5970,7 +5984,7 @@ int CmdHFMFNDEFRead(const char *Cmd) { uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; - res = MADDecode(sector0, (haveMAD2 ? sector10 : NULL), mad, &madlen, false); + res = MADDecode(sector0, sector10, mad, &madlen, false); if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "can't decode MAD"); return res; @@ -6386,7 +6400,7 @@ int CmdHFMFNDEFWrite(const char *Cmd) { return PM3_ESOFT; } - // decode MAD + // decode MAD v1 uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; res = MADDecode(sector0, NULL, mad, &madlen, false); @@ -7130,7 +7144,7 @@ static int CmdHF14AMfView(const char *Cmd) { PrintAndLogEx(INFO, ""); PrintAndLogEx(INFO, _CYAN_("VIGIK PACS detected")); - // decode MAD + // decode MAD v1 uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; size_t madlen = 0; res = MADDecode(dump, NULL, mad, &madlen, false); From 8700b1e75451fe650b3807e2590895f1a3b91202 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 17:14:58 +0200 Subject: [PATCH 540/924] fix hf mf mad loading mad v2 sector --- client/src/cmdhfmf.c | 61 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 031341c71..9bc763624 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -3407,8 +3407,9 @@ static int CmdHF14AMfChk(const char *Cmd) { CLIParamStrToBuf(arg_get_str(ctx, 12), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); CLIParserFree(ctx); - bool singleSector = blockNo > -1; - if (! singleSector) { + + bool singleSector = (blockNo > -1); + if (singleSector == false) { // start from first trailer block blockNo = 3; } @@ -3431,9 +3432,11 @@ static int CmdHF14AMfChk(const char *Cmd) { } if (singleSector) { - size_t min_sectors_cnt = 0; + // find a MIFARE type that can accommodate the provided block number + size_t min_sectors_cnt = 0; uint8_t s = mfSectorNum(blockNo); + if (s < MIFARE_MINI_MAXSECTOR) { min_sectors_cnt = MIFARE_MINI_MAXSECTOR; } else if (s < MIFARE_1K_MAXSECTOR) { @@ -3578,9 +3581,9 @@ out: PrintAndLogEx(SUCCESS, _GREEN_("found keys:")); //print keys - if (singleSector) - printKeyTableEx(1, e_sector, mfSectorNum(blockNo)); - else +// if (singleSector) +// printKeyTableEx(1, e_sector, mfSectorNum(blockNo)); +// else printKeyTable(sectors_cnt, e_sector); if (transferToEml) { @@ -5760,6 +5763,25 @@ static int CmdHF14AMfMAD(const char *Cmd) { MAD2DecodeAndPrint(dump + (MIFARE_1K_MAXBLOCK * MF_MAD2_SECTOR), swapmad, verbose); } + if (aidlen == 2 || decodeholder) { + uint16_t mad[7 + 8 + 8 + 8 + 8] = {0}; + size_t madlen = 0; + if (MADDecode(dump, dump + (0x10 * MIFARE_1K_MAXBLOCK), mad, &madlen, swapmad)) { + PrintAndLogEx(ERR, "can't decode MAD"); + free(dump); + return PM3_ESOFT; + } + + uint16_t aaid = 0x0004; + if (aidlen == 2) { + aaid = (aid[0] << 8) + aid[1]; + } + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "-------- " _CYAN_("Card Holder Info 0x%04x") " --------", aaid); + + MADCardHolderInfoDecode(dump, bytes_read, verbose); + } free(dump); return PM3_SUCCESS; } @@ -5795,17 +5817,34 @@ static int CmdHF14AMfMAD(const char *Cmd) { return PM3_ESOFT; } + got_first = true; + if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector10) != PM3_SUCCESS) { + if (verbose) { + PrintAndLogEx(ERR, "error, read sector 0x10. card doesn't have MAD 2 or doesn't have MAD 2 on default keys"); + } + got_first = false; + } else { + PrintAndLogEx(INFO, "Authentication ( " _GREEN_("ok") " )"); + } + + // User supplied key + if (got_first == false && keylen == 6) { + PrintAndLogEx(INFO, "Trying user specified key..."); + if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, userkey, sector10) != PM3_SUCCESS) { + if (verbose) { + PrintAndLogEx(ERR, "error, read sector 10. card doesn't have MAD 2 or the custom key is wrong"); + } + } else { + PrintAndLogEx(INFO, "Authentication ( " _GREEN_("ok") " )"); + } + } + MADPrintHeader(); bool haveMAD2 = false; MAD1DecodeAndPrint(sector0, swapmad, verbose, &haveMAD2); if (haveMAD2) { - if (mfReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifare_mad_key, sector10)) { - PrintAndLogEx(ERR, "error, read sector 0x10. card doesn't have MAD or doesn't have MAD on default keys"); - return PM3_ESOFT; - } - MAD2DecodeAndPrint(sector10, swapmad, verbose); } From 25f84bcb8e6171e0c71e72ec813890b0f7868c88 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 17:21:47 +0200 Subject: [PATCH 541/924] fix 14b detection in hf search --- client/src/cmdhf14b.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index d0083fbb5..77378fda2 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -2229,33 +2229,34 @@ int infoHF14B(bool verbose, bool do_aid_search) { // get and print general info about all known 14b chips int readHF14B(bool loop, bool verbose) { + bool found = false; do { // try std 14b (atqb) - if (HF14B_std_reader(verbose)) - if (loop) - continue; + found = HF14B_std_reader(verbose); + if (found && loop) + continue; // try ST Microelectronics 14b - if (HF14B_st_reader(verbose)) - if (loop) - continue; + found = HF14B_st_reader(verbose); + if (found && loop) + continue; // try ASK CT 14b - if (HF14B_ask_ct_reader(verbose)) - if (loop) - continue; + found = HF14B_ask_ct_reader(verbose); + if (found && loop) + continue; // try unknown 14b read commands (to be identified later) // could be read of calypso, CEPAS, moneo, or pico pass. - if (HF14B_other_reader(verbose)) - if (loop) - continue; - + found = HF14B_other_reader(verbose); + if (found && loop) + continue; } while (loop && kbd_enter_pressed() == false); - if (verbose) { + + if (verbose && found == false) { PrintAndLogEx(FAILED, "no ISO 14443-B tag found"); } - return PM3_EOPABORTED; + return (found) ? PM3_SUCCESS : PM3_EOPABORTED; } From d1b62a5fc21e755723b71d5b8f047b8c38f73a28 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 17:44:15 +0200 Subject: [PATCH 542/924] fix wrong sector trailer detection --- client/src/cmdhfmf.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 9bc763624..130654caf 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -280,8 +280,8 @@ static void mf_print_blocks(uint16_t n, uint8_t *d, bool verbose) { PrintAndLogEx(NORMAL, ""); } +// assumes n is in number of blocks 0..255 static int mf_print_keys(uint16_t n, uint8_t *d) { - uint8_t sectors = 0; switch (n) { case MIFARE_MINI_MAXBLOCK: @@ -321,6 +321,7 @@ static int mf_print_keys(uint16_t n, uint8_t *d) { } // MFC dump , extract and save the keys to key file +// assumes n is in number of blocks 0..255 static int mf_save_keys_from_arr(uint16_t n, uint8_t *d) { uint8_t sectors = 0; switch (n) { @@ -412,6 +413,7 @@ static bool mf_write_block(const uint8_t *key, uint8_t keytype, uint8_t blockno, return (resp.oldarg[0] & 0xff); } +// assumes n is in number of blocks 0..255 static void mf_analyse_acl(uint16_t n, uint8_t *d) { for (uint16_t b = 3; b < n; b++) { @@ -6252,7 +6254,7 @@ skipfile: memcpy(block, firstblocks[b], MFBLOCK_SIZE); break; default: { - if (mfIsSectorTrailer(j)) { + if (mfIsSectorTrailerBasedOnBlocks(i,j)) { // ST NDEF memcpy(block, firstblocks[7], MFBLOCK_SIZE); } @@ -7078,7 +7080,7 @@ static int CmdHF14AMfWipe(const char *Cmd) { uint8_t data[26]; memset(data, 0, sizeof(data)); - if (mfIsSectorTrailer(b)) { + if (mfIsSectorTrailerBasedOnBlocks(s, b)) { memcpy(data + 10, st, sizeof(st)); } else { memcpy(data + 10, zeros, sizeof(zeros)); From 85d4e99ae9f552fb6632c7e693a0ced30bb3953e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 17:51:39 +0200 Subject: [PATCH 543/924] mfp changes... --- client/src/cmdhfmfp.c | 278 ++++++++++++++++++++++++++++-------------- client/src/cmdhfmfp.h | 20 +++ 2 files changed, 204 insertions(+), 94 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 9434d88ed..2368e0f74 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -34,19 +34,12 @@ #include "protocols.h" #include "crypto/libpcrypto.h" #include "cmdhfmf.h" // printblock, header +#include "cmdtrace.h" -static const uint8_t DefaultKey[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -static uint16_t CardAddresses[] = {0x9000, 0x9001, 0x9002, 0x9003, 0x9004, 0xA000, 0xA001, 0xA080, 0xA081, 0xC000, 0xC001}; +static const uint8_t mfp_default_key[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; +static uint16_t mfp_card_adresses[] = {0x9000, 0x9001, 0x9002, 0x9003, 0x9004, 0xA000, 0xA001, 0xA080, 0xA081, 0xC000, 0xC001}; -typedef enum { - MFP_UNKNOWN = 0, - DESFIRE_MF3ICD40, - DESFIRE_EV1, - DESFIRE_EV2, - DESFIRE_EV3, - DESFIRE_LIGHT, - PLUS_EV1, -} nxp_cardtype_t; +#define MFP_KEY_FILE_SIZE 14 + (2 * 64 * (AES_KEY_LEN + 1)) static int CmdHelp(const char *Cmd); @@ -233,9 +226,10 @@ static int get_plus_signature(uint8_t *signature, int *signature_len) { *signature_len = 0; retval = PM3_ESOFT; } - mfpSetVerboseMode(false); + return retval; } + // GET VERSION static int plus_print_version(uint8_t *version) { PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), sprint_hex(version + 14, 7)); @@ -261,12 +255,12 @@ static int plus_print_version(uint8_t *version) { PrintAndLogEx(INFO, " Protocol: %s", getProtocolStr(version[13], false)); return PM3_SUCCESS; } + static int get_plus_version(uint8_t *version, int *version_len) { int resplen = 0, retval = PM3_SUCCESS; mfpSetVerboseMode(false); MFPGetVersion(true, false, version, *version_len, &resplen); - mfpSetVerboseMode(false); *version_len = resplen; if (resplen != 28) { @@ -484,16 +478,16 @@ static int CmdHFMFPWritePerso(const char *Cmd) { mfpSetVerboseMode(verbose); if (!keyLen) { - memmove(key, DefaultKey, 16); + memmove(key, mfp_default_key, 16); keyLen = 16; } if (keyNumLen != 2) { - PrintAndLogEx(ERR, "Key number length must be 2 bytes instead of: %d", keyNumLen); + PrintAndLogEx(ERR, "Key number length must be 2 bytes. Got %d", keyNumLen); return PM3_EINVARG; } if (keyLen != 16) { - PrintAndLogEx(ERR, "Key length must be 16 bytes instead of: %d", keyLen); + PrintAndLogEx(ERR, "Key length must be 16 bytes. Got %d", keyLen); return PM3_EINVARG; } @@ -507,7 +501,7 @@ static int CmdHFMFPWritePerso(const char *Cmd) { } if (datalen != 3) { - PrintAndLogEx(ERR, "Command must return 3 bytes instead of: %d", datalen); + PrintAndLogEx(ERR, "Command must return 3 bytes. Got %d", datalen); return PM3_ESOFT; } @@ -539,17 +533,18 @@ static int CmdHFMFPInitPerso(const char *Cmd) { bool verbose2 = arg_get_lit(ctx, 1) > 1; uint8_t key[256] = {0}; - int keyLen = 0; - CLIGetHexWithReturn(ctx, 2, key, &keyLen); + int keylen = 0; + CLIGetHexWithReturn(ctx, 2, key, &keylen); CLIParserFree(ctx); - if (keyLen && keyLen != 16) { - PrintAndLogEx(ERR, "Key length must be 16 bytes instead of: %d", keyLen); + if (keylen && keylen != 16) { + PrintAndLogEx(FAILED, "Key length must be 16 bytes. Got %d", keylen); return PM3_EINVARG; } - if (!keyLen) - memmove(key, DefaultKey, 16); + if (keylen == 0) { + memmove(key, mfp_default_key, sizeof(mfp_default_key)); + } uint8_t keyNum[2] = {0}; uint8_t data[250] = {0}; @@ -572,15 +567,15 @@ static int CmdHFMFPInitPerso(const char *Cmd) { } mfpSetVerboseMode(verbose); - for (int i = 0; i < ARRAYLEN(CardAddresses); i++) { - keyNum[0] = CardAddresses[i] >> 8; - keyNum[1] = CardAddresses[i] & 0xff; + for (int i = 0; i < ARRAYLEN(mfp_card_adresses); i++) { + keyNum[0] = mfp_card_adresses[i] >> 8; + keyNum[1] = mfp_card_adresses[i] & 0xff; res = MFPWritePerso(keyNum, key, false, true, data, sizeof(data), &datalen); if (!res && (datalen == 3) && data[0] == 0x09) { - PrintAndLogEx(WARNING, "Skipped[%04x]...", CardAddresses[i]); + PrintAndLogEx(WARNING, "Skipped[%04x]...", mfp_card_adresses[i]); } else { if (res || (datalen != 3) || data[0] != 0x90) { - PrintAndLogEx(ERR, "Write error on address %04x", CardAddresses[i]); + PrintAndLogEx(ERR, "Write error on address %04x", mfp_card_adresses[i]); break; } } @@ -597,7 +592,9 @@ static int CmdHFMFPInitPerso(const char *Cmd) { static int CmdHFMFPCommitPerso(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp commitp", - "Executes Commit Perso command. Can be used in SL0 mode only.\nOBS! This command will not be executed if CardConfigKey, CardMasterKey and L3SwitchKey AES keys are not written.", + "Executes Commit Perso command. Can be used in SL0 mode only.\n" + "OBS! This command will not be executed if \n" + "CardConfigKey, CardMasterKey and L3SwitchKey AES keys are not written.", "hf mfp commitp\n" // "hf mfp commitp --sl 1" ); @@ -625,7 +622,7 @@ static int CmdHFMFPCommitPerso(const char *Cmd) { } if (datalen != 3) { - PrintAndLogEx(ERR, "Command must return 3 bytes instead of: %d", datalen); + PrintAndLogEx(ERR, "Command must return 3 bytes. Got %d", datalen); return PM3_EINVARG; } @@ -633,7 +630,7 @@ static int CmdHFMFPCommitPerso(const char *Cmd) { PrintAndLogEx(ERR, "Command error: %02x %s", data[0], mfpGetErrorDescription(data[0])); return PM3_EINVARG; } - PrintAndLogEx(INFO, "Switch level ( " _GREEN_("ok") " )"); + PrintAndLogEx(INFO, "Switched security level ( " _GREEN_("ok") " )"); return PM3_SUCCESS; } @@ -645,7 +642,7 @@ static int CmdHFMFPAuth(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp auth", - "Executes AES authentication command for Mifare Plus card", + "Executes AES authentication command for MIFARE Plus card", "hf mfp auth --ki 4000 --key 000102030405060708090a0b0c0d0e0f -> executes authentication\n" "hf mfp auth --ki 9003 --key FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -v -> executes authentication and shows all the system data"); @@ -664,12 +661,12 @@ static int CmdHFMFPAuth(const char *Cmd) { CLIParserFree(ctx); if (keynlen != 2) { - PrintAndLogEx(ERR, "ERROR: must be 2 bytes long instead of: %d", keynlen); + PrintAndLogEx(ERR, "ERROR: must be 2 bytes. Got %d", keynlen); return PM3_EINVARG; } if (keylen != 16) { - PrintAndLogEx(ERR, "ERROR: must be 16 bytes long instead of: %d", keylen); + PrintAndLogEx(ERR, "ERROR: must be 16 bytes. Got %d", keylen); return PM3_EINVARG; } @@ -679,7 +676,7 @@ static int CmdHFMFPAuth(const char *Cmd) { static int CmdHFMFPRdbl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp rdbl", - "Reads several blocks from Mifare Plus card", + "Reads blocks from MIFARE Plus card", "hf mfp rdbl --blk 0 --key 000102030405060708090a0b0c0d0e0f -> executes authentication and read block 0 data\n" "hf mfp rdbl --blk 1 -v -> executes authentication and shows sector 1 data with default key 0xFF..0xFF"); @@ -710,23 +707,23 @@ static int CmdHFMFPRdbl(const char *Cmd) { mfpSetVerboseMode(verbose); if (!keylen) { - memmove(key, DefaultKey, 16); + memmove(key, mfp_default_key, 16); keylen = 16; } if (blockn > 255) { - PrintAndLogEx(ERR, " must be in range [0..255] got: %d", blockn); + PrintAndLogEx(ERR, " must be in range [0..255]. got %d", blockn); return PM3_EINVARG; } if (keylen != 16) { - PrintAndLogEx(ERR, " must be 16 bytes long. got: %d", keylen); + PrintAndLogEx(ERR, " must be 16 bytes. Got %d", keylen); return PM3_EINVARG; } // 3 blocks - wo iso14443-4 chaining if (blocksCount > 3) { - PrintAndLogEx(ERR, "blocks count must be less than 3. got: %d", blocksCount); + PrintAndLogEx(ERR, "blocks count must be less than 3. Got %d", blocksCount); return PM3_EINVARG; } @@ -763,7 +760,7 @@ static int CmdHFMFPRdbl(const char *Cmd) { } if (datalen != 1 + blocksCount * 16 + 8 + 2) { - PrintAndLogEx(ERR, "Error return length:%d", datalen); + PrintAndLogEx(ERR, "Error return length: %d", datalen); return PM3_ESOFT; } @@ -820,17 +817,17 @@ static int CmdHFMFPRdsc(const char *Cmd) { mfpSetVerboseMode(verbose); if (!keylen) { - memmove(key, DefaultKey, 16); + memmove(key, mfp_default_key, 16); keylen = 16; } if (sectorNum > 39) { - PrintAndLogEx(ERR, " must be in range [0..39] got: %d", sectorNum); + PrintAndLogEx(ERR, " must be in range [0..39]. Got %d", sectorNum); return PM3_EINVARG; } if (keylen != 16) { - PrintAndLogEx(ERR, " must be 16 bytes long. got: %d", keylen); + PrintAndLogEx(ERR, " must be 16 bytes. Got %d", keylen); return PM3_EINVARG; } @@ -894,7 +891,7 @@ static int CmdHFMFPRdsc(const char *Cmd) { static int CmdHFMFPWrbl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp wrbl", - "Writes one block to Mifare Plus card", + "Writes one block to MIFARE Plus card", "hf mfp wrbl --blk 1 -d ff0000000000000000000000000000ff --key 000102030405060708090a0b0c0d0e0f -> write block 1 data\n" "hf mfp wrbl --blk 2 -d ff0000000000000000000000000000ff -v -> write block 2 data with default key 0xFF..0xFF" ); @@ -928,22 +925,22 @@ static int CmdHFMFPWrbl(const char *Cmd) { mfpSetVerboseMode(verbose); if (!keylen) { - memmove(key, DefaultKey, 16); + memmove(key, mfp_default_key, 16); keylen = 16; } if (blockNum > 255) { - PrintAndLogEx(ERR, " must be in range [0..255] got: %d", blockNum); + PrintAndLogEx(ERR, " must be in range [0..255]. Got %d", blockNum); return PM3_EINVARG; } if (keylen != 16) { - PrintAndLogEx(ERR, " must be 16 bytes long. got: %d", keylen); + PrintAndLogEx(ERR, " must be 16 bytes. Got %d", keylen); return PM3_EINVARG; } if (datainlen != 16) { - PrintAndLogEx(ERR, " must be 16 bytes long. got: %d", datainlen); + PrintAndLogEx(ERR, " must be 16 bytes. Got %d", datainlen); return PM3_EINVARG; } @@ -997,11 +994,8 @@ static int CmdHFMFPWrbl(const char *Cmd) { return PM3_SUCCESS; } -#define AES_KEY_LEN 16 -#define MAX_KEYS_LIST_LEN 1024 - static int plus_key_check(uint8_t startSector, uint8_t endSector, uint8_t startKeyAB, uint8_t endKeyAB, - uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], size_t keyListLen, uint8_t foundKeys[2][64][AES_KEY_LEN + 1], + uint8_t keyList[MAX_AES_KEYS_LIST_LEN][AES_KEY_LEN], size_t keyListLen, uint8_t foundKeys[2][64][AES_KEY_LEN + 1], bool verbose) { int res; bool selectCard = true; @@ -1088,7 +1082,7 @@ static int plus_key_check(uint8_t startSector, uint8_t endSector, uint8_t startK return PM3_SUCCESS; } -static void Fill2bPattern(uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], uint32_t *keyListLen, uint32_t *startPattern) { +static void Fill2bPattern(uint8_t keyList[MAX_AES_KEYS_LIST_LEN][AES_KEY_LEN], uint32_t *keyListLen, uint32_t *startPattern) { for (uint32_t pt = *startPattern; pt < 0x10000; pt++) { keyList[*keyListLen][0] = (pt >> 8) & 0xff; keyList[*keyListLen][1] = pt & 0xff; @@ -1097,7 +1091,7 @@ static void Fill2bPattern(uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN], uint3 memcpy(&keyList[*keyListLen][8], &keyList[*keyListLen][0], 8); (*keyListLen)++; *startPattern = pt; - if (*keyListLen == MAX_KEYS_LIST_LEN) + if (*keyListLen == MAX_AES_KEYS_LIST_LEN) break; } (*startPattern)++; @@ -1111,7 +1105,7 @@ static int CmdHFMFPChk(const char *Cmd) { "hf mfp chk -k 000102030405060708090a0b0c0d0e0f -> check key on sector 0 as key A and B\n" "hf mfp chk -s 2 -a -> check default key list on sector 2, only key A\n" "hf mfp chk -d mfp_default_keys -s0 -e6 -> check keys from dictionary against sectors 0-6\n" - "hf mfp chk --pattern1b -j keys -> check all 1-byte keys pattern and save found keys to json\n" + "hf mfp chk --pattern1b --dump -> check all 1-byte keys pattern and save found keys to file\n" "hf mfp chk --pattern2b --startp2b FA00 -> check all 2-byte keys pattern. Start from key FA00FA00...FA00"); void *argtable[] = { @@ -1125,7 +1119,7 @@ static int CmdHFMFPChk(const char *Cmd) { arg_lit0(NULL, "pattern1b", "Check all 1-byte combinations of key (0000...0000, 0101...0101, 0202...0202, ...)"), arg_lit0(NULL, "pattern2b", "Check all 2-byte combinations of key (0000...0000, 0001...0001, 0002...0002, ...)"), arg_str0(NULL, "startp2b", "", "Start key (2-byte HEX) for 2-byte search (use with `--pattern2b`)"), - arg_str0("j", "json", "", "Json filename to save keys"), + arg_lit0(NULL, "dump", "Dump found keys to JSON file"), arg_lit0("v", "verbose", "Verbose mode"), arg_param_end }; @@ -1136,7 +1130,7 @@ static int CmdHFMFPChk(const char *Cmd) { uint8_t startSector = arg_get_int_def(ctx, 3, 0); uint8_t endSector = arg_get_int_def(ctx, 4, 0); - uint8_t keyList[MAX_KEYS_LIST_LEN][AES_KEY_LEN] = {{0}}; + uint8_t keyList[MAX_AES_KEYS_LIST_LEN][AES_KEY_LEN] = {{0}}; uint32_t keyListLen = 0; uint8_t foundKeys[2][64][AES_KEY_LEN + 1] = {{{0}}}; @@ -1148,7 +1142,7 @@ static int CmdHFMFPChk(const char *Cmd) { memcpy(&keyList[keyListLen], vkey, 16); keyListLen++; } else { - PrintAndLogEx(ERR, "Specified key must have 16 bytes length."); + PrintAndLogEx(ERR, "Specified key must have 16 bytes. Got %d", vkeylen); CLIParserFree(ctx); return PM3_EINVARG; } @@ -1185,7 +1179,7 @@ static int CmdHFMFPChk(const char *Cmd) { if (vpatternlen <= 2) { startPattern = (vpattern[0] << 8) + vpattern[1]; } else { - PrintAndLogEx(ERR, "Pattern must be 2-byte length."); + PrintAndLogEx(ERR, "Pattern must be 2-bytes. Got %d", vpatternlen); CLIParserFree(ctx); return PM3_EINVARG; } @@ -1193,17 +1187,8 @@ static int CmdHFMFPChk(const char *Cmd) { PrintAndLogEx(WARNING, "Pattern entered, but search mode not is 2-byte search."); } - uint8_t jsonname[250] = {0}; - int jsonnamelen = 0; - if (CLIParamStrToBuf(arg_get_str(ctx, 10), jsonname, sizeof(jsonname), &jsonnamelen)) { - PrintAndLogEx(ERR, "Invalid json name."); - CLIParserFree(ctx); - return PM3_EINVARG; - } - jsonname[jsonnamelen] = 0; - + bool create_dumpfile = arg_get_lit(ctx, 10); bool verbose = arg_get_lit(ctx, 11); - CLIParserFree(ctx); uint8_t startKeyAB = 0; @@ -1227,8 +1212,9 @@ static int CmdHFMFPChk(const char *Cmd) { } // 2-byte pattern search mode - if (pattern2b) + if (pattern2b) { Fill2bPattern(keyList, &keyListLen, &startPattern); + } int res = PM3_SUCCESS; @@ -1291,19 +1277,30 @@ static int CmdHFMFPChk(const char *Cmd) { keyListLen = keycnt; } + PrintAndLogEx(INFO, "ICE pos... %zu - %zu", old_pos, endFilePosition); continue; } break; } - if (verbose == false) + + if (verbose == false) { PrintAndLogEx(NORMAL, ""); + } // print result char strA[46 + 1] = {0}; char strB[46 + 1] = {0}; + uint8_t ndef_key[] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7}; + bool has_ndef_key = false; bool printedHeader = false; for (uint8_t s = startSector; s <= endSector; s++) { + + if ((memcmp(&foundKeys[0][s][1], ndef_key, AES_KEY_LEN) == 0) || + (memcmp(&foundKeys[1][s][1], ndef_key, AES_KEY_LEN) == 0)) { + has_ndef_key = true; + } + if (printedHeader == false) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "-----+----------------------------------+----------------------------------"); @@ -1333,7 +1330,13 @@ static int CmdHFMFPChk(const char *Cmd) { PrintAndLogEx(INFO, "-----+----------------------------------+----------------------------------\n"); // save keys to json - if ((jsonnamelen > 0) && printedHeader) { + if (create_dumpfile && printedHeader) { + + size_t keys_len = (2 * 64 * (AES_KEY_LEN + 1)); + + uint8_t data[10 + 1 + 2 + 1 + 256 + keys_len]; + memset(data, 0, sizeof(data)); + // Mifare Plus info SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); @@ -1344,8 +1347,6 @@ static int CmdHFMFPChk(const char *Cmd) { memcpy(&card, (iso14a_card_select_t *)resp.data.asBytes, sizeof(iso14a_card_select_t)); uint64_t select_status = resp.oldarg[0]; // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision - - uint8_t data[10 + 1 + 2 + 1 + 256 + 2 * 64 * (AES_KEY_LEN + 1)] = {0}; uint8_t atslen = 0; if (select_status == 1 || select_status == 2) { memcpy(data, card.uid, card.uidlen); @@ -1357,9 +1358,16 @@ static int CmdHFMFPChk(const char *Cmd) { memcpy(&data[14], card.ats, atslen); } + char *fptr = calloc(sizeof(char) * (strlen("hf-mfp-") + strlen("-key")) + card.uidlen * 2 + 1, sizeof(uint8_t)); + strcpy(fptr, "hf-mfp-"); + + FillFileNameByUID(fptr, card.uid, "-key", card.uidlen); + // length: UID(10b)+SAK(1b)+ATQA(2b)+ATSlen(1b)+ATS(atslen)+foundKeys[2][64][AES_KEY_LEN + 1] - memcpy(&data[14 + atslen], foundKeys, 2 * 64 * (AES_KEY_LEN + 1)); - saveFileJSON((char *)jsonname, jsfMfPlusKeys, data, 64, NULL); + memcpy(&data[14 + atslen], foundKeys, keys_len); + // 64 here is for how many "rows" there is in the data array. A bit confusing + saveFileJSON(fptr, jsfMfPlusKeys, data, 64, NULL); + free(fptr); } return PM3_SUCCESS; @@ -1369,7 +1377,7 @@ static int CmdHFMFPMAD(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mfp mad", - "Checks and prints Mifare Application Directory (MAD)", + "Checks and prints MIFARE Application Directory (MAD)", "hf mfp mad\n" "hf mfp mad --aid e103 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> read and print NDEF data from MAD aid"); @@ -1411,9 +1419,7 @@ static int CmdHFMFPMAD(const char *Cmd) { return PM3_ESOFT; } - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, "--- " _CYAN_("Mifare App Directory Information") " ----------------"); - PrintAndLogEx(INFO, "-----------------------------------------------------"); + MADPrintHeader(); if (verbose) { PrintAndLogEx(SUCCESS, "Raw:"); @@ -1427,7 +1433,7 @@ static int CmdHFMFPMAD(const char *Cmd) { if (haveMAD2) { if (mfpReadSector(MF_MAD2_SECTOR, MF_KEY_A, (uint8_t *)g_mifarep_mad_key, sector10, verbose)) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(ERR, "error, read sector 0x10. card doesn't have MAD or doesn't have MAD on default keys"); + PrintAndLogEx(ERR, "error, read sector " _YELLOW_("0x10") ". Card doesn't have MAD or doesn't have MAD on default keys"); return PM3_ESOFT; } @@ -1505,6 +1511,36 @@ static int CmdHFMFPMAD(const char *Cmd) { return PM3_SUCCESS; } +static int CmdHFMFPNDEFFormat(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp ndefformat", + "format MIFARE Plus Tag as a NFC tag with Data Exchange Format (NDEF)\n" + "If no given, UID will be used as filename. \n" + "It will try default keys and MAD keys to detect if tag is already formatted in order to write.\n" + "\n" + "If not, it will try finding a key file based on your UID. ie, if you ran autopwn before", + "hf mfp ndefformat\n" + "hf mfp ndefformat --keys hf-mf-01020304-key.bin --> with keys from specified file\n" + ); + + void *argtable[] = { + arg_param_begin, + arg_str0("k", "keys", "", "filename of keys"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + int keyfnlen = 0; + char keyFilename[FILE_PATH_SIZE] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)keyFilename, FILE_PATH_SIZE, &keyfnlen); + + CLIParserFree(ctx); + + PrintAndLogEx(SUCCESS, "Not implemented yet. Feel free to contribute!"); + PrintAndLogEx(NORMAL, ""); + return PM3_SUCCESS; +} + int CmdHFMFPNDEFRead(const char *Cmd) { CLIParserContext *ctx; @@ -1641,20 +1677,74 @@ int CmdHFMFPNDEFRead(const char *Cmd) { return PM3_SUCCESS; } +static int CmdHFMFPNDEFWrite(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp ndefwrite", + "Write raw NDEF hex bytes to tag. This commands assumes tag already been NFC/NDEF formatted.\n", + "hf mfp ndefwrite -d 0300FE -> write empty record to tag\n" + "hf mfp ndefwrite -f myfilename\n" + "hf mfp ndefwrite -d 033fd1023a53709101195405656e2d55534963656d616e2054776974746572206c696e6b5101195502747769747465722e636f6d2f686572726d616e6e31303031\n" + ); + + void *argtable[] = { + arg_param_begin, + arg_str0("d", NULL, "", "raw NDEF hex bytes"), + arg_str0("f", "file", "", "write raw NDEF file to tag"), + arg_lit0("p", NULL, "fix NDEF record headers / terminator block if missing"), + arg_lit0("v", "verbose", "verbose output"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + uint8_t raw[4096] = {0}; + int rawlen; + CLIGetHexWithReturn(ctx, 1, raw, &rawlen); + + int fnlen = 0; + char filename[FILE_PATH_SIZE] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); + + bool fix_msg = arg_get_lit(ctx, 3); + bool verbose = arg_get_lit(ctx, 4); + CLIParserFree(ctx); + + if (fix_msg) { + PrintAndLogEx(NORMAL, "called with fix NDEF message param"); + } + + if (verbose) { + PrintAndLogEx(NORMAL, ""); + } + PrintAndLogEx(SUCCESS, "Not implemented yet. Feel free to contribute!"); + PrintAndLogEx(NORMAL, ""); + return PM3_SUCCESS; +} + +static int CmdHFMFPList(const char *Cmd) { + return CmdTraceListAlias(Cmd, "hf mf", "mf"); +} + static command_t CommandTable[] = { - {"help", CmdHelp, AlwaysAvailable, "This help"}, - {"info", CmdHFMFPInfo, IfPm3Iso14443a, "Info about Mifare Plus tag"}, - {"wrp", CmdHFMFPWritePerso, IfPm3Iso14443a, "Write Perso command"}, - {"initp", CmdHFMFPInitPerso, IfPm3Iso14443a, "Fill all the card's keys in SL0 mode"}, - {"commitp", CmdHFMFPCommitPerso, IfPm3Iso14443a, "Move card to SL1 or SL3 mode"}, - {"auth", CmdHFMFPAuth, IfPm3Iso14443a, "Authentication"}, - {"rdbl", CmdHFMFPRdbl, IfPm3Iso14443a, "Read blocks"}, - {"rdsc", CmdHFMFPRdsc, IfPm3Iso14443a, "Read sectors"}, - {"wrbl", CmdHFMFPWrbl, IfPm3Iso14443a, "Write blocks"}, - {"chk", CmdHFMFPChk, IfPm3Iso14443a, "Check keys"}, - {"mad", CmdHFMFPMAD, IfPm3Iso14443a, "Check and print MAD"}, - {"ndefread", CmdHFMFPNDEFRead, IfPm3Iso14443a, "Read and print NDEF records from card"}, - {NULL, NULL, 0, NULL} + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"list", CmdHFMFPList, AlwaysAvailable, "List MIFARE Plus history"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "------------------- " _CYAN_("operations") " ---------------------"}, + {"auth", CmdHFMFPAuth, IfPm3Iso14443a, "Authentication"}, + {"chk", CmdHFMFPChk, IfPm3Iso14443a, "Check keys"}, + {"dump", CmdHFMFPDump, IfPm3Iso14443a, "Dump MIFARE Classic tag to binary file"}, + {"info", CmdHFMFPInfo, IfPm3Iso14443a, "Info about MIFARE Plus tag"}, + {"mad", CmdHFMFPMAD, IfPm3Iso14443a, "Check and print MAD"}, + {"rdbl", CmdHFMFPRdbl, IfPm3Iso14443a, "Read blocks from card"}, + {"rdsc", CmdHFMFPRdsc, IfPm3Iso14443a, "Read sectors from card"}, + {"wrbl", CmdHFMFPWrbl, IfPm3Iso14443a, "Write block to card"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "---------------- " _CYAN_("personalization") " -------------------"}, + {"commitp", CmdHFMFPCommitPerso, IfPm3Iso14443a, "Move card to SL1 or SL3 mode"}, + {"initp", CmdHFMFPInitPerso, IfPm3Iso14443a, "Fill all the card's keys in SL0 mode"}, + {"wrp", CmdHFMFPWritePerso, IfPm3Iso14443a, "Write Perso command"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "---------------------- " _CYAN_("ndef") " ------------------------"}, + {"ndefformat", CmdHFMFPNDEFFormat, IfPm3Iso14443a, "Format MIFARE Plus Tag as NFC Tag"}, + {"ndefread", CmdHFMFPNDEFRead, IfPm3Iso14443a, "Read and print NDEF records from card"}, + {"ndefwrite", CmdHFMFPNDEFWrite, IfPm3Iso14443a, "Write NDEF records to card"}, + {NULL, NULL, 0, NULL} }; static int CmdHelp(const char *Cmd) { diff --git a/client/src/cmdhfmfp.h b/client/src/cmdhfmfp.h index 2a4d7cd2c..29723b204 100644 --- a/client/src/cmdhfmfp.h +++ b/client/src/cmdhfmfp.h @@ -24,6 +24,26 @@ #define AES_KEY_LEN 16 #define MAX_AES_KEYS_LIST_LEN 1024 +typedef enum { + MFP_UNKNOWN = 0, + DESFIRE_MF3ICD40, + DESFIRE_EV1, + DESFIRE_EV2, + DESFIRE_EV3, + DESFIRE_LIGHT, + PLUS_EV1, +} nxp_cardtype_t; + +typedef struct mfp_key_item { + uint8_t a[16]; + uint8_t b[16]; +} mfp_key_item_t; + +typedef struct mfp_keys { + uint8_t success; + mfp_key_item_t *keys; +} mfp_keys_t; + int CmdHFMFP(const char *Cmd); int CmdHFMFPNDEFRead(const char *Cmd); From bf8ac54c38c43aadd695c62a3ac1b43689c75751 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 17:58:22 +0200 Subject: [PATCH 544/924] fix loop logic. thanks @jump --- client/src/cmdhf14b.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index 77378fda2..29a985b29 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -2231,30 +2231,31 @@ int infoHF14B(bool verbose, bool do_aid_search) { int readHF14B(bool loop, bool verbose) { bool found = false; do { + found = false; + // try std 14b (atqb) - found = HF14B_std_reader(verbose); + found |= HF14B_std_reader(verbose); if (found && loop) continue; // try ST Microelectronics 14b - found = HF14B_st_reader(verbose); + found |= HF14B_st_reader(verbose); if (found && loop) continue; // try ASK CT 14b - found = HF14B_ask_ct_reader(verbose); + found |= HF14B_ask_ct_reader(verbose); if (found && loop) continue; // try unknown 14b read commands (to be identified later) // could be read of calypso, CEPAS, moneo, or pico pass. - found = HF14B_other_reader(verbose); + found |= HF14B_other_reader(verbose); if (found && loop) continue; } while (loop && kbd_enter_pressed() == false); - if (verbose && found == false) { PrintAndLogEx(FAILED, "no ISO 14443-B tag found"); } From b8d3b281ad8fefe4e00302def714f4392a2c53b3 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 18:07:56 +0200 Subject: [PATCH 545/924] adapt non commit functions yet --- client/src/cmdhfmfp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 2368e0f74..61f39e9c2 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1277,7 +1277,6 @@ static int CmdHFMFPChk(const char *Cmd) { keyListLen = keycnt; } - PrintAndLogEx(INFO, "ICE pos... %zu - %zu", old_pos, endFilePosition); continue; } break; @@ -1730,14 +1729,14 @@ static command_t CommandTable[] = { {"-----------", CmdHelp, IfPm3Iso14443a, "------------------- " _CYAN_("operations") " ---------------------"}, {"auth", CmdHFMFPAuth, IfPm3Iso14443a, "Authentication"}, {"chk", CmdHFMFPChk, IfPm3Iso14443a, "Check keys"}, - {"dump", CmdHFMFPDump, IfPm3Iso14443a, "Dump MIFARE Classic tag to binary file"}, +// {"dump", CmdHFMFPDump, IfPm3Iso14443a, "Dump MIFARE Plus tag to binary file"}, {"info", CmdHFMFPInfo, IfPm3Iso14443a, "Info about MIFARE Plus tag"}, {"mad", CmdHFMFPMAD, IfPm3Iso14443a, "Check and print MAD"}, {"rdbl", CmdHFMFPRdbl, IfPm3Iso14443a, "Read blocks from card"}, {"rdsc", CmdHFMFPRdsc, IfPm3Iso14443a, "Read sectors from card"}, {"wrbl", CmdHFMFPWrbl, IfPm3Iso14443a, "Write block to card"}, {"-----------", CmdHelp, IfPm3Iso14443a, "---------------- " _CYAN_("personalization") " -------------------"}, - {"commitp", CmdHFMFPCommitPerso, IfPm3Iso14443a, "Move card to SL1 or SL3 mode"}, + {"commitp", CmdHFMFPCommitPerso, IfPm3Iso14443a, "Configure security layer (SL1/SL3 mode)"}, {"initp", CmdHFMFPInitPerso, IfPm3Iso14443a, "Fill all the card's keys in SL0 mode"}, {"wrp", CmdHFMFPWritePerso, IfPm3Iso14443a, "Write Perso command"}, {"-----------", CmdHelp, IfPm3Iso14443a, "---------------------- " _CYAN_("ndef") " ------------------------"}, From 3fbd53ac2f3d500344ec210881357c7889669cf5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 18:27:33 +0200 Subject: [PATCH 546/924] hf mf wipe - text --- client/src/cmdhfmf.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 130654caf..98ac30b98 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -7015,33 +7015,33 @@ static int CmdHF14AMfWipe(const char *Cmd) { return PM3_ESOFT; } - uint8_t keyA[MIFARE_4K_MAXSECTOR * 6]; - uint8_t keyB[MIFARE_4K_MAXSECTOR * 6]; + uint8_t keyA[MIFARE_4K_MAXSECTOR * MIFARE_KEY_SIZE]; + uint8_t keyB[MIFARE_4K_MAXSECTOR * MIFARE_KEY_SIZE]; uint8_t num_sectors = 0; uint8_t mf[MFBLOCK_SIZE]; switch (keyslen) { - case (MIFARE_MINI_MAXSECTOR * 2 * 6): { + case (MIFARE_MINI_MAXSECTOR * 2 * MIFARE_KEY_SIZE): { PrintAndLogEx(INFO, "Loaded keys matching MIFARE Classic Mini 320b"); - memcpy(keyA, keys, (MIFARE_MINI_MAXSECTOR * 6)); - memcpy(keyB, keys + (MIFARE_MINI_MAXSECTOR * 6), (MIFARE_MINI_MAXSECTOR * 6)); + memcpy(keyA, keys, (MIFARE_MINI_MAXSECTOR * MIFARE_KEY_SIZE)); + memcpy(keyB, keys + (MIFARE_MINI_MAXSECTOR * MIFARE_KEY_SIZE), (MIFARE_MINI_MAXSECTOR * MIFARE_KEY_SIZE)); num_sectors = NumOfSectors('0'); memcpy(mf, "\x11\x22\x33\x44\x44\x09\x04\x00\x62\x63\x64\x65\x66\x67\x68\x69", MFBLOCK_SIZE); break; } - case (MIFARE_1K_MAXSECTOR * 2 * 6): { + case (MIFARE_1K_MAXSECTOR * 2 * MIFARE_KEY_SIZE): { PrintAndLogEx(INFO, "Loaded keys matching MIFARE Classic 1K"); - memcpy(keyA, keys, (MIFARE_1K_MAXSECTOR * 6)); - memcpy(keyB, keys + (MIFARE_1K_MAXSECTOR * 6), (MIFARE_1K_MAXSECTOR * 6)); + memcpy(keyA, keys, (MIFARE_1K_MAXSECTOR * MIFARE_KEY_SIZE)); + memcpy(keyB, keys + (MIFARE_1K_MAXSECTOR * MIFARE_KEY_SIZE), (MIFARE_1K_MAXSECTOR * MIFARE_KEY_SIZE)); num_sectors = NumOfSectors('1'); memcpy(mf, "\x11\x22\x33\x44\x44\x08\x04\x00\x62\x63\x64\x65\x66\x67\x68\x69", MFBLOCK_SIZE); break; } - case (MIFARE_4K_MAXSECTOR * 2 * 6): { + case (MIFARE_4K_MAXSECTOR * 2 * MIFARE_KEY_SIZE): { PrintAndLogEx(INFO, "Loaded keys matching MIFARE Classic 4K"); - memcpy(keyA, keys, (MIFARE_4K_MAXSECTOR * 6)); - memcpy(keyB, keys + (MIFARE_4K_MAXSECTOR * 6), (MIFARE_4K_MAXSECTOR * 6)); + memcpy(keyA, keys, (MIFARE_4K_MAXSECTOR * MIFARE_KEY_SIZE)); + memcpy(keyB, keys + (MIFARE_4K_MAXSECTOR * MIFARE_KEY_SIZE), (MIFARE_4K_MAXSECTOR * MIFARE_KEY_SIZE)); num_sectors = NumOfSectors('4'); memcpy(mf, "\x11\x22\x33\x44\x44\x18\x02\x00\x62\x63\x64\x65\x66\x67\x68\x69", MFBLOCK_SIZE); break; @@ -7063,6 +7063,8 @@ static int CmdHF14AMfWipe(const char *Cmd) { memset(zeros, 0x00, sizeof(zeros)); uint8_t st[MFBLOCK_SIZE] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + PrintAndLogEx(INFO, " blk | "); + PrintAndLogEx(INFO, "-----+------------------------------------------------------------"); // time to wipe card for (uint8_t s = 0; s < num_sectors; s++) { @@ -7095,11 +7097,11 @@ static int CmdHF14AMfWipe(const char *Cmd) { for (int8_t kt = MF_KEY_B; kt > -1; kt--) { if (kt == MF_KEY_A) - memcpy(data, keyA + (s * 6), 6); + memcpy(data, keyA + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); else - memcpy(data, keyB + (s * 6), 6); + memcpy(data, keyB + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); - PrintAndLogEx(INFO, "block %3d: %s" NOLF, mfFirstBlockOfSector(s) + b, sprint_hex(data + 10, MFBLOCK_SIZE)); + PrintAndLogEx(INFO, " %3d | %s" NOLF, mfFirstBlockOfSector(s) + b, sprint_hex(data + 10, MFBLOCK_SIZE)); clearCommandBuffer(); SendCommandMIX(CMD_HF_MIFARE_WRITEBL, mfFirstBlockOfSector(s) + b, kt, 0, data, sizeof(data)); PacketResponseNG resp; @@ -7118,6 +7120,7 @@ static int CmdHF14AMfWipe(const char *Cmd) { } } + PrintAndLogEx(INFO, "-----+------------------------------------------------------------"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "Done!"); out: From a4e22416b94620ad943d55f533b95d28eb2975fd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 18:28:44 +0200 Subject: [PATCH 547/924] less debug output when an auth fails --- armsrc/mifarecmd.c | 4 ++-- armsrc/mifareutil.c | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 4d57ef0ce..7a5abf2c8 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -3221,7 +3221,7 @@ void Mifare_DES_Auth1(uint8_t arg0, uint8_t *datain) { return; }; - if (mifare_desfire_des_auth1(cuid, dataout)) { + if (mifare_desfire_des_auth1(cuid, dataout) != PM3_SUCCESS) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Authentication part1: Fail."); OnError(4); return; @@ -3241,7 +3241,7 @@ void Mifare_DES_Auth2(uint32_t arg0, uint8_t *datain) { isOK = mifare_desfire_des_auth2(cuid, key, dataout); - if (isOK) { + if (isOK != PM3_SUCCESS) { if (g_dbglevel >= DBG_EXTENDED) Dbprintf("Authentication part2: Failed"); OnError(4); return; diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 7296f1abe..487c71706 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -433,7 +433,7 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t } if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK - if (g_dbglevel >= DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); + if (g_dbglevel >= DBG_INFO) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); return PM3_EFAILED; } @@ -805,9 +805,10 @@ int mifare_desfire_des_auth1(uint32_t uid, uint8_t *blockData) { len = mifare_sendcmd_special(NULL, 1, 0x02, data, receivedAnswer, receivedAnswerPar, NULL); if (len == 1) { - if (g_dbglevel >= DBG_ERROR) + if (g_dbglevel >= DBG_INFO) { Dbprintf("Cmd Error: %02x", receivedAnswer[0]); - return 1; + } + return PM3_EFAILED; } if (len == 12) { @@ -818,9 +819,9 @@ int mifare_desfire_des_auth1(uint32_t uid, uint8_t *blockData) { receivedAnswer[10], receivedAnswer[11]); } memcpy(blockData, receivedAnswer, 12); - return 0; + return PM3_SUCCESS; } - return 1; + return PM3_EFAILED; } int mifare_desfire_des_auth2(uint32_t uid, uint8_t *key, uint8_t *blockData) { @@ -835,9 +836,10 @@ int mifare_desfire_des_auth2(uint32_t uid, uint8_t *key, uint8_t *blockData) { len = mifare_sendcmd_special2(NULL, 1, 0x03, data, receivedAnswer, receivedAnswerPar, NULL); if ((receivedAnswer[0] == 0x03) && (receivedAnswer[1] == 0xae)) { - if (g_dbglevel >= DBG_ERROR) + if (g_dbglevel >= DBG_ERROR) { Dbprintf("Auth Error: %02x %02x", receivedAnswer[0], receivedAnswer[1]); - return 1; + } + return PM3_EFAILED; } if (len == 12) { @@ -848,7 +850,7 @@ int mifare_desfire_des_auth2(uint32_t uid, uint8_t *key, uint8_t *blockData) { receivedAnswer[10], receivedAnswer[11]); } memcpy(blockData, receivedAnswer, 12); - return 0; + return PM3_SUCCESS; } - return 1; + return PM3_EFAILED; } From 2d70ff5085d7ccf11019fc97da5f68915b724bca Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 18:33:16 +0200 Subject: [PATCH 548/924] fix compilation by adding the WIP func --- client/src/cmdhfmfp.c | 93 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 61f39e9c2..089e041d3 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -1369,9 +1369,100 @@ static int CmdHFMFPChk(const char *Cmd) { free(fptr); } + // MAD detection + if ((memcmp(&foundKeys[0][0][1], "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7", AES_KEY_LEN) == 0)) { + PrintAndLogEx(HINT, "MAD key detected. Try " _YELLOW_("`hf mfp mad`") " for more details"); + } + + // NDEF detection + if (has_ndef_key) { + PrintAndLogEx(HINT, "NDEF key detected. Try " _YELLOW_("`hf mfp ndefread -h`") " for more details"); + } + PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } +static int CmdHFMFPDump(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf mfp dump", + "Dump MIFARE Plus tag to binary file\n" + "If no given, UID will be used as filename", + "hf mfp dump\n" + "hf mfp dump --keys hf-mf-066C8B78-key.bin --> MIFARE Plus with keys from specified file\n"); + + void *argtable[] = { + arg_param_begin, + arg_str0("f", "file", "", "filename of dump"), + arg_str0("k", "keys", "", "filename of keys"), + arg_lit0(NULL, "ns", "no save to file"), + arg_lit0("v", "verbose", "Verbose mode"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + int datafnlen = 0; + char data_fn[FILE_PATH_SIZE] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)data_fn, FILE_PATH_SIZE, &datafnlen); + + int keyfnlen = 0; + char key_fn[FILE_PATH_SIZE] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)key_fn, FILE_PATH_SIZE, &keyfnlen); + + bool nosave = arg_get_lit(ctx, 3); + bool verbose = arg_get_lit(ctx, 4); + CLIParserFree(ctx); + + mfpSetVerboseMode(verbose); + + // read card + uint8_t *mem = calloc(MIFARE_4K_MAXBLOCK * MFBLOCK_SIZE, sizeof(uint8_t)); + if (mem == NULL) { + PrintAndLogEx(ERR, "failed to allocate memory"); + return PM3_EMALLOC; + } + +/* + iso14a_card_select_t card ; + int res = mfp_read_tag(&card, mem, key_fn); + if (res != PM3_SUCCESS) { + free(mem); + return res; + } +*/ + + // Skip saving card data to file + if (nosave) { + PrintAndLogEx(INFO, "Called with no save option"); + free(mem); + return PM3_SUCCESS; + } +/* + // Save to file + if (strlen(data_fn) < 1) { + + char *fptr = calloc(sizeof(char) * (strlen("hf-mfp-") + strlen("-dump")) + card.uidlen * 2 + 1, sizeof(uint8_t)); + strcpy(fptr, "hf-mfp-"); + + FillFileNameByUID(fptr, card.uid, "-dump", card.uidlen); + + strcpy(data_fn, fptr); + free(fptr); + } + + saveFile(data_fn, ".bin", mem, MIFARE_4K_MAX_BYTES); + saveFileEML(data_fn, mem, MIFARE_4K_MAX_BYTES, MFBLOCK_SIZE); + + iso14a_mf_extdump_t xdump; + xdump.card_info = card; + xdump.dump = mem; + xdump.dumplen = MIFARE_4K_MAX_BYTES; + saveFileJSON(data_fn, jsfCardMemory, (uint8_t *)&xdump, sizeof(xdump), NULL); +*/ + free(mem); + return PM3_SUCCESS; +} + + static int CmdHFMFPMAD(const char *Cmd) { CLIParserContext *ctx; @@ -1729,7 +1820,7 @@ static command_t CommandTable[] = { {"-----------", CmdHelp, IfPm3Iso14443a, "------------------- " _CYAN_("operations") " ---------------------"}, {"auth", CmdHFMFPAuth, IfPm3Iso14443a, "Authentication"}, {"chk", CmdHFMFPChk, IfPm3Iso14443a, "Check keys"}, -// {"dump", CmdHFMFPDump, IfPm3Iso14443a, "Dump MIFARE Plus tag to binary file"}, + {"dump", CmdHFMFPDump, IfPm3Iso14443a, "Dump MIFARE Plus tag to binary file"}, {"info", CmdHFMFPInfo, IfPm3Iso14443a, "Info about MIFARE Plus tag"}, {"mad", CmdHFMFPMAD, IfPm3Iso14443a, "Check and print MAD"}, {"rdbl", CmdHFMFPRdbl, IfPm3Iso14443a, "Read blocks from card"}, From 55b780074fed9b169124bdfae134fbe60284d846 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 18:59:16 +0200 Subject: [PATCH 549/924] move defines --- client/src/fileutils.c | 2 +- client/src/mifare/mifaredefault.h | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index aad9b9cce..917a7ee77 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -29,7 +29,7 @@ #include "cmdhficlass.h" // pagemap #include "protocols.h" // iclass defines #include "cmdhftopaz.h" // TOPAZ defines -#include "cmdhfmfp.h" // MFP / AES defines +#include "mifare/mifaredefault.h" // MFP / AES defines #ifdef _WIN32 #include "scandir.h" diff --git a/client/src/mifare/mifaredefault.h b/client/src/mifare/mifaredefault.h index e3590329d..7bb7e144a 100644 --- a/client/src/mifare/mifaredefault.h +++ b/client/src/mifare/mifaredefault.h @@ -21,6 +21,9 @@ #include "common.h" +#define AES_KEY_LEN 16 +#define MAX_AES_KEYS_LIST_LEN 1024 + #define MFKEY_SIZE 6 #define MFBLOCK_SIZE 16 @@ -41,6 +44,12 @@ #define MIFARE_KEY_SIZE 6 +#define MIFARE_MINI_MAX_KEY_SIZE (MIFARE_MINI_MAXSECTOR * 2 * MIFARE_KEY_SIZE) +#define MIFARE_1K_MAX_KEY_SIZE (MIFARE_1K_MAXSECTOR * 2 * MIFARE_KEY_SIZE) +#define MIFARE_2K_MAX_KEY_SIZE (MIFARE_2K_MAXSECTOR * 2 * MIFARE_KEY_SIZE) +#define MIFARE_4K_MAX_KEY_SIZE (MIFARE_4K_MAXSECTOR * 2 * MIFARE_KEY_SIZE) + + static const uint64_t g_mifare_default_keys[] = { 0xffffffffffff, // Default key (first key used by program if no user defined key) 0xa0a1a2a3a4a5, // NFCForum MAD key From 5087581a509839a9fe9ceffa399ea1e5ba38c602 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 19:58:33 +0200 Subject: [PATCH 550/924] fix some wrong sector comparisions. And return value for restore command when sending wrbl. --- client/src/cmdhfmf.c | 55 ++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 98ac30b98..fe48bb1fe 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -984,7 +984,7 @@ static int CmdHF14AMfRdSc(const char *Cmd) { return PM3_EINVARG; } - if (s > MIFARE_4K_MAXSECTOR) { + if (s >= MIFARE_4K_MAXSECTOR) { PrintAndLogEx(WARNING, "Sector number must be less then 40"); return PM3_EINVARG; } @@ -1321,6 +1321,9 @@ static int CmdHF14AMfRestore(const char *Cmd) { PrintAndLogEx(INFO, "Restoring " _YELLOW_("%s")" to card", datafilename); + PrintAndLogEx(INFO, " blk | "); + PrintAndLogEx(INFO, "-----+------------------------------------------------------------"); + // main loop for restoring. // a bit more complicated than needed // this is because of two things. @@ -1334,7 +1337,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { memcpy(bldata, dump, MFBLOCK_SIZE); // if sector trailer - if (mfNumBlocksPerSector(s) - 1 == b) { + if (mfIsSectorTrailerBasedOnBlocks(s, b)) { if (use_keyfile_for_auth == false) { // replace KEY A memcpy(bldata, keyA + (s * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); @@ -1381,33 +1384,40 @@ static int CmdHF14AMfRestore(const char *Cmd) { // use default key to authenticate for the write command memcpy(wdata, default_key, MIFARE_KEY_SIZE); } - PrintAndLogEx(INFO, "block %3d: %s", mfFirstBlockOfSector(s) + b, sprint_hex(bldata, sizeof(bldata))); + + PrintAndLogEx(INFO, " %3d | %s", mfFirstBlockOfSector(s) + b, sprint_hex(bldata, sizeof(bldata))); clearCommandBuffer(); SendCommandMIX(CMD_HF_MIFARE_WRITEBL, mfFirstBlockOfSector(s) + b, kt, 0, wdata, sizeof(wdata)); PacketResponseNG resp; - if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) { - uint8_t isOK = resp.oldarg[0] & 0xff; - if (isOK == 0) { - if (b == 0) { - PrintAndLogEx(INFO, "Writing to manufacture block w key %c ( " _RED_("fail") " )", (kt == MF_KEY_A) ? 'A' : 'B'); - } else { - PrintAndLogEx(FAILED, "Write to block %u w key %c ( " _RED_("fail") " ) ", b, (kt == MF_KEY_A) ? 'A' : 'B'); - } - } else { - // if success, skip to next block - break; - } - } else { + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { PrintAndLogEx(WARNING, "Command execute timeout"); + continue; + } + + int isOK = resp.oldarg[0] & 0xff; + if (isOK == 1) { + // if success, skip to next block + break; + } else if (isOK == PM3_ETEAROFF) { + PrintAndLogEx(INFO, "Tear off triggerd. Recommendation is not to use tear-off with restore command"); + return isOK; + } else { + if (b == 0) { + PrintAndLogEx(INFO, "Writing to manufacture block w key %c ( " _RED_("fail") " )", (kt == MF_KEY_A) ? 'A' : 'B'); + } else { + PrintAndLogEx(FAILED, "Write to block %u w key %c ( " _RED_("fail") " ) ", b, (kt == MF_KEY_A) ? 'A' : 'B'); + } } - } + } // end loop key types } // end loop B } // end loop S free(ref_dump); free(keyA); free(keyB); + PrintAndLogEx(INFO, "-----+------------------------------------------------------------"); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; } @@ -4071,7 +4081,7 @@ static int CmdHF14AMfEGetSc(const char *Cmd) { bool verbose = arg_get_lit(ctx, 2); CLIParserFree(ctx); - if (s > 39) { + if (s >= MIFARE_4K_MAXSECTOR) {v PrintAndLogEx(WARNING, "Sector number must be less then 40"); return PM3_EINVARG; } @@ -5065,7 +5075,8 @@ static int CmdHF14AMfCGetSc(const char *Cmd) { int s = arg_get_int_def(ctx, 1, 0); bool verbose = arg_get_lit(ctx, 2); CLIParserFree(ctx); - if (s > 39) { + + if (s >= MIFARE_4K_MAXSECTOR) { PrintAndLogEx(WARNING, "Sector number must be less then 40"); return PM3_EINVARG; } @@ -7021,7 +7032,7 @@ static int CmdHF14AMfWipe(const char *Cmd) { uint8_t mf[MFBLOCK_SIZE]; switch (keyslen) { - case (MIFARE_MINI_MAXSECTOR * 2 * MIFARE_KEY_SIZE): { + case (MIFARE_MINI_MAX_KEY_SIZE): { PrintAndLogEx(INFO, "Loaded keys matching MIFARE Classic Mini 320b"); memcpy(keyA, keys, (MIFARE_MINI_MAXSECTOR * MIFARE_KEY_SIZE)); memcpy(keyB, keys + (MIFARE_MINI_MAXSECTOR * MIFARE_KEY_SIZE), (MIFARE_MINI_MAXSECTOR * MIFARE_KEY_SIZE)); @@ -7029,7 +7040,7 @@ static int CmdHF14AMfWipe(const char *Cmd) { memcpy(mf, "\x11\x22\x33\x44\x44\x09\x04\x00\x62\x63\x64\x65\x66\x67\x68\x69", MFBLOCK_SIZE); break; } - case (MIFARE_1K_MAXSECTOR * 2 * MIFARE_KEY_SIZE): { + case (MIFARE_1K_MAX_KEY_SIZE): { PrintAndLogEx(INFO, "Loaded keys matching MIFARE Classic 1K"); memcpy(keyA, keys, (MIFARE_1K_MAXSECTOR * MIFARE_KEY_SIZE)); memcpy(keyB, keys + (MIFARE_1K_MAXSECTOR * MIFARE_KEY_SIZE), (MIFARE_1K_MAXSECTOR * MIFARE_KEY_SIZE)); @@ -7038,7 +7049,7 @@ static int CmdHF14AMfWipe(const char *Cmd) { memcpy(mf, "\x11\x22\x33\x44\x44\x08\x04\x00\x62\x63\x64\x65\x66\x67\x68\x69", MFBLOCK_SIZE); break; } - case (MIFARE_4K_MAXSECTOR * 2 * MIFARE_KEY_SIZE): { + case (MIFARE_4K_MAX_KEY_SIZE): { PrintAndLogEx(INFO, "Loaded keys matching MIFARE Classic 4K"); memcpy(keyA, keys, (MIFARE_4K_MAXSECTOR * MIFARE_KEY_SIZE)); memcpy(keyB, keys + (MIFARE_4K_MAXSECTOR * MIFARE_KEY_SIZE), (MIFARE_4K_MAXSECTOR * MIFARE_KEY_SIZE)); From c6e9f9781c22a2f38609bebfbabccf31dbf082fb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 23 Jun 2023 20:02:56 +0200 Subject: [PATCH 551/924] fix char --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index fe48bb1fe..5a676e390 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4081,7 +4081,7 @@ static int CmdHF14AMfEGetSc(const char *Cmd) { bool verbose = arg_get_lit(ctx, 2); CLIParserFree(ctx); - if (s >= MIFARE_4K_MAXSECTOR) {v + if (s >= MIFARE_4K_MAXSECTOR) { PrintAndLogEx(WARNING, "Sector number must be less then 40"); return PM3_EINVARG; } From c937e3b760e09beb193c871e80376f5dee30d62c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 00:02:50 +0200 Subject: [PATCH 552/924] fix tear off to work with topaz wrbl. fix topas wrbl to handle LOCK/OTP block 13,14, which needs write_nonerase command, fixed output for rdbl --- armsrc/iso14443a.c | 34 ++++++++-- client/src/cmdhftopaz.c | 138 +++++++++++++++++++++++++++++++++------- 2 files changed, 143 insertions(+), 29 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 01eed12c1..42b42c180 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1291,7 +1291,7 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r { .response = rPPS, .response_n = sizeof(rPPS) }, // PPS response { .response = rPACK, .response_n = sizeof(rPACK) } // PACK response }; - + // "precompile" responses. There are 12 predefined responses with a total of 84 bytes data to transmit. // Coded responses need one byte per bit to transfer (data, parity, start, stop, correction) @@ -3094,13 +3094,33 @@ void ReaderIso14443a(PacketCommandNG *c) { } } - if (tearoff_hook() == PM3_ETEAROFF) { // tearoff occurred - FpgaDisableTracing(); - reply_mix(CMD_ACK, 0, 0, 0, NULL, 0); + if ((param & ISO14A_TOPAZMODE)) { + + if (cmd[0] == TOPAZ_WRITE_E8 || cmd[0] == TOPAZ_WRITE_NE8) { + if (tearoff_hook() == PM3_ETEAROFF) { // tearoff occurred + FpgaDisableTracing(); + reply_mix(CMD_ACK, 0, 0, 0, NULL, 0); + } else { + arg0 = ReaderReceive(buf, par); + FpgaDisableTracing(); + reply_old(CMD_ACK, arg0, 0, 0, buf, sizeof(buf)); + } + } else { + arg0 = ReaderReceive(buf, par); + FpgaDisableTracing(); + reply_old(CMD_ACK, arg0, 0, 0, buf, sizeof(buf)); + } + } else { - arg0 = ReaderReceive(buf, par); - FpgaDisableTracing(); - reply_old(CMD_ACK, arg0, 0, 0, buf, sizeof(buf)); + + if (tearoff_hook() == PM3_ETEAROFF) { // tearoff occurred + FpgaDisableTracing(); + reply_mix(CMD_ACK, 0, 0, 0, NULL, 0); + } else { + arg0 = ReaderReceive(buf, par); + FpgaDisableTracing(); + reply_old(CMD_ACK, arg0, 0, 0, buf, sizeof(buf)); + } } } diff --git a/client/src/cmdhftopaz.c b/client/src/cmdhftopaz.c index 6311b50ed..766889438 100644 --- a/client/src/cmdhftopaz.c +++ b/client/src/cmdhftopaz.c @@ -224,6 +224,8 @@ static int topaz_write_erase8_block(uint8_t blockno, uint8_t *block_data) { uint16_t resp_len = 11; uint8_t response[11] = {0}; + // + if (topaz_send_cmd(wr8_cmd, sizeof(wr8_cmd), response, &resp_len, true) == PM3_ETIMEOUT) { topaz_switch_off_field(); return PM3_ESOFT; // WriteErase 8bytes failed @@ -243,6 +245,61 @@ static int topaz_write_erase8_block(uint8_t blockno, uint8_t *block_data) { return PM3_ESOFT; } +// write a block (8 Bytes) of a selected Topaz tag. +static int topaz_write_nonerase8_block(uint8_t blockno, uint8_t *block_data) { + + uint8_t atqa[2] = {0}; + uint8_t rid_response[8] = {0}; + int res = topaz_select(atqa, sizeof(atqa), rid_response, sizeof(rid_response), true); + if (res != PM3_SUCCESS) { + return res; + } + + if (atqa[1] != 0x0c && atqa[0] != 0x00) { + return res; + } + + uint8_t *uid_echo = &rid_response[2]; + uint8_t rall_response[124] = {0}; + + res = topaz_rall(uid_echo, rall_response); + if (res == PM3_ESOFT) { + return res; + } + + // ADD + // 7 6 5 4 3 2 1 0 + // b b b --- Byte 0 - 7 + // B B B B --------- BLOCK + // r ----------------- 0 + // + + uint8_t wr8_cmd[] = {TOPAZ_WRITE_NE8, blockno, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + memcpy(wr8_cmd + 10, uid_echo, 4); + memcpy(wr8_cmd + 2, block_data, 8); + + uint16_t resp_len = 11; + uint8_t response[11] = {0}; + + // + if (topaz_send_cmd(wr8_cmd, sizeof(wr8_cmd), response, &resp_len, true) == PM3_ETIMEOUT) { + topaz_switch_off_field(); + return PM3_ESOFT; + } + + if (resp_len != 11) { + return PM3_EFAILED; + } + + if (blockno != response[0]) { + return PM3_EFAILED; + } + + if (memcmp(block_data, response + 1, 8) == 0) { + return PM3_SUCCESS; + } + return PM3_ESOFT; +} // search for the lock area descriptor for the lockable area including byteno static dynamic_lock_area_t *get_dynamic_lock_area(uint16_t byteno) { @@ -402,6 +459,12 @@ static int topaz_print_CC(uint8_t *data) { return PM3_SUCCESS; } +static void topaz_print_hdr(uint8_t blockno) { + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, " # | block " _GREEN_("0x%02X") " | ascii", blockno); + PrintAndLogEx(INFO, "----+-------------------------+---------"); +} + // return type, length and value of a TLV, starting at memory position *TLV_ptr static void get_TLV(uint8_t **TLV_ptr, uint8_t *TLV_type, uint16_t *TLV_length, uint8_t **TLV_value) { *TLV_length = 0; @@ -782,6 +845,7 @@ static int CmdHFTopazDump(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_str0("f", "file", "", "filename of dump"), + arg_lit0(NULL, "ns", "no save to file"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -789,6 +853,8 @@ static int CmdHFTopazDump(const char *Cmd) { int fnlen = 0; char filename[FILE_PATH_SIZE] = {0}; CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen); + bool nosave = arg_get_lit(ctx, 2); + CLIParserFree(ctx); int status = readTopazUid(false, false); @@ -811,9 +877,18 @@ static int CmdHFTopazDump(const char *Cmd) { ); } - PrintAndLogEx(INFO, "-------------------------------------------------------------"); topaz_switch_off_field(); + // Skip saving card data to file + if (nosave) { + PrintAndLogEx(INFO, "Called with no save option"); + if (set_dynamic) { + free(topaz_tag.dynamic_memory); + } + return PM3_SUCCESS; + } + + // user supplied filename? if (fnlen < 1) { PrintAndLogEx(INFO, "Using UID as filename"); @@ -888,13 +963,13 @@ static int CmdHFTopazRdBl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf topaz rdbl", - "Read a block", - "hf topaz rdbl -b 7\n" + "Read Topaz block", + "hf topaz rdbl --blk 7\n" ); void *argtable[] = { arg_param_begin, - arg_int1("b", "block", "", "Block number to write"), + arg_int1(NULL, "blk", "", "Block number"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -910,7 +985,11 @@ static int CmdHFTopazRdBl(const char *Cmd) { uint8_t data[8] = {0}; int res = topaz_read_block(blockno, data); if (res == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "Block: %0d (0x%02X) [ %s]", blockno, blockno, sprint_hex(data, sizeof(data))); + + topaz_print_hdr(blockno); + + PrintAndLogEx(INFO, " %2d | %s", blockno, sprint_hex_ascii(data, sizeof(data))); + PrintAndLogEx(NORMAL, ""); } topaz_switch_off_field(); @@ -922,13 +1001,13 @@ static int CmdHFTopazWrBl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf topaz wrbl", - "Write a block", - "hf topaz wrbl -b 7 -d 1122334455667788\n" + "Write Topaz block with 8 hex bytes of data", + "hf topaz wrbl --blk 7 -d 1122334455667788\n" ); void *argtable[] = { arg_param_begin, - arg_int1("b", "block", "", "Block number to write"), + arg_int1(NULL, "blk", "", "Block number"), arg_str1("d", "data", "", "Block data (8 hex bytes)"), arg_param_end }; @@ -954,14 +1033,23 @@ static int CmdHFTopazWrBl(const char *Cmd) { PrintAndLogEx(INFO, "Block: %0d (0x%02X) [ %s]", blockno, blockno, sprint_hex(data, dlen)); - // send write Block - int res = topaz_write_erase8_block(blockno, data); + int res; + if (blockno != 13 && blockno != 14) { + // send write/erase block + res = topaz_write_erase8_block(blockno, data); + } else { + // send write/non erase block + res = topaz_write_nonerase8_block(blockno, data); + } if (res == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); + PrintAndLogEx(HINT, "try `" _YELLOW_("hf topaz rdbl --blk %u") "` to verify", blockno); + } else { PrintAndLogEx(WARNING, "Write ( " _RED_("fail") " )"); } + PrintAndLogEx(NORMAL, ""); topaz_switch_off_field(); return res; @@ -970,18 +1058,24 @@ static int CmdHFTopazWrBl(const char *Cmd) { static int CmdHelp(const char *Cmd); static command_t CommandTable[] = { - {"help", CmdHelp, AlwaysAvailable, "This help"}, - {"dump", CmdHFTopazDump, IfPm3Iso14443a, "Dump TOPAZ family tag to file"}, - {"list", CmdHFTopazList, AlwaysAvailable, "List Topaz history"}, - {"info", CmdHFTopazInfo, IfPm3Iso14443a, "Tag information"}, - {"reader", CmdHFTopazReader, IfPm3Iso14443a, "Act like a Topaz reader"}, - {"sim", CmdHFTopazSim, IfPm3Iso14443a, "Simulate Topaz tag"}, - {"sniff", CmdHFTopazSniff, IfPm3Iso14443a, "Sniff Topaz reader-tag communication"}, - {"raw", CmdHFTopazRaw, IfPm3Iso14443a, "Send raw hex data to tag"}, - {"rdbl", CmdHFTopazRdBl, IfPm3Iso14443a, "Read block"}, - {"view", CmdHFTopazView, AlwaysAvailable, "Display content from tag dump file"}, - {"wrbl", CmdHFTopazWrBl, IfPm3Iso14443a, "Write block"}, - {NULL, NULL, 0, NULL} + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"list", CmdHFTopazList, AlwaysAvailable, "List Topaz history"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "------------------- " _CYAN_("operations") " ---------------------"}, + {"dump", CmdHFTopazDump, IfPm3Iso14443a, "Dump TOPAZ family tag to file"}, + {"info", CmdHFTopazInfo, IfPm3Iso14443a, "Tag information"}, + {"raw", CmdHFTopazRaw, IfPm3Iso14443a, "Send raw hex data to tag"}, + {"rdbl", CmdHFTopazRdBl, IfPm3Iso14443a, "Read block"}, + {"reader", CmdHFTopazReader, IfPm3Iso14443a, "Act like a Topaz reader"}, + {"sim", CmdHFTopazSim, IfPm3Iso14443a, "Simulate Topaz tag"}, + {"sniff", CmdHFTopazSniff, IfPm3Iso14443a, "Sniff Topaz reader-tag communication"}, + {"view", CmdHFTopazView, AlwaysAvailable, "Display content from tag dump file"}, + {"wrbl", CmdHFTopazWrBl, IfPm3Iso14443a, "Write block"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("ndef") " -----------------------"}, +// {"ndefformat", CmdHFTopazNDEFFormat, IfPm3Iso14443a, "Format Topaz Tag as NFC Tag"}, +// {"ndefread", CmdHFTopazNDEFRead, IfPm3Iso14443a, "Read and print NDEF records from card"}, +// {"ndefwrite", CmdHFTopazNDEFWrite, IfPm3Iso14443a, "Write NDEF records to card"}, + + {NULL, NULL, 0, NULL} }; static int CmdHelp(const char *Cmd) { From f2d6eb3021b949e6c4dda78417152b25574f0e07 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 00:06:26 +0200 Subject: [PATCH 553/924] text --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94d492c41..5e0c9af78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `hf topaz dump --ns` - now supports nosave param (@iceman1001) + - Changed `hf topaz rdbl` - unified output (@iceman1001) + - Fixed `hf topaz wrbl` - now supports tear off and write_nonerase command (@iceman1001) + - Fixed `hf mf` commands (@iceman1001) + - Fixed `hf mfp` commands (@iceman1001) + - Added more default keys (@iceman1001) Thanks anon! - Fixed `pm3-flash-all` shell script now correctly identify the if running on outdated bootloader (@iceman1001) - Fixed `hf 15693/iclass sniff` trace timings (@nvx) - Fix LegicCash segment handling in `hf_legic.lua` script (@jmichelp) From 636e6bcc6ba3b2914e3304dd700dfe842068adf9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 17:13:23 +0200 Subject: [PATCH 554/924] adapt restore --- client/src/cmdhfmf.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 5a676e390..e0a01b102 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1385,10 +1385,12 @@ static int CmdHF14AMfRestore(const char *Cmd) { memcpy(wdata, default_key, MIFARE_KEY_SIZE); } - PrintAndLogEx(INFO, " %3d | %s", mfFirstBlockOfSector(s) + b, sprint_hex(bldata, sizeof(bldata))); + uint16_t blockno = (mfFirstBlockOfSector(s) + b); + + PrintAndLogEx(INFO, " %3d | %s", blockno, sprint_hex(bldata, sizeof(bldata))); clearCommandBuffer(); - SendCommandMIX(CMD_HF_MIFARE_WRITEBL, mfFirstBlockOfSector(s) + b, kt, 0, wdata, sizeof(wdata)); + SendCommandMIX(CMD_HF_MIFARE_WRITEBL, blockno, kt, 0, wdata, sizeof(wdata)); PacketResponseNG resp; if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { PrintAndLogEx(WARNING, "Command execute timeout"); @@ -1401,18 +1403,24 @@ static int CmdHF14AMfRestore(const char *Cmd) { break; } else if (isOK == PM3_ETEAROFF) { PrintAndLogEx(INFO, "Tear off triggerd. Recommendation is not to use tear-off with restore command"); - return isOK; + goto out; } else { if (b == 0) { - PrintAndLogEx(INFO, "Writing to manufacture block w key %c ( " _RED_("fail") " )", (kt == MF_KEY_A) ? 'A' : 'B'); + PrintAndLogEx(INFO, "Writing to manufacture block w key " _YELLOW_("%c") " ( " _RED_("fail") " )", + (kt == MF_KEY_A) ? 'A' : 'B' + ); } else { - PrintAndLogEx(FAILED, "Write to block %u w key %c ( " _RED_("fail") " ) ", b, (kt == MF_KEY_A) ? 'A' : 'B'); + PrintAndLogEx(FAILED, "Write to block " _YELLOW_("%u") " w key " _YELLOW_("%c") " ( " _RED_("fail") " ) ", + blockno, + (kt == MF_KEY_A) ? 'A' : 'B' + ); } } } // end loop key types } // end loop B } // end loop S +out: free(ref_dump); free(keyA); free(keyB); From f0a6b1bd672c8f568499adceb842a8860bc13563 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 17:14:56 +0200 Subject: [PATCH 555/924] "hf mf supercard --furui" - add furui supercard key covery. Thanks to Foxushka for the PoC --- client/src/cmdhfmf.c | 416 +++++++++++++++++++++++++++---------------- 1 file changed, 260 insertions(+), 156 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index e0a01b102..c25e00cff 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -6753,6 +6753,102 @@ static int CmdHf14AGen3Freeze(const char *Cmd) { return res; } +#define FURUI_MAX_TRACES 8 +static int mfc_furui_recovery(uint8_t items, uint8_t tracedata[FURUI_MAX_TRACES][18]) { + // recover key from collected traces + // outer loop + for (uint8_t i = 0; i < items; i++) { + + // first + nonces_t data; + data.cuid = bytes_to_num(tracedata[i], 4); + data.nonce = bytes_to_num(tracedata[i] + 6, 4); + data.nr = bytes_to_num(tracedata[i] + 10, 4); + data.ar = bytes_to_num(tracedata[i] + 14, 4); + data.at = 0; + + // inner loop + for (uint8_t j = i + 1; j < items; j++) { + + uint8_t *p = tracedata[j]; + PrintAndLogEx(INFO, "%u... %s", i, sprint_hex_inrow(p, 18)); + + // since data stored as block number but its the same key for all blocks in one sector + // we compare with sector number here + uint8_t s = mfSectorNum(tracedata[i][4]); + if (mfSectorNum(p[4]) == s) { + + data.nonce2 = bytes_to_num(p + 6, 4); + data.nr2 = bytes_to_num(p + 10, 4); + data.ar2 = bytes_to_num(p + 14, 4); + data.sector = s; + data.keytype = tracedata[i][5]; + data.state = FIRST; + + uint64_t key64 = -1; + if (mfkey32_moebius(&data, &key64)) { + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ "_GREEN_("%012" PRIX64) " ]", + sprint_hex_inrow(tracedata[i], 4), + data.sector, + (data.keytype == 0x60) ? 'A' : 'B', + key64 + ); + break; + } + } + } + } + return PM3_SUCCESS; +} + +static int mfc_supercard_gen2_recovery(uint8_t items, uint8_t tracedata[FURUI_MAX_TRACES][18]) { + for (uint8_t i = 0; i < items; i++) { + uint8_t *tmp = tracedata[i]; + + // first + uint16_t NT0 = (tmp[6] << 8) | tmp[7]; + + nonces_t data; + data.cuid = bytes_to_num(tmp, 4); + data.nonce = prng_successor(NT0, 31); + data.nr = bytes_to_num(tmp + 8, 4); + data.ar = bytes_to_num(tmp + 12, 4); + data.at = 0; + + // second + for (uint8_t j = i + 1; j < items; j++) { + uint8_t *p = tracedata[j]; + + // since data stored as block number but its the same key for all blocks in one sector + // we compare with sector number here + uint8_t s = mfSectorNum(tmp[5]); + if (mfSectorNum(p[5]) == s) { + + NT0 = (p[6] << 8) | p[7]; + + data.nonce2 = prng_successor(NT0, 31); + data.nr2 = bytes_to_num(p + 8, 4); + data.ar2 = bytes_to_num(p + 12, 4); + data.sector = s; + data.keytype = tmp[4]; + data.state = FIRST; + + uint64_t key64 = -1; + if (mfkey32_moebius(&data, &key64)) { + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ "_GREEN_("%012" PRIX64) " ]", + sprint_hex_inrow(tmp, 4), + data.sector, + (data.keytype == 0x60) ? 'A' : 'B', + key64 + ); + break; + } + } + } + } + return PM3_SUCCESS; +} + static int CmdHf14AMfSuperCard(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf mf supercard", @@ -6765,6 +6861,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { arg_param_begin, arg_lit0("r", "reset", "Reset card"), arg_str0("u", "uid", "", "New UID (4 hex bytes)"), + arg_lit0(NULL, "furui", "Furui detection card"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -6772,6 +6869,8 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { uint8_t uid[4]; int uidlen = 0; int res = CLIParamHexToBuf(arg_get_str(ctx, 2), uid, sizeof(uid), &uidlen); + bool is_furui = arg_get_lit(ctx, 3); + CLIParserFree(ctx); if (res || (!res && uidlen && uidlen != sizeof(uid))) { @@ -6779,15 +6878,53 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { return PM3_EINVARG; } + uint8_t tracedata[FURUI_MAX_TRACES][18]; + + // Super card FURUI + if (is_furui) { + + // no reset on super card FURUI + if (uidlen || reset_card) { + PrintAndLogEx(FAILED, "Not supported on this card"); + return PM3_SUCCESS; + } + + // read 8 traces + uint8_t i; + for (i = 0; i < FURUI_MAX_TRACES; i++) { + + uint8_t data[] = {0xAA, 0xA8, 0x00, i}; + uint32_t flags = ISO14A_CONNECT | ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_RATS; + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO14443A_READER, flags, sizeof(data), 0, data, sizeof(data)); + if (WaitForResponseTimeout(CMD_ACK, NULL, 1500) == false) { + break; + } + + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { + break; + } + + uint16_t len = resp.oldarg[0] & 0xFFFF; + if (len != 20) { + break; // Not trace data + } + + PrintAndLogEx(DEBUG, ">>> %s", sprint_hex_inrow(resp.data.asBytes, len)); + memcpy(&tracedata[i], resp.data.asBytes, len - 2); + } + + return mfc_furui_recovery(i, tracedata); + } + #define SUPER_MAX_TRACES 7 - uint8_t trace = 0; - uint8_t traces[SUPER_MAX_TRACES][16]; + // read 7 traces from super card generation 1,2 + uint8_t i = 0; + for (i = 0; i < SUPER_MAX_TRACES; i++) { - // read 7 traces from super card - for (trace = 0; trace < SUPER_MAX_TRACES; trace++) { - - uint8_t data[] = {0x30, 0x00 + trace}; + uint8_t data[] = {0x30, i}; uint32_t flags = ISO14A_CONNECT | ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_RATS; clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443A_READER, flags, sizeof(data), 0, data, sizeof(data)); @@ -6805,11 +6942,12 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { break; // Not trace data } - memcpy(&traces[trace], resp.data.asBytes, len - 2); + PrintAndLogEx(DEBUG, ">>> %s", sprint_hex_inrow(resp.data.asBytes, len)); + memcpy(&tracedata[i], resp.data.asBytes, len - 2); } // Super card generation 2 - if (trace == SUPER_MAX_TRACES) { + if (i == SUPER_MAX_TRACES) { // no reset on super card generation 2. if (uidlen || reset_card) { @@ -6818,174 +6956,140 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { } // recover key from collected traces - for (trace = 0; trace < SUPER_MAX_TRACES; trace++) { - uint8_t *trace_data = traces[trace]; - nonces_t data; + return mfc_supercard_gen2_recovery(i, tracedata); + } - // first - uint16_t NT0 = (trace_data[6] << 8) | trace_data[7]; - data.cuid = bytes_to_num(trace_data, 4); - data.nonce = prng_successor(NT0, 31); - data.nr = bytes_to_num(trace_data + 8, 4); - data.ar = bytes_to_num(trace_data + 12, 4); - data.at = 0; + // Super card generation 1 - // second - for (uint8_t s_strace = trace + 1; s_strace < 7; s_strace++) { - uint8_t *s_trace_data = traces[s_strace]; - if (mfSectorNum(s_trace_data[5]) == mfSectorNum(trace_data[5])) { - NT0 = (s_trace_data[6] << 8) | s_trace_data[7]; - data.nonce2 = prng_successor(NT0, 31); - data.nr2 = bytes_to_num(s_trace_data + 8, 4); - data.ar2 = bytes_to_num(s_trace_data + 12, 4); - data.sector = mfSectorNum(trace_data[5]); - data.keytype = trace_data[4]; - data.state = FIRST; + // Commands: + // a0 - set UID + // b0 - read traces + // c0 - clear card + bool activate_field = true; + bool keep_field_on = true; - uint64_t key64 = -1; - if (mfkey32_moebius(&data, &key64)) { - PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ "_GREEN_("%012" PRIX64) " ]", sprint_hex_inrow(trace_data, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); - break; - } - } - } - } - - } else { - - // Super card generation 1 - - // Commands: - // a0 - set UID - // b0 - read traces - // c0 - clear card - bool activate_field = true; - bool keep_field_on = true; - - // change UID on a super card generation 1 - if (uidlen) { - keep_field_on = false; - uint8_t response[6]; - int resplen = 0; - - // --------------- CHANGE UID ---------------- - uint8_t aCHANGE[] = {0x00, 0xa6, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00}; - memcpy(aCHANGE + 5, uid, uidlen); - res = ExchangeAPDU14a(aCHANGE, sizeof(aCHANGE), activate_field, keep_field_on, response, sizeof(response), - &resplen); - if (res != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Super card UID change [ " _RED_("fail") " ]"); - DropField(); - return res; - } - - PrintAndLogEx(SUCCESS, "Super card UID change ( " _GREEN_("ok") " )"); - return PM3_SUCCESS; - } - - // reset a super card generation 1 - if (reset_card) { - keep_field_on = false; - uint8_t response[6]; - int resplen = 0; - - // --------------- RESET CARD ---------------- - uint8_t aRESET[] = {0x00, 0xa6, 0xc0, 0x00}; - res = ExchangeAPDU14a(aRESET, sizeof(aRESET), activate_field, keep_field_on, response, sizeof(response), - &resplen); - if (res != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Super card reset [ " _RED_("fail") " ]"); - DropField(); - return res; - } - PrintAndLogEx(SUCCESS, "Super card reset ( " _GREEN_("ok") " )"); - return PM3_SUCCESS; - } - - - uint8_t responseA[22]; - uint8_t responseB[22]; - int respAlen = 0; - int respBlen = 0; - - // --------------- First ---------------- - uint8_t aFIRST[] = {0x00, 0xa6, 0xb0, 0x00, 0x10}; - res = ExchangeAPDU14a(aFIRST, sizeof(aFIRST), activate_field, keep_field_on, responseA, sizeof(responseA), &respAlen); - if (res != PM3_SUCCESS) { - DropField(); - return res; - } - - // --------------- Second ---------------- - activate_field = false; + // change UID on a super card generation 1 + if (uidlen) { keep_field_on = false; + uint8_t response[6]; + int resplen = 0; - uint8_t aSECOND[] = {0x00, 0xa6, 0xb0, 0x01, 0x10}; - res = ExchangeAPDU14a(aSECOND, sizeof(aSECOND), activate_field, keep_field_on, responseB, sizeof(responseB), &respBlen); + // --------------- CHANGE UID ---------------- + uint8_t aCHANGE[] = {0x00, 0xa6, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00}; + memcpy(aCHANGE + 5, uid, uidlen); + res = ExchangeAPDU14a(aCHANGE, sizeof(aCHANGE), activate_field, keep_field_on, response, sizeof(response), + &resplen); if (res != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Super card UID change [ " _RED_("fail") " ]"); DropField(); return res; } - uint8_t outA[16] = {0}; - uint8_t outB[16] = {0}; + PrintAndLogEx(SUCCESS, "Super card UID change ( " _GREEN_("ok") " )"); + return PM3_SUCCESS; + } - uint8_t key[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; - for (uint8_t i = 0; i < 16; i += 8) { - des_decrypt(outA + i, responseA + i, key); - des_decrypt(outB + i, responseB + i, key); + // reset a super card generation 1 + if (reset_card) { + keep_field_on = false; + uint8_t response[6]; + int resplen = 0; + + // --------------- RESET CARD ---------------- + uint8_t aRESET[] = {0x00, 0xa6, 0xc0, 0x00}; + res = ExchangeAPDU14a(aRESET, sizeof(aRESET), activate_field, keep_field_on, response, sizeof(response), + &resplen); + if (res != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Super card reset [ " _RED_("fail") " ]"); + DropField(); + return res; } + PrintAndLogEx(SUCCESS, "Super card reset ( " _GREEN_("ok") " )"); + return PM3_SUCCESS; + } - PrintAndLogEx(DEBUG, " in : %s", sprint_hex_inrow(responseA, respAlen)); - PrintAndLogEx(DEBUG, "out : %s", sprint_hex_inrow(outA, sizeof(outA))); - PrintAndLogEx(DEBUG, " in : %s", sprint_hex_inrow(responseB, respAlen)); - PrintAndLogEx(DEBUG, "out : %s", sprint_hex_inrow(outB, sizeof(outB))); + uint8_t responseA[22]; + uint8_t responseB[22]; + int respAlen = 0; + int respBlen = 0; - if (memcmp(outA, "\x01\x01\x01\x01\x01\x01\x01\x01", 8) == 0) { - PrintAndLogEx(INFO, "No trace recorded"); - return PM3_SUCCESS; - } + // --------------- First ---------------- + uint8_t aFIRST[] = {0x00, 0xa6, 0xb0, 0x00, 0x10}; + res = ExchangeAPDU14a(aFIRST, sizeof(aFIRST), activate_field, keep_field_on, responseA, sizeof(responseA), &respAlen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } - // second trace? - if (memcmp(outB, "\x01\x01\x01\x01\x01\x01\x01\x01", 8) == 0) { - PrintAndLogEx(INFO, "Only one trace recorded"); - return PM3_SUCCESS; - } + // --------------- Second ---------------- + activate_field = false; + keep_field_on = false; - nonces_t data; + uint8_t aSECOND[] = {0x00, 0xa6, 0xb0, 0x01, 0x10}; + res = ExchangeAPDU14a(aSECOND, sizeof(aSECOND), activate_field, keep_field_on, responseB, sizeof(responseB), &respBlen); + if (res != PM3_SUCCESS) { + DropField(); + return res; + } - // first - uint16_t NT0 = (outA[6] << 8) | outA[7]; - data.cuid = bytes_to_num(outA, 4); - data.nonce = prng_successor(NT0, 31); - data.nr = bytes_to_num(outA + 8, 4); - data.ar = bytes_to_num(outA + 12, 4); - data.at = 0; + uint8_t outA[16] = {0}; + uint8_t outB[16] = {0}; - // second - NT0 = (outB[6] << 8) | outB[7]; - data.nonce2 = prng_successor(NT0, 31); - data.nr2 = bytes_to_num(outB + 8, 4); - data.ar2 = bytes_to_num(outB + 12, 4); - data.sector = mfSectorNum(outA[5]); - data.keytype = outA[4]; - data.state = FIRST; + uint8_t key[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; + for (i = 0; i < 16; i += 8) { + des_decrypt(outA + i, responseA + i, key); + des_decrypt(outB + i, responseB + i, key); + } - PrintAndLogEx(DEBUG, "A Sector %02x", data.sector); - PrintAndLogEx(DEBUG, "A NT %08x", data.nonce); - PrintAndLogEx(DEBUG, "A NR %08x", data.nr); - PrintAndLogEx(DEBUG, "A AR %08x", data.ar); - PrintAndLogEx(DEBUG, ""); - PrintAndLogEx(DEBUG, "B NT %08x", data.nonce2); - PrintAndLogEx(DEBUG, "B NR %08x", data.nr2); - PrintAndLogEx(DEBUG, "B AR %08x", data.ar2); + PrintAndLogEx(DEBUG, " in : %s", sprint_hex_inrow(responseA, respAlen)); + PrintAndLogEx(DEBUG, "out : %s", sprint_hex_inrow(outA, sizeof(outA))); + PrintAndLogEx(DEBUG, " in : %s", sprint_hex_inrow(responseB, respAlen)); + PrintAndLogEx(DEBUG, "out : %s", sprint_hex_inrow(outB, sizeof(outB))); - uint64_t key64 = -1; - if (mfkey32_moebius(&data, &key64)) { - PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%012" PRIX64) " ]", sprint_hex_inrow(outA, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); - } else { - PrintAndLogEx(FAILED, "failed to recover any key"); - } + if (memcmp(outA, "\x01\x01\x01\x01\x01\x01\x01\x01", 8) == 0) { + PrintAndLogEx(INFO, "No trace recorded"); + return PM3_SUCCESS; + } + + // second trace? + if (memcmp(outB, "\x01\x01\x01\x01\x01\x01\x01\x01", 8) == 0) { + PrintAndLogEx(INFO, "Only one trace recorded"); + return PM3_SUCCESS; + } + + nonces_t data; + + // first + uint16_t NT0 = (outA[6] << 8) | outA[7]; + data.cuid = bytes_to_num(outA, 4); + data.nonce = prng_successor(NT0, 31); + data.nr = bytes_to_num(outA + 8, 4); + data.ar = bytes_to_num(outA + 12, 4); + data.at = 0; + + // second + NT0 = (outB[6] << 8) | outB[7]; + data.nonce2 = prng_successor(NT0, 31); + data.nr2 = bytes_to_num(outB + 8, 4); + data.ar2 = bytes_to_num(outB + 12, 4); + data.sector = mfSectorNum(outA[5]); + data.keytype = outA[4]; + data.state = FIRST; + + PrintAndLogEx(DEBUG, "A Sector %02x", data.sector); + PrintAndLogEx(DEBUG, "A NT %08x", data.nonce); + PrintAndLogEx(DEBUG, "A NR %08x", data.nr); + PrintAndLogEx(DEBUG, "A AR %08x", data.ar); + PrintAndLogEx(DEBUG, ""); + PrintAndLogEx(DEBUG, "B NT %08x", data.nonce2); + PrintAndLogEx(DEBUG, "B NR %08x", data.nr2); + PrintAndLogEx(DEBUG, "B AR %08x", data.ar2); + + uint64_t key64 = -1; + if (mfkey32_moebius(&data, &key64)) { + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ " _GREEN_("%012" PRIX64) " ]", sprint_hex_inrow(outA, 4), data.sector, (data.keytype == 0x60) ? 'A' : 'B', key64); + } else { + PrintAndLogEx(FAILED, "failed to recover any key"); } return PM3_SUCCESS; } From 74f02fef8ab672a2eec2be9e061d0c1848c3c837 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 17:16:28 +0200 Subject: [PATCH 556/924] style --- armsrc/iso14443a.c | 4 +- client/src/cmdhfmf.c | 48 +++++------ client/src/cmdhfmfp.c | 62 +++++++------- client/src/cmdhfmfu.c | 4 +- client/src/cmdhftopaz.c | 14 ++-- client/src/cmdtrace.c | 14 ++-- client/src/fileutils.c | 2 +- client/src/mifare/mad.c | 46 +++++------ client/src/pm3line_vocabulory.h | 22 ++--- common/crc16.c | 2 +- doc/commands.json | 138 ++++++++++++++++++++++++-------- doc/commands.md | 24 +++--- 12 files changed, 229 insertions(+), 151 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 42b42c180..9cff73f63 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1291,7 +1291,7 @@ bool SimulateIso14443aInit(uint8_t tagType, uint16_t flags, uint8_t *data, tag_r { .response = rPPS, .response_n = sizeof(rPPS) }, // PPS response { .response = rPACK, .response_n = sizeof(rPACK) } // PACK response }; - + // "precompile" responses. There are 12 predefined responses with a total of 84 bytes data to transmit. // Coded responses need one byte per bit to transfer (data, parity, start, stop, correction) @@ -3105,7 +3105,7 @@ void ReaderIso14443a(PacketCommandNG *c) { FpgaDisableTracing(); reply_old(CMD_ACK, arg0, 0, 0, buf, sizeof(buf)); } - } else { + } else { arg0 = ReaderReceive(buf, par); FpgaDisableTracing(); reply_old(CMD_ACK, arg0, 0, 0, buf, sizeof(buf)); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index c25e00cff..765c515e4 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1395,7 +1395,7 @@ static int CmdHF14AMfRestore(const char *Cmd) { if (WaitForResponseTimeout(CMD_ACK, &resp, 1500) == false) { PrintAndLogEx(WARNING, "Command execute timeout"); continue; - } + } int isOK = resp.oldarg[0] & 0xff; if (isOK == 1) { @@ -1406,14 +1406,14 @@ static int CmdHF14AMfRestore(const char *Cmd) { goto out; } else { if (b == 0) { - PrintAndLogEx(INFO, "Writing to manufacture block w key " _YELLOW_("%c") " ( " _RED_("fail") " )", - (kt == MF_KEY_A) ? 'A' : 'B' - ); + PrintAndLogEx(INFO, "Writing to manufacture block w key " _YELLOW_("%c") " ( " _RED_("fail") " )", + (kt == MF_KEY_A) ? 'A' : 'B' + ); } else { PrintAndLogEx(FAILED, "Write to block " _YELLOW_("%u") " w key " _YELLOW_("%c") " ( " _RED_("fail") " ) ", - blockno, - (kt == MF_KEY_A) ? 'A' : 'B' - ); + blockno, + (kt == MF_KEY_A) ? 'A' : 'B' + ); } } } // end loop key types @@ -1424,7 +1424,7 @@ out: free(ref_dump); free(keyA); free(keyB); - PrintAndLogEx(INFO, "-----+------------------------------------------------------------"); + PrintAndLogEx(INFO, "-----+------------------------------------------------------------"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "Done!"); return PM3_SUCCESS; @@ -3604,7 +3604,7 @@ out: // if (singleSector) // printKeyTableEx(1, e_sector, mfSectorNum(blockNo)); // else - printKeyTable(sectors_cnt, e_sector); + printKeyTable(sectors_cnt, e_sector); if (transferToEml) { // fast push mode @@ -6273,7 +6273,7 @@ skipfile: memcpy(block, firstblocks[b], MFBLOCK_SIZE); break; default: { - if (mfIsSectorTrailerBasedOnBlocks(i,j)) { + if (mfIsSectorTrailerBasedOnBlocks(i, j)) { // ST NDEF memcpy(block, firstblocks[7], MFBLOCK_SIZE); } @@ -6787,12 +6787,12 @@ static int mfc_furui_recovery(uint8_t items, uint8_t tracedata[FURUI_MAX_TRACES] uint64_t key64 = -1; if (mfkey32_moebius(&data, &key64)) { - PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ "_GREEN_("%012" PRIX64) " ]", - sprint_hex_inrow(tracedata[i], 4), - data.sector, - (data.keytype == 0x60) ? 'A' : 'B', - key64 - ); + PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ "_GREEN_("%012" PRIX64) " ]", + sprint_hex_inrow(tracedata[i], 4), + data.sector, + (data.keytype == 0x60) ? 'A' : 'B', + key64 + ); break; } } @@ -6836,11 +6836,11 @@ static int mfc_supercard_gen2_recovery(uint8_t items, uint8_t tracedata[FURUI_MA uint64_t key64 = -1; if (mfkey32_moebius(&data, &key64)) { PrintAndLogEx(SUCCESS, "UID: %s Sector %02x key %c [ "_GREEN_("%012" PRIX64) " ]", - sprint_hex_inrow(tmp, 4), - data.sector, - (data.keytype == 0x60) ? 'A' : 'B', - key64 - ); + sprint_hex_inrow(tmp, 4), + data.sector, + (data.keytype == 0x60) ? 'A' : 'B', + key64 + ); break; } } @@ -6957,7 +6957,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { // recover key from collected traces return mfc_supercard_gen2_recovery(i, tracedata); - } + } // Super card generation 1 @@ -6978,7 +6978,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { uint8_t aCHANGE[] = {0x00, 0xa6, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00}; memcpy(aCHANGE + 5, uid, uidlen); res = ExchangeAPDU14a(aCHANGE, sizeof(aCHANGE), activate_field, keep_field_on, response, sizeof(response), - &resplen); + &resplen); if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Super card UID change [ " _RED_("fail") " ]"); DropField(); @@ -6998,7 +6998,7 @@ static int CmdHf14AMfSuperCard(const char *Cmd) { // --------------- RESET CARD ---------------- uint8_t aRESET[] = {0x00, 0xa6, 0xc0, 0x00}; res = ExchangeAPDU14a(aRESET, sizeof(aRESET), activate_field, keep_field_on, response, sizeof(response), - &resplen); + &resplen); if (res != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Super card reset [ " _RED_("fail") " ]"); DropField(); diff --git a/client/src/cmdhfmfp.c b/client/src/cmdhfmfp.c index 089e041d3..52f3da57e 100644 --- a/client/src/cmdhfmfp.c +++ b/client/src/cmdhfmfp.c @@ -995,8 +995,8 @@ static int CmdHFMFPWrbl(const char *Cmd) { } static int plus_key_check(uint8_t startSector, uint8_t endSector, uint8_t startKeyAB, uint8_t endKeyAB, - uint8_t keyList[MAX_AES_KEYS_LIST_LEN][AES_KEY_LEN], size_t keyListLen, uint8_t foundKeys[2][64][AES_KEY_LEN + 1], - bool verbose) { + uint8_t keyList[MAX_AES_KEYS_LIST_LEN][AES_KEY_LEN], size_t keyListLen, uint8_t foundKeys[2][64][AES_KEY_LEN + 1], + bool verbose) { int res; bool selectCard = true; uint8_t keyn[2] = {0}; @@ -1296,10 +1296,10 @@ static int CmdHFMFPChk(const char *Cmd) { for (uint8_t s = startSector; s <= endSector; s++) { if ((memcmp(&foundKeys[0][s][1], ndef_key, AES_KEY_LEN) == 0) || - (memcmp(&foundKeys[1][s][1], ndef_key, AES_KEY_LEN) == 0)) { + (memcmp(&foundKeys[1][s][1], ndef_key, AES_KEY_LEN) == 0)) { has_ndef_key = true; } - + if (printedHeader == false) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "-----+----------------------------------+----------------------------------"); @@ -1320,7 +1320,7 @@ static int CmdHFMFPChk(const char *Cmd) { snprintf(strB, sizeof(strB), _RED_("%s"), "--------------------------------"); } - PrintAndLogEx(INFO, " " _YELLOW_("%03d") " | %s | %s", s, strA, strB); + PrintAndLogEx(INFO, " " _YELLOW_("%03d") " | %s | %s", s, strA, strB); } if (printedHeader == false) @@ -1395,7 +1395,7 @@ static int CmdHFMFPDump(const char *Cmd) { arg_str0("f", "file", "", "filename of dump"), arg_str0("k", "keys", "", "filename of keys"), arg_lit0(NULL, "ns", "no save to file"), - arg_lit0("v", "verbose", "Verbose mode"), + arg_lit0("v", "verbose", "Verbose mode"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1421,14 +1421,14 @@ static int CmdHFMFPDump(const char *Cmd) { return PM3_EMALLOC; } -/* - iso14a_card_select_t card ; - int res = mfp_read_tag(&card, mem, key_fn); - if (res != PM3_SUCCESS) { - free(mem); - return res; - } -*/ + /* + iso14a_card_select_t card ; + int res = mfp_read_tag(&card, mem, key_fn); + if (res != PM3_SUCCESS) { + free(mem); + return res; + } + */ // Skip saving card data to file if (nosave) { @@ -1436,28 +1436,28 @@ static int CmdHFMFPDump(const char *Cmd) { free(mem); return PM3_SUCCESS; } -/* - // Save to file - if (strlen(data_fn) < 1) { + /* + // Save to file + if (strlen(data_fn) < 1) { - char *fptr = calloc(sizeof(char) * (strlen("hf-mfp-") + strlen("-dump")) + card.uidlen * 2 + 1, sizeof(uint8_t)); - strcpy(fptr, "hf-mfp-"); + char *fptr = calloc(sizeof(char) * (strlen("hf-mfp-") + strlen("-dump")) + card.uidlen * 2 + 1, sizeof(uint8_t)); + strcpy(fptr, "hf-mfp-"); - FillFileNameByUID(fptr, card.uid, "-dump", card.uidlen); + FillFileNameByUID(fptr, card.uid, "-dump", card.uidlen); - strcpy(data_fn, fptr); - free(fptr); - } + strcpy(data_fn, fptr); + free(fptr); + } - saveFile(data_fn, ".bin", mem, MIFARE_4K_MAX_BYTES); - saveFileEML(data_fn, mem, MIFARE_4K_MAX_BYTES, MFBLOCK_SIZE); + saveFile(data_fn, ".bin", mem, MIFARE_4K_MAX_BYTES); + saveFileEML(data_fn, mem, MIFARE_4K_MAX_BYTES, MFBLOCK_SIZE); - iso14a_mf_extdump_t xdump; - xdump.card_info = card; - xdump.dump = mem; - xdump.dumplen = MIFARE_4K_MAX_BYTES; - saveFileJSON(data_fn, jsfCardMemory, (uint8_t *)&xdump, sizeof(xdump), NULL); -*/ + iso14a_mf_extdump_t xdump; + xdump.card_info = card; + xdump.dump = mem; + xdump.dumplen = MIFARE_4K_MAX_BYTES; + saveFileJSON(data_fn, jsfCardMemory, (uint8_t *)&xdump, sizeof(xdump), NULL); + */ free(mem); return PM3_SUCCESS; } diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index e17032507..9f7f54c53 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -1424,7 +1424,7 @@ static mfu_identify_t *mfu_match_fingerprint(uint8_t *version, uint8_t *data) { uint8_t mtmp[40] = {0}; param_gethex_to_eol(mfu_ident_table[i].match, 0, mtmp, sizeof(mtmp), &ml); - bool m2 = (memcmp(mtmp, data + mfu_ident_table[i].mpos, mfu_ident_table[i].mlen) == 0); + bool m2 = (memcmp(mtmp, data + mfu_ident_table[i].mpos, mfu_ident_table[i].mlen) == 0); if (m2) { PrintAndLogEx(DEBUG, "(fingerprint) found %s", mfu_ident_table[i].desc); return &mfu_ident_table[i]; @@ -3608,7 +3608,7 @@ static int CmdHF14AMfUPwdGen(const char *Cmd) { if (ul_select(&card)) { // Philips toothbrush needs page 0x21-0x23 uint8_t data[16] = {0x00}; - int status = ul_read(0x21, data, sizeof(data)); + int status = ul_read(0x21, data, sizeof(data)); if (status == -1) { PrintAndLogEx(DEBUG, "Error: tag didn't answer to READ"); } else if (status == 16) { diff --git a/client/src/cmdhftopaz.c b/client/src/cmdhftopaz.c index 766889438..4483e3154 100644 --- a/client/src/cmdhftopaz.c +++ b/client/src/cmdhftopaz.c @@ -224,7 +224,7 @@ static int topaz_write_erase8_block(uint8_t blockno, uint8_t *block_data) { uint16_t resp_len = 11; uint8_t response[11] = {0}; - // + // if (topaz_send_cmd(wr8_cmd, sizeof(wr8_cmd), response, &resp_len, true) == PM3_ETIMEOUT) { topaz_switch_off_field(); @@ -267,12 +267,12 @@ static int topaz_write_nonerase8_block(uint8_t blockno, uint8_t *block_data) { return res; } - // ADD + // ADD // 7 6 5 4 3 2 1 0 // b b b --- Byte 0 - 7 - // B B B B --------- BLOCK + // B B B B --------- BLOCK // r ----------------- 0 - // + // uint8_t wr8_cmd[] = {TOPAZ_WRITE_NE8, blockno, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; memcpy(wr8_cmd + 10, uid_echo, 4); @@ -281,7 +281,7 @@ static int topaz_write_nonerase8_block(uint8_t blockno, uint8_t *block_data) { uint16_t resp_len = 11; uint8_t response[11] = {0}; - // + // if (topaz_send_cmd(wr8_cmd, sizeof(wr8_cmd), response, &resp_len, true) == PM3_ETIMEOUT) { topaz_switch_off_field(); return PM3_ESOFT; @@ -883,7 +883,7 @@ static int CmdHFTopazDump(const char *Cmd) { if (nosave) { PrintAndLogEx(INFO, "Called with no save option"); if (set_dynamic) { - free(topaz_tag.dynamic_memory); + free(topaz_tag.dynamic_memory); } return PM3_SUCCESS; } @@ -1034,7 +1034,7 @@ static int CmdHFTopazWrBl(const char *Cmd) { PrintAndLogEx(INFO, "Block: %0d (0x%02X) [ %s]", blockno, blockno, sprint_hex(data, dlen)); int res; - if (blockno != 13 && blockno != 14) { + if (blockno != 13 && blockno != 14) { // send write/erase block res = topaz_write_erase8_block(blockno, data); } else { diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index c2e750623..323c7ef7e 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -571,9 +571,9 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr //2 Not crc-command // Draw the data column - #define TRACE_MAX_LINES 36 +#define TRACE_MAX_LINES 36 // number of hex bytes to be printed per row (16 data + 2 crc) - #define TRACE_MAX_HEX_BYTES 18 +#define TRACE_MAX_HEX_BYTES 18 char line[TRACE_MAX_LINES][160] = {{0}}; @@ -700,8 +700,8 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr // mark short bytes (less than 8 Bit + Parity) if (protocol == ISO_14443A || - protocol == PROTO_MIFARE || - protocol == THINFILM) { + protocol == PROTO_MIFARE || + protocol == THINFILM) { // approximated with 128 * (9 * data_len); uint16_t bitime = 1056 + 32; @@ -874,13 +874,13 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr } else { - if (last_line && (memcmp(crc, "\x20\x20\x20\x20", 4) != 0) && g_session.supports_colors && markCRCBytes) { + if (last_line && (memcmp(crc, "\x20\x20\x20\x20", 4) != 0) && g_session.supports_colors && markCRCBytes) { str_padder = 85; // odd case of multiline, and last single byte on empty row has been colorised... if (strlen(line[j]) < 14) { str_padder = 81; } - } + } if (hdr->isResponse) { PrintAndLogEx(NORMAL, " | | |%-*s | %s| %s", @@ -909,7 +909,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr annotateIso14443a(explanation, sizeof(explanation), mfData, mfDataLen, hdr->isResponse); uint8_t crcc = iso14443A_CRC_check(hdr->isResponse, mfData, mfDataLen); - //iceman: colorise crc bytes here will need a refactor of code from above. + //iceman: colorise crc bytes here will need a refactor of code from above. PrintAndLogEx(NORMAL, " | | * |%-*s | %-4s| %s", str_padder, sprint_hex_inrow_spaces(mfData, mfDataLen, 2), diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 917a7ee77..4dba2c1e4 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -1313,7 +1313,7 @@ int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, siz // memcpy(vdata, udata.bytes + (14 + atslen), 2 * 64 * 17); for (size_t i = 0; i < 64; i++) { - + if ((sptr + (AES_KEY_LEN * 2)) > maxdatalen) { break; } diff --git a/client/src/mifare/mad.c b/client/src/mifare/mad.c index 42a05c5a2..54f67a6a4 100644 --- a/client/src/mifare/mad.c +++ b/client/src/mifare/mad.c @@ -333,19 +333,19 @@ int MAD1DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose, bool *haveMA for (int i = 1; i < 16; i++) { uint16_t aid = madGetAID(sector, swapmad, 1, i); if (aid < 6) { - PrintAndLogEx(INFO, - (ibs == i) ? _MAGENTA_(" %02d [%04X] %s") : " %02d [" _GREEN_("%04X") "] %s", - i, - aid, - aid_admin[aid] - ); + PrintAndLogEx(INFO, + (ibs == i) ? _MAGENTA_(" %02d [%04X] %s") : " %02d [" _GREEN_("%04X") "] %s", + i, + aid, + aid_admin[aid] + ); } else if (prev_aid == aid) { - PrintAndLogEx(INFO, - (ibs == i) ? _MAGENTA_(" %02d [%04X] continuation") : " %02d [" _YELLOW_("%04X") "] continuation", - i, - aid - ); + PrintAndLogEx(INFO, + (ibs == i) ? _MAGENTA_(" %02d [%04X] continuation") : " %02d [" _YELLOW_("%04X") "] continuation", + i, + aid + ); } else { char fmt[60]; snprintf(fmt, sizeof(fmt), (ibs == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [" _GREEN_("%04X") "]%s", i, aid, "%s"); @@ -368,7 +368,7 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { if (res == PM3_SUCCESS) PrintAndLogEx(SUCCESS, "CRC8...... 0x%02X ( " _GREEN_("%s") " )", sector[0], "ok"); else - PrintAndLogEx(SUCCESS, "CRC8...... 0x%02X ( " _RED_("%s") " )", sector[0], "fail"); + PrintAndLogEx(SUCCESS, "CRC8...... 0x%02X ( " _RED_("%s") " )", sector[0], "fail"); } int ibs = MADInfoByteDecode(sector, swapmad, 2, verbose); @@ -387,18 +387,18 @@ int MAD2DecodeAndPrint(uint8_t *sector, bool swapmad, bool verbose) { for (int i = 1; i < 8 + 8 + 7 + 1; i++) { uint16_t aid = madGetAID(sector, swapmad, 2, i); if (aid < 6) { - PrintAndLogEx(INFO, - (ibs == i) ? _MAGENTA_(" %02d [%04X] %s") : " %02d [" _GREEN_("%04X") "] %s", - i + 16, - aid, - aid_admin[aid] - ); + PrintAndLogEx(INFO, + (ibs == i) ? _MAGENTA_(" %02d [%04X] %s") : " %02d [" _GREEN_("%04X") "] %s", + i + 16, + aid, + aid_admin[aid] + ); } else if (prev_aid == aid) { - PrintAndLogEx(INFO, - (ibs == i) ? _MAGENTA_(" %02d [%04X] continuation") : " %02d [" _YELLOW_("%04X") "] continuation", - i + 16, - aid - ); + PrintAndLogEx(INFO, + (ibs == i) ? _MAGENTA_(" %02d [%04X] continuation") : " %02d [" _YELLOW_("%04X") "] continuation", + i + 16, + aid + ); } else { char fmt[60]; snprintf(fmt, sizeof(fmt), (ibs == i) ? _MAGENTA_(" %02d [%04X]%s") : " %02d [" _GREEN_("%04X") "]%s", i + 16, aid, "%s"); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index ffe9c66ff..ffad57057 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -367,17 +367,21 @@ const static vocabulory_t vocabulory[] = { { 0, "hf mf ndefread" }, { 0, "hf mf ndefwrite" }, { 1, "hf mfp help" }, - { 0, "hf mfp info" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp commitp" }, + { 1, "hf mfp list" }, { 0, "hf mfp auth" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp dump" }, + { 0, "hf mfp info" }, + { 0, "hf mfp mad" }, { 0, "hf mfp rdbl" }, { 0, "hf mfp rdsc" }, { 0, "hf mfp wrbl" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp mad" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp ndefformat" }, { 0, "hf mfp ndefread" }, + { 0, "hf mfp ndefwrite" }, { 1, "hf mfu help" }, { 1, "hf mfu keygen" }, { 1, "hf mfu pwdgen" }, @@ -461,14 +465,14 @@ const static vocabulory_t vocabulory[] = { { 1, "hf thinfilm list" }, { 0, "hf thinfilm sim" }, { 1, "hf topaz help" }, - { 0, "hf topaz dump" }, { 1, "hf topaz list" }, + { 0, "hf topaz dump" }, { 0, "hf topaz info" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, { 0, "hf topaz reader" }, { 0, "hf topaz sim" }, { 0, "hf topaz sniff" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, { 1, "hf topaz view" }, { 0, "hf topaz wrbl" }, { 1, "hf xerox help" }, diff --git a/common/crc16.c b/common/crc16.c index d402977b9..812cd3481 100644 --- a/common/crc16.c +++ b/common/crc16.c @@ -354,4 +354,4 @@ uint16_t crc16_legic(uint8_t const *d, size_t n, uint8_t uidcrc) { uint16_t crc16_philips(uint8_t const *d, size_t n) { return crc16_fast(d, n, 0x49A3, false, false); -} \ No newline at end of file +} diff --git a/doc/commands.json b/doc/commands.json index efb03edd2..7a19db4f2 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -3966,14 +3966,16 @@ "command": "hf mf auth4", "description": "Executes AES authentication command in ISO14443-4", "notes": [ - "hf mf auth4 4000 000102030405060708090a0b0c0d0e0f -> executes authentication", - "hf mf auth4 9003 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> executes authentication" + "hf mf auth4 -n 4000 -k 000102030405060708090a0b0c0d0e0f -> executes authentication", + "hf mf auth4 -n 9003 -k FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -> executes authentication" ], "offline": false, "options": [ - "-h, --help This help" + "-h, --help This help", + "-n key num, 2 hex bytes", + "-k, --key key, 16 hex bytes" ], - "usage": "hf mf auth4 [-h] " + "usage": "hf mf auth4 [-h] -n -k " }, "hf mf autopwn": { "command": "hf mf autopwn", @@ -4655,14 +4657,14 @@ "options": [ "-h, --help This help", "-v, --verbose show technical data", - "--aid print all sectors with specified aid", - "-k, --key key for printing sectors", + "--aid print all sectors with specified aid", + "-k, --key key for printing sectors", "-b, --keyb use key B for access printing sectors (by default: key A)", "--be (optional, BigEndian)", "--dch decode Card Holder information", "-f, --file load dump file and decode MAD" ], - "usage": "hf mf mad [-hvb] [--aid ] [-k ] [--be] [--dch] [-f ]" + "usage": "hf mf mad [-hvb] [--aid ] [-k ] [--be] [--dch] [-f ]" }, "hf mf nack": { "command": "hf mf nack", @@ -4784,7 +4786,8 @@ "command": "hf mf rdbl", "description": "Read MIFARE Classic block", "notes": [ - "hf mf rdbl --blk 0 -k FFFFFFFFFFFF", + "hf mf rdbl --blk 0", + "hf mf rdbl --blk 0 -k A0A1A2A3A4A5", "hf mf rdbl --blk 3 -v -> get block 3, decode sector trailer" ], "offline": false, @@ -4802,7 +4805,8 @@ "command": "hf mf rdsc", "description": "Read MIFARE Classic sector", "notes": [ - "hf mf rdsc -s 0 -k FFFFFFFFFFFF" + "hf mf rdsc -s 0", + "hf mf rdsc -s 0 -k A0A1A2A3A4A5" ], "offline": false, "options": [ @@ -4906,9 +4910,10 @@ "options": [ "-h, --help This help", "-r, --reset Reset card", - "-u, --uid New UID (4 hex bytes)" + "-u, --uid New UID (4 hex bytes)", + "--furui Furui detection card" ], - "usage": "hf mf supercard [-hr] [-u ]" + "usage": "hf mf supercard [-hr] [-u ] [--furui]" }, "hf mf value": { "command": "hf mf value", @@ -4976,7 +4981,8 @@ "command": "hf mf wrbl", "description": "Write MIFARE Classic block with 16 hex bytes of data Sector 0 / Block 0 - Manufacturer block When writing to block 0 you must use a VALID block 0 data (UID, BCC, SAK, ATQA) Writing an invalid block 0 means rendering your Magic GEN2 card undetectable. Look in the magic_cards_notes.md file for help to resolve it. `--force` param is used to override warnings like bad ACL and BLOCK 0 writes. if not specified, it will exit if detected", "notes": [ - "hf mf wrbl --blk 1 -k FFFFFFFFFFFF -d 000102030405060708090a0b0c0d0e0f" + "hf mf wrbl --blk 1 -d 000102030405060708090a0b0c0d0e0f", + "hf mf wrbl --blk 1 -k A0A1A2A3A4A5 -d 000102030405060708090a0b0c0d0e0f" ], "offline": false, "options": [ @@ -6126,7 +6132,7 @@ }, "hf mfp auth": { "command": "hf mfp auth", - "description": "Executes AES authentication command for Mifare Plus card", + "description": "Executes AES authentication command for MIFARE Plus card", "notes": [ "hf mfp auth --ki 4000 --key 000102030405060708090a0b0c0d0e0f -> executes authentication", "hf mfp auth --ki 9003 --key FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -v -> executes authentication and shows all the system data" @@ -6145,9 +6151,9 @@ "description": "Checks keys on MIFARE Plus card", "notes": [ "hf mfp chk -k 000102030405060708090a0b0c0d0e0f -> check key on sector 0 as key A and B", - "hf mfp chk -s 2 -a -> check default key list on sector 2, key A", + "hf mfp chk -s 2 -a -> check default key list on sector 2, only key A", "hf mfp chk -d mfp_default_keys -s0 -e6 -> check keys from dictionary against sectors 0-6", - "hf mfp chk --pattern1b -j keys -> check all 1-byte keys pattern and save found keys to json", + "hf mfp chk --pattern1b --dump -> check all 1-byte keys pattern and save found keys to file", "hf mfp chk --pattern2b --startp2b FA00 -> check all 2-byte keys pattern. Start from key FA00FA00...FA00" ], "offline": false, @@ -6162,10 +6168,10 @@ "--pattern1b Check all 1-byte combinations of key (0000...0000, 0101...0101, 0202...0202, ...)", "--pattern2b Check all 2-byte combinations of key (0000...0000, 0001...0001, 0002...0002, ...)", "--startp2b Start key (2-byte HEX) for 2-byte search (use with `--pattern2b`)", - "-j, --json Json filename to save keys", + "--dump Dump found keys to JSON file", "-v, --verbose Verbose mode" ], - "usage": "hf mfp chk [-habv] [-s <0..255>] [-e <0..255>] [-k ] [-d ] [--pattern1b] [--pattern2b] [--startp2b ] [-j ]" + "usage": "hf mfp chk [-habv] [-s <0..255>] [-e <0..255>] [-k ] [-d ] [--pattern1b] [--pattern2b] [--startp2b ] [--dump]" }, "hf mfp commitp": { "command": "hf mfp commitp", @@ -6180,9 +6186,26 @@ ], "usage": "hf mfp commitp [-hv]" }, + "hf mfp dump": { + "command": "hf mfp dump", + "description": "Dump MIFARE Plus tag to binary file If no given, UID will be used as filename", + "notes": [ + "hf mfp dump", + "hf mfp dump --keys hf-mf-066C8B78-key.bin -> MIFARE Plus with keys from specified file" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-f, --file filename of dump", + "-k, --keys filename of keys", + "--ns no save to file", + "-v, --verbose Verbose mode" + ], + "usage": "hf mfp dump [-hv] [-f ] [-k ] [--ns]" + }, "hf mfp help": { "command": "hf mfp help", - "description": "help This help", + "description": "help This help list List MIFARE Plus history", "notes": [], "offline": true, "options": [], @@ -6215,9 +6238,30 @@ ], "usage": "hf mfp initp [-hv] [-k ]" }, + "hf mfp list": { + "command": "hf mfp list", + "description": "Alias of `trace list -t mf` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "notes": [ + "hf mf list --frame -> show frame delay times", + "hf mf list -1 -> use trace buffer" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-1, --buffer use data from trace buffer", + "--frame show frame delay times", + "-c mark CRC bytes", + "-r show relative times (gap and duration)", + "-u display times in microseconds instead of clock cycles", + "-x show hexdump to convert to pcap(ng)", + "or to import into Wireshark using encapsulation type \"ISO 14443\"", + "-f, --file filename of dictionary" + ], + "usage": "hf mf list [-h1crux] [--frame] [-f ]" + }, "hf mfp mad": { "command": "hf mfp mad", - "description": "Checks and prints Mifare Application Directory (MAD)", + "description": "Checks and prints MIFARE Application Directory (MAD)", "notes": [ "hf mfp mad", "hf mfp mad --aid e103 -k d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 -> read and print NDEF data from MAD aid" @@ -6234,6 +6278,14 @@ ], "usage": "hf mfp mad [-hvb] [--aid ] [-k ] [--be] [--dch]" }, + "hf mfp ndefformat": { + "command": "hf mfp ndefformat", + "description": "format MIFARE Plus Tag as a NFC tag with Data Exchange Format (NDEF) If no given, UID will be used as filename. It will try default keys and MAD keys to detect if tag is already formatted in order to write.", + "notes": [], + "offline": false, + "options": [], + "usage": "" + }, "hf mfp ndefread": { "command": "hf mfp ndefread", "description": "Prints NFC Data Exchange Format (NDEF)", @@ -6254,9 +6306,27 @@ ], "usage": "hf mfp ndefread [-hvb] [--aid ] [-k ] [-f ]" }, + "hf mfp ndefwrite": { + "command": "hf mfp ndefwrite", + "description": "Write raw NDEF hex bytes to tag. This commands assumes tag already been NFC/NDEF formatted.", + "notes": [ + "hf mfp ndefwrite -d 0300FE -> write empty record to tag", + "hf mfp ndefwrite -f myfilename", + "hf mfp ndefwrite -d 033fd1023a53709101195405656e2d55534963656d616e2054776974746572206c696e6b5101195502747769747465722e636f6d2f686572726d616e6e31303031" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-d raw NDEF hex bytes", + "-f, --file write raw NDEF file to tag", + "-p fix NDEF record headers / terminator block if missing", + "-v, --verbose verbose output" + ], + "usage": "hf mfp ndefwrite [-hpv] [-d ] [-f ]" + }, "hf mfp rdbl": { "command": "hf mfp rdbl", - "description": "Reads several blocks from Mifare Plus card", + "description": "Reads blocks from MIFARE Plus card", "notes": [ "hf mfp rdbl --blk 0 --key 000102030405060708090a0b0c0d0e0f -> executes authentication and read block 0 data", "hf mfp rdbl --blk 1 -v -> executes authentication and shows sector 1 data with default key 0xFF..0xFF" @@ -6293,7 +6363,7 @@ }, "hf mfp wrbl": { "command": "hf mfp wrbl", - "description": "Writes one block to Mifare Plus card", + "description": "Writes one block to MIFARE Plus card", "notes": [ "hf mfp wrbl --blk 1 -d ff0000000000000000000000000000ff --key 000102030405060708090a0b0c0d0e0f -> write block 1 data", "hf mfp wrbl --blk 2 -d ff0000000000000000000000000000ff -v -> write block 2 data with default key 0xFF..0xFF" @@ -7024,9 +7094,10 @@ "offline": false, "options": [ "-h, --help This help", - "-f, --file filename of dump" + "-f, --file filename of dump", + "--ns no save to file" ], - "usage": "hf topaz dump [-h] [-f ]" + "usage": "hf topaz dump [-h] [-f ] [--ns]" }, "hf topaz help": { "command": "hf topaz help", @@ -7086,16 +7157,16 @@ }, "hf topaz rdbl": { "command": "hf topaz rdbl", - "description": "Read a block", + "description": "Read Topaz block", "notes": [ - "hf topaz rdbl -b 7" + "hf topaz rdbl --blk 7" ], "offline": false, "options": [ "-h, --help This help", - "-b, --block Block number to write" + "--blk Block number" ], - "usage": "hf topaz rdbl [-h] -b " + "usage": "hf topaz rdbl [-h] --blk " }, "hf topaz reader": { "command": "hf topaz reader", @@ -7151,17 +7222,17 @@ }, "hf topaz wrbl": { "command": "hf topaz wrbl", - "description": "Write a block", + "description": "Write Topaz block with 8 hex bytes of data", "notes": [ - "hf topaz wrbl -b 7 -d 1122334455667788" + "hf topaz wrbl --blk 7 -d 1122334455667788" ], "offline": false, "options": [ "-h, --help This help", - "-b, --block Block number to write", + "--blk Block number", "-d, --data Block data (8 hex bytes)" ], - "usage": "hf topaz wrbl [-h] -b -d " + "usage": "hf topaz wrbl [-h] --blk -d " }, "hf tune": { "command": "hf tune", @@ -12022,9 +12093,8 @@ } }, "metadata": { - "commands_extracted": 755, + "commands_extracted": 759, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-06-04T15:36:56" - + "extracted_on": "2023-06-24T15:16:04" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 938413fa8..a27cf6964 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -538,17 +538,21 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`hf mfp help `|Y |`This help` -|`hf mfp info `|N |`Info about Mifare Plus tag` -|`hf mfp wrp `|N |`Write Perso command` -|`hf mfp initp `|N |`Fill all the card's keys in SL0 mode` -|`hf mfp commitp `|N |`Move card to SL1 or SL3 mode` +|`hf mfp list `|Y |`List MIFARE Plus history` |`hf mfp auth `|N |`Authentication` -|`hf mfp rdbl `|N |`Read blocks` -|`hf mfp rdsc `|N |`Read sectors` -|`hf mfp wrbl `|N |`Write blocks` |`hf mfp chk `|N |`Check keys` +|`hf mfp dump `|N |`Dump MIFARE Plus tag to binary file` +|`hf mfp info `|N |`Info about MIFARE Plus tag` |`hf mfp mad `|N |`Check and print MAD` +|`hf mfp rdbl `|N |`Read blocks from card` +|`hf mfp rdsc `|N |`Read sectors from card` +|`hf mfp wrbl `|N |`Write block to card` +|`hf mfp commitp `|N |`Configure security layer (SL1/SL3 mode)` +|`hf mfp initp `|N |`Fill all the card's keys in SL0 mode` +|`hf mfp wrp `|N |`Write Perso command` +|`hf mfp ndefformat `|N |`Format MIFARE Plus Tag as NFC Tag` |`hf mfp ndefread `|N |`Read and print NDEF records from card` +|`hf mfp ndefwrite `|N |`Write NDEF records to card` ### hf mfu @@ -704,14 +708,14 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`hf topaz help `|Y |`This help` -|`hf topaz dump `|N |`Dump TOPAZ family tag to file` |`hf topaz list `|Y |`List Topaz history` +|`hf topaz dump `|N |`Dump TOPAZ family tag to file` |`hf topaz info `|N |`Tag information` +|`hf topaz raw `|N |`Send raw hex data to tag` +|`hf topaz rdbl `|N |`Read block` |`hf topaz reader `|N |`Act like a Topaz reader` |`hf topaz sim `|N |`Simulate Topaz tag` |`hf topaz sniff `|N |`Sniff Topaz reader-tag communication` -|`hf topaz raw `|N |`Send raw hex data to tag` -|`hf topaz rdbl `|N |`Read block` |`hf topaz view `|Y |`Display content from tag dump file` |`hf topaz wrbl `|N |`Write block` From fe204d852906490ecbc25f22538a1a383ee8b33e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 17:28:43 +0200 Subject: [PATCH 557/924] text --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e0c9af78..63c3e2ac6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Changed `hf topaz dump --ns` - now supports nosave param (@iceman1001) + - Added `hf mf supercard --furui` - now supports key recovery from Furui detection card. Thanks foxushka! (@iceman1001) + - Added `hf topaz dump --ns` - now supports nosave param (@iceman1001) - Changed `hf topaz rdbl` - unified output (@iceman1001) - Fixed `hf topaz wrbl` - now supports tear off and write_nonerase command (@iceman1001) - Fixed `hf mf` commands (@iceman1001) From a43d8ea9e05b872ba2b3a5db946bae7c6dc99ef5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 22:01:10 +0200 Subject: [PATCH 558/924] adapted viewing MFC dump files to also colorize ACL + GPB bytes --- CHANGELOG.md | 1 + client/src/cmdhfmf.c | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63c3e2ac6..1af068e19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Change viewing MFC dump files - it now colors ACL + GPB bytes (@iceman1001) - Added `hf mf supercard --furui` - now supports key recovery from Furui detection card. Thanks foxushka! (@iceman1001) - Added `hf topaz dump --ns` - now supports nosave param (@iceman1001) - Changed `hf topaz rdbl` - unified output (@iceman1001) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 765c515e4..fcf898a42 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -251,7 +251,27 @@ static void mf_print_block(uint8_t blockno, uint8_t *d, bool verbose) { if (blockno == 0) { PrintAndLogEx(INFO, "%s| %3d | " _RED_("%s"), secstr, blockno, sprint_hex_ascii(d, MFBLOCK_SIZE)); } else if (mfIsSectorTrailer(blockno)) { - PrintAndLogEx(INFO, "%s| %3d | " _YELLOW_("%s"), secstr, blockno, sprint_hex_ascii(d, MFBLOCK_SIZE)); + + char keya[26] = {0}; + hex_to_buffer((uint8_t *)keya, d, MIFARE_KEY_SIZE, sizeof(keya) - 1, 0, 1, true); + + char acl[20] = {0}; + hex_to_buffer((uint8_t *)acl, d + MIFARE_KEY_SIZE, 4, sizeof(acl) - 1, 0, 1, true); + + char keyb[26] = {0}; + hex_to_buffer((uint8_t *)keyb, d + 10, MIFARE_KEY_SIZE, sizeof(keyb) - 1, 0, 1, true); + + char ascii[24] = {0}; + ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); + + PrintAndLogEx(INFO, "%s| %3d | " _YELLOW_("%s") _MAGENTA_("%s") _YELLOW_("%s") "| " _YELLOW_("%s"), + secstr, + blockno, + keya, + acl, + keyb, + ascii + ); } else { int32_t value = 0; if (verbose && mfc_value(d, &value)) { From 85f8234201716168d7f8017324124810c5730e48 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 22:24:27 +0200 Subject: [PATCH 559/924] fix wrong key file name --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index fcf898a42..795ae2b81 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -381,7 +381,7 @@ static int mf_save_keys_from_arr(uint16_t n, uint8_t *d) { } char fn[FILE_PATH_SIZE] = {0}; - snprintf(fn, sizeof(fn), "hf-mf-%s-keys", sprint_hex_inrow(d, 4)); + snprintf(fn, sizeof(fn), "hf-mf-%s-key", sprint_hex_inrow(d, 4)); saveFile(fn, ".bin", keys, keysize); free(keys); return PM3_SUCCESS; From 0f35e89f4e94b597aa6569fc0911cf579ce54bf7 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 23:03:43 +0200 Subject: [PATCH 560/924] data diff now prints filenames if they fit in the header. Spiff filenames and other params is untouched --- CHANGELOG.md | 3 ++- client/src/cmddata.c | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1af068e19..3c11a1112 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Change viewing MFC dump files - it now colors ACL + GPB bytes (@iceman1001) + - Changed `data diff` - to print filenames in header if it fits (@iceman1001) + - Changed viewing MFC dump files - it now colors ACL + GPB bytes (@iceman1001) - Added `hf mf supercard --furui` - now supports key recovery from Furui detection card. Thanks foxushka! (@iceman1001) - Added `hf topaz dump --ns` - now supports nosave param (@iceman1001) - Changed `hf topaz rdbl` - unified output (@iceman1001) diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 9524cbc63..e1bf655e4 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -2939,7 +2939,7 @@ static int CmdDiff(const char *Cmd) { // "data diff -a fileA --cb\n" "data diff --fa fileA -b fileB\n" "data diff --fa fileA --fb fileB\n" - "data diff --ea --cb\n" +// "data diff --ea --cb\n" ); void *argtable[] = { @@ -3082,11 +3082,20 @@ static int CmdDiff(const char *Cmd) { if (inB == NULL) PrintAndLogEx(INFO, "inB null"); - int hdr_sln = (width * 4) + 2; + int hdr_sln = (width * 4) + 2; + char hdr0[300] = {0}; - char hdr0[200] = " # | " _CYAN_("a"); - memset(hdr0 + strlen(hdr0), ' ', hdr_sln - 2); - strcat(hdr0 + strlen(hdr0), "| " _CYAN_("b")); + int max_fn_space = (width * 5); + + if (fnlenA && fnlenB && (max_fn_space > fnlenA) && (max_fn_space > fnlenB)) { + snprintf(hdr0, sizeof(hdr0) - 1, " # | " _CYAN_("%.*s"), max_fn_space, filenameA); + memset(hdr0 + strlen(hdr0), ' ', hdr_sln - strlen(filenameA) - 1 ); + snprintf(hdr0 + strlen(hdr0), sizeof(hdr0) - 1 - strlen(hdr0), "| " _CYAN_("%.*s"), max_fn_space, filenameB); + } else { + strcat(hdr0, " # | " _CYAN_("a")); + memset(hdr0 + strlen(hdr0), ' ', hdr_sln - 2); + strcat(hdr0 + strlen(hdr0), "| " _CYAN_("b")); + } char hdr1[200] = "----+"; memset(hdr1 + strlen(hdr1), '-', hdr_sln); From 043ff257c46a5dde86c51dd74a10015277e9f63a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 24 Jun 2023 23:28:31 +0200 Subject: [PATCH 561/924] style --- CHANGELOG.md | 1 + client/src/cmdhfmf.c | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c11a1112..bd302c2e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed viewing MFC dump - border char is now white (@iceman1001) - Changed `data diff` - to print filenames in header if it fits (@iceman1001) - Changed viewing MFC dump files - it now colors ACL + GPB bytes (@iceman1001) - Added `hf mf supercard --furui` - now supports key recovery from Furui detection card. Thanks foxushka! (@iceman1001) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 795ae2b81..1af32b558 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -226,10 +226,37 @@ bool mfc_value(const uint8_t *d, int32_t *val) { } void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose) { + if (blockno == 0) { - PrintAndLogEx(INFO, "%3d | " _RED_("%s"), blockno, sprint_hex_ascii(d, MFBLOCK_SIZE)); + char ascii[24] = {0}; + ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); + PrintAndLogEx(INFO, "%3d | " _RED_("%s") "| " _RED_("%s"), + blockno, + sprint_hex(d, MFBLOCK_SIZE), + ascii + ); } else if (mfIsSectorTrailer(blockno)) { - PrintAndLogEx(INFO, "%3d | " _YELLOW_("%s"), blockno, sprint_hex_ascii(d, MFBLOCK_SIZE)); + + char keya[26] = {0}; + hex_to_buffer((uint8_t *)keya, d, MIFARE_KEY_SIZE, sizeof(keya) - 1, 0, 1, true); + + char acl[20] = {0}; + hex_to_buffer((uint8_t *)acl, d + MIFARE_KEY_SIZE, 4, sizeof(acl) - 1, 0, 1, true); + + char keyb[26] = {0}; + hex_to_buffer((uint8_t *)keyb, d + 10, MIFARE_KEY_SIZE, sizeof(keyb) - 1, 0, 1, true); + + char ascii[24] = {0}; + ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); + + PrintAndLogEx(INFO, "%3d | " _YELLOW_("%s") _MAGENTA_("%s") _YELLOW_("%s") "| " _YELLOW_("%s"), + blockno, + keya, + acl, + keyb, + ascii + ); + } else { int32_t value = 0; if (verbose && mfc_value(d, &value)) { @@ -249,7 +276,15 @@ static void mf_print_block(uint8_t blockno, uint8_t *d, bool verbose) { } if (blockno == 0) { - PrintAndLogEx(INFO, "%s| %3d | " _RED_("%s"), secstr, blockno, sprint_hex_ascii(d, MFBLOCK_SIZE)); + char ascii[24] = {0}; + ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); + PrintAndLogEx(INFO, "%s| %3d | " _RED_("%s") "| " _RED_("%s"), + secstr, + blockno, + sprint_hex(d, MFBLOCK_SIZE), + ascii + ); + } else if (mfIsSectorTrailer(blockno)) { char keya[26] = {0}; From 9f87b6dd9c35da08a7ca59e11842dac2f717f712 Mon Sep 17 00:00:00 2001 From: The-SamminAter Date: Sat, 24 Jun 2023 17:19:46 -0700 Subject: [PATCH 562/924] Add ability to compile on iOS --- Makefile.defs | 14 +++++++++++++- client/CMakeLists.txt | 8 +++++++- client/Makefile | 8 +++++++- client/deps/hardnested/Makefile | 3 +++ client/experimental_lib/CMakeLists.txt | 8 +++++++- tools/mfd_aes_brute/Makefile | 3 +++ 6 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index bcbbaa67e..76409a37d 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -75,7 +75,15 @@ else endif ifeq ($(platform),Darwin) - USE_BREW ?= 1 + ifeq ($(shell uname -p),arm64) + # The platform is iOS + USE_BREW ?= 0 + # iOS refuses to compile unless this is set + export IPHONEOS_DEPLOYMENT_TARGET=11.0 + else + # M* macOS devices return arm + USE_BREW ?= 1 + endif USE_MACPORTS ?= 0 AR= /usr/bin/ar rcs RANLIB= /usr/bin/ranlib @@ -132,6 +140,10 @@ ifeq ($(shell expr $(CC_VERSION) \>= 10), 1) endif endif ifeq ($(platform),Darwin) + ifeq ($(shell uname -p),arm64) + # iOS will refuse to compile without the minimum target of iOS 11.0 + DEFCFLAGS += -mios-version-min=11.0 + endif # their readline has strict-prototype issues DEFCFLAGS += -Wno-strict-prototypes # some warnings about braced initializers on structs we want to ignore diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 3fd255997..9df0844b9 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -380,7 +380,13 @@ message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") if (APPLE) message(STATUS "Apple device detected.") set(ADDITIONAL_SRC ${PM3_ROOT}/client/src/util_darwin.h ${PM3_ROOT}/client/src/util_darwin.m ${ADDITIONAL_SRC}) - set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") + if (EXISTS /private/var/mobile) + message(STATUS "iOS detected.") + set(ADDITIONAL_LNK "-framework Foundation" "-framework UIKit") + else + message(STATUS "macOS detected.") + set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") + endif (EXISTS /private/var/mobile) endif (APPLE) if ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) diff --git a/client/Makefile b/client/Makefile index d0cee355e..d44e67011 100644 --- a/client/Makefile +++ b/client/Makefile @@ -434,7 +434,13 @@ LDFLAGS += $(MYLDFLAGS) PM3LDFLAGS = $(LDFLAGS) ifeq ($(platform),Darwin) - PM3LDFLAGS += -framework Foundation -framework AppKit + ifeq ($(shell uname -p),arm64) + # The platform is iOS + PM3LDFLAGS += -framework Foundation -framework UIKit + else + # M* macOS devices return arm + PM3LDFLAGS += -framework Foundation -framework AppKit + endif endif ################### diff --git a/client/deps/hardnested/Makefile b/client/deps/hardnested/Makefile index 1667e036f..badace7e5 100644 --- a/client/deps/hardnested/Makefile +++ b/client/deps/hardnested/Makefile @@ -22,6 +22,9 @@ endif ifneq ($(findstring aarch64, $(cpu_arch)), ) IS_SIMD_ARCH=arm64 endif +ifneq ($(findstring iP, $(cpu_arch)), ) + IS_SIMD_ARCH=arm64 +endif ifneq ($(IS_SIMD_ARCH), ) MULTIARCHSRCS = hardnested_bf_core.c hardnested_bitarray_core.c diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 2ac10f871..27ee198e1 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -380,7 +380,13 @@ message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") if (APPLE) message(STATUS "Apple device detected.") set(ADDITIONAL_SRC ${PM3_ROOT}/client/src/util_darwin.h ${PM3_ROOT}/client/src/util_darwin.m ${ADDITIONAL_SRC}) - set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") + if (EXISTS /private/var/mobile) + message(STATUS "iOS detected.") + set(ADDITIONAL_LNK "-framework Foundation" "-framework UIKit") + else + message(STATUS "macOS detected.") + set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") + endif (EXISTS /private/var/mobile) endif (APPLE) if ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) diff --git a/tools/mfd_aes_brute/Makefile b/tools/mfd_aes_brute/Makefile index cf2c457c6..d0df682f6 100644 --- a/tools/mfd_aes_brute/Makefile +++ b/tools/mfd_aes_brute/Makefile @@ -9,6 +9,9 @@ MYLDLIBS = -lcrypto cpu_arch = $(shell uname -m) ifneq ($(findstring arm64, $(cpu_arch)), ) MYCFLAGS += -mcpu=native +# iOS 'fun' +else ifneq ($(findstring iP, $(cpu_arch)), ) + MYCFLAGS += -mcpu=native else MYCFLAGS += -march=native endif From 60480d16ec59b741b069029fc01c0d0bd84fbb1d Mon Sep 17 00:00:00 2001 From: Sam <48739810+The-SamminAter@users.noreply.github.com> Date: Sat, 24 Jun 2023 17:49:26 -0700 Subject: [PATCH 563/924] Update CHANGELOG.md Signed-off-by: Sam <48739810+The-SamminAter@users.noreply.github.com> --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd302c2e8..a9a8cb1f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added support for compiling on iOS (@The-SamminAter) - Fixed viewing MFC dump - border char is now white (@iceman1001) - Changed `data diff` - to print filenames in header if it fits (@iceman1001) - Changed viewing MFC dump files - it now colors ACL + GPB bytes (@iceman1001) From de85b3c10cb24062b58d9ce4be57baf5242cad54 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 08:19:43 +0200 Subject: [PATCH 564/924] remove color from GPB --- client/src/cmdhfmf.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 1af32b558..16bb414fd 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -241,7 +241,7 @@ void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose) { hex_to_buffer((uint8_t *)keya, d, MIFARE_KEY_SIZE, sizeof(keya) - 1, 0, 1, true); char acl[20] = {0}; - hex_to_buffer((uint8_t *)acl, d + MIFARE_KEY_SIZE, 4, sizeof(acl) - 1, 0, 1, true); + hex_to_buffer((uint8_t *)acl, d + MIFARE_KEY_SIZE, 3, sizeof(acl) - 1, 0, 1, true); char keyb[26] = {0}; hex_to_buffer((uint8_t *)keyb, d + 10, MIFARE_KEY_SIZE, sizeof(keyb) - 1, 0, 1, true); @@ -249,10 +249,11 @@ void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose) { char ascii[24] = {0}; ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); - PrintAndLogEx(INFO, "%3d | " _YELLOW_("%s") _MAGENTA_("%s") _YELLOW_("%s") "| " _YELLOW_("%s"), + PrintAndLogEx(INFO, "%3d | " _YELLOW_("%s") _MAGENTA_("%s") "%02X " _YELLOW_("%s") "| " _YELLOW_("%s"), blockno, keya, acl, + d[9], keyb, ascii ); @@ -291,7 +292,7 @@ static void mf_print_block(uint8_t blockno, uint8_t *d, bool verbose) { hex_to_buffer((uint8_t *)keya, d, MIFARE_KEY_SIZE, sizeof(keya) - 1, 0, 1, true); char acl[20] = {0}; - hex_to_buffer((uint8_t *)acl, d + MIFARE_KEY_SIZE, 4, sizeof(acl) - 1, 0, 1, true); + hex_to_buffer((uint8_t *)acl, d + MIFARE_KEY_SIZE, 3, sizeof(acl) - 1, 0, 1, true); char keyb[26] = {0}; hex_to_buffer((uint8_t *)keyb, d + 10, MIFARE_KEY_SIZE, sizeof(keyb) - 1, 0, 1, true); @@ -299,11 +300,12 @@ static void mf_print_block(uint8_t blockno, uint8_t *d, bool verbose) { char ascii[24] = {0}; ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); - PrintAndLogEx(INFO, "%s| %3d | " _YELLOW_("%s") _MAGENTA_("%s") _YELLOW_("%s") "| " _YELLOW_("%s"), + PrintAndLogEx(INFO, "%s| %3d | " _YELLOW_("%s") _MAGENTA_("%s") "%02X " _YELLOW_("%s") "| " _YELLOW_("%s"), secstr, blockno, keya, acl, + d[9], keyb, ascii ); From 9b8316c1ddd99e2531730ca33475c969d8bdd68b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 09:04:45 +0200 Subject: [PATCH 565/924] fix cmakelists.txt for missing else --- client/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 9df0844b9..156959ba5 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -380,13 +380,15 @@ message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") if (APPLE) message(STATUS "Apple device detected.") set(ADDITIONAL_SRC ${PM3_ROOT}/client/src/util_darwin.h ${PM3_ROOT}/client/src/util_darwin.m ${ADDITIONAL_SRC}) + if (EXISTS /private/var/mobile) message(STATUS "iOS detected.") set(ADDITIONAL_LNK "-framework Foundation" "-framework UIKit") - else + else (EXISTS /private/var/mobile) message(STATUS "macOS detected.") set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") endif (EXISTS /private/var/mobile) + endif (APPLE) if ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) From 2b3f3240c67ff9fd18527c2d605674d52cacadca Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 09:07:43 +0200 Subject: [PATCH 566/924] fix incomplete else statement in cmakelists.txt --- client/experimental_lib/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 27ee198e1..c8a6bb02f 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -383,7 +383,7 @@ if (APPLE) if (EXISTS /private/var/mobile) message(STATUS "iOS detected.") set(ADDITIONAL_LNK "-framework Foundation" "-framework UIKit") - else + else (EXISTS /private/var/mobile) message(STATUS "macOS detected.") set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") endif (EXISTS /private/var/mobile) From d71eed325c7317996686fd58c0ee9156d9391207 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 12:42:34 +0200 Subject: [PATCH 567/924] appkit vs uikit detection --- client/CMakeLists.txt | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 156959ba5..8759c00f3 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -381,13 +381,21 @@ if (APPLE) message(STATUS "Apple device detected.") set(ADDITIONAL_SRC ${PM3_ROOT}/client/src/util_darwin.h ${PM3_ROOT}/client/src/util_darwin.m ${ADDITIONAL_SRC}) - if (EXISTS /private/var/mobile) - message(STATUS "iOS detected.") + find_library(UIKIT_LIBRARY UIKit) + if (NOT UIKIT_LIBRARY) + message(STATUS "UIKit.framework NOT found!") + else() + message(STATUS "UIKit.framework found! ${UIKIT_LIBRARY}") set(ADDITIONAL_LNK "-framework Foundation" "-framework UIKit") - else (EXISTS /private/var/mobile) - message(STATUS "macOS detected.") - set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") - endif (EXISTS /private/var/mobile) + endif() + + find_library(APPKIT_LIBRARY AppKit) + if (NOT APPKIT_LIBRARY) + message(STATUS "AppKit.framework NOT found!") + else() + message(STATUS "AppKit.framework found! ${APPKIT_LIBRARY}") + set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") + endif() endif (APPLE) From 9b69d7ddfaa7fae2bef165493bb96afe8b520f32 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 13:03:12 +0200 Subject: [PATCH 568/924] fix uikit and appkit detection in cmake --- client/experimental_lib/CMakeLists.txt | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index c8a6bb02f..60e7b4004 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -380,13 +380,23 @@ message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") if (APPLE) message(STATUS "Apple device detected.") set(ADDITIONAL_SRC ${PM3_ROOT}/client/src/util_darwin.h ${PM3_ROOT}/client/src/util_darwin.m ${ADDITIONAL_SRC}) - if (EXISTS /private/var/mobile) - message(STATUS "iOS detected.") + + find_library(UIKIT_LIBRARY UIKit) + if (NOT UIKIT_LIBRARY) + message(STATUS "UIKit.framework NOT found!") + else() + message(STATUS "UIKit.framework found! ${UIKIT_LIBRARY}") set(ADDITIONAL_LNK "-framework Foundation" "-framework UIKit") - else (EXISTS /private/var/mobile) - message(STATUS "macOS detected.") - set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") - endif (EXISTS /private/var/mobile) + endif() + + find_library(APPKIT_LIBRARY AppKit) + if (NOT APPKIT_LIBRARY) + message(STATUS "AppKit.framework NOT found!") + else() + message(STATUS "AppKit.framework found! ${APPKIT_LIBRARY}") + set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") + endif() + endif (APPLE) if ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) From a9f81a05b4e9b3933b9d4dd4344d41f6a264113d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 14:21:34 +0200 Subject: [PATCH 569/924] text --- client/src/cmdlfindala.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/client/src/cmdlfindala.c b/client/src/cmdlfindala.c index fa59894e1..1af21ec20 100644 --- a/client/src/cmdlfindala.c +++ b/client/src/cmdlfindala.c @@ -120,7 +120,7 @@ static void decodeHeden2L(uint8_t *bits) { if (bits[offset + 7]) cardnumber += 16384; if (bits[offset + 23]) cardnumber += 32768; - PrintAndLogEx(SUCCESS, " Heden-2L | %u", cardnumber); + PrintAndLogEx(SUCCESS, " Heden-2L...... %u", cardnumber); } // sending three times. Didn't seem to break the previous sim? @@ -301,10 +301,11 @@ int demodIndalaEx(int clk, int invert, int maxErr, bool verbose) { ); PrintAndLogEx(DEBUG, "two bit checksum... " _GREEN_("%1d%1d"), checksum >> 1 & 0x01, checksum & 0x01); + PrintAndLogEx(INFO, ""); PrintAndLogEx(SUCCESS, "Possible de-scramble patterns"); // This doesn't seem to line up with the hot-stamp numbers on any HID cards I have seen, but, leaving it alone since I do not know how those work. -MS - PrintAndLogEx(SUCCESS, " Printed | __%04d__ [0x%X]", p1, p1); - PrintAndLogEx(SUCCESS, " Internal ID | %" PRIu64, foo); + PrintAndLogEx(SUCCESS, " Printed....... __%04d__ ( 0x%X )", p1, p1); + PrintAndLogEx(SUCCESS, " Internal ID... %" PRIu64, foo); decodeHeden2L(g_DemodBuffer); } else { @@ -336,6 +337,7 @@ int demodIndalaEx(int clk, int invert, int maxErr, bool verbose) { PrintAndLogEx(DEBUG, "DEBUG: Indala - printing DemodBuffer"); printDemodBuff(0, false, false, false); } + PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } @@ -503,7 +505,7 @@ static int CmdIndalaDemodAlt(const char *Cmd) { showbits[bit] = '.' + bits[bit]; } showbits[bit + 1] = '\0'; - PrintAndLogEx(SUCCESS, "Partial UID | %s", showbits); + PrintAndLogEx(SUCCESS, "Partial UID... %s", showbits); return PM3_SUCCESS; } else { for (bit = 0; bit < uidlen; bit++) { @@ -528,7 +530,7 @@ static int CmdIndalaDemodAlt(const char *Cmd) { uid2 = (uid2 << 1) | 1; } } - PrintAndLogEx(SUCCESS, "UID | %s (%x%08x)", showbits, uid1, uid2); + PrintAndLogEx(SUCCESS, "UID... %s ( %x%08x )", showbits, uid1, uid2); } else { uint32_t uid3 = 0; uint32_t uid4 = 0; @@ -549,7 +551,7 @@ static int CmdIndalaDemodAlt(const char *Cmd) { else uid7 = (uid7 << 1) | 1; } - PrintAndLogEx(SUCCESS, "UID | %s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7); + PrintAndLogEx(SUCCESS, "UID... %s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7); } // Checking UID against next occurrences From 20814bc394398b374323eebe9e8c739bf5bb44a3 Mon Sep 17 00:00:00 2001 From: Iceman Date: Sun, 25 Jun 2023 14:27:59 +0200 Subject: [PATCH 570/924] Update README.md Signed-off-by: Iceman --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20416bdbb..9096c9559 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Iceman Fork - Proxmark3 a RFID / NFC project. +# Iceman Fork - Proxmark3 The Proxmark3 is the swiss-army tool of RFID, allowing for interactions with the vast majority of RFID tags on a global scale. Originally built by Jonathan Westhues, the device is now the goto tool for RFID Analysis for the enthusiast. Iceman repository is considered to be the pinnacle of features and functionality, enabling a huge range of extremely useful and convenient commands and LUA scripts to automate chip identification, penetration testing, and programming From 9b2657294ab9b3e0f22dac236938002cfccb63ac Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 14:51:51 +0200 Subject: [PATCH 571/924] adapt test for indala text changes --- tools/pm3_tests.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index 3320d9866..a8ed2a196 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -437,8 +437,7 @@ while true; do if ! CheckExecute slow "lf T55 hid_48 test2" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_hid_48.pm3; lf hid demod'" \ "HID Corporate 1000 48-bit"; then break; fi if ! CheckExecute slow "lf T55 indala_hedem test" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_indala_hedem.pm3; lf search -1'" "Indala ID found"; then break; fi - if ! CheckExecute slow "lf T55 indala_hedem test2" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_indala_hedem.pm3; lf indala demod'" \ - "Heden-2L \| 888"; then break; fi + if ! CheckExecute slow "lf T55 indala_hedem test2" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_indala_hedem.pm3; lf indala demod'" "Heden-2L...... 888"; then break; fi if ! CheckExecute slow "lf T55 indala test" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_indala.pm3; lf search -1'" "Indala ID found"; then break; fi if ! CheckExecute slow "lf T55 indala test2" "$CLIENTBIN -c 'data load -f traces/lf_ATA5577_indala.pm3; lf indala demod'" \ "Fmt 26 FC: 123 Card: 1337 Parity: 11"; then break; fi From d40a89b27b63f760465f59cbe0739a000ea1da3c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 16:22:39 +0200 Subject: [PATCH 572/924] improve the ecfill function used in autopwn among others. Lessen failed auth/reads by skipping s 16,17 using key A for MFC EV1 cards --- armsrc/mifarecmd.c | 117 ++++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 43 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 7a5abf2c8..bc9a38971 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2302,64 +2302,98 @@ int MifareECardLoadExt(uint8_t sectorcnt, uint8_t keytype) { int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { - uint32_t cuid = 0; - struct Crypto1State mpcs = {0, 0}; - struct Crypto1State *pcs; - pcs = &mpcs; - - // variables - uint8_t dataoutbuf[16] = {0x00}; - uint8_t dataoutbuf2[16] = {0x00}; - uint8_t uid[10] = {0x00}; - LED_A_ON(); iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); clear_trace(); set_tracing(true); + // variables + bool have_uid = false; + uint8_t cascade_levels = 0; + uint32_t cuid = 0; + uint8_t uid[10] = {0x00}; + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs; + pcs = &mpcs; + int retval = PM3_SUCCESS; - if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { - retval = PM3_ESOFT; - if (g_dbglevel > DBG_ERROR) Dbprintf("Can't select card"); - goto out; - } + for (uint8_t s = 0; s < sectorcnt; s++) { + uint64_t ui64Key = emlGetKey(s, keytype); - for (uint8_t sectorNo = 0; sectorNo < sectorcnt; sectorNo++) { - uint64_t ui64Key = emlGetKey(sectorNo, keytype); - if (sectorNo == 0) { - if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keytype, ui64Key, AUTH_FIRST)) { - retval = PM3_EPARTIAL; - if (g_dbglevel > DBG_ERROR) Dbprintf("Sector[%2d]. Auth error", sectorNo); + // MFC 1K EV1 sector 16,17 don't use key A. + if ((sectorcnt == 18) && (keytype == 0) && s > 15) { + continue; + } + + // use fast select + if (have_uid == false) { // need a full select cycle to get the uid first + iso14a_card_select_t card_info; + if (iso14443a_select_card(uid, &card_info, &cuid, true, 0, true) == 0) { continue; } - } else { - if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keytype, ui64Key, AUTH_NESTED)) { - retval = PM3_EPARTIAL; - if (g_dbglevel > DBG_ERROR) Dbprintf("Sector[%2d]. Auth nested error", sectorNo); + + switch (card_info.uidlen) { + case 4 : + cascade_levels = 1; + break; + case 7 : + cascade_levels = 2; + break; + case 10: + cascade_levels = 3; + break; + default: + break; + } + have_uid = true; + } else { // no need for anticollision. We can directly select the card + if (iso14443a_fast_select_card(uid, cascade_levels) == 0) { continue; } } - for (uint8_t blockNo = 0; blockNo < NumBlocksPerSector(sectorNo); blockNo++) { - if (mifare_classic_readblock(pcs, cuid, FirstBlockOfSector(sectorNo) + blockNo, dataoutbuf)) { - retval = PM3_EPARTIAL; - - if (g_dbglevel > DBG_ERROR) Dbprintf("Error reading sector %2d block %2d", sectorNo, blockNo); - continue; + // Auth + if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(s), keytype, ui64Key, AUTH_FIRST)) { + retval = PM3_EPARTIAL; + if (g_dbglevel > DBG_ERROR) { + Dbprintf("Sector %2d - Auth error", s); } + continue; + } - if (memcmp(dataoutbuf, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16) == 0) { - continue; - } +#define MAX_RETRIES 2 - if (blockNo < NumBlocksPerSector(sectorNo) - 1) { - emlSetMem(dataoutbuf, FirstBlockOfSector(sectorNo) + blockNo, 1); - } else { // sector trailer, keep the keys, set only the AC - emlGetMem(dataoutbuf2, FirstBlockOfSector(sectorNo) + blockNo, 1); - memcpy(dataoutbuf2 + 6, dataoutbuf + 6, 4); - emlSetMem(dataoutbuf2, FirstBlockOfSector(sectorNo) + blockNo, 1); + uint8_t data[16] = {0x00}; + for (uint8_t b = 0; b < NumBlocksPerSector(s); b++) { + + memset(data, 0x00, sizeof(data)); + + for (uint8_t r = 0; r < MAX_RETRIES; r++) { + + if (mifare_classic_readblock(pcs, cuid, FirstBlockOfSector(s) + b, data)) { + retval |= PM3_EPARTIAL; + if (g_dbglevel > DBG_ERROR) { + Dbprintf("Error reading sector %2d block %2d", s, b); + } + continue; + } + + // No need to copy empty + if (memcmp(data, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16) == 0) { + continue; + } + + if (b < NumBlocksPerSector(s) - 1) { + emlSetMem(data, FirstBlockOfSector(s) + b, 1); + } else { + // sector trailer, keep the keys, set only the AC + uint8_t st[16] = {0x00}; + emlGetMem(st, FirstBlockOfSector(s) + b, 1); + memcpy(st + 6, data + 6, 4); + emlSetMem(st, FirstBlockOfSector(s) + b, 1); + } } } } @@ -2367,9 +2401,6 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { int res = mifare_classic_halt(pcs, cuid); (void)res; - if (g_dbglevel >= DBG_INFO) DbpString("Emulator fill sectors finished"); - -out: crypto1_deinit(pcs); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); From f64f5385192327f67aef5afe0480180bfb5fba72 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 22:30:58 +0200 Subject: [PATCH 573/924] style --- armsrc/mifarecmd.c | 4 ++-- client/src/cmddata.c | 4 ++-- client/src/cmdhfmf.c | 48 ++++++++++++++++++++++---------------------- doc/commands.json | 5 ++--- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index bc9a38971..4492c3195 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2357,7 +2357,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { // Auth if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(s), keytype, ui64Key, AUTH_FIRST)) { retval = PM3_EPARTIAL; - if (g_dbglevel > DBG_ERROR) { + if (g_dbglevel > DBG_ERROR) { Dbprintf("Sector %2d - Auth error", s); } continue; @@ -2387,7 +2387,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { if (b < NumBlocksPerSector(s) - 1) { emlSetMem(data, FirstBlockOfSector(s) + b, 1); - } else { + } else { // sector trailer, keep the keys, set only the AC uint8_t st[16] = {0x00}; emlGetMem(st, FirstBlockOfSector(s) + b, 1); diff --git a/client/src/cmddata.c b/client/src/cmddata.c index e1bf655e4..032d31f85 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -3082,14 +3082,14 @@ static int CmdDiff(const char *Cmd) { if (inB == NULL) PrintAndLogEx(INFO, "inB null"); - int hdr_sln = (width * 4) + 2; + int hdr_sln = (width * 4) + 2; char hdr0[300] = {0}; int max_fn_space = (width * 5); if (fnlenA && fnlenB && (max_fn_space > fnlenA) && (max_fn_space > fnlenB)) { snprintf(hdr0, sizeof(hdr0) - 1, " # | " _CYAN_("%.*s"), max_fn_space, filenameA); - memset(hdr0 + strlen(hdr0), ' ', hdr_sln - strlen(filenameA) - 1 ); + memset(hdr0 + strlen(hdr0), ' ', hdr_sln - strlen(filenameA) - 1); snprintf(hdr0 + strlen(hdr0), sizeof(hdr0) - 1 - strlen(hdr0), "| " _CYAN_("%.*s"), max_fn_space, filenameB); } else { strcat(hdr0, " # | " _CYAN_("a")); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 16bb414fd..2eb7fa415 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -231,10 +231,10 @@ void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose) { char ascii[24] = {0}; ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); PrintAndLogEx(INFO, "%3d | " _RED_("%s") "| " _RED_("%s"), - blockno, - sprint_hex(d, MFBLOCK_SIZE), - ascii - ); + blockno, + sprint_hex(d, MFBLOCK_SIZE), + ascii + ); } else if (mfIsSectorTrailer(blockno)) { char keya[26] = {0}; @@ -250,13 +250,13 @@ void mf_print_block_one(uint8_t blockno, uint8_t *d, bool verbose) { ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); PrintAndLogEx(INFO, "%3d | " _YELLOW_("%s") _MAGENTA_("%s") "%02X " _YELLOW_("%s") "| " _YELLOW_("%s"), - blockno, - keya, - acl, - d[9], - keyb, - ascii - ); + blockno, + keya, + acl, + d[9], + keyb, + ascii + ); } else { int32_t value = 0; @@ -280,11 +280,11 @@ static void mf_print_block(uint8_t blockno, uint8_t *d, bool verbose) { char ascii[24] = {0}; ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); PrintAndLogEx(INFO, "%s| %3d | " _RED_("%s") "| " _RED_("%s"), - secstr, - blockno, - sprint_hex(d, MFBLOCK_SIZE), - ascii - ); + secstr, + blockno, + sprint_hex(d, MFBLOCK_SIZE), + ascii + ); } else if (mfIsSectorTrailer(blockno)) { @@ -301,14 +301,14 @@ static void mf_print_block(uint8_t blockno, uint8_t *d, bool verbose) { ascii_to_buffer((uint8_t *)ascii, d, MFBLOCK_SIZE, sizeof(ascii) - 1, 1); PrintAndLogEx(INFO, "%s| %3d | " _YELLOW_("%s") _MAGENTA_("%s") "%02X " _YELLOW_("%s") "| " _YELLOW_("%s"), - secstr, - blockno, - keya, - acl, - d[9], - keyb, - ascii - ); + secstr, + blockno, + keya, + acl, + d[9], + keyb, + ascii + ); } else { int32_t value = 0; if (verbose && mfc_value(d, &value)) { diff --git a/doc/commands.json b/doc/commands.json index 7a19db4f2..27e9303e9 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -332,8 +332,7 @@ "data diff -a fileA -b fileB", "data diff -a fileA --eb", "data diff --fa fileA -b fileB", - "data diff --fa fileA --fb fileB", - "data diff --ea --cb" + "data diff --fa fileA --fb fileB" ], "offline": true, "options": [ @@ -12095,6 +12094,6 @@ "metadata": { "commands_extracted": 759, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-06-24T15:16:04" + "extracted_on": "2023-06-25T20:30:44" } } \ No newline at end of file From 2e311a141bdb045b953bbb75763066ce982f9a3e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 25 Jun 2023 22:42:29 +0200 Subject: [PATCH 574/924] misschecks --- client/luascripts/hf_legic.lua | 8 ++++---- client/src/cmdhf15.c | 2 +- doc/commands.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/luascripts/hf_legic.lua b/client/luascripts/hf_legic.lua index 21684b6fb..cbec05f9f 100644 --- a/client/luascripts/hf_legic.lua +++ b/client/luascripts/hf_legic.lua @@ -2520,11 +2520,11 @@ function modifyMode() --- -- edit data-portion of single segment ["ed"] = function(x) - if (type(x)=="string" and string.len(x)>0) then sel=tonumber(x,10) - else sel=selectSegment(inTAG) end + if (type(x) == "string" and string.len(x)>0) then sel=tonumber(x,10) + else sel = selectSegment(inTAG) end if (istable(inTAG.SEG[sel])) then - local uid = inTAG.MCD..inTAG.MSN0..inTAG.MSN1..inTAG.MSN2 - inTAG.SEG[sel].data=editSegmentData(inTAG.SEG[sel].data, uid) + local uid = inTAG.MCD..inTAG.MSN0..inTAG.MSN1..inTAG.MSN2 + inTAG.SEG[sel].data = editSegmentData(inTAG.SEG[sel].data, uid) end end, --- diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index c80f8cac4..c16bfb10b 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -48,7 +48,7 @@ #define Logic1 Iso15693Logic1 #define FrameEOF Iso15693FrameEOF #define CARD_MEMORY_SIZE 4096 -#define HF15_UID_LENGTH 8 +#define HF15_UID_LENGTH 8 #ifndef Crc15 # define Crc15(data, len) Crc16ex(CRC_15693, (data), (len)) diff --git a/doc/commands.json b/doc/commands.json index 27e9303e9..e1a0a020b 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -12094,6 +12094,6 @@ "metadata": { "commands_extracted": 759, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-06-25T20:30:44" + "extracted_on": "2023-06-25T20:42:06" } } \ No newline at end of file From 1cf494cb983f79e446619ab308c19cfe70c78f6b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 26 Jun 2023 00:08:00 +0200 Subject: [PATCH 575/924] preparatins for release --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9a8cb1f7..9e2fa61ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + +## [Seven][2023-06-25] - Added support for compiling on iOS (@The-SamminAter) - Fixed viewing MFC dump - border char is now white (@iceman1001) - Changed `data diff` - to print filenames in header if it fits (@iceman1001) From bc18dbd847775a0491c1f919f55f7160a42b95f9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 26 Jun 2023 13:10:45 +0200 Subject: [PATCH 576/924] Release v4.16717 - seven --- Makefile.defs | 4 ++-- armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- client/CMakeLists.txt | 4 ++-- client/Makefile | 4 ++-- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 18 +++++++++--------- client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/src/proxmark3.c | 2 +- common/default_version_pm3.c | 27 +++++++-------------------- common_arm/Makefile.common | 2 +- 17 files changed, 34 insertions(+), 47 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 76409a37d..874440a47 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -112,8 +112,8 @@ ifeq ($(DEBUG),1) DEFCFLAGS = -g -O0 -fstrict-aliasing -pipe DEFLDFLAGS = else - DEFCXXFLAGS = -Wall -Werror -O3 -pipe - DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe + DEFCXXFLAGS = -Wall -O3 -pipe + DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe DEFLDFLAGS = endif diff --git a/armsrc/Makefile b/armsrc/Makefile index 5203b0292..20090b678 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -187,7 +187,7 @@ showinfo: # version_pm3.c should be remade on every time fullimage.stage1.elf should be remade version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE $(info [-] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index cad3e17d1..6085305c6 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -56,7 +56,7 @@ OBJS = $(OBJDIR)/bootrom.s19 # version_pm3.c should be remade on every compilation version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ all: showinfo $(OBJS) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 8759c00f3..0e0b08744 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -365,7 +365,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) @@ -582,7 +582,7 @@ add_executable(proxmark3 ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +target_compile_options(proxmark3 PUBLIC -Wall -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1) add_dependencies(proxmark3 ncurses readline) diff --git a/client/Makefile b/client/Makefile index d44e67011..d108bb7a0 100644 --- a/client/Makefile +++ b/client/Makefile @@ -412,7 +412,7 @@ endif PM3CFLAGS += -DHAVE_SNPRINTF -CXXFLAGS ?= -Wall -Werror -O3 +CXXFLAGS ?= -Wall -O3 CXXFLAGS += $(MYDEFS) $(MYCXXFLAGS) $(MYINCLUDES) PM3CXXFLAGS = $(CXXFLAGS) @@ -912,7 +912,7 @@ src/pm3_pywrap.c: pm3.i # version_pm3.c should be remade on every compilation src/version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) - $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ + $(Q)$(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index c946c0682..8c524c170 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -19,7 +19,7 @@ target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE m pm3rrg_rdv4_mbedtls) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE amiitool diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index fccae33b7..a85cc2374 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -9,5 +9,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index ec545e2a8..468ee4ef2 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -32,7 +32,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -47,7 +47,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -62,7 +62,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -77,7 +77,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -92,7 +92,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -116,7 +116,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM64_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_neon PRIVATE @@ -134,7 +134,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM32_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) target_compile_options(pm3rrg_rdv4_hardnested_neon BEFORE PRIVATE -mfpu=neon) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -155,7 +155,7 @@ add_library(pm3rrg_rdv4_hardnested STATIC hardnested/hardnested_bruteforce.c $ ${SIMD_TARGETS}) -target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested PRIVATE ../../common diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index c91a47047..42c701d5e 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -14,5 +14,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 12870342e..5cf33d724 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -52,5 +52,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 40929e1ea..c726ddeba 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -44,5 +44,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) target_include_directories(pm3rrg_rdv4_mbedtls INTERFACE ../../common/mbedtls) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index d7e3cfd8a..1040730f1 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 5a6abda25..c74618149 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index d2d6a5b2a..721873066 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index 162bc7776..d6e4d0346 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -42,7 +42,7 @@ static int mainret = PM3_ESOFT; #ifndef LIBPM3 #define BANNERMSG1 "" #define BANNERMSG2 " [ :coffee: ]" -#define BANNERMSG3 "" +#define BANNERMSG3 "Release v4.16717 - seven" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version_pm3.c b/common/default_version_pm3.c index 46eac57c9..016f98e82 100644 --- a/common/default_version_pm3.c +++ b/common/default_version_pm3.c @@ -1,20 +1,5 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- #include "common.h" -/* This is the default version_pm3.c file that Makefile.common falls back to if sh is not available */ +/* Generated file, do not edit */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -23,8 +8,10 @@ const struct version_information_t SECTVERSINFO g_version_information = { VERSION_INFORMATION_MAGIC, - 1, /* version 1 */ - 0, /* version information not present */ - 2, /* cleanliness couldn't be determined */ - /* Remaining fields: zero */ + 1, + 1, + 1, + "Iceman/master/v4.16717", + "2023-06-26 13:10:45", + "de506fd18" }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 99f4d9ecd..e40d998a6 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -49,7 +49,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits From c7d004de63a73524103289f24dda73be0b188e95 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 26 Jun 2023 13:10:45 +0200 Subject: [PATCH 577/924] Revert "Release v4.16717 - seven" This reverts commit bc18dbd847775a0491c1f919f55f7160a42b95f9. --- Makefile.defs | 4 ++-- armsrc/Makefile | 2 +- bootrom/Makefile | 2 +- client/CMakeLists.txt | 4 ++-- client/Makefile | 4 ++-- client/deps/amiibo.cmake | 2 +- client/deps/cliparser.cmake | 2 +- client/deps/hardnested.cmake | 18 +++++++++--------- client/deps/jansson.cmake | 2 +- client/deps/lua.cmake | 2 +- client/deps/mbedtls.cmake | 2 +- client/deps/reveng.cmake | 2 +- client/deps/tinycbor.cmake | 2 +- client/deps/whereami.cmake | 2 +- client/src/proxmark3.c | 2 +- common/default_version_pm3.c | 27 ++++++++++++++++++++------- common_arm/Makefile.common | 2 +- 17 files changed, 47 insertions(+), 34 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index 874440a47..76409a37d 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -112,8 +112,8 @@ ifeq ($(DEBUG),1) DEFCFLAGS = -g -O0 -fstrict-aliasing -pipe DEFLDFLAGS = else - DEFCXXFLAGS = -Wall -O3 -pipe - DEFCFLAGS = -Wall -O3 -fstrict-aliasing -pipe + DEFCXXFLAGS = -Wall -Werror -O3 -pipe + DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe DEFLDFLAGS = endif diff --git a/armsrc/Makefile b/armsrc/Makefile index 20090b678..5203b0292 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -187,7 +187,7 @@ showinfo: # version_pm3.c should be remade on every time fullimage.stage1.elf should be remade version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE $(info [-] GEN $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) diff --git a/bootrom/Makefile b/bootrom/Makefile index 6085305c6..cad3e17d1 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -56,7 +56,7 @@ OBJS = $(OBJDIR)/bootrom.s19 # version_pm3.c should be remade on every compilation version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ all: showinfo $(OBJS) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 0e0b08744..8759c00f3 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -365,7 +365,7 @@ set (TARGET_SOURCES add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c - COMMAND ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c + COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c ) @@ -582,7 +582,7 @@ add_executable(proxmark3 ${ADDITIONAL_SRC} ) -target_compile_options(proxmark3 PUBLIC -Wall -O3) +target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1) add_dependencies(proxmark3 ncurses readline) diff --git a/client/Makefile b/client/Makefile index d108bb7a0..d44e67011 100644 --- a/client/Makefile +++ b/client/Makefile @@ -412,7 +412,7 @@ endif PM3CFLAGS += -DHAVE_SNPRINTF -CXXFLAGS ?= -Wall -O3 +CXXFLAGS ?= -Wall -Werror -O3 CXXFLAGS += $(MYDEFS) $(MYCXXFLAGS) $(MYINCLUDES) PM3CXXFLAGS = $(CXXFLAGS) @@ -912,7 +912,7 @@ src/pm3_pywrap.c: pm3.i # version_pm3.c should be remade on every compilation src/version_pm3.c: default_version_pm3.c .FORCE $(info [=] GEN $@) - $(Q)$(CP) $< $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 8c524c170..c946c0682 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -19,7 +19,7 @@ target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE m pm3rrg_rdv4_mbedtls) -target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_amiibo PRIVATE amiitool diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index a85cc2374..fccae33b7 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -9,5 +9,5 @@ target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../include ../src) target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) -target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 468ee4ef2..ec545e2a8 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -2,7 +2,7 @@ add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE @@ -32,7 +32,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -47,7 +47,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -62,7 +62,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -77,7 +77,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -92,7 +92,7 @@ if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -116,7 +116,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM64_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested_neon PRIVATE @@ -134,7 +134,7 @@ elseif ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST ARM32_CPUS) hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -O3) + target_compile_options(pm3rrg_rdv4_hardnested_neon PRIVATE -Wall -Werror -O3) target_compile_options(pm3rrg_rdv4_hardnested_neon BEFORE PRIVATE -mfpu=neon) set_property(TARGET pm3rrg_rdv4_hardnested_neon PROPERTY POSITION_INDEPENDENT_CODE ON) @@ -155,7 +155,7 @@ add_library(pm3rrg_rdv4_hardnested STATIC hardnested/hardnested_bruteforce.c $ ${SIMD_TARGETS}) -target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(pm3rrg_rdv4_hardnested PRIVATE ../../common diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 42c701d5e..c91a47047 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -14,5 +14,5 @@ add_library(pm3rrg_rdv4_jansson STATIC target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) -target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Wno-unused-function -O3) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 5cf33d724..12870342e 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -52,5 +52,5 @@ if (NOT MINGW) endif (NOT MINGW) target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) -target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index c726ddeba..40929e1ea 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -44,5 +44,5 @@ add_library(pm3rrg_rdv4_mbedtls STATIC target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) target_include_directories(pm3rrg_rdv4_mbedtls INTERFACE ../../common/mbedtls) -target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 1040730f1..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -13,5 +13,5 @@ target_include_directories(pm3rrg_rdv4_reveng PRIVATE ../src ../../include) target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) -target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index c74618149..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -11,5 +11,5 @@ add_library(pm3rrg_rdv4_tinycbor STATIC target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake index 721873066..d2d6a5b2a 100644 --- a/client/deps/whereami.cmake +++ b/client/deps/whereami.cmake @@ -2,5 +2,5 @@ add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) -target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -O3) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/src/proxmark3.c b/client/src/proxmark3.c index d6e4d0346..162bc7776 100644 --- a/client/src/proxmark3.c +++ b/client/src/proxmark3.c @@ -42,7 +42,7 @@ static int mainret = PM3_ESOFT; #ifndef LIBPM3 #define BANNERMSG1 "" #define BANNERMSG2 " [ :coffee: ]" -#define BANNERMSG3 "Release v4.16717 - seven" +#define BANNERMSG3 "" typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; diff --git a/common/default_version_pm3.c b/common/default_version_pm3.c index 016f98e82..46eac57c9 100644 --- a/common/default_version_pm3.c +++ b/common/default_version_pm3.c @@ -1,5 +1,20 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- #include "common.h" -/* Generated file, do not edit */ +/* This is the default version_pm3.c file that Makefile.common falls back to if sh is not available */ #ifndef ON_DEVICE #define SECTVERSINFO #else @@ -8,10 +23,8 @@ const struct version_information_t SECTVERSINFO g_version_information = { VERSION_INFORMATION_MAGIC, - 1, - 1, - 1, - "Iceman/master/v4.16717", - "2023-06-26 13:10:45", - "de506fd18" + 1, /* version 1 */ + 0, /* version information not present */ + 2, /* cleanliness couldn't be determined */ + /* Remaining fields: zero */ }; diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index e40d998a6..99f4d9ecd 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -49,7 +49,7 @@ VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/ INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h ARMCFLAGS = -mthumb-interwork -fno-builtin -DEFCFLAGS = -Wall -Os -pedantic -fstrict-aliasing -pipe +DEFCFLAGS = -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe # Some more warnings we want as errors: DEFCFLAGS += -Wbad-function-cast -Wchar-subscripts -Wundef -Wunused -Wuninitialized -Wpointer-arith -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits From f7f1f2e6e78d9626768c4abe133e6fa1b74b7ae6 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 26 Jun 2023 13:11:45 +0200 Subject: [PATCH 578/924] update version --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e2fa61ec..47b958b98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] -## [Seven][2023-06-25] +## [Seven.4.16717][2023-06-25] - Added support for compiling on iOS (@The-SamminAter) - Fixed viewing MFC dump - border char is now white (@iceman1001) - Changed `data diff` - to print filenames in header if it fits (@iceman1001) From adfebd6510688667a612141c74ee461c57c84a06 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 26 Jun 2023 15:01:08 +0200 Subject: [PATCH 579/924] text --- armsrc/iso15693.c | 28 ++++++++++++++-------------- client/src/cmdhficlass.c | 5 +++++ client/src/cmdhflist.c | 2 +- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index 703f1288f..16dc3c575 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -1835,20 +1835,20 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string, bool icla switch_off(); DbpString(""); - DbpString(_CYAN_("Sniff statistics")); - DbpString("================================="); - Dbprintf(" DecodeTag State........%d", dtag.state); - Dbprintf(" DecodeTag byteCnt......%d", dtag.len); - Dbprintf(" DecodeTag posCount.....%d", dtag.posCount); - Dbprintf(" DecodeTagFSK State.....%d", dtagfsk.state); - Dbprintf(" DecodeTagFSK byteCnt...%d", dtagfsk.len); - Dbprintf(" DecodeTagFSK count.....%d", dtagfsk.count); - Dbprintf(" DecodeReader State.....%d", dreader.state); - Dbprintf(" DecodeReader byteCnt...%d", dreader.byteCount); - Dbprintf(" DecodeReader posCount..%d", dreader.posCount); - Dbprintf(" Trace length..........." _YELLOW_("%d"), BigBuf_get_traceLen()); - DbpString(""); - + if (g_dbglevel > DBG_ERROR) { + DbpString(_CYAN_("Sniff statistics")); + DbpString("================================="); + Dbprintf("DecodeTag State........ %d", dtag.state); + Dbprintf("DecodeTag byteCnt...... %d", dtag.len); + Dbprintf("DecodeTag posCount..... %d", dtag.posCount); + Dbprintf("DecodeTagFSK State..... %d", dtagfsk.state); + Dbprintf("DecodeTagFSK byteCnt... %d", dtagfsk.len); + Dbprintf("DecodeTagFSK count..... %d", dtagfsk.count); + Dbprintf("DecodeReader State..... %d", dreader.state); + Dbprintf("DecodeReader byteCnt... %d", dreader.byteCount); + Dbprintf("DecodeReader posCount.. %d", dreader.posCount); + } + Dbprintf("Trace length........... " _YELLOW_("%d"), BigBuf_get_traceLen()); } // Initialize Proxmark3 as ISO15693 reader diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index ba6d984ad..a48bbb98e 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -683,8 +683,13 @@ static int CmdHFiClassSniff(const char *Cmd) { WaitForResponse(CMD_HF_ICLASS_SNIFF, &resp); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(HINT, "Try `" _YELLOW_("hf iclass list") "` to view captured tracelog"); PrintAndLogEx(HINT, "Try `" _YELLOW_("trace save -f hf_iclass_mytrace") "` to save tracelog for later analysing"); + if (jam_epurse_update) { + PrintAndLogEx(HINT, "Verify if the jam worked by comparing value in trace and block 2"); + } + PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index b38d7fea4..5ddd3f1fa 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -499,7 +499,7 @@ void annotateIclass(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool uint8_t key[8]; if (check_known_default(csn, epurse, rmac, tmac, key)) { - snprintf(exp, size, "CHECK ( %s )", sprint_hex_inrow(key, 8)); + snprintf(exp, size, "CHECK ( " _GREEN_("%s") " )", sprint_hex_inrow(key, 8)); } else { snprintf(exp, size, "CHECK"); } From f36ec4645504dae317d152b4b4183099a0c67c6f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 26 Jun 2023 15:01:44 +0200 Subject: [PATCH 580/924] minor rename --- armsrc/mifareutil.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 487c71706..b17ac19bc 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -730,8 +730,8 @@ int emlSetValBl(uint32_t blReg, uint8_t blBlock, int blockNum) { uint64_t emlGetKey(int sectorNum, int keyType) { uint8_t key[6] = {0x00}; - uint8_t *emCARD = BigBuf_get_EM_addr(); - memcpy(key, emCARD + 16 * (FirstBlockOfSector(sectorNum) + NumBlocksPerSector(sectorNum) - 1) + keyType * 10, 6); + uint8_t *em = BigBuf_get_EM_addr(); + memcpy(key, em + 16 * (FirstBlockOfSector(sectorNum) + NumBlocksPerSector(sectorNum) - 1) + keyType * 10, 6); return bytes_to_num(key, 6); } From 9db65186e3394c3b9d666de59021dee2fa01070a Mon Sep 17 00:00:00 2001 From: Self Not Found Date: Tue, 27 Jun 2023 11:28:11 +0800 Subject: [PATCH 581/924] Fix note for hf fudan wrbl --- client/src/cmdhffudan.c | 2 +- doc/commands.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhffudan.c b/client/src/cmdhffudan.c index 502425f83..38ef8eef5 100644 --- a/client/src/cmdhffudan.c +++ b/client/src/cmdhffudan.c @@ -355,7 +355,7 @@ static int CmdHFFudanWrBl(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf fudan wrbl", "Write fudan block with 4 hex bytes of data\n", - "hf mf wrbl --blk 1 -k FFFFFFFFFFFF -d 01020304" + "hf fudan wrbl --blk 1 -k FFFFFFFFFFFF -d 01020304" ); void *argtable[] = { arg_param_begin, diff --git a/doc/commands.json b/doc/commands.json index e1a0a020b..8d4185c52 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -2867,7 +2867,7 @@ "command": "hf fudan wrbl", "description": "Write fudan block with 4 hex bytes of data", "notes": [ - "hf mf wrbl --blk 1 -k FFFFFFFFFFFF -d 01020304" + "hf fudan wrbl --blk 1 -k FFFFFFFFFFFF -d 01020304" ], "offline": false, "options": [ From 66b3ebabb96499f52b5ffe19b091c0450a08cb8b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 27 Jun 2023 15:24:25 +0200 Subject: [PATCH 582/924] fix regex for extracting the description and notes.\n description now must start with a newline and go until it see the word usage:. \n\n notes now go until it sees either === or --- or \n\n\n which all would be indication that the notes section ended. --- client/pyscripts/pm3_help2json.py | 8 +- doc/commands.json | 1038 ++++++++--------------------- 2 files changed, 287 insertions(+), 759 deletions(-) diff --git a/client/pyscripts/pm3_help2json.py b/client/pyscripts/pm3_help2json.py index 8099b5d7c..34faedec5 100755 --- a/client/pyscripts/pm3_help2json.py +++ b/client/pyscripts/pm3_help2json.py @@ -62,21 +62,19 @@ def build_arg_parser(): def build_help_regex(): - """The regex uses to parse the full text output of help data from the pm3 client.""" - # Reads the divider followed by the command itself re_command = r'-{87}\n(?P.+)\n' # Reads if the command is available offline re_offline = r'available offline: (?Pyes|no)\n+' # Reads the description lines - re_description = r'(?P(?:.+\n)+)\n+' + re_description = r'(?P\n[\s\S]*?(?=usage:))' # Reads the usage string re_usage = r'(?:usage:\n(?P(?:.+\n)+)\n+)?' # Reads the options and there individual descriptions re_options = r'(?:options:\n(?P(?:.+\n)+)\n+)?' # Reads the notes and examples - re_notes = r'(?:examples\/notes:\n(?P(?:.+\n)+)\n+)?' + re_notes = r'(?:examples\/notes:\n(?P[\s\S]*?(?=(===|---|\n\n))))' # Combine them into a single regex object - re_full = re.compile(re_command+re_offline+re_description+re_usage+re_options+re_notes, re.MULTILINE); + re_full = re.compile(re_command+re_offline+re_description+re_usage+re_options+re_notes, re.MULTILINE) return re_full diff --git a/doc/commands.json b/doc/commands.json index 8d4185c52..6523703da 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -95,14 +95,6 @@ ], "usage": "analyse freq [-h] [-F ] [-L ] [-C ]" }, - "analyse help": { - "command": "analyse help", - "description": "help This help lcr Generate final byte for XOR LRC crc Stub method for CRC evaluations chksum Checksum with adding, masking and one's complement dates Look for datestamps in a given array of bytes lfsr LFSR tests a num bits test nuid create NUID from 7byte UID demodbuff Load binary string to DemodBuffer freq Calc wave lengths foo muxer units convert ETU <> US <> SSP_CLK (3.39MHz)", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "analyse lcr": { "command": "analyse lcr", "description": "Specifying the bytes of a UID with a known LRC will find the last byte value needed to generate that LRC with a rolling XOR. All bytes should be specified in HEX.", @@ -403,14 +395,6 @@ ], "usage": "data grid [-h] [-x ] [-y ]" }, - "data help": { - "command": "data help", - "description": "help This help ----------- ------------------------- Modulation------------------------- biphaserawdecode Biphase decode bin stream in DemodBuffer detectclock Detect ASK, FSK, NRZ, PSK clock rate of wave in GraphBuffer fsktonrz Convert fsk2 to nrz wave for alternate fsk demodulating (for weak fsk) manrawdecode Manchester decode binary stream in DemodBuffer modulation Identify LF signal for clock and modulation rawdemod Demodulate the data in the GraphBuffer and output binary ----------- ------------------------- Graph------------------------- askedgedetect Adjust Graph for manual ASK demod using the length of sample differences to detect the edge of a wave autocorr Autocorrelation over window dirthreshold Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev. decimate Decimate samples undecimate Un-decimate samples hide Hide graph window hpf Remove DC offset from trace iir Apply IIR buttersworth filter on plot data grid overlay grid on graph window ltrim Trim samples from left of trace mtrim Trim out samples from the specified start to the specified stop norm Normalize max/min to +/-128 plot Show graph window rtrim Trim samples from right of trace setgraphmarkers Set blue and orange marker in graph window shiftgraphzero Shift 0 for Graphed wave + or - shift value timescale Set a timescale to get a differential reading between the yellow and purple markers as time duration zerocrossings Count time between zero-crossings convertbitstream Convert GraphBuffer's 0/1 values to 127 / -127 getbitstream Convert GraphBuffer's >=1 values to 1 and <1 to 0 ----------- ------------------------- General------------------------- asn1 asn1 decoder bin2hex Converts binary to hexadecimal clear Clears bigbuf on deviceside and graph window diff diff of input files hex2bin Converts hexadecimal to binary load Load contents of file into graph window num Converts dec/hex/bin print Print the data in the DemodBuffer save Save signal trace data (from graph window) setdebugmode Set Debugging Level on client side", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "data hex2bin": { "command": "data hex2bin", "description": "This function converts hexadecimal to binary. It will ignore all non-hexadecimal characters but stop reading on whitespace", @@ -853,14 +837,6 @@ ], "usage": "emv gpo [-hkpmatw] []..." }, - "emv help": { - "command": "emv help", - "description": "help This help test Crypto logic test list List ISO7816 history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "emv intauth": { "command": "emv intauth", "description": "Generate Internal Authenticate command. Usually needs 4-byte random number. It returns data in TLV format . Needs a EMV applet to be selected and GPO to be executed.", @@ -1046,14 +1022,6 @@ ], "usage": "quit [-h]" }, - "help": { - "command": "help", - "description": "help Use ` help` for details of a command prefs { Edit client/device preferences... } -------- ----------------------- Technology ----------------------- analyse { Analyse utils... } data { Plot window / data buffer manipulation... } emv { EMV ISO-14443 / ISO-7816... } hf { High frequency commands... } hw { Hardware commands... } lf { Low frequency commands... } nfc { NFC commands... } piv { PIV commands... } reveng { CRC calculations from RevEng software... } smart { Smart card ISO-7816 commands... } script { Scripting commands... } trace { Trace manipulation... } wiegand { Wiegand format manipulation... } -------- ----------------------- General ----------------------- clear Clear screen hints Turn hints on / off msleep Add a pause in milliseconds rem Add a text line in log file quit exit Exit program", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf 14a antifuzz": { "command": "hf 14a antifuzz", "description": "Tries to fuzz the ISO14443a anticollision phase", @@ -1130,21 +1098,18 @@ ], "usage": "hf 14a chaining [-h10]" }, - "hf 14a config": { - "command": "hf 14a config", - "description": "--------------------------------------------------------------------------------------- hf 14a cuids available offline: no", - "notes": [], + "hf 14a cuids": { + "command": "hf 14a cuids", + "description": "Collect n>0 ISO14443-a UIDs in one go", + "notes": [ + "hf 14a cuids -n 5 -> Collect 5 UIDs" + ], "offline": false, - "options": [], - "usage": "" - }, - "hf 14a help": { - "command": "hf 14a help", - "description": "----------- ----------------------- General ----------------------- help This help list List ISO 14443-a history", - "notes": [], - "offline": true, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-n, --num Number of UIDs to collect" + ], + "usage": "hf 14a cuids [-h] [-n ]" }, "hf 14a info": { "command": "hf 14a info", @@ -1358,14 +1323,6 @@ ], "usage": "hf 14b dump [-h] [-f ] [--ns]" }, - "hf 14b help": { - "command": "hf 14b help", - "description": "help This help list List ISO-14443-B history view Display content from tag dump file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf 14b info": { "command": "hf 14b info", "description": "Tag information for ISO/IEC 14443 type B based tags", @@ -1627,14 +1584,6 @@ ], "usage": "hf 15 findafi [-h]" }, - "hf 15 help": { - "command": "hf 15 help", - "description": "----------- --------------------- General --------------------- help This help list List ISO-15693 history demod Demodulate ISO-15693 from tag", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf 15 info": { "command": "hf 15 info", "description": "Uses the optional command `get_systeminfo` 0x2B to try and extract information", @@ -2125,14 +2074,6 @@ ], "usage": "hf cipurse formatall [-hav] [-n ] [-k ] [--sreq ] [--sresp ] [--no-auth]" }, - "hf cipurse help": { - "command": "hf cipurse help", - "description": "help This help. test Regression tests", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf cipurse info": { "command": "hf cipurse info", "description": "Get info from CIPURSE tags", @@ -2304,14 +2245,6 @@ ], "usage": "hf emrtd dump [-h] [-n ] [-d ] [-e ] [-m <[0-9A-Z<]>] [--dir ]" }, - "hf emrtd help": { - "command": "hf emrtd help", - "description": "help This help info Display info about an eMRTD list List ISO 14443A/7816 history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf emrtd info": { "command": "hf emrtd info", "description": "Display info about an eMRTD", @@ -2369,14 +2302,6 @@ ], "usage": "hf epa cnonces [-h] --size --num -d " }, - "hf epa help": { - "command": "hf epa help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf epa replay": { "command": "hf epa replay", "description": "Perform PACE protocol by replaying given APDUs", @@ -2448,14 +2373,6 @@ ], "usage": "hf felica auth2 [-hv] [-i ] [-c ] [-k ]" }, - "hf felica help": { - "command": "hf felica help", - "description": "help This help ----------- ----------------------- General ----------------------- list List ISO 18092/FeliCa history ----------- ----------------------- FeliCa Standard ----------------------- ----------- ----------------------- FeliCa Light -----------------------", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf felica info": { "command": "hf felica info", "description": "Reader for FeliCa based tags", @@ -2536,11 +2453,25 @@ }, "hf felica rdbl": { "command": "hf felica rdbl", - "description": "Use this command to read block data from authentication-not-required Service.", - "notes": [], + "description": "Use this command to read block data from authentication-not-required Service. - Mode shall be Mode0. - Successful == block data - Unsuccessful == Status Flag1 and Flag2", + "notes": [ + "hf felica rdbl --sn 01 --scl 8B00 --bn 01 --ble 8000", + "hf felica rdbl --sn 01 --scl 4B18 --bn 01 --ble 8000 -b", + "hf felica rdbl -i 01100910c11bc407 --sn 01 --scl 8B00 --bn 01 --ble 8000" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-b get all block list elements 00 -> FF", + "-i set custom IDm", + "-l, --long use 3 byte block list element block number", + "--sn number of service", + "--scl service code list", + "--bn number of block", + "--ble block list element (def 2|3 bytes)", + "-v, --verbose verbose output" + ], + "usage": "hf felica rdbl [-hblv] [-i ] [--sn ] [--scl ] [--bn ] [--ble ]" }, "hf felica reader": { "command": "hf felica reader", @@ -2664,11 +2595,23 @@ }, "hf felica wrbl": { "command": "hf felica wrbl", - "description": "Use this command to write block data to authentication-not-required Service.", - "notes": [], + "description": "Use this command to write block data to authentication-not-required Service. - Mode shall be Mode0. - Un-/Ssuccessful == Status Flag1 and Flag2", + "notes": [ + "hf felica wrbl --sn 01 --scl CB10 --bn 01 --ble 8001 -d 0102030405060708090A0B0C0D0E0F10", + "hf felica wrbl -i 01100910c11bc407 --sn 01 --scl CB10 --bn 01 --ble 8001 -d 0102030405060708090A0B0C0D0E0F10" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-d, --data data, 16 hex bytes", + "-i set custom IDm", + "--sn number of service", + "--scl service code list", + "--bn number of block", + "--ble block list element (def 2|3 bytes)", + "-v, --verbose verbose output" + ], + "usage": "hf felica wrbl [-hv] [-d ] [-i ] [--sn ] [--scl ] [--bn ] [--ble ]" }, "hf fido assert": { "command": "hf fido assert", @@ -2716,14 +2659,6 @@ ], "usage": "hf fido auth [-havuc] default mode: [-f ] [-k ] [--kh ] [--cp ] [--ap ] [--cpx ] [--apx ]" }, - "hf fido help": { - "command": "hf fido help", - "description": "help This help. list List ISO 14443A history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf fido info": { "command": "hf fido info", "description": "Get info from Fido tags", @@ -2811,14 +2746,6 @@ ], "usage": "hf fudan dump [-h] [-f ]" }, - "hf fudan help": { - "command": "hf fudan help", - "description": "help This help view Display content from tag dump file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf fudan rdbl": { "command": "hf fudan rdbl", "description": "Read fudan block", @@ -2953,14 +2880,6 @@ ], "usage": "hf gallagher diversify [-h] --aid [--keynum ] [--uid ] [--sitekey ] [--apdu]" }, - "hf gallagher help": { - "command": "hf gallagher help", - "description": "help This help diversifykey Diversify Gallagher key decode Decode Gallagher credential block", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf gallagher reader": { "command": "hf gallagher reader", "description": "Read a Gallagher DESFire tag from the Card Application Directory, CAD Specify site key is required if using non-default key", @@ -2979,14 +2898,6 @@ ], "usage": "hf gallagher reader [-h@v] [--aid ] [--sitekey ] [--apdu]" }, - "hf help": { - "command": "hf help", - "description": "-------- ----------------------- High Frequency ----------------------- 14a { ISO14443A RFIDs... } 14b { ISO14443B RFIDs... } 15 { ISO15693 RFIDs... } cipurse { Cipurse transport Cards... } epa { German Identification Card... } emrtd { Machine Readable Travel Document... } felica { ISO18092 / FeliCa RFIDs... } fido { FIDO and FIDO2 authenticators... } fudan { Fudan RFIDs... } gallagher { Gallagher DESFire RFIDs... } ksx6924 { KS X 6924 (T-Money, Snapper+) RFIDs } jooki { Jooki RFIDs... } iclass { ICLASS RFIDs... } legic { LEGIC RFIDs... } lto { LTO Cartridge Memory RFIDs... } mf { MIFARE RFIDs... } mfp { MIFARE Plus RFIDs... } mfu { MIFARE Ultralight RFIDs... } mfdes { MIFARE Desfire RFIDs... } ntag424 { NXP NTAG 4242 DNA RFIDs... } seos { SEOS RFIDs... } st25ta { ST25TA RFIDs... } tesla { TESLA Cards... } texkom { Texkom RFIDs... } thinfilm { Thinfilm RFIDs... } topaz { TOPAZ (NFC Type 1) RFIDs... } xerox { Fuji/Xerox cartridge RFIDs... } waveshare { Waveshare NFC ePaper... } ----------- --------------------- General --------------------- help This help list List protocol data in trace buffer search Search for known HF tags", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf iclass calcnewkey": { "command": "hf iclass calcnewkey", "description": "Calculate new keys for updating (blocks 3 & 4)", @@ -3048,11 +2959,23 @@ }, "hf iclass decrypt": { "command": "hf iclass decrypt", - "description": "3DES decrypt data This is a naive implementation, it tries to decrypt every block after block 6. Correct behaviour would be to decrypt only the application areas where the key is valid, which is defined by the configuration block.", - "notes": [], + "description": "3DES decrypt data This is a naive implementation, it tries to decrypt every block after block 6. Correct behaviour would be to decrypt only the application areas where the key is valid, which is defined by the configuration block. OBS! In order to use this function, the file `iclass_decryptionkey.bin` must reside in the resources directory. The file should be 16 bytes binary data or... make sure your cardhelper is placed in the sim module", + "notes": [ + "hf iclass decrypt -f hf-iclass-AA162D30F8FF12F1-dump.bin", + "hf iclass decrypt -f hf-iclass-AA162D30F8FF12F1-dump.bin -k 000102030405060708090a0b0c0d0e0f", + "hf iclass decrypt -d 1122334455667788 -k 000102030405060708090a0b0c0d0e0f" + ], "offline": true, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-f, --file filename of dump file (bin/eml/json)", + "-d, --data 3DES encrypted data", + "-k, --key 3DES transport key", + "-v, --verbose verbose output", + "--d6 decode as block 6", + "-z, --dense dense dump output style" + ], + "usage": "hf iclass decrypt [-hvz] [-f ] [-d ] [-k ] [--d6]" }, "hf iclass dump": { "command": "hf iclass dump", @@ -3170,14 +3093,6 @@ ], "usage": "hf iclass eview [-hvz] [-s <256|2048>]" }, - "hf iclass help": { - "command": "hf iclass help", - "description": "----------- --------------------- operations --------------------- help This help info Tag information list List iclass history ----------- --------------------- recovery --------------------- loclass Use loclass to perform bruteforce reader attack lookup Uses authentication trace to check for key in dictionary file ----------- --------------------- simulation --------------------- ----------- --------------------- utils --------------------- configcard Reader configuration card calcnewkey Calc diversified keys (blocks 3 & 4) to write new keys encode Encode binary wiegand to block 7 encrypt Encrypt given block data decrypt Decrypt given block data or tag dump file managekeys Manage keys to use with iclass commands permutekey Permute function from 'heart of darkness' paper view Display content from tag dump file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf iclass info": { "command": "hf iclass info", "description": "Act as a iCLASS reader. Reads / fingerprints a iCLASS tag.", @@ -3483,14 +3398,6 @@ ], "usage": "hf jooki encode [-hrtv] [-u ] [--dragon] [--fox] [--ghost] [--knight] [--whale] [--blackdragon] [--blackfox] [--blackknight] [--blackwhale] [--whitedragon] [--whitefox] [--whiteknight] [--whitewhale] [--tid ] [--fid ]" }, - "hf jooki help": { - "command": "hf jooki help", - "description": "help This help decode Decode Jooki token encode Encode Jooki token", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf jooki sim": { "command": "hf jooki sim", "description": "Simulate a Jooki token. Either `hf mfu eload` before or use `-d` param", @@ -3519,14 +3426,6 @@ ], "usage": "hf ksx6924 balance [-hka]" }, - "hf ksx6924 help": { - "command": "hf ksx6924 help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf ksx6924 info": { "command": "hf ksx6924 info", "description": "Get info about a KS X 6924 transit card. This application is used by T-Money (South Korea) and Snapper+ (Wellington, New Zealand).", @@ -3676,14 +3575,6 @@ ], "usage": "hf legic eview [-h] [--22] [--256] [--1024]" }, - "hf legic help": { - "command": "hf legic help", - "description": "----------- --------------------- operations --------------------- help This help list List LEGIC history ----------- --------------------- simulation --------------------- ----------- --------------------- utils --------------------- crc Calculate Legic CRC over given bytes view Display deobfuscated and decoded content from tag dump file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf legic info": { "command": "hf legic info", "description": "Gets information from a LEGIC Prime tag like systemarea, user areas, etc", @@ -3852,14 +3743,6 @@ ], "usage": "hf lto dump [-h] [-f ]" }, - "hf lto help": { - "command": "hf lto help", - "description": "help This help list List LTO-CM history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf lto info": { "command": "hf lto info", "description": "Get info from LTO tags", @@ -4450,19 +4333,32 @@ }, "hf mf gen3blk": { "command": "hf mf gen3blk", - "description": "Overwrite full manufacturer block for magic Gen3 card - You can specify part of manufacturer block as 4/7-bytes for UID change only", - "notes": [], + "description": "Overwrite full manufacturer block for magic Gen3 card - You can specify part of manufacturer block as 4/7-bytes for UID change only NOTE: BCC, SAK, ATQA will be calculated automatically", + "notes": [ + "hf mf gen3blk -> print current data", + "hf mf gen3blk -d 01020304 -> set 4 byte uid", + "hf mf gen3blk -d 01020304050607 -> set 7 byte uid", + "hf mf gen3blk -d 01020304FFFFFFFF0102030405060708" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-d, --data manufacturer block data up to 16 hex bytes" + ], + "usage": "hf mf gen3blk [-h] [-d ]" }, "hf mf gen3freeze": { "command": "hf mf gen3freeze", - "description": "Perma lock further UID changes. No more UID changes available after operation completed", - "notes": [], + "description": "Perma lock further UID changes. No more UID changes available after operation completed Note: operation is ! irreversible !", + "notes": [ + "hf mf gen3freeze -y" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-y, --yes confirm UID lock operation" + ], + "usage": "hf mf gen3freeze -y[h]" }, "hf mf gen3uid": { "command": "hf mf gen3uid", @@ -4615,14 +4511,6 @@ ], "usage": "hf mf hardnested [-habrstw] [-k ] [--blk ] [--tblk ] [--ta] [--tb] [--tk ] [-u ] [-f ] [--in] [--im] [--is] [--ia] [--i2] [--i5]" }, - "hf mf help": { - "command": "hf mf help", - "description": "help This help list List MIFARE history hardnested Nested attack for hardened MIFARE Classic cards decrypt [nt] [ar_enc] [at_enc] [data] - to decrypt sniff or trace acl Decode and print MIFARE Classic access rights bytes mad Checks and prints MAD value Value blocks view Display content from tag dump file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf mf list": { "command": "hf mf list", "description": "Alias of `trace list -t mf` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", @@ -4680,11 +4568,22 @@ }, "hf mf ndefformat": { "command": "hf mf ndefformat", - "description": "format MIFARE Classic Tag as a NFC tag with Data Exchange Format (NDEF) If no given, UID will be used as filename. It will try default keys and MAD keys to detect if tag is already formatted in order to write.", - "notes": [], + "description": "format MIFARE Classic Tag as a NFC tag with Data Exchange Format (NDEF) If no given, UID will be used as filename. It will try default keys and MAD keys to detect if tag is already formatted in order to write. If not, it will try finding a key file based on your UID. ie, if you ran autopwn before", + "notes": [ + "hf mf ndefformat", + "hf mf ndefformat --1k -> MIFARE Classic 1k", + "hf mf ndefformat --keys hf-mf-01020304-key.bin -> MIFARE 1k with keys from specified file" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-k, --keys filename of keys", + "--mini MIFARE Classic Mini / S20", + "--1k MIFARE Classic 1k / S50 (def)", + "--2k MIFARE Classic/Plus 2k", + "--4k MIFARE Classic 4k / S70" + ], + "usage": "hf mf ndefformat [-h] [-k ] [--mini] [--1k] [--2k] [--4k]" }, "hf mf ndefread": { "command": "hf mf ndefread", @@ -4820,11 +4719,27 @@ }, "hf mf restore": { "command": "hf mf restore", - "description": "Restore MIFARE Classic dump file to tag.", - "notes": [], + "description": "Restore MIFARE Classic dump file to tag. The key file and dump file will program the card sector trailers. By default we authenticate to card with key 0xFFFFFFFFFFFF. If access rights in dump file is all zeros, it will be replaced with default values `--uid` param is used for filename templates `hf-mf--dump.bin` and `hf-mf--key.bin. if not specified, it will read the card uid instead. `--ka` param you can indicate that the key file should be used for authentication instead. if so we also try both B/A keys `--force` param is used to override warnings and allow bad ACL block writes. if not specified, it will skip blocks with bad ACL.", + "notes": [ + "hf mf restore", + "hf mf restore --1k --uid 04010203", + "hf mf restore --1k --uid 04010203 -k hf-mf-AABBCCDD-key.bin", + "hf mf restore --4k" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "--mini MIFARE Classic Mini / S20", + "--1k MIFARE Classic 1k / S50 (def)", + "--2k MIFARE Classic/Plus 2k", + "--4k MIFARE Classic 4k / S70", + "-u, --uid uid, (4|7|10 hex bytes)", + "-f, --file specify dump filename (bin/eml/json)", + "-k, --kfn key filename", + "--ka use specified keyfile to authenticate", + "--force override warnings" + ], + "usage": "hf mf restore [-h] [--mini] [--1k] [--2k] [--4k] [-u ] [-f ] [-k ] [--ka] [--force]" }, "hf mf setmod": { "command": "hf mf setmod", @@ -5796,14 +5711,6 @@ ], "usage": "hf mfdes getuid [-hav] [-n ] [-t ] [-k ] [--kdf ] [-i ] [-m ] [-c ] [--schann ] [--aid ] [--isoid ]" }, - "hf mfdes help": { - "command": "hf mfdes help", - "description": "help This help list List DESFire (ISO 14443A) history test Regression crypto tests", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf mfdes info": { "command": "hf mfdes info", "description": "Get info from MIFARE DESfire tags", @@ -6202,14 +6109,6 @@ ], "usage": "hf mfp dump [-hv] [-f ] [-k ] [--ns]" }, - "hf mfp help": { - "command": "hf mfp help", - "description": "help This help list List MIFARE Plus history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf mfp info": { "command": "hf mfp info", "description": "Get info from MIFARE Plus tags", @@ -6279,11 +6178,17 @@ }, "hf mfp ndefformat": { "command": "hf mfp ndefformat", - "description": "format MIFARE Plus Tag as a NFC tag with Data Exchange Format (NDEF) If no given, UID will be used as filename. It will try default keys and MAD keys to detect if tag is already formatted in order to write.", - "notes": [], + "description": "format MIFARE Plus Tag as a NFC tag with Data Exchange Format (NDEF) If no given, UID will be used as filename. It will try default keys and MAD keys to detect if tag is already formatted in order to write. If not, it will try finding a key file based on your UID. ie, if you ran autopwn before", + "notes": [ + "hf mfp ndefformat", + "hf mfp ndefformat --keys hf-mf-01020304-key.bin -> with keys from specified file" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-k, --keys filename of keys" + ], + "usage": "hf mfp ndefformat [-h] [-k ]" }, "hf mfp ndefread": { "command": "hf mfp ndefread", @@ -6477,14 +6382,6 @@ ], "usage": "hf mfu eview [-h] [-e ]" }, - "hf mfu help": { - "command": "hf mfu help", - "description": "help This help keygen Generate 3DES MIFARE diversified keys pwdgen Generate pwd from known algos view Display content from tag dump file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf mfu info": { "command": "hf mfu info", "description": "Get info about MIFARE Ultralight Family styled tag. Sometimes the tags are locked down, and you may need a key to be able to read the information", @@ -6708,14 +6605,6 @@ ], "usage": "hf mfu wrbl [-hl] [-k ] -b -d [--force]" }, - "hf ntag424 help": { - "command": "hf ntag424 help", - "description": "help This help view Display content from tag dump file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf ntag424 info": { "command": "hf ntag424 info", "description": "Get info about NXP NTAG424 DNA Family styled tag.", @@ -6780,14 +6669,6 @@ ], "usage": "hf search [-hv]" }, - "hf seos help": { - "command": "hf seos help", - "description": "help This help list List SEOS history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf seos info": { "command": "hf seos info", "description": "Get info from SEOS tags", @@ -6838,14 +6719,6 @@ ], "usage": "hf sniff [-h] [--sp ] [--st ] [--smode [none|drop|min|max|avg]] [--sratio ]" }, - "hf st25ta help": { - "command": "hf st25ta help", - "description": "help This help list List ISO 14443A/7816 history ndefread read NDEF file on tag", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf st25ta info": { "command": "hf st25ta info", "description": "Get info about ST25TA tag", @@ -6943,14 +6816,6 @@ ], "usage": "hf st25ta sim [-h] -u " }, - "hf tesla help": { - "command": "hf tesla help", - "description": "help This help list List ISO 14443A/7816 history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf tesla info": { "command": "hf tesla info", "description": "Get info about TESLA Key tag", @@ -6984,14 +6849,6 @@ ], "usage": "hf tesla list [-h1crux] [--frame] [-f ]" }, - "hf texkom help": { - "command": "hf texkom help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf texkom reader": { "command": "hf texkom reader", "description": "Read a texkom tag", @@ -7029,14 +6886,6 @@ ], "usage": "hf texkom sim [-hvt] [--raw ] [--id ] [--timeout ]" }, - "hf thinfilm help": { - "command": "hf thinfilm help", - "description": "help This help list List NFC Barcode / Thinfilm history - not correct", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf thinfilm info": { "command": "hf thinfilm info", "description": "Get info from Thinfilm tags", @@ -7098,14 +6947,6 @@ ], "usage": "hf topaz dump [-h] [-f ] [--ns]" }, - "hf topaz help": { - "command": "hf topaz help", - "description": "help This help list List Topaz history view Display content from tag dump file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf topaz info": { "command": "hf topaz info", "description": "Get info from Topaz tags", @@ -7250,14 +7091,6 @@ ], "usage": "hf tune [-h] [-n ] [--bar] [--mix] [--value]" }, - "hf waveshare help": { - "command": "hf waveshare help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf waveshare loadbmp": { "command": "hf waveshare loadbmp", "description": "Load BMP file to Waveshare NFC ePaper.", @@ -7294,14 +7127,6 @@ ], "usage": "hf xerox dump [-hd] [-f ]" }, - "hf xerox help": { - "command": "hf xerox help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hf xerox info": { "command": "hf xerox info", "description": "Tag information for ISO/IEC 14443 type B / XEROX based tags", @@ -7416,14 +7241,6 @@ ], "usage": "hw fpgaoff [-h]" }, - "hw help": { - "command": "hw help", - "description": "------------- ----------------------- Hardware ----------------------- help This help connect Connect Proxmark3 to serial port version Show version information about the client and the connected Proxmark3, if any", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "hw lcd": { "command": "hw lcd", "description": "Send command/data to LCD", @@ -7649,14 +7466,6 @@ ], "usage": "lf awid demod [-h]" }, - "lf awid help": { - "command": "lf awid help", - "description": "help this help demod demodulate an AWID FSK tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf awid reader": { "command": "lf awid reader", "description": "read a AWID Prox tag", @@ -7725,11 +7534,29 @@ }, "lf config": { "command": "lf config", - "description": "Get/Set config for LF sampling, bit/sample, decimation, frequency These changes are temporary, will be reset after a power cycle.", - "notes": [], + "description": "Get/Set config for LF sampling, bit/sample, decimation, frequency These changes are temporary, will be reset after a power cycle. - use `lf read` performs a read (active field) - use `lf sniff` performs a sniff (no active field)", + "notes": [ + "lf config -> shows current config", + "lf config -b 8 --125 -> samples at 125 kHz, 8 bps", + "lf config -b 4 --134 --dec 3 -> samples at 134 kHz, averages three samples into one, stored with a resolution of 4 bits per sample", + "lf config --trig 20 -s 10000 -> trigger sampling when above 20, skip 10 000 first samples after triggered", + "lf config --reset -> reset back to default values" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "--125 125 kHz frequency", + "--134 134 kHz frequency", + "-a, --avg <0|1> averaging - if set, will average the stored sample value when decimating (default 1)", + "-b, --bps <1-8> sets resolution of bits per sample (default 8)", + "--dec <1-8> sets decimation. A value of N saves only 1 in N samples (default 1)", + "--divisor <19-255> Manually set freq divisor. 88 -> 134 kHz, 95 -> 125 kHz", + "-f, --freq <47-600> manually set frequency in kHz", + "-r, --reset reset values to defaults", + "-s, --skip sets a number of samples to skip before capture (default 0)", + "-t, --trig <0-128> sets trigger threshold. 0 means no threshold" + ], + "usage": "lf config [-hr] [--125] [--134] [-a <0|1>] [-b <1-8>] [--dec <1-8>] [--divisor <19-255>] [-f <47-600>] [-s ] [-t <0-128>]" }, "lf cotag demod": { "command": "lf cotag demod", @@ -7743,14 +7570,6 @@ ], "usage": "lf cotag demod [-h]" }, - "lf cotag help": { - "command": "lf cotag help", - "description": "help This help demod demodulate an COTAG tag", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf cotag reader": { "command": "lf cotag reader", "description": "read a COTAG tag, the current support for COTAG is limited.", @@ -7795,14 +7614,6 @@ ], "usage": "lf destron demod [-h]" }, - "lf destron help": { - "command": "lf destron help", - "description": "help This help demod demodulate an Destron tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf destron reader": { "command": "lf destron reader", "description": "read a Destron tag", @@ -7886,14 +7697,6 @@ ], "usage": "lf em 410x demod [-hia] [--clk ] [--err ] [--len ]" }, - "lf em 410x help": { - "command": "lf em 410x help", - "description": "help This help demod demodulate a EM410x tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf em 410x reader": { "command": "lf em 410x reader", "description": "read EM 410x tag", @@ -8020,14 +7823,6 @@ ], "usage": "lf em 4x05 dump [-h] [-p ] [-f ]" }, - "lf em 4x05 help": { - "command": "lf em 4x05 help", - "description": "help This help demod demodulate a EM4x05/EM4x69 tag from the GraphBuffer sniff Attempt to recover em4x05 commands from sample buffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf em 4x05 info": { "command": "lf em 4x05 info", "description": "Tag information EM4205/4305/4469//4569 tags. Tag must be on antenna.", @@ -8217,14 +8012,6 @@ ], "usage": "lf em 4x50 eview [-h]" }, - "lf em 4x50 help": { - "command": "lf em 4x50 help", - "description": "help This help ----------- --------------------- operations --------------------- ----------- --------------------- simulation ---------------------", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf em 4x50 info": { "command": "lf em 4x50 info", "description": "Tag information EM4x50.", @@ -8390,14 +8177,6 @@ ], "usage": "lf em 4x70 brute [-h] [--par] -b --rnd --frn [-s ]" }, - "lf em 4x70 help": { - "command": "lf em 4x70 help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf em 4x70 info": { "command": "lf em 4x70 info", "description": "Tag Information EM4x70 Tag variants include ID48 automotive transponder. ID48 does not use command parity (default). V4070 and EM4170 do require parity bit.", @@ -8472,14 +8251,6 @@ ], "usage": "lf em 4x70 writepin [-h] [--par] -p " }, - "lf em help": { - "command": "lf em help", - "description": "help This help 410x { EM 4102 commands... } 4x05 { EM 4205 / 4305 / 4369 / 4469 commands... } 4x50 { EM 4350 / 4450 commands... } 4x70 { EM 4070 / 4170 commands... }", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf fdxb clone": { "command": "lf fdxb clone", "description": "clone a FDX-B tag to a T55x7, Q5/T5555 or EM4305/4469 tag.", @@ -8513,14 +8284,6 @@ ], "usage": "lf fdxb demod [-h]" }, - "lf fdxb help": { - "command": "lf fdxb help", - "description": "help this help demod demodulate a FDX-B ISO11784/85 tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf fdxb reader": { "command": "lf fdxb reader", "description": "read a FDX-B animal tag Note that the continuous mode is less verbose", @@ -8585,14 +8348,6 @@ ], "usage": "lf gallagher demod [-h]" }, - "lf gallagher help": { - "command": "lf gallagher help", - "description": "help This help demod demodulate an GALLAGHER tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf gallagher reader": { "command": "lf gallagher reader", "description": "read a GALLAGHER tag", @@ -8658,14 +8413,6 @@ ], "usage": "lf gproxii demod [-h] [-r ]" }, - "lf gproxii help": { - "command": "lf gproxii help", - "description": "help this help demod demodulate a G Prox II tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf gproxii reader": { "command": "lf gproxii reader", "description": "read a Guardall tag", @@ -8695,14 +8442,6 @@ ], "usage": "lf gproxii sim [-h] --xor --fmt --fc --cn " }, - "lf help": { - "command": "lf help", - "description": "help This help ----------- -------------- Low Frequency -------------- awid { AWID RFIDs... } cotag { COTAG CHIPs... } destron { FDX-A Destron RFIDs... } em { EM CHIPs & RFIDs... } fdxb { FDX-B RFIDs... } gallagher { GALLAGHER RFIDs... } gproxii { Guardall Prox II RFIDs... } hid { HID Prox RFIDs... } hitag { Hitag CHIPs... } idteck { Idteck RFIDs... } indala { Indala RFIDs... } io { ioProx RFIDs... } jablotron { Jablotron RFIDs... } keri { KERI RFIDs... } motorola { Motorola RFIDs... } nedap { Nedap RFIDs... } nexwatch { NexWatch RFIDs... } noralsy { Noralsy RFIDs... } pac { PAC/Stanley RFIDs... } paradox { Paradox RFIDs... } pcf7931 { PCF7931 CHIPs... } presco { Presco RFIDs... } pyramid { Farpointe/Pyramid RFIDs... } securakey { Securakey RFIDs... } ti { TI CHIPs... } t55xx { T55xx CHIPs... } viking { Viking RFIDs... } visa2000 { Visa2000 RFIDs... } ----------- --------------------- General --------------------- search Read and Search for valid known tag", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf hid brute": { "command": "lf hid brute", "description": "Enables bruteforce of HID readers with specified facility code or card number. This is an attack against the reader. If the field being bruteforced is provided, it starts with it and goes up / down one step while maintaining other supplied values. If the field being bruteforced is not provided, it will iterate through the full range while maintaining other supplied values.", @@ -8767,14 +8506,6 @@ ], "usage": "lf hid demod [-h]" }, - "lf hid help": { - "command": "lf hid help", - "description": "help this help demod demodulate HID Prox tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf hid reader": { "command": "lf hid reader", "description": "read a HID Prox tag", @@ -8868,14 +8599,6 @@ ], "usage": "lf hitag eload [-h12sm] -f " }, - "lf hitag help": { - "command": "lf hitag help", - "description": "help This help list List Hitag trace history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf hitag info": { "command": "lf hitag info", "description": "Hitag2 tag information", @@ -9016,14 +8739,6 @@ ], "usage": "lf idteck demod [-h]" }, - "lf idteck help": { - "command": "lf idteck help", - "description": "help This help demod demodulate an Idteck tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf idteck reader": { "command": "lf idteck reader", "description": "read a Idteck tag", @@ -9088,11 +8803,26 @@ }, "lf indala clone": { "command": "lf indala clone", - "description": "clone Indala UID to T55x7 or Q5/T5555 tag using different known formats", - "notes": [], + "description": "clone Indala UID to T55x7 or Q5/T5555 tag using different known formats Warning, encoding with FC/CN doesn't always work", + "notes": [ + "lf indala clone --heden 888", + "lf indala clone --fc 123 --cn 1337", + "lf indala clone --fc 123 --cn 1337 --4041x", + "lf indala clone -r a0000000a0002021", + "lf indala clone -r 80000001b23523a6c2e31eba3cbee4afb3c6ad1fcf649393928c14e5" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-r, --raw raw bytes", + "--heden Card number for Heden 2L format", + "--fc Facility code (26 bit H10301 format)", + "--cn Card number (26 bit H10301 format)", + "--q5 Optional - specify writing to Q5/T5555 tag", + "--em Optional - specify writing to EM4305/4469 tag", + "--4041x Optional - specify Indala 4041X format, must use with fc and cn" + ], + "usage": "lf indala clone [-h] [-r ] [--heden ] [--fc ] [--cn ] [--q5] [--em] [--4041x]" }, "lf indala demod": { "command": "lf indala demod", @@ -9112,14 +8842,6 @@ ], "usage": "lf indala demod [-hi] [--clock ] [--maxerr ]" }, - "lf indala help": { - "command": "lf indala help", - "description": "help This help demod Demodulate an Indala tag (PSK1) from the GraphBuffer altdemod Alternative method to demodulate samples for Indala 64 bit UID (option '224' for 224 bit)", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf indala reader": { "command": "lf indala reader", "description": "read a Indala tag", @@ -9186,14 +8908,6 @@ ], "usage": "lf io demod [-h]" }, - "lf io help": { - "command": "lf io help", - "description": "help this help demod demodulate an ioProx tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf io reader": { "command": "lf io reader", "description": "read a ioProx tag", @@ -9263,14 +8977,6 @@ ], "usage": "lf jablotron demod [-h]" }, - "lf jablotron help": { - "command": "lf jablotron help", - "description": "help This help demod demodulate an Jablotron tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf jablotron reader": { "command": "lf jablotron reader", "description": "read a jablotron tag", @@ -9327,14 +9033,6 @@ ], "usage": "lf keri demod [-h]" }, - "lf keri help": { - "command": "lf keri help", - "description": "help This help demod demodulate an KERI tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf keri reader": { "command": "lf keri reader", "description": "read a keri tag", @@ -9390,14 +9088,6 @@ ], "usage": "lf motorola demod [-h]" }, - "lf motorola help": { - "command": "lf motorola help", - "description": "help This help demod demodulate an MOTOROLA tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf motorola reader": { "command": "lf motorola reader", "description": "read a Motorola tag", @@ -9453,14 +9143,6 @@ ], "usage": "lf nedap demod [-h]" }, - "lf nedap help": { - "command": "lf nedap help", - "description": "help This help demod demodulate Nedap tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf nedap reader": { "command": "lf nedap reader", "description": "read a Nedap tag", @@ -9527,14 +9209,6 @@ ], "usage": "lf nexwatch demod [-h]" }, - "lf nexwatch help": { - "command": "lf nexwatch help", - "description": "help This help demod demodulate a NexWatch tag (nexkey, quadrakey) from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf nexwatch reader": { "command": "lf nexwatch reader", "description": "read a Nexwatch tag", @@ -9601,14 +9275,6 @@ ], "usage": "lf noralsy demod [-h]" }, - "lf noralsy help": { - "command": "lf noralsy help", - "description": "help This help demod demodulate an Noralsy tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf noralsy reader": { "command": "lf noralsy reader", "description": "read a Noralsy tag", @@ -9668,14 +9334,6 @@ ], "usage": "lf pac demod [-h]" }, - "lf pac help": { - "command": "lf pac help", - "description": "help This help demod demodulate a PAC tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf pac reader": { "command": "lf pac reader", "description": "read a PAC/Stanley tag", @@ -9737,14 +9395,6 @@ ], "usage": "lf paradox demod [-h] [--old]" }, - "lf paradox help": { - "command": "lf paradox help", - "description": "help This help demod demodulate a Paradox FSK tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf paradox reader": { "command": "lf paradox reader", "description": "read a Paradox tag", @@ -9795,14 +9445,6 @@ ], "usage": "lf pcf7931 config [-hr] [-p ] [-d ] [--lw ] [--lp ]" }, - "lf pcf7931 help": { - "command": "lf pcf7931 help", - "description": "help This help config Configure the password, the tags initialization delay and time offsets (optional)", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf pcf7931 reader": { "command": "lf pcf7931 reader", "description": "read a PCF7931 tag", @@ -9861,14 +9503,6 @@ ], "usage": "lf presco demod [-h]" }, - "lf presco help": { - "command": "lf presco help", - "description": "help This help demod demodulate Presco tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf presco reader": { "command": "lf presco reader", "description": "read a presco tag", @@ -9928,14 +9562,6 @@ ], "usage": "lf pyramid demod [-h]" }, - "lf pyramid help": { - "command": "lf pyramid help", - "description": "help this help demod demodulate a Pyramid FSK tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf pyramid reader": { "command": "lf pyramid reader", "description": "read a Farpointe/Pyramid tag", @@ -10028,14 +9654,6 @@ ], "usage": "lf securakey demod [-h]" }, - "lf securakey help": { - "command": "lf securakey help", - "description": "help This help demod demodulate an Securakey tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf securakey reader": { "command": "lf securakey reader", "description": "read a Securakey tag", @@ -10114,11 +9732,27 @@ }, "lf simfsk": { "command": "lf simfsk", - "description": "Simulate FSK tag from DemodBuffer or input. There are about four FSK modulations to know of. FSK1 - where fc/8 = high and fc/5 = low FSK1a - is inverted FSK1, ie: fc/5 = high and fc/8 = low FSK2 - where fc/10 = high and fc/8 = low FSK2a - is inverted FSK2, ie: fc/10 = high and fc/8 = low", - "notes": [], + "description": "Simulate FSK tag from DemodBuffer or input. There are about four FSK modulations to know of. FSK1 - where fc/8 = high and fc/5 = low FSK1a - is inverted FSK1, ie: fc/5 = high and fc/8 = low FSK2 - where fc/10 = high and fc/8 = low FSK2a - is inverted FSK2, ie: fc/10 = high and fc/8 = low NOTE: if you set one clock manually set them all manually", + "notes": [ + "lf simfsk -c 40 --high 8 --low 5 -d 010203 -> FSK1 rf/40 data 010203", + "lf simfsk -c 40 --high 5 --low 8 -d 010203 -> FSK1a rf/40 data 010203", + "lf simfsk -c 64 --high 10 --low 8 -d 010203 -> FSK2 rf/64 data 010203", + "lf simfsk -c 64 --high 8 --low 10 -d 010203 -> FSK2a rf/64 data 010203", + "", + "lf simfsk -c 50 --high 10 --low 8 -d 1D5559555569A9A555A59569 -> simulate HID Prox tag manually", + "lf simfsk -c 50 --high 10 --low 8 --stt -d 011DB2487E8D811111111111 -> simulate AWID tag manually" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-c, --clk manually set clock - can autodetect if using DemodBuffer (default 64)", + "--low manually set larger Field Clock", + "--high manually set smaller Field Clock", + "--stt TBD! - STT to enable a gap between playback repetitions (default: no gap)", + "-d, --data data to sim - omit to use DemodBuffer", + "-v, --verbose verbose output" + ], + "usage": "lf simfsk [-hv] [-c ] [--low ] [--high ] [--stt] [-d ]" }, "lf simpsk": { "command": "lf simpsk", @@ -10144,19 +9778,38 @@ }, "lf sniff": { "command": "lf sniff", - "description": "Sniff low frequency signal. You need to configure the LF part on the Proxmark3 device manually. Usually a trigger and skip samples is a good thing to set before doing a low frequency sniff.", - "notes": [], + "description": "Sniff low frequency signal. You need to configure the LF part on the Proxmark3 device manually. Usually a trigger and skip samples is a good thing to set before doing a low frequency sniff. - use `lf config` to set parameters. - use `data plot` to look at sniff signal. - use `lf search -1` to see if signal can be automatic decoded", + "notes": [ + "lf sniff -v", + "lf sniff -s 3000 -@ -> oscilloscope style" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-s, --samples number of samples to collect", + "-v, --verbose verbose output", + "-@ continuous sniffing mode" + ], + "usage": "lf sniff [-hv@] [-s ]" }, "lf t55xx bruteforce": { "command": "lf t55xx bruteforce", - "description": "This command uses bruteforce to scan a number range. Try reading Page 0, block 7 before.", - "notes": [], + "description": "This command uses bruteforce to scan a number range. Try reading Page 0, block 7 before. WARNING this may brick non-password protected chips!", + "notes": [ + "lf t55xx bruteforce --r2 -s aaaaaa77 -e aaaaaa99" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-s, --start search start password (4 hex bytes)", + "-e, --end search end password (4 hex bytes)", + "--r0 downlink - fixed bit length", + "--r1 downlink - long leading reference", + "--r2 downlink - leading zero", + "--r3 downlink - 1 of 4 coding reference", + "--all try all downlink modes (def)" + ], + "usage": "lf t55xx bruteforce [-h] -s -e [--r0] [--r1] [--r2] [--r3] [--all]" }, "lf t55xx chk": { "command": "lf t55xx chk", @@ -10311,14 +9964,6 @@ ], "usage": "lf t55xx dump [-ho] [-f ] [-p ] [--ns] [--r0] [--r1] [--r2] [--r3]" }, - "lf t55xx help": { - "command": "lf t55xx help", - "description": "----------- ---------------------------- notice ----------------------------- Remember to run `lf t55xx detect` first whenever a new card is placed on the Proxmark3 or the config block changed. help This help ----------- --------------------- operations --------------------- config Set/Get T55XX configuration (modulation, inverted, offset, rate) detect Try detecting the tag modulation from reading the configuration block info Show T55x7 configuration data (page 0/ blk 0) trace Show T55x7 traceability data (page 1/ blk 0-1) ----------- --------------------- recovery --------------------- sniff Attempt to recover T55xx commands from sample buffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf t55xx info": { "command": "lf t55xx info", "description": "Show T55x7 configuration data (page 0/ blk 0) from reading the configuration block from tag. Use `-c` to specify a config block data to be used instead of reading tag.", @@ -10385,19 +10030,45 @@ }, "lf t55xx read": { "command": "lf t55xx read", - "description": "Read T55xx block data. This commands defaults to page 0.", - "notes": [], + "description": "Read T55xx block data. This commands defaults to page 0. * * * WARNING * * * Use of read with password on a tag not configured for a password can damage the tag * * * * * * * * * *", + "notes": [ + "lf t55xx read -b 0 -> read data from block 0", + "lf t55xx read -b 0 --pwd 01020304 -> read data from block 0, pwd 01020304", + "lf t55xx read -b 0 --pwd 01020304 -o -> read data from block 0, pwd 01020304, override" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-b, --blk <0-7> block number to read", + "-p, --pwd password (4 hex bytes)", + "-o, --override override safety check", + "--pg1 read page 1", + "--r0 downlink - fixed bit length (detected def)", + "--r1 downlink - long leading reference", + "--r2 downlink - leading zero", + "--r3 downlink - 1 of 4 coding reference" + ], + "usage": "lf t55xx read [-ho] -b <0-7> [-p ] [--pg1] [--r0] [--r1] [--r2] [--r3]" }, "lf t55xx recoverpw": { "command": "lf t55xx recoverpw", - "description": "This command uses a few tricks to try to recover mangled password. Try reading Page 0, block 7 before.", - "notes": [], + "description": "This command uses a few tricks to try to recover mangled password. Try reading Page 0, block 7 before. WARNING this may brick non-password protected chips!", + "notes": [ + "lf t55xx recoverpw", + "lf t55xx recoverpw -p 11223344", + "lf t55xx recoverpw -p 11223344 --r3" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-p, --pwd password (4 hex bytes)", + "--r0 downlink - fixed bit length", + "--r1 downlink - long leading reference", + "--r2 downlink - leading zero", + "--r3 downlink - 1 of 4 coding reference", + "--all try all downlink modes (def)" + ], + "usage": "lf t55xx recoverpw [-h] [-p ] [--r0] [--r1] [--r2] [--r3] [--all]" }, "lf t55xx resetread": { "command": "lf t55xx resetread", @@ -10553,14 +10224,6 @@ ], "usage": "lf ti demod [-h]" }, - "lf ti help": { - "command": "lf ti help", - "description": "help This help demod Demodulate raw bits for TI LF tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf ti reader": { "command": "lf ti reader", "description": "read a TI tag", @@ -10637,14 +10300,6 @@ ], "usage": "lf viking demod [-h]" }, - "lf viking help": { - "command": "lf viking help", - "description": "help This help demod demodulate a Viking tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf viking reader": { "command": "lf viking reader", "description": "read a Viking AM tag", @@ -10700,14 +10355,6 @@ ], "usage": "lf visa2000 demod [-h]" }, - "lf visa2000 help": { - "command": "lf visa2000 help", - "description": "help This help demod demodulate an VISA2000 tag from the GraphBuffer", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "lf visa2000 reader": { "command": "lf visa2000 reader", "description": "read a visa2000 tag", @@ -10766,14 +10413,6 @@ ], "usage": "mem dump [-hv] [-o ] [-l ] [-f ] [-c ]" }, - "mem help": { - "command": "mem help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "mem info": { "command": "mem info", "description": "Collect signature and verify it from flash memory", @@ -10853,14 +10492,6 @@ ], "usage": "mem spiffs dump [-he] -s [-d ]" }, - "mem spiffs help": { - "command": "mem spiffs help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "mem spiffs info": { "command": "mem spiffs info", "description": "Print file system info and usage statistics", @@ -11014,14 +10645,6 @@ ], "usage": "msleep [-h] [-t ]" }, - "nfc barcode help": { - "command": "nfc barcode help", - "description": "-------- ------------------ NFC Barcode -------------------- -------- --------------------- General --------------------- help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "nfc barcode read": { "command": "nfc barcode read", "description": "Get info from Thinfilm tags", @@ -11065,21 +10688,24 @@ ], "usage": "nfc decode [-hv] [-d ] [-f ]" }, - "nfc help": { - "command": "nfc help", - "description": "-------- --------------------- NFC Tags -------------------- type1 { NFC Forum Tag Type 1... } type2 { NFC Forum Tag Type 2... } type4a { NFC Forum Tag Type 4 ISO14443A... } type4b { NFC Forum Tag Type 4 ISO14443B... } mf { NFC Type MIFARE Classic/Plus Tag... } barcode { NFC Barcode Tag... } -------- --------------------- General --------------------- help This help decode Decode NDEF records", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "nfc mf cformat": { "command": "nfc mf cformat", - "description": "format MIFARE Classic Tag as a NFC tag with Data Exchange Format (NDEF) If no given, UID will be used as filename. It will try default keys and MAD keys to detect if tag is already formatted in order to write.", - "notes": [], + "description": "format MIFARE Classic Tag as a NFC tag with Data Exchange Format (NDEF) If no given, UID will be used as filename. It will try default keys and MAD keys to detect if tag is already formatted in order to write. If not, it will try finding a key file based on your UID. ie, if you ran autopwn before", + "notes": [ + "hf mf ndefformat", + "hf mf ndefformat --1k -> MIFARE Classic 1k", + "hf mf ndefformat --keys hf-mf-01020304-key.bin -> MIFARE 1k with keys from specified file" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help", + "-k, --keys filename of keys", + "--mini MIFARE Classic Mini / S20", + "--1k MIFARE Classic 1k / S50 (def)", + "--2k MIFARE Classic/Plus 2k", + "--4k MIFARE Classic 4k / S70" + ], + "usage": "hf mf ndefformat [-h] [-k ] [--mini] [--1k] [--2k] [--4k]" }, "nfc mf cread": { "command": "nfc mf cread", @@ -11123,14 +10749,6 @@ ], "usage": "hf mf ndefwrite [-hpv] [-d ] [-f ] [--mini] [--1k] [--2k] [--4k]" }, - "nfc mf help": { - "command": "nfc mf help", - "description": "-------- --------- NFC Type MIFARE Classic/Plus Tag -------- -------- --------------------- General --------------------- help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "nfc mf pread": { "command": "nfc mf pread", "description": "Prints NFC Data Exchange Format (NDEF)", @@ -11151,14 +10769,6 @@ ], "usage": "hf mfp ndefread [-hvb] [--aid ] [-k ] [-f ]" }, - "nfc type1 help": { - "command": "nfc type1 help", - "description": "-------- -------------- NFC Forum Tag Type 1 --------------- -------- --------------------- General --------------------- help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "nfc type1 read": { "command": "nfc type1 read", "description": "Get info from Topaz tags", @@ -11174,14 +10784,6 @@ ], "usage": "hf topaz info [-hv] [-f ]" }, - "nfc type2 help": { - "command": "nfc type2 help", - "description": "-------- -------------- NFC Forum Tag Type 2 --------------- -------- --------------------- General --------------------- help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "nfc type2 read": { "command": "nfc type2 read", "description": "Prints NFC Data Exchange Format (NDEF)", @@ -11212,14 +10814,6 @@ ], "usage": "hf 14a ndefformat [-hv]" }, - "nfc type4a help": { - "command": "nfc type4a help", - "description": "-------- --------- NFC Forum Tag Type 4 ISO14443A ---------- -------- --------------------- General --------------------- help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "nfc type4a read": { "command": "nfc type4a read", "description": "Read NFC Data Exchange Format (NDEF) file on Type 4 NDEF tag", @@ -11269,14 +10863,6 @@ ], "usage": "hf 14a ndefwrite [-hpv] [-d ] [-f ]" }, - "nfc type4b help": { - "command": "nfc type4b help", - "description": "-------- --------- NFC Forum Tag Type 4 ISO14443B ------------- -------- --------------------- General --------------------- help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "nfc type4b read": { "command": "nfc type4b read", "description": "Print NFC Data Exchange Format (NDEF)", @@ -11333,14 +10919,6 @@ ], "usage": "piv getdata [-hskatw] [--aid ] " }, - "piv help": { - "command": "piv help", - "description": "help This help list List ISO7816 history", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "piv list": { "command": "piv list", "description": "Alias of `trace list -t 7816` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", @@ -11508,14 +11086,6 @@ ], "usage": "prefs get savepaths [-h]" }, - "prefs help": { - "command": "prefs help", - "description": "help This help get { Get a preference } set { Set a preference } show Show all preferences", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "prefs set barmode": { "command": "prefs set barmode", "description": "Set persistent preference of HF/LF tune command styled output in the client", @@ -11590,14 +11160,6 @@ ], "usage": "prefs set emoji [-h] [--alias] [--emoji] [--alttext] [--none]" }, - "prefs set help": { - "command": "prefs set help", - "description": "help This help barmode Set bar mode clientdebug Set client debug level clientdelay Set client execution delay color Set color support emoji Set emoji display hints Set hint display savepaths ... to be adjusted next ... output Set dump output style plotsliders Set plot slider display", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "prefs set hints": { "command": "prefs set hints", "description": "Set persistent preference of showing hint messages in the client", @@ -11695,13 +11257,17 @@ ], "usage": "rem [-h] []..." }, - "script help": { - "command": "script help", - "description": "This is a feature to run Lua/Cmd scripts. You can place scripts within the luascripts/cmdscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", - "notes": [], + "script list": { + "command": "script list", + "description": "List available Lua, Cmd and Python scripts", + "notes": [ + "script list" + ], "offline": true, - "options": [], - "usage": "" + "options": [ + "-h, --help This help" + ], + "usage": "script list [-h]" }, "script run": { "command": "script run", @@ -11730,14 +11296,6 @@ ], "usage": "smart brute [-ht]" }, - "smart help": { - "command": "smart help", - "description": "help This help list List ISO 7816 history upgrade Upgrade sim module firmware", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "smart info": { "command": "smart info", "description": "Extract more detailed information from smart card.", @@ -11822,14 +11380,6 @@ ], "usage": "smart setclock [-h] [--16mhz] [--8mhz] [--4mhz]" }, - "smart upgrade": { - "command": "smart upgrade", - "description": "[=] ------------------------------------------------------------------- [!] WARNING - sim module firmware upgrade [!] A dangerous command, do wrong and you could brick the sim module [=] -------------------------------------------------------------------", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "trace extract": { "command": "trace extract", "description": "Extracts protocol authentication challenges from trace buffer", @@ -11844,14 +11394,6 @@ ], "usage": "trace extract [-h1]" }, - "trace help": { - "command": "trace help", - "description": "help This help extract Extract authentication challenges found in trace list List protocol data in trace buffer load Load trace from file save Save trace buffer to file", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "trace list": { "command": "trace list", "description": "Annotate trace buffer with selected protocol data You can load a trace from file (see `trace load -h`) or it be downloaded from device by default", @@ -11924,11 +11466,15 @@ }, "usart btfactory": { "command": "usart btfactory", - "description": "Reset BT add-on to factory settings This requires 1) BTpower to be turned ON 2) BT add-on to NOT be connected => the add-on blue LED must blink", - "notes": [], + "description": "Reset BT add-on to factory settings This requires 1) BTpower to be turned ON 2) BT add-on to NOT be connected => the add-on blue LED must blink WARNING: process only if strictly needed!", + "notes": [ + "usart btfactory" + ], "offline": false, - "options": [], - "usage": "" + "options": [ + "-h, --help This help" + ], + "usage": "usart btfactory [-h]" }, "usart btpin": { "command": "usart btpin", @@ -11961,14 +11507,6 @@ ], "usage": "usart config [-hNEO] [-b ]" }, - "usart help": { - "command": "usart help", - "description": "help This help", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "usart rx": { "command": "usart rx", "description": "Receive string over USART. WARNING: it will have side-effects if used in USART HOST mode!", @@ -12070,14 +11608,6 @@ ], "usage": "wiegand encode [-h] [--fc ] --cn [--issue ] [--oem ] [-w ] [--pre]" }, - "wiegand help": { - "command": "wiegand help", - "description": "help This help list List available wiegand formats encode Encode to wiegand raw hex (currently for HID Prox) decode Convert raw hex to decoded wiegand format (currently for HID Prox)", - "notes": [], - "offline": true, - "options": [], - "usage": "" - }, "wiegand list": { "command": "wiegand list", "description": "List available wiegand formats", @@ -12092,8 +11622,8 @@ } }, "metadata": { - "commands_extracted": 759, + "commands_extracted": 675, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-06-25T20:42:06" + "extracted_on": "2023-06-27T13:20:13" } } \ No newline at end of file From b0c2ad8ac27fe2c93685b5cfd8284fdf609a3114 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 27 Jun 2023 15:25:00 +0200 Subject: [PATCH 583/924] style --- armsrc/iso15693.c | 2 +- armsrc/mifaresim.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index 16dc3c575..a52b953ff 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -1846,7 +1846,7 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string, bool icla Dbprintf("DecodeTagFSK count..... %d", dtagfsk.count); Dbprintf("DecodeReader State..... %d", dreader.state); Dbprintf("DecodeReader byteCnt... %d", dreader.byteCount); - Dbprintf("DecodeReader posCount.. %d", dreader.posCount); + Dbprintf("DecodeReader posCount.. %d", dreader.posCount); } Dbprintf("Trace length........... " _YELLOW_("%d"), BigBuf_get_traceLen()); } diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index 81f26c5cb..5aa1a054a 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -893,7 +893,7 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 // Compliance of MIFARE Classic EV1 1K Datasheet footnote of Table 8 // If access bits show that key B is Readable, any subsequent memory access will be refused. - + if (cardAUTHKEY == AUTHKEYB && IsKeyBReadable(blockNo)) { EmSend4bit(mf_crypto1_encrypt4bit(pcs, CARD_NACK_NA)); FpgaDisableTracing(); From ed0d18f05d6540052e1b973a201fc4b397831465 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 28 Jun 2023 13:27:50 +0200 Subject: [PATCH 584/924] QL88 tag identification. Thanks to AnnPlusPluss and Atlab for finding the key --- CHANGELOG.md | 1 + armsrc/mifarecmd.c | 18 ++++++++++++++++++ client/src/mifare/mifarehost.c | 2 ++ include/pm3_cmd.h | 1 + 4 files changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47b958b98..ca0fede15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] ## [Seven.4.16717][2023-06-25] + - Change `hf 14a info` - now identifes QL88 tags (@iceman1001) - Added support for compiling on iOS (@The-SamminAter) - Fixed viewing MFC dump - border char is now white (@iceman1001) - Changed `data diff` - to print filenames in header if it fits (@iceman1001) diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 4492c3195..c8a2d5fa2 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -2631,6 +2631,7 @@ void MifareCIdent(bool is_mfc) { uint8_t gen4gmd[4] = {MIFARE_MAGIC_GDM_AUTH_KEY, 0x00, 0x6C, 0x92}; uint8_t gen4GetConf[8] = {GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; uint8_t superGen1[9] = {0x0A, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x10, 0x14, 0x1D}; + uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); uint8_t *buf = BigBuf_malloc(PM3_CMD_DATA_SIZE); uint8_t *uid = BigBuf_malloc(10); @@ -2787,7 +2788,24 @@ void MifareCIdent(bool is_mfc) { isGen = MAGIC_GEN_4GDM; } } + + if (isGen != MAGIC_GEN_4GDM) { + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + SpinDelay(40); + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); + res = iso14443a_select_card(uid, NULL, &cuid, true, 0, true); + if (res == 2) { + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs; + pcs = &mpcs; + if (mifare_classic_authex(pcs, cuid, 68, MF_KEY_B, 0x707B11FC1481, AUTH_FIRST, NULL, NULL) == 0) { + isGen = MAGIC_QL88; + } + crypto1_deinit(pcs); + } + } } + } }; diff --git a/client/src/mifare/mifarehost.c b/client/src/mifare/mifarehost.c index 3b37182fe..6c9d8caa2 100644 --- a/client/src/mifare/mifarehost.c +++ b/client/src/mifare/mifarehost.c @@ -1431,6 +1431,8 @@ int detect_mf_magic(bool is_mfc) { case MAGIC_NTAG21X: PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("NTAG21x")); break; + case MAGIC_QL88: + PrintAndLogEx(SUCCESS, "Magic capabilities : " _GREEN_("QL88")); default: break; } diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 7a19e6dbe..0983ee2e1 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -621,6 +621,7 @@ typedef struct { #define CMD_HF_MIFARE_ACQ_ENCRYPTED_NONCES 0x0613 #define CMD_HF_MIFARE_ACQ_NONCES 0x0614 #define CMD_HF_MIFARE_STATIC_NESTED 0x0615 +#define CMD_HF_MIFARE_STATIC_ENC 0x0616 #define CMD_HF_MIFARE_READBL 0x0620 #define CMD_HF_MIFAREU_READBL 0x0720 From cbfab4fc2021867edcc213e84d0d5bed2d5df841 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 28 Jun 2023 13:29:08 +0200 Subject: [PATCH 585/924] maur keys. Ql88 sector 17 a/b, thanks to AnnPlusplus and Atlab! --- client/dictionaries/mfc_default_keys.dic | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 0d34541ff..d32346428 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -31,6 +31,11 @@ D01AFEEB890A # 17 B 4B791BEA7BCC # +# QL88 keys +# 17 A/B +2612C6DE84CA +707B11FC1481 +# # B0B1B2B3B4B5 C0C1C2C3C4C5 From 5de6fa443c343fb5c492cfe3e1daebd5e7cab964 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 28 Jun 2023 15:11:48 +0200 Subject: [PATCH 586/924] missing define for QL88 --- include/protocols.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/protocols.h b/include/protocols.h index f67ae1798..0183f9f0d 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -263,6 +263,8 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MAGIC_GEN_3 9 #define MAGIC_GEN_4GTU 10 #define MAGIC_GEN_4GDM 11 +#define MAGIC_QL88 12 + // Commands for configuration of Gen4 GTU cards. // see https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/magic_cards_notes.md From edd8e36d801077a5db035eae6c930e1005999103 Mon Sep 17 00:00:00 2001 From: nvx Date: Tue, 4 Jul 2023 00:04:57 +1000 Subject: [PATCH 587/924] Cleanup arm-side reader-mode mifare classic block read/write code. --- armsrc/Standalone/hf_colin.c | 10 +- armsrc/Standalone/hf_mattyrun.c | 10 +- armsrc/appmain.c | 31 +- armsrc/iso14443a.c | 10 +- armsrc/mifarecmd.c | 533 +++++++++----------------------- armsrc/mifarecmd.h | 16 +- armsrc/mifareutil.c | 125 +++----- armsrc/mifareutil.h | 16 +- client/src/cmdtrace.c | 18 +- include/protocols.h | 3 +- 10 files changed, 249 insertions(+), 523 deletions(-) diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index 2da9a582a..91fa971eb 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -821,7 +821,7 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { } for (uint8_t blockNo = 0; isOK && blockNo < NumBlocksPerSector(s); blockNo++) { - if (isOK && mifare_classic_readblock(pcs, colin_cjcuid, FirstBlockOfSector(s) + blockNo, dataoutbuf)) { + if (isOK && mifare_classic_readblock(pcs, FirstBlockOfSector(s) + blockNo, dataoutbuf)) { isOK = false; break; }; @@ -838,7 +838,7 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { } } - int res = mifare_classic_halt(pcs, colin_cjcuid); + int res = mifare_classic_halt(pcs); (void)res; crypto1_deinit(pcs); @@ -986,7 +986,7 @@ int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *data break; }; - if (mifare_classic_halt(NULL, colin_cjcuid)) { + if (mifare_classic_halt(NULL)) { DbprintfEx(FLAG_NEWLINE, "Halt error"); break; }; @@ -1006,7 +1006,7 @@ int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *data break; }; - if (mifare_classic_halt(NULL, colin_cjcuid)) { + if (mifare_classic_halt(NULL)) { DbprintfEx(FLAG_NEWLINE, "Halt error"); break; }; @@ -1043,7 +1043,7 @@ int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *data }; if (workFlags & 0x04) { - if (mifare_classic_halt(NULL, colin_cjcuid)) { + if (mifare_classic_halt(NULL)) { cjSetCursFRight(); DbprintfEx(FLAG_NEWLINE, "Halt error"); diff --git a/armsrc/Standalone/hf_mattyrun.c b/armsrc/Standalone/hf_mattyrun.c index 97a02a278..9b41f18c4 100644 --- a/armsrc/Standalone/hf_mattyrun.c +++ b/armsrc/Standalone/hf_mattyrun.c @@ -109,7 +109,7 @@ static int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_ break; }; - if (mifare_classic_halt(NULL, mattyrun_cuid)) { + if (mifare_classic_halt(NULL)) { DbprintfEx(FLAG_NEWLINE, "Halt error"); break; }; @@ -129,7 +129,7 @@ static int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_ break; }; - if (mifare_classic_halt(NULL, mattyrun_cuid)) { + if (mifare_classic_halt(NULL)) { DbprintfEx(FLAG_NEWLINE, "Halt error"); break; }; @@ -165,7 +165,7 @@ static int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_ }; if (workFlags & 0x04) { - if (mifare_classic_halt(NULL, mattyrun_cuid)) { + if (mifare_classic_halt(NULL)) { DbprintfEx(FLAG_NEWLINE, "Halt error"); break; }; @@ -267,7 +267,7 @@ static int saMifareECardLoad(uint32_t numofsectors, uint8_t keytype) { // failure to read one block, skips to next sector. for (uint8_t blockNo = 0; blockNo < NumBlocksPerSector(s); blockNo++) { - if (mifare_classic_readblock(pcs, mattyrun_cuid, FirstBlockOfSector(s) + blockNo, dataoutbuf)) { + if (mifare_classic_readblock(pcs, FirstBlockOfSector(s) + blockNo, dataoutbuf)) { retval = PM3_ESOFT; break; }; @@ -283,7 +283,7 @@ static int saMifareECardLoad(uint32_t numofsectors, uint8_t keytype) { } } - int res = mifare_classic_halt(pcs, mattyrun_cuid); + int res = mifare_classic_halt(pcs); (void)res; out: diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 184307042..6cdff3eb6 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -60,6 +60,7 @@ #include "ticks.h" #include "commonutil.h" #include "crc16.h" +#include "protocols.h" #ifdef WITH_LCD @@ -1556,7 +1557,9 @@ static void PacketReceived(PacketCommandNG *packet) { } case CMD_HF_MIFARE_READBL: { mf_readblock_t *payload = (mf_readblock_t *)packet->data.asBytes; - MifareReadBlock(payload->blockno, payload->keytype, payload->key); + uint8_t outbuf[16]; + int16_t retval = mifare_cmd_readblocks(MIFARE_AUTH_KEYA + (payload->keytype & 1), payload->key, ISO14443A_CMD_READBLOCK, payload->blockno, 1, outbuf); + reply_ng(CMD_HF_MIFARE_READBL, retval, outbuf, sizeof(outbuf)); break; } case CMD_HF_MIFAREU_READBL: { @@ -1580,7 +1583,19 @@ static void PacketReceived(PacketCommandNG *packet) { break; } case CMD_HF_MIFARE_WRITEBL: { - MifareWriteBlock(packet->oldarg[0], packet->oldarg[1], packet->data.asBytes); + uint8_t block_no = packet->oldarg[0]; + uint8_t key_type = packet->oldarg[1]; + uint8_t *key = packet->data.asBytes; + uint8_t *block_data = packet->data.asBytes + 10; + + int16_t retval = mifare_cmd_writeblocks(MIFARE_AUTH_KEYA + (key_type & 1), key, ISO14443A_CMD_WRITEBLOCK, block_no, 1, block_data); + + // convert ng style retval to old status + if (retval >= 0) { + retval = 1; + } + + reply_mix(CMD_ACK, retval, 0, 0, 0, 0); break; } case CMD_HF_MIFARE_VALUE: { @@ -1740,7 +1755,9 @@ static void PacketReceived(PacketCommandNG *packet) { uint8_t key[6]; } PACKED; struct p *payload = (struct p *) packet->data.asBytes; - MifareReadConfigBlockGDM(payload->key); + uint8_t outbuf[16]; + int16_t retval = mifare_cmd_readblocks(MIFARE_MAGIC_GDM_AUTH_KEY, payload->key, MIFARE_MAGIC_GDM_READ_CFG, 0, 1, outbuf); + reply_ng(CMD_HF_MIFARE_G4_GDM_CONFIG, retval, outbuf, sizeof(outbuf)); break; } case CMD_HF_MIFARE_G4_GDM_WRCFG: { @@ -1748,18 +1765,20 @@ static void PacketReceived(PacketCommandNG *packet) { uint8_t data[16]; } PACKED; struct p *payload = (struct p *) packet->data.asBytes; - MifareWriteConfigBlockGDM(payload->data); + uint8_t key[6] = {0, 0, 0, 0, 0, 0}; + int16_t retval = mifare_cmd_writeblocks(MIFARE_MAGIC_GDM_AUTH_KEY, key, MIFARE_MAGIC_GDM_WRITE_CFG, 0, 1, payload->data); + reply_ng(CMD_HF_MIFARE_G4_GDM_WRCFG, retval, NULL, 0); break; } case CMD_HF_MIFARE_G4_GDM_WRBL: { struct p { uint8_t blockno; - uint8_t keytype; uint8_t key[6]; uint8_t data[16]; // data to be written } PACKED; struct p *payload = (struct p *) packet->data.asBytes; - MifareWriteBlockGDM(payload->blockno, payload->keytype, payload->key, payload->data); + int16_t retval = mifare_cmd_writeblocks(MIFARE_MAGIC_GDM_AUTH_KEY, payload->key, MIFARE_MAGIC_GDM_WRITEBLOCK, payload->blockno, 1, payload->data); + reply_ng(CMD_HF_MIFARE_G4_GDM_WRBL, retval, NULL, 0); break; } case CMD_HF_MIFARE_PERSONALIZE_UID: { diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 9cff73f63..5416f2917 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -2538,7 +2538,7 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, bool use_ecp, bool use_mags bool first_try = true; uint32_t retry_timeout = use_ecp ? ECP_RETRY_TIMEOUT : WUPA_RETRY_TIMEOUT; - uint32_t start_time = GetTickCount(); + uint32_t start_time; int len; // we may need several tries if we did send an unknown command or a wrong authentication before... @@ -2562,6 +2562,11 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par, bool use_ecp, bool use_mags // Receive the ATQA len = ReaderReceive(resp, resp_par); + // We set the start_time here otherwise in some cases we miss the window and only ever try once + if (first_try) { + start_time = GetTickCount(); + } + first_try = false; } while (len == 0 && GetTickCountDelta(start_time) <= retry_timeout); @@ -2830,10 +2835,9 @@ int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades) { // which case we need to make a cascade 2 request and select - this is a long UID // While the UID is not complete, the 3nd bit (from the right) is set in the SAK. for (; sak & 0x04; cascade_level++) { - uint8_t sel_all[] = { ISO14443A_CMD_ANTICOLL_OR_SELECT, 0x20 }; uint8_t sel_uid[] = { ISO14443A_CMD_ANTICOLL_OR_SELECT, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // SELECT_* (L1: 0x93, L2: 0x95, L3: 0x97) - sel_uid[0] = sel_all[0] = 0x93 + cascade_level * 2; + sel_uid[0] = ISO14443A_CMD_ANTICOLL_OR_SELECT + cascade_level * 2; if (cascade_level < num_cascades - 1) { uid_resp[0] = 0x88; diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index c8a2d5fa2..145527a7e 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -58,21 +58,19 @@ static uint8_t dummy_answer = 0; //----------------------------------------------------------------------------- // Select, Authenticate, Read a MIFARE tag. -// read block +// key_auth_cmd is one of MIFARE_AUTH_KEYA, MIFARE_AUTH_KEYB, or MIFARE_MAGIC_GDM_AUTH_KEY +// read_cmd is one of ISO14443A_CMD_READBLOCK, MIFARE_MAGIC_GDM_READBLOCK, or MIFARE_MAGIC_GDM_READ_CFG +// block_data must be 16*count bytes large +// block_no through block_no+count-1 normally needs to be within the same sector //----------------------------------------------------------------------------- -void MifareReadBlock(uint8_t blockNo, uint8_t keyType, uint8_t *datain) { - // params - uint64_t ui64Key = 0; - ui64Key = bytes_to_num(datain, 6); +int16_t mifare_cmd_readblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t read_cmd, uint8_t block_no, uint8_t count, uint8_t *block_data) { + + uint64_t ui64key = bytes_to_num(key, 6); - // variables - uint8_t dataoutbuf[16] = {0x00}; uint8_t uid[10] = {0x00}; - uint32_t cuid = 0, status = PM3_EOPABORTED; - + uint32_t cuid = 0; struct Crypto1State mpcs = {0, 0}; - struct Crypto1State *pcs; - pcs = &mpcs; + struct Crypto1State *pcs = &mpcs; iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); @@ -83,41 +81,125 @@ void MifareReadBlock(uint8_t blockNo, uint8_t keyType, uint8_t *datain) { LED_B_OFF(); LED_C_OFF(); - while (true) { - if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); - break; - }; + int retval = PM3_SUCCESS; - if (mifare_classic_auth(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Auth error"); - break; - }; - - if (mifare_classic_readblock(pcs, cuid, blockNo, dataoutbuf)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Read block error"); - break; - }; - - if (mifare_classic_halt(pcs, cuid)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); - break; - }; - - status = PM3_SUCCESS; - break; + if (iso14443a_select_card(uid, NULL, &cuid, true, 0, true) == false) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); + retval = PM3_ESOFT; + goto OUT; } + if (mifare_classic_authex_cmd(pcs, cuid, block_no, key_auth_cmd, ui64key, AUTH_FIRST, NULL, NULL)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Auth error"); + retval = PM3_ESOFT; + goto OUT; + }; + + for (uint8_t i = 0; i < count; i++) { + if (mifare_classic_readblock_ex(pcs, block_no + i, block_data + (i * 16), read_cmd)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Read block error"); + retval = PM3_ESOFT; + goto OUT; + }; + } + + if (mifare_classic_halt(pcs)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); + retval = PM3_ESOFT; + goto OUT; + }; + +OUT: crypto1_deinit(pcs); - if (g_dbglevel >= 2) DbpString("READ BLOCK FINISHED"); - - LED_B_ON(); - reply_ng(CMD_HF_MIFARE_READBL, status, dataoutbuf, 16); - LED_B_OFF(); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); + set_tracing(false); + BigBuf_free(); + + return retval; +} + +//----------------------------------------------------------------------------- +// Select, Authenticate, Write a MIFARE tag. +// key_auth_cmd is one of MIFARE_AUTH_KEYA, MIFARE_AUTH_KEYB, or MIFARE_MAGIC_GDM_AUTH_KEY +// write_cmd is one of ISO14443A_CMD_WRITEBLOCK, MIFARE_MAGIC_GDM_WRITEBLOCK, or MIFARE_MAGIC_GDM_WRITE_CFG +// block_data must be 16*count bytes large +// block_no through block_no+count-1 normally needs to be within the same sector +//----------------------------------------------------------------------------- +int16_t mifare_cmd_writeblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t write_cmd, uint8_t block_no, uint8_t count, uint8_t *block_data) { + + uint64_t ui64key = bytes_to_num(key, 6); + + uint8_t uid[10] = {0x00}; + uint32_t cuid = 0; + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs = &mpcs; + + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); + + clear_trace(); + set_tracing(true); + + LED_A_ON(); + LED_B_OFF(); + LED_C_OFF(); + + uint8_t retval = PM3_SUCCESS; + + if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); + retval = PM3_ESOFT; + goto OUT; + }; + + if (mifare_classic_authex_cmd(pcs, cuid, block_no, key_auth_cmd, ui64key, AUTH_FIRST, NULL, NULL)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Auth error"); + retval = PM3_ESOFT; + goto OUT; + }; + + for (uint8_t i = 0; i < count; i++) { + int res = mifare_classic_writeblock_ex(pcs, block_no + i, block_data + (i * 16), write_cmd); + if (res == PM3_ETEAROFF) { + retval = PM3_ETEAROFF; + goto OUT; + } else if (res != PM3_SUCCESS) { + if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); + retval = PM3_ESOFT; + goto OUT; + } + } + + if (mifare_classic_halt(pcs)) { + if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); + retval = PM3_ESOFT; + goto OUT; + }; + +OUT: + crypto1_deinit(pcs); + + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); + set_tracing(false); + BigBuf_free(); + + return retval; +} + +//----------------------------------------------------------------------------- +// Select, Authenticate, Read a MIFARE tag. +// read sector (data = 4 x 16 bytes = 64 bytes, or 16 x 16 bytes = 256 bytes) +//----------------------------------------------------------------------------- +void MifareReadSector(uint8_t sector_no, uint8_t key_type, uint8_t *key) { + uint8_t block_no = FirstBlockOfSector(sector_no); + uint8_t num_blocks = NumBlocksPerSector(sector_no); + + uint8_t outbuf[16 * 16]; + int16_t retval = mifare_cmd_readblocks(MIFARE_AUTH_KEYA + (key_type & 1), key, ISO14443A_CMD_READBLOCK, block_no, num_blocks, outbuf); + + reply_old(CMD_ACK, retval == PM3_SUCCESS, 0, 0, outbuf, 16 * num_blocks); } void MifareUC_Auth(uint8_t arg0, uint8_t *keybytes) { @@ -214,131 +296,6 @@ void MifareUReadBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { LEDsoff(); } -void MifareReadConfigBlockGDM(uint8_t *key) { - - int retval = PM3_SUCCESS; - - uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); - if (par == NULL) { - retval = PM3_EMALLOC; - goto OUT; - } - - uint8_t *uid = BigBuf_malloc(10); - if (uid == NULL) { - retval = PM3_EMALLOC; - goto OUT; - } - - iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - clear_trace(); - set_tracing(true); - - // variables - uint32_t cuid = 0; - struct Crypto1State mpcs = {0, 0}; - struct Crypto1State *pcs; - pcs = &mpcs; - - uint64_t ui64key = bytes_to_num(key, 6); - uint8_t outbuf[16] = {0x00}; - - if (iso14443a_select_card(uid, NULL, &cuid, true, 0, true) == false) { - retval = PM3_ESOFT; - goto OUT; - } - - if (mifare_classic_authex_2(pcs, cuid, 0, 0, ui64key, AUTH_FIRST, NULL, NULL, true)) { - retval = PM3_ESOFT; - goto OUT; - }; - - if (mifare_classic_readblock_ex(pcs, cuid, 0, outbuf, MIFARE_MAGIC_GDM_READ_CFG)) { - retval = PM3_ESOFT; - goto OUT; - }; - - if (mifare_classic_halt(pcs, cuid)) { - retval = PM3_ESOFT; - goto OUT; - }; - -OUT: - crypto1_deinit(pcs); - - reply_ng(CMD_HF_MIFARE_G4_GDM_CONFIG, retval, outbuf, sizeof(outbuf)); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); - set_tracing(false); - BigBuf_free(); -} - -//----------------------------------------------------------------------------- -// Select, Authenticate, Read a MIFARE tag. -// read sector (data = 4 x 16 bytes = 64 bytes, or 16 x 16 bytes = 256 bytes) -//----------------------------------------------------------------------------- -void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t *datain) { - // params - uint8_t sectorNo = arg0; - uint8_t keyType = arg1; - uint64_t ui64Key = 0; - ui64Key = bytes_to_num(datain, 6); - - // variables - uint8_t isOK = 0; - uint8_t dataoutbuf[16 * 16]; - uint8_t uid[10] = {0x00}; - uint32_t cuid = 0; - struct Crypto1State mpcs = {0, 0}; - struct Crypto1State *pcs; - pcs = &mpcs; - - iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - - clear_trace(); - set_tracing(true); - - LED_A_ON(); - LED_B_OFF(); - LED_C_OFF(); - - isOK = 1; - if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { - isOK = 0; - if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); - } - - - if (isOK && mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keyType, ui64Key, AUTH_FIRST)) { - isOK = 0; - if (g_dbglevel >= DBG_ERROR) Dbprintf("Auth error"); - } - - for (uint8_t blockNo = 0; isOK && blockNo < NumBlocksPerSector(sectorNo); blockNo++) { - if (mifare_classic_readblock(pcs, cuid, FirstBlockOfSector(sectorNo) + blockNo, dataoutbuf + 16 * blockNo)) { - isOK = 0; - if (g_dbglevel >= DBG_ERROR) Dbprintf("Read sector %2d block %2d error", sectorNo, blockNo); - break; - } - } - - if (mifare_classic_halt(pcs, cuid)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); - } - - if (g_dbglevel >= 2) DbpString("READ SECTOR FINISHED"); - - crypto1_deinit(pcs); - - LED_B_ON(); - reply_old(CMD_ACK, isOK, 0, 0, dataoutbuf, 16 * NumBlocksPerSector(sectorNo)); - LED_B_OFF(); - - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); - set_tracing(false); -} - // arg0 = blockNo (start) // arg1 = Pages (number of blocks) // arg2 = useKey @@ -438,210 +395,6 @@ void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain) set_tracing(false); } -//----------------------------------------------------------------------------- -// Select, Authenticate, Write a MIFARE tag. -// read block -//----------------------------------------------------------------------------- -void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain) { - // params - uint8_t blockNo = arg0; - uint8_t keyType = arg1; - uint64_t ui64Key = 0; - uint8_t blockdata[16] = {0x00}; - - ui64Key = bytes_to_num(datain, 6); - memcpy(blockdata, datain + 10, 16); - - // variables - uint8_t uid[10] = {0x00}; - uint32_t cuid = 0; - struct Crypto1State mpcs = {0, 0}; - struct Crypto1State *pcs; - pcs = &mpcs; - - iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - - clear_trace(); - set_tracing(true); - - LED_A_ON(); - LED_B_OFF(); - LED_C_OFF(); - - uint8_t retval = 0; - - if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); - goto OUT; - }; - - if (mifare_classic_auth(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Auth error"); - goto OUT; - }; - - int res = mifare_classic_writeblock(pcs, cuid, blockNo, blockdata); - if (res == PM3_ETEAROFF) { - retval = PM3_ETEAROFF; - goto OUT; - } else if (res != PM3_SUCCESS) { - if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); - retval = PM3_ESOFT; - goto OUT; - } - - if (mifare_classic_halt(pcs, cuid)) { - if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); - goto OUT; - }; - - retval = 1; - -OUT: - crypto1_deinit(pcs); - - reply_mix(CMD_ACK, retval, 0, 0, 0, 0); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); - set_tracing(false); -} - -void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t *datain) { - - int retval = PM3_SUCCESS; - - // check args - if (datain == NULL) { - retval = PM3_EINVARG; - goto OUT; - } - - uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); - if (par == NULL) { - retval = PM3_EMALLOC; - goto OUT; - } - - uint8_t *uid = BigBuf_malloc(10); - if (uid == NULL) { - retval = PM3_EMALLOC; - goto OUT; - } - - iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - clear_trace(); - set_tracing(true); - - // variables - uint32_t cuid = 0; - struct Crypto1State mpcs = {0, 0}; - struct Crypto1State *pcs; - pcs = &mpcs; - - uint64_t ui64key = bytes_to_num(key, 6); - - if (iso14443a_select_card(uid, NULL, &cuid, true, 0, true) == false) { - retval = PM3_ESOFT; - goto OUT; - } - - if (mifare_classic_authex_2(pcs, cuid, blockno, keytype, ui64key, AUTH_FIRST, NULL, NULL, true)) { - retval = PM3_ESOFT; - goto OUT; - }; - - int res = mifare_classic_writeblock_ex(pcs, cuid, blockno, datain, true); - if (res == PM3_ETEAROFF) { - retval = PM3_ETEAROFF; - goto OUT; - } else if (res != PM3_SUCCESS) { - retval = PM3_ESOFT; - goto OUT; - } - - if (mifare_classic_halt(pcs, cuid)) { - retval = PM3_ESOFT; - goto OUT; - }; - -OUT: - crypto1_deinit(pcs); - - reply_ng(CMD_HF_MIFARE_G4_GDM_WRBL, retval, NULL, 0); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); - set_tracing(false); - BigBuf_free(); -} - -void MifareWriteConfigBlockGDM(uint8_t *datain) { - - int retval = PM3_SUCCESS; - - // check args - if (datain == NULL) { - retval = PM3_EINVARG; - goto OUT; - } - - uint8_t *par = BigBuf_malloc(MAX_PARITY_SIZE); - if (par == NULL) { - retval = PM3_EMALLOC; - goto OUT; - } - - uint8_t *uid = BigBuf_malloc(10); - if (uid == NULL) { - retval = PM3_EMALLOC; - goto OUT; - } - - iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - clear_trace(); - set_tracing(true); - - // variables - uint32_t cuid = 0; - struct Crypto1State mpcs = {0, 0}; - struct Crypto1State *pcs; - pcs = &mpcs; - - if (iso14443a_select_card(uid, NULL, &cuid, true, 0, true) == false) { - retval = PM3_ESOFT; - goto OUT; - } - - uint64_t key = 0; - if (mifare_classic_authex_2(pcs, cuid, 0, 0, key, AUTH_FIRST, NULL, NULL, true)) { - retval = PM3_ESOFT; - goto OUT; - }; - - int res = mifare_classic_write_cfg_block_gdm(pcs, cuid, datain); - if (res == PM3_ETEAROFF) { - retval = PM3_ETEAROFF; - goto OUT; - } else if (res) { - retval = PM3_ESOFT; - goto OUT; - } - - if (mifare_classic_halt(pcs, cuid)) { - retval = PM3_ESOFT; - goto OUT; - }; - -OUT: - crypto1_deinit(pcs); - - reply_ng(CMD_HF_MIFARE_G4_GDM_WRCFG, retval, NULL, 0); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); - set_tracing(false); - BigBuf_free(); -} - - void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) { // params uint8_t blockNo = arg0; @@ -688,7 +441,7 @@ void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) { break; }; - if (mifare_classic_value(pcs, cuid, blockNo, blockdata, action) != PM3_SUCCESS) { + if (mifare_classic_value(pcs, blockNo, blockdata, action) != PM3_SUCCESS) { if (g_dbglevel >= DBG_INFO) Dbprintf("Write block error"); break; }; @@ -708,7 +461,7 @@ void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) { break; } - if (mifare_classic_halt(pcs, cuid)) { + if (mifare_classic_halt(pcs)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); break; }; @@ -1145,7 +898,7 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags, } // nested authentication - uint16_t len = mifare_sendcmd_short(pcs, AUTH_NESTED, 0x60 + (targetKeyType & 0x01), targetBlockNo, receivedAnswer, par_enc, NULL); + uint16_t len = mifare_sendcmd_short(pcs, AUTH_NESTED, MIFARE_AUTH_KEYA + (targetKeyType & 0x01), targetBlockNo, receivedAnswer, par_enc, NULL); // wait for the card to become ready again CHK_TIMEOUT(); @@ -1267,7 +1020,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 } // prepare next select. No need to power down the card. - if (mifare_classic_halt(pcs, cuid)) { + if (mifare_classic_halt(pcs)) { if (g_dbglevel >= DBG_INFO) Dbprintf("Nested: Halt error"); rtr--; continue; @@ -1369,7 +1122,7 @@ void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8 } // prepare next select. No need to power down the card. - if (mifare_classic_halt(pcs, cuid)) { + if (mifare_classic_halt(pcs)) { if (g_dbglevel >= DBG_INFO) Dbprintf("Nested: Halt error"); continue; } @@ -1491,7 +1244,7 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, // Main loop - get crypted nonces for target sector for (uint8_t rtr = 0; rtr < 2; rtr++) { - if (mifare_classic_halt(pcs, cuid)) { + if (mifare_classic_halt(pcs)) { continue; } @@ -1522,7 +1275,7 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, target_ks[0] = nt2 ^ target_nt[0]; // second collection - if (mifare_classic_halt(pcs, cuid)) { + if (mifare_classic_halt(pcs)) { continue; } @@ -1618,7 +1371,7 @@ static uint8_t chkKey(struct chk_t *c) { // if successful auth, send HALT // if ( !res ) - // mifare_classic_halt_ex(c->pcs); + // mifare_classic_halt(c->pcs); break; } return res; @@ -1633,7 +1386,7 @@ static uint8_t chkKey_readb(struct chk_t *c, uint8_t *keyb) { return 1; uint8_t data[16] = {0x00}; - uint8_t res = mifare_classic_readblock(c->pcs, c->cuid, c->block, data); + uint8_t res = mifare_classic_readblock(c->pcs, c->block, data); // successful read if (!res) { @@ -1644,7 +1397,7 @@ static uint8_t chkKey_readb(struct chk_t *c, uint8_t *keyb) { } else { res = 3; } - mifare_classic_halt_ex(c->pcs); + mifare_classic_halt(c->pcs); } return res; } @@ -2229,7 +1982,7 @@ void MifarePersonalizeUID(uint8_t keyType, uint8_t perso_option, uint64_t key) { break; } - if (mifare_classic_halt(pcs, cuid)) { + if (mifare_classic_halt(pcs)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); break; } @@ -2372,7 +2125,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { for (uint8_t r = 0; r < MAX_RETRIES; r++) { - if (mifare_classic_readblock(pcs, cuid, FirstBlockOfSector(s) + b, data)) { + if (mifare_classic_readblock(pcs, FirstBlockOfSector(s) + b, data)) { retval |= PM3_EPARTIAL; if (g_dbglevel > DBG_ERROR) { Dbprintf("Error reading sector %2d block %2d", s, b); @@ -2398,7 +2151,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { } } - int res = mifare_classic_halt(pcs, cuid); + int res = mifare_classic_halt(pcs); (void)res; crypto1_deinit(pcs); @@ -2460,10 +2213,10 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Can't select card"); errormsg = MAGIC_UID; - mifare_classic_halt_ex(NULL); + mifare_classic_halt(NULL); break; } - mifare_classic_halt_ex(NULL); + mifare_classic_halt(NULL); } // wipe tag, fill it with zeros @@ -2489,7 +2242,7 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { } iso14a_set_timeout(old_timeout); - mifare_classic_halt_ex(NULL); + mifare_classic_halt(NULL); } // write block @@ -2528,7 +2281,7 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { } if (workFlags & MAGIC_HALT) - mifare_classic_halt_ex(NULL); + mifare_classic_halt(NULL); isOK = true; break; @@ -2600,7 +2353,7 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { // send HALT if (workFlags & MAGIC_HALT) - mifare_classic_halt_ex(NULL); + mifare_classic_halt(NULL); isOK = true; break; @@ -2628,7 +2381,7 @@ void MifareCIdent(bool is_mfc) { uint8_t rats[4] = {ISO14443A_CMD_RATS, 0x80, 0x31, 0x73}; uint8_t rdblf0[4] = {ISO14443A_CMD_READBLOCK, 0xF0, 0x8D, 0x5f}; uint8_t rdbl00[4] = {ISO14443A_CMD_READBLOCK, 0x00, 0x02, 0xa8}; - uint8_t gen4gmd[4] = {MIFARE_MAGIC_GDM_AUTH_KEY, 0x00, 0x6C, 0x92}; + uint8_t gen4gdm[4] = {MIFARE_MAGIC_GDM_AUTH_KEY, 0x00, 0x6C, 0x92}; uint8_t gen4GetConf[8] = {GEN_4GTU_CMD, 0x00, 0x00, 0x00, 0x00, GEN_4GTU_GETCNF, 0, 0}; uint8_t superGen1[9] = {0x0A, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x10, 0x14, 0x1D}; @@ -2782,7 +2535,7 @@ void MifareCIdent(bool is_mfc) { iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); res = iso14443a_select_card(uid, NULL, &cuid, true, 0, true); if (res == 2) { - ReaderTransmit(gen4gmd, sizeof(gen4gmd), NULL); + ReaderTransmit(gen4gdm, sizeof(gen4gdm), NULL); res = ReaderReceive(buf, par); if (res == 4) { isGen = MAGIC_GEN_4GDM; @@ -3227,12 +2980,12 @@ void MifareSetMod(uint8_t *datain) { } int respLen; - if (((respLen = mifare_sendcmd_short(pcs, CRYPT_ALL, 0x43, mod, receivedAnswer, receivedAnswerPar, NULL)) != 1) || (receivedAnswer[0] != 0x0a)) { + if (((respLen = mifare_sendcmd_short(pcs, CRYPT_ALL, MIFARE_EV1_SETMOD, mod, receivedAnswer, receivedAnswerPar, NULL)) != 1) || (receivedAnswer[0] != 0x0a)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("SetMod error; response[0]: %hhX, len: %d", receivedAnswer[0], respLen); break; } - if (mifare_classic_halt(pcs, cuid)) { + if (mifare_classic_halt(pcs)) { if (g_dbglevel >= DBG_ERROR) Dbprintf("Halt error"); break; } diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index a6623c006..b7f7d6379 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -19,19 +19,18 @@ #include "common.h" -void MifareReadBlock(uint8_t blockNo, uint8_t keyType, uint8_t *datain); +int16_t mifare_cmd_readblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t read_cmd, uint8_t block_no, uint8_t count, uint8_t *block_data); +int16_t mifare_cmd_writeblocks(uint8_t key_auth_cmd, uint8_t *key, uint8_t write_cmd, uint8_t block_no, uint8_t count, uint8_t *block_data); +void MifareReadSector(uint8_t sector_no, uint8_t key_type, uint8_t *key); +void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain); void MifareUReadBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain); void MifareUC_Auth(uint8_t arg0, uint8_t *keybytes); void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain); -void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t *datain); -void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain); -void MifareValue(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain); void MifareUWriteBlockCompat(uint8_t arg0, uint8_t arg1, uint8_t *datain); - void MifareUWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain); -void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8_t targetKeyType, bool calibrate, uint8_t *key); +void MifareNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8_t targetKeyType, bool calibrate, uint8_t *key); void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo, uint8_t targetKeyType, uint8_t *key); void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags, uint8_t *datain); @@ -58,11 +57,6 @@ void MifareGen3UID(uint8_t uidlen, uint8_t *uid); // Gen 3 magic card set UID wi void MifareGen3Blk(uint8_t block_len, uint8_t *block); // Gen 3 magic card overwrite manufacturer block void MifareGen3Freez(void); // Gen 3 magic card lock further UID changes -// MFC GEN4 GDM -void MifareReadConfigBlockGDM(uint8_t *key); -void MifareWriteConfigBlockGDM(uint8_t *datain); -void MifareWriteBlockGDM(uint8_t blockno, uint8_t keytype, uint8_t *key, uint8_t *datain); - // MFC GEN4 GTU void MifareG4ReadBlk(uint8_t blockno, uint8_t *pwd, uint8_t workFlags); void MifareG4WriteBlk(uint8_t blockno, uint8_t *pwd, uint8_t *data, uint8_t workFlags); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index b17ac19bc..e94d09f40 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -139,9 +139,9 @@ int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, return mifare_classic_authex(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL, NULL); } int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing) { - return mifare_classic_authex_2(pcs, uid, blockNo, keyType, ui64Key, isNested, ntptr, timing, false); + return mifare_classic_authex_cmd(pcs, uid, blockNo, keyType ? MIFARE_AUTH_KEYA : MIFARE_AUTH_KEYB, ui64Key, isNested, ntptr, timing); } -int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing, bool is_gdm) { +int mifare_classic_authex_cmd(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t cmd, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing) { // "random" reader nonce: uint8_t nr[4]; @@ -150,9 +150,8 @@ int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t bloc uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; - // Transmit MIFARE_CLASSIC_AUTH 0x60, 0x61 or GDM 0x80 - uint8_t cmdbyte = (is_gdm) ? MIFARE_MAGIC_GDM_AUTH_KEY : MIFARE_AUTH_KEYA + (keyType & 0x01); - int len = mifare_sendcmd_short(pcs, isNested, cmdbyte, blockNo, receivedAnswer, receivedAnswerPar, timing); + // Transmit MIFARE_CLASSIC_AUTH, 0x60 for key A, 0x61 for key B, or 0x80 for GDM backdoor + int len = mifare_sendcmd_short(pcs, isNested, cmd, blockNo, receivedAnswer, receivedAnswerPar, timing); if (len != 4) return 1; // Save the tag nonce (nt) @@ -229,10 +228,10 @@ int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t bloc return 0; } -int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData) { - return mifare_classic_readblock_ex(pcs, uid, blockNo, blockData, ISO14443A_CMD_READBLOCK); +int mifare_classic_readblock(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData) { + return mifare_classic_readblock_ex(pcs, blockNo, blockData, ISO14443A_CMD_READBLOCK); } -int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t iso_byte) { +int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData, uint8_t iso_byte) { uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; @@ -415,22 +414,18 @@ int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData) { return res; } -int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData) { - return mifare_classic_writeblock_ex(pcs, uid, blockNo, blockData, false); +int mifare_classic_writeblock(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData) { + return mifare_classic_writeblock_ex(pcs, blockNo, blockData, ISO14443A_CMD_WRITEBLOCK); } -int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm) { +int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData, uint8_t cmd) { // variables uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; - // command MIFARE_MAGIC_GDM_WRITEBLOCK - uint16_t len; - if (is_gdm) { - len = mifare_sendcmd_short(pcs, 1, MIFARE_MAGIC_GDM_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); - } else { - len = mifare_sendcmd_short(pcs, 1, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL); - } + // cmd is ISO14443A_CMD_WRITEBLOCK for normal tags, but could also be + // MIFARE_MAGIC_GDM_WRITEBLOCK or MIFARE_MAGIC_GDM_WRITE_CFG for certain magic tags + uint16_t len = mifare_sendcmd_short(pcs, 1, cmd, blockNo, receivedAnswer, receivedAnswerPar, NULL); if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK if (g_dbglevel >= DBG_INFO) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); @@ -441,15 +436,19 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t memcpy(d_block, blockData, 16); AddCrc14A(d_block, 16); - // enough for 18 Bytes to send - uint8_t par[3] = {0x00, 0x00, 0x00}; - // crypto - for (uint32_t pos = 0; pos < 18; pos++) { - d_block_enc[pos] = crypto1_byte(pcs, 0x00, 0) ^ d_block[pos]; - par[pos >> 3] |= (((filter(pcs->odd) ^ oddparity8(d_block[pos])) & 0x01) << (7 - (pos & 0x0007))); - } + if (pcs) { + // enough for 18 Bytes to send + uint8_t par[3] = {0x00, 0x00, 0x00}; + // crypto + for (uint32_t pos = 0; pos < 18; pos++) { + d_block_enc[pos] = crypto1_byte(pcs, 0x00, 0) ^ d_block[pos]; + par[pos >> 3] |= (((filter(pcs->odd) ^ oddparity8(d_block[pos])) & 0x01) << (7 - (pos & 0x0007))); + } - ReaderTransmitPar(d_block_enc, sizeof(d_block_enc), par, NULL); + ReaderTransmitPar(d_block_enc, sizeof(d_block_enc), par, NULL); + } else { + ReaderTransmit(d_block, sizeof(d_block), NULL); + } // tearoff occurred if (tearoff_hook() == PM3_ETEAROFF) { @@ -459,10 +458,14 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t len = ReaderReceive(receivedAnswer, receivedAnswerPar); uint8_t res = 0; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 0)) << 0; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 1)) << 1; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 2)) << 2; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; + if (pcs) { + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 0)) << 0; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 1)) << 1; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 2)) << 2; + res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; + } else { + res = receivedAnswer[0]; + } if ((len != 1) || (res != 0x0A)) { if (g_dbglevel >= DBG_INFO) Dbprintf("Cmd send data2 Error: %02x", res); @@ -472,52 +475,7 @@ int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t return PM3_SUCCESS; } -int mifare_classic_write_cfg_block_gdm(struct Crypto1State *pcs, uint32_t uid, uint8_t *blockData) { - - // variables - uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00}; - uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00}; - - uint16_t len = mifare_sendcmd_short(pcs, 1, MIFARE_MAGIC_GDM_WRITE_CFG, 0, receivedAnswer, receivedAnswerPar, NULL); - if ((len != 1) || (receivedAnswer[0] != 0x0A)) { - return PM3_EFAILED; - } - - uint8_t d_block[18], d_block_enc[18]; - memcpy(d_block, blockData, 16); - AddCrc14A(d_block, 16); - - // enough for 18 Bytes to send - uint8_t par[3] = {0x00, 0x00, 0x00}; - // crypto - for (uint32_t pos = 0; pos < 18; pos++) { - d_block_enc[pos] = crypto1_byte(pcs, 0x00, 0) ^ d_block[pos]; - par[pos >> 3] |= (((filter(pcs->odd) ^ oddparity8(d_block[pos])) & 0x01) << (7 - (pos & 0x0007))); - } - - ReaderTransmitPar(d_block_enc, sizeof(d_block_enc), par, NULL); - - // tearoff occurred - if (tearoff_hook() == PM3_ETEAROFF) { - return PM3_ETEAROFF; - } else { - // Receive the response - len = ReaderReceive(receivedAnswer, receivedAnswerPar); - - uint8_t res = 0; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 0)) << 0; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 1)) << 1; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 2)) << 2; - res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], 3)) << 3; - - if ((len != 1) || (res != 0x0A)) { - return PM3_EFAILED; - } - } - return PM3_SUCCESS; -} - -int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t action) { +int mifare_classic_value(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData, uint8_t action) { // variables uint16_t len = 0; uint32_t pos = 0; @@ -625,7 +583,8 @@ int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData) { } return PM3_SUCCESS; } -int mifare_classic_halt_ex(struct Crypto1State *pcs) { + +int mifare_classic_halt(struct Crypto1State *pcs) { uint8_t receivedAnswer[4] = {0x00, 0x00, 0x00, 0x00}; uint16_t len = mifare_sendcmd_short(pcs, (pcs == NULL) ? CRYPT_NONE : CRYPT_ALL, ISO14443A_CMD_HALT, 0x00, receivedAnswer, NULL, NULL); if (len != 0) { @@ -634,19 +593,9 @@ int mifare_classic_halt_ex(struct Crypto1State *pcs) { } return 0; } -int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid) { - return mifare_classic_halt_ex(pcs); -} int mifare_ultra_halt(void) { - uint16_t len = 0; - uint8_t receivedAnswer[4] = {0x00, 0x00, 0x00, 0x00}; - len = mifare_sendcmd_short(NULL, CRYPT_NONE, ISO14443A_CMD_HALT, 0x00, receivedAnswer, NULL, NULL); - if (len != 0) { - if (g_dbglevel >= DBG_EXTENDED) Dbprintf("halt warning. response len: %x", len); - return 1; - } - return 0; + return mifare_classic_halt(NULL); } diff --git a/armsrc/mifareutil.h b/armsrc/mifareutil.h index e5731ce36..9a179a553 100644 --- a/armsrc/mifareutil.h +++ b/armsrc/mifareutil.h @@ -72,17 +72,15 @@ uint16_t mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t // mifare classic int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested); int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing); -int mifare_classic_authex_2(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing, bool is_gdm); +int mifare_classic_authex_cmd(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t cmd, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing); -int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData); -int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t iso_byte); +int mifare_classic_readblock(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData); +int mifare_classic_readblock_ex(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData, uint8_t iso_byte); -int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid); -int mifare_classic_halt_ex(struct Crypto1State *pcs); -int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData); -int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, bool is_gdm); -int mifare_classic_value(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData, uint8_t action); -int mifare_classic_write_cfg_block_gdm(struct Crypto1State *pcs, uint32_t uid, uint8_t *blockData); +int mifare_classic_halt(struct Crypto1State *pcs); +int mifare_classic_writeblock(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData); +int mifare_classic_writeblock_ex(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData, uint8_t cmd); +int mifare_classic_value(struct Crypto1State *pcs, uint8_t blockNo, uint8_t *blockData, uint8_t action); // Ultralight/NTAG... int mifare_ul_ev1_auth(uint8_t *keybytes, uint8_t *pack); diff --git a/client/src/cmdtrace.c b/client/src/cmdtrace.c index 323c7ef7e..326a646b9 100644 --- a/client/src/cmdtrace.c +++ b/client/src/cmdtrace.c @@ -910,11 +910,19 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr uint8_t crcc = iso14443A_CRC_check(hdr->isResponse, mfData, mfDataLen); //iceman: colorise crc bytes here will need a refactor of code from above. - PrintAndLogEx(NORMAL, " | | * |%-*s | %-4s| %s", - str_padder, - sprint_hex_inrow_spaces(mfData, mfDataLen, 2), - (crcc == 0 ? _RED_(" !! ") : (crcc == 1 ? _GREEN_(" ok ") : " ")), - explanation); + if (hdr->isResponse) { + PrintAndLogEx(NORMAL, " | | * |%-*s | %-4s| %s", + str_padder, + sprint_hex_inrow_spaces(mfData, mfDataLen, 2), + (crcc == 0 ? _RED_(" !! ") : (crcc == 1 ? _GREEN_(" ok ") : " ")), + explanation); + } else { + PrintAndLogEx(NORMAL, " | | * |" _YELLOW_("%-*s")" | " _YELLOW_("%s") "| " _YELLOW_("%s"), + str_padder, + sprint_hex_inrow_spaces(mfData, mfDataLen, 2), + (crcc == 0 ? _RED_(" !! ") : (crcc == 1 ? _GREEN_(" ok ") : " ")), + explanation); + } } } diff --git a/include/protocols.h b/include/protocols.h index 0183f9f0d..721dccaf5 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -191,12 +191,13 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MIFARE_CMD_TRANSFER 0xB0 #define MIFARE_MAGIC_GDM_AUTH_KEY 0x80 +#define MIFARE_MAGIC_GDM_READBLOCK 0x38 #define MIFARE_MAGIC_GDM_WRITEBLOCK 0xA8 #define MIFARE_MAGIC_GDM_READ_CFG 0xE0 #define MIFARE_MAGIC_GDM_WRITE_CFG 0xE1 #define MIFARE_EV1_PERSONAL_UID 0x40 -#define MIFARE_EV1_SETMODE 0x43 +#define MIFARE_EV1_SETMOD 0x43 #define MIFARE_EV1_UIDF0 0x00 #define MIFARE_EV1_UIDF1 0x40 #define MIFARE_EV1_UIDF2 0x20 From a19732bb6ec0517488386c8e63bb04af43e54067 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Tue, 4 Jul 2023 16:19:33 +0800 Subject: [PATCH 588/924] Fix timeout of TCP connections --- client/src/comms.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/comms.c b/client/src/comms.c index 64bea9f65..a17bdbaf9 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -623,6 +623,7 @@ int TestProxmark(pm3_device_t *dev) { PacketResponseNG resp; uint16_t len = 32; + bool is_tcp_conn = false; uint8_t data[len]; for (uint16_t i = 0; i < len; i++) data[i] = i & 0xFF; @@ -665,16 +666,17 @@ int TestProxmark(pm3_device_t *dev) { memcpy(&g_pm3_capabilities, resp.data.asBytes, MIN(sizeof(capabilities_t), resp.length)); g_conn.send_via_fpc_usart = g_pm3_capabilities.via_fpc; g_conn.uart_speed = g_pm3_capabilities.baudrate; + is_tcp_conn = memcmp(g_conn.serial_port_name, "tcp:", 4) == 0; PrintAndLogEx(INFO, "Communicating with PM3 over %s%s%s", g_conn.send_via_fpc_usart ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"), - memcmp(g_conn.serial_port_name, "tcp:", 4) == 0 ? " over " _YELLOW_("TCP") : "", + is_tcp_conn ? " over " _YELLOW_("TCP") : "", memcmp(g_conn.serial_port_name, "bt:", 3) == 0 ? " over " _YELLOW_("BT") : ""); if (g_conn.send_via_fpc_usart) { PrintAndLogEx(INFO, "PM3 UART serial baudrate: " _YELLOW_("%u") "\n", g_conn.uart_speed); } else { - int res = uart_reconfigure_timeouts(UART_USB_CLIENT_RX_TIMEOUT_MS); + int res = uart_reconfigure_timeouts(is_tcp_conn ? UART_TCP_CLIENT_RX_TIMEOUT_MS : UART_USB_CLIENT_RX_TIMEOUT_MS); if (res != PM3_SUCCESS) { return res; } From 879bf5876f2f98301e246dec0b0c44bb5ddd82d1 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Tue, 4 Jul 2023 16:21:51 +0800 Subject: [PATCH 589/924] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca0fede15..6bfc7c134 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fixed timeout of TCP connections (@wh201906) ## [Seven.4.16717][2023-06-25] - Change `hf 14a info` - now identifes QL88 tags (@iceman1001) From b74c5db4f9a1677da0c112d352b60dc3337812ef Mon Sep 17 00:00:00 2001 From: wh201906 Date: Wed, 5 Jul 2023 22:12:11 +0800 Subject: [PATCH 590/924] Make communication timeout configurable --- client/src/cmdhw.c | 43 ++++++++++++++++++++++++++++++++++++ client/src/uart/uart.h | 8 +++++-- client/src/uart/uart_posix.c | 4 ++++ client/src/uart/uart_win32.c | 4 ++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index 3ddd98189..c685b83f2 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -33,6 +33,7 @@ #include "pm3_cmd.h" #include "pmflash.h" // rdv40validation_t #include "cmdflashmem.h" // get_signature.. +#include "uart/uart.h" // configure timeout static int CmdHelp(const char *Cmd); @@ -924,6 +925,47 @@ static int CmdTia(const char *Cmd) { return PM3_SUCCESS; } +static int CmdTimeout(const char *Cmd) { + + CLIParserContext *ctx; + CLIParserInit(&ctx, "hw timeout", + "Set the communication timeout on the client side", + "hw timeout --> Show current timeout\n" + "hw timeout -t 20 --> Set the timeout to 20ms\n" + "hw timeout -t 500 --> Set the timeout to 500ms\n" + ); + + void *argtable[] = { + arg_param_begin, + arg_int0("t", "timeout", "", "timeout in ms"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + int32_t arg = arg_get_int_def(ctx, 1, -1); + CLIParserFree(ctx); + + uint32_t oldTimeout = uart_get_timeouts(); + + // timeout is not given/invalid, just show the current timeout then return + if(arg < 0) { + PrintAndLogEx(INFO, "Current communication timeout: %ums", oldTimeout); + return PM3_SUCCESS; + } + + uint32_t newTimeout = arg; + // UART_USB_CLIENT_RX_TIMEOUT_MS is considered as the minimum required timeout. + if (newTimeout < UART_USB_CLIENT_RX_TIMEOUT_MS) { + PrintAndLogEx(WARNING, "Timeout less than %ums might cause errors.", UART_USB_CLIENT_RX_TIMEOUT_MS); + } + else if(newTimeout > 5000) { + PrintAndLogEx(WARNING, "Timeout greater than 5000ms makes the client unresponsive."); + } + uart_reconfigure_timeouts(newTimeout); + PrintAndLogEx(INFO, "Old communication timeout: %ums", oldTimeout); + PrintAndLogEx(INFO, "New communication timeout: %ums", newTimeout); + return PM3_SUCCESS; +} + static int CmdPing(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hw ping", @@ -1062,6 +1104,7 @@ static command_t CommandTable[] = { {"status", CmdStatus, IfPm3Present, "Show runtime status information about the connected Proxmark3"}, {"tearoff", CmdTearoff, IfPm3Present, "Program a tearoff hook for the next command supporting tearoff"}, {"tia", CmdTia, IfPm3Present, "Trigger a Timing Interval Acquisition to re-adjust the RealTimeCounter divider"}, + {"timeout", CmdTimeout, AlwaysAvailable, "Set the communication timeout on the client side"}, {"tune", CmdTune, IfPm3Present, "Measure antenna tuning"}, {"version", CmdVersion, AlwaysAvailable, "Show version information about the client and the connected Proxmark3, if any"}, {NULL, NULL, NULL, NULL} diff --git a/client/src/uart/uart.h b/client/src/uart/uart.h index ba4537769..ae3896f73 100644 --- a/client/src/uart/uart.h +++ b/client/src/uart/uart.h @@ -74,8 +74,12 @@ bool uart_set_speed(serial_port sp, const uint32_t uiPortSpeed); */ uint32_t uart_get_speed(const serial_port sp); -/* Reconfigure timeouts +/* Reconfigure timeouts (ms) */ int uart_reconfigure_timeouts(uint32_t value); -#endif // _UART_H_ +/* Get timeouts (ms) + */ +uint32_t uart_get_timeouts(void); + +#endif // _UART_H_ diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index c64d85db6..106c8d209 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -69,6 +69,10 @@ int uart_reconfigure_timeouts(uint32_t value) { return PM3_SUCCESS; } +uint32_t uart_get_timeouts(void) { + return newtimeout_value; +} + serial_port uart_open(const char *pcPortName, uint32_t speed) { serial_port_unix_t_t *sp = calloc(sizeof(serial_port_unix_t_t), sizeof(uint8_t)); diff --git a/client/src/uart/uart_win32.c b/client/src/uart/uart_win32.c index cb8b92a73..541804a24 100644 --- a/client/src/uart/uart_win32.c +++ b/client/src/uart/uart_win32.c @@ -54,6 +54,10 @@ int uart_reconfigure_timeouts(uint32_t value) { return PM3_SUCCESS; } +uint32_t uart_get_timeouts(void) { + return newtimeout_value; +} + static int uart_reconfigure_timeouts_polling(serial_port sp) { if (newtimeout_pending == false) return PM3_SUCCESS; From 656d0256ac84b44e0cffcc8cdcd328998600b93a Mon Sep 17 00:00:00 2001 From: wh201906 Date: Wed, 5 Jul 2023 22:33:29 +0800 Subject: [PATCH 591/924] Add CHANGELOG entry --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bfc7c134..df3601ba1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Fixed timeout of TCP connections (@wh201906) + - Fixed the timeout of TCP connections (@wh201906) + - Made the connection timeout configurable (@wh201906) ## [Seven.4.16717][2023-06-25] - Change `hf 14a info` - now identifes QL88 tags (@iceman1001) From e43f6804a1634591dbf29dc0216da6ac24b01126 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 6 Jul 2023 22:37:34 +0200 Subject: [PATCH 592/924] style --- armsrc/fpgaloader.c | 4 +- client/src/cmdhw.c | 5 +- client/src/pm3line_vocabulory.h | 1524 +++++++++++++-------------- fpga/Makefile | 7 +- tools/fpga_compress/fpga_compress.c | 6 +- 5 files changed, 775 insertions(+), 771 deletions(-) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 6715aa962..5c5b6f8c5 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -407,9 +407,9 @@ static int bitparse_find_section(int bitstream_version, char section_name, uint3 current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 8; current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 0; numbytes += 4; - if (current_length > 300*1024) { + if (current_length > 300 * 1024) { /* section e should never exceed about 300KB, if the length is too big limit it but still send the bitstream just in case */ - current_length = 300*1024; + current_length = 300 * 1024; } break; default: /* Two byte length field */ diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index c685b83f2..57bba66aa 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -947,7 +947,7 @@ static int CmdTimeout(const char *Cmd) { uint32_t oldTimeout = uart_get_timeouts(); // timeout is not given/invalid, just show the current timeout then return - if(arg < 0) { + if (arg < 0) { PrintAndLogEx(INFO, "Current communication timeout: %ums", oldTimeout); return PM3_SUCCESS; } @@ -956,8 +956,7 @@ static int CmdTimeout(const char *Cmd) { // UART_USB_CLIENT_RX_TIMEOUT_MS is considered as the minimum required timeout. if (newTimeout < UART_USB_CLIENT_RX_TIMEOUT_MS) { PrintAndLogEx(WARNING, "Timeout less than %ums might cause errors.", UART_USB_CLIENT_RX_TIMEOUT_MS); - } - else if(newTimeout > 5000) { + } else if (newTimeout > 5000) { PrintAndLogEx(WARNING, "Timeout greater than 5000ms makes the client unresponsive."); } uart_reconfigure_timeouts(newTimeout); diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index ffad57057..7284af351 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,767 +31,767 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data num" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 0, "emv exec" }, - { 0, "emv pse" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 0, "emv gpo" }, - { 0, "emv readrec" }, - { 0, "emv genac" }, - { 0, "emv challenge" }, - { 0, "emv intauth" }, - { 0, "emv scan" }, - { 1, "emv test" }, - { 1, "emv list" }, - { 0, "emv roca" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 0, "hf legic einfo" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf gdmcfg" }, - { 0, "hf mf gdmsetcfg" }, - { 0, "hf mf gdmsetblk" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 1, "hf mfp list" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp dump" }, - { 0, "hf mfp info" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp ndefformat" }, - { 0, "hf mfp ndefread" }, - { 0, "hf mfp ndefwrite" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu tamper" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 1, "hf topaz list" }, - { 0, "hf topaz dump" }, - { 0, "hf topaz info" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 brute" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag cc" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data num" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 0, "emv exec" }, + { 0, "emv pse" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 0, "emv gpo" }, + { 0, "emv readrec" }, + { 0, "emv genac" }, + { 0, "emv challenge" }, + { 0, "emv intauth" }, + { 0, "emv scan" }, + { 1, "emv test" }, + { 1, "emv list" }, + { 0, "emv roca" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 0, "hf legic einfo" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf gdmcfg" }, + { 0, "hf mf gdmsetcfg" }, + { 0, "hf mf gdmsetblk" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 1, "hf mfp list" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp dump" }, + { 0, "hf mfp info" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp ndefformat" }, + { 0, "hf mfp ndefread" }, + { 0, "hf mfp ndefwrite" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu tamper" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 1, "hf topaz list" }, + { 0, "hf topaz dump" }, + { 0, "hf topaz info" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 0, "lf hitag eload" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag reader" }, + { 0, "lf hitag sim" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag writer" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag cc" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -799,4 +799,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif \ No newline at end of file +#endif diff --git a/fpga/Makefile b/fpga/Makefile index e5bca0dfb..068b75255 100644 --- a/fpga/Makefile +++ b/fpga/Makefile @@ -213,9 +213,14 @@ clean: help: @echo "################################################################" - @echo "# Valid targets are: $(TARGETS)" + @echo "#" @echo "# - Builds only one of the above listed targets" @echo "# all - Builds the FPGA bitstreams for all targets" @echo "# clean - Keeps .bit files but cleans intermediate build files for all targets" + @echo "#" + @echo "#" + @echo "# Valid targets are:" + @echo "# $(TARGETS)" + @echo "#" @echo "################################################################" diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 0a66142ac..135125bfc 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -283,7 +283,7 @@ static int bitparse_find_section(FILE *infile, char section_name, unsigned int * for (int i = 0; i < 4; i++) { tmp = fgetc(infile); /* image length sanity check, should be under 300KB */ - if ( (tmp < 0) || (tmp > 300*1024) ) { + if ((tmp < 0) || (tmp > 300 * 1024)) { break; } current_length += tmp << (24 - (i * 8)); @@ -294,7 +294,7 @@ static int bitparse_find_section(FILE *infile, char section_name, unsigned int * for (int i = 0; i < 2; i++) { tmp = fgetc(infile); /* if name, date or time fields are too long, we probably shouldn't parse them */ - if ( (tmp < 0) || (tmp > 64) ){ + if ((tmp < 0) || (tmp > 64)) { break; } current_length += tmp << (8 - (i * 8)); @@ -345,7 +345,7 @@ static int FpgaGatherVersion(FILE *infile, char *infile_name, char *dst, int len } strncat(dst, tempstr, len - strlen(dst) - 1); - } + } strncat(dst, " image ", len - strlen(dst) - 1); if (bitparse_find_section(infile, 'b', &fpga_info_len)) { From 59aa95fa6e5ce9e051c411e44b1e8e57636c89c6 Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Wed, 5 Jul 2023 23:12:25 -0500 Subject: [PATCH 593/924] begin implementation --- client/CMakeLists.txt | 1 + client/deps/mbedtls.cmake | 1 + client/src/cmdnfc.c | 2 + client/src/cmdvas.c | 431 ++++++++++++++++++++++++++++++++++++++ client/src/cmdvas.h | 26 +++ 5 files changed, 461 insertions(+) create mode 100644 client/src/cmdvas.c create mode 100644 client/src/cmdvas.h diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 8759c00f3..6252393e8 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -337,6 +337,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdlfzx8211.c ${PM3_ROOT}/client/src/cmdmain.c ${PM3_ROOT}/client/src/cmdnfc.c + ${PM3_ROOT}/client/src/cmdvas.c ${PM3_ROOT}/client/src/cmdparser.c ${PM3_ROOT}/client/src/cmdpiv.c ${PM3_ROOT}/client/src/cmdscript.c diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 40929e1ea..784f0f94d 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -9,6 +9,7 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ../../common/mbedtls/entropy.c ../../common/mbedtls/error.c ../../common/mbedtls/ecp.c + ../../common/mbedtls/ecdh.c ../../common/mbedtls/ecp_curves.c ../../common/mbedtls/certs.c ../../common/mbedtls/camellia.c diff --git a/client/src/cmdnfc.c b/client/src/cmdnfc.c index eadfa7161..cb9979449 100644 --- a/client/src/cmdnfc.c +++ b/client/src/cmdnfc.c @@ -28,6 +28,7 @@ #include "cmdhfst25ta.h" #include "cmdhfthinfilm.h" #include "cmdhftopaz.h" +#include "cmdvas.h" #include "cmdnfc.h" #include "fileutils.h" #include "mifare/mifaredefault.h" @@ -421,6 +422,7 @@ static command_t CommandTable[] = { // {"type5", CmdNFCType5, AlwaysAvailable, "{ NFC Forum Tag Type 5... }"}, {"mf", CmdNFCMF, AlwaysAvailable, "{ NFC Type MIFARE Classic/Plus Tag... }"}, {"barcode", CmdNFCBarcode, AlwaysAvailable, "{ NFC Barcode Tag... }"}, + {"vas", CmdVAS, AlwaysAvailable, "{ Apple Value Added Service }"}, // {"--------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("NFC peer-to-peer") " ------------"}, // {"isodep", CmdISODEP, AlwaysAvailable, "{ ISO-DEP protocol... }"}, // {"llcp", CmdNFCLLCP, AlwaysAvailable, "{ Logical Link Control Protocol... }"}, diff --git a/client/src/cmdvas.c b/client/src/cmdvas.c new file mode 100644 index 000000000..a0e0b0522 --- /dev/null +++ b/client/src/cmdvas.c @@ -0,0 +1,431 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// An implementation of the Value Added Service protocol +//----------------------------------------------------------------------------- + +#include "cmdvas.h" +#include "cliparser.h" +#include "cmdparser.h" +#include "comms.h" +#include "ansi.h" +#include "cmdhf14a.h" +#include "emv/tlv.h" +#include "iso7816/apduinfo.h" +#include "ui.h" +#include "util.h" +#include "util_posix.h" +#include "iso7816/iso7816core.h" +#include "stddef.h" +#include "stdbool.h" +#include "mifare.h" +#include +#include +#include "crypto/libpcrypto.h" +#include "fileutils.h" +#include "mbedtls/ecp.h" +#include "mbedtls/bignum.h" +#include "mbedtls/ecdh.h" + +uint8_t ecpData[] = { 0x6a, 0x01, 0x00, 0x00, 0x04 }; +uint8_t aid[] = { 0x4f, 0x53, 0x45, 0x2e, 0x56, 0x41, 0x53, 0x2e, 0x30, 0x31 }; +uint8_t getVasUrlOnlyP2 = 0x00; +uint8_t getVasFullReqP2 = 0x01; + +static int ParseSelectVASResponse(uint8_t *response, size_t resLen, bool verbose) { + struct tlvdb *tlvRoot = tlvdb_parse_multi(response, resLen); + + struct tlvdb *versionTlv = tlvdb_find_full(tlvRoot, 0x9F21); + if (versionTlv == NULL) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + const struct tlv *version = tlvdb_get_tlv(versionTlv); + if (version->len != 2) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + if (verbose) { + PrintAndLogEx(INFO, "Mobile VAS application version: %d.%d", version->value[0], version->value[1]); + } + if (version->value[0] != 0x01 || version->value[1] != 0x00) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + + struct tlvdb *capabilitiesTlv = tlvdb_find_full(tlvRoot, 0x9F23); + if (capabilitiesTlv == NULL) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + const struct tlv *capabilities = tlvdb_get_tlv(capabilitiesTlv); + if (capabilities->len != 4 + || capabilities->value[0] != 0x00 + || capabilities->value[1] != 0x00 + || capabilities->value[2] != 0x00 + || (capabilities->value[3] & 8) == 0) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + + tlvdb_free(tlvRoot); + return PM3_SUCCESS; +} + +static int CreateGetVASDataCommand(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t *out, int *outLen) { + if (pidHash == NULL && url == NULL) { + PrintAndLogEx(FAILED, "Must provide a Pass Type ID or a URL"); + return PM3_EINVARG; + } + + if (url != NULL && urlLen > 256) { + PrintAndLogEx(FAILED, "URL must be less than 256 characters"); + return PM3_EINVARG; + } + + uint8_t p2 = pidHash == NULL ? getVasUrlOnlyP2 : getVasFullReqP2; + + size_t reqTlvLen = 19 + (pidHash != NULL ? 35 : 0) + (url != NULL ? 3 + urlLen : 0); + uint8_t *reqTlv = calloc(reqTlvLen, sizeof(uint8_t)); + + uint8_t version[] = {0x9F, 0x22, 0x02, 0x01, 0x00}; + memcpy(reqTlv, version, sizeof(version)); + + uint8_t unknown[] = {0x9F, 0x28, 0x04, 0x00, 0x00, 0x00, 0x00}; + memcpy(reqTlv + sizeof(version), unknown, sizeof(unknown)); + + uint8_t terminalCapabilities[] = {0x9F, 0x26, 0x04, 0x00, 0x00, 0x00, 0x02}; + memcpy(reqTlv + sizeof(version) + sizeof(unknown), terminalCapabilities, sizeof(terminalCapabilities)); + + if (pidHash != NULL) { + size_t offset = sizeof(version) + sizeof(unknown) + sizeof(terminalCapabilities); + reqTlv[offset] = 0x9F; + reqTlv[offset + 1] = 0x25; + reqTlv[offset + 2] = 32; + memcpy(reqTlv + offset + 3, pidHash, 32); + } + + if (url != NULL) { + size_t offset = sizeof(version) + sizeof(unknown) + sizeof(terminalCapabilities) + (pidHash != NULL ? 35 : 0); + reqTlv[offset] = 0x9F; + reqTlv[offset + 1] = 0x29; + reqTlv[offset + 2] = urlLen; + memcpy(reqTlv + offset + 3, url, urlLen); + } + + out[0] = 0x80; + out[1] = 0xCA; + out[2] = 0x01; + out[3] = p2; + out[4] = reqTlvLen; + memcpy(out + 5, reqTlv, reqTlvLen); + out[5 + reqTlvLen] = 0x00; + + *outLen = 6 + reqTlvLen; + + free(reqTlv); + return PM3_SUCCESS; +} + +static int ParseGetVASDataResponse(uint8_t *res, size_t resLen, uint8_t *cryptogram, size_t *cryptogramLen) { + struct tlvdb *tlvRoot = tlvdb_parse_multi(res, resLen); + + struct tlvdb *cryptogramTlvdb = tlvdb_find_full(tlvRoot, 0x9F27); + if (cryptogramTlvdb == NULL) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + const struct tlv *cryptogramTlv = tlvdb_get_tlv(cryptogramTlvdb); + + memcpy(cryptogram, cryptogramTlv->value, cryptogramTlv->len); + *cryptogramLen = cryptogramTlv->len; + + tlvdb_free(tlvRoot); + return PM3_SUCCESS; +} + +static int LoadReaderPrivateKey(uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair *privKey) { + struct tlvdb *derRoot = tlvdb_parse_multi(buf, bufLen); + + struct tlvdb *privkeyTlvdb = tlvdb_find_full(derRoot, 0x04); + if (privkeyTlvdb == NULL) { + tlvdb_free(derRoot); + return PM3_EINVARG; + } + const struct tlv *privkeyTlv = tlvdb_get_tlv(privkeyTlvdb); + + if (mbedtls_ecp_read_key(MBEDTLS_ECP_DP_SECP256R1, privKey, privkeyTlv->value, privkeyTlv->len)) { + tlvdb_free(derRoot); + PrintAndLogEx(FAILED, "Unable to parse private key file. Should be DER encoded ASN1"); + return PM3_EINVARG; + } + + struct tlvdb *pubkeyCoordsTlvdb = tlvdb_find_full(derRoot, 0x03); + if (pubkeyCoordsTlvdb == NULL) { + tlvdb_free(derRoot); + PrintAndLogEx(FAILED, "Private key file should include public key component"); + return PM3_EINVARG; + } + const struct tlv *pubkeyCoordsTlv = tlvdb_get_tlv(pubkeyCoordsTlvdb); + if (pubkeyCoordsTlv->len != 66 || pubkeyCoordsTlv->value[0] != 0x00 || pubkeyCoordsTlv->value[1] != 0x04) { + tlvdb_free(derRoot); + PrintAndLogEx(FAILED, "Invalid public key data"); + return PM3_EINVARG; + } + + tlvdb_free(derRoot); + + if (mbedtls_mpi_read_binary(&privKey->Q.X, pubkeyCoordsTlv->value + 2, 32) + || mbedtls_mpi_read_binary(&privKey->Q.Y, pubkeyCoordsTlv->value + 34, 32) + || mbedtls_mpi_lset(&privKey->Q.Z, 1)) { + PrintAndLogEx(FAILED, "Failed to read in public key coordinates"); + return PM3_EINVARG; + } + + if (mbedtls_ecp_check_pubkey(&privKey->grp, &privKey->Q)) { + PrintAndLogEx(FAILED, "VAS protocol requires an elliptic key on the P-256 curve"); + return PM3_EINVARG; + } + + return PM3_SUCCESS; +} + +static int GetPrivateKeyHint(mbedtls_ecp_keypair *privKey, uint8_t *keyHint) { + uint8_t xcoord[32] = {0}; + if (mbedtls_mpi_write_binary(&privKey->Q.X, xcoord, sizeof(xcoord))) { + return PM3_EINVARG; + } + + uint8_t hash[32] = {0}; + sha256hash(xcoord, 32, hash); + + memcpy(keyHint, hash, 4); + return PM3_SUCCESS; +} + +static int LoadMobileEphemeralKey(uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKey) { + if (mbedtls_mpi_read_binary(&pubKey->Q.X, xcoordBuf, 32)) { + return PM3_EINVARG; + } + return PM3_SUCCESS; +} + +static int DecryptVASCryptogram(uint8_t *cryptogram, size_t cryptogramLen, mbedtls_ecp_keypair *privKey, uint8_t *out, size_t *outLen, uint8_t *timestamp) { + uint8_t keyHint[4] = {0}; + if (GetPrivateKeyHint(privKey, keyHint) != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Unable to generate key hint"); + return PM3_EINVARG; + } + + if (memcmp(keyHint, cryptogram, 4) != 0) { + PrintAndLogEx(FAILED, "Private key does not match cryptogram"); + return PM3_EINVARG; + } + + mbedtls_ecp_keypair mobilePubKey; + mbedtls_ecp_keypair_init(&mobilePubKey); + mobilePubKey.grp = privKey->grp; + + if (LoadMobileEphemeralKey(cryptogram + 4, &mobilePubKey) != PM3_SUCCESS) { + mbedtls_ecp_keypair_free(&mobilePubKey); + PrintAndLogEx(FAILED, "Unable to parse mobile ephemeral key from cryptogram"); + return PM3_EINVARG; + } + + mbedtls_mpi sharedSecret; + mbedtls_mpi_init(&sharedSecret); + + if (mbedtls_ecdh_compute_shared(&privKey->grp, &sharedSecret, &mobilePubKey.Q, &privKey->d, NULL, NULL)) { + mbedtls_mpi_free(&sharedSecret); + mbedtls_ecp_keypair_free(&mobilePubKey); + PrintAndLogEx(FAILED, "Failed to generate ECDH shared secret"); + return PM3_EINVARG; + } + + mbedtls_mpi_free(&sharedSecret); + mbedtls_ecp_keypair_free(&mobilePubKey); + return PM3_SUCCESS; +} + +static int VASReader(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t *cryptogram, size_t *cryptogramLen, bool verbose) { + clearCommandBuffer(); + + uint16_t flags = ISO14A_RAW | ISO14A_CONNECT | ISO14A_NO_SELECT | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT; + SendCommandMIX(CMD_HF_ISO14443A_READER, flags, sizeof(ecpData), 0, ecpData, sizeof(ecpData)); + + msleep(160); + + if (SelectCard14443A_4(false, false, NULL) != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "No card in field"); + return PM3_ECARDEXCHANGE; + } + + uint16_t status = 0; + size_t resLen = 0; + uint8_t selectResponse[APDU_RES_LEN] = {0}; + Iso7816Select(CC_CONTACTLESS, true, true, aid, sizeof(aid), selectResponse, APDU_RES_LEN, &resLen, &status); + + if (status != 0x9000) { + PrintAndLogEx(FAILED, "Card doesn't support VAS"); + return PM3_ECARDEXCHANGE; + } + + if (ParseSelectVASResponse(selectResponse, resLen, verbose) != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Card doesn't support VAS"); + return PM3_ECARDEXCHANGE; + } + + uint8_t getVasApdu[PM3_CMD_DATA_SIZE]; + int getVasApduLen = 0; + + int s = CreateGetVASDataCommand(pidHash, url, urlLen, getVasApdu, &getVasApduLen); + if (s != PM3_SUCCESS) { + return s; + } + + uint8_t apduRes[APDU_RES_LEN] = {0}; + int apduResLen = 0; + + s = ExchangeAPDU14a(getVasApdu, getVasApduLen, false, false, apduRes, APDU_RES_LEN, &apduResLen); + if (s != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Failed to send APDU"); + return s; + } + + if (apduResLen == 2 && apduRes[0] == 0x62 && apduRes[1] == 0x87) { + PrintAndLogEx(WARNING, "Device returned error on GET VAS DATA. Either doesn't have pass with matching id, or requires user authentication."); + return PM3_ECARDEXCHANGE; + } + + if (apduResLen == 0 || apduRes[0] != 0x70) { + PrintAndLogEx(FAILED, "Invalid response from peer"); + } + + return ParseGetVASDataResponse(apduRes, apduResLen, cryptogram, cryptogramLen); +} + +static int CmdVASReader(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "nfc vas reader", + "Read and decrypt VAS message", + "nfc vas reader -p pass.com.example.ticket -k ./priv.key -> select pass and decrypt with priv.key\nnfc vas reader --url https://example.com -> URL Only mode"); + void *argtable[] = { + arg_param_begin, + arg_str0("p", NULL, "", "pass type id"), + arg_str0("k", NULL, "", "path to terminal private key"), + arg_str0(NULL, "url", "", "a URL to provide to the mobile device"), + arg_lit0("v", "verbose", "log additional information"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + struct arg_str *passTypeIdArg = arg_get_str(ctx, 1); + int passTypeIdLen = arg_get_str_len(ctx, 1); + uint8_t pidHash[32] = {0}; + sha256hash((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen, pidHash); + + struct arg_str *keyPathArg = arg_get_str(ctx, 2); + int keyPathLen = arg_get_str_len(ctx, 2); + + if (keyPathLen == 0 && passTypeIdLen > 0) { + PrintAndLogEx(FAILED, "Must provide path to terminal private key if a pass type id is provided"); + CLIParserFree(ctx); + return PM3_EINVARG; + } + + uint8_t *keyData = NULL; + size_t keyDataLen = 0; + if (loadFile_safe(keyPathArg->sval[0], "", (void **)&keyData, &keyDataLen) != PM3_SUCCESS) { + CLIParserFree(ctx); + return PM3_EINVARG; + } + + mbedtls_ecp_keypair privKey; + mbedtls_ecp_keypair_init(&privKey); + + if (LoadReaderPrivateKey(keyData, keyDataLen, &privKey) != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } + + struct arg_str *urlArg = arg_get_str(ctx, 3); + int urlLen = arg_get_str_len(ctx, 3); + const char *url = NULL; + if (urlLen > 0) { + url = urlArg->sval[0]; + } + + bool verbose = arg_get_lit(ctx, 4); + + uint8_t cryptogram[120] = {0}; + size_t cryptogramLen = 0; + + int s = VASReader(passTypeIdLen > 0 ? pidHash : NULL, url, urlLen, cryptogram, &cryptogramLen, verbose); + if (s != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return s; + } + + if (verbose) { + PrintAndLogEx(INFO, "Got cryptogram response: %s", sprint_hex(cryptogram, cryptogramLen)); + } + + uint8_t message[64] = {0}; + size_t messageLen = 0; + uint8_t timestamp[4] = {0}; + + if (DecryptVASCryptogram(cryptogram, cryptogramLen, &privKey, message, &messageLen, timestamp) != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } + + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return s; +} + +static int CmdVASDecrypt(const char *Cmd) { + return PM3_SUCCESS; +} + +static int CmdVASSim(const char *Cmd) { + return PM3_SUCCESS; +} + +static int CmdHelp(const char *Cmd); + +static command_t CommandTable[] = { + {"--------", CmdHelp, AlwaysAvailable, "----------- " _CYAN_("Value Added Service") " -----------"}, + {"reader", CmdVASReader, IfPm3Iso14443a, "Read and decrypt VAS message"}, + {"decrypt", CmdVASDecrypt, AlwaysAvailable, "Decrypt a VAS cryptogram"}, + {"sim", CmdVASSim, IfPm3Iso14443a, "Simulate a VAS mobile credential"}, + {"--------", CmdHelp, AlwaysAvailable, "----------------- " _CYAN_("General") " -----------------"}, + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {NULL, NULL, NULL, NULL} +}; + +int CmdVAS(const char *Cmd) { + clearCommandBuffer(); + return CmdsParse(CommandTable, Cmd); +}; + +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return PM3_SUCCESS; +}; diff --git a/client/src/cmdvas.h b/client/src/cmdvas.h new file mode 100644 index 000000000..59a53f50d --- /dev/null +++ b/client/src/cmdvas.h @@ -0,0 +1,26 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// An implementation of the Value Added Service protocol +//----------------------------------------------------------------------------- + +#ifndef CMDVAS_H__ +#define CMDVAS_H__ + +#include "common.h" + +int CmdVAS(const char *Cmd); + +#endif From 44f2e253d8e11349c3d8679d38b4f78296d1a06d Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Thu, 6 Jul 2023 18:03:58 -0500 Subject: [PATCH 594/924] import mbedtls ecc point (de)compression extension and use --- client/deps/mbedtls.cmake | 1 + client/src/cmdvas.c | 79 ++++++++++++++- common/mbedtls/ecc_point_compression.c | 130 +++++++++++++++++++++++++ common/mbedtls/ecc_point_compression.h | 32 ++++++ 4 files changed, 237 insertions(+), 5 deletions(-) create mode 100644 common/mbedtls/ecc_point_compression.c create mode 100644 common/mbedtls/ecc_point_compression.h diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 784f0f94d..82a97e8a0 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -10,6 +10,7 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ../../common/mbedtls/error.c ../../common/mbedtls/ecp.c ../../common/mbedtls/ecdh.c + ../../common/mbedtls/ecc_point_compression.c ../../common/mbedtls/ecp_curves.c ../../common/mbedtls/certs.c ../../common/mbedtls/camellia.c diff --git a/client/src/cmdvas.c b/client/src/cmdvas.c index a0e0b0522..00c5a83f4 100644 --- a/client/src/cmdvas.c +++ b/client/src/cmdvas.c @@ -38,6 +38,7 @@ #include "mbedtls/ecp.h" #include "mbedtls/bignum.h" #include "mbedtls/ecdh.h" +#include "mbedtls/ecc_point_compression.h" uint8_t ecpData[] = { 0x6a, 0x01, 0x00, 0x00, 0x04 }; uint8_t aid[] = { 0x4f, 0x53, 0x45, 0x2e, 0x56, 0x41, 0x53, 0x2e, 0x30, 0x31 }; @@ -187,9 +188,7 @@ static int LoadReaderPrivateKey(uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair tlvdb_free(derRoot); - if (mbedtls_mpi_read_binary(&privKey->Q.X, pubkeyCoordsTlv->value + 2, 32) - || mbedtls_mpi_read_binary(&privKey->Q.Y, pubkeyCoordsTlv->value + 34, 32) - || mbedtls_mpi_lset(&privKey->Q.Z, 1)) { + if (mbedtls_ecp_point_read_binary(&privKey->grp, &privKey->Q, pubkeyCoordsTlv->value + 1, 65)) { PrintAndLogEx(FAILED, "Failed to read in public key coordinates"); return PM3_EINVARG; } @@ -216,9 +215,20 @@ static int GetPrivateKeyHint(mbedtls_ecp_keypair *privKey, uint8_t *keyHint) { } static int LoadMobileEphemeralKey(uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKey) { - if (mbedtls_mpi_read_binary(&pubKey->Q.X, xcoordBuf, 32)) { + uint8_t compressedEcKey[33] = {0}; + compressedEcKey[0] = 0x02; + memcpy(compressedEcKey + 1, xcoordBuf, 32); + + uint8_t decompressedEcKey[65] = {0}; + size_t decompressedEcKeyLen = 0; + if (mbedtls_ecp_decompress(&pubKey->grp, compressedEcKey, sizeof(compressedEcKey), decompressedEcKey, &decompressedEcKeyLen, sizeof(decompressedEcKey))) { return PM3_EINVARG; } + + if (mbedtls_ecp_point_read_binary(&pubKey->grp, &pubKey->Q, decompressedEcKey, decompressedEcKeyLen)) { + return PM3_EINVARG; + } + return PM3_SUCCESS; } @@ -400,6 +410,65 @@ static int CmdVASReader(const char *Cmd) { } static int CmdVASDecrypt(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "nfc vas decrypt", + "Decrypt a previously captured cryptogram", + "nfc vas reader -p pass.com.example.ticket -k ./priv.key -> select pass and decrypt with priv.key\nnfc vas reader --url https://example.com -> URL Only mode"); + void *argtable[] = { + arg_param_begin, + arg_str0("p", NULL, "", "pass type id"), + arg_str0("k", NULL, "", "path to terminal private key"), + arg_str0(NULL, NULL, "", "cryptogram to decrypt"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + struct arg_str *passTypeIdArg = arg_get_str(ctx, 1); + int passTypeIdLen = arg_get_str_len(ctx, 1); + uint8_t pidHash[32] = {0}; + sha256hash((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen, pidHash); + + uint8_t cryptogram[120] = {0}; + int cryptogramLen = 0; + CLIGetHexWithReturn(ctx, 3, cryptogram, &cryptogramLen); + + struct arg_str *keyPathArg = arg_get_str(ctx, 2); + int keyPathLen = arg_get_str_len(ctx, 2); + + if (keyPathLen == 0 && passTypeIdLen > 0) { + PrintAndLogEx(FAILED, "Must provide path to terminal private key if a pass type id is provided"); + CLIParserFree(ctx); + return PM3_EINVARG; + } + + uint8_t *keyData = NULL; + size_t keyDataLen = 0; + if (loadFile_safe(keyPathArg->sval[0], "", (void **)&keyData, &keyDataLen) != PM3_SUCCESS) { + CLIParserFree(ctx); + return PM3_EINVARG; + } + + mbedtls_ecp_keypair privKey; + mbedtls_ecp_keypair_init(&privKey); + + if (LoadReaderPrivateKey(keyData, keyDataLen, &privKey) != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } + + uint8_t message[64] = {0}; + size_t messageLen = 0; + uint8_t timestamp[4] = {0}; + + if (DecryptVASCryptogram(cryptogram, cryptogramLen, &privKey, message, &messageLen, timestamp) != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } + + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); return PM3_SUCCESS; } @@ -412,7 +481,7 @@ static int CmdHelp(const char *Cmd); static command_t CommandTable[] = { {"--------", CmdHelp, AlwaysAvailable, "----------- " _CYAN_("Value Added Service") " -----------"}, {"reader", CmdVASReader, IfPm3Iso14443a, "Read and decrypt VAS message"}, - {"decrypt", CmdVASDecrypt, AlwaysAvailable, "Decrypt a VAS cryptogram"}, + {"decrypt", CmdVASDecrypt, AlwaysAvailable, "Decrypt a previously captured VAS cryptogram"}, {"sim", CmdVASSim, IfPm3Iso14443a, "Simulate a VAS mobile credential"}, {"--------", CmdHelp, AlwaysAvailable, "----------------- " _CYAN_("General") " -----------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, diff --git a/common/mbedtls/ecc_point_compression.c b/common/mbedtls/ecc_point_compression.c new file mode 100644 index 000000000..387255507 --- /dev/null +++ b/common/mbedtls/ecc_point_compression.c @@ -0,0 +1,130 @@ +/* +* Not original to the mbedtls library. Taken from +* https://github.com/mwarning/mbedtls_ecp_compression +* to solve mbedtls' lack of support for elliptic point +* compression and decompression +* +* Released under CC0 1.0 Universal License +*/ + +/* +* This is all about mbedtls_ecp_decompress() and mbedtls_ecp_compress() +* +* Perform X25519 / Curve25519 point compression and decompression for mbedtls. +* As of mbedtls 2.5.1, mbedtls does not support decompression yet. +* +*/ + +#define MBEDTLS_ALLOW_PRIVATE_ACCESS + +#include "ecc_point_compression.h" + +int mbedtls_ecp_decompress( + const mbedtls_ecp_group *grp, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize +) { + int ret; + size_t plen; + mbedtls_mpi r; + mbedtls_mpi x; + mbedtls_mpi n; + + plen = mbedtls_mpi_size(&grp->P); + + *olen = 2 * plen + 1; + + if (osize < *olen) + return(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL); + + if (ilen != plen + 1) + return(MBEDTLS_ERR_ECP_BAD_INPUT_DATA); + + if (input[0] != 0x02 && input[0] != 0x03) + return(MBEDTLS_ERR_ECP_BAD_INPUT_DATA); + + // output will consist of 0x04|X|Y + memcpy(output, input, ilen); + output[0] = 0x04; + + mbedtls_mpi_init(&r); + mbedtls_mpi_init(&x); + mbedtls_mpi_init(&n); + + // x <= input + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&x, input + 1, plen)); + + // r = x^2 + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&r, &x, &x)); + + // r = x^2 + a + if (grp->A.p == NULL) { + // Special case where a is -3 + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&r, &r, 3)); + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&r, &r, &grp->A)); + } + + // r = x^3 + ax + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&r, &r, &x)); + + // r = x^3 + ax + b + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&r, &r, &grp->B)); + + // Calculate square root of r over finite field P: + // r = sqrt(x^3 + ax + b) = (x^3 + ax + b) ^ ((P + 1) / 4) (mod P) + + // n = P + 1 + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&n, &grp->P, 1)); + + // n = (P + 1) / 4 + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&n, 2)); + + // r ^ ((P + 1) / 4) (mod p) + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&r, &r, &n, &grp->P, NULL)); + + // Select solution that has the correct "sign" (equals odd/even solution in finite group) + if ((input[0] == 0x03) != mbedtls_mpi_get_bit(&r, 0)) { + // r = p - r + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&r, &grp->P, &r)); + } + + // y => output + ret = mbedtls_mpi_write_binary(&r, output + 1 + plen, plen); + +cleanup: + mbedtls_mpi_free(&r); + mbedtls_mpi_free(&x); + mbedtls_mpi_free(&n); + + return(ret); +} + +int mbedtls_ecp_compress( + const mbedtls_ecp_group *grp, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize +) { + size_t plen; + + plen = mbedtls_mpi_size(&grp->P); + + *olen = plen + 1; + + if (osize < *olen) + return(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL); + + if (ilen != 2 * plen + 1) + return (MBEDTLS_ERR_ECP_BAD_INPUT_DATA); + + if (input[0] != 0x04) + return(MBEDTLS_ERR_ECP_BAD_INPUT_DATA); + + // output will consist of 0x0?|X + memcpy(output, input, *olen); + + // Encode even/odd of Y into first byte (either 0x02 or 0x03) + output[0] = 0x02 + (input[2 * plen] & 1); + + return(0); +} diff --git a/common/mbedtls/ecc_point_compression.h b/common/mbedtls/ecc_point_compression.h new file mode 100644 index 000000000..d75fea39b --- /dev/null +++ b/common/mbedtls/ecc_point_compression.h @@ -0,0 +1,32 @@ +/* +* Not original to the mbedtls library. Taken from +* https://github.com/mwarning/mbedtls_ecp_compression +* to solve mbedtls' lack of support for elliptic point +* compression and decompression +* +* Released under CC0 1.0 Universal License +*/ + +/* +* This is all about mbedtls_ecp_decompress() and mbedtls_ecp_compress() +* +* Perform X25519 / Curve25519 point compression and decompression for mbedtls. +* As of mbedtls 2.5.1, mbedtls does not support decompression yet. +* +*/ + +#include + +#include "mbedtls/ecp.h" + +int mbedtls_ecp_decompress( + const mbedtls_ecp_group *grp, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize +); + +int mbedtls_ecp_compress( + const mbedtls_ecp_group *grp, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize +); From 610b8a741011664d2fb14c5cdb88de344b021955 Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Fri, 7 Jul 2023 14:37:02 -0500 Subject: [PATCH 595/924] Implement ANSI X9.63 sha256 per spec --- client/src/crypto/libpcrypto.c | 33 +++++++++++++++++++++++++++++++++ client/src/crypto/libpcrypto.h | 3 +++ 2 files changed, 36 insertions(+) diff --git a/client/src/crypto/libpcrypto.c b/client/src/crypto/libpcrypto.c index d2ac7a324..0d322a9a1 100644 --- a/client/src/crypto/libpcrypto.c +++ b/client/src/crypto/libpcrypto.c @@ -18,6 +18,7 @@ #include "crypto/libpcrypto.h" #include "crypto/asn1utils.h" +#include #include #include #include @@ -34,6 +35,7 @@ #include #include #include +#include "libpcrypto.h" #include "util.h" #include "ui.h" @@ -632,3 +634,34 @@ int blowfish_decrypt(uint8_t *iv, uint8_t *key, uint8_t *input, uint8_t *output, return 0; } + +// Implementation from http://www.secg.org/sec1-v2.pdf#subsubsection.3.6.1 +int ansi_x963_sha256(uint8_t *sharedSecret, size_t sharedSecretLen, uint8_t *sharedInfo, size_t sharedInfoLen, size_t keyDataLen, uint8_t *keyData) { + // sha256 hash has (practically) no max input len, so skipping that step + + if (keyDataLen >= 32 * (pow(2, 32) - 1)) { + return 1; + } + + uint32_t counter = 0x00000001; + + for (int i = 0; i < (keyDataLen / 32); ++i) { + uint8_t *hashMaterial = malloc(4 + sharedSecretLen + sharedInfoLen); + memcpy(hashMaterial, sharedSecret, sharedSecretLen); + hashMaterial[sharedSecretLen] = (counter >> 24); + hashMaterial[sharedSecretLen + 1] = (counter >> 16) & 0xFF; + hashMaterial[sharedSecretLen + 2] = (counter >> 8) & 0xFF; + hashMaterial[sharedSecretLen + 3] = counter & 0xFF; + memcpy(hashMaterial + sharedSecretLen + 4, sharedInfo, sharedInfoLen); + + uint8_t hash[32] = {0}; + sha256hash(hashMaterial, 4 + sharedSecretLen + sharedInfoLen, hash); + free(hashMaterial); + + memcpy(keyData + (32 * i), hash, 32); + + counter++; + } + + return 0; +} diff --git a/client/src/crypto/libpcrypto.h b/client/src/crypto/libpcrypto.h index 301633fde..5d10b10ee 100644 --- a/client/src/crypto/libpcrypto.h +++ b/client/src/crypto/libpcrypto.h @@ -64,4 +64,7 @@ size_t FindISO9797M2PaddingDataLen(const uint8_t *data, size_t datalen); // BLOWFISH int blowfish_decrypt(uint8_t *iv, uint8_t *key, uint8_t *input, uint8_t *output, int length); +// KDF +int ansi_x963_sha256(uint8_t *sharedSecret, size_t sharedSecretLen, uint8_t *sharedInfo, size_t sharedInfoLen, size_t keyDataLen, uint8_t *keyData); + #endif /* libpcrypto.h */ From 945f03e6465adb9d02fb0484d8777cbdcc622e38 Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Fri, 7 Jul 2023 14:48:39 -0500 Subject: [PATCH 596/924] add import, oops --- client/src/crypto/libpcrypto.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/crypto/libpcrypto.c b/client/src/crypto/libpcrypto.c index 0d322a9a1..12292c440 100644 --- a/client/src/crypto/libpcrypto.c +++ b/client/src/crypto/libpcrypto.c @@ -38,6 +38,7 @@ #include "libpcrypto.h" #include "util.h" #include "ui.h" +#include "math.h" void des_encrypt(void *out, const void *in, const void *key) { mbedtls_des_context ctx; From b30f8ae37f2cdf20a9ed973febad030996ef542d Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Sat, 8 Jul 2023 12:35:59 -0500 Subject: [PATCH 597/924] Finish decryption algorithm implementation --- client/deps/mbedtls.cmake | 1 + client/src/cmdvas.c | 91 ++++++++++++++++++++++++++++++++++----- common/mbedtls/config.h | 2 +- 3 files changed, 82 insertions(+), 12 deletions(-) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 82a97e8a0..2d212d9c2 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -11,6 +11,7 @@ add_library(pm3rrg_rdv4_mbedtls STATIC ../../common/mbedtls/ecp.c ../../common/mbedtls/ecdh.c ../../common/mbedtls/ecc_point_compression.c + ../../common/mbedtls/gcm.c ../../common/mbedtls/ecp_curves.c ../../common/mbedtls/certs.c ../../common/mbedtls/camellia.c diff --git a/client/src/cmdvas.c b/client/src/cmdvas.c index 00c5a83f4..19cacfc23 100644 --- a/client/src/cmdvas.c +++ b/client/src/cmdvas.c @@ -39,6 +39,7 @@ #include "mbedtls/bignum.h" #include "mbedtls/ecdh.h" #include "mbedtls/ecc_point_compression.h" +#include "mbedtls/gcm.h" uint8_t ecpData[] = { 0x6a, 0x01, 0x00, 0x00, 0x04 }; uint8_t aid[] = { 0x4f, 0x53, 0x45, 0x2e, 0x56, 0x41, 0x53, 0x2e, 0x30, 0x31 }; @@ -232,7 +233,35 @@ static int LoadMobileEphemeralKey(uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKe return PM3_SUCCESS; } -static int DecryptVASCryptogram(uint8_t *cryptogram, size_t cryptogramLen, mbedtls_ecp_keypair *privKey, uint8_t *out, size_t *outLen, uint8_t *timestamp) { +static int internalVasDecrypt(uint8_t *cipherText, size_t cipherTextLen, uint8_t *sharedSecret, uint8_t *ansiSharedInfo, size_t ansiSharedInfoLen, uint8_t *gcmAad, size_t gcmAadLen, uint8_t *out, size_t *outLen) { + uint8_t key[32] = {0}; + if (ansi_x963_sha256(sharedSecret, 32, ansiSharedInfo, ansiSharedInfoLen, sizeof(key), key)) { + PrintAndLogEx(FAILED, "ANSI X9.63 key derivation failed"); + return PM3_EINVARG; + } + + uint8_t iv[16] = {0}; + + mbedtls_gcm_context gcmCtx; + mbedtls_gcm_init(&gcmCtx); + if (mbedtls_gcm_setkey(&gcmCtx, MBEDTLS_CIPHER_ID_AES, key, sizeof(key) * 8)) { + PrintAndLogEx(FAILED, "Unable to use key in GCM context"); + return PM3_EINVARG; + } + + if (mbedtls_gcm_auth_decrypt(&gcmCtx, cipherTextLen - 16, iv, sizeof(iv), gcmAad, gcmAadLen, cipherText + cipherTextLen - 16, 16, cipherText, out)) { + PrintAndLogEx(FAILED, "Failed to perform GCM decryption"); + return PM3_EINVARG; + } + + mbedtls_gcm_free(&gcmCtx); + + *outLen = cipherTextLen - 16; + + return PM3_SUCCESS; +} + +static int DecryptVASCryptogram(uint8_t *pidHash, uint8_t *cryptogram, size_t cryptogramLen, mbedtls_ecp_keypair *privKey, uint8_t *out, size_t *outLen, uint32_t *timestamp) { uint8_t keyHint[4] = {0}; if (GetPrivateKeyHint(privKey, keyHint) != PM3_SUCCESS) { PrintAndLogEx(FAILED, "Unable to generate key hint"); @@ -263,9 +292,42 @@ static int DecryptVASCryptogram(uint8_t *cryptogram, size_t cryptogramLen, mbedt PrintAndLogEx(FAILED, "Failed to generate ECDH shared secret"); return PM3_EINVARG; } - - mbedtls_mpi_free(&sharedSecret); mbedtls_ecp_keypair_free(&mobilePubKey); + + uint8_t sharedSecretBytes[32] = {0}; + if (mbedtls_mpi_write_binary(&sharedSecret, sharedSecretBytes, sizeof(sharedSecretBytes))) { + mbedtls_mpi_free(&sharedSecret); + PrintAndLogEx(FAILED, "Failed to generate ECDH shared secret"); + return PM3_EINVARG; + } + mbedtls_mpi_free(&sharedSecret); + + uint8_t string1[27] = "ApplePay encrypted VAS data"; + uint8_t string2[13] = "id-aes256-GCM"; + + uint8_t method1SharedInfo[73] = {0}; + method1SharedInfo[0] = 13; + memcpy(method1SharedInfo + 1, string2, sizeof(string2)); + memcpy(method1SharedInfo + 1 + sizeof(string2), string1, sizeof(string1)); + memcpy(method1SharedInfo + 1 + sizeof(string2) + sizeof(string1), pidHash, 32); + + uint8_t decryptedData[68] = {0}; + size_t decryptedDataLen = 0; + if (internalVasDecrypt(cryptogram + 4 + 32, cryptogramLen - 4 - 32, sharedSecretBytes, method1SharedInfo, sizeof(method1SharedInfo), NULL, 0, decryptedData, &decryptedDataLen)) { + if (internalVasDecrypt(cryptogram + 4 + 32, cryptogramLen - 4 - 32, sharedSecretBytes, string1, sizeof(string1), pidHash, 32, decryptedData, &decryptedDataLen)) { + return PM3_EINVARG; + } + } + + memcpy(out, decryptedData + 4, decryptedDataLen - 4); + *outLen = decryptedDataLen - 4; + + *timestamp = 0; + for (int i = 0; i < 4; ++i) { + *timestamp = (*timestamp << 8) | decryptedData[i]; + } + *timestamp = *timestamp + 978328800; // Unix offset for Jan 1, 2001 + return PM3_SUCCESS; } @@ -383,11 +445,12 @@ static int CmdVASReader(const char *Cmd) { uint8_t cryptogram[120] = {0}; size_t cryptogramLen = 0; - int s = VASReader(passTypeIdLen > 0 ? pidHash : NULL, url, urlLen, cryptogram, &cryptogramLen, verbose); - if (s != PM3_SUCCESS) { + PrintAndLogEx(INFO, "Requesting pass type id: %s", sprint_ascii((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen)); + + if (VASReader(passTypeIdLen > 0 ? pidHash : NULL, url, urlLen, cryptogram, &cryptogramLen, verbose) != PM3_SUCCESS) { CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); - return s; + return PM3_EINVARG; } if (verbose) { @@ -396,17 +459,20 @@ static int CmdVASReader(const char *Cmd) { uint8_t message[64] = {0}; size_t messageLen = 0; - uint8_t timestamp[4] = {0}; + uint32_t timestamp = 0; - if (DecryptVASCryptogram(cryptogram, cryptogramLen, &privKey, message, &messageLen, timestamp) != PM3_SUCCESS) { + if (DecryptVASCryptogram(pidHash, cryptogram, cryptogramLen, &privKey, message, &messageLen, ×tamp) != PM3_SUCCESS) { CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); return PM3_EINVARG; } + PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); + PrintAndLogEx(SUCCESS, "Timestamp: %d", timestamp); + CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); - return s; + return PM3_SUCCESS; } static int CmdVASDecrypt(const char *Cmd) { @@ -459,14 +525,17 @@ static int CmdVASDecrypt(const char *Cmd) { uint8_t message[64] = {0}; size_t messageLen = 0; - uint8_t timestamp[4] = {0}; + uint32_t timestamp = 0; - if (DecryptVASCryptogram(cryptogram, cryptogramLen, &privKey, message, &messageLen, timestamp) != PM3_SUCCESS) { + if (DecryptVASCryptogram(pidHash, cryptogram, cryptogramLen, &privKey, message, &messageLen, ×tamp) != PM3_SUCCESS) { CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); return PM3_EINVARG; } + PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); + PrintAndLogEx(SUCCESS, "Timestamp: %d", timestamp); + CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); return PM3_SUCCESS; diff --git a/common/mbedtls/config.h b/common/mbedtls/config.h index e6138bc6b..7c739cfd0 100644 --- a/common/mbedtls/config.h +++ b/common/mbedtls/config.h @@ -2811,7 +2811,7 @@ * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other * requisites are enabled as well. */ -//#define MBEDTLS_GCM_C +#define MBEDTLS_GCM_C /** * \def MBEDTLS_HAVEGE_C From 9dd845d8595feb57a3f426ee4ea787614312f95f Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Sat, 8 Jul 2023 13:40:52 -0500 Subject: [PATCH 598/924] Fix memory leak --- client/src/cmdvas.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/client/src/cmdvas.c b/client/src/cmdvas.c index 19cacfc23..664a14ce2 100644 --- a/client/src/cmdvas.c +++ b/client/src/cmdvas.c @@ -433,6 +433,8 @@ static int CmdVASReader(const char *Cmd) { return PM3_EINVARG; } + free(keyData); + struct arg_str *urlArg = arg_get_str(ctx, 3); int urlLen = arg_get_str_len(ctx, 3); const char *url = NULL; @@ -523,6 +525,8 @@ static int CmdVASDecrypt(const char *Cmd) { return PM3_EINVARG; } + free(keyData); + uint8_t message[64] = {0}; size_t messageLen = 0; uint32_t timestamp = 0; @@ -541,17 +545,12 @@ static int CmdVASDecrypt(const char *Cmd) { return PM3_SUCCESS; } -static int CmdVASSim(const char *Cmd) { - return PM3_SUCCESS; -} - static int CmdHelp(const char *Cmd); static command_t CommandTable[] = { {"--------", CmdHelp, AlwaysAvailable, "----------- " _CYAN_("Value Added Service") " -----------"}, {"reader", CmdVASReader, IfPm3Iso14443a, "Read and decrypt VAS message"}, {"decrypt", CmdVASDecrypt, AlwaysAvailable, "Decrypt a previously captured VAS cryptogram"}, - {"sim", CmdVASSim, IfPm3Iso14443a, "Simulate a VAS mobile credential"}, {"--------", CmdHelp, AlwaysAvailable, "----------------- " _CYAN_("General") " -----------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, {NULL, NULL, NULL, NULL} From 70541e9450ca0c53b69e577c7944cc0469123f76 Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Sat, 8 Jul 2023 16:59:24 -0500 Subject: [PATCH 599/924] add continuous mode --- client/src/cmdvas.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/client/src/cmdvas.c b/client/src/cmdvas.c index 664a14ce2..9eaef0e59 100644 --- a/client/src/cmdvas.c +++ b/client/src/cmdvas.c @@ -326,7 +326,6 @@ static int DecryptVASCryptogram(uint8_t *pidHash, uint8_t *cryptogram, size_t cr for (int i = 0; i < 4; ++i) { *timestamp = (*timestamp << 8) | decryptedData[i]; } - *timestamp = *timestamp + 978328800; // Unix offset for Jan 1, 2001 return PM3_SUCCESS; } @@ -398,6 +397,7 @@ static int CmdVASReader(const char *Cmd) { arg_str0("p", NULL, "", "pass type id"), arg_str0("k", NULL, "", "path to terminal private key"), arg_str0(NULL, "url", "", "a URL to provide to the mobile device"), + arg_lit0("@", NULL, "continuous mode"), arg_lit0("v", "verbose", "log additional information"), arg_param_end }; @@ -442,23 +442,35 @@ static int CmdVASReader(const char *Cmd) { url = urlArg->sval[0]; } - bool verbose = arg_get_lit(ctx, 4); - - uint8_t cryptogram[120] = {0}; - size_t cryptogramLen = 0; + bool continuous = arg_get_lit(ctx, 4); + bool verbose = arg_get_lit(ctx, 5); PrintAndLogEx(INFO, "Requesting pass type id: %s", sprint_ascii((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen)); - if (VASReader(passTypeIdLen > 0 ? pidHash : NULL, url, urlLen, cryptogram, &cryptogramLen, verbose) != PM3_SUCCESS) { + if (continuous) { + PrintAndLogEx(INFO, "Press " _GREEN_("Enter") " to exit"); + } + + uint8_t cryptogram[120] = {0}; + size_t cryptogramLen = 0; + int readerErr = -1; + + do { + readerErr = VASReader(passTypeIdLen > 0 ? pidHash : NULL, url, urlLen, cryptogram, &cryptogramLen, verbose); + + if (readerErr == 0 || kbd_enter_pressed()) { + break; + } + + msleep(200); + } while (continuous); + + if (readerErr) { CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); return PM3_EINVARG; } - if (verbose) { - PrintAndLogEx(INFO, "Got cryptogram response: %s", sprint_hex(cryptogram, cryptogramLen)); - } - uint8_t message[64] = {0}; size_t messageLen = 0; uint32_t timestamp = 0; @@ -470,7 +482,7 @@ static int CmdVASReader(const char *Cmd) { } PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); - PrintAndLogEx(SUCCESS, "Timestamp: %d", timestamp); + PrintAndLogEx(SUCCESS, "Timestamp: %d (secs since Jan 1, 2001)", timestamp); CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); @@ -538,7 +550,7 @@ static int CmdVASDecrypt(const char *Cmd) { } PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); - PrintAndLogEx(SUCCESS, "Timestamp: %d", timestamp); + PrintAndLogEx(SUCCESS, "Timestamp: %d (secs since Jan 1, 2001)", timestamp); CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); From 1e54cd661c9005ad8a6eaf6362a61fe11026df8d Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Sat, 8 Jul 2023 17:58:11 -0500 Subject: [PATCH 600/924] make style --- client/src/cmdnfc.c | 2 +- client/src/cmdvas.c | 800 ++++++++++++------------- client/src/crypto/libpcrypto.c | 40 +- common/mbedtls/ecc_point_compression.c | 16 +- common/mbedtls/ecc_point_compression.h | 2 +- 5 files changed, 430 insertions(+), 430 deletions(-) diff --git a/client/src/cmdnfc.c b/client/src/cmdnfc.c index cb9979449..45b01b874 100644 --- a/client/src/cmdnfc.c +++ b/client/src/cmdnfc.c @@ -422,7 +422,7 @@ static command_t CommandTable[] = { // {"type5", CmdNFCType5, AlwaysAvailable, "{ NFC Forum Tag Type 5... }"}, {"mf", CmdNFCMF, AlwaysAvailable, "{ NFC Type MIFARE Classic/Plus Tag... }"}, {"barcode", CmdNFCBarcode, AlwaysAvailable, "{ NFC Barcode Tag... }"}, - {"vas", CmdVAS, AlwaysAvailable, "{ Apple Value Added Service }"}, + {"vas", CmdVAS, AlwaysAvailable, "{ Apple Value Added Service }"}, // {"--------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("NFC peer-to-peer") " ------------"}, // {"isodep", CmdISODEP, AlwaysAvailable, "{ ISO-DEP protocol... }"}, // {"llcp", CmdNFCLLCP, AlwaysAvailable, "{ Logical Link Control Protocol... }"}, diff --git a/client/src/cmdvas.c b/client/src/cmdvas.c index 9eaef0e59..dfee9dbc3 100644 --- a/client/src/cmdvas.c +++ b/client/src/cmdvas.c @@ -47,534 +47,534 @@ uint8_t getVasUrlOnlyP2 = 0x00; uint8_t getVasFullReqP2 = 0x01; static int ParseSelectVASResponse(uint8_t *response, size_t resLen, bool verbose) { - struct tlvdb *tlvRoot = tlvdb_parse_multi(response, resLen); + struct tlvdb *tlvRoot = tlvdb_parse_multi(response, resLen); - struct tlvdb *versionTlv = tlvdb_find_full(tlvRoot, 0x9F21); - if (versionTlv == NULL) { - tlvdb_free(tlvRoot); - return PM3_ECARDEXCHANGE; - } - const struct tlv *version = tlvdb_get_tlv(versionTlv); - if (version->len != 2) { - tlvdb_free(tlvRoot); - return PM3_ECARDEXCHANGE; - } - if (verbose) { - PrintAndLogEx(INFO, "Mobile VAS application version: %d.%d", version->value[0], version->value[1]); - } - if (version->value[0] != 0x01 || version->value[1] != 0x00) { - tlvdb_free(tlvRoot); - return PM3_ECARDEXCHANGE; - } + struct tlvdb *versionTlv = tlvdb_find_full(tlvRoot, 0x9F21); + if (versionTlv == NULL) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + const struct tlv *version = tlvdb_get_tlv(versionTlv); + if (version->len != 2) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + if (verbose) { + PrintAndLogEx(INFO, "Mobile VAS application version: %d.%d", version->value[0], version->value[1]); + } + if (version->value[0] != 0x01 || version->value[1] != 0x00) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } - struct tlvdb *capabilitiesTlv = tlvdb_find_full(tlvRoot, 0x9F23); - if (capabilitiesTlv == NULL) { - tlvdb_free(tlvRoot); - return PM3_ECARDEXCHANGE; - } - const struct tlv *capabilities = tlvdb_get_tlv(capabilitiesTlv); - if (capabilities->len != 4 - || capabilities->value[0] != 0x00 - || capabilities->value[1] != 0x00 - || capabilities->value[2] != 0x00 - || (capabilities->value[3] & 8) == 0) { - tlvdb_free(tlvRoot); - return PM3_ECARDEXCHANGE; - } + struct tlvdb *capabilitiesTlv = tlvdb_find_full(tlvRoot, 0x9F23); + if (capabilitiesTlv == NULL) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + const struct tlv *capabilities = tlvdb_get_tlv(capabilitiesTlv); + if (capabilities->len != 4 + || capabilities->value[0] != 0x00 + || capabilities->value[1] != 0x00 + || capabilities->value[2] != 0x00 + || (capabilities->value[3] & 8) == 0) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } - tlvdb_free(tlvRoot); - return PM3_SUCCESS; + tlvdb_free(tlvRoot); + return PM3_SUCCESS; } static int CreateGetVASDataCommand(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t *out, int *outLen) { - if (pidHash == NULL && url == NULL) { - PrintAndLogEx(FAILED, "Must provide a Pass Type ID or a URL"); - return PM3_EINVARG; - } + if (pidHash == NULL && url == NULL) { + PrintAndLogEx(FAILED, "Must provide a Pass Type ID or a URL"); + return PM3_EINVARG; + } - if (url != NULL && urlLen > 256) { - PrintAndLogEx(FAILED, "URL must be less than 256 characters"); - return PM3_EINVARG; - } + if (url != NULL && urlLen > 256) { + PrintAndLogEx(FAILED, "URL must be less than 256 characters"); + return PM3_EINVARG; + } - uint8_t p2 = pidHash == NULL ? getVasUrlOnlyP2 : getVasFullReqP2; + uint8_t p2 = pidHash == NULL ? getVasUrlOnlyP2 : getVasFullReqP2; - size_t reqTlvLen = 19 + (pidHash != NULL ? 35 : 0) + (url != NULL ? 3 + urlLen : 0); - uint8_t *reqTlv = calloc(reqTlvLen, sizeof(uint8_t)); + size_t reqTlvLen = 19 + (pidHash != NULL ? 35 : 0) + (url != NULL ? 3 + urlLen : 0); + uint8_t *reqTlv = calloc(reqTlvLen, sizeof(uint8_t)); - uint8_t version[] = {0x9F, 0x22, 0x02, 0x01, 0x00}; - memcpy(reqTlv, version, sizeof(version)); + uint8_t version[] = {0x9F, 0x22, 0x02, 0x01, 0x00}; + memcpy(reqTlv, version, sizeof(version)); - uint8_t unknown[] = {0x9F, 0x28, 0x04, 0x00, 0x00, 0x00, 0x00}; - memcpy(reqTlv + sizeof(version), unknown, sizeof(unknown)); + uint8_t unknown[] = {0x9F, 0x28, 0x04, 0x00, 0x00, 0x00, 0x00}; + memcpy(reqTlv + sizeof(version), unknown, sizeof(unknown)); - uint8_t terminalCapabilities[] = {0x9F, 0x26, 0x04, 0x00, 0x00, 0x00, 0x02}; - memcpy(reqTlv + sizeof(version) + sizeof(unknown), terminalCapabilities, sizeof(terminalCapabilities)); + uint8_t terminalCapabilities[] = {0x9F, 0x26, 0x04, 0x00, 0x00, 0x00, 0x02}; + memcpy(reqTlv + sizeof(version) + sizeof(unknown), terminalCapabilities, sizeof(terminalCapabilities)); - if (pidHash != NULL) { - size_t offset = sizeof(version) + sizeof(unknown) + sizeof(terminalCapabilities); - reqTlv[offset] = 0x9F; - reqTlv[offset + 1] = 0x25; - reqTlv[offset + 2] = 32; - memcpy(reqTlv + offset + 3, pidHash, 32); - } + if (pidHash != NULL) { + size_t offset = sizeof(version) + sizeof(unknown) + sizeof(terminalCapabilities); + reqTlv[offset] = 0x9F; + reqTlv[offset + 1] = 0x25; + reqTlv[offset + 2] = 32; + memcpy(reqTlv + offset + 3, pidHash, 32); + } - if (url != NULL) { - size_t offset = sizeof(version) + sizeof(unknown) + sizeof(terminalCapabilities) + (pidHash != NULL ? 35 : 0); - reqTlv[offset] = 0x9F; - reqTlv[offset + 1] = 0x29; - reqTlv[offset + 2] = urlLen; - memcpy(reqTlv + offset + 3, url, urlLen); - } + if (url != NULL) { + size_t offset = sizeof(version) + sizeof(unknown) + sizeof(terminalCapabilities) + (pidHash != NULL ? 35 : 0); + reqTlv[offset] = 0x9F; + reqTlv[offset + 1] = 0x29; + reqTlv[offset + 2] = urlLen; + memcpy(reqTlv + offset + 3, url, urlLen); + } - out[0] = 0x80; - out[1] = 0xCA; - out[2] = 0x01; - out[3] = p2; - out[4] = reqTlvLen; - memcpy(out + 5, reqTlv, reqTlvLen); - out[5 + reqTlvLen] = 0x00; + out[0] = 0x80; + out[1] = 0xCA; + out[2] = 0x01; + out[3] = p2; + out[4] = reqTlvLen; + memcpy(out + 5, reqTlv, reqTlvLen); + out[5 + reqTlvLen] = 0x00; - *outLen = 6 + reqTlvLen; + *outLen = 6 + reqTlvLen; - free(reqTlv); - return PM3_SUCCESS; + free(reqTlv); + return PM3_SUCCESS; } static int ParseGetVASDataResponse(uint8_t *res, size_t resLen, uint8_t *cryptogram, size_t *cryptogramLen) { - struct tlvdb *tlvRoot = tlvdb_parse_multi(res, resLen); + struct tlvdb *tlvRoot = tlvdb_parse_multi(res, resLen); - struct tlvdb *cryptogramTlvdb = tlvdb_find_full(tlvRoot, 0x9F27); - if (cryptogramTlvdb == NULL) { - tlvdb_free(tlvRoot); - return PM3_ECARDEXCHANGE; - } - const struct tlv *cryptogramTlv = tlvdb_get_tlv(cryptogramTlvdb); + struct tlvdb *cryptogramTlvdb = tlvdb_find_full(tlvRoot, 0x9F27); + if (cryptogramTlvdb == NULL) { + tlvdb_free(tlvRoot); + return PM3_ECARDEXCHANGE; + } + const struct tlv *cryptogramTlv = tlvdb_get_tlv(cryptogramTlvdb); - memcpy(cryptogram, cryptogramTlv->value, cryptogramTlv->len); - *cryptogramLen = cryptogramTlv->len; + memcpy(cryptogram, cryptogramTlv->value, cryptogramTlv->len); + *cryptogramLen = cryptogramTlv->len; - tlvdb_free(tlvRoot); - return PM3_SUCCESS; + tlvdb_free(tlvRoot); + return PM3_SUCCESS; } static int LoadReaderPrivateKey(uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair *privKey) { - struct tlvdb *derRoot = tlvdb_parse_multi(buf, bufLen); + struct tlvdb *derRoot = tlvdb_parse_multi(buf, bufLen); - struct tlvdb *privkeyTlvdb = tlvdb_find_full(derRoot, 0x04); - if (privkeyTlvdb == NULL) { - tlvdb_free(derRoot); - return PM3_EINVARG; - } - const struct tlv *privkeyTlv = tlvdb_get_tlv(privkeyTlvdb); + struct tlvdb *privkeyTlvdb = tlvdb_find_full(derRoot, 0x04); + if (privkeyTlvdb == NULL) { + tlvdb_free(derRoot); + return PM3_EINVARG; + } + const struct tlv *privkeyTlv = tlvdb_get_tlv(privkeyTlvdb); - if (mbedtls_ecp_read_key(MBEDTLS_ECP_DP_SECP256R1, privKey, privkeyTlv->value, privkeyTlv->len)) { - tlvdb_free(derRoot); - PrintAndLogEx(FAILED, "Unable to parse private key file. Should be DER encoded ASN1"); - return PM3_EINVARG; - } + if (mbedtls_ecp_read_key(MBEDTLS_ECP_DP_SECP256R1, privKey, privkeyTlv->value, privkeyTlv->len)) { + tlvdb_free(derRoot); + PrintAndLogEx(FAILED, "Unable to parse private key file. Should be DER encoded ASN1"); + return PM3_EINVARG; + } - struct tlvdb *pubkeyCoordsTlvdb = tlvdb_find_full(derRoot, 0x03); - if (pubkeyCoordsTlvdb == NULL) { - tlvdb_free(derRoot); - PrintAndLogEx(FAILED, "Private key file should include public key component"); - return PM3_EINVARG; - } - const struct tlv *pubkeyCoordsTlv = tlvdb_get_tlv(pubkeyCoordsTlvdb); - if (pubkeyCoordsTlv->len != 66 || pubkeyCoordsTlv->value[0] != 0x00 || pubkeyCoordsTlv->value[1] != 0x04) { - tlvdb_free(derRoot); - PrintAndLogEx(FAILED, "Invalid public key data"); - return PM3_EINVARG; - } + struct tlvdb *pubkeyCoordsTlvdb = tlvdb_find_full(derRoot, 0x03); + if (pubkeyCoordsTlvdb == NULL) { + tlvdb_free(derRoot); + PrintAndLogEx(FAILED, "Private key file should include public key component"); + return PM3_EINVARG; + } + const struct tlv *pubkeyCoordsTlv = tlvdb_get_tlv(pubkeyCoordsTlvdb); + if (pubkeyCoordsTlv->len != 66 || pubkeyCoordsTlv->value[0] != 0x00 || pubkeyCoordsTlv->value[1] != 0x04) { + tlvdb_free(derRoot); + PrintAndLogEx(FAILED, "Invalid public key data"); + return PM3_EINVARG; + } - tlvdb_free(derRoot); + tlvdb_free(derRoot); - if (mbedtls_ecp_point_read_binary(&privKey->grp, &privKey->Q, pubkeyCoordsTlv->value + 1, 65)) { - PrintAndLogEx(FAILED, "Failed to read in public key coordinates"); - return PM3_EINVARG; - } + if (mbedtls_ecp_point_read_binary(&privKey->grp, &privKey->Q, pubkeyCoordsTlv->value + 1, 65)) { + PrintAndLogEx(FAILED, "Failed to read in public key coordinates"); + return PM3_EINVARG; + } - if (mbedtls_ecp_check_pubkey(&privKey->grp, &privKey->Q)) { - PrintAndLogEx(FAILED, "VAS protocol requires an elliptic key on the P-256 curve"); - return PM3_EINVARG; - } + if (mbedtls_ecp_check_pubkey(&privKey->grp, &privKey->Q)) { + PrintAndLogEx(FAILED, "VAS protocol requires an elliptic key on the P-256 curve"); + return PM3_EINVARG; + } - return PM3_SUCCESS; + return PM3_SUCCESS; } static int GetPrivateKeyHint(mbedtls_ecp_keypair *privKey, uint8_t *keyHint) { - uint8_t xcoord[32] = {0}; - if (mbedtls_mpi_write_binary(&privKey->Q.X, xcoord, sizeof(xcoord))) { - return PM3_EINVARG; - } + uint8_t xcoord[32] = {0}; + if (mbedtls_mpi_write_binary(&privKey->Q.X, xcoord, sizeof(xcoord))) { + return PM3_EINVARG; + } - uint8_t hash[32] = {0}; - sha256hash(xcoord, 32, hash); + uint8_t hash[32] = {0}; + sha256hash(xcoord, 32, hash); - memcpy(keyHint, hash, 4); - return PM3_SUCCESS; + memcpy(keyHint, hash, 4); + return PM3_SUCCESS; } static int LoadMobileEphemeralKey(uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKey) { - uint8_t compressedEcKey[33] = {0}; - compressedEcKey[0] = 0x02; - memcpy(compressedEcKey + 1, xcoordBuf, 32); + uint8_t compressedEcKey[33] = {0}; + compressedEcKey[0] = 0x02; + memcpy(compressedEcKey + 1, xcoordBuf, 32); - uint8_t decompressedEcKey[65] = {0}; - size_t decompressedEcKeyLen = 0; - if (mbedtls_ecp_decompress(&pubKey->grp, compressedEcKey, sizeof(compressedEcKey), decompressedEcKey, &decompressedEcKeyLen, sizeof(decompressedEcKey))) { - return PM3_EINVARG; - } + uint8_t decompressedEcKey[65] = {0}; + size_t decompressedEcKeyLen = 0; + if (mbedtls_ecp_decompress(&pubKey->grp, compressedEcKey, sizeof(compressedEcKey), decompressedEcKey, &decompressedEcKeyLen, sizeof(decompressedEcKey))) { + return PM3_EINVARG; + } - if (mbedtls_ecp_point_read_binary(&pubKey->grp, &pubKey->Q, decompressedEcKey, decompressedEcKeyLen)) { - return PM3_EINVARG; - } + if (mbedtls_ecp_point_read_binary(&pubKey->grp, &pubKey->Q, decompressedEcKey, decompressedEcKeyLen)) { + return PM3_EINVARG; + } - return PM3_SUCCESS; + return PM3_SUCCESS; } static int internalVasDecrypt(uint8_t *cipherText, size_t cipherTextLen, uint8_t *sharedSecret, uint8_t *ansiSharedInfo, size_t ansiSharedInfoLen, uint8_t *gcmAad, size_t gcmAadLen, uint8_t *out, size_t *outLen) { - uint8_t key[32] = {0}; - if (ansi_x963_sha256(sharedSecret, 32, ansiSharedInfo, ansiSharedInfoLen, sizeof(key), key)) { - PrintAndLogEx(FAILED, "ANSI X9.63 key derivation failed"); - return PM3_EINVARG; - } + uint8_t key[32] = {0}; + if (ansi_x963_sha256(sharedSecret, 32, ansiSharedInfo, ansiSharedInfoLen, sizeof(key), key)) { + PrintAndLogEx(FAILED, "ANSI X9.63 key derivation failed"); + return PM3_EINVARG; + } - uint8_t iv[16] = {0}; + uint8_t iv[16] = {0}; - mbedtls_gcm_context gcmCtx; - mbedtls_gcm_init(&gcmCtx); - if (mbedtls_gcm_setkey(&gcmCtx, MBEDTLS_CIPHER_ID_AES, key, sizeof(key) * 8)) { - PrintAndLogEx(FAILED, "Unable to use key in GCM context"); - return PM3_EINVARG; - } + mbedtls_gcm_context gcmCtx; + mbedtls_gcm_init(&gcmCtx); + if (mbedtls_gcm_setkey(&gcmCtx, MBEDTLS_CIPHER_ID_AES, key, sizeof(key) * 8)) { + PrintAndLogEx(FAILED, "Unable to use key in GCM context"); + return PM3_EINVARG; + } - if (mbedtls_gcm_auth_decrypt(&gcmCtx, cipherTextLen - 16, iv, sizeof(iv), gcmAad, gcmAadLen, cipherText + cipherTextLen - 16, 16, cipherText, out)) { - PrintAndLogEx(FAILED, "Failed to perform GCM decryption"); - return PM3_EINVARG; - } + if (mbedtls_gcm_auth_decrypt(&gcmCtx, cipherTextLen - 16, iv, sizeof(iv), gcmAad, gcmAadLen, cipherText + cipherTextLen - 16, 16, cipherText, out)) { + PrintAndLogEx(FAILED, "Failed to perform GCM decryption"); + return PM3_EINVARG; + } - mbedtls_gcm_free(&gcmCtx); + mbedtls_gcm_free(&gcmCtx); - *outLen = cipherTextLen - 16; + *outLen = cipherTextLen - 16; - return PM3_SUCCESS; + return PM3_SUCCESS; } static int DecryptVASCryptogram(uint8_t *pidHash, uint8_t *cryptogram, size_t cryptogramLen, mbedtls_ecp_keypair *privKey, uint8_t *out, size_t *outLen, uint32_t *timestamp) { - uint8_t keyHint[4] = {0}; - if (GetPrivateKeyHint(privKey, keyHint) != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Unable to generate key hint"); - return PM3_EINVARG; - } + uint8_t keyHint[4] = {0}; + if (GetPrivateKeyHint(privKey, keyHint) != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Unable to generate key hint"); + return PM3_EINVARG; + } - if (memcmp(keyHint, cryptogram, 4) != 0) { - PrintAndLogEx(FAILED, "Private key does not match cryptogram"); - return PM3_EINVARG; - } - - mbedtls_ecp_keypair mobilePubKey; - mbedtls_ecp_keypair_init(&mobilePubKey); - mobilePubKey.grp = privKey->grp; - - if (LoadMobileEphemeralKey(cryptogram + 4, &mobilePubKey) != PM3_SUCCESS) { - mbedtls_ecp_keypair_free(&mobilePubKey); - PrintAndLogEx(FAILED, "Unable to parse mobile ephemeral key from cryptogram"); - return PM3_EINVARG; - } + if (memcmp(keyHint, cryptogram, 4) != 0) { + PrintAndLogEx(FAILED, "Private key does not match cryptogram"); + return PM3_EINVARG; + } - mbedtls_mpi sharedSecret; - mbedtls_mpi_init(&sharedSecret); + mbedtls_ecp_keypair mobilePubKey; + mbedtls_ecp_keypair_init(&mobilePubKey); + mobilePubKey.grp = privKey->grp; - if (mbedtls_ecdh_compute_shared(&privKey->grp, &sharedSecret, &mobilePubKey.Q, &privKey->d, NULL, NULL)) { - mbedtls_mpi_free(&sharedSecret); - mbedtls_ecp_keypair_free(&mobilePubKey); - PrintAndLogEx(FAILED, "Failed to generate ECDH shared secret"); - return PM3_EINVARG; - } - mbedtls_ecp_keypair_free(&mobilePubKey); + if (LoadMobileEphemeralKey(cryptogram + 4, &mobilePubKey) != PM3_SUCCESS) { + mbedtls_ecp_keypair_free(&mobilePubKey); + PrintAndLogEx(FAILED, "Unable to parse mobile ephemeral key from cryptogram"); + return PM3_EINVARG; + } - uint8_t sharedSecretBytes[32] = {0}; - if (mbedtls_mpi_write_binary(&sharedSecret, sharedSecretBytes, sizeof(sharedSecretBytes))) { - mbedtls_mpi_free(&sharedSecret); - PrintAndLogEx(FAILED, "Failed to generate ECDH shared secret"); - return PM3_EINVARG; - } - mbedtls_mpi_free(&sharedSecret); + mbedtls_mpi sharedSecret; + mbedtls_mpi_init(&sharedSecret); - uint8_t string1[27] = "ApplePay encrypted VAS data"; - uint8_t string2[13] = "id-aes256-GCM"; + if (mbedtls_ecdh_compute_shared(&privKey->grp, &sharedSecret, &mobilePubKey.Q, &privKey->d, NULL, NULL)) { + mbedtls_mpi_free(&sharedSecret); + mbedtls_ecp_keypair_free(&mobilePubKey); + PrintAndLogEx(FAILED, "Failed to generate ECDH shared secret"); + return PM3_EINVARG; + } + mbedtls_ecp_keypair_free(&mobilePubKey); - uint8_t method1SharedInfo[73] = {0}; - method1SharedInfo[0] = 13; - memcpy(method1SharedInfo + 1, string2, sizeof(string2)); - memcpy(method1SharedInfo + 1 + sizeof(string2), string1, sizeof(string1)); - memcpy(method1SharedInfo + 1 + sizeof(string2) + sizeof(string1), pidHash, 32); + uint8_t sharedSecretBytes[32] = {0}; + if (mbedtls_mpi_write_binary(&sharedSecret, sharedSecretBytes, sizeof(sharedSecretBytes))) { + mbedtls_mpi_free(&sharedSecret); + PrintAndLogEx(FAILED, "Failed to generate ECDH shared secret"); + return PM3_EINVARG; + } + mbedtls_mpi_free(&sharedSecret); - uint8_t decryptedData[68] = {0}; - size_t decryptedDataLen = 0; - if (internalVasDecrypt(cryptogram + 4 + 32, cryptogramLen - 4 - 32, sharedSecretBytes, method1SharedInfo, sizeof(method1SharedInfo), NULL, 0, decryptedData, &decryptedDataLen)) { - if (internalVasDecrypt(cryptogram + 4 + 32, cryptogramLen - 4 - 32, sharedSecretBytes, string1, sizeof(string1), pidHash, 32, decryptedData, &decryptedDataLen)) { - return PM3_EINVARG; - } - } + uint8_t string1[27] = "ApplePay encrypted VAS data"; + uint8_t string2[13] = "id-aes256-GCM"; - memcpy(out, decryptedData + 4, decryptedDataLen - 4); - *outLen = decryptedDataLen - 4; + uint8_t method1SharedInfo[73] = {0}; + method1SharedInfo[0] = 13; + memcpy(method1SharedInfo + 1, string2, sizeof(string2)); + memcpy(method1SharedInfo + 1 + sizeof(string2), string1, sizeof(string1)); + memcpy(method1SharedInfo + 1 + sizeof(string2) + sizeof(string1), pidHash, 32); - *timestamp = 0; - for (int i = 0; i < 4; ++i) { - *timestamp = (*timestamp << 8) | decryptedData[i]; - } + uint8_t decryptedData[68] = {0}; + size_t decryptedDataLen = 0; + if (internalVasDecrypt(cryptogram + 4 + 32, cryptogramLen - 4 - 32, sharedSecretBytes, method1SharedInfo, sizeof(method1SharedInfo), NULL, 0, decryptedData, &decryptedDataLen)) { + if (internalVasDecrypt(cryptogram + 4 + 32, cryptogramLen - 4 - 32, sharedSecretBytes, string1, sizeof(string1), pidHash, 32, decryptedData, &decryptedDataLen)) { + return PM3_EINVARG; + } + } - return PM3_SUCCESS; + memcpy(out, decryptedData + 4, decryptedDataLen - 4); + *outLen = decryptedDataLen - 4; + + *timestamp = 0; + for (int i = 0; i < 4; ++i) { + *timestamp = (*timestamp << 8) | decryptedData[i]; + } + + return PM3_SUCCESS; } static int VASReader(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t *cryptogram, size_t *cryptogramLen, bool verbose) { - clearCommandBuffer(); + clearCommandBuffer(); - uint16_t flags = ISO14A_RAW | ISO14A_CONNECT | ISO14A_NO_SELECT | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT; - SendCommandMIX(CMD_HF_ISO14443A_READER, flags, sizeof(ecpData), 0, ecpData, sizeof(ecpData)); + uint16_t flags = ISO14A_RAW | ISO14A_CONNECT | ISO14A_NO_SELECT | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT; + SendCommandMIX(CMD_HF_ISO14443A_READER, flags, sizeof(ecpData), 0, ecpData, sizeof(ecpData)); - msleep(160); + msleep(160); - if (SelectCard14443A_4(false, false, NULL) != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "No card in field"); - return PM3_ECARDEXCHANGE; - } + if (SelectCard14443A_4(false, false, NULL) != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "No card in field"); + return PM3_ECARDEXCHANGE; + } - uint16_t status = 0; - size_t resLen = 0; - uint8_t selectResponse[APDU_RES_LEN] = {0}; - Iso7816Select(CC_CONTACTLESS, true, true, aid, sizeof(aid), selectResponse, APDU_RES_LEN, &resLen, &status); + uint16_t status = 0; + size_t resLen = 0; + uint8_t selectResponse[APDU_RES_LEN] = {0}; + Iso7816Select(CC_CONTACTLESS, true, true, aid, sizeof(aid), selectResponse, APDU_RES_LEN, &resLen, &status); - if (status != 0x9000) { - PrintAndLogEx(FAILED, "Card doesn't support VAS"); - return PM3_ECARDEXCHANGE; - } + if (status != 0x9000) { + PrintAndLogEx(FAILED, "Card doesn't support VAS"); + return PM3_ECARDEXCHANGE; + } - if (ParseSelectVASResponse(selectResponse, resLen, verbose) != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Card doesn't support VAS"); - return PM3_ECARDEXCHANGE; - } + if (ParseSelectVASResponse(selectResponse, resLen, verbose) != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Card doesn't support VAS"); + return PM3_ECARDEXCHANGE; + } - uint8_t getVasApdu[PM3_CMD_DATA_SIZE]; - int getVasApduLen = 0; + uint8_t getVasApdu[PM3_CMD_DATA_SIZE]; + int getVasApduLen = 0; - int s = CreateGetVASDataCommand(pidHash, url, urlLen, getVasApdu, &getVasApduLen); - if (s != PM3_SUCCESS) { - return s; - } + int s = CreateGetVASDataCommand(pidHash, url, urlLen, getVasApdu, &getVasApduLen); + if (s != PM3_SUCCESS) { + return s; + } - uint8_t apduRes[APDU_RES_LEN] = {0}; - int apduResLen = 0; + uint8_t apduRes[APDU_RES_LEN] = {0}; + int apduResLen = 0; - s = ExchangeAPDU14a(getVasApdu, getVasApduLen, false, false, apduRes, APDU_RES_LEN, &apduResLen); - if (s != PM3_SUCCESS) { - PrintAndLogEx(FAILED, "Failed to send APDU"); - return s; - } + s = ExchangeAPDU14a(getVasApdu, getVasApduLen, false, false, apduRes, APDU_RES_LEN, &apduResLen); + if (s != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Failed to send APDU"); + return s; + } - if (apduResLen == 2 && apduRes[0] == 0x62 && apduRes[1] == 0x87) { - PrintAndLogEx(WARNING, "Device returned error on GET VAS DATA. Either doesn't have pass with matching id, or requires user authentication."); - return PM3_ECARDEXCHANGE; - } + if (apduResLen == 2 && apduRes[0] == 0x62 && apduRes[1] == 0x87) { + PrintAndLogEx(WARNING, "Device returned error on GET VAS DATA. Either doesn't have pass with matching id, or requires user authentication."); + return PM3_ECARDEXCHANGE; + } - if (apduResLen == 0 || apduRes[0] != 0x70) { - PrintAndLogEx(FAILED, "Invalid response from peer"); - } + if (apduResLen == 0 || apduRes[0] != 0x70) { + PrintAndLogEx(FAILED, "Invalid response from peer"); + } - return ParseGetVASDataResponse(apduRes, apduResLen, cryptogram, cryptogramLen); + return ParseGetVASDataResponse(apduRes, apduResLen, cryptogram, cryptogramLen); } static int CmdVASReader(const char *Cmd) { - CLIParserContext *ctx; - CLIParserInit(&ctx, "nfc vas reader", - "Read and decrypt VAS message", - "nfc vas reader -p pass.com.example.ticket -k ./priv.key -> select pass and decrypt with priv.key\nnfc vas reader --url https://example.com -> URL Only mode"); - void *argtable[] = { - arg_param_begin, - arg_str0("p", NULL, "", "pass type id"), - arg_str0("k", NULL, "", "path to terminal private key"), - arg_str0(NULL, "url", "", "a URL to provide to the mobile device"), - arg_lit0("@", NULL, "continuous mode"), - arg_lit0("v", "verbose", "log additional information"), - arg_param_end - }; - CLIExecWithReturn(ctx, Cmd, argtable, false); + CLIParserContext *ctx; + CLIParserInit(&ctx, "nfc vas reader", + "Read and decrypt VAS message", + "nfc vas reader -p pass.com.example.ticket -k ./priv.key -> select pass and decrypt with priv.key\nnfc vas reader --url https://example.com -> URL Only mode"); + void *argtable[] = { + arg_param_begin, + arg_str0("p", NULL, "", "pass type id"), + arg_str0("k", NULL, "", "path to terminal private key"), + arg_str0(NULL, "url", "", "a URL to provide to the mobile device"), + arg_lit0("@", NULL, "continuous mode"), + arg_lit0("v", "verbose", "log additional information"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); - struct arg_str *passTypeIdArg = arg_get_str(ctx, 1); - int passTypeIdLen = arg_get_str_len(ctx, 1); - uint8_t pidHash[32] = {0}; - sha256hash((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen, pidHash); + struct arg_str *passTypeIdArg = arg_get_str(ctx, 1); + int passTypeIdLen = arg_get_str_len(ctx, 1); + uint8_t pidHash[32] = {0}; + sha256hash((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen, pidHash); - struct arg_str *keyPathArg = arg_get_str(ctx, 2); - int keyPathLen = arg_get_str_len(ctx, 2); + struct arg_str *keyPathArg = arg_get_str(ctx, 2); + int keyPathLen = arg_get_str_len(ctx, 2); - if (keyPathLen == 0 && passTypeIdLen > 0) { - PrintAndLogEx(FAILED, "Must provide path to terminal private key if a pass type id is provided"); - CLIParserFree(ctx); - return PM3_EINVARG; - } + if (keyPathLen == 0 && passTypeIdLen > 0) { + PrintAndLogEx(FAILED, "Must provide path to terminal private key if a pass type id is provided"); + CLIParserFree(ctx); + return PM3_EINVARG; + } - uint8_t *keyData = NULL; - size_t keyDataLen = 0; - if (loadFile_safe(keyPathArg->sval[0], "", (void **)&keyData, &keyDataLen) != PM3_SUCCESS) { - CLIParserFree(ctx); - return PM3_EINVARG; - } + uint8_t *keyData = NULL; + size_t keyDataLen = 0; + if (loadFile_safe(keyPathArg->sval[0], "", (void **)&keyData, &keyDataLen) != PM3_SUCCESS) { + CLIParserFree(ctx); + return PM3_EINVARG; + } - mbedtls_ecp_keypair privKey; - mbedtls_ecp_keypair_init(&privKey); + mbedtls_ecp_keypair privKey; + mbedtls_ecp_keypair_init(&privKey); - if (LoadReaderPrivateKey(keyData, keyDataLen, &privKey) != PM3_SUCCESS) { - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; - } + if (LoadReaderPrivateKey(keyData, keyDataLen, &privKey) != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } - free(keyData); + free(keyData); - struct arg_str *urlArg = arg_get_str(ctx, 3); - int urlLen = arg_get_str_len(ctx, 3); - const char *url = NULL; - if (urlLen > 0) { - url = urlArg->sval[0]; - } + struct arg_str *urlArg = arg_get_str(ctx, 3); + int urlLen = arg_get_str_len(ctx, 3); + const char *url = NULL; + if (urlLen > 0) { + url = urlArg->sval[0]; + } - bool continuous = arg_get_lit(ctx, 4); - bool verbose = arg_get_lit(ctx, 5); + bool continuous = arg_get_lit(ctx, 4); + bool verbose = arg_get_lit(ctx, 5); - PrintAndLogEx(INFO, "Requesting pass type id: %s", sprint_ascii((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen)); + PrintAndLogEx(INFO, "Requesting pass type id: %s", sprint_ascii((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen)); - if (continuous) { - PrintAndLogEx(INFO, "Press " _GREEN_("Enter") " to exit"); - } + if (continuous) { + PrintAndLogEx(INFO, "Press " _GREEN_("Enter") " to exit"); + } - uint8_t cryptogram[120] = {0}; - size_t cryptogramLen = 0; - int readerErr = -1; + uint8_t cryptogram[120] = {0}; + size_t cryptogramLen = 0; + int readerErr = -1; - do { - readerErr = VASReader(passTypeIdLen > 0 ? pidHash : NULL, url, urlLen, cryptogram, &cryptogramLen, verbose); + do { + readerErr = VASReader(passTypeIdLen > 0 ? pidHash : NULL, url, urlLen, cryptogram, &cryptogramLen, verbose); - if (readerErr == 0 || kbd_enter_pressed()) { - break; - } - - msleep(200); - } while (continuous); + if (readerErr == 0 || kbd_enter_pressed()) { + break; + } - if (readerErr) { - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; - } + msleep(200); + } while (continuous); - uint8_t message[64] = {0}; - size_t messageLen = 0; - uint32_t timestamp = 0; + if (readerErr) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } - if (DecryptVASCryptogram(pidHash, cryptogram, cryptogramLen, &privKey, message, &messageLen, ×tamp) != PM3_SUCCESS) { - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; - } + uint8_t message[64] = {0}; + size_t messageLen = 0; + uint32_t timestamp = 0; - PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); - PrintAndLogEx(SUCCESS, "Timestamp: %d (secs since Jan 1, 2001)", timestamp); + if (DecryptVASCryptogram(pidHash, cryptogram, cryptogramLen, &privKey, message, &messageLen, ×tamp) != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_SUCCESS; + PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); + PrintAndLogEx(SUCCESS, "Timestamp: %d (secs since Jan 1, 2001)", timestamp); + + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_SUCCESS; } static int CmdVASDecrypt(const char *Cmd) { - CLIParserContext *ctx; - CLIParserInit(&ctx, "nfc vas decrypt", - "Decrypt a previously captured cryptogram", - "nfc vas reader -p pass.com.example.ticket -k ./priv.key -> select pass and decrypt with priv.key\nnfc vas reader --url https://example.com -> URL Only mode"); - void *argtable[] = { - arg_param_begin, - arg_str0("p", NULL, "", "pass type id"), - arg_str0("k", NULL, "", "path to terminal private key"), - arg_str0(NULL, NULL, "", "cryptogram to decrypt"), - arg_param_end - }; - CLIExecWithReturn(ctx, Cmd, argtable, false); + CLIParserContext *ctx; + CLIParserInit(&ctx, "nfc vas decrypt", + "Decrypt a previously captured cryptogram", + "nfc vas reader -p pass.com.example.ticket -k ./priv.key -> select pass and decrypt with priv.key\nnfc vas reader --url https://example.com -> URL Only mode"); + void *argtable[] = { + arg_param_begin, + arg_str0("p", NULL, "", "pass type id"), + arg_str0("k", NULL, "", "path to terminal private key"), + arg_str0(NULL, NULL, "", "cryptogram to decrypt"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); - struct arg_str *passTypeIdArg = arg_get_str(ctx, 1); - int passTypeIdLen = arg_get_str_len(ctx, 1); - uint8_t pidHash[32] = {0}; - sha256hash((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen, pidHash); + struct arg_str *passTypeIdArg = arg_get_str(ctx, 1); + int passTypeIdLen = arg_get_str_len(ctx, 1); + uint8_t pidHash[32] = {0}; + sha256hash((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen, pidHash); - uint8_t cryptogram[120] = {0}; - int cryptogramLen = 0; - CLIGetHexWithReturn(ctx, 3, cryptogram, &cryptogramLen); + uint8_t cryptogram[120] = {0}; + int cryptogramLen = 0; + CLIGetHexWithReturn(ctx, 3, cryptogram, &cryptogramLen); - struct arg_str *keyPathArg = arg_get_str(ctx, 2); - int keyPathLen = arg_get_str_len(ctx, 2); + struct arg_str *keyPathArg = arg_get_str(ctx, 2); + int keyPathLen = arg_get_str_len(ctx, 2); - if (keyPathLen == 0 && passTypeIdLen > 0) { - PrintAndLogEx(FAILED, "Must provide path to terminal private key if a pass type id is provided"); - CLIParserFree(ctx); - return PM3_EINVARG; - } + if (keyPathLen == 0 && passTypeIdLen > 0) { + PrintAndLogEx(FAILED, "Must provide path to terminal private key if a pass type id is provided"); + CLIParserFree(ctx); + return PM3_EINVARG; + } - uint8_t *keyData = NULL; - size_t keyDataLen = 0; - if (loadFile_safe(keyPathArg->sval[0], "", (void **)&keyData, &keyDataLen) != PM3_SUCCESS) { - CLIParserFree(ctx); - return PM3_EINVARG; - } + uint8_t *keyData = NULL; + size_t keyDataLen = 0; + if (loadFile_safe(keyPathArg->sval[0], "", (void **)&keyData, &keyDataLen) != PM3_SUCCESS) { + CLIParserFree(ctx); + return PM3_EINVARG; + } - mbedtls_ecp_keypair privKey; - mbedtls_ecp_keypair_init(&privKey); + mbedtls_ecp_keypair privKey; + mbedtls_ecp_keypair_init(&privKey); - if (LoadReaderPrivateKey(keyData, keyDataLen, &privKey) != PM3_SUCCESS) { - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; - } + if (LoadReaderPrivateKey(keyData, keyDataLen, &privKey) != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } - free(keyData); + free(keyData); - uint8_t message[64] = {0}; - size_t messageLen = 0; - uint32_t timestamp = 0; + uint8_t message[64] = {0}; + size_t messageLen = 0; + uint32_t timestamp = 0; - if (DecryptVASCryptogram(pidHash, cryptogram, cryptogramLen, &privKey, message, &messageLen, ×tamp) != PM3_SUCCESS) { - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; - } + if (DecryptVASCryptogram(pidHash, cryptogram, cryptogramLen, &privKey, message, &messageLen, ×tamp) != PM3_SUCCESS) { + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_EINVARG; + } - PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); - PrintAndLogEx(SUCCESS, "Timestamp: %d (secs since Jan 1, 2001)", timestamp); + PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); + PrintAndLogEx(SUCCESS, "Timestamp: %d (secs since Jan 1, 2001)", timestamp); - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_SUCCESS; + CLIParserFree(ctx); + mbedtls_ecp_keypair_free(&privKey); + return PM3_SUCCESS; } static int CmdHelp(const char *Cmd); static command_t CommandTable[] = { - {"--------", CmdHelp, AlwaysAvailable, "----------- " _CYAN_("Value Added Service") " -----------"}, - {"reader", CmdVASReader, IfPm3Iso14443a, "Read and decrypt VAS message"}, - {"decrypt", CmdVASDecrypt, AlwaysAvailable, "Decrypt a previously captured VAS cryptogram"}, - {"--------", CmdHelp, AlwaysAvailable, "----------------- " _CYAN_("General") " -----------------"}, - {"help", CmdHelp, AlwaysAvailable, "This help"}, - {NULL, NULL, NULL, NULL} + {"--------", CmdHelp, AlwaysAvailable, "----------- " _CYAN_("Value Added Service") " -----------"}, + {"reader", CmdVASReader, IfPm3Iso14443a, "Read and decrypt VAS message"}, + {"decrypt", CmdVASDecrypt, AlwaysAvailable, "Decrypt a previously captured VAS cryptogram"}, + {"--------", CmdHelp, AlwaysAvailable, "----------------- " _CYAN_("General") " -----------------"}, + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {NULL, NULL, NULL, NULL} }; int CmdVAS(const char *Cmd) { - clearCommandBuffer(); - return CmdsParse(CommandTable, Cmd); + clearCommandBuffer(); + return CmdsParse(CommandTable, Cmd); }; static int CmdHelp(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - CmdsHelp(CommandTable); - return PM3_SUCCESS; + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return PM3_SUCCESS; }; diff --git a/client/src/crypto/libpcrypto.c b/client/src/crypto/libpcrypto.c index 12292c440..4e119f245 100644 --- a/client/src/crypto/libpcrypto.c +++ b/client/src/crypto/libpcrypto.c @@ -638,31 +638,31 @@ int blowfish_decrypt(uint8_t *iv, uint8_t *key, uint8_t *input, uint8_t *output, // Implementation from http://www.secg.org/sec1-v2.pdf#subsubsection.3.6.1 int ansi_x963_sha256(uint8_t *sharedSecret, size_t sharedSecretLen, uint8_t *sharedInfo, size_t sharedInfoLen, size_t keyDataLen, uint8_t *keyData) { - // sha256 hash has (practically) no max input len, so skipping that step + // sha256 hash has (practically) no max input len, so skipping that step - if (keyDataLen >= 32 * (pow(2, 32) - 1)) { - return 1; - } + if (keyDataLen >= 32 * (pow(2, 32) - 1)) { + return 1; + } - uint32_t counter = 0x00000001; + uint32_t counter = 0x00000001; - for (int i = 0; i < (keyDataLen / 32); ++i) { - uint8_t *hashMaterial = malloc(4 + sharedSecretLen + sharedInfoLen); - memcpy(hashMaterial, sharedSecret, sharedSecretLen); - hashMaterial[sharedSecretLen] = (counter >> 24); - hashMaterial[sharedSecretLen + 1] = (counter >> 16) & 0xFF; - hashMaterial[sharedSecretLen + 2] = (counter >> 8) & 0xFF; - hashMaterial[sharedSecretLen + 3] = counter & 0xFF; - memcpy(hashMaterial + sharedSecretLen + 4, sharedInfo, sharedInfoLen); + for (int i = 0; i < (keyDataLen / 32); ++i) { + uint8_t *hashMaterial = malloc(4 + sharedSecretLen + sharedInfoLen); + memcpy(hashMaterial, sharedSecret, sharedSecretLen); + hashMaterial[sharedSecretLen] = (counter >> 24); + hashMaterial[sharedSecretLen + 1] = (counter >> 16) & 0xFF; + hashMaterial[sharedSecretLen + 2] = (counter >> 8) & 0xFF; + hashMaterial[sharedSecretLen + 3] = counter & 0xFF; + memcpy(hashMaterial + sharedSecretLen + 4, sharedInfo, sharedInfoLen); - uint8_t hash[32] = {0}; - sha256hash(hashMaterial, 4 + sharedSecretLen + sharedInfoLen, hash); - free(hashMaterial); + uint8_t hash[32] = {0}; + sha256hash(hashMaterial, 4 + sharedSecretLen + sharedInfoLen, hash); + free(hashMaterial); - memcpy(keyData + (32 * i), hash, 32); + memcpy(keyData + (32 * i), hash, 32); - counter++; - } + counter++; + } - return 0; + return 0; } diff --git a/common/mbedtls/ecc_point_compression.c b/common/mbedtls/ecc_point_compression.c index 387255507..7216f3662 100644 --- a/common/mbedtls/ecc_point_compression.c +++ b/common/mbedtls/ecc_point_compression.c @@ -1,5 +1,5 @@ /* -* Not original to the mbedtls library. Taken from +* Not original to the mbedtls library. Taken from * https://github.com/mwarning/mbedtls_ecp_compression * to solve mbedtls' lack of support for elliptic point * compression and decompression @@ -35,13 +35,13 @@ int mbedtls_ecp_decompress( *olen = 2 * plen + 1; if (osize < *olen) - return(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL); + return (MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL); if (ilen != plen + 1) - return(MBEDTLS_ERR_ECP_BAD_INPUT_DATA); + return (MBEDTLS_ERR_ECP_BAD_INPUT_DATA); if (input[0] != 0x02 && input[0] != 0x03) - return(MBEDTLS_ERR_ECP_BAD_INPUT_DATA); + return (MBEDTLS_ERR_ECP_BAD_INPUT_DATA); // output will consist of 0x04|X|Y memcpy(output, input, ilen); @@ -97,7 +97,7 @@ cleanup: mbedtls_mpi_free(&x); mbedtls_mpi_free(&n); - return(ret); + return (ret); } int mbedtls_ecp_compress( @@ -112,13 +112,13 @@ int mbedtls_ecp_compress( *olen = plen + 1; if (osize < *olen) - return(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL); + return (MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL); if (ilen != 2 * plen + 1) return (MBEDTLS_ERR_ECP_BAD_INPUT_DATA); if (input[0] != 0x04) - return(MBEDTLS_ERR_ECP_BAD_INPUT_DATA); + return (MBEDTLS_ERR_ECP_BAD_INPUT_DATA); // output will consist of 0x0?|X memcpy(output, input, *olen); @@ -126,5 +126,5 @@ int mbedtls_ecp_compress( // Encode even/odd of Y into first byte (either 0x02 or 0x03) output[0] = 0x02 + (input[2 * plen] & 1); - return(0); + return (0); } diff --git a/common/mbedtls/ecc_point_compression.h b/common/mbedtls/ecc_point_compression.h index d75fea39b..fc691f8a4 100644 --- a/common/mbedtls/ecc_point_compression.h +++ b/common/mbedtls/ecc_point_compression.h @@ -1,5 +1,5 @@ /* -* Not original to the mbedtls library. Taken from +* Not original to the mbedtls library. Taken from * https://github.com/mwarning/mbedtls_ecp_compression * to solve mbedtls' lack of support for elliptic point * compression and decompression From 50dde2d020bc3ee29eb3b08202e11fb4c7762756 Mon Sep 17 00:00:00 2001 From: Grayson Martin Date: Sat, 8 Jul 2023 18:36:53 -0500 Subject: [PATCH 601/924] add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca0fede15..57d0c4f7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added support for Apple Wallet NFC Passes with the Value Added Services protocol implementation (@gm3197) ## [Seven.4.16717][2023-06-25] - Change `hf 14a info` - now identifes QL88 tags (@iceman1001) From 889a02557bdabf3cbef3e9b0abbb2c2191c42d11 Mon Sep 17 00:00:00 2001 From: Sam <48739810+The-SamminAter@users.noreply.github.com> Date: Sat, 8 Jul 2023 23:16:30 -0700 Subject: [PATCH 602/924] Fix compiling on iOS iOS can, in fact, use the system() stdlib call Signed-off-by: Sam <48739810+The-SamminAter@users.noreply.github.com> --- client/deps/liblua/luaconf.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/deps/liblua/luaconf.h b/client/deps/liblua/luaconf.h index 77445383f..d0b657361 100644 --- a/client/deps/liblua/luaconf.h +++ b/client/deps/liblua/luaconf.h @@ -10,9 +10,6 @@ #if defined(__APPLE__) #include "TargetConditionals.h" -#if TARGET_OS_IOS || TARGET_OS_WATCH || TARGET_OS_TV -#define system(s) ((s)==NULL ? 0 : -1) -#endif // end iOS #endif #include From 013a26717c3442fa8e906e979d93a23e27e5cd5f Mon Sep 17 00:00:00 2001 From: Sam <48739810+The-SamminAter@users.noreply.github.com> Date: Sat, 8 Jul 2023 23:19:58 -0700 Subject: [PATCH 603/924] Update CHANGELOG.md Signed-off-by: Sam <48739810+The-SamminAter@users.noreply.github.com> --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index df3601ba1..e172769de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fix compiling liblua on iOS (@The-SamminAter) - Fixed the timeout of TCP connections (@wh201906) - Made the connection timeout configurable (@wh201906) From d3b6fc6b5aea6bbe570e876cd1d91a9bbde140c4 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Jul 2023 09:43:54 +0200 Subject: [PATCH 604/924] allowing for more keys --- client/luascripts/hf_mf_dump_luxeo.lua | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/client/luascripts/hf_mf_dump_luxeo.lua b/client/luascripts/hf_mf_dump_luxeo.lua index aaf7d572f..f645d3d7b 100644 --- a/client/luascripts/hf_mf_dump_luxeo.lua +++ b/client/luascripts/hf_mf_dump_luxeo.lua @@ -231,13 +231,26 @@ local function main(args) print(acblue.."UID: "..tag.uid..acoff) print(acblue..string.format("XTEA key: %08X %08X %08X %08X", xteakey[0], xteakey[1], xteakey[2], xteakey[3])..acoff) - edata, cdata = readtag("415A54454B4D", xteakey) + local keys = { + "415A54454B4D", + "4B6A43059B64", + "C8BE6250C9C5", + } + + for i, key in ipairs(keys) do + edata, cdata = readtag(key, xteakey) + if edata and cdata then + goto continue + end + end if edata == nil or cdata == nil then print("ERROR Reading tag!") return nil end + ::continue:: + print("Ciphered data:") for key,value in ipairs(edata) do print(value) From 08958d36efa9be037e9b1a31b3432c5e892b4b31 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Jul 2023 12:55:37 +0200 Subject: [PATCH 605/924] moving VAS to HF command category. Added missing Makefile and CMakefile --- CHANGELOG.md | 1 + client/CMakeLists.txt | 2 +- client/Makefile | 1 + client/experimental_lib/CMakeLists.txt | 1 + client/src/cmdhf.c | 12 +++++++----- client/src/{cmdvas.c => cmdhfvas.c} | 8 ++++---- client/src/{cmdvas.h => cmdhfvas.h} | 6 +++--- client/src/cmdnfc.c | 2 -- 8 files changed, 18 insertions(+), 15 deletions(-) rename client/src/{cmdvas.c => cmdhfvas.c} (99%) rename client/src/{cmdvas.h => cmdhfvas.h} (92%) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef8fd7e32..21b463b28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] - Added support for Apple Wallet NFC Passes with the Value Added Services protocol implementation (@gm3197) - Fix compiling liblua on iOS (@The-SamminAter) + - Changed `hf_mf_luxeo_dump.lua` - now have list of keys to iterate (@iceman1001) - Fixed the timeout of TCP connections (@wh201906) - Made the connection timeout configurable (@wh201906) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 6252393e8..91742b711 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -298,6 +298,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdhftexkom.c ${PM3_ROOT}/client/src/cmdhfthinfilm.c ${PM3_ROOT}/client/src/cmdhftopaz.c + ${PM3_ROOT}/client/src/cmdhfvas.c ${PM3_ROOT}/client/src/cmdhfwaveshare.c ${PM3_ROOT}/client/src/cmdhfxerox.c ${PM3_ROOT}/client/src/cmdhw.c @@ -337,7 +338,6 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdlfzx8211.c ${PM3_ROOT}/client/src/cmdmain.c ${PM3_ROOT}/client/src/cmdnfc.c - ${PM3_ROOT}/client/src/cmdvas.c ${PM3_ROOT}/client/src/cmdparser.c ${PM3_ROOT}/client/src/cmdpiv.c ${PM3_ROOT}/client/src/cmdscript.c diff --git a/client/Makefile b/client/Makefile index d44e67011..8b9e469ba 100644 --- a/client/Makefile +++ b/client/Makefile @@ -597,6 +597,7 @@ SRCS = mifare/aiddesfire.c \ cmdhfthinfilm.c \ cmdhftopaz.c \ cmdhftexkom.c \ + cmdhfvas.c \ cmdhfwaveshare.c \ cmdhfxerox.c \ cmdhw.c \ diff --git a/client/experimental_lib/CMakeLists.txt b/client/experimental_lib/CMakeLists.txt index 60e7b4004..ca8243dbb 100644 --- a/client/experimental_lib/CMakeLists.txt +++ b/client/experimental_lib/CMakeLists.txt @@ -298,6 +298,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdhftexkom.c ${PM3_ROOT}/client/src/cmdhfthinfilm.c ${PM3_ROOT}/client/src/cmdhftopaz.c + ${PM3_ROOT}/client/src/cmdhfvas.c ${PM3_ROOT}/client/src/cmdhfwaveshare.c ${PM3_ROOT}/client/src/cmdhfxerox.c ${PM3_ROOT}/client/src/cmdhw.c diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index 97f7df3c7..b15671272 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -38,6 +38,7 @@ #include "cmdhftopaz.h" // TOPAZ #include "cmdhffelica.h" // ISO18092 / FeliCa #include "cmdhffido.h" // FIDO authenticators +#include "cmdhffudan.h" // Fudan cards #include "cmdhfgallagher.h" // Gallagher DESFire cards #include "cmdhfksx6924.h" // KS X 6924 #include "cmdhfcipurse.h" // CIPURSE transport cards @@ -46,11 +47,11 @@ #include "cmdhfcryptorf.h" // CryptoRF #include "cmdhfseos.h" // SEOS #include "cmdhfst25ta.h" // ST25TA -#include "cmdhfwaveshare.h" // Waveshare -#include "cmdhftexkom.h" // Texkom -#include "cmdhfxerox.h" // Xerox -#include "cmdhffudan.h" // Fudan cards #include "cmdhftesla.h" // Tesla +#include "cmdhftexkom.h" // Texkom +#include "cmdhfvas.h" // Value added services +#include "cmdhfwaveshare.h" // Waveshare +#include "cmdhfxerox.h" // Xerox #include "cmdtrace.h" // trace list #include "ui.h" #include "proxgui.h" @@ -498,8 +499,9 @@ static command_t CommandTable[] = { {"texkom", CmdHFTexkom, AlwaysAvailable, "{ Texkom RFIDs... }"}, {"thinfilm", CmdHFThinfilm, AlwaysAvailable, "{ Thinfilm RFIDs... }"}, {"topaz", CmdHFTopaz, AlwaysAvailable, "{ TOPAZ (NFC Type 1) RFIDs... }"}, - {"xerox", CmdHFXerox, AlwaysAvailable, "{ Fuji/Xerox cartridge RFIDs... }"}, + {"vas", CmdHFVAS, AlwaysAvailable, "{ Apple Value Added Service }"}, {"waveshare", CmdHFWaveshare, AlwaysAvailable, "{ Waveshare NFC ePaper... }"}, + {"xerox", CmdHFXerox, AlwaysAvailable, "{ Fuji/Xerox cartridge RFIDs... }"}, {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("General") " ---------------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, {"list", CmdHFList, AlwaysAvailable, "List protocol data in trace buffer"}, diff --git a/client/src/cmdvas.c b/client/src/cmdhfvas.c similarity index 99% rename from client/src/cmdvas.c rename to client/src/cmdhfvas.c index dfee9dbc3..3e5f9cdf9 100644 --- a/client/src/cmdvas.c +++ b/client/src/cmdhfvas.c @@ -16,7 +16,7 @@ // An implementation of the Value Added Service protocol //----------------------------------------------------------------------------- -#include "cmdvas.h" +#include "cmdhfvas.h" #include "cliparser.h" #include "cmdparser.h" #include "comms.h" @@ -561,14 +561,14 @@ static int CmdHelp(const char *Cmd); static command_t CommandTable[] = { {"--------", CmdHelp, AlwaysAvailable, "----------- " _CYAN_("Value Added Service") " -----------"}, + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"--------", CmdHelp, AlwaysAvailable, "----------------- " _CYAN_("General") " -----------------"}, {"reader", CmdVASReader, IfPm3Iso14443a, "Read and decrypt VAS message"}, {"decrypt", CmdVASDecrypt, AlwaysAvailable, "Decrypt a previously captured VAS cryptogram"}, - {"--------", CmdHelp, AlwaysAvailable, "----------------- " _CYAN_("General") " -----------------"}, - {"help", CmdHelp, AlwaysAvailable, "This help"}, {NULL, NULL, NULL, NULL} }; -int CmdVAS(const char *Cmd) { +int CmdHFVAS(const char *Cmd) { clearCommandBuffer(); return CmdsParse(CommandTable, Cmd); }; diff --git a/client/src/cmdvas.h b/client/src/cmdhfvas.h similarity index 92% rename from client/src/cmdvas.h rename to client/src/cmdhfvas.h index 59a53f50d..50189e227 100644 --- a/client/src/cmdvas.h +++ b/client/src/cmdhfvas.h @@ -16,11 +16,11 @@ // An implementation of the Value Added Service protocol //----------------------------------------------------------------------------- -#ifndef CMDVAS_H__ -#define CMDVAS_H__ +#ifndef CMDHFVAS_H__ +#define CMDHFVAS_H__ #include "common.h" -int CmdVAS(const char *Cmd); +int CmdHFVAS(const char *Cmd); #endif diff --git a/client/src/cmdnfc.c b/client/src/cmdnfc.c index 45b01b874..eadfa7161 100644 --- a/client/src/cmdnfc.c +++ b/client/src/cmdnfc.c @@ -28,7 +28,6 @@ #include "cmdhfst25ta.h" #include "cmdhfthinfilm.h" #include "cmdhftopaz.h" -#include "cmdvas.h" #include "cmdnfc.h" #include "fileutils.h" #include "mifare/mifaredefault.h" @@ -422,7 +421,6 @@ static command_t CommandTable[] = { // {"type5", CmdNFCType5, AlwaysAvailable, "{ NFC Forum Tag Type 5... }"}, {"mf", CmdNFCMF, AlwaysAvailable, "{ NFC Type MIFARE Classic/Plus Tag... }"}, {"barcode", CmdNFCBarcode, AlwaysAvailable, "{ NFC Barcode Tag... }"}, - {"vas", CmdVAS, AlwaysAvailable, "{ Apple Value Added Service }"}, // {"--------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("NFC peer-to-peer") " ------------"}, // {"isodep", CmdISODEP, AlwaysAvailable, "{ ISO-DEP protocol... }"}, // {"llcp", CmdNFCLLCP, AlwaysAvailable, "{ Logical Link Control Protocol... }"}, From 6eba6015c5759e7ada1c9672132e1be0c8fb16be Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Jul 2023 13:00:09 +0200 Subject: [PATCH 606/924] added a sample VAS private key to client/resources folder. Updated helptexts --- client/resources/vas_privkey.der | Bin 0 -> 121 bytes client/src/cmdhfvas.c | 14 ++++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 client/resources/vas_privkey.der diff --git a/client/resources/vas_privkey.der b/client/resources/vas_privkey.der new file mode 100644 index 0000000000000000000000000000000000000000..318a651c7b3a890330f6ef4d69c769e4bb1fc5a1 GIT binary patch literal 121 zcmV-<0EYiCcLD(c1Ry;XNAf(^iqKM}h+y#{o{zVY>`neNcAs0D`eJ%zY@whE1_&yK zNX|V20SBQ(13~}a bN4^smJ@5R%b*wJ!iGE)zP&nH&8!!s*Dc3ac literal 0 HcmV?d00001 diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index 3e5f9cdf9..574493ebb 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -389,9 +389,12 @@ static int VASReader(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t * static int CmdVASReader(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "nfc vas reader", + CLIParserInit(&ctx, "hf vas reader", "Read and decrypt VAS message", - "nfc vas reader -p pass.com.example.ticket -k ./priv.key -> select pass and decrypt with priv.key\nnfc vas reader --url https://example.com -> URL Only mode"); + "hf vas reader -p pass.com.example.ticket -k client/resources/vas_priv.key -> select pass and decrypt with priv.key\n" + "hf vas reader --url https://example.com -> URL Only mode" + ); + void *argtable[] = { arg_param_begin, arg_str0("p", NULL, "", "pass type id"), @@ -491,9 +494,12 @@ static int CmdVASReader(const char *Cmd) { static int CmdVASDecrypt(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "nfc vas decrypt", + CLIParserInit(&ctx, "hf vas decrypt", "Decrypt a previously captured cryptogram", - "nfc vas reader -p pass.com.example.ticket -k ./priv.key -> select pass and decrypt with priv.key\nnfc vas reader --url https://example.com -> URL Only mode"); + "hf vas reader -p pass.com.example.ticket -k client/resources/vas_priv.key -> select pass and decrypt with priv.key\n" + "hf vas reader --url https://example.com -> URL Only mode" + ); + void *argtable[] = { arg_param_begin, arg_str0("p", NULL, "", "pass type id"), From 7329d7b0d02fc4e50f82674977eafdb613e08240 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Jul 2023 13:04:10 +0200 Subject: [PATCH 607/924] fix missing files for compilation --- common/mbedtls/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/mbedtls/Makefile b/common/mbedtls/Makefile index 142ac6b12..ebd2d5dcf 100644 --- a/common/mbedtls/Makefile +++ b/common/mbedtls/Makefile @@ -21,7 +21,10 @@ MYSRCS = \ cipher.c \ cmac.c \ des.c \ + ecc_point_compression.c \ + ecdh.c \ ecdsa.c \ + gcm.c \ md.c \ md5.c \ oid.c \ From a49fdbda0d7fa293a39ba75757e7ddef880809c9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Jul 2023 15:26:05 +0200 Subject: [PATCH 608/924] reworked the logic and params a bit --- client/src/cmdhfvas.c | 186 ++++++++++++++++++++---------------------- 1 file changed, 89 insertions(+), 97 deletions(-) diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index 574493ebb..f235a46ec 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -390,177 +390,169 @@ static int VASReader(uint8_t *pidHash, const char *url, size_t urlLen, uint8_t * static int CmdVASReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf vas reader", - "Read and decrypt VAS message", - "hf vas reader -p pass.com.example.ticket -k client/resources/vas_priv.key -> select pass and decrypt with priv.key\n" - "hf vas reader --url https://example.com -> URL Only mode" + "Read and decrypt Value Added Services (VAS) message", + "hf vas reader --url https://example.com -> URL Only mode\n" + "hf vas reader --pid pass.com.passkit.pksamples.nfcdemo -f vas_privkey.der -@\n" ); void *argtable[] = { arg_param_begin, - arg_str0("p", NULL, "", "pass type id"), - arg_str0("k", NULL, "", "path to terminal private key"), - arg_str0(NULL, "url", "", "a URL to provide to the mobile device"), + arg_str0(NULL, "pid", "", "PID, pass type id"), + arg_str0("f", "file", "", "path to terminal private key file"), + arg_str0(NULL, "url", "", "a URL to provide to the mobile device"), arg_lit0("@", NULL, "continuous mode"), arg_lit0("v", "verbose", "log additional information"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); - struct arg_str *passTypeIdArg = arg_get_str(ctx, 1); - int passTypeIdLen = arg_get_str_len(ctx, 1); - uint8_t pidHash[32] = {0}; - sha256hash((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen, pidHash); + int pidlen = 0; + char pid[512] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)pid, 512, &pidlen); - struct arg_str *keyPathArg = arg_get_str(ctx, 2); - int keyPathLen = arg_get_str_len(ctx, 2); + int keyfnlen = 0; + char keyfn[FILE_PATH_SIZE] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)keyfn, FILE_PATH_SIZE, &keyfnlen); - if (keyPathLen == 0 && passTypeIdLen > 0) { + if (keyfnlen == 0 && pidlen > 0) { PrintAndLogEx(FAILED, "Must provide path to terminal private key if a pass type id is provided"); CLIParserFree(ctx); return PM3_EINVARG; } - uint8_t *keyData = NULL; - size_t keyDataLen = 0; - if (loadFile_safe(keyPathArg->sval[0], "", (void **)&keyData, &keyDataLen) != PM3_SUCCESS) { - CLIParserFree(ctx); - return PM3_EINVARG; + int urllen = 0; + char url[512] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 3), (uint8_t *)url, 512, &urllen); + + bool continuous = arg_get_lit(ctx, 4); + bool verbose = arg_get_lit(ctx, 5); + CLIParserFree(ctx); + + // santity checks + uint8_t *key_data = NULL; + size_t key_datalen = 0; + if (loadFile_safe(keyfn, "", (void **)&key_data, &key_datalen) != PM3_SUCCESS) { + return PM3_EFILE; } mbedtls_ecp_keypair privKey; mbedtls_ecp_keypair_init(&privKey); - if (LoadReaderPrivateKey(keyData, keyDataLen, &privKey) != PM3_SUCCESS) { - CLIParserFree(ctx); + if (LoadReaderPrivateKey(key_data, key_datalen, &privKey) != PM3_SUCCESS) { + free(key_data); mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; + return PM3_ESOFT; } + free(key_data); - free(keyData); - - struct arg_str *urlArg = arg_get_str(ctx, 3); - int urlLen = arg_get_str_len(ctx, 3); - const char *url = NULL; - if (urlLen > 0) { - url = urlArg->sval[0]; - } - - bool continuous = arg_get_lit(ctx, 4); - bool verbose = arg_get_lit(ctx, 5); - - PrintAndLogEx(INFO, "Requesting pass type id: %s", sprint_ascii((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen)); + PrintAndLogEx(INFO, "Requesting pass type id... " _GREEN_("%s"), sprint_ascii((uint8_t *) pid, pidlen)); if (continuous) { PrintAndLogEx(INFO, "Press " _GREEN_("Enter") " to exit"); } + uint8_t pidhash[32] = {0}; + sha256hash((uint8_t *) pid, pidlen, pidhash); + + size_t clen = 0; + size_t mlen = 0; uint8_t cryptogram[120] = {0}; - size_t cryptogramLen = 0; - int readerErr = -1; + uint8_t msg[64] = {0}; + uint32_t timestamp = 0; + int res = PM3_SUCCESS; do { - readerErr = VASReader(passTypeIdLen > 0 ? pidHash : NULL, url, urlLen, cryptogram, &cryptogramLen, verbose); - - if (readerErr == 0 || kbd_enter_pressed()) { + if (continuous && kbd_enter_pressed()) { break; } + + res = VASReader( (pidlen > 0) ? pidhash : NULL, url, urllen, cryptogram, &clen, verbose); + if (res == PM3_SUCCESS) { - msleep(200); + res = DecryptVASCryptogram(pidhash, cryptogram, clen, &privKey, msg, &mlen, ×tamp); + if (res == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "Timestamp... " _YELLOW_("%d") " (secs since Jan 1, 2001)", timestamp); + PrintAndLogEx(SUCCESS, "Message..... " _YELLOW_("%s"), sprint_ascii(msg, mlen)); + // extra sleep after successfull read + if (continuous) { + msleep(3000); + } + } + } + msleep(300); } while (continuous); - if (readerErr) { - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; - } - - uint8_t message[64] = {0}; - size_t messageLen = 0; - uint32_t timestamp = 0; - - if (DecryptVASCryptogram(pidHash, cryptogram, cryptogramLen, &privKey, message, &messageLen, ×tamp) != PM3_SUCCESS) { - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; - } - - PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); - PrintAndLogEx(SUCCESS, "Timestamp: %d (secs since Jan 1, 2001)", timestamp); - - CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); - return PM3_SUCCESS; + return res; } static int CmdVASDecrypt(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf vas decrypt", "Decrypt a previously captured cryptogram", - "hf vas reader -p pass.com.example.ticket -k client/resources/vas_priv.key -> select pass and decrypt with priv.key\n" - "hf vas reader --url https://example.com -> URL Only mode" + "hf vas decrypt --pid pass.com.passkit.pksamples.nfcdemo -f vas_privkey.der -d 00000000\n" ); void *argtable[] = { arg_param_begin, - arg_str0("p", NULL, "", "pass type id"), - arg_str0("k", NULL, "", "path to terminal private key"), - arg_str0(NULL, NULL, "", "cryptogram to decrypt"), + arg_str0(NULL, "pid", "", "PID, pass type id"), + arg_str0("f", "file", "", "path to terminal private key file"), + arg_str0("d", "data", "", "cryptogram to decrypt"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); - struct arg_str *passTypeIdArg = arg_get_str(ctx, 1); - int passTypeIdLen = arg_get_str_len(ctx, 1); - uint8_t pidHash[32] = {0}; - sha256hash((uint8_t *) passTypeIdArg->sval[0], passTypeIdLen, pidHash); + int pidlen = 0; + char pid[512] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)pid, 512, &pidlen); - uint8_t cryptogram[120] = {0}; - int cryptogramLen = 0; - CLIGetHexWithReturn(ctx, 3, cryptogram, &cryptogramLen); + int keyfnlen = 0; + char keyfn[FILE_PATH_SIZE] = {0}; + CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)keyfn, FILE_PATH_SIZE, &keyfnlen); - struct arg_str *keyPathArg = arg_get_str(ctx, 2); - int keyPathLen = arg_get_str_len(ctx, 2); - - if (keyPathLen == 0 && passTypeIdLen > 0) { + if (keyfnlen == 0 && pidlen > 0) { PrintAndLogEx(FAILED, "Must provide path to terminal private key if a pass type id is provided"); CLIParserFree(ctx); return PM3_EINVARG; } - uint8_t *keyData = NULL; - size_t keyDataLen = 0; - if (loadFile_safe(keyPathArg->sval[0], "", (void **)&keyData, &keyDataLen) != PM3_SUCCESS) { - CLIParserFree(ctx); - return PM3_EINVARG; + int clen = 0; + uint8_t cryptogram[120] = {0}; + CLIGetHexWithReturn(ctx, 3, cryptogram, &clen); + CLIParserFree(ctx); + + // santity checks + uint8_t *key_data = NULL; + size_t key_datalen = 0; + if (loadFile_safe(keyfn, "", (void **)&key_data, &key_datalen) != PM3_SUCCESS) { + return PM3_EFILE; } mbedtls_ecp_keypair privKey; mbedtls_ecp_keypair_init(&privKey); - if (LoadReaderPrivateKey(keyData, keyDataLen, &privKey) != PM3_SUCCESS) { - CLIParserFree(ctx); + if (LoadReaderPrivateKey(key_data, key_datalen, &privKey) != PM3_SUCCESS) { + free(key_data); mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; + return PM3_EFILE; } + free(key_data); - free(keyData); + uint8_t pidhash[32] = {0}; + sha256hash((uint8_t *) pid, pidlen, pidhash); - uint8_t message[64] = {0}; - size_t messageLen = 0; + size_t mlen = 0; + uint8_t msg[64] = {0}; uint32_t timestamp = 0; - if (DecryptVASCryptogram(pidHash, cryptogram, cryptogramLen, &privKey, message, &messageLen, ×tamp) != PM3_SUCCESS) { - CLIParserFree(ctx); - mbedtls_ecp_keypair_free(&privKey); - return PM3_EINVARG; + int res = DecryptVASCryptogram(pidhash, cryptogram, clen, &privKey, msg, &mlen, ×tamp); + if (res == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "Timestamp... " _YELLOW_("%d") " (secs since Jan 1, 2001)", timestamp); + PrintAndLogEx(SUCCESS, "Message..... " _YELLOW_("%s"), sprint_ascii(msg, mlen)); } - PrintAndLogEx(SUCCESS, "Message: %s", sprint_ascii(message, messageLen)); - PrintAndLogEx(SUCCESS, "Timestamp: %d (secs since Jan 1, 2001)", timestamp); - - CLIParserFree(ctx); mbedtls_ecp_keypair_free(&privKey); - return PM3_SUCCESS; + return res; } static int CmdHelp(const char *Cmd); From 7a66e2389ec9be7e55bd1f5a516aaafe14ca68dd Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Jul 2023 15:57:35 +0200 Subject: [PATCH 609/924] hf search will now detect VAS --- client/src/cmdhf14a.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 0a9a23578..7bdc04c06 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -194,6 +194,7 @@ static const hintAIDList_t hintAIDList[] = { { "\x32\x50\x41\x59\x2E\x53\x59\x53\x2E\x44\x44\x46\x30\x31", 14, "EMV (ppse)", "emv" }, { "\x41\x44\x20\x46\x31", 5, "CIPURSE", "hf cipurse" }, { "\xd2\x76\x00\x00\x85\x01\x00", 7, "desfire", "hf mfdes" }, + { "\x4F\x53\x45\x2E\x56\x41\x53\x2E\x30\x31",10, "Apple VAS", "hf vas"}, }; // iso14a apdu input frame length @@ -2416,10 +2417,9 @@ int infoHF14A4Applications(bool verbose) { } if (found) { - if (verbose) + if (verbose) { PrintAndLogEx(INFO, "---------------------------------------------------"); - else - PrintAndLogEx(INFO, "Short AID search:"); + } if (found >= ARRAYLEN(hintAIDList) - 1) { PrintAndLogEx(HINT, "Hint: card answers to all AID. It maybe the latest revision of plus/desfire/ultralight card."); From d99bd546621d07fe99355148cc7acbbc8084431a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 9 Jul 2023 16:45:03 +0200 Subject: [PATCH 610/924] fixed helptext sample --- client/src/cmdhfvas.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index f235a46ec..839474cc5 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -233,7 +233,9 @@ static int LoadMobileEphemeralKey(uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKe return PM3_SUCCESS; } -static int internalVasDecrypt(uint8_t *cipherText, size_t cipherTextLen, uint8_t *sharedSecret, uint8_t *ansiSharedInfo, size_t ansiSharedInfoLen, uint8_t *gcmAad, size_t gcmAadLen, uint8_t *out, size_t *outLen) { +static int internalVasDecrypt(uint8_t *cipherText, size_t cipherTextLen, uint8_t *sharedSecret, + uint8_t *ansiSharedInfo, size_t ansiSharedInfoLen, + uint8_t *gcmAad, size_t gcmAadLen, uint8_t *out, size_t *outLen) { uint8_t key[32] = {0}; if (ansi_x963_sha256(sharedSecret, 32, ansiSharedInfo, ansiSharedInfoLen, sizeof(key), key)) { PrintAndLogEx(FAILED, "ANSI X9.63 key derivation failed"); @@ -490,7 +492,7 @@ static int CmdVASDecrypt(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf vas decrypt", "Decrypt a previously captured cryptogram", - "hf vas decrypt --pid pass.com.passkit.pksamples.nfcdemo -f vas_privkey.der -d 00000000\n" + "hf vas decrypt --pid pass.com.passkit.pksamples.nfcdemo -f vas_privkey.der -d c0b77375eae416b79449347f9fe838c05cdb57dc7470b97b93b806cb348771d9bfbe29d58538c7c7d7c3d015fa205b68bfccd726058a62f7f44085ac98dbf877120fd9059f1507b956e0a6d56d0a\n" ); void *argtable[] = { From 6d403ddfeff1903e02bb64f1a9d1b4a71c65549e Mon Sep 17 00:00:00 2001 From: kormax Date: Sun, 9 Jul 2023 22:33:26 +0300 Subject: [PATCH 611/924] Create a list of known ECP frames --- client/resources/ecplist.json | 91 +++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 client/resources/ecplist.json diff --git a/client/resources/ecplist.json b/client/resources/ecplist.json new file mode 100644 index 000000000..13ea2faee --- /dev/null +++ b/client/resources/ecplist.json @@ -0,0 +1,91 @@ +[ + { + "value": "6a01000000", + "name": "VAS or payment", + "description": "Used when a reader needs a pass or a payment card. Sometimes called VAS over Payment" + }, + { + "value": "6a01000001", + "name": "VAS and payment", + "description": "Also called single tap mode. Displays pass info under a payment card. Allows reading multiple passes with different ids in one tap" + }, + { + "value": "6a01000002", + "name": "VAS only", + "description": "Used when a reader requests passes only" + }, + { + "value": "6a01000003", + "name": "Payment only", + "description": "Used when a reader requests payment cards only. Also disables express mode for chinese transit cards" + }, + { + "value": "6a01cf0000", + "name": "Ignore", + "description": "iPhones before IOS17 emit this frame so that other apple devices don't react to the field during background reading. Also emited during NFCReaderSession subtypes" + }, + + + { + "value": "6a02c801000300000000000000", + "name": "Transit: Ventra", + "description": "" + }, + { + "value": "6a02c801000304000000000000", + "name": "Transit: HOP Fastpass", + "description": "" + }, + { + "value": "6a02c801000300010000000000", + "name": "Transit: WMATA", + "description": "" + }, + { + "value": "6a02c801000300027900000000", + "name": "Transit: TFL", + "description": "Found by a member of Proxmark community. Data bytes define a mask of supported EMV payment networks for fallback. In this case: Amex, Visa, Mastercard, Maestro, Vpay" + }, + { + "value": "6a02c801000300050000000000", + "name": "Transit: LA TAP", + "description": "" + }, + { + "value": "6a02c801000300070000000000", + "name": "Transit: Clipper", + "description": "" + }, + + + { + "value": "6a02cb0206021100deadbeefdeadbeef", + "name": "Access: Home Key", + "description": "Last 8 bytes refer to reader group identifier, common for all readers in same home installation, allows to differentiate between keys for different homes" + }, + + { + "value": "6a02c30209010201", + "name": "Access: Mercedes Pairing", + "description": "Device does not respond to this frame. Displays a car pairing popup for Mercedes" + }, + + + { + "value": "6a0281030000", + "name": "Identity", + "description": "Used for reading ISO18013 digital IDs" + }, + + + { + "value": "6a02890500010001deadbeef6969", + "name": "NameDrop", + "description": "Device does not respond to poll due to this frame, but it serves as a trigger for AirDrop frame. Data part contains BLE MAC address" + }, + { + "value": "6a02890500010000000000000000", + "name": "AirDrop", + "description": "Only sent if sees a NameDrop frame of other device. Device responds to poll with UID 00010203" + } +] \ No newline at end of file From faab7c5712b0db3f1b399f697b681bea82f78cc2 Mon Sep 17 00:00:00 2001 From: kormax Date: Sun, 9 Jul 2023 22:35:15 +0300 Subject: [PATCH 612/924] Fix typos --- client/resources/ecplist.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/resources/ecplist.json b/client/resources/ecplist.json index 13ea2faee..e0e09c80f 100644 --- a/client/resources/ecplist.json +++ b/client/resources/ecplist.json @@ -22,7 +22,7 @@ { "value": "6a01cf0000", "name": "Ignore", - "description": "iPhones before IOS17 emit this frame so that other apple devices don't react to the field during background reading. Also emited during NFCReaderSession subtypes" + "description": "iPhones before IOS17 emit this frame so that other Apple devices don't react to the field during background reading. Also emitted during NFCReaderSession subtypes" }, @@ -81,7 +81,7 @@ { "value": "6a02890500010001deadbeef6969", "name": "NameDrop", - "description": "Device does not respond to poll due to this frame, but it serves as a trigger for AirDrop frame. Data part contains BLE MAC address" + "description": "Triggers a warp animation. Device does not respond to poll after this frame, but it serves as a trigger for AirDrop frame. Data part contains BLE MAC address" }, { "value": "6a02890500010000000000000000", From d5b77d2546e9bb930f8189899176dffecdfb524b Mon Sep 17 00:00:00 2001 From: kormax Date: Sun, 9 Jul 2023 22:36:13 +0300 Subject: [PATCH 613/924] Add newline at the end --- client/resources/ecplist.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/resources/ecplist.json b/client/resources/ecplist.json index e0e09c80f..0ce7fcda5 100644 --- a/client/resources/ecplist.json +++ b/client/resources/ecplist.json @@ -88,4 +88,4 @@ "name": "AirDrop", "description": "Only sent if sees a NameDrop frame of other device. Device responds to poll with UID 00010203" } -] \ No newline at end of file +] From 00ebea6487b983592d4913049ab57c386afc1777 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 00:18:35 +0200 Subject: [PATCH 614/924] autopwn now detects if someone runs it against a MF UL/NTAG based card and stops --- client/src/cmdhfmf.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 2eb7fa415..ec8703b68 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -1093,7 +1093,7 @@ static int FastDumpWithEcFill(uint8_t numsectors) { } if (resp.status != PM3_SUCCESS) { - PrintAndLogEx(INFO, "fast dump reported back failure w KEY A, swapping to KEY B"); + PrintAndLogEx(FAILED, "fast dump reported back failure w KEY A, swapping to KEY B"); // ecfill key B payload.keytype = MF_KEY_B; @@ -1107,8 +1107,8 @@ static int FastDumpWithEcFill(uint8_t numsectors) { } if (resp.status != PM3_SUCCESS) { - PrintAndLogEx(INFO, "fast dump reported back failure w KEY B"); - PrintAndLogEx(INFO, "Dump file is " _RED_("PARTIAL") " complete"); + PrintAndLogEx(FAILED, "fast dump reported back failure w KEY B"); + PrintAndLogEx(FAILED, "Dump file is " _RED_("PARTIAL") " complete"); } } return PM3_SUCCESS; @@ -2479,6 +2479,13 @@ static int CmdHF14AMfAutoPWN(const char *Cmd) { // ------------------------------ + uint32_t tagT = GetHF14AMfU_Type(); + if (tagT != UL_ERROR) { + PrintAndLogEx(ERR, "Detected a MIFARE Ultralight/C/NTAG Compatible card."); + PrintAndLogEx(ERR, "This command targets " _YELLOW_("MIFARE Classic")); + return PM3_ESOFT; + } + // Select card to get UID/UIDLEN/ATQA/SAK information clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_CONNECT, 0, 0, NULL, 0); @@ -3993,23 +4000,24 @@ static int CmdHF14AMfKeyBrute(const char *Cmd) { */ void printKeyTable(size_t sectorscnt, sector_t *e_sector) { - return printKeyTableEx(sectorscnt, e_sector, 0); + return printKeyTableEx(sectorscnt, e_sector, 0, false); } -void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector) { +void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector, bool singel_sector) { char strA[26 + 1] = {0}; char strB[26 + 1] = {0}; char resA[20 + 1] = {0}; char resB[20 + 1] = {0}; + uint64_t ndef_key = 0xD3F7D3F7D3F7; + bool has_ndef_key = false; + bool extended_legend = false; + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); PrintAndLogEx(SUCCESS, " Sec | Blk | key A |res| key B |res"); PrintAndLogEx(SUCCESS, "-----+-----+--------------+---+--------------+----"); - uint64_t ndef_key = 0xD3F7D3F7D3F7; - bool has_ndef_key = false; - bool extended_legend = false; for (size_t i = 0; i < sectorscnt; i++) { if ((e_sector[i].foundKey[0] > 1) || (e_sector[i].foundKey[1] > 1)) { @@ -8517,7 +8525,7 @@ static command_t CommandTable[] = { {"nack", CmdHf14AMfNack, IfPm3Iso14443a, "Test for MIFARE NACK bug"}, {"chk", CmdHF14AMfChk, IfPm3Iso14443a, "Check keys"}, {"fchk", CmdHF14AMfChk_fast, IfPm3Iso14443a, "Check keys fast, targets all keys on card"}, - {"decrypt", CmdHf14AMfDecryptBytes, AlwaysAvailable, "[nt] [ar_enc] [at_enc] [data] - to decrypt sniff or trace"}, + {"decrypt", CmdHf14AMfDecryptBytes, AlwaysAvailable, "Decrypt Crypto1 data from sniff or trace"}, {"supercard", CmdHf14AMfSuperCard, IfPm3Iso14443a, "Extract info from a `super card`"}, {"-----------", CmdHelp, IfPm3Iso14443a, "----------------------- " _CYAN_("operations") " -----------------------"}, {"auth4", CmdHF14AMfAuth4, IfPm3Iso14443a, "ISO14443-4 AES authentication"}, From 7835ca0f4c8367e488c59dd61959eb6a49495c54 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 00:25:37 +0200 Subject: [PATCH 615/924] fix wrong code commited --- client/src/cmdhfmf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index ec8703b68..cbca722cd 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -4000,10 +4000,10 @@ static int CmdHF14AMfKeyBrute(const char *Cmd) { */ void printKeyTable(size_t sectorscnt, sector_t *e_sector) { - return printKeyTableEx(sectorscnt, e_sector, 0, false); + return printKeyTableEx(sectorscnt, e_sector, 0); } -void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector, bool singel_sector) { +void printKeyTableEx(size_t sectorscnt, sector_t *e_sector, uint8_t start_sector) { char strA[26 + 1] = {0}; char strB[26 + 1] = {0}; char resA[20 + 1] = {0}; From 3f157d63d820da26a37f1dd93e1179f7dfa21648 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 00:46:12 +0200 Subject: [PATCH 616/924] fix text since we changed description of command text --- tools/pm3_tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pm3_tests.sh b/tools/pm3_tests.sh index a8ed2a196..3a69dd5bc 100755 --- a/tools/pm3_tests.sh +++ b/tools/pm3_tests.sh @@ -500,7 +500,7 @@ while true; do "Visa2000 - Card 112233, Raw: 564953320001B66900000183"; then break; fi echo -e "\n${C_BLUE}Testing HF:${C_NC}" - if ! CheckExecute "hf mf offline text" "$CLIENTBIN -c 'hf mf'" "at_enc"; then break; fi + if ! CheckExecute "hf mf offline text" "$CLIENTBIN -c 'hf mf'" "content from tag dump file"; then break; fi if ! CheckExecute slow retry ignore "hf mf hardnested long test" "$CLIENTBIN -c 'hf mf hardnested -t --tk 000000000000'" "found:"; then break; fi if ! CheckExecute slow "hf iclass loclass long test" "$CLIENTBIN -c 'hf iclass loclass --long'" "verified \( ok \)"; then break; fi if ! CheckExecute slow "emv long test" "$CLIENTBIN -c 'emv test -l'" "Test\(s\) \[ ok"; then break; fi From 17be2f6c3e4e7fbf7bce3aa31e44e902d1989387 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 01:44:34 +0200 Subject: [PATCH 617/924] remember to malloc space for the defaultPaths too --- client/src/fileutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 4dba2c1e4..ded0f615e 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -200,7 +200,7 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath // 1: null terminator // 16: room for filenum to ensure new filename // save_path_len + strlen(PATHSEP): the user preference save paths - const size_t len = p_namelen + strlen(suffix) + 1 + 16 + save_path_len + strlen(PATHSEP); + const size_t len = p_namelen + strlen(suffix) + 1 + 16 + save_path_len + strlen(PATHSEP) + strlen(g_session.defaultPaths[e_save_path]); char *fileName = (char *) calloc(len, sizeof(uint8_t)); if (fileName == NULL) { From 588dea40055a537188dc12b37fb623f62ba3a02d Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 08:44:16 +0200 Subject: [PATCH 618/924] still overflows on pentoo. Lets reserve the double the max. --- client/src/fileutils.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index ded0f615e..62930d138 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -190,17 +190,12 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath return NULL; } - uint16_t p_namelen = strlen(preferredName); - if (str_endswith(preferredName, suffix)) { - p_namelen -= strlen(suffix); - } - - int save_path_len = path_size(e_save_path); // 1: null terminator // 16: room for filenum to ensure new filename // save_path_len + strlen(PATHSEP): the user preference save paths - const size_t len = p_namelen + strlen(suffix) + 1 + 16 + save_path_len + strlen(PATHSEP) + strlen(g_session.defaultPaths[e_save_path]); + //const size_t len = p_namelen + strlen(suffix) + 1 + 16 + save_path_len + strlen(PATHSEP); + const size_t len = FILE_PATH_SIZE * 2; char *fileName = (char *) calloc(len, sizeof(uint8_t)); if (fileName == NULL) { @@ -210,17 +205,21 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath char *pfn = fileName; // user preference save paths + int save_path_len = path_size(e_save_path); if (save_path_len) { - snprintf(pfn, save_path_len + strlen(PATHSEP) + 1, "%s%s", g_session.defaultPaths[e_save_path], PATHSEP); + snprintf(pfn, len, "%s%s", g_session.defaultPaths[e_save_path], PATHSEP); pfn += save_path_len + strlen(PATHSEP); } - int num = 1; - + uint16_t p_namelen = strlen(preferredName); + if (str_endswith(preferredName, suffix)) { + p_namelen -= strlen(suffix); + } // modify filename snprintf(pfn, len, "%.*s%s", p_namelen, preferredName, suffix); // check complete path/filename if exists + int num = 1; while (fileExists(fileName)) { // modify filename snprintf(pfn, len, "%.*s-%03d%s", p_namelen, preferredName, num, suffix); From abd2f759ae04f76b1fc1d06c7a875d30496d2665 Mon Sep 17 00:00:00 2001 From: kormax Date: Mon, 10 Jul 2023 10:34:08 +0300 Subject: [PATCH 619/924] Fix potential memory leak in VAS implementation --- client/src/cmdhfvas.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index 839474cc5..034118d39 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -187,10 +187,9 @@ static int LoadReaderPrivateKey(uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair return PM3_EINVARG; } - tlvdb_free(derRoot); - if (mbedtls_ecp_point_read_binary(&privKey->grp, &privKey->Q, pubkeyCoordsTlv->value + 1, 65)) { PrintAndLogEx(FAILED, "Failed to read in public key coordinates"); + tlvdb_free(derRoot); return PM3_EINVARG; } @@ -199,6 +198,7 @@ static int LoadReaderPrivateKey(uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair return PM3_EINVARG; } + tlvdb_free(derRoot); return PM3_SUCCESS; } From 642cdd86d3f83a536c29c1ceccb4a7c690b65733 Mon Sep 17 00:00:00 2001 From: kormax Date: Mon, 10 Jul 2023 10:45:22 +0300 Subject: [PATCH 620/924] Add missing memory free --- client/src/cmdhfvas.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index 034118d39..d4c254508 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -195,6 +195,7 @@ static int LoadReaderPrivateKey(uint8_t *buf, size_t bufLen, mbedtls_ecp_keypair if (mbedtls_ecp_check_pubkey(&privKey->grp, &privKey->Q)) { PrintAndLogEx(FAILED, "VAS protocol requires an elliptic key on the P-256 curve"); + tlvdb_free(derRoot); return PM3_EINVARG; } From dd3e1d3730b071cbaa4144a2532f590f7e8eed07 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 16:36:57 +0200 Subject: [PATCH 621/924] added EMV READER command. It will try to extract information about the EMV application that is installed on the card. --- CHANGELOG.md | 1 + client/src/cmdhf14a.c | 2 +- client/src/emv/cmdemv.c | 545 ++++++++++++++++++++++++++++++--------- client/src/emv/emvcore.c | 12 +- client/src/emv/emvcore.h | 7 +- 5 files changed, 439 insertions(+), 128 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21b463b28..ed09b06ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added `emv reader` - act as a EMV reader (@iceman1001) - Added support for Apple Wallet NFC Passes with the Value Added Services protocol implementation (@gm3197) - Fix compiling liblua on iOS (@The-SamminAter) - Changed `hf_mf_luxeo_dump.lua` - now have list of keys to iterate (@iceman1001) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 7bdc04c06..a541baf2f 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -2363,7 +2363,7 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf st info`")); if (isEMV) - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`emv search -s`")); + PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`emv reader`")); if (isFUDAN) { PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf fudan dump`")); diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 71277d87b..720401bdb 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -34,6 +34,7 @@ #include "emv_tags.h" #include "fileutils.h" #include "protocols.h" // ISO7816 APDU return codes +#include "commonutil.h" // MemBeToUint2byte static int CmdHelp(const char *Cmd); @@ -74,6 +75,155 @@ static void PrintChannel(Iso7816CommandChannel channel) { } } +static int emv_parse_card_details(uint8_t *response, size_t reslen) { + + struct tlvdb *root = tlvdb_parse_multi(response, reslen); + if (root == NULL) { + return PM3_EINVARG; + } + + // extract application preferred name + struct tlvdb *prefname_full = tlvdb_find_full(root, 0x9F12); + if (prefname_full != NULL) { + const struct tlv *prefname_tlv = tlvdb_get_tlv(prefname_full); + if (prefname_tlv->len) { + char *name[64] = {0}; + size_t n = MIN(sizeof(name), prefname_tlv->len); + memcpy(name, prefname_tlv->value, n); + PrintAndLogEx(INFO, "Application.......... " _YELLOW_("%s"), name); + } + } + + // extract application label + struct tlvdb *alabel = tlvdb_find_full(root, 0x50); + if (alabel != NULL) { + const struct tlv *alabel_tlv = tlvdb_get_tlv(alabel); + if (alabel_tlv->len) { + char *name[64] = {0}; + size_t n = MIN(sizeof(name), alabel_tlv->len); + memcpy(name, alabel_tlv->value, n); + PrintAndLogEx(INFO, "Label................ " _YELLOW_("%s"), name); + } + } + + // extract language preference + struct tlvdb *lang_full = tlvdb_find_full(root, 0x5F2D); + if (lang_full != NULL) { + const struct tlv *lang_tlv = tlvdb_get_tlv(lang_full); + if (lang_tlv->len) { + char *lang[16] = {0}; + size_t n = MIN(sizeof(lang), lang_tlv->len); + memcpy(lang, lang_tlv->value, n); + PrintAndLogEx(INFO, "Language............. " _YELLOW_("%s"), lang); + } + } + + // Application Currency Code + struct tlvdb *acc_full = tlvdb_find_full(root, 0x9F42); + if (acc_full != NULL) { + const struct tlv *acc_tlv = tlvdb_get_tlv(acc_full); + if (acc_tlv->len == 2) { + uint16_t acc = MemBeToUint2byte((const uint8_t*)acc_tlv->value); + PrintAndLogEx(INFO, "Currency Code........ " _YELLOW_("%02X"), acc); + } + } + + // Application Effective Date + struct tlvdb *aeffect_full = tlvdb_find_full(root, 0x5F25); + if (aeffect_full != NULL) { + const struct tlv *aaeffect_tlv = tlvdb_get_tlv(aeffect_full); + if (aaeffect_tlv->len == 3) { + PrintAndLogEx(INFO, "Effective date....... " _YELLOW_("20%02x-%02x-%02x"), + aaeffect_tlv->value[0], + aaeffect_tlv->value[1], + aaeffect_tlv->value[2] + ); + } + } + + // Application Expiration Date + struct tlvdb *aexd_full = tlvdb_find_full(root, 0x5F24); + if (aexd_full != NULL) { + const struct tlv *aexd_tlv = tlvdb_get_tlv(aexd_full); + if (aexd_tlv->len == 3) { + PrintAndLogEx(INFO, "Expiration date...... " _YELLOW_("20%02x-%02x-%02x"), + aexd_tlv->value[0], + aexd_tlv->value[1], + aexd_tlv->value[2] + ); + } + } + + // Application Primary Account Number (PAN) + struct tlvdb *apan_full = tlvdb_find_full(root, 0x5A); + if (apan_full != NULL) { + const struct tlv *apan_tlv = tlvdb_get_tlv(apan_full); + if (apan_tlv->len == 8) { + PrintAndLogEx(INFO, "PAN.................. " _YELLOW_("%02x%02x %02x%02x %02x%02x %02x%02x"), + apan_tlv->value[0], + apan_tlv->value[1], + apan_tlv->value[2], + apan_tlv->value[3], + apan_tlv->value[4], + apan_tlv->value[5], + apan_tlv->value[6], + apan_tlv->value[7] + ); + } + } + + // Application Primary Account Number (PAN) sequence number + struct tlvdb *apansq_full = tlvdb_find_full(root, 0x5F34); + if (apansq_full != NULL) { + const struct tlv *apansq_tlv = tlvdb_get_tlv(apansq_full); + if (apansq_tlv->len == 1) { + PrintAndLogEx(INFO, "PAN Sequence......... " _YELLOW_("%u"), apansq_tlv->value[0]); + } + } + + // Cardholder Name + struct tlvdb *chm_full = tlvdb_find_full(root, 0x5F20); + if (chm_full != NULL) { + const struct tlv *chm_tlv = tlvdb_get_tlv(chm_full); + if (chm_tlv->len) { + PrintAndLogEx(INFO, "Cardhold Name........ " _YELLOW_("%s"), sprint_ascii(chm_tlv->value, chm_tlv->len)); + } + } + + // Track 1 Data + struct tlvdb *track1_full = tlvdb_find_full(root, 0x56); + if (track1_full != NULL) { + const struct tlv *track1_tlv = tlvdb_get_tlv(track1_full); + if (track1_tlv->len) { + PrintAndLogEx(INFO, "Track 1.............. " _YELLOW_("%s"), sprint_ascii(track1_tlv->value, track1_tlv->len)); + } + } + + // Track 2 Data + struct tlvdb *track2_full = tlvdb_find_full(root, 0x9F6B); + if (track2_full != NULL) { + const struct tlv *track2_tlv = tlvdb_get_tlv(track2_full); + if (track2_tlv->len) { + PrintAndLogEx(INFO, "Track 2.............. " _YELLOW_("%s"), sprint_hex_inrow(track2_tlv->value, track2_tlv->len)); + } + } + + // Track 2 Equivalent Data + struct tlvdb *track2_eq_full = tlvdb_find_full(root, 0x57); + if (track2_eq_full != NULL) { + const struct tlv *track2_eq_tlv = tlvdb_get_tlv(track2_eq_full); + if (track2_eq_tlv->len) { + PrintAndLogEx(INFO, "Track 2 equivalent... " _YELLOW_("%s"), sprint_hex_inrow(track2_eq_tlv->value, track2_eq_tlv->len)); + } + } + + // Track 3 Data + // to be impl. + + tlvdb_free(root); + return PM3_SUCCESS; +} + static int CmdEMVSelect(const char *Cmd) { uint8_t data[APDU_AID_LEN] = {0}; int datalen = 0; @@ -81,16 +231,16 @@ static int CmdEMVSelect(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "emv select", "Executes select applet command", - "emv select -s a00000000101 -> select card, select applet\n" + "emv select -s a00000000101 -> select card, select applet\n" "emv select -st a00000000101 -> select card, select applet, show result in TLV\n"); void *argtable[] = { arg_param_begin, - arg_lit0("sS", "select", "Activate field and select card"), - arg_lit0("kK", "keep", "Keep field for next command"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_lit0("s", "select", "Activate field and select card"), + arg_lit0("k", "keep", "Keep field for next command"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("t", "tlv", "TLV decode results"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), arg_str1(NULL, NULL, "", "Applet AID"), arg_param_end }; @@ -137,11 +287,11 @@ static int CmdEMVSearch(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("sS", "select", "Activate field and select card"), - arg_lit0("kK", "keep", "Keep field ON for next command"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results of selected applets"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_lit0("s", "select", "Activate field and select card"), + arg_lit0("k", "keep", "Keep field ON for next command"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("t", "tlv", "TLV decode results of selected applets"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -164,7 +314,7 @@ static int CmdEMVSearch(const char *Cmd) { const char *al = "Applets list"; struct tlvdb *t = tlvdb_fixed(1, strlen(al), (const unsigned char *)al); - if (EMVSearch(channel, activateField, leaveSignalON, decodeTLV, t)) { + if (EMVSearch(channel, activateField, leaveSignalON, decodeTLV, t, false)) { tlvdb_free(t); return PM3_ERFTRANS; } @@ -191,13 +341,13 @@ static int CmdEMVPPSE(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("sS", "select", "Activate field and select card"), - arg_lit0("kK", "keep", "Keep field ON for next command"), - arg_lit0("1", "pse", "PSE (1PAY.SYS.DDF01) mode"), - arg_lit0("2", "ppse", "PPSE (2PAY.SYS.DDF01) mode (def)"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results of selected applets"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_lit0("s", "select", "Activate field and select card"), + arg_lit0("k", "keep", "Keep field ON for next command"), + arg_lit0("1", "pse", "PSE (1PAY.SYS.DDF01) mode"), + arg_lit0("2", "ppse", "PPSE (2PAY.SYS.DDF01) mode (def)"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("t", "tlv", "TLV decode results of selected applets"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -251,13 +401,13 @@ static int CmdEMVGPO(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("kK", "keep", "Keep field ON for next command"), - arg_lit0("pP", "params", "Load parameters from `emv_defparams.json` file for PDOLdata making from PDOL and parameters"), - arg_lit0("mM", "make", "Make PDOLdata from PDOL (tag 9F38) and parameters (def: uses default parameters)"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results of selected applets"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), - arg_strx0(NULL, NULL, "", "PDOLdata/PDOL"), + arg_lit0("k", "keep", "Keep field ON for next command"), + arg_lit0("p", "params", "Load parameters from `emv_defparams.json` file for PDOLdata making from PDOL and parameters"), + arg_lit0("m", "make", "Make PDOLdata from PDOL (tag 9F38) and parameters (def: uses default parameters)"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("t", "tlv", "TLV decode results of selected applets"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_strx0(NULL, NULL, "", "PDOLdata/PDOL"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -360,11 +510,11 @@ static int CmdEMVReadRecord(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("kK", "keep", "Keep field ON for next command"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results of selected applets"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), - arg_strx1(NULL, NULL, "", "", "", "Terminal decision. aac - declined, tc - approved, arqc - online authorisation requested"), - arg_lit0("pP", "params", "Load parameters from `emv_defparams.json` file for CDOLdata making from CDOL and parameters"), - arg_lit0("mM", "make", "Make CDOLdata from CDOL (tag 8C and 8D) and parameters (def: use default parameters)"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results of selected applets"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), - arg_strx1(NULL, NULL, "", "CDOLdata/CDOL"), + arg_lit0("k", "keep", "Keep field ON for next command"), + arg_lit0("c", "cda", "Executes CDA transaction. Needs to get SDAD in results."), + arg_str0("d", "decision", "", "Terminal decision. aac - declined, tc - approved, arqc - online authorisation requested"), + arg_lit0("p", "params", "Load parameters from `emv_defparams.json` file for CDOLdata making from CDOL and parameters"), + arg_lit0("m", "make", "Make CDOLdata from CDOL (tag 8C and 8D) and parameters (def: use default parameters)"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("t", "tlv", "TLV decode results of selected applets"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_strx1(NULL, NULL, "", "CDOLdata/CDOL"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -542,9 +692,9 @@ static int CmdEMVGenerateChallenge(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("kK", "keep", "Keep field ON for next command"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_lit0("k", "keep", "Keep field ON for next command"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -594,13 +744,13 @@ static int CmdEMVInternalAuthenticate(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("kK", "keep", "Keep field ON for next command"), - arg_lit0("pP", "params", "Load parameters from `emv_defparams.json` file for DDOLdata making from DDOL and parameters"), - arg_lit0("mM", "make", "Make DDOLdata from DDOL (tag 9F49) and parameters (def: use default parameters)"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results of selected applets"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), - arg_strx1(NULL, NULL, "", "DDOLdata/DDOL"), + arg_lit0("k", "keep", "Keep field ON for next command"), + arg_lit0("p", "params", "Load parameters from `emv_defparams.json` file for DDOLdata making from DDOL and parameters"), + arg_lit0("m", "make", "Make DDOLdata from DDOL (tag 9F49) and parameters (def: use default parameters)"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("t", "tlv", "TLV decode results of selected applets"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_strx1(NULL, NULL, "", "DDOLdata/DDOL"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -718,6 +868,7 @@ static void InitTransactionParameters(struct tlvdb *tlvRoot, bool paramLoadJSON, TLV_ADD(0x9F66, "\x26\x00\x00\x00"); } break; + case TT_END: default: break; } @@ -799,20 +950,6 @@ static void ProcessACResponseFormat1(struct tlvdb *tlvRoot, uint8_t *buf, size_t } static int CmdEMVExec(const char *Cmd) { - uint8_t buf[APDU_RES_LEN] = {0}; - size_t len = 0; - uint16_t sw = 0; - uint8_t AID[APDU_AID_LEN] = {0}; - size_t AIDlen = 0; - uint8_t ODAiList[4096]; - size_t ODAiListLen = 0; - - int res; - - struct tlvdb *tlvSelect = NULL; - struct tlvdb *tlvRoot = NULL; - struct tlv *pdol_data_tlv = NULL; - CLIParserContext *ctx; CLIParserInit(&ctx, "emv exec", "Executes EMV contactless transaction", @@ -821,17 +958,17 @@ static int CmdEMVExec(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("sS", "select", "Activate field and select card"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results"), - arg_lit0("jJ", "jload", "Load transaction parameters from `emv_defparams.json` file"), - arg_lit0("fF", "forceaid", "Force search AID. Search AID instead of execute PPSE"), - arg_rem("By default:", "Transaction type - MSD"), - arg_lit0("vV", "qvsdc", "Transaction type - qVSDC or M/Chip"), - arg_lit0("cC", "qvsdccda", "Transaction type - qVSDC or M/Chip plus CDA (SDAD generation)"), - arg_lit0("xX", "vsdc", "Transaction type - VSDC. For test only. Not a standard behavior"), - arg_lit0("gG", "acgpo", "VISA. generate AC from GPO"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_lit0("s", "select", "Activate field and select card"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("t", "tlv", "TLV decode results"), + arg_lit0("j", "jload", "Load transaction parameters from `emv_defparams.json` file"), + arg_lit0(NULL, "force", "Force search AID. Search AID instead of execute PPSE"), + arg_rem("By default:", "Transaction type - MSD"), + arg_lit0("v", "qvsdc", "Transaction type - qVSDC or M/Chip"), + arg_lit0("c", "qvsdccda", "Transaction type - qVSDC or M/Chip plus CDA (SDAD generation)"), + arg_lit0("x", "vsdc", "Transaction type - VSDC. For test only. Not a standard behavior"), + arg_lit0("g", "acgpo", "VISA. generate AC from GPO"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -873,6 +1010,20 @@ static int CmdEMVExec(const char *Cmd) { SetAPDULogging(showAPDU); + uint8_t buf[APDU_RES_LEN] = {0}; + size_t len = 0; + uint16_t sw = 0; + uint8_t AID[APDU_AID_LEN] = {0}; + size_t AIDlen = 0; + uint8_t ODAiList[4096]; + size_t ODAiListLen = 0; + + int res; + + struct tlvdb *tlvSelect = NULL; + struct tlvdb *tlvRoot = NULL; + struct tlv *pdol_data_tlv = NULL; + // init applets list tree const char *al = "Applets list"; tlvSelect = tlvdb_fixed(1, strlen(al), (const unsigned char *)al); @@ -902,7 +1053,7 @@ static int CmdEMVExec(const char *Cmd) { if (!AIDlen) { PrintAndLogEx(NORMAL, "\n* Search AID in list."); SetAPDULogging(false); - if (EMVSearch(channel, activateField, true, decodeTLV, tlvSelect)) { + if (EMVSearch(channel, activateField, true, decodeTLV, tlvSelect, false)) { dreturn(PM3_ERFTRANS); } @@ -1428,15 +1579,6 @@ static int CmdEMVExec(const char *Cmd) { } static int CmdEMVScan(const char *Cmd) { - uint8_t AID[APDU_AID_LEN] = {0}; - size_t AIDlen = 0; - uint8_t buf[APDU_RES_LEN] = {0}; - size_t len = 0; - uint8_t ODAI_list[4096]; - size_t ODAI_listlen = 0; - uint16_t sw = 0; - int res; - CLIParserContext *ctx; CLIParserInit(&ctx, "emv scan", "Scan EMV card and save it contents to a file.\n" @@ -1447,18 +1589,18 @@ static int CmdEMVScan(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("tT", "tlv", "TLV decode results"), - arg_lit0("eE", "extract", "Extract TLV elements and fill Application Data"), - arg_lit0("jJ", "jload", "Load transaction parameters from `emv_defparams.json` file"), - arg_rem("By default:", "Transaction type - MSD"), - arg_lit0("vV", "qvsdc", "Transaction type - qVSDC or M/Chip"), - arg_lit0("cC", "qvsdccda", "Transaction type - qVSDC or M/Chip plus CDA (SDAD generation)"), - arg_lit0("xX", "vsdc", "Transaction type - VSDC. For test only. Not a standard behavior"), - arg_lit0("gG", "acgpo", "VISA. generate AC from GPO"), - arg_lit0("mM", "merge", "Merge output file with card's data. (warning: the file may be corrupted!)"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), - arg_str1(NULL, NULL, "", "JSON output filename"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("t", "tlv", "TLV decode results"), + arg_lit0("e", "extract", "Extract TLV elements and fill Application Data"), + arg_lit0("j", "jload", "Load transaction parameters from `emv_defparams.json` file"), + arg_rem("By default:", "Transaction type - MSD"), + arg_lit0("v", "qvsdc", "Transaction type - qVSDC or M/Chip"), + arg_lit0("c", "qvsdccda", "Transaction type - qVSDC or M/Chip plus CDA (SDAD generation)"), + arg_lit0("x", "vsdc", "Transaction type - VSDC. For test only. Not a standard behavior"), + arg_lit0("g", "acgpo", "VISA. generate AC from GPO"), + arg_lit0("m", "merge", "Merge output file with card's data. (warning: the file may be corrupted!)"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_str1(NULL, NULL, "", "JSON output file name"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1502,6 +1644,15 @@ static int CmdEMVScan(const char *Cmd) { SetAPDULogging(showAPDU); + uint8_t AID[APDU_AID_LEN] = {0}; + size_t AIDlen = 0; + uint8_t buf[APDU_RES_LEN] = {0}; + size_t len = 0; + uint8_t ODAI_list[4096]; + size_t ODAI_listlen = 0; + uint16_t sw = 0; + int res; + json_t *root; json_error_t error; @@ -1587,7 +1738,7 @@ static int CmdEMVScan(const char *Cmd) { // EMV SEARCH with AID list SetAPDULogging(false); PrintAndLogEx(INFO, "AID search."); - if (EMVSearch(channel, false, true, decodeTLV, tlvSelect)) { + if (EMVSearch(channel, false, true, decodeTLV, tlvSelect, false)) { PrintAndLogEx(ERR, "Can't found any of EMV AID, exiting..."); tlvdb_free(tlvSelect); DropFieldEx(channel); @@ -1852,15 +2003,6 @@ static int CmdEMVTest(const char *Cmd) { } static int CmdEMVRoca(const char *Cmd) { - uint8_t AID[APDU_AID_LEN] = {0}; - size_t AIDlen = 0; - uint8_t buf[APDU_RES_LEN] = {0}; - size_t len = 0; - uint16_t sw = 0; - uint8_t ODAI_list[4096]; - size_t ODAI_listlen = 0; - int res; - CLIParserContext *ctx; CLIParserInit(&ctx, "emv roca", "Tries to extract public keys and run the ROCA test against them.\n", @@ -1870,9 +2012,9 @@ static int CmdEMVRoca(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_lit0("tT", "selftest", "Self test"), - arg_lit0("aA", "apdu", "Show APDU requests and responses"), - arg_lit0("wW", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_lit0("t", "selftest", "Self test"), + arg_lit0("a", "apdu", "Show APDU requests and responses"), + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -1903,6 +2045,15 @@ static int CmdEMVRoca(const char *Cmd) { SetAPDULogging(show_apdu); + uint8_t AID[APDU_AID_LEN] = {0}; + size_t AIDlen = 0; + uint8_t buf[APDU_RES_LEN] = {0}; + size_t len = 0; + uint16_t sw = 0; + uint8_t ODAI_list[4096]; + size_t ODAI_listlen = 0; + int res; + // init applets list tree const char *al = "Applets list"; struct tlvdb *tlvSelect = tlvdb_fixed(1, strlen(al), (const unsigned char *)al); @@ -1917,7 +2068,7 @@ static int CmdEMVRoca(const char *Cmd) { } else { // EMV SEARCH with AID list PrintAndLogEx(INFO, "starting AID search"); - if (EMVSearch(channel, false, true, false, tlvSelect)) { + if (EMVSearch(channel, false, true, false, tlvSelect, false)) { PrintAndLogEx(ERR, "Can't found any of EMV AID, exiting"); tlvdb_free(tlvSelect); DropFieldEx(channel); @@ -2121,28 +2272,182 @@ out: return ret; } +static int CmdEMVReader(const char *Cmd){ + CLIParserContext *ctx; + CLIParserInit(&ctx, "emv reader", + "Act as a EMV reader to identify tag. Look for EMV tags until Enter or the pm3 button is pressed", + "emv reader\n" + "emv reader -@ -> Continuous mode\n" + ); + void *argtable[] = { + arg_param_begin, + arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_lit0("@", NULL, "continuous reader mode"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + Iso7816CommandChannel channel = CC_CONTACTLESS; + if (arg_get_lit(ctx, 1)) { + channel = CC_CONTACT; + } + + uint8_t psenum = (channel == CC_CONTACT) ? 1 : 2; + + bool continuous = arg_get_lit(ctx, 2); + CLIParserFree(ctx); + + if (continuous) { + PrintAndLogEx(INFO, "Press " _GREEN_("Enter") " to exit"); + } + + + uint8_t AID[APDU_AID_LEN] = {0}; + size_t AIDlen = 0; + uint8_t buf[APDU_RES_LEN] = {0}; + size_t len = 0; + int res = 0; + uint16_t sw = 0; + + do { + if (continuous && kbd_enter_pressed()) { + break; + } + + // init applets list tree + const char *al = "Applets"; + struct tlvdb *tlvSelect = tlvdb_fixed(1, strlen(al), (const unsigned char *)al); + + res = EMVSelectPSE(channel, true, true, 2, buf, sizeof(buf), &len, &sw); + + // search PSE / PPSE + res = EMVSearchPSE(channel, false, true, psenum, false, tlvSelect); + if (res) { + // EMV SEARCH with AID list + DropFieldEx(channel); + if (EMVSearch(channel, true, true, false, tlvSelect, false)) { + tlvdb_free(tlvSelect); + DropFieldEx(channel); + continue; + } + } + + // select application + EMVSelectApplication(tlvSelect, AID, &AIDlen); + tlvdb_free(tlvSelect); + + if (AIDlen == 0) { + DropFieldEx(channel); + continue; + } + + // Init TLV tree + const char *alr = "Root"; + struct tlvdb *tlvRoot = tlvdb_fixed(1, strlen(alr), (const unsigned char *)alr); + + // EMV SELECT applet + res = EMVSelect(channel, false, true, AID, AIDlen, buf, sizeof(buf), &len, &sw, tlvRoot); + if (res) { + DropFieldEx(channel); + continue; + } + + // decode application parts + emv_parse_card_details(buf, len); + + for (TransactionType_t tt = TT_MSD; tt < TT_END; tt++) { + + // create transaction parameters + bool gen_acgpo = false; + InitTransactionParameters(tlvRoot, false, tt, gen_acgpo); + + struct tlv *pdol_tlv = dol_process(tlvdb_get(tlvRoot, 0x9F38, NULL), tlvRoot, 0x83); + if (!pdol_tlv) { + continue; + } + + size_t pdtd_len = 0; + unsigned char *pdol_data_tlv = tlv_encode(pdol_tlv, &pdtd_len); + if (!pdol_data_tlv) { + free(pdol_tlv); + continue; + } + + res = EMVGPO(channel, true, pdol_data_tlv, pdtd_len, buf, sizeof(buf), &len, &sw, tlvRoot); + free(pdol_data_tlv); + free(pdol_tlv); + + if (res) { + continue; + } + + ProcessGPOResponseFormat1(tlvRoot, buf, len, false); + + emv_parse_card_details(buf, len); + + if (tlvdb_get(tlvRoot, 0x77, NULL)) { + break; + } + } + + const struct tlv *AFL = tlvdb_get(tlvRoot, 0x94, NULL); + + if (AFL && AFL->len) { + + if (AFL->len % 4) { + continue; + } + + for (int i = 0; i < AFL->len / 4; i++) { + uint8_t SFI = AFL->value[i * 4 + 0] >> 3; + uint8_t SFIstart = AFL->value[i * 4 + 1]; + uint8_t SFIend = AFL->value[i * 4 + 2]; + + if (SFI == 0 || SFI == 31 || SFIstart == 0 || SFIstart > SFIend) { + continue; + } + + for (int n = SFIstart; n <= SFIend; n++) { + res = EMVReadRecord(channel, true, SFI, n, buf, sizeof(buf), &len, &sw, tlvRoot); + if (res) { + continue; + } + emv_parse_card_details(buf, len); + } + } + } + + } while (continuous); + + return PM3_SUCCESS; +} + static command_t CommandTable[] = { + {"-----------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("general") " -----------------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"list", CmdEMVList, AlwaysAvailable, "List ISO7816 history"}, + {"test", CmdEMVTest, AlwaysAvailable, "Crypto logic test"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "---------------------- " _CYAN_("operations") " ---------------------"}, + {"challenge", CmdEMVGenerateChallenge, IfPm3Iso14443, "Generate challenge"}, {"exec", CmdEMVExec, IfPm3Iso14443, "Executes EMV contactless transaction"}, + {"genac", CmdEMVAC, IfPm3Iso14443, "Generate ApplicationCryptogram"}, + {"gpo", CmdEMVGPO, IfPm3Iso14443, "Execute GetProcessingOptions"}, + {"intauth", CmdEMVInternalAuthenticate, IfPm3Iso14443, "Internal authentication"}, {"pse", CmdEMVPPSE, IfPm3Iso14443, "Execute PPSE. It selects 2PAY.SYS.DDF01 or 1PAY.SYS.DDF01 directory"}, + {"reader", CmdEMVReader, IfPm3Iso14443a, "Act like an EMV reader"}, + {"readrec", CmdEMVReadRecord, IfPm3Iso14443, "Read files from card"}, + {"roca", CmdEMVRoca, IfPm3Iso14443, "Extract public keys and run ROCA test"}, + {"scan", CmdEMVScan, IfPm3Iso14443, "Scan EMV card and save it contents to json file for emulator"}, {"search", CmdEMVSearch, IfPm3Iso14443, "Try to select all applets from applets list and print installed applets"}, {"select", CmdEMVSelect, IfPm3Iso14443, "Select applet"}, - {"gpo", CmdEMVGPO, IfPm3Iso14443, "Execute GetProcessingOptions"}, - {"readrec", CmdEMVReadRecord, IfPm3Iso14443, "Read files from card"}, - {"genac", CmdEMVAC, IfPm3Iso14443, "Generate ApplicationCryptogram"}, - {"challenge", CmdEMVGenerateChallenge, IfPm3Iso14443, "Generate challenge"}, - {"intauth", CmdEMVInternalAuthenticate, IfPm3Iso14443, "Internal authentication"}, - {"scan", CmdEMVScan, IfPm3Iso14443, "Scan EMV card and save it contents to json file for emulator"}, - {"test", CmdEMVTest, AlwaysAvailable, "Crypto logic test"}, /* + {"-----------", CmdHelp, IfPm3Iso14443a, "---------------------- " _CYAN_("simulation") " ---------------------"}, {"getrng", CmdEMVGetrng, IfPm3Iso14443, "get random number from terminal"}, {"eload", CmdEmvELoad, IfPm3Iso14443, "load EMV tag into device"}, {"dump", CmdEmvDump, IfPm3Iso14443, "dump EMV tag values"}, {"sim", CmdEmvSim, IfPm3Iso14443, "simulate EMV tag"}, {"clone", CmdEmvClone, IfPm3Iso14443, "clone an EMV tag"}, */ - {"list", CmdEMVList, AlwaysAvailable, "List ISO7816 history"}, - {"roca", CmdEMVRoca, IfPm3Iso14443, "Extract public keys and run ROCA test"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/emv/emvcore.c b/client/src/emv/emvcore.c index 0628fcf76..45a415f41 100644 --- a/client/src/emv/emvcore.c +++ b/client/src/emv/emvcore.c @@ -204,7 +204,7 @@ void TLVPrintAIDlistFromSelectTLV(struct tlvdb *tlv) { break; } PrintAndLogEx(INFO, "| %s| %s | %s|", - sprint_hex_inrow_ex(tgAID->value, tgAID->len, 17), + sprint_hex_inrow_ex(tgAID->value, tgAID->len, 16), (tgPrio) ? sprint_hex(tgPrio->value, 1) : " ", (tgName) ? sprint_ascii_ex(tgName->value, tgName->len, 24) : " "); @@ -473,7 +473,7 @@ int EMVSearchPSE(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFi return res; } -int EMVSearch(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFieldON, bool decodeTLV, struct tlvdb *tlv) { +int EMVSearch(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFieldON, bool decodeTLV, struct tlvdb *tlv, bool verbose) { uint8_t aidbuf[APDU_AID_LEN] = {0}; int aidlen = 0; uint8_t data[APDU_RES_LEN] = {0}; @@ -500,12 +500,16 @@ int EMVSearch(Iso7816CommandChannel channel, bool ActivateField, bool LeaveField if (LeaveFieldON == false) DropFieldEx(channel); - PrintAndLogEx(WARNING, "exiting..."); + if (verbose) { + PrintAndLogEx(WARNING, "exiting..."); + } return 1; } retrycnt = 0; - PrintAndLogEx(FAILED, "Retry failed [%s]. Skipped...", AIDlist[i].aid); + if (verbose) { + PrintAndLogEx(FAILED, "Retry failed [%s]. Skipped...", AIDlist[i].aid); + } } continue; } diff --git a/client/src/emv/emvcore.h b/client/src/emv/emvcore.h index bb76aeb2f..6cf646c60 100644 --- a/client/src/emv/emvcore.h +++ b/client/src/emv/emvcore.h @@ -28,12 +28,13 @@ #include "iso7816/iso7816core.h" #include "emv_pki.h" -enum TransactionType { +typedef enum TransactionType { TT_MSD, TT_VSDC, // contact only. not standard for contactless TT_QVSDCMCHIP, TT_CDA, -}; + TT_END, +} TransactionType_t; extern const char *TransactionTypeStr[]; enum CardPSVendor { @@ -62,7 +63,7 @@ int EMVExchange(Iso7816CommandChannel channel, bool LeaveFieldON, sAPDU_t apdu, // search application int EMVSearchPSE(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t PSENum, bool decodeTLV, struct tlvdb *tlv); -int EMVSearch(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFieldON, bool decodeTLV, struct tlvdb *tlv); +int EMVSearch(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFieldON, bool decodeTLV, struct tlvdb *tlv, bool verbose); int EMVSelectPSE(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t PSENum, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw); int EMVSelect(Iso7816CommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t *AID, size_t AIDLen, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv); // select application From 46fc20165ba9fceab8a6350e58ae2e2a84859471 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 16:37:30 +0200 Subject: [PATCH 622/924] reduce size since this wasnt the root cause --- client/src/fileutils.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 62930d138..f266da9b2 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -190,12 +190,11 @@ char *newfilenamemcopyEx(const char *preferredName, const char *suffix, savePath return NULL; } - // 1: null terminator // 16: room for filenum to ensure new filename // save_path_len + strlen(PATHSEP): the user preference save paths //const size_t len = p_namelen + strlen(suffix) + 1 + 16 + save_path_len + strlen(PATHSEP); - const size_t len = FILE_PATH_SIZE * 2; + const size_t len = FILE_PATH_SIZE; char *fileName = (char *) calloc(len, sizeof(uint8_t)); if (fileName == NULL) { From 40534d1f07dad9f0b6e9248883b6dbfd2c76253e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 16:41:00 +0200 Subject: [PATCH 623/924] style --- client/src/cmdhf14a.c | 2 +- client/src/cmdhfvas.c | 14 +- client/src/emv/cmdemv.c | 62 +- client/src/pm3line_vocabulory.h | 1529 ++++++++++++++++--------------- doc/commands.json | 201 ++-- doc/commands.md | 45 +- 6 files changed, 967 insertions(+), 886 deletions(-) diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index a541baf2f..8acf021cc 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -194,7 +194,7 @@ static const hintAIDList_t hintAIDList[] = { { "\x32\x50\x41\x59\x2E\x53\x59\x53\x2E\x44\x44\x46\x30\x31", 14, "EMV (ppse)", "emv" }, { "\x41\x44\x20\x46\x31", 5, "CIPURSE", "hf cipurse" }, { "\xd2\x76\x00\x00\x85\x01\x00", 7, "desfire", "hf mfdes" }, - { "\x4F\x53\x45\x2E\x56\x41\x53\x2E\x30\x31",10, "Apple VAS", "hf vas"}, + { "\x4F\x53\x45\x2E\x56\x41\x53\x2E\x30\x31", 10, "Apple VAS", "hf vas"}, }; // iso14a apdu input frame length diff --git a/client/src/cmdhfvas.c b/client/src/cmdhfvas.c index d4c254508..2bb5c8341 100644 --- a/client/src/cmdhfvas.c +++ b/client/src/cmdhfvas.c @@ -235,7 +235,7 @@ static int LoadMobileEphemeralKey(uint8_t *xcoordBuf, mbedtls_ecp_keypair *pubKe } static int internalVasDecrypt(uint8_t *cipherText, size_t cipherTextLen, uint8_t *sharedSecret, - uint8_t *ansiSharedInfo, size_t ansiSharedInfoLen, + uint8_t *ansiSharedInfo, size_t ansiSharedInfoLen, uint8_t *gcmAad, size_t gcmAadLen, uint8_t *out, size_t *outLen) { uint8_t key[32] = {0}; if (ansi_x963_sha256(sharedSecret, 32, ansiSharedInfo, ansiSharedInfoLen, sizeof(key), key)) { @@ -394,9 +394,9 @@ static int CmdVASReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf vas reader", "Read and decrypt Value Added Services (VAS) message", - "hf vas reader --url https://example.com -> URL Only mode\n" + "hf vas reader --url https://example.com -> URL Only mode\n" "hf vas reader --pid pass.com.passkit.pksamples.nfcdemo -f vas_privkey.der -@\n" - ); + ); void *argtable[] = { arg_param_begin, @@ -468,8 +468,8 @@ static int CmdVASReader(const char *Cmd) { if (continuous && kbd_enter_pressed()) { break; } - - res = VASReader( (pidlen > 0) ? pidhash : NULL, url, urllen, cryptogram, &clen, verbose); + + res = VASReader((pidlen > 0) ? pidhash : NULL, url, urllen, cryptogram, &clen, verbose); if (res == PM3_SUCCESS) { res = DecryptVASCryptogram(pidhash, cryptogram, clen, &privKey, msg, &mlen, ×tamp); @@ -482,7 +482,7 @@ static int CmdVASReader(const char *Cmd) { } } } - msleep(300); + msleep(300); } while (continuous); mbedtls_ecp_keypair_free(&privKey); @@ -494,7 +494,7 @@ static int CmdVASDecrypt(const char *Cmd) { CLIParserInit(&ctx, "hf vas decrypt", "Decrypt a previously captured cryptogram", "hf vas decrypt --pid pass.com.passkit.pksamples.nfcdemo -f vas_privkey.der -d c0b77375eae416b79449347f9fe838c05cdb57dc7470b97b93b806cb348771d9bfbe29d58538c7c7d7c3d015fa205b68bfccd726058a62f7f44085ac98dbf877120fd9059f1507b956e0a6d56d0a\n" - ); + ); void *argtable[] = { arg_param_begin, diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 720401bdb..87ebd4930 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -76,7 +76,7 @@ static void PrintChannel(Iso7816CommandChannel channel) { } static int emv_parse_card_details(uint8_t *response, size_t reslen) { - + struct tlvdb *root = tlvdb_parse_multi(response, reslen); if (root == NULL) { return PM3_EINVARG; @@ -123,7 +123,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { if (acc_full != NULL) { const struct tlv *acc_tlv = tlvdb_get_tlv(acc_full); if (acc_tlv->len == 2) { - uint16_t acc = MemBeToUint2byte((const uint8_t*)acc_tlv->value); + uint16_t acc = MemBeToUint2byte((const uint8_t *)acc_tlv->value); PrintAndLogEx(INFO, "Currency Code........ " _YELLOW_("%02X"), acc); } } @@ -132,12 +132,12 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { struct tlvdb *aeffect_full = tlvdb_find_full(root, 0x5F25); if (aeffect_full != NULL) { const struct tlv *aaeffect_tlv = tlvdb_get_tlv(aeffect_full); - if (aaeffect_tlv->len == 3) { + if (aaeffect_tlv->len == 3) { PrintAndLogEx(INFO, "Effective date....... " _YELLOW_("20%02x-%02x-%02x"), - aaeffect_tlv->value[0], - aaeffect_tlv->value[1], - aaeffect_tlv->value[2] - ); + aaeffect_tlv->value[0], + aaeffect_tlv->value[1], + aaeffect_tlv->value[2] + ); } } @@ -145,12 +145,12 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { struct tlvdb *aexd_full = tlvdb_find_full(root, 0x5F24); if (aexd_full != NULL) { const struct tlv *aexd_tlv = tlvdb_get_tlv(aexd_full); - if (aexd_tlv->len == 3) { + if (aexd_tlv->len == 3) { PrintAndLogEx(INFO, "Expiration date...... " _YELLOW_("20%02x-%02x-%02x"), - aexd_tlv->value[0], - aexd_tlv->value[1], - aexd_tlv->value[2] - ); + aexd_tlv->value[0], + aexd_tlv->value[1], + aexd_tlv->value[2] + ); } } @@ -158,17 +158,17 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { struct tlvdb *apan_full = tlvdb_find_full(root, 0x5A); if (apan_full != NULL) { const struct tlv *apan_tlv = tlvdb_get_tlv(apan_full); - if (apan_tlv->len == 8) { + if (apan_tlv->len == 8) { PrintAndLogEx(INFO, "PAN.................. " _YELLOW_("%02x%02x %02x%02x %02x%02x %02x%02x"), - apan_tlv->value[0], - apan_tlv->value[1], - apan_tlv->value[2], - apan_tlv->value[3], - apan_tlv->value[4], - apan_tlv->value[5], - apan_tlv->value[6], - apan_tlv->value[7] - ); + apan_tlv->value[0], + apan_tlv->value[1], + apan_tlv->value[2], + apan_tlv->value[3], + apan_tlv->value[4], + apan_tlv->value[5], + apan_tlv->value[6], + apan_tlv->value[7] + ); } } @@ -176,7 +176,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { struct tlvdb *apansq_full = tlvdb_find_full(root, 0x5F34); if (apansq_full != NULL) { const struct tlv *apansq_tlv = tlvdb_get_tlv(apansq_full); - if (apansq_tlv->len == 1) { + if (apansq_tlv->len == 1) { PrintAndLogEx(INFO, "PAN Sequence......... " _YELLOW_("%u"), apansq_tlv->value[0]); } } @@ -185,7 +185,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { struct tlvdb *chm_full = tlvdb_find_full(root, 0x5F20); if (chm_full != NULL) { const struct tlv *chm_tlv = tlvdb_get_tlv(chm_full); - if (chm_tlv->len) { + if (chm_tlv->len) { PrintAndLogEx(INFO, "Cardhold Name........ " _YELLOW_("%s"), sprint_ascii(chm_tlv->value, chm_tlv->len)); } } @@ -194,7 +194,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { struct tlvdb *track1_full = tlvdb_find_full(root, 0x56); if (track1_full != NULL) { const struct tlv *track1_tlv = tlvdb_get_tlv(track1_full); - if (track1_tlv->len) { + if (track1_tlv->len) { PrintAndLogEx(INFO, "Track 1.............. " _YELLOW_("%s"), sprint_ascii(track1_tlv->value, track1_tlv->len)); } } @@ -203,7 +203,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { struct tlvdb *track2_full = tlvdb_find_full(root, 0x9F6B); if (track2_full != NULL) { const struct tlv *track2_tlv = tlvdb_get_tlv(track2_full); - if (track2_tlv->len) { + if (track2_tlv->len) { PrintAndLogEx(INFO, "Track 2.............. " _YELLOW_("%s"), sprint_hex_inrow(track2_tlv->value, track2_tlv->len)); } } @@ -212,7 +212,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { struct tlvdb *track2_eq_full = tlvdb_find_full(root, 0x57); if (track2_eq_full != NULL) { const struct tlv *track2_eq_tlv = tlvdb_get_tlv(track2_eq_full); - if (track2_eq_tlv->len) { + if (track2_eq_tlv->len) { PrintAndLogEx(INFO, "Track 2 equivalent... " _YELLOW_("%s"), sprint_hex_inrow(track2_eq_tlv->value, track2_eq_tlv->len)); } } @@ -2272,7 +2272,7 @@ out: return ret; } -static int CmdEMVReader(const char *Cmd){ +static int CmdEMVReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "emv reader", "Act as a EMV reader to identify tag. Look for EMV tags until Enter or the pm3 button is pressed", @@ -2385,9 +2385,9 @@ static int CmdEMVReader(const char *Cmd){ emv_parse_card_details(buf, len); - if (tlvdb_get(tlvRoot, 0x77, NULL)) { + if (tlvdb_get(tlvRoot, 0x77, NULL)) { break; - } + } } const struct tlv *AFL = tlvdb_get(tlvRoot, 0x94, NULL); @@ -2441,7 +2441,7 @@ static command_t CommandTable[] = { {"search", CmdEMVSearch, IfPm3Iso14443, "Try to select all applets from applets list and print installed applets"}, {"select", CmdEMVSelect, IfPm3Iso14443, "Select applet"}, /* - {"-----------", CmdHelp, IfPm3Iso14443a, "---------------------- " _CYAN_("simulation") " ---------------------"}, + {"-----------", CmdHelp, IfPm3Iso14443a, "---------------------- " _CYAN_("simulation") " ---------------------"}, {"getrng", CmdEMVGetrng, IfPm3Iso14443, "get random number from terminal"}, {"eload", CmdEmvELoad, IfPm3Iso14443, "load EMV tag into device"}, {"dump", CmdEmvDump, IfPm3Iso14443, "dump EMV tag values"}, diff --git a/client/src/pm3line_vocabulory.h b/client/src/pm3line_vocabulory.h index 7284af351..950d8816f 100644 --- a/client/src/pm3line_vocabulory.h +++ b/client/src/pm3line_vocabulory.h @@ -31,767 +31,772 @@ typedef struct vocabulory_s { } vocabulory_t; const static vocabulory_t vocabulory[] = { - { 1, "help" }, - { 0, "auto" }, - { 1, "clear" }, - { 1, "hints" }, - { 1, "msleep" }, - { 1, "rem" }, - { 1, "quit" }, - { 1, "exit" }, - { 1, "prefs help" }, - { 1, "prefs show" }, - { 1, "prefs get barmode" }, - { 1, "prefs get clientdebug" }, - { 1, "prefs get clientdelay" }, - { 1, "prefs get color" }, - { 1, "prefs get savepaths" }, - { 1, "prefs get emoji" }, - { 1, "prefs get hints" }, - { 1, "prefs get output" }, - { 1, "prefs get plotsliders" }, - { 1, "prefs set help" }, - { 1, "prefs set barmode" }, - { 1, "prefs set clientdebug" }, - { 1, "prefs set clientdelay" }, - { 1, "prefs set color" }, - { 1, "prefs set emoji" }, - { 1, "prefs set hints" }, - { 1, "prefs set savepaths" }, - { 1, "prefs set output" }, - { 1, "prefs set plotsliders" }, - { 1, "analyse help" }, - { 1, "analyse lcr" }, - { 1, "analyse crc" }, - { 1, "analyse chksum" }, - { 1, "analyse dates" }, - { 1, "analyse lfsr" }, - { 1, "analyse a" }, - { 1, "analyse nuid" }, - { 1, "analyse demodbuff" }, - { 1, "analyse freq" }, - { 1, "analyse foo" }, - { 1, "analyse units" }, - { 1, "data help" }, - { 1, "data biphaserawdecode" }, - { 1, "data detectclock" }, - { 1, "data fsktonrz" }, - { 1, "data manrawdecode" }, - { 1, "data modulation" }, - { 1, "data rawdemod" }, - { 1, "data askedgedetect" }, - { 1, "data autocorr" }, - { 1, "data dirthreshold" }, - { 1, "data decimate" }, - { 1, "data undecimate" }, - { 1, "data hide" }, - { 1, "data hpf" }, - { 1, "data iir" }, - { 1, "data grid" }, - { 1, "data ltrim" }, - { 1, "data mtrim" }, - { 1, "data norm" }, - { 1, "data plot" }, - { 1, "data rtrim" }, - { 1, "data setgraphmarkers" }, - { 1, "data shiftgraphzero" }, - { 1, "data timescale" }, - { 1, "data zerocrossings" }, - { 1, "data convertbitstream" }, - { 1, "data getbitstream" }, - { 1, "data asn1" }, - { 1, "data bin2hex" }, - { 0, "data bitsamples" }, - { 1, "data clear" }, - { 1, "data diff" }, - { 0, "data hexsamples" }, - { 1, "data hex2bin" }, - { 1, "data load" }, - { 1, "data num" }, - { 1, "data print" }, - { 0, "data samples" }, - { 1, "data save" }, - { 1, "data setdebugmode" }, - { 0, "data tune" }, - { 1, "emv help" }, - { 0, "emv exec" }, - { 0, "emv pse" }, - { 0, "emv search" }, - { 0, "emv select" }, - { 0, "emv gpo" }, - { 0, "emv readrec" }, - { 0, "emv genac" }, - { 0, "emv challenge" }, - { 0, "emv intauth" }, - { 0, "emv scan" }, - { 1, "emv test" }, - { 1, "emv list" }, - { 0, "emv roca" }, - { 1, "hf help" }, - { 1, "hf list" }, - { 0, "hf plot" }, - { 0, "hf tune" }, - { 1, "hf search" }, - { 0, "hf sniff" }, - { 1, "hf 14a help" }, - { 1, "hf 14a list" }, - { 0, "hf 14a antifuzz" }, - { 0, "hf 14a config" }, - { 0, "hf 14a cuids" }, - { 0, "hf 14a info" }, - { 0, "hf 14a sim" }, - { 0, "hf 14a sniff" }, - { 0, "hf 14a raw" }, - { 0, "hf 14a reader" }, - { 0, "hf 14a apdu" }, - { 0, "hf 14a apdufind" }, - { 0, "hf 14a chaining" }, - { 0, "hf 14a ndefformat" }, - { 0, "hf 14a ndefread" }, - { 0, "hf 14a ndefwrite" }, - { 1, "hf 14b help" }, - { 0, "hf 14b apdu" }, - { 0, "hf 14b dump" }, - { 0, "hf 14b info" }, - { 1, "hf 14b list" }, - { 0, "hf 14b ndefread" }, - { 0, "hf 14b raw" }, - { 0, "hf 14b reader" }, - { 0, "hf 14b sim" }, - { 0, "hf 14b sniff" }, - { 0, "hf 14b rdbl" }, - { 0, "hf 14b sriwrite" }, - { 1, "hf 14b view" }, - { 1, "hf 15 help" }, - { 1, "hf 15 list" }, - { 1, "hf 15 demod" }, - { 0, "hf 15 dump" }, - { 0, "hf 15 info" }, - { 0, "hf 15 sniff" }, - { 0, "hf 15 raw" }, - { 0, "hf 15 rdbl" }, - { 0, "hf 15 rdmulti" }, - { 0, "hf 15 reader" }, - { 0, "hf 15 restore" }, - { 0, "hf 15 samples" }, - { 0, "hf 15 eload" }, - { 0, "hf 15 esave" }, - { 0, "hf 15 eview" }, - { 0, "hf 15 sim" }, - { 0, "hf 15 slixwritepwd" }, - { 0, "hf 15 slixeasdisable" }, - { 0, "hf 15 slixeasenable" }, - { 0, "hf 15 slixprivacydisable" }, - { 0, "hf 15 slixprivacyenable" }, - { 0, "hf 15 passprotectafi" }, - { 0, "hf 15 passprotecteas" }, - { 0, "hf 15 wrbl" }, - { 0, "hf 15 findafi" }, - { 0, "hf 15 writeafi" }, - { 0, "hf 15 writedsfid" }, - { 0, "hf 15 csetuid" }, - { 1, "hf cipurse help" }, - { 0, "hf cipurse info" }, - { 0, "hf cipurse select" }, - { 0, "hf cipurse auth" }, - { 0, "hf cipurse read" }, - { 0, "hf cipurse write" }, - { 0, "hf cipurse aread" }, - { 0, "hf cipurse awrite" }, - { 0, "hf cipurse formatall" }, - { 0, "hf cipurse create" }, - { 0, "hf cipurse delete" }, - { 0, "hf cipurse updkey" }, - { 0, "hf cipurse updakey" }, - { 0, "hf cipurse default" }, - { 1, "hf cipurse test" }, - { 1, "hf epa help" }, - { 0, "hf epa cnonces" }, - { 0, "hf epa replay" }, - { 0, "hf epa sim" }, - { 1, "hf emrtd help" }, - { 0, "hf emrtd dump" }, - { 1, "hf emrtd info" }, - { 1, "hf emrtd list" }, - { 1, "hf felica help" }, - { 1, "hf felica list" }, - { 0, "hf felica reader" }, - { 0, "hf felica info" }, - { 0, "hf felica sniff" }, - { 0, "hf felica raw" }, - { 0, "hf felica rdbl" }, - { 0, "hf felica wrbl" }, - { 0, "hf felica rqservice" }, - { 0, "hf felica rqresponse" }, - { 0, "hf felica scsvcode" }, - { 0, "hf felica rqsyscode" }, - { 0, "hf felica auth1" }, - { 0, "hf felica auth2" }, - { 0, "hf felica rqspecver" }, - { 0, "hf felica resetmode" }, - { 0, "hf felica litesim" }, - { 0, "hf felica litedump" }, - { 1, "hf fido help" }, - { 1, "hf fido list" }, - { 0, "hf fido info" }, - { 0, "hf fido reg" }, - { 0, "hf fido auth" }, - { 0, "hf fido make" }, - { 0, "hf fido assert" }, - { 1, "hf fudan help" }, - { 0, "hf fudan reader" }, - { 0, "hf fudan dump" }, - { 0, "hf fudan rdbl" }, - { 1, "hf fudan view" }, - { 0, "hf fudan wrbl" }, - { 1, "hf gallagher help" }, - { 0, "hf gallagher reader" }, - { 0, "hf gallagher clone" }, - { 0, "hf gallagher delete" }, - { 1, "hf gallagher diversifykey" }, - { 1, "hf gallagher decode" }, - { 1, "hf ksx6924 help" }, - { 0, "hf ksx6924 select" }, - { 0, "hf ksx6924 info" }, - { 0, "hf ksx6924 balance" }, - { 0, "hf ksx6924 init" }, - { 0, "hf ksx6924 prec" }, - { 1, "hf jooki help" }, - { 0, "hf jooki clone" }, - { 1, "hf jooki decode" }, - { 1, "hf jooki encode" }, - { 0, "hf jooki sim" }, - { 1, "hf iclass help" }, - { 0, "hf iclass dump" }, - { 1, "hf iclass info" }, - { 1, "hf iclass list" }, - { 0, "hf iclass rdbl" }, - { 0, "hf iclass reader" }, - { 0, "hf iclass restore" }, - { 0, "hf iclass sniff" }, - { 0, "hf iclass wrbl" }, - { 0, "hf iclass chk" }, - { 1, "hf iclass loclass" }, - { 1, "hf iclass lookup" }, - { 0, "hf iclass sim" }, - { 0, "hf iclass eload" }, - { 0, "hf iclass esave" }, - { 0, "hf iclass eview" }, - { 1, "hf iclass configcard" }, - { 1, "hf iclass calcnewkey" }, - { 1, "hf iclass encode" }, - { 1, "hf iclass encrypt" }, - { 1, "hf iclass decrypt" }, - { 1, "hf iclass managekeys" }, - { 1, "hf iclass permutekey" }, - { 1, "hf iclass view" }, - { 1, "hf legic help" }, - { 0, "hf legic dump" }, - { 0, "hf legic info" }, - { 1, "hf legic list" }, - { 0, "hf legic rdbl" }, - { 0, "hf legic reader" }, - { 0, "hf legic restore" }, - { 0, "hf legic wipe" }, - { 0, "hf legic wrbl" }, - { 0, "hf legic sim" }, - { 0, "hf legic eload" }, - { 0, "hf legic esave" }, - { 0, "hf legic eview" }, - { 0, "hf legic einfo" }, - { 1, "hf legic crc" }, - { 1, "hf legic view" }, - { 1, "hf lto help" }, - { 0, "hf lto dump" }, - { 0, "hf lto info" }, - { 1, "hf lto list" }, - { 0, "hf lto rdbl" }, - { 0, "hf lto reader" }, - { 0, "hf lto restore" }, - { 0, "hf lto wrbl" }, - { 1, "hf mf help" }, - { 1, "hf mf list" }, - { 0, "hf mf darkside" }, - { 0, "hf mf nested" }, - { 1, "hf mf hardnested" }, - { 0, "hf mf staticnested" }, - { 0, "hf mf autopwn" }, - { 0, "hf mf nack" }, - { 0, "hf mf chk" }, - { 0, "hf mf fchk" }, - { 1, "hf mf decrypt" }, - { 0, "hf mf supercard" }, - { 0, "hf mf auth4" }, - { 1, "hf mf acl" }, - { 0, "hf mf dump" }, - { 1, "hf mf mad" }, - { 0, "hf mf personalize" }, - { 0, "hf mf rdbl" }, - { 0, "hf mf rdsc" }, - { 0, "hf mf restore" }, - { 0, "hf mf setmod" }, - { 1, "hf mf value" }, - { 1, "hf mf view" }, - { 0, "hf mf wipe" }, - { 0, "hf mf wrbl" }, - { 0, "hf mf sim" }, - { 0, "hf mf ecfill" }, - { 0, "hf mf eclr" }, - { 0, "hf mf egetblk" }, - { 0, "hf mf egetsc" }, - { 0, "hf mf ekeyprn" }, - { 0, "hf mf eload" }, - { 0, "hf mf esave" }, - { 0, "hf mf esetblk" }, - { 0, "hf mf eview" }, - { 0, "hf mf cgetblk" }, - { 0, "hf mf cgetsc" }, - { 0, "hf mf cload" }, - { 0, "hf mf csave" }, - { 0, "hf mf csetblk" }, - { 0, "hf mf csetuid" }, - { 0, "hf mf cview" }, - { 0, "hf mf cwipe" }, - { 0, "hf mf gen3uid" }, - { 0, "hf mf gen3blk" }, - { 0, "hf mf gen3freeze" }, - { 0, "hf mf ggetblk" }, - { 0, "hf mf gload" }, - { 0, "hf mf gsave" }, - { 0, "hf mf gsetblk" }, - { 0, "hf mf gview" }, - { 0, "hf mf gdmcfg" }, - { 0, "hf mf gdmsetcfg" }, - { 0, "hf mf gdmsetblk" }, - { 0, "hf mf ndefformat" }, - { 0, "hf mf ndefread" }, - { 0, "hf mf ndefwrite" }, - { 1, "hf mfp help" }, - { 1, "hf mfp list" }, - { 0, "hf mfp auth" }, - { 0, "hf mfp chk" }, - { 0, "hf mfp dump" }, - { 0, "hf mfp info" }, - { 0, "hf mfp mad" }, - { 0, "hf mfp rdbl" }, - { 0, "hf mfp rdsc" }, - { 0, "hf mfp wrbl" }, - { 0, "hf mfp commitp" }, - { 0, "hf mfp initp" }, - { 0, "hf mfp wrp" }, - { 0, "hf mfp ndefformat" }, - { 0, "hf mfp ndefread" }, - { 0, "hf mfp ndefwrite" }, - { 1, "hf mfu help" }, - { 1, "hf mfu keygen" }, - { 1, "hf mfu pwdgen" }, - { 0, "hf mfu otptear" }, - { 0, "hf mfu cauth" }, - { 0, "hf mfu dump" }, - { 0, "hf mfu info" }, - { 0, "hf mfu ndefread" }, - { 0, "hf mfu rdbl" }, - { 0, "hf mfu restore" }, - { 1, "hf mfu view" }, - { 0, "hf mfu wrbl" }, - { 0, "hf mfu tamper" }, - { 0, "hf mfu eload" }, - { 0, "hf mfu esave" }, - { 0, "hf mfu eview" }, - { 0, "hf mfu sim" }, - { 0, "hf mfu setpwd" }, - { 0, "hf mfu setuid" }, - { 1, "hf mfdes help" }, - { 0, "hf mfdes info" }, - { 0, "hf mfdes getuid" }, - { 0, "hf mfdes default" }, - { 0, "hf mfdes auth" }, - { 0, "hf mfdes chk" }, - { 0, "hf mfdes detect" }, - { 0, "hf mfdes freemem" }, - { 0, "hf mfdes setconfig" }, - { 0, "hf mfdes formatpicc" }, - { 1, "hf mfdes list" }, - { 0, "hf mfdes mad" }, - { 0, "hf mfdes lsapp" }, - { 0, "hf mfdes getaids" }, - { 0, "hf mfdes getappnames" }, - { 0, "hf mfdes bruteaid" }, - { 0, "hf mfdes createapp" }, - { 0, "hf mfdes deleteapp" }, - { 0, "hf mfdes selectapp" }, - { 0, "hf mfdes changekey" }, - { 0, "hf mfdes chkeysettings" }, - { 0, "hf mfdes getkeysettings" }, - { 0, "hf mfdes getkeyversions" }, - { 0, "hf mfdes getfileids" }, - { 0, "hf mfdes getfileisoids" }, - { 0, "hf mfdes lsfiles" }, - { 0, "hf mfdes dump" }, - { 0, "hf mfdes createfile" }, - { 0, "hf mfdes createvaluefile" }, - { 0, "hf mfdes createrecordfile" }, - { 0, "hf mfdes createmacfile" }, - { 0, "hf mfdes deletefile" }, - { 0, "hf mfdes getfilesettings" }, - { 0, "hf mfdes chfilesettings" }, - { 0, "hf mfdes read" }, - { 0, "hf mfdes write" }, - { 0, "hf mfdes value" }, - { 0, "hf mfdes clearrecfile" }, - { 1, "hf mfdes test" }, - { 1, "hf ntag424 help" }, - { 0, "hf ntag424 info" }, - { 0, "hf ntag424 sdm" }, - { 1, "hf ntag424 view" }, - { 1, "hf seos help" }, - { 0, "hf seos info" }, - { 1, "hf seos list" }, - { 1, "hf st25ta help" }, - { 0, "hf st25ta info" }, - { 1, "hf st25ta list" }, - { 1, "hf st25ta ndefread" }, - { 0, "hf st25ta protect" }, - { 0, "hf st25ta pwd" }, - { 0, "hf st25ta sim" }, - { 1, "hf tesla help" }, - { 0, "hf tesla info" }, - { 1, "hf tesla list" }, - { 1, "hf texkom help" }, - { 0, "hf texkom reader" }, - { 0, "hf texkom sim" }, - { 1, "hf thinfilm help" }, - { 0, "hf thinfilm info" }, - { 1, "hf thinfilm list" }, - { 0, "hf thinfilm sim" }, - { 1, "hf topaz help" }, - { 1, "hf topaz list" }, - { 0, "hf topaz dump" }, - { 0, "hf topaz info" }, - { 0, "hf topaz raw" }, - { 0, "hf topaz rdbl" }, - { 0, "hf topaz reader" }, - { 0, "hf topaz sim" }, - { 0, "hf topaz sniff" }, - { 1, "hf topaz view" }, - { 0, "hf topaz wrbl" }, - { 1, "hf xerox help" }, - { 0, "hf xerox info" }, - { 0, "hf xerox reader" }, - { 0, "hf xerox dump" }, - { 1, "hf waveshare help" }, - { 0, "hf waveshare loadbmp" }, - { 1, "hw help" }, - { 0, "hw break" }, - { 1, "hw connect" }, - { 0, "hw dbg" }, - { 0, "hw detectreader" }, - { 0, "hw fpgaoff" }, - { 0, "hw lcd" }, - { 0, "hw lcdreset" }, - { 0, "hw ping" }, - { 0, "hw readmem" }, - { 0, "hw reset" }, - { 0, "hw setlfdivisor" }, - { 0, "hw setmux" }, - { 0, "hw standalone" }, - { 0, "hw status" }, - { 0, "hw tearoff" }, - { 0, "hw tia" }, - { 0, "hw tune" }, - { 1, "hw version" }, - { 1, "lf help" }, - { 0, "lf config" }, - { 0, "lf cmdread" }, - { 0, "lf read" }, - { 1, "lf search" }, - { 0, "lf sim" }, - { 0, "lf simask" }, - { 0, "lf simfsk" }, - { 0, "lf simpsk" }, - { 0, "lf simbidir" }, - { 0, "lf sniff" }, - { 0, "lf tune" }, - { 1, "lf awid help" }, - { 1, "lf awid demod" }, - { 0, "lf awid reader" }, - { 0, "lf awid clone" }, - { 0, "lf awid sim" }, - { 0, "lf awid brute" }, - { 0, "lf awid watch" }, - { 1, "lf cotag help" }, - { 1, "lf cotag demod" }, - { 0, "lf cotag reader" }, - { 1, "lf destron help" }, - { 1, "lf destron demod" }, - { 0, "lf destron reader" }, - { 0, "lf destron clone" }, - { 0, "lf destron sim" }, - { 1, "lf em help" }, - { 1, "lf em 410x help" }, - { 1, "lf em 410x demod" }, - { 0, "lf em 410x reader" }, - { 0, "lf em 410x sim" }, - { 0, "lf em 410x brute" }, - { 0, "lf em 410x watch" }, - { 0, "lf em 410x spoof" }, - { 0, "lf em 410x clone" }, - { 1, "lf em 4x05 help" }, - { 0, "lf em 4x05 brute" }, - { 0, "lf em 4x05 chk" }, - { 1, "lf em 4x05 demod" }, - { 0, "lf em 4x05 dump" }, - { 0, "lf em 4x05 info" }, - { 0, "lf em 4x05 read" }, - { 1, "lf em 4x05 sniff" }, - { 0, "lf em 4x05 unlock" }, - { 0, "lf em 4x05 wipe" }, - { 0, "lf em 4x05 write" }, - { 1, "lf em 4x50 help" }, - { 0, "lf em 4x50 brute" }, - { 0, "lf em 4x50 chk" }, - { 0, "lf em 4x50 dump" }, - { 0, "lf em 4x50 info" }, - { 0, "lf em 4x50 login" }, - { 0, "lf em 4x50 rdbl" }, - { 0, "lf em 4x50 reader" }, - { 0, "lf em 4x50 restore" }, - { 0, "lf em 4x50 wrbl" }, - { 0, "lf em 4x50 wrpwd" }, - { 0, "lf em 4x50 wipe" }, - { 0, "lf em 4x50 eload" }, - { 0, "lf em 4x50 esave" }, - { 0, "lf em 4x50 eview" }, - { 0, "lf em 4x50 sim" }, - { 1, "lf em 4x70 help" }, - { 0, "lf em 4x70 brute" }, - { 0, "lf em 4x70 info" }, - { 0, "lf em 4x70 write" }, - { 0, "lf em 4x70 unlock" }, - { 0, "lf em 4x70 auth" }, - { 0, "lf em 4x70 writepin" }, - { 0, "lf em 4x70 writekey" }, - { 1, "lf fdxb help" }, - { 1, "lf fdxb demod" }, - { 0, "lf fdxb reader" }, - { 0, "lf fdxb clone" }, - { 0, "lf fdxb sim" }, - { 1, "lf gallagher help" }, - { 1, "lf gallagher demod" }, - { 0, "lf gallagher reader" }, - { 0, "lf gallagher clone" }, - { 0, "lf gallagher sim" }, - { 1, "lf gproxii help" }, - { 1, "lf gproxii demod" }, - { 0, "lf gproxii reader" }, - { 0, "lf gproxii clone" }, - { 0, "lf gproxii sim" }, - { 1, "lf hid help" }, - { 1, "lf hid demod" }, - { 0, "lf hid reader" }, - { 0, "lf hid clone" }, - { 0, "lf hid sim" }, - { 0, "lf hid brute" }, - { 0, "lf hid watch" }, - { 1, "lf hitag help" }, - { 0, "lf hitag eload" }, - { 1, "lf hitag list" }, - { 0, "lf hitag info" }, - { 0, "lf hitag reader" }, - { 0, "lf hitag sim" }, - { 0, "lf hitag sniff" }, - { 0, "lf hitag writer" }, - { 0, "lf hitag dump" }, - { 0, "lf hitag cc" }, - { 1, "lf idteck help" }, - { 1, "lf idteck demod" }, - { 0, "lf idteck reader" }, - { 0, "lf idteck clone" }, - { 0, "lf idteck sim" }, - { 1, "lf indala help" }, - { 0, "lf indala brute" }, - { 1, "lf indala demod" }, - { 1, "lf indala altdemod" }, - { 0, "lf indala reader" }, - { 0, "lf indala clone" }, - { 0, "lf indala sim" }, - { 1, "lf io help" }, - { 1, "lf io demod" }, - { 0, "lf io reader" }, - { 0, "lf io clone" }, - { 0, "lf io sim" }, - { 0, "lf io watch" }, - { 1, "lf jablotron help" }, - { 1, "lf jablotron demod" }, - { 0, "lf jablotron reader" }, - { 0, "lf jablotron clone" }, - { 0, "lf jablotron sim" }, - { 1, "lf keri help" }, - { 1, "lf keri demod" }, - { 0, "lf keri reader" }, - { 0, "lf keri clone" }, - { 0, "lf keri sim" }, - { 1, "lf motorola help" }, - { 1, "lf motorola demod" }, - { 0, "lf motorola reader" }, - { 0, "lf motorola clone" }, - { 0, "lf motorola sim" }, - { 1, "lf nedap help" }, - { 1, "lf nedap demod" }, - { 0, "lf nedap reader" }, - { 0, "lf nedap clone" }, - { 0, "lf nedap sim" }, - { 1, "lf nexwatch help" }, - { 1, "lf nexwatch demod" }, - { 0, "lf nexwatch reader" }, - { 0, "lf nexwatch clone" }, - { 0, "lf nexwatch sim" }, - { 1, "lf noralsy help" }, - { 1, "lf noralsy demod" }, - { 0, "lf noralsy reader" }, - { 0, "lf noralsy clone" }, - { 0, "lf noralsy sim" }, - { 1, "lf pac help" }, - { 1, "lf pac demod" }, - { 0, "lf pac reader" }, - { 0, "lf pac clone" }, - { 0, "lf pac sim" }, - { 1, "lf paradox help" }, - { 1, "lf paradox demod" }, - { 0, "lf paradox reader" }, - { 0, "lf paradox clone" }, - { 0, "lf paradox sim" }, - { 1, "lf pcf7931 help" }, - { 0, "lf pcf7931 reader" }, - { 0, "lf pcf7931 write" }, - { 1, "lf pcf7931 config" }, - { 1, "lf presco help" }, - { 1, "lf presco demod" }, - { 0, "lf presco reader" }, - { 0, "lf presco clone" }, - { 0, "lf presco sim" }, - { 1, "lf pyramid help" }, - { 1, "lf pyramid demod" }, - { 0, "lf pyramid reader" }, - { 0, "lf pyramid clone" }, - { 0, "lf pyramid sim" }, - { 1, "lf securakey help" }, - { 1, "lf securakey demod" }, - { 0, "lf securakey reader" }, - { 0, "lf securakey clone" }, - { 0, "lf securakey sim" }, - { 1, "lf ti help" }, - { 1, "lf ti demod" }, - { 0, "lf ti reader" }, - { 0, "lf ti write" }, - { 1, "lf t55xx help" }, - { 0, "lf t55xx clonehelp" }, - { 1, "lf t55xx config" }, - { 0, "lf t55xx dangerraw" }, - { 1, "lf t55xx detect" }, - { 0, "lf t55xx deviceconfig" }, - { 0, "lf t55xx dump" }, - { 1, "lf t55xx info" }, - { 0, "lf t55xx p1detect" }, - { 0, "lf t55xx read" }, - { 0, "lf t55xx resetread" }, - { 0, "lf t55xx restore" }, - { 1, "lf t55xx trace" }, - { 0, "lf t55xx wakeup" }, - { 0, "lf t55xx write" }, - { 0, "lf t55xx bruteforce" }, - { 0, "lf t55xx chk" }, - { 0, "lf t55xx protect" }, - { 0, "lf t55xx recoverpw" }, - { 1, "lf t55xx sniff" }, - { 0, "lf t55xx special" }, - { 0, "lf t55xx wipe" }, - { 1, "lf viking help" }, - { 1, "lf viking demod" }, - { 0, "lf viking reader" }, - { 0, "lf viking clone" }, - { 0, "lf viking sim" }, - { 1, "lf visa2000 help" }, - { 1, "lf visa2000 demod" }, - { 0, "lf visa2000 reader" }, - { 0, "lf visa2000 clone" }, - { 0, "lf visa2000 sim" }, - { 1, "mem help" }, - { 0, "mem baudrate" }, - { 0, "mem dump" }, - { 0, "mem info" }, - { 0, "mem load" }, - { 0, "mem wipe" }, - { 1, "mem spiffs help" }, - { 0, "mem spiffs copy" }, - { 0, "mem spiffs check" }, - { 0, "mem spiffs dump" }, - { 0, "mem spiffs info" }, - { 0, "mem spiffs mount" }, - { 0, "mem spiffs remove" }, - { 0, "mem spiffs rename" }, - { 0, "mem spiffs test" }, - { 0, "mem spiffs tree" }, - { 0, "mem spiffs unmount" }, - { 0, "mem spiffs upload" }, - { 0, "mem spiffs view" }, - { 0, "mem spiffs wipe" }, - { 1, "nfc help" }, - { 1, "nfc decode" }, - { 0, "nfc type1 read" }, - { 1, "nfc type1 help" }, - { 0, "nfc type2 read" }, - { 1, "nfc type2 help" }, - { 0, "nfc type4a format" }, - { 0, "nfc type4a read" }, - { 0, "nfc type4a write" }, - { 0, "nfc type4a st25taread" }, - { 1, "nfc type4a help" }, - { 0, "nfc type4b read" }, - { 1, "nfc type4b help" }, - { 0, "nfc mf cformat" }, - { 0, "nfc mf cread" }, - { 0, "nfc mf cwrite" }, - { 0, "nfc mf pread" }, - { 1, "nfc mf help" }, - { 0, "nfc barcode read" }, - { 0, "nfc barcode sim" }, - { 1, "nfc barcode help" }, - { 1, "piv help" }, - { 0, "piv select" }, - { 0, "piv getdata" }, - { 0, "piv authsign" }, - { 0, "piv scan" }, - { 1, "piv list" }, - { 1, "smart help" }, - { 1, "smart list" }, - { 0, "smart info" }, - { 0, "smart reader" }, - { 0, "smart raw" }, - { 1, "smart upgrade" }, - { 0, "smart setclock" }, - { 0, "smart brute" }, - { 1, "script help" }, - { 1, "script list" }, - { 1, "script run" }, - { 1, "trace help" }, - { 1, "trace extract" }, - { 1, "trace list" }, - { 1, "trace load" }, - { 1, "trace save" }, - { 1, "usart help" }, - { 0, "usart btpin" }, - { 0, "usart btfactory" }, - { 0, "usart tx" }, - { 0, "usart rx" }, - { 0, "usart txrx" }, - { 0, "usart txhex" }, - { 0, "usart rxhex" }, - { 0, "usart config" }, - { 1, "wiegand help" }, - { 1, "wiegand list" }, - { 1, "wiegand encode" }, - { 1, "wiegand decode" }, + { 1, "help" }, + { 0, "auto" }, + { 1, "clear" }, + { 1, "hints" }, + { 1, "msleep" }, + { 1, "rem" }, + { 1, "quit" }, + { 1, "exit" }, + { 1, "prefs help" }, + { 1, "prefs show" }, + { 1, "prefs get barmode" }, + { 1, "prefs get clientdebug" }, + { 1, "prefs get clientdelay" }, + { 1, "prefs get color" }, + { 1, "prefs get savepaths" }, + { 1, "prefs get emoji" }, + { 1, "prefs get hints" }, + { 1, "prefs get output" }, + { 1, "prefs get plotsliders" }, + { 1, "prefs set help" }, + { 1, "prefs set barmode" }, + { 1, "prefs set clientdebug" }, + { 1, "prefs set clientdelay" }, + { 1, "prefs set color" }, + { 1, "prefs set emoji" }, + { 1, "prefs set hints" }, + { 1, "prefs set savepaths" }, + { 1, "prefs set output" }, + { 1, "prefs set plotsliders" }, + { 1, "analyse help" }, + { 1, "analyse lcr" }, + { 1, "analyse crc" }, + { 1, "analyse chksum" }, + { 1, "analyse dates" }, + { 1, "analyse lfsr" }, + { 1, "analyse a" }, + { 1, "analyse nuid" }, + { 1, "analyse demodbuff" }, + { 1, "analyse freq" }, + { 1, "analyse foo" }, + { 1, "analyse units" }, + { 1, "data help" }, + { 1, "data biphaserawdecode" }, + { 1, "data detectclock" }, + { 1, "data fsktonrz" }, + { 1, "data manrawdecode" }, + { 1, "data modulation" }, + { 1, "data rawdemod" }, + { 1, "data askedgedetect" }, + { 1, "data autocorr" }, + { 1, "data dirthreshold" }, + { 1, "data decimate" }, + { 1, "data undecimate" }, + { 1, "data hide" }, + { 1, "data hpf" }, + { 1, "data iir" }, + { 1, "data grid" }, + { 1, "data ltrim" }, + { 1, "data mtrim" }, + { 1, "data norm" }, + { 1, "data plot" }, + { 1, "data rtrim" }, + { 1, "data setgraphmarkers" }, + { 1, "data shiftgraphzero" }, + { 1, "data timescale" }, + { 1, "data zerocrossings" }, + { 1, "data convertbitstream" }, + { 1, "data getbitstream" }, + { 1, "data asn1" }, + { 1, "data bin2hex" }, + { 0, "data bitsamples" }, + { 1, "data clear" }, + { 1, "data diff" }, + { 0, "data hexsamples" }, + { 1, "data hex2bin" }, + { 1, "data load" }, + { 1, "data num" }, + { 1, "data print" }, + { 0, "data samples" }, + { 1, "data save" }, + { 1, "data setdebugmode" }, + { 0, "data tune" }, + { 1, "emv help" }, + { 1, "emv list" }, + { 1, "emv test" }, + { 0, "emv challenge" }, + { 0, "emv exec" }, + { 0, "emv genac" }, + { 0, "emv gpo" }, + { 0, "emv intauth" }, + { 0, "emv pse" }, + { 0, "emv reader" }, + { 0, "emv readrec" }, + { 0, "emv roca" }, + { 0, "emv scan" }, + { 0, "emv search" }, + { 0, "emv select" }, + { 1, "hf help" }, + { 1, "hf list" }, + { 0, "hf plot" }, + { 0, "hf tune" }, + { 1, "hf search" }, + { 0, "hf sniff" }, + { 1, "hf 14a help" }, + { 1, "hf 14a list" }, + { 0, "hf 14a antifuzz" }, + { 0, "hf 14a config" }, + { 0, "hf 14a cuids" }, + { 0, "hf 14a info" }, + { 0, "hf 14a sim" }, + { 0, "hf 14a sniff" }, + { 0, "hf 14a raw" }, + { 0, "hf 14a reader" }, + { 0, "hf 14a apdu" }, + { 0, "hf 14a apdufind" }, + { 0, "hf 14a chaining" }, + { 0, "hf 14a ndefformat" }, + { 0, "hf 14a ndefread" }, + { 0, "hf 14a ndefwrite" }, + { 1, "hf 14b help" }, + { 0, "hf 14b apdu" }, + { 0, "hf 14b dump" }, + { 0, "hf 14b info" }, + { 1, "hf 14b list" }, + { 0, "hf 14b ndefread" }, + { 0, "hf 14b raw" }, + { 0, "hf 14b reader" }, + { 0, "hf 14b sim" }, + { 0, "hf 14b sniff" }, + { 0, "hf 14b rdbl" }, + { 0, "hf 14b sriwrite" }, + { 1, "hf 14b view" }, + { 1, "hf 15 help" }, + { 1, "hf 15 list" }, + { 1, "hf 15 demod" }, + { 0, "hf 15 dump" }, + { 0, "hf 15 info" }, + { 0, "hf 15 sniff" }, + { 0, "hf 15 raw" }, + { 0, "hf 15 rdbl" }, + { 0, "hf 15 rdmulti" }, + { 0, "hf 15 reader" }, + { 0, "hf 15 restore" }, + { 0, "hf 15 samples" }, + { 0, "hf 15 eload" }, + { 0, "hf 15 esave" }, + { 0, "hf 15 eview" }, + { 0, "hf 15 sim" }, + { 0, "hf 15 slixwritepwd" }, + { 0, "hf 15 slixeasdisable" }, + { 0, "hf 15 slixeasenable" }, + { 0, "hf 15 slixprivacydisable" }, + { 0, "hf 15 slixprivacyenable" }, + { 0, "hf 15 passprotectafi" }, + { 0, "hf 15 passprotecteas" }, + { 0, "hf 15 wrbl" }, + { 0, "hf 15 findafi" }, + { 0, "hf 15 writeafi" }, + { 0, "hf 15 writedsfid" }, + { 0, "hf 15 csetuid" }, + { 1, "hf cipurse help" }, + { 0, "hf cipurse info" }, + { 0, "hf cipurse select" }, + { 0, "hf cipurse auth" }, + { 0, "hf cipurse read" }, + { 0, "hf cipurse write" }, + { 0, "hf cipurse aread" }, + { 0, "hf cipurse awrite" }, + { 0, "hf cipurse formatall" }, + { 0, "hf cipurse create" }, + { 0, "hf cipurse delete" }, + { 0, "hf cipurse updkey" }, + { 0, "hf cipurse updakey" }, + { 0, "hf cipurse default" }, + { 1, "hf cipurse test" }, + { 1, "hf epa help" }, + { 0, "hf epa cnonces" }, + { 0, "hf epa replay" }, + { 0, "hf epa sim" }, + { 1, "hf emrtd help" }, + { 0, "hf emrtd dump" }, + { 1, "hf emrtd info" }, + { 1, "hf emrtd list" }, + { 1, "hf felica help" }, + { 1, "hf felica list" }, + { 0, "hf felica reader" }, + { 0, "hf felica info" }, + { 0, "hf felica sniff" }, + { 0, "hf felica raw" }, + { 0, "hf felica rdbl" }, + { 0, "hf felica wrbl" }, + { 0, "hf felica rqservice" }, + { 0, "hf felica rqresponse" }, + { 0, "hf felica scsvcode" }, + { 0, "hf felica rqsyscode" }, + { 0, "hf felica auth1" }, + { 0, "hf felica auth2" }, + { 0, "hf felica rqspecver" }, + { 0, "hf felica resetmode" }, + { 0, "hf felica litesim" }, + { 0, "hf felica litedump" }, + { 1, "hf fido help" }, + { 1, "hf fido list" }, + { 0, "hf fido info" }, + { 0, "hf fido reg" }, + { 0, "hf fido auth" }, + { 0, "hf fido make" }, + { 0, "hf fido assert" }, + { 1, "hf fudan help" }, + { 0, "hf fudan reader" }, + { 0, "hf fudan dump" }, + { 0, "hf fudan rdbl" }, + { 1, "hf fudan view" }, + { 0, "hf fudan wrbl" }, + { 1, "hf gallagher help" }, + { 0, "hf gallagher reader" }, + { 0, "hf gallagher clone" }, + { 0, "hf gallagher delete" }, + { 1, "hf gallagher diversifykey" }, + { 1, "hf gallagher decode" }, + { 1, "hf ksx6924 help" }, + { 0, "hf ksx6924 select" }, + { 0, "hf ksx6924 info" }, + { 0, "hf ksx6924 balance" }, + { 0, "hf ksx6924 init" }, + { 0, "hf ksx6924 prec" }, + { 1, "hf jooki help" }, + { 0, "hf jooki clone" }, + { 1, "hf jooki decode" }, + { 1, "hf jooki encode" }, + { 0, "hf jooki sim" }, + { 1, "hf iclass help" }, + { 0, "hf iclass dump" }, + { 1, "hf iclass info" }, + { 1, "hf iclass list" }, + { 0, "hf iclass rdbl" }, + { 0, "hf iclass reader" }, + { 0, "hf iclass restore" }, + { 0, "hf iclass sniff" }, + { 0, "hf iclass wrbl" }, + { 0, "hf iclass chk" }, + { 1, "hf iclass loclass" }, + { 1, "hf iclass lookup" }, + { 0, "hf iclass sim" }, + { 0, "hf iclass eload" }, + { 0, "hf iclass esave" }, + { 0, "hf iclass eview" }, + { 1, "hf iclass configcard" }, + { 1, "hf iclass calcnewkey" }, + { 1, "hf iclass encode" }, + { 1, "hf iclass encrypt" }, + { 1, "hf iclass decrypt" }, + { 1, "hf iclass managekeys" }, + { 1, "hf iclass permutekey" }, + { 1, "hf iclass view" }, + { 1, "hf legic help" }, + { 0, "hf legic dump" }, + { 0, "hf legic info" }, + { 1, "hf legic list" }, + { 0, "hf legic rdbl" }, + { 0, "hf legic reader" }, + { 0, "hf legic restore" }, + { 0, "hf legic wipe" }, + { 0, "hf legic wrbl" }, + { 0, "hf legic sim" }, + { 0, "hf legic eload" }, + { 0, "hf legic esave" }, + { 0, "hf legic eview" }, + { 0, "hf legic einfo" }, + { 1, "hf legic crc" }, + { 1, "hf legic view" }, + { 1, "hf lto help" }, + { 0, "hf lto dump" }, + { 0, "hf lto info" }, + { 1, "hf lto list" }, + { 0, "hf lto rdbl" }, + { 0, "hf lto reader" }, + { 0, "hf lto restore" }, + { 0, "hf lto wrbl" }, + { 1, "hf mf help" }, + { 1, "hf mf list" }, + { 0, "hf mf darkside" }, + { 0, "hf mf nested" }, + { 1, "hf mf hardnested" }, + { 0, "hf mf staticnested" }, + { 0, "hf mf autopwn" }, + { 0, "hf mf nack" }, + { 0, "hf mf chk" }, + { 0, "hf mf fchk" }, + { 1, "hf mf decrypt" }, + { 0, "hf mf supercard" }, + { 0, "hf mf auth4" }, + { 1, "hf mf acl" }, + { 0, "hf mf dump" }, + { 1, "hf mf mad" }, + { 0, "hf mf personalize" }, + { 0, "hf mf rdbl" }, + { 0, "hf mf rdsc" }, + { 0, "hf mf restore" }, + { 0, "hf mf setmod" }, + { 1, "hf mf value" }, + { 1, "hf mf view" }, + { 0, "hf mf wipe" }, + { 0, "hf mf wrbl" }, + { 0, "hf mf sim" }, + { 0, "hf mf ecfill" }, + { 0, "hf mf eclr" }, + { 0, "hf mf egetblk" }, + { 0, "hf mf egetsc" }, + { 0, "hf mf ekeyprn" }, + { 0, "hf mf eload" }, + { 0, "hf mf esave" }, + { 0, "hf mf esetblk" }, + { 0, "hf mf eview" }, + { 0, "hf mf cgetblk" }, + { 0, "hf mf cgetsc" }, + { 0, "hf mf cload" }, + { 0, "hf mf csave" }, + { 0, "hf mf csetblk" }, + { 0, "hf mf csetuid" }, + { 0, "hf mf cview" }, + { 0, "hf mf cwipe" }, + { 0, "hf mf gen3uid" }, + { 0, "hf mf gen3blk" }, + { 0, "hf mf gen3freeze" }, + { 0, "hf mf ggetblk" }, + { 0, "hf mf gload" }, + { 0, "hf mf gsave" }, + { 0, "hf mf gsetblk" }, + { 0, "hf mf gview" }, + { 0, "hf mf gdmcfg" }, + { 0, "hf mf gdmsetcfg" }, + { 0, "hf mf gdmsetblk" }, + { 0, "hf mf ndefformat" }, + { 0, "hf mf ndefread" }, + { 0, "hf mf ndefwrite" }, + { 1, "hf mfp help" }, + { 1, "hf mfp list" }, + { 0, "hf mfp auth" }, + { 0, "hf mfp chk" }, + { 0, "hf mfp dump" }, + { 0, "hf mfp info" }, + { 0, "hf mfp mad" }, + { 0, "hf mfp rdbl" }, + { 0, "hf mfp rdsc" }, + { 0, "hf mfp wrbl" }, + { 0, "hf mfp commitp" }, + { 0, "hf mfp initp" }, + { 0, "hf mfp wrp" }, + { 0, "hf mfp ndefformat" }, + { 0, "hf mfp ndefread" }, + { 0, "hf mfp ndefwrite" }, + { 1, "hf mfu help" }, + { 1, "hf mfu keygen" }, + { 1, "hf mfu pwdgen" }, + { 0, "hf mfu otptear" }, + { 0, "hf mfu cauth" }, + { 0, "hf mfu dump" }, + { 0, "hf mfu info" }, + { 0, "hf mfu ndefread" }, + { 0, "hf mfu rdbl" }, + { 0, "hf mfu restore" }, + { 1, "hf mfu view" }, + { 0, "hf mfu wrbl" }, + { 0, "hf mfu tamper" }, + { 0, "hf mfu eload" }, + { 0, "hf mfu esave" }, + { 0, "hf mfu eview" }, + { 0, "hf mfu sim" }, + { 0, "hf mfu setpwd" }, + { 0, "hf mfu setuid" }, + { 1, "hf mfdes help" }, + { 0, "hf mfdes info" }, + { 0, "hf mfdes getuid" }, + { 0, "hf mfdes default" }, + { 0, "hf mfdes auth" }, + { 0, "hf mfdes chk" }, + { 0, "hf mfdes detect" }, + { 0, "hf mfdes freemem" }, + { 0, "hf mfdes setconfig" }, + { 0, "hf mfdes formatpicc" }, + { 1, "hf mfdes list" }, + { 0, "hf mfdes mad" }, + { 0, "hf mfdes lsapp" }, + { 0, "hf mfdes getaids" }, + { 0, "hf mfdes getappnames" }, + { 0, "hf mfdes bruteaid" }, + { 0, "hf mfdes createapp" }, + { 0, "hf mfdes deleteapp" }, + { 0, "hf mfdes selectapp" }, + { 0, "hf mfdes changekey" }, + { 0, "hf mfdes chkeysettings" }, + { 0, "hf mfdes getkeysettings" }, + { 0, "hf mfdes getkeyversions" }, + { 0, "hf mfdes getfileids" }, + { 0, "hf mfdes getfileisoids" }, + { 0, "hf mfdes lsfiles" }, + { 0, "hf mfdes dump" }, + { 0, "hf mfdes createfile" }, + { 0, "hf mfdes createvaluefile" }, + { 0, "hf mfdes createrecordfile" }, + { 0, "hf mfdes createmacfile" }, + { 0, "hf mfdes deletefile" }, + { 0, "hf mfdes getfilesettings" }, + { 0, "hf mfdes chfilesettings" }, + { 0, "hf mfdes read" }, + { 0, "hf mfdes write" }, + { 0, "hf mfdes value" }, + { 0, "hf mfdes clearrecfile" }, + { 1, "hf mfdes test" }, + { 1, "hf ntag424 help" }, + { 0, "hf ntag424 info" }, + { 0, "hf ntag424 sdm" }, + { 1, "hf ntag424 view" }, + { 1, "hf seos help" }, + { 0, "hf seos info" }, + { 1, "hf seos list" }, + { 1, "hf st25ta help" }, + { 0, "hf st25ta info" }, + { 1, "hf st25ta list" }, + { 1, "hf st25ta ndefread" }, + { 0, "hf st25ta protect" }, + { 0, "hf st25ta pwd" }, + { 0, "hf st25ta sim" }, + { 1, "hf tesla help" }, + { 0, "hf tesla info" }, + { 1, "hf tesla list" }, + { 1, "hf texkom help" }, + { 0, "hf texkom reader" }, + { 0, "hf texkom sim" }, + { 1, "hf thinfilm help" }, + { 0, "hf thinfilm info" }, + { 1, "hf thinfilm list" }, + { 0, "hf thinfilm sim" }, + { 1, "hf topaz help" }, + { 1, "hf topaz list" }, + { 0, "hf topaz dump" }, + { 0, "hf topaz info" }, + { 0, "hf topaz raw" }, + { 0, "hf topaz rdbl" }, + { 0, "hf topaz reader" }, + { 0, "hf topaz sim" }, + { 0, "hf topaz sniff" }, + { 1, "hf topaz view" }, + { 0, "hf topaz wrbl" }, + { 1, "hf vas help" }, + { 0, "hf vas reader" }, + { 1, "hf vas decrypt" }, + { 1, "hf waveshare help" }, + { 0, "hf waveshare loadbmp" }, + { 1, "hf xerox help" }, + { 0, "hf xerox info" }, + { 0, "hf xerox reader" }, + { 0, "hf xerox dump" }, + { 1, "hw help" }, + { 0, "hw break" }, + { 1, "hw connect" }, + { 0, "hw dbg" }, + { 0, "hw detectreader" }, + { 0, "hw fpgaoff" }, + { 0, "hw lcd" }, + { 0, "hw lcdreset" }, + { 0, "hw ping" }, + { 0, "hw readmem" }, + { 0, "hw reset" }, + { 0, "hw setlfdivisor" }, + { 0, "hw setmux" }, + { 0, "hw standalone" }, + { 0, "hw status" }, + { 0, "hw tearoff" }, + { 0, "hw tia" }, + { 1, "hw timeout" }, + { 0, "hw tune" }, + { 1, "hw version" }, + { 1, "lf help" }, + { 0, "lf config" }, + { 0, "lf cmdread" }, + { 0, "lf read" }, + { 1, "lf search" }, + { 0, "lf sim" }, + { 0, "lf simask" }, + { 0, "lf simfsk" }, + { 0, "lf simpsk" }, + { 0, "lf simbidir" }, + { 0, "lf sniff" }, + { 0, "lf tune" }, + { 1, "lf awid help" }, + { 1, "lf awid demod" }, + { 0, "lf awid reader" }, + { 0, "lf awid clone" }, + { 0, "lf awid sim" }, + { 0, "lf awid brute" }, + { 0, "lf awid watch" }, + { 1, "lf cotag help" }, + { 1, "lf cotag demod" }, + { 0, "lf cotag reader" }, + { 1, "lf destron help" }, + { 1, "lf destron demod" }, + { 0, "lf destron reader" }, + { 0, "lf destron clone" }, + { 0, "lf destron sim" }, + { 1, "lf em help" }, + { 1, "lf em 410x help" }, + { 1, "lf em 410x demod" }, + { 0, "lf em 410x reader" }, + { 0, "lf em 410x sim" }, + { 0, "lf em 410x brute" }, + { 0, "lf em 410x watch" }, + { 0, "lf em 410x spoof" }, + { 0, "lf em 410x clone" }, + { 1, "lf em 4x05 help" }, + { 0, "lf em 4x05 brute" }, + { 0, "lf em 4x05 chk" }, + { 1, "lf em 4x05 demod" }, + { 0, "lf em 4x05 dump" }, + { 0, "lf em 4x05 info" }, + { 0, "lf em 4x05 read" }, + { 1, "lf em 4x05 sniff" }, + { 0, "lf em 4x05 unlock" }, + { 0, "lf em 4x05 wipe" }, + { 0, "lf em 4x05 write" }, + { 1, "lf em 4x50 help" }, + { 0, "lf em 4x50 brute" }, + { 0, "lf em 4x50 chk" }, + { 0, "lf em 4x50 dump" }, + { 0, "lf em 4x50 info" }, + { 0, "lf em 4x50 login" }, + { 0, "lf em 4x50 rdbl" }, + { 0, "lf em 4x50 reader" }, + { 0, "lf em 4x50 restore" }, + { 0, "lf em 4x50 wrbl" }, + { 0, "lf em 4x50 wrpwd" }, + { 0, "lf em 4x50 wipe" }, + { 0, "lf em 4x50 eload" }, + { 0, "lf em 4x50 esave" }, + { 0, "lf em 4x50 eview" }, + { 0, "lf em 4x50 sim" }, + { 1, "lf em 4x70 help" }, + { 0, "lf em 4x70 brute" }, + { 0, "lf em 4x70 info" }, + { 0, "lf em 4x70 write" }, + { 0, "lf em 4x70 unlock" }, + { 0, "lf em 4x70 auth" }, + { 0, "lf em 4x70 writepin" }, + { 0, "lf em 4x70 writekey" }, + { 1, "lf fdxb help" }, + { 1, "lf fdxb demod" }, + { 0, "lf fdxb reader" }, + { 0, "lf fdxb clone" }, + { 0, "lf fdxb sim" }, + { 1, "lf gallagher help" }, + { 1, "lf gallagher demod" }, + { 0, "lf gallagher reader" }, + { 0, "lf gallagher clone" }, + { 0, "lf gallagher sim" }, + { 1, "lf gproxii help" }, + { 1, "lf gproxii demod" }, + { 0, "lf gproxii reader" }, + { 0, "lf gproxii clone" }, + { 0, "lf gproxii sim" }, + { 1, "lf hid help" }, + { 1, "lf hid demod" }, + { 0, "lf hid reader" }, + { 0, "lf hid clone" }, + { 0, "lf hid sim" }, + { 0, "lf hid brute" }, + { 0, "lf hid watch" }, + { 1, "lf hitag help" }, + { 0, "lf hitag eload" }, + { 1, "lf hitag list" }, + { 0, "lf hitag info" }, + { 0, "lf hitag reader" }, + { 0, "lf hitag sim" }, + { 0, "lf hitag sniff" }, + { 0, "lf hitag writer" }, + { 0, "lf hitag dump" }, + { 0, "lf hitag cc" }, + { 1, "lf idteck help" }, + { 1, "lf idteck demod" }, + { 0, "lf idteck reader" }, + { 0, "lf idteck clone" }, + { 0, "lf idteck sim" }, + { 1, "lf indala help" }, + { 0, "lf indala brute" }, + { 1, "lf indala demod" }, + { 1, "lf indala altdemod" }, + { 0, "lf indala reader" }, + { 0, "lf indala clone" }, + { 0, "lf indala sim" }, + { 1, "lf io help" }, + { 1, "lf io demod" }, + { 0, "lf io reader" }, + { 0, "lf io clone" }, + { 0, "lf io sim" }, + { 0, "lf io watch" }, + { 1, "lf jablotron help" }, + { 1, "lf jablotron demod" }, + { 0, "lf jablotron reader" }, + { 0, "lf jablotron clone" }, + { 0, "lf jablotron sim" }, + { 1, "lf keri help" }, + { 1, "lf keri demod" }, + { 0, "lf keri reader" }, + { 0, "lf keri clone" }, + { 0, "lf keri sim" }, + { 1, "lf motorola help" }, + { 1, "lf motorola demod" }, + { 0, "lf motorola reader" }, + { 0, "lf motorola clone" }, + { 0, "lf motorola sim" }, + { 1, "lf nedap help" }, + { 1, "lf nedap demod" }, + { 0, "lf nedap reader" }, + { 0, "lf nedap clone" }, + { 0, "lf nedap sim" }, + { 1, "lf nexwatch help" }, + { 1, "lf nexwatch demod" }, + { 0, "lf nexwatch reader" }, + { 0, "lf nexwatch clone" }, + { 0, "lf nexwatch sim" }, + { 1, "lf noralsy help" }, + { 1, "lf noralsy demod" }, + { 0, "lf noralsy reader" }, + { 0, "lf noralsy clone" }, + { 0, "lf noralsy sim" }, + { 1, "lf pac help" }, + { 1, "lf pac demod" }, + { 0, "lf pac reader" }, + { 0, "lf pac clone" }, + { 0, "lf pac sim" }, + { 1, "lf paradox help" }, + { 1, "lf paradox demod" }, + { 0, "lf paradox reader" }, + { 0, "lf paradox clone" }, + { 0, "lf paradox sim" }, + { 1, "lf pcf7931 help" }, + { 0, "lf pcf7931 reader" }, + { 0, "lf pcf7931 write" }, + { 1, "lf pcf7931 config" }, + { 1, "lf presco help" }, + { 1, "lf presco demod" }, + { 0, "lf presco reader" }, + { 0, "lf presco clone" }, + { 0, "lf presco sim" }, + { 1, "lf pyramid help" }, + { 1, "lf pyramid demod" }, + { 0, "lf pyramid reader" }, + { 0, "lf pyramid clone" }, + { 0, "lf pyramid sim" }, + { 1, "lf securakey help" }, + { 1, "lf securakey demod" }, + { 0, "lf securakey reader" }, + { 0, "lf securakey clone" }, + { 0, "lf securakey sim" }, + { 1, "lf ti help" }, + { 1, "lf ti demod" }, + { 0, "lf ti reader" }, + { 0, "lf ti write" }, + { 1, "lf t55xx help" }, + { 0, "lf t55xx clonehelp" }, + { 1, "lf t55xx config" }, + { 0, "lf t55xx dangerraw" }, + { 1, "lf t55xx detect" }, + { 0, "lf t55xx deviceconfig" }, + { 0, "lf t55xx dump" }, + { 1, "lf t55xx info" }, + { 0, "lf t55xx p1detect" }, + { 0, "lf t55xx read" }, + { 0, "lf t55xx resetread" }, + { 0, "lf t55xx restore" }, + { 1, "lf t55xx trace" }, + { 0, "lf t55xx wakeup" }, + { 0, "lf t55xx write" }, + { 0, "lf t55xx bruteforce" }, + { 0, "lf t55xx chk" }, + { 0, "lf t55xx protect" }, + { 0, "lf t55xx recoverpw" }, + { 1, "lf t55xx sniff" }, + { 0, "lf t55xx special" }, + { 0, "lf t55xx wipe" }, + { 1, "lf viking help" }, + { 1, "lf viking demod" }, + { 0, "lf viking reader" }, + { 0, "lf viking clone" }, + { 0, "lf viking sim" }, + { 1, "lf visa2000 help" }, + { 1, "lf visa2000 demod" }, + { 0, "lf visa2000 reader" }, + { 0, "lf visa2000 clone" }, + { 0, "lf visa2000 sim" }, + { 1, "mem help" }, + { 0, "mem baudrate" }, + { 0, "mem dump" }, + { 0, "mem info" }, + { 0, "mem load" }, + { 0, "mem wipe" }, + { 1, "mem spiffs help" }, + { 0, "mem spiffs copy" }, + { 0, "mem spiffs check" }, + { 0, "mem spiffs dump" }, + { 0, "mem spiffs info" }, + { 0, "mem spiffs mount" }, + { 0, "mem spiffs remove" }, + { 0, "mem spiffs rename" }, + { 0, "mem spiffs test" }, + { 0, "mem spiffs tree" }, + { 0, "mem spiffs unmount" }, + { 0, "mem spiffs upload" }, + { 0, "mem spiffs view" }, + { 0, "mem spiffs wipe" }, + { 1, "nfc help" }, + { 1, "nfc decode" }, + { 0, "nfc type1 read" }, + { 1, "nfc type1 help" }, + { 0, "nfc type2 read" }, + { 1, "nfc type2 help" }, + { 0, "nfc type4a format" }, + { 0, "nfc type4a read" }, + { 0, "nfc type4a write" }, + { 0, "nfc type4a st25taread" }, + { 1, "nfc type4a help" }, + { 0, "nfc type4b read" }, + { 1, "nfc type4b help" }, + { 0, "nfc mf cformat" }, + { 0, "nfc mf cread" }, + { 0, "nfc mf cwrite" }, + { 0, "nfc mf pread" }, + { 1, "nfc mf help" }, + { 0, "nfc barcode read" }, + { 0, "nfc barcode sim" }, + { 1, "nfc barcode help" }, + { 1, "piv help" }, + { 0, "piv select" }, + { 0, "piv getdata" }, + { 0, "piv authsign" }, + { 0, "piv scan" }, + { 1, "piv list" }, + { 1, "smart help" }, + { 1, "smart list" }, + { 0, "smart info" }, + { 0, "smart reader" }, + { 0, "smart raw" }, + { 1, "smart upgrade" }, + { 0, "smart setclock" }, + { 0, "smart brute" }, + { 1, "script help" }, + { 1, "script list" }, + { 1, "script run" }, + { 1, "trace help" }, + { 1, "trace extract" }, + { 1, "trace list" }, + { 1, "trace load" }, + { 1, "trace save" }, + { 1, "usart help" }, + { 0, "usart btpin" }, + { 0, "usart btfactory" }, + { 0, "usart tx" }, + { 0, "usart rx" }, + { 0, "usart txrx" }, + { 0, "usart txhex" }, + { 0, "usart rxhex" }, + { 0, "usart config" }, + { 1, "wiegand help" }, + { 1, "wiegand list" }, + { 1, "wiegand encode" }, + { 1, "wiegand decode" }, {0, NULL} }; @@ -799,4 +804,4 @@ const static vocabulory_t vocabulory[] = { } #endif -#endif +#endif \ No newline at end of file diff --git a/doc/commands.json b/doc/commands.json index 6523703da..0e64879e5 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -762,9 +762,9 @@ "offline": false, "options": [ "-h, --help This help", - "-k, -K, --keep Keep field ON for next command", - "-a, -A, --apdu Show APDU requests and responses", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" + "-k, --keep Keep field ON for next command", + "-a, --apdu Show APDU requests and responses", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], "usage": "emv challenge [-hkaw]" }, @@ -778,19 +778,19 @@ "offline": false, "options": [ "-h, --help This help", - "-s, -S, --select Activate field and select card", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results", - "-j, -J, --jload Load transaction parameters from `emv_defparams.json` file", - "-f, -F, --forceaid Force search AID. Search AID instead of execute PPSE", + "-s, --select Activate field and select card", + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results", + "-j, --jload Load transaction parameters from `emv_defparams.json` file", + "--force Force search AID. Search AID instead of execute PPSE", "By default: Transaction type - MSD", - "-v, -V, --qvsdc Transaction type - qVSDC or M/Chip", - "-c, -C, --qvsdccda Transaction type - qVSDC or M/Chip plus CDA (SDAD generation)", - "-x, -X, --vsdc Transaction type - VSDC. For test only. Not a standard behavior", - "-g, -G, --acgpo VISA. generate AC from GPO", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" + "-v, --qvsdc Transaction type - qVSDC or M/Chip", + "-c, --qvsdccda Transaction type - qVSDC or M/Chip plus CDA (SDAD generation)", + "-x, --vsdc Transaction type - VSDC. For test only. Not a standard behavior", + "-g, --acgpo VISA. generate AC from GPO", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], - "usage": "emv exec [-hsatjfvcxgw] By default:" + "usage": "emv exec [-hsatjvcxgw] [--force] By default:" }, "emv genac": { "command": "emv genac", @@ -804,14 +804,14 @@ "offline": false, "options": [ "-h, --help This help", - "-k, -K, --keep Keep field ON for next command", - "-c, -C, --cda Executes CDA transaction. Needs to get SDAD in results.", - "-d, -D, --decision Terminal decision. aac - declined, tc - approved, arqc - online authorisation requested", - "-p, -P, --params Load parameters from `emv_defparams.json` file for CDOLdata making from CDOL and parameters", - "-m, -M, --make Make CDOLdata from CDOL (tag 8C and 8D) and parameters (def: use default parameters)", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results of selected applets", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "-k, --keep Keep field ON for next command", + "-c, --cda Executes CDA transaction. Needs to get SDAD in results.", + "-d, --decision Terminal decision. aac - declined, tc - approved, arqc - online authorisation requested", + "-p, --params Load parameters from `emv_defparams.json` file for CDOLdata making from CDOL and parameters", + "-m, --make Make CDOLdata from CDOL (tag 8C and 8D) and parameters (def: use default parameters)", + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results of selected applets", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " CDOLdata/CDOL" ], "usage": "emv genac [-hkcpmatw] [-d ] []..." @@ -827,12 +827,12 @@ "offline": false, "options": [ "-h, --help This help", - "-k, -K, --keep Keep field ON for next command", - "-p, -P, --params Load parameters from `emv_defparams.json` file for PDOLdata making from PDOL and parameters", - "-m, -M, --make Make PDOLdata from PDOL (tag 9F38) and parameters (def: uses default parameters)", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results of selected applets", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "-k, --keep Keep field ON for next command", + "-p, --params Load parameters from `emv_defparams.json` file for PDOLdata making from PDOL and parameters", + "-m, --make Make PDOLdata from PDOL (tag 9F38) and parameters (def: uses default parameters)", + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results of selected applets", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " PDOLdata/PDOL" ], "usage": "emv gpo [-hkpmatw] []..." @@ -848,12 +848,12 @@ "offline": false, "options": [ "-h, --help This help", - "-k, -K, --keep Keep field ON for next command", - "-p, -P, --params Load parameters from `emv_defparams.json` file for DDOLdata making from DDOL and parameters", - "-m, -M, --make Make DDOLdata from DDOL (tag 9F49) and parameters (def: use default parameters)", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results of selected applets", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "-k, --keep Keep field ON for next command", + "-p, --params Load parameters from `emv_defparams.json` file for DDOLdata making from DDOL and parameters", + "-m, --make Make DDOLdata from DDOL (tag 9F49) and parameters (def: use default parameters)", + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results of selected applets", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " DDOLdata/DDOL" ], "usage": "emv intauth [-hkpmatw] []..." @@ -889,16 +889,31 @@ "offline": false, "options": [ "-h, --help This help", - "-s, -S, --select Activate field and select card", - "-k, -K, --keep Keep field ON for next command", + "-s, --select Activate field and select card", + "-k, --keep Keep field ON for next command", "-1, --pse PSE (1PAY.SYS.DDF01) mode", "-2, --ppse PPSE (2PAY.SYS.DDF01) mode (def)", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results of selected applets", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results of selected applets", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], "usage": "emv pse [-hsk12atw]" }, + "emv reader": { + "command": "emv reader", + "description": "Act as a EMV reader to identify tag. Look for EMV tags until Enter or the pm3 button is pressed", + "notes": [ + "emv reader", + "emv reader -@ -> Continuous mode" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "-@ continuous reader mode" + ], + "usage": "emv reader [-hw@]" + }, "emv readrec": { "command": "emv readrec", "description": "Executes Read Record command. It returns data in TLV format. Needs a bank applet to be selected and sometimes needs GPO to be executed.", @@ -909,10 +924,10 @@ "offline": false, "options": [ "-h, --help This help", - "-k, -K, --keep Keep field ON for next command", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results of selected applets", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "-k, --keep Keep field ON for next command", + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results of selected applets", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " []..." @@ -927,9 +942,9 @@ "offline": false, "options": [ "-h, --help This help", - "-t, -T, --selftest Self test", - "-a, -A, --apdu Show APDU requests and responses", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" + "-t, --selftest Self test", + "-a, --apdu Show APDU requests and responses", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], "usage": "emv roca [-htaw]" }, @@ -943,18 +958,18 @@ "offline": false, "options": [ "-h, --help This help", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results", - "-e, -E, --extract Extract TLV elements and fill Application Data", - "-j, -J, --jload Load transaction parameters from `emv_defparams.json` file", + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results", + "-e, --extract Extract TLV elements and fill Application Data", + "-j, --jload Load transaction parameters from `emv_defparams.json` file", "By default: Transaction type - MSD", - "-v, -V, --qvsdc Transaction type - qVSDC or M/Chip", - "-c, -C, --qvsdccda Transaction type - qVSDC or M/Chip plus CDA (SDAD generation)", - "-x, -X, --vsdc Transaction type - VSDC. For test only. Not a standard behavior", - "-g, -G, --acgpo VISA. generate AC from GPO", - "-m, -M, --merge Merge output file with card's data. (warning: the file may be corrupted!)", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", - " JSON output filename" + "-v, --qvsdc Transaction type - qVSDC or M/Chip", + "-c, --qvsdccda Transaction type - qVSDC or M/Chip plus CDA (SDAD generation)", + "-x, --vsdc Transaction type - VSDC. For test only. Not a standard behavior", + "-g, --acgpo VISA. generate AC from GPO", + "-m, --merge Merge output file with card's data. (warning: the file may be corrupted!)", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + " JSON output file name" ], "usage": "emv scan [-hatejvcxgmw] By default: " }, @@ -968,11 +983,11 @@ "offline": false, "options": [ "-h, --help This help", - "-s, -S, --select Activate field and select card", - "-k, -K, --keep Keep field ON for next command", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results of selected applets", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" + "-s, --select Activate field and select card", + "-k, --keep Keep field ON for next command", + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results of selected applets", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)" ], "usage": "emv search [-hskatw]" }, @@ -986,11 +1001,11 @@ "offline": false, "options": [ "-h, --help This help", - "-s, -S, --select Activate field and select card", - "-k, -K, --keep Keep field for next command", - "-a, -A, --apdu Show APDU requests and responses", - "-t, -T, --tlv TLV decode results", - "-w, -W, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", + "-s, --select Activate field and select card", + "-k, --keep Keep field for next command", + "-a, --apdu Show APDU requests and responses", + "-t, --tlv TLV decode results", + "-w, --wired Send data via contact (iso7816) interface. (def: Contactless interface)", " Applet AID" ], "usage": "emv select [-hskatw] " @@ -7091,6 +7106,39 @@ ], "usage": "hf tune [-h] [-n ] [--bar] [--mix] [--value]" }, + "hf vas decrypt": { + "command": "hf vas decrypt", + "description": "Decrypt a previously captured cryptogram", + "notes": [ + "hf vas decrypt --pid pass.com.passkit.pksamples.nfcdemo -f vas_privkey.der -d c0b77375eae416b79449347f9fe838c05cdb57dc7470b97b93b806cb348771d9bfbe29d58538c7c7d7c3d015fa205b68bfccd726058a62f7f44085ac98dbf877120fd9059f1507b956e0a6d56d0a" + ], + "offline": true, + "options": [ + "-h, --help This help", + "--pid PID, pass type id", + "-f, --file path to terminal private key file", + "-d, --data cryptogram to decrypt" + ], + "usage": "hf vas decrypt [-h] [--pid ] [-f ] [-d ]" + }, + "hf vas reader": { + "command": "hf vas reader", + "description": "Read and decrypt Value Added Services (VAS) message", + "notes": [ + "hf vas reader --url https://example.com -> URL Only mode", + "hf vas reader --pid pass.com.passkit.pksamples.nfcdemo -f vas_privkey.der -@" + ], + "offline": false, + "options": [ + "-h, --help This help", + "--pid PID, pass type id", + "-f, --file path to terminal private key file", + "--url a URL to provide to the mobile device", + "-@ continuous mode", + "-v, --verbose log additional information" + ], + "usage": "hf vas reader [-h@v] [--pid ] [-f ] [--url ]" + }, "hf waveshare loadbmp": { "command": "hf waveshare loadbmp", "description": "Load BMP file to Waveshare NFC ePaper.", @@ -7391,6 +7439,21 @@ ], "usage": "hw tia [-h]" }, + "hw timeout": { + "command": "hw timeout", + "description": "Set the communication timeout on the client side", + "notes": [ + "hw timeout -> Show current timeout", + "hw timeout -t 20 -> Set the timeout to 20ms", + "hw timeout -t 500 -> Set the timeout to 500ms" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-t, --timeout timeout in ms" + ], + "usage": "hw timeout [-h] [-t ]" + }, "hw tune": { "command": "hw tune", "description": "Measure antenna tuning", @@ -11622,8 +11685,8 @@ } }, "metadata": { - "commands_extracted": 675, + "commands_extracted": 679, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-06-27T13:20:13" + "extracted_on": "2023-07-10T14:40:45" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index a27cf6964..ce203b57a 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -141,19 +141,20 @@ Check column "offline" for their availability. |command |offline |description |------- |------- |----------- |`emv help `|Y |`This help` +|`emv list `|Y |`List ISO7816 history` +|`emv test `|Y |`Crypto logic test` +|`emv challenge `|N |`Generate challenge` |`emv exec `|N |`Executes EMV contactless transaction` +|`emv genac `|N |`Generate ApplicationCryptogram` +|`emv gpo `|N |`Execute GetProcessingOptions` +|`emv intauth `|N |`Internal authentication` |`emv pse `|N |`Execute PPSE. It selects 2PAY.SYS.DDF01 or 1PAY.SYS.DDF01 directory` +|`emv reader `|N |`Act like an EMV reader` +|`emv readrec `|N |`Read files from card` +|`emv roca `|N |`Extract public keys and run ROCA test` +|`emv scan `|N |`Scan EMV card and save it contents to json file for emulator` |`emv search `|N |`Try to select all applets from applets list and print installed applets` |`emv select `|N |`Select applet` -|`emv gpo `|N |`Execute GetProcessingOptions` -|`emv readrec `|N |`Read files from card` -|`emv genac `|N |`Generate ApplicationCryptogram` -|`emv challenge `|N |`Generate challenge` -|`emv intauth `|N |`Internal authentication` -|`emv scan `|N |`Scan EMV card and save it contents to json file for emulator` -|`emv test `|Y |`Crypto logic test` -|`emv list `|Y |`List ISO7816 history` -|`emv roca `|N |`Extract public keys and run ROCA test` ### hf @@ -482,7 +483,7 @@ Check column "offline" for their availability. |`hf mf nack `|N |`Test for MIFARE NACK bug` |`hf mf chk `|N |`Check keys` |`hf mf fchk `|N |`Check keys fast, targets all keys on card` -|`hf mf decrypt `|Y |`[nt] [ar_enc] [at_enc] [data] - to decrypt sniff or trace` +|`hf mf decrypt `|Y |`Decrypt Crypto1 data from sniff or trace` |`hf mf supercard `|N |`Extract info from a `super card`` |`hf mf auth4 `|N |`ISO14443-4 AES authentication` |`hf mf acl `|Y |`Decode and print MIFARE Classic access rights bytes` @@ -720,16 +721,15 @@ Check column "offline" for their availability. |`hf topaz wrbl `|N |`Write block` -### hf xerox +### hf vas - { Fuji/Xerox cartridge RFIDs... } + { Apple Value Added Service } |command |offline |description |------- |------- |----------- -|`hf xerox help `|Y |`This help` -|`hf xerox info `|N |`Short info on Fuji/Xerox tag` -|`hf xerox reader `|N |`Act like a Fuji/Xerox reader` -|`hf xerox dump `|N |`Read all memory pages of an Fuji/Xerox tag, save to file` +|`hf vas help `|Y |`This help` +|`hf vas reader `|N |`Read and decrypt VAS message` +|`hf vas decrypt `|Y |`Decrypt a previously captured VAS cryptogram` ### hf waveshare @@ -742,6 +742,18 @@ Check column "offline" for their availability. |`hf waveshare loadbmp `|N |`Load BMP file to Waveshare NFC ePaper` +### hf xerox + + { Fuji/Xerox cartridge RFIDs... } + +|command |offline |description +|------- |------- |----------- +|`hf xerox help `|Y |`This help` +|`hf xerox info `|N |`Short info on Fuji/Xerox tag` +|`hf xerox reader `|N |`Act like a Fuji/Xerox reader` +|`hf xerox dump `|N |`Read all memory pages of an Fuji/Xerox tag, save to file` + + ### hw { Hardware commands... } @@ -765,6 +777,7 @@ Check column "offline" for their availability. |`hw status `|N |`Show runtime status information about the connected Proxmark3` |`hw tearoff `|N |`Program a tearoff hook for the next command supporting tearoff` |`hw tia `|N |`Trigger a Timing Interval Acquisition to re-adjust the RealTimeCounter divider` +|`hw timeout `|Y |`Set the communication timeout on the client side` |`hw tune `|N |`Measure antenna tuning` |`hw version `|Y |`Show version information about the client and the connected Proxmark3, if any` From 8550689c37cba66c6ed0186f6110b5cf13371ca5 Mon Sep 17 00:00:00 2001 From: Iceman Date: Mon, 10 Jul 2023 16:44:14 +0200 Subject: [PATCH 624/924] Update emv_notes.md Signed-off-by: Iceman --- doc/emv_notes.md | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/doc/emv_notes.md b/doc/emv_notes.md index 60f85ebb8..cd03e5d21 100644 --- a/doc/emv_notes.md +++ b/doc/emv_notes.md @@ -65,14 +65,14 @@ They can be implemented, but it needs to know issuer's card keys (usually 3DES) All this commands are parts of command `emv exec`. command `emv exec` executes EMV transaction. it have parameters: ``` - -j, -J, --jload Load transaction parameters from `emv/defparams.json` file. - -f, -F, --forceaid Force search AID. Search AID instead of execute PPSE. - By default: Transaction type - MSD - -v, -V, --qvsdc Transaction type - qVSDC or M/Chip. - -c, -C, --qvsdccda Transaction type - qVSDC or M/Chip plus CDA (SDAD generation). - -x, -X, --vsdc Transaction type - VSDC. - -g, -G, --acgpo VISA. generate AC from GPO. - -w, -W, --wired Send data via contact (iso7816) interface. Contactless interface set by default. + -j, --jload Load transaction parameters from `emv/defparams.json` file. + --forceaid Force search AID. Search AID instead of execute PPSE. + By default: Transaction type - MSD + -v, --qvsdc Transaction type - qVSDC or M/Chip. + -c, --qvsdccda Transaction type - qVSDC or M/Chip plus CDA (SDAD generation). + -x, --vsdc Transaction type - VSDC. + -g, --acgpo VISA. generate AC from GPO. + -w, --wired Send data via contact (iso7816) interface. Contactless interface set by default. ``` It works for VISA(r) and Mastercard(r) transactions. It may work with other EMV payment system's card (and it works in general cases that is described in EMV). @@ -96,19 +96,23 @@ MSD - compatibility mode. Now it work always. But it less secure and in near fut ^[Top](#top) ``` -exec Executes EMV contactless transaction. -pse Execute PPSE. It selects 2PAY.SYS.DDF01 or 1PAY.SYS.DDF01 directory. -search Try to select all applets from applets list and print installed applets. -select Select applet. -gpo Execute GetProcessingOptions. -readrec Read files from card. -genac Generate ApplicationCryptogram. -challenge Generate challenge. -intauth Internal authentication. -scan Scan EMV card and save it contents to json file for emulator. -test Crypto logic test. +----------- ----------------------- general ----------------------- +help This help list List ISO7816 history +test Crypto logic test +----------- ---------------------- operations --------------------- +challenge Generate challenge +exec Executes EMV contactless transaction +genac Generate ApplicationCryptogram +gpo Execute GetProcessingOptions +intauth Internal authentication +pse Execute PPSE. It selects 2PAY.SYS.DDF01 or 1PAY.SYS.DDF01 directory +reader Act like an EMV reader +readrec Read files from card roca Extract public keys and run ROCA test +scan Scan EMV card and save it contents to json file for emulator +search Try to select all applets from applets list and print installed applets +select Select applet ``` All main commands are parts of EMV specification. Commands than not described there: From aa7a0b7eddbcc46e28d132d091935eb58f2400bc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 17:22:16 +0200 Subject: [PATCH 625/924] coverty fixes.. those are not pointers to pointer.. --- client/src/emv/cmdemv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 87ebd4930..1f57acbb1 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -87,7 +87,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { if (prefname_full != NULL) { const struct tlv *prefname_tlv = tlvdb_get_tlv(prefname_full); if (prefname_tlv->len) { - char *name[64] = {0}; + char name[64] = {0}; size_t n = MIN(sizeof(name), prefname_tlv->len); memcpy(name, prefname_tlv->value, n); PrintAndLogEx(INFO, "Application.......... " _YELLOW_("%s"), name); @@ -99,7 +99,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { if (alabel != NULL) { const struct tlv *alabel_tlv = tlvdb_get_tlv(alabel); if (alabel_tlv->len) { - char *name[64] = {0}; + char name[64] = {0}; size_t n = MIN(sizeof(name), alabel_tlv->len); memcpy(name, alabel_tlv->value, n); PrintAndLogEx(INFO, "Label................ " _YELLOW_("%s"), name); @@ -111,7 +111,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { if (lang_full != NULL) { const struct tlv *lang_tlv = tlvdb_get_tlv(lang_full); if (lang_tlv->len) { - char *lang[16] = {0}; + char lang[16] = {0}; size_t n = MIN(sizeof(lang), lang_tlv->len); memcpy(lang, lang_tlv->value, n); PrintAndLogEx(INFO, "Language............. " _YELLOW_("%s"), lang); From 503ccbe6a250cf6544a23a383497652c056e9e2b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 20:23:04 +0200 Subject: [PATCH 626/924] helptext --- client/src/cmdhffido.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index 64cc8a43f..a8021e4cf 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -97,14 +97,14 @@ static int CmdHFFidoInfo(const char *Cmd) { if (!strncmp((char *)buf, "U2F_V2", 7)) { if (!strncmp((char *)buf, "FIDO_2_0", 8)) { - PrintAndLogEx(INFO, "FIDO2 authenticator detected. Version: %.*s", (int)len, buf); + PrintAndLogEx(INFO, "FIDO2 authenticator detected. Version... " _YELLOW_("%.*s"), (int)len, buf); } else { PrintAndLogEx(INFO, "FIDO authenticator detected (not standard U2F)."); PrintAndLogEx(INFO, "Non U2F authenticator version:"); print_buffer((const unsigned char *)buf, len, 1); } } else { - PrintAndLogEx(INFO, "FIDO U2F authenticator detected. Version: %.*s", (int)len, buf); + PrintAndLogEx(INFO, "FIDO U2F authenticator detected. Version... " _YELLOW_("%.*s"), (int)len, buf); } res = FIDO2GetInfo(buf, sizeof(buf), &len, &sw); @@ -409,8 +409,8 @@ static int CmdHFFidoAuthenticate(const char *cmd) { "hf fido auth --kh 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with 2 parameters, filled 0x00 and key handle\n" "hf fido auth \n" "--kh 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f\n" - "--cp 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f \n" - "--ap 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with parameters"); + "--cpx 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f \n" + "--apx 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with parameters"); void *argtable[] = { arg_param_begin, From a32b7b72727ffe5a9d8e9043dd184a592a40182b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 10 Jul 2023 20:33:52 +0200 Subject: [PATCH 627/924] style --- doc/commands.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/commands.json b/doc/commands.json index 0e64879e5..d4cbf628a 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -11687,6 +11687,6 @@ "metadata": { "commands_extracted": 679, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2023-07-10T14:40:45" + "extracted_on": "2023-07-10T18:33:37" } } \ No newline at end of file From 4ffb779b40b262ceee275cb90fd343861877e937 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 11 Jul 2023 08:26:58 +0200 Subject: [PATCH 628/924] added a track1 decoder --- CHANGELOG.md | 1 + client/src/emv/cmdemv.c | 75 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed09b06ec..3e05dc1a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Changed `emv reader -v` - now can decode track1 data if found (@iceman1001) - Added `emv reader` - act as a EMV reader (@iceman1001) - Added support for Apple Wallet NFC Passes with the Value Added Services protocol implementation (@gm3197) - Fix compiling liblua on iOS (@The-SamminAter) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 1f57acbb1..169c24b69 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -75,7 +75,67 @@ static void PrintChannel(Iso7816CommandChannel channel) { } } -static int emv_parse_card_details(uint8_t *response, size_t reslen) { +static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ + if (d == NULL || n < 10) { + return PM3_EINVARG; + } + if (verbose == false) { + return PM3_SUCCESS; + } + + // sanity checks + if (d[0] != 'B') { + return PM3_EINVARG; + } + + // decoder + char delim[2] = "^"; + char *tmp = str_ndup((const char*)d, n); + + uint8_t i = 0; + char *token = strtok(tmp, delim); + while (token != NULL) { + + switch(i) { + case 0: + PrintAndLogEx(INFO, "PAN............ %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c", + token[1], token[2],token[3], token[4], + token[5], token[6],token[7], token[8], + token[9], token[10],token[11], token[12], + token[13], token[14],token[15], token[16] + ); + break; + case 1: + PrintAndLogEx(INFO, "CardHolder..... %s", token); + break; + case 2: + if (strlen(token) < 17) { + break; + } + PrintAndLogEx(INFO, "Expiry date.... %.*s", 4, token); + token += 4; + + PrintAndLogEx(INFO, "Service code... %.*s", 3, token); + token += 3; + + PrintAndLogEx(INFO, "Unknown........ %.*s", 4, token); + token += 4; + + PrintAndLogEx(INFO, "CVV / iCvv..... %.*s", 3, token); + token +=3; + + PrintAndLogEx(INFO, "Trailing....... %s", token); + break; + default: + break; + } + token = strtok(0, delim); + i++; + } + return PM3_SUCCESS; +} + +static int emv_parse_card_details(uint8_t *response, size_t reslen, bool verbose) { struct tlvdb *root = tlvdb_parse_multi(response, reslen); if (root == NULL) { @@ -196,6 +256,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen) { const struct tlv *track1_tlv = tlvdb_get_tlv(track1_full); if (track1_tlv->len) { PrintAndLogEx(INFO, "Track 1.............. " _YELLOW_("%s"), sprint_ascii(track1_tlv->value, track1_tlv->len)); + emv_parse_track1(track1_tlv->value, track1_tlv->len, verbose); } } @@ -2282,6 +2343,7 @@ static int CmdEMVReader(const char *Cmd) { void *argtable[] = { arg_param_begin, arg_lit0("w", "wired", "Send data via contact (iso7816) interface. (def: Contactless interface)"), + arg_lit0("v", "verbose", "verbose"), arg_lit0("@", NULL, "continuous reader mode"), arg_param_end }; @@ -2293,15 +2355,14 @@ static int CmdEMVReader(const char *Cmd) { } uint8_t psenum = (channel == CC_CONTACT) ? 1 : 2; - - bool continuous = arg_get_lit(ctx, 2); + bool verbose = arg_get_lit(ctx, 2); + bool continuous = arg_get_lit(ctx, 3); CLIParserFree(ctx); if (continuous) { PrintAndLogEx(INFO, "Press " _GREEN_("Enter") " to exit"); } - uint8_t AID[APDU_AID_LEN] = {0}; size_t AIDlen = 0; uint8_t buf[APDU_RES_LEN] = {0}; @@ -2353,7 +2414,7 @@ static int CmdEMVReader(const char *Cmd) { } // decode application parts - emv_parse_card_details(buf, len); + emv_parse_card_details(buf, len, verbose); for (TransactionType_t tt = TT_MSD; tt < TT_END; tt++) { @@ -2383,7 +2444,7 @@ static int CmdEMVReader(const char *Cmd) { ProcessGPOResponseFormat1(tlvRoot, buf, len, false); - emv_parse_card_details(buf, len); + emv_parse_card_details(buf, len, verbose); if (tlvdb_get(tlvRoot, 0x77, NULL)) { break; @@ -2412,7 +2473,7 @@ static int CmdEMVReader(const char *Cmd) { if (res) { continue; } - emv_parse_card_details(buf, len); + emv_parse_card_details(buf, len, verbose); } } } From 6f29aa6d8f44816f2c2eda85125e8477f9006dce Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 11 Jul 2023 08:56:45 +0200 Subject: [PATCH 629/924] added a track2 decoder. Seems to have odd delimiters and in hex format. Most likely to be problematic when tested against plenty different types --- CHANGELOG.md | 2 +- client/src/emv/cmdemv.c | 66 ++++++++++++++++++++++++++++++++++------- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e05dc1a6..56daf055e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] - - Changed `emv reader -v` - now can decode track1 data if found (@iceman1001) + - Changed `emv reader -v` - now can decode track1/2 data if found (@iceman1001) - Added `emv reader` - act as a EMV reader (@iceman1001) - Added support for Apple Wallet NFC Passes with the Value Added Services protocol implementation (@gm3197) - Fix compiling liblua on iOS (@The-SamminAter) diff --git a/client/src/emv/cmdemv.c b/client/src/emv/cmdemv.c index 169c24b69..e1518971b 100644 --- a/client/src/emv/cmdemv.c +++ b/client/src/emv/cmdemv.c @@ -89,16 +89,15 @@ static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ } // decoder - char delim[2] = "^"; char *tmp = str_ndup((const char*)d, n); - uint8_t i = 0; + char delim[2] = "^"; char *token = strtok(tmp, delim); while (token != NULL) { switch(i) { case 0: - PrintAndLogEx(INFO, "PAN............ %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c", + PrintAndLogEx(INFO, "PAN...................... %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c", token[1], token[2],token[3], token[4], token[5], token[6],token[7], token[8], token[9], token[10],token[11], token[12], @@ -106,25 +105,25 @@ static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ ); break; case 1: - PrintAndLogEx(INFO, "CardHolder..... %s", token); + PrintAndLogEx(INFO, "CardHolder............... %s", token); break; case 2: - if (strlen(token) < 17) { + if (strlen(token) < 14) { break; } - PrintAndLogEx(INFO, "Expiry date.... %.*s", 4, token); + PrintAndLogEx(INFO, "Expiry date.............. %.*s ( %c%c/%c%c )", 4, token, token[2], token[3], token[0], token[1]); token += 4; - PrintAndLogEx(INFO, "Service code... %.*s", 3, token); + PrintAndLogEx(INFO, "Service code............. %.*s", 3, token); token += 3; - PrintAndLogEx(INFO, "Unknown........ %.*s", 4, token); + PrintAndLogEx(INFO, "Unknown.................. %.*s", 4, token); token += 4; - PrintAndLogEx(INFO, "CVV / iCvv..... %.*s", 3, token); + PrintAndLogEx(INFO, "CVV / iCvv............... %.*s", 3, token); token +=3; - PrintAndLogEx(INFO, "Trailing....... %s", token); + PrintAndLogEx(INFO, "Trailing................. %s", token); break; default: break; @@ -132,6 +131,51 @@ static int emv_parse_track1(const uint8_t *d, size_t n, bool verbose){ token = strtok(0, delim); i++; } + free(tmp); + return PM3_SUCCESS; +} + +static int emv_parse_track2(const uint8_t *d, size_t n, bool verbose) { + if (d == NULL || n < 10) { + return PM3_EINVARG; + } + if (verbose == false) { + return PM3_SUCCESS; + } + + // decoder + uint8_t s[80] = {0}; + hex_to_buffer(s, d, n, n, 0, 0, true); + uint8_t *tmp = s; + + if (tmp[0] == ';') + tmp++; + + PrintAndLogEx(INFO, "PAN...................... %c%c%c%c %c%c%c%c %c%c%c%c %c%c%c%c", + tmp[0], tmp[1], tmp[2],tmp[3], + tmp[4], tmp[5], tmp[6],tmp[7], + tmp[8], tmp[9], tmp[10],tmp[11], + tmp[12],tmp[13], tmp[14],tmp[15] + ); + tmp += 16; + + if (tmp[0] == '=' || tmp[0] == 'D') + tmp++; + + PrintAndLogEx(INFO, "Expiry date.............. %.*s ( %c%c/%c%c )", 4, tmp, tmp[2], tmp[3], tmp[0], tmp[1]); + tmp += 4; + + PrintAndLogEx(INFO, "Service code............. %.*s", 3, tmp); + tmp += 3; + + PrintAndLogEx(INFO, "Pin verification value... %.*s", 4, tmp); + tmp += 4; + + PrintAndLogEx(INFO, "CVV / iCvv............... %.*s", 3, tmp); + tmp +=3; + + PrintAndLogEx(INFO, "Trailing................. %s", tmp); + return PM3_SUCCESS; } @@ -266,6 +310,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen, bool verbose const struct tlv *track2_tlv = tlvdb_get_tlv(track2_full); if (track2_tlv->len) { PrintAndLogEx(INFO, "Track 2.............. " _YELLOW_("%s"), sprint_hex_inrow(track2_tlv->value, track2_tlv->len)); + emv_parse_track2(track2_tlv->value, track2_tlv->len, verbose); } } @@ -275,6 +320,7 @@ static int emv_parse_card_details(uint8_t *response, size_t reslen, bool verbose const struct tlv *track2_eq_tlv = tlvdb_get_tlv(track2_eq_full); if (track2_eq_tlv->len) { PrintAndLogEx(INFO, "Track 2 equivalent... " _YELLOW_("%s"), sprint_hex_inrow(track2_eq_tlv->value, track2_eq_tlv->len)); + emv_parse_track2(track2_eq_tlv->value, track2_eq_tlv->len, verbose); } } From 33d90993e32992434ac17038cab5f00a77d1ca83 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 11 Jul 2023 14:39:13 +0200 Subject: [PATCH 630/924] more bluetooth simple pairing options. No decoder yet. --- client/src/nfc/ndef.c | 49 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/client/src/nfc/ndef.c b/client/src/nfc/ndef.c index e03913fbc..3e2e1973f 100644 --- a/client/src/nfc/ndef.c +++ b/client/src/nfc/ndef.c @@ -32,12 +32,16 @@ #define STRBOOL(p) ((p) ? "1" : "0") -#define NDEF_WIFIAPPL_WSC "application/vnd.wfa.wsc" -#define NDEF_WIFIAPPL_P2P "application/vnd.wfa.p2p" -#define NDEF_BLUEAPPL "application/vnd.bluetooth" -#define NDEF_JSONAPPL "application/json" -#define NDEF_VCARDTEXT "text/vcard" -#define NDEF_XVCARDTEXT "text/x-vcard" +#define NDEF_WIFIAPPL_WSC "application/vnd.wfa.wsc" +#define NDEF_WIFIAPPL_P2P "application/vnd.wfa.p2p" +#define NDEF_JSONAPPL "application/json" +#define NDEF_VCARDTEXT "text/vcard" +#define NDEF_XVCARDTEXT "text/x-vcard" + +#define NDEF_BLUEAPPL_EP "application/vnd.bluetooth.ep.oob" +#define NDEF_BLUEAPPL_LE "application/vnd.bluetooth.le.oob" +#define NDEF_BLUEAPPL_SECURE_LE "application/vnd.bluetooth.secure.le.oob" + static const char *TypeNameFormat_s[] = { "Empty Record", @@ -854,6 +858,26 @@ static int ndefDecodeMime_json(NDEFHeader_t *ndef) { return PM3_SUCCESS; } +static int ndefDecodeMime_bt_secure_le_oob(NDEFHeader_t *ndef) { + if (ndef->PayloadLen == 0) { + PrintAndLogEx(INFO, "no payload"); + return PM3_SUCCESS; + } + PrintAndLogEx(INFO, "Type............ " _YELLOW_("%.*s"), (int)ndef->TypeLen, ndef->Type); + PrintAndLogEx(INFO, "To be implemented. Feel free to contribute!"); + return PM3_SUCCESS; +} + +static int ndefDecodeMime_bt_le_oob(NDEFHeader_t *ndef) { + if (ndef->PayloadLen == 0) { + PrintAndLogEx(INFO, "no payload"); + return PM3_SUCCESS; + } + PrintAndLogEx(INFO, "Type............ " _YELLOW_("%.*s"), (int)ndef->TypeLen, ndef->Type); + PrintAndLogEx(INFO, "To be implemented. Feel free to contribute!"); + return PM3_SUCCESS; +} + static int ndefDecodeMime_bt(NDEFHeader_t *ndef) { if (ndef->PayloadLen == 0) { PrintAndLogEx(INFO, "no payload"); @@ -1023,9 +1047,18 @@ static int ndefDecodePayload(NDEFHeader_t *ndef, bool verbose) { if (str_startswith(begin, NDEF_VCARDTEXT) || str_startswith(begin, NDEF_XVCARDTEXT)) { ndefDecodeMime_vcard(ndef); } - if (str_startswith(begin, NDEF_BLUEAPPL)) { - ndefDecodeMime_bt(ndef); + + + if (str_startswith(begin, NDEF_BLUEAPPL_EP)) { + ndefDecodeMime_bt(ndef); } + if (str_startswith(begin, NDEF_BLUEAPPL_SECURE_LE)) { + ndefDecodeMime_bt_secure_le_oob(ndef); + } + if (str_startswith(begin, NDEF_BLUEAPPL_LE)) { + ndefDecodeMime_bt_le_oob(ndef); + } + if (str_startswith(begin, NDEF_JSONAPPL)) { ndefDecodeMime_json(ndef); } From 57945c521351da3d49f8ccc65343af68f08ad959 Mon Sep 17 00:00:00 2001 From: Roman D Date: Tue, 11 Jul 2023 19:04:15 +0300 Subject: [PATCH 631/924] Implement uncompressed hardnested tables loader --- client/src/cmdhfmfhard.c | 61 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index c885e41c9..9ae2e42e4 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -52,6 +52,7 @@ #define STATE_FILES_DIRECTORY "hardnested_tables/" #define STATE_FILE_TEMPLATE "bitflip_%d_%03" PRIx16 "_states.bin.bz2" +#define STATE_FILE_TEMPLATE_RAW "bitflip_%d_%03" PRIx16 "_states.bin" #define DEBUG_KEY_ELIMINATION // #define DEBUG_REDUCTION @@ -260,10 +261,13 @@ static void init_bitflip_bitarrays(void) { char state_files_path[strlen(get_my_executable_directory()) + strlen(STATE_FILES_DIRECTORY) + strlen(STATE_FILE_TEMPLATE) + 1]; char state_file_name[strlen(STATE_FILE_TEMPLATE) + 1]; + char state_file_raw_name[strlen(STATE_FILE_TEMPLATE_RAW) + 1]; for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { num_effective_bitflips[odd_even] = 0; for (uint16_t bitflip = 0x001; bitflip < 0x400; bitflip++) { + bool open_uncompressed = false; + bitflip_bitarrays[odd_even][bitflip] = NULL; count_bitflip_bitarrays[odd_even][bitflip] = 1 << 24; @@ -273,14 +277,21 @@ static void init_bitflip_bitarrays(void) { char *path; if (searchFile(&path, RESOURCES_SUBDIR, state_files_path, "", true) != PM3_SUCCESS) { - continue; + snprintf(state_file_raw_name, sizeof(state_file_raw_name), STATE_FILE_TEMPLATE_RAW, odd_even, bitflip); + strncpy(state_files_path, STATE_FILES_DIRECTORY, sizeof(state_files_path) - 1); + strncat(state_files_path, state_file_raw_name, sizeof(state_files_path) - (strlen(STATE_FILES_DIRECTORY) + 1)); + if (searchFile(&path, RESOURCES_SUBDIR, state_files_path, "", true) == PM3_SUCCESS) { + open_uncompressed = true; + } else { + continue; + } } FILE *statesfile = fopen(path, "rb"); free(path); if (statesfile == NULL) { continue; - } else { + } else if (!open_uncompressed) { fseek(statesfile, 0, SEEK_END); int fsize = ftell(statesfile); if (fsize == -1) { @@ -335,6 +346,52 @@ static void init_bitflip_bitarrays(void) { #endif } BZ2_bzDecompressEnd(&compressed_stream); + } else { + fseek(statesfile, 0, SEEK_END); + int fsize = ftell(statesfile); + if (fsize == -1) { + PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); + fclose(statesfile); + exit(5); + } + uint32_t filesize = (uint32_t)fsize; + rewind(statesfile); + + uint32_t count = 0; + size_t bytesread = fread(&count, 1, sizeof(count), statesfile); + if (bytesread != 4) { + PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); + fclose(statesfile); + exit(5); + } + + if ((float)count / (1 << 24) < IGNORE_BITFLIP_THRESHOLD) { + uint32_t *bitset = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1 << 19)); + if (bitset == NULL) { + PrintAndLogEx(ERR, "Out of memory error in init_bitflip_statelists(). Aborting...\n"); + fclose(statesfile); + exit(4); + } + + bytesread = fread(bitset, 1, filesize-sizeof(count), statesfile); + if (bytesread != filesize-sizeof(count)) { + PrintAndLogEx(ERR, "File read error with %s. Aborting...\n", state_file_name); + fclose(statesfile); + exit(5); + } + + effective_bitflip[odd_even][num_effective_bitflips[odd_even]++] = bitflip; + bitflip_bitarrays[odd_even][bitflip] = bitset; + count_bitflip_bitarrays[odd_even][bitflip] = count; +#if defined (DEBUG_REDUCTION) + PrintAndLogEx(INFO, "(%03" PRIx16 " %s:%5.1f%%) ", bitflip, odd_even ? "odd " : "even", (float)count / (1 << 24) * 100.0); + line++; + if (line == 8) { + PrintAndLogEx(NORMAL, ""); + line = 0; + } +#endif + } } } effective_bitflip[odd_even][num_effective_bitflips[odd_even]] = 0x400; // EndOfList marker From 66120ac71ad2693336fd548907a596745bc38883 Mon Sep 17 00:00:00 2001 From: kormax Date: Wed, 12 Jul 2023 10:45:24 +0300 Subject: [PATCH 632/924] Update ECP database --- client/resources/ecplist.json | 44 +++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/client/resources/ecplist.json b/client/resources/ecplist.json index 0ce7fcda5..3902e2f2d 100644 --- a/client/resources/ecplist.json +++ b/client/resources/ecplist.json @@ -57,6 +57,11 @@ "description": "" }, + { + "value": "6a02c3020602ffff", + "name": "Access: Hotel: Hilton", + "description": "TCI might be a wildcard before a reservation is made" + }, { "value": "6a02cb0206021100deadbeefdeadbeef", @@ -64,10 +69,45 @@ "description": "Last 8 bytes refer to reader group identifier, common for all readers in same home installation, allows to differentiate between keys for different homes" }, + { + "value": "6a02c30209010001", + "name": "Access: Car Pairing: BMW", + "description": "Device does not respond to poll after this frame. Displays a car pairing popup for BMW" + }, { "value": "6a02c30209010201", - "name": "Access: Mercedes Pairing", - "description": "Device does not respond to this frame. Displays a car pairing popup for Mercedes" + "name": "Access: Car Pairing: Mercedes", + "description": "Device does not respond to poll after this frame. Displays a car pairing popup for Mercedes" + }, + { + "value": "6a02c30209010051", + "name": "Access: Car Pairing: Genesis", + "description": "Device does not respond to poll after this frame. Displays a car pairing popup for Genesis" + }, + { + "value": "6a02c30209010041", + "name": "Access: Car Pairing: KIA", + "description": "Device does not respond to poll after this frame. Displays a car pairing popup for KIA" + }, + { + "value": "6a02c30209010301", + "name": "Access: Car Pairing: Hyundai", + "description": "Device does not respond to poll after this frame. Displays a car pairing popup for Hyundai" + }, + { + "value": "6a02c30209010701", + "name": "Access: Car Pairing: BYD", + "description": "Device does not respond to poll after this frame. Displays a car pairing popup for BYD" + }, + { + "value": "6a02c30209010241", + "name": "Access: Car Pairing: Denza", + "description": "Device does not respond to poll after this frame. Displays a car pairing popup for Denza" + }, + { + "value": "6a02c30209010091", + "name": "Access: Car Pairing: Lotus", + "description": "Device does not respond to poll after this frame. Displays a car pairing popup for Lotus" }, From b708332ea303625c96dc425fe05a453ca2920870 Mon Sep 17 00:00:00 2001 From: Roman D Date: Wed, 12 Jul 2023 10:55:27 +0300 Subject: [PATCH 633/924] Eliminate extraneous num_CPUs() calls --- client/src/cmdhfmfhard.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/client/src/cmdhfmfhard.c b/client/src/cmdhfmfhard.c index 9ae2e42e4..090dcf531 100644 --- a/client/src/cmdhfmfhard.c +++ b/client/src/cmdhfmfhard.c @@ -1280,31 +1280,32 @@ __attribute__((force_align_arg_pointer)) static void check_for_BitFlipProperties(bool time_budget) { // create and run worker threads - pthread_t thread_id[NUM_CHECK_BITFLIPS_THREADS]; + const size_t num_check_bitflip_threads = NUM_CHECK_BITFLIPS_THREADS; + pthread_t thread_id[num_check_bitflip_threads]; - uint8_t args[NUM_CHECK_BITFLIPS_THREADS][3]; - uint16_t bytes_per_thread = (256 + (NUM_CHECK_BITFLIPS_THREADS / 2)) / NUM_CHECK_BITFLIPS_THREADS; - for (uint32_t i = 0; i < NUM_CHECK_BITFLIPS_THREADS; i++) { + uint8_t args[num_check_bitflip_threads][3]; + uint16_t bytes_per_thread = (256 + (num_check_bitflip_threads / 2)) / num_check_bitflip_threads; + for (uint32_t i = 0; i < num_check_bitflip_threads; i++) { args[i][0] = i * bytes_per_thread; args[i][1] = MIN(args[i][0] + bytes_per_thread - 1, 255); args[i][2] = time_budget; } // args[][] is uint8_t so max 255, no need to check it - // args[NUM_CHECK_BITFLIPS_THREADS - 1][1] = MAX(args[NUM_CHECK_BITFLIPS_THREADS - 1][1], 255); + // args[num_check_bitflip_threads - 1][1] = MAX(args[num_check_bitflip_threads - 1][1], 255); // start threads - for (uint32_t i = 0; i < NUM_CHECK_BITFLIPS_THREADS; i++) { + for (uint32_t i = 0; i < num_check_bitflip_threads; i++) { pthread_create(&thread_id[i], NULL, check_for_BitFlipProperties_thread, args[i]); } // wait for threads to terminate: - for (uint32_t i = 0; i < NUM_CHECK_BITFLIPS_THREADS; i++) { + for (uint32_t i = 0; i < num_check_bitflip_threads; i++) { pthread_join(thread_id[i], NULL); } if (hardnested_stage & CHECK_2ND_BYTES) { hardnested_stage &= ~CHECK_1ST_BYTES; // we are done with 1st stage, except... - for (uint32_t i = 0; i < NUM_CHECK_BITFLIPS_THREADS; i++) { + for (uint32_t i = 0; i < num_check_bitflip_threads; i++) { if (args[i][1] != 0) { hardnested_stage |= CHECK_1ST_BYTES; // ... when any of the threads didn't complete in time break; @@ -2114,10 +2115,11 @@ static void generate_candidates(uint8_t sum_a0_idx, uint8_t sum_a8_idx) { init_book_of_work(); // create and run worker threads - pthread_t thread_id[NUM_REDUCTION_WORKING_THREADS]; + const size_t num_reduction_working_threads = NUM_REDUCTION_WORKING_THREADS; + pthread_t thread_id[num_reduction_working_threads]; - uint16_t sums1[NUM_REDUCTION_WORKING_THREADS][3]; - for (uint32_t i = 0; i < NUM_REDUCTION_WORKING_THREADS; i++) { + uint16_t sums1[num_reduction_working_threads][3]; + for (uint32_t i = 0; i < num_reduction_working_threads; i++) { sums1[i][0] = sum_a0_idx; sums1[i][1] = sum_a8_idx; sums1[i][2] = i + 1; @@ -2125,7 +2127,7 @@ static void generate_candidates(uint8_t sum_a0_idx, uint8_t sum_a8_idx) { } // wait for threads to terminate: - for (uint32_t i = 0; i < NUM_REDUCTION_WORKING_THREADS; i++) { + for (uint32_t i = 0; i < num_reduction_working_threads; i++) { pthread_join(thread_id[i], NULL); } From bce1429f60552796ecb48e05a179c7494e81a909 Mon Sep 17 00:00:00 2001 From: Roman D Date: Wed, 12 Jul 2023 13:06:07 +0300 Subject: [PATCH 634/924] Dynamically allocate buckets array for the hardnested bruteforce attack. --- .../deps/hardnested/hardnested_bruteforce.c | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index 7766b28d3..719cd62bd 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -78,6 +78,8 @@ THE SOFTWARE. #define DEBUG_KEY_ELIMINATION 1 // #define DEBUG_BRUTE_FORCE +#define MIN_BUCKETS_SIZE 128 + typedef enum { EVEN_STATE = 0, ODD_STATE = 1 @@ -88,7 +90,8 @@ static uint32_t bf_test_nonce[256]; static uint8_t bf_test_nonce_2nd_byte[256]; static uint8_t bf_test_nonce_par[256]; static uint32_t bucket_count = 0; -static statelist_t *buckets[128]; +static size_t buckets_allocated = 0; +static statelist_t **buckets = NULL; static uint32_t keys_found = 0; static uint64_t num_keys_tested; static uint64_t found_bs_key = 0; @@ -294,6 +297,26 @@ static void write_benchfile(statelist_t *candidates) { #endif +static bool ensure_buckets_alloc(size_t need_buckets) { + if (need_buckets > buckets_allocated) { + size_t alloc_sz = ((buckets_allocated == 0) ? MIN_BUCKETS_SIZE : (buckets_allocated * 2)); + while (need_buckets > alloc_sz) { + alloc_sz *= 2; + } + + buckets = realloc(buckets, sizeof(statelist_t *) * alloc_sz); + if (buckets == NULL) { + buckets_allocated = 0; + return false; + } + memset(buckets + buckets_allocated, 0, (alloc_sz - buckets_allocated) * sizeof(statelist_t *)); + buckets_allocated = alloc_sz; + } + + return true; +} + + bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint32_t num_acquired_nonces, uint64_t maximum_states, noncelist_t *nonces, uint8_t *best_first_bytes, uint64_t *found_key) { #if defined (WRITE_BENCH_FILE) write_benchfile(candidates); @@ -310,6 +333,11 @@ bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint bucket_count = 0; for (statelist_t *p = candidates; p != NULL; p = p->next) { if (p->states[ODD_STATE] != NULL && p->states[EVEN_STATE] != NULL) { + if (!ensure_buckets_alloc(bucket_count + 1)) { + PrintAndLogEx(ERR, "Can't allocate buckets, abort!"); + return false; + } + buckets[bucket_count] = p; bucket_count++; } @@ -347,6 +375,10 @@ bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint pthread_join(threads[i], 0); } + free(buckets); + buckets = NULL; + buckets_allocated = 0; + uint64_t elapsed_time = msclock() - start_time; if (bf_rate != NULL) From e1659da7559d1e201601c270c65db8dec6b1571f Mon Sep 17 00:00:00 2001 From: Roman D Date: Wed, 12 Jul 2023 13:14:59 +0300 Subject: [PATCH 635/924] Remove extraneous num_CPUs() calls. --- .../deps/hardnested/hardnested_bruteforce.c | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index 719cd62bd..17edfaad0 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -160,6 +160,7 @@ crack_states_thread(void *x) { uint8_t *best_first_bytes; } *thread_arg; + const int num_brute_force_threads = NUM_BRUTE_FORCE_THREADS; thread_arg = (struct arg *)x; const int thread_id = thread_arg->thread_ID; uint32_t current_bucket = thread_id; @@ -191,7 +192,7 @@ crack_states_thread(void *x) { } } } - current_bucket += NUM_BRUTE_FORCE_THREADS; + current_bucket += num_brute_force_threads; } return NULL; } @@ -323,6 +324,8 @@ bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint #endif bool silent = (bf_rate != NULL); + const int num_brute_force_threads = NUM_BRUTE_FORCE_THREADS; + keys_found = 0; num_keys_tested = 0; found_bs_key = 0; @@ -350,7 +353,7 @@ bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint return false; #endif - pthread_t threads[NUM_BRUTE_FORCE_THREADS]; + pthread_t threads[num_brute_force_threads]; struct args { bool silent; int thread_ID; @@ -359,9 +362,9 @@ bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint uint64_t maximum_states; noncelist_t *nonces; uint8_t *best_first_bytes; - } thread_args[NUM_BRUTE_FORCE_THREADS]; + } thread_args[num_brute_force_threads]; - for (uint32_t i = 0; i < NUM_BRUTE_FORCE_THREADS; i++) { + for (uint32_t i = 0; i < num_brute_force_threads; i++) { thread_args[i].thread_ID = i; thread_args[i].silent = silent; thread_args[i].cuid = cuid; @@ -371,7 +374,7 @@ bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint thread_args[i].best_first_bytes = best_first_bytes; pthread_create(&threads[i], NULL, crack_states_thread, (void *)&thread_args[i]); } - for (uint32_t i = 0; i < NUM_BRUTE_FORCE_THREADS; i++) { + for (uint32_t i = 0; i < num_brute_force_threads; i++) { pthread_join(threads[i], 0); } @@ -466,30 +469,31 @@ static bool read_bench_data(statelist_t *test_candidates) { float brute_force_benchmark(void) { - statelist_t test_candidates[NUM_BRUTE_FORCE_THREADS]; + const int num_brute_force_threads = NUM_BRUTE_FORCE_THREADS; + statelist_t test_candidates[num_brute_force_threads]; test_candidates[0].states[ODD_STATE] = calloc(1, (TEST_BENCH_SIZE + 1) * sizeof(uint32_t)); test_candidates[0].states[EVEN_STATE] = calloc(1, (TEST_BENCH_SIZE + 1) * sizeof(uint32_t)); - for (uint32_t i = 0; i < NUM_BRUTE_FORCE_THREADS - 1; i++) { + for (uint32_t i = 0; i < num_brute_force_threads - 1; i++) { test_candidates[i].next = test_candidates + i + 1; test_candidates[i + 1].states[ODD_STATE] = test_candidates[0].states[ODD_STATE]; test_candidates[i + 1].states[EVEN_STATE] = test_candidates[0].states[EVEN_STATE]; } - test_candidates[NUM_BRUTE_FORCE_THREADS - 1].next = NULL; + test_candidates[num_brute_force_threads - 1].next = NULL; if (!read_bench_data(test_candidates)) { PrintAndLogEx(NORMAL, "Couldn't read benchmark data. Assuming brute force rate of %1.0f states per second", DEFAULT_BRUTE_FORCE_RATE); return DEFAULT_BRUTE_FORCE_RATE; } - for (uint32_t i = 0; i < NUM_BRUTE_FORCE_THREADS; i++) { + for (uint32_t i = 0; i < num_brute_force_threads; i++) { test_candidates[i].len[ODD_STATE] = TEST_BENCH_SIZE; test_candidates[i].len[EVEN_STATE] = TEST_BENCH_SIZE; test_candidates[i].states[ODD_STATE][TEST_BENCH_SIZE] = -1; test_candidates[i].states[EVEN_STATE][TEST_BENCH_SIZE] = -1; } - uint64_t maximum_states = TEST_BENCH_SIZE * TEST_BENCH_SIZE * (uint64_t)NUM_BRUTE_FORCE_THREADS; + uint64_t maximum_states = TEST_BENCH_SIZE * TEST_BENCH_SIZE * (uint64_t)num_brute_force_threads; float bf_rate; uint64_t found_key = 0; From 698b41eb2713703d4b05cd2a08f8015f9c528fcc Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 12 Jul 2023 13:59:47 +0200 Subject: [PATCH 636/924] code style --- client/src/comms.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/client/src/comms.c b/client/src/comms.c index a17bdbaf9..1c3d1f686 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -621,9 +621,7 @@ bool OpenProxmark(pm3_device_t **dev, const char *port, bool wait_for_port, int // check if we can communicate with Pm3 int TestProxmark(pm3_device_t *dev) { - PacketResponseNG resp; uint16_t len = 32; - bool is_tcp_conn = false; uint8_t data[len]; for (uint16_t i = 0; i < len; i++) data[i] = i & 0xFF; @@ -643,6 +641,7 @@ int TestProxmark(pm3_device_t *dev) { timeout = 1000; #endif + PacketResponseNG resp; if (WaitForResponseTimeoutW(CMD_PING, &resp, timeout, false) == 0) { return PM3_ETIMEOUT; } @@ -666,12 +665,15 @@ int TestProxmark(pm3_device_t *dev) { memcpy(&g_pm3_capabilities, resp.data.asBytes, MIN(sizeof(capabilities_t), resp.length)); g_conn.send_via_fpc_usart = g_pm3_capabilities.via_fpc; g_conn.uart_speed = g_pm3_capabilities.baudrate; - is_tcp_conn = memcmp(g_conn.serial_port_name, "tcp:", 4) == 0; + + bool is_tcp_conn = (memcmp(g_conn.serial_port_name, "tcp:", 4) == 0); + bool is_bt_conn = (memcmp(g_conn.serial_port_name, "bt:", 3) == 0); PrintAndLogEx(INFO, "Communicating with PM3 over %s%s%s", - g_conn.send_via_fpc_usart ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"), - is_tcp_conn ? " over " _YELLOW_("TCP") : "", - memcmp(g_conn.serial_port_name, "bt:", 3) == 0 ? " over " _YELLOW_("BT") : ""); + (g_conn.send_via_fpc_usart) ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"), + (is_tcp_conn) ? " over " _YELLOW_("TCP") : "", + (is_bt_conn) ? " over " _YELLOW_("BT") : "" + ); if (g_conn.send_via_fpc_usart) { PrintAndLogEx(INFO, "PM3 UART serial baudrate: " _YELLOW_("%u") "\n", g_conn.uart_speed); @@ -771,7 +773,6 @@ bool WaitForResponseTimeoutW(uint32_t cmd, PacketResponseNG *response, size_t ms if (msclock() - tmp_clk > 3000 && show_warning) { // 3 seconds elapsed (but this doesn't mean the timeout was exceeded) -// PrintAndLogEx(INFO, "Waiting for a response from the Proxmark3..."); PrintAndLogEx(INFO, "You can cancel this operation by pressing the pm3 button"); show_warning = false; } From 403385c56c9f218fc071b9f3475196b81be0996a Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 12 Jul 2023 14:00:19 +0200 Subject: [PATCH 637/924] style --- common/lfdemod.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/common/lfdemod.c b/common/lfdemod.c index bf0bfd4c6..73b580a6b 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -268,12 +268,20 @@ static size_t removeEm410xParity(uint8_t *bits, size_t startIdx, bool isLong, bo *validLong = false; uint8_t bLen = isLong ? 110 : 55; uint16_t parityCol[4] = { 0, 0, 0, 0 }; + for (int word = 0; word < bLen; word += 5) { for (int bit = 0; bit < 5; bit++) { - if (word + bit >= bLen) break; + + if (word + bit >= bLen) { + break; + } + parityWd = (parityWd << 1) | bits[startIdx + word + bit]; - if ((word <= 50) && (bit < 4)) + + if ((word <= 50) && (bit < 4)) { parityCol[bit] = (parityCol[bit] << 1) | bits[startIdx + word + bit]; + } + bits[bitCnt++] = (bits[startIdx + word + bit]); } if (word + 5 > bLen) break; @@ -293,12 +301,15 @@ static size_t removeEm410xParity(uint8_t *bits, size_t startIdx, bool isLong, bo if (!isLong && validRowParitySkipColP && validColParity) { *validShort = true; } + if (isLong && validRowParity) { *validLong = true; } + if (isLong && validRowParitySkipColP && validColParity) { *validShortExtended = true; } + if (*validShort || *validShortExtended || *validLong) { return bitCnt; } else { From c9c8c6b72c9306062c594eaa452f01baffd046ec Mon Sep 17 00:00:00 2001 From: Roman D Date: Wed, 12 Jul 2023 15:35:29 +0300 Subject: [PATCH 638/924] Do not try to detect Mifare classic EV1 signature in offline mode. --- client/src/cmdhfmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index cbca722cd..3419fc1b7 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -2242,7 +2242,7 @@ static int CmdHF14AMfNestedHard(const char *Cmd) { } // detect MFC EV1 Signature - if (detect_mfc_ev1_signature() && keylen == 0) { + if (g_session.pm3_present && detect_mfc_ev1_signature() && keylen == 0) { PrintAndLogEx(INFO, "MIFARE Classic EV1 card detected"); blockno = 69; keytype = MF_KEY_B; From a9c0fd0b1cf649c31d2bf1eb5aa366a316a42119 Mon Sep 17 00:00:00 2001 From: nvx Date: Wed, 12 Jul 2023 23:04:29 +1000 Subject: [PATCH 639/924] Fix regression caused by edd8e36 (PR #2021). Mifare Classic KeyA/B were accidentally switched in some contexts. --- armsrc/mifareutil.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index e94d09f40..5dfbfd26b 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -139,7 +139,7 @@ int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, return mifare_classic_authex(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL, NULL); } int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing) { - return mifare_classic_authex_cmd(pcs, uid, blockNo, keyType ? MIFARE_AUTH_KEYA : MIFARE_AUTH_KEYB, ui64Key, isNested, ntptr, timing); + return mifare_classic_authex_cmd(pcs, uid, blockNo, (keyType & 1) == 0 ? MIFARE_AUTH_KEYA : MIFARE_AUTH_KEYB, ui64Key, isNested, ntptr, timing); } int mifare_classic_authex_cmd(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t cmd, uint64_t ui64Key, uint8_t isNested, uint32_t *ntptr, uint32_t *timing) { From 92f4ec08ab94b4ead6a8991469d2436a898eb73f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 12 Jul 2023 16:09:28 +0200 Subject: [PATCH 640/924] I tend to get better Mifare functionality. tested 6,7,8 and seven gave me better results --- fpga/hi_iso14443a.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fpga/hi_iso14443a.v b/fpga/hi_iso14443a.v index 7ccd7f610..6fd450528 100644 --- a/fpga/hi_iso14443a.v +++ b/fpga/hi_iso14443a.v @@ -221,7 +221,7 @@ reg curbit; `ifdef PM3ICOPYX `define EDGE_DETECT_THRESHOLD 3 `else -`define EDGE_DETECT_THRESHOLD 5 +`define EDGE_DETECT_THRESHOLD 7 `endif `define EDGE_DETECT_THRESHOLDHIGH 20 From 71023d0c6ef2fe1cd7de2848e31e1c3e171f321c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 12 Jul 2023 16:25:14 +0200 Subject: [PATCH 641/924] regenerated with the HF update --- fpga/fpga_icopyx_hf.bit | Bin 72749 -> 72749 bytes fpga/fpga_pm3_felica.bit | Bin 42176 -> 42176 bytes fpga/fpga_pm3_hf.bit | Bin 42172 -> 42172 bytes fpga/fpga_pm3_hf_15.bit | Bin 42175 -> 42175 bytes fpga/fpga_pm3_lf.bit | Bin 42172 -> 42172 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/fpga/fpga_icopyx_hf.bit b/fpga/fpga_icopyx_hf.bit index b62cdace60a2f3d95eac23c61b26a334a08dc47a..053f5cce888de824b6e65a7b2e8f8d9de4be3b8c 100644 GIT binary patch literal 72749 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 diff --git a/fpga/fpga_pm3_felica.bit b/fpga/fpga_pm3_felica.bit index a903f180ead332a29b109b75c0bc01e7ce0b6c51..13338bda0c2c486420bfc4100ab0231502142610 100644 GIT binary patch literal 42176 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 R8Jt4H@?Je>zIE$w{};>}unzzL literal 42176 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 tV6_HTYXCJ+!WAe)UwflO3jb27M6&B3H diff --git a/fpga/fpga_pm3_hf.bit b/fpga/fpga_pm3_hf.bit index 76dcb8d98b9abed252a733ac03141958baf91129..3b9372dc0190aeb8c83e2ba2c32c31ab3563cb11 100644 GIT binary patch literal 42172 zcma&P4|tT-nKyjTd7gwP^Gq@iA-E|bJ(&bL#7P(?G^U7?laRVor80H>zRz#B-@5~) zZq}D}W4B*lcGq|JWD;OV5JsdnwYKjAq-|8%9RgKAgohaIfT*eK_NCUPBSwrGZA5Cr z|L=EZl9}|ouJ^q*UY9;j4$qu__x-znzxzH1D)CO_{vmR$A?v=5zghFw9p7m9>-PKV zzxlOww3ghVzi$YB=YgfcAbpL@P%zZ6gx|7cX^7TQ$_4pev^SYXn`~MY6drNRIk{n)-c7knnlo|6M^66s4N4QMsi){$Kp)GW(1F zL>ry`FJ6)RIQO3aOq=rm-Fx)hd;T+R=KOEpll|po%VkqL&7)$OeON%VQm&8a3vxkh zmTVq&R3m5h1f7x%6db8%=@txZvUS<8^-24T97(a8)>~wJ)3;x#z8g~cq;C* z%}eYy`IM}l*gC*$J*e6wiX72Nu~LIrTK2kZ=f&~stl8kncvhNYpPnRjoJyIK|%Od1>Qrb9si9*im#7ax& z>Z{U4y8i4v^&)}(bU!N^ANNnNE7VJ$cg!FQVFTeOQzU4gtf#)F)(qb-{h}nrPN5BV zOma72i{Xd6%KZmA>tdA;#^0c4oQ0z$|G>`B_T<8|W`r5J_e2b$k4wTX53y6?6MvH^ z4Qi+8c}h8-C9OQSal}mr=$iFeXZ3OIDqW)`qU^%TD{6p4-WF}7IHta9U~Yy!mLc+{ zv@!aGLfmse3&`J6WBRlHmG|e?D>A!}enC~@`3`p4c!sKE>9^Qz&QGXns4T|HbMx%b zkLVe>c=wHw;xl+y!`=VH7RVpUg&A{yJa z&|RKe_pzeGbWJ=fz3b7RYn}U(Wwz$0Gnq!|ecN1~`>qIO)^2*M)D<)gRtcWy+ zCXFzaN$oY5Fn$agrW45(F;B8OKqus3;Z15abb?YHfuuH+`!1>fO>B!(e~+-bw7hueL;e_h#E{A)hdk?8V$#7`jfK6d11TTdTKr zQok_EB!!o+lICJPO@ri}Wpb8|hG)!X7E9@#Y zxBuP9%5&XU=_b|Z(aayHxo!K1cCNT1+aK2jx=IbgJEEF3dMcl}( z`@r0vTNl@bf}Vr!`)NoHe!FDCTtTnWZpXh&oBA$E zd!Lrc*_X?@La$bY8TR2N{Tem!tsPo`y-FBqN~5-*>QAS>ih7*-Ci8KYi5!%+@TSTG zMi&L0#P=B&mTDu5*3%YI&&?gMxWik0m6a(LfIsx5VP8DA76z3WurIiaa)%BpR|&tN z+Bp8Co8|0_jCOnyc6lYzP1slB4Tjgz&Wm9Jeobh31gVd>*$9~(0g=mva3fL@~d zs9|Y5H_yN?dX@%?Oc!=kT=hAHefWrKQ^2p;yXjd`tH%C5^+=y{qXd5S^7@YUzS>}J z-NoFufji5ayiz;M(&m(cp7QYcdvUx~d6T=pd4`Lb&onf>_uXAq`D9w0gk@3P`4`vQLL&tgIAsCd}2qvj2)h;0%6s8Ind zP|KdhuSsgG-S%YHTQoL?fI;?ha%ed(lV*L+zWQ!b*whTKzVe#9+TR@8-p4+rtMZu+ z?96HWD!M=~ld?E-8NEP_Eylx|j&X&);+Z`IzZkqa-3c4h2gv91``y0X2|MKXpLCb$ zS-+w1Ym4sBn3YUH_CjGqSw-hV{)HkEWvzMq5(=qdo{Q*-wZJ&Ekq^s@9VYn{Dn!$ID5mBI z_+_LCYuc%CN{f&ShK2_USsq7o>pa`0s7V69lrr_IWqGO~$hwgk(|j7KET0OQ;_{IU`CZDw`OoiVly(MHt>uwVuM9v%`I)}DLM zfU$sH0DgI!v<398++){8s^`%ex!(@ltJN~q9Wrj(%Pv#B@Y>oi{YDQB>ZA{%05liH{Ba%V%#(>{l+tbHl`dYY=*F!Pq!Bo?2tRA|ZJN z_Te;s6>SIR!nzM=v&0D*It$GGh`nTlE(CsFz^~uarLTmY)lX}0iHm^a9DdPZ$7{pl zvUcjCYwa(0H;=-TTmbwv$nB!52|@B4=^g2s#;>;jO1;tgHRb?&+utenNYi0Wbd;*4 z8EwtuSAZv4>K*eJ?5u($0Y6^@tE?5KoyRZTLy`ivX#tzMhzsDCPWxy8ZSwe4x(-$V zgiXN}yhJJ3m&R#=nh1NWfM1x`+h|rs8$s;XOaLi`Xt&S|{3@ET-;9BO-K|X^%Kp5l z%V;aal_WlyDB#yS-HA26pfRA?)T1Mun{YSFCu|?NQ>=hr+;+Hb%x3ANbnzC0yFG3D zu-W1HeL4Gb=KhotT|RE?3y%4E47eSI-FrBAd5Wc`@#|f7T80)IecD^fE=B@xf`461 zhdKe!)-?ax2}cdDKB6VzFrIUk{7QS1U5{gRQrd=`eF>{yxym4B<7T{Px#OwO@E#E& zPfE+^@UJ$K!Zu2R?v3$>3Bi&D%-tmywW0HQ z{JJ5yaa$EPPq0Vn5vQugyqA^H_ax`WgDjD=uZU4YyXG{}jTYN0f5n6P{G{oj_l#wy z1Hl6SI->lc#EyEf==apT(EFzA3O|-5m|CVU$iYc#@!2W5EqdZ0tIDT!tL) zA+t6&Kfo`nah+pE%XQWT{^jm)d+eVoUimFno_mi&3cu>sny2S2&^E@aY@=z>0z}h` zGv*{Lj;rsAQ~<4HV8oms_h29Ty4}kVN9{Tt7&U{eJZBfcFL}mn-spW_^RtsQXnWeb z{4o4mlkgJDb87+q#V3`oliG2bRQphNW$>`*Pw;D$oe<$zspVRPjlH}L?o{!wtj`?E zeV5d~PFuR_??D{3h>pv~yWJpSv_;lO;jyRr7yft&eKUIF4%Q!gXm)jru`gc3ws5rR zEATIm=(GX?_O(-Nv=+9xL0D`=jBVy;3jFJ9c6uya>+R{?gNKIYo^8EVPC6Q1?%mdv z=U<=7>;1s55$(SCdwW*2d*9G5WEq+FFK6P{hrl?G!mpQUsW9GLxei>jL4X&`;9m)< zC%Y^q>w)MtZ`*n>4C=@=m+5Z9n+DEpEH{JK>?>MXHMKP+V%eQm%Pcl+5^_(Nm7fM2U< ze++x9$^B4krwg>pU+bZ`8S~k6KmT=0pL%96I(tj82SF>Kvz?NP~AF=!4@)spBT zWHEt<`RET=NlJ6HsA@9JzqXIK09&rxL>c%Oy9NicTIBf`;=@<@Z5huP;ugdkX)IF{ zy*jI*ZB@q1^Dl>QAF0m-23S3)kneSL)u!!EL&V4w@M~D?p@8EKV#sm5-Ek8O6zvf; z!l2gO)A-fd@)XsN0EGkegIKM+G2#0;Jw-kN%gy80`}6@@F;eF5D&;5T;Y?XVYo-tA zK$|CHCa3Z1ApMS-9nUyoiR*OBFdWDz|D6jPvZ{bzd+8;k(V2f>);P?nF$P2XP<%kk zhhSfp&ei;+UG>uIl)WC<%SPE2gN>L;-z)UziCdyZR{_7iC?6RKI4(asRkMZbX;Zeo zNc(pqRwtu?UqGw6F=KuF4e^ltdgcdTV!w8EB^SmbGxS5SE!PTXv5%b+$7z}4r8zIV zKCvJu@jQN&9?^eqG^anC(I&+o=vKMf(XNQ=70vf}#|r!_!$09cd6&I%FFP3tk9duh zI=$51c(13}%=51#J>#x=!HCib{hI2AdZXGsv>Ab7M8s$6hwQ2;6m}y@a zg6-$l8#DDoV?XhvyCgnDeKL@_b1C~W?;^iIY@Fv`11dh0^<&kS_(=!a#h6yfhNyAC zpDFOKw_smKt;OBgtCQ{p+?zmf0*kY-DAW3(HO`@n4tbJ)F-kAlKF15^$xgUZ>i}eV z{;<;P@wMLB$KI*g(&6jy&u7#8s|e9x%-8Bq#zz(H5+z9(K74qq@o0g6 zl_DC%dn|T}IzhY4*=$&J`tix^8T^YTyT$++;B-+%`-3dI>a)PAm<4gC<-6iJn1$Z^D($>MQ( z0h#nUwh@pwA}H+4f2adxZV5M%2D~T4o22j zz^`4D4uWl|H3bo?gjwOCvWYx#Gta*kQ<>wF?fvXMIultUjos{`v(35XKxxM9&iOi} zA9l*vkfF0vI>f7qtZXQSpNs=&lk;P)&ngPzxCLZ{N2#v0GRj6s(!$D;Co_{?dp~;Mt#r=WW zmu3QQ0=BLvn=_!&^JrW)?D9+&@au6vQdPRNrFA}k8iHwAlqJPR+S3i5o9ACU>1kKB zQ|SQOexZNE0c_3Z{TPM6gBAFf#G0lTmm=KVCj#f)&y>f3Uq0!V1^jvfkzOe2>DNld zMLirtR~OLx)Zq8bz%Pf?xV+ukn0mMeZQh~tDq>XVkljB@KYT^`%uLr6I%Oc}0+Q27 zdX{h9>6+$Wpb)*HW~jEicw8SyFKNGXqWl>FVTyyW)m5 z1d^JZ#;*%>fo^etR#)_FU?0^c*heY=&S>q$**)(ReJU=<29Eq!xp9h?^7#{czC$m| zr3OBk!Y{`fw+_k1OhVD6CxlPbrPy9VKpu75)B0gLXI~CR5zrIDM*!bdC65ponZ0Q3 zG=9OpN)|bZ)I7Y0`7$Lbwl)3(@~v_2WSsXZB^ouzZ{i5Pmx`Pog~fn{2n9I=eR zn*#K2JUHU1n)MoXv>N+ON5nODQ+L_NpPLj{j9ZU;RlMOxQi9s zLmH<`9Ku4AR_{`IJ&&!upNkLEvybTAR7ZwzTXdl0^N!J>eU*L*+c9G7HC?FhlJq0K zN&X!-PJu}su&ZLmBn#`CyQ|Kk&lAK|n@GhgdKdVYafAi)6KmeE1Pj3u2~hK*H( zX~_)yLaK#A?cToX8e=LRL%_+hfmt5E?xTIu7c-MX{cMZat$^$uAR37LP9%&h^<9-k zi|CL9_1J->++ys86kLuritO(!;FliVM|RAd?dt{+<4QJs0S;t$)W5TUUu$R**&O(U zDsskx4({Qj=;VSVb__#Vh^0dVqx6P?y-MJ z5EAc3pR;YU`7ee@*kVQ0$^GdsMdSC#AL{S4!LR1|7w}7llq9&2PINDi0a(}3!?IDV z>RUO*zuH|t;|aO9^C*COC7j{*2)- z@UI25*;tY>I@nhMWZxJuzFj__KVvKzDp^;+uf`JShrD!y_Rq9gHfQ`}<~(GwZnHg; z1^ns#e^q_+~=JA9w1yaMq1K>8vPV6L$}R+~0< z%&6bson%LirN|RKOY2#Q6<^i4C$cDBV#M?KC1Z$$eZax-s>6iDO1ZC|_fkDaJU_+1 zXzmB}((KTPKUIyi4hyGBAJy)o5A!HlJ#Lvl6tbP-&fzo!)=#&8|xMOT^_2fShUXQ-Oa6eH3j{!EV5Bn`ORC|0zy$ljqw}yXS6w4 z)ow)M)A&WYc%BD`y&)|@`;B^8W&xMqM&fdTo#$US9Z^}l$GzvZD|F4Jgv2?MU}VSK z-nR<+;aNJNLpD6D1;k}q;K2VN7iol?^_G_BUkCX{3;aD4pHI)|3!TV_dxgH4S4E8I zjQkhhEP+=4z~;$c$hwKdy=;N&dwlds09jr?d^OlhyE9qHPRT_h{sHE>{|D61{71m! zvOaTc?vrZ!NvPd^{hDk}dCqE;^oHw}q-V6ZkpF^bJIb+F-;$Ho0t28hl?a=GU*mLf zS7;1g9kAtuMd|mu`UMI(qTfuK@!WSweH|Tgd@-ZX_o0NzL~E1mbJlxN0MO%F9=~c7 zS_varK8iNq95R!;`^_!J+9<@vO;h%z7wP*f-iBy!*w_cz&^?<4T6UH1Zp-qo?A}2A z22G3&291Q4u_h^Cq0hSjWTE9{-P+G{@nPRh?;2O_@MN{>vnu3RqWIT)cC!)^f0DDW z%A!%g7V0;We_sRV84}osIs(p6TV0afp0h87U!YwCS;J2U$?q@i(eBq}!pH0G@5%G8 z7m;5FekuL%5G}sLJ;Ewd-*xR0m3J5NU)|a0>(12OY7+cT$q4(7{zGJHN}>h)8U<{H zqTZyphCX(di?YYG8u|^DN3fCFb9Uj!3SZ<$AMgfejq=M@_>11}V}S1|&%XowD?2}` zeq$mCw<8fbz-JO*eNB7><#Ir@Y5t}AjiZjQ)77tF%dYQ+nLj~q=)0wRSKO^EFpFP= zjH=UB#!6v>o)Q0w_VT_mIMQ;* z<3qpZpFdUhH7r~#`(^Yvb<-|k#@Kx0nbsxg&#WyU(Rb1s>kCozhO0I)eHH#~i{4;y zDGlm@7fbv@J@LNcMclnLes6Bi56nHn5YAz}5N}Mjtq`RLx<2&%7V#<`^7!=;O1X|k zyxrB1HS}dJFpDsM*aN z>Y*hTc&)$7K?t?feT8*b#1a`C)D9!im4Aj^<( z+YrVpB?Rrb9-tDQ=U>Kyh#VBh2kJeAu*V=xAio?GaE!#F>bvZlRP`F%dk4Jw8M=+O zJJq?04j|gttQ>w7p)Liya&Kg1xiKsoIACk3d{t|Rl+LI>JPSDXanC_tz5ZM2%NSH% zCAYg8Ym9C!mYe6q7ac3E*C_twhY@k5+mwJa`b3GVkpJ3Sj*(IchQnd7oyNi95^$MC z$Bj+X^@n2a6{NX8PhiJ2R*zaH!>pp;x0Kqq)Z?CA|@QV%@G7A*?C6&q3BNT;_&<-+9nsTGb5~(x}L0x z`DgGi;zL%@@dW=u*N2RbVJ|mV(c5}ZtO|A&_!nKB{hW$7CNZvCDgaxk=va5mDVxE+ z#u@Y-BbgxyW3IpLL)0N-P&sx_4x7{qI}e^7r&dx(#e+{Q}fe#wW7L2%DK6wCORu^qW} zSN!Xep4B(n={4Ti=NUB@TmMM=yFIpcc$$Ar(0pt^tk(pMyPBW|O7* zjQT_NQ1R!4F~WY~Iu_F+FsmBGekeLZ4rm&`D(J_uN?=-cLfcs=oY_nl`vfemV%old zU#av!V=dgW4X4*20bAAfqzpZ|x~FTJe|=`Od@7!Ag98bJh-v4N|F3hK;wgFk@EpC@ zxvV{4nF=O?=os+g0tSdxesKnVMST_`SPme&nZ7K|7$Vp~G862T+&mja|4u)quebTt zQhv`>E#_4M$Wl}zOrjxI)-J%mY92DG@fDbxhg>&9W5n2>B_?h}?PYE)?78pKTcS~T ze%M(|zmma-TNQg;WH&_2q&AkbFTZP31hQdv6m(H!A0W8t;j|aEg*ko0Z|$QuTRu<4 zr?g<=3f)Qp*~{gGC&bZa8o!EaS&!rE18mh=hlNif-SDJ5vJ3f?A=Wd6J4JV~N1nHT znJJLZ&dm;bDF9)A)Mdia3eo@gi zdKLW3b5c7)|Iv9{OrNX{(RDaR??ug-!mrtVvYYQR(2bGUrU>ZCnsQ4#!nbw*VbX)QiYk6Lx-0JTu{^(rzuik+N&@ro0)i`%3AWxHRXP7$aywiLT0&^&4` zEAX$U;wJ^Nibu5f#T&`+NWHE73~TDMv;!zTiDAo=qz~o8(eTicZfjJ(*b<)YI-n^b z5hF!KA_Y|&mvxqnOZcBOrT{)uN5XmqeIgpztciU6hW=&V>#nUa4wipJhdb-XP@Az> zen690>=SJgf->d z3{KmZ%72Yfhzz+hV<_6bnP3<2V*)`1X;JkayHurznjNny3y09*z+@(@-_tSSohanL zCV*eJk!PYSNGPOFdnQov`yn+rp0Psy>us=-`gz8c*1fPV_ekI%d#7!SUOj@HX;0x- z(Xi-R7YHI&uR$ArS4ohKBYOhT$)15`i&zP>1UlK6V(@l(nVLRqMG+4(0sJOzwFotbU1?Q zh&3FAWV5~B(>{zLl5yZy^ZcuhZ8vTd2}RMHDRKD{`lt3D(HvhiQIdjAJW^@ zq1N2z*DwOr5-e@MrS=GSL^8~p2nTDXzwH{;DHM4ZXL-a~pQ zl-#;cQv&i5$3LR2Zv`%&!np3w*;i!tR_a1^G0NsE81mg2BR1zAxe);Bj+N*0UysoD zWEDrB@1lMb8J1MCAL&1pYsTDTtYaF#Ugl7MC$|Kdn>rId=S$GpB3pL)9Ct|}|J8$t zI@IT}%?;w5b8BDeecBJ$`!p!aGUh+#>6+$W^f$Cc22ka$-PeXdC;}o@!?w6W5C9AMVNJ^u zRNq#TjH^G6t`4#q`2_jC0&OtQzjPPeMbvM(zsRrd$cOw_q5klvu&;2`YpooWmv@BkU)`q-vx~-2AljUsY5bDTWL3~W*+wRY zvO`+c{XC~M0=Pfb4|{m^K_jF61I7EQ6YkMF{H&)9KxVh*^}{c^_B&h}R@u8qlKgxG zYvG};A^s=&;e0|Fk}zV3%e!55j(a`}vdySJjLgsv7tkLP`!a!c=t!rKw+d{Sa|3%- z?zaOo^uw(LIBv1<`Np`jh&@G){;4I?$$s z23`MNING!kb}-D|DGBA>ykJ+;_Y8~ zP9pI5)#@X2GFgFiiCw_2E6@R&hdeQqH=w-ADH}swr7A@9Ot`5ni*cR$`c|AhnK1VD z%u;SJ1xJ0>=q<*2fm==E7b-eL{aT!OdWw2^?ONE^u)ywB`k|fkb%vg;KNJ|3WQxlG z6dWX9@F1t{i%Qqi5EM>~YXEWhVX-Zxje>urD3C1Vza|O#q2tYH9rQ;+SU7?FS5{Gs z7V=-`*)QdxOxdIgSFmvYF>S@VGZr#pV~CcsHYlxgfLY&L#=$%4t&82hjA6$EvZuqJ z#waqmc}^4!Au{(N!pHX8uO4<6d*lv|pq(!|n~M*fxj#3a68Kd%kEYrT+^*_dYSWc= zfqxAlJ`9pU8mB?n1&Bt#_#K@+u{8zWltd^xkoMC>R_nb!i3urC*!f?35wxMIZ8JXI5I(+bnAyE<0Yxf2Ao+LGl5Uy<2KQkA-XcsthZLf{%LAK{zVR5@k`y_WN1>ik!~T+EFK@?V=| zHFw|3en&r*bs6(sp3i@sA{&vgF-ytv2%r2G8|D8>KR=I(|9t-IAf4sQ`#gKK#k@xh z?(o=1*1s>p2fh7;{MTEok8V)ah8d1yU(B0!y~QdGMk}4_JbuBi+M%dNNma_PqJAS_ zoUpQfekixcq<%Z_i?>8nC1EE_M(b-`D7Q%1P7*6k_+)6dYJ&Rt80Hz<4}HeNAeA{L zV@{{?&)P>?RJBp{^B+^VWeJW)6<^d>w19S@qQiMQ2C|>$Ul-U5&<{N$T7`;x1rAl= zbX77GElvIj|H|z{t{>Fv$?SN*AfHLBoPjZ~E)*9jBkQT{^wOliUe{w2|- z1@;A6s@J1U@v^GtaB|8zUEp8m_zBuAvV0Kau?1btW`$z#8+rcq6GEwgSe=|RTB!)8 zmc*iDvy(IH53}=QX6MIfc6o-hrF06?c&U>=|5Y^4*aZ4-zQZo*+n||qmH$FLn{D*7 zlex7({YD&SHEssks~q_+a_Ov<`iO$_iqR%J&$jC(+72u*JIb%sY@{Wzk`DG?_zzrF zLp>ekW4ZSX81raY?z6Ywi{n4Plq-1YhvuKruO}LU^^yGfubY5hIkW;#LH!}L+=2Le zBAoW5=H&U;YxJsYhx>21G+hjonjj}xd8ZO?Y@SZ~jjd!CUb}Orvon!|~ zYKHRo^`!m*&2!9@7O-BDD}?E2p*R%jWpxA7To3%qfqgl!uQ5Vd6d^|jfm9qFE_;~8 z;4JXtvd$Caee#YV)CZ{%Wf|?;$cZ-)(7|cTw&~RGlLuos|CL~8>0qXwj1h$BTSc{l zBv)n{zx?7^j`Lp!5lkME^-*_{wbK?i4nrM;4GQ&L3cr9ugmj)mNjw0^vW$%GoRR;E z0hhBCCTeS8EhaRTqu=Mik2yK}QuT)j?hUJ`L80>+jK6qw~lDw zl}XU#2`xmYWHU#gI90zPtx>2MKD)Fpii2R}L+9`IQKEYhN2R5m^DT)Y2Sz^7=?^kk zyNeubNP~8}0xgIJebe~0+c@a2?J3z;{yrV{`{ZAxdIIsM#G-`JH=X|ybI;Owx!guH z_%>aNhswQIzNY!#v%(2aUsql~Oj%bFx7ctO6V?^^uflr?LD&CK&H*QbSl5OqlfBMp9A3L0mobx59QVZ`LFb# zZcC$)m6Z3WMG5+JJ%trA3+KODZV(4#)m~#mtHOdhjuP~Fgz9u|o}Sj{aei5xcLfuH zr7KH>!yc4gOVj_K30i@N8Rx&mg=ljE$FWB$aQ;iqdZ6Ko0RNKPqXqmrOGB|B#)aK- zUJ2t98m9>fKOaPfw?mCf;TLEZ86CdUDhO;dW381IG6=#w|I&|a{aOYnoX>w9uk5-Vk#G|`<)mz$Ha{O#a7_A996XY6-}crY-THKFQinu1=fAF@=A>CH zc^&b_RSBK#o+{-WZfhwkoL?>)hE+DVDE!iqxCAb*%o!|zqd2!-P1ac(_4Cr7(+`md zv$41b*&>4X%jds_0oegzSgJOjs@9la0r;XqTiiKS%`)-#P?O|)6=8Zy4kF3{$xY~lKw^bF!xGgGMF zSOC~s%Ap_rn*OJKTW0l!mA^(nep?1e^dwVXh4Wv#?8~%*vZtahuMa!3Qrf5i{^fZ2 zO#SfpvbhTHX%xRp;Duw_CD*ITeH>lO*KhR2HoNNd(g*h3Gqjl&>&6;(+5#Vh#TDug zAE%#MsG-W$oKzE_Z2}m#gdxj7#8rQIg=2NOkQHhIJMJ3xTmBm6_`0HS_{*4)+w%i+ zx6#|{R>VCAwLj;tCPJ@!9`1UDrz^r4kEc*Se^o7$gjzV7{6M8qlGWodv~mZVHZzT1 z*TnDW7FDhBsZ?E( z)Tr3jC=4V_rMW;cMA&1pfL~V_&VM=Dh{9X|nKoi5L|Yv#=!ejIc{c5Jo-W8+xHn>= za8x#DfXhLVwF}2OXC-30ZLqDga1OgUhO@|cw!1!q<9|H27U`mK)^(FDN-Q=+N|yhD zktJdXDyrDpPL45m?^xF;UDt8`t8o8@1sfD0kN3M+LCC7Z5DmT| zUlQR{cwuxJzXC{egHk1FoSqH(GLU&|WUqt%j27_gE`%BVLDP?E0@z8j!o7;RDgzUy zKi-tHuZ-)4RnN$U++5%K27fMD)o*TK-;tY>;4*&Tm!-xYF+7OX4=CC-OcNBW@G@-` zd)`_B+rgPE)kM`FTG#1T$9r6x6xZ})x_3f5Ag^2hGVFavOU{a^HUmZH=y}(m%iF{P z2Kbi)_wI2$-x3PnA;<2BJPJy)1?P_8%yBju9vcTAX5iPee33d@_zoOCKq~28Mh|7%6!1$Y zR4oDv%7-$$)zNAY7S=4bzrONpan^SFfL|Y`8bn|O;VvAr@Qfgi%Hncg0lzX7pV+N*0B*=E z5p$D;Iz2L8n8vS2(J1YL$-t$o!jQQlVimxzCBlfZyQlH1AHTx5V1ICf9i^9LgAM&Knu|Bo`Q@#~F5&OE zW3EJ?7&RV%NC@=k(CWQs$VxC zBs!?*n9>TIqVx13Z)SkDAiXF-ClzsSlMRmdY*(Iton`Rq9lhUo|5RM^G}`7sc|8rt zoBv>*Wx?D$CyLS(uL#H+xjRuF_o0TvMxSls&W*mFL05L39r(IlcYVBfu(f~DVOekY zCU6i8=Ufzi@USmxiDk4vj<72?}``(O<2p?7L#eTzDCRRx}siDghcyL8Q1P+stNEbMaL}f zaM_Ud2k{ZzD2tC*qY{?gI)eOHvN)#N3={#5b)*|o+Cn->w@OUQ&^{*;I_;?~@UK4X z7HFOw%%k#O4uI@5_2cBRe_cG3^J5M@#-B-4#lWo=upi0A0AF@q?~dP`x#Rs-ESvhS zNX7HCKaOqug?V0jY=ZaS$$e?E1+p@{P`_~y^E@cm_iMF7XXF=>2rAy^C-qucmSOq& zjf|X>h3-Ojz+idtbT|7 zAa7AzSo!(q1nLj-`k^{69BTJG#uiB=AYve57jT)tEy{8iP4lk|Tn4gTlI=4F;0pY* z9GCL|$V!QA%Z=So_$A;f?_qNh+y4HOCP#{t13ncNnKDpJq?^>RS?h?3{jx z7KzU!i(j0^uNU}x)?jQ^ANb9QFNePhq2rwKF)b6&Guw0a<#+w7@`o*;z{7Y5h$;M9 zt{xuC`NM4eVO5YYEl^x=6$*!@*a-ciW9e|| zpYX3iQD+%#?9W&~frtrqI(CfK5O(J6Is4)jFLNC1;iz+nkevwFCB)KvUxZUhkmc(S ze@2%@cml_NZl(`JxX&ZI-iPoq=y)ckYaO8fY5_gjxeu7q4*=LEjX9#axZzAz8idOK-9t5NgqFb3^R{zFpR2{FB(3+4lgy#1J*f zQm!Si{Z>e9HV-}TU*>ok^7vJn5?4so>6sf89NS3eq3}jL`(oK2y7KsS3Mw+xgP_Lg z6N&iw7utC8`QjUf0tc${`LCU{(N(8z7P4UGNb!G*T@{<#s?wDm$XmtKxYWgDo8%JP z7-QvhRNfqO|Ksgv;+t)rG5(R|^Is0(9vCvzu@n@ zAPQm+x>f9VlAZ|~P!x0Dh58LQlqFiyedAk@;GVG-Dl9+&m<|V0&=1}4^HHR|YH$%^ zIOd(F)x?nqqxH$^cy5p3dHe42~+VnjLX6~vONE4&(=r5*MVOs?INN1 zDBT_6P!y-@H%b*+9Z@NyQI@?PaHsi4{b~yeV&9y`ufC$!>1Ea^fL6J@9v((O#6q!$ zl%AR0�d_5;~&@WJ6sQau|+pEed~j!%_I|`%6|>r`R#JZ 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 Z`(66O=Z|Ko#J|H@itu;pbMOD{{{ol%HxmE= literal 42172 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

    h3G9N*mMKrk=iH z3Lw5o6vQgai1Jw%A2|2h&YokLZ^s9`Y9NDb@CPg?bixP=AaxsF{tc)jB?%Il-FK(5 zUTG&2qHCq8lNxU%4FU^O0W^kEHczM|1IaA(+yEeF5joStrM!UyTl|Zs29p>UC z{h`az`j!CS)y>RCmAp(LL6d=z#Zft#UZgg@wm^T%AWCDnT9$gj)d5JAfuF|GgznOD zR9&r9U;{t{OEwTjQFVzPpO<6RysQWsi>qp!7f893mm`Uv4{i_(b#{zHY8C^}ipq*; zbTN=YSz7*A@UqH=idw!*$4m0@(}*5n6ty(<09Y`t=G7BaE<%B+0={zx0J!>JijoZ_3HP^6Ylld+L>z5 zk-auZQ|zhYWhVN}OosV=SN6Keu)Ti0ehEDLewlS^vf6`7fb{Q&dR*gvZ7tm*Q}c^~ z7WNIaR~0V@1nu*3_+0sjmluOj2e}`ra33r^Rsvynn;M1B6{Dh;cH&HPi-8Erf~tUy z)wFsE2p$V%Rq=8}&ldq4q+byT(x48vXjjorY0WPIK^+ze znlG@5Z(tRFG4O(XM4UE>WHFYe=_Oz?ENiFXp36GD$<(1GKn8WF391@S^njrK0Y+sc zv;y-ovoPp*5s+b7qPv($8$DVI0F#6&5Vn^;7hBxs)(~b*em3~@={Vx$N)V(GJ)e*5 z5--nf?yO%5MEG2V3JO?63SL+k({V${%T=H&O!EKA%hhxo67-)$Wi6%SQ1W4vrizy% zf>t0((^N9Xs3o7UbOqeR@z+b)F%!;sf8*jgi{k3NK82muAeX;i&i+8<^BP!5dbeS@K$tchSf!DCjFTv=fgk8?w^qoZQ@sn zT285RKP6G~`Jgbqc{~j2XA;#w;2l(y4GA)rVH&pFRjo>yM27gyi0rg+iga){NEb|C zG@b?#R;6rwQVVJge*|h6+$EWAe8f6;vcRiYL4#2mnbnlc3in~#pD0{W(am%dCixwR9#V; z9k1>1zq;XngI|S7%K4NNhZ%lcn)m#Cc3ipVmzEX&92tJ!i}GNwv7xL!B#7K#P%cmP)jZtBCGH!n)Q9cH#k#C(Ntw6PTMQk? zR>2=7cs^RC%gS^cb}$`2iEI35zZL+c z%V$KZJzS;BTi{lN*A5xPwp!@soNhID4qFDLAw;57Gd4Be)w<@VrK^3VPOvUR66qji zq09VS@TP3Q<8%SkFxY9A(-7(>$vVh;@|5aXhZ*dw(&a6hNB7a1xfLzGE-$QT27uKO z=`xjC)R>T+<9v8bK+gMl@GM3()PM$JO-1Q89tLeUM9l!HXsjcoXojbo&|Wfa6RWV0 zjslV^kS}WlAN&(@9u2Q9i#j3KH7wuQfh5x9GVs3%KR>B1OSC|s!k+(IFM6UdFMb}r za92J^$R;1KR9!Zq9sSGl0XjoPKgCy(UR?80pq{@tssQhO z@axljlCl=3sVewm|AS>YjVslm{H-6GU|G0a1IsnATm#EBuv`PnHLzR*pYj?|^Ce7} zFkcd%@~T*V{N);0u7TwmSgwKP8d$D@Phkx>DwuEP9fu_Re-v{_)P9m`2-3$L8s*<{ O)B*mUD=$k0nfxEa&@5;G literal 42175 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 z�f5{L3vnT!Mvj3pr}=O{*N&tJC}o(mbJzoMhP{!c@a0Vu()R0rL1I`B$x5cBmr} z7BfJ^wC8C(pNU`3G`*zPI>?BDmij|{Ws2>ql=V@FGxPWb{`E#vcM$B49p{m5->%*o zaYboCXf}g?;e_=IoxW82hy~Mo$hWI~jIO9|{wt4Pdj;~#%#{r%xg=t;5K*{7P`-X+ znRP^|eqP^Key2E;tsXYM$pZWcHrt>LM$hFu%leH2g5D@;W~GGE1q)^K3iep=m>%}$ z`PVJli@Z96TJ%c#S-gr?KFlht7xiEUJA6F%9?8Ex6VJ!$zHQuu`wtgez70k>NBz9z z{cdlbe+^2Rx2J3XUi}|AatdMf0+1S!6}(MxO!f!omt{%VKJTOv(XJoEK``JTe>J%{ zyLD2{=fC#Q&zkGD>i-L6Q7|jbkPi0E*@zszwX=2_zhwQ!--~Ex@m!p4sxoh$U=>;) z-A@pCru0Lr;#lr@FR@|{v(i?Y$5zn}IDA<#mD}@!a|h^(z-bG4z0#*N6y7eSatKNe z>Mo{!3;LloSrh3%s^x;Lt4#WK&ylwnxkBO;ektZ3-Cc+4JMKjBTVpp|Wff+u)$&ag z>JPhUxF;CaMO&>n%xk-h%6Xrs;b>?!j3}S~sv-FB814=Y(qZl=g!%#NkQo|T87|;g z8G&u_fZ3*DDP3Oa#Wz8MfP>X_Kc(wv5}D#)68HDQ-pTdP;EaxMqJUpA+(qKcy>*5+cIkoRwB{zT%AdxN6C%AeMo z{9j;OaOa)=LIJ-nQnCiZX#*mnEhx!IAeU4OafbBA3ib2*Nnmwwx(dLd`;Y5AXxz_X zrw7~e_;r!q_BK>*J?L2gXE|h}fKg|tTNcoWI&*qvR@t*o@~`bztKr_Q))>hC_(FUW zpNU_nJC&!E!*dpC$G_Nc->L(~AP}u3#0Ddc@xz?ul9(Dz&!FxP>{`jU-?mzvdH;0B3QR#e8dHqH15|B%9Z^@n~Jl*ifFw zuTr`)w}HG%)b-{G3)`<8F_J?q_u@oz0l(-o%`Hd4wHtE1+%xiuJilDPFNszW4vVWX zA3&eS1vaigJde)(DYPG4)%=O_U> z!BQY%MiXveZW#2PE1ds&cLdcn%%@2Hh1d`KFsn^ksNa~8|2oevn2`>gl0ezKEIX9K z0`8MJigD%f>%Sx93$4)iv=wVTivQunF8>I73zh=$Sb1 zE7vBEUlsZzX0Rimc$V;O<^vtkPH6Z$WJSje{EAgx?1-59qrFwwekn8P%sDrZ9*jKa zn{oaNUR_qppJ+edcLhXjby7VobL)S0ei>~v#8JC@!7Gc0xDF!bo^-=r&F8@{IVu=q!Mrd$I4=lah%9A?;P+-$efs zL!X=2M!l}X=q})wBc30@*|!!jO%bgb(ox0-78Df59R>VC4+Z4(m%mWYUyCh0aFB3eZb9V}~3l~WVY`-Pa$%xe{ z)#=FbFYSKw5Dy+rK*lsT-xvBa>TMR`zLZc5_?6|RoI`p4hGZNiDBF-`b!?@Dhr@d4 zRoRBPY@=&>#R0U560=yGaFu0p9!=rbbbLrM|D{BfQel8Z$+ZaQc#8OE^hfQK@3C*a zjQS1NA0mxH%a2YAINUc;s6YIKuEhXblNi@Ua`)k7!uhWgURm`qgM4wbTy`1HX(V3`gw+Z=;&6Vetw^hBLkM6@&v4e4q-vW z$E?j($f>m1#1#LUjpN2*C=g7kizq7#;2%-n=V@wjf;M=Q+n=m*#JVCGqAWX{Of2X1 z3H3Z;39O)9&=2=EJlI;mk%>K*Uz z+lF#$ku6%SB%&~@a6>(EK>H9vlqHy3306C;A6m+MdL&u(el5xl?H5IrWqkXlCuvhp zU6yyTMD9Jvf3+QrroOl;Y(7N>5;`LBauzRNqnm#^VEN9?gn>UTIE zj?Ls>xG`G{IjG+V!M&%rcUT2*P~@0zuR23N#Q79Q?^ahqoPn>yqTuX*T^bij zhmb?>8zQ;Nv7Z(pf$FK_cHAvU_;sLBqfSsTr z)E_Qu@|=WESe-54SC%GY*rEb)?<8-L52&@a1^pbS2$W2J5 z$x$7_a(hf@z%L%+wUwR)F(kr(1@RGSMDXE={Y<&%bNXQjH6G9*e@?RO(0`er>hpei zSd7ayI*D#fS3#!xI-GgmG2N3Acg?Bt)=(YH<-_C}&^0 zZ~Y|xnT_p->)FK>9_g&#rM}N@pwFu_H_y1gSF$Z{&RyVw$7FkMfT&K-^DhTyr9(6Y zTOrsOhJ*X($#7=yFT_znT$S&Uhii}n0+3;VRov*DsUNKF2y5=w@f(&>+eM*kJBGgZjL-Uy9|~ z(hXSUSH$z#Anu<>MdD&vQJ=>z8}7YDgu?2WiUCS@;YNepS(eep3dM|9^Ye z8yr`4-OqdbR(e{kthe$mS-`-vEbNWDn3exwY{$M@$zlN)Z(;*Z$J2SHo{1-=j0_z@ z7?NDAWg`<~6hd2 zp#d;H6wT}NgQ$o^$Vrw(}QJ~|b!{;NdT{8(hMcsV|&D?Z#nT}r0c_y!%6n8v4Lt@Qm0!muee7Y_#C z1$Isa{B<>CTFVUwOE?18hLi9Is;|zc{sFxl=ohnLlI?85)4cmDcDgsFe(0!UY5-hbFfbehFG(=0D+yq$Exv%r|Fbj!DiPd*4Z66 z*KuQHF@hr6EAgJdf9P5#+GegpA`pso3uY4chn zVE`G_+vstc%WV>|>b$90+_p4k3X|h8Nj|DZ}-z)JgF^EiYzwy>ilpJL1`_ zgv0HZa!4=;`0J;<3t+H$qVrQaKZu}ExAUxVwrxd8F`C2GgZ;};y;b>Z4%eU3;OjQf zxVFGb4b9NDCk>lr#-bSq^Mo?){+@P7!?3(c2cyx_iKYY9^{+oi&1Z*hv>yHEW6#Jt zON|Q&n>*`1DN}hE2yK_j~uk`%_v@i`6a7?#&-#jc~9a@*DA@xXUpIB5UMp zvh_am%7_#4mkvhj#;Zd_^`N;Zo$5pHeF|(vi|JvzHIIen{q$p+mye`l&CNMigFINeeH)0yR?Ys$$0v;RV#}#1L$?!7H5o?+R**LU)pjo z_4nT-hwlaZ%NjE=-8~W+;`J{pUczvJeK%}KV=r-D9egDp&zD4Oiaw~&2O9o!^hex z^sQb#gYZv}V*P9PeKUUqF#BZo{>DFr0rgA;yc6=*)AK*Zy6-P!M9}?omEpSE*!V+xnw= z2T7XC@$>c8_I&H_%w+2uhT@cicxU26*!I=5Tf4*gRX?Vw2O`(DzF%H?EPJ@|n}IH$ z60o+$u+<1oC;KwD`K8Vi5*~ZAxfHQUDVSkBTv*A^fbrtK7fNMI}l1+P24Rs-Z#i^HI zf93Myc-IIvedKf$S1WTX`}`%F?$r7*g#a((2oxP=MXoX9t)Eh)jGD$(zT<{=<5v zt=}0~9-6@U*e__S-E}qb^YHh|)ec(c_Xsy#_`_*=8(YuNgbs zh8zDz|Bzmk3&wEHWW_5x$8Ydz7e@7Q6HWuSk?O`1I8@oand;v2^o!%?4^eg$!{8}_ z_W>Pg9N2k^4#@@X<+2pmU#U|j#_-C5p~#2q0IcvF$$|&i1p$Tj*I~@QR#$dR;8D-f zRTY%$EZf2^z-dpv`2Cgd(|1+<=x}Gb+5OwqT#Gxvv4Fp_2A2y?=u^eICKGy4$?VX7|ZaJ{D-{S1rz3Nu}AKE4?z(>qUYr`@8Tf( z(0>?j_z&C*cGD>u!Si7HgoC8$0T-KI|DBtc`Rgzuf>bHaDr3KS807*}VtI zGq~MhcDZo|zeR@4Pj3&`zdZjT*h(FX4Yz!rH&HHeVK>#Re_`1RXAUFOWG5az_5i@k z^2-%0-c{GXxa>#J{a%G1AX}Nw=N~>JK=ezh{544b6YP1!x$d47n2`l0ars7vw8@@G!--bOy+^##0J z5C;Y#5Rnh82;vVlRjwk3&HI5Ikxx|tArsnP6*^e{dpiTayX-GNmC0ZL!2v=`u@I); z;+38EfBnSdIZ4anwjZ03e9Y3>_T0)FIs*S;Vn0l?*@ZM>Jme0VQ-}>=XX`F!t_!=e zyUJh6e>gDHz&?eXzU##&R?;a*T1fy2gTI`<^y$mi5GTbJ+nkNB=tgHR>noXkVw>L`v3g(Kga;lnS3&L>vSjE~O@^0KV$4=alE^icltRSo>ySk!nT}2Z8#slkhQ`oLsn zvXn4n$84+6708TsN4_dwcb24^0uTl0eT-9rdyRHCY?GUuFQrpQqYQ3OCjfdGKrg&H zT+~q%u6>N)wcD$g_I^Y5y<#Ij|M-F9yPYfxXLHt)gkE@s#RA><2HrH zNsqgU>a@*$8=Xti(VeteGSGHLJrI@Nt!Ryi_Gp{vc1pPltXF{6sucfTYx3kszX=!+ zcUY&_lI&MF%<+)NK3;bgny|*ggeFzYZ~hx%jxEh8&fV&LtWy{6J}kn&k5Gl`c&f>t1u!HU*CGt(KfTKf!ud_#JK58KEJybLzHKsg4_ z4~1a>bbv|$1hJJETvlIvwrO_imh7_u@>q+83tz^CUX{Vi+(R2S!9!zu%&6072W*!h z8=_J!=wv3eY!UY@!=_oxV&3J=3`HPi!0^GBthZ3$P$u15XA>_2?Ugax>~F==uxz!> z-AM6sGS!SgN_6Ue!c)pcoWTri6-7!Y6YJCW(V&=bF&JlX*$#c5EQs6B zqHUPY-i=e#y&lc^WW0QGs9wUFiA4|QHWSyg|2z;zZN$C$S&3>9uy+g_<;1uaUbbwr z<2;C2YBUo%75mbd&?6hpS^Z9?<$Ws~KB1kDZ}QhfnEJ%8S1 zcvS#afA1YH#S_5aP-gWzf$%vWTtp_!=iKU#-0*t_)qFyk0EBY2GT(FkUwPo7GTx)& zSO2YqLm5w(JKzh3E>i|h;Zk3ApTGv@n(`|Z2G0p7wIEhu!&05CDr5DT?IwCAblGT^ zaqg>7YH<-=R$d3vBzN__tjn?^?DKdmse3wT%DHx&mC@X8+OnbA$2?soPlXB2By=;K zZ0HjDs^7BEQ(2dze!G=2a&9ipDs0LHHtp7HblJqLgwU0d0lw}<9%%se1Yth0zSgpY z3eS3|F9xN)XMS=%lzNPnI+V#6muTZ&aprr)={FX7N*&559gL%XihWi)@mMGN7PlKU zI%qm4n(N^F70$;h_Zb)yChIbff2fTSY6HMn zhqiMITuvD@JWrZ&-i%H|(#Rp|RF?y?EoU^L28AyJUG|k7h zuDxn?C)5iMgkl$w`8-{I$5Y|eAD#a{b@?mjzrdLA`7(kZlb=ul{_q7aEX!%!C3BR& z@eBTBT5P%orfXoj2BvFZx(23eV7dnWplU$PmoQ<%d`bL46@0p|(={+%1JgAyT?5lK sFkJ)FHGmq(A)1fq+Tk2Y{HI8cM8g-U7+*e`qcZ=_&u92M7ykBt0KJf4Hvj+t diff --git a/fpga/fpga_pm3_lf.bit b/fpga/fpga_pm3_lf.bit index 593a9031f9bc0765bcbf12e5b1b63a0e88037c42..864274cca566de094dbd364e4fc389714277eafa 100644 GIT binary patch literal 42172 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 UuSrsle-FMCzh|_PmhxNvzqlU{<^TWy literal 42172 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